diff --git a/.gitea/workflows/development-test.yaml b/.gitea/workflows/development-test.yaml index c5c5021..088e569 100644 --- a/.gitea/workflows/development-test.yaml +++ b/.gitea/workflows/development-test.yaml @@ -16,10 +16,9 @@ jobs: node-version: 18 - name: Write .npmrc file - run: echo "$NPMRC" > client/.npmrc - shell: bash - env: - NPMRC: ${{ secrets.NPMRC}} + run: | + touch client/.npmrc + echo '${{ secrets.NPMRC}}' > client/.npmrc - run: apt-get update - run: wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb @@ -28,17 +27,13 @@ jobs: - run: apt-get update -y - run: apt-get -y install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb - run: apt -y install jq - # - run: 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - # - run: eval $(ssh-agent -s) - # - run: echo "$ssh_key" | tr -d '\r' | ssh-add - + - name: Write cypress credentials run: echo "$CYPRESS_CREDS" > ./client/cypress.env.json shell: bash env: CYPRESS_CREDS: ${{ secrets.CYPRESS_CREDS }} - # - run: mkdir -p ~/.ssh - # - run: chmod 700 ~/.ssh - run: npm ci # Install pm2 and prepare SASJS server - run: npm i -g pm2 @@ -49,12 +44,7 @@ jobs: - run: echo NODE_PATH=node >> .env - run: echo CORS=enable >> .env - run: echo WHITELIST=http://localhost:4200 >> .env - # - run: echo "SERVER_URL=$server_url" >> .env - # - run: echo "SERVER_TYPE=$server_type" >> .env - # - run: echo "CLIENT=$client_sasjs" >> .env - # - run: echo "ACCESS_TOKEN=$access_token_sasjs" >> .env - # - run: echo "REFRESH_TOKEN=$refresh_token_sasjs" >> .env - # - run: cat .env + - run: cat .env - run: pm2 start api-linux --wait-ready - name: Deploy mocked services @@ -65,28 +55,27 @@ jobs: sasjs cbd -t server-ci # sasjs request services/admin/makedata -t server-ci -d ./deploy/makeData4GL.json -c ./deploy/requestConfig.json -o ./output.json - - name: Prepare frontend + - name: Install ZIP + run: | + apt-get update + apt-get install zip + + - name: Prepare and run frontend and cypress run: | cd ./client - # mv ./cypress.env.example.json ./cypress.env.json - # replace-in-files --regex='"username".*' --replacement='"username":"'$cypress_username_sasjs'",' ./cypress.env.json - # replace-in-files --regex='"password".*' --replacement='"password":"'$cypress_pwd_sasjs'" ' ./cypress.env.json + mv ./cypress.env.example.json ./cypress.env.json + replace-in-files --regex='"username".*' --replacement='"username":"'${{ secrets.CYPRESS_USERNAME_SASJS }}'",' ./cypress.env.json + replace-in-files --regex='"password".*' --replacement='"password":"'${{ secrets.CYPRESS_PWD_SASJS }}'" ' ./cypress.env.json cat ./cypress.env.json npm run postinstall # Prepare index.html to SASJS local replace-in-files --regex='serverUrl=".*?"' --replacement='serverUrl="http://localhost:5000"' ./src/index.html replace-in-files --regex='appLoc=".*?"' --replacement='appLoc="/Public/app/devtest"' ./src/index.html replace-in-files --regex='serverType=".*?"' --replacement='serverType="SASJS"' ./src/index.html - # Prepare and deploy SASJS version - # replace-in-files --regex='serverurl=".*?"' --replacement='serverUrl="http://localhost:5000"' ./dist/index.html - # replace-in-files --regex='apploc=".*?"' --replacement='appLoc="/30.SASApps/app/devtest"' ./dist/index.html - # replace-in-files --regex='servertype=".*?"' --replacement='serverType="SASJS"' ./dist/index.html - # scp -o stricthostkeychecking=no -r ./dist/* dcgitlab@sas.4gl.io:/var/www/html/dcviya/development/newadapter replace-in-files --regex='"hosturl".*' --replacement='hosturl:"http://localhost:4200",' ./cypress.config.ts - # replace-in-files --regex='"appLocation".*' --replacement='appLocation:"/dcviya/development/newadapter",' ./cypress.config.ts cat ./cypress.config.ts # Start frontend and run cypress - npm start & npx wait-on http://localhost:4200 && ./run-cypress-tests.sh + npm start & npx wait-on http://localhost:4200 && npx cypress run --browser chrome --spec "cypress/e2e/liveness.cy.ts,cypress/e2e/editor.cy.ts,cypress/e2e/excel.cy.ts,cypress/e2e/filtering.cy.ts,cypress/e2e/licensing.cy.ts" Build-and-test-development-latest-adapter: runs-on: ubuntu-latest @@ -110,17 +99,13 @@ jobs: - run: apt-get update -y - run: apt-get -y install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb - run: apt -y install jq - # - run: 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - # - run: eval $(ssh-agent -s) - # - run: echo "$ssh_key" | tr -d '\r' | ssh-add - + - name: Write cypress credentials run: echo "$CYPRESS_CREDS" > ./client/cypress.env.json shell: bash env: CYPRESS_CREDS: ${{ secrets.CYPRESS_CREDS }} - # - run: mkdir -p ~/.ssh - # - run: chmod 700 ~/.ssh - run: npm ci # Install pm2 and prepare SASJS server - run: npm i -g pm2 @@ -131,12 +116,7 @@ jobs: - run: echo NODE_PATH=node >> .env - run: echo CORS=enable >> .env - run: echo WHITELIST=http://localhost:4200 >> .env - # - run: echo "SERVER_URL=$server_url" >> .env - # - run: echo "SERVER_TYPE=$server_type" >> .env - # - run: echo "CLIENT=$client_sasjs" >> .env - # - run: echo "ACCESS_TOKEN=$access_token_sasjs" >> .env - # - run: echo "REFRESH_TOKEN=$refresh_token_sasjs" >> .env - # - run: cat .env + - run: cat .env - run: pm2 start api-linux --wait-ready - name: Deploy mocked services @@ -147,12 +127,17 @@ jobs: sasjs cbd -t server-ci # sasjs request services/admin/makedata -t server-ci -d ./deploy/makeData4GL.json -c ./deploy/requestConfig.json -o ./output.json - - name: Prepare frontend + - name: Install ZIP + run: | + apt-get update + apt-get install zip + + - name: Prepare and run frontend and cypress run: | cd ./client - # mv ./cypress.env.example.json ./cypress.env.json - # replace-in-files --regex='"username".*' --replacement='"username":"'$cypress_username_sasjs'",' ./cypress.env.json - # replace-in-files --regex='"password".*' --replacement='"password":"'$cypress_pwd_sasjs'" ' ./cypress.env.json + mv ./cypress.env.example.json ./cypress.env.json + replace-in-files --regex='"username".*' --replacement='"username":"'${{ secrets.CYPRESS_USERNAME_SASJS }}'",' ./cypress.env.json + replace-in-files --regex='"password".*' --replacement='"password":"'${{ secrets.CYPRESS_PWD_SASJS }}'" ' ./cypress.env.json cat ./cypress.env.json npm run postinstall npm install @sasjs/adapter@latest @@ -160,13 +145,7 @@ jobs: replace-in-files --regex='serverUrl=".*?"' --replacement='serverUrl="http://localhost:5000"' ./src/index.html replace-in-files --regex='appLoc=".*?"' --replacement='appLoc="/Public/app/devtest"' ./src/index.html replace-in-files --regex='serverType=".*?"' --replacement='serverType="SASJS"' ./src/index.html - # Prepare and deploy SASJS version - # replace-in-files --regex='serverurl=".*?"' --replacement='serverUrl="http://localhost:5000"' ./dist/index.html - # replace-in-files --regex='apploc=".*?"' --replacement='appLoc="/30.SASApps/app/devtest"' ./dist/index.html - # replace-in-files --regex='servertype=".*?"' --replacement='serverType="SASJS"' ./dist/index.html - # scp -o stricthostkeychecking=no -r ./dist/* dcgitlab@sas.4gl.io:/var/www/html/dcviya/development/newadapter replace-in-files --regex='"hosturl".*' --replacement='hosturl:"http://localhost:4200",' ./cypress.config.ts - # replace-in-files --regex='"appLocation".*' --replacement='appLocation:"/dcviya/development/newadapter",' ./cypress.config.ts cat ./cypress.config.ts # Start frontend and run cypress - npm start & npx wait-on http://localhost:4200 && ./run-cypress-tests.sh \ No newline at end of file + npm start & npx wait-on http://localhost:4200 && npx cypress run --browser chrome --spec "cypress/e2e/liveness.cy.ts,cypress/e2e/editor.cy.ts,cypress/e2e/excel.cy.ts,cypress/e2e/filtering.cy.ts,cypress/e2e/licensing.cy.ts" \ No newline at end of file diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml index 23bc211..0811d6d 100644 --- a/.gitea/workflows/release.yaml +++ b/.gitea/workflows/release.yaml @@ -22,29 +22,89 @@ jobs: env: NPMRC: ${{ secrets.NPMRC}} - - name: Install ZIP + - name: Install ZIP and SASjs CLI run: | apt-get update apt-get install zip + npm i -g @sasjs/cli + # test - - name: release-build + - name: Install JQ for parsing JSON run: | - cd client - npm ci - npm run build - zip -r dist.zip ./dist + apt-get update + apt-get install jq - - name: Install Semantic Release and plugins + - name: Install Semantic Release and plugins and create Release run: | npm i npm i -g semantic-release - - - name: Release - run: | GITEA_TOKEN=${{ secrets.RELEASE_TOKEN }} GITEA_URL=https://git.datacontroller.io semantic-release + - name: Build SAS9 EBI Release + description: compile SAS 9 services, remove tests & create deployment program + run: | + cd sas + npm ci + sasjs c -t sas9 + rm -rf sasjsbuild/tests + sasjs b -t sas9 + cp sasjsbuild/mysas9deploy.sas ./demostream_sas9.sas + # + # remove streamed component and rebuild SAS 9 services + # + rm -rf sasjsbuild/services/web9 + rm sasjsbuild/services/clickme.sas + sasjs b -t sas9 + cp sasjsbuild/mysas9deploy.sas ./sas9.sas + + - name: Build SASjs Server Release + description: compile Base (SASjs) services, remove tests & create deployment JSON + run: | + cd sas + cp sasjs/utils/favicon.ico ../client/dist/favicon.ico + sasjs c -t server + rm -rf sasjsbuild/tests + sasjs b -t server + cp sasjsbuild/server.json.zip ./sasjs_server.json.zip + + - name: Build Viya Release + description: compile Viya Streaming Deploy (without tests) + run: | + cd sas + sasjs c -t viya + rm -rf sasjsbuild/tests + sed -i -e 's/servertype="SASJS"/servertype="SASVIYA"/g' sasjsbuild/services/clickme.html + sasjs b -t viya + cp sasjsbuild/viya.sas ./demostream_viya.sas + # compile Viya Full deploy (without web) + rm -rf sasjsbuild/services/web + rm sasjsbuild/services/clickme.html + sasjs b -t viya + cp sasjsbuild/viya.sas ./viya.sas + + - name: Frontend Build + run: | + cd client + npm ci + # Disabled to speed up dev process + # npm run build + # zip -r dist.zip ./dist + touch dist.zip + + - name: Zip Frontend (including viya.json for full viya deploy) + run: | + cd sas + cp sasjsbuild/viya.json ../client/dist + cd .. + zip -r frontend.zip ./client/dist + - name: Release Typedoc run: | cd client npm run typedoc - # deploy docs \ No newline at end of file + # deploy docs + + - name: Upload artifacts to release + run: | + RELEASE_ID=`curl -k 'https://git.datacontroller.io/api/v1/repos/mihajlo/dc_throwaway/releases/latest?access_token=${{ secrets.RELEASE_TOKEN }}' | jq -r '.id'` + curl -k https://git.datacontroller.io/api/v1/repos/mihajlo/dc_throwaway/releases/$RELEASE_ID/assets?access_token=${{ secrets.RELEASE_TOKEN }} -F attachment=@frontend.zip diff --git a/.releaserc b/.releaserc index 53177bd..9ad23a0 100644 --- a/.releaserc +++ b/.releaserc @@ -1,22 +1,44 @@ { - "branches": ["main"], + "branches": [ + "main" + ], "plugins": [ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", "@semantic-release/changelog", [ - "@semantic-release/git", - { - "assets": [ - "CHANGELOG.md" - ] - } + "@semantic-release/git", + { + "assets": [ + "CHANGELOG.md" + ] + } ], - ["@saithodev/semantic-release-gitea", { - "giteaUrl": "https://git.datacontroller.io", - "assets": [ - {"path": "client/dist.zip"} - ] - }] + [ + "@saithodev/semantic-release-gitea", + { + "giteaUrl": "https://git.datacontroller.io", + "assets": [ + { + "path": "sas/demostream_sas9.sas" + }, + { + "path": "sas/demostream_viya.sas" + }, + { + "path": "sas/frontend.zip" + }, + { + "path": "sas/sasjs_server.json.zip" + }, + { + "path": "sas/sas9.sas" + }, + { + "path": "sas/viya.sas" + } + ] + } + ] ] } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index c49fad8..e1e8ab7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,3 @@ -# Changelog - -All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines. - ## [6.0.0](https://gitlab.com/macropeople/datacontroller/compare/v5.3.0...v6.0.0) (2023-06-27) diff --git a/client/cypress.config.ts b/client/cypress.config.ts index 0d639a2..0c77359 100644 --- a/client/cypress.config.ts +++ b/client/cypress.config.ts @@ -1,17 +1,20 @@ -import { defineConfig } from 'cypress' +import { defineConfig } from "cypress"; export default defineConfig({ - reporter: 'mochawesome', + reporter: "mochawesome", + reporterOptions: { - reportDir: 'cypress/results', + reportDir: "cypress/results", overwrite: false, html: true, json: false, }, + chromeWebSecurity: false, defaultCommandTimeout: 30000, + env: { - hosturl:"http://localhost:4200", + hosturl: "http://localhost:4200", appLocation: "", site_id_SAS9: "70221618", site_id_SASVIYA: "70253615", @@ -23,6 +26,12 @@ export default defineConfig({ debug: false, screenshotOnRunFailure: false, longerCommandTimeout: 50000, - testLicenceUserLimits: false - } -}) + testLicenceUserLimits: false, + }, + + e2e: { + setupNodeEvents(on, config) { + // implement node event listeners here + }, + }, +}); diff --git a/client/cypress/e2e/download.cy.ts b/client/cypress/e2e/download.cy.ts new file mode 100644 index 0000000..ea5283c --- /dev/null +++ b/client/cypress/e2e/download.cy.ts @@ -0,0 +1,250 @@ +const username = Cypress.env('username') +const password = Cypress.env('password') +const hostUrl = Cypress.env('hosturl') +const appLocation = Cypress.env('appLocation') +const longerCommandTimeout = Cypress.env('longerCommandTimeout') +const serverType = Cypress.env('serverType') +const libraryToOpenIncludes = Cypress.env(`libraryToOpenIncludes_${serverType}`) +const downloadsFolder = Cypress.config('downloadsFolder') + +import { deleteDownloadsFolder } from '../util/deleteDownloadFolder' + +context('download files test: ', function () { + this.beforeAll(() => { + cy.visit(`${hostUrl}/SASLogon/logout`) + cy.loginAndUpdateValidKey() + }) + + this.beforeEach(() => { + cy.visit(hostUrl + appLocation) + cy.get('input.username').type(username) + cy.get('input.password').type(password) + cy.get('.login-group button').click() + + visitPage('home') + }) + + this.afterEach(() => { + deleteDownloadsFolder() + }) + + it('1 | downloads audit file', (done) => { + visitPage('approve/toapprove') + + cy.get('.app-loading', { timeout: longerCommandTimeout }) + .should('not.exist') + .then(() => { + cy.get('.btn.btn-success') + .should('be.visible') + .then((buttons) => { + buttons[0].click() + const id = buttons[0].id + + checkForFileDownloaded(id, 'zip', () => done()) + }) + }) + }) + + it('2 | downloads viewer csv', (done) => { + visitPage('view/data') + + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openDownloadModal(() => { + cy.get('select') + .select('CSV') + .then(() => { + cy.get('.btn.btn-sm.btn-success-outline').then((button) => { + button.trigger('click') + + const id = button[0].id + + checkForFileDownloaded(id, 'csv', () => done()) + }) + }) + }) + }) + + it('3 | downloads viewer excel', (done) => { + visitPage('view/data') + + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openDownloadModal(() => { + cy.get('select') + .select('Excel') + .then(() => { + cy.get('.btn.btn-sm.btn-success-outline').then((button) => { + button.trigger('click') + + const id = button[0].id + + checkForFileDownloaded(id, 'xlsx', () => done()) + }) + }) + }) + }) + + it('4 | downloads viewer SAS Datalines', (done) => { + visitPage('view/data') + + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openDownloadModal(() => { + cy.get('select') + .select('SAS Datalines') + .then(() => { + cy.get('.btn.btn-sm.btn-success-outline').then((button) => { + button.trigger('click') + + const id = button[0].id + + checkForFileDownloaded(id, 'sas', () => done()) + }) + }) + }) + }) + + it('5 | downloads viewer SAS DDL', (done) => { + visitPage('view/data') + + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openDownloadModal(() => { + cy.get('select') + .select('SAS DDL') + .then(() => { + cy.get('.btn.btn-sm.btn-success-outline').then((button) => { + button.trigger('click') + + const id = button[0].id + + checkForFileDownloaded(id, 'ddl', () => done(), '_') + }) + }) + }) + }) + + it('6 | downloads viewer TSQL DDL', (done) => { + visitPage('view/data') + + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openDownloadModal(() => { + cy.get('select') + .select('TSQL DDL') + .then(() => { + cy.get('.btn.btn-sm.btn-success-outline').then((button) => { + button.trigger('click') + + const id = button[0].id + + checkForFileDownloaded(id, 'ddl', () => done(), '_') + }) + }) + }) + }) + + it('7 | downloads viewer PGSQL DDL', (done) => { + visitPage('view/data') + + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openDownloadModal(() => { + cy.get('select') + .select('PGSQL DDL') + .then(() => { + cy.get('.btn.btn-sm.btn-success-outline').then((button) => { + button.trigger('click') + + const id = button[0].id + + checkForFileDownloaded(id, 'ddl', () => done(), '_') + }) + }) + }) + }) + + this.afterEach(() => { + cy.visit(`${hostUrl}/SASLogon/logout`) + }) +}) + +const visitPage = (url: string) => { + cy.visit(`${hostUrl}${appLocation}/#/${url}`) +} + +const checkForFileDownloaded = ( + id: string, + extension: string, + callback?: any, + libDivider: string = '.' +) => { + cy.on('url:changed', (newUrl) => { + console.log('newUrl', newUrl) + }) + + id = id.replace('.', libDivider) + + const filename = downloadsFolder + '/' + id + '.' + extension + // browser might take a while to download the file, + // so use "cy.readFile" to retry until the file exists + // and has length - and we assume that it has finished downloading then + cy.readFile(filename, { timeout: longerCommandTimeout }) + .should('have.length.gt', 10) + .then((file) => { + if (callback) callback() + }) +} + +const openDownloadModal = (callback?: any) => { + cy.get('.btn.btn-sm.btn-outline.filterSide.dropdown-toggle') + .click() + .then(() => { + cy.get('clr-dropdown-menu button').then((buttons) => { + for (let button of buttons) { + if (button.innerText.toLowerCase().includes('download')) { + button.click() + + if (callback) callback() + } + } + }) + }) +} + +const openTableFromTree = (libNameIncludes: string, tablename: string) => { + cy.get('.app-loading', { timeout: longerCommandTimeout }) + .should('not.exist') + .then(() => { + cy.get('.nav-tree clr-tree > clr-tree-node', { + timeout: longerCommandTimeout + }).then((treeNodes: any) => { + let viyaLib + + for (let node of treeNodes) { + if (node.innerText.toLowerCase().includes(libNameIncludes)) { + viyaLib = node + break + } + } + + console.log('viyaLib', viyaLib) + + cy.get(viyaLib).within(() => { + cy.get( + '.clr-tree-node-content-container .clr-treenode-content p' + ).click() + + cy.get('.clr-treenode-link').then((innerNodes: any) => { + for (let innerNode of innerNodes) { + if (innerNode.innerText.toLowerCase().includes(tablename)) { + innerNode.click() + break + } + } + }) + }) + }) + }) +} diff --git a/client/cypress/e2e/editor.cy.ts b/client/cypress/e2e/editor.cy.ts new file mode 100644 index 0000000..9284987 --- /dev/null +++ b/client/cypress/e2e/editor.cy.ts @@ -0,0 +1,257 @@ +const username = Cypress.env('username') +const password = Cypress.env('password') +const hostUrl = Cypress.env('hosturl') +const appLocation = Cypress.env('appLocation') +const longerCommandTimeout = Cypress.env('longerCommandTimeout') +const serverType = Cypress.env('serverType') +const libraryToOpenIncludes = Cypress.env(`libraryToOpenIncludes_${serverType}`) +const fixturePath = 'excels_general/' + +context('editor tests: ', function () { + this.beforeAll(() => { + cy.visit(`${hostUrl}/SASLogon/logout`) + cy.loginAndUpdateValidKey() + }) + + this.beforeEach(() => { + cy.visit(hostUrl + appLocation) + // cy.get('input.username').type(username) + // cy.get('input.password').type(password) + // cy.get('.login-group button').click() + + visitPage('home') + }) + + it('1 | Submits duplicate primary keys', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_datadictionary') + + attachExcelFile('MPE_DATADICTIONARY_duplicate_keys.xlsx', () => { + clickOnUploadPreview(() => { + confirmEditPreviewFile(() => { + submitTable(() => { + cy.get('.modal-body').then((modalBody: any) => { + if (modalBody[0].innerText.includes(`Duplicates found:`)) { + done() + } + }) + }) + }) + }) + }) + }) + + it('2 | Submits null cells which must not be null', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + clickOnEdit(() => { + cy.get('.btn.btn-sm.btn-icon.btn-outline-danger', { + timeout: longerCommandTimeout + }).then(() => { + cy.get('.ht_master tbody tr').then((rows: any) => { + cy.get(rows[1].childNodes[2]) + .dblclick({ force: true }) + .then(() => { + cy.focused() + .clear() + .type('{enter}') + .then(() => { + submitTable(() => { + cy.get('.modal-body').then((modalBody: any) => { + if ( + modalBody[0].innerHTML + .toLowerCase() + .includes(`invalid values are present`) + ) { + done() + } + }) + }) + }) + }) + }) + }) + }) + }) + + it('3 | Gets basic dynamic cell validation', () => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + clickOnEdit(() => { + cy.get('.btn.btn-sm.btn-icon.btn-outline-danger', { + timeout: longerCommandTimeout + }).then(() => { + cy.get('.ht_master tbody tr').then((rows: any) => { + cy.get(rows[1].childNodes[5]) + .click({ force: true }) + .then(($td) => { + cy.get('.htAutocompleteArrow', { withinSubject: $td }).should( + 'exist' + ) + }) + }) + }) + }) + }) + + it('4 | Gets advanced dynamic cell validation', () => { + openTableFromTree(libraryToOpenIncludes, 'mpe_tables') + + clickOnEdit(() => { + cy.get('.btn.btn-sm.btn-icon.btn-outline-danger', { + timeout: longerCommandTimeout + }).then(() => { + cy.get('.ht_master tbody tr').then((rows: any) => { + cy.get(rows[1].childNodes[3]) + .click({ force: true }) + .then(($td) => { + cy.get('.htAutocompleteArrow', { withinSubject: $td }).should( + 'exist' + ) + cy.get('.htAutocompleteArrow', { + withinSubject: rows[1].childNodes[7] + }).should('exist') + cy.get('.htAutocompleteArrow', { + withinSubject: rows[1].childNodes[8] + }).should('exist') + }) + }) + }) + }) + }) + + this.afterEach(() => { + // cy.visit(`${hostUrl}/SASLogon/logout`) + }) +}) + +const clickOnEdit = (callback?: any) => { + cy.get('.btnCtrl button.btn-primary', { timeout: longerCommandTimeout }) + .click() + .then(() => { + if (callback) callback() + }) +} + +const openTableFromTree = (libNameIncludes: string, tablename: string) => { + cy.get('.app-loading', { timeout: longerCommandTimeout }) + .should('not.exist') + .then(() => { + cy.get('.nav-tree clr-tree > clr-tree-node', { + timeout: longerCommandTimeout + }).then((treeNodes: any) => { + let viyaLib + + for (let node of treeNodes) { + if (node.innerText.toLowerCase().includes(libNameIncludes)) { + viyaLib = node + break + } + } + + cy.get(viyaLib).within(() => { + cy.get('.clr-tree-node-content-container > button').click() + + cy.get('.clr-treenode-link').then((innerNodes: any) => { + for (let innerNode of innerNodes) { + if (innerNode.innerText.toLowerCase().includes(tablename)) { + innerNode.click() + break + } + } + }) + }) + }) + }) +} + +const attachExcelFile = (excelFilename: string, callback?: any) => { + cy.get('.buttonBar button:last-child') + .click() + .then(() => { + cy.get('input[type="file"]#file-upload') + .attachFile(`/${fixturePath}/${excelFilename}`) + .then(() => { + cy.get('.modal-footer .btn.btn-primary').then((modalBtn) => { + modalBtn.click() + if (callback) callback() + }) + }) + }) +} + +const clickOnUploadPreview = (callback?: any) => { + cy.get('.buttonBar button.btn-primary.btn-upload-preview') + .click() + .then(() => { + if (callback) callback() + }) +} + +const confirmEditPreviewFile = (callback?: any) => { + cy.get('.modal-footer button.btn-success-outline') + .click() + .then(() => { + if (callback) callback() + }) +} + +const submitTable = (callback?: any) => { + cy.get('.btnCtrl button.btn-primary') + .click() + .then(() => { + if (callback) callback() + }) +} + +const submitTableMessage = (callback?: any) => { + cy.get('.modal-footer .btn.btn-sm.btn-success-outline') + .click() + .then(() => { + if (callback) callback() + }) +} + +const submitExcel = (callback?: any) => { + cy.get('.buttonBar button.preview-submit') + .click() + .then(() => { + if (callback) callback() + }) +} + +const rejectExcel = (callback?: any) => { + cy.get('button', { timeout: longerCommandTimeout }) + .should('contain', 'Go to approvals screen') + .then((allButtons: any) => { + for (let approvalButton of allButtons) { + if ( + approvalButton.innerText + .toLowerCase() + .includes('go to approvals screen') + ) { + approvalButton.click() + break + } + } + + cy.get('button.btn-danger') + .should('exist') + .should('not.be.disabled') + .click() + .then(() => { + cy.get('.modal-footer button.btn-success-outline') + .click() + .then(() => { + cy.get('app-history') + .should('exist') + .then(() => { + if (callback) callback() + }) + }) + }) + }) +} + +const visitPage = (url: string) => { + cy.visit(`${hostUrl}${appLocation}/#/${url}`) +} diff --git a/client/cypress/e2e/excel.cy.ts b/client/cypress/e2e/excel.cy.ts new file mode 100644 index 0000000..60553da --- /dev/null +++ b/client/cypress/e2e/excel.cy.ts @@ -0,0 +1,537 @@ +import { Callbacks } from 'cypress/types/jquery/index' + +const username = Cypress.env('username') +const password = Cypress.env('password') +const hostUrl = Cypress.env('hosturl') +const appLocation = Cypress.env('appLocation') +const longerCommandTimeout = Cypress.env('longerCommandTimeout') +const serverType = Cypress.env('serverType') +const libraryToOpenIncludes = Cypress.env(`libraryToOpenIncludes_${serverType}`) +const fixturePath = 'excels/' + +context('excel tests: ', function () { + this.beforeAll(() => { + cy.visit(`${hostUrl}/SASLogon/logout`) + cy.loginAndUpdateValidKey(true) + }) + + this.beforeEach(() => { + cy.visit(hostUrl + appLocation) + // cy.get('input.username').type(username) + // cy.get('input.password').type(password) + // cy.get('.login-group button').click() + + visitPage('home') + + colorLog( + `TEST START ---> ${ + Cypress.mocha.getRunner().suite.ctx.currentTest.title + }`, + '#3498DB' + ) + }) + + it('1 | Uploads regular Excel file', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('regular_excel.xlsx', () => { + submitExcel() + rejectExcel(done) + }) + }) + + it('2 | Uploads Excel with data on the 7th tab', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('7th_tab_excel.xlsx', () => { + submitExcel() + rejectExcel(done) + }) + }) + + it('3 | Uploads Excel with missing columns (should fail)', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('missing_columns_excel.xlsx', () => { + cy.get('.abortMsg', { timeout: longerCommandTimeout }) + .should('exist') + .then((elements: any) => { + if (elements[0]) { + if (elements[0].innerText.toLowerCase().includes('missing')) done() + } + }) + }) + }) + + it('4 | Uploads Excel with formulas', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_datadictionary') + + attachExcelFile('formulas_excel.xlsx', () => { + checkResultOfFormulaUpload(done) + }) + }) + + it('5 | Uploads Excel with no data rows', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('nodata_rows_excel.xlsx', () => { + cy.get('.abortMsg', { timeout: longerCommandTimeout }) + .should('exist') + .then((elements: any) => { + if (elements[0]) { + if ( + elements[0].innerText + .toLowerCase() + .includes('no relevant data found') + ) + done() + } + }) + }) + }) + + it('6 | Uploads Excel with a table that is surrounded by other data', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('surrounded_data_excel.xlsx', () => { + submitExcel() + rejectExcel(done) + }) + }) + + it('7 | Uploads Excel with a extra columns in the middle', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('extra_column_excel.xlsx', () => { + submitExcel() + rejectExcel(done) + }) + }) + + it('8 | Uploads Excel with a duplicate column', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('duplicate_column_excel.xlsx', () => { + cy.get('.abortMsg', { timeout: longerCommandTimeout }) + .should('exist') + .then((elements: any) => { + if (elements[0]) { + if (elements[0].innerText.toLowerCase().includes('missing')) done() + } + }) + }) + }) + + it('9 | Uploads Excel with a duplicate row', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('duplicate_row_excel.xlsx', () => { + submitExcel(() => { + cy.get('.duplicate-keys-modal', { timeout: longerCommandTimeout }) + .should('exist') + .then((elements: any) => { + if (elements[0]) { + if (elements[0].innerText.toLowerCase().includes('duplicates')) + done() + } + }) + }) + }) + }) + + it('10 | Uploads Excel with a mixed content', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('mixed_content_excel.xlsx', () => { + submitExcel(() => { + cy.get('.modal-body').then((modalBody: any) => { + if ( + modalBody[0].innerHTML + .toLowerCase() + .includes(`invalid values are present`) + ) { + done() + } + }) + }) + }) + }) + + it('11 | Uploads Excel with a blank columns', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('blank_columns_excel.xlsx', () => { + cy.get('.abortMsg', { timeout: longerCommandTimeout }) + .should('exist') + .then((elements: any) => { + if (elements[0]) { + if (elements[0].innerText.toLowerCase().includes('missing')) done() + } + }) + }) + }) + + it('12 | Uploads Excel xls extension', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('regular_excel_xls.xls', () => { + submitExcel() + rejectExcel(done) + }) + }) + + // For some strange reason this file breaks cypress. When uploaded manually in DC it is working. + // it('13 | Uploads Excel xlsm extension', (done) => { + // openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + // attachExcelFile('regular_excel_macro.xlsm', () => { + // submitExcel() + // rejectExcel(done) + // }) + // }) + + it('14 | Uploads Excel with composite primary key', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_datadictionary') + + attachExcelFile('MPE_DATADICTIONARY_composite_keys.xlsx', () => { + submitExcel() + rejectExcel(done) + }) + }) + + it('15 | Uploads Excel with missing row (empty table)', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_datadictionary') + + attachExcelFile('MPE_DATADICTIONARY_missing_row.xlsx', () => { + cy.get('.abortMsg', { timeout: longerCommandTimeout }) + .should('exist') + .then((elements: any) => { + if (elements[0]) { + if ( + elements[0].innerText + .toLowerCase() + .includes('no relevant data found') + ) + done() + } + }) + }) + }) + + it('16 | Uploads Excel with merged cells', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_datadictionary') + + attachExcelFile('MPE_DATADICTIONARY_merged_cells.xlsx', () => { + submitExcel() + rejectExcel(done) + }) + }) + + it('17 | Check uploaded values from excel with xls extension', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('regular_excel_xls.xls', () => { + checkResultOfXLSUpload(done) + }) + }) + + it('18 | Uploads Excel with missing row (empty table)', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('blank_column_with_header.xlsx', () => { + cy.get('.btn-upload-preview', { timeout: 60000 }) + .should('be.visible') + .then(() => { + cy.get('#hotInstance', { timeout: 30000 }) + .find('div.ht_master.handsontable') + .find('div.wtHolder') + .find('div.wtHider') + .find('div.wtSpreader') + .find('table.htCore') + .find('tbody') + .then((data) => { + let allEmpty = true + + for (let col = 0; col < data[0].children.length; col++) { + const cell: any = data[0].children[col].children[5] + + if (cell.innerText !== '') { + allEmpty = false + + break + } + } + + if (allEmpty) done() + }) + }) + }) + }) + + it('19 | Uploads Excel with data on random sheet surrounded with all empty cells', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('surrounded_data_all_cells_empty_excel.xlsx', () => { + checkResultOfXLSUpload(done) + }) + }) + + it('20 | Uploads Excel with data surrounded with empty cells ', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('surrounded_data_empty_cells_excel.xlsx', () => { + checkResultOfXLSUpload(done) + }) + }) + + it('21 | Uploads regular Excel file with first row marked for Delete (yes)', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + attachExcelFile('regular_excel_with_delete.xlsx', () => { + cy.get('.btn-upload-preview', { timeout: 60000 }) + .should('be.visible') + .then(() => { + cy.get('#hotInstance', { timeout: 30000 }) + .find('div.ht_master.handsontable') + .find('div.wtHolder') + .find('div.wtHider') + .find('div.wtSpreader') + .find('table.htCore') + .find('tbody') + .then((data: JQuery) => { + const firstRowFirstCol: Partial = + data[0].children[0].children[1] + + if ( + firstRowFirstCol.innerText && + !firstRowFirstCol.innerText.toLowerCase().includes('yes') + ) { + done('Delete? column from file not applied') + } + }) + .then(() => { + submitExcel() + rejectExcel(done) + }) + }) + }) + }) + + // Large files break Cypress + + // it ('? | Uploads Excel with size of 5MB', (done) => { + // attachExcelFile('5mb_excel.xlsx', () => { + // submitExcel(); + // rejectExcel(done); + // }); + // }) + + // it ('? | Uploads Excel with size of 15MB', (done) => { + // attachExcelFile('15mb_excel.xlsx', () => { + // submitExcel(); + // rejectExcel(done); + // }); + // }) + + //Large files tests end + + this.afterEach(() => { + colorLog(`TEST END -------------`, '#3498DB') + // cy.visit(`${hostUrl}/SASLogon/logout`) + }) +}) + +const openTableFromTree = (libNameIncludes: string, tablename: string) => { + cy.get('.app-loading', { timeout: longerCommandTimeout }) + .should('not.exist') + .then(() => { + cy.get('.nav-tree clr-tree > clr-tree-node', { + timeout: longerCommandTimeout + }).then((treeNodes: any) => { + let viyaLib + + for (let node of treeNodes) { + if (node.innerText.toLowerCase().includes(libNameIncludes)) { + viyaLib = node + break + } + } + + cy.get(viyaLib).within(() => { + cy.get('.clr-tree-node-content-container > button').click() + + cy.get('.clr-treenode-link').then((innerNodes: any) => { + for (let innerNode of innerNodes) { + if (innerNode.innerText.toLowerCase().includes(tablename)) { + innerNode.click() + break + } + } + }) + }) + }) + }) +} + +const attachExcelFile = (excelFilename: string, callback?: any) => { + cy.get('.buttonBar button:last-child') + .should('exist') + .click() + .then(() => { + cy.get('input[type="file"]#file-upload') + .attachFile(`/${fixturePath}/${excelFilename}`) + .then(() => { + cy.get('.clr-abort-modal .modal-title').then((modalTitle) => { + if (!modalTitle[0].innerHTML.includes('Abort Message')) { + cy.get('.modal-footer .btn.btn-primary').then((modalBtn) => { + modalBtn.click() + if (callback) callback() + }) + } else { + if (callback) callback() + } + }) + }) + }) +} + +const submitExcel = (callback?: any) => { + cy.get('.buttonBar button.preview-submit', { timeout: longerCommandTimeout }) + .click() + .then(() => { + if (callback) callback() + }) +} + +const rejectExcel = (callback?: any) => { + cy.get('button', { timeout: longerCommandTimeout }) + .should('contain', 'Go to approvals screen') + .then((allButtons: any) => { + for (let approvalButton of allButtons) { + if ( + approvalButton.innerText + .toLowerCase() + .includes('go to approvals screen') + ) { + approvalButton.click() + break + } + } + + cy.get('button.btn-danger') + .should('exist') + .should('not.be.disabled') + .click() + .then(() => { + cy.get('.modal-footer button.btn-success-outline') + .click() + .then(() => { + cy.get('app-history') + .should('exist') + .then(() => { + if (callback) callback() + }) + }) + }) + }) +} + +const acceptExcel = (callback?: any) => { + cy.get('button', { timeout: longerCommandTimeout }) + .should('contain', 'Go to approvals screen') + .then((allButtons: any) => { + for (let approvalButton of allButtons) { + if ( + approvalButton.innerText + .toLowerCase() + .includes('go to approvals screen') + ) { + approvalButton.click() + break + } + } + + cy.get('#acceptBtn') + .should('exist') + .should('not.be.disabled') + .click() + .then(() => { + if (callback) { + callback() + } + }) + }) +} + +const checkResultOfFormulaUpload = (callback?: any) => { + cy.get('#hotInstance', { timeout: longerCommandTimeout }) + .find('div.ht_master.handsontable') + .find('div.wtHolder') + .find('div.wtHider') + .find('div.wtSpreader') + .find('table.htCore') + .find('tbody') + .then((data) => { + const cell: any = data[0].children[0].children[5] + expect(cell.innerText).to.equal('=1+1') + if (callback) callback() + }) +} + +const checkResultOfXLSUpload = (callback?: any) => { + cy.viewport(1280, 720) + cy.get('#hotInstance', { timeout: 30000 }) + .find('div.ht_master.handsontable') + .find('div.wtHolder') + .find('div.wtHider') + .find('div.wtSpreader') + .find('table.htCore') + .find('tbody') + .then((data) => { + let cell: any = data[0].children[0].children[2] + + expect(cell.innerText).to.equal('0') + cell = data[0].children[0].children[3] + expect(cell.innerText).to.equal('this is dummy data changed in excel') + cell = data[0].children[0].children[4] + expect(cell.innerText).to.equal('▼\nOption 1') + cell = data[0].children[0].children[5] + expect(cell.innerText).to.equal('42') + cell = data[0].children[0].children[6] + expect(cell.innerText).to.equal('▼\n1960-02-12') + // When CI detached browser screen is smaller, below cells are not visible so test fails + // Commenting it out now until we figure out workaround + // cell = data[0].children[0].children[7] + // expect(cell.innerText).to.equal('▼\n1960-01-01 00:00:42') + // cell = data[0].children[0].children[8] + // expect(cell.innerText).to.equal('00:00:42') + + if (callback) callback() + }) + + cy.get('#hotInstance', { timeout: 30000 }) + .find('div.ht_master.handsontable') + .find('div.wtHolder') + .scrollTo('right') + .find('div.wtHider') + .find('div.wtSpreader') + .find('table.htCore') + .find('tbody') + .then((data) => { + let cell: any = data[0].children[0].children[1] + + cell = data[0].children[0].children[9] + + expect(cell.innerText).to.equal('44') + + if (callback) callback() + }) +} + +const visitPage = (url: string) => { + cy.visit(`${hostUrl}${appLocation}/#/${url}`) +} + +const colorLog = (msg: string, color: string) => { + console.log('%c' + msg, 'color:' + color + ';font-weight:bold;') +} diff --git a/client/cypress/e2e/filtering.cy.ts b/client/cypress/e2e/filtering.cy.ts new file mode 100644 index 0000000..dfab8e6 --- /dev/null +++ b/client/cypress/e2e/filtering.cy.ts @@ -0,0 +1,383 @@ +const username = Cypress.env('username') +const password = Cypress.env('password') +const hostUrl = Cypress.env('hosturl') +const appLocation = Cypress.env('appLocation') +const longerCommandTimeout = Cypress.env('longerCommandTimeout') +const serverType = Cypress.env('serverType') +const libraryToOpenIncludes = Cypress.env(`libraryToOpenIncludes_${serverType}`) +const fixturePath = 'excels_general/' + +context('filtering tests: ', function () { + this.beforeAll(() => { + cy.visit(`${hostUrl}/SASLogon/logout`, { timeout: longerCommandTimeout }) + cy.loginAndUpdateValidKey() + }) + + this.beforeEach(() => { + cy.visit(hostUrl + appLocation, { timeout: longerCommandTimeout }) + // cy.get('input.username').type(username) + // cy.get('input.password').type(password) + // cy.get('.login-group button').click() + + visitPage('home') + }) + + it('1 | filter char field', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openFilterPopup(() => { + setFilterWithValue('SOME_CHAR', 'this is dummy data', 'value', () => { + checkInfoBarIncludes( + `AND,AND,0,SOME_CHAR,=,"'this is dummy data'"`, + (includes: boolean) => { + if (includes) done() + } + ) + }) + }) + }) + + it('2 | filter number field', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openFilterPopup(() => { + setFilterWithValue('SOME_NUM', '42', 'value', () => { + checkInfoBarIncludes(`AND,AND,0,SOME_NUM,=,42`, (includes: boolean) => { + if (includes) done() + }) + }) + }) + }) + + it('3 | filter time field', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openFilterPopup(() => { + setFilterWithValue('SOME_TIME', '00:00:42', 'time', () => { + checkInfoBarIncludes( + `AND,AND,0,SOME_TIME,=,42`, + (includes: boolean) => { + if (includes) done() + } + ) + }) + }) + }) + + it('3.1 | Non picker - filter time field', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openFilterPopup(() => { + setFilterWithValue('SOME_TIME', '42', 'value', () => { + checkInfoBarIncludes( + `AND,AND,0,SOME_TIME,=,42`, + (includes: boolean) => { + if (includes) done() + } + ) + }) + }, false) + }) + + it('4 | filter date field', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openFilterPopup(() => { + setFilterWithValue('SOME_DATE', '12/02/1960', 'date', () => { + checkInfoBarIncludes( + `AND,AND,0,SOME_DATE,=,42`, + (includes: boolean) => { + if (includes) done() + } + ) + }) + }) + }) + + it('4.1 | Non picker - filter date field', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openFilterPopup(() => { + setFilterWithValue('SOME_DATE', '42', 'value', () => { + checkInfoBarIncludes( + `AND,AND,0,SOME_DATE,=,42`, + (includes: boolean) => { + if (includes) done() + } + ) + }) + }, false) + }) + + it('5 | filter datetime field', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openFilterPopup(() => { + setFilterWithValue( + 'SOME_DATETIME', + '01/01/1960 00:00:42', + 'datetime', + () => { + checkInfoBarIncludes( + `AND,AND,0,SOME_DATETIME,=,42`, + (includes: boolean) => { + if (includes) done() + } + ) + } + ) + }) + }) + + it('5.1 | Non picker - filter datetime field', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openFilterPopup(() => { + setFilterWithValue('SOME_DATETIME', '42', 'value', () => { + checkInfoBarIncludes( + `AND,AND,0,SOME_DATETIME,=,42`, + (includes: boolean) => { + if (includes) done() + } + ) + }) + }, false) + }) + + it('6 | filter date field IN', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openFilterPopup(() => { + setFilterWithValue('SOME_DATE', '', 'in', () => { + checkInfoBarIncludes( + `AND,AND,0,SOME_DATE,IN,(0)`, + (includes: boolean) => { + if (includes) done() + } + ) + }) + }) + }) + + it('7 | filter bestnum field BETWEEN', (done) => { + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + openFilterPopup(() => { + setFilterWithValue('SOME_BESTNUM', '0-10', 'between', () => { + checkInfoBarIncludes( + `AND,AND,0,SOME_BESTNUM,BETWEEN,0 AND 10`, + (includes: boolean) => { + if (includes) done() + } + ) + }) + }) + }) + + this.afterEach(() => { + // cy.visit(`${hostUrl}/SASLogon/logout`) + }) +}) + +const checkInfoBarIncludes = (text: string, callback: any) => { + cy.get('.infoBar b', { timeout: longerCommandTimeout }).then((el: any) => { + const includes = el[0].innerText.toLowerCase().includes(text.toLowerCase()) + + if (callback) callback(includes) + }) +} + +const openFilterPopup = ( + callback?: any, + usePickers: boolean = true, + isViewerFiltering: boolean = false +) => { + const filterButton = isViewerFiltering + ? '.btn-outline.filterSide' + : '.btnCtrl .btnView' + + cy.get(filterButton, { timeout: longerCommandTimeout }).then( + (optionsButton: any) => { + optionsButton.click() + + if (isViewerFiltering) { + cy.wait(300) + + cy.get('.dropdown-menu button').then(async (dropdownButtons: any) => { + let filterButton = null + + for (let btn of dropdownButtons) { + if (btn.innerText.toLowerCase().includes('filter')) { + filterButton = btn + + break + } + } + + if (filterButton) { + filterButton.click() + + if (usePickers) turnOnPickers() + + if (callback) callback() + + return + } + }) + } + + if (usePickers) turnOnPickers() + if (callback) callback() + } + ) +} + +const turnOnPickers = () => { + cy.get('#usePickers') + .should('exist') + .then((picker: any) => { + picker[0].click() + }) +} + +const setFilterWithValue = ( + variableValue: string, + valueString: string, + valueField: 'value' | 'time' | 'date' | 'datetime' | 'in' | 'between', + callback?: any +) => { + cy.wait(600) + + cy.focused().type(variableValue) + cy.wait(100) + // cy.focused().trigger('input') + cy.get('.variable-col .autocomplete-wrapper', { withinSubject: null }) + .first() + .trigger('keydown', { key: 'ArrowDown' }) + cy.get('.variable-col .autocomplete-wrapper', { + withinSubject: null + }).trigger('keydown', { key: 'Enter' }) + cy.focused().tab() + cy.wait(100) + + if (valueField === 'in') { + cy.focused().select(valueField.toUpperCase()).trigger('change') + } else if (valueField === 'between') { + cy.focused().select(valueField.toUpperCase()).trigger('change') + } else { + cy.focused().tab() + cy.wait(100) + } + + switch (valueField) { + case 'value': { + cy.focused().type(valueString) + + break + } + case 'time': { + cy.focused().type(valueString) + + break + } + case 'date': { + cy.focused().type(valueString) + cy.focused().tab() + + break + } + case 'datetime': { + const date = valueString.split(' ')[0] + const time = valueString.split(' ')[1] + + cy.focused().type(date) + cy.focused().tab() + cy.focused().tab() + cy.focused().type(time) + + break + } + case 'in': { + cy.get('.checkbox-vals').then(() => { + cy.focused().tab() + cy.focused().click() + cy.get('.no-values') + .should('not.exist') + .then(() => { + cy.get('.in-values-modal clr-checkbox-wrapper input').then((inputs: any) => { + inputs[0].click() + cy.get('.in-values-modal .modal-footer button').click() + + cy.get('.modal-footer .btn-success-outline').click() + + if (callback) callback() + }) + }) + }) + + break + } + case 'between': { + cy.focused().tab() + + const start = valueString.split('-')[0] + const end = valueString.split('-')[1] + + cy.focused().type(start) + cy.focused().tab() + cy.focused().type(end) + } + default: { + break + } + } + + cy.wait(100) + cy.focused().tab() + cy.wait(100) + cy.focused().tab() + cy.wait(100) + cy.focused().tab() + cy.wait(100) + cy.focused().tab() + cy.wait(100) + cy.focused().click() + + if (callback) callback() +} + +const openTableFromTree = (libNameIncludes: string, tablename: string) => { + cy.get('.app-loading', { timeout: longerCommandTimeout }) + .should('not.exist') + .then(() => { + cy.get('.nav-tree clr-tree > clr-tree-node', { + timeout: longerCommandTimeout + }).then((treeNodes: any) => { + let viyaLib + + for (let node of treeNodes) { + if (new RegExp(libNameIncludes).test(node.innerText.toLowerCase())) { + viyaLib = node + break + } + } + + cy.get(viyaLib).within(() => { + cy.get('.clr-tree-node-content-container p').click() + + cy.get('.clr-treenode-link').then((innerNodes: any) => { + for (let innerNode of innerNodes) { + if (innerNode.innerText.toLowerCase().includes(tablename)) { + innerNode.click() + break + } + } + }) + }) + }) + }) +} + +const visitPage = (url: string) => { + cy.visit(`${hostUrl}${appLocation}/#/${url}`) +} diff --git a/client/cypress/e2e/licensing.cy.ts b/client/cypress/e2e/licensing.cy.ts new file mode 100644 index 0000000..f72ed4e --- /dev/null +++ b/client/cypress/e2e/licensing.cy.ts @@ -0,0 +1,731 @@ +import { arrayBufferToBase64 } from './../util/helper-functions' +import * as moment from 'moment' + +const username = Cypress.env('username') +const password = Cypress.env('password') +const hostUrl = Cypress.env('hosturl') +const appLocation = Cypress.env('appLocation') +const longerCommandTimeout = Cypress.env('longerCommandTimeout') +const fixturePath = 'excels_general/' +const serverType = Cypress.env('serverType') +const site_id = Cypress.env(`site_id_${serverType}`) +const libraryToOpenIncludes = Cypress.env(`libraryToOpenIncludes_${serverType}`) +const testLicenceUserLimits = Cypress.env('testLicenceUserLimits') + +/** IMPORTANT NOTICE + * Before running tests, make sure that table `MPE_USERS` is present + */ + +interface EditConfigTableCells { + varName: string + varValue: string +} + +context('licensing tests: ', function () { + this.beforeAll(() => { + // cy.visit(`${hostUrl}/SASLogon/logout`) + cy.loginAndUpdateValidKey() + }) + + this.beforeEach(() => { + cy.visit(hostUrl + appLocation) + // cy.get('input.username').type(username) + // cy.get('input.password').type(password) + // cy.get('.login-group button').click() + + visitPage('home') + }) + + it('1 | key valid, not expired', (done) => { + let keyData = { + valid_until: moment().add(1, 'year').format('YYYY-MM-DD'), + users_allowed: 4, + hot_license_key: '', + demo: false, + site_id: site_id + } + + let keys: { licenseKey: any; activationKey: any } + generateKeys(keyData, (keysGen: any) => { + keys = keysGen + + cy.wait(2000) + + isLicensingPage((result: boolean) => { + if (result) { + inputLicenseKeyPage(keys.licenseKey, keys.activationKey) + + cy.wait(2000) + } + + acceptTermsIfPresented((result: boolean) => { + if (result) { + cy.wait(10000) + } + + visitPage('home') + + cy.get('.nav-tree clr-tree > clr-tree-node', { + timeout: longerCommandTimeout + }).then((treeNodes: any) => { + done() + }) + }) + }) + }) + }) + + it('2 | Key will expire in less then 14 days, not free tier', (done) => { + // make 2 separate for this one + let keyData = { + valid_until: moment().add(10, 'day').format('YYYY-MM-DD'), + users_allowed: 4, + hot_license_key: '', + demo: false, + site_id: site_id + } + + let keys: { licenseKey: any; activationKey: any } + generateKeys(keyData, (keysGen: any) => { + keys = keysGen + console.log('keys', keys) + + cy.wait(2000) + + acceptTermsIfPresented((result: boolean) => { + if (result) { + cy.wait(20000) + } + updateLicenseKeyQuick(keysGen, () => { + cy.wait(2000) + acceptTermsIfPresented((result: boolean) => { + if (result) { + cy.wait(20000) + } + verifyLicensingWarning('This license key will expire in ', () => { + done() + }) + }) + }) + }) + }) + }) + + it('3 | key expired, free tier works', (done) => { + let keyData = { + valid_until: moment().subtract(1, 'day').format('YYYY-MM-DD'), + users_allowed: 4, + hot_license_key: '', + demo: false, + site_id: site_id + } + + let keys: { licenseKey: any; activationKey: any } + generateKeys(keyData, (keysGen: any) => { + keys = keysGen + + cy.wait(2000) + + acceptTermsIfPresented((result: boolean) => { + if (result) { + cy.wait(20000) + } + cy.wait(2000) + updateLicenseKeyQuick(keysGen, () => { + cy.wait(2000) + acceptTermsIfPresented((result: boolean) => { + if (result) { + cy.wait(20000) + } + verifyLicensingPage( + 'Licence key is expired - please contact', + (success: boolean) => { + if (success) { + verifyLicensingWarning( + '(FREE Tier) - Problem with licence', + () => { + done() + } + ) + } + } + ) + }) + }) + }) + }) + }) + + it('4 | key invalid, free tier works', (done) => { + let keyData = { + valid_until: moment().subtract(1, 'day').format('YYYY-MM-DD'), + users_allowed: 4, + hot_license_key: '', + demo: false, + site_id: site_id + } + + let keys: { licenseKey: any; activationKey: any } + generateKeys(keyData, (keysGen: any) => { + keys = keysGen + keys.activationKey = 'invalid' + keys.activationKey + + cy.wait(2000) + + acceptTermsIfPresented((result: boolean) => { + if (result) { + cy.wait(20000) + } + cy.wait(2000) + updateLicenseKeyQuick(keysGen, () => { + cy.wait(2000) + acceptTermsIfPresented((result: boolean) => { + if (result) { + cy.wait(20000) + } + verifyLicensingPage( + 'Licence key is invalid - please contact', + (success: boolean) => { + if (success) { + verifyLicensingWarning( + '(FREE Tier) - Problem with licence', + () => { + done() + } + ) + } + } + ) + }) + }) + }) + }) + }) + + it('5 | key for wrong organisation, free tier works', (done) => { + let keyData = { + valid_until: moment().add(1, 'year').format('YYYY-MM-DD'), + users_allowed: 4, + hot_license_key: '', + demo: false, + site_id: 100 + } + + let keys: { licenseKey: any; activationKey: any } + generateKeys(keyData, (keysGen: any) => { + keys = keysGen + keys.activationKey = keys.activationKey + + cy.wait(2000) + + acceptTermsIfPresented((result: boolean) => { + if (result) { + cy.wait(20000) + } + cy.wait(2000) + updateLicenseKeyQuick(keysGen, () => { + cy.wait(2000) + acceptTermsIfPresented((result: boolean) => { + if (result) { + cy.wait(20000) + } + verifyLicensingPage( + 'SYSSITE (below) is not found', + (success: boolean) => { + if (success) { + verifyLicensingWarning( + '(FREE Tier) - Problem with licence', + () => { + done() + } + ) + } + } + ) + }) + }) + }) + }) + }) + + if (testLicenceUserLimits) { + it('4 | User try to register when limit is reached', (done) => { + let keyData = { + valid_until: moment().add(1, 'month').format('YYYY-MM-DD'), + users_allowed: 10, + hot_license_key: '', + demo: false, + site_id: site_id + } + let keyData2 = { + valid_until: moment().add(1, 'month').format('YYYY-MM-DD'), + users_allowed: 1, + hot_license_key: '', + demo: false, + site_id: site_id + } + generateKeys(keyData, (keysGen: any) => { + generateKeys(keyData2, (keysGen2: any) => { + cy.wait(2000) + + acceptTermsIfPresented((result: boolean) => { + if (result) { + cy.wait(20000) + } + updateLicenseKeyQuick(keysGen, () => { + cy.wait(2000) + acceptTermsIfPresented((result: boolean) => { + if (result) { + cy.wait(20000) + } + + updateLicenseKeyQuick(keysGen2, () => { + cy.wait(2000) + + const random = Cypress._.random(0, 1000) + const newUser = { + username: `randomusername${random}notregistered`, + last_seen_at: moment().add(1, 'month').format('YYYY-MM-DD'), + registered_at: moment().add(1, 'month').format('YYYY-MM-DD') + } + updateUsersTable( + { deleteAll: true, newUsers: [newUser] }, + () => { + logout(() => { + cy.visit(hostUrl + appLocation) + // cy.get('input.username').type(username) + // cy.get('input.password').type(password) + // cy.get('.login-group button').click() + + visitPage('home') + + cy.wait(2000) + + verifyLicensingPage( + 'The registered number of users reached the limit specified for your licence.', + (success: boolean) => { + if (success) done() + } + ) + }) + } + ) + }) + }) + }) + }) + }) + }) + }) + + it('5 | Show warning banner when limit is exceeded', (done) => { + let keyData = { + valid_until: moment().add(1, 'month').format('YYYY-MM-DD'), + users_allowed: 10, + hot_license_key: '', + demo: false, + site_id: site_id + } + let keyData2 = { + valid_until: moment().add(1, 'month').format('YYYY-MM-DD'), + users_allowed: 1, + hot_license_key: '', + demo: false, + site_id: site_id + } + + generateKeys(keyData, (keysGen: any) => { + generateKeys(keyData2, (keysGen2: any) => { + cy.wait(2000) + acceptTermsIfPresented((result: boolean) => { + if (result) { + cy.wait(20000) + } + updateLicenseKeyQuick(keysGen, () => { + cy.wait(2000) + acceptTermsIfPresented((result: boolean) => { + if (result) { + cy.wait(20000) + } + const random = Cypress._.random(0, 1000) + const newUser = { + username: `randomusername${random}`, + last_seen_at: moment().add(1, 'month').format('YYYY-MM-DD'), + registered_at: moment().add(1, 'month').format('YYYY-MM-DD') + } + updateUsersTable( + { deleteAll: true, keep: username, newUsers: [newUser] }, + () => { + updateLicenseKeyQuick(keysGen2, () => { + cy.wait(2000) + verifyLicensingWarning( + 'The registered number of users exceeds the limit specified for your license.', + () => { + done() + } + ) + }) + } + ) + }) + }) + }) + }) + }) + }) + } + + this.afterEach(() => { + // cy.visit(`${hostUrl}/SASLogon/logout`) + }) +}) + +const logout = (callback?: any) => { + cy.get('.header-actions .dropdown-toggle') + .click() + .then(() => { + cy.get('.header-actions .dropdown-menu > .separator') + .next() + .click() + .then(() => { + if (callback) callback() + }) + }) +} + +const acceptTermsIfPresented = (callback?: any) => { + cy.url().then((url: string) => { + if (url.includes('licensing/register')) { + cy.get('.card-block') + .scrollTo('bottom') + .then(() => { + cy.get('#checkbox1') + .click() + .then(() => { + if (callback) callback(true) + }) + }) + } else { + if (callback) callback(false) + } + }) +} + +const isLicensingPage = (callback: any) => { + return cy.url().then((url: string) => { + callback( + url.includes('#/licensing/') && !url.includes('licensing/register') + ) + }) +} + +const verifyLicensingPage = (text: string, callback: any) => { + // visitPage('home') + + cy.wait(1000) + isLicensingPage((result: boolean) => { + if (result) { + cy.get('p.key-error') + .should('contain', text) + .then((treeNodes: any) => { + callback(true) + }) + } + }) +} + +const verifyLicensingWarning = (text: string, callback: any) => { + visitPage('home') + + cy.wait(1000) + cy.get("div[role='alert'] .alert-text") + .invoke('text') + .should('contain', text) + .then(() => { + callback() + }) +} + +const inputLicenseKeyPage = (licenseKey: string, activationKey: string) => { + cy.get('button').contains('Paste licence').click() + + cy.get('.license-key-form textarea', { timeout: longerCommandTimeout }) + .invoke('val', licenseKey) + .trigger('input') + .should('not.be.undefined') + cy.get('.activation-key-form textarea', { timeout: longerCommandTimeout }) + .invoke('val', activationKey) + .trigger('input') + .should('not.be.undefined') + cy.get('button.apply-keys').click() +} + +const updateUsersTable = (options: any, callback?: any) => { + visitPage('home') + openTableFromTree(libraryToOpenIncludes, 'mpe_users') + + clickOnEdit(() => { + cy.get('.ht_master tbody tr').then((rows: any) => { + if (options.deleteAll) { + for (let row of rows) { + const user_id = row.childNodes[2] + if (!options.keep || user_id.innerText !== options.keep) { + cy.get(row.childNodes[1]) + .dblclick() + .then(() => { + cy.focused().type('{selectall}').type('Yes').type('{enter}') + }) + } + } + } + if (options.newUsers && options.newUsers.length) { + for (let newUser of options.newUsers) { + clickOnAddRow(() => { + cy.get('#hotInstance tbody tr:last-child').then((rows: any) => { + cy.get(rows[0].childNodes[2]) + .dblclick() + .then(() => { + cy.focused() + .type('{selectall}') + .type(newUser.username) + .type('{enter}') + }) + // cy.get(rows[0].childNodes[3]) + // .dblclick() + // .then(() => { + // cy.focused() + // .type('{selectall}') + // .type(newUser.last_seen_at) + // .type('{enter}') + // }) + // cy.get(rows[0].childNodes[4]) + // .dblclick() + // .then(() => { + // cy.focused() + // .type('{selectall}') + // .type(newUser.registered_at) + // .type('{enter}') + // }) + submitTable(() => { + cy.wait(2000) + approveTable(callback) + }) + }) + }) + } + } + }) + }) +} + +const changeLicenseKeyTable = (keys: any, callback?: any) => { + visitPage('home') + openTableFromTree(libraryToOpenIncludes, 'mpe_config') + + clickOnEdit(() => { + editTableField( + [ + { varName: 'DC_ACTIVATION_KEY', varValue: keys.activationKey }, + { varName: 'DC_LICENCE_KEY', varValue: keys.licenseKey } + ], + () => { + submitTable(() => { + cy.wait(2000) + approveTable(() => { + cy.reload() + if (callback) callback() + }) + }) + } + ) + }) +} + +const updateLicenseKeyQuick = (keys: any, callback: any) => { + isLicensingPage((result: boolean) => { + if (!result) { + visitPage('licensing/update') + cy.wait(2000) + } + inputLicenseKeyPage(keys.licenseKey, keys.activationKey) + + callback() + }) +} + +const generateKeys = async (licenseData: any, resultCallback?: any) => { + let keyPair = await window.crypto.subtle.generateKey( + { + name: 'RSA-OAEP', + modulusLength: 2024, + publicExponent: new Uint8Array([1, 0, 1]), + hash: 'SHA-256' + }, + true, + ['encrypt', 'decrypt'] + ) + + const encoded = new TextEncoder().encode(JSON.stringify(licenseData)) + + const cipher = await window.crypto.subtle + .encrypt( + { + name: 'RSA-OAEP' + }, + keyPair.publicKey, + encoded + ) + .then( + (value) => { + return value + }, + (err) => { + console.log('Encrpyt error', err) + } + ) + + if (!cipher) { + alert('Encryptin keys failed') + throw new Error('Encryptin keys failed') + } + + const privateKeyBytes = await window.crypto.subtle.exportKey( + 'pkcs8', + keyPair.privateKey + ) + + const activationKey = await arrayBufferToBase64(privateKeyBytes) + const licenseKey = await arrayBufferToBase64(cipher) + + if (resultCallback) + resultCallback({ + activationKey, + licenseKey + }) +} + +const editTableField = (edits: EditConfigTableCells[], callback?: any) => { + cy.get('td').then((tdNodes: any) => { + for (let edit of edits) { + let correctRow = false + + for (let node of tdNodes) { + if (correctRow) { + cy.get(node) + .dblclick() + .then(() => { + // textarea update on long keys + cy.focused().invoke('val', edit.varValue).type('{enter}') + }) + + correctRow = false + break + } + + if (node.innerText.includes(edit.varName)) { + correctRow = true + } + } + } + + if (callback) callback() + }) +} + +const openTableFromTree = ( + libNameIncludes: string, + tablename: string, + callback?: any +) => { + cy.get('.app-loading', { timeout: longerCommandTimeout }) + .should('not.exist') + .then(() => { + cy.get('.nav-tree clr-tree > clr-tree-node', { + timeout: longerCommandTimeout + }).then((treeNodes: any) => { + let viyaLib + + for (let node of treeNodes) { + if (node.innerText.toLowerCase().includes(libNameIncludes)) { + viyaLib = node + break + } + } + + cy.get(viyaLib).within(() => { + cy.get('.clr-tree-node-content-container > button').click() + + cy.get('.clr-treenode-link').then((innerNodes: any) => { + for (let innerNode of innerNodes) { + if (innerNode.innerText.toLowerCase().includes(tablename)) { + innerNode.click() + if (callback) callback() + break + } + } + }) + }) + }) + }) +} + +const clickOnAddRow = (callback?: any) => { + cy.get('.btnCtrl button.btn-success') + .click() + .then(() => { + if (callback) callback() + }) +} + +const clickOnEdit = (callback?: any) => { + cy.get('.btnCtrl button.btn-primary', { timeout: longerCommandTimeout }) + .click() + .then(() => { + if (callback) callback() + }) +} + +const submitTable = (callback?: any) => { + cy.get('.btnCtrl button.btn-primary', { timout: longerCommandTimeout }) + .click() + .then(() => { + cy.get(".modal.ng-star-inserted button[type='submit']") + .click() + .then(() => { + if (callback) callback() + }) + }) +} + +const approveTable = (callback?: any) => { + cy.get('button', { timeout: longerCommandTimeout }) + .should('contain', 'Go to approvals screen') + .then((allButtons: any) => { + for (let approvalButton of allButtons) { + if ( + approvalButton.innerText + .toLowerCase() + .includes('go to approvals screen') + ) { + approvalButton.click() + break + } + } + + cy.get('button#acceptBtn', { timeout: longerCommandTimeout }) + .should('exist') + .should('not.be.disabled') + .click() + .then(() => { + cy.get('app-history', { timeout: longerCommandTimeout }) + .should('exist') + .then(() => { + if (callback) callback() + }) + }) + }) +} + +const visitPage = (url: string) => { + cy.visit(`${hostUrl}${appLocation}/#/${url}`) +} diff --git a/client/cypress/e2e/liveness.cy.ts b/client/cypress/e2e/liveness.cy.ts new file mode 100644 index 0000000..8e350b0 --- /dev/null +++ b/client/cypress/e2e/liveness.cy.ts @@ -0,0 +1,157 @@ +const username = Cypress.env('username') +const password = Cypress.env('password') +const hostUrl = Cypress.env('hosturl') +const appLocation = Cypress.env('appLocation') +const longerCommandTimeout = Cypress.env('longerCommandTimeout') +const serverType = Cypress.env('serverType') +const libraryToOpenIncludes = Cypress.env(`libraryToOpenIncludes_${serverType}`) +const fixturePath = 'excels/' + +context('liveness tests: ', function () { + this.beforeAll(() => { + if (serverType !== 'SASJS') { + cy.visit(`${hostUrl}/SASLogon/logout`) + } + cy.loginAndUpdateValidKey(true) + }) + + this.beforeEach(() => { + cy.visit(hostUrl + appLocation) + + // cy.get('input.username').type(username) + // cy.get('input.password').type(password) + // cy.get('.login-group button').click() + + visitPage('home') + }) + + it('1 | Login and submit test', (done) => { + cy.get('.nav-tree clr-tree > clr-tree-node', { + timeout: longerCommandTimeout + }).then((treeNodes: any) => { + libraryExistsInTree('viya', treeNodes) + ? openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + : openTableFromTree('dc', 'mpe_x_test') + + attachExcelFile('regular_excel.xlsx', () => { + submitExcel() + rejectExcel(done) + }) + }) + }) + + /** + * Thist part will be needed if we add more tests in future + */ + // this.afterEach(() => { + // cy.visit('https://sas.4gl.io/SASLogon/logout'); + // }) +}) + +const visitPage = (url: string) => { + cy.visit(`${hostUrl}${appLocation}/#/${url}`) +} + +const libraryExistsInTree = (libName: string, nodes: any) => { + for (let node of nodes) { + if (node.innerText.toLowerCase().includes(libName.toLowerCase())) + return true + } + + return false +} + +const openTableFromTree = ( + libNameIncludes: string, + tablename: string, + finish: any +) => { + cy.get('.app-loading', { timeout: longerCommandTimeout }) + .should('not.exist') + .then(() => { + cy.get('.nav-tree clr-tree > clr-tree-node', { + timeout: longerCommandTimeout + }).then((treeNodes: any) => { + let viyaLib + + for (let node of treeNodes) { + if (node.innerText.toLowerCase().includes(libNameIncludes)) { + viyaLib = node + break + } + } + + if (!viyaLib && finish) finish(false) + + cy.get(viyaLib).within(() => { + cy.get('.clr-tree-node-content-container > button').click() + + cy.get('.clr-treenode-link').then((innerNodes: any) => { + for (let innerNode of innerNodes) { + if (innerNode.innerText.toLowerCase().includes(tablename)) { + innerNode.click() + if (finish) finish(true) + break + } + } + }) + }) + }) + }) +} + +const attachExcelFile = (excelFilename: string, callback?: any) => { + cy.get('.buttonBar button:last-child') + .should('exist') + .click() + .then(() => { + cy.get('input[type="file"]#file-upload').attachFile( + `/${fixturePath}/${excelFilename}` + ) + cy.get('.modal-footer .btn.btn-primary').then((modalBtn) => { + modalBtn.click() + if (callback) callback() + }) + }) +} + +const submitExcel = (callback?: any) => { + cy.get('.buttonBar button.preview-submit', { timeout: longerCommandTimeout }) + .click() + .then(() => { + if (callback) callback() + }) +} + +const rejectExcel = (callback?: any) => { + cy.get('button', { timeout: longerCommandTimeout }) + .should('contain', 'Go to approvals screen') + .then((allButtons: any) => { + for (let approvalButton of allButtons) { + if ( + approvalButton.innerText + .toLowerCase() + .includes('go to approvals screen') + ) { + approvalButton.click() + break + } + } + + cy.get('button.btn-danger') + .should('exist') + .should('not.be.disabled') + .click() + .then(() => { + cy.get('.modal-footer button.btn-success-outline') + .click() + .then(() => { + cy.get('app-history') + .should('exist') + .then(() => { + if (callback) callback() + }) + }) + }) + }) +} diff --git a/client/cypress/e2e/metanav.cy.ts b/client/cypress/e2e/metanav.cy.ts new file mode 100644 index 0000000..3244d86 --- /dev/null +++ b/client/cypress/e2e/metanav.cy.ts @@ -0,0 +1,61 @@ +const username = Cypress.env('username') +const password = Cypress.env('password') +const hostUrl = Cypress.env('hosturl') +const appLocation = Cypress.env('appLocation') +const longerCommandTimeout = Cypress.env('longerCommandTimeout') +const serverType = Cypress.env('serverType') +const libraryToOpenIncludes = Cypress.env(`libraryToOpenIncludes_${serverType}`) +const fixturePath = 'excels_general/' + +context('metanav tests: ', function () { + this.beforeAll(() => { + cy.visit(`${hostUrl}/SASLogon/logout`) + cy.loginAndUpdateValidKey() + }) + + this.beforeEach(() => { + cy.visit(hostUrl + appLocation) + cy.get('input.username').type(username) + cy.get('input.password').type(password) + cy.get('.login-group button').click() + + visitPage('view/metadata') + }) + + it('1 | Opens metadata object', (done) => { + openFirstMetadataFromTree(() => { + // BLOCKER + // For unkown reasons, .clr-accordion-header-button always null although it is present on the page. + cy.get('.clr-accordion-header-button').then((panelNodes: any) => { + panelNodes[0].querySelector('button').click() + }) + }) + }) + + this.afterEach(() => { + cy.visit(`${hostUrl}/SASLogon/logout`) + }) +}) + +const openFirstMetadataFromTree = (callback?: any) => { + cy.get('.app-loading', { timeout: longerCommandTimeout }) + .should('not.exist') + .then(() => { + cy.get('.nav-tree clr-tree > clr-tree-node', { + timeout: longerCommandTimeout + }).then((treeNodes: any) => { + let firstMetaNode + + firstMetaNode = treeNodes[1] + + cy.get(firstMetaNode).within(() => { + cy.get('.clr-treenode-content').click() + callback() + }) + }) + }) +} + +const visitPage = (url: string) => { + cy.visit(`${hostUrl}${appLocation}/#/${url}`) +} diff --git a/client/cypress/e2e/viewbox.cy.ts b/client/cypress/e2e/viewbox.cy.ts new file mode 100644 index 0000000..00c211f --- /dev/null +++ b/client/cypress/e2e/viewbox.cy.ts @@ -0,0 +1,655 @@ +import { cloneDeep } from 'lodash-es' + +const username = Cypress.env('username') +const password = Cypress.env('password') +const hostUrl = Cypress.env('hosturl') +const appLocation = Cypress.env('appLocation') +const longerCommandTimeout = Cypress.env('longerCommandTimeout') +const serverType = Cypress.env('serverType') +const libraryToOpenIncludes = Cypress.env(`libraryToOpenIncludes_${serverType}`) + +context('editor tests: ', function () { + this.beforeAll(() => { + cy.visit(`${hostUrl}/SASLogon/logout`) + cy.loginAndUpdateValidKey(true) + }) + + this.beforeEach(() => { + cy.visit(hostUrl + appLocation) + + cy.wait(2000) + + cy.get('body').then(($body) => { + const usernameInput = $body.find('input.username')[0] + + if (usernameInput && !Cypress.dom.isHidden(usernameInput)) { + cy.get('input.username').type(username) + cy.get('input.password').type(password) + + cy.get('.login-group button').click() + } + }) + + visitPage('home') + }) + + it('1 | Add one viewbox', (done) => { + const viewbox_table = 'mpe_audit' + const columns = ['LOAD_REF', 'LIBREF', 'DSN', 'KEY_HASH', 'TGTVAR_NM'] + + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + cy.get('.viewbox-open').click() + openTableFromViewboxTree(libraryToOpenIncludes, [viewbox_table]) + + cy.get('.open-viewbox').then((viewboxNodes: any) => { + for (let viewboxNode of viewboxNodes) { + if (!viewboxNode.innerText.toLowerCase().includes(viewbox_table)) { + return + } + + checkColumns(columns, () => { + done() + }) + } + }) + }) + + it('2 | Add two viewboxes', (done) => { + const viewboxes = [ + { + viewbox_table: 'mpe_audit', + columns: ['LOAD_REF', 'LIBREF', 'DSN', 'KEY_HASH', 'TGTVAR_NM'] + }, + { + viewbox_table: 'mpe_alerts', + columns: [ + 'TX_FROM', + 'ALERT_EVENT', + 'ALERT_LIB', + 'ALERT_DS', + 'ALERT_USER' + ] + } + ] + + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + cy.get('.viewbox-open').click() + openTableFromViewboxTree( + libraryToOpenIncludes, + viewboxes.map((viewbox) => viewbox.viewbox_table)) + cy.get('.open-viewbox').then((viewboxNodes: any) => { + let found = 0 + + for (let viewboxNode of viewboxNodes) { + for (let viewbox of viewboxes) { + if ( + viewboxNode.innerText.toLowerCase().includes(viewbox.viewbox_table) + ) + found++ + } + } + + if (found < viewboxes.length) return + + cy.get('.viewboxes-container .viewbox', { withinSubject: null }).then((viewboxNodes: any) => { + for (let viewboxNode of viewboxNodes) { + cy.get(viewboxNode).within(() => { + cy.get('.table-title').then((tableTitle) => { + const title = tableTitle[0].innerText + const viewbox = viewboxes.find((vb) => + title.toLowerCase().includes(vb.viewbox_table) + ) + + if (viewbox) { + cy.get('.ht_master.handsontable .htCore thead tr').then( + (viewboxColNodes: any) => { + let allColsHtml = viewboxColNodes[0].innerHTML + + for (let col of viewbox?.columns) { + if (!allColsHtml.includes(col)) return + } + + done() + } + ) + } + }) + }) + } + }) + }) + }) + + it('3 | Add viewbox, add columns', (done) => { + const viewbox_table = 'mpe_audit' + const columns = ['LOAD_REF', 'LIBREF', 'DSN', 'KEY_HASH', 'TGTVAR_NM'] + const additionalColumns = ['IS_PK'] + + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + cy.get('.viewbox-open').click() + openTableFromViewboxTree(libraryToOpenIncludes, [viewbox_table]) + + cy.get('.open-viewbox').then((viewboxNodes: any) => { + for (let viewboxNode of viewboxNodes) { + if (!viewboxNode.innerText.toLowerCase().includes(viewbox_table)) { + return + } + + openViewboxConfig(viewbox_table) + + removeAllColumns() + + addColumns(additionalColumns) + + checkColumns([...columns, ...additionalColumns], () => { + done() + }) + } + }) + }) + + it('4 | Add viewbox, add columns and reorder', (done) => { + const viewbox_table = 'mpe_audit' + const columns = ['LOAD_REF', 'LIBREF', 'DSN', 'KEY_HASH', 'TGTVAR_NM'] + const additionalColumns = ['IS_PK', 'MOVE_TYPE'] + + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + cy.get('.viewbox-open').click() + openTableFromViewboxTree(libraryToOpenIncludes, [viewbox_table]) + + cy.get('.open-viewbox').then((viewboxNodes: any) => { + for (let viewboxNode of viewboxNodes) { + if (!viewboxNode.innerText.toLowerCase().includes(viewbox_table)) { + return + } + + openViewboxConfig(viewbox_table) + + removeAllColumns() + + addColumns(additionalColumns, () => { + cy.wait(1000) + //reorder + cy.get('.col-box.column-MOVE_TYPE') + .realMouseDown({ button: 'left', position: 'center' }) + .realMouseMove(0, 10, { position: 'center' }) + cy.wait(200) // In our case, we wait 200ms cause we have animations which we are sure that take this amount of time + cy.get('.col-box.column-IS_PK') + .realMouseMove(0, 0, { position: 'center' }) + .realMouseUp() + //reorder end + + cy.wait(500) + + checkColumns([...columns, ...additionalColumns.reverse()], () => { + done() + }) + }) + } + }) + }) + + it('5 | Add viewbox, add columns, reorder, remove column, add again', (done) => { + const viewbox_table = 'mpe_audit' + const columns = ['LOAD_REF', 'LIBREF', 'DSN', 'KEY_HASH', 'TGTVAR_NM'] + const additionalColumns = ['IS_PK', 'MOVE_TYPE'] + + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + cy.get('.viewbox-open').click() + openTableFromViewboxTree(libraryToOpenIncludes, [viewbox_table]) + + cy.get('.open-viewbox').then((viewboxNodes: any) => { + for (let viewboxNode of viewboxNodes) { + if (!viewboxNode.innerText.toLowerCase().includes(viewbox_table)) { + return + } + + viewboxNode.click() + + removeAllColumns() + + addColumns(additionalColumns, () => { + cy.wait(1000) + //reorder + cy.get('.col-box.column-MOVE_TYPE') + .realMouseDown({ button: 'left', position: 'center' }) + .realMouseMove(0, 10, { position: 'center' }) + cy.wait(200) // In our case, we wait 200ms cause we have animations which we are sure that take this amount of time + cy.get('.col-box.column-IS_PK') + .realMouseMove(0, 0, { position: 'center' }) + .realMouseUp() + //reorder end + + cy.wait(500) + + checkColumns([...columns, ...additionalColumns.reverse()], () => { + const colToRemove = 'MOVE_TYPE' + + removeColumn(colToRemove) + checkColumns( + [ + ...columns, + ...additionalColumns.filter((col) => col !== colToRemove) + ], + () => { + addColumns([colToRemove], () => { + checkColumns( + [...columns, ...additionalColumns.reverse()], + () => { + done() + } + ) + }) + } + ) + }) + }) + } + }) + }) + + it('6 | Add viewboxes, reload and check url restored configuration', (done) => { + const viewboxes = [ + { + viewbox_table: 'mpe_audit', + columns: ['LOAD_REF', 'LIBREF', 'DSN', 'KEY_HASH', 'TGTVAR_NM'], + additionalColumns: ['IS_PK', 'MOVE_TYPE'] + }, + { + viewbox_table: 'mpe_alerts', + columns: [ + 'TX_FROM', + 'ALERT_EVENT', + 'ALERT_LIB', + 'ALERT_DS', + 'ALERT_USER' + ], + additionalColumns: ['TX_TO'] + } + ] + + openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + cy.get('.viewbox-open').click() + openTableFromViewboxTree(libraryToOpenIncludes, [ + viewboxes[0].viewbox_table, + viewboxes[1].viewbox_table + ]) + + openViewboxConfig(viewboxes[0].viewbox_table) + + cy.wait(500) + + removeAllColumns() + + addColumns(viewboxes[0].additionalColumns, () => { + cy.wait(1000) + + if (viewboxes[0].viewbox_table === 'mpe_audit') { + cy.get('.col-box.column-MOVE_TYPE') + .realMouseDown({ button: 'left', position: 'center' }) + .realMouseMove(0, 10, { position: 'center' }) + cy.wait(200) // In our case, we wait 200ms cause we have animations which we are sure that take this amount of time + cy.get('.col-box.column-IS_PK') + .realMouseMove(0, 0, { position: 'center' }) + .realMouseUp() + } + + cy.wait(1000) + + openViewboxConfig(viewboxes[1].viewbox_table) + + addColumns(viewboxes[1].additionalColumns, () => { + cy.wait(1000).reload() + + let result = 0 + + checkColumns( + [ + ...viewboxes[0].columns, + ...cloneDeep(viewboxes[0].additionalColumns.reverse()) + ], + () => { + result++ + + if (result === 2) done() + } + ) + checkColumns( + [...viewboxes[1].columns, ...viewboxes[1].additionalColumns], + () => { + result++ + + if (result === 2) done() + } + ) + }) + }) + }) + + // We will enable this test when we figure out how to mock filtering + // it('7 | Add viewboxes and filter', () => { + // const viewboxes = ['mpe_x_test', 'mpe_validations'] + + // openTableFromTree(libraryToOpenIncludes, 'mpe_x_test') + + // cy.get('.viewbox-open').click() + // openTableFromViewboxTree(libraryToOpenIncludes, viewboxes) + + // cy.wait(1000) + + // closeViewboxModal() + + // cy.get('.viewboxes-container .viewbox', { withinSubject: null }).then( + // (viewboxNodes: any) => { + // for (let viewboxNode of viewboxNodes) { + // cy.get(viewboxNode).within(() => { + // cy.get('.table-title').then((title: any) => { + // cy.get('.hot-spinner') + // .should('not.exist') + // .then(() => { + // cy.get('clr-icon[shape="filter"]').then((filterButton) => { + // filterButton[0].click() + // }) + + // if (title[0].innerText.includes('MPE_X_TEST')) { + // setFilterWithValue( + // 'SOME_CHAR', + // 'this is dummy data', + // 'value', + // () => { + // cy.get('app-query', { withinSubject: null }) + // .should('not.exist') + // .get('.ht_master.handsontable tbody tr') + // .then((rowNodes) => { + // const tr = rowNodes[0] + + // expect(rowNodes).to.have.length(1) + // expect(tr.innerText).to.equal('0') + // }) + // } + // ) + // } else if (title[0].innerText.includes('MPE_VALIDATIONS')) { + // setFilterWithValue('BASE_COL', 'ALERT_LIB', 'value', () => { + // cy.get('app-query', { withinSubject: null }) + // .should('not.exist') + // .get('.ht_master.handsontable tbody tr') + // .then((rowNodes) => { + // const tr = rowNodes[0] + + // expect(rowNodes).to.have.length(1) + // expect(tr.innerText).to.contain('ALERT_LIB') + // }) + // }) + // } + // }) + // }) + // }) + // } + // } + // ) + // }) + + this.afterEach(() => { + // cy.visit(`${hostUrl}/SASLogon/logout`) + }) +}) + +const removeAllColumns = () => { + cy.get('.configuration-wrapper clr-icon[shape="trash"]').then(removeNodes => { + for (let removeNode of removeNodes) { + removeNode.click() + } + }) +} + +const checkColumns = (columns: string[], callback: () => void) => { + cy.get('.viewboxes-container .viewbox', { withinSubject: null }).then( + (viewboxNodes: any) => { + for (let viewboxNode of viewboxNodes) { + cy.get(viewboxNode).within(() => { + cy.get('.ht_master.handsontable thead tr th').then( + (viewboxColNodes: any) => { + console.log('viewboxColNode', viewboxColNodes) + console.log('columns', columns) + for (let i = 0; i < viewboxColNodes.length; i++) { + const col = columns[i]|| '' + const colNode = viewboxColNodes[i] + + if ( + !colNode.innerHTML.toLowerCase().includes(col.toLowerCase()) + ) + return + } + + callback() + } + ) + }) + } + } + ) +} + +const closeViewboxModal = () => { + cy.get('app-viewboxes .close', { withinSubject: null }).click() +} + +const removeColumn = (column: string) => { + cy.get(`.col-box.column-${column} clr-icon`, { withinSubject: null }).click() +} + +const addColumns = (columns: string[], callback?: () => void) => { + for (let i = 0; i < columns.length; i++) { + const column = columns[i] + + cy.get('.cols-search input', { withinSubject: null }).type(column) + cy.get('.cols-search .autocomplete-wrapper', { withinSubject: null }) + .first() + .trigger('keydown', { key: 'ArrowDown' }) + cy.get('.cols-search .autocomplete-wrapper', { withinSubject: null }) + .first() + .trigger('keydown', { key: 'Enter' }) + .then(() => { + if (i === columns.length - 1 && callback) callback() + }) + } +} + +const openViewboxConfig = (viewbox_tablename: string) => { + cy.get('.open-viewbox').then((viewboxes: any) => { + for (let openViewbox of viewboxes) { + if (openViewbox.innerText.toLowerCase().includes(viewbox_tablename)) + openViewbox.click() + } + }) +} + +const openTableFromTree = (libNameIncludes: string, tablename: string) => { + cy.get('.app-loading', { timeout: longerCommandTimeout }) + .should('not.exist') + .then(() => { + cy.get('.nav-tree clr-tree > clr-tree-node', { + timeout: longerCommandTimeout + }).then((treeNodes: any) => { + let viyaLib + + for (let node of treeNodes) { + if (new RegExp(libNameIncludes).test(node.innerText.toLowerCase())) { + viyaLib = node + break + } + } + + cy.get(viyaLib).within(() => { + cy.get('.clr-tree-node-content-container p').click() + + cy.get('.clr-treenode-link').then((innerNodes: any) => { + for (let innerNode of innerNodes) { + if (innerNode.innerText.toLowerCase().includes(tablename)) { + innerNode.click() + break + } + } + }) + }) + }) + }) +} + +const setFilterWithValue = ( + variableValue: string, + valueString: string, + valueField: 'value' | 'time' | 'date' | 'datetime' | 'in' | 'between', + callback?: any +) => { + cy.wait(600) + + cy.focused().type(variableValue) + cy.wait(100) + // cy.focused().trigger('input') + cy.get('.variable-col .autocomplete-wrapper', { withinSubject: null }) + .first() + .trigger('keydown', { key: 'ArrowDown' }) + cy.get('.variable-col .autocomplete-wrapper', { + withinSubject: null + }).trigger('keydown', { key: 'Enter' }) + cy.focused().tab() + cy.wait(100) + + if (valueField === 'in') { + cy.focused().select(valueField.toUpperCase()).trigger('change') + } else if (valueField === 'between') { + cy.focused().select(valueField.toUpperCase()).trigger('change') + } else { + cy.focused().tab() + cy.wait(100) + } + + switch (valueField) { + case 'value': { + cy.focused().type(valueString) + + break + } + case 'time': { + cy.focused().type(valueString) + + break + } + case 'date': { + cy.focused().type(valueString) + cy.focused().tab() + + break + } + case 'datetime': { + const date = valueString.split(' ')[0] + const time = valueString.split(' ')[1] + + cy.focused().type(date) + cy.focused().tab() + cy.focused().tab() + cy.focused().type(time) + + break + } + case 'in': { + cy.get('.checkbox-vals').then(() => { + cy.focused().tab() + cy.focused().click() + cy.get('.no-values') + .should('not.exist') + .then(() => { + cy.get('clr-checkbox-wrapper input').then((inputs: any) => { + inputs[0].click() + cy.get('.in-values-modal .modal-footer button').click() + + cy.get('.modal-footer .btn-success-outline').click() + + if (callback) callback() + }) + }) + }) + + break + } + case 'between': { + cy.focused().tab() + + const start = valueString.split('-')[0] + const end = valueString.split('-')[1] + + cy.focused().type(start) + cy.focused().tab() + cy.focused().type(end) + } + default: { + break + } + } + + cy.wait(100) + cy.focused().tab() + cy.wait(100) + cy.focused().tab() + cy.wait(100) + cy.focused().tab() + cy.wait(100) + cy.focused().tab() + cy.wait(100) + cy.focused().click() + + if (callback) callback() +} + +const openTableFromViewboxTree = ( + libNameIncludes: string, + tablenames: string[] +) => { + cy.get('.add-new clr-tree > clr-tree-node', { + timeout: longerCommandTimeout + }).then((treeNodes: any) => { + let viyaLib + + for (let node of treeNodes) { + if (node.innerText.toLowerCase().includes(libNameIncludes)) { + viyaLib = node + break + } + } + + cy.get(viyaLib).within(() => { + cy.get('p') + .click() + .then(() => { + cy.get('.clr-treenode-link').then(async (innerNodes: any) => { + for (let innerNode of innerNodes) { + for (let tablename of tablenames) { + await pause(300) + if (innerNode.innerText.toLowerCase().includes(tablename)) { + innerNode.click() + } + } + } + }) + }) + }) + }) +} + +const pause = (ms: number) => { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve(null) + }, ms) + }) +} + +const visitPage = (url: string) => { + cy.visit(`${hostUrl}${appLocation}/#/${url}`) +} diff --git a/client/cypress/support/e2e.ts b/client/cypress/support/e2e.ts new file mode 100644 index 0000000..429872a --- /dev/null +++ b/client/cypress/support/e2e.ts @@ -0,0 +1,23 @@ +// *********************************************************** +// This example support/e2e.ts is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') + +import 'cypress-plugin-tab' +import "cypress-real-events" \ No newline at end of file diff --git a/client/package-lock.json b/client/package-lock.json index 1b6e005..f01a79f 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -62,7 +62,7 @@ "@angular-eslint/template-parser": "16.0.3", "@angular/cli": "^16.1.0", "@angular/compiler-cli": "^16.1.2", - "@cypress/webpack-preprocessor": "^5.11.1", + "@cypress/webpack-preprocessor": "^5.17.1", "@types/core-js": "^2.5.5", "@types/crypto-js": "^4.0.1", "@types/es6-shim": "^0.31.39", @@ -73,10 +73,10 @@ "@typescript-eslint/eslint-plugin": "^5.29.0", "@typescript-eslint/parser": "^5.29.0", "core-js": "^2.5.4", - "cypress": "^9.5.3", + "cypress": "12.17.1", "cypress-file-upload": "^5.0.8", "cypress-plugin-tab": "^1.0.5", - "cypress-real-events": "^1.7.6", + "cypress-real-events": "^1.8.1", "es6-shim": "^0.35.5", "eslint": "^8.33.0", "git-describe": "^4.0.4", @@ -123,12 +123,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1601.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.3.tgz", - "integrity": "sha512-HvW51cCEoIYe2mYqcmnm2RZiMMFbFn7iIdsjbCJe7etFhcG+Y3hGDZMh4IFSiQiss+pwPSYOvQY2zwGrndMgLw==", + "version": "0.1601.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.5.tgz", + "integrity": "sha512-f6oOXR+0gXdMl2papEkTt28GJJBsYtuuoHSQYM09UltkXPkj4bc9QEOzRXKQ0hDjNYYj3UT00E3CalBO/5uGTA==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.1.3", + "@angular-devkit/core": "16.1.5", "rxjs": "7.8.1" }, "engines": { @@ -138,17 +138,17 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.3.tgz", - "integrity": "sha512-1scrdUdKRa9TkJ9jev/KRzFttbLUVACQvVRL0G67nUAdtJ/bQX8eui85axpCNPFihK4ReSW3R4lrgcVC2NUSoA==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.5.tgz", + "integrity": "sha512-F78nvdDgVknqA9MekZ6xnmwKLH+qIQ5gBuP+/JnUiSZs1u1i8qS/GGNUL+T/Zsxk1HMRbG+erQ7N6nn1sBKMMw==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1601.3", - "@angular-devkit/build-webpack": "0.1601.3", - "@angular-devkit/core": "16.1.3", + "@angular-devkit/architect": "0.1601.5", + "@angular-devkit/build-webpack": "0.1601.5", + "@angular-devkit/core": "16.1.5", "@babel/core": "7.22.5", - "@babel/generator": "7.22.5", + "@babel/generator": "7.22.7", "@babel/helper-annotate-as-pure": "7.22.5", "@babel/helper-split-export-declaration": "7.22.5", "@babel/plugin-proposal-async-generator-functions": "7.20.7", @@ -158,7 +158,7 @@ "@babel/runtime": "7.22.5", "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.1.3", + "@ngtools/webpack": "16.1.5", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", @@ -266,12 +266,12 @@ "dev": true }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1601.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.3.tgz", - "integrity": "sha512-744+72vi/Vx010VxizGgilhpnDCOG29qyhMmu7BkUhtpq8E8eQn2HU3nPpxAqrg3bKVAwD7v3F111MVIhub8kA==", + "version": "0.1601.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.5.tgz", + "integrity": "sha512-Mc61mrSFFpplBMl11r8ryUrKRDf9Clugnpe8770JcoDe99xEsBFwUUMRS9xNqmVroCgdLMxFijgLSI1ANkUvMg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1601.3", + "@angular-devkit/architect": "0.1601.5", "rxjs": "7.8.1" }, "engines": { @@ -285,9 +285,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.3.tgz", - "integrity": "sha512-cFhNdJHumNMZGD3NYxOtNuMGRQXeDnKbwvK+IJmKAttXt8na6EvURR/ZxZOI7rl/YRVX+vcNSdtXz3hE6g+Isw==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.5.tgz", + "integrity": "sha512-0Mui2Nuib7kzOLWkz18v1OdxK6wd0SWdSFsAXavrRv03495vv+JUqVq0z0vGMtcbURkjOxIwdj3coj+Y0szkPQ==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -311,12 +311,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.3.tgz", - "integrity": "sha512-hWEuQnfQOgcSs4YX6iF4QR/34ROeSPaMi7lQOYg33hStg+pnk/JDdIU0f2nrIIz3t0jqAj+5VXVLBJvOCd84vg==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.5.tgz", + "integrity": "sha512-s6D/I0pfJJ7+XaAYyXh6IsS3Tya4WKeBuVcWWE7IK6TMEd5a1yDQ5O9RO2/G8UcxBwlKZmeuFbJkclpF6q3hYA==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.1.3", + "@angular-devkit/core": "16.1.5", "jsonc-parser": "3.2.0", "magic-string": "0.30.0", "ora": "5.4.1", @@ -427,9 +427,9 @@ } }, "node_modules/@angular/animations": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.3.tgz", - "integrity": "sha512-ET6ahrlbOyTYXOTouKs2VJxx0CMTrYkfz0HfI6IHnSKBC6wguDxXYnamMouHgrCkDDEB5qClfGHyS9se0AOX4w==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.6.tgz", + "integrity": "sha512-LsU3/qXom/tLB76Exvjz+7SkifwJ9QG/+gSjWj+DTVlj1+dO7awb8iWQi+YmTmqN7ijTJi9ye6is3iuJSYuCLw==", "dependencies": { "tslib": "^2.3.0" }, @@ -437,7 +437,7 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.3" + "@angular/core": "16.1.6" } }, "node_modules/@angular/cdk": { @@ -457,15 +457,15 @@ } }, "node_modules/@angular/cli": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.3.tgz", - "integrity": "sha512-D0gU12z/N2oJ+s6pggAnWYrTUZ+2duGb3Y5oUyClsubz7JWpAwHjSZpb8exPUrgYhr+qIEMGO685y1JazJQ2tA==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.5.tgz", + "integrity": "sha512-um9hWEU3HUMRnQnaDfw0QSNdDLbdLA9tSzp81kz3Rx2VFsSssCABq6xQ+7w09xCUx0jg88r1lBPc2pwV7Pu7FQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1601.3", - "@angular-devkit/core": "16.1.3", - "@angular-devkit/schematics": "16.1.3", - "@schematics/angular": "16.1.3", + "@angular-devkit/architect": "0.1601.5", + "@angular-devkit/core": "16.1.5", + "@angular-devkit/schematics": "16.1.5", + "@schematics/angular": "16.1.5", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", @@ -491,9 +491,9 @@ } }, "node_modules/@angular/common": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.3.tgz", - "integrity": "sha512-ZzJ6EwQHUkiZYV0zH/UxyUYW5uxomsyk7tdtqZIxAR5m2ktYkQ5XlqgPjBO8voF54Rs5Ot43RkPCLesbZyJDsw==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.6.tgz", + "integrity": "sha512-30Y8DGs+oosA+BcDZd1SuZ4HDT+DVZ6lVT4L+mBUH1BSkNna08FrbmrGQxO82CcxU6ZK0q1YLVkkb5cGx8y9ew==", "dependencies": { "tslib": "^2.3.0" }, @@ -501,14 +501,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.3", + "@angular/core": "16.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.3.tgz", - "integrity": "sha512-7Ckvssk9+s5xLyXvp72IwAw5vd/Osa3tR6oiQatdbw+O3XjLO04QycoGXwkp/fYVexGsjFyOn6QJ5n1F/PYPbQ==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.6.tgz", + "integrity": "sha512-BVDfKZLMb7mmLwdek+ZyzI43Zv0WNNNqnYpMeOI6egmkhtjNCxpQAy2YFKgNPse3bBGP8tKutwAtBB+Lqu/Kcw==", "dependencies": { "tslib": "^2.3.0" }, @@ -516,7 +516,7 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.3" + "@angular/core": "16.1.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -525,9 +525,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.3.tgz", - "integrity": "sha512-aUqnIV9rRTBNgiQRS0Gv6lhghaGj1vpVRyXgiE4VnTR9uBONSsGKMNALYBBhXRTSk2e0cvutt0ubLgmNpdyWyQ==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.6.tgz", + "integrity": "sha512-unWmH2CcuCkVuEr1fQuzlJtSGzRirsyg8cGQmRh16orx6N8oa/fCvxYRSOed/5aE9YiRpIFZ2TQWT2myY10/6Q==", "dev": true, "dependencies": { "@babel/core": "7.22.5", @@ -548,14 +548,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "16.1.3", + "@angular/compiler": "16.1.6", "typescript": ">=4.9.3 <5.2" } }, "node_modules/@angular/core": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.3.tgz", - "integrity": "sha512-yhRo9hVS8KhfcEgzciWuRWF4Pnnko98bmSJTqd7u8Kys6z3Uj0qgXMssXHIPUALe3mQKjVkdSZPLIZ9/CaVn/Q==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.6.tgz", + "integrity": "sha512-tUXvVLc+Vbl8Se7hajwyUTNmKD9uPq+SZH6x8sRM2n5azzjBZltOoJfzxK5JKAkiFf/KkQhteHkMBfoDLZ2tmw==", "dependencies": { "tslib": "^2.3.0" }, @@ -568,9 +568,9 @@ } }, "node_modules/@angular/forms": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.3.tgz", - "integrity": "sha512-9tJHgoi/Jmeo30zfnReVZWFcd1WthR+QwYUNwPev+ys58u1mB0cDGORvROySmC2YUyXFSpXt8sxwyWCkYvaV2w==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.6.tgz", + "integrity": "sha512-6MMQx3qCFrXyX4sSNvQRLRm6smGZshMjuWSCSkyEvvTYpZSA3F7h8ba762PDKYE3vMAON2OczCr8y9MyjBEruA==", "dependencies": { "tslib": "^2.3.0" }, @@ -578,16 +578,16 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.3", - "@angular/core": "16.1.3", - "@angular/platform-browser": "16.1.3", + "@angular/common": "16.1.6", + "@angular/core": "16.1.6", + "@angular/platform-browser": "16.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.3.tgz", - "integrity": "sha512-qZA6Lua2fpBe+KD/QArY/4hilypSZFcTcJsPjZwIzo5pavXqYDI8BVghwh5dcZoUa56hVRDJjv+XW6kl8m9Tdw==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.6.tgz", + "integrity": "sha512-qHwQpqhcWFAwroWwe7iiSsJrs38lrW82vHEm/sX/fcbUuLtqEDaNMf90KqzeSPIkFEkX5wwUZxdRwEh2bepf6g==", "dependencies": { "tslib": "^2.3.0" }, @@ -595,9 +595,9 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "16.1.3", - "@angular/common": "16.1.3", - "@angular/core": "16.1.3" + "@angular/animations": "16.1.6", + "@angular/common": "16.1.6", + "@angular/core": "16.1.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -606,9 +606,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.3.tgz", - "integrity": "sha512-UHxSWpPB5+FSv8zm8T+4ZikLqyy+VE6GlOLp/DdgEz77j81rz2C1pMqozwTnVbD16XbI4rhTp+RFY3C9ArWOtw==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.6.tgz", + "integrity": "sha512-NZ3bcXgWq9k0pJE7EvZsatvY8++5NzAtxCdV9IM+fqgzBzkSR4le0Iud4hdBSNQF1DOwwB8KdU7Xpe9q4YsdqA==", "dependencies": { "tslib": "^2.3.0" }, @@ -616,16 +616,16 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.3", - "@angular/compiler": "16.1.3", - "@angular/core": "16.1.3", - "@angular/platform-browser": "16.1.3" + "@angular/common": "16.1.6", + "@angular/compiler": "16.1.6", + "@angular/core": "16.1.6", + "@angular/platform-browser": "16.1.6" } }, "node_modules/@angular/router": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.3.tgz", - "integrity": "sha512-bkn8cWGBKKZidDaP+R7g/S/6miSfH8iP24d2k86Awo+vaO+7G/5WWGfKJMKK8UNM/A5ueX6ugAZrMHpQ9e6Y4w==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.6.tgz", + "integrity": "sha512-4+MniaDghKurV117URJZzCQBNCdMfiu6lRpTdcKWbHgGZqOQRG9N/gcHah5eLYVB0s6mfQ1OQ9HavNyjujF6Fg==", "dependencies": { "tslib": "^2.3.0" }, @@ -633,9 +633,9 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.3", - "@angular/core": "16.1.3", - "@angular/platform-browser": "16.1.3", + "@angular/common": "16.1.6", + "@angular/core": "16.1.6", + "@angular/platform-browser": "16.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -658,9 +658,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", - "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -697,18 +697,18 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", "dev": true, "dependencies": { "@babel/types": "^7.22.5", @@ -745,16 +745,16 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", - "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.6", + "@babel/compat-data": "^7.22.9", "@babel/helper-validator-option": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", "browserslist": "^4.21.9", - "lru-cache": "^5.1.1" + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -763,10 +763,19 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz", - "integrity": "sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -774,10 +783,10 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-member-expression-to-functions": "^7.22.5", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@nicolo-ribaudo/semver-v6": "^6.3.3" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -798,15 +807,24 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz", - "integrity": "sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", - "regexpu-core": "^5.3.1" + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -815,6 +833,15 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz", @@ -890,18 +917,30 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.5", "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { "@babel/types": "^7.22.5" }, "engines": { @@ -930,15 +969,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz", - "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-wrap-function": "^7.22.9" }, "engines": { "node": ">=6.9.0" @@ -948,20 +986,20 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", - "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { @@ -1028,14 +1066,13 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz", - "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", + "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", "@babel/types": "^7.22.5" }, "engines": { @@ -1071,9 +1108,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.6.tgz", - "integrity": "sha512-EIQu22vNkceq3LbjAq7knDf/UmtI2qbcNI8GRBlijez6TpQLvSodJPYfydQmNA5buwkxxxa/PVI44jjYZ+/cLw==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1411,9 +1448,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz", - "integrity": "sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", + "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -2061,9 +2098,9 @@ } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2303,9 +2340,9 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2360,18 +2397,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.6.tgz", - "integrity": "sha512-53CijMvKlLIDlOTrdWiHileRddlIiwUIyCKqYa7lYnnPldXCG5dUSN38uT0cA6i7rHWNKJLH0VU/Kxdr1GzB3w==", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", + "@babel/generator": "^7.22.7", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.6", + "@babel/parser": "^7.22.7", "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" @@ -2413,9 +2450,9 @@ "optional": true }, "node_modules/@cds/core": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/@cds/core/-/core-6.4.4.tgz", - "integrity": "sha512-DX02/KyCkECMvxuBeqrk/CmQGTynonQa9GDN8bK/Qje43esU4iYvoTfiuBSBGaNIQYv/0dFCY85QHcL68CCATg==", + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/@cds/core/-/core-6.4.5.tgz", + "integrity": "sha512-2wNT/fohyuGEBRa/Vw73z2GqYaNqiccLp5vaQPSdhfn0pX3kZ+q65KLQsbmzyoD+gjo05ydyrjkVRSrzjcxq1Q==", "dependencies": { "lit": "^2.1.3", "ramda": "^0.29.0", @@ -3369,9 +3406,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.3.tgz", - "integrity": "sha512-YTL1RzP7ErJqskx+ZwdC/nWsOSBfC4yYWmMyWL2J0d+oJ3N2XIzrKVoDcZ4IVzv3Du+3zoGp0ups/wWXvfzM/Q==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.5.tgz", + "integrity": "sha512-XQkanGAtB9S2EE14xa/04hPNYSkAzJOeaHJkirfqk/p40p8nA2pNsfLYCMd2N7K4kzqcET8UYAZ+wIpQxp12HA==", "dev": true, "engines": { "node": "^16.14.0 || >=18.10.0", @@ -3940,9 +3977,9 @@ } }, "node_modules/@sasjs/utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-3.3.0.tgz", - "integrity": "sha512-ZJ+c2d/rEoF340Ay3TZrXO4c2ain7AvSzkRuKG2H2qxwIlQQTk/9Rbknmy0mo3Y/QRScBYl0Fw5xSZ8SMHjljg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-3.4.0.tgz", + "integrity": "sha512-KHkuOcbwKdD9HrgwKYrMPPuKoFzOAEyNpUjHHhyefxRlrpLwTaf08nYQXFBUhqbWuS+hPRqFLozx45x+xExgyQ==", "hasInstallScript": true, "dependencies": { "@fast-csv/format": "4.3.5", @@ -4056,13 +4093,13 @@ } }, "node_modules/@schematics/angular": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.3.tgz", - "integrity": "sha512-bNSxCLf6f+/dsQ1k3PhcZhrC/qgJSCpM6h3m6ATpjR+tYW/v7WR1OyE5r3DQmDe7NJSazBvpbrRtg8xjRsMzvw==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.5.tgz", + "integrity": "sha512-GwSweqKGjMc9oqU6fukqYKlBflCCDA/l2qfA60YIdf4SubaZnIUpkpNXTbWeFRPJh8zQShb8OZE7cVj8MZRruw==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.1.3", - "@angular-devkit/schematics": "16.1.3", + "@angular-devkit/core": "16.1.5", + "@angular-devkit/schematics": "16.1.5", "jsonc-parser": "3.2.0" }, "engines": { @@ -4103,22 +4140,34 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true }, + "node_modules/@sigstore/bundle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.0.0.tgz", + "integrity": "sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", - "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.0.tgz", + "integrity": "sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@sigstore/tuf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.2.tgz", - "integrity": "sha512-vjwcYePJzM01Ha6oWWZ9gNcdIgnzyFxfqfWzph483DPJTH8Tb7f7bQRRll3CYVkyH56j0AgcPAcl6Vg95DPF+Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", + "@sigstore/protobuf-specs": "^0.2.0", "tuf-js": "^1.1.7" }, "engines": { @@ -4172,9 +4221,9 @@ } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.2.tgz", - "integrity": "sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -4303,9 +4352,9 @@ "dev": true }, "node_modules/@types/eslint": { - "version": "8.40.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.2.tgz", - "integrity": "sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", "dev": true, "dependencies": { "@types/estree": "*", @@ -4394,9 +4443,9 @@ "dev": true }, "node_modules/@types/lodash-es": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz", - "integrity": "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==", + "version": "4.17.8", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.8.tgz", + "integrity": "sha512-euY3XQcZmIzSy7YH5+Unb3b2X12Wtk54YWINBvvGQ5SmMvwb11JQskGsfkH/5HXK77Kr8GF0wkVDIxzAisWtog==", "dev": true, "dependencies": { "@types/lodash": "*" @@ -4540,15 +4589,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz", - "integrity": "sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.61.0", - "@typescript-eslint/type-utils": "5.61.0", - "@typescript-eslint/utils": "5.61.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.0", @@ -4574,13 +4623,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz", - "integrity": "sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.61.0", - "@typescript-eslint/utils": "5.61.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -4601,17 +4650,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz", - "integrity": "sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.61.0", - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/typescript-estree": "5.61.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -4649,14 +4698,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.61.0.tgz", - "integrity": "sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.61.0", - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/typescript-estree": "5.61.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { @@ -4676,13 +4725,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz", - "integrity": "sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/visitor-keys": "5.61.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4777,9 +4826,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz", - "integrity": "sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4790,13 +4839,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz", - "integrity": "sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/visitor-keys": "5.61.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4939,12 +4988,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz", - "integrity": "sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -6199,9 +6248,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001512", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz", - "integrity": "sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==", + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", "dev": true, "funding": [ { @@ -6498,9 +6547,9 @@ } }, "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true, "engines": { "node": ">= 6" @@ -6714,6 +6763,34 @@ "webpack": "^5.1.0" } }, + "node_modules/copy-webpack-plugin/node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -6727,14 +6804,14 @@ } }, "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.1.tgz", - "integrity": "sha512-DPCBxctI7dN4EeIqjW2KGqgdcUMbrhJ9AzON+PlxCtvppWhubTLD4+a0GFxiym14ZvacUydTPjLPc2DlKz7EIg==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" }, @@ -6766,12 +6843,12 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.0.tgz", - "integrity": "sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw==", + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", "dev": true, "dependencies": { - "browserslist": "^4.21.5" + "browserslist": "^4.21.9" }, "funding": { "type": "opencollective", @@ -7081,13 +7158,13 @@ "dev": true }, "node_modules/cypress": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.7.0.tgz", - "integrity": "sha512-+1EE1nuuuwIt/N1KXRR2iWHU+OiIt7H28jJDyyI4tiUftId/DrXYEwoDa5+kH2pki1zxnA0r6HrUGHV5eLbF5Q==", + "version": "12.17.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.17.1.tgz", + "integrity": "sha512-eKfBgO6t8waEyhegL4gxD7tcI6uTCGttu+ZU7y9Hq8BlpMztd7iLeIF4AJFAnbZH1xjX+wwgg4cRKFNSvv3VWQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "@cypress/request": "^2.88.10", + "@cypress/request": "^2.88.11", "@cypress/xvfb": "^1.2.4", "@types/node": "^14.14.31", "@types/sinonjs__fake-timers": "8.1.1", @@ -7101,12 +7178,12 @@ "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", - "commander": "^5.1.0", + "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", - "debug": "^4.3.2", + "debug": "^4.3.4", "enquirer": "^2.3.6", - "eventemitter2": "^6.4.3", + "eventemitter2": "6.4.7", "execa": "4.1.0", "executable": "^4.1.1", "extract-zip": "2.0.1", @@ -7119,12 +7196,12 @@ "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.6", + "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.3.2", + "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", @@ -7134,7 +7211,7 @@ "cypress": "bin/cypress" }, "engines": { - "node": ">=12.0.0" + "node": "^14.0.0 || ^16.0.0 || >=18.0.0" } }, "node_modules/cypress-file-upload": { @@ -7159,10 +7236,13 @@ } }, "node_modules/cypress-real-events": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/cypress-real-events/-/cypress-real-events-1.8.1.tgz", - "integrity": "sha512-8fFnA8EzS3EVbAmpSEUf3A8yZCmfU3IPOSGUDVFCdE1ke1gYL1A+gvXXV6HKUbTPRuvKKt2vpaMbUwYLpDRswQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/cypress-real-events/-/cypress-real-events-1.9.1.tgz", + "integrity": "sha512-eDYW6NagNs8+68ugyPbB6U1aIsYF0E0WHR6upXo0PbTXZNqBNc2s9Y0u/N+pbU9HpFh+krl6iMhoz/ENlYBdCg==", "dev": true, + "dependencies": { + "prettier": "^3.0.0" + }, "peerDependencies": { "cypress": "^4.x || ^5.x || ^6.x || ^7.x || ^8.x || ^9.x || ^10.x || ^11.x || ^12.x" } @@ -7497,15 +7577,15 @@ } }, "node_modules/deep-equal": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", - "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", + "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "is-arguments": "^1.1.1", "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", @@ -7808,9 +7888,9 @@ } }, "node_modules/dompurify": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", - "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==" + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz", + "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==" }, "node_modules/domutils": { "version": "3.1.0", @@ -7879,9 +7959,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.450", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.450.tgz", - "integrity": "sha512-BLG5HxSELlrMx7dJ2s+8SFlsCtJp37Zpk2VAxyC6CZtbc+9AJeZHfYHbrlSgdXp6saQ8StMqOTEDaBKgA7u1sw==", + "version": "1.4.467", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.467.tgz", + "integrity": "sha512-2qI70O+rR4poYeF2grcuS/bCps5KJh6y1jtZMDDEteyKJQrzLOEhFyXCLcHW6DTBjKjWkk26JhWoAi+Ux9A0fg==", "dev": true }, "node_modules/elliptic": { @@ -8173,9 +8253,9 @@ } }, "node_modules/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", @@ -8203,7 +8283,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -8215,7 +8294,6 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -8229,9 +8307,9 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -8479,9 +8557,9 @@ } }, "node_modules/espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { "acorn": "^8.9.0", @@ -8566,9 +8644,9 @@ "dev": true }, "node_modules/eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", "dev": true }, "node_modules/eventemitter3": { @@ -9432,9 +9510,9 @@ } }, "node_modules/git-describe/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "optional": true, "bin": { @@ -9442,16 +9520,16 @@ } }, "node_modules/glob": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.1.tgz", - "integrity": "sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.10.0" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/cjs/src/bin.js" @@ -9491,9 +9569,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.2.tgz", - "integrity": "sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -9604,9 +9682,9 @@ } }, "node_modules/handsontable/node_modules/core-js": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.0.tgz", - "integrity": "sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ==", + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz", + "integrity": "sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -10115,9 +10193,9 @@ } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.2.tgz", - "integrity": "sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -10143,9 +10221,9 @@ } }, "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", + "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==", "dev": true }, "node_modules/import-fresh": { @@ -10695,16 +10773,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -10836,9 +10910,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -11329,9 +11403,9 @@ } }, "node_modules/karma-coverage/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -11557,9 +11631,9 @@ } }, "node_modules/less/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "optional": true, "bin": { @@ -11620,9 +11694,9 @@ } }, "node_modules/license-checker/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -11682,9 +11756,9 @@ } }, "node_modules/lit": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.5.tgz", - "integrity": "sha512-i/cH7Ye6nBDUASMnfwcictBnsTN91+aBjXoTHF2xARghXScKxpD4F4WYI+VLXg9lqbMinDfvoI7VnZXjyHgdfQ==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.6.tgz", + "integrity": "sha512-1amFHA7t4VaaDe+vdQejSVBklwtH9svGoG6/dZi9JhxtJBBlqY5D1RV7iLUYY0trCqQc4NfhYYZilZiVHt7Hxg==", "dependencies": { "@lit/reactive-element": "^1.6.0", "lit-element": "^3.3.0", @@ -11702,9 +11776,9 @@ } }, "node_modules/lit-html": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.4.tgz", - "integrity": "sha512-/Jw+FBpeEN+z8X6PJva5n7+0MzCVAH2yypN99qHYYkq8bI+j7I39GH+68Z/MZD6rGKDK9RpzBw7CocfmHfq6+g==", + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.5.tgz", + "integrity": "sha512-YqUzpisJodwKIlbMFCtyrp58oLloKGnnPLMJ1t23cbfIJjg/H9pvLWK4XS69YeubK5HUs1UE4ys9w5dP1zg6IA==", "dependencies": { "@types/trusted-types": "^2.0.2" } @@ -12051,9 +12125,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -12101,9 +12175,9 @@ } }, "node_modules/marked": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.0.tgz", - "integrity": "sha512-z3/nBe7aTI8JDszlYLk7dDVNpngjw0o1ZJtrA9kIfkkHcIF+xH7mO23aISl4WxP83elU+MFROgahqdpd05lMEQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.1.tgz", + "integrity": "sha512-bTmmGdEINWmOMDjnPWDxGPQ4qkDLeYorpYbEtFOXzOruTwUE671q4Guiuchn4N8h/v6NGd7916kXsm3Iz4iUSg==", "bin": { "marked": "bin/marked.js" }, @@ -13018,9 +13092,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/nodejs": { @@ -14047,13 +14121,13 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.0.tgz", - "integrity": "sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -14322,6 +14396,21 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -14653,9 +14742,9 @@ } }, "node_modules/read-installed/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -15135,9 +15224,9 @@ } }, "node_modules/rollup": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.1.tgz", - "integrity": "sha512-I5gJCSpSMr3U9wv4D5YA8g7w7cj3eaSDeo7t+JcaFQOmoOUBgu4K9iMp8k3EZnwbJrjQxUMSKxMyB8qEQzzaSg==", + "version": "3.26.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz", + "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -15609,13 +15698,14 @@ "dev": true }, "node_modules/sigstore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.7.0.tgz", - "integrity": "sha512-KP7QULhWdlu3hlp+jw2EvgWKlOGOY9McLj/jrchLjHNlNPK0KWIwF919cbmOp6QiKXLmPijR2qH/5KYWlbtG9Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.8.0.tgz", + "integrity": "sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", - "@sigstore/tuf": "^1.0.1", + "@sigstore/bundle": "^1.0.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/tuf": "^1.0.3", "make-fetch-happen": "^11.0.1" }, "bin": { @@ -17662,17 +17752,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -17939,27 +18028,27 @@ } }, "@angular-devkit/architect": { - "version": "0.1601.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.3.tgz", - "integrity": "sha512-HvW51cCEoIYe2mYqcmnm2RZiMMFbFn7iIdsjbCJe7etFhcG+Y3hGDZMh4IFSiQiss+pwPSYOvQY2zwGrndMgLw==", + "version": "0.1601.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.5.tgz", + "integrity": "sha512-f6oOXR+0gXdMl2papEkTt28GJJBsYtuuoHSQYM09UltkXPkj4bc9QEOzRXKQ0hDjNYYj3UT00E3CalBO/5uGTA==", "dev": true, "requires": { - "@angular-devkit/core": "16.1.3", + "@angular-devkit/core": "16.1.5", "rxjs": "7.8.1" } }, "@angular-devkit/build-angular": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.3.tgz", - "integrity": "sha512-1scrdUdKRa9TkJ9jev/KRzFttbLUVACQvVRL0G67nUAdtJ/bQX8eui85axpCNPFihK4ReSW3R4lrgcVC2NUSoA==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.5.tgz", + "integrity": "sha512-F78nvdDgVknqA9MekZ6xnmwKLH+qIQ5gBuP+/JnUiSZs1u1i8qS/GGNUL+T/Zsxk1HMRbG+erQ7N6nn1sBKMMw==", "dev": true, "requires": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1601.3", - "@angular-devkit/build-webpack": "0.1601.3", - "@angular-devkit/core": "16.1.3", + "@angular-devkit/architect": "0.1601.5", + "@angular-devkit/build-webpack": "0.1601.5", + "@angular-devkit/core": "16.1.5", "@babel/core": "7.22.5", - "@babel/generator": "7.22.5", + "@babel/generator": "7.22.7", "@babel/helper-annotate-as-pure": "7.22.5", "@babel/helper-split-export-declaration": "7.22.5", "@babel/plugin-proposal-async-generator-functions": "7.20.7", @@ -17969,7 +18058,7 @@ "@babel/runtime": "7.22.5", "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.1.3", + "@ngtools/webpack": "16.1.5", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", @@ -18030,19 +18119,19 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1601.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.3.tgz", - "integrity": "sha512-744+72vi/Vx010VxizGgilhpnDCOG29qyhMmu7BkUhtpq8E8eQn2HU3nPpxAqrg3bKVAwD7v3F111MVIhub8kA==", + "version": "0.1601.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.5.tgz", + "integrity": "sha512-Mc61mrSFFpplBMl11r8ryUrKRDf9Clugnpe8770JcoDe99xEsBFwUUMRS9xNqmVroCgdLMxFijgLSI1ANkUvMg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1601.3", + "@angular-devkit/architect": "0.1601.5", "rxjs": "7.8.1" } }, "@angular-devkit/core": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.3.tgz", - "integrity": "sha512-cFhNdJHumNMZGD3NYxOtNuMGRQXeDnKbwvK+IJmKAttXt8na6EvURR/ZxZOI7rl/YRVX+vcNSdtXz3hE6g+Isw==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.5.tgz", + "integrity": "sha512-0Mui2Nuib7kzOLWkz18v1OdxK6wd0SWdSFsAXavrRv03495vv+JUqVq0z0vGMtcbURkjOxIwdj3coj+Y0szkPQ==", "dev": true, "requires": { "ajv": "8.12.0", @@ -18053,12 +18142,12 @@ } }, "@angular-devkit/schematics": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.3.tgz", - "integrity": "sha512-hWEuQnfQOgcSs4YX6iF4QR/34ROeSPaMi7lQOYg33hStg+pnk/JDdIU0f2nrIIz3t0jqAj+5VXVLBJvOCd84vg==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.5.tgz", + "integrity": "sha512-s6D/I0pfJJ7+XaAYyXh6IsS3Tya4WKeBuVcWWE7IK6TMEd5a1yDQ5O9RO2/G8UcxBwlKZmeuFbJkclpF6q3hYA==", "dev": true, "requires": { - "@angular-devkit/core": "16.1.3", + "@angular-devkit/core": "16.1.5", "jsonc-parser": "3.2.0", "magic-string": "0.30.0", "ora": "5.4.1", @@ -18141,9 +18230,9 @@ } }, "@angular/animations": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.3.tgz", - "integrity": "sha512-ET6ahrlbOyTYXOTouKs2VJxx0CMTrYkfz0HfI6IHnSKBC6wguDxXYnamMouHgrCkDDEB5qClfGHyS9se0AOX4w==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.6.tgz", + "integrity": "sha512-LsU3/qXom/tLB76Exvjz+7SkifwJ9QG/+gSjWj+DTVlj1+dO7awb8iWQi+YmTmqN7ijTJi9ye6is3iuJSYuCLw==", "requires": { "tslib": "^2.3.0" } @@ -18158,15 +18247,15 @@ } }, "@angular/cli": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.3.tgz", - "integrity": "sha512-D0gU12z/N2oJ+s6pggAnWYrTUZ+2duGb3Y5oUyClsubz7JWpAwHjSZpb8exPUrgYhr+qIEMGO685y1JazJQ2tA==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.5.tgz", + "integrity": "sha512-um9hWEU3HUMRnQnaDfw0QSNdDLbdLA9tSzp81kz3Rx2VFsSssCABq6xQ+7w09xCUx0jg88r1lBPc2pwV7Pu7FQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1601.3", - "@angular-devkit/core": "16.1.3", - "@angular-devkit/schematics": "16.1.3", - "@schematics/angular": "16.1.3", + "@angular-devkit/architect": "0.1601.5", + "@angular-devkit/core": "16.1.5", + "@angular-devkit/schematics": "16.1.5", + "@schematics/angular": "16.1.5", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", @@ -18184,25 +18273,25 @@ } }, "@angular/common": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.3.tgz", - "integrity": "sha512-ZzJ6EwQHUkiZYV0zH/UxyUYW5uxomsyk7tdtqZIxAR5m2ktYkQ5XlqgPjBO8voF54Rs5Ot43RkPCLesbZyJDsw==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.6.tgz", + "integrity": "sha512-30Y8DGs+oosA+BcDZd1SuZ4HDT+DVZ6lVT4L+mBUH1BSkNna08FrbmrGQxO82CcxU6ZK0q1YLVkkb5cGx8y9ew==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.3.tgz", - "integrity": "sha512-7Ckvssk9+s5xLyXvp72IwAw5vd/Osa3tR6oiQatdbw+O3XjLO04QycoGXwkp/fYVexGsjFyOn6QJ5n1F/PYPbQ==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.6.tgz", + "integrity": "sha512-BVDfKZLMb7mmLwdek+ZyzI43Zv0WNNNqnYpMeOI6egmkhtjNCxpQAy2YFKgNPse3bBGP8tKutwAtBB+Lqu/Kcw==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.3.tgz", - "integrity": "sha512-aUqnIV9rRTBNgiQRS0Gv6lhghaGj1vpVRyXgiE4VnTR9uBONSsGKMNALYBBhXRTSk2e0cvutt0ubLgmNpdyWyQ==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.6.tgz", + "integrity": "sha512-unWmH2CcuCkVuEr1fQuzlJtSGzRirsyg8cGQmRh16orx6N8oa/fCvxYRSOed/5aE9YiRpIFZ2TQWT2myY10/6Q==", "dev": true, "requires": { "@babel/core": "7.22.5", @@ -18216,41 +18305,41 @@ } }, "@angular/core": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.3.tgz", - "integrity": "sha512-yhRo9hVS8KhfcEgzciWuRWF4Pnnko98bmSJTqd7u8Kys6z3Uj0qgXMssXHIPUALe3mQKjVkdSZPLIZ9/CaVn/Q==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.6.tgz", + "integrity": "sha512-tUXvVLc+Vbl8Se7hajwyUTNmKD9uPq+SZH6x8sRM2n5azzjBZltOoJfzxK5JKAkiFf/KkQhteHkMBfoDLZ2tmw==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.3.tgz", - "integrity": "sha512-9tJHgoi/Jmeo30zfnReVZWFcd1WthR+QwYUNwPev+ys58u1mB0cDGORvROySmC2YUyXFSpXt8sxwyWCkYvaV2w==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.6.tgz", + "integrity": "sha512-6MMQx3qCFrXyX4sSNvQRLRm6smGZshMjuWSCSkyEvvTYpZSA3F7h8ba762PDKYE3vMAON2OczCr8y9MyjBEruA==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.3.tgz", - "integrity": "sha512-qZA6Lua2fpBe+KD/QArY/4hilypSZFcTcJsPjZwIzo5pavXqYDI8BVghwh5dcZoUa56hVRDJjv+XW6kl8m9Tdw==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.6.tgz", + "integrity": "sha512-qHwQpqhcWFAwroWwe7iiSsJrs38lrW82vHEm/sX/fcbUuLtqEDaNMf90KqzeSPIkFEkX5wwUZxdRwEh2bepf6g==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.3.tgz", - "integrity": "sha512-UHxSWpPB5+FSv8zm8T+4ZikLqyy+VE6GlOLp/DdgEz77j81rz2C1pMqozwTnVbD16XbI4rhTp+RFY3C9ArWOtw==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.6.tgz", + "integrity": "sha512-NZ3bcXgWq9k0pJE7EvZsatvY8++5NzAtxCdV9IM+fqgzBzkSR4le0Iud4hdBSNQF1DOwwB8KdU7Xpe9q4YsdqA==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.3.tgz", - "integrity": "sha512-bkn8cWGBKKZidDaP+R7g/S/6miSfH8iP24d2k86Awo+vaO+7G/5WWGfKJMKK8UNM/A5ueX6ugAZrMHpQ9e6Y4w==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.6.tgz", + "integrity": "sha512-4+MniaDghKurV117URJZzCQBNCdMfiu6lRpTdcKWbHgGZqOQRG9N/gcHah5eLYVB0s6mfQ1OQ9HavNyjujF6Fg==", "requires": { "tslib": "^2.3.0" } @@ -18271,9 +18360,9 @@ } }, "@babel/compat-data": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", - "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true }, "@babel/core": { @@ -18300,17 +18389,17 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", "dev": true, "requires": { "@babel/types": "^7.22.5", @@ -18338,22 +18427,30 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", - "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dev": true, "requires": { - "@babel/compat-data": "^7.22.6", + "@babel/compat-data": "^7.22.9", "@babel/helper-validator-option": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", "browserslist": "^4.21.9", - "lru-cache": "^5.1.1" + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz", - "integrity": "sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -18361,10 +18458,10 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-member-expression-to-functions": "^7.22.5", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@nicolo-ribaudo/semver-v6": "^6.3.3" + "semver": "^6.3.1" }, "dependencies": { "@babel/helper-split-export-declaration": { @@ -18375,18 +18472,32 @@ "requires": { "@babel/types": "^7.22.5" } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz", - "integrity": "sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", - "regexpu-core": "^5.3.1" + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, "@babel/helper-define-polyfill-provider": { @@ -18446,19 +18557,27 @@ } }, "@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.5", "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + } } }, "@babel/helper-optimise-call-expression": { @@ -18477,29 +18596,25 @@ "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz", - "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-wrap-function": "^7.22.9" } }, "@babel/helper-replace-supers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", - "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-optimise-call-expression": "^7.22.5" } }, "@babel/helper-simple-access": { @@ -18548,14 +18663,13 @@ "dev": true }, "@babel/helper-wrap-function": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz", - "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", + "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", "dev": true, "requires": { "@babel/helper-function-name": "^7.22.5", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", "@babel/types": "^7.22.5" } }, @@ -18582,9 +18696,9 @@ } }, "@babel/parser": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.6.tgz", - "integrity": "sha512-EIQu22vNkceq3LbjAq7knDf/UmtI2qbcNI8GRBlijez6TpQLvSodJPYfydQmNA5buwkxxxa/PVI44jjYZ+/cLw==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -18808,9 +18922,9 @@ } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz", - "integrity": "sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", + "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.5", @@ -19223,9 +19337,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -19404,9 +19518,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -19451,18 +19565,18 @@ } }, "@babel/traverse": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.6.tgz", - "integrity": "sha512-53CijMvKlLIDlOTrdWiHileRddlIiwUIyCKqYa7lYnnPldXCG5dUSN38uT0cA6i7rHWNKJLH0VU/Kxdr1GzB3w==", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", "dev": true, "requires": { "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", + "@babel/generator": "^7.22.7", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.6", + "@babel/parser": "^7.22.7", "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" @@ -19497,9 +19611,9 @@ "optional": true }, "@cds/core": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/@cds/core/-/core-6.4.4.tgz", - "integrity": "sha512-DX02/KyCkECMvxuBeqrk/CmQGTynonQa9GDN8bK/Qje43esU4iYvoTfiuBSBGaNIQYv/0dFCY85QHcL68CCATg==", + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/@cds/core/-/core-6.4.5.tgz", + "integrity": "sha512-2wNT/fohyuGEBRa/Vw73z2GqYaNqiccLp5vaQPSdhfn0pX3kZ+q65KLQsbmzyoD+gjo05ydyrjkVRSrzjcxq1Q==", "requires": { "@cds/city": "^1.1.0", "lit": "^2.1.3", @@ -20122,9 +20236,9 @@ } }, "@ngtools/webpack": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.3.tgz", - "integrity": "sha512-YTL1RzP7ErJqskx+ZwdC/nWsOSBfC4yYWmMyWL2J0d+oJ3N2XIzrKVoDcZ4IVzv3Du+3zoGp0ups/wWXvfzM/Q==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.5.tgz", + "integrity": "sha512-XQkanGAtB9S2EE14xa/04hPNYSkAzJOeaHJkirfqk/p40p8nA2pNsfLYCMd2N7K4kzqcET8UYAZ+wIpQxp12HA==", "dev": true }, "@nicolo-ribaudo/semver-v6": { @@ -20501,9 +20615,9 @@ } }, "@sasjs/utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-3.3.0.tgz", - "integrity": "sha512-ZJ+c2d/rEoF340Ay3TZrXO4c2ain7AvSzkRuKG2H2qxwIlQQTk/9Rbknmy0mo3Y/QRScBYl0Fw5xSZ8SMHjljg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-3.4.0.tgz", + "integrity": "sha512-KHkuOcbwKdD9HrgwKYrMPPuKoFzOAEyNpUjHHhyefxRlrpLwTaf08nYQXFBUhqbWuS+hPRqFLozx45x+xExgyQ==", "requires": { "@fast-csv/format": "4.3.5", "@types/fs-extra": "9.0.13", @@ -20589,13 +20703,13 @@ } }, "@schematics/angular": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.3.tgz", - "integrity": "sha512-bNSxCLf6f+/dsQ1k3PhcZhrC/qgJSCpM6h3m6ATpjR+tYW/v7WR1OyE5r3DQmDe7NJSazBvpbrRtg8xjRsMzvw==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.5.tgz", + "integrity": "sha512-GwSweqKGjMc9oqU6fukqYKlBflCCDA/l2qfA60YIdf4SubaZnIUpkpNXTbWeFRPJh8zQShb8OZE7cVj8MZRruw==", "dev": true, "requires": { - "@angular-devkit/core": "16.1.3", - "@angular-devkit/schematics": "16.1.3", + "@angular-devkit/core": "16.1.5", + "@angular-devkit/schematics": "16.1.5", "jsonc-parser": "3.2.0" } }, @@ -20625,19 +20739,28 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true }, + "@sigstore/bundle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.0.0.tgz", + "integrity": "sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==", + "dev": true, + "requires": { + "@sigstore/protobuf-specs": "^0.2.0" + } + }, "@sigstore/protobuf-specs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", - "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.0.tgz", + "integrity": "sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==", "dev": true }, "@sigstore/tuf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.2.tgz", - "integrity": "sha512-vjwcYePJzM01Ha6oWWZ9gNcdIgnzyFxfqfWzph483DPJTH8Tb7f7bQRRll3CYVkyH56j0AgcPAcl6Vg95DPF+Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", "dev": true, "requires": { - "@sigstore/protobuf-specs": "^0.1.0", + "@sigstore/protobuf-specs": "^0.2.0", "tuf-js": "^1.1.7" } }, @@ -20679,9 +20802,9 @@ } }, "minimatch": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.2.tgz", - "integrity": "sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -20806,9 +20929,9 @@ "dev": true }, "@types/eslint": { - "version": "8.40.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.2.tgz", - "integrity": "sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", "dev": true, "requires": { "@types/estree": "*", @@ -20897,9 +21020,9 @@ "dev": true }, "@types/lodash-es": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz", - "integrity": "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==", + "version": "4.17.8", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.8.tgz", + "integrity": "sha512-euY3XQcZmIzSy7YH5+Unb3b2X12Wtk54YWINBvvGQ5SmMvwb11JQskGsfkH/5HXK77Kr8GF0wkVDIxzAisWtog==", "dev": true, "requires": { "@types/lodash": "*" @@ -21043,15 +21166,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz", - "integrity": "sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.61.0", - "@typescript-eslint/type-utils": "5.61.0", - "@typescript-eslint/utils": "5.61.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.0", @@ -21061,29 +21184,29 @@ }, "dependencies": { "@typescript-eslint/type-utils": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz", - "integrity": "sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.61.0", - "@typescript-eslint/utils": "5.61.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/utils": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz", - "integrity": "sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.61.0", - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/typescript-estree": "5.61.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" } @@ -21107,25 +21230,25 @@ } }, "@typescript-eslint/parser": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.61.0.tgz", - "integrity": "sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.61.0", - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/typescript-estree": "5.61.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz", - "integrity": "sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/visitor-keys": "5.61.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" } }, "@typescript-eslint/type-utils": { @@ -21174,19 +21297,19 @@ } }, "@typescript-eslint/types": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz", - "integrity": "sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz", - "integrity": "sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/visitor-keys": "5.61.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -21270,12 +21393,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz", - "integrity": "sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -22259,9 +22382,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001512", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz", - "integrity": "sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==", + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", "dev": true }, "caseless": { @@ -22468,9 +22591,9 @@ } }, "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true }, "common-tags": { @@ -22645,6 +22768,30 @@ "serialize-javascript": "^6.0.0" }, "dependencies": { + "fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -22655,14 +22802,14 @@ } }, "globby": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.1.tgz", - "integrity": "sha512-DPCBxctI7dN4EeIqjW2KGqgdcUMbrhJ9AzON+PlxCtvppWhubTLD4+a0GFxiym14ZvacUydTPjLPc2DlKz7EIg==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "requires": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" } @@ -22682,12 +22829,12 @@ "dev": true }, "core-js-compat": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.0.tgz", - "integrity": "sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw==", + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", "dev": true, "requires": { - "browserslist": "^4.21.5" + "browserslist": "^4.21.9" } }, "core-util-is": { @@ -22935,12 +23082,12 @@ "dev": true }, "cypress": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.7.0.tgz", - "integrity": "sha512-+1EE1nuuuwIt/N1KXRR2iWHU+OiIt7H28jJDyyI4tiUftId/DrXYEwoDa5+kH2pki1zxnA0r6HrUGHV5eLbF5Q==", + "version": "12.17.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.17.1.tgz", + "integrity": "sha512-eKfBgO6t8waEyhegL4gxD7tcI6uTCGttu+ZU7y9Hq8BlpMztd7iLeIF4AJFAnbZH1xjX+wwgg4cRKFNSvv3VWQ==", "dev": true, "requires": { - "@cypress/request": "^2.88.10", + "@cypress/request": "^2.88.11", "@cypress/xvfb": "^1.2.4", "@types/node": "^14.14.31", "@types/sinonjs__fake-timers": "8.1.1", @@ -22954,12 +23101,12 @@ "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", - "commander": "^5.1.0", + "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", - "debug": "^4.3.2", + "debug": "^4.3.4", "enquirer": "^2.3.6", - "eventemitter2": "^6.4.3", + "eventemitter2": "6.4.7", "execa": "4.1.0", "executable": "^4.1.1", "extract-zip": "2.0.1", @@ -22972,12 +23119,12 @@ "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.6", + "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.3.2", + "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", @@ -23102,10 +23249,13 @@ } }, "cypress-real-events": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/cypress-real-events/-/cypress-real-events-1.8.1.tgz", - "integrity": "sha512-8fFnA8EzS3EVbAmpSEUf3A8yZCmfU3IPOSGUDVFCdE1ke1gYL1A+gvXXV6HKUbTPRuvKKt2vpaMbUwYLpDRswQ==", - "dev": true + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/cypress-real-events/-/cypress-real-events-1.9.1.tgz", + "integrity": "sha512-eDYW6NagNs8+68ugyPbB6U1aIsYF0E0WHR6upXo0PbTXZNqBNc2s9Y0u/N+pbU9HpFh+krl6iMhoz/ENlYBdCg==", + "dev": true, + "requires": { + "prettier": "^3.0.0" + } }, "d3-color": { "version": "3.1.0", @@ -23241,15 +23391,15 @@ "dev": true }, "deep-equal": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", - "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", + "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "is-arguments": "^1.1.1", "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", @@ -23486,9 +23636,9 @@ } }, "dompurify": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", - "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==" + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz", + "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==" }, "domutils": { "version": "3.1.0", @@ -23545,9 +23695,9 @@ } }, "electron-to-chromium": { - "version": "1.4.450", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.450.tgz", - "integrity": "sha512-BLG5HxSELlrMx7dJ2s+8SFlsCtJp37Zpk2VAxyC6CZtbc+9AJeZHfYHbrlSgdXp6saQ8StMqOTEDaBKgA7u1sw==", + "version": "1.4.467", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.467.tgz", + "integrity": "sha512-2qI70O+rR4poYeF2grcuS/bCps5KJh6y1jtZMDDEteyKJQrzLOEhFyXCLcHW6DTBjKjWkk26JhWoAi+Ux9A0fg==", "dev": true }, "elliptic": { @@ -23788,9 +23938,9 @@ "dev": true }, "eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", @@ -23818,7 +23968,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -23830,7 +23979,6 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { @@ -23986,9 +24134,9 @@ } }, "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -24002,9 +24150,9 @@ "dev": true }, "espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { "acorn": "^8.9.0", @@ -24061,9 +24209,9 @@ "dev": true }, "eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", "dev": true }, "eventemitter3": { @@ -24747,25 +24895,25 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "optional": true } } }, "glob": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.1.tgz", - "integrity": "sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, "requires": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.10.0" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" }, "dependencies": { "brace-expansion": { @@ -24778,9 +24926,9 @@ } }, "minimatch": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.2.tgz", - "integrity": "sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -24881,9 +25029,9 @@ }, "dependencies": { "core-js": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.0.tgz", - "integrity": "sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ==" + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz", + "integrity": "sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==" }, "numbro": { "version": "2.1.2", @@ -25272,9 +25420,9 @@ } }, "minimatch": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.2.tgz", - "integrity": "sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -25290,9 +25438,9 @@ "optional": true }, "immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", + "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==", "dev": true }, "import-fresh": { @@ -25675,16 +25823,12 @@ } }, "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" } }, "is-typedarray": { @@ -25780,9 +25924,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -26218,9 +26362,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -26326,9 +26470,9 @@ "optional": true }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "optional": true }, @@ -26388,9 +26532,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } @@ -26427,9 +26571,9 @@ } }, "lit": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.5.tgz", - "integrity": "sha512-i/cH7Ye6nBDUASMnfwcictBnsTN91+aBjXoTHF2xARghXScKxpD4F4WYI+VLXg9lqbMinDfvoI7VnZXjyHgdfQ==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.6.tgz", + "integrity": "sha512-1amFHA7t4VaaDe+vdQejSVBklwtH9svGoG6/dZi9JhxtJBBlqY5D1RV7iLUYY0trCqQc4NfhYYZilZiVHt7Hxg==", "requires": { "@lit/reactive-element": "^1.6.0", "lit-element": "^3.3.0", @@ -26447,9 +26591,9 @@ } }, "lit-html": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.4.tgz", - "integrity": "sha512-/Jw+FBpeEN+z8X6PJva5n7+0MzCVAH2yypN99qHYYkq8bI+j7I39GH+68Z/MZD6rGKDK9RpzBw7CocfmHfq6+g==", + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.5.tgz", + "integrity": "sha512-YqUzpisJodwKIlbMFCtyrp58oLloKGnnPLMJ1t23cbfIJjg/H9pvLWK4XS69YeubK5HUs1UE4ys9w5dP1zg6IA==", "requires": { "@types/trusted-types": "^2.0.2" } @@ -26725,9 +26869,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -26770,9 +26914,9 @@ } }, "marked": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.0.tgz", - "integrity": "sha512-z3/nBe7aTI8JDszlYLk7dDVNpngjw0o1ZJtrA9kIfkkHcIF+xH7mO23aISl4WxP83elU+MFROgahqdpd05lMEQ==" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.1.tgz", + "integrity": "sha512-bTmmGdEINWmOMDjnPWDxGPQ4qkDLeYorpYbEtFOXzOruTwUE671q4Guiuchn4N8h/v6NGd7916kXsm3Iz4iUSg==" }, "md5.js": { "version": "1.3.5", @@ -27472,9 +27616,9 @@ "dev": true }, "node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "nodejs": { @@ -28252,13 +28396,13 @@ "dev": true }, "path-scurry": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.0.tgz", - "integrity": "sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, "requires": { "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "dependencies": { "lru-cache": { @@ -28439,6 +28583,12 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "dev": true + }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -28708,9 +28858,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } @@ -29085,9 +29235,9 @@ } }, "rollup": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.1.tgz", - "integrity": "sha512-I5gJCSpSMr3U9wv4D5YA8g7w7cj3eaSDeo7t+JcaFQOmoOUBgu4K9iMp8k3EZnwbJrjQxUMSKxMyB8qEQzzaSg==", + "version": "3.26.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz", + "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -29434,13 +29584,14 @@ "dev": true }, "sigstore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.7.0.tgz", - "integrity": "sha512-KP7QULhWdlu3hlp+jw2EvgWKlOGOY9McLj/jrchLjHNlNPK0KWIwF919cbmOp6QiKXLmPijR2qH/5KYWlbtG9Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.8.0.tgz", + "integrity": "sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==", "dev": true, "requires": { - "@sigstore/protobuf-specs": "^0.1.0", - "@sigstore/tuf": "^1.0.1", + "@sigstore/bundle": "^1.0.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/tuf": "^1.0.3", "make-fetch-happen": "^11.0.1" } }, @@ -30926,17 +31077,16 @@ } }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" } }, "wide-align": { diff --git a/client/package.json b/client/package.json index 7005629..e1475c8 100644 --- a/client/package.json +++ b/client/package.json @@ -88,7 +88,7 @@ "@angular-eslint/template-parser": "16.0.3", "@angular/cli": "^16.1.0", "@angular/compiler-cli": "^16.1.2", - "@cypress/webpack-preprocessor": "^5.11.1", + "@cypress/webpack-preprocessor": "^5.17.1", "@types/core-js": "^2.5.5", "@types/crypto-js": "^4.0.1", "@types/es6-shim": "^0.31.39", @@ -99,10 +99,10 @@ "@typescript-eslint/eslint-plugin": "^5.29.0", "@typescript-eslint/parser": "^5.29.0", "core-js": "^2.5.4", - "cypress": "^9.5.3", + "cypress": "12.17.1", "cypress-file-upload": "^5.0.8", "cypress-plugin-tab": "^1.0.5", - "cypress-real-events": "^1.7.6", + "cypress-real-events": "^1.8.1", "es6-shim": "^0.35.5", "eslint": "^8.33.0", "git-describe": "^4.0.4", diff --git a/client/run-cypress-tests.sh b/client/run-cypress-tests.sh deleted file mode 100755 index 70e1f64..0000000 --- a/client/run-cypress-tests.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -npm run cy:run -- --browser chrome --spec "cypress/integration/liveness.tests.ts" -npm run cy:run -- --browser chrome --spec "cypress/integration/editor.tests.ts" -npm run cy:run -- --browser chrome --spec "cypress/integration/excel.tests.ts" -npm run cy:run -- --browser chrome --spec "cypress/integration/filtering.tests.ts" -npm run cy:run -- --browser chrome --spec "cypress/integration/licensing.tests.ts" \ No newline at end of file diff --git a/client/src/app/editor/editor.component.html b/client/src/app/editor/editor.component.html index 99bd66c..ba26faf 100644 --- a/client/src/app/editor/editor.component.html +++ b/client/src/app/editor/editor.component.html @@ -597,7 +597,7 @@ - +