Merge remote-tracking branch 'upstream/master'

This commit is contained in:
github-actions[bot] 2026-05-12 18:03:30 +00:00
commit 8c10113df7
14 changed files with 209 additions and 112 deletions

View File

@ -33,8 +33,6 @@ updates:
versions: [ '>=5.0.0' ] versions: [ '>=5.0.0' ]
- dependency-name: 'cbor' - dependency-name: 'cbor'
versions: [ '>=10.0.0' ] versions: [ '>=10.0.0' ]
- dependency-name: 'cspell'
versions: [ '>=9.0.0' ]
- dependency-name: 'eslint' - dependency-name: 'eslint'
versions: [ '>=10.0.0' ] versions: [ '>=10.0.0' ]
- dependency-name: 'eslint-plugin-jsdoc' - dependency-name: 'eslint-plugin-jsdoc'
@ -45,8 +43,6 @@ updates:
versions: [ '>=2.0.0' ] versions: [ '>=2.0.0' ]
- dependency-name: 'jimp' - dependency-name: 'jimp'
versions: [ '1.6.1' ] versions: [ '1.6.1' ]
- dependency-name: 'otpauth'
versions: [ '>=9.4.0' ]
- dependency-name: 'webpack-dev-server' - dependency-name: 'webpack-dev-server'
versions: [ '>=5.1.0' ] versions: [ '>=5.1.0' ]
groups: groups:
@ -60,15 +56,15 @@ updates:
update-types: update-types:
- 'patch' - 'patch'
# Can't enable this until we are using Node 24 as the latest actions all require this version # Versioning on Github Actions
# - package-ecosystem: "github-actions" - package-ecosystem: "github-actions"
# # Workflow files stored in the default location of `.github/workflows`; no need to # Workflow files stored in the default location of `.github/workflows`; no need to
# # specify `/.github/workflows` for `directory` # specify `/.github/workflows` for `directory`
# directory: '/' directory: '/'
# schedule: schedule:
# interval: 'weekly' interval: 'weekly'
# day: 'friday' day: 'friday'
# time: '03:00' time: '03:00'
# timezone: Europe/London timezone: Europe/London
# commit-message: commit-message:
# prefix: 'chore (deps): ' prefix: 'chore (deps): '

View File

@ -56,7 +56,7 @@ jobs:
- name: Deploy to GitHub Pages - name: Deploy to GitHub Pages
if: success() && github.ref == 'refs/heads/master' if: success() && github.ref == 'refs/heads/master'
uses: crazy-max/ghaction-github-pages@v3 uses: crazy-max/ghaction-github-pages@v5
with: with:
target_branch: gh-pages target_branch: gh-pages
build_dir: ./build/prod build_dir: ./build/prod

View File

@ -53,10 +53,10 @@ jobs:
- name: Set up Docker Buildx - name: Set up Docker Buildx
if: success() if: success()
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v4
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v3 uses: docker/setup-qemu-action@v4
- name: Production Image Build - name: Production Image Build
if: success() if: success()

View File

@ -52,14 +52,14 @@ jobs:
xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v4
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v3 uses: docker/setup-qemu-action@v4
- name: Image Metadata - name: Image Metadata
id: image-metadata id: image-metadata
uses: docker/metadata-action@v4 uses: docker/metadata-action@v6
with: with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: | tags: |
@ -68,7 +68,7 @@ jobs:
type=semver,pattern={{version}} type=semver,pattern={{version}}
- name: Log in to GHCR - name: Log in to GHCR
uses: docker/login-action@v3 uses: docker/login-action@v4
with: with:
registry: ${{ env.REGISTRY }} registry: ${{ env.REGISTRY }}
username: ${{ env.REGISTRY_USER }} username: ${{ env.REGISTRY_USER }}

162
package-lock.json generated
View File

@ -20,7 +20,7 @@
"arrive": "^2.5.3", "arrive": "^2.5.3",
"assert": "^2.1.0", "assert": "^2.1.0",
"avsc": "^5.7.9", "avsc": "^5.7.9",
"bcryptjs": "^2.4.3", "bcryptjs": "^3.0.3",
"bignumber.js": "^9.3.1", "bignumber.js": "^9.3.1",
"blakejs": "^1.2.1", "blakejs": "^1.2.1",
"bootstrap": "4.6.2", "bootstrap": "4.6.2",
@ -39,7 +39,7 @@
"d3": "7.9.0", "d3": "7.9.0",
"d3-hexbin": "^0.2.2", "d3-hexbin": "^0.2.2",
"diff": "^5.2.2", "diff": "^5.2.2",
"dompurify": "^3.4.1", "dompurify": "^3.4.2",
"es6-promisify": "^7.0.0", "es6-promisify": "^7.0.0",
"escodegen": "^2.1.0", "escodegen": "^2.1.0",
"esprima": "^4.0.1", "esprima": "^4.0.1",
@ -73,7 +73,7 @@
"lz4js": "^0.2.0", "lz4js": "^0.2.0",
"markdown-it": "^14.1.1", "markdown-it": "^14.1.1",
"moment": "^2.30.1", "moment": "^2.30.1",
"moment-timezone": "^0.6.1", "moment-timezone": "^0.6.2",
"ngeohash": "^0.6.3", "ngeohash": "^0.6.3",
"node-forge": "^1.4.0", "node-forge": "^1.4.0",
"node-md6": "^0.1.0", "node-md6": "^0.1.0",
@ -85,7 +85,7 @@
"path": "^0.12.7", "path": "^0.12.7",
"popper.js": "^1.16.1", "popper.js": "^1.16.1",
"process": "^0.11.10", "process": "^0.11.10",
"protobufjs": "^7.5.5", "protobufjs": "^7.5.6",
"punycode.js": "^2.3.1", "punycode.js": "^2.3.1",
"qr-image": "^3.2.0", "qr-image": "^3.2.0",
"reflect-metadata": "^0.2.2", "reflect-metadata": "^0.2.2",
@ -112,7 +112,7 @@
"@babel/eslint-parser": "^7.28.6", "@babel/eslint-parser": "^7.28.6",
"@babel/plugin-syntax-import-assertions": "^7.28.6", "@babel/plugin-syntax-import-assertions": "^7.28.6",
"@babel/plugin-transform-runtime": "^7.29.0", "@babel/plugin-transform-runtime": "^7.29.0",
"@babel/preset-env": "^7.29.2", "@babel/preset-env": "^7.29.5",
"@babel/runtime": "^7.29.2", "@babel/runtime": "^7.29.2",
"@codemirror/commands": "^6.10.3", "@codemirror/commands": "^6.10.3",
"@codemirror/language": "^6.12.3", "@codemirror/language": "^6.12.3",
@ -149,7 +149,7 @@
"mini-css-extract-plugin": "2.10.2", "mini-css-extract-plugin": "2.10.2",
"modify-source-webpack-plugin": "^4.1.0", "modify-source-webpack-plugin": "^4.1.0",
"nightwatch": "^3.15.0", "nightwatch": "^3.15.0",
"postcss": "^8.5.10", "postcss": "^8.5.14",
"postcss-css-variables": "^0.19.0", "postcss-css-variables": "^0.19.0",
"postcss-import": "^16.1.1", "postcss-import": "^16.1.1",
"postcss-loader": "^8.2.1", "postcss-loader": "^8.2.1",
@ -236,9 +236,9 @@
} }
}, },
"node_modules/@babel/compat-data": { "node_modules/@babel/compat-data": {
"version": "7.29.0", "version": "7.29.3",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz",
"integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -654,6 +654,23 @@
"@babel/core": "^7.0.0" "@babel/core": "^7.0.0"
} }
}, },
"node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": {
"version": "7.29.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.3.tgz",
"integrity": "sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6",
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
"version": "7.27.1", "version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz",
@ -1173,9 +1190,9 @@
} }
}, },
"node_modules/@babel/plugin-transform-modules-systemjs": { "node_modules/@babel/plugin-transform-modules-systemjs": {
"version": "7.29.0", "version": "7.29.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz",
"integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", "integrity": "sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -1629,19 +1646,20 @@
} }
}, },
"node_modules/@babel/preset-env": { "node_modules/@babel/preset-env": {
"version": "7.29.2", "version": "7.29.5",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.5.tgz",
"integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", "integrity": "sha512-/69t2aEzGKHD76DyLbHysF/QH2LJOB8iFnYO37unDTKBTubzcMRv0f3H5EiN1Q6ajOd/eB7dAInF0qdFVS06kA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/compat-data": "^7.29.0", "@babel/compat-data": "^7.29.3",
"@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-compilation-targets": "^7.28.6",
"@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6",
"@babel/helper-validator-option": "^7.27.1", "@babel/helper-validator-option": "^7.27.1",
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5",
"@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.3",
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6",
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
@ -1673,7 +1691,7 @@
"@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-member-expression-literals": "^7.27.1",
"@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1",
"@babel/plugin-transform-modules-commonjs": "^7.28.6", "@babel/plugin-transform-modules-commonjs": "^7.28.6",
"@babel/plugin-transform-modules-systemjs": "^7.29.0", "@babel/plugin-transform-modules-systemjs": "^7.29.4",
"@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-modules-umd": "^7.27.1",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0",
"@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1",
@ -4410,9 +4428,9 @@
"license": "BSD-3-Clause" "license": "BSD-3-Clause"
}, },
"node_modules/@protobufjs/codegen": { "node_modules/@protobufjs/codegen": {
"version": "2.0.4", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
"integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
"license": "BSD-3-Clause" "license": "BSD-3-Clause"
}, },
"node_modules/@protobufjs/eventemitter": { "node_modules/@protobufjs/eventemitter": {
@ -4438,9 +4456,9 @@
"license": "BSD-3-Clause" "license": "BSD-3-Clause"
}, },
"node_modules/@protobufjs/inquire": { "node_modules/@protobufjs/inquire": {
"version": "1.1.0", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz",
"integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", "integrity": "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==",
"license": "BSD-3-Clause" "license": "BSD-3-Clause"
}, },
"node_modules/@protobufjs/path": { "node_modules/@protobufjs/path": {
@ -4456,9 +4474,9 @@
"license": "BSD-3-Clause" "license": "BSD-3-Clause"
}, },
"node_modules/@protobufjs/utf8": { "node_modules/@protobufjs/utf8": {
"version": "1.1.0", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz",
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==",
"license": "BSD-3-Clause" "license": "BSD-3-Clause"
}, },
"node_modules/@testim/chrome-version": { "node_modules/@testim/chrome-version": {
@ -5239,9 +5257,9 @@
} }
}, },
"node_modules/anymatch/node_modules/picomatch": { "node_modules/anymatch/node_modules/picomatch": {
"version": "2.3.1", "version": "2.3.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -5616,13 +5634,13 @@
} }
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.15.0", "version": "1.16.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz",
"integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"follow-redirects": "^1.15.11", "follow-redirects": "^1.16.0",
"form-data": "^4.0.5", "form-data": "^4.0.5",
"proxy-from-env": "^2.1.0" "proxy-from-env": "^2.1.0"
} }
@ -5790,10 +5808,13 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/bcryptjs": { "node_modules/bcryptjs": {
"version": "2.4.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.3.tgz",
"integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", "integrity": "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==",
"license": "MIT" "license": "BSD-3-Clause",
"bin": {
"bcrypt": "bin/bcrypt"
}
}, },
"node_modules/big.js": { "node_modules/big.js": {
"version": "5.2.2", "version": "5.2.2",
@ -8620,9 +8641,9 @@
} }
}, },
"node_modules/dompurify": { "node_modules/dompurify": {
"version": "3.4.1", "version": "3.4.2",
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.1.tgz", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.2.tgz",
"integrity": "sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw==", "integrity": "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==",
"license": "(MPL-2.0 OR Apache-2.0)", "license": "(MPL-2.0 OR Apache-2.0)",
"optionalDependencies": { "optionalDependencies": {
"@types/trusted-types": "^2.0.7" "@types/trusted-types": "^2.0.7"
@ -9647,9 +9668,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/fast-uri": { "node_modules/fast-uri": {
"version": "3.1.0", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz",
"integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -10865,19 +10886,6 @@
"js-yaml": "bin/js-yaml.js" "js-yaml": "bin/js-yaml.js"
} }
}, },
"node_modules/grunt/node_modules/minimatch": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
"integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/grunt/node_modules/sprintf-js": { "node_modules/grunt/node_modules/sprintf-js": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@ -11599,9 +11607,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/ip-address": { "node_modules/ip-address": {
"version": "10.1.0", "version": "10.2.0",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz",
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -13202,9 +13210,9 @@
} }
}, },
"node_modules/micromatch/node_modules/picomatch": { "node_modules/micromatch/node_modules/picomatch": {
"version": "2.3.1", "version": "2.3.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -13437,9 +13445,9 @@
} }
}, },
"node_modules/moment-timezone": { "node_modules/moment-timezone": {
"version": "0.6.1", "version": "0.6.2",
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.6.1.tgz", "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.6.2.tgz",
"integrity": "sha512-1B9lmAhB9D9/sHaPC1N7wLFEVUoFldxOpOO96lOD1PvJ43vCd0ozDPbu0FEL3++VvawOlDkq8YD373tJmP5JHw==", "integrity": "sha512-lDsQv8FoGdBUdf0+TjGsq2orxKuXdwFlQ6Zw6TX3xIcTwTfEpCLyKqvEauvCHJ8iu3KBV8+uPhlv70YsNGdUBQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"moment": "^2.29.4" "moment": "^2.29.4"
@ -14864,9 +14872,9 @@
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.5.10", "version": "8.5.14",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
"integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -15133,22 +15141,22 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/protobufjs": { "node_modules/protobufjs": {
"version": "7.5.5", "version": "7.5.6",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz",
"integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==", "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==",
"hasInstallScript": true, "hasInstallScript": true,
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"dependencies": { "dependencies": {
"@protobufjs/aspromise": "^1.1.2", "@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2", "@protobufjs/base64": "^1.1.2",
"@protobufjs/codegen": "^2.0.4", "@protobufjs/codegen": "^2.0.5",
"@protobufjs/eventemitter": "^1.1.0", "@protobufjs/eventemitter": "^1.1.0",
"@protobufjs/fetch": "^1.1.0", "@protobufjs/fetch": "^1.1.0",
"@protobufjs/float": "^1.0.2", "@protobufjs/float": "^1.0.2",
"@protobufjs/inquire": "^1.1.0", "@protobufjs/inquire": "^1.1.1",
"@protobufjs/path": "^1.1.2", "@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0", "@protobufjs/pool": "^1.1.0",
"@protobufjs/utf8": "^1.1.0", "@protobufjs/utf8": "^1.1.1",
"@types/node": ">=13.7.0", "@types/node": ">=13.7.0",
"long": "^5.0.0" "long": "^5.0.0"
}, },
@ -15574,9 +15582,9 @@
} }
}, },
"node_modules/readdirp/node_modules/picomatch": { "node_modules/readdirp/node_modules/picomatch": {
"version": "2.3.1", "version": "2.3.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {

View File

@ -42,7 +42,7 @@
"@babel/eslint-parser": "^7.28.6", "@babel/eslint-parser": "^7.28.6",
"@babel/plugin-syntax-import-assertions": "^7.28.6", "@babel/plugin-syntax-import-assertions": "^7.28.6",
"@babel/plugin-transform-runtime": "^7.29.0", "@babel/plugin-transform-runtime": "^7.29.0",
"@babel/preset-env": "^7.29.2", "@babel/preset-env": "^7.29.5",
"@babel/runtime": "^7.29.2", "@babel/runtime": "^7.29.2",
"@codemirror/commands": "^6.10.3", "@codemirror/commands": "^6.10.3",
"@codemirror/language": "^6.12.3", "@codemirror/language": "^6.12.3",
@ -79,7 +79,7 @@
"mini-css-extract-plugin": "2.10.2", "mini-css-extract-plugin": "2.10.2",
"modify-source-webpack-plugin": "^4.1.0", "modify-source-webpack-plugin": "^4.1.0",
"nightwatch": "^3.15.0", "nightwatch": "^3.15.0",
"postcss": "^8.5.10", "postcss": "^8.5.14",
"postcss-css-variables": "^0.19.0", "postcss-css-variables": "^0.19.0",
"postcss-import": "^16.1.1", "postcss-import": "^16.1.1",
"postcss-loader": "^8.2.1", "postcss-loader": "^8.2.1",
@ -96,15 +96,15 @@
"@alexaltea/capstone-js": "^3.0.5", "@alexaltea/capstone-js": "^3.0.5",
"@astronautlabs/amf": "^0.0.6", "@astronautlabs/amf": "^0.0.6",
"@blu3r4y/lzma": "^2.3.3", "@blu3r4y/lzma": "^2.3.3",
"@noble/hashes": "2.2.0",
"@wavesenterprise/crypto-gost-js": "^2.1.0-RC1", "@wavesenterprise/crypto-gost-js": "^2.1.0-RC1",
"@xmldom/xmldom": "^0.8.13", "@xmldom/xmldom": "^0.8.13",
"argon2-browser": "^1.18.0", "argon2-browser": "^1.18.0",
"arrive": "^2.5.3", "arrive": "^2.5.3",
"assert": "^2.1.0", "assert": "^2.1.0",
"avsc": "^5.7.9", "avsc": "^5.7.9",
"bcryptjs": "^2.4.3", "bcryptjs": "^3.0.3",
"bignumber.js": "^9.3.1", "bignumber.js": "^9.3.1",
"@noble/hashes": "2.2.0",
"blakejs": "^1.2.1", "blakejs": "^1.2.1",
"bootstrap": "4.6.2", "bootstrap": "4.6.2",
"bootstrap-colorpicker": "^3.4.0", "bootstrap-colorpicker": "^3.4.0",
@ -122,7 +122,7 @@
"d3": "7.9.0", "d3": "7.9.0",
"d3-hexbin": "^0.2.2", "d3-hexbin": "^0.2.2",
"diff": "^5.2.2", "diff": "^5.2.2",
"dompurify": "^3.4.1", "dompurify": "^3.4.2",
"es6-promisify": "^7.0.0", "es6-promisify": "^7.0.0",
"escodegen": "^2.1.0", "escodegen": "^2.1.0",
"esprima": "^4.0.1", "esprima": "^4.0.1",
@ -156,7 +156,7 @@
"lz4js": "^0.2.0", "lz4js": "^0.2.0",
"markdown-it": "^14.1.1", "markdown-it": "^14.1.1",
"moment": "^2.30.1", "moment": "^2.30.1",
"moment-timezone": "^0.6.1", "moment-timezone": "^0.6.2",
"ngeohash": "^0.6.3", "ngeohash": "^0.6.3",
"node-forge": "^1.4.0", "node-forge": "^1.4.0",
"node-md6": "^0.1.0", "node-md6": "^0.1.0",
@ -168,7 +168,7 @@
"path": "^0.12.7", "path": "^0.12.7",
"popper.js": "^1.16.1", "popper.js": "^1.16.1",
"process": "^0.11.10", "process": "^0.11.10",
"protobufjs": "^7.5.5", "protobufjs": "^7.5.6",
"punycode.js": "^2.3.1", "punycode.js": "^2.3.1",
"qr-image": "^3.2.0", "qr-image": "^3.2.0",
"reflect-metadata": "^0.2.2", "reflect-metadata": "^0.2.2",

View File

@ -348,6 +348,7 @@
"Pseudo-Random Number Generator", "Pseudo-Random Number Generator",
"Sleep", "Sleep",
"File Tree", "File Tree",
"Wrap",
"Take nth bytes", "Take nth bytes",
"Drop nth bytes" "Drop nth bytes"
] ]

View File

@ -43,7 +43,7 @@ class Bcrypt extends Operation {
const rounds = args[0]; const rounds = args[0];
const salt = await bcrypt.genSalt(rounds); const salt = await bcrypt.genSalt(rounds);
return await bcrypt.hash(input, salt, null, p => { return await bcrypt.hash(input, salt, undefined, p => {
// Progress callback // Progress callback
if (isWorkerEnvironment()) if (isWorkerEnvironment())
self.sendStatusMessage(`Progress: ${(p * 100).toFixed(0)}%`); self.sendStatusMessage(`Progress: ${(p * 100).toFixed(0)}%`);

View File

@ -43,7 +43,7 @@ class BcryptCompare extends Operation {
async run(input, args) { async run(input, args) {
const hash = args[0]; const hash = args[0];
const match = await bcrypt.compare(input, hash, null, p => { const match = await bcrypt.compare(input, hash, undefined, p => {
// Progress callback // Progress callback
if (isWorkerEnvironment()) if (isWorkerEnvironment())
self.sendStatusMessage(`Progress: ${(p * 100).toFixed(0)}%`); self.sendStatusMessage(`Progress: ${(p * 100).toFixed(0)}%`);

View File

@ -0,0 +1,47 @@
/**
* @author 0xff1ce [github.com/0xff1ce]
* @copyright Crown Copyright 2024
* @license Apache-2.0
*/
import Operation from "../Operation.mjs";
/**
* Wrap operation
*/
class Wrap extends Operation {
/**
* Wrap constructor
*/
constructor() {
super();
this.name = "Wrap";
this.module = "Default";
this.description = "Wraps the input text at a specified number of characters per line.";
this.inputType = "string";
this.outputType = "string";
this.args = [
{
"name": "Line Width",
"type": "number",
"value": 64,
},
];
}
/**
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
run(input, args) {
if (!input) return ""; // Handle empty input
const lineWidth = args[0];
const regex = new RegExp(`.{1,${lineWidth}}`, "g");
return input.match(regex).join("\n");
}
}
export default Wrap;

View File

@ -64,7 +64,7 @@ module.exports = {
testOp(browser, "BSON serialise", '{"a":"test"}', "\u0011\u0000\u0000\u0000\u0002a\u0000\u0005\u0000\u0000\u0000test\u0000\u0000"); testOp(browser, "BSON serialise", '{"a":"test"}', "\u0011\u0000\u0000\u0000\u0002a\u0000\u0005\u0000\u0000\u0000test\u0000\u0000");
// testOp(browser, "Bacon Cipher Decode", "test input", "test_output"); // testOp(browser, "Bacon Cipher Decode", "test input", "test_output");
// testOp(browser, "Bacon Cipher Encode", "test input", "test_output"); // testOp(browser, "Bacon Cipher Encode", "test input", "test_output");
testOp(browser, "Bcrypt", "test input", /^\$2a\$06\$.{53}$/, [6]); testOp(browser, "Bcrypt", "test input", /^\$2b\$06\$.{53}$/, [6]);
testOp(browser, "Bcrypt compare", "test input", "Match: test input", ["$2a$05$FCfBSVX7OeRkK.9kQVFCiOYu9XtwtIbePqUiroD1lkASW9q5QClzG"]); testOp(browser, "Bcrypt compare", "test input", "Match: test input", ["$2a$05$FCfBSVX7OeRkK.9kQVFCiOYu9XtwtIbePqUiroD1lkASW9q5QClzG"]);
testOp(browser, "Bcrypt parse", "$2a$05$kXWtAIGB/R8VEzInoM5ocOTBtyc0m2YTIwFiBU/0XoW032f9QrkWW", /Rounds: 5/); testOp(browser, "Bcrypt parse", "$2a$05$kXWtAIGB/R8VEzInoM5ocOTBtyc0m2YTIwFiBU/0XoW032f9QrkWW", /Rounds: 5/);
testOp(browser, "Bifid Cipher Decode", "qblb tfovy", "test input", ["pass"]); testOp(browser, "Bifid Cipher Decode", "qblb tfovy", "test input", ["pass"]);

View File

@ -136,8 +136,8 @@ Tiger-128`;
it("Bcrypt", async () => { it("Bcrypt", async () => {
const result = await chef.bcrypt("Put a Sock In It"); const result = await chef.bcrypt("Put a Sock In It");
const strResult = result.toString(); const strResult = result.toString();
assert.equal(strResult.length, 60); assert.match(strResult, /^\$2b\$10\$[./A-Za-z0-9]{53}$/);
assert.equal(strResult.slice(0, 7), "$2a$10$"); assert.equal(strResult.split("$").length, 4);
}), }),
it("bcryptCompare", async() => { it("bcryptCompare", async() => {

View File

@ -181,6 +181,7 @@ import "./tests/TranslateDateTimeFormat.mjs";
import "./tests/Typex.mjs"; import "./tests/Typex.mjs";
import "./tests/UnescapeString.mjs"; import "./tests/UnescapeString.mjs";
import "./tests/Unicode.mjs"; import "./tests/Unicode.mjs";
import "./tests/Wrap.mjs";
import "./tests/URLEncodeDecode.mjs"; import "./tests/URLEncodeDecode.mjs";
import "./tests/RSA.mjs"; import "./tests/RSA.mjs";
import "./tests/CBOREncode.mjs"; import "./tests/CBOREncode.mjs";

View File

@ -0,0 +1,44 @@
/**
* @author 0xff1ce [github.com/0xff1ce]
* @copyright Crown Copyright 2024
* @license Apache-2.0
*/
import TestRegister from "../../lib/TestRegister.mjs";
TestRegister.addTests([
// Add tests specific to the Wrap operation
{
name: "Wrap text at 64 characters",
input: "A".repeat(128), // Generate an input string of 128 'A' characters
expectedOutput: "A".repeat(64) + "\n" + "A".repeat(64), // Expected output with a line break after 64 characters
recipeConfig: [
{
"op": "Wrap",
"args": [64]
},
],
},
{
name: "Wrap text at 32 characters",
input: "B".repeat(96), // Generate an input string of 96 'B' characters
expectedOutput: "B".repeat(32) + "\n" + "B".repeat(32) + "\n" + "B".repeat(32), // Expected output with line breaks after every 32 characters
recipeConfig: [
{
"op": "Wrap",
"args": [32]
},
],
},
{
name: "Wrap text at 10 characters",
input: "1234567890".repeat(10), // Generate an input string by repeating '1234567890'
expectedOutput: Array(10).fill("1234567890").join("\n"), // Expected output with line breaks every 10 characters
recipeConfig: [
{
"op": "Wrap",
"args": [10]
},
],
}
]);