diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index d09e532..c92a368 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -1,5 +1,5 @@ name: Build -run-name: Building and testing DC +run-name: Running Lint Check on: [pull_request] jobs: @@ -18,21 +18,4 @@ jobs: env: NPMRC: ${{ secrets.NPMRC}} - - run: apt-get update - - run: wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb - - run: apt install -y ./google-chrome*.deb; - - run: export CHROME_BIN=/usr/bin/google-chrome - - run: npm run lint:check - # Install dependencies~ - - run: npm ci - # Audit should fail and stop the CI if critical vulnerability found - - run: npm audit --audit-level=critical - - run: | - cd ./sas - npm audit --audit-level=critical - - run: | - cd ./client - npm audit --audit-level=critical - npm test -- --no-watch --no-progress --browsers=ChromeHeadlessCI - npm run postinstall - npm run build \ No newline at end of file + - run: npm run lint:check \ No newline at end of file diff --git a/.gitea/workflows/development-test.yaml b/.gitea/workflows/development-test.yaml index 088e569..05dcd58 100644 --- a/.gitea/workflows/development-test.yaml +++ b/.gitea/workflows/development-test.yaml @@ -6,6 +6,53 @@ on: - development jobs: + Build-production-and-ng-test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Write .npmrc file + run: | + touch client/.npmrc + echo '${{ secrets.NPMRC}}' > client/.npmrc + + - name: Install Chrome for Angular tests + run: apt-get update + run: wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb + run: apt install -y ./google-chrome*.deb; + run: export CHROME_BIN=/usr/bin/google-chrome + + - name: Write cypress credentials + run: echo "$CYPRESS_CREDS" > ./client/cypress.env.json + shell: bash + env: + CYPRESS_CREDS: ${{ secrets.CYPRESS_CREDS }} + + - name: Install dependencies + run: npm ci + + - name: Check audit + # Audit should fail and stop the CI if critical vulnerability found + run: | + npm audit --audit-level=critical + cd ./sas + npm audit --audit-level=critical + cd ./client + npm audit --audit-level=critical + + - name: Angular Tests + run: | + npm test -- --no-watch --no-progress --browsers=ChromeHeadlessCI + + - name: Angular Production Build + run: | + npm run postinstall + npm run build + Build-and-test-development: runs-on: ubuntu-latest @@ -34,7 +81,9 @@ jobs: env: CYPRESS_CREDS: ${{ secrets.CYPRESS_CREDS }} - - run: npm ci + - name: Install dependencies + run: npm ci + # Install pm2 and prepare SASJS server - run: npm i -g pm2 - run: curl -L https://github.com/sasjs/server/releases/latest/download/linux.zip > linux.zip @@ -77,6 +126,17 @@ jobs: # Start frontend and run cypress 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" + - name: Zip Cypress videos + if: always() + run: | + zip -r cypress-videos ./client/cypress/videos + + - name: Cypress videos artifacts + uses: actions/upload-artifact@v3 + with: + name: cypress-videos.zip + path: cypress-videos.zip + Build-and-test-development-latest-adapter: runs-on: ubuntu-latest @@ -106,7 +166,9 @@ jobs: env: CYPRESS_CREDS: ${{ secrets.CYPRESS_CREDS }} - - run: npm ci + - name: Install dependencies + run: npm ci + # Install pm2 and prepare SASJS server - run: npm i -g pm2 - run: curl -L https://github.com/sasjs/server/releases/latest/download/linux.zip > linux.zip @@ -125,7 +187,6 @@ jobs: npm install -g @sasjs/cli npm install -g replace-in-files-cli 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: Install ZIP run: | @@ -148,4 +209,15 @@ jobs: replace-in-files --regex='"hosturl".*' --replacement='hosturl:"http://localhost:4200",' ./cypress.config.ts cat ./cypress.config.ts # Start frontend and run cypress - 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 + 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" + + - name: Zip Cypress videos + if: always() + run: | + zip -r cypress-videos ./client/cypress/videos + + - name: Cypress videos artifacts + uses: actions/upload-artifact@v3 + with: + name: cypress-videos-latest-adapter.zip + path: cypress-videos.zip \ No newline at end of file diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml index 0678f4a..f6eb055 100644 --- a/.gitea/workflows/release.yaml +++ b/.gitea/workflows/release.yaml @@ -22,32 +22,30 @@ jobs: env: NPMRC: ${{ secrets.NPMRC}} - - name: Install ZIP and SASjs CLI + - name: Install packages run: | apt-get update apt-get install zip -y + # sasjs cli is used to compile & build the SAS services npm i -g @sasjs/cli - # test - - - name: Install JQ for parsing JSON - run: | - apt-get update + # jq is used to parse the release JSON apt-get install jq -y - - name: Install Semantic Release and plugins and create Release + - name: Create Empty Release (assets are posted later) run: | npm i npm i -g semantic-release GITEA_TOKEN=${{ secrets.RELEASE_TOKEN }} GITEA_URL=https://git.datacontroller.io semantic-release - name: Frontend Build + description: Must be created AFTER the release as the version (git tag) is used in the interface run: | cd client npm ci npm run build - name: Build SAS9 EBI Release - description: compile SAS 9 services, remove tests & create deployment program + description: Compile SAS 9 services, remove tests & create deployment program run: | cd sas npm ci @@ -64,7 +62,7 @@ jobs: cp sasjsbuild/mysas9deploy.sas ./sas9.sas - name: Build SASjs Server Release - description: compile Base (SASjs) services, remove tests & create deployment JSON + description: Compile Base (SASjs) services, remove tests & create deployment JSON run: | cd sas cp sasjs/utils/favicon.ico ../client/dist/favicon.ico @@ -99,11 +97,15 @@ jobs: run: | cd client npm run typedoc - # deploy docs + surfer put --token ${{ secrets.TSDOC_TOKEN }} --server tsdoc.datacontroller.io ../tsdoc / - name: Upload assets to release run: | RELEASE_ID=`curl -k 'https://git.datacontroller.io/api/v1/repos/dc/dc/releases/latest?access_token=${{ secrets.RELEASE_TOKEN }}' | jq -r '.id'` + RELEASE_BODY=`curl -k 'https://git.datacontroller.io/api/v1/repos/dc/dc/releases/latest?access_token=${{ secrets.RELEASE_TOKEN }}' | jq -r '.body'` + # Update body + curl --data '{"draft": true,"body":"'"$RELEASE_BODY\n\nFor installation instructions, please visit https://docs.datacontroller.io/"'"}' -X PATCH --header 'Content-Type: application/json' -k https://git.datacontroller.io/api/v1/repos/dc/dc/releases/$RELEASE_ID?access_token=${{ secrets.RELEASE_TOKEN }} + # Upload assets URL="https://git.datacontroller.io/api/v1/repos/dc/dc/releases/$RELEASE_ID/assets?access_token=${{ secrets.RELEASE_TOKEN }}" curl -k $URL -F attachment=@frontend.zip curl -k $URL -F attachment=@sas/demostream_sas9.sas diff --git a/client/package-lock.json b/client/package-lock.json index f01a79f..d0708af 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -43,7 +43,6 @@ "ngx-clipboard": "^16.0.0", "ngx-json-viewer": "file:libraries/ngx-json-viewer-3.2.1.tgz", "nodejs": "0.0.0", - "numbro": "^2.1.1", "os-browserify": "0.3.0", "rxjs": "^7.8.0", "save-svg-as-png": "^1.4.17", @@ -123,12 +122,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1601.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.5.tgz", - "integrity": "sha512-f6oOXR+0gXdMl2papEkTt28GJJBsYtuuoHSQYM09UltkXPkj4bc9QEOzRXKQ0hDjNYYj3UT00E3CalBO/5uGTA==", + "version": "0.1601.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.6.tgz", + "integrity": "sha512-dY+/FNUNrOj+m4iG5/v8N0PfbDmjkjjoy/YkquRHS1yo7fGGDFNqji2552mbtjN6/LwyWDhOO7fxdqppadjnvA==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.1.5", + "@angular-devkit/core": "16.1.6", "rxjs": "7.8.1" }, "engines": { @@ -138,15 +137,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "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==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.6.tgz", + "integrity": "sha512-IEC1tApX8/Qa/RIVmbj0nYbOQ5WGcrkGNJ7D42q4DkIo74XKPzxDRruJE1RCjdZsj8lf4CCCZgSOPBsEI8Zbdw==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1601.5", - "@angular-devkit/build-webpack": "0.1601.5", - "@angular-devkit/core": "16.1.5", + "@angular-devkit/architect": "0.1601.6", + "@angular-devkit/build-webpack": "0.1601.6", + "@angular-devkit/core": "16.1.6", "@babel/core": "7.22.5", "@babel/generator": "7.22.7", "@babel/helper-annotate-as-pure": "7.22.5", @@ -158,7 +157,7 @@ "@babel/runtime": "7.22.5", "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.1.5", + "@ngtools/webpack": "16.1.6", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", @@ -266,12 +265,12 @@ "dev": true }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1601.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.5.tgz", - "integrity": "sha512-Mc61mrSFFpplBMl11r8ryUrKRDf9Clugnpe8770JcoDe99xEsBFwUUMRS9xNqmVroCgdLMxFijgLSI1ANkUvMg==", + "version": "0.1601.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.6.tgz", + "integrity": "sha512-Uz/GjnhgAqSDPxrO4HP/tHNGPPZU3tEShtAVKyAypBl20bh2Aw1L5D+lCZi/Uq3Sh2JTPD9/M0ei2u9CMLhLDw==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1601.5", + "@angular-devkit/architect": "0.1601.6", "rxjs": "7.8.1" }, "engines": { @@ -285,9 +284,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "16.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.5.tgz", - "integrity": "sha512-0Mui2Nuib7kzOLWkz18v1OdxK6wd0SWdSFsAXavrRv03495vv+JUqVq0z0vGMtcbURkjOxIwdj3coj+Y0szkPQ==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.6.tgz", + "integrity": "sha512-3OjtrPWvsqVkMBwqPeE65ccCIw56FooNpVVAJ0XwhVQv5mA81pmbCzU7JsR6U449ZT7O4cQblzZMQvWvx74HCg==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -311,12 +310,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "16.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.5.tgz", - "integrity": "sha512-s6D/I0pfJJ7+XaAYyXh6IsS3Tya4WKeBuVcWWE7IK6TMEd5a1yDQ5O9RO2/G8UcxBwlKZmeuFbJkclpF6q3hYA==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.6.tgz", + "integrity": "sha512-KA8P78gaS76HMHGBOM8JHJXWLOxCIShYVB2Un/Cu6z3jVODvXq+ILZUc1Y0RsAce/vsl2wf8qpoh5Lku9KJHUQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.1.5", + "@angular-devkit/core": "16.1.6", "jsonc-parser": "3.2.0", "magic-string": "0.30.0", "ora": "5.4.1", @@ -427,9 +426,9 @@ } }, "node_modules/@angular/animations": { - "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==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.7.tgz", + "integrity": "sha512-+fMLwUlHLNsHWzX2cnsr4sMyix0R5v/a5srQTQjl6BYhdyqFgT82h5F4P49yFu+nZr0jdsxF012wPJbDRR+1qQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -437,7 +436,7 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.6" + "@angular/core": "16.1.7" } }, "node_modules/@angular/cdk": { @@ -457,15 +456,15 @@ } }, "node_modules/@angular/cli": { - "version": "16.1.5", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.5.tgz", - "integrity": "sha512-um9hWEU3HUMRnQnaDfw0QSNdDLbdLA9tSzp81kz3Rx2VFsSssCABq6xQ+7w09xCUx0jg88r1lBPc2pwV7Pu7FQ==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.6.tgz", + "integrity": "sha512-yXVgUKMXxlAHkhc6xk3ljR7TXpMLBykyu8do+ooSP08VKEQnWjTdVgrcOHd0n5w9YHXUQgBSmjDKxtQaBmvyZQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1601.5", - "@angular-devkit/core": "16.1.5", - "@angular-devkit/schematics": "16.1.5", - "@schematics/angular": "16.1.5", + "@angular-devkit/architect": "0.1601.6", + "@angular-devkit/core": "16.1.6", + "@angular-devkit/schematics": "16.1.6", + "@schematics/angular": "16.1.6", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", @@ -491,9 +490,9 @@ } }, "node_modules/@angular/common": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.6.tgz", - "integrity": "sha512-30Y8DGs+oosA+BcDZd1SuZ4HDT+DVZ6lVT4L+mBUH1BSkNna08FrbmrGQxO82CcxU6ZK0q1YLVkkb5cGx8y9ew==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.7.tgz", + "integrity": "sha512-7WwYwtJjuJtUkutB+aMCvtV5zxa43T4x+kqT+kS4KnUmLv5KdrGPxcS+/7YUuKEELWp1SG032UTwGPX0DXxH4g==", "dependencies": { "tslib": "^2.3.0" }, @@ -501,14 +500,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.6", + "@angular/core": "16.1.7", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.6.tgz", - "integrity": "sha512-BVDfKZLMb7mmLwdek+ZyzI43Zv0WNNNqnYpMeOI6egmkhtjNCxpQAy2YFKgNPse3bBGP8tKutwAtBB+Lqu/Kcw==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.7.tgz", + "integrity": "sha512-93nbMFPSpKNfUyuRvEQxPdYLU6g25oZ4Gp7ewzNLyDHIbTQv6FwsthHfgPigPJJUUyKak6Gr3koFsgk7Dl3LAA==", "dependencies": { "tslib": "^2.3.0" }, @@ -516,7 +515,7 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.6" + "@angular/core": "16.1.7" }, "peerDependenciesMeta": { "@angular/core": { @@ -525,9 +524,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.6.tgz", - "integrity": "sha512-unWmH2CcuCkVuEr1fQuzlJtSGzRirsyg8cGQmRh16orx6N8oa/fCvxYRSOed/5aE9YiRpIFZ2TQWT2myY10/6Q==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.7.tgz", + "integrity": "sha512-6iuogfVrbCh6o4hWbNCClsLQdLtlXiaNc72LGz5LMXI0TOwKVlRXhbzhiQeLS0/nsYIdHFbgyr1aepI2wQA3mQ==", "dev": true, "dependencies": { "@babel/core": "7.22.5", @@ -548,14 +547,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "16.1.6", + "@angular/compiler": "16.1.7", "typescript": ">=4.9.3 <5.2" } }, "node_modules/@angular/core": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.6.tgz", - "integrity": "sha512-tUXvVLc+Vbl8Se7hajwyUTNmKD9uPq+SZH6x8sRM2n5azzjBZltOoJfzxK5JKAkiFf/KkQhteHkMBfoDLZ2tmw==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.7.tgz", + "integrity": "sha512-Wl5BR9X1xnV7Z9v/MNVANhymuTKAuRv4etr4rRgaC5NbbJSuFM4y+mg4yVI4wmrYJo0gKRcV9+2mHaePr41fTg==", "dependencies": { "tslib": "^2.3.0" }, @@ -568,9 +567,9 @@ } }, "node_modules/@angular/forms": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.6.tgz", - "integrity": "sha512-6MMQx3qCFrXyX4sSNvQRLRm6smGZshMjuWSCSkyEvvTYpZSA3F7h8ba762PDKYE3vMAON2OczCr8y9MyjBEruA==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.7.tgz", + "integrity": "sha512-AZ6oCIAS2JwH7rJiTOj2uKl1eykiDP98y0trgQ/42+zzpOQZyZAjXrtdqHkVUXMc1PFf5NmYioz19Muj1p+Ttg==", "dependencies": { "tslib": "^2.3.0" }, @@ -578,16 +577,16 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.6", - "@angular/core": "16.1.6", - "@angular/platform-browser": "16.1.6", + "@angular/common": "16.1.7", + "@angular/core": "16.1.7", + "@angular/platform-browser": "16.1.7", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.6.tgz", - "integrity": "sha512-qHwQpqhcWFAwroWwe7iiSsJrs38lrW82vHEm/sX/fcbUuLtqEDaNMf90KqzeSPIkFEkX5wwUZxdRwEh2bepf6g==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.7.tgz", + "integrity": "sha512-AjdUUv5+v50cclHPsKVVdNRdCQZJMGNKmvxyLgeGj2hs61lGoJxBYcYqPre2PpM0SvezNJBreUvjwqM3ttOjng==", "dependencies": { "tslib": "^2.3.0" }, @@ -595,9 +594,9 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "16.1.6", - "@angular/common": "16.1.6", - "@angular/core": "16.1.6" + "@angular/animations": "16.1.7", + "@angular/common": "16.1.7", + "@angular/core": "16.1.7" }, "peerDependenciesMeta": { "@angular/animations": { @@ -606,9 +605,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "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==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.7.tgz", + "integrity": "sha512-xoT4wDl7Kurg2N5gcLNmkvqYx14xnYwa2Zm1ZIOM7kYMRXiAg1+XBzaxFXog0fCCs/lqUKUwaNn32YpLKwMNaw==", "dependencies": { "tslib": "^2.3.0" }, @@ -616,16 +615,16 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.6", - "@angular/compiler": "16.1.6", - "@angular/core": "16.1.6", - "@angular/platform-browser": "16.1.6" + "@angular/common": "16.1.7", + "@angular/compiler": "16.1.7", + "@angular/core": "16.1.7", + "@angular/platform-browser": "16.1.7" } }, "node_modules/@angular/router": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.6.tgz", - "integrity": "sha512-4+MniaDghKurV117URJZzCQBNCdMfiu6lRpTdcKWbHgGZqOQRG9N/gcHah5eLYVB0s6mfQ1OQ9HavNyjujF6Fg==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.7.tgz", + "integrity": "sha512-nzjuAEAXLktA3puvSae54noAHEiuizNTvaOpuvQYHfvZF27QMW28XlC33+vDhckWjSD02K7Fb2+AELkOJhUM5Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -633,9 +632,9 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.6", - "@angular/core": "16.1.6", - "@angular/platform-browser": "16.1.6", + "@angular/common": "16.1.7", + "@angular/core": "16.1.7", + "@angular/platform-browser": "16.1.7", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -843,9 +842,9 @@ } }, "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", - "integrity": "sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -855,7 +854,7 @@ "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { @@ -2349,9 +2348,9 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -2361,7 +2360,7 @@ "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/regjsgen": { @@ -2450,9 +2449,9 @@ "optional": true }, "node_modules/@cds/core": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@cds/core/-/core-6.4.5.tgz", - "integrity": "sha512-2wNT/fohyuGEBRa/Vw73z2GqYaNqiccLp5vaQPSdhfn0pX3kZ+q65KLQsbmzyoD+gjo05ydyrjkVRSrzjcxq1Q==", + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/@cds/core/-/core-6.4.6.tgz", + "integrity": "sha512-KQzyxWsJHwZNMOlb9unoxDrGgFETqcew/fV4zmQm1JkyQBmZLPhzIHXFzfFHpQJDjpXiU8htU72Ko0aZ2F9bBg==", "dependencies": { "lit": "^2.1.3", "ramda": "^0.29.0", @@ -2968,9 +2967,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -3089,9 +3088,9 @@ } }, "node_modules/@fast-csv/format/node_modules/@types/node": { - "version": "14.18.53", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.53.tgz", - "integrity": "sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A==" + "version": "14.18.54", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.54.tgz", + "integrity": "sha512-uq7O52wvo2Lggsx1x21tKZgqkJpvwCseBBPtX/nKQfpVlEsLOb11zZ1CRsWUKvJF0+lzuA9jwvA7Pr2Wt7i3xw==" }, "node_modules/@handsontable/angular": { "version": "13.0.0", @@ -3406,9 +3405,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "16.1.5", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.5.tgz", - "integrity": "sha512-XQkanGAtB9S2EE14xa/04hPNYSkAzJOeaHJkirfqk/p40p8nA2pNsfLYCMd2N7K4kzqcET8UYAZ+wIpQxp12HA==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.6.tgz", + "integrity": "sha512-rDE1bV3+Ys/VyeD6l7JKtbs3+bTQAfWhi7meEuq5mkaJHOERu6Z40ce866faAIX2I1AVpsSv8rLlb7kB7t7kzw==", "dev": true, "engines": { "node": "^16.14.0 || >=18.10.0", @@ -3421,15 +3420,6 @@ "webpack": "^5.54.0" } }, - "node_modules/@nicolo-ribaudo/semver-v6": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", - "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4093,13 +4083,13 @@ } }, "node_modules/@schematics/angular": { - "version": "16.1.5", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.5.tgz", - "integrity": "sha512-GwSweqKGjMc9oqU6fukqYKlBflCCDA/l2qfA60YIdf4SubaZnIUpkpNXTbWeFRPJh8zQShb8OZE7cVj8MZRruw==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.6.tgz", + "integrity": "sha512-BxghkeLfnMgV0D4DZDcbfPpox/Orw1ismSVGoQMIV/Daj2pqfSK+n97NAu0r0EsQyR5agPxOX9khVft+otODhg==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.1.5", - "@angular-devkit/schematics": "16.1.5", + "@angular-devkit/core": "16.1.6", + "@angular-devkit/schematics": "16.1.6", "jsonc-parser": "3.2.0" }, "engines": { @@ -4352,9 +4342,9 @@ "dev": true }, "node_modules/@types/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.1.tgz", + "integrity": "sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg==", "dev": true, "dependencies": { "@types/estree": "*", @@ -4437,9 +4427,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.195", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", - "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", + "version": "4.14.196", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.196.tgz", + "integrity": "sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==", "dev": true }, "node_modules/@types/lodash-es": { @@ -5429,9 +5419,9 @@ } }, "node_modules/ansi-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", "dev": true }, "node_modules/ansi-styles": { @@ -5760,42 +5750,51 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz", - "integrity": "sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.1", - "@nicolo-ribaudo/semver-v6": "^6.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/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-plugin-polyfill-corejs3": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz", - "integrity": "sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.1", + "@babel/helper-define-polyfill-provider": "^0.4.2", "core-js-compat": "^3.31.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz", - "integrity": "sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.1" + "@babel/helper-define-polyfill-provider": "^0.4.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/balanced-match": { @@ -6208,9 +6207,9 @@ } }, "node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", "dev": true, "engines": { "node": ">=6" @@ -6764,9 +6763,9 @@ } }, "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==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6843,9 +6842,9 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.31.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", - "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", + "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", "dev": true, "dependencies": { "browserslist": "^4.21.9" @@ -7248,9 +7247,9 @@ } }, "node_modules/cypress/node_modules/@types/node": { - "version": "14.18.53", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.53.tgz", - "integrity": "sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A==", + "version": "14.18.54", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.54.tgz", + "integrity": "sha512-uq7O52wvo2Lggsx1x21tKZgqkJpvwCseBBPtX/nKQfpVlEsLOb11zZ1CRsWUKvJF0+lzuA9jwvA7Pr2Wt7i3xw==", "dev": true }, "node_modules/cypress/node_modules/ansi-styles": { @@ -7959,9 +7958,9 @@ } }, "node_modules/electron-to-chromium": { - "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==", + "version": "1.4.475", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.475.tgz", + "integrity": "sha512-mTye5u5P98kSJO2n7zYALhpJDmoSQejIGya0iR01GpoRady8eK3bw7YHHnjA1Rfi4ZSLdpuzlAC7Zw+1Zu7Z6A==", "dev": true }, "node_modules/elliptic": { @@ -8082,12 +8081,13 @@ } }, "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, "dependencies": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8.6" @@ -9682,26 +9682,15 @@ } }, "node_modules/handsontable/node_modules/core-js": { - "version": "3.31.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz", - "integrity": "sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", + "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==", "hasInstallScript": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/handsontable/node_modules/numbro": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/numbro/-/numbro-2.1.2.tgz", - "integrity": "sha512-7w833BxZmKGLE9HI0aREtNVRVH6WTYUUlWf4qgA5gKNhPQ4F/MRZ14sc0v8eoLORprk9ZTVwYaLwj8N3Zgxwiw==", - "dependencies": { - "bignumber.js": "^8.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -10919,17 +10908,17 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-report/node_modules/has-flag": { @@ -10941,6 +10930,21 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -10977,9 +10981,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -10990,9 +10994,9 @@ } }, "node_modules/jackspeak": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", - "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.2.tgz", + "integrity": "sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -12175,14 +12179,14 @@ } }, "node_modules/marked": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.1.tgz", - "integrity": "sha512-bTmmGdEINWmOMDjnPWDxGPQ4qkDLeYorpYbEtFOXzOruTwUE671q4Guiuchn4N8h/v6NGd7916kXsm3Iz4iUSg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.2.tgz", + "integrity": "sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==", "bin": { "marked": "bin/marked.js" }, "engines": { - "node": ">= 18" + "node": ">= 16" } }, "node_modules/md5.js": { @@ -13281,11 +13285,11 @@ } }, "node_modules/numbro": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/numbro/-/numbro-2.3.6.tgz", - "integrity": "sha512-pxpoTT3hVxQGaOA2RTzXR/muonQNd1K1HPJbWo7QOmxPwiPmoFCFfsG9XXgW3uqjyzezJ0P9IvCPDXUtJexjwg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/numbro/-/numbro-2.1.2.tgz", + "integrity": "sha512-7w833BxZmKGLE9HI0aREtNVRVH6WTYUUlWf4qgA5gKNhPQ4F/MRZ14sc0v8eoLORprk9ZTVwYaLwj8N3Zgxwiw==", "dependencies": { - "bignumber.js": "^8.1.1" + "bignumber.js": "^8.0.1" }, "engines": { "node": "*" @@ -13426,6 +13430,18 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/nx/node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/nx/node_modules/fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -16814,9 +16830,9 @@ } }, "node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -18028,25 +18044,25 @@ } }, "@angular-devkit/architect": { - "version": "0.1601.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.5.tgz", - "integrity": "sha512-f6oOXR+0gXdMl2papEkTt28GJJBsYtuuoHSQYM09UltkXPkj4bc9QEOzRXKQ0hDjNYYj3UT00E3CalBO/5uGTA==", + "version": "0.1601.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.6.tgz", + "integrity": "sha512-dY+/FNUNrOj+m4iG5/v8N0PfbDmjkjjoy/YkquRHS1yo7fGGDFNqji2552mbtjN6/LwyWDhOO7fxdqppadjnvA==", "dev": true, "requires": { - "@angular-devkit/core": "16.1.5", + "@angular-devkit/core": "16.1.6", "rxjs": "7.8.1" } }, "@angular-devkit/build-angular": { - "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==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.6.tgz", + "integrity": "sha512-IEC1tApX8/Qa/RIVmbj0nYbOQ5WGcrkGNJ7D42q4DkIo74XKPzxDRruJE1RCjdZsj8lf4CCCZgSOPBsEI8Zbdw==", "dev": true, "requires": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1601.5", - "@angular-devkit/build-webpack": "0.1601.5", - "@angular-devkit/core": "16.1.5", + "@angular-devkit/architect": "0.1601.6", + "@angular-devkit/build-webpack": "0.1601.6", + "@angular-devkit/core": "16.1.6", "@babel/core": "7.22.5", "@babel/generator": "7.22.7", "@babel/helper-annotate-as-pure": "7.22.5", @@ -18058,7 +18074,7 @@ "@babel/runtime": "7.22.5", "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.1.5", + "@ngtools/webpack": "16.1.6", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", @@ -18119,19 +18135,19 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1601.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.5.tgz", - "integrity": "sha512-Mc61mrSFFpplBMl11r8ryUrKRDf9Clugnpe8770JcoDe99xEsBFwUUMRS9xNqmVroCgdLMxFijgLSI1ANkUvMg==", + "version": "0.1601.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.6.tgz", + "integrity": "sha512-Uz/GjnhgAqSDPxrO4HP/tHNGPPZU3tEShtAVKyAypBl20bh2Aw1L5D+lCZi/Uq3Sh2JTPD9/M0ei2u9CMLhLDw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1601.5", + "@angular-devkit/architect": "0.1601.6", "rxjs": "7.8.1" } }, "@angular-devkit/core": { - "version": "16.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.5.tgz", - "integrity": "sha512-0Mui2Nuib7kzOLWkz18v1OdxK6wd0SWdSFsAXavrRv03495vv+JUqVq0z0vGMtcbURkjOxIwdj3coj+Y0szkPQ==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.6.tgz", + "integrity": "sha512-3OjtrPWvsqVkMBwqPeE65ccCIw56FooNpVVAJ0XwhVQv5mA81pmbCzU7JsR6U449ZT7O4cQblzZMQvWvx74HCg==", "dev": true, "requires": { "ajv": "8.12.0", @@ -18142,12 +18158,12 @@ } }, "@angular-devkit/schematics": { - "version": "16.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.5.tgz", - "integrity": "sha512-s6D/I0pfJJ7+XaAYyXh6IsS3Tya4WKeBuVcWWE7IK6TMEd5a1yDQ5O9RO2/G8UcxBwlKZmeuFbJkclpF6q3hYA==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.6.tgz", + "integrity": "sha512-KA8P78gaS76HMHGBOM8JHJXWLOxCIShYVB2Un/Cu6z3jVODvXq+ILZUc1Y0RsAce/vsl2wf8qpoh5Lku9KJHUQ==", "dev": true, "requires": { - "@angular-devkit/core": "16.1.5", + "@angular-devkit/core": "16.1.6", "jsonc-parser": "3.2.0", "magic-string": "0.30.0", "ora": "5.4.1", @@ -18230,9 +18246,9 @@ } }, "@angular/animations": { - "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==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.7.tgz", + "integrity": "sha512-+fMLwUlHLNsHWzX2cnsr4sMyix0R5v/a5srQTQjl6BYhdyqFgT82h5F4P49yFu+nZr0jdsxF012wPJbDRR+1qQ==", "requires": { "tslib": "^2.3.0" } @@ -18247,15 +18263,15 @@ } }, "@angular/cli": { - "version": "16.1.5", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.5.tgz", - "integrity": "sha512-um9hWEU3HUMRnQnaDfw0QSNdDLbdLA9tSzp81kz3Rx2VFsSssCABq6xQ+7w09xCUx0jg88r1lBPc2pwV7Pu7FQ==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.6.tgz", + "integrity": "sha512-yXVgUKMXxlAHkhc6xk3ljR7TXpMLBykyu8do+ooSP08VKEQnWjTdVgrcOHd0n5w9YHXUQgBSmjDKxtQaBmvyZQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1601.5", - "@angular-devkit/core": "16.1.5", - "@angular-devkit/schematics": "16.1.5", - "@schematics/angular": "16.1.5", + "@angular-devkit/architect": "0.1601.6", + "@angular-devkit/core": "16.1.6", + "@angular-devkit/schematics": "16.1.6", + "@schematics/angular": "16.1.6", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", @@ -18273,25 +18289,25 @@ } }, "@angular/common": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.6.tgz", - "integrity": "sha512-30Y8DGs+oosA+BcDZd1SuZ4HDT+DVZ6lVT4L+mBUH1BSkNna08FrbmrGQxO82CcxU6ZK0q1YLVkkb5cGx8y9ew==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.7.tgz", + "integrity": "sha512-7WwYwtJjuJtUkutB+aMCvtV5zxa43T4x+kqT+kS4KnUmLv5KdrGPxcS+/7YUuKEELWp1SG032UTwGPX0DXxH4g==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.6.tgz", - "integrity": "sha512-BVDfKZLMb7mmLwdek+ZyzI43Zv0WNNNqnYpMeOI6egmkhtjNCxpQAy2YFKgNPse3bBGP8tKutwAtBB+Lqu/Kcw==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.7.tgz", + "integrity": "sha512-93nbMFPSpKNfUyuRvEQxPdYLU6g25oZ4Gp7ewzNLyDHIbTQv6FwsthHfgPigPJJUUyKak6Gr3koFsgk7Dl3LAA==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.6.tgz", - "integrity": "sha512-unWmH2CcuCkVuEr1fQuzlJtSGzRirsyg8cGQmRh16orx6N8oa/fCvxYRSOed/5aE9YiRpIFZ2TQWT2myY10/6Q==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.7.tgz", + "integrity": "sha512-6iuogfVrbCh6o4hWbNCClsLQdLtlXiaNc72LGz5LMXI0TOwKVlRXhbzhiQeLS0/nsYIdHFbgyr1aepI2wQA3mQ==", "dev": true, "requires": { "@babel/core": "7.22.5", @@ -18305,41 +18321,41 @@ } }, "@angular/core": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.6.tgz", - "integrity": "sha512-tUXvVLc+Vbl8Se7hajwyUTNmKD9uPq+SZH6x8sRM2n5azzjBZltOoJfzxK5JKAkiFf/KkQhteHkMBfoDLZ2tmw==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.7.tgz", + "integrity": "sha512-Wl5BR9X1xnV7Z9v/MNVANhymuTKAuRv4etr4rRgaC5NbbJSuFM4y+mg4yVI4wmrYJo0gKRcV9+2mHaePr41fTg==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.6.tgz", - "integrity": "sha512-6MMQx3qCFrXyX4sSNvQRLRm6smGZshMjuWSCSkyEvvTYpZSA3F7h8ba762PDKYE3vMAON2OczCr8y9MyjBEruA==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.7.tgz", + "integrity": "sha512-AZ6oCIAS2JwH7rJiTOj2uKl1eykiDP98y0trgQ/42+zzpOQZyZAjXrtdqHkVUXMc1PFf5NmYioz19Muj1p+Ttg==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.6.tgz", - "integrity": "sha512-qHwQpqhcWFAwroWwe7iiSsJrs38lrW82vHEm/sX/fcbUuLtqEDaNMf90KqzeSPIkFEkX5wwUZxdRwEh2bepf6g==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.7.tgz", + "integrity": "sha512-AjdUUv5+v50cclHPsKVVdNRdCQZJMGNKmvxyLgeGj2hs61lGoJxBYcYqPre2PpM0SvezNJBreUvjwqM3ttOjng==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "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==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.7.tgz", + "integrity": "sha512-xoT4wDl7Kurg2N5gcLNmkvqYx14xnYwa2Zm1ZIOM7kYMRXiAg1+XBzaxFXog0fCCs/lqUKUwaNn32YpLKwMNaw==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.6.tgz", - "integrity": "sha512-4+MniaDghKurV117URJZzCQBNCdMfiu6lRpTdcKWbHgGZqOQRG9N/gcHah5eLYVB0s6mfQ1OQ9HavNyjujF6Fg==", + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.7.tgz", + "integrity": "sha512-nzjuAEAXLktA3puvSae54noAHEiuizNTvaOpuvQYHfvZF27QMW28XlC33+vDhckWjSD02K7Fb2+AELkOJhUM5Q==", "requires": { "tslib": "^2.3.0" } @@ -18501,9 +18517,9 @@ } }, "@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", - "integrity": "sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.22.6", @@ -19526,9 +19542,9 @@ } }, "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -19611,9 +19627,9 @@ "optional": true }, "@cds/core": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@cds/core/-/core-6.4.5.tgz", - "integrity": "sha512-2wNT/fohyuGEBRa/Vw73z2GqYaNqiccLp5vaQPSdhfn0pX3kZ+q65KLQsbmzyoD+gjo05ydyrjkVRSrzjcxq1Q==", + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/@cds/core/-/core-6.4.6.tgz", + "integrity": "sha512-KQzyxWsJHwZNMOlb9unoxDrGgFETqcew/fV4zmQm1JkyQBmZLPhzIHXFzfFHpQJDjpXiU8htU72Ko0aZ2F9bBg==", "requires": { "@cds/city": "^1.1.0", "lit": "^2.1.3", @@ -19897,9 +19913,9 @@ } }, "@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true }, "@eslint/eslintrc": { @@ -19989,9 +20005,9 @@ }, "dependencies": { "@types/node": { - "version": "14.18.53", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.53.tgz", - "integrity": "sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A==" + "version": "14.18.54", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.54.tgz", + "integrity": "sha512-uq7O52wvo2Lggsx1x21tKZgqkJpvwCseBBPtX/nKQfpVlEsLOb11zZ1CRsWUKvJF0+lzuA9jwvA7Pr2Wt7i3xw==" } } }, @@ -20236,15 +20252,9 @@ } }, "@ngtools/webpack": { - "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": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", - "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.6.tgz", + "integrity": "sha512-rDE1bV3+Ys/VyeD6l7JKtbs3+bTQAfWhi7meEuq5mkaJHOERu6Z40ce866faAIX2I1AVpsSv8rLlb7kB7t7kzw==", "dev": true }, "@nodelib/fs.scandir": { @@ -20703,13 +20713,13 @@ } }, "@schematics/angular": { - "version": "16.1.5", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.5.tgz", - "integrity": "sha512-GwSweqKGjMc9oqU6fukqYKlBflCCDA/l2qfA60YIdf4SubaZnIUpkpNXTbWeFRPJh8zQShb8OZE7cVj8MZRruw==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.6.tgz", + "integrity": "sha512-BxghkeLfnMgV0D4DZDcbfPpox/Orw1ismSVGoQMIV/Daj2pqfSK+n97NAu0r0EsQyR5agPxOX9khVft+otODhg==", "dev": true, "requires": { - "@angular-devkit/core": "16.1.5", - "@angular-devkit/schematics": "16.1.5", + "@angular-devkit/core": "16.1.6", + "@angular-devkit/schematics": "16.1.6", "jsonc-parser": "3.2.0" } }, @@ -20929,9 +20939,9 @@ "dev": true }, "@types/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.1.tgz", + "integrity": "sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg==", "dev": true, "requires": { "@types/estree": "*", @@ -21014,9 +21024,9 @@ "dev": true }, "@types/lodash": { - "version": "4.14.195", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", - "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", + "version": "4.14.196", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.196.tgz", + "integrity": "sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==", "dev": true }, "@types/lodash-es": { @@ -21759,9 +21769,9 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", "dev": true }, "ansi-styles": { @@ -22002,33 +22012,41 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz", - "integrity": "sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", "dev": true, "requires": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.1", - "@nicolo-ribaudo/semver-v6": "^6.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.2", + "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-plugin-polyfill-corejs3": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz", - "integrity": "sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.1", + "@babel/helper-define-polyfill-provider": "^0.4.2", "core-js-compat": "^3.31.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz", - "integrity": "sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.1" + "@babel/helper-define-polyfill-provider": "^0.4.2" } }, "balanced-match": { @@ -22354,9 +22372,9 @@ } }, "cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", "dev": true }, "call-bind": { @@ -22769,9 +22787,9 @@ }, "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==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -22829,9 +22847,9 @@ "dev": true }, "core-js-compat": { - "version": "3.31.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", - "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", + "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", "dev": true, "requires": { "browserslist": "^4.21.9" @@ -23132,9 +23150,9 @@ }, "dependencies": { "@types/node": { - "version": "14.18.53", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.53.tgz", - "integrity": "sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A==", + "version": "14.18.54", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.54.tgz", + "integrity": "sha512-uq7O52wvo2Lggsx1x21tKZgqkJpvwCseBBPtX/nKQfpVlEsLOb11zZ1CRsWUKvJF0+lzuA9jwvA7Pr2Wt7i3xw==", "dev": true }, "ansi-styles": { @@ -23695,9 +23713,9 @@ } }, "electron-to-chromium": { - "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==", + "version": "1.4.475", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.475.tgz", + "integrity": "sha512-mTye5u5P98kSJO2n7zYALhpJDmoSQejIGya0iR01GpoRady8eK3bw7YHHnjA1Rfi4ZSLdpuzlAC7Zw+1Zu7Z6A==", "dev": true }, "elliptic": { @@ -23804,12 +23822,13 @@ } }, "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, "requires": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" } }, "ent": { @@ -25029,17 +25048,9 @@ }, "dependencies": { "core-js": { - "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", - "resolved": "https://registry.npmjs.org/numbro/-/numbro-2.1.2.tgz", - "integrity": "sha512-7w833BxZmKGLE9HI0aREtNVRVH6WTYUUlWf4qgA5gKNhPQ4F/MRZ14sc0v8eoLORprk9ZTVwYaLwj8N3Zgxwiw==", - "requires": { - "bignumber.js": "^8.0.1" - } + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", + "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==" } } }, @@ -25932,13 +25943,13 @@ } }, "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "dependencies": { @@ -25948,6 +25959,15 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -25979,9 +25999,9 @@ } }, "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -25989,9 +26009,9 @@ } }, "jackspeak": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", - "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.2.tgz", + "integrity": "sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==", "dev": true, "requires": { "@isaacs/cliui": "^8.0.2", @@ -26914,9 +26934,9 @@ } }, "marked": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.1.tgz", - "integrity": "sha512-bTmmGdEINWmOMDjnPWDxGPQ4qkDLeYorpYbEtFOXzOruTwUE671q4Guiuchn4N8h/v6NGd7916kXsm3Iz4iUSg==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.2.tgz", + "integrity": "sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==" }, "md5.js": { "version": "1.3.5", @@ -27763,11 +27783,11 @@ } }, "numbro": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/numbro/-/numbro-2.3.6.tgz", - "integrity": "sha512-pxpoTT3hVxQGaOA2RTzXR/muonQNd1K1HPJbWo7QOmxPwiPmoFCFfsG9XXgW3uqjyzezJ0P9IvCPDXUtJexjwg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/numbro/-/numbro-2.1.2.tgz", + "integrity": "sha512-7w833BxZmKGLE9HI0aREtNVRVH6WTYUUlWf4qgA5gKNhPQ4F/MRZ14sc0v8eoLORprk9ZTVwYaLwj8N3Zgxwiw==", "requires": { - "bignumber.js": "^8.1.1" + "bignumber.js": "^8.0.1" } }, "nx": { @@ -27872,6 +27892,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -30451,9 +30480,9 @@ } }, "tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "tsutils": { "version": "3.21.0", diff --git a/client/package.json b/client/package.json index e1475c8..a78351c 100644 --- a/client/package.json +++ b/client/package.json @@ -29,7 +29,7 @@ "cy:run": "cypress run", "audit:prod": "npm audit --omit=dev", "sasdocs": "sasjs doc && ./sasjs/utils/deploydocs.sh", - "typedoc": "typedoc --options typedoc.json && cd ../dc-devdocs" + "typedoc": "typedoc --options typedoc.json && cd ../tsdoc" }, "private": true, "dependencies": { @@ -69,7 +69,6 @@ "ngx-clipboard": "^16.0.0", "ngx-json-viewer": "file:libraries/ngx-json-viewer-3.2.1.tgz", "nodejs": "0.0.0", - "numbro": "^2.1.1", "os-browserify": "0.3.0", "rxjs": "^7.8.0", "save-svg-as-png": "^1.4.17", diff --git a/client/src/app/app.d.ts b/client/src/app/app.d.ts index fa54acf..564812c 100644 --- a/client/src/app/app.d.ts +++ b/client/src/app/app.d.ts @@ -1,5 +1,5 @@ declare module 'save-svg-as-png' - +declare module 'numbro/dist/languages.min' declare interface Navigator { msSaveBlob: (blob: any, defaultName?: string) => boolean } diff --git a/client/src/app/editor/editor.component.html b/client/src/app/editor/editor.component.html index ba26faf..a5caec0 100644 --- a/client/src/app/editor/editor.component.html +++ b/client/src/app/editor/editor.component.html @@ -385,7 +385,6 @@ [class.hidden]="hotTable.hidden" [licenseKey]="hotTable.licenseKey" > - diff --git a/client/src/app/editor/editor.component.ts b/client/src/app/editor/editor.component.ts index 86d14a2..2fdc37d 100644 --- a/client/src/app/editor/editor.component.ts +++ b/client/src/app/editor/editor.component.ts @@ -63,6 +63,8 @@ import { } from './utils/renderers.utils' import { isStringDecimal, isStringNumber } from './utils/types.utils' import { LicenceService } from '../services/licence.service' +import * as numbro from 'numbro' +import * as languages from 'numbro/dist/languages.min' @Component({ selector: 'app-editor', @@ -362,6 +364,10 @@ export class EditorComponent implements OnInit, AfterViewInit { private cdf: ChangeDetectorRef, private hotRegisterer: HotTableRegisterer ) { + const lang = languages[window.navigator.language] + if (lang) + numbro.default.registerLanguage(languages[window.navigator.language]) + this.hotRegisterer = new HotTableRegisterer() this.parseRestrictions() diff --git a/client/src/app/shared/dc-validator/dc-validator.ts b/client/src/app/shared/dc-validator/dc-validator.ts index 7f04abf..75bc25e 100644 --- a/client/src/app/shared/dc-validator/dc-validator.ts +++ b/client/src/app/shared/dc-validator/dc-validator.ts @@ -19,6 +19,7 @@ import { mergeColsRules } from './utils/mergeColsRules' import { parseColType } from './utils/parseColType' import { dqValidate } from './validations/dq-validation' import { specialMissingNumericValidator } from './validations/hot-custom-validators' +import { applyNumericFormats } from './utils/applyNumericFormats' export class DcValidator { private rules: DcValidation[] = [] @@ -41,6 +42,7 @@ export class DcValidator { this.hotInstance = hotInstance this.rules = parseColType(sasparams.COLTYPE) this.rules = mergeColsRules(cols, this.rules, $dataFormats) + this.rules = applyNumericFormats(this.rules) this.dqrules = dqRules this.dqdata = dqData this.primaryKeys = sasparams.PK.split(' ') diff --git a/client/src/app/shared/dc-validator/utils/applyNumericFormats.ts b/client/src/app/shared/dc-validator/utils/applyNumericFormats.ts new file mode 100644 index 0000000..09da1cf --- /dev/null +++ b/client/src/app/shared/dc-validator/utils/applyNumericFormats.ts @@ -0,0 +1,26 @@ +import { DcValidation } from '../models/dc-validation.model' +import * as languages from 'numbro/dist/languages.min' +/** + * Applying the numeric formats based on the browser locale/language + * So that correct decimal separators are applied. + * For example european format (thousand dot, decimal comma): 1.000,00 + * + * @param rules Cell Validation rules to be updated + * Those rules are passed in the `columns` property Of handsontable settings. + */ +export const applyNumericFormats = (rules: DcValidation[]): DcValidation[] => { + const lang = languages[window.navigator.language] + + if (!lang) return rules + + for (let rule of rules) { + if (rule.type === 'numeric') + rule.numericFormat = { + pattern: '0,0', + culture: window.navigator.language // use this for EUR (German), + // more cultures available on http://numbrojs.com/languages.html + } + } + + return rules +} diff --git a/client/src/app/shared/dc-validator/utils/mergeColsRules.ts b/client/src/app/shared/dc-validator/utils/mergeColsRules.ts index 46d5174..6c6b830 100644 --- a/client/src/app/shared/dc-validator/utils/mergeColsRules.ts +++ b/client/src/app/shared/dc-validator/utils/mergeColsRules.ts @@ -6,7 +6,8 @@ import { DcValidation } from '../models/dc-validation.model' * Merging old validation params from sasparams with cols params * @param sasparams sasparams coming from SAS * @param cols cols coming from SAS - * @param rules rules to be updated + * @param rules Cell Validation rules to be updated + * Those rules are passed in the `columns` property Of handsontable settings. * @returns */ export const mergeColsRules = ( diff --git a/client/src/environments/_eula.ts b/client/src/environments/_eula.ts index c4e6412..684dea6 100644 --- a/client/src/environments/_eula.ts +++ b/client/src/environments/_eula.ts @@ -5,27 +5,17 @@ Licence Agreement for Data Controller for SAS® Copyright (c) Bowe IO Ltd -Data Controller is a software distributed by 4GL Apps, a brand owned by Bowe IO Ltd, a UK Limited Company headquarted in 29 Oldfield Rd, Cumbria, registered by companies house under number 08777171, VAT number: 203914240 +Data Controller software is distributed by 4GL Apps, a brand owned by Bowe IO Ltd, a UK Limited Company headquarted in 29 Oldfield Rd, Cumbria, registered at Companies House with company number 08777171, VAT number: 203914240 -This software is protected by applicable copyright laws, including international treaties, and dual- -licensed – depending on whether your use for commercial purposes, meaning intended for or -resulting in commercial advantage or monetary compensation, or not. +This software is protected by applicable copyright laws, including international treaties, and dual-licensed – depending on whether your use for commercial purposes, meaning intended for or resulting in commercial advantage or monetary compensation, or not. -If your use is strictly personal or solely for evaluation purposes, meaning for the purposes of testing -the suitability, performance, and usefulness of this software outside the production environment, -you agree to be bound by the terms included in the "licence-non-commercial-datacontroller.md" file. +If your use is strictly personal or solely for evaluation purposes, meaning for the purposes of testing the suitability, performance, and usefulness of this software outside the production environment, you agree to be bound by the terms included in the "licence-non-commercial-datacontroller.md" file available here: https://git.datacontroller.io/dc/dc/src/branch/main/licence-non-commercial-datacontroller.md -Your use of this software for commercial purposes is subject to the terms included in an applicable -license agreement. +Your use of this software for commercial purposes is subject to the terms included in an applicable license agreement. -In any case, you must not make any such use of this software as to develop software which may be -considered competitive with this software. +In any case, you must not make any such use of this software as to develop software which may be considered competitive with this software. -UNLESS EXPRESSLY AGREED OTHERWISE, 4GL APPS PROVIDES THIS SOFTWARE ON AN "AS IS" -BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, AND IN NO EVENT AND UNDER NO -LEGAL THEORY, SHALL 4GL APPS BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY DIRECT, -INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING FROM -USE OR INABILITY TO USE THIS SOFTWARE. +UNLESS EXPRESSLY AGREED OTHERWISE, 4GL APPS PROVIDES THIS SOFTWARE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, AND IN NO EVENT AND UNDER NO LEGAL THEORY, SHALL 4GL APPS BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING FROM USE OR INABILITY TO USE THIS SOFTWARE. ` diff --git a/client/typedoc.json b/client/typedoc.json index be1879f..34b31c2 100644 --- a/client/typedoc.json +++ b/client/typedoc.json @@ -1,12 +1,12 @@ { - "out": "../dc-devdocs", - "tsconfig": "./tsconfig.app.json", - "entryPointStrategy": "expand", - "entryPoints": [ - "./src" - ], - "exclude": "**/*+(index|.spec|.e2e).ts", - "externalPattern": "**/node_modules/**", - "excludeExternals": true, - "excludePrivate": true - } \ No newline at end of file + "out": "../tsdoc", + "tsconfig": "./tsconfig.app.json", + "entryPointStrategy": "expand", + "entryPoints": [ + "./src" + ], + "exclude": "**/*+(index|.spec|.e2e).ts", + "externalPattern": "**/node_modules/**", + "excludeExternals": true, + "excludePrivate": true +} \ No newline at end of file diff --git a/sas/sasjs/macros/mpe_targetloader.sas b/sas/sasjs/macros/mpe_targetloader.sas index 49ee35c..2d41889 100755 --- a/sas/sasjs/macros/mpe_targetloader.sas +++ b/sas/sasjs/macros/mpe_targetloader.sas @@ -141,6 +141,13 @@ run; %mp_lockanytable(UNLOCK,lib=&lib,ds=&ds,ctl_ds=&dclib..mpe_lockanytable) %end; + %else %do; + /* is full replace so treat everything as a mod in diff screen */ + data work.outds_mod work.outds_add work.outds_del; + set work.&staging_ds; + output work.outds_mod; /* _add and _del will be empty */ + run; + %end; %end; %else %if &loadtype=UPDATE %then %do; %bitemporal_dataloader(bus_from=,bus_to= diff --git a/sas/sasjs/services/auditors/postdata.sas b/sas/sasjs/services/auditors/postdata.sas index c794afb..c2e4670 100644 --- a/sas/sasjs/services/auditors/postdata.sas +++ b/sas/sasjs/services/auditors/postdata.sas @@ -597,6 +597,7 @@ run; %if &LOADTYPE=REPLACE %then %do; data work.outds_add; run; data work.outds_mod; run; + data work.outds_del; run; %end; libname approve "&mpelocapprovals/&TABLE"; data; set &libds;stop;run;