diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ba9da1a5..6ed5ad17 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -29,7 +29,7 @@ jobs: cache: "pnpm" - name: Install dependencies - run: pnpm i + run: pnpm i && pnpm build - name: Run Unit Tests and generate coverage report - run: pnpm unit.test.coverage + run: pnpm new:unit:coverage diff --git a/.gitignore b/.gitignore index 0acd3620..1302e6e1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .idea/ .tmp/ +.temp/ coverage/ node_modules/ .nyc_output/ diff --git a/examples/cypress/package.json b/examples/cypress/package.json index 1fc2c454..045c7d0d 100644 --- a/examples/cypress/package.json +++ b/examples/cypress/package.json @@ -15,11 +15,11 @@ "license": "MIT", "devDependencies": { "@badeball/cypress-cucumber-preprocessor": "^20.1.2", - "@bahmutov/cypress-esbuild-preprocessor": "^2.2.2", - "@types/node": "^22.5.2", - "cypress": "^13.13.2", + "@bahmutov/cypress-esbuild-preprocessor": "^2.2.3", + "@types/node": "^22.5.4", + "cypress": "^13.14.2", "multiple-cucumber-html-reporter": "^3.7.0", - "typescript": "^5.5.4" + "typescript": "^5.6.2" }, "dependencies": { "dayjs": "^1.11.13" diff --git a/examples/cypress/pnpm-lock.yaml b/examples/cypress/pnpm-lock.yaml index 19ed3cc0..9f73c9b8 100644 --- a/examples/cypress/pnpm-lock.yaml +++ b/examples/cypress/pnpm-lock.yaml @@ -14,22 +14,22 @@ importers: devDependencies: '@badeball/cypress-cucumber-preprocessor': specifier: ^20.1.2 - version: 20.1.2(cypress@13.13.2)(typescript@5.5.4) + version: 20.1.2(cypress@13.14.2)(typescript@5.6.2) '@bahmutov/cypress-esbuild-preprocessor': - specifier: ^2.2.2 - version: 2.2.2(esbuild@0.23.0) + specifier: ^2.2.3 + version: 2.2.3(esbuild@0.23.1) '@types/node': - specifier: ^22.5.2 - version: 22.5.2 + specifier: ^22.5.4 + version: 22.5.4 cypress: - specifier: ^13.13.2 - version: 13.13.2 + specifier: ^13.14.2 + version: 13.14.2 multiple-cucumber-html-reporter: specifier: ^3.7.0 version: 3.7.0 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.2 + version: 5.6.2 packages: @@ -49,13 +49,13 @@ packages: resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.25.3': - resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.25.2': - resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} '@badeball/cypress-configuration@6.1.1': @@ -72,8 +72,8 @@ packages: '@cypress/browserify-preprocessor': optional: true - '@bahmutov/cypress-esbuild-preprocessor@2.2.2': - resolution: {integrity: sha512-WE1l3gNqMlSd4P0g565u0AgUJvtQo9OtP6pWt46rK/Dxv0NsL56PIsgZGQoWPEjsOslyyCpq4LLip+RL9bqnDA==} + '@bahmutov/cypress-esbuild-preprocessor@2.2.3': + resolution: {integrity: sha512-YdrZxCULKC3k5H5bjBeL6boadcsSXsdnJf6GQGHMRcqzUFzDQC1sZGNblauJzUU34XbA4Sko5ym4KajKf4WwAw==} peerDependencies: esbuild: '>=0.17.0' @@ -87,8 +87,8 @@ packages: '@cucumber/cucumber-expressions@17.1.0': resolution: {integrity: sha512-PCv/ppsPynniKPWJr5v566daCVe+pbxQpHGrIu/Ev57cCH9Rv+X0F6lio4Id3Z64TaG7btCRLUGewIgLwmrwOA==} - '@cucumber/cucumber@10.8.0': - resolution: {integrity: sha512-o8SR6MRQVCKKw4tytWqCqOjfX4cASj9dqpdHKHMi09rZWBCNQHBwH1TO9wj7NKjOa6RfUOTcgvDlayTcjyCH4A==} + '@cucumber/cucumber@10.9.0': + resolution: {integrity: sha512-7XHJ6nmr9IkIag0nv6or82HfelbSInrEe3H4aT6dMHyTehwFLUifG6eQQ+uE4LZIOXAnzLPH37YmqygEO67vCA==} engines: {node: 18 || >=20} hasBin: true @@ -107,13 +107,13 @@ packages: '@cucumber/gherkin@28.0.0': resolution: {integrity: sha512-Ee6zJQq0OmIUPdW0mSnsCsrWA2PZAELNDPICD2pLfs0Oz7RAPgj80UsD2UCtqyAhw2qAR62aqlktKUlai5zl/A==} - '@cucumber/html-formatter@21.3.1': - resolution: {integrity: sha512-M1zbre7e8MsecXheqNv62BKY5J06YJSv1LmsD7sJ3mu5t1jirLjj2It1HqPsX5CQAfg9n69xFRugPgLMSte9TA==} + '@cucumber/html-formatter@21.6.0': + resolution: {integrity: sha512-Qw1tdObBJrgXgXwVjKVjB3hFhFPI8WhIFb+ULy8g5lDl5AdnKDiyDXAMvAWRX+pphnRMMNdkPCt6ZXEfWvUuAA==} peerDependencies: '@cucumber/messages': '>=18' - '@cucumber/html-formatter@21.6.0': - resolution: {integrity: sha512-Qw1tdObBJrgXgXwVjKVjB3hFhFPI8WhIFb+ULy8g5lDl5AdnKDiyDXAMvAWRX+pphnRMMNdkPCt6ZXEfWvUuAA==} + '@cucumber/html-formatter@21.7.0': + resolution: {integrity: sha512-bv211aY8mErp6CdmhN426E+7KIsVIES4fGx5ASMlUzYWiMus6NhSdI9UL3Vswx8JXJMgySeIcJJKfznREUFLNA==} peerDependencies: '@cucumber/messages': '>=18' @@ -137,8 +137,8 @@ packages: '@cucumber/tag-expressions@6.1.0': resolution: {integrity: sha512-+3DwRumrCJG27AtzCIL37A/X+A/gSfxOPLg8pZaruh5SLumsTmpvilwroVWBT2fPzmno/tGXypeK5a7NHU4RzA==} - '@cypress/request@3.0.1': - resolution: {integrity: sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==} + '@cypress/request@3.0.4': + resolution: {integrity: sha512-eqNHMsxEXuit0sRvvWoGG3/4+Q5qwqjKARWXKM/KoSsKvTNBwWt8pwspg5+TniP3POAZcPPx0O8CiEIQ4e6NWg==} engines: {node: '>= 6'} '@cypress/xvfb@1.2.4': @@ -150,8 +150,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.23.0': - resolution: {integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==} + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -162,8 +162,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.23.0': - resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==} + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -174,8 +174,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.23.0': - resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==} + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -186,8 +186,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.23.0': - resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==} + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -198,8 +198,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.23.0': - resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==} + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -210,8 +210,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.23.0': - resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==} + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -222,8 +222,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.23.0': - resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==} + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -234,8 +234,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.23.0': - resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==} + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -246,8 +246,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.23.0': - resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==} + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -258,8 +258,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.23.0': - resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==} + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -270,8 +270,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.23.0': - resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==} + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -282,8 +282,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.23.0': - resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==} + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -294,8 +294,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.23.0': - resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==} + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -306,8 +306,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.23.0': - resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==} + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -318,8 +318,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.23.0': - resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==} + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -330,8 +330,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.23.0': - resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==} + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -342,8 +342,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.23.0': - resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==} + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -354,14 +354,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.23.0': - resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==} + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.23.0': - resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -372,8 +372,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.23.0': - resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==} + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -384,8 +384,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.23.0': - resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==} + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -396,8 +396,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.23.0': - resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==} + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -408,8 +408,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.23.0': - resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==} + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -420,8 +420,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.23.0': - resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==} + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -438,8 +438,8 @@ packages: resolution: {integrity: sha512-ID7fosbc50TbT0MK0EG12O+gAP3W3Aa/Pz4DaTtQtEvlc9Odaqi0de+xuZ7Li2GtK4HzEX7IuRWS/JmZLksR3Q==} engines: {node: '>=14'} - '@types/node@22.5.2': - resolution: {integrity: sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==} + '@types/node@22.5.4': + resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -523,8 +523,8 @@ packages: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -536,8 +536,8 @@ packages: aws-sign2@0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - aws4@1.13.0: - resolution: {integrity: sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==} + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -718,8 +718,8 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - cypress@13.13.2: - resolution: {integrity: sha512-PvJQU33933NvS1StfzEb8/mu2kMy4dABwCF+yd5Bi7Qly1HOVf+Bufrygee/tlmty/6j5lX+KIi8j9Q3JUMbhA==} + cypress@13.14.2: + resolution: {integrity: sha512-lsiQrN17vHMB2fnvxIrKLAjOr9bPwsNbPZNrWf99s4u+DVmCY6U+w7O3GGG9FvP4EUVYaDu+guWeNLiUzBrqvA==} engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} hasBin: true @@ -738,8 +738,8 @@ packages: supports-color: optional: true - debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -813,13 +813,13 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.23.0: - resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==} + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} engines: {node: '>=18'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -886,8 +886,8 @@ packages: forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} engines: {node: '>= 0.12'} fs-extra@11.2.0: @@ -993,8 +993,8 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - http-signature@1.3.6: - resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} + http-signature@1.4.0: + resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==} engines: {node: '>=0.10'} human-signals@1.1.1: @@ -1034,8 +1034,8 @@ packages: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true - is-core-module@2.15.0: - resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} is-docker@2.2.1: @@ -1178,8 +1178,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.0.0: - resolution: {integrity: sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==} + lru-cache@11.0.1: + resolution: {integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==} engines: {node: 20 || >=22} lru-cache@6.0.0: @@ -1205,6 +1205,11 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -1241,9 +1246,6 @@ packages: engines: {node: '>= 14.0.0'} hasBin: true - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1360,8 +1362,8 @@ packages: performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -1399,8 +1401,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.10.4: - resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} querystringify@2.2.0: @@ -1555,8 +1557,8 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.18: - resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} split@1.0.1: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} @@ -1655,8 +1657,8 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} - tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -1680,12 +1682,12 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@4.24.0: - resolution: {integrity: sha512-spAaHzc6qre0TlZQQ2aA/nGMe+2Z/wyGk5Z+Ru2VUfdNwT6kWO6TjevOlpebsATEG1EIQ2sOiDszud3lO5mt/Q==} + type-fest@4.26.1: + resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==} engines: {node: '>=16'} - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} hasBin: true @@ -1766,8 +1768,8 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.5.0: - resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} engines: {node: '>= 14'} hasBin: true @@ -1798,7 +1800,7 @@ snapshots: '@babel/code-frame@7.24.7': dependencies: '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + picocolors: 1.1.0 '@babel/helper-string-parser@7.24.8': {} @@ -1809,13 +1811,13 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.1 + picocolors: 1.1.0 - '@babel/parser@7.25.3': + '@babel/parser@7.25.6': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 - '@babel/types@7.25.2': + '@babel/types@7.25.6': dependencies: '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 @@ -1823,8 +1825,8 @@ snapshots: '@badeball/cypress-configuration@6.1.1': dependencies: - '@babel/parser': 7.25.3 - debug: 4.3.6(supports-color@8.1.1) + '@babel/parser': 7.25.6 + debug: 4.3.7(supports-color@8.1.1) esbuild: 0.19.12 glob: 7.2.3 minimatch: 3.1.2 @@ -1832,27 +1834,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@badeball/cypress-cucumber-preprocessor@20.1.2(cypress@13.13.2)(typescript@5.5.4)': + '@badeball/cypress-cucumber-preprocessor@20.1.2(cypress@13.14.2)(typescript@5.6.2)': dependencies: '@badeball/cypress-configuration': 6.1.1 '@cucumber/ci-environment': 10.0.1 - '@cucumber/cucumber': 10.8.0 + '@cucumber/cucumber': 10.9.0 '@cucumber/cucumber-expressions': 17.1.0 '@cucumber/gherkin': 28.0.0 - '@cucumber/html-formatter': 21.6.0(@cucumber/messages@25.0.1) + '@cucumber/html-formatter': 21.7.0(@cucumber/messages@25.0.1) '@cucumber/message-streams': 4.0.1(@cucumber/messages@25.0.1) '@cucumber/messages': 25.0.1 - '@cucumber/pretty-formatter': 1.0.1(@cucumber/cucumber@10.8.0)(@cucumber/messages@25.0.1) + '@cucumber/pretty-formatter': 1.0.1(@cucumber/cucumber@10.9.0)(@cucumber/messages@25.0.1) '@cucumber/tag-expressions': 6.1.0 base64-js: 1.5.1 chalk: 4.1.2 cli-table: 0.3.11 common-ancestor-path: 1.0.1 - cosmiconfig: 9.0.0(typescript@5.5.4) - cypress: 13.13.2 - debug: 4.3.6(supports-color@8.1.1) + cosmiconfig: 9.0.0(typescript@5.6.2) + cypress: 13.14.2 + debug: 4.3.7(supports-color@8.1.1) error-stack-parser: 2.1.4 - esbuild: 0.23.0 + esbuild: 0.23.1 glob: 11.0.0 is-path-inside: 3.0.3 mocha: 10.7.3 @@ -1864,10 +1866,10 @@ snapshots: - supports-color - typescript - '@bahmutov/cypress-esbuild-preprocessor@2.2.2(esbuild@0.23.0)': + '@bahmutov/cypress-esbuild-preprocessor@2.2.3(esbuild@0.23.1)': dependencies: - debug: 4.3.6(supports-color@8.1.1) - esbuild: 0.23.0 + debug: 4.3.7(supports-color@8.1.1) + esbuild: 0.23.1 transitivePeerDependencies: - supports-color @@ -1880,14 +1882,14 @@ snapshots: dependencies: regexp-match-indices: 1.0.2 - '@cucumber/cucumber@10.8.0': + '@cucumber/cucumber@10.9.0': dependencies: '@cucumber/ci-environment': 10.0.1 '@cucumber/cucumber-expressions': 17.1.0 '@cucumber/gherkin': 28.0.0 - '@cucumber/gherkin-streams': 5.0.1(@cucumber/gherkin@28.0.0)(@cucumber/message-streams@4.0.1(@cucumber/messages@24.1.0))(@cucumber/messages@24.1.0) + '@cucumber/gherkin-streams': 5.0.1(@cucumber/gherkin@28.0.0)(@cucumber/message-streams@4.0.1(@cucumber/messages@25.0.1))(@cucumber/messages@24.1.0) '@cucumber/gherkin-utils': 9.0.0 - '@cucumber/html-formatter': 21.3.1(@cucumber/messages@24.1.0) + '@cucumber/html-formatter': 21.6.0(@cucumber/messages@24.1.0) '@cucumber/message-streams': 4.0.1(@cucumber/messages@24.1.0) '@cucumber/messages': 24.1.0 '@cucumber/tag-expressions': 6.1.0 @@ -1896,7 +1898,7 @@ snapshots: chalk: 4.1.2 cli-table3: 0.6.3 commander: 10.0.1 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) error-stack-parser: 2.1.4 figures: 3.2.0 glob: 10.4.5 @@ -1908,6 +1910,7 @@ snapshots: lodash.merge: 4.6.2 lodash.mergewith: 4.6.2 luxon: 3.2.1 + mime: 3.0.0 mkdirp: 2.1.6 mz: 2.7.0 progress: 2.0.3 @@ -1918,13 +1921,13 @@ snapshots: strip-ansi: 6.0.1 supports-color: 8.1.1 tmp: 0.2.3 - type-fest: 4.24.0 + type-fest: 4.26.1 util-arity: 1.1.0 xmlbuilder: 15.1.1 - yaml: 2.5.0 + yaml: 2.5.1 yup: 1.2.0 - '@cucumber/gherkin-streams@5.0.1(@cucumber/gherkin@28.0.0)(@cucumber/message-streams@4.0.1(@cucumber/messages@24.1.0))(@cucumber/messages@24.1.0)': + '@cucumber/gherkin-streams@5.0.1(@cucumber/gherkin@28.0.0)(@cucumber/message-streams@4.0.1(@cucumber/messages@25.0.1))(@cucumber/messages@24.1.0)': dependencies: '@cucumber/gherkin': 28.0.0 '@cucumber/message-streams': 4.0.1(@cucumber/messages@24.1.0) @@ -1944,11 +1947,11 @@ snapshots: dependencies: '@cucumber/messages': 24.1.0 - '@cucumber/html-formatter@21.3.1(@cucumber/messages@24.1.0)': + '@cucumber/html-formatter@21.6.0(@cucumber/messages@24.1.0)': dependencies: '@cucumber/messages': 24.1.0 - '@cucumber/html-formatter@21.6.0(@cucumber/messages@25.0.1)': + '@cucumber/html-formatter@21.7.0(@cucumber/messages@25.0.1)': dependencies: '@cucumber/messages': 25.0.1 @@ -1974,9 +1977,9 @@ snapshots: reflect-metadata: 0.2.2 uuid: 9.0.1 - '@cucumber/pretty-formatter@1.0.1(@cucumber/cucumber@10.8.0)(@cucumber/messages@25.0.1)': + '@cucumber/pretty-formatter@1.0.1(@cucumber/cucumber@10.9.0)(@cucumber/messages@25.0.1)': dependencies: - '@cucumber/cucumber': 10.8.0 + '@cucumber/cucumber': 10.9.0 '@cucumber/messages': 25.0.1 ansi-styles: 5.2.0 cli-table3: 0.6.5 @@ -1985,22 +1988,22 @@ snapshots: '@cucumber/tag-expressions@6.1.0': {} - '@cypress/request@3.0.1': + '@cypress/request@3.0.4': dependencies: aws-sign2: 0.7.0 - aws4: 1.13.0 + aws4: 1.13.2 caseless: 0.12.0 combined-stream: 1.0.8 extend: 3.0.2 forever-agent: 0.6.1 - form-data: 2.3.3 - http-signature: 1.3.6 + form-data: 2.5.1 + http-signature: 1.4.0 is-typedarray: 1.0.0 isstream: 0.1.2 json-stringify-safe: 5.0.1 mime-types: 2.1.35 performance-now: 2.1.0 - qs: 6.10.4 + qs: 6.13.0 safe-buffer: 5.2.1 tough-cookie: 4.1.4 tunnel-agent: 0.6.0 @@ -2016,142 +2019,142 @@ snapshots: '@esbuild/aix-ppc64@0.19.12': optional: true - '@esbuild/aix-ppc64@0.23.0': + '@esbuild/aix-ppc64@0.23.1': optional: true '@esbuild/android-arm64@0.19.12': optional: true - '@esbuild/android-arm64@0.23.0': + '@esbuild/android-arm64@0.23.1': optional: true '@esbuild/android-arm@0.19.12': optional: true - '@esbuild/android-arm@0.23.0': + '@esbuild/android-arm@0.23.1': optional: true '@esbuild/android-x64@0.19.12': optional: true - '@esbuild/android-x64@0.23.0': + '@esbuild/android-x64@0.23.1': optional: true '@esbuild/darwin-arm64@0.19.12': optional: true - '@esbuild/darwin-arm64@0.23.0': + '@esbuild/darwin-arm64@0.23.1': optional: true '@esbuild/darwin-x64@0.19.12': optional: true - '@esbuild/darwin-x64@0.23.0': + '@esbuild/darwin-x64@0.23.1': optional: true '@esbuild/freebsd-arm64@0.19.12': optional: true - '@esbuild/freebsd-arm64@0.23.0': + '@esbuild/freebsd-arm64@0.23.1': optional: true '@esbuild/freebsd-x64@0.19.12': optional: true - '@esbuild/freebsd-x64@0.23.0': + '@esbuild/freebsd-x64@0.23.1': optional: true '@esbuild/linux-arm64@0.19.12': optional: true - '@esbuild/linux-arm64@0.23.0': + '@esbuild/linux-arm64@0.23.1': optional: true '@esbuild/linux-arm@0.19.12': optional: true - '@esbuild/linux-arm@0.23.0': + '@esbuild/linux-arm@0.23.1': optional: true '@esbuild/linux-ia32@0.19.12': optional: true - '@esbuild/linux-ia32@0.23.0': + '@esbuild/linux-ia32@0.23.1': optional: true '@esbuild/linux-loong64@0.19.12': optional: true - '@esbuild/linux-loong64@0.23.0': + '@esbuild/linux-loong64@0.23.1': optional: true '@esbuild/linux-mips64el@0.19.12': optional: true - '@esbuild/linux-mips64el@0.23.0': + '@esbuild/linux-mips64el@0.23.1': optional: true '@esbuild/linux-ppc64@0.19.12': optional: true - '@esbuild/linux-ppc64@0.23.0': + '@esbuild/linux-ppc64@0.23.1': optional: true '@esbuild/linux-riscv64@0.19.12': optional: true - '@esbuild/linux-riscv64@0.23.0': + '@esbuild/linux-riscv64@0.23.1': optional: true '@esbuild/linux-s390x@0.19.12': optional: true - '@esbuild/linux-s390x@0.23.0': + '@esbuild/linux-s390x@0.23.1': optional: true '@esbuild/linux-x64@0.19.12': optional: true - '@esbuild/linux-x64@0.23.0': + '@esbuild/linux-x64@0.23.1': optional: true '@esbuild/netbsd-x64@0.19.12': optional: true - '@esbuild/netbsd-x64@0.23.0': + '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/openbsd-arm64@0.23.0': + '@esbuild/openbsd-arm64@0.23.1': optional: true '@esbuild/openbsd-x64@0.19.12': optional: true - '@esbuild/openbsd-x64@0.23.0': + '@esbuild/openbsd-x64@0.23.1': optional: true '@esbuild/sunos-x64@0.19.12': optional: true - '@esbuild/sunos-x64@0.23.0': + '@esbuild/sunos-x64@0.23.1': optional: true '@esbuild/win32-arm64@0.19.12': optional: true - '@esbuild/win32-arm64@0.23.0': + '@esbuild/win32-arm64@0.23.1': optional: true '@esbuild/win32-ia32@0.19.12': optional: true - '@esbuild/win32-ia32@0.23.0': + '@esbuild/win32-ia32@0.23.1': optional: true '@esbuild/win32-x64@0.19.12': optional: true - '@esbuild/win32-x64@0.23.0': + '@esbuild/win32-x64@0.23.1': optional: true '@isaacs/cliui@8.0.2': @@ -2168,7 +2171,7 @@ snapshots: '@teppeis/multimaps@3.0.0': {} - '@types/node@22.5.2': + '@types/node@22.5.4': dependencies: undici-types: 6.19.8 @@ -2182,7 +2185,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.5.2 + '@types/node': 22.5.4 optional: true aggregate-error@3.1.0: @@ -2239,7 +2242,7 @@ snapshots: astral-regex@2.0.0: {} - async@3.2.5: {} + async@3.2.6: {} asynckit@0.4.0: {} @@ -2247,7 +2250,7 @@ snapshots: aws-sign2@0.7.0: {} - aws4@1.13.0: {} + aws4@1.13.2: {} balanced-match@1.0.2: {} @@ -2304,7 +2307,7 @@ snapshots: capital-case@1.0.4: dependencies: no-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.7.0 upper-case-first: 2.0.2 caseless@0.12.0: {} @@ -2407,14 +2410,14 @@ snapshots: core-util-is@1.0.2: {} - cosmiconfig@9.0.0(typescript@5.5.4): + cosmiconfig@9.0.0(typescript@5.6.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.2 cross-spawn@7.0.3: dependencies: @@ -2422,9 +2425,9 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - cypress@13.13.2: + cypress@13.14.2: dependencies: - '@cypress/request': 3.0.1 + '@cypress/request': 3.0.4 '@cypress/xvfb': 1.2.4(supports-color@8.1.1) '@types/sinonjs__fake-timers': 8.1.1 '@types/sizzle': 2.3.8 @@ -2440,7 +2443,7 @@ snapshots: commander: 6.2.1 common-tags: 1.8.2 dayjs: 1.11.13 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) enquirer: 2.4.1 eventemitter2: 6.4.7 execa: 4.1.0 @@ -2479,9 +2482,9 @@ snapshots: optionalDependencies: supports-color: 8.1.1 - debug@4.3.6(supports-color@8.1.1): + debug@4.3.7(supports-color@8.1.1): dependencies: - ms: 2.1.2 + ms: 2.1.3 optionalDependencies: supports-color: 8.1.1 @@ -2563,34 +2566,34 @@ snapshots: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - esbuild@0.23.0: + esbuild@0.23.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.23.0 - '@esbuild/android-arm': 0.23.0 - '@esbuild/android-arm64': 0.23.0 - '@esbuild/android-x64': 0.23.0 - '@esbuild/darwin-arm64': 0.23.0 - '@esbuild/darwin-x64': 0.23.0 - '@esbuild/freebsd-arm64': 0.23.0 - '@esbuild/freebsd-x64': 0.23.0 - '@esbuild/linux-arm': 0.23.0 - '@esbuild/linux-arm64': 0.23.0 - '@esbuild/linux-ia32': 0.23.0 - '@esbuild/linux-loong64': 0.23.0 - '@esbuild/linux-mips64el': 0.23.0 - '@esbuild/linux-ppc64': 0.23.0 - '@esbuild/linux-riscv64': 0.23.0 - '@esbuild/linux-s390x': 0.23.0 - '@esbuild/linux-x64': 0.23.0 - '@esbuild/netbsd-x64': 0.23.0 - '@esbuild/openbsd-arm64': 0.23.0 - '@esbuild/openbsd-x64': 0.23.0 - '@esbuild/sunos-x64': 0.23.0 - '@esbuild/win32-arm64': 0.23.0 - '@esbuild/win32-ia32': 0.23.0 - '@esbuild/win32-x64': 0.23.0 - - escalade@3.1.2: {} + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -2618,7 +2621,7 @@ snapshots: extract-zip@2.0.1(supports-color@8.1.1): dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -2663,7 +2666,7 @@ snapshots: forever-agent@0.6.1: {} - form-data@2.3.3: + form-data@2.5.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -2705,7 +2708,7 @@ snapshots: getos@3.2.1: dependencies: - async: 3.2.5 + async: 3.2.6 getpass@0.1.7: dependencies: @@ -2784,7 +2787,7 @@ snapshots: hosted-git-info@2.8.9: {} - http-signature@1.3.6: + http-signature@1.4.0: dependencies: assert-plus: 1.0.0 jsprim: 2.0.2 @@ -2820,7 +2823,7 @@ snapshots: dependencies: ci-info: 3.9.0 - is-core-module@2.15.0: + is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -2949,11 +2952,11 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.7.0 lru-cache@10.4.3: {} - lru-cache@11.0.0: {} + lru-cache@11.0.1: {} lru-cache@6.0.0: dependencies: @@ -2971,6 +2974,8 @@ snapshots: dependencies: mime-db: 1.52.0 + mime@3.0.0: {} + mimic-fn@2.1.0: {} minimatch@10.0.1: @@ -3000,7 +3005,7 @@ snapshots: ansi-colors: 4.1.3 browser-stdout: 1.3.1 chokidar: 3.6.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -3018,8 +3023,6 @@ snapshots: yargs-parser: 20.2.9 yargs-unparser: 2.0.0 - ms@2.1.2: {} - ms@2.1.3: {} multiple-cucumber-html-reporter@3.7.0: @@ -3041,7 +3044,7 @@ snapshots: no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.6.3 + tslib: 2.7.0 node-hook@1.0.0: {} @@ -3132,14 +3135,14 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.0.0 + lru-cache: 11.0.1 minipass: 7.1.2 pend@1.2.0: {} performance-now@2.1.0: {} - picocolors@1.0.1: {} + picocolors@1.1.0: {} picomatch@2.3.1: {} @@ -3164,7 +3167,7 @@ snapshots: punycode@2.3.1: {} - qs@6.10.4: + qs@6.13.0: dependencies: side-channel: 1.0.6 @@ -3221,7 +3224,7 @@ snapshots: resolve@1.22.8: dependencies: - is-core-module: 2.15.0 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -3234,7 +3237,7 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.6.3 + tslib: 2.7.0 safe-buffer@5.2.1: {} @@ -3306,16 +3309,16 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.18 + spdx-license-ids: 3.0.20 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.18 + spdx-license-ids: 3.0.20 - spdx-license-ids@3.0.18: {} + spdx-license-ids@3.0.20: {} split@1.0.1: dependencies: @@ -3410,7 +3413,7 @@ snapshots: ts-dedent@2.2.0: {} - tslib@2.6.3: {} + tslib@2.7.0: {} tunnel-agent@0.6.0: dependencies: @@ -3426,9 +3429,9 @@ snapshots: type-fest@2.19.0: {} - type-fest@4.24.0: {} + type-fest@4.26.1: {} - typescript@5.5.4: {} + typescript@5.6.2: {} undici-types@6.19.8: {} @@ -3440,7 +3443,7 @@ snapshots: upper-case-first@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.7.0 url-parse@1.5.10: dependencies: @@ -3498,7 +3501,7 @@ snapshots: yallist@4.0.0: {} - yaml@2.5.0: {} + yaml@2.5.1: {} yargs-parser@20.2.9: {} @@ -3512,7 +3515,7 @@ snapshots: yargs@16.2.0: dependencies: cliui: 7.0.4 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 00000000..3d4075c1 --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,23 @@ +import type { Config } from "jest"; + +const config: Config = { + preset: "ts-jest/presets/js-with-ts-esm", + testEnvironment: "node", + verbose: true, + clearMocks: true, + collectCoverage: false, + coverageDirectory: "coverage", + coverageReporters: ["json-summary", "text", "lcov"], + coveragePathIgnorePatterns: ["/node_modules/", "/dist/", "/src/templates/"], + transform: {}, + collectCoverageFrom: ["src/**"], + testMatch: ["**/*.spec.ts"], + moduleFileExtensions: ["ts", "js"], + moduleNameMapper: { + "\\.(css|less)$": "identity-obj-proxy", + "^(.+?)\\.js$": "$1", + }, + extensionsToTreatAsEsm: [".ts"], +}; + +export default config; diff --git a/lib/collect-jsons.js b/lib/collect-jsons.js deleted file mode 100644 index b1215ed9..00000000 --- a/lib/collect-jsons.js +++ /dev/null @@ -1,131 +0,0 @@ -'use strict'; - -const find = require('find'); -const fs = require('fs-extra'); -const jsonFile = require('jsonfile'); -const path = require('node:path'); -const { DateTime } = require('luxon'); - -/** - * Formats input date to yyyy/MM/dd HH:mm:ss - * - * @param {Date} date - * @returns {string} formatted date in ISO format local time - */ -function formatToLocalIso(date) { - return typeof date === 'string' ? - DateTime.fromISO(date).toFormat('yyyy/MM/dd HH:mm:ss') - : - DateTime.fromJSDate(date).toFormat('yyyy/MM/dd HH:mm:ss'); -} - -module.exports = function collectJSONS(options) { - const jsonOutput = []; - let files; - - try { - files = find.fileSync(/\.json$/, path.resolve(process.cwd(), options.jsonDir)); - } catch (e) { - throw new Error(`There were issues reading JSON-files from '${options.jsonDir}'.`); - } - - if (files.length > 0) { - files.map(file => { - // Cucumber json can be empty, it's likely being created by another process (#47) - const data = fs.readFileSync(file).toString() || "[]"; - const stats = fs.statSync(file); - const reportTime = stats.birthtime; - - JSON.parse(data).map(json => { - if (options.metadata && !json.metadata) { - json.metadata = options.metadata; - } else { - json = Object.assign({ - "metadata": { - "browser": { - "name": "not known", - "version": "not known" - }, - "device": "not known", - "platform": { - "name": "not known", - "version": "not known" - } - } - }, json); - } - - if (json.metadata && options.displayReportTime && reportTime) { - json.metadata = Object.assign({reportTime: reportTime}, json.metadata) - json.metadata.reportTime = formatToLocalIso(json.metadata.reportTime); - } - - // Only check the feature hooks if there are elements (fail-safe) - const {elements} = json; - - if (elements) { - json.elements = elements.map(scenario => { - const {before, after} = scenario; - - if (before) { - scenario.steps = parseFeatureHooks(before, 'Before').concat(scenario.steps); - } - if (after) { - scenario.steps = scenario.steps.concat(parseFeatureHooks(after, 'After')); - } - - return scenario - }) - } - - jsonOutput.push(json) - }); - }); - - if (options.saveCollectedJSON) { - const file = path.resolve(options.reportPath, 'merged-output.json'); - fs.ensureDirSync(options.reportPath); - jsonFile.writeFileSync(file, jsonOutput, {spaces: 2}); - } - - return jsonOutput; - } - - console.log('\x1b[33m%s\x1b[0m', `WARNING: No JSON files found in '${options.jsonDir}'. NO REPORT CAN BE CREATED!`); - return []; -}; - -/** - * Add the feature hooks to the steps so the report will pick them up properly - * - * @param {object} data - * @param {string} keyword - * @returns {{ - * arguments: array, - * keyword: string, - * name: string, - * result: { - * status: string, - * }, - * line: string, - * match: { - * location: string - * }, - * embeddings: [] - * }} - */ -function parseFeatureHooks(data, keyword) { - return data.map(step => { - const match = step.match && step.match.location ? step.match : {location: 'can not be determined'}; - - return { - arguments: step.arguments || [], - keyword: keyword, - name: 'Hook', - result: step.result, - line: '', - match, - embeddings: step.embeddings || [] - } - }) -} diff --git a/lib/generate-report.js b/lib/generate-report.js deleted file mode 100755 index f05fadfe..00000000 --- a/lib/generate-report.js +++ /dev/null @@ -1,707 +0,0 @@ -'use strict'; - -const _ = require('lodash'); -const fs = require('fs-extra'); -const jsonFile = require('jsonfile'); -const open = require('open'); -const path = require('node:path'); -const { v4: uuid } = require('uuid'); -const { Duration } = require('luxon'); -const collectJSONS = require('./collect-jsons'); - -const REPORT_STYLESHEET = 'style.css'; -const GENERIC_JS = 'generic.js'; -const INDEX_HTML = 'index.html'; -const FEATURE_FOLDER = 'features'; -const FEATURES_OVERVIEW_INDEX_TEMPLATE = 'features-overview.index.tmpl'; -const CUSTOM_DATA_TEMPLATE = 'components/custom-data.tmpl'; -let FEATURES_OVERVIEW_TEMPLATE = 'components/features-overview.tmpl'; -const FEATURES_OVERVIEW_CUSTOM_METADATA_TEMPLATE = - 'components/features-overview-custom-metadata.tmpl'; -const FEATURES_OVERVIEW_CHART_TEMPLATE = - 'components/features-overview.chart.tmpl'; -const SCENARIOS_OVERVIEW_CHART_TEMPLATE = - 'components/scenarios-overview.chart.tmpl'; -const FEATURE_OVERVIEW_INDEX_TEMPLATE = 'feature-overview.index.tmpl'; -let FEATURE_METADATA_OVERVIEW_TEMPLATE = - 'components/feature-metadata-overview.tmpl'; -const FEATURE_CUSTOM_METADATA_OVERVIEW_TEMPLATE = - 'components/feature-custom-metadata-overview.tmpl'; -const SCENARIOS_TEMPLATE = 'components/scenarios.tmpl'; -const RESULT_STATUS = { - passed: 'passed', - failed: 'failed', - skipped: 'skipped', - pending: 'pending', - notDefined: 'undefined', - ambiguous: 'ambiguous', -}; -const DEFAULT_REPORT_NAME = 'Multiple Cucumber HTML Reporter'; - -function generateReport(options) { - if (!options) { - throw new Error('Options need to be provided.'); - } - - if (!options.jsonDir) { - throw new Error('A path which holds the JSON files should be provided.'); - } - - if (!options.reportPath) { - throw new Error( - 'An output path for the reports should be defined, no path was provided.' - ); - } - - const customMetadata = !!options.customMetadata; - const customData = options.customData || null; - const plainDescription = !!options.plainDescription; - const style = options.overrideStyle || REPORT_STYLESHEET; - const customStyle = options.customStyle; - const disableLog = !!options.disableLog; - const openReportInBrowser = !!options.openReportInBrowser; - const reportName = options.reportName || DEFAULT_REPORT_NAME; - const reportPath = path.resolve(process.cwd(), options.reportPath); - const saveCollectedJSON = !!options.saveCollectedJSON; - const displayDuration = !!options.displayDuration; - const displayReportTime = !!options.displayReportTime; - const durationInMS = !!options.durationInMS; - const hideMetadata = !!options.hideMetadata; - const pageTitle = options.pageTitle || 'Multiple Cucumber HTML Reporter'; - const pageFooter = options.pageFooter || null; - const useCDN = !!options.useCDN; - const staticFilePath = !!options.staticFilePath; - - fs.ensureDirSync(reportPath); - fs.ensureDirSync(path.resolve(reportPath, FEATURE_FOLDER)); - - const allFeatures = collectJSONS(options); - - let suite = { - app: 0, - customMetadata: customMetadata, - customData: customData, - style: style, - customStyle: customStyle, - useCDN: useCDN, - hideMetadata: hideMetadata, - displayReportTime: displayReportTime, - displayDuration: displayDuration, - browser: 0, - name: '', - version: 'version', - time: new Date(), - features: allFeatures, - featureCount: { - ambiguous: 0, - failed: 0, - passed: 0, - notDefined: 0, - pending: 0, - skipped: 0, - total: 0, - ambiguousPercentage: 0, - failedPercentage: 0, - notDefinedPercentage: 0, - pendingPercentage: 0, - skippedPercentage: 0, - passedPercentage: 0, - }, - reportName: reportName, - scenarios: { - failed: 0, - ambiguous: 0, - notDefined: 0, - pending: 0, - skipped: 0, - passed: 0, - total: 0, - }, - totalTime: 0, - }; - - _parseFeatures(suite); - - // Percentages - suite.featureCount.ambiguousPercentage = _calculatePercentage( - suite.featureCount.ambiguous, - suite.featureCount.total - ); - suite.featureCount.failedPercentage = _calculatePercentage( - suite.featureCount.failed, - suite.featureCount.total - ); - suite.featureCount.notDefinedPercentage = _calculatePercentage( - suite.featureCount.notDefined, - suite.featureCount.total - ); - suite.featureCount.pendingPercentage = _calculatePercentage( - suite.featureCount.pending, - suite.featureCount.total - ); - suite.featureCount.skippedPercentage = _calculatePercentage( - suite.featureCount.skipped, - suite.featureCount.total - ); - suite.featureCount.passedPercentage = _calculatePercentage( - suite.featureCount.passed, - suite.featureCount.total - ); - - /** - * Calculate and return the percentage - * @param {number} amount - * @param {number} total - * @return {string} percentage - * @private - */ - function _calculatePercentage(amount, total) { - return ((amount / total) * 100).toFixed(2); - } - - /* istanbul ignore else */ - if (saveCollectedJSON) { - jsonFile.writeFileSync( - path.resolve(reportPath, 'enriched-output.json'), - suite, - { spaces: 2 } - ); - } - - _createFeaturesOverviewIndexPage(suite); - _createFeatureIndexPages(suite); - - /* istanbul ignore else */ - if (!disableLog) { - console.log( - '\x1b[34m%s\x1b[0m', - `\n -===================================================================================== - Multiple Cucumber HTML report generated in: - - ${path.join(reportPath, INDEX_HTML)} -=====================================================================================\n` - ); - } - - /* istanbul ignore if */ - if (openReportInBrowser) { - open(path.join(reportPath, INDEX_HTML)); - } - - function _parseFeatures(suite) { - suite.features.forEach((feature) => { - feature.scenarios = { - passed: 0, - failed: 0, - notDefined: 0, - skipped: 0, - pending: 0, - ambiguous: 0, - passedPercentage: 0, - failedPercentage: 0, - notDefinedPercentage: 0, - skippedPercentage: 0, - pendingPercentage: 0, - ambiguousPercentage: 0, - total: 0, - }; - feature.duration = 0; - feature.time = '00:00:00.000'; - feature.isFailed = false; - feature.isAmbiguous = false; - feature.isSkipped = false; - feature.isNotdefined = false; - feature.isPending = false; - suite.featureCount.total++; - const idPrefix = staticFilePath ? '' : `${uuid()}.`; - feature.id = `${idPrefix}${feature.id}`.replace(/[^a-zA-Z0-9-_]/g, '-'); - feature.app = 0; - feature.browser = 0; - - if (!feature.elements) { - return; - } - - feature = _parseScenarios(feature, suite); - - if (feature.isFailed) { - suite.featureCount.failed++; - feature.failed++; - } else if (feature.isAmbiguous) { - suite.featureCount.ambiguous++; - feature.ambiguous++; - } else if (feature.isNotdefined) { - feature.notDefined++; - suite.featureCount.notDefined++; - } else if (feature.isPending) { - feature.pending++; - suite.featureCount.pending++; - } else if (feature.isSkipped) { - feature.skipped++; - suite.featureCount.skipped++; - } else { - feature.passed++; - suite.featureCount.passed++; - } - - if (feature.duration) { - feature.totalTime += feature.duration; - feature.time = formatDuration(feature.duration); - } - - // Check if browser / app is used - suite.app = feature.metadata.app ? suite.app + 1 : suite.app; - suite.browser = feature.metadata.browser - ? suite.browser + 1 - : suite.browser; - - // Percentages - feature.scenarios.ambiguousPercentage = _calculatePercentage( - feature.scenarios.ambiguous, - feature.scenarios.total - ); - feature.scenarios.failedPercentage = _calculatePercentage( - feature.scenarios.failed, - feature.scenarios.total - ); - feature.scenarios.notDefinedPercentage = _calculatePercentage( - feature.scenarios.notDefined, - feature.scenarios.total - ); - feature.scenarios.passedPercentage = _calculatePercentage( - feature.scenarios.passed, - feature.scenarios.total - ); - feature.scenarios.pendingPercentage = _calculatePercentage( - feature.scenarios.pending, - feature.scenarios.total - ); - feature.scenarios.skippedPercentage = _calculatePercentage( - feature.scenarios.skipped, - feature.scenarios.total - ); - suite.scenarios.ambiguousPercentage = _calculatePercentage( - suite.scenarios.ambiguous, - suite.scenarios.total - ); - suite.scenarios.failedPercentage = _calculatePercentage( - suite.scenarios.failed, - suite.scenarios.total - ); - suite.scenarios.notDefinedPercentage = _calculatePercentage( - suite.scenarios.notDefined, - suite.scenarios.total - ); - suite.scenarios.passedPercentage = _calculatePercentage( - suite.scenarios.passed, - suite.scenarios.total - ); - suite.scenarios.pendingPercentage = _calculatePercentage( - suite.scenarios.pending, - suite.scenarios.total - ); - suite.scenarios.skippedPercentage = _calculatePercentage( - suite.scenarios.skipped, - suite.scenarios.total - ); - }); - } - - /** - * Parse each scenario within a feature - * @param {object} feature a feature with all the scenarios in it - * @return {object} return the parsed feature - * @private - */ - function _parseScenarios(feature) { - feature.elements.forEach((scenario) => { - scenario.passed = 0; - scenario.failed = 0; - scenario.notDefined = 0; - scenario.skipped = 0; - scenario.pending = 0; - scenario.ambiguous = 0; - scenario.duration = 0; - scenario.time = '00:00:00.000'; - - scenario = _parseSteps(scenario); - - if (scenario.duration > 0) { - feature.duration += scenario.duration; - scenario.time = formatDuration(scenario.duration); - } - - if (scenario.hasOwnProperty('description') && scenario.description) { - scenario.description = scenario.description.replace( - new RegExp('\r?\n', 'g'), - '
' - ); - } - - if (scenario.type === 'background') { - return; - } - - if (scenario.failed > 0) { - suite.scenarios.total++; - suite.scenarios.failed++; - feature.scenarios.total++; - feature.isFailed = true; - return feature.scenarios.failed++; - } - - if (scenario.ambiguous > 0) { - suite.scenarios.total++; - suite.scenarios.ambiguous++; - feature.scenarios.total++; - feature.isAmbiguous = true; - return feature.scenarios.ambiguous++; - } - - if (scenario.notDefined > 0) { - suite.scenarios.total++; - suite.scenarios.notDefined++; - feature.scenarios.total++; - feature.isNotdefined = true; - return feature.scenarios.notDefined++; - } - - if (scenario.pending > 0) { - suite.scenarios.total++; - suite.scenarios.pending++; - feature.scenarios.total++; - feature.isPending = true; - return feature.scenarios.pending++; - } - - if (scenario.skipped > 0) { - suite.scenarios.total++; - suite.scenarios.skipped++; - feature.scenarios.total++; - return feature.scenarios.skipped++; - } - - /* istanbul ignore else */ - if (scenario.passed > 0) { - suite.scenarios.total++; - suite.scenarios.passed++; - feature.scenarios.total++; - return feature.scenarios.passed++; - } - }); - - feature.isSkipped = feature.scenarios.total === feature.scenarios.skipped; - - return feature; - } - - /** - * Parse all the scenario steps and enrich them with the correct data - * @param {object} scenario Preparsed scenario - * @return {object} A parsed scenario - * @private - */ - function _parseSteps(scenario) { - scenario.steps.forEach((step) => { - if (step.embeddings !== undefined) { - step.attachments = []; - step.embeddings.forEach((embedding, embeddingIndex) => { - /* Decode Base64 for Text-ish attachements */ - if( - embedding.mime_type === 'text/html' || - embedding.mime_type === 'text/plain' - ) { - embedding.data = Buffer.from(embedding.data.toString(), 'base64') - } - /* istanbul ignore else */ - if ( - embedding.mime_type === 'application/json' || - (embedding.media && embedding.media.type === 'application/json') - ) { - embedding.data = Buffer.from(embedding.data, 'base64').toString() - step.json = (step.json ? step.json : []).concat([ - typeof embedding.data === 'string' - ? JSON.parse(embedding.data) - : embedding.data, - ]); - } else if ( - embedding.mime_type === 'text/html' || - (embedding.media && embedding.media.type === 'text/html') - ) { - step.html = (step.html ? step.html : []).concat([embedding.data]); - } else if ( - embedding.mime_type === 'text/plain' || - (embedding.media && embedding.media.type === 'text/plain') - ) { - step.text = (step.text ? step.text : []).concat([ - _escapeHtml(embedding.data), - ]); - } else if ( - embedding.mime_type === 'image/png' || - (embedding.media && embedding.media.type === 'image/png') - ) { - step.image = (step.image ? step.image : []).concat([ - 'data:image/png;base64,' + embedding.data, - ]); - step.embeddings[embeddingIndex] = {}; - } else if ( - embedding.mime_type === 'video/webm' || - (embedding.media && embedding.media.type === 'video/webm') - ) { - step.video = (step.video ? step.video : []).concat([ - 'data:video/webm;base64,' + embedding.data, - ]); - step.embeddings[embeddingIndex] = {}; - } else { - let embeddingType = 'text/plain'; - if (embedding.mime_type) { - embeddingType = embedding.mime_type; - } else if (embedding.media && embedding.media.type) { - embeddingType = embedding.media.type; - } - step.attachments.push({ - data: 'data:' + embeddingType + ';base64,' + embedding.data, - type: embeddingType, - }); - step.embeddings[embeddingIndex] = {}; - } - }); - } - - if (step.doc_string !== undefined) { - step.id = `${uuid()}.${scenario.id}.${step.name}`.replace( - /[^a-zA-Z0-9-_]/g, - '-' - ); - step.restWireData = _escapeHtml(step.doc_string.value).replace( - new RegExp('\r?\n', 'g'), - '
' - ); - } - - if ( - !step.result || - // Don't log steps that don't have a text/hidden/images/attachments unless they are failed. - // This is for the hooks - (step.hidden && - !step.text && - !step.image && - !step.video && - _.size(step.attachments) === 0 && - step.result.status !== RESULT_STATUS.failed) - ) { - return 0; - } - - if (step.result.duration) { - scenario.duration += step.result.duration; - step.time = formatDuration(step.result.duration); - } - - if (step.result.status.toLowerCase() === RESULT_STATUS.passed) { - return scenario.passed++; - } - - if (step.result.status.toLowerCase() === RESULT_STATUS.failed) { - return scenario.failed++; - } - - if (step.result.status.toLowerCase() === RESULT_STATUS.notDefined) { - return scenario.notDefined++; - } - - if (step.result.status.toLowerCase() === RESULT_STATUS.pending) { - return scenario.pending++; - } - - if (step.result.status.toLowerCase() === RESULT_STATUS.ambiguous) { - return scenario.ambiguous++; - } - - scenario.skipped++; - }); - - return scenario; - } - - /** - * Read a template file and return it's content - * @param {string} fileName - * @return {*} Content of the file - * @private - */ - function _readTemplateFile(fileName) { - if (fileName) { - try { - fs.accessSync(fileName, fs.constants.R_OK); - return fs.readFileSync(fileName, 'utf-8'); - } catch (err) { - return fs.readFileSync( - path.join(__dirname, '..', 'templates', fileName), - 'utf-8' - ); - } - } else { - return ''; - } - } - - /** - * Escape html in string - * @param string - * @return {string} - * @private - */ - function _escapeHtml(string) { - return typeof string === 'string' || string instanceof String - ? string.replace( - /[^0-9A-Za-z ]/g, - (chr) => '&#' + chr.charCodeAt(0) + ';' - ) - : string; - } - - /** - * Generate the features overview - * @param {object} suite JSON object with all the features and scenarios - * @private - */ - function _createFeaturesOverviewIndexPage(suite) { - const featuresOverviewIndex = path.resolve(reportPath, INDEX_HTML); - if (suite.customMetadata && options.metadata) { - suite.features.forEach((feature) => { - if (!feature.metadata) { - feature.metadata = options.metadata; - } - }); - } - FEATURES_OVERVIEW_TEMPLATE = suite.customMetadata - ? FEATURES_OVERVIEW_CUSTOM_METADATA_TEMPLATE - : FEATURES_OVERVIEW_TEMPLATE; - - fs.writeFileSync( - featuresOverviewIndex, - _.template(_readTemplateFile(FEATURES_OVERVIEW_INDEX_TEMPLATE))({ - suite: suite, - featuresOverview: _.template( - _readTemplateFile(FEATURES_OVERVIEW_TEMPLATE) - )({ - suite: suite, - _: _, - }), - featuresScenariosOverviewChart: _.template( - _readTemplateFile(SCENARIOS_OVERVIEW_CHART_TEMPLATE) - )({ - overviewPage: true, - scenarios: suite.scenarios, - _: _, - }), - customDataOverview: _.template(_readTemplateFile(CUSTOM_DATA_TEMPLATE))( - { - suite: suite, - _: _, - } - ), - featuresOverviewChart: _.template( - _readTemplateFile(FEATURES_OVERVIEW_CHART_TEMPLATE) - )({ - suite: suite, - _: _, - }), - customStyle: _readTemplateFile(suite.customStyle), - styles: _readTemplateFile(suite.style), - useCDN: suite.useCDN, - genericScript: _readTemplateFile(GENERIC_JS), - pageTitle: pageTitle, - reportName: reportName, - pageFooter: pageFooter, - }) - ); - } - - /** - * Generate the feature pages - * @param suite suite JSON object with all the features and scenarios - * @private - */ - function _createFeatureIndexPages(suite) { - // Set custom metadata overview for the feature - FEATURE_METADATA_OVERVIEW_TEMPLATE = suite.customMetadata - ? FEATURE_CUSTOM_METADATA_OVERVIEW_TEMPLATE - : FEATURE_METADATA_OVERVIEW_TEMPLATE; - - suite.features.forEach((feature) => { - const featurePage = path.resolve( - reportPath, - `${FEATURE_FOLDER}/${feature.id}.html` - ); - fs.writeFileSync( - featurePage, - _.template(_readTemplateFile(FEATURE_OVERVIEW_INDEX_TEMPLATE))({ - feature: feature, - suite: suite, - featureScenariosOverviewChart: _.template( - _readTemplateFile(SCENARIOS_OVERVIEW_CHART_TEMPLATE) - )({ - overviewPage: false, - feature: feature, - suite: suite, - scenarios: feature.scenarios, - _: _, - }), - featureMetadataOverview: _.template( - _readTemplateFile(FEATURE_METADATA_OVERVIEW_TEMPLATE) - )({ - metadata: feature.metadata, - _: _, - }), - scenarioTemplate: _.template(_readTemplateFile(SCENARIOS_TEMPLATE))({ - suite: suite, - scenarios: feature.elements, - _: _, - }), - useCDN: suite.useCDN, - customStyle: _readTemplateFile(suite.customStyle), - styles: _readTemplateFile(suite.style), - genericScript: _readTemplateFile(GENERIC_JS), - pageTitle: pageTitle, - reportName: reportName, - pageFooter: pageFooter, - plainDescription: plainDescription, - }) - ); - // Copy the assets, but first check if they don't exist and not useCDN - if ( - !fs.pathExistsSync(path.resolve(reportPath, 'assets')) && - !suite.useCDN - ) { - fs.copySync( - path.resolve( - path.dirname(require.resolve('../package.json')), - 'templates/assets' - ), - path.resolve(reportPath, 'assets') - ); - } - }); - } - - /** - * Formats the duration to HH:mm:ss.SSS. - * - * @param {number} duration a time duration usually in ns form; it can be - * possible to interpret the value as ms, see the option {durationInMS}. - * - * @return {string} the duration formatted as a string - */ - function formatDuration(duration) { - return Duration.fromMillis( - durationInMS ? duration : duration / 1000000 - ).toFormat('hh:mm:ss.SSS'); - } -} - -module.exports = { - generate: generateReport, -}; diff --git a/package.json b/package.json index dae3c6f7..1b9db539 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "multiple-cucumber-html-reporter", "version": "3.7.0", "description": "Generate beautiful Cucumber.js reports for multiple instances (browsers / devices)", + "type": "module", "keywords": [ "cucumber", "html", @@ -10,7 +11,12 @@ "html report", "json to html" ], - "main": "lib/generate-report.js", + "main": "dist/generate-report.js", + "files": [ + "dist", + "README.md", + "LICENSE" + ], "license": "MIT", "scripts": { "release": "release-it", @@ -18,9 +24,13 @@ "release.patch": "pnpm release.ci patch", "release.minor": "pnpm release.ci minor", "release.major": "pnpm release.ci major", + "clean": "rm -rf dist", + "build": "pnpm clean && tsc && cp -R src/templates dist/templates", + "dev": "pnpm build -w", "test": "node ./test/test.js", - "unit.test": "jasmine JASMINE_CONFIG_PATH=test/unit/jasmine.json", - "unit.test.coverage": "JASMINE_CONFIG_PATH=test/unit/jasmine.json nyc jasmine" + "new:test": "pnpm node ./src/test/test.mjs", + "new:unit:test": "NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules\" jest", + "new:unit:coverage": "pnpm new:unit:test --coverage" }, "repository": { "type": "git", @@ -32,18 +42,28 @@ }, "homepage": "https://github.com/WasiqB/multiple-cucumber-html-reporter#readme", "dependencies": { - "find": "^0.3.0", "fs-extra": "^11.2.0", - "jsonfile": "^6.1.0", "lodash": "^4.17.21", - "luxon": "^3.4.4", - "open": "^8.4.2", + "luxon": "^3.5.0", + "open": "^10.1.0", "uuid": "^10.0.0" }, "devDependencies": { - "jasmine": "^5.1.0", - "nyc": "^17.0.0", - "release-it": "^17.6.0" + "@types/find": "^0.2.4", + "@types/fs-extra": "^11.0.4", + "@types/jest": "^29.5.12", + "@types/jsonfile": "^6.1.4", + "@types/lodash": "^4.17.7", + "@types/luxon": "^3.4.2", + "@types/node": "^22.5.4", + "@types/uuid": "^10.0.0", + "find": "^0.3.0", + "jest": "^29.7.0", + "jsonfile": "^6.1.0", + "release-it": "^17.6.0", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", + "typescript": "^5.6.2" }, - "packageManager": "pnpm@9.5.0" + "packageManager": "pnpm@9.9.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 66db3e6a..376f7166 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,37 +8,67 @@ importers: .: dependencies: - find: - specifier: ^0.3.0 - version: 0.3.0 fs-extra: specifier: ^11.2.0 version: 11.2.0 - jsonfile: - specifier: ^6.1.0 - version: 6.1.0 lodash: specifier: ^4.17.21 version: 4.17.21 luxon: - specifier: ^3.4.4 - version: 3.4.4 + specifier: ^3.5.0 + version: 3.5.0 open: - specifier: ^8.4.2 - version: 8.4.2 + specifier: ^10.1.0 + version: 10.1.0 uuid: specifier: ^10.0.0 version: 10.0.0 devDependencies: - jasmine: - specifier: ^5.1.0 - version: 5.1.0 - nyc: - specifier: ^17.0.0 - version: 17.0.0 + '@types/find': + specifier: ^0.2.4 + version: 0.2.4 + '@types/fs-extra': + specifier: ^11.0.4 + version: 11.0.4 + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + '@types/jsonfile': + specifier: ^6.1.4 + version: 6.1.4 + '@types/lodash': + specifier: ^4.17.7 + version: 4.17.7 + '@types/luxon': + specifier: ^3.4.2 + version: 3.4.2 + '@types/node': + specifier: ^22.5.4 + version: 22.5.4 + '@types/uuid': + specifier: ^10.0.0 + version: 10.0.0 + find: + specifier: ^0.3.0 + version: 0.3.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.5.4)(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)) + jsonfile: + specifier: ^6.1.0 + version: 6.1.0 release-it: specifier: ^17.6.0 - version: 17.6.0 + version: 17.6.0(typescript@5.6.2) + ts-jest: + specifier: ^29.2.5 + version: 29.2.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(jest@29.7.0(@types/node@22.5.4)(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)))(typescript@5.6.2) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.5.4)(typescript@5.6.2) + typescript: + specifier: ^5.6.2 + version: 5.6.2 packages: @@ -88,6 +118,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.24.7': resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} @@ -121,6 +155,97 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.25.6': + resolution: {integrity: sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.4': + resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/template@7.24.7': resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} engines: {node: '>=6.9.0'} @@ -133,6 +258,13 @@ packages: resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} @@ -140,10 +272,6 @@ packages: resolution: {integrity: sha512-R7Gsg6elpuqdn55fBH2y9oYzrU/yKrSmIsDX4ROT51vohrECFzTf2zw9BfUbOW8xjfmM2QbVoVYdTwhrtEKWSQ==} engines: {node: '>=18'} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -152,6 +280,72 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -170,6 +364,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -234,10 +431,6 @@ packages: '@octokit/types@13.5.0': resolution: {integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@pnpm/config.env-replace@1.1.0': resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} @@ -250,6 +443,9 @@ packages: resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} engines: {node: '>=12'} + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} @@ -258,6 +454,12 @@ packages: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} @@ -265,17 +467,91 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/find@0.2.4': + resolution: {integrity: sha512-8cw1q8jruVOJoojgx8CimvFC4SP+sevnKOifRJTKXsngeWi/md1womzXRBv/LWNCoDEh4U51zc3r8HUAH2QyEg==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.12': + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/lodash@4.17.7': + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} + + '@types/luxon@3.4.2': + resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==} + + '@types/node@22.5.4': + resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@7.1.1: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -299,16 +575,20 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - append-transform@2.0.0: - resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} - engines: {node: '>=8'} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} - archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -323,6 +603,34 @@ packages: async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -358,6 +666,16 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -373,10 +691,6 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} - caching-transform@4.0.0: - resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} - engines: {node: '>=8'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -385,6 +699,10 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + camelcase@7.0.1: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} @@ -404,6 +722,10 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -411,9 +733,8 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + cjs-module-lexer@1.4.1: + resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} @@ -435,13 +756,21 @@ packages: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} - cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -455,9 +784,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -468,9 +794,6 @@ packages: resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} engines: {node: '>=12'} - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -483,6 +806,14 @@ packages: typescript: optional: true + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -508,18 +839,26 @@ packages: supports-color: optional: true - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + default-browser-id@5.0.0: resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} engines: {node: '>=18'} @@ -528,10 +867,6 @@ packages: resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} engines: {node: '>=18'} - default-require-extensions@3.0.1: - resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} - engines: {node: '>=8'} - defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -539,10 +874,6 @@ packages: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -554,6 +885,18 @@ packages: deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dot-prop@6.0.1: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'} @@ -561,9 +904,18 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + electron-to-chromium@1.4.803: resolution: {integrity: sha512-61H9mLzGOCLLVsnLiRzCbc63uldP0AniRYPV3hbGVtONA1pI7qSGILdbofR7A8TMbOypDocEAjH/e+9k1QIe3g==} + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} @@ -580,9 +932,6 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -595,6 +944,10 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} @@ -621,6 +974,14 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -629,21 +990,26 @@ packages: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -651,14 +1017,6 @@ packages: find@0.3.0: resolution: {integrity: sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw==} - foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} - - foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} - engines: {node: '>=14'} - form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} @@ -667,9 +1025,6 @@ packages: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} - fromentries@1.3.2: - resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} - fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} @@ -677,6 +1032,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -718,11 +1078,6 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob@10.4.1: - resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} - engines: {node: '>=16 || 14 >=14.18'} - hasBin: true - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -757,10 +1112,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - hasha@5.2.2: - resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} - engines: {node: '>=8'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -810,14 +1161,15 @@ packages: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -855,11 +1207,6 @@ packages: resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} engines: {node: '>= 0.4'} - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -873,6 +1220,10 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -941,14 +1292,6 @@ packages: resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} engines: {node: '>=18'} - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - is-wsl@3.1.0: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} @@ -964,18 +1307,14 @@ packages: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} - istanbul-lib-hook@3.0.0: - resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} istanbul-lib-instrument@6.0.2: resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} engines: {node: '>=10'} - istanbul-lib-processinfo@2.0.3: - resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} - engines: {node: '>=8'} - istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} @@ -988,16 +1327,139 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jasmine-core@5.1.2: - resolution: {integrity: sha512-2oIUMGn00FdUiqz6epiiJr7xcFyNYj3rDcfmnzfkBnHyBQ3cBQUs4mmyGsOb7TTLb9kxk7dBcmEmqhDKkBoDyA==} + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jasmine@5.1.0: - resolution: {integrity: sha512-prmJlC1dbLhti4nE4XAPDWmfJesYO15sjGXVp7Cs7Ym5I9Xtwa/hUHxxJXjnpfLO72+ySttA0Ztf8g/RiVnUKw==} + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1035,6 +1497,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + ky@1.4.0: resolution: {integrity: sha512-tPhhoGUiEiU/WXR4rt8klIoLdnTtyu+9jVKHd/wauEjYud32jyn63mzKWQweaQrHWxBQtYoVtdcEnYX1LosnFQ==} engines: {node: '>=18'} @@ -1043,6 +1509,10 @@ packages: resolution: {integrity: sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==} engines: {node: '>=18'} + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -1056,15 +1526,15 @@ packages: lodash.escaperegexp@4.1.2: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} - lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} - lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.uniqby@4.7.0: resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} @@ -1083,10 +1553,6 @@ packages: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} - lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -1094,22 +1560,24 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - luxon@3.4.4: - resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} + luxon@3.5.0: + resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} engines: {node: '>=12'} macos-release@3.2.0: resolution: {integrity: sha512-fSErXALFNsnowREYZ49XCdOHF8wOPWuFOGQrAhP7x5J/BqQv+B02cNsTykGpDgRVx43EKg++6ANmTaGTtW+hUA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -1148,17 +1616,13 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -1166,6 +1630,9 @@ packages: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + netmask@2.0.2: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} @@ -1182,13 +1649,16 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-preload@0.2.1: - resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} - engines: {node: '>=8'} + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + normalize-url@8.0.1: resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} engines: {node: '>=14.16'} @@ -1201,11 +1671,6 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - nyc@17.0.0: - resolution: {integrity: sha512-ISp44nqNCaPugLLGGfknzQwSwt10SSS5IMoPR7GLoMAyS18Iw5js8U7ga2VF9lYuMZ42gOHr3UddZw4WZltxKg==} - engines: {node: '>=18'} - hasBin: true - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -1221,10 +1686,6 @@ packages: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} @@ -1249,14 +1710,14 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} - p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -1269,10 +1730,6 @@ packages: resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} engines: {node: '>= 14'} - package-hash@4.0.0: - resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} - engines: {node: '>=8'} - package-json@10.0.1: resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==} engines: {node: '>=18'} @@ -1310,10 +1767,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - path-type@5.0.0: resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} engines: {node: '>=12'} @@ -1325,13 +1778,21 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - process-on-spawn@1.0.0: - resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} - engines: {node: '>=8'} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -1350,6 +1811,9 @@ packages: resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} engines: {node: '>=12.20'} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -1361,6 +1825,9 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -1382,20 +1849,17 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || ^22.0.0} hasBin: true - release-zalgo@1.0.0: - resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} - engines: {node: '>=4'} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1404,6 +1868,10 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -1428,11 +1896,6 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - run-applescript@7.0.0: resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} engines: {node: '>=18'} @@ -1466,8 +1929,10 @@ packages: engines: {node: '>=10'} hasBin: true - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -1489,6 +1954,13 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + slash@5.1.0: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} @@ -1505,24 +1977,31 @@ packages: resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - spawn-wrap@2.0.0: - resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} - engines: {node: '>=8'} - sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + stdin-discarder@0.2.2: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1562,6 +2041,10 @@ packages: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -1570,6 +2053,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -1582,6 +2069,9 @@ packages: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -1593,17 +2083,55 @@ packages: traverse-chain@0.1.0: resolution: {integrity: sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==} + ts-jest@29.2.5: + resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -1615,6 +2143,14 @@ packages: typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} @@ -1655,9 +2191,15 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -1666,9 +2208,6 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1703,27 +2242,36 @@ packages: write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} - y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} yoctocolors-cjs@2.1.2: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} @@ -1809,6 +2357,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-plugin-utils@7.24.8': {} + '@babel/helper-simple-access@7.24.7': dependencies: '@babel/traverse': 7.24.7 @@ -1842,6 +2392,91 @@ snapshots: dependencies: '@babel/types': 7.24.7 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/template@7.24.7': dependencies: '@babel/code-frame': 7.24.7 @@ -1869,19 +2504,16 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + '@bcoe/v8-coverage@0.2.3': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + '@iarna/toml@2.2.5': {} '@inquirer/figures@1.0.4': {} - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -1892,6 +2524,168 @@ snapshots: '@istanbuljs/schema@0.1.3': {} + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.5.4 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.5.4 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@22.5.4)(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.5.4 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 22.5.4 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 22.5.4 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.24.7 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.7 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.5.4 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -1909,6 +2703,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1984,9 +2783,6 @@ snapshots: dependencies: '@octokit/openapi-types': 22.2.0 - '@pkgjs/parseargs@0.11.0': - optional: true - '@pnpm/config.env-replace@1.1.0': {} '@pnpm/network.ca-file@1.0.2': @@ -1999,29 +2795,117 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 + '@sinclair/typebox@0.27.8': {} + '@sindresorhus/is@5.6.0': {} '@sindresorhus/merge-streams@2.3.0': {} + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 '@tootallnate/quickjs-emscripten@0.23.0': {} + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.24.7 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.24.7 + + '@types/find@0.2.4': {} + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 22.5.4 + + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 22.5.4 + '@types/http-cache-semantics@4.0.4': {} + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@29.5.12': + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 22.5.4 + + '@types/lodash@4.17.7': {} + + '@types/luxon@3.4.2': {} + + '@types/node@22.5.4': + dependencies: + undici-types: 6.19.8 + + '@types/stack-utils@2.0.3': {} + + '@types/uuid@10.0.0': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + agent-base@7.1.1: dependencies: debug: 4.3.5 transitivePeerDependencies: - supports-color - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -2042,13 +2926,16 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} - append-transform@2.0.0: + anymatch@3.1.3: dependencies: - default-require-extensions: 3.0.1 + normalize-path: 3.0.0 + picomatch: 2.3.1 - archy@1.0.0: {} + arg@4.1.3: {} argparse@1.0.10: dependencies: @@ -2064,6 +2951,63 @@ snapshots: dependencies: retry: 0.13.1 + async@3.2.6: {} + + babel-jest@29.7.0(@babel/core@7.24.7): + dependencies: + '@babel/core': 7.24.7 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.24.7) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.24.8 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + + babel-preset-current-node-syntax@1.1.0(@babel/core@7.24.7): + dependencies: + '@babel/core': 7.24.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7) + '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.24.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) + + babel-preset-jest@29.6.3(@babel/core@7.24.7): + dependencies: + '@babel/core': 7.24.7 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.24.7) + balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -2109,6 +3053,16 @@ snapshots: node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.1) + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -2130,17 +3084,12 @@ snapshots: normalize-url: 8.0.1 responselike: 3.0.0 - caching-transform@4.0.0: - dependencies: - hasha: 5.2.2 - make-dir: 3.1.0 - package-hash: 4.0.0 - write-file-atomic: 3.0.3 - callsites@3.1.0: {} camelcase@5.3.1: {} + camelcase@6.3.0: {} + camelcase@7.0.1: {} caniuse-lite@1.0.30001634: {} @@ -2158,11 +3107,13 @@ snapshots: chalk@5.3.0: {} + char-regex@1.0.2: {} + chardet@0.7.0: {} ci-info@3.9.0: {} - clean-stack@2.2.0: {} + cjs-module-lexer@1.4.1: {} cli-boxes@3.0.0: {} @@ -2178,14 +3129,18 @@ snapshots: cli-width@4.1.0: {} - cliui@6.0.0: + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 + wrap-ansi: 7.0.0 clone@1.0.4: {} + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -2198,8 +3153,6 @@ snapshots: color-name@1.1.4: {} - commondir@1.0.1: {} - concat-map@0.0.1: {} config-chain@1.1.13: @@ -2215,16 +3168,33 @@ snapshots: write-file-atomic: 3.0.3 xdg-basedir: 5.1.0 - convert-source-map@1.9.0: {} - convert-source-map@2.0.0: {} - cosmiconfig@9.0.0: + cosmiconfig@9.0.0(typescript@5.6.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 + optionalDependencies: + typescript: 5.6.2 + + create-jest@29.7.0(@types/node@22.5.4)(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@22.5.4)(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-require@1.1.1: {} cross-spawn@7.0.3: dependencies: @@ -2244,14 +3214,16 @@ snapshots: dependencies: ms: 2.1.2 - decamelize@1.2.0: {} - decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 + dedent@1.5.3: {} + deep-extend@0.6.0: {} + deepmerge@4.3.1: {} + default-browser-id@5.0.0: {} default-browser@5.2.1: @@ -2259,18 +3231,12 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.0 - default-require-extensions@3.0.1: - dependencies: - strip-bom: 4.0.0 - defaults@1.0.4: dependencies: clone: 1.0.4 defer-to-connect@2.0.1: {} - define-lazy-prop@2.0.0: {} - define-lazy-prop@3.0.0: {} degenerator@5.0.1: @@ -2281,14 +3247,26 @@ snapshots: deprecation@2.3.1: {} + detect-newline@3.1.0: {} + + diff-sequences@29.6.3: {} + + diff@4.0.2: {} + dot-prop@6.0.1: dependencies: is-obj: 2.0.0 eastasianwidth@0.2.0: {} + ejs@3.1.10: + dependencies: + jake: 10.9.2 + electron-to-chromium@1.4.803: {} + emittery@0.13.1: {} + emoji-regex@10.3.0: {} emoji-regex@8.0.0: {} @@ -2301,14 +3279,14 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es6-error@4.1.1: {} - escalade@3.1.2: {} escape-goat@4.0.0: {} escape-string-regexp@1.0.5: {} + escape-string-regexp@2.0.0: {} + escodegen@2.1.0: dependencies: esprima: 4.0.1 @@ -2347,6 +3325,16 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + exit@0.1.2: {} + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + external-editor@3.1.0: dependencies: chardet: 0.7.0 @@ -2361,24 +3349,28 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.7 + fast-json-stable-stringify@2.1.0: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - fill-range@7.1.1: + filelist@1.0.4: dependencies: - to-regex-range: 5.0.1 + minimatch: 5.1.6 - find-cache-dir@3.3.2: + fill-range@7.1.1: dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 + to-regex-range: 5.0.1 find-up@4.1.0: dependencies: @@ -2389,24 +3381,12 @@ snapshots: dependencies: traverse-chain: 0.1.0 - foreground-child@2.0.0: - dependencies: - cross-spawn: 7.0.3 - signal-exit: 3.0.7 - - foreground-child@3.2.1: - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - form-data-encoder@2.1.4: {} formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 - fromentries@1.3.2: {} - fs-extra@11.2.0: dependencies: graceful-fs: 4.2.10 @@ -2415,6 +3395,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.3: + optional: true + function-bind@1.1.2: {} gensync@1.0.0-beta.2: {} @@ -2451,14 +3434,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.1: - dependencies: - foreground-child: 3.2.1 - jackspeak: 3.4.0 - minimatch: 9.0.4 - minipass: 7.1.2 - path-scurry: 1.11.1 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -2505,11 +3480,6 @@ snapshots: has-flag@4.0.0: {} - hasha@5.2.2: - dependencies: - is-stream: 2.0.1 - type-fest: 0.8.1 - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -2556,9 +3526,12 @@ snapshots: import-lazy@4.0.0: {} - imurmurhash@0.1.4: {} + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 - indent-string@4.0.0: {} + imurmurhash@0.1.4: {} inflight@1.0.6: dependencies: @@ -2603,14 +3576,14 @@ snapshots: dependencies: hasown: 2.0.2 - is-docker@2.2.1: {} - is-docker@3.0.0: {} is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} + is-generator-fn@2.1.0: {} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -2654,12 +3627,6 @@ snapshots: is-unicode-supported@2.0.0: {} - is-windows@1.0.2: {} - - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 @@ -2676,9 +3643,15 @@ snapshots: istanbul-lib-coverage@3.2.2: {} - istanbul-lib-hook@3.0.0: + istanbul-lib-instrument@5.2.1: dependencies: - append-transform: 2.0.0 + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color istanbul-lib-instrument@6.0.2: dependencies: @@ -2690,15 +3663,6 @@ snapshots: transitivePeerDependencies: - supports-color - istanbul-lib-processinfo@2.0.3: - dependencies: - archy: 1.0.0 - cross-spawn: 7.0.3 - istanbul-lib-coverage: 3.2.2 - p-map: 3.0.0 - rimraf: 3.0.2 - uuid: 8.3.2 - istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 @@ -2718,18 +3682,321 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - jackspeak@3.4.0: + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.5.4 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.3 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0(@types/node@22.5.4)(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@22.5.4)(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@22.5.4)(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@22.5.4)(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)): + dependencies: + '@babel/core': 7.24.7 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.7) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.5.4 + ts-node: 10.9.2(@types/node@22.5.4)(typescript@5.6.2) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.5.4 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 22.5.4 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.7 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.24.7 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: dependencies: - '@isaacs/cliui': 8.0.2 + '@jest/types': 29.6.3 + '@types/node': 22.5.4 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + jest-resolve: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + + jest-runner@29.7.0: + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.5.4 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.5.4 + chalk: 4.1.2 + cjs-module-lexer: 1.4.1 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.24.7) + '@babel/types': 7.24.7 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.24.7) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.5.4 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.5.4 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 - jasmine-core@5.1.2: {} + jest-worker@29.7.0: + dependencies: + '@types/node': 22.5.4 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 - jasmine@5.1.0: + jest@29.7.0(@types/node@22.5.4)(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)): dependencies: - glob: 10.4.1 - jasmine-core: 5.1.2 + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@22.5.4)(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node js-tokens@4.0.0: {} @@ -2762,12 +4029,16 @@ snapshots: dependencies: json-buffer: 3.0.1 + kleur@3.0.3: {} + ky@1.4.0: {} latest-version@9.0.0: dependencies: package-json: 10.0.1 + leven@3.1.0: {} + lines-and-columns@1.2.4: {} locate-path@5.0.0: @@ -2778,12 +4049,12 @@ snapshots: lodash.escaperegexp@4.1.2: {} - lodash.flattendeep@4.4.0: {} - lodash.isplainobject@4.0.6: {} lodash.isstring@4.0.1: {} + lodash.memoize@4.1.2: {} + lodash.uniqby@4.7.0: {} lodash@4.17.21: {} @@ -2800,26 +4071,26 @@ snapshots: lowercase-keys@3.0.0: {} - lru-cache@10.2.2: {} - lru-cache@5.1.1: dependencies: yallist: 3.1.1 lru-cache@7.18.3: {} - luxon@3.4.4: {} + luxon@3.5.0: {} macos-release@3.2.0: {} - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - make-dir@4.0.0: dependencies: semver: 7.6.2 + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -2847,18 +4118,18 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@9.0.4: + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 minimist@1.2.8: {} - minipass@7.1.2: {} - ms@2.1.2: {} mute-stream@1.0.0: {} + natural-compare@1.4.0: {} + netmask@2.0.2: {} new-github-release-url@2.0.0: @@ -2873,12 +4144,12 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-preload@0.2.1: - dependencies: - process-on-spawn: 1.0.0 + node-int64@0.4.0: {} node-releases@2.0.14: {} + normalize-path@3.0.0: {} + normalize-url@8.0.1: {} npm-run-path@4.0.1: @@ -2889,38 +4160,6 @@ snapshots: dependencies: path-key: 4.0.0 - nyc@17.0.0: - dependencies: - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - caching-transform: 4.0.0 - convert-source-map: 1.9.0 - decamelize: 1.2.0 - find-cache-dir: 3.3.2 - find-up: 4.1.0 - foreground-child: 2.0.0 - get-package-type: 0.1.0 - glob: 7.2.3 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-hook: 3.0.0 - istanbul-lib-instrument: 6.0.2 - istanbul-lib-processinfo: 2.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - make-dir: 3.1.0 - node-preload: 0.2.1 - p-map: 3.0.0 - process-on-spawn: 1.0.0 - resolve-from: 5.0.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - spawn-wrap: 2.0.0 - test-exclude: 6.0.0 - yargs: 15.4.1 - transitivePeerDependencies: - - supports-color - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -2940,12 +4179,6 @@ snapshots: is-inside-container: 1.0.0 is-wsl: 3.1.0 - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - ora@5.4.1: dependencies: bl: 4.1.0 @@ -2983,13 +4216,13 @@ snapshots: dependencies: p-try: 2.2.0 - p-locate@4.1.0: + p-limit@3.1.0: dependencies: - p-limit: 2.3.0 + yocto-queue: 0.1.0 - p-map@3.0.0: + p-locate@4.1.0: dependencies: - aggregate-error: 3.1.0 + p-limit: 2.3.0 p-try@2.2.0: {} @@ -3011,13 +4244,6 @@ snapshots: degenerator: 5.0.1 netmask: 2.0.2 - package-hash@4.0.0: - dependencies: - graceful-fs: 4.2.11 - hasha: 5.2.2 - lodash.flattendeep: 4.4.0 - release-zalgo: 1.0.0 - package-json@10.0.1: dependencies: ky: 1.4.0 @@ -3054,24 +4280,28 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.2.2 - minipass: 7.1.2 - path-type@5.0.0: {} picocolors@1.0.1: {} picomatch@2.3.1: {} + pirates@4.0.6: {} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - process-on-spawn@1.0.0: + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + prompts@2.4.2: dependencies: - fromentries: 1.3.2 + kleur: 3.0.3 + sisteransi: 1.0.5 proto-list@1.2.4: {} @@ -3096,6 +4326,8 @@ snapshots: dependencies: escape-goat: 4.0.0 + pure-rand@6.1.0: {} + queue-microtask@1.2.3: {} quick-lru@5.1.1: {} @@ -3107,6 +4339,8 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 + react-is@18.3.1: {} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -3125,13 +4359,13 @@ snapshots: dependencies: rc: 1.2.8 - release-it@17.6.0: + release-it@17.6.0(typescript@5.6.2): dependencies: '@iarna/toml': 2.2.5 '@octokit/rest': 20.1.1 async-retry: 1.3.3 chalk: 5.3.0 - cosmiconfig: 9.0.0 + cosmiconfig: 9.0.0(typescript@5.6.2) execa: 8.0.1 git-url-parse: 14.0.0 globby: 14.0.2 @@ -3157,20 +4391,20 @@ snapshots: - supports-color - typescript - release-zalgo@1.0.0: - dependencies: - es6-error: 4.1.1 - require-directory@2.1.1: {} - require-main-filename@2.0.0: {} - resolve-alpn@1.2.1: {} + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + resolve-from@4.0.0: {} resolve-from@5.0.0: {} + resolve.exports@2.0.2: {} + resolve@1.22.8: dependencies: is-core-module: 2.15.0 @@ -3195,10 +4429,6 @@ snapshots: reusify@1.0.4: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - run-applescript@7.0.0: {} run-async@3.0.0: {} @@ -3223,7 +4453,7 @@ snapshots: semver@7.6.2: {} - set-blocking@2.0.0: {} + semver@7.6.3: {} shebang-command@2.0.0: dependencies: @@ -3241,6 +4471,10 @@ snapshots: signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + + slash@3.0.0: {} + slash@5.1.0: {} smart-buffer@4.2.0: {} @@ -3258,23 +4492,28 @@ snapshots: ip-address: 9.0.5 smart-buffer: 4.2.0 - source-map@0.6.1: {} - - spawn-wrap@2.0.0: + source-map-support@0.5.13: dependencies: - foreground-child: 2.0.0 - is-windows: 1.0.2 - make-dir: 3.1.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - which: 2.0.2 + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} sprintf-js@1.0.3: {} sprintf-js@1.1.3: {} + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + stdin-discarder@0.2.2: {} + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -3313,6 +4552,8 @@ snapshots: strip-json-comments@2.0.1: {} + strip-json-comments@3.1.1: {} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -3321,6 +4562,10 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} test-exclude@6.0.0: @@ -3333,6 +4578,8 @@ snapshots: dependencies: os-tmpdir: 1.0.2 + tmpl@1.0.5: {} + to-fast-properties@2.0.0: {} to-regex-range@5.0.1: @@ -3341,11 +4588,48 @@ snapshots: traverse-chain@0.1.0: {} + ts-jest@29.2.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(jest@29.7.0(@types/node@22.5.4)(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)))(typescript@5.6.2): + dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@22.5.4)(ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.6.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.24.7 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.7) + + ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.5.4 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.6.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + tslib@2.6.3: {} - type-fest@0.21.3: {} + type-detect@4.0.8: {} - type-fest@0.8.1: {} + type-fest@0.21.3: {} type-fest@1.4.0: {} @@ -3355,6 +4639,10 @@ snapshots: dependencies: is-typedarray: 1.0.0 + typescript@5.6.2: {} + + undici-types@6.19.8: {} + unicorn-magic@0.1.0: {} unique-string@3.0.0: @@ -3394,7 +4682,17 @@ snapshots: uuid@10.0.0: {} - uuid@8.3.2: {} + v8-compile-cache-lib@3.0.1: {} + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 wcwidth@1.0.1: dependencies: @@ -3402,8 +4700,6 @@ snapshots: web-streams-polyfill@3.3.3: {} - which-module@2.0.1: {} - which@2.0.2: dependencies: isexe: 2.0.0 @@ -3445,31 +4741,31 @@ snapshots: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + xdg-basedir@5.1.0: {} - y18n@4.0.3: {} + y18n@5.0.8: {} yallist@3.1.1: {} - yargs-parser@18.1.3: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - yargs-parser@21.1.1: {} - yargs@15.4.1: + yargs@17.7.2: dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 + cliui: 8.0.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} yoctocolors-cjs@2.1.2: {} diff --git a/src/collect-jsons.ts b/src/collect-jsons.ts new file mode 100644 index 00000000..d2ceec07 --- /dev/null +++ b/src/collect-jsons.ts @@ -0,0 +1,83 @@ +import find from "find"; +import fs from "fs-extra"; +import jsonFile from "jsonfile"; +import path from "node:path"; +import { Feature, FeatureHook, Options } from "./types/report-types.js"; +import { formatToLocalIso } from "./utils/common.js"; + +const parseFeatureHooks = (data: any[], keyword: string): FeatureHook[] => { + return data.map((step) => { + const match = + step.match && step.match.location + ? step.match + : { location: "can not be determined" }; + + return { + arguments: step.arguments || [], + keyword: keyword, + name: "Hook", + result: step.result, + line: "", + match, + embeddings: step.embeddings || [], + }; + }); +}; + +export const collectFeatures = (options: Options): Feature[] => { + const features: Feature[] = []; + const jsonDirPath = path.resolve(process.cwd(), options.jsonDir || ""); + + let files: string[]; + try { + files = find.fileSync(/\.json$/, jsonDirPath); + } catch { + throw new Error(`Unable to read JSON files from '${options.jsonDir}'.`); + } + + if (files.length === 0) { + console.warn( + `WARNING: No JSON files found in '${options.jsonDir}'. NO REPORT CAN BE CREATED!` + ); + return []; + } + + files.forEach((file) => { + const data = fs.readFileSync(file, "utf-8") || "[]"; + const reportTime = fs.statSync(file).birthtime; + + JSON.parse(data).forEach((json: Feature) => { + json.metadata = json.metadata || + options.metadata || { + browser: { name: "not known", version: "not known" }, + device: "not known", + platform: { name: "not known", version: "not known" }, + }; + + if (options.displayReportTime && reportTime) { + json.metadata.reportTime = formatToLocalIso(reportTime); + } + + if (json.elements) { + json.elements = json.elements.map((scenario) => ({ + ...scenario, + steps: [ + ...parseFeatureHooks(scenario.before || [], "Before"), + ...(scenario.steps || []), + ...parseFeatureHooks(scenario.after || [], "After"), + ], + })); + } + + features.push(json); + }); + }); + + if (options.saveCollectedJSON) { + const outputFile = path.resolve(options.reportPath!, "merged-output.json"); + fs.ensureDirSync(options.reportPath!); + jsonFile.writeFileSync(outputFile, features, { spaces: 2 }); + } + + return features; +}; diff --git a/src/generate-report.ts b/src/generate-report.ts new file mode 100644 index 00000000..0b6fb740 --- /dev/null +++ b/src/generate-report.ts @@ -0,0 +1,392 @@ +import _ from "lodash"; +import fs from "fs-extra"; +import jsonFile from "jsonfile"; +import open from "open"; +import path from "node:path"; +import { v4 as uuid } from "uuid"; +import { collectFeatures } from "./collect-jsons.js"; +import { Feature, Options, Scenario, Suite } from "./types/report-types.js"; +import { calculatePercentage, formatDuration } from "./utils/common.js"; +import { + _createFeatureIndexPages, + _createFeaturesOverviewIndexPage, + _escapeHtml, +} from "./utils/template.js"; + +const RESULT_STATUS = { + passed: "passed", + failed: "failed", + skipped: "skipped", + pending: "pending", + notDefined: "undefined", + ambiguous: "ambiguous", +}; + +const REPORT_STYLESHEET = "style.css"; +const INDEX_HTML = "index.html"; +const FEATURE_FOLDER = "features"; +const DEFAULT_REPORT_NAME = "Multiple Cucumber HTML Reporter"; + +const parseFeatures = (suite: Suite, options: Options): void => { + suite.features.forEach((feature) => { + feature.scenarios = { + passed: 0, + failed: 0, + notDefined: 0, + skipped: 0, + pending: 0, + ambiguous: 0, + passedPercentage: 0, + failedPercentage: 0, + notDefinedPercentage: 0, + skippedPercentage: 0, + pendingPercentage: 0, + ambiguousPercentage: 0, + total: 0, + }; + feature.duration = 0; + feature.time = "00:00:00.000"; + feature.isFailed = false; + feature.isAmbiguous = false; + feature.isSkipped = false; + feature.isNotdefined = false; + feature.isPending = false; + suite.featureCount.total++; + const idPrefix = options.staticFilePath ? "" : `${uuid()}.`; + feature.id = `${idPrefix}${feature.id}`.replace(/[^a-zA-Z0-9-_]/g, "-"); + feature.app = 0; + feature.browser = 0; + + if (feature.elements) { + feature = parseScenarios(feature, suite, options); + } + + if (feature.isFailed) { + suite.featureCount.failed++; + } else if (feature.isAmbiguous) { + suite.featureCount.ambiguous++; + } else if (feature.isNotdefined) { + suite.featureCount.notDefined++; + } else if (feature.isPending) { + suite.featureCount.pending++; + } else if (feature.isSkipped) { + suite.featureCount.skipped++; + } else { + suite.featureCount.passed++; + } + + if (feature.duration) { + suite.totalTime += feature.duration; + feature.time = formatDuration(feature.duration, !!options.durationInMS); + } + + suite.app += feature.metadata?.app ? 1 : 0; + suite.browser += feature.metadata?.browser ? 1 : 0; + }); +}; + +const parseScenarios = ( + feature: Feature, + suite: Suite, + options: Options +): Feature => { + feature.elements?.forEach((scenario) => { + scenario.passed = 0; + scenario.failed = 0; + scenario.notDefined = 0; + scenario.skipped = 0; + scenario.pending = 0; + scenario.ambiguous = 0; + scenario.duration = 0; + scenario.time = "00:00:00.000"; + + scenario = parseSteps(scenario, options); + + if (scenario.duration > 0) { + feature.duration += scenario.duration; + scenario.time = formatDuration(scenario.duration, !!options.durationInMS); + } + + if (scenario.description) { + scenario.description = scenario.description.replace(/\r?\n/g, "
"); + } + + if (scenario.type === "background") return; + + suite.scenarios.total++; + feature.scenarios.total++; + + if (scenario.failed > 0) { + suite.scenarios.failed++; + feature.scenarios.failed++; + feature.isFailed = true; + } else if (scenario.ambiguous > 0) { + suite.scenarios.ambiguous++; + feature.scenarios.ambiguous++; + feature.isAmbiguous = true; + } else if (scenario.notDefined > 0) { + suite.scenarios.notDefined++; + feature.scenarios.notDefined++; + feature.isNotdefined = true; + } else if (scenario.pending > 0) { + suite.scenarios.pending++; + feature.scenarios.pending++; + feature.isPending = true; + } else if (scenario.skipped > 0) { + suite.scenarios.skipped++; + feature.scenarios.skipped++; + feature.isSkipped = true; + } else { + suite.scenarios.passed++; + feature.scenarios.passed++; + } + }); + return feature; +}; + +const parseSteps = ( + scenario: Scenario, + { durationInMS = false }: Options +): Scenario => { + scenario.steps.forEach((step) => { + if (!step.embeddings) { + return; + } + + step.attachments = step.attachments || []; + + step.embeddings.forEach((embedding, embeddingIndex) => { + const { mime_type, media, data } = embedding; + const type = mime_type || media?.type; + + if ((type === "text/html" || type === "text/plain") && data) { + embedding.data = Buffer.from(data.toString(), "base64").toString(); + } + + switch (type) { + case "application/json": + if (data) { + embedding.data = Buffer.from(data, "base64").toString(); + step.json = (step.json || []).concat([ + typeof embedding.data === "string" + ? JSON.parse(embedding.data) + : embedding.data, + ]); + } + break; + case "text/html": + step.html = (step.html || []).concat([data || ""]); + break; + case "text/plain": + step.text = (step.text || []).concat([_escapeHtml(data)]); + break; + case "image/png": + step.image = (step.image || []).concat([ + `data:image/png;base64,${data}`, + ]); + if (step.embeddings) { + step.embeddings[embeddingIndex] = {}; + } + break; + case "video/webm": + step.video = (step.video || []).concat([ + `data:video/webm;base64,${data}`, + ]); + if (step.embeddings) { + step.embeddings[embeddingIndex] = {}; + } + break; + default: + step.attachments?.push({ + data: `data:${type || "text/plain"};base64,${data}`, + media: { type: type || "text/plain" }, + }); + if (step.embeddings) { + step.embeddings[embeddingIndex] = {}; + } + } + }); + + if (step.doc_string) { + step.id = `${uuid()}.${scenario.id}.${step.name}`.replace( + /[^a-zA-Z0-9-_]/g, + "-" + ); + step.restWireData = _escapeHtml(step.doc_string.value).replace( + /\r?\n/g, + "
" + ); + } + + if (step.result) { + const { status, duration } = step.result; + if (duration) { + scenario.duration += duration; + step.time = formatDuration(duration, durationInMS); + } + + switch (status.toLowerCase()) { + case RESULT_STATUS.passed: + scenario.passed++; + break; + case RESULT_STATUS.failed: + scenario.failed++; + break; + case RESULT_STATUS.notDefined: + scenario.notDefined++; + break; + case RESULT_STATUS.pending: + scenario.pending++; + break; + case RESULT_STATUS.ambiguous: + scenario.ambiguous++; + break; + default: + scenario.skipped++; + } + } + + if ( + !step.result || + (step.hidden && + !step.text && + !step.image && + !step.video && + step.attachments?.length === 0 && + step.result.status !== RESULT_STATUS.failed) + ) { + return; + } + }); + + return scenario; +}; + +export const generateReport = (options: Options): void => { + if (!options.jsonDir) + throw new Error("A path holding the JSON files should be provided."); + if (!options.reportPath) + throw new Error("An output path for the reports should be defined."); + + const { + customMetadata = false, + customData = null, + overrideStyle = REPORT_STYLESHEET, + customStyle, + disableLog = false, + openReportInBrowser = false, + reportName = DEFAULT_REPORT_NAME, + reportPath: reportPathOption, + saveCollectedJSON = false, + displayDuration = false, + displayReportTime = false, + hideMetadata = false, + useCDN = false, + } = options; + + const reportPath = path.resolve(process.cwd(), reportPathOption); + + fs.ensureDirSync(reportPath); + fs.ensureDirSync(path.resolve(reportPath, FEATURE_FOLDER)); + + const allFeatures = collectFeatures(options); + + let suite: Suite = { + app: 0, + customMetadata, + customData, + style: overrideStyle, + customStyle, + useCDN, + hideMetadata, + displayReportTime, + displayDuration, + browser: 0, + name: "", + version: "version", + time: new Date(), + features: allFeatures, + featureCount: { + ambiguous: 0, + failed: 0, + passed: 0, + notDefined: 0, + pending: 0, + skipped: 0, + total: 0, + ambiguousPercentage: 0, + failedPercentage: 0, + notDefinedPercentage: 0, + pendingPercentage: 0, + skippedPercentage: 0, + passedPercentage: 0, + }, + reportName, + scenarios: { + failed: 0, + ambiguous: 0, + notDefined: 0, + pending: 0, + skipped: 0, + passed: 0, + total: 0, + }, + totalTime: 0, + }; + + parseFeatures(suite, options); + + suite.featureCount.passedPercentage = calculatePercentage( + suite.featureCount.passed, + suite.featureCount.total + ); + suite.featureCount.failedPercentage = calculatePercentage( + suite.featureCount.failed, + suite.featureCount.total + ); + suite.featureCount.notDefinedPercentage = calculatePercentage( + suite.featureCount.notDefined, + suite.featureCount.total + ); + suite.featureCount.pendingPercentage = calculatePercentage( + suite.featureCount.pending, + suite.featureCount.total + ); + suite.featureCount.skippedPercentage = calculatePercentage( + suite.featureCount.skipped, + suite.featureCount.total + ); + suite.featureCount.ambiguousPercentage = calculatePercentage( + suite.featureCount.ambiguous, + suite.featureCount.total + ); + + if (saveCollectedJSON) { + jsonFile.writeFileSync( + path.resolve(reportPath, "enriched-output.json"), + suite, + { spaces: 2 } + ); + } + + // Additional logging, browser opening, and report generation logic can be added here + _createFeaturesOverviewIndexPage(suite, options); + _createFeatureIndexPages(suite, options); + + /* istanbul ignore else */ + if (!disableLog) { + console.log( + "\x1b[34m%s\x1b[0m", + `\n +===================================================================================== + Multiple Cucumber HTML report generated in: + + ${path.join(reportPath, INDEX_HTML)} +=====================================================================================\n` + ); + } + + if (openReportInBrowser) { + open(path.join(reportPath, INDEX_HTML)); + } +}; diff --git a/templates/assets/css/bootstrap.min.css b/src/templates/assets/css/bootstrap.min.css similarity index 100% rename from templates/assets/css/bootstrap.min.css rename to src/templates/assets/css/bootstrap.min.css diff --git a/templates/assets/css/dataTables.bootstrap.min.css b/src/templates/assets/css/dataTables.bootstrap.min.css similarity index 100% rename from templates/assets/css/dataTables.bootstrap.min.css rename to src/templates/assets/css/dataTables.bootstrap.min.css diff --git a/templates/assets/css/font-awesome.min.css b/src/templates/assets/css/font-awesome.min.css similarity index 100% rename from templates/assets/css/font-awesome.min.css rename to src/templates/assets/css/font-awesome.min.css diff --git a/templates/assets/css/responsive.dataTables.min.css b/src/templates/assets/css/responsive.dataTables.min.css similarity index 100% rename from templates/assets/css/responsive.dataTables.min.css rename to src/templates/assets/css/responsive.dataTables.min.css diff --git a/templates/assets/fonts/FontAwesome.otf b/src/templates/assets/fonts/FontAwesome.otf similarity index 100% rename from templates/assets/fonts/FontAwesome.otf rename to src/templates/assets/fonts/FontAwesome.otf diff --git a/templates/assets/fonts/fontawesome-webfont.eot b/src/templates/assets/fonts/fontawesome-webfont.eot similarity index 100% rename from templates/assets/fonts/fontawesome-webfont.eot rename to src/templates/assets/fonts/fontawesome-webfont.eot diff --git a/templates/assets/fonts/fontawesome-webfont.svg b/src/templates/assets/fonts/fontawesome-webfont.svg similarity index 100% rename from templates/assets/fonts/fontawesome-webfont.svg rename to src/templates/assets/fonts/fontawesome-webfont.svg diff --git a/templates/assets/fonts/fontawesome-webfont.ttf b/src/templates/assets/fonts/fontawesome-webfont.ttf similarity index 100% rename from templates/assets/fonts/fontawesome-webfont.ttf rename to src/templates/assets/fonts/fontawesome-webfont.ttf diff --git a/templates/assets/fonts/fontawesome-webfont.woff b/src/templates/assets/fonts/fontawesome-webfont.woff similarity index 100% rename from templates/assets/fonts/fontawesome-webfont.woff rename to src/templates/assets/fonts/fontawesome-webfont.woff diff --git a/templates/assets/fonts/fontawesome-webfont.woff2 b/src/templates/assets/fonts/fontawesome-webfont.woff2 similarity index 100% rename from templates/assets/fonts/fontawesome-webfont.woff2 rename to src/templates/assets/fonts/fontawesome-webfont.woff2 diff --git a/templates/assets/fonts/glyphicons-halflings-regular.eot b/src/templates/assets/fonts/glyphicons-halflings-regular.eot similarity index 100% rename from templates/assets/fonts/glyphicons-halflings-regular.eot rename to src/templates/assets/fonts/glyphicons-halflings-regular.eot diff --git a/templates/assets/fonts/glyphicons-halflings-regular.svg b/src/templates/assets/fonts/glyphicons-halflings-regular.svg similarity index 100% rename from templates/assets/fonts/glyphicons-halflings-regular.svg rename to src/templates/assets/fonts/glyphicons-halflings-regular.svg diff --git a/templates/assets/fonts/glyphicons-halflings-regular.ttf b/src/templates/assets/fonts/glyphicons-halflings-regular.ttf similarity index 100% rename from templates/assets/fonts/glyphicons-halflings-regular.ttf rename to src/templates/assets/fonts/glyphicons-halflings-regular.ttf diff --git a/templates/assets/fonts/glyphicons-halflings-regular.woff b/src/templates/assets/fonts/glyphicons-halflings-regular.woff similarity index 100% rename from templates/assets/fonts/glyphicons-halflings-regular.woff rename to src/templates/assets/fonts/glyphicons-halflings-regular.woff diff --git a/templates/assets/fonts/glyphicons-halflings-regular.woff2 b/src/templates/assets/fonts/glyphicons-halflings-regular.woff2 similarity index 100% rename from templates/assets/fonts/glyphicons-halflings-regular.woff2 rename to src/templates/assets/fonts/glyphicons-halflings-regular.woff2 diff --git a/templates/assets/img/ghost.svg b/src/templates/assets/img/ghost.svg similarity index 100% rename from templates/assets/img/ghost.svg rename to src/templates/assets/img/ghost.svg diff --git a/templates/assets/js/Chart.min.js b/src/templates/assets/js/Chart.min.js similarity index 100% rename from templates/assets/js/Chart.min.js rename to src/templates/assets/js/Chart.min.js diff --git a/templates/assets/js/bootstrap.min.js b/src/templates/assets/js/bootstrap.min.js similarity index 100% rename from templates/assets/js/bootstrap.min.js rename to src/templates/assets/js/bootstrap.min.js diff --git a/templates/assets/js/darkmode.js b/src/templates/assets/js/darkmode.js similarity index 100% rename from templates/assets/js/darkmode.js rename to src/templates/assets/js/darkmode.js diff --git a/templates/assets/js/dataTables.bootstrap.min.js b/src/templates/assets/js/dataTables.bootstrap.min.js similarity index 100% rename from templates/assets/js/dataTables.bootstrap.min.js rename to src/templates/assets/js/dataTables.bootstrap.min.js diff --git a/templates/assets/js/dataTables.responsive.min.js b/src/templates/assets/js/dataTables.responsive.min.js similarity index 100% rename from templates/assets/js/dataTables.responsive.min.js rename to src/templates/assets/js/dataTables.responsive.min.js diff --git a/templates/assets/js/html5shiv.min.js b/src/templates/assets/js/html5shiv.min.js similarity index 100% rename from templates/assets/js/html5shiv.min.js rename to src/templates/assets/js/html5shiv.min.js diff --git a/templates/assets/js/jquery-3.2.1.min.js b/src/templates/assets/js/jquery-3.2.1.min.js similarity index 100% rename from templates/assets/js/jquery-3.2.1.min.js rename to src/templates/assets/js/jquery-3.2.1.min.js diff --git a/templates/assets/js/jquery.dataTables.min.js b/src/templates/assets/js/jquery.dataTables.min.js similarity index 100% rename from templates/assets/js/jquery.dataTables.min.js rename to src/templates/assets/js/jquery.dataTables.min.js diff --git a/templates/assets/js/respond.min.js b/src/templates/assets/js/respond.min.js similarity index 100% rename from templates/assets/js/respond.min.js rename to src/templates/assets/js/respond.min.js diff --git a/templates/components/custom-data.tmpl b/src/templates/components/custom-data.tmpl similarity index 100% rename from templates/components/custom-data.tmpl rename to src/templates/components/custom-data.tmpl diff --git a/templates/components/feature-custom-metadata-overview.tmpl b/src/templates/components/feature-custom-metadata-overview.tmpl similarity index 100% rename from templates/components/feature-custom-metadata-overview.tmpl rename to src/templates/components/feature-custom-metadata-overview.tmpl diff --git a/templates/components/feature-metadata-overview.tmpl b/src/templates/components/feature-metadata-overview.tmpl similarity index 100% rename from templates/components/feature-metadata-overview.tmpl rename to src/templates/components/feature-metadata-overview.tmpl diff --git a/templates/components/features-overview-custom-metadata.tmpl b/src/templates/components/features-overview-custom-metadata.tmpl similarity index 100% rename from templates/components/features-overview-custom-metadata.tmpl rename to src/templates/components/features-overview-custom-metadata.tmpl diff --git a/templates/components/features-overview.chart.tmpl b/src/templates/components/features-overview.chart.tmpl similarity index 100% rename from templates/components/features-overview.chart.tmpl rename to src/templates/components/features-overview.chart.tmpl diff --git a/templates/components/features-overview.tmpl b/src/templates/components/features-overview.tmpl similarity index 100% rename from templates/components/features-overview.tmpl rename to src/templates/components/features-overview.tmpl diff --git a/templates/components/scenarios-overview.chart.tmpl b/src/templates/components/scenarios-overview.chart.tmpl similarity index 100% rename from templates/components/scenarios-overview.chart.tmpl rename to src/templates/components/scenarios-overview.chart.tmpl diff --git a/templates/components/scenarios.tmpl b/src/templates/components/scenarios.tmpl similarity index 100% rename from templates/components/scenarios.tmpl rename to src/templates/components/scenarios.tmpl diff --git a/templates/feature-overview.index.tmpl b/src/templates/feature-overview.index.tmpl similarity index 100% rename from templates/feature-overview.index.tmpl rename to src/templates/feature-overview.index.tmpl diff --git a/templates/features-overview.index.tmpl b/src/templates/features-overview.index.tmpl similarity index 100% rename from templates/features-overview.index.tmpl rename to src/templates/features-overview.index.tmpl diff --git a/templates/generic.js b/src/templates/generic.js similarity index 100% rename from templates/generic.js rename to src/templates/generic.js diff --git a/templates/style.css b/src/templates/style.css similarity index 100% rename from templates/style.css rename to src/templates/style.css diff --git a/src/test/collect-feature.spec.ts b/src/test/collect-feature.spec.ts new file mode 100644 index 00000000..fe2b3d2d --- /dev/null +++ b/src/test/collect-feature.spec.ts @@ -0,0 +1,119 @@ +import jsonFile from "jsonfile"; +import path from "path"; +import { collectFeatures } from "../collect-jsons"; +import { Options } from "../types/report-types"; + +const reportPath = path.resolve(process.cwd(), "./.temp/test"); + +describe("collect-features.ts", () => { + describe("Happy flows", () => { + it("should return an output from the merged found JSON files", () => { + const result = collectFeatures({ + jsonDir: "./src/test/data/json", + reportPath, + }); + const expectedOutput = jsonFile.readFileSync( + path.resolve(process.cwd(), "./src/test/data/output/merged-output.json") + ); + + expect(result).toEqual(expectedOutput); + }); + + it("should return an output from the merged found JSON files and add the provided metadata", () => { + const result = collectFeatures({ + jsonDir: "./src/test/data/collect-json", + reportPath, + metadata: { + browser: { + name: "chrome", + version: "1", + }, + device: "Local test machine", + platform: { + name: "Ubuntu", + version: "16.04", + }, + }, + }); + const expectedOutput = jsonFile.readFileSync( + path.resolve( + process.cwd(), + "./src/test/data/output/provided-metadata.json" + ) + ); + + expect(result).toEqual(expectedOutput); + }); + + it("should save an output from the merged found JSON files", () => { + const result = collectFeatures({ + jsonDir: "./src/test/data/json", + reportPath, + saveCollectedJSON: true, + }); + const expectedOutput = jsonFile.readFileSync( + path.resolve(process.cwd(), "./src/test/data/output/merged-output.json") + ); + + expect(result).toEqual(expectedOutput); + }); + + it("should collect the creation date of JSON files", () => { + const options: Options = { + jsonDir: "./src/test/data/json", + reportPath, + displayReportTime: true, + }; + + const collectedFeatures = collectFeatures(options); + + collectedFeatures.forEach((json) => { + expect(json.metadata?.reportTime).toBeDefined(); + expect(json.metadata?.reportTime?.length).toBe( + "YYYY/MM/DD HH:mm:ss".length + ); + }); + }); + }); + + describe("Failures", () => { + it("should throw an error when the JSON folder does not exist", () => { + expect(() => { + collectFeatures({ + jsonDir: "./src/test/data/nonexistent", + reportPath, + }); + }).toThrow( + new Error( + `Unable to read JSON files from './src/test/data/nonexistent'.` + ) + ); + }); + + it("should print a console message when no JSON files could be found", () => { + const consoleSpy = import.meta.jest + .spyOn(console, "warn") + .mockImplementation(); + + collectFeatures({ + jsonDir: "./src/test/data/no-jsons", + reportPath, + }); + + expect(consoleSpy).toHaveBeenCalledWith( + `WARNING: No JSON files found in './src/test/data/no-jsons'. NO REPORT CAN BE CREATED!` + ); + consoleSpy.mockRestore(); + }); + + it("should return an empty array when no JSON files could be found", () => { + const result = collectFeatures({ + jsonDir: "./src/test/data/no-jsons", + reportPath, + }); + + expect(Array.isArray(result)).toBe(true); + expect(result.length).toBe(0); + }); + }); +}); diff --git a/test/custom.css b/src/test/custom.css similarity index 100% rename from test/custom.css rename to src/test/custom.css diff --git a/test/unit/data/collect-json/no-metadata.json b/src/test/data/collect-json/no-metadata.json similarity index 100% rename from test/unit/data/collect-json/no-metadata.json rename to src/test/data/collect-json/no-metadata.json diff --git a/test/unit/data/custom-metadata-json/ambiguous_scenarios_specified_v1.json b/src/test/data/custom-metadata-json/ambiguous_scenarios_specified_v1.json similarity index 100% rename from test/unit/data/custom-metadata-json/ambiguous_scenarios_specified_v1.json rename to src/test/data/custom-metadata-json/ambiguous_scenarios_specified_v1.json diff --git a/test/unit/data/custom-metadata-json/ambiguous_scenarios_specified_v2.json b/src/test/data/custom-metadata-json/ambiguous_scenarios_specified_v2.json similarity index 100% rename from test/unit/data/custom-metadata-json/ambiguous_scenarios_specified_v2.json rename to src/test/data/custom-metadata-json/ambiguous_scenarios_specified_v2.json diff --git a/test/unit/data/custom-metadata-json/failure_report_v3.json b/src/test/data/custom-metadata-json/failure_report_v3.json similarity index 100% rename from test/unit/data/custom-metadata-json/failure_report_v3.json rename to src/test/data/custom-metadata-json/failure_report_v3.json diff --git a/test/unit/data/custom-metadata-json/multiple_different_attachements.json b/src/test/data/custom-metadata-json/multiple_different_attachements.json similarity index 100% rename from test/unit/data/custom-metadata-json/multiple_different_attachements.json rename to src/test/data/custom-metadata-json/multiple_different_attachements.json diff --git a/test/unit/data/custom-metadata-json/pending_scenarios_specified_v1.json b/src/test/data/custom-metadata-json/pending_scenarios_specified_v1.json similarity index 100% rename from test/unit/data/custom-metadata-json/pending_scenarios_specified_v1.json rename to src/test/data/custom-metadata-json/pending_scenarios_specified_v1.json diff --git a/test/unit/data/custom-metadata-json/skipped_scenarios.json b/src/test/data/custom-metadata-json/skipped_scenarios.json similarity index 100% rename from test/unit/data/custom-metadata-json/skipped_scenarios.json rename to src/test/data/custom-metadata-json/skipped_scenarios.json diff --git a/test/unit/data/custom-metadata-json/undefined_scenarios_specified_v3.json b/src/test/data/custom-metadata-json/undefined_scenarios_specified_v3.json similarity index 100% rename from test/unit/data/custom-metadata-json/undefined_scenarios_specified_v3.json rename to src/test/data/custom-metadata-json/undefined_scenarios_specified_v3.json diff --git a/test/unit/data/embedded-array-json/embedded_success_v1.json b/src/test/data/embedded-array-json/embedded_success_v1.json similarity index 100% rename from test/unit/data/embedded-array-json/embedded_success_v1.json rename to src/test/data/embedded-array-json/embedded_success_v1.json diff --git a/test/unit/data/embedded-array-json/failure_report_multi_attachment_v3.json b/src/test/data/embedded-array-json/failure_report_multi_attachment_v3.json similarity index 100% rename from test/unit/data/embedded-array-json/failure_report_multi_attachment_v3.json rename to src/test/data/embedded-array-json/failure_report_multi_attachment_v3.json diff --git a/test/unit/data/embedded-array-json/failure_report_v3.json b/src/test/data/embedded-array-json/failure_report_v3.json similarity index 100% rename from test/unit/data/embedded-array-json/failure_report_v3.json rename to src/test/data/embedded-array-json/failure_report_v3.json diff --git a/test/unit/data/embedded-array-json/happy_flow_v2.json b/src/test/data/embedded-array-json/happy_flow_v2.json similarity index 100% rename from test/unit/data/embedded-array-json/happy_flow_v2.json rename to src/test/data/embedded-array-json/happy_flow_v2.json diff --git a/test/unit/data/embedded-array-json/happy_flow_v3.json b/src/test/data/embedded-array-json/happy_flow_v3.json similarity index 100% rename from test/unit/data/embedded-array-json/happy_flow_v3.json rename to src/test/data/embedded-array-json/happy_flow_v3.json diff --git a/test/unit/data/json/after.hook.error.json b/src/test/data/json/after.hook.error.json similarity index 100% rename from test/unit/data/json/after.hook.error.json rename to src/test/data/json/after.hook.error.json diff --git a/test/unit/data/json/ambiguous_scenarios_specified_v1.json b/src/test/data/json/ambiguous_scenarios_specified_v1.json similarity index 100% rename from test/unit/data/json/ambiguous_scenarios_specified_v1.json rename to src/test/data/json/ambiguous_scenarios_specified_v1.json diff --git a/test/unit/data/json/ambiguous_scenarios_specified_v2.json b/src/test/data/json/ambiguous_scenarios_specified_v2.json similarity index 100% rename from test/unit/data/json/ambiguous_scenarios_specified_v2.json rename to src/test/data/json/ambiguous_scenarios_specified_v2.json diff --git a/test/unit/data/json/ambiguous_scenarios_specified_v3.json b/src/test/data/json/ambiguous_scenarios_specified_v3.json similarity index 100% rename from test/unit/data/json/ambiguous_scenarios_specified_v3.json rename to src/test/data/json/ambiguous_scenarios_specified_v3.json diff --git a/test/unit/data/json/background.json b/src/test/data/json/background.json similarity index 100% rename from test/unit/data/json/background.json rename to src/test/data/json/background.json diff --git a/test/unit/data/json/background2.json b/src/test/data/json/background2.json similarity index 100% rename from test/unit/data/json/background2.json rename to src/test/data/json/background2.json diff --git a/test/unit/data/json/before-and-after-hook.json b/src/test/data/json/before-and-after-hook.json similarity index 100% rename from test/unit/data/json/before-and-after-hook.json rename to src/test/data/json/before-and-after-hook.json diff --git a/test/unit/data/json/before.hook.error.json b/src/test/data/json/before.hook.error.json similarity index 100% rename from test/unit/data/json/before.hook.error.json rename to src/test/data/json/before.hook.error.json diff --git a/test/unit/data/json/embeddings.json b/src/test/data/json/embeddings.json similarity index 100% rename from test/unit/data/json/embeddings.json rename to src/test/data/json/embeddings.json diff --git a/test/unit/data/json/empty_json.json b/src/test/data/json/empty_json.json similarity index 100% rename from test/unit/data/json/empty_json.json rename to src/test/data/json/empty_json.json diff --git a/test/unit/data/json/failure_report_v1.json b/src/test/data/json/failure_report_v1.json similarity index 100% rename from test/unit/data/json/failure_report_v1.json rename to src/test/data/json/failure_report_v1.json diff --git a/test/unit/data/json/failure_report_v2.json b/src/test/data/json/failure_report_v2.json similarity index 100% rename from test/unit/data/json/failure_report_v2.json rename to src/test/data/json/failure_report_v2.json diff --git a/test/unit/data/json/failure_report_v3.json b/src/test/data/json/failure_report_v3.json similarity index 100% rename from test/unit/data/json/failure_report_v3.json rename to src/test/data/json/failure_report_v3.json diff --git a/test/unit/data/json/happy_flow_app_android.json b/src/test/data/json/happy_flow_app_android.json similarity index 100% rename from test/unit/data/json/happy_flow_app_android.json rename to src/test/data/json/happy_flow_app_android.json diff --git a/test/unit/data/json/happy_flow_app_ios.json b/src/test/data/json/happy_flow_app_ios.json similarity index 100% rename from test/unit/data/json/happy_flow_app_ios.json rename to src/test/data/json/happy_flow_app_ios.json diff --git a/test/unit/data/json/happy_flow_v1.json b/src/test/data/json/happy_flow_v1.json similarity index 100% rename from test/unit/data/json/happy_flow_v1.json rename to src/test/data/json/happy_flow_v1.json diff --git a/test/unit/data/json/happy_flow_v2.json b/src/test/data/json/happy_flow_v2.json similarity index 100% rename from test/unit/data/json/happy_flow_v2.json rename to src/test/data/json/happy_flow_v2.json diff --git a/test/unit/data/json/happy_flow_v3.json b/src/test/data/json/happy_flow_v3.json similarity index 100% rename from test/unit/data/json/happy_flow_v3.json rename to src/test/data/json/happy_flow_v3.json diff --git a/test/unit/data/json/no_elements.json b/src/test/data/json/no_elements.json similarity index 100% rename from test/unit/data/json/no_elements.json rename to src/test/data/json/no_elements.json diff --git a/test/unit/data/json/no_elements_v2.json b/src/test/data/json/no_elements_v2.json similarity index 100% rename from test/unit/data/json/no_elements_v2.json rename to src/test/data/json/no_elements_v2.json diff --git a/test/unit/data/json/no_elements_v3.json b/src/test/data/json/no_elements_v3.json similarity index 100% rename from test/unit/data/json/no_elements_v3.json rename to src/test/data/json/no_elements_v3.json diff --git a/test/unit/data/json/pending_scenarios_specified_v1.json b/src/test/data/json/pending_scenarios_specified_v1.json similarity index 100% rename from test/unit/data/json/pending_scenarios_specified_v1.json rename to src/test/data/json/pending_scenarios_specified_v1.json diff --git a/test/unit/data/json/pending_scenarios_specified_v2.json b/src/test/data/json/pending_scenarios_specified_v2.json similarity index 100% rename from test/unit/data/json/pending_scenarios_specified_v2.json rename to src/test/data/json/pending_scenarios_specified_v2.json diff --git a/test/unit/data/json/pending_scenarios_specified_v3.json b/src/test/data/json/pending_scenarios_specified_v3.json similarity index 100% rename from test/unit/data/json/pending_scenarios_specified_v3.json rename to src/test/data/json/pending_scenarios_specified_v3.json diff --git a/test/unit/data/json/skipped_scenarios.json b/src/test/data/json/skipped_scenarios.json similarity index 100% rename from test/unit/data/json/skipped_scenarios.json rename to src/test/data/json/skipped_scenarios.json diff --git a/test/unit/data/json/undefined_scenarios_specified_v1.json b/src/test/data/json/undefined_scenarios_specified_v1.json similarity index 100% rename from test/unit/data/json/undefined_scenarios_specified_v1.json rename to src/test/data/json/undefined_scenarios_specified_v1.json diff --git a/test/unit/data/json/undefined_scenarios_specified_v2.json b/src/test/data/json/undefined_scenarios_specified_v2.json similarity index 100% rename from test/unit/data/json/undefined_scenarios_specified_v2.json rename to src/test/data/json/undefined_scenarios_specified_v2.json diff --git a/test/unit/data/json/undefined_scenarios_specified_v3.json b/src/test/data/json/undefined_scenarios_specified_v3.json similarity index 100% rename from test/unit/data/json/undefined_scenarios_specified_v3.json rename to src/test/data/json/undefined_scenarios_specified_v3.json diff --git a/test/unit/data/json/undefined_succeeded_pending_scenarios_specified_v3.json b/src/test/data/json/undefined_succeeded_pending_scenarios_specified_v3.json similarity index 100% rename from test/unit/data/json/undefined_succeeded_pending_scenarios_specified_v3.json rename to src/test/data/json/undefined_succeeded_pending_scenarios_specified_v3.json diff --git a/test/unit/data/json/with_rest_doc_string.json b/src/test/data/json/with_rest_doc_string.json similarity index 100% rename from test/unit/data/json/with_rest_doc_string.json rename to src/test/data/json/with_rest_doc_string.json diff --git a/test/unit/data/no-jsons/empty.md b/src/test/data/no-jsons/empty.md similarity index 100% rename from test/unit/data/no-jsons/empty.md rename to src/test/data/no-jsons/empty.md diff --git a/test/unit/data/output/merged-output.json b/src/test/data/output/merged-output.json similarity index 100% rename from test/unit/data/output/merged-output.json rename to src/test/data/output/merged-output.json diff --git a/test/unit/data/output/provided-metadata.json b/src/test/data/output/provided-metadata.json similarity index 100% rename from test/unit/data/output/provided-metadata.json rename to src/test/data/output/provided-metadata.json diff --git a/src/test/generate-report.spec.ts b/src/test/generate-report.spec.ts new file mode 100644 index 00000000..7ca7cbbe --- /dev/null +++ b/src/test/generate-report.spec.ts @@ -0,0 +1,153 @@ +import fs from "fs-extra"; +import path from "path"; +import { generateReport } from "../generate-report"; +import { getCurrentDir } from "../utils/constants"; +const REPORT_PATH = "./.tmp/"; + +describe("generate-report.ts", () => { + const cleanUp = () => { + if (fs.pathExistsSync(REPORT_PATH)) { + fs.removeSync(REPORT_PATH); + } + }; + + const reportPathExists = (filePath: string) => fs.pathExistsSync(filePath); + + describe("Happy flows", () => { + beforeEach(() => cleanUp()); + afterEach(() => cleanUp()); + + it("should create a report from the merged found json files without provided custom data", () => { + generateReport({ + jsonDir: "./src/test/data/json", + reportPath: REPORT_PATH, + saveCollectedJSON: true, + displayDuration: true, + }); + + expect(reportPathExists(path.join(REPORT_PATH, "index.html"))).toBe(true); + expect(() => + fs.statSync(path.join(REPORT_PATH, "features/happy-flow-v2.html")) + ).toThrow(); + expect( + reportPathExists(path.join(REPORT_PATH, "merged-output.json")) + ).toBe(true); + expect( + reportPathExists(path.join(REPORT_PATH, "enriched-output.json")) + ).toBe(true); + }); + + it("should create a report with the report time", () => { + generateReport({ + jsonDir: "./src/test/data/json", + reportPath: REPORT_PATH, + saveCollectedJSON: true, + displayDuration: true, + displayReportTime: true, + }); + + expect(reportPathExists(path.join(REPORT_PATH, "index.html"))).toBe(true); + const indexHtmlContent = fs.readFileSync( + path.join(REPORT_PATH, "index.html"), + "utf8" + ); + expect(indexHtmlContent).toContain(">Date"); + }); + + it("should create a report from the merged found json files with custom data with static file paths", () => { + generateReport({ + jsonDir: "./src/test/data/json", + reportPath: REPORT_PATH, + staticFilePath: true, + saveCollectedJSON: true, + reportName: "You can adjust this report name", + customData: { + title: "Run info", + data: [ + { label: "Project", value: "Custom project" }, + { label: "Release", value: "1.2.3" }, + { label: "Cycle", value: "B11221.34321" }, + { + label: "Execution Start Time", + value: "Nov 19th 2017, 02:31 PM EST", + }, + { + label: "Execution End Time", + value: "Nov 19th 2017, 02:56 PM EST", + }, + ], + }, + displayDuration: true, + durationInMS: true, + }); + + expect(reportPathExists(path.join(REPORT_PATH, "index.html"))).toBe(true); + expect( + reportPathExists(path.join(REPORT_PATH, "features/happy-flow-v2.html")) + ).toBe(true); + expect( + reportPathExists(path.join(REPORT_PATH, "merged-output.json")) + ).toBe(true); + expect( + reportPathExists(path.join(REPORT_PATH, "enriched-output.json")) + ).toBe(true); + }); + + it("should create a report from the merged found json files with custom metadata", () => { + try { + generateReport({ + jsonDir: "./src/test/data/custom-metadata-json/", + reportPath: REPORT_PATH, + customMetadata: true, + }); + } catch (error) { + console.log(error); + } + + expect( + reportPathExists(path.join(process.cwd(), REPORT_PATH, "index.html")) + ).toBe(true); + }); + + it("should create a report from the merged found json files and with array of embedded items", () => { + generateReport({ + jsonDir: "./src/test/data/embedded-array-json/", + reportName: "Embedded array of various mimeType", + reportPath: REPORT_PATH, + customStyle: path.join(getCurrentDir(import.meta.url), "my.css"), + customMetadata: false, + }); + + expect(reportPathExists(path.join(REPORT_PATH, "index.html"))).toBe(true); + }); + + it("should open report in browser", () => { + generateReport({ + jsonDir: "./src/test/data/embedded-array-json/", + reportName: "Embedded array of various mimeType", + reportPath: REPORT_PATH, + openReportInBrowser: true, + customStyle: path.join(getCurrentDir(import.meta.url), "my.css"), + customMetadata: false, + }); + + expect(reportPathExists(path.join(REPORT_PATH, "index.html"))).toBe(true); + }); + }); + + describe("Failures", () => { + it("should throw an error when the json folder does not exist", () => { + expect(() => generateReport({})).toThrow( + "A path holding the JSON files should be provided." + ); + }); + + it("should throw an error when the report folder is not provided", () => { + expect(() => + generateReport({ + jsonDir: "./src/test/data/json", + }) + ).toThrow("An output path for the reports should be defined."); + }); + }); +}); diff --git a/test/my.css b/src/test/my.css similarity index 100% rename from test/my.css rename to src/test/my.css diff --git a/src/test/test.mjs b/src/test/test.mjs new file mode 100644 index 00000000..0053279f --- /dev/null +++ b/src/test/test.mjs @@ -0,0 +1,96 @@ +import path from "node:path"; +import { generateReport } from "../../dist/generate-report.js"; +import { getCurrentDir } from "../../dist/utils/constants.js"; + +const __dirname = getCurrentDir(import.meta.url); + +/** + * Generate a report for browsers + */ +generateReport({ + saveCollectedJSON: true, + useCDN: true, + jsonDir: "./src/test/data/json/", + reportPath: "./.tmp/browsers/", + reportName: "You can adjust this report name", + customMetadata: false, + displayDuration: true, + durationInMS: true, + customData: { + title: "Run info", + data: [ + { label: "Project", value: "Custom project" }, + { label: "Release", value: "1.2.3" }, + { label: "Cycle", value: "B11221.34321" }, + { label: "Execution Start Time", value: "Nov 19th 2017, 02:31 PM EST" }, + { label: "Execution End Time", value: "Nov 19th 2017, 02:56 PM EST" }, + ], + }, +}); + +/** + * Generate a report with array of embedded data + */ +generateReport({ + saveCollectedJSON: true, + jsonDir: "./src/test/data/embedded-array-json/", + reportPath: "./.tmp/embedded-array/", + customStyle: path.join(__dirname, "./custom.css"), + overrideStyle: path.join(__dirname, "./my.css"), + customMetadata: false, + pageTitle: "A custom page title", + pageFooter: "

Some custom footer data can be placed here

", + plainDescription: true, + customData: { + title: "Run info", + data: [ + { label: "Project", value: "Custom embedded project" }, + { label: "Release", value: "4.5.6" }, + ], + }, +}); + +/** + * Generate a report for browsers with report time + */ +generateReport({ + saveCollectedJSON: true, + jsonDir: "./src/test/data/json/", + reportPath: "./.tmp/browsers-with-report-time/", + reportName: "You can adjust this report name", + customMetadata: false, + displayDuration: true, + displayReportTime: true, + hideMetadata: true, + durationInMS: true, + customData: { + title: "Run info", + data: [ + { label: "Project", value: "Custom project" }, + { label: "Release", value: "1.2.3" }, + { label: "Cycle", value: "B11221.34321" }, + { label: "Execution Start Time", value: "Nov 19th 2017, 02:31 PM EST" }, + { label: "Execution End Time", value: "Nov 19th 2017, 02:56 PM EST" }, + ], + }, +}); + +/** + * Generate a report with custom metadata + * NOTE: must be last, if you use customMetadata you cannot reuse generator + */ +generateReport({ + saveCollectedJSON: true, + jsonDir: "./src/test/data/custom-metadata-json/", + reportPath: "./.tmp/custom-metadata/", + customMetadata: true, + displayDuration: true, + metadata: { + metadata: [ + { name: "Backend version", value: "4.0 R11" }, + { name: "Client API version", value: "17.10" }, + { name: "Test Configuration", value: "Config A" }, + ], + platform: { name: "Ubuntu", version: "16.04" }, + }, +}); diff --git a/src/types/report-types.ts b/src/types/report-types.ts new file mode 100644 index 00000000..3673a5b8 --- /dev/null +++ b/src/types/report-types.ts @@ -0,0 +1,168 @@ +type Options = { + jsonDir?: string; + metadata?: JsonMetadata; + displayReportTime?: boolean; + saveCollectedJSON?: boolean; + reportPath?: string; + customMetadata?: boolean; + customData?: object | null; + plainDescription?: boolean; + overrideStyle?: string; + customStyle?: string; + disableLog?: boolean; + openReportInBrowser?: boolean; + reportName?: string; + displayDuration?: boolean; + durationInMS?: boolean; + hideMetadata?: boolean; + pageTitle?: string; + pageFooter?: string | null; + useCDN?: boolean; + staticFilePath?: boolean; +}; + +type JsonMetadata = { + app?: number; + browser?: { + name: string; + version: string; + }; + device?: string; + platform?: { + name: string; + version: string; + }; + reportTime?: string; + metadata?: { name: string; value: string }[]; +}; + +type FeatureHook = { + arguments: any[]; + keyword: string; + name: string; + result: { status: string }; + line: string; + match: { location: string }; + embeddings: Embedding[]; +}; + +type Suite = { + app: number; + customMetadata: boolean; + customData: object | null; + style: string; + customStyle?: string; + useCDN: boolean; + hideMetadata: boolean; + displayReportTime: boolean; + displayDuration: boolean; + browser: number; + name: string; + version: string; + time: Date; + features: Feature[]; + featureCount: FeatureCount; + reportName: string; + scenarios: ScenarioCount; + totalTime: number; +}; + +type FeatureCount = { + ambiguous: number; + failed: number; + passed: number; + notDefined: number; + pending: number; + skipped: number; + total: number; + ambiguousPercentage: number; + failedPercentage: number; + notDefinedPercentage: number; + pendingPercentage: number; + skippedPercentage: number; + passedPercentage: number; +}; + +/** + * FIXME: Required? + */ +type ScenarioCount = { + failed: number; + ambiguous: number; + notDefined: number; + pending: number; + skipped: number; + passed: number; + total: number; +}; + +type Feature = { + id: string; + app: number; + browser: number; + scenarios: FeatureCount; + duration: number; + time: string; + isFailed: boolean; + isAmbiguous: boolean; + isSkipped: boolean; + isNotdefined: boolean; + isPending: boolean; + elements?: Scenario[]; + metadata: JsonMetadata; +}; + +type Scenario = { + id?: string; + passed: number; + failed: number; + notDefined: number; + skipped: number; + pending: number; + ambiguous: number; + duration: number; + time: string; + type?: string; + description?: string; + steps: Step[]; + before?: Step[]; + after?: Step[]; +}; + +type Step = { + name: string; + embeddings?: Embedding[]; + attachments?: Embedding[]; + imageUrl?: string; + jsonEmbedding?: string; + html?: string[]; + json?: any; + text?: string[]; + image?: string[]; + video?: string[]; + doc_string?: { value: string }; + result?: { status: string; duration?: number }; + time?: string; + id?: string; + restWireData?: string; + hidden?: boolean; +}; + +type Embedding = { + mime_type?: string; + media?: { type: string }; + data?: string; +}; + +export { + Options, + Suite, + Feature, + FeatureCount, + FeatureHook, + Scenario, + ScenarioCount, + Step, + Embedding, + JsonMetadata, +}; diff --git a/src/utils/common.ts b/src/utils/common.ts new file mode 100644 index 00000000..9148ef3d --- /dev/null +++ b/src/utils/common.ts @@ -0,0 +1,18 @@ +import { DateTime, Duration } from "luxon"; + +export const formatDuration = ( + duration: number, + durationInMs: boolean +): string => + durationInMs + ? `${Duration.fromMillis(duration).toFormat("hh:mm:ss.SSS")}` + : `${Duration.fromObject({ seconds: duration }).toFormat("hh:mm:ss.SSS")}`; + +export const formatToLocalIso = (date: Date): string => + DateTime.fromJSDate(date).toFormat("yyyy/MM/dd HH:mm:ss"); + +export const calculatePercentage = (amount: number, total: number): number => + round((amount / total) * 100); + +const round = (value: number): number => + Math.round((value + Number.EPSILON) * 100) / 100; diff --git a/src/utils/constants.ts b/src/utils/constants.ts new file mode 100644 index 00000000..667af2eb --- /dev/null +++ b/src/utils/constants.ts @@ -0,0 +1,7 @@ +import { fileURLToPath } from "url"; +import { dirname } from "path"; + +export function getCurrentDir(metaUrl: string): string { + const __filename = fileURLToPath(metaUrl); + return dirname(__filename); +} diff --git a/src/utils/template.ts b/src/utils/template.ts new file mode 100644 index 00000000..4e3d3508 --- /dev/null +++ b/src/utils/template.ts @@ -0,0 +1,183 @@ +import fs from "fs-extra"; +import path from "path"; +import _ from "lodash"; +import { Options, Suite } from "../types/report-types.js"; +import { getCurrentDir } from "./constants.js"; + +const dirname = getCurrentDir(import.meta.url); + +const GENERIC_JS = "generic.js"; +const INDEX_HTML = "index.html"; +const FEATURE_FOLDER = "features"; +const FEATURES_OVERVIEW_INDEX_TEMPLATE = "features-overview.index.tmpl"; +const CUSTOM_DATA_TEMPLATE = "components/custom-data.tmpl"; +let FEATURES_OVERVIEW_TEMPLATE = "components/features-overview.tmpl"; +const FEATURES_OVERVIEW_CUSTOM_METADATA_TEMPLATE = + "components/features-overview-custom-metadata.tmpl"; +const FEATURES_OVERVIEW_CHART_TEMPLATE = + "components/features-overview.chart.tmpl"; +const SCENARIOS_OVERVIEW_CHART_TEMPLATE = + "components/scenarios-overview.chart.tmpl"; +const FEATURE_OVERVIEW_INDEX_TEMPLATE = "feature-overview.index.tmpl"; +let FEATURE_METADATA_OVERVIEW_TEMPLATE = + "components/feature-metadata-overview.tmpl"; +const FEATURE_CUSTOM_METADATA_OVERVIEW_TEMPLATE = + "components/feature-custom-metadata-overview.tmpl"; +const SCENARIOS_TEMPLATE = "components/scenarios.tmpl"; + +/** + * Read a template file and return its content + * @param {string} fileName - Name of the file + * @returns {string} Content of the file + */ +const _readTemplateFile = (fileName: string): string => { + try { + fs.accessSync(fileName, fs.constants.R_OK); + return fs.readFileSync(fileName, "utf-8"); + } catch (err) { + return fs.readFileSync( + path.join(dirname, "..", "templates", fileName), + "utf-8" + ); + } +}; + +/** + * Escape HTML in a string + * @param {any} input - The string to escape + * @returns {string} Escaped string + */ +const _escapeHtml = (input: any): string => { + return typeof input === "string" || input instanceof String + ? input.replace(/[^0-9A-Za-z ]/g, (chr) => `&#${chr.charCodeAt(0)};`) + : input; +}; + +/** + * Generate the features overview page + * @param {Suite} suite - JSON object with all the features and scenarios + */ +const _createFeaturesOverviewIndexPage = ( + suite: Suite, + { reportPath, metadata, pageTitle, reportName, pageFooter }: Options +): void => { + const featuresOverviewIndex = path.resolve(reportPath || "", INDEX_HTML); + + if (suite.customMetadata && metadata) { + suite.features.forEach((feature) => { + if (!feature.metadata) { + feature.metadata = metadata; + } + }); + } + + const template = suite.customMetadata + ? FEATURES_OVERVIEW_CUSTOM_METADATA_TEMPLATE + : FEATURES_OVERVIEW_TEMPLATE; + + fs.writeFileSync( + featuresOverviewIndex, + _.template(_readTemplateFile(FEATURES_OVERVIEW_INDEX_TEMPLATE))({ + suite: suite, + featuresOverview: _.template(_readTemplateFile(template))({ + suite: suite, + _: _, + }), + featuresScenariosOverviewChart: _.template( + _readTemplateFile(SCENARIOS_OVERVIEW_CHART_TEMPLATE) + )({ + overviewPage: true, + scenarios: suite.scenarios, + _: _, + }), + customDataOverview: _.template(_readTemplateFile(CUSTOM_DATA_TEMPLATE))({ + suite: suite, + _: _, + }), + featuresOverviewChart: _.template( + _readTemplateFile(FEATURES_OVERVIEW_CHART_TEMPLATE) + )({ + suite: suite, + _: _, + }), + customStyle: suite.customStyle + ? _readTemplateFile(suite.customStyle) + : "", + styles: _readTemplateFile(suite.style), + useCDN: suite.useCDN, + genericScript: _readTemplateFile(GENERIC_JS), + pageTitle: pageTitle, + reportName: reportName, + pageFooter: pageFooter, + }) + ); +}; + +/** + * Generate the feature index pages + * @param {Suite} suite - JSON object with all the features and scenarios + */ +const _createFeatureIndexPages = ( + suite: Suite, + { reportPath, plainDescription, pageTitle, pageFooter, reportName }: Options +): void => { + const template = suite.customMetadata + ? FEATURE_CUSTOM_METADATA_OVERVIEW_TEMPLATE + : FEATURE_METADATA_OVERVIEW_TEMPLATE; + + suite.features.forEach((feature) => { + const featurePage = path.resolve( + reportPath || "", + `${FEATURE_FOLDER}/${feature.id}.html` + ); + + fs.writeFileSync( + featurePage, + _.template(_readTemplateFile(FEATURE_OVERVIEW_INDEX_TEMPLATE))({ + feature: feature, + suite: suite, + featureScenariosOverviewChart: _.template( + _readTemplateFile(SCENARIOS_OVERVIEW_CHART_TEMPLATE) + )({ + overviewPage: false, + feature: feature, + suite: suite, + scenarios: feature.scenarios, + _: _, + }), + featureMetadataOverview: _.template(_readTemplateFile(template))({ + metadata: feature.metadata, + _: _, + }), + scenarioTemplate: _.template(_readTemplateFile(SCENARIOS_TEMPLATE))({ + suite: suite, + scenarios: feature.elements, + _: _, + }), + useCDN: suite.useCDN, + customStyle: suite.customStyle + ? _readTemplateFile(suite.customStyle) + : "", + styles: _readTemplateFile(suite.style), + genericScript: _readTemplateFile(GENERIC_JS), + pageTitle: pageTitle, + reportName: reportName, + pageFooter: pageFooter, + plainDescription: plainDescription, + }) + ); + + // Copy assets if they don't exist and CDN is not used + const assetsPath = path.resolve(reportPath || "", "assets"); + + if (!fs.pathExistsSync(assetsPath) && !suite.useCDN) { + fs.copySync(path.join(dirname, "..", "templates", "assets"), assetsPath); + } + }); +}; + +export { + _createFeaturesOverviewIndexPage, + _createFeatureIndexPages, + _escapeHtml, +}; diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 875b6ffb..00000000 --- a/test/test.js +++ /dev/null @@ -1,93 +0,0 @@ -'use strict'; -const path = require('node:path'); - -const test = require('../lib/generate-report'); - -/** - * Generate a report for browsers - */ -test.generate({ - saveCollectedJSON: true, - jsonDir: './test/unit/data/json/', - reportPath: './.tmp/browsers/', - reportName: 'You can adjust this report name', - customMetadata: false, - displayDuration: true, - durationInMS: true, - customData: { - title: 'Run info', - data: [ - {label: 'Project', value: 'Custom project'}, - {label: 'Release', value: '1.2.3'}, - {label: 'Cycle', value: 'B11221.34321'}, - {label: 'Execution Start Time', value: 'Nov 19th 2017, 02:31 PM EST'}, - {label: 'Execution End Time', value: 'Nov 19th 2017, 02:56 PM EST'} - ] - } -}); - -/** - * Generate a report with array of embedded data - */ -test.generate({ - saveCollectedJSON: true, - jsonDir: './test/unit/data/embedded-array-json/', - reportPath: './.tmp/embedded-array/', - customStyle: path.join(__dirname, './custom.css'), - overrideStyle: path.join(__dirname, './my.css'), - customMetadata: false, - pageTitle: 'A custom page title', - pageFooter: '

Some custom footer data can be placed here

', - plainDescription: true, - customData: { - title: 'Run info', - data: [ - {label: 'Project', value: 'Custom embedded project'}, - {label: 'Release', value: '4.5.6'}, - ] - } -}); - -/** - * Generate a report for browsers with report time - */ -test.generate({ - saveCollectedJSON: true, - jsonDir: './test/unit/data/json/', - reportPath: './.tmp/browsers-with-report-time/', - reportName: 'You can adjust this report name', - customMetadata: false, - displayDuration: true, - displayReportTime: true, - hideMetadata: true, - durationInMS: true, - customData: { - title: 'Run info', - data: [ - {label: 'Project', value: 'Custom project'}, - {label: 'Release', value: '1.2.3'}, - {label: 'Cycle', value: 'B11221.34321'}, - {label: 'Execution Start Time', value: 'Nov 19th 2017, 02:31 PM EST'}, - {label: 'Execution End Time', value: 'Nov 19th 2017, 02:56 PM EST'} - ] - } -}); - -/** - * Generate a report with custom metadata - * NOTE: must be last, if you use customMetadata you cannot reuse generator - */ -test.generate({ - saveCollectedJSON: true, - jsonDir: './test/unit/data/custom-metadata-json/', - reportPath: './.tmp/custom-metadata/', - customMetadata: true, - displayDuration: true, - metadata: [ - { "name": "Backend version", "value": "4.0 R11" }, - { "name": "Client API version", "value": "17.10" }, - { "name": "Test Configuration", "value": "Config A" }, - { "name": "platform", "value": "Ubuntu" }, - { "name": "platform version", "value": "16.04" } - ] -}); diff --git a/test/unit/collect-jsons.spec.js b/test/unit/collect-jsons.spec.js deleted file mode 100644 index 2f1fab73..00000000 --- a/test/unit/collect-jsons.spec.js +++ /dev/null @@ -1,88 +0,0 @@ -'use strict'; - -const jsonFile = require('jsonfile'); -const path = require('path'); -const collectJSONS = require('../../lib/collect-jsons'); -const reportPath = path.resolve(process.cwd(), './.tmp/test'); - -describe('collect-jsons.js', () => { - describe('Happy flows', () => { - it('should return an output from the merged found json files', () => { - expect(collectJSONS({ - jsonDir: './test/unit/data/json', - reportPath: reportPath - })).toEqual(jsonFile.readFileSync(path.resolve(process.cwd(), './test/unit/data/output/merged-output.json'))); - }); - - it('should return an output from the merged found json files and add the provided metadata', () => { - expect(collectJSONS({ - jsonDir: './test/unit/data/collect-json', - reportPath: reportPath, - metadata:{ - browser: { - name: 'chrome', - version: '1' - }, - device: 'Local test machine', - platform: { - name: 'Ubuntu', - version: '16.04' - } - } - })).toEqual(jsonFile.readFileSync(path.resolve(process.cwd(), './test/unit/data/output/provided-metadata.json'))); - }); - - it('should save an output from the merged found json files', () => { - expect(collectJSONS({ - jsonDir: './test/unit/data/json', - reportPath: reportPath, - saveCollectedJSON: true - })).toEqual(jsonFile.readFileSync(path.resolve(process.cwd(), './test/unit/data/output/merged-output.json'))); - }); - - it('should collect the creation date of json files', () => { - // Given - const options = { - jsonDir: './test/unit/data/json', - reportPath: reportPath, - displayReportTime: true - } - - // When - const collectedJSONs = collectJSONS(options) - - // Then - collectedJSONs.forEach(json => { - expect(json.metadata.reportTime).toBeDefined(); - expect(json.metadata.reportTime.length).toBe('YYYY/MM/DD HH:mm:ss'.length); - }) - }); - }); - - describe('failures', () => { - it('should throw an error when the json folder does not exist', () => { - expect(() => collectJSONS({ - jsonDir: './test/unit/data/bla', - reportPath: reportPath - })).toThrow(new Error(`There were issues reading JSON-files from './test/unit/data/bla'.`)); - }); - - it('should print a console message when no json files could be found', () => { - spyOn(console, 'log'); - collectJSONS({ - jsonDir: './test/unit/data/no-jsons', - reportPath: reportPath - }); - expect(console.log).toHaveBeenCalledWith('\x1b[33m%s\x1b[0m', `WARNING: No JSON files found in './test/unit/data/no-jsons'. NO REPORT CAN BE CREATED!`) - }); - - it('should return an empty array when no json files could be found', () => { - const results = collectJSONS({ - jsonDir: './test/unit/data/no-jsons', - reportPath: reportPath - }); - expect(Array.isArray(results)).toBeTruthy(); - expect(results.length).toBe(0); - }); - }); -}); diff --git a/test/unit/generate-json.spec.js b/test/unit/generate-json.spec.js deleted file mode 100644 index 9126ea32..00000000 --- a/test/unit/generate-json.spec.js +++ /dev/null @@ -1,115 +0,0 @@ -'use strict'; - -const fs = require('fs-extra'); -const path = require('path'); -const multiCucumberHTMLReporter = require('../../lib/generate-report'); -const REPORT_PATH = './.tmp/'; - -describe('generate-report.js', () => { - describe('Happy flows', () => { - it('should create a report from the merged found json files without provided custom data', () => { - fs.removeSync(REPORT_PATH); - multiCucumberHTMLReporter.generate({ - jsonDir: './test/unit/data/json', - reportPath: REPORT_PATH, - saveCollectedJSON: true, - displayDuration: true - }); - - expect(fs.statSync(`${path.join(process.cwd(), REPORT_PATH, 'index.html')}`).isFile()) - .toEqual(true, 'Index file exists'); - expect(function() { fs.statSync(`${path.join(process.cwd(), REPORT_PATH, 'features/happy-flow-v2.html')}`); }) - .toThrow(); - expect(fs.statSync(`${path.join(process.cwd(), REPORT_PATH, 'merged-output.json')}`).isFile()) - .toEqual(true, 'merged-output.json file exists'); - expect(fs.statSync(`${path.join(process.cwd(), REPORT_PATH, 'enriched-output.json')}`).isFile()) - .toEqual(true, 'temp-output.json file exists'); - }); - it('should create a report with the report time', () => { - fs.removeSync(REPORT_PATH); - multiCucumberHTMLReporter.generate({ - jsonDir: './test/unit/data/json', - reportPath: REPORT_PATH, - saveCollectedJSON: true, - displayDuration: true, - displayReportTime: true - }); - - expect(fs.statSync(`${path.join(process.cwd(), REPORT_PATH, 'index.html')}`).isFile()) - .toEqual(true, 'Index file exists'); - expect(fs.readFileSync(`${path.join(process.cwd(), REPORT_PATH, 'index.html')}`, 'utf8')).toContain('>Date'); - }); - it('should create a report from the merged found json files with custom data with static file paths', () => { - fs.removeSync(REPORT_PATH); - multiCucumberHTMLReporter.generate({ - jsonDir: './test/unit/data/json', - reportPath: REPORT_PATH, - staticFilePath: true, - saveCollectedJSON: true, - reportName: 'You can adjust this report name', - customData: { - title: 'Run info', - data: [ - {label: 'Project', value: 'Custom project'}, - {label: 'Release', value: '1.2.3'}, - {label: 'Cycle', value: 'B11221.34321'}, - {label: 'Execution Start Time', value: 'Nov 19th 2017, 02:31 PM EST'}, - {label: 'Execution End Time', value: 'Nov 19th 2017, 02:56 PM EST'} - ] - }, - displayDuration: true, - durationInMS: true - }); - - expect(fs.statSync(`${path.join(process.cwd(), REPORT_PATH, 'index.html')}`).isFile()) - .toEqual(true, 'Index file exists'); - expect(fs.statSync(`${path.join(process.cwd(), REPORT_PATH, 'features/happy-flow-v2.html')}`).isFile()) - .toEqual(true, 'uuid free feature exists'); - expect(fs.statSync(`${path.join(process.cwd(), REPORT_PATH, 'merged-output.json')}`).isFile()) - .toEqual(true, 'merged-output.json file exists'); - expect(fs.statSync(`${path.join(process.cwd(), REPORT_PATH, 'enriched-output.json')}`).isFile()) - .toEqual(true, 'temp-output.json file exists'); - }); - it('should create a report from the merged found json files with custom metadata', () => { - fs.removeSync(REPORT_PATH); - multiCucumberHTMLReporter.generate({ - jsonDir: './test/unit/data/custom-metadata-json/', - reportPath: REPORT_PATH, - customMetadata: true - }); - - expect(fs.statSync(`${path.join(process.cwd(), REPORT_PATH, 'index.html')}`).isFile()) - .toEqual(true, 'Index file exists'); - }); - - it('should create a report from the merged found json files and with array of embedded items', () => { - fs.removeSync(REPORT_PATH); - multiCucumberHTMLReporter.generate({ - jsonDir: './test/unit/data/embedded-array-json/', - reportName: 'Embedded array of various mimeType', - reportPath: REPORT_PATH, - customStyle: path.join(__dirname, '../my.css'), - customMetadata: false - }); - - expect(fs.statSync(`${path.join(process.cwd(), REPORT_PATH, 'index.html')}`).isFile()) - .toEqual(true, 'Index file exists'); - }); - }); - - describe('failures', () => { - it('should throw an error when no options are provided', () => { - expect(() => multiCucumberHTMLReporter.generate()).toThrowError('Options need to be provided.'); - }); - - it('should throw an error when the json folder does not exist', () => { - expect(() => multiCucumberHTMLReporter.generate({})).toThrowError(`A path which holds the JSON files should be provided.`); - }); - - it('should throw an error when the report folder is not provided', () => { - expect(() => multiCucumberHTMLReporter.generate({ - jsonDir: './test/unit/data/json' - })).toThrowError(`An output path for the reports should be defined, no path was provided.`); - }); - }); -}); diff --git a/test/unit/jasmine.json b/test/unit/jasmine.json deleted file mode 100644 index cb3fa35c..00000000 --- a/test/unit/jasmine.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "spec_dir": "test/", - "spec_files": [ - "unit/*.spec.js" - ], - "stopSpecOnExpectationFailure": false, - "random": false -} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..979ecf12 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "module": "ESNext", + "moduleResolution": "Node", + "target": "ESNext", + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true, + "sourceMap": true, + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*.ts"], + "exclude": ["examples", "node_modules"] +}