From 89f6c3339a5950f20c19f28df3e6a38b94aa0aa1 Mon Sep 17 00:00:00 2001 From: ashklianko Date: Thu, 29 Aug 2024 10:59:39 +0200 Subject: [PATCH 1/9] ApplicationTreeGrid: replace Slickgrid with ListBox #1739 --- gradle.properties | 2 +- package-lock.json | 3534 ++++++++++++----- .../js/app/browse/ApplicationBrowseActions.ts | 25 +- .../js/app/browse/ApplicationBrowsePanel.ts | 153 +- .../js/app/browse/ApplicationTreeGrid.ts | 90 - .../js/app/browse/ApplicationsGridList.ts | 33 + .../js/app/browse/ApplicationsListViewer.ts | 117 + .../js/app/browse/InstallApplicationAction.ts | 6 +- .../js/app/browse/StartApplicationAction.ts | 6 +- .../js/app/browse/StopApplicationAction.ts | 6 +- .../app/browse/UninstallApplicationAction.ts | 6 +- .../styles/browse/application-tree-grid.less | 64 +- .../styles/view/application-browse-panel.less | 13 + 13 files changed, 2836 insertions(+), 1219 deletions(-) create mode 100644 src/main/resources/assets/js/app/browse/ApplicationsGridList.ts create mode 100644 src/main/resources/assets/js/app/browse/ApplicationsListViewer.ts diff --git a/gradle.properties b/gradle.properties index 7fb8606b..94a17153 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,6 +2,6 @@ # Project settings # version=7.14.5-SNAPSHOT -libAdminUiVersion=4.8.1 +libAdminUiVersion=4.9.0-slickgrid-SNAPSHOT systemProp.org.gradle.internal.http.connectionTimeout=120000 systemProp.org.gradle.internal.http.socketTimeout=120000 diff --git a/package-lock.json b/package-lock.json index bbda6493..20cd4d39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,110 +41,911 @@ }, ".xp/dev/lib-admin-ui": { "name": "@enonic/lib-admin-ui", - "version": "4.9.0", + "version": "4.9.1", "license": "GPL-3.0", "dependencies": { - "@types/dompurify": "^3.0.4", - "@types/mousetrap": "^1.6.13", + "@types/dompurify": "^3.0.5", + "@types/mousetrap": "^1.6.15", "@types/slickgrid": "^2.1.36", - "dompurify": "^3.0.6", + "dompurify": "^3.1.3", "fine-uploader": "^5.16.2", "jquery": "^3.7.1", "jquery-simulate": "^1.0.2", - "jquery-ui": "^1.13.2", + "jquery-ui": "^1.13.3", "mousetrap": "^1.6.5", "q": "^1.5.1", "slickgrid": "^4.0.1", - "validator": "^13.11.0" + "validator": "^13.12.0" }, "devDependencies": { - "@enonic/eslint-config": "^1.2.0", - "@swc/cli": "^0.1.62", - "@swc/core": "1.3.95", - "@types/jquery": "^3.5.25", - "@types/jqueryui": "^1.12.19", - "@types/q": "^1.5.7", - "@types/semver": "^7.5.4", - "@types/validator": "^13.11.5", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "@typescript-eslint/parser": "^6.9.1", - "autoprefixer": "^10.4.16", - "browserslist": "^4.22.1", + "@enonic/eslint-config": "^1.2.1", + "@swc/cli": "^0.3.12", + "@swc/core": "1.5.5", + "@types/jquery": "^3.5.30", + "@types/jqueryui": "^1.12.22", + "@types/q": "^1.5.8", + "@types/semver": "^7.5.8", + "@types/validator": "^13.11.10", + "@typescript-eslint/eslint-plugin": "^7.9.0", + "@typescript-eslint/parser": "^7.9.0", + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", "browserslist-config-enonic": "^1.0.8", "circular-dependency-plugin": "^5.2.2", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.8.1", - "cssnano": "^6.0.1", - "enonic-admin-artifacts": "^1.8.5", + "copy-webpack-plugin": "^12.0.2", + "css-loader": "^7.1.1", + "cssnano": "^7.0.1", + "enonic-admin-artifacts": "^1.10.0", "error-logger-webpack-plugin": "^1.1.1", - "eslint": "^8.52.0", - "glob": "^10.3.10", + "eslint": "^8.57.0", + "glob": "^10.3.15", "less": "^4.2.0", - "less-loader": "^11.1.3", - "mini-css-extract-plugin": "^2.7.6", + "less-loader": "^12.2.0", + "mini-css-extract-plugin": "^2.9.0", "npm-run-all": "^4.1.5", - "postcss-loader": "^7.3.3", + "postcss-loader": "^8.1.1", "postcss-normalize": "^10.0.1", "postcss-sort-media-queries": "^5.2.0", - "swc-loader": "^0.2.3", - "terser-webpack-plugin": "^5.3.9", - "ts-loader": "^9.5.0", - "typescript": "^5.2.2", - "webpack": "^5.89.0", + "swc-loader": "^0.2.6", + "terser-webpack-plugin": "^5.3.10", + "ts-loader": "^9.5.1", + "typescript": "^5.4.5", + "webpack": "^5.91.0", "webpack-cli": "^5.1.4" }, "engines": { - "node": ">= 18.17.1", - "npm": ">= 9.6.7" + "node": ">= 20.10.0", + "npm": ">= 10.2.3" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + ".xp/dev/lib-admin-ui/node_modules/@enonic/eslint-config": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@enonic/eslint-config/-/eslint-config-1.2.1.tgz", + "integrity": "sha512-cHKvscUZ5RmLMlEBM+Sv8UdfUyOv+R1MITyP+x0p7WDEmyAPT32SUFDRIK8mLKD4PR9IaTcoNO4NTKiw9J536w==", + "dev": true, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^7.0.2", + "@typescript-eslint/parser": "^7.0.2", + "typescript": "^5.3.3" + } + }, + ".xp/dev/lib-admin-ui/node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + ".xp/dev/lib-admin-ui/node_modules/@typescript-eslint/parser": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + ".xp/dev/lib-admin-ui/node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + ".xp/dev/lib-admin-ui/node_modules/@typescript-eslint/type-utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + ".xp/dev/lib-admin-ui/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + ".xp/dev/lib-admin-ui/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + ".xp/dev/lib-admin-ui/node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + ".xp/dev/lib-admin-ui/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + ".xp/dev/lib-admin-ui/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + ".xp/dev/lib-admin-ui/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + ".xp/dev/lib-admin-ui/node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + ".xp/dev/lib-admin-ui/node_modules/cssnano": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.5.tgz", + "integrity": "sha512-Aq0vqBLtpTT5Yxj+hLlLfNPFuRQCDIjx5JQAhhaedQKLNDvDGeVziF24PS+S1f0Z5KCxWvw0QVI3VNHNBITxVQ==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^7.0.5", + "lilconfig": "^3.1.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/cssnano-preset-default": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.5.tgz", + "integrity": "sha512-Jbzja0xaKwc5JzxPQoc+fotKpYtWEu4wQLMQe29CM0FjjdRjA4omvbGHl2DTGgARKxSTpPssBsok+ixv8uTBqw==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.0", + "postcss-calc": "^10.0.1", + "postcss-colormin": "^7.0.2", + "postcss-convert-values": "^7.0.3", + "postcss-discard-comments": "^7.0.2", + "postcss-discard-duplicates": "^7.0.1", + "postcss-discard-empty": "^7.0.0", + "postcss-discard-overridden": "^7.0.0", + "postcss-merge-longhand": "^7.0.3", + "postcss-merge-rules": "^7.0.3", + "postcss-minify-font-values": "^7.0.0", + "postcss-minify-gradients": "^7.0.0", + "postcss-minify-params": "^7.0.2", + "postcss-minify-selectors": "^7.0.3", + "postcss-normalize-charset": "^7.0.0", + "postcss-normalize-display-values": "^7.0.0", + "postcss-normalize-positions": "^7.0.0", + "postcss-normalize-repeat-style": "^7.0.0", + "postcss-normalize-string": "^7.0.0", + "postcss-normalize-timing-functions": "^7.0.0", + "postcss-normalize-unicode": "^7.0.2", + "postcss-normalize-url": "^7.0.0", + "postcss-normalize-whitespace": "^7.0.0", + "postcss-ordered-values": "^7.0.1", + "postcss-reduce-initial": "^7.0.2", + "postcss-reduce-transforms": "^7.0.0", + "postcss-svgo": "^7.0.1", + "postcss-unique-selectors": "^7.0.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/cssnano-utils": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", + "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + ".xp/dev/lib-admin-ui/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + ".xp/dev/lib-admin-ui/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + ".xp/dev/lib-admin-ui/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + ".xp/dev/lib-admin-ui/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-calc": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", + "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12 || ^20.9 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.38" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-colormin": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz", + "integrity": "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-convert-values": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.3.tgz", + "integrity": "sha512-yJhocjCs2SQer0uZ9lXTMOwDowbxvhwFVrZeS6NPEij/XXthl73ggUmfwVvJM+Vaj5gtCKJV1jiUu4IhAUkX/Q==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-discard-comments": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.2.tgz", + "integrity": "sha512-/Hje9Ls1IYcB9duELO/AyDUJI6aQVY3h5Rj1ziXgaLYCTi1iVBLnjg/TS0D6NszR/kDG6I86OwLmAYe+bvJjiQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-discard-duplicates": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", + "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-discard-empty": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", + "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-discard-overridden": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz", + "integrity": "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-merge-longhand": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.3.tgz", + "integrity": "sha512-8waYomFxshdv6M9Em3QRM9MettRLDRcH2JQi2l0Z1KlYD/vhal3gbkeSES0NuACXOlZBB0V/B0AseHZaklzWOA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^7.0.3" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.2.2" + "postcss": "^8.4.31" } }, - ".xp/dev/lib-admin-ui/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + ".xp/dev/lib-admin-ui/node_modules/postcss-merge-rules": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.3.tgz", + "integrity": "sha512-2eSas2p3voPxNfdI5sQrvIkMaeUHpVc3EezgVs18hz/wRTQAC9U99tp9j3W5Jx9/L3qHkEDvizEx/LdnmumIvQ==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^5.0.0", + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - ".xp/dev/lib-admin-ui/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + ".xp/dev/lib-admin-ui/node_modules/postcss-minify-font-values": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz", + "integrity": "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==", "dev": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "postcss-value-parser": "^4.2.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-minify-gradients": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz", + "integrity": "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==", + "dev": true, + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "postcss": "^8.4.31" } }, - ".xp/dev/lib-admin-ui/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + ".xp/dev/lib-admin-ui/node_modules/postcss-minify-params": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz", + "integrity": "sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "browserslist": "^4.23.3", + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-minify-selectors": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.3.tgz", + "integrity": "sha512-SxTgUQSgBk6wEqzQZKEv1xQYIp9UBju6no9q+npohzSdhuSICQdkqmD1UMKkZWItS3olJSJMDDEY9WOJ5oGJew==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-normalize-charset": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz", + "integrity": "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-normalize-display-values": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz", + "integrity": "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-normalize-positions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz", + "integrity": "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-normalize-repeat-style": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz", + "integrity": "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-normalize-string": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz", + "integrity": "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-normalize-timing-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz", + "integrity": "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-normalize-unicode": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz", + "integrity": "sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-normalize-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz", + "integrity": "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-normalize-whitespace": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz", + "integrity": "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-ordered-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz", + "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==", + "dev": true, + "dependencies": { + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-reduce-initial": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz", + "integrity": "sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-reduce-transforms": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz", + "integrity": "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-svgo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.1.tgz", + "integrity": "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.3.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/postcss-unique-selectors": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.2.tgz", + "integrity": "sha512-CjSam+7Vf8cflJQsHrMS0P2hmy9u0+n/P001kb5eAszLmhjMqrt/i5AqQuNFihhViwDvEAezqTmXqaYXL2ugMw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + ".xp/dev/lib-admin-ui/node_modules/stylehacks": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.3.tgz", + "integrity": "sha512-4DqtecvI/Nd+2BCvW9YEF6lhBN5UM50IJ1R3rnEAhBwbCKf4VehRf+uqvnVArnBayjYD/WtT3g0G/HSRxWfTRg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -238,18 +1039,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -270,9 +1071,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -293,22 +1094,23 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -316,9 +1118,9 @@ } }, "node_modules/@humanwhocodes/config-array/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -352,9 +1154,10 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true }, "node_modules/@isaacs/cliui": { @@ -402,61 +1205,61 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@mole-inc/bin-wrapper": { @@ -535,15 +1338,30 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@swc/cli": { - "version": "0.1.62", - "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.62.tgz", - "integrity": "sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==", + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.3.14.tgz", + "integrity": "sha512-0vGqD6FSW67PaZUZABkA+ADKsX7OUY/PwNEz1SbQdCvVk/e4Z36Gwh7mFVBQH9RIsMonTyhV1RHkwkGnEfR3zQ==", "dev": true, "dependencies": { "@mole-inc/bin-wrapper": "^8.0.1", - "commander": "^7.1.0", + "@swc/counter": "^0.1.3", + "commander": "^8.3.0", "fast-glob": "^3.2.5", + "minimatch": "^9.0.3", + "piscina": "^4.3.0", "semver": "^7.3.8", "slash": "3.0.0", "source-map": "^0.7.3" @@ -554,7 +1372,7 @@ "swcx": "bin/swcx.js" }, "engines": { - "node": ">= 12.13" + "node": ">= 16.14.0" }, "peerDependencies": { "@swc/core": "^1.2.66", @@ -566,6 +1384,39 @@ } } }, + "node_modules/@swc/cli/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@swc/cli/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@swc/cli/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@swc/cli/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -576,13 +1427,13 @@ } }, "node_modules/@swc/core": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.95.tgz", - "integrity": "sha512-PMrNeuqIusq9DPDooV3FfNEbZuTu5jKAc04N3Hm6Uk2Fl49cqElLFQ4xvl4qDmVDz97n3n/C1RE0/f6WyGPEiA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.5.tgz", + "integrity": "sha512-M8O22EEgdSONLd+7KRrXj8pn+RdAZZ7ISnPjE9KCQQlI0kkFNEquWR+uFdlFxQfwlyCe/Zb6uGXGDvtcov4IMg==", "dev": true, "hasInstallScript": true, "dependencies": { - "@swc/counter": "^0.1.1", + "@swc/counter": "^0.1.2", "@swc/types": "^0.1.5" }, "engines": { @@ -593,16 +1444,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.95", - "@swc/core-darwin-x64": "1.3.95", - "@swc/core-linux-arm-gnueabihf": "1.3.95", - "@swc/core-linux-arm64-gnu": "1.3.95", - "@swc/core-linux-arm64-musl": "1.3.95", - "@swc/core-linux-x64-gnu": "1.3.95", - "@swc/core-linux-x64-musl": "1.3.95", - "@swc/core-win32-arm64-msvc": "1.3.95", - "@swc/core-win32-ia32-msvc": "1.3.95", - "@swc/core-win32-x64-msvc": "1.3.95" + "@swc/core-darwin-arm64": "1.5.5", + "@swc/core-darwin-x64": "1.5.5", + "@swc/core-linux-arm-gnueabihf": "1.5.5", + "@swc/core-linux-arm64-gnu": "1.5.5", + "@swc/core-linux-arm64-musl": "1.5.5", + "@swc/core-linux-x64-gnu": "1.5.5", + "@swc/core-linux-x64-musl": "1.5.5", + "@swc/core-win32-arm64-msvc": "1.5.5", + "@swc/core-win32-ia32-msvc": "1.5.5", + "@swc/core-win32-x64-msvc": "1.5.5" }, "peerDependencies": { "@swc/helpers": "^0.5.0" @@ -614,9 +1465,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.95.tgz", - "integrity": "sha512-VAuBAP3MNetO/yBIBzvorUXq7lUBwhfpJxYViSxyluMwtoQDhE/XWN598TWMwMl1ZuImb56d7eUsuFdjgY7pJw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.5.tgz", + "integrity": "sha512-Ol5ZwZYdTOZsv2NwjcT/qVVALKzVFeh+IJ4GNarr3P99+38Dkwi81OqCI1o/WaDXQYKAQC/V+CzMbkEuJJfq9Q==", "cpu": [ "arm64" ], @@ -630,9 +1481,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.95.tgz", - "integrity": "sha512-20vF2rvUsN98zGLZc+dsEdHvLoCuiYq/1B+TDeE4oolgTFDmI1jKO+m44PzWjYtKGU9QR95sZ6r/uec0QC5O4Q==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.5.tgz", + "integrity": "sha512-XHWpKBIPKYLgh5/lV2PYjO84lkzf5JR51kjiloyz2Pa9HIV8tHoAP8bYdJwm4nUp2I7KcEh3pPH0AVu5LpxMKw==", "cpu": [ "x64" ], @@ -646,9 +1497,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.95.tgz", - "integrity": "sha512-oEudEM8PST1MRNGs+zu0cx5i9uP8TsLE4/L9HHrS07Ck0RJ3DCj3O2fU832nmLe2QxnAGPwBpSO9FntLfOiWEQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.5.tgz", + "integrity": "sha512-vtoWNCWAe+CNSqtqIwFnIH48qgPPlUZKoQ4EVFeMM+7/kDi6SeNxoh5TierJs5bKAWxD49VkPvRoWFCk6V62mA==", "cpu": [ "arm" ], @@ -662,9 +1513,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.95.tgz", - "integrity": "sha512-pIhFI+cuC1aYg+0NAPxwT/VRb32f2ia8oGxUjQR6aJg65gLkUYQzdwuUmpMtFR2WVf7WVFYxUnjo4UyMuyh3ng==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.5.tgz", + "integrity": "sha512-L4l7M78U6h/rCAxId+y5Vu+1KfDRF6dJZtitFcaT293guiUQFwJv8gLxI4Jh5wFtZ0fYd0QaCuvh2Ip79CzGMg==", "cpu": [ "arm64" ], @@ -678,9 +1529,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.95.tgz", - "integrity": "sha512-ZpbTr+QZDT4OPJfjPAmScqdKKaT+wGurvMU5AhxLaf85DuL8HwUwwlL0n1oLieLc47DwIJEMuKQkYhXMqmJHlg==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.5.tgz", + "integrity": "sha512-DkzJc13ukXa7oJpyn24BjIgsiOybYrc+IxjsQyfNlDrrs1QXP4elStcpkD02SsIuSyHjZV8Hw2HFBMQB3OHPrA==", "cpu": [ "arm64" ], @@ -694,9 +1545,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.95.tgz", - "integrity": "sha512-n9SuHEFtdfSJ+sHdNXNRuIOVprB8nbsz+08apKfdo4lEKq6IIPBBAk5kVhPhkjmg2dFVHVo4Tr/OHXM1tzWCCw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.5.tgz", + "integrity": "sha512-kj4ZwWJGeBEUzHrRQP2VudN+kkkYH7OI1dPVDc6kWQx5X4329JeKOas4qY0l7gDVjBbRwN9IbbPI6TIn2KfAug==", "cpu": [ "x64" ], @@ -710,9 +1561,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.95.tgz", - "integrity": "sha512-L1JrVlsXU3LC0WwmVnMK9HrOT2uhHahAoPNMJnZQpc18a0paO9fqifPG8M/HjNRffMUXR199G/phJsf326UvVg==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.5.tgz", + "integrity": "sha512-6pTorCs4mYhPhYtC4jNOnhGgjNd3DZcRoZ9P0tzXXP69aCbYjvlgNH/NRvAROp9AaVFeZ7a7PmCWb6+Rbe7NKg==", "cpu": [ "x64" ], @@ -726,9 +1577,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.95.tgz", - "integrity": "sha512-YaP4x/aZbUyNdqCBpC2zL8b8n58MEpOUpmOIZK6G1SxGi+2ENht7gs7+iXpWPc0sy7X3YPKmSWMAuui0h8lgAA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.5.tgz", + "integrity": "sha512-o0/9pstmEjwZyrY/bA+mymF0zH7E+GT/XCVqdKeWW9Wn3gTTyWa5MZnrFgI2THQ+AXwdglMB/Zo76ARQPaz/+A==", "cpu": [ "arm64" ], @@ -742,9 +1593,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.95.tgz", - "integrity": "sha512-w0u3HI916zT4BC/57gOd+AwAEjXeUlQbGJ9H4p/gzs1zkSHtoDQghVUNy3n/ZKp9KFod/95cA8mbVF9t1+6epQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.5.tgz", + "integrity": "sha512-B+nypUwsmCuaH6RtKWgiPCb+ENjxstJPPJeMJvBqlJqyCaIkZzN4M07Ozi3xVv1VG21SRkd6G3xIqRoalrNc0Q==", "cpu": [ "ia32" ], @@ -758,9 +1609,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.95.tgz", - "integrity": "sha512-5RGnMt0S6gg4Gc6QtPUJ3Qs9Un4sKqccEzgH/tj7V/DVTJwKdnBKxFZfgQ34OR2Zpz7zGOn889xwsFVXspVWNA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.5.tgz", + "integrity": "sha512-ry83ki9ZX0Q+GWGnqc2J618Z+FvKE8Ajn42F8EYi8Wj0q6Jz3mj+pJzgzakk2INm2ldEZ+FaRPipn4ozsZDcBg==", "cpu": [ "x64" ], @@ -774,9 +1625,9 @@ } }, "node_modules/@swc/counter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.1.tgz", - "integrity": "sha512-xVRaR4u9hcYjFvcSg71Lz5Bo4//CyjAAfMxa7UsaDSYxAshflUkVJWiyVWrfxC59z2kP1IzI4/1BEpnhI9o3Mw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", "dev": true }, "node_modules/@swc/types": { @@ -825,37 +1676,17 @@ } }, "node_modules/@types/dompurify": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.4.tgz", - "integrity": "sha512-1Jk8S/IRzNSbwQRbuGuLFHviwxQ8pX81ZEW3INY9432Cwb4VedkBYan8gSIXVLOLHBtimOmUTEYphjRVmo+30g==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", + "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", "dependencies": { "@types/trusted-types": "*" } }, - "node_modules/@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/http-cache-semantics": { @@ -865,17 +1696,17 @@ "dev": true }, "node_modules/@types/jquery": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.25.tgz", - "integrity": "sha512-gykx2c+OZf5nx2tv/5fDQqmvGgTiXshELy5jf9IgXPtVfSBl57IUYByN4osbwMXwJijWGOEYQABzGaFZE79A0Q==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.30.tgz", + "integrity": "sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==", "dependencies": { "@types/sizzle": "*" } }, "node_modules/@types/jqueryui": { - "version": "1.12.19", - "resolved": "https://registry.npmjs.org/@types/jqueryui/-/jqueryui-1.12.19.tgz", - "integrity": "sha512-pbjCT91/GB3kbJ9R2VeCfgTgHnqCrDG7FhLC7jeRnOsUJBxBX4VzTYPwF/qdRDxt7AHwaCzeuIM7IEPdYpfNvg==", + "version": "1.12.23", + "resolved": "https://registry.npmjs.org/@types/jqueryui/-/jqueryui-1.12.23.tgz", + "integrity": "sha512-pm1yVNVI29B9IGw41anCEzA5eR2r1pYc7flqD471ZT7B0yUXIY7YNe/zq7LGpihIGXNzWyG+Q4YQSzv2AF3fNA==", "dev": true, "dependencies": { "@types/jquery": "*" @@ -897,9 +1728,9 @@ } }, "node_modules/@types/mousetrap": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.13.tgz", - "integrity": "sha512-dEzDpaR+P/thkMsjsREQDX9OP8AMyLncTkgUgTTIxq5lJTlQffiLJt67ImDtaX+kC7CaNIX30pfdrrMZkym+eg==" + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.15.tgz", + "integrity": "sha512-qL0hyIMNPow317QWW/63RvL1x5MVMV+Ru3NaY9f/CuEpCqrmb7WeuK2071ZY5hczOnm38qExWM2i2WtkXLSqFw==" }, "node_modules/@types/node": { "version": "18.11.18", @@ -908,9 +1739,9 @@ "dev": true }, "node_modules/@types/q": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.7.tgz", - "integrity": "sha512-HBPgtzp44867rkL+IzQ3560/E/BlobwCjeXsuKqogrcE99SKgZR4tvBBCuNJZMhUFMz26M7cjKWZg785lllwpA==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", "dev": true }, "node_modules/@types/responselike": { @@ -923,9 +1754,9 @@ } }, "node_modules/@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/sizzle": { @@ -947,9 +1778,9 @@ "integrity": "sha512-I8MnZqNXsOLHsU111oHbn3khtvKMi5Bn4qVFsIWSJcCP1KKDiXX5AEw8UPk0nSopeC+Hvxt6yAy1/a5PailFqg==" }, "node_modules/@types/validator": { - "version": "13.11.5", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.5.tgz", - "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==", + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.1.tgz", + "integrity": "sha512-w0URwf7BQb0rD/EuiG12KP0bailHKHP5YVviJG9zw3ykAokL0TuxU2TUqMB7EwZ59bDHYdeTIvjI5m0S7qHfOA==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { @@ -1240,148 +2071,148 @@ "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", - "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz", - "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz", - "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz", - "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz", - "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.5", - "@webassemblyjs/helper-api-error": "1.11.5", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz", - "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz", - "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-buffer": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/wasm-gen": "1.11.5" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz", - "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz", - "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz", - "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz", - "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-buffer": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/helper-wasm-section": "1.11.5", - "@webassemblyjs/wasm-gen": "1.11.5", - "@webassemblyjs/wasm-opt": "1.11.5", - "@webassemblyjs/wasm-parser": "1.11.5", - "@webassemblyjs/wast-printer": "1.11.5" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz", - "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/ieee754": "1.11.5", - "@webassemblyjs/leb128": "1.11.5", - "@webassemblyjs/utf8": "1.11.5" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz", - "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-buffer": "1.11.5", - "@webassemblyjs/wasm-gen": "1.11.5", - "@webassemblyjs/wasm-parser": "1.11.5" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz", - "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-api-error": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/ieee754": "1.11.5", - "@webassemblyjs/leb128": "1.11.5", - "@webassemblyjs/utf8": "1.11.5" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz", - "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -1448,9 +2279,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1459,10 +2290,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -1595,9 +2426,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -1614,11 +2445,11 @@ } ], "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -1783,9 +2614,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "funding": [ { @@ -1802,10 +2633,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -1898,9 +2729,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001547", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz", - "integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==", + "version": "1.0.30001653", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", + "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", "dev": true, "funding": [ { @@ -2045,20 +2876,20 @@ } }, "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, "dependencies": { - "fast-glob": "^3.2.11", + "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", - "globby": "^13.1.1", + "globby": "^14.0.0", "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -2069,15 +2900,15 @@ } }, "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -2097,19 +2928,20 @@ } }, "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2121,16 +2953,28 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/copy-webpack-plugin/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -2141,12 +2985,12 @@ } }, "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2197,29 +3041,38 @@ } }, "node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/css-select": { @@ -2517,9 +3370,9 @@ } }, "node_modules/dompurify": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.6.tgz", - "integrity": "sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==" + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", + "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==" }, "node_modules/domutils": { "version": "3.1.0", @@ -2542,9 +3395,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.551", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.551.tgz", - "integrity": "sha512-/Ng/W/kFv7wdEHYzxdK7Cv0BHEGSkSB3M0Ssl8Ndr1eMiYeas/+Mv4cNaDqamqWx6nd2uQZfPz6g25z25M/sdw==", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", "dev": true }, "node_modules/emoji-regex": { @@ -2563,9 +3416,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -2576,13 +3429,13 @@ } }, "node_modules/enonic-admin-artifacts": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/enonic-admin-artifacts/-/enonic-admin-artifacts-1.8.5.tgz", - "integrity": "sha512-J4J7EJfynyO4NvpmM2dYBUGPoIC5W+fyulNyzKqcgT39ZvyJDLnCHQo8z7XSshcfEzkyQXYx7P6ClbWzLM/5mQ==", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/enonic-admin-artifacts/-/enonic-admin-artifacts-1.11.2.tgz", + "integrity": "sha512-aN2Ij4cbMnjVgsH1EEeNRkdfzotLAAKk1JnGxPffV3pkeeB7x1OCDE99wioUg9k4eFLXQRS5p8btwlFcqvpmEw==", "dev": true, "engines": { - "node": ">= 16.16.0", - "npm": ">= 8.11.0" + "node": ">= 20.9.0", + "npm": ">= 10.1.0" } }, "node_modules/entities": { @@ -2597,6 +3450,15 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/envinfo": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", @@ -2726,9 +3588,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -2744,16 +3606,16 @@ } }, "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -3210,9 +4072,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3249,6 +4111,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, "node_modules/fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", @@ -3424,9 +4292,9 @@ } }, "node_modules/fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, "engines": { "node": "*" @@ -3553,9 +4421,9 @@ "dev": true }, "node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3640,9 +4508,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/graphemer": { @@ -3808,9 +4676,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" @@ -4209,16 +5077,13 @@ } }, "node_modules/jackspeak": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.5.tgz", - "integrity": "sha512-Ratx+B8WeXLAtRJn26hrhY8S1+Jz6pxPMrkrdkgb/NstTNiqMhX0/oFVu5wX+g5n6JlEu2LPsDJmY8nRP4+alw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -4265,9 +5130,9 @@ } }, "node_modules/jiti": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", - "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -4284,11 +5149,11 @@ "integrity": "sha512-Bq610fSrwTwvH5d06z5oskYaX/79s0BNrKiJZjZOiXRib3iL4ZkSn/wvLwzhf3P9KeXCEpk9wlIaGui/1arOpQ==" }, "node_modules/jquery-ui": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.2.tgz", - "integrity": "sha512-wBZPnqWs5GaYJmo1Jj0k/mrSkzdQzKDwhXNtHKcBdAcKVxMM3KNYFq+iJ2i1rwiG53Z8M4mTn3Qxrm17uH1D4Q==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.14.0.tgz", + "integrity": "sha512-mPfYKBoRCf0MzaT2cyW5i3IuZ7PfTITaasO5OFLAQxrHuI+ZxruPa+4/K1OMNT8oElLWGtIxc9aRbyw20BKr8g==", "dependencies": { - "jquery": ">=1.8.0 <4.0.0" + "jquery": ">=1.12.0 <5.0.0" } }, "node_modules/js-tokens": { @@ -4384,20 +5249,29 @@ } }, "node_modules/less-loader": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.3.tgz", - "integrity": "sha512-A5b7O8dH9xpxvkosNrP0dFp2i/dISOJa9WwGF3WJflfqIERE2ybxh1BFDj5CovC2+jCE4M354mk90hN6ziXlVw==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", + "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", "dev": true, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "less": "^3.5.0 || ^4.0.0", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/less/node_modules/tslib": { @@ -4520,16 +5394,10 @@ } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/make-dir": { "version": "2.1.0", @@ -4651,12 +5519,13 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz", + "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==", "dev": true, "dependencies": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -4735,9 +5604,9 @@ } }, "node_modules/minipass": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", - "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -4756,9 +5625,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -4802,16 +5671,50 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node_modules/node-gyp-build": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "dev": true, + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "node_modules/normalize-package-data": { @@ -5130,6 +6033,12 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5212,30 +6121,21 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", - "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -5259,9 +6159,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.0", @@ -5294,6 +6194,15 @@ "node": ">=6" } }, + "node_modules/piscina": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", + "integrity": "sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==", + "dev": true, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -5307,9 +6216,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "funding": [ { "type": "opencollective", @@ -5325,9 +6234,9 @@ } ], "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -5561,18 +6470,21 @@ } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, "engines": { "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -5587,15 +6499,18 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.4" }, "engines": { "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, "node_modules/postcss-modules-values": { @@ -5809,9 +6724,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -6238,13 +7153,10 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -6286,9 +7198,9 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -6421,9 +7333,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } @@ -6753,15 +7665,16 @@ } }, "node_modules/svgo": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", - "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "dev": true, "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", - "css-tree": "^2.2.1", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.0.0" }, @@ -6777,32 +7690,35 @@ } }, "node_modules/swc-loader": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.3.tgz", - "integrity": "sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz", + "integrity": "sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==", "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + }, "peerDependencies": { "@swc/core": "^1.2.147", "webpack": ">=2" } }, "node_modules/tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/terser": { - "version": "5.17.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.2.tgz", - "integrity": "sha512-1D1aGbOF1Mnayq5PvfMc0amAR1y5Z1nrZaGCvI5xsdEfZEVte8okonk02OiaK5fw5hG1GWuuVsakOnpZW8y25A==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -6814,16 +7730,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -6913,21 +7829,21 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" } }, "node_modules/ts-loader": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.0.tgz", - "integrity": "sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -7035,9 +7951,9 @@ } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -7062,10 +7978,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -7082,8 +8010,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -7118,17 +8046,17 @@ } }, "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", "engines": { "node": ">= 0.10" } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -7139,34 +8067,33 @@ } }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -7457,12 +8384,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -7531,83 +8452,556 @@ "@enonic/lib-admin-ui": { "version": "file:.xp/dev/lib-admin-ui", "requires": { - "@enonic/eslint-config": "^1.2.0", - "@swc/cli": "^0.1.62", - "@swc/core": "1.3.95", - "@types/dompurify": "^3.0.4", - "@types/jquery": "^3.5.25", - "@types/jqueryui": "^1.12.19", - "@types/mousetrap": "^1.6.13", - "@types/q": "^1.5.7", - "@types/semver": "^7.5.4", + "@enonic/eslint-config": "^1.2.1", + "@swc/cli": "^0.3.12", + "@swc/core": "1.5.5", + "@types/dompurify": "^3.0.5", + "@types/jquery": "^3.5.30", + "@types/jqueryui": "^1.12.22", + "@types/mousetrap": "^1.6.15", + "@types/q": "^1.5.8", + "@types/semver": "^7.5.8", "@types/slickgrid": "^2.1.36", - "@types/validator": "^13.11.5", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "@typescript-eslint/parser": "^6.9.1", - "autoprefixer": "^10.4.16", - "browserslist": "^4.22.1", + "@types/validator": "^13.11.10", + "@typescript-eslint/eslint-plugin": "^7.9.0", + "@typescript-eslint/parser": "^7.9.0", + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", "browserslist-config-enonic": "^1.0.8", "circular-dependency-plugin": "^5.2.2", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.8.1", - "cssnano": "^6.0.1", - "dompurify": "^3.0.6", - "enonic-admin-artifacts": "^1.8.5", + "copy-webpack-plugin": "^12.0.2", + "css-loader": "^7.1.1", + "cssnano": "^7.0.1", + "dompurify": "^3.1.3", + "enonic-admin-artifacts": "^1.10.0", "error-logger-webpack-plugin": "^1.1.1", - "eslint": "^8.52.0", + "eslint": "^8.57.0", "fine-uploader": "^5.16.2", - "glob": "^10.3.10", + "glob": "^10.3.15", "jquery": "^3.7.1", "jquery-simulate": "^1.0.2", - "jquery-ui": "^1.13.2", + "jquery-ui": "^1.13.3", "less": "^4.2.0", - "less-loader": "^11.1.3", - "mini-css-extract-plugin": "^2.7.6", + "less-loader": "^12.2.0", + "mini-css-extract-plugin": "^2.9.0", "mousetrap": "^1.6.5", "npm-run-all": "^4.1.5", - "postcss-loader": "^7.3.3", + "postcss-loader": "^8.1.1", "postcss-normalize": "^10.0.1", "postcss-sort-media-queries": "^5.2.0", "q": "^1.5.1", "slickgrid": "^4.0.1", - "swc-loader": "^0.2.3", - "terser-webpack-plugin": "^5.3.9", - "ts-loader": "^9.5.0", - "typescript": "^5.2.2", - "validator": "^13.11.0", - "webpack": "^5.89.0", + "swc-loader": "^0.2.6", + "terser-webpack-plugin": "^5.3.10", + "ts-loader": "^9.5.1", + "typescript": "^5.4.5", + "validator": "^13.12.0", + "webpack": "^5.91.0", "webpack-cli": "^5.1.4" }, "dependencies": { + "@enonic/eslint-config": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@enonic/eslint-config/-/eslint-config-1.2.1.tgz", + "integrity": "sha512-cHKvscUZ5RmLMlEBM+Sv8UdfUyOv+R1MITyP+x0p7WDEmyAPT32SUFDRIK8mLKD4PR9IaTcoNO4NTKiw9J536w==", + "dev": true, + "requires": {} + }, + "@typescript-eslint/eslint-plugin": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + } + }, + "@typescript-eslint/parser": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + } + }, + "@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + } + }, + "@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + } + }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0" + } + }, + "cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "requires": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + } + }, + "css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "dev": true, + "requires": {} + }, + "cssnano": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.5.tgz", + "integrity": "sha512-Aq0vqBLtpTT5Yxj+hLlLfNPFuRQCDIjx5JQAhhaedQKLNDvDGeVziF24PS+S1f0Z5KCxWvw0QVI3VNHNBITxVQ==", + "dev": true, + "requires": { + "cssnano-preset-default": "^7.0.5", + "lilconfig": "^3.1.2" + } + }, + "cssnano-preset-default": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.5.tgz", + "integrity": "sha512-Jbzja0xaKwc5JzxPQoc+fotKpYtWEu4wQLMQe29CM0FjjdRjA4omvbGHl2DTGgARKxSTpPssBsok+ixv8uTBqw==", + "dev": true, + "requires": { + "browserslist": "^4.23.3", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.0", + "postcss-calc": "^10.0.1", + "postcss-colormin": "^7.0.2", + "postcss-convert-values": "^7.0.3", + "postcss-discard-comments": "^7.0.2", + "postcss-discard-duplicates": "^7.0.1", + "postcss-discard-empty": "^7.0.0", + "postcss-discard-overridden": "^7.0.0", + "postcss-merge-longhand": "^7.0.3", + "postcss-merge-rules": "^7.0.3", + "postcss-minify-font-values": "^7.0.0", + "postcss-minify-gradients": "^7.0.0", + "postcss-minify-params": "^7.0.2", + "postcss-minify-selectors": "^7.0.3", + "postcss-normalize-charset": "^7.0.0", + "postcss-normalize-display-values": "^7.0.0", + "postcss-normalize-positions": "^7.0.0", + "postcss-normalize-repeat-style": "^7.0.0", + "postcss-normalize-string": "^7.0.0", + "postcss-normalize-timing-functions": "^7.0.0", + "postcss-normalize-unicode": "^7.0.2", + "postcss-normalize-url": "^7.0.0", + "postcss-normalize-whitespace": "^7.0.0", + "postcss-ordered-values": "^7.0.1", + "postcss-reduce-initial": "^7.0.2", + "postcss-reduce-transforms": "^7.0.0", + "postcss-svgo": "^7.0.1", + "postcss-unique-selectors": "^7.0.2" + } + }, + "cssnano-utils": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", + "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", + "dev": true, + "requires": {} + }, + "debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "postcss-calc": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", + "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0" } }, - "glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "postcss-colormin": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz", + "integrity": "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==", "dev": true, "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" } }, - "minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "postcss-convert-values": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.3.tgz", + "integrity": "sha512-yJhocjCs2SQer0uZ9lXTMOwDowbxvhwFVrZeS6NPEij/XXthl73ggUmfwVvJM+Vaj5gtCKJV1jiUu4IhAUkX/Q==", "dev": true, "requires": { - "brace-expansion": "^2.0.1" + "browserslist": "^4.23.3", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-discard-comments": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.2.tgz", + "integrity": "sha512-/Hje9Ls1IYcB9duELO/AyDUJI6aQVY3h5Rj1ziXgaLYCTi1iVBLnjg/TS0D6NszR/kDG6I86OwLmAYe+bvJjiQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.1.1" + } + }, + "postcss-discard-duplicates": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", + "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", + "dev": true, + "requires": {} + }, + "postcss-discard-empty": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", + "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", + "dev": true, + "requires": {} + }, + "postcss-discard-overridden": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz", + "integrity": "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==", + "dev": true, + "requires": {} + }, + "postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "dev": true, + "requires": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + } + }, + "postcss-merge-longhand": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.3.tgz", + "integrity": "sha512-8waYomFxshdv6M9Em3QRM9MettRLDRcH2JQi2l0Z1KlYD/vhal3gbkeSES0NuACXOlZBB0V/B0AseHZaklzWOA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^7.0.3" + } + }, + "postcss-merge-rules": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.3.tgz", + "integrity": "sha512-2eSas2p3voPxNfdI5sQrvIkMaeUHpVc3EezgVs18hz/wRTQAC9U99tp9j3W5Jx9/L3qHkEDvizEx/LdnmumIvQ==", + "dev": true, + "requires": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^5.0.0", + "postcss-selector-parser": "^6.1.1" + } + }, + "postcss-minify-font-values": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz", + "integrity": "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-gradients": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz", + "integrity": "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==", + "dev": true, + "requires": { + "colord": "^2.9.3", + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-params": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz", + "integrity": "sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==", + "dev": true, + "requires": { + "browserslist": "^4.23.3", + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-selectors": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.3.tgz", + "integrity": "sha512-SxTgUQSgBk6wEqzQZKEv1xQYIp9UBju6no9q+npohzSdhuSICQdkqmD1UMKkZWItS3olJSJMDDEY9WOJ5oGJew==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "postcss-selector-parser": "^6.1.1" + } + }, + "postcss-normalize-charset": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz", + "integrity": "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==", + "dev": true, + "requires": {} + }, + "postcss-normalize-display-values": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz", + "integrity": "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-positions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz", + "integrity": "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz", + "integrity": "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-string": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz", + "integrity": "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz", + "integrity": "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-unicode": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz", + "integrity": "sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==", + "dev": true, + "requires": { + "browserslist": "^4.23.3", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz", + "integrity": "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-whitespace": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz", + "integrity": "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-ordered-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz", + "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==", + "dev": true, + "requires": { + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-reduce-initial": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz", + "integrity": "sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==", + "dev": true, + "requires": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz", + "integrity": "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-svgo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.1.tgz", + "integrity": "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.3.2" + } + }, + "postcss-unique-selectors": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.2.tgz", + "integrity": "sha512-CjSam+7Vf8cflJQsHrMS0P2hmy9u0+n/P001kb5eAszLmhjMqrt/i5AqQuNFihhViwDvEAezqTmXqaYXL2ugMw==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.1.1" + } + }, + "stylehacks": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.3.tgz", + "integrity": "sha512-4DqtecvI/Nd+2BCvW9YEF6lhBN5UM50IJ1R3rnEAhBwbCKf4VehRf+uqvnVArnBayjYD/WtT3g0G/HSRxWfTRg==", + "dev": true, + "requires": { + "browserslist": "^4.23.3", + "postcss-selector-parser": "^6.1.1" } } } @@ -7622,15 +9016,15 @@ } }, "@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true }, "@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -7645,9 +9039,9 @@ }, "dependencies": { "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "requires": { "ms": "2.1.2" @@ -7662,26 +9056,26 @@ } }, "@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true }, "@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "dependencies": { "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "requires": { "ms": "2.1.2" @@ -7702,9 +9096,9 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "@isaacs/cliui": { @@ -7739,52 +9133,52 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, "@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@mole-inc/bin-wrapper": { @@ -7842,20 +9236,53 @@ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true }, + "@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true + }, "@swc/cli": { - "version": "0.1.62", - "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.62.tgz", - "integrity": "sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==", + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.3.14.tgz", + "integrity": "sha512-0vGqD6FSW67PaZUZABkA+ADKsX7OUY/PwNEz1SbQdCvVk/e4Z36Gwh7mFVBQH9RIsMonTyhV1RHkwkGnEfR3zQ==", "dev": true, "requires": { "@mole-inc/bin-wrapper": "^8.0.1", - "commander": "^7.1.0", + "@swc/counter": "^0.1.3", + "commander": "^8.3.0", "fast-glob": "^3.2.5", + "minimatch": "^9.0.3", + "piscina": "^4.3.0", "semver": "^7.3.8", "slash": "3.0.0", "source-map": "^0.7.3" }, "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, "source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -7865,99 +9292,99 @@ } }, "@swc/core": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.95.tgz", - "integrity": "sha512-PMrNeuqIusq9DPDooV3FfNEbZuTu5jKAc04N3Hm6Uk2Fl49cqElLFQ4xvl4qDmVDz97n3n/C1RE0/f6WyGPEiA==", - "dev": true, - "requires": { - "@swc/core-darwin-arm64": "1.3.95", - "@swc/core-darwin-x64": "1.3.95", - "@swc/core-linux-arm-gnueabihf": "1.3.95", - "@swc/core-linux-arm64-gnu": "1.3.95", - "@swc/core-linux-arm64-musl": "1.3.95", - "@swc/core-linux-x64-gnu": "1.3.95", - "@swc/core-linux-x64-musl": "1.3.95", - "@swc/core-win32-arm64-msvc": "1.3.95", - "@swc/core-win32-ia32-msvc": "1.3.95", - "@swc/core-win32-x64-msvc": "1.3.95", - "@swc/counter": "^0.1.1", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.5.tgz", + "integrity": "sha512-M8O22EEgdSONLd+7KRrXj8pn+RdAZZ7ISnPjE9KCQQlI0kkFNEquWR+uFdlFxQfwlyCe/Zb6uGXGDvtcov4IMg==", + "dev": true, + "requires": { + "@swc/core-darwin-arm64": "1.5.5", + "@swc/core-darwin-x64": "1.5.5", + "@swc/core-linux-arm-gnueabihf": "1.5.5", + "@swc/core-linux-arm64-gnu": "1.5.5", + "@swc/core-linux-arm64-musl": "1.5.5", + "@swc/core-linux-x64-gnu": "1.5.5", + "@swc/core-linux-x64-musl": "1.5.5", + "@swc/core-win32-arm64-msvc": "1.5.5", + "@swc/core-win32-ia32-msvc": "1.5.5", + "@swc/core-win32-x64-msvc": "1.5.5", + "@swc/counter": "^0.1.2", "@swc/types": "^0.1.5" } }, "@swc/core-darwin-arm64": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.95.tgz", - "integrity": "sha512-VAuBAP3MNetO/yBIBzvorUXq7lUBwhfpJxYViSxyluMwtoQDhE/XWN598TWMwMl1ZuImb56d7eUsuFdjgY7pJw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.5.tgz", + "integrity": "sha512-Ol5ZwZYdTOZsv2NwjcT/qVVALKzVFeh+IJ4GNarr3P99+38Dkwi81OqCI1o/WaDXQYKAQC/V+CzMbkEuJJfq9Q==", "dev": true, "optional": true }, "@swc/core-darwin-x64": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.95.tgz", - "integrity": "sha512-20vF2rvUsN98zGLZc+dsEdHvLoCuiYq/1B+TDeE4oolgTFDmI1jKO+m44PzWjYtKGU9QR95sZ6r/uec0QC5O4Q==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.5.tgz", + "integrity": "sha512-XHWpKBIPKYLgh5/lV2PYjO84lkzf5JR51kjiloyz2Pa9HIV8tHoAP8bYdJwm4nUp2I7KcEh3pPH0AVu5LpxMKw==", "dev": true, "optional": true }, "@swc/core-linux-arm-gnueabihf": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.95.tgz", - "integrity": "sha512-oEudEM8PST1MRNGs+zu0cx5i9uP8TsLE4/L9HHrS07Ck0RJ3DCj3O2fU832nmLe2QxnAGPwBpSO9FntLfOiWEQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.5.tgz", + "integrity": "sha512-vtoWNCWAe+CNSqtqIwFnIH48qgPPlUZKoQ4EVFeMM+7/kDi6SeNxoh5TierJs5bKAWxD49VkPvRoWFCk6V62mA==", "dev": true, "optional": true }, "@swc/core-linux-arm64-gnu": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.95.tgz", - "integrity": "sha512-pIhFI+cuC1aYg+0NAPxwT/VRb32f2ia8oGxUjQR6aJg65gLkUYQzdwuUmpMtFR2WVf7WVFYxUnjo4UyMuyh3ng==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.5.tgz", + "integrity": "sha512-L4l7M78U6h/rCAxId+y5Vu+1KfDRF6dJZtitFcaT293guiUQFwJv8gLxI4Jh5wFtZ0fYd0QaCuvh2Ip79CzGMg==", "dev": true, "optional": true }, "@swc/core-linux-arm64-musl": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.95.tgz", - "integrity": "sha512-ZpbTr+QZDT4OPJfjPAmScqdKKaT+wGurvMU5AhxLaf85DuL8HwUwwlL0n1oLieLc47DwIJEMuKQkYhXMqmJHlg==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.5.tgz", + "integrity": "sha512-DkzJc13ukXa7oJpyn24BjIgsiOybYrc+IxjsQyfNlDrrs1QXP4elStcpkD02SsIuSyHjZV8Hw2HFBMQB3OHPrA==", "dev": true, "optional": true }, "@swc/core-linux-x64-gnu": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.95.tgz", - "integrity": "sha512-n9SuHEFtdfSJ+sHdNXNRuIOVprB8nbsz+08apKfdo4lEKq6IIPBBAk5kVhPhkjmg2dFVHVo4Tr/OHXM1tzWCCw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.5.tgz", + "integrity": "sha512-kj4ZwWJGeBEUzHrRQP2VudN+kkkYH7OI1dPVDc6kWQx5X4329JeKOas4qY0l7gDVjBbRwN9IbbPI6TIn2KfAug==", "dev": true, "optional": true }, "@swc/core-linux-x64-musl": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.95.tgz", - "integrity": "sha512-L1JrVlsXU3LC0WwmVnMK9HrOT2uhHahAoPNMJnZQpc18a0paO9fqifPG8M/HjNRffMUXR199G/phJsf326UvVg==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.5.tgz", + "integrity": "sha512-6pTorCs4mYhPhYtC4jNOnhGgjNd3DZcRoZ9P0tzXXP69aCbYjvlgNH/NRvAROp9AaVFeZ7a7PmCWb6+Rbe7NKg==", "dev": true, "optional": true }, "@swc/core-win32-arm64-msvc": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.95.tgz", - "integrity": "sha512-YaP4x/aZbUyNdqCBpC2zL8b8n58MEpOUpmOIZK6G1SxGi+2ENht7gs7+iXpWPc0sy7X3YPKmSWMAuui0h8lgAA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.5.tgz", + "integrity": "sha512-o0/9pstmEjwZyrY/bA+mymF0zH7E+GT/XCVqdKeWW9Wn3gTTyWa5MZnrFgI2THQ+AXwdglMB/Zo76ARQPaz/+A==", "dev": true, "optional": true }, "@swc/core-win32-ia32-msvc": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.95.tgz", - "integrity": "sha512-w0u3HI916zT4BC/57gOd+AwAEjXeUlQbGJ9H4p/gzs1zkSHtoDQghVUNy3n/ZKp9KFod/95cA8mbVF9t1+6epQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.5.tgz", + "integrity": "sha512-B+nypUwsmCuaH6RtKWgiPCb+ENjxstJPPJeMJvBqlJqyCaIkZzN4M07Ozi3xVv1VG21SRkd6G3xIqRoalrNc0Q==", "dev": true, "optional": true }, "@swc/core-win32-x64-msvc": { - "version": "1.3.95", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.95.tgz", - "integrity": "sha512-5RGnMt0S6gg4Gc6QtPUJ3Qs9Un4sKqccEzgH/tj7V/DVTJwKdnBKxFZfgQ34OR2Zpz7zGOn889xwsFVXspVWNA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.5.tgz", + "integrity": "sha512-ry83ki9ZX0Q+GWGnqc2J618Z+FvKE8Ajn42F8EYi8Wj0q6Jz3mj+pJzgzakk2INm2ldEZ+FaRPipn4ozsZDcBg==", "dev": true, "optional": true }, "@swc/counter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.1.tgz", - "integrity": "sha512-xVRaR4u9hcYjFvcSg71Lz5Bo4//CyjAAfMxa7UsaDSYxAshflUkVJWiyVWrfxC59z2kP1IzI4/1BEpnhI9o3Mw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", "dev": true }, "@swc/types": { @@ -8000,37 +9427,17 @@ } }, "@types/dompurify": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.4.tgz", - "integrity": "sha512-1Jk8S/IRzNSbwQRbuGuLFHviwxQ8pX81ZEW3INY9432Cwb4VedkBYan8gSIXVLOLHBtimOmUTEYphjRVmo+30g==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", + "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", "requires": { "@types/trusted-types": "*" } }, - "@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "@types/http-cache-semantics": { @@ -8040,17 +9447,17 @@ "dev": true }, "@types/jquery": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.25.tgz", - "integrity": "sha512-gykx2c+OZf5nx2tv/5fDQqmvGgTiXshELy5jf9IgXPtVfSBl57IUYByN4osbwMXwJijWGOEYQABzGaFZE79A0Q==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.30.tgz", + "integrity": "sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==", "requires": { "@types/sizzle": "*" } }, "@types/jqueryui": { - "version": "1.12.19", - "resolved": "https://registry.npmjs.org/@types/jqueryui/-/jqueryui-1.12.19.tgz", - "integrity": "sha512-pbjCT91/GB3kbJ9R2VeCfgTgHnqCrDG7FhLC7jeRnOsUJBxBX4VzTYPwF/qdRDxt7AHwaCzeuIM7IEPdYpfNvg==", + "version": "1.12.23", + "resolved": "https://registry.npmjs.org/@types/jqueryui/-/jqueryui-1.12.23.tgz", + "integrity": "sha512-pm1yVNVI29B9IGw41anCEzA5eR2r1pYc7flqD471ZT7B0yUXIY7YNe/zq7LGpihIGXNzWyG+Q4YQSzv2AF3fNA==", "dev": true, "requires": { "@types/jquery": "*" @@ -8072,9 +9479,9 @@ } }, "@types/mousetrap": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.13.tgz", - "integrity": "sha512-dEzDpaR+P/thkMsjsREQDX9OP8AMyLncTkgUgTTIxq5lJTlQffiLJt67ImDtaX+kC7CaNIX30pfdrrMZkym+eg==" + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.15.tgz", + "integrity": "sha512-qL0hyIMNPow317QWW/63RvL1x5MVMV+Ru3NaY9f/CuEpCqrmb7WeuK2071ZY5hczOnm38qExWM2i2WtkXLSqFw==" }, "@types/node": { "version": "18.11.18", @@ -8083,9 +9490,9 @@ "dev": true }, "@types/q": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.7.tgz", - "integrity": "sha512-HBPgtzp44867rkL+IzQ3560/E/BlobwCjeXsuKqogrcE99SKgZR4tvBBCuNJZMhUFMz26M7cjKWZg785lllwpA==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", "dev": true }, "@types/responselike": { @@ -8098,9 +9505,9 @@ } }, "@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "@types/sizzle": { @@ -8122,9 +9529,9 @@ "integrity": "sha512-I8MnZqNXsOLHsU111oHbn3khtvKMi5Bn4qVFsIWSJcCP1KKDiXX5AEw8UPk0nSopeC+Hvxt6yAy1/a5PailFqg==" }, "@types/validator": { - "version": "13.11.5", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.5.tgz", - "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==", + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.1.tgz", + "integrity": "sha512-w0URwf7BQb0rD/EuiG12KP0bailHKHP5YVviJG9zw3ykAokL0TuxU2TUqMB7EwZ59bDHYdeTIvjI5m0S7qHfOA==", "dev": true }, "@typescript-eslint/eslint-plugin": { @@ -8302,148 +9709,148 @@ "dev": true }, "@webassemblyjs/ast": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", - "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz", - "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz", - "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz", - "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz", - "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.5", - "@webassemblyjs/helper-api-error": "1.11.5", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz", - "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz", - "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-buffer": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/wasm-gen": "1.11.5" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz", - "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz", - "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz", - "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz", - "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-buffer": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/helper-wasm-section": "1.11.5", - "@webassemblyjs/wasm-gen": "1.11.5", - "@webassemblyjs/wasm-opt": "1.11.5", - "@webassemblyjs/wasm-parser": "1.11.5", - "@webassemblyjs/wast-printer": "1.11.5" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz", - "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/ieee754": "1.11.5", - "@webassemblyjs/leb128": "1.11.5", - "@webassemblyjs/utf8": "1.11.5" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz", - "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-buffer": "1.11.5", - "@webassemblyjs/wasm-gen": "1.11.5", - "@webassemblyjs/wasm-parser": "1.11.5" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz", - "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-api-error": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/ieee754": "1.11.5", - "@webassemblyjs/leb128": "1.11.5", - "@webassemblyjs/utf8": "1.11.5" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz", - "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -8487,15 +9894,15 @@ "dev": true }, "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "requires": {} }, @@ -8587,16 +9994,16 @@ "dev": true }, "autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "requires": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" } }, @@ -8709,15 +10116,15 @@ } }, "browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" } }, "browserslist-config-enonic": { @@ -8787,9 +10194,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001547", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz", - "integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==", + "version": "1.0.30001653", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", + "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", "dev": true }, "chalk": { @@ -8898,29 +10305,29 @@ } }, "copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, "requires": { - "fast-glob": "^3.2.11", + "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", - "globby": "^13.1.1", + "globby": "^14.0.0", "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" }, "dependencies": { "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" } }, "ajv-keywords": { @@ -8933,16 +10340,17 @@ } }, "globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" } }, "json-schema-traverse": { @@ -8951,22 +10359,28 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true + }, "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" } }, "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true } } @@ -9002,19 +10416,19 @@ "requires": {} }, "css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, "requires": { "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" } }, "css-select": { @@ -9227,9 +10641,9 @@ } }, "dompurify": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.6.tgz", - "integrity": "sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==" + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", + "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==" }, "domutils": { "version": "3.1.0", @@ -9249,9 +10663,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.551", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.551.tgz", - "integrity": "sha512-/Ng/W/kFv7wdEHYzxdK7Cv0BHEGSkSB3M0Ssl8Ndr1eMiYeas/+Mv4cNaDqamqWx6nd2uQZfPz6g25z25M/sdw==", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", "dev": true }, "emoji-regex": { @@ -9270,9 +10684,9 @@ } }, "enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -9280,9 +10694,9 @@ } }, "enonic-admin-artifacts": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/enonic-admin-artifacts/-/enonic-admin-artifacts-1.8.5.tgz", - "integrity": "sha512-J4J7EJfynyO4NvpmM2dYBUGPoIC5W+fyulNyzKqcgT39ZvyJDLnCHQo8z7XSshcfEzkyQXYx7P6ClbWzLM/5mQ==", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/enonic-admin-artifacts/-/enonic-admin-artifacts-1.11.2.tgz", + "integrity": "sha512-aN2Ij4cbMnjVgsH1EEeNRkdfzotLAAKk1JnGxPffV3pkeeB7x1OCDE99wioUg9k4eFLXQRS5p8btwlFcqvpmEw==", "dev": true }, "entities": { @@ -9291,6 +10705,12 @@ "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", "dev": true }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, "envinfo": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", @@ -9392,9 +10812,9 @@ } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true }, "escape-string-regexp": { @@ -9404,16 +10824,16 @@ "dev": true }, "eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -9749,9 +11169,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -9784,6 +11204,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, "fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", @@ -9913,9 +11339,9 @@ } }, "fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true }, "fs.realpath": { @@ -10005,9 +11431,9 @@ "dev": true }, "globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -10065,9 +11491,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "graphemer": { @@ -10177,9 +11603,9 @@ "dev": true }, "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true }, "image-size": { @@ -10455,9 +11881,9 @@ "dev": true }, "jackspeak": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.5.tgz", - "integrity": "sha512-Ratx+B8WeXLAtRJn26hrhY8S1+Jz6pxPMrkrdkgb/NstTNiqMhX0/oFVu5wX+g5n6JlEu2LPsDJmY8nRP4+alw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "requires": { "@isaacs/cliui": "^8.0.2", @@ -10493,9 +11919,9 @@ } }, "jiti": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", - "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true }, "jquery": { @@ -10509,11 +11935,11 @@ "integrity": "sha512-Bq610fSrwTwvH5d06z5oskYaX/79s0BNrKiJZjZOiXRib3iL4ZkSn/wvLwzhf3P9KeXCEpk9wlIaGui/1arOpQ==" }, "jquery-ui": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.2.tgz", - "integrity": "sha512-wBZPnqWs5GaYJmo1Jj0k/mrSkzdQzKDwhXNtHKcBdAcKVxMM3KNYFq+iJ2i1rwiG53Z8M4mTn3Qxrm17uH1D4Q==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.14.0.tgz", + "integrity": "sha512-mPfYKBoRCf0MzaT2cyW5i3IuZ7PfTITaasO5OFLAQxrHuI+ZxruPa+4/K1OMNT8oElLWGtIxc9aRbyw20BKr8g==", "requires": { - "jquery": ">=1.8.0 <4.0.0" + "jquery": ">=1.12.0 <5.0.0" } }, "js-tokens": { @@ -10603,9 +12029,9 @@ } }, "less-loader": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.3.tgz", - "integrity": "sha512-A5b7O8dH9xpxvkosNrP0dFp2i/dISOJa9WwGF3WJflfqIERE2ybxh1BFDj5CovC2+jCE4M354mk90hN6ziXlVw==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", + "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", "dev": true, "requires": {} }, @@ -10701,13 +12127,10 @@ "dev": true }, "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "make-dir": { "version": "2.1.0", @@ -10798,12 +12221,13 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz", + "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==", "dev": true, "requires": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "dependencies": { "ajv": { @@ -10857,9 +12281,9 @@ } }, "minipass": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", - "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true }, "mousetrap": { @@ -10875,9 +12299,9 @@ "optional": true }, "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" }, "natural-compare": { "version": "1.4.0", @@ -10903,16 +12327,41 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "optional": true, + "requires": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node-gyp-build": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "dev": true, + "optional": true + }, "node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "normalize-package-data": { @@ -11148,6 +12597,12 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -11208,21 +12663,13 @@ "dev": true }, "path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "requires": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", - "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", - "dev": true - } } }, "path-type": { @@ -11238,9 +12685,9 @@ "dev": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "picomatch": { "version": "2.3.0", @@ -11261,6 +12708,15 @@ "dev": true, "optional": true }, + "piscina": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", + "integrity": "sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==", + "dev": true, + "requires": { + "nice-napi": "^1.0.2" + } + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -11271,13 +12727,13 @@ } }, "postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" } }, "postcss-browser-comments": { @@ -11420,15 +12876,16 @@ } }, "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "requires": { "icss-utils": "^5.0.0", @@ -11437,9 +12894,9 @@ } }, "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "requires": { "postcss-selector-parser": "^6.0.4" @@ -11575,9 +13032,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -11874,13 +13331,10 @@ } }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true }, "semver-regex": { "version": "4.0.5", @@ -11906,9 +13360,9 @@ } }, "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -12011,9 +13465,9 @@ "dev": true }, "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==" }, "source-map-loader": { "version": "4.0.1", @@ -12249,40 +13703,43 @@ "dev": true }, "svgo": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", - "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "dev": true, "requires": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", - "css-tree": "^2.2.1", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.0.0" } }, "swc-loader": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.3.tgz", - "integrity": "sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz", + "integrity": "sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==", "dev": true, - "requires": {} + "requires": { + "@swc/counter": "^0.1.3" + } }, "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, "terser": { - "version": "5.17.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.2.tgz", - "integrity": "sha512-1D1aGbOF1Mnayq5PvfMc0amAR1y5Z1nrZaGCvI5xsdEfZEVte8okonk02OiaK5fw5hG1GWuuVsakOnpZW8y25A==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -12296,16 +13753,16 @@ } }, "terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" } }, "text-table": { @@ -12351,16 +13808,16 @@ } }, "ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "requires": {} }, "ts-loader": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.0.tgz", - "integrity": "sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -12439,9 +13896,9 @@ } }, "typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true }, "unbox-primitive": { @@ -12456,14 +13913,20 @@ "which-boxed-primitive": "^1.0.2" } }, + "unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true + }, "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" } }, "uri-js": { @@ -12492,14 +13955,14 @@ } }, "validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==" + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==" }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -12507,34 +13970,33 @@ } }, "webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" } }, @@ -12725,12 +14187,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/src/main/resources/assets/js/app/browse/ApplicationBrowseActions.ts b/src/main/resources/assets/js/app/browse/ApplicationBrowseActions.ts index f4d77954..54086c6b 100644 --- a/src/main/resources/assets/js/app/browse/ApplicationBrowseActions.ts +++ b/src/main/resources/assets/js/app/browse/ApplicationBrowseActions.ts @@ -1,5 +1,4 @@ import * as Q from 'q'; -import {ApplicationTreeGrid} from './ApplicationTreeGrid'; import {StartApplicationAction} from './StartApplicationAction'; import {StopApplicationAction} from './StopApplicationAction'; import {InstallApplicationAction} from './InstallApplicationAction'; @@ -7,6 +6,7 @@ import {UninstallApplicationAction} from './UninstallApplicationAction'; import {TreeGridActions} from '@enonic/lib-admin-ui/ui/treegrid/actions/TreeGridActions'; import {Application} from '@enonic/lib-admin-ui/application/Application'; import {Action} from '@enonic/lib-admin-ui/ui/Action'; +import {SelectableListBoxWrapper} from '@enonic/lib-admin-ui/ui/selector/list/SelectableListBoxWrapper'; export class ApplicationBrowseActions implements TreeGridActions { @@ -17,24 +17,11 @@ export class ApplicationBrowseActions implements TreeGridActions { private allActions: Action[] = []; - private static INSTANCE: ApplicationBrowseActions; - - static init(applicationTreeGrid: ApplicationTreeGrid): ApplicationBrowseActions { - ApplicationBrowseActions.INSTANCE = new ApplicationBrowseActions(applicationTreeGrid); - return ApplicationBrowseActions.INSTANCE; - } - - static get(): ApplicationBrowseActions { - return ApplicationBrowseActions.INSTANCE; - } - - constructor(applicationTreeGrid: ApplicationTreeGrid) { - - this.START_APPLICATION = new StartApplicationAction(applicationTreeGrid); - this.STOP_APPLICATION = new StopApplicationAction(applicationTreeGrid); - this.INSTALL_APPLICATION = new InstallApplicationAction(applicationTreeGrid); - this.UNINSTALL_APPLICATION = new UninstallApplicationAction(applicationTreeGrid); - + constructor(selectionWrapper: SelectableListBoxWrapper) { + this.START_APPLICATION = new StartApplicationAction(selectionWrapper); + this.STOP_APPLICATION = new StopApplicationAction(selectionWrapper); + this.INSTALL_APPLICATION = new InstallApplicationAction(selectionWrapper); + this.UNINSTALL_APPLICATION = new UninstallApplicationAction(selectionWrapper); this.INSTALL_APPLICATION.setEnabled(true); this.allActions.push(this.START_APPLICATION, this.STOP_APPLICATION, this.UNINSTALL_APPLICATION); diff --git a/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts b/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts index cfdd37e5..7ee74d12 100644 --- a/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts +++ b/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts @@ -7,7 +7,7 @@ import {UninstallApplicationEvent} from './UninstallApplicationEvent'; import {ApplicationUploadStartedEvent} from './ApplicationUploadStartedEvent'; import {ApplicationActionRequest} from '../resource/ApplicationActionRequest'; import {BrowsePanel} from '@enonic/lib-admin-ui/app/browse/BrowsePanel'; -import {Application} from '@enonic/lib-admin-ui/application/Application'; +import {Application, ApplicationUploadMock} from '@enonic/lib-admin-ui/application/Application'; import {DefaultErrorHandler} from '@enonic/lib-admin-ui/DefaultErrorHandler'; import {ApplicationKey} from '@enonic/lib-admin-ui/application/ApplicationKey'; import {TreeGridActions} from '@enonic/lib-admin-ui/ui/treegrid/actions/TreeGridActions'; @@ -21,10 +21,30 @@ import {DivEl} from '@enonic/lib-admin-ui/dom/DivEl'; import {SpanEl} from '@enonic/lib-admin-ui/dom/SpanEl'; import {InstalledAppChangedEvent} from '../installation/InstalledAppChangedEvent'; import {CONFIG} from '@enonic/lib-admin-ui/util/Config'; +import {SelectableListBoxPanel} from '@enonic/lib-admin-ui/ui/panel/SelectableListBoxPanel'; +import {SelectableListBoxWrapper, SelectionMode} from '@enonic/lib-admin-ui/ui/selector/list/SelectableListBoxWrapper'; +import {TreeGridContextMenu} from '@enonic/lib-admin-ui/ui/treegrid/TreeGridContextMenu'; +import {ListBoxToolbar} from '@enonic/lib-admin-ui/ui/selector/list/ListBoxToolbar'; +import {ApplicationsGridList} from './ApplicationsGridList'; +import {SelectableListBoxKeyNavigator} from '@enonic/lib-admin-ui/ui/selector/list/SelectableListBoxKeyNavigator'; +import {GetApplicationRequest} from '../resource/GetApplicationRequest'; +import * as Q from 'q'; export class ApplicationBrowsePanel extends BrowsePanel { + protected treeListBox: ApplicationsGridList; + + protected treeActions: ApplicationBrowseActions; + + protected toolbar: ListBoxToolbar; + + protected contextMenu: TreeGridContextMenu; + + protected selectionWrapper: SelectableListBoxWrapper; + + protected keyNavigator: SelectableListBoxKeyNavigator; + protected treeGrid: ApplicationTreeGrid; constructor() { @@ -34,6 +54,14 @@ export class ApplicationBrowsePanel this.registerEvents(); } + protected initListeners(): void { + super.initListeners(); + + this.treeListBox.whenShown(() => { + this.treeListBox.load(); + }); + } + private static sendApplicationActionRequest(action: string, applications: Application[]) { const applicationKeys: ApplicationKey[] = ApplicationKey.fromApplications(applications); new ApplicationActionRequest(applicationKeys, action) @@ -52,7 +80,7 @@ export class ApplicationBrowsePanel const divEl = new DivEl('readonly-help').appendChildren(spanEl, spanEl2); toolbar.appendChild(divEl); } else { - const browseActions: ApplicationBrowseActions = this.treeGrid.getContextMenu().getActions() as ApplicationBrowseActions; + const browseActions = this.treeActions; toolbar.addAction(browseActions.INSTALL_APPLICATION); toolbar.addAction(browseActions.UNINSTALL_APPLICATION); toolbar.addAction(browseActions.START_APPLICATION); @@ -72,13 +100,45 @@ export class ApplicationBrowsePanel protected getBrowseActions(): TreeGridActions { const readonlyMode: boolean = CONFIG.isTrue('readonlyMode'); - return readonlyMode ? null : super.getBrowseActions(); + return readonlyMode ? null : this.treeActions; + } + + protected createListBoxPanel(): SelectableListBoxPanel { + const readonlyMode = CONFIG.isTrue('readonlyMode'); + + this.treeListBox = new ApplicationsGridList(); + + this.selectionWrapper = new SelectableListBoxWrapper(this.treeListBox, { + className: 'applications-list-box-wrapper', + maxSelected: 0, + checkboxPosition: 'left', + highlightMode: true, + }); + + this.toolbar = new ListBoxToolbar(this.selectionWrapper, { + refreshAction: () => this.treeListBox.load(), + }); + + if (!readonlyMode) { + this.treeActions = new ApplicationBrowseActions(this.selectionWrapper); + this.contextMenu = new TreeGridContextMenu(this.treeActions); + } else { + this.toolbar.hideAndDisableSelectionToggler(); + } + + this.keyNavigator = new SelectableListBoxKeyNavigator(this.selectionWrapper); + + const panel = new SelectableListBoxPanel(this.selectionWrapper, this.toolbar); + panel.addClass('applications-selectable-list-box-panel'); + + return panel; } protected updatePreviewItem() { super.updatePreviewItem(); - const hasHighlighted = this.treeGrid.hasHighlightedNode(); + const hasHighlighted = + this.selectionWrapper.getSelectedItems().length > 0 && this.selectionWrapper.getSelectionMode() === SelectionMode.HIGHLIGHT; this.getBrowseItemPanel().toggleClass('highlighted', hasHighlighted); } @@ -117,44 +177,95 @@ export class ApplicationBrowsePanel } if (event.isNeedToUpdateApplication() && event.getApplicationKey()) { - this.treeGrid.updateApplicationNode(event.getApplicationKey()); + this.updateAppByKey(event.getApplicationKey()); } } + private updateAppByKey(key: ApplicationKey): void { + this.fetchAppByKey(key).then((application: Application) => { + this.treeListBox.replaceItems(application); + }).catch(DefaultErrorHandler.handle); + } + + private fetchAppByKey(applicationKey: ApplicationKey): Q.Promise { + return new GetApplicationRequest(applicationKey, true).sendAndParse(); + } + private handleAppInstalledEvent(event: ApplicationEvent) { - this.treeGrid.placeApplicationNode(event.getApplicationKey()).then(() => { + this.fetchAppByKey(event.getApplicationKey()).then((application: Application) => { setTimeout(() => { // timeout lets grid to remove UploadMockNode so that its not counted in the toolbar - const installedApp: Application = this.treeGrid.getByApplicationKey(event.getApplicationKey()); - const installedAppName: string = installedApp ? installedApp.getDisplayName() : event.getApplicationKey().toString(); - showFeedback(i18n('notify.installed', installedAppName)); - this.treeGrid.reload().then(() => { - new InstalledAppChangedEvent(this.treeGrid.getDefaultData()).fire(); - }); + showFeedback(i18n('notify.installed', application.getDisplayName())); + this.treeListBox.addItems(application, false, 0); + new InstalledAppChangedEvent(this.treeListBox.getItems()).fire(); }, 200); - }); + }).catch(DefaultErrorHandler.handle); } private handleAppUninstalledEvent(event: ApplicationEvent) { - const uninstalledApp: Application = this.treeGrid.getByApplicationKey(event.getApplicationKey()); + const uninstalledApp: Application = this.treeListBox.getItem(event.getApplicationKey().getName()); const uninstalledAppName: string = uninstalledApp ? uninstalledApp.getDisplayName() : event.getApplicationKey().toString(); showFeedback(i18n('notify.uninstalled', uninstalledAppName)); - this.treeGrid.deleteNodeByDataId(event.getApplicationKey().toString()); - new InstalledAppChangedEvent(this.treeGrid.getDefaultData()).fire(); + const itemToRemove = this.treeListBox.getItems().find( + (item: Application) => item.getApplicationKey().getName() === event.getApplicationKey().getName()); + + if (itemToRemove) { + this.treeListBox.removeItems(itemToRemove); + } + + new InstalledAppChangedEvent(this.treeListBox.getItems()).fire(); } private handleAppStoppedEvent(event: ApplicationEvent) { - setTimeout(() => { // as uninstall usually follows stop event, lets wait to check if app still exists - const stoppedApp: Application = this.treeGrid.getByApplicationKey(event.getApplicationKey()); + const stoppedApp: Application = this.treeListBox.getItem(event.getApplicationKey().getName()); // seems to be present in the grid and xp is running if (stoppedApp && ServerEventsConnection.get().isConnected()) { - this.treeGrid.updateApplicationNode(event.getApplicationKey()); + this.updateAppByKey(event.getApplicationKey()); } - }, 400); } private handleNewAppUpload(event: ApplicationUploadStartedEvent) { event.getUploadItems().forEach((item: UploadItem) => { - this.treeGrid.appendUploadNode(item); + this.appendUploadNode(item); }); } + + appendUploadNode(item: UploadItem) { + if (this.isItemUploading(item)) { + return; + } + + const appMock = new ApplicationUploadMock(item) as unknown as Application; + + this.treeListBox.addItems(appMock, false, 0); + + const deleteUploadedNodeHandler = () => { + this.treeListBox.removeItems(appMock); + }; + + item.onProgress((progress: number) => { + this.treeListBox.replaceItems(appMock); + + if (progress === 100) { + deleteUploadedNodeHandler(); + } + }); + + item.onUploadStopped(deleteUploadedNodeHandler); + + item.onFailed(() => { + this.treeListBox.removeItems(appMock); + }); + } + + private isItemUploading(newItemToUpload: UploadItem): boolean { + return this.treeListBox.getItems().some((item: Application) => item.getName() === newItemToUpload.getName()); + } + + protected enableSelectionMode(): void { + this.treeListBox.setItems(this.selectionWrapper.getSelectedItems()); + } + + protected disableSelectionMode(): void { + this.treeListBox.load(); + } } diff --git a/src/main/resources/assets/js/app/browse/ApplicationTreeGrid.ts b/src/main/resources/assets/js/app/browse/ApplicationTreeGrid.ts index cc952cf8..0d0bb610 100644 --- a/src/main/resources/assets/js/app/browse/ApplicationTreeGrid.ts +++ b/src/main/resources/assets/js/app/browse/ApplicationTreeGrid.ts @@ -1,11 +1,9 @@ import * as Q from 'q'; -import {ApplicationBrowseActions} from './ApplicationBrowseActions'; import {TreeNode} from '@enonic/lib-admin-ui/ui/treegrid/TreeNode'; import {Application, ApplicationUploadMock} from '@enonic/lib-admin-ui/application/Application'; import {ApplicationKey} from '@enonic/lib-admin-ui/application/ApplicationKey'; import {TreeGrid} from '@enonic/lib-admin-ui/ui/treegrid/TreeGrid'; import {TreeGridBuilder} from '@enonic/lib-admin-ui/ui/treegrid/TreeGridBuilder'; -import {TreeGridContextMenu} from '@enonic/lib-admin-ui/ui/treegrid/TreeGridContextMenu'; import {DefaultErrorHandler} from '@enonic/lib-admin-ui/DefaultErrorHandler'; import {UploadItem} from '@enonic/lib-admin-ui/ui/uploader/UploadItem'; import {ApplicationTreeGridHelper} from './ApplicationTreeGridHelper'; @@ -34,12 +32,6 @@ export class ApplicationTreeGrid builder.setCheckableRows(!readonlyMode); super(builder); - - if (!readonlyMode) { - this.setContextMenu(new TreeGridContextMenu(ApplicationBrowseActions.init(this))); - } else { - this.getToolbar().hideAndDisableSelectionToggler(); - } } fetchRoot(): Q.Promise { @@ -59,86 +51,4 @@ export class ApplicationTreeGrid return deferred.promise; } - private placeNode(data: Application) { - const parentNode: TreeNode = this.getRoot().getDefaultRoot(); - - let index: number = parentNode.getChildren().length; - - for (let i = 0; i < index; i++) { - if (parentNode.getChildren()[i].getData().getDisplayName().localeCompare(data.getDisplayName()) >= 0) { - index = i; - break; - } - } - - return this.insertDataToParentNode(data, parentNode, index); - } - - updateApplicationNode(applicationKey: ApplicationKey) { - this.fetchByKey(applicationKey).then((data: Application) => { - this.updateNodeByData(data); - }).catch(DefaultErrorHandler.handle); - } - - getByApplicationKey(applicationKey: ApplicationKey): Application { - const node: TreeNode = this.getRoot().getNodeByDataId(applicationKey.toString()); - - return !!node ? node.getData() : null; - } - - placeApplicationNode(applicationKey: ApplicationKey): Q.Promise { - return this.fetchByKey(applicationKey) - .then((data: Application) => { - this.placeNode(data); - return Q(null); - }); - } - - appendUploadNode(item: UploadItem) { - if (this.isItemUploading(item)) { - return; - } - - const appMock: ApplicationUploadMock = new ApplicationUploadMock(item); - const parent: TreeNode = this.getRoot().getDefaultRoot(); - - const uploadNode: TreeNode = this.dataToTreeNode(appMock as unknown as Application, this.getRoot().getDefaultRoot()); - this.insertNodeToParentNode(uploadNode, parent, 0); - - const deleteUploadedNodeHandler = () => { - const nodeToRemove: TreeNode = this.getRoot().getCurrentRoot().findNode(appMock.getId()); - - if (nodeToRemove) { - this.deleteNode(uploadNode); - this.invalidate(); - } - }; - - item.onProgress((progress: number) => { - this.invalidateNodes([uploadNode]); - if (progress === 100) { - deleteUploadedNodeHandler(); - } - }); - - item.onUploadStopped(deleteUploadedNodeHandler); - - item.onFailed(() => { - this.deleteNode(uploadNode); - }); - } - - private isItemUploading(newItemToUpload: UploadItem): boolean { - const parent: TreeNode = this.getRoot().getDefaultRoot(); - const itemsBeingUploaded: ApplicationUploadMock[] = parent.getChildren().filter(this.isMockUploadNode).map(this.getUploadMock); - return itemsBeingUploaded.some((item: ApplicationUploadMock) => newItemToUpload.getName() === item.getName()); - } - - private isMockUploadNode(node: TreeNode): boolean { - return node.getData() instanceof ApplicationUploadMock; - } - - private getUploadMock(node: TreeNode): ApplicationUploadMock { - return node.getData() as unknown as ApplicationUploadMock; - } } diff --git a/src/main/resources/assets/js/app/browse/ApplicationsGridList.ts b/src/main/resources/assets/js/app/browse/ApplicationsGridList.ts new file mode 100644 index 00000000..f397084a --- /dev/null +++ b/src/main/resources/assets/js/app/browse/ApplicationsGridList.ts @@ -0,0 +1,33 @@ +import {Application} from '@enonic/lib-admin-ui/application/Application'; +import {ListApplicationsRequest} from '../resource/ListApplicationsRequest'; +import {ListBox} from '@enonic/lib-admin-ui/ui/selector/list/ListBox'; +import {ApplicationsListViewer} from './ApplicationsListViewer'; +import {DefaultErrorHandler} from '@enonic/lib-admin-ui/DefaultErrorHandler'; + +export class ApplicationsGridList + extends ListBox { + + constructor() { + super('applications-grid-list'); + } + + protected createItemView(item: Application, readOnly: boolean): ApplicationsListViewer { + const viewer = new ApplicationsListViewer(); + viewer.setItem(item); + return viewer; + } + + protected getItemId(item: Application): string { + return item.getId(); + } + + protected updateItemView(itemView: ApplicationsListViewer, item: Application): void { + itemView.setItem(item); + } + + load(): void { + new ListApplicationsRequest().sendAndParse().then((applications: Application[]) => { + this.setItems(applications); + }).catch(DefaultErrorHandler.handle); + } +} diff --git a/src/main/resources/assets/js/app/browse/ApplicationsListViewer.ts b/src/main/resources/assets/js/app/browse/ApplicationsListViewer.ts new file mode 100644 index 00000000..2b68edd9 --- /dev/null +++ b/src/main/resources/assets/js/app/browse/ApplicationsListViewer.ts @@ -0,0 +1,117 @@ +import {DivEl} from '@enonic/lib-admin-ui/dom/DivEl'; +import {Application, ApplicationUploadMock} from '@enonic/lib-admin-ui/application/Application'; +import {ApplicationViewer} from '@enonic/lib-admin-ui/application/ApplicationViewer'; +import * as Q from 'q'; +import {SpanEl} from '@enonic/lib-admin-ui/dom/SpanEl'; +import {ProgressBar} from '@enonic/lib-admin-ui/ui/ProgressBar'; + +export class ApplicationsListViewer extends DivEl { + + private itemViewer: ApplicationViewer; + + private versionBlock: VersionBlock; + + private stateBlock: StatusBlock; + + constructor() { + super('applications-list-viewer'); + + this.initElements(); + } + + private initElements(): void { + this.itemViewer = new ApplicationViewerExt(); + this.versionBlock = new VersionBlock('version'); + this.stateBlock = new StatusBlock('state'); + } + + setItem(application: Application | ApplicationUploadMock): void { + this.itemViewer.setObject(application as Application); + this.versionBlock.setItem(application); + this.stateBlock.setItem(application); + } + + doRender(): Q.Promise { + return super.doRender().then((rendered: boolean) => { + this.appendChild(this.itemViewer); + this.appendChild(this.versionBlock); + this.appendChild(this.stateBlock); + + return rendered; + }); + } + +} + +class VersionBlock extends DivEl { + + private readonly textEl: SpanEl; + + constructor(className?: string) { + super('text-block ' + (className || '')); + + this.textEl = new SpanEl('text'); + } + + setItem(item: Application | ApplicationUploadMock): void { + if (item instanceof Application) { + this.textEl.setHtml(item.getVersion()); + } else { + this.textEl.setHtml(''); + } + } + + doRender(): Q.Promise { + return super.doRender().then((rendered: boolean) => { + this.appendChild(this.textEl); + + return rendered; + }); + } +} + +class StatusBlock extends DivEl { + + private readonly textEl: SpanEl; + + private readonly progressEl?: ProgressBar; + + constructor(className?: string) { + super('text-block ' + (className || '')); + + this.textEl = new SpanEl('text'); + this.progressEl = new ProgressBar(); + } + + setItem(item: Application | ApplicationUploadMock): void { + if (item instanceof Application) { + this.textEl.show(); + this.textEl.setHtml(item.getState()); + this.progressEl.hide(); + } else { + this.progressEl.show(); + this.progressEl.setValue(item.getUploadItem().getProgress()); + this.textEl.hide(); + } + } + + doRender(): Q.Promise { + return super.doRender().then((rendered: boolean) => { + this.appendChild(this.textEl); + this.appendChild(this.progressEl); + + return rendered; + }); + } +} + +class ApplicationViewerExt extends ApplicationViewer { + + resolveDisplayName(object: Application): string { + return super.resolveDisplayName(object)?.trim(); + } + + resolveSubName(object: Application | ApplicationUploadMock): string { + return super.resolveSubName(object)?.trim(); + } +} diff --git a/src/main/resources/assets/js/app/browse/InstallApplicationAction.ts b/src/main/resources/assets/js/app/browse/InstallApplicationAction.ts index 23172468..41aed5c0 100644 --- a/src/main/resources/assets/js/app/browse/InstallApplicationAction.ts +++ b/src/main/resources/assets/js/app/browse/InstallApplicationAction.ts @@ -1,17 +1,17 @@ -import {ApplicationTreeGrid} from './ApplicationTreeGrid'; import {InstallAppPromptEvent} from '../installation/InstallAppPromptEvent'; import {i18n} from '@enonic/lib-admin-ui/util/Messages'; import {Application} from '@enonic/lib-admin-ui/application/Application'; import {Action} from '@enonic/lib-admin-ui/ui/Action'; +import {SelectableListBoxWrapper} from '@enonic/lib-admin-ui/ui/selector/list/SelectableListBoxWrapper'; export class InstallApplicationAction extends Action { - constructor(applicationTreeGrid: ApplicationTreeGrid) { + constructor(selectionWrapper: SelectableListBoxWrapper) { super(i18n('action.install')); this.setEnabled(false); this.onExecuted(() => { - const installedApplications: Application[] = applicationTreeGrid.getDefaultData(); + const installedApplications: Application[] = selectionWrapper.getSelectedItems(); new InstallAppPromptEvent(installedApplications).fire(); }); } diff --git a/src/main/resources/assets/js/app/browse/StartApplicationAction.ts b/src/main/resources/assets/js/app/browse/StartApplicationAction.ts index 4f91c43b..53007106 100644 --- a/src/main/resources/assets/js/app/browse/StartApplicationAction.ts +++ b/src/main/resources/assets/js/app/browse/StartApplicationAction.ts @@ -1,17 +1,17 @@ -import {ApplicationTreeGrid} from './ApplicationTreeGrid'; import {StartApplicationEvent} from './StartApplicationEvent'; import {i18n} from '@enonic/lib-admin-ui/util/Messages'; import {Application} from '@enonic/lib-admin-ui/application/Application'; import {Action} from '@enonic/lib-admin-ui/ui/Action'; +import {SelectableListBoxWrapper} from '@enonic/lib-admin-ui/ui/selector/list/SelectableListBoxWrapper'; export class StartApplicationAction extends Action { - constructor(applicationTreeGrid: ApplicationTreeGrid) { + constructor(selectionWrapper: SelectableListBoxWrapper) { super(i18n('action.start')); this.setEnabled(false); this.onExecuted(() => { - let applications: Application[] = applicationTreeGrid.getSelectedDataList(); + let applications: Application[] = selectionWrapper.getSelectedItems(); new StartApplicationEvent(applications).fire(); }); } diff --git a/src/main/resources/assets/js/app/browse/StopApplicationAction.ts b/src/main/resources/assets/js/app/browse/StopApplicationAction.ts index b63ed937..8352127b 100644 --- a/src/main/resources/assets/js/app/browse/StopApplicationAction.ts +++ b/src/main/resources/assets/js/app/browse/StopApplicationAction.ts @@ -1,17 +1,17 @@ -import {ApplicationTreeGrid} from './ApplicationTreeGrid'; import {StopApplicationEvent} from './StopApplicationEvent'; import {i18n} from '@enonic/lib-admin-ui/util/Messages'; import {Application} from '@enonic/lib-admin-ui/application/Application'; import {Action} from '@enonic/lib-admin-ui/ui/Action'; +import {SelectableListBoxWrapper} from '@enonic/lib-admin-ui/ui/selector/list/SelectableListBoxWrapper'; export class StopApplicationAction extends Action { - constructor(applicationTreeGrid: ApplicationTreeGrid) { + constructor(selectionWrapper: SelectableListBoxWrapper) { super(i18n('action.stop')); this.setEnabled(false); this.onExecuted(() => { - let applications: Application[] = applicationTreeGrid.getSelectedDataList(); + let applications: Application[] = selectionWrapper.getSelectedItems(); new StopApplicationEvent(applications).fire(); }); } diff --git a/src/main/resources/assets/js/app/browse/UninstallApplicationAction.ts b/src/main/resources/assets/js/app/browse/UninstallApplicationAction.ts index c83af405..19aec8b6 100644 --- a/src/main/resources/assets/js/app/browse/UninstallApplicationAction.ts +++ b/src/main/resources/assets/js/app/browse/UninstallApplicationAction.ts @@ -1,18 +1,18 @@ -import {ApplicationTreeGrid} from './ApplicationTreeGrid'; import {UninstallApplicationDialog} from './UninstallApplicationDialog'; import {i18n} from '@enonic/lib-admin-ui/util/Messages'; import {Application} from '@enonic/lib-admin-ui/application/Application'; import {Action} from '@enonic/lib-admin-ui/ui/Action'; +import {SelectableListBoxWrapper} from '@enonic/lib-admin-ui/ui/selector/list/SelectableListBoxWrapper'; export class UninstallApplicationAction extends Action { - constructor(applicationTreeGrid: ApplicationTreeGrid) { + constructor(selectionWrapper: SelectableListBoxWrapper) { super(i18n('action.uninstall')); this.setEnabled(false); this.onExecuted(() => { - let applications: Application[] = applicationTreeGrid.getSelectedDataList(); + let applications: Application[] = selectionWrapper.getSelectedItems(); new UninstallApplicationDialog(applications).open(); }); } diff --git a/src/main/resources/assets/styles/browse/application-tree-grid.less b/src/main/resources/assets/styles/browse/application-tree-grid.less index 39b9677e..e6aee738 100644 --- a/src/main/resources/assets/styles/browse/application-tree-grid.less +++ b/src/main/resources/assets/styles/browse/application-tree-grid.less @@ -1,47 +1,37 @@ -.application-grid.tree-grid .grid .slick-row { - .version, .state, .modified { - text-align: right; - font-size: 0.9em; - } - .modified { - padding-right: 25px; - } - - .slick-cell { - .toggle.icon { - display: none; - } - - &.name.l0 { - padding-left: 10px; - } - - &.name { - flex-grow: 1; - - .viewer { - overflow: hidden; +.applications-grid-list { + .item-view-wrapper { + height: 42px; + + &.selected { + .application-viewer { + .xp-admin-common-names-view * { + color: @admin-white; + } - .@{_COMMON_PREFIX}wrapper { - flex-shrink: 0; + .archive-status { + span { + color: @admin-white; + } } } } - &.version { - flex-shrink: 0; - flex-basis: 90px; - justify-content: center; - } + .applications-list-viewer { + display: grid; + grid-template-columns: 1fr 120px 60px; - &.state { - flex-shrink: 0; - flex-basis: 50px; - justify-content: center; - } + .text-block { + display: flex; + justify-content: center; + align-items: center; - &.r3.slick-cell-checkboxsel { - padding-right: 2px; + &.state { + .progress-bar { + width: 48px; + height: 8px; + } + } + } } } diff --git a/src/main/resources/assets/styles/view/application-browse-panel.less b/src/main/resources/assets/styles/view/application-browse-panel.less index 3f81ad32..87d2573a 100644 --- a/src/main/resources/assets/styles/view/application-browse-panel.less +++ b/src/main/resources/assets/styles/view/application-browse-panel.less @@ -24,4 +24,17 @@ font-size: 12px; } } + + .tree-grid-toolbar { + margin-top: 0; + + .selection-controller { + padding-left: 11px; + } + } + + .applications-list-box-wrapper { + overflow: auto; + height: calc(100% - 40px); // minus toolbar height + } } From 7de906554316a5f33559fee86ed6ba84fbe1ee0f Mon Sep 17 00:00:00 2001 From: ashklianko Date: Fri, 30 Aug 2024 10:10:23 +0200 Subject: [PATCH 2/9] MarketAppsTreeGrid: replace Slickgrid with ListBox #1738 --- .../js/app/ListMarketApplicationsRequest.ts | 79 ++++++ .../assets/js/app/MarketApplication.ts | 217 +++++++++++++++++ .../js/app/MarketApplicationMetadata.ts | 47 ++++ .../js/app/MarketApplicationResponse.ts | 32 +++ .../resources/assets/js/app/MarketHelper.ts | 38 +++ .../js/app/browse/ApplicationBrowsePanel.ts | 28 ++- .../js/app/browse/ApplicationsListViewer.ts | 4 + .../js/app/browse/InstallApplicationAction.ts | 2 +- .../js/app/installation/InstallAppDialog.ts | 53 ++-- .../installation/view/MarketAppsTreeGrid.ts | 228 +++++++----------- .../app/installation/view/MarketListViewer.ts | 104 ++++++++ .../js/app/json/MarketApplicationJson.ts | 16 ++ .../js/app/json/MarketApplicationsListJson.ts | 6 + src/main/resources/assets/js/main.ts | 1 - .../installation/market-app-tree-grid.less | 88 +++---- 15 files changed, 709 insertions(+), 234 deletions(-) create mode 100644 src/main/resources/assets/js/app/ListMarketApplicationsRequest.ts create mode 100644 src/main/resources/assets/js/app/MarketApplication.ts create mode 100644 src/main/resources/assets/js/app/MarketApplicationMetadata.ts create mode 100644 src/main/resources/assets/js/app/MarketApplicationResponse.ts create mode 100644 src/main/resources/assets/js/app/MarketHelper.ts create mode 100644 src/main/resources/assets/js/app/installation/view/MarketListViewer.ts create mode 100644 src/main/resources/assets/js/app/json/MarketApplicationJson.ts create mode 100644 src/main/resources/assets/js/app/json/MarketApplicationsListJson.ts diff --git a/src/main/resources/assets/js/app/ListMarketApplicationsRequest.ts b/src/main/resources/assets/js/app/ListMarketApplicationsRequest.ts new file mode 100644 index 00000000..8b1c5fdb --- /dev/null +++ b/src/main/resources/assets/js/app/ListMarketApplicationsRequest.ts @@ -0,0 +1,79 @@ +import {MarketApplicationResponse} from './MarketApplicationResponse'; +import {MarketApplication} from './MarketApplication'; +import {MarketApplicationMetadata} from './MarketApplicationMetadata'; +import * as Q from 'q'; +import {PostRequest} from '@enonic/lib-admin-ui/rest/PostRequest'; +import {UriHelper} from '@enonic/lib-admin-ui/util/UriHelper'; +import {JsonResponse} from '@enonic/lib-admin-ui/rest/JsonResponse'; +import {MarketApplicationsListJson} from './json/MarketApplicationsListJson'; + + +export class ListMarketApplicationsRequest + extends PostRequest { + + private version: string; + private start: number = 0; + private count: number = 10; + private ids: string[] = []; + private url: string = 'https://market.enonic.com/applications'; + + setUrl(url: string): ListMarketApplicationsRequest { + this.url = url; + return this; + } + + setIds(ids: string[]): ListMarketApplicationsRequest { + this.ids = ids; + return this; + } + + setVersion(version: string, preprocess: boolean = true): ListMarketApplicationsRequest { + this.version = preprocess ? version.replace(/-.*$/, '') : version; + return this; + } + + setStart(start: number): ListMarketApplicationsRequest { + this.start = start; + return this; + } + + setCount(count: number): ListMarketApplicationsRequest { + this.count = count; + return this; + } + + protected createRequestURI(): string { + return UriHelper.appendUrlParams(this.url, this.params); + } + + protected createRequestData(): Object { + + if (this.ids && this.ids.length > 0) { + this.params = { + ids: this.ids + }; + } + + return super.createRequestData(); + } + + sendAndParse(): Q.Promise { + this.params = { + xpVersion: this.version, + start: this.start, + count: this.count + }; + + return this.send().then((rawResponse: Object) => { + const response = new JsonResponse(rawResponse); + return ListMarketApplicationsRequest.parseResponse(response); + }); + } + + private static parseResponse(response: JsonResponse): MarketApplicationResponse { + const applications: MarketApplication[] = MarketApplication.fromJsonArray(response.getResult().hits); + const hits: number = applications.length; + const totalHits: number = response.getResult().total; + return new MarketApplicationResponse(applications, new MarketApplicationMetadata(hits, totalHits)); + } +} diff --git a/src/main/resources/assets/js/app/MarketApplication.ts b/src/main/resources/assets/js/app/MarketApplication.ts new file mode 100644 index 00000000..a9dc11fc --- /dev/null +++ b/src/main/resources/assets/js/app/MarketApplication.ts @@ -0,0 +1,217 @@ +import {IDentifiable} from '@enonic/lib-admin-ui/IDentifiable'; +import {ApplicationKey} from '@enonic/lib-admin-ui/application/ApplicationKey'; +import {MarketApplicationJson} from '@enonic/lib-admin-ui/application/json/MarketApplicationJson'; +import {i18n} from '@enonic/lib-admin-ui/util/Messages'; +import {ProgressBar} from '@enonic/lib-admin-ui/ui/ProgressBar'; +import {SpanEl} from '@enonic/lib-admin-ui/dom/SpanEl'; + +export class MarketApplication implements IDentifiable { + + private appKey: ApplicationKey; + private displayName: string; + private name: string; + private description: string; + private iconUrl: string; + private url: string; + private latestVersion: string; + private versions: Object; + private status: MarketAppStatus = MarketAppStatus.NOT_INSTALLED; + private progress: number = 0; + + constructor(builder: MarketApplicationBuilder) { + this.displayName = builder.displayName; + this.name = builder.name; + this.description = builder.description; + this.iconUrl = builder.iconUrl; + this.url = builder.url; + this.latestVersion = builder.latestVersion; + this.versions = builder.versions; + this.appKey = builder.appKey; + } + + static fromJson(appKey: string, json: MarketApplicationJson): MarketApplication { + return new MarketApplicationBuilder().fromJson(appKey, json).build(); + } + + static fromJsonArray(appsObj: Object): MarketApplication[] { + const array: MarketApplication[] = []; + for (const name in appsObj) { + if (appsObj.hasOwnProperty(name)) { + array.push(MarketApplication.fromJson(name, appsObj[name] as MarketApplicationJson)); + } + } + return array; + } + + public getId(): string { + return this.appKey ? this.appKey.toString() : ''; + } + + public isEmpty(): boolean { + return !this.displayName && !this.url; + } + + public isToUpdate(): boolean { + return this.status === MarketAppStatus.OLDER_VERSION_INSTALLED; + } + + public getDisplayName(): string { + return this.displayName; + } + + public getName(): string { + return this.name; + } + + public getDescription(): string { + return this.description; + } + + public getIconUrl(): string { + return this.iconUrl; + } + + public getUrl(): string { + return this.url; + } + + public getLatestVersion(): string { + return this.latestVersion; + } + + public getLatestVersionDownloadUrl(): string { + if (this.getLatestVersion()) { + return this.getVersions()[this.getLatestVersion()]['applicationUrl']; + } else { + return null; + } + } + + public getVersions(): Object { + return this.versions; + } + + public setStatus(status: MarketAppStatus) { + this.status = status; + } + + public getStatus(): MarketAppStatus { + return this.status; + } + + public setProgress(progress: number) { + this.progress = progress; + } + + public getProgress(): number { + return this.progress; + } + + public getAppKey(): ApplicationKey { + return this.appKey; + } +} + +export enum MarketAppStatus { + NOT_INSTALLED, + INSTALLED, + INSTALLING, + OLDER_VERSION_INSTALLED, + UNKNOWN +} + +export class MarketAppStatusFormatter { + + public static statusInstallCssClass: string = 'install'; + + public static statusInstalledCssClass: string = 'installed'; + + public static statusInstallingCssClass: string = 'installing'; + + public static statusUpdateCssClass: string = 'update'; + + public static formatStatus(appStatus: MarketAppStatus, progress: number = 0): string { + switch (appStatus) { + case MarketAppStatus.NOT_INSTALLED: + return i18n('action.install'); + case MarketAppStatus.INSTALLED: + return i18n('status.installed'); + case MarketAppStatus.INSTALLING: + return String(progress); + case MarketAppStatus.OLDER_VERSION_INSTALLED: + return i18n('action.update'); + default: + return i18n('status.unknown'); + } + } + + public static createStatusElement(appStatus: MarketAppStatus, progress?: number) { + if (appStatus === MarketAppStatus.INSTALLING) { + return new ProgressBar(progress); + } + + const status = MarketAppStatusFormatter.formatStatus(appStatus, progress); + + return new SpanEl().setHtml(status); + } + + public static getStatusCssClass(appStatus: MarketAppStatus): string { + switch (appStatus) { + case MarketAppStatus.NOT_INSTALLED: + return MarketAppStatusFormatter.statusInstallCssClass; + case MarketAppStatus.INSTALLED: + return MarketAppStatusFormatter.statusInstalledCssClass; + case MarketAppStatus.INSTALLING: + return MarketAppStatusFormatter.statusInstallingCssClass; + case MarketAppStatus.OLDER_VERSION_INSTALLED: + return MarketAppStatusFormatter.statusUpdateCssClass; + default: + return 'unknown'; + } + } + + public static formatPerformedAction(appStatus: MarketAppStatus): string { + switch (appStatus) { + case MarketAppStatus.NOT_INSTALLED: + return 'installed'; + case MarketAppStatus.OLDER_VERSION_INSTALLED: + return 'updated'; + default: + return 'installed'; + } + } +} + +export class MarketApplicationBuilder { + + displayName: string; + name: string; + description: string; + iconUrl: string; + url: string; + latestVersion: string; + versions: Object; + status: string; + appKey: ApplicationKey; + + public fromJson(appKey: string, json: MarketApplicationJson): MarketApplicationBuilder { + this.appKey = ApplicationKey.fromString(appKey); + this.displayName = json.displayName; + this.description = json.description; + this.iconUrl = json.iconUrl; + this.url = json.url; + this.latestVersion = json.latestVersion; + this.versions = json.versions; + this.name = json.name; + return this; + } + + setLatestVersion(latestVersion: string): MarketApplicationBuilder { + this.latestVersion = latestVersion; + return this; + } + + public build(): MarketApplication { + return new MarketApplication(this); + } +} diff --git a/src/main/resources/assets/js/app/MarketApplicationMetadata.ts b/src/main/resources/assets/js/app/MarketApplicationMetadata.ts new file mode 100644 index 00000000..4d1edb27 --- /dev/null +++ b/src/main/resources/assets/js/app/MarketApplicationMetadata.ts @@ -0,0 +1,47 @@ +import {Equitable} from '@enonic/lib-admin-ui/Equitable'; +import {ObjectHelper} from '@enonic/lib-admin-ui/ObjectHelper'; + +export class MarketApplicationMetadata + implements Equitable { + + private hits: number; + + private totalHits: number; + + constructor(hits: number, totalHits: number) { + this.hits = hits; + this.totalHits = totalHits; + } + + getHits(): number { + return this.hits; + } + + getTotalHits(): number { + return this.totalHits; + } + + setHits(hits: number) { + this.hits = hits; + } + + setTotalHits(totalHits: number) { + this.totalHits = totalHits; + } + + equals(o: Equitable): boolean { + if (!ObjectHelper.iFrameSafeInstanceOf(o, MarketApplicationMetadata)) { + return false; + } + + let other = o as MarketApplicationMetadata; + + if (this.hits !== other.hits || + this.totalHits !== other.totalHits) { + + return false; + } + + return true; + } +} diff --git a/src/main/resources/assets/js/app/MarketApplicationResponse.ts b/src/main/resources/assets/js/app/MarketApplicationResponse.ts new file mode 100644 index 00000000..79c67398 --- /dev/null +++ b/src/main/resources/assets/js/app/MarketApplicationResponse.ts @@ -0,0 +1,32 @@ +import {MarketApplication} from './MarketApplication'; +import {MarketApplicationMetadata} from './MarketApplicationMetadata'; + +export class MarketApplicationResponse { + + private applications: MarketApplication[]; + + private metadata: MarketApplicationMetadata; + + constructor(contents: MarketApplication[], metadata: MarketApplicationMetadata) { + this.applications = contents; + this.metadata = metadata; + } + + getApplications(): MarketApplication[] { + return this.applications; + } + + getMetadata(): MarketApplicationMetadata { + return this.metadata; + } + + setApplications(contents: MarketApplication[]): MarketApplicationResponse { + this.applications = contents; + return this; + } + + setMetadata(metadata: MarketApplicationMetadata): MarketApplicationResponse { + this.metadata = metadata; + return this; + } +} diff --git a/src/main/resources/assets/js/app/MarketHelper.ts b/src/main/resources/assets/js/app/MarketHelper.ts new file mode 100644 index 00000000..7bc6d423 --- /dev/null +++ b/src/main/resources/assets/js/app/MarketHelper.ts @@ -0,0 +1,38 @@ +import {MarketApplication} from './MarketApplication'; +import {Application} from '@enonic/lib-admin-ui/application/Application'; + +export class MarketHelper { + + static installedAppCanBeUpdated(marketApp: MarketApplication, installedApp: Application): boolean { + return this.compareVersionNumbers(marketApp.getLatestVersion(), installedApp.getVersion()) > 0; + } + + private static compareVersionNumbers(v1: string, v2: string): number { + let v1parts = v1.split('.').map((el) => { + return parseInt(el, 10); + }); + let v2parts = v2.split('.').map((el) => { + return parseInt(el, 10); + }); + + for (let i = 0; i < v1parts.length; ++i) { + if (v2parts.length === i) { + return 1; + } + + if (v1parts[i] === v2parts[i]) { + continue; + } + if (v1parts[i] > v2parts[i]) { + return 1; + } + return -1; + } + + if (v1parts.length !== v2parts.length) { + return -1; + } + + return 0; + } +} diff --git a/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts b/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts index 7ee74d12..e6b29bf7 100644 --- a/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts +++ b/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts @@ -29,6 +29,8 @@ import {ApplicationsGridList} from './ApplicationsGridList'; import {SelectableListBoxKeyNavigator} from '@enonic/lib-admin-ui/ui/selector/list/SelectableListBoxKeyNavigator'; import {GetApplicationRequest} from '../resource/GetApplicationRequest'; import * as Q from 'q'; +import {ApplicationsListViewer} from './ApplicationsListViewer'; +import {Element} from '@enonic/lib-admin-ui/dom/Element'; export class ApplicationBrowsePanel extends BrowsePanel { @@ -41,7 +43,7 @@ export class ApplicationBrowsePanel protected contextMenu: TreeGridContextMenu; - protected selectionWrapper: SelectableListBoxWrapper; + protected selectionWrapper: SelectionWrapperExt; protected keyNavigator: SelectableListBoxKeyNavigator; @@ -108,7 +110,7 @@ export class ApplicationBrowsePanel this.treeListBox = new ApplicationsGridList(); - this.selectionWrapper = new SelectableListBoxWrapper(this.treeListBox, { + this.selectionWrapper = new SelectionWrapperExt(this.treeListBox, { className: 'applications-list-box-wrapper', maxSelected: 0, checkboxPosition: 'left', @@ -262,10 +264,28 @@ export class ApplicationBrowsePanel } protected enableSelectionMode(): void { - this.treeListBox.setItems(this.selectionWrapper.getSelectedItems()); + this.selectionWrapper.filterSelectedItems(); } protected disableSelectionMode(): void { - this.treeListBox.load(); + this.selectionWrapper.resetFilter(); } } + +class SelectionWrapperExt extends SelectableListBoxWrapper { + + filterSelectedItems(): void { + const selectedItems = this.getSelectedItems(); + + this.itemsWrappers.forEach((itemWrapper: Element[], key: string) => { + itemWrapper[0].setVisible(selectedItems.some((item: Application) => item.getApplicationKey().getName() === key)); + }); + } + + resetFilter(): void { + this.itemsWrappers.forEach((itemWrapper: Element[]) => { + itemWrapper[0].setVisible(true); + }); + } +} + diff --git a/src/main/resources/assets/js/app/browse/ApplicationsListViewer.ts b/src/main/resources/assets/js/app/browse/ApplicationsListViewer.ts index 2b68edd9..388c0ec6 100644 --- a/src/main/resources/assets/js/app/browse/ApplicationsListViewer.ts +++ b/src/main/resources/assets/js/app/browse/ApplicationsListViewer.ts @@ -31,6 +31,10 @@ export class ApplicationsListViewer extends DivEl { this.stateBlock.setItem(application); } + getItem(): Application { + return this.itemViewer.getObject(); + } + doRender(): Q.Promise { return super.doRender().then((rendered: boolean) => { this.appendChild(this.itemViewer); diff --git a/src/main/resources/assets/js/app/browse/InstallApplicationAction.ts b/src/main/resources/assets/js/app/browse/InstallApplicationAction.ts index 41aed5c0..5e315363 100644 --- a/src/main/resources/assets/js/app/browse/InstallApplicationAction.ts +++ b/src/main/resources/assets/js/app/browse/InstallApplicationAction.ts @@ -11,7 +11,7 @@ export class InstallApplicationAction super(i18n('action.install')); this.setEnabled(false); this.onExecuted(() => { - const installedApplications: Application[] = selectionWrapper.getSelectedItems(); + const installedApplications: Application[] = selectionWrapper.getList().getItems(); new InstallAppPromptEvent(installedApplications).fire(); }); } diff --git a/src/main/resources/assets/js/app/installation/InstallAppDialog.ts b/src/main/resources/assets/js/app/installation/InstallAppDialog.ts index b4015e54..6d7c1f33 100644 --- a/src/main/resources/assets/js/app/installation/InstallAppDialog.ts +++ b/src/main/resources/assets/js/app/installation/InstallAppDialog.ts @@ -13,6 +13,7 @@ import {UploadFailedEvent} from '@enonic/lib-admin-ui/ui/uploader/UploadFailedEv import {NotifyManager} from '@enonic/lib-admin-ui/notify/NotifyManager'; import {UploadStartedEvent} from '@enonic/lib-admin-ui/ui/uploader/UploadStartedEvent'; import {DivEl} from '@enonic/lib-admin-ui/dom/DivEl'; +import {Mask} from '@enonic/lib-admin-ui/ui/mask/Mask'; export class InstallAppDialog extends ModalDialog { @@ -27,44 +28,26 @@ export class InstallAppDialog private marketAppsTreeGrid: MarketAppsTreeGrid; + private listMask: Mask; + constructor() { super({ title: i18n('dialog.install'), class: 'install-application-dialog' }); - this.marketAppsTreeGrid.reload(); + this.marketAppsTreeGrid.load(); } protected initElements() { super.initElements(); this.statusMessage = new StatusMessage(); - this.applicationInput = new ApplicationInput(this.getCancelAction(), 'large').setPlaceholder(i18n('dialog.install.search')); - this.clearButton = new ButtonEl(); - this.dropzoneContainer = new DropzoneContainer(true); - - this.marketAppsTreeGrid = new MarketAppsTreeGrid((item, args) => { - if (!item.isVisible()) { - return false; - } - - const marketApp = item.getData(); - if (marketApp.isEmpty()) { - // true for an empty app because it is the empty node that triggers loading - return true; - } - - const inputValue = args?.searchString?.toLowerCase() || ''; - - const displayName = marketApp.getDisplayName().toLowerCase(); - const description = marketApp.getDescription().toLowerCase(); - - return displayName.indexOf(inputValue) >= 0 || description.indexOf(inputValue) >= 0; - }); + this.marketAppsTreeGrid = new MarketAppsTreeGrid(); + this.listMask = new Mask(this.marketAppsTreeGrid); } protected postInitElements() { @@ -79,32 +62,31 @@ export class InstallAppDialog const searchString = this.applicationInput.getValue(); const hasValue = !StringHelper.isEmpty(searchString); this.clearButton.setVisible(hasValue); - this.marketAppsTreeGrid.setFilterArgs({searchString}); + this.marketAppsTreeGrid.setSearchString(searchString); }); this.applicationInput.onAppInstallStarted(() => { - this.marketAppsTreeGrid.mask(); + this.listMask.show(); this.statusMessage.showInstalling(); }); this.applicationInput.onAppInstallFinished(() => { this.clearButton.setVisible(!StringHelper.isEmpty(this.applicationInput.getValue())); - this.marketAppsTreeGrid.unmask(); + this.listMask.hide(); }); this.applicationInput.onAppInstallFailed((message: string) => { this.clearButton.setVisible(!StringHelper.isEmpty(this.applicationInput.getValue())); - this.marketAppsTreeGrid.invalidate(); - this.marketAppsTreeGrid.initData([]); - this.marketAppsTreeGrid.unmask(); + this.marketAppsTreeGrid.clearItems(); + this.listMask.hide(); this.statusMessage.showFailed(message); }); - this.marketAppsTreeGrid.onLoaded(() => { + this.marketAppsTreeGrid.onLoadingFinished(() => { this.statusMessage.reset(); - this.toggleStatusMessage(this.marketAppsTreeGrid.isDataViewEmpty()); + this.toggleStatusMessage(this.marketAppsTreeGrid.getItemCount() === 0); this.removeClass('loading'); this.notifyResize(); }); @@ -112,7 +94,7 @@ export class InstallAppDialog this.marketAppsTreeGrid.onLoadingStarted(() => { this.addClass('loading'); this.statusMessage.showLoading(); - this.marketAppsTreeGrid.mask(); + this.listMask.show(); }); this.clearButton.onClicked(() => { @@ -131,14 +113,14 @@ export class InstallAppDialog this.marketAppsTreeGrid.onShown(() => { const isLoading = this.hasClass('loading'); if (isLoading) { - this.marketAppsTreeGrid.mask(); + this.listMask.show(); } }); - this.marketAppsTreeGrid.onRowCountChanged((event, data) => { + this.marketAppsTreeGrid.onItemsAdded(() => { const isLoading = this.hasClass('loading'); if (!isLoading) { - this.toggleStatusMessage(data.current < 1); + this.toggleStatusMessage(this.marketAppsTreeGrid.getItemCount() < 1); } }); } @@ -153,7 +135,6 @@ export class InstallAppDialog this.statusMessage.hide(); if (!this.getBody().isVisible()) { this.getBody().show(); - this.marketAppsTreeGrid.getGrid().resizeCanvas(); } } } diff --git a/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGrid.ts b/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGrid.ts index 77205935..ed47b35f 100644 --- a/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGrid.ts +++ b/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGrid.ts @@ -1,14 +1,7 @@ -import * as Q from 'q'; import {MarketApplicationFetcher} from '../../resource/MarketApplicationFetcher'; import {i18n} from '@enonic/lib-admin-ui/util/Messages'; import {Application} from '@enonic/lib-admin-ui/application/Application'; -import {Element} from '@enonic/lib-admin-ui/dom/Element'; -import {TreeGrid} from '@enonic/lib-admin-ui/ui/treegrid/TreeGrid'; -import {MarketApplication, MarketAppStatus, MarketAppStatusFormatter} from '@enonic/lib-admin-ui/application/MarketApplication'; -import {TreeNode} from '@enonic/lib-admin-ui/ui/treegrid/TreeNode'; -import {TreeGridBuilder} from '@enonic/lib-admin-ui/ui/treegrid/TreeGridBuilder'; -import {ResponsiveItem} from '@enonic/lib-admin-ui/ui/responsive/ResponsiveItem'; -import {ResponsiveManager} from '@enonic/lib-admin-ui/ui/responsive/ResponsiveManager'; +import {MarketApplication, MarketAppStatus} from '@enonic/lib-admin-ui/application/MarketApplication'; import {ApplicationEvent, ApplicationEventType} from '@enonic/lib-admin-ui/application/ApplicationEvent'; import {DefaultErrorHandler} from '@enonic/lib-admin-ui/DefaultErrorHandler'; import {Exception} from '@enonic/lib-admin-ui/Exception'; @@ -17,27 +10,12 @@ import {MarketHelper} from '@enonic/lib-admin-ui/application/MarketHelper'; import {MarketAppsTreeGridHelper} from './MarketAppsTreeGridHelper'; import {InstallUrlApplicationRequest} from '../../resource/InstallUrlApplicationRequest'; import {ApplicationInstallResult} from '../../resource/ApplicationInstallResult'; -import {KeyHelper} from '@enonic/lib-admin-ui/ui/KeyHelper'; import {ConfirmationDialog} from '@enonic/lib-admin-ui/ui/dialog/ConfirmationDialog'; - -interface GridEventData { - row: number; -} - -interface RowCountChangedEventData - extends Slick.EventData { - previous: number; - current: number; -} - -export type MarketAppsTreeGridFilter = (item: TreeNode, args: MarketAppsTreeGridFilterArgs) => boolean; - -export interface MarketAppsTreeGridFilterArgs { - searchString: string -} +import {ListBox} from '@enonic/lib-admin-ui/ui/selector/list/ListBox'; +import {MarketListViewer} from './MarketListViewer'; export class MarketAppsTreeGrid - extends TreeGrid { + extends ListBox { private installedApplications: Application[]; @@ -45,65 +23,52 @@ export class MarketAppsTreeGrid private loadingStartedListeners: (() => void)[]; + private loadingFinishedListeners: (() => void)[]; + private updateConfirmationDialog?: ConfirmationDialog; - constructor(filter: MarketAppsTreeGridFilter) { - - super(new TreeGridBuilder() - .setColumns(MarketAppsTreeGridHelper.generateColumns()) - .setPartialLoadEnabled(true) - .setLoadBufferSize(2) - .setCheckableRows(false) - .setShowToolbar(false) - .setRowHeight(70) - .disableMultipleSelection(true) - .prependClasses('market-app-tree-grid') - .setSelectedCellCssClass('selected-sort-row') - .setQuietErrorHandling(true) - .setAutoLoad(false) - ); + private loading: boolean; + + private searchString: string; - this.getGridData().setFilter(filter); + constructor() { + super('market-app-tree-grid'); this.installedApplications = []; this.loadingStartedListeners = []; + this.loadingFinishedListeners = []; this.initListeners(); } private initListeners(): void { - this.subscribeAndManageInstallClick(); this.subscribeOnApplicationEvents(); this.onShown(() => { if (!this.loading) { - this.getCurrentData(); - const marketApps = this.getRoot().getAllNodes().map(node => node.getData()); - this.updateAppsStatuses(marketApps); + this.updateAppsStatuses(this.getItems()); } }); } - doRender(): Q.Promise { - return super.doRender().then((rendered) => { - this.initAvailableSizeChangeListener(); - return rendered; + protected createItemView(item: MarketApplication, readOnly: boolean): MarketListViewer { + const viewer = new MarketListViewer(); + viewer.setItem(item); + + viewer.onActionButtonClicked(() => { + if (item.getStatus() === MarketAppStatus.NOT_INSTALLED || item.getStatus() === MarketAppStatus.OLDER_VERSION_INSTALLED) { + this.installApp(item); + } }); + + return viewer; } - private initAvailableSizeChangeListener() { - ResponsiveManager.onAvailableSizeChanged(this, (item: ResponsiveItem) => { - this.getGrid().resizeCanvas(); - }); + protected getItemId(item: MarketApplication): string { + return item.getId(); } - private findNodeByAppUrl(url: string): TreeNode { - const nodes: TreeNode[] = this.getGrid().getDataView().getItems(); - for (const node of nodes) { - if (node.getData().getLatestVersionDownloadUrl() === url) { - return node; - } - } - return null; + private findNodeByAppUrl(url: string): MarketApplication { + return this.getItems().find((app: MarketApplication) => app.getLatestVersionDownloadUrl() === url); } private subscribeOnApplicationEvents() { // update status of market app @@ -128,9 +93,9 @@ export class MarketAppsTreeGrid } private handleApplicationProgress(appUrl: string, progress: number): void { - // TODO: send appKey from backend instead of looking for it! - const nodeToUpdate = this.findNodeByAppUrl(appUrl); - if (!nodeToUpdate) { + const app = this.findNodeByAppUrl(appUrl); + + if (!app) { return; } @@ -138,27 +103,16 @@ export class MarketAppsTreeGrid console.debug(`MarketAppsTreeGrid: progress ${progress}`); } - let app = nodeToUpdate.getData(); app.setProgress(progress); - - let row = this.getGrid().getDataView().getRowById(nodeToUpdate.getId()); - if (row > -1) { - let cell = this.getGrid().getColumnIndex('appStatus'); - this.getGrid().updateCell(row, cell); - } + const viewer: MarketListViewer = this.getItemView(app) as MarketListViewer; + viewer?.setItem(app); } - private installAppByRow(row: number): void { - const marketApplication: MarketApplication = this.getItem(row)?.getData(); - - if (!marketApplication) { - return; - } - + private installApp(marketApplication: MarketApplication): void { if (this.isMajorVersionUpdate(marketApplication)) { - this.showUpdateConfirmationDialog(marketApplication, row); + this.showUpdateConfirmationDialog(marketApplication); } else { - this.doInstallApp(marketApplication, row); + this.doInstallApp(marketApplication); } } @@ -176,7 +130,7 @@ export class MarketAppsTreeGrid return marketAppMajorVersion > installedAppMajorVersion; } - private showUpdateConfirmationDialog(marketApplication: MarketApplication, row: number): void { + private showUpdateConfirmationDialog(marketApplication: MarketApplication): void { const installedApp: Application = this.installedApplications.find((app: Application) => app.getApplicationKey().equals(marketApplication.getAppKey())); @@ -191,7 +145,7 @@ export class MarketAppsTreeGrid marketApplication.getLatestVersion()) ); this.updateConfirmationDialog.setQuestion(this.generateConfirmationQuestion(marketApplication), false); - this.updateConfirmationDialog.setYesCallback(() => this.doInstallApp(marketApplication, row)); + this.updateConfirmationDialog.setYesCallback(() => this.doInstallApp(marketApplication)); this.updateConfirmationDialog.open(); } @@ -203,10 +157,10 @@ export class MarketAppsTreeGrid return `${part1} ${linkHtml} ${part2}`; } - private doInstallApp(marketApplication: MarketApplication, row: number): void { + private doInstallApp(marketApplication: MarketApplication): void { const oldStatus: MarketAppStatus = marketApplication.getStatus(); marketApplication.setStatus(MarketAppStatus.INSTALLING); - this.getGrid().updateRow(row); + this.replaceItems(marketApplication); void new InstallUrlApplicationRequest(marketApplication.getLatestVersionDownloadUrl()) .sendAndParse().then((result: ApplicationInstallResult) => { @@ -221,60 +175,32 @@ export class MarketAppsTreeGrid }).catch((reason) => { marketApplication.setStatus(oldStatus); DefaultErrorHandler.handle(reason); - }).finally(() => { - this.getGrid().updateRow(row); }); } - private subscribeAndManageInstallClick() { - this.getGrid().subscribeOnClick(({target}, data) => { - const elem: Element = Element.fromHtmlElement(target.tagName.toLowerCase() === 'a' ? target : target.parentElement); - const canInstall = elem.hasClass(MarketAppStatusFormatter.statusInstallCssClass) || - elem.hasClass(MarketAppStatusFormatter.statusUpdateCssClass); - if (!canInstall) { - return; - } - - const {row} = (data as GridEventData); - this.installAppByRow(row); - }); - - this.getGrid().setOnKeyDown((event) => { - if (KeyHelper.isEnterKey(event)) { - if (event.target.tagName.toLowerCase() === 'a') { - event.target.click(); - } - } - }); - } - - isEmptyNode(node: TreeNode): boolean { - const data = node.getData(); - return !data.getAppKey(); - } - updateInstallApplications(installApplications: Application[]) { this.installedApplications = installApplications; - - const apps = this.updateAndSortApps(this.getDefaultData()); - - super.initData(this.dataToTreeNodes(apps, this.getRoot().getDefaultRoot())); + const apps = this.updateAndSortApps(this.getItems()); + this.setItems(apps); } - fetchChildren(): Q.Promise { + load(): void { + this.clearItems(); + this.loading = true; this.notifyLoadingStarted(); - this.hideErrorPanelIfVisible(); - return MarketApplicationFetcher.fetchApps().then((data: MarketApplicationResponse) => { - const totalHits = data.getMetadata().getTotalHits(); - this.getRoot().getCurrentRoot().setMaxChildren(totalHits); - return this.updateAndSortApps(data.getApplications()); + MarketApplicationFetcher.fetchApps().then((data: MarketApplicationResponse) => { + const apps = this.updateAndSortApps(data.getApplications()); + this.setItems(apps); }).catch((reason) => { const status500Message = i18n('market.error.500'); const defaultErrorMessage = i18n('market.error.default'); const exception = new Exception(reason.getStatusCode() === 500 ? status500Message : defaultErrorMessage); DefaultErrorHandler.handle(exception); return []; + }).finally(() => { + this.loading = false; + this.notifyLoadingFinished(); }); } @@ -283,13 +209,6 @@ export class MarketAppsTreeGrid return apps.sort(MarketAppsTreeGridHelper.compareAppsByStatusAndDisplayName); } - private hideErrorPanelIfVisible() { - if (this.getErrorPanel().isVisible()) { - this.hideErrorPanel(); - this.mask(); - } - } - private updateAppsStatuses(applications: MarketApplication[]) { const marketApps = applications.filter(marketApp => !!marketApp.getLatestVersion()); const installedApps = this.installedApplications.slice(); @@ -312,23 +231,32 @@ export class MarketAppsTreeGrid }); } - initData(nodes: TreeNode[]) { - super.initData(nodes); - this.getGrid().getCanvasNode().style.height = (`${70 * nodes.length}px`); - this.getGrid().resizeCanvas(); + private filterItemsFunc(marketApp: MarketApplication, searchString: string): boolean { + if (!searchString || marketApp.isEmpty()) { + // true for an empty app because it is the empty node that triggers loading + return true; + } + + const inputValue = searchString?.toLowerCase() || ''; + const displayName = marketApp.getDisplayName().toLowerCase(); + const description = marketApp.getDescription().toLowerCase(); + + return displayName.indexOf(inputValue) >= 0 || description.indexOf(inputValue) >= 0; } - getDataId(data: MarketApplication): string { - return data.getAppKey() ? data.getAppKey().toString() : ''; + setSearchString(searchString: string): void { + this.searchString = searchString; + this.filterItems(); } - setFilterArgs(args: MarketAppsTreeGridFilterArgs) { - this.getGridData().setFilterArgs(args); - this.getGridData().refresh(); + private filterItems(): void { + this.getItems().forEach((item: MarketApplication) => { + this.filterItem(item, this.searchString); + }); } - isDataViewEmpty(): boolean { - return this.getGrid().getDataView().getLength() === 0; + private filterItem(item: MarketApplication, searchString: string): void { + this.getItemView(item)?.setVisible(this.filterItemsFunc(item, searchString)); } onLoadingStarted(listener: () => void) { @@ -347,7 +275,19 @@ export class MarketAppsTreeGrid }); } - onRowCountChanged(listener: (eventData: Slick.EventData, args: RowCountChangedEventData) => void): void { - this.getGridData().onRowCountChanged(listener); + onLoadingFinished(listener: () => void) { + this.loadingFinishedListeners.push(listener); + } + + unLoadingFinished(listener: () => void) { + this.loadingFinishedListeners = this.loadingFinishedListeners.filter((curr) => { + return listener !== curr; + }); + } + + private notifyLoadingFinished() { + this.loadingFinishedListeners.forEach((listener) => { + listener(); + }); } } diff --git a/src/main/resources/assets/js/app/installation/view/MarketListViewer.ts b/src/main/resources/assets/js/app/installation/view/MarketListViewer.ts new file mode 100644 index 00000000..08b26d1c --- /dev/null +++ b/src/main/resources/assets/js/app/installation/view/MarketListViewer.ts @@ -0,0 +1,104 @@ +import {DivEl} from '@enonic/lib-admin-ui/dom/DivEl'; +import {MarketAppViewer} from './MarketAppViewer'; +import {SpanEl} from '@enonic/lib-admin-ui/dom/SpanEl'; +import * as Q from 'q'; +import {MarketApplication, MarketAppStatus, MarketAppStatusFormatter} from '@enonic/lib-admin-ui/application/MarketApplication'; +import {Button} from '@enonic/lib-admin-ui/ui/button/Button'; + +export class MarketListViewer + extends DivEl { + + private readonly marketViewer: MarketAppViewer; + + private readonly versionBlock: VersionBlock; + + private readonly statusBlock: StatusBlock; + + constructor() { + super('market-list-viewer'); + + this.marketViewer = new MarketAppViewer(); + this.versionBlock = new VersionBlock('version'); + this.statusBlock = new StatusBlock('app-status'); + } + + setItem(item: MarketApplication): void { + this.marketViewer.setObject(item); + this.versionBlock.setItem(item); + this.statusBlock.setItem(item); + } + + onActionButtonClicked(listener: () => void): void { + this.statusBlock.onActionButtonClicked(listener); + } + + doRender(): Q.Promise { + return super.doRender().then((rendered: boolean) => { + this.appendChild(this.marketViewer); + this.appendChild(this.versionBlock); + this.appendChild(this.statusBlock); + + return rendered; + }); + } + +} + +class VersionBlock extends DivEl { + + private readonly textEl: SpanEl; + + constructor(className?: string) { + super('text-block ' + (className || '')); + + this.textEl = new SpanEl('text'); + } + + setItem(item: MarketApplication): void { + this.textEl.setHtml(item.getLatestVersion()); + } + + doRender(): Q.Promise { + return super.doRender().then((rendered: boolean) => { + this.appendChild(this.textEl); + + return rendered; + }); + } +} + +class StatusBlock extends DivEl { + + private readonly button: Button; + + constructor(className?: string) { + super('text-block ' + (className || '')); + + this.button = new Button('text'); + } + + setItem(item: MarketApplication): void { + const status: MarketAppStatus = item.getStatus(); + const progress: number = item.getProgress(); + + this.button.removeChildren(); + this.button.appendChild(MarketAppStatusFormatter.createStatusElement(status, progress)); + this.button.addClass(MarketAppStatusFormatter.getStatusCssClass(status)); + + if (status !== MarketAppStatus.NOT_INSTALLED && status !== MarketAppStatus.OLDER_VERSION_INSTALLED) { + this.button.getEl().setTabIndex(-1); + } + } + + onActionButtonClicked(listener: () => void): void { + this.button.onClicked(listener); + } + + doRender(): Q.Promise { + return super.doRender().then((rendered: boolean) => { + this.appendChild(this.button); + + return rendered; + }); + } +} diff --git a/src/main/resources/assets/js/app/json/MarketApplicationJson.ts b/src/main/resources/assets/js/app/json/MarketApplicationJson.ts new file mode 100644 index 00000000..83e5c716 --- /dev/null +++ b/src/main/resources/assets/js/app/json/MarketApplicationJson.ts @@ -0,0 +1,16 @@ +export interface MarketApplicationJson { + + displayName: string; + + name: string; + + description: string; + + iconUrl: string; + + url: string; + + latestVersion: string; + + versions: Object; +} diff --git a/src/main/resources/assets/js/app/json/MarketApplicationsListJson.ts b/src/main/resources/assets/js/app/json/MarketApplicationsListJson.ts new file mode 100644 index 00000000..32fd14ef --- /dev/null +++ b/src/main/resources/assets/js/app/json/MarketApplicationsListJson.ts @@ -0,0 +1,6 @@ +export interface MarketApplicationsListJson { + + total: number; + + hits: Object; +} diff --git a/src/main/resources/assets/js/main.ts b/src/main/resources/assets/js/main.ts index c070ee4c..1b3716a3 100644 --- a/src/main/resources/assets/js/main.ts +++ b/src/main/resources/assets/js/main.ts @@ -5,7 +5,6 @@ import {InstallAppPromptEvent} from './app/installation/InstallAppPromptEvent'; import {Body} from '@enonic/lib-admin-ui/dom/Body'; import {Path} from '@enonic/lib-admin-ui/rest/Path'; import {ConnectionDetector} from '@enonic/lib-admin-ui/system/ConnectionDetector'; -import {UriHelper} from '@enonic/lib-admin-ui/util/UriHelper'; import {AppBar} from '@enonic/lib-admin-ui/app/bar/AppBar'; import {AppHelper} from '@enonic/lib-admin-ui/util/AppHelper'; import {ServerEventsListener} from '@enonic/lib-admin-ui/event/ServerEventsListener'; diff --git a/src/main/resources/assets/styles/installation/market-app-tree-grid.less b/src/main/resources/assets/styles/installation/market-app-tree-grid.less index 8d1aad7c..c1f9abff 100644 --- a/src/main/resources/assets/styles/installation/market-app-tree-grid.less +++ b/src/main/resources/assets/styles/installation/market-app-tree-grid.less @@ -1,51 +1,37 @@ .market-app-tree-grid { - .grid { - .slick-cell { - padding-top: 15px; - height: 52px; - cursor: default; + .market-list-viewer { + display: grid; + grid-template-columns: 1fr 80px 100px; + padding: 8px 16px; - * { - cursor: default; - } - - &.app-name-and-icon { - margin-left: 10px; - flex-grow: 1; + .viewer { + overflow: hidden; - .viewer { - overflow: hidden; - - .names-and-icon-view { - cursor: default; + .names-and-icon-view { + cursor: default; - .@{_COMMON_PREFIX}main-name { - font-size: 16px; - padding-bottom: 2px; - color: @admin-blue; + .@{_COMMON_PREFIX}main-name { + font-size: 16px; + padding-bottom: 2px; + color: @admin-blue; - a { - cursor: pointer !important; - text-decoration: none; + a { + cursor: pointer !important; + text-decoration: none; - &:hover, - &:focus { - text-decoration: underline; - } - } + &:hover, + &:focus { + text-decoration: underline; } } } } + } - &.version { - text-align: center; - color: @admin-black; - font-size: 12px; - flex-shrink: 0; - flex-basis: 90px; - justify-content: center; - } + .text-block { + display: flex; + align-items: center; + justify-content: center; &.app-status { text-align: center; @@ -53,16 +39,17 @@ flex-basis: 100px; justify-content: center; - a { + button { text-decoration: none; + background: none; } .install, .update { - font-size: 16px; cursor: pointer !important; span { + font-size: 16px; cursor: pointer !important; } } @@ -73,7 +60,9 @@ text-decoration: underline; } - color: @admin-green; + span { + color: @admin-green; + } } .update { @@ -82,28 +71,31 @@ text-decoration: underline; } - color: @input-dark-red; + span { + color: @input-dark-red; + } } .installing { width: 100%; + outline: none; .progress-bar { display: block; background-color: @admin-bg-light-gray; + margin-bottom: 0; + height: 12px; } } .installed { - opacity: 0.6; - font-size: 14px; - color: @admin-font-gray2; + span { + opacity: 0.6; + font-size: 14px; + color: @admin-font-gray2; + } } } - - .toggle.icon { - display: none; - } } } } From 12ef32dad94a339c481021783a0a438c506445c0 Mon Sep 17 00:00:00 2001 From: sgauruseu Date: Mon, 2 Sep 2024 18:24:50 +0300 Subject: [PATCH 3/9] Update ui-tests for for grid with ListBox #1746 --- testing/browser.properties | 2 +- testing/libs/WebDriverHelper.js | 1 + testing/libs/elements.js | 26 +++-- testing/libs/studio.utils.js | 38 +++--- testing/package.json | 16 +-- .../application.item.statistic.panel.js | 33 ++++-- .../applications/applications.browse.panel.js | 109 ++++++++++-------- .../applications/install.app.dialog.js | 48 ++++---- .../applications/uninstall.app.dialog.js | 45 +++++--- testing/page_objects/page.js | 29 +++-- ...p.browse.panel.multiple.selections.spec.js | 25 ++-- .../specs/app.browse.panel.selection.spec.js | 13 +-- .../specs/app.browse.panel.toolbar.spec.js | 48 ++++---- .../app.item.statistics.action.menu.spec.js | 16 +-- testing/specs/app.item.statistics.spec.js | 11 +- ..._started.browse.panel.context.menu.spec.js | 3 +- ..._stopped.browse.panel.context.menu.spec.js | 3 +- .../install.app.dialog.search.input.spec.js | 13 +-- testing/specs/install.app.dialog.spec.js | 22 ++-- testing/specs/selection.panel.toggler.spec.js | 9 +- testing/specs/uninstall.app.dialog.spec.js | 63 +++++----- testing/wdio.chrome.conf.js | 11 +- 22 files changed, 309 insertions(+), 275 deletions(-) diff --git a/testing/browser.properties b/testing/browser.properties index 639c31b2..eb60b446 100644 --- a/testing/browser.properties +++ b/testing/browser.properties @@ -4,4 +4,4 @@ platform=ANY browser.width=1800 browser.height=1100 is.headless=false -browser.version=117.0.5938.62 +browser.version=126.0.6478.182 diff --git a/testing/libs/WebDriverHelper.js b/testing/libs/WebDriverHelper.js index 08709264..9b079dc7 100644 --- a/testing/libs/WebDriverHelper.js +++ b/testing/libs/WebDriverHelper.js @@ -48,6 +48,7 @@ WebDriverHelper.prototype.setupBrowser = function setupBrowser(w, h) { automationProtocol: 'webdriver', capabilities: { browserName: browser_name, + "wdio:enforceWebDriverClassic": true, browserVersion: browser_version, 'goog:chromeOptions': makeChromeOptions(isHeadless, width, height) } diff --git a/testing/libs/elements.js b/testing/libs/elements.js index a014c2e1..94c2b18d 100644 --- a/testing/libs/elements.js +++ b/testing/libs/elements.js @@ -7,18 +7,21 @@ module.exports = Object.freeze({ CONTENT_SELECTOR: "//div[contains(@id,'ContentSelector')]", NAMES_VIEW_BY_NAME: "//div[contains(@id,'NamesView') and child::p[contains(@class,'sub-name') and contains(.,'%s')]]", NAMES_VIEW_BY_DISPLAY_NAME: "//div[contains(@id,'NamesView') and child::h6[contains(@class,'main-name') and contains(.,'%s')]]", - SLICK_ROW: "//div[contains(@class,'slick-viewport')]//div[contains(@class,'slick-row')]", - SLICK_ROW_BY_NAME: "//div[contains(@class,'slick-viewport')]//div[contains(@class,'slick-row') and descendant::p[contains(@class,'sub-name') and contains(.,'%s')]]", - SLICK_ROW_BY_DISPLAY_NAME: "//div[contains(@class,'slick-viewport')]//div[contains(@class,'slick-row') and descendant::h6[contains(@class,'main-name') and contains(.,'%s')]]", H6_DISPLAY_NAME: "//div[contains(@id,'NamesView')]//h6[contains(@class,'main-name')]", TEXT_INPUT: "//input[contains(@id,'TextInput')]", DROP_DOWN_HANDLE: "//button[contains(@id,'DropdownHandle')]", - GRID_CANVAS: "//div[contains(@class,'grid-canvas')]", - - slickRowByDisplayName(container, displayName) { - return `${container}//div[contains(@class,'slick-viewport')]//div[contains(@class,'slick-row') and descendant::h6[contains(@class,'main-name') and contains(.,'${displayName}')]]`; + MARKET_MODAL_DIALOG: { + rowByDisplayName(container, displayName) { + return `${container}//div[contains(@id,'MarketListViewer') and (descendant::h6[contains(@class,'main-name') and contains(.,'${displayName}')])]`; + }, + }, + TREE_GRID: { + rowByDisplayName(displayName) { + return `//li[contains(@class,'item-view-wrapper') and (descendant::h6[contains(@class,'main-name') and contains(.,'${displayName}')])]`; + }, }, - itemByDisplayName: function (displayName) { + + itemByDisplayName(displayName) { return `//div[contains(@id,'NamesView') and child::h6[contains(@class,'main-name') and contains(.,'${displayName}')]]` }, appByDescription(description) { @@ -33,8 +36,13 @@ module.exports = Object.freeze({ PRINCIPAL_SELECTED_OPTION: `//div[contains(@id,'security.PrincipalSelectedOptionView')]`, - selectedPrincipalByDisplayName: function (displayName) { + selectedPrincipalByDisplayName(displayName) { return `//div[contains(@id,'PrincipalSelectedOptionView') and descendant::h6[contains(@class,'main-name') and text()='${displayName}']]` }, REMOVE_ICON: "//a[@class='remove']", + DIV: { + CHECKBOX_DIV: "//div[contains(@id,'Checkbox')]", + DROPDOWN_DIV: "//div[contains(@id,'Dropdown')]", + NOTIFICATION_ACTIONS_DIV: "//div[@class='notification-actions']", + }, }); diff --git a/testing/libs/studio.utils.js b/testing/libs/studio.utils.js index d80ee9b2..5cd13fee 100644 --- a/testing/libs/studio.utils.js +++ b/testing/libs/studio.utils.js @@ -13,7 +13,7 @@ module.exports = { if (typeof browser !== "undefined") { return browser; } else { - return webDriverHelper.browser; + return webDriverHelper.browser; } }, async doCloseCurrentBrowserTab() { @@ -62,9 +62,8 @@ module.exports = { return await this.doSwitchToApplicationsBrowsePanel(); } catch (err) { console.log('tried to navigate to applications app, but: ' + err); - let screenshot = appConst.generateRandomName("err_navigate_to_applications"); - await this.saveScreenshot(screenshot); - throw new Error('Error during navigate to Applications app, screenshot: ' + screenshot + " " + err); + let screenshot = await this.saveScreenshotUniqueName('err_navigate_to_applications'); + throw new Error(`Error during navigate to Applications app, screenshot: ${screenshot} ` + err); } }, async doSwitchToApplicationsBrowsePanel() { @@ -75,23 +74,19 @@ module.exports = { await browsePanel.waitForSpinnerNotVisible(); return await browsePanel.waitForGridLoaded(appConst.mediumTimeout); }, - doSwitchToHome() { + async doSwitchToHome() { console.log('testUtils:switching to Home page...'); - return this.getBrowser().switchWindow("Enonic XP Home").then(() => { - console.log("switched to Home Page..."); - }).then(() => { - let homePage = new HomePage(); - return homePage.waitForLoaded(appConst.mediumTimeout); - }); + await this.getBrowser().switchWindow("Enonic XP Home"); + console.log("switched to Home Page..."); + let homePage = new HomePage(); + return await homePage.waitForLoaded(appConst.mediumTimeout); }, - doSwitchToLoginPage() { + async doSwitchToLoginPage() { console.log('testUtils:switching to Home page...'); - return this.getBrowser().switchWindow("Enonic XP - Login").then(() => { - console.log("switched to Login Page..."); - }).then(() => { - let loginPage = new LoginPage(); - return loginPage.waitForPageLoaded(appConst.mediumTimeout); - }); + await this.getBrowser().switchWindow("Enonic XP - Login"); + console.log("switched to Login Page..."); + let loginPage = new LoginPage(); + return await loginPage.waitForPageLoaded(appConst.mediumTimeout); }, switchAndCheckTitle: function (handle, reqTitle) { return this.getBrowser().switchWindow(handle).then(() => { @@ -109,7 +104,7 @@ module.exports = { return await loginPage.pause(1500); }, - saveScreenshot (name, that) { + saveScreenshot(name, that) { let screenshotsDir = path.join(__dirname, '/../build/reports/screenshots/'); if (!fs.existsSync(screenshotsDir)) { fs.mkdirSync(screenshotsDir, {recursive: true}); @@ -119,5 +114,10 @@ module.exports = { }).catch(err => { return console.log('screenshot was not saved ' + screenshotsDir + 'utils ' + err); }) + }, + async saveScreenshotUniqueName(namePart) { + let screenshotName = appConst.generateRandomName(namePart); + await this.saveScreenshot(screenshotName); + return screenshotName; } }; diff --git a/testing/package.json b/testing/package.json index b6aaf60a..c4f01847 100644 --- a/testing/package.json +++ b/testing/package.json @@ -8,15 +8,15 @@ "test:firefox": "npx wdio ./wdio.conf.js" }, "devDependencies": { - "assert": "^2.1.0", - "chai": "^4.3.10", "properties-reader": "^2.3.0", - "webdriverio": "8.22.1", - "@wdio/local-runner": "^8.22.1", - "@wdio/spec-reporter": "^8.21.0", - "@wdio/cli": "^8.22.1", - "@wdio/mocha-framework": "^8.22.0", - "wdio-timeline-reporter": "^5.1.4" + "webdriverio": "^9.0.7", + "@wdio/local-runner": "^9.0.7", + "@wdio/spec-reporter": "^9.0.7", + "@wdio/cli": "^9.0.7", + "@wdio/mocha-framework": "^9.0.6", + "allure-commandline": "^2.30.0", + "@wdio/allure-reporter": "^9.0.4", + "@wdio/concise-reporter": "^9.0.4" }, "engines": { "node": ">= 18.12.1", diff --git a/testing/page_objects/applications/application.item.statistic.panel.js b/testing/page_objects/applications/application.item.statistic.panel.js index b0824b40..eefc17be 100644 --- a/testing/page_objects/applications/application.item.statistic.panel.js +++ b/testing/page_objects/applications/application.item.statistic.panel.js @@ -213,18 +213,31 @@ class ApplicationItemStatisticsPanel extends Page { } } - waitForStopMenuItemVisible() { - return this.waitForElementDisplayed(xpath.stopActionMenuItem, appConst.shortTimeout).catch(err => { - this.saveScreenshot('stop_menu_item_not_visible'); - return false; - }) + async waitForStopMenuItemVisible() { + try { + return await this.waitForElementDisplayed(xpath.stopActionMenuItem, appConst.shortTimeout) + } catch (err) { + let screenshot = await this.saveScreenshotUniqueName('stop_menu_item_not_visible'); + throw new Error('Stop menu item should be displayed: screenshot' + screenshot + ' ' + err); + } } - waitForStartMenuItemVisible() { - return this.waitForElementDisplayed(xpath.startActionMenuItem, appConst.shortTimeout).catch(err => { - this.saveScreenshot("stop_menu_item_not_visible"); - return false; - }) + async waitForStopMenuItemNotDisplayed() { + try { + return await this.waitForElementNotDisplayed(xpath.stopActionMenuItem, appConst.shortTimeout) + } catch (err) { + let screenshot = await this.saveScreenshotUniqueName('stop_menu_item_visible'); + throw new Error('Stop menu item should not be displayed: screenshot' + screenshot + ' ' + err); + } + } + + async waitForStartMenuItemVisible() { + try { + return await this.waitForElementDisplayed(xpath.startActionMenuItem, appConst.shortTimeout) + } catch (err) { + let screenshot = await this.saveScreenshotUniqueName('start_menu_item_not_visible'); + throw new Error('Start menu item should be displayed: screenshot' + screenshot + ' ' + err); + } } } diff --git a/testing/page_objects/applications/applications.browse.panel.js b/testing/page_objects/applications/applications.browse.panel.js index 5a4c5db9..05f9a813 100644 --- a/testing/page_objects/applications/applications.browse.panel.js +++ b/testing/page_objects/applications/applications.browse.panel.js @@ -6,33 +6,31 @@ const LauncherPanel = require('../launcher.panel'); const XPATH = { container: "//div[contains(@id,'ApplicationBrowsePanel')]", launcherButton: "//button[contains(@class,'launcher-button')]", - appGrid: "//div[contains(@class, 'application-grid')]", + applicationsGridListUL: "//ul[contains(@id,'ApplicationsGridList')]", + GRID_LIST_ITEM: "//li[contains(@class,'item-view-wrapper')]", toolbar: "//div[contains(@id,'Toolbar')]", contextMenu: "//ul[contains(@id,'TreeGridContextMenu')]", - treeGridToolbar: `//div[contains(@id,'TreeGridToolbar')]`, + treeGridToolbarDiv: `//div[contains(@id,'ListBoxToolbar')]`, installButton: `//div[contains(@id,'Toolbar')]/button[contains(@id, 'ActionButton') and child::span[contains(.,'Install')]]`, unInstallButton: `//div[contains(@id,'Toolbar')]/button[contains(@id, 'ActionButton') and child::span[contains(.,'Uninstall')]]`, stopButton: "//div[contains(@id,'Toolbar')]/button[contains(@id, 'ActionButton') and child::span[contains(.,'Stop')]]", startButton: `//div[contains(@id,'Toolbar')]/button[contains(@id, 'ActionButton') and child::span[contains(.,'Start')]]`, - selectAllCheckbox: "//div[@id='SelectionController']", - checkboxes: `(//div[contains(@class,'slick-cell-checkboxsel')])`, - appState: "//div[contains(@class,'state')]", - selectedRows: `//div[contains(@class,'slick-viewport')]//div[contains(@class,'slick-row') and child::div[contains(@class,'selected')]]`, + selectAllCheckbox: "//div[contains(@id,'ListSelectionController')]", + appState: "//div[contains(@id,'StatusBlock')]/span", + checkedRowLi: `//li[contains(@class,'checkbox-left selected checked')]`, selectionControllerCheckBox: `//div[contains(@id,'SelectionController')]`, selectionPanelToggler: "//button[contains(@id,'SelectionPanelToggler')]", numberInToggler: "//button[contains(@id,'SelectionPanelToggler')]/span", - appStateByName: displayName => `${lib.slickRowByDisplayName(XPATH.appGrid, displayName)}${XPATH.appState}`, + appStateByName: displayName => `${lib.TREE_GRID.rowByDisplayName(displayName)}${XPATH.appState}`, enabledContextMenuButton: name => { return `${XPATH.contextMenu}/li[contains(@id,'MenuItem') and not(contains(@class,'disabled')) and contains(.,'${name}')]`; }, contextMenuItemByName: (name) => { return `${XPATH.contextMenu}/li[contains(@id,'MenuItem') and contains(.,'${name}')]`; }, - rowByName: name => `//div[contains(@id,'NamesView') and child::p[contains(@class,'sub-name') and contains(.,'${name}')]]`, - rowByDisplayName: - displayName => `//div[contains(@id,'NamesView') and child::h6[contains(@class,'main-name') and contains(.,'${displayName}')]]`, - checkboxByDisplayName: displayName => `${lib.itemByDisplayName( - displayName)}/ancestor::div[contains(@class,'slick-row')]/div[contains(@class,'slick-cell-checkboxsel')]/label`, + rowByDescription: description => `//li[contains(@class,'item-view-wrapper') and (descendant::p[contains(@class,'sub-name') and contains(.,'${description}')])]`, + rowByDisplayName: displayName => `//li[contains(@class,'item-view-wrapper') and (descendant::h6[contains(@class,'main-name') and contains(.,'${displayName}')])]`, + checkboxByDisplayName: displayName => `${XPATH.rowByDisplayName(displayName)}` + lib.DIV.CHECKBOX_DIV + '/label', }; class AppBrowsePanel extends Page { @@ -51,7 +49,8 @@ class AppBrowsePanel extends Page { async waitForGridLoaded(ms) { try { - await this.waitForElementDisplayed(XPATH.container + lib.GRID_CANVAS, ms); + let timeout = typeof ms !== 'undefined' ? ms : appConst.mediumTimeout; + await this.waitForElementDisplayed(XPATH.applicationsGridListUL, timeout); await this.waitForSpinnerNotVisible(appConst.mediumTimeout); console.log('applications browse panel is loaded') } catch (err) { @@ -60,15 +59,15 @@ class AppBrowsePanel extends Page { } } - waitForPanelDisplayed(ms) { + waitForToolbarDisplayed(ms) { return this.waitForElementDisplayed(XPATH.toolbar, ms).catch(() => { throw new Error(`Content browse panel was not loaded in ${ms}`); }); } - async clickOnRowByDescription(name) { + async clickOnRowByDescription(description) { try { - const nameXpath = XPATH.rowByName(name); + const nameXpath = XPATH.rowByDescription(description); await this.waitForElementDisplayed(nameXpath, appConst.shortTimeout); await this.clickOnElement(nameXpath); return await this.pause(500); @@ -106,16 +105,27 @@ class AppBrowsePanel extends Page { }); } - isAppByDescriptionDisplayed(descritption) { - return this.waitForElementDisplayed(XPATH.rowByName(descritption), appConst.shortTimeout).catch(() => { - console.log("item is not displayed:" + descritption); - return false; - }); + async isAppByDescriptionDisplayed(description) { + try { + return await this.isElementDisplayed(XPATH.rowByDescription(description)); + } catch (err) { + let screenshot = await this.saveScreenshotUniqueName('err_app_in_grid'); + throw new Error(`Error occurred in isAppByDescriptionDisplayed, screenshot: ${screenshot} ` + err); + } + } + + async waitForAppByDescriptionDisplayed(description) { + try { + return await this.waitForElementDisplayed(XPATH.rowByDescription(description), appConst.shortTimeout) + } catch (err) { + let screenshot = await this.saveScreenshotUniqueName('err_app_in_grid'); + throw new Error(`Application should be displayed in the app-grid, screenshot: ${screenshot} ` + err); + } } - async getNumberOfSelectedRows() { + async getNumberOfCheckedRows() { try { - let result = await this.findElements(XPATH.selectedRows); + let result = await this.findElements(XPATH.checkedRowLi); return result.length; } catch (err) { throw new Error(`Error when getting selected rows ` + err); @@ -129,10 +139,10 @@ class AppBrowsePanel extends Page { }); } - waitForRowByNameVisible(name) { - const nameXpath = XPATH.rowByName(name); + waitForRowByDescriptionVisible(description) { + const nameXpath = XPATH.rowByDescription(description); return this.waitForElementDisplayed(nameXpath, appConst.mediumTimeout).catch(() => { - throw Error(`Row with the name ${name} is not visible in 3000ms.`) + throw Error(`Row with the name ${description} is not visible in 3000ms.`) }) } @@ -149,7 +159,7 @@ class AppBrowsePanel extends Page { //Wait for application with the description is not displayed in app-grid: waitForAppNotDisplayed(description) { - return this.waitForElementNotDisplayed(XPATH.rowByName(description), appConst.shortTimeout).catch(err => { + return this.waitForElementNotDisplayed(XPATH.rowByDescription(description), appConst.shortTimeout).catch(err => { console.log("item is still displayed:" + description + " " + err); return false; }); @@ -276,15 +286,15 @@ class AppBrowsePanel extends Page { } //clicks on 'select all' checkbox - async clickOnSelectAll() { + async clickOnSelectAllCheckbox() { try { - let checkboxXpath = XPATH.treeGridToolbar + XPATH.selectAllCheckbox; + let checkboxXpath = XPATH.treeGridToolbarDiv + XPATH.selectAllCheckbox; await this.waitForElementDisplayed(checkboxXpath, appConst.mediumTimeout); await this.clickOnElement(checkboxXpath); return await this.pause(500); } catch (err) { - await this.saveScreenshot('err_selecta_ll_checkbox'); - throw Error('Select all checkbox was not found') + let screenshot = await this.saveScreenshotUniqueName('err_selecta_ll_checkbox'); + throw Error(`Select all checkbox was not found, screenshot: ${screenshot} ` + err); } } @@ -337,10 +347,12 @@ class AppBrowsePanel extends Page { }); } - isRowByIndexSelected(rowNumber) { - return this.getAttribute(XPATH.checkboxes + '[' + (rowNumber + 1) + ']', 'class').then(classAttributeValue => { - return classAttributeValue.indexOf('selected') !== -1; - }); + async isRowByIndexChecked(rowNumber) { + let locator = `//li[contains(@class,'item-view-wrapper')]`; + await this.waitForElementDisplayed(locator, appConst.mediumTimeout); + let listItems = await this.findElements(locator); + let attr = await listItems[rowNumber].getAttribute('class'); + return attr.includes('checked'); } //throw exception after the timeout @@ -365,19 +377,24 @@ class AppBrowsePanel extends Page { }); } - getApplicationState(appName) { - let stateXpath = XPATH.appStateByName(appName); - return this.getText(stateXpath).catch(err => { - console.log("Failed to get app-state " + appName + ' ' + err); - throw new Error('App-state was not found: ' + err); - }); + async getApplicationState(appName) { + try { + let stateXpath = XPATH.appStateByName(appName); + await this.waitForElementDisplayed(stateXpath, appConst.mediumTimeout); + return await this.getText(stateXpath); + } catch (err) { + let screenshot = await this.saveScreenshotUniqueName('err_app_state'); + throw new Error(`Error occurred during getting App-state screenshot: ${screenshot} ` + err); + } } - getApplicationDisplayNames() { - let displayNameXpath = lib.SLICK_ROW + lib.H6_DISPLAY_NAME; - return this.getTextInDisplayedElements(displayNameXpath).catch(err => { - throw new Error('Error when get App-display names') - }); + async getApplicationDisplayNames() { + try { + let displayNameXpath = XPATH.applicationsGridListUL + XPATH.GRID_LIST_ITEM + lib.H6_DISPLAY_NAME; + return await this.getTextInDisplayedElements(displayNameXpath); + } catch (err) { + throw new Error('Error occurred in getApplicationDisplayNames') + } } async doOpenLauncherPanel() { diff --git a/testing/page_objects/applications/install.app.dialog.js b/testing/page_objects/applications/install.app.dialog.js index 7715f96c..77fab997 100644 --- a/testing/page_objects/applications/install.app.dialog.js +++ b/testing/page_objects/applications/install.app.dialog.js @@ -6,16 +6,16 @@ const lib = require('../../libs/elements'); const appConst = require('../../libs/app_const'); const XPATH = { container: `//div[contains(@id,'InstallAppDialog')]`, - grid: `//div[contains(@id,'MarketAppsTreeGrid')]`, + gridUL: `//ul[contains(@id,'MarketAppsTreeGrid')]`, filterInput: `//div[contains(@id,'ApplicationInput')]/input`, - appByDisplayName: function (displayName) { + appByDisplayName(displayName) { return `//div[contains(@id,'InstallAppDialog')]//div[contains(@id,'NamesView') and child::h6[contains(@class,'main-name')]]//a[contains(.,'${displayName}')]` }, - installLinkByName: function (displayName) { - return `${lib.slickRowByDisplayName(XPATH.container, displayName)}//a[@class='install']` + installButtonByName(displayName) { + return `${lib.MARKET_MODAL_DIALOG.rowByDisplayName(XPATH.container, displayName)}//button/span[text()='Install']` }, - installedStatusByName: function (displayName) { - return `${lib.slickRowByDisplayName(XPATH.container, displayName)}//a[@class='installed']`; + installedStatusByName(displayName) { + return `${lib.MARKET_MODAL_DIALOG.rowByDisplayName(XPATH.container, displayName)}//button/span[text()='Installed']`; } }; @@ -26,7 +26,7 @@ class InstallAppDialog extends Page { } get grid() { - return XPATH.container + XPATH.grid; + return XPATH.container + XPATH.gridUL; } get cancelButton() { @@ -64,15 +64,17 @@ class InstallAppDialog extends Page { }) } - waitForGridLoaded() { - return this.waitForElementDisplayed(this.grid + lib.H6_DISPLAY_NAME, appConst.longTimeout).catch(err => { - this.saveScreenshot('err_install_dialog_grid'); + async waitForGridLoaded() { + try { + await this.waitForElementDisplayed(this.grid + lib.H6_DISPLAY_NAME, appConst.longTimeout) + } catch (err) { + await this.saveScreenshot('err_install_dialog_grid'); throw new Error('Install App dialog, grid was not loaded! ' + err); - }); + } } waitForInstallLink(appName) { - const selector = XPATH.installLinkByName(appName); + const selector = XPATH.installButtonByName(appName); return this.waitForElementDisplayed(selector, appConst.mediumTimeout).catch(err => { this.saveScreenshot(appConst.generateRandomName('err_install_link')); throw new Error(`Install link is not displayed for! ` + err); @@ -81,27 +83,29 @@ class InstallAppDialog extends Page { async clickOnInstallAppLink(appName) { try { - let selector = XPATH.installLinkByName(appName); - await this.waitForElementDisplayed(selector, appConst.mediumTimeout); + let locator = XPATH.installButtonByName(appName); + await this.waitForElementDisplayed(locator, appConst.mediumTimeout); await this.pause(400); - return await this.clickOnElement(selector); + return await this.clickOnElement(locator); } catch (err) { throw new Error(`Couldn't find install link for app ` + " " + err); } } //checks that 'installed' status appeared - waitForApplicationInstalled(appName) { - const selector = lib.slickRowByDisplayName(XPATH.container, appName) + "//a[@class='installed']"; - return this.waitForElementDisplayed(selector, appConst.longTimeout).catch(err => { - this.saveScreenshot('err_find_installed_status'); - throw new Error(`Couldn't find 'Installed' label for the app` + " " + err); - }); + async waitForApplicationInstalled(appName) { + try { + const locator = XPATH.installedStatusByName(XPATH.container, appName); + return await this.waitForElementDisplayed(locator, appConst.longTimeout) + } catch (err) { + let screenshot = await this.saveScreenshotUniqueName('err_find_installed_status'); + throw new Error(`Couldn't find 'Installed' label for the app, screenshot:` + screenshot + " " + err); + } } isCancelButtonTopDisplayed() { return this.isElementDisplayed(this.cancelButton).catch(err => { - throw new Error('error- Cancel button top is not displayed ' + err); + throw new Error('Error - Cancel button top is not displayed ' + err); }) } diff --git a/testing/page_objects/applications/uninstall.app.dialog.js b/testing/page_objects/applications/uninstall.app.dialog.js index 5defbe74..72c0d160 100644 --- a/testing/page_objects/applications/uninstall.app.dialog.js +++ b/testing/page_objects/applications/uninstall.app.dialog.js @@ -3,7 +3,7 @@ const lib = require('../../libs/elements'); const appConst = require('../../libs/app_const'); const XPATH = { container: `//div[contains(@id,'UninstallApplicationDialog')]`, - content: `//div[contains(@id,'ModalDialogContentPanel')]/h6`, + dialogQuestion: `//div[contains(@id,'ModalDialogContentPanel')]/h6`, yesButton: `//button[contains(@id,'DialogButton')]/span[text()='Yes']`, noButton: `//button[contains(@id,'DialogButton')]/span[text()='No']`, }; @@ -22,8 +22,10 @@ class UninstallAppDialog extends Page { return XPATH.container + XPATH.noButton; } - getHeader() { - return this.getText(XPATH.content); + async getQuestion() { + let result = await this.findElements(XPATH.dialogQuestion); + await this.waitForElementDisplayed(XPATH.dialogQuestion, appConst.mediumTimeout); + return await this.getText(XPATH.dialogQuestion); } async waitForOpened() { @@ -31,7 +33,7 @@ class UninstallAppDialog extends Page { await this.waitForElementDisplayed(XPATH.container, appConst.mediumTimeout); return await this.pause(500); } catch (err) { - this.saveScreenshot('err_load_uninstall_dialog'); + await this.saveScreenshot('err_load_uninstall_dialog'); throw new Error('Uninstall dialog was not loaded! ' + err); } } @@ -45,7 +47,7 @@ class UninstallAppDialog extends Page { clickOnCancelButtonTop() { return this.clickOnElement(this.cancelButtonTop).catch(err => { this.saveScreenshot('err_uninstall_dialog_cancel'); - throw new Error("Error when click on Cancel button " + err); + throw new Error("Error occurred after clicking on Cancel button " + err); }) } @@ -55,25 +57,32 @@ class UninstallAppDialog extends Page { }) } - waitForClosed() { - return this.waitForElementNotDisplayed(XPATH.container, appConst.mediumTimeout).catch(error => { - this.saveScreenshot('err_close_uninstall_dialog'); - throw new Error('Uninstall Dialog was not closed'); - }); + async waitForClosed() { + try { + await this.waitForElementNotDisplayed(XPATH.container, appConst.mediumTimeout); + } catch (err) { + let screenshot = await this.saveScreenshotUniqueName('err_close_uninstall_dialog'); + await this.clickOnCancelButtonTop(); + throw new Error(`Uninstall Dialog was not closed, screenshot : ${screenshot} ` + err); + } } - isYesButtonDisplayed() { - return this.waitForElementDisplayed(this.yesButton, appConst.mediumTimeout).catch(err => { - this.saveScreenshot('err_uninstall_dialog_yes_button'); + async waitForYesButtonDisplayed() { + try { + return await this.waitForElementDisplayed(this.yesButton, appConst.mediumTimeout) + } catch (err) { + await this.saveScreenshot('err_uninstall_dialog_yes_button'); throw new Error('Uninstall Dialog Yes button is not visible ' + err); - }); + } } - isNoButtonDisplayed() { - return this.waitForElementDisplayed(this.noButton, appConst.mediumTimeout).catch(err => { - this.saveScreenshot('err_uninstall_dialog_no_button'); + async waitForNoButtonDisplayed() { + try { + return await this.waitForElementDisplayed(this.noButton, appConst.mediumTimeout) + } catch (err) { + await this.saveScreenshot('err_uninstall_dialog_no_button'); throw new Error('Uninstall Dialog - No button is not visible ' + err); - }); + } } } diff --git a/testing/page_objects/page.js b/testing/page_objects/page.js index fc75f5bd..8f03312e 100644 --- a/testing/page_objects/page.js +++ b/testing/page_objects/page.js @@ -37,10 +37,16 @@ class Page { async getDisplayedElements(selector) { let elements = await this.findElements(selector); - let pr = elements.map(el => el.isDisplayed()); - return Promise.all(pr).then(result => { - return elements.filter((el, i) => result[i]); - }); + if (elements.length === 0) { + return []; + } + return await this.doFilterDisplayedElements(elements); + } + + async doFilterDisplayedElements(elements) { + let pr = await elements.map(async (el) => await el.isDisplayed()); + let result = await Promise.all(pr); + return elements.filter((el, i) => result[i]); } pause(ms) { @@ -61,7 +67,10 @@ class Page { async getTextInElements(selector) { let strings = []; let elements = await this.findElements(selector); - elements.forEach(el => { + if (elements.length === 0) { + return []; + } + await elements.forEach(el => { strings.push(el.getText()); }); return Promise.all(strings); @@ -70,6 +79,9 @@ class Page { async getTextInDisplayedElements(selector) { let strings = []; let elements = await this.getDisplayedElements(selector); + if (elements.length === 0) { + return []; + } elements.forEach(el => { strings.push(el.getText()); }); @@ -166,10 +178,9 @@ class Page { }, {timeout: timeout, timeoutMsg: message}); } - isElementNotDisplayed(selector) { - return this.getDisplayedElements(selector).then(result => { - return result.length == 0; - }) + async isElementNotDisplayed(selector) { + let result = await this.getDisplayedElements(selector); + return result.length === 0; } async getAttribute(selector, attributeName) { diff --git a/testing/specs/app.browse.panel.multiple.selections.spec.js b/testing/specs/app.browse.panel.multiple.selections.spec.js index 78999693..654acb07 100644 --- a/testing/specs/app.browse.panel.multiple.selections.spec.js +++ b/testing/specs/app.browse.panel.multiple.selections.spec.js @@ -1,5 +1,4 @@ -const chai = require('chai'); -const assert = chai.assert; +const assert = require('node:assert'); const webDriverHelper = require('../libs/WebDriverHelper'); const AppBrowsePanel = require('../page_objects/applications/applications.browse.panel'); const appConst = require('../libs/app_const'); @@ -21,13 +20,13 @@ describe('Application Browse Panel, multiple selection in grid', function () { // 1. Select 2 apps (started) await appBrowsePanel.clickOnCheckboxAndSelectRowByDisplayName(appConst.TEST_APPLICATIONS.THIRD_APP); await appBrowsePanel.clickOnCheckboxAndSelectRowByDisplayName(appConst.TEST_APPLICATIONS.FIRST_APP); - // 2. Click on Stop button: + // 2. Click on 'Stop' button: await appBrowsePanel.clickOnStopButton(); // 3. Verify that Start button gets enabled: await appBrowsePanel.waitForStartButtonEnabled(); - // 4. Stop button should be disabled: - let result = await appBrowsePanel.isStopButtonEnabled(); - assert.isFalse(result, "'Stop' button should be disabled"); + // 4. 'Stop' button should be disabled: + let isEnabled = await appBrowsePanel.isStopButtonEnabled(); + assert.ok(isEnabled === false, "'Stop' button should be disabled"); let statisticPanel = new StatisticPanel(); // 5. 'Stopped' status should be displayed in Statistic Panel await statisticPanel.waitForApplicationStatus('Stopped'); @@ -61,8 +60,9 @@ describe('Application Browse Panel, multiple selection in grid', function () { await appBrowsePanel.clickOnStartButton(); //`Start` button gets disabled: await appBrowsePanel.waitForStartButtonDisabled(); - let result = await appBrowsePanel.isStopButtonEnabled(); - assert.isTrue(result, "'Stop' button in browse toolbar should be enabled"); + // 'Stop' button is enabled: + let isEnabled = await appBrowsePanel.isStopButtonEnabled(); + assert.ok(isEnabled, "'Stop' button in browse toolbar should be enabled"); let statisticPanel = new StatisticPanel(); //'Started' status should be displayed in Statistic Panel: await statisticPanel.waitForApplicationStatus('Started'); @@ -89,14 +89,14 @@ describe('Application Browse Panel, multiple selection in grid', function () { async () => { let appBrowsePanel = new AppBrowsePanel(); // 1. Select all applications(one app is stopped): - await appBrowsePanel.clickOnSelectAll(); + await appBrowsePanel.clickOnSelectAllCheckbox(); // 2. Open the context menu: await appBrowsePanel.rightClickOnRowByDisplayName(appConst.TEST_APPLICATIONS.FIRST_APP); await appBrowsePanel.waitForContextMenuDisplayed(); await studioUtils.saveScreenshot('all_apps_context_menu'); // 3. Verify that Start and Stop menu items are enabled: await appBrowsePanel.waitForContextMenuItemEnabled('Start'); - // 'Stop menu item should be enabled' + // 'Stop' menu item should be enabled' await appBrowsePanel.waitForContextMenuItemEnabled('Stop'); }); @@ -122,8 +122,3 @@ function restartApps() { }); }); } - - - - - diff --git a/testing/specs/app.browse.panel.selection.spec.js b/testing/specs/app.browse.panel.selection.spec.js index dd4ea039..788df77b 100644 --- a/testing/specs/app.browse.panel.selection.spec.js +++ b/testing/specs/app.browse.panel.selection.spec.js @@ -1,5 +1,4 @@ -const chai = require('chai'); -const assert = chai.assert; +const assert = require('node:assert'); const webDriverHelper = require('../libs/WebDriverHelper'); const appConst = require('../libs/app_const'); const studioUtils = require('../libs/studio.utils.js'); @@ -27,8 +26,8 @@ describe('Applications Browse panel - selection of items spec', function () { let appBrowsePanel = new AppBrowsePanel(); await appBrowsePanel.clickOnSelectionControllerCheckbox(); await studioUtils.saveScreenshot('selection_controller_checked'); - let result = await appBrowsePanel.getNumberOfSelectedRows(); - assert.isAtLeast(result, EXPECTED_NUMBER_OF_APPLICATIONS, 'all applications should be selected'); + let number = await appBrowsePanel.getNumberOfCheckedRows(); + assert.ok(number >= EXPECTED_NUMBER_OF_APPLICATIONS, 'all applications should be selected'); }); it(`GIVEN all applications are selected WHEN 'selection controller'-checkbox has been clicked THEN all rows in grid get white`, @@ -39,8 +38,8 @@ describe('Applications Browse panel - selection of items spec', function () { // 2. Click on the checkbox and unselect all apps: await appBrowsePanel.clickOnSelectionControllerCheckbox(); await studioUtils.saveScreenshot('selection_controller_unchecked'); - let numb = await appBrowsePanel.getNumberOfSelectedRows(); - assert.equal(numb, 0, 'all applications should be unselected'); + let number = await appBrowsePanel.getNumberOfCheckedRows(); + assert.equal(number, 0, 'all applications should be unselected'); }); it(`WHEN applications grid is loaded THEN rows with applications should be present in the grid`, @@ -48,7 +47,7 @@ describe('Applications Browse panel - selection of items spec', function () { let appBrowsePanel = new AppBrowsePanel(); let result = await appBrowsePanel.getApplicationDisplayNames(); await studioUtils.saveScreenshot('app_browse_application'); - assert.isTrue(result.length > 0, 'rows with applications should be present in the grid'); + assert.ok(result.length > 0, 'rows with applications should be present in the grid'); }); it(`GIVEN existing application is selected WHEN Arrow Down key has been pressed THEN the next application should be selected`, diff --git a/testing/specs/app.browse.panel.toolbar.spec.js b/testing/specs/app.browse.panel.toolbar.spec.js index 70cfef5f..7353e11e 100644 --- a/testing/specs/app.browse.panel.toolbar.spec.js +++ b/testing/specs/app.browse.panel.toolbar.spec.js @@ -1,5 +1,4 @@ -const chai = require('chai'); -const assert = chai.assert; +const assert = require('node:assert'); const webDriverHelper = require('../libs/WebDriverHelper'); const AppBrowsePanel = require('../page_objects/applications/applications.browse.panel'); const InstallAppDialog = require('../page_objects/applications/install.app.dialog'); @@ -8,17 +7,17 @@ const studioUtils = require('../libs/studio.utils.js'); const appConst = require('../libs/app_const'); describe('Application Browse Panel, check buttons in the toolbar', function () { - this.timeout(70000); + this.timeout(appConst.SUITE_TIMEOUT); if (typeof browser === 'undefined') { webDriverHelper.setupBrowser(); } const CONTENT_VIEWER_APP = 'Content Viewer App'; // This displayName should be in grid - const appDisplayName1 = 'Content viewer'; // This displayName should be in Uninstall modal dialog - const APP_2_DISPLAY_NAME = 'Auth0 ID Provider'; + const APP_1_CONTENT_VIEWER = 'Content viewer'; // This displayName should be in Uninstall modal dialog + const APP_2_PROVIDER = 'Auth0 ID Provider'; const APP_1_DESCRIPTION = 'Inspect your content object JSON'; - const APP_2_DSCRIPTION = 'Add Auth0 authentication to your Enonic XP installation'; + const APP_2_DESCRIPTION = 'Add Auth0 authentication to your Enonic XP installation'; it('WHEN app browse panel is loaded AND no selections THEN only `Install` button should be enabled', async () => { @@ -40,23 +39,22 @@ describe('Application Browse Panel, check buttons in the toolbar', function () { // 1. Open Install modal dialog await appBrowsePanel.clickOnInstallButton(); await installAppDialog.waitForGridLoaded(); - await installAppDialog.waitForInstallLink(appDisplayName1); + await installAppDialog.waitForInstallLink(APP_1_CONTENT_VIEWER); // 2. Install two applications and close the modal dialog: await installAppDialog.pause(500); - await installAppDialog.clickOnInstallAppLink(appDisplayName1); + await installAppDialog.clickOnInstallAppLink(APP_1_CONTENT_VIEWER); // 3. Wait for installed - await installAppDialog.waitForAppInstalled(appDisplayName1); - await installAppDialog.waitForInstallLink(APP_2_DISPLAY_NAME); - await installAppDialog.clickOnInstallAppLink(APP_2_DISPLAY_NAME); - await installAppDialog.waitForAppInstalled(APP_2_DISPLAY_NAME); + await installAppDialog.waitForAppInstalled(APP_1_CONTENT_VIEWER); + await installAppDialog.waitForInstallLink(APP_2_PROVIDER); + await installAppDialog.clickOnInstallAppLink(APP_2_PROVIDER); + await installAppDialog.waitForAppInstalled(APP_2_PROVIDER); // 4. Close the dialog await installAppDialog.clickOnCancelButtonTop(); await installAppDialog.waitForClosed(2000); await studioUtils.saveScreenshot('provider_installed'); - let result = await appBrowsePanel.isAppByDescriptionDisplayed(APP_1_DESCRIPTION); - assert.isTrue(result, APP_1_DESCRIPTION + ' application should be present'); - result = await appBrowsePanel.isAppByDescriptionDisplayed(APP_2_DSCRIPTION); - assert.isTrue(result, APP_2_DSCRIPTION + ' application should be present'); + // 5. Verify the apps by their description + await appBrowsePanel.waitForAppByDescriptionDisplayed(APP_1_DESCRIPTION); + await appBrowsePanel.waitForAppByDescriptionDisplayed(APP_2_DESCRIPTION); }); it('WHEN An installed application is selected or unselected THEN the toolbar buttons must be updated', @@ -80,13 +78,13 @@ describe('Application Browse Panel, check buttons in the toolbar', function () { async () => { let appBrowsePanel = new AppBrowsePanel(); // 1. Click on 'Select All' checkbox: - await appBrowsePanel.clickOnSelectAll(); - assert.isTrue(await appBrowsePanel.isRowByIndexSelected(0), 'First row should be selected(blue)'); - assert.isTrue(await appBrowsePanel.isRowByIndexSelected(1), 'Second row should be selected(blue)'); + await appBrowsePanel.clickOnSelectAllCheckbox(); + assert.ok(await appBrowsePanel.isRowByIndexChecked(0), 'First row should be selected(blue)'); + assert.ok(await appBrowsePanel.isRowByIndexChecked(1), 'Second row should be selected(blue)'); // 2. click on 'Select all/Unselect all' checkbox, the checkbox gets unchecked: - await appBrowsePanel.clickOnSelectAll(); - assert.isFalse(await appBrowsePanel.isRowByIndexSelected(0), 'First row should be unselected'); - assert.isFalse(await appBrowsePanel.isRowByIndexSelected(1), 'Second row should be unselected'); + await appBrowsePanel.clickOnSelectAllCheckbox(); + assert.ok(await appBrowsePanel.isRowByIndexChecked(0) === false, 'First row should be unselected'); + assert.ok(await appBrowsePanel.isRowByIndexChecked(1) === false, 'Second row should be unselected'); }); it("WHEN Two existing applications have been checked THEN 'Selection Controller' gets partial", @@ -94,7 +92,7 @@ describe('Application Browse Panel, check buttons in the toolbar', function () { let appBrowsePanel = new AppBrowsePanel(); // 1. Select 2 applications: await appBrowsePanel.clickOnCheckboxAndSelectRowByDisplayName(CONTENT_VIEWER_APP); - await appBrowsePanel.clickOnCheckboxAndSelectRowByDisplayName(APP_2_DISPLAY_NAME); + await appBrowsePanel.clickOnCheckboxAndSelectRowByDisplayName(APP_2_PROVIDER); // 2. Verify that Selection Controller checkbox gets partial: await appBrowsePanel.isSelectionControllerSelected(); await appBrowsePanel.waitForSelectionControllerPartial(); @@ -107,7 +105,7 @@ describe('Application Browse Panel, check buttons in the toolbar', function () { let uninstallAppDialog = new UninstallAppDialog(); // 1. Select 2 applications: await appBrowsePanel.clickOnCheckboxAndSelectRowByDisplayName(CONTENT_VIEWER_APP); - await appBrowsePanel.clickOnCheckboxAndSelectRowByDisplayName(APP_2_DISPLAY_NAME); + await appBrowsePanel.clickOnCheckboxAndSelectRowByDisplayName(APP_2_PROVIDER); // 2. Click on 'Show Selections' button: await appBrowsePanel.clickOnSelectionToggler(); // 3. Click on Uninstall button and confirm: @@ -120,7 +118,7 @@ describe('Application Browse Panel, check buttons in the toolbar', function () { await appBrowsePanel.waitForSelectionTogglerNotVisible(); // 5. Verify that grid is not filtered now: await appBrowsePanel.waitForAppByDisplayNameNotDisplayed(CONTENT_VIEWER_APP); - await appBrowsePanel.waitForAppByDisplayNameNotDisplayed(APP_2_DISPLAY_NAME); + await appBrowsePanel.waitForAppByDisplayNameNotDisplayed(APP_2_PROVIDER); // 6. Verify that initial applications are visible: await appBrowsePanel.waitForAppByDisplayNameDisplayed(appConst.TEST_APPLICATIONS.FIRST_APP); // 7. Selection Controller checkbox gets not selected: diff --git a/testing/specs/app.item.statistics.action.menu.spec.js b/testing/specs/app.item.statistics.action.menu.spec.js index cf12d235..4e7b078d 100644 --- a/testing/specs/app.item.statistics.action.menu.spec.js +++ b/testing/specs/app.item.statistics.action.menu.spec.js @@ -1,5 +1,4 @@ -const chai = require('chai'); -const assert = chai.assert; +const assert = require('node:assert'); const webDriverHelper = require('../libs/WebDriverHelper'); const studioUtils = require('../libs/studio.utils'); const appConstants = require('../libs/app_const'); @@ -23,11 +22,10 @@ describe("Item Statistics Panel 'Action Menu' spec", function () { await appBrowsePanel.clickOnRowByDisplayName(FIRST_APP); // 2. Verify the status in Statistics Panel: let result = await appStatisticPanel.getDropDownButtonText(); - await studioUtils.saveScreenshot("application_action_menu_collapsed"); - assert.strictEqual(result, 'Started', 'correct label should be displayed on the drop-down button'); - - let isVisible = await appStatisticPanel.waitForStopMenuItemVisible(); - assert.isFalse(isVisible, '`Stop` menu item should not be visible, because the menu is collapsed'); + await studioUtils.saveScreenshot('application_action_menu_collapsed'); + assert.equal(result, 'Started', 'expected label should be displayed on the drop-down button'); + // 3. 'Stop' button should be hidden in the menu-button + await appStatisticPanel.waitForStopMenuItemNotDisplayed(); }); it(`GIVEN started application is selected WHEN Click on dropdown handle, expand the menu THEN 'Stop' menu item gets visible`, @@ -39,9 +37,7 @@ describe("Item Statistics Panel 'Action Menu' spec", function () { // 2. Click on dropdown handle and expand the menu in Statistics Panel: await appStatisticPanel.clickOnActionDropDownMenu(); // 3. Verify that Stop menu items gets visible: - let isVisible = await appStatisticPanel.waitForStopMenuItemVisible(); - await studioUtils.saveScreenshot("action_menu_is_expanded"); - assert.isTrue(isVisible, "'Stop' menu item should appear"); + await appStatisticPanel.waitForStopMenuItemVisible(); }); it(`GIVEN existing application is started WHEN Stop menu-item has been clicked THEN the application gets 'stopped'`, diff --git a/testing/specs/app.item.statistics.spec.js b/testing/specs/app.item.statistics.spec.js index df0f8bb7..27cb8569 100644 --- a/testing/specs/app.item.statistics.spec.js +++ b/testing/specs/app.item.statistics.spec.js @@ -1,5 +1,4 @@ -const chai = require('chai'); -const assert = chai.assert; +const assert = require('node:assert'); const webDriverHelper = require('../libs/WebDriverHelper'); const studioUtils = require('../libs/studio.utils'); const appConstants = require('../libs/app_const'); @@ -52,7 +51,7 @@ describe('Tests for Applications Item Statistics Panel', function () { assert.strictEqual(actualName, Apps.firstApp, `Application should be "${Apps.firstApp}".`); let actualHeaders = await appStatisticPanel.getApplicationDataHeaders(); - assert.isTrue(actualHeaders.length > 0, "app-info should be displayed in the statistics panel"); + assert.ok(actualHeaders.length > 0, "app-info should be displayed in the statistics panel"); // 3. Verify that expected application's item-data should be displayed in Statistics Panel: assert.strictEqual(actualHeaders[0], 'Installed'); assert.strictEqual(actualHeaders[1], 'Version'); @@ -68,7 +67,7 @@ describe('Tests for Applications Item Statistics Panel', function () { await appBrowsePanel.clickOnRowByDisplayName(Apps.firstApp); await appStatisticPanel.waitForSiteDataDisplayed(); let headers = await appStatisticPanel.getSiteDataHeaders(); - assert.isTrue(headers.length > 0, "Site info should be displayed in the statistics panel"); + assert.ok(headers.length > 0, "Site info should be displayed in the statistics panel"); // 3. Verify that expected application's site-info should be displayed in Statistics Panel: assert.strictEqual(headers[0], 'Content Types', "Expected header should be present in statistics panel"); assert.strictEqual(headers[1], 'Page', "Expected header should be present in statistics panel"); @@ -141,7 +140,7 @@ describe('Tests for Applications Item Statistics Panel', function () { // 'Content Types' header should not be displayed: await appStatisticPanel.waitForContentTypesHeaderNotDisplayed(); // 'Part' header should not be displayed: - await appStatisticPanel.waitForPartHeaderNotDisplayed(); + await appStatisticPanel.waitForPartHeaderNotDisplayed(); }); it(`WHEN two applications have been selected THEN should display info of the last selected application`, @@ -164,7 +163,7 @@ describe('Tests for Applications Item Statistics Panel', function () { // 2. Verify that Content types list is not empty: let contentTypes = await appStatisticPanel.getContentTypes(); await studioUtils.saveScreenshot('application_started_again'); - assert.isTrue(contentTypes.length > 0, 'Content Types list should not be empty'); + assert.ok(contentTypes.length > 0, 'Content Types list should not be empty'); }); beforeEach(() => studioUtils.navigateToApplicationsApp()); afterEach(() => studioUtils.doCloseCurrentBrowserTab()); diff --git a/testing/specs/app_started.browse.panel.context.menu.spec.js b/testing/specs/app_started.browse.panel.context.menu.spec.js index 25fa0b3b..06f3bad4 100644 --- a/testing/specs/app_started.browse.panel.context.menu.spec.js +++ b/testing/specs/app_started.browse.panel.context.menu.spec.js @@ -74,6 +74,5 @@ describe("Tests for Applications Grid context menu", function () { before(() => { return console.log('specification is starting: ' + this.title); }); -}) -; +}); diff --git a/testing/specs/app_stopped.browse.panel.context.menu.spec.js b/testing/specs/app_stopped.browse.panel.context.menu.spec.js index ccc7f718..c9d231a7 100644 --- a/testing/specs/app_stopped.browse.panel.context.menu.spec.js +++ b/testing/specs/app_stopped.browse.panel.context.menu.spec.js @@ -1,5 +1,4 @@ -const chai = require('chai'); -const assert = chai.assert; +const assert = require('node:assert'); const webDriverHelper = require('../libs/WebDriverHelper'); const AppBrowsePanel = require('../page_objects/applications/applications.browse.panel'); const studioUtils = require('../libs/studio.utils.js'); diff --git a/testing/specs/install.app.dialog.search.input.spec.js b/testing/specs/install.app.dialog.search.input.spec.js index 3717df62..1d5864cd 100644 --- a/testing/specs/install.app.dialog.search.input.spec.js +++ b/testing/specs/install.app.dialog.search.input.spec.js @@ -1,5 +1,4 @@ -const chai = require('chai'); -const assert = chai.assert; +const assert = require('node:assert'); const webDriverHelper = require('../libs/WebDriverHelper'); const AppBrowsePanel = require('../page_objects/applications/applications.browse.panel'); const InstallDialog = require('../page_objects/applications/install.app.dialog'); @@ -31,8 +30,8 @@ describe('Install app dialog, search input spec.', function () { await installDialog.typeSearchTextAndEnter(not_existing); // 4. Verify that validation message appears: let message = await installDialog.getErrorValidationMessage(); - await studioUtils.saveScreenshot("url_not_exist"); - assert.isTrue(message.includes('Failed to process application from'), 'expected notification message should appear'); + await studioUtils.saveScreenshot('url_not_exist'); + assert.ok(message.includes('Failed to process application from'), 'expected notification message should appear'); }); it(`GIVEN 'install app' dialog is opened WHEN path to local file has been typed THEN expected warning message should appear`, @@ -52,7 +51,7 @@ describe('Install app dialog, search input spec.', function () { await installDialog.waitForApplicationNotFoundMessage(); let message = await installDialog.applicationNotFoundMessage(); await studioUtils.saveScreenshot('app_not_found'); - assert.isTrue(message.includes('No applications found'), "'No applications found' - message should appear"); + assert.ok(message.includes('No applications found'), "'No applications found' - message should appear"); }); it(`GIVEN 'install app' dialog is opened WHEN actual URL has been typed and 'Enter' key pressed THEN application should be installed`, @@ -64,11 +63,11 @@ describe('Install app dialog, search input spec.', function () { await installDialog.waitForOpened(); // Type a correct URL for the app: await installDialog.typeSearchTextAndEnter(LOG_BROWSER_APP_URL); - await installDialog.waitForClosed(45000); + await installDialog.waitForClosed(40000); let message = await installDialog.waitForNotificationMessage(); await studioUtils.saveScreenshot('app_url_installed'); - assert.isTrue(message.includes('Application \'Log Browser\' installed successfully'), + assert.ok(message.includes("Application 'Log Browser' installed successfully"), 'expected notification message should appear'); }); diff --git a/testing/specs/install.app.dialog.spec.js b/testing/specs/install.app.dialog.spec.js index 6d5624d1..39a620e5 100644 --- a/testing/specs/install.app.dialog.spec.js +++ b/testing/specs/install.app.dialog.spec.js @@ -1,7 +1,6 @@ /** */ -const chai = require('chai'); -const assert = chai.assert; +const assert = require('node:assert'); const webDriverHelper = require('../libs/WebDriverHelper'); const AppBrowsePanel = require('../page_objects/applications/applications.browse.panel'); const InstallDialog = require('../page_objects/applications/install.app.dialog'); @@ -57,8 +56,8 @@ describe('Install Application Dialog specification', function () { await dialog.waitForApplicationDisplayed('ADFS ID Provider'); let names = await dialog.getApplicationNames(); await studioUtils.saveScreenshot('install_dlg_sorted'); - assert.isAbove(names.length, 0, 'There should be apps in the grid'); - assert.isTrue(names.includes('ADFS ID Provider'), 'Auth0 ID Provider this application should be second'); + assert.ok(names.length > 0, 'There should be apps in the grid'); + assert.ok(names.includes('ADFS ID Provider'), 'Auth0 ID Provider this application should be second'); }); it('GIVEN install dialog is opened WHEN search text has been typed THEN apps should be filtered ', async () => { @@ -71,7 +70,7 @@ describe('Install Application Dialog specification', function () { await dialog.typeSearchText(CHUCK_NORRIS_APP_DISPLAY_NAME); await dialog.waitForApplicationDisplayed('Chuck Norris'); let names = await dialog.getApplicationNames(); - assert.isTrue(names.length === 1, 'only one application should be displayed'); + assert.ok(names.length === 1, 'only one application should be displayed'); assert.equal(names[0], CHUCK_NORRIS_APP_DISPLAY_NAME, 'Chuck Norris app should be filtered'); }); @@ -83,13 +82,14 @@ describe('Install Application Dialog specification', function () { await dialog.waitForSpinnerNotVisible(); // 1. Install the app: await dialog.clickOnInstallAppLink(CHUCK_NORRIS_APP_DISPLAY_NAME); - let visible = await dialog.waitForAppInstalled(CHUCK_NORRIS_APP_DISPLAY_NAME); - assert.isTrue(visible, `'${CHUCK_NORRIS_APP_DISPLAY_NAME}' should've been installed by now`); + // 2. Verify that 'Installed' button appears in the list element in modal dialog: + await dialog.waitForAppInstalled(CHUCK_NORRIS_APP_DISPLAY_NAME); + // 3. Close the modal dialog: await dialog.clickOnCancelButtonTop(); await dialog.waitForClosed(); - // 2. Check the app in grid: - visible = await appBrowsePanel.isAppByDescriptionDisplayed(CHUCK_NORRIS_APP_DISPLAY_NAME); - assert.isTrue(visible, `'${CHUCK_NORRIS_APP_DISPLAY_NAME}' application should've been present in the grid`); + // 4. Verify the app in grid: + await appBrowsePanel.waitForAppByDescriptionDisplayed(CHUCK_NORRIS_APP_DISPLAY_NAME); + // 5. Verify the notification message: let message = await appBrowsePanel.waitForNotificationMessage(); assert.equal(message, 'Application \'Chuck Norris\' installed successfully', `Incorrect notification message [${message}]`) }); @@ -105,7 +105,7 @@ describe('Install Application Dialog specification', function () { await installAppDialog.waitForSpinnerNotVisible(); // Verify that 'Installed' button is displayed in the modal dialog: let result = await installAppDialog.waitForApplicationInstalled(CHUCK_NORRIS_APP_DISPLAY_NAME); - assert.isTrue(result, `'${CHUCK_NORRIS_APP_DISPLAY_NAME}' should be with Installed status`); + assert.ok(result, `'${CHUCK_NORRIS_APP_DISPLAY_NAME}' should be with Installed status`); }); // Verifies issue https://github.com/enonic/app-applications/issues/241 diff --git a/testing/specs/selection.panel.toggler.spec.js b/testing/specs/selection.panel.toggler.spec.js index 0929f3b8..77f0b206 100644 --- a/testing/specs/selection.panel.toggler.spec.js +++ b/testing/specs/selection.panel.toggler.spec.js @@ -1,5 +1,4 @@ -const chai = require('chai'); -const assert = chai.assert; +const assert = require('node:assert'); const webDriverHelper = require('../libs/WebDriverHelper'); const appConst = require('../libs/app_const'); const studioUtils = require('../libs/studio.utils.js'); @@ -16,7 +15,7 @@ describe('Applications Browse panel - `Selection Toggler` spec', function () { async () => { let appBrowsePanel = new AppBrowsePanel(); let isVisible = await appBrowsePanel.waitForSelectionTogglerVisible(); - assert.isFalse(isVisible, "'selection toogler' should not be displayed"); + assert.ok(isVisible === false, "'selection toogler' should not be displayed"); }); it(`WHEN existing application is checked THEN 'selection toggler' gets visible`, @@ -24,7 +23,7 @@ describe('Applications Browse panel - `Selection Toggler` spec', function () { let appBrowsePanel = new AppBrowsePanel(); await appBrowsePanel.clickOnCheckboxAndSelectRowByDisplayName(appConst.TEST_APPLICATIONS.FIRST_APP); let isVisible = await appBrowsePanel.waitForSelectionTogglerVisible(); - assert.isTrue(isVisible, "'selection toogler' should be displayed"); + assert.ok(isVisible, "'selection toogler' should be displayed"); }); it("WHEN two application are checked THEN '2' should appear in 'selection toggler'", @@ -71,7 +70,7 @@ describe('Applications Browse panel - `Selection Toggler` spec', function () { await appBrowsePanel.pause(1000); let names = await appBrowsePanel.getApplicationDisplayNames(); await studioUtils.saveScreenshot('hide_selection'); - assert.isTrue(names.length > 2, 'original grid should be restored'); + assert.ok(names.length > 2, 'original grid should be restored'); }); beforeEach(() => studioUtils.navigateToApplicationsApp()); diff --git a/testing/specs/uninstall.app.dialog.spec.js b/testing/specs/uninstall.app.dialog.spec.js index f83ee7e6..338a1105 100644 --- a/testing/specs/uninstall.app.dialog.spec.js +++ b/testing/specs/uninstall.app.dialog.spec.js @@ -1,14 +1,14 @@ -const chai = require('chai'); -const assert = chai.assert; +const assert = require('node:assert'); const webDriverHelper = require('../libs/WebDriverHelper'); const AppBrowsePanel = require('../page_objects/applications/applications.browse.panel'); const UninstallAppDialog = require('../page_objects/applications/uninstall.app.dialog'); const InstallAppDialog = require('../page_objects/applications/install.app.dialog'); const studioUtils = require('../libs/studio.utils.js'); const AppStatisticPanel = require('../page_objects/applications/application.item.statistic.panel'); +const appConst = require('../libs/app_const'); describe('Uninstall Application dialog specification', function () { - this.timeout(70000); + this.timeout(appConst.SUITE_TIMEOUT); if (typeof browser === 'undefined') { webDriverHelper.setupBrowser(); @@ -21,13 +21,13 @@ describe('Uninstall Application dialog specification', function () { let uninstallAppDialog = new UninstallAppDialog(); // 1. Select 'Chuck Norris' app and click on 'Uninstall' button: await openUninstallDialog(); - let dialogMessage = await uninstallAppDialog.getHeader(); + let dialogMessage = await uninstallAppDialog.getQuestion(); assert.equal(dialogMessage, 'Are you sure you want to uninstall selected application(s)?', 'Expected message should be in the dialog message'); // "Yes button should be visible" - await uninstallAppDialog.isYesButtonDisplayed(); + await uninstallAppDialog.waitForYesButtonDisplayed(); // "No button should be visible" - await uninstallAppDialog.isNoButtonDisplayed(); + await uninstallAppDialog.waitForNoButtonDisplayed(); }); it("GIVEN uninstall dialog is opened WHEN 'Cancel-top' button has been pressed THEN modal dialog closes", @@ -86,8 +86,8 @@ describe('Uninstall Application dialog specification', function () { await installDialog.waitForSpinnerNotVisible(); // 1. Install the "Audit log browser" app: await installDialog.clickOnInstallAppLink(AUDIT_LOG_APP_NAME); - let visible = await installDialog.waitForAppInstalled(AUDIT_LOG_APP_NAME); - assert.isTrue(visible, `'${AUDIT_LOG_APP_NAME}' should've been installed by now`); + let isVisible = await installDialog.waitForAppInstalled(AUDIT_LOG_APP_NAME); + assert.ok(isVisible, `'${AUDIT_LOG_APP_NAME}' should've been installed by now`); await installDialog.clickOnCancelButtonTop(); await installDialog.waitForClosed(); // 2. Uninstall the "Audit log browser" application @@ -112,40 +112,29 @@ describe('Uninstall Application dialog specification', function () { }) }); -function openUninstallDialog() { - const chuckName = 'A Chuck Norris fact widget'; +async function openUninstallDialog() { + const description = 'A Chuck Norris fact widget'; const chuckDisplayName = 'Chuck Norris'; let appBrowsePanel = new AppBrowsePanel(); let uninstallAppDialog = new UninstallAppDialog(); - return appBrowsePanel.isAppByDescriptionDisplayed(chuckDisplayName).then(result => { - if (!result) { - return installApp(chuckDisplayName); - } - }).then(() => { - return appBrowsePanel.clickOnRowByDescription(chuckName); - }).then(() => { - return appBrowsePanel.clickOnUninstallButton(); - }).then(() => { - return uninstallAppDialog.waitForOpened(); - }); + let result = await appBrowsePanel.isAppByDescriptionDisplayed(description); + if (!result) { + await installApp(chuckDisplayName); + } + await appBrowsePanel.clickOnRowByDescription(chuckDisplayName); + await appBrowsePanel.clickOnUninstallButton(); + return await uninstallAppDialog.waitForOpened(); } -function installApp(displayName) { +async function installApp(displayName) { let appBrowsePanel = new AppBrowsePanel(); let installAppDialog = new InstallAppDialog(); - return appBrowsePanel.clickOnInstallButton().then(() => { - return installAppDialog.waitForOpened(); - }).then(() => { - return installAppDialog.typeSearchText(displayName); - }).then(() => { - return installAppDialog.pause(1000); - }).then(() => { - return installAppDialog.waitForApplicationDisplayed(displayName); - }).then(() => { - return installAppDialog.clickOnInstallAppLink(displayName); - }).then(() => { - return installAppDialog.waitForAppInstalled(displayName); - }).then(() => { - return installAppDialog.clickOnCancelButtonTop(); - }); + await appBrowsePanel.clickOnInstallButton(); + await installAppDialog.waitForOpened(); + await installAppDialog.typeSearchText(displayName); + await installAppDialog.pause(1000); + await installAppDialog.waitForApplicationDisplayed(displayName); + await installAppDialog.clickOnInstallAppLink(displayName); + await installAppDialog.waitForAppInstalled(displayName); + return await installAppDialog.clickOnCancelButtonTop(); } diff --git a/testing/wdio.chrome.conf.js b/testing/wdio.chrome.conf.js index cf26b86b..f2c2baf7 100644 --- a/testing/wdio.chrome.conf.js +++ b/testing/wdio.chrome.conf.js @@ -1,5 +1,4 @@ const path = require('path'); -const {TimelineService} = require('wdio-timeline-reporter/timeline-service'); const PropertiesReader = require('properties-reader'); const file = path.join(__dirname, '/browser.properties'); const properties = PropertiesReader(file); @@ -15,6 +14,7 @@ exports.config = { capabilities: [{ browserName: 'chrome', browserVersion: browser_version, + "wdio:enforceWebDriverClassic": true, 'goog:chromeOptions': { "args": [ "--headless", "--disable-gpu", "--no-sandbox", @@ -41,9 +41,6 @@ exports.config = { // Default request retries count connectionRetryCount: 3, - //services: ['chromedriver'], - services: [[TimelineService]], - framework: 'mocha', mochaOpts: { ui: 'bdd', @@ -52,11 +49,13 @@ exports.config = { // Set directory to store all logs into outputDir: "./build/reports/logs/", - reporters: ['spec', ['timeline', { outputDir: './build/reports/timeline' }] + reporters: ['concise', + ['allure', + {outputDir: './build/reports/allure', disableWebdriverStepsReporting: true, disableWebdriverScreenshotsReporting: true,}], ], // Hook that gets executed before the suite starts beforeSuite: function (suite) { browser.url(this.baseUrl); }, -}; \ No newline at end of file +}; From 3ecf2e6f8a633311020f57602317a52e4c3488de Mon Sep 17 00:00:00 2001 From: sgauruseu Date: Mon, 2 Sep 2024 18:41:44 +0300 Subject: [PATCH 4/9] ui-tests issue #1746 --- testing/build.gradle | 100 ++++++++++++++++++++++++++++--------------- 1 file changed, 66 insertions(+), 34 deletions(-) diff --git a/testing/build.gradle b/testing/build.gradle index 654b5a31..c56243fe 100644 --- a/testing/build.gradle +++ b/testing/build.gradle @@ -1,4 +1,4 @@ -import com.enonic.uitest.server.ServerInstance +import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform plugins { id 'java' @@ -17,31 +17,28 @@ configurations { distro } -ext { - unpackDir = "$buildDir/install" - distroDir = "$unpackDir/enonic-xp-generic-$version" - deployDir = "$distroDir/home/deploy" - appDir = "$projectDir/test-applications" - xpHome = "$distroDir/home" - configDir = "$xpHome/config" - xpServer = new ServerInstance() - appName = "app-applications" - appFile = "$distroDir/system/40/${appName}-${version}.jar" - appUrl = project.hasProperty( 'appUrl' ) ? appUrl : "file:///$projectDir/../build/libs/${appName}.jar" -} +def unpackDir = layout.buildDirectory.dir( "install" ).get() +def distroDir = unpackDir.dir( "enonic-xp-generic-$version" ) +def deployDir = distroDir.dir( "home/deploy" ) +def appDir = "$projectDir/test-applications" +def xpHome = "$distroDir/home" +def configDir = "$xpHome/config" +def appName = "app-applications" +def appFile = "$distroDir/system/40/${appName}-${version}.jar" +def appUrl = project.hasProperty( 'appUrl' ) ? appUrl : "file:///$projectDir/../build/libs/${appName}.jar" dependencies { distro "com.enonic.xp:enonic-xp-generic:$version@zip" } -task unpackDistro( type: Copy ) { +tasks.register( 'unpackDistro', Copy ) { from { configurations.distro.collect { zipTree( it ) } } - into file( unpackDir ) + into unpackDir } -task copyConfig( type: Copy ) { +tasks.register( 'copyConfig', Copy ) { println "$appDir/common-config" from "$appDir/common-config" include '**.*.cfg' @@ -50,7 +47,7 @@ task copyConfig( type: Copy ) { mustRunAfter unpackDistro } -task copyApps( type: Copy ) { +tasks.register( 'copyApps', Copy ) { println appDir from file( appDir ) include '*.jar' @@ -58,47 +55,82 @@ task copyApps( type: Copy ) { mustRunAfter unpackDistro } -task deployApp( type: DefaultTask ) { +tasks.register( 'deployApp', DefaultTask ) { outputs.files( appFile ) outputs.upToDateWhen { false } doLast { - def f = new File( appFile ) + def f = new File( appFile as String ) println "Deleting ${appFile}. Exists ${f.exists()}" f.delete() println "Copying from ${appUrl} to ${appFile}" - new URL( appUrl ).withInputStream { i -> f.withOutputStream { it << i } } + new URL( appUrl as String ).withInputStream { i -> f.withOutputStream { it << i } } } mustRunAfter unpackDistro } -task startServer( dependsOn: unpackDistro ) { +def process +tasks.register( 'startServer' ) { + dependsOn unpackDistro doLast { - xpServer.installDir = file( distroDir ) - xpServer.start() + def pb + if ( DefaultNativePlatform.getCurrentOperatingSystem().windows ) + { + pb = new ProcessBuilder( 'cmd', '/c', "${distroDir}\\bin\\server.bat" ) + } + else + { + pb = new ProcessBuilder( "${distroDir}/bin/server.sh" ) + } + Map env = pb.environment() + env.put( "XP_HOME", "${xpHome}".toString() ) + + def logsPath = layout.buildDirectory.dir( "reports/logs" ).get() + mkdir logsPath.asFile + pb.redirectOutput( logsPath.file( "xp.log" ).asFile ) + pb.redirectErrorStream( true ) + process = pb.start() + sleep( 60 * 1000 ) } } -task stopServer { +tasks.register( 'stopServer' ) { doLast { - xpServer.stop() + if ( DefaultNativePlatform.getCurrentOperatingSystem().windows ) + { + Runtime.getRuntime().exec( "taskkill /F /T /PID " + process.pid() ); + } + else + { + process.destroy() + } } } -task testAppFirefox( type: NpmTask, - dependsOn: [npmInstall, unpackDistro, copyConfig, copyApps, deployApp, startServer] ) { - args = ['run-script', 'test:firefox'] - finalizedBy stopServer +tasks.register( 'cleanup', Delete ) { + delete './build/reports/allure' } -task w_testAppChrome( type: NpmTask, - dependsOn: [npmInstall, unpackDistro, copyConfig, copyApps, deployApp, startServer] ) { - args = ['run-script', 'test_apps:wdio_chrome'] +tasks.register( 'generateReportAndStopServer', NpmTask ) { + args = ['run-script', 'allure-report'] + finalizedBy cleanup finalizedBy stopServer } -task w_testAppChromeLocal( type: NpmTask, dependsOn: [npmInstall] ) { - args = ['run-script', 'test_apps:wdio_chrome'] + +tasks.register( 'testAppFirefox', NpmTask ) { + dependsOn( npmInstall, unpackDistro, copyConfig, copyApps, deployApp, startServer ) + args = ['run-script', 'test:firefox'] + finalizedBy generateReportAndStopServer } +tasks.register( 'w_testAppChrome', NpmTask ) { + dependsOn( npmInstall, unpackDistro, copyConfig, copyApps, deployApp, startServer ) + args = ['run-script', 'test_apps:wdio_chrome'] + finalizedBy generateReportAndStopServer +} +tasks.register( 'w_testAppChromeLocal', NpmTask ) { + dependsOn( npmInstall ) + args = ['run-script', 'test_apps:wdio_chrome'] +} From b204b369e9f095d50a29e51b9af03d5fdd06bdf6 Mon Sep 17 00:00:00 2001 From: sgauruseu Date: Tue, 3 Sep 2024 11:39:41 +0300 Subject: [PATCH 5/9] ui-tests for listbox issue #1746 --- testing/libs/elements.js | 4 +- testing/package.json | 3 +- .../applications/install.app.dialog.js | 61 +++++++++++-------- .../install.app.dialog.search.input.spec.js | 4 +- 4 files changed, 40 insertions(+), 32 deletions(-) diff --git a/testing/libs/elements.js b/testing/libs/elements.js index 94c2b18d..9fc8fa25 100644 --- a/testing/libs/elements.js +++ b/testing/libs/elements.js @@ -11,8 +11,8 @@ module.exports = Object.freeze({ TEXT_INPUT: "//input[contains(@id,'TextInput')]", DROP_DOWN_HANDLE: "//button[contains(@id,'DropdownHandle')]", MARKET_MODAL_DIALOG: { - rowByDisplayName(container, displayName) { - return `${container}//div[contains(@id,'MarketListViewer') and (descendant::h6[contains(@class,'main-name') and contains(.,'${displayName}')])]`; + rowByDisplayName(displayName) { + return `//div[contains(@id,'MarketListViewer') and (descendant::h6[contains(@class,'main-name') and contains(.,'${displayName}')])]`; }, }, TREE_GRID: { diff --git a/testing/package.json b/testing/package.json index c4f01847..a4391b07 100644 --- a/testing/package.json +++ b/testing/package.json @@ -5,7 +5,8 @@ "license": "ISC", "scripts": { "test_apps:wdio_chrome": "npx wdio ./wdio.chrome.conf.js", - "test:firefox": "npx wdio ./wdio.conf.js" + "test:firefox": "npx wdio ./wdio.conf.js", + "allure-report": "allure generate ./build/reports/allure --output ./build/reports/allure-report --clean --single-file" }, "devDependencies": { "properties-reader": "^2.3.0", diff --git a/testing/page_objects/applications/install.app.dialog.js b/testing/page_objects/applications/install.app.dialog.js index 77fab997..26421188 100644 --- a/testing/page_objects/applications/install.app.dialog.js +++ b/testing/page_objects/applications/install.app.dialog.js @@ -12,10 +12,10 @@ const XPATH = { return `//div[contains(@id,'InstallAppDialog')]//div[contains(@id,'NamesView') and child::h6[contains(@class,'main-name')]]//a[contains(.,'${displayName}')]` }, installButtonByName(displayName) { - return `${lib.MARKET_MODAL_DIALOG.rowByDisplayName(XPATH.container, displayName)}//button/span[text()='Install']` + return `${lib.MARKET_MODAL_DIALOG.rowByDisplayName(displayName)}//button/span[text()='Install']` }, installedStatusByName(displayName) { - return `${lib.MARKET_MODAL_DIALOG.rowByDisplayName(XPATH.container, displayName)}//button/span[text()='Installed']`; + return `${lib.MARKET_MODAL_DIALOG.rowByDisplayName(displayName)}//button/span[text()='Installed']`; } }; @@ -37,24 +37,28 @@ class InstallAppDialog extends Page { try { return await this.waitForElementDisplayed(XPATH.installedStatusByName(appName), appConst.installAppTimeout) } catch (err) { - let screenshot = appConst.generateRandomName('err_inst_status'); - await this.saveScreenshot(screenshot); - throw new Error('Install App Dialog - Application status should be Installed: screenshot ' + screenshot + ' ' + err); + let screenshot = await this.saveScreenshotUniqueName('err_inst_status'); + throw new Error(`Install App Dialog - Application status should be Installed: screenshot ${screenshot} ` + err); } } - waitForOpened() { - return this.waitForElementDisplayed(this.searchInput, appConst.mediumTimeout).catch(err => { - this.saveScreenshot('err_load_install_dialog'); + async waitForOpened() { + try { + await this.waitForElementDisplayed(this.grid, appConst.mediumTimeout); + } catch (err) { + await this.saveScreenshot('err_load_install_dialog'); throw new Error('Install App dialog was not loaded! ' + err); - }); + } } - waitForClosed(ms) { - return this.waitForElementNotDisplayed(XPATH.container, ms).catch(err => { - this.saveScreenshot('err_install_dialog_close'); + async waitForClosed(ms) { + try { + return await this.waitForElementNotDisplayed(XPATH.container, ms) + } catch (err) { + await this.saveScreenshot('err_install_dialog_close'); + await this.clickOnCancelButtonTop(); throw new Error('Install Dialog was not closed! ' + err); - }); + } } clickOnCancelButtonTop() { @@ -73,12 +77,14 @@ class InstallAppDialog extends Page { } } - waitForInstallLink(appName) { - const selector = XPATH.installButtonByName(appName); - return this.waitForElementDisplayed(selector, appConst.mediumTimeout).catch(err => { - this.saveScreenshot(appConst.generateRandomName('err_install_link')); + async waitForInstallLink(appName) { + try { + const selector = XPATH.installButtonByName(appName); + return await this.waitForElementDisplayed(selector, appConst.mediumTimeout); + } catch (err) { + await this.saveScreenshotUniqueName('err_install_link'); throw new Error(`Install link is not displayed for! ` + err); - }) + } } async clickOnInstallAppLink(appName) { @@ -95,7 +101,7 @@ class InstallAppDialog extends Page { //checks that 'installed' status appeared async waitForApplicationInstalled(appName) { try { - const locator = XPATH.installedStatusByName(XPATH.container, appName); + let locator = XPATH.installedStatusByName(appName); return await this.waitForElementDisplayed(locator, appConst.longTimeout) } catch (err) { let screenshot = await this.saveScreenshotUniqueName('err_find_installed_status'); @@ -119,14 +125,15 @@ class InstallAppDialog extends Page { }) } - applicationNotFoundMessage() { - let selector = XPATH.container + `//div[@class='status-message']`; - return this.waitForElementDisplayed(selector, appConst.longTimeout).then(() => { - return this.getTextInDisplayedElements(selector); - }).catch(err => { - this.saveScreenshot('err_app_not_found_message'); + async getApplicationNotFoundMessage() { + try { + let selector = XPATH.container + `//div[@class='status-message']`; + await this.waitForElementDisplayed(selector, appConst.longTimeout); + return await this.getTextInDisplayedElements(selector); + } catch (err) { + await this.saveScreenshot('err_app_not_found_message'); throw new Error("'Application not found' message is not visible " + err); - }) + } } waitForApplicationNotFoundMessage() { @@ -142,7 +149,7 @@ class InstallAppDialog extends Page { } getApplicationNames() { - let items = XPATH.grid + lib.H6_DISPLAY_NAME; + let items = XPATH.gridUL + lib.H6_DISPLAY_NAME; return this.getTextInDisplayedElements(items); } diff --git a/testing/specs/install.app.dialog.search.input.spec.js b/testing/specs/install.app.dialog.search.input.spec.js index 1d5864cd..9dce7457 100644 --- a/testing/specs/install.app.dialog.search.input.spec.js +++ b/testing/specs/install.app.dialog.search.input.spec.js @@ -49,8 +49,8 @@ describe('Install app dialog, search input spec.', function () { await installDialog.waitForSpinnerNotVisible(); // 4. Verify the expected warning: await installDialog.waitForApplicationNotFoundMessage(); - let message = await installDialog.applicationNotFoundMessage(); - await studioUtils.saveScreenshot('app_not_found'); + let message = await installDialog.getApplicationNotFoundMessage(); + await studioUtils.saveScreenshot('app_not_found_message'); assert.ok(message.includes('No applications found'), "'No applications found' - message should appear"); }); From c25a2f340a6243750781325b3b109565dae8bfdb Mon Sep 17 00:00:00 2001 From: ashklianko Date: Thu, 5 Sep 2024 14:07:51 +0200 Subject: [PATCH 6/9] MarketAppsTreeGrid: replace Slickgrid with ListBox #1738 --- src/main/resources/assets/js/app/MarketApplication.ts | 2 +- .../assets/js/app/installation/view/MarketAppViewer.ts | 2 +- .../assets/js/app/installation/view/MarketAppsTreeGrid.ts | 6 +++--- .../js/app/installation/view/MarketAppsTreeGridHelper.ts | 2 +- .../assets/js/app/installation/view/MarketListViewer.ts | 2 +- .../assets/js/app/resource/MarketApplicationFetcher.ts | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/resources/assets/js/app/MarketApplication.ts b/src/main/resources/assets/js/app/MarketApplication.ts index a9dc11fc..a37f7ef2 100644 --- a/src/main/resources/assets/js/app/MarketApplication.ts +++ b/src/main/resources/assets/js/app/MarketApplication.ts @@ -1,9 +1,9 @@ import {IDentifiable} from '@enonic/lib-admin-ui/IDentifiable'; import {ApplicationKey} from '@enonic/lib-admin-ui/application/ApplicationKey'; -import {MarketApplicationJson} from '@enonic/lib-admin-ui/application/json/MarketApplicationJson'; import {i18n} from '@enonic/lib-admin-ui/util/Messages'; import {ProgressBar} from '@enonic/lib-admin-ui/ui/ProgressBar'; import {SpanEl} from '@enonic/lib-admin-ui/dom/SpanEl'; +import {MarketApplicationJson} from './json/MarketApplicationJson'; export class MarketApplication implements IDentifiable { diff --git a/src/main/resources/assets/js/app/installation/view/MarketAppViewer.ts b/src/main/resources/assets/js/app/installation/view/MarketAppViewer.ts index a863e40c..2c8e70e1 100644 --- a/src/main/resources/assets/js/app/installation/view/MarketAppViewer.ts +++ b/src/main/resources/assets/js/app/installation/view/MarketAppViewer.ts @@ -2,8 +2,8 @@ import * as Q from 'q'; import {Viewer} from '@enonic/lib-admin-ui/ui/Viewer'; import {NamesAndIconView, NamesAndIconViewBuilder} from '@enonic/lib-admin-ui/app/NamesAndIconView'; import {AEl} from '@enonic/lib-admin-ui/dom/AEl'; -import {MarketApplication} from '@enonic/lib-admin-ui/application/MarketApplication'; import {NamesAndIconViewSize} from '@enonic/lib-admin-ui/app/NamesAndIconViewSize'; +import {MarketApplication} from '../../MarketApplication'; export class MarketAppViewer extends Viewer { diff --git a/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGrid.ts b/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGrid.ts index ed47b35f..53b7709d 100644 --- a/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGrid.ts +++ b/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGrid.ts @@ -1,18 +1,18 @@ import {MarketApplicationFetcher} from '../../resource/MarketApplicationFetcher'; import {i18n} from '@enonic/lib-admin-ui/util/Messages'; import {Application} from '@enonic/lib-admin-ui/application/Application'; -import {MarketApplication, MarketAppStatus} from '@enonic/lib-admin-ui/application/MarketApplication'; import {ApplicationEvent, ApplicationEventType} from '@enonic/lib-admin-ui/application/ApplicationEvent'; import {DefaultErrorHandler} from '@enonic/lib-admin-ui/DefaultErrorHandler'; import {Exception} from '@enonic/lib-admin-ui/Exception'; -import {MarketApplicationResponse} from '@enonic/lib-admin-ui/application/MarketApplicationResponse'; -import {MarketHelper} from '@enonic/lib-admin-ui/application/MarketHelper'; import {MarketAppsTreeGridHelper} from './MarketAppsTreeGridHelper'; import {InstallUrlApplicationRequest} from '../../resource/InstallUrlApplicationRequest'; import {ApplicationInstallResult} from '../../resource/ApplicationInstallResult'; import {ConfirmationDialog} from '@enonic/lib-admin-ui/ui/dialog/ConfirmationDialog'; import {ListBox} from '@enonic/lib-admin-ui/ui/selector/list/ListBox'; import {MarketListViewer} from './MarketListViewer'; +import {MarketApplication, MarketAppStatus} from '../../MarketApplication'; +import {MarketApplicationResponse} from '../../MarketApplicationResponse'; +import {MarketHelper} from '../../MarketHelper'; export class MarketAppsTreeGrid extends ListBox { diff --git a/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGridHelper.ts b/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGridHelper.ts index c2be9234..cc277dbc 100644 --- a/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGridHelper.ts +++ b/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGridHelper.ts @@ -1,9 +1,9 @@ import {TreeNode} from '@enonic/lib-admin-ui/ui/treegrid/TreeNode'; import {GridColumn, GridColumnBuilder} from '@enonic/lib-admin-ui/ui/grid/GridColumn'; -import {MarketApplication, MarketAppStatus, MarketAppStatusFormatter} from '@enonic/lib-admin-ui/application/MarketApplication'; import {MarketAppViewer} from './MarketAppViewer'; import {AEl} from '@enonic/lib-admin-ui/dom/AEl'; import {Application} from '@enonic/lib-admin-ui/application/Application'; +import {MarketApplication, MarketAppStatus, MarketAppStatusFormatter} from '../../MarketApplication'; export class MarketAppsTreeGridHelper { diff --git a/src/main/resources/assets/js/app/installation/view/MarketListViewer.ts b/src/main/resources/assets/js/app/installation/view/MarketListViewer.ts index 08b26d1c..58752c64 100644 --- a/src/main/resources/assets/js/app/installation/view/MarketListViewer.ts +++ b/src/main/resources/assets/js/app/installation/view/MarketListViewer.ts @@ -2,8 +2,8 @@ import {DivEl} from '@enonic/lib-admin-ui/dom/DivEl'; import {MarketAppViewer} from './MarketAppViewer'; import {SpanEl} from '@enonic/lib-admin-ui/dom/SpanEl'; import * as Q from 'q'; -import {MarketApplication, MarketAppStatus, MarketAppStatusFormatter} from '@enonic/lib-admin-ui/application/MarketApplication'; import {Button} from '@enonic/lib-admin-ui/ui/button/Button'; +import {MarketApplication, MarketAppStatus, MarketAppStatusFormatter} from '../../MarketApplication'; export class MarketListViewer extends DivEl { diff --git a/src/main/resources/assets/js/app/resource/MarketApplicationFetcher.ts b/src/main/resources/assets/js/app/resource/MarketApplicationFetcher.ts index f0a31ffd..2568fa42 100644 --- a/src/main/resources/assets/js/app/resource/MarketApplicationFetcher.ts +++ b/src/main/resources/assets/js/app/resource/MarketApplicationFetcher.ts @@ -1,7 +1,7 @@ import * as Q from 'q'; -import {MarketApplicationResponse} from '@enonic/lib-admin-ui/application/MarketApplicationResponse'; -import {ListMarketApplicationsRequest} from '@enonic/lib-admin-ui/application/ListMarketApplicationsRequest'; import {CONFIG} from '@enonic/lib-admin-ui/util/Config'; +import {MarketApplicationResponse} from '../MarketApplicationResponse'; +import {ListMarketApplicationsRequest} from '../ListMarketApplicationsRequest'; export class MarketApplicationFetcher { From aefad1b7daf06cdc25a09f5af9724f1de67cd9be Mon Sep 17 00:00:00 2001 From: ashklianko Date: Fri, 6 Sep 2024 09:24:50 +0200 Subject: [PATCH 7/9] MarketAppsTreeGrid: replace Slickgrid with ListBox #1738 --- .../js/app/browse/ApplicationBrowsePanel.ts | 8 -- .../js/app/browse/ApplicationTreeGrid.ts | 54 -------------- .../app/browse/ApplicationTreeGridHelper.ts | 27 ------- .../view/MarketAppsTreeGridHelper.ts | 74 +------------------ 4 files changed, 1 insertion(+), 162 deletions(-) delete mode 100644 src/main/resources/assets/js/app/browse/ApplicationTreeGrid.ts delete mode 100644 src/main/resources/assets/js/app/browse/ApplicationTreeGridHelper.ts diff --git a/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts b/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts index e6b29bf7..92e9871f 100644 --- a/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts +++ b/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts @@ -1,5 +1,4 @@ import {ApplicationBrowseActions} from './ApplicationBrowseActions'; -import {ApplicationTreeGrid} from './ApplicationTreeGrid'; import {ApplicationBrowseItemPanel} from './ApplicationBrowseItemPanel'; import {StopApplicationEvent} from './StopApplicationEvent'; import {StartApplicationEvent} from './StartApplicationEvent'; @@ -29,7 +28,6 @@ import {ApplicationsGridList} from './ApplicationsGridList'; import {SelectableListBoxKeyNavigator} from '@enonic/lib-admin-ui/ui/selector/list/SelectableListBoxKeyNavigator'; import {GetApplicationRequest} from '../resource/GetApplicationRequest'; import * as Q from 'q'; -import {ApplicationsListViewer} from './ApplicationsListViewer'; import {Element} from '@enonic/lib-admin-ui/dom/Element'; export class ApplicationBrowsePanel @@ -47,8 +45,6 @@ export class ApplicationBrowsePanel protected keyNavigator: SelectableListBoxKeyNavigator; - protected treeGrid: ApplicationTreeGrid; - constructor() { super(); @@ -92,10 +88,6 @@ export class ApplicationBrowsePanel return toolbar; } - protected createTreeGrid(): ApplicationTreeGrid { - return new ApplicationTreeGrid(); - } - protected createBrowseItemPanel(): ApplicationBrowseItemPanel { return new ApplicationBrowseItemPanel(); } diff --git a/src/main/resources/assets/js/app/browse/ApplicationTreeGrid.ts b/src/main/resources/assets/js/app/browse/ApplicationTreeGrid.ts deleted file mode 100644 index 0d0bb610..00000000 --- a/src/main/resources/assets/js/app/browse/ApplicationTreeGrid.ts +++ /dev/null @@ -1,54 +0,0 @@ -import * as Q from 'q'; -import {TreeNode} from '@enonic/lib-admin-ui/ui/treegrid/TreeNode'; -import {Application, ApplicationUploadMock} from '@enonic/lib-admin-ui/application/Application'; -import {ApplicationKey} from '@enonic/lib-admin-ui/application/ApplicationKey'; -import {TreeGrid} from '@enonic/lib-admin-ui/ui/treegrid/TreeGrid'; -import {TreeGridBuilder} from '@enonic/lib-admin-ui/ui/treegrid/TreeGridBuilder'; -import {DefaultErrorHandler} from '@enonic/lib-admin-ui/DefaultErrorHandler'; -import {UploadItem} from '@enonic/lib-admin-ui/ui/uploader/UploadItem'; -import {ApplicationTreeGridHelper} from './ApplicationTreeGridHelper'; -import {ListApplicationsRequest} from '../resource/ListApplicationsRequest'; -import {GetApplicationRequest} from '../resource/GetApplicationRequest'; -import {ResponsiveRanges} from '@enonic/lib-admin-ui/ui/responsive/ResponsiveRanges'; -import {Body} from '@enonic/lib-admin-ui/dom/Body'; -import {CONFIG} from '@enonic/lib-admin-ui/util/Config'; - -export class ApplicationTreeGrid - extends TreeGrid { - - constructor() { - const builder: TreeGridBuilder = new TreeGridBuilder() - .setColumnConfig(ApplicationTreeGridHelper.generateColumnsConfig()) - .prependClasses('application-grid'); - - const columns = builder.getColumns().slice(0); - const updateColumns = () => { - const checkSelIsMoved = ResponsiveRanges._540_720.isFitOrSmaller(Body.get().getEl().getWidth()); - this.setColumns(columns.slice(0), checkSelIsMoved); - }; - builder.setColumnUpdater(updateColumns); - - const readonlyMode = CONFIG.isTrue('readonlyMode'); - builder.setCheckableRows(!readonlyMode); - - super(builder); - } - - fetchRoot(): Q.Promise { - return new ListApplicationsRequest().sendAndParse(); - } - - fetch(node: TreeNode, dataId?: string): Q.Promise { - return this.fetchByKey(node.getData().getApplicationKey()); - } - - private fetchByKey(applicationKey: ApplicationKey): Q.Promise { - let deferred = Q.defer(); - new GetApplicationRequest(applicationKey, true).sendAndParse() - .then((application: Application) => deferred.resolve(application)) - .catch(DefaultErrorHandler.handle); - - return deferred.promise; - } - -} diff --git a/src/main/resources/assets/js/app/browse/ApplicationTreeGridHelper.ts b/src/main/resources/assets/js/app/browse/ApplicationTreeGridHelper.ts deleted file mode 100644 index b7a34aaf..00000000 --- a/src/main/resources/assets/js/app/browse/ApplicationTreeGridHelper.ts +++ /dev/null @@ -1,27 +0,0 @@ -import {GridColumnConfig} from '@enonic/lib-admin-ui/ui/grid/GridColumn'; -import {ApplicationRowFormatter} from './ApplicationRowFormatter'; -import {i18n} from '@enonic/lib-admin-ui/util/Messages'; - -export class ApplicationTreeGridHelper { - - public static generateColumnsConfig(): GridColumnConfig[] { - return [{ - name: i18n('field.name'), - id: 'displayName', - field: 'displayName', - formatter: ApplicationRowFormatter.nameFormatter, - style: {cssClass: 'name', minWidth: 250} - }, { - name: i18n('field.version'), - id: 'version', - field: 'version', - style: {cssClass: 'version', minWidth: 50, maxWidth: 130} - }, { - name: i18n('field.state'), - id: 'state', - field: 'state', - formatter: ApplicationRowFormatter.stateFormatter, - style: {cssClass: 'state', minWidth: 80, maxWidth: 100} - }]; - } -} diff --git a/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGridHelper.ts b/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGridHelper.ts index cc277dbc..10e399a2 100644 --- a/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGridHelper.ts +++ b/src/main/resources/assets/js/app/installation/view/MarketAppsTreeGridHelper.ts @@ -1,80 +1,8 @@ -import {TreeNode} from '@enonic/lib-admin-ui/ui/treegrid/TreeNode'; -import {GridColumn, GridColumnBuilder} from '@enonic/lib-admin-ui/ui/grid/GridColumn'; -import {MarketAppViewer} from './MarketAppViewer'; -import {AEl} from '@enonic/lib-admin-ui/dom/AEl'; import {Application} from '@enonic/lib-admin-ui/application/Application'; -import {MarketApplication, MarketAppStatus, MarketAppStatusFormatter} from '../../MarketApplication'; +import {MarketApplication, MarketAppStatus} from '../../MarketApplication'; export class MarketAppsTreeGridHelper { - public static generateColumns(): GridColumn>[] { - const nameColumn: GridColumn> = new GridColumnBuilder>() - .setName('Name') - .setId('displayName') - .setField('displayName') - .setCssClass('app-name-and-icon') - .setMinWidth(170) - .setFormatter(MarketAppsTreeGridHelper.nameFormatter) - .build(); - - const versionColumn: GridColumn> = new GridColumnBuilder>() - .setName('Version') - .setId('version') - .setField('latestVersion') - .setCssClass('version') - .setMinWidth(40) - .build(); - - const appStatusColumns: GridColumn> = new GridColumnBuilder>() - .setName('AppStatus') - .setId('appStatus') - .setField('status') - .setCssClass('status') - .setMinWidth(50) - .setFormatter(MarketAppsTreeGridHelper.appStatusFormatter) - .setCssClass('app-status').build(); - - return [nameColumn, versionColumn, appStatusColumns]; - } - - private static nameFormatter(row: number, cell: number, value: string, columnDef: Slick.Column>, - node: TreeNode): string { - const data: MarketApplication = node.getData(); - - if (data.getAppKey()) { - let viewer: MarketAppViewer = node.getViewer('name') as MarketAppViewer; - if (!viewer) { - viewer = new MarketAppViewer(); - node.setViewer('name', viewer); - } - - viewer.setObject(data, node.calcLevel() > 1); - return viewer.toString(); - } - - return ''; - } - - public static appStatusFormatter(row: number, cell: number, value: number, columnDef: Slick.Column>, - node: TreeNode): string { - const app: MarketApplication = node.getData(); - const statusWrapper: AEl = new AEl(); - - if (app.getAppKey()) { - const status: MarketAppStatus = app.getStatus(); - const progress: number = app.getProgress(); - - statusWrapper.appendChild(MarketAppStatusFormatter.createStatusElement(status, progress)); - statusWrapper.addClass(MarketAppStatusFormatter.getStatusCssClass(status)); - - if (status !== MarketAppStatus.NOT_INSTALLED && status !== MarketAppStatus.OLDER_VERSION_INSTALLED) { - statusWrapper.getEl().setTabIndex(-1); - } - } - - return statusWrapper.toString(); - } - public static installedAppCanBeUpdated(marketApp: MarketApplication, installedApp: Application): boolean { return this.compareVersionNumbers(marketApp.getLatestVersion(), installedApp.getVersion()) > 0; } From 53c5a6145e213f066340cb54598cf90d6f913d1f Mon Sep 17 00:00:00 2001 From: ashklianko Date: Fri, 6 Sep 2024 10:20:35 +0200 Subject: [PATCH 8/9] MarketAppsTreeGrid: replace Slickgrid with ListBox #1738 --- .../js/app/browse/ApplicationRowFormatter.ts | 36 ------------------- 1 file changed, 36 deletions(-) delete mode 100644 src/main/resources/assets/js/app/browse/ApplicationRowFormatter.ts diff --git a/src/main/resources/assets/js/app/browse/ApplicationRowFormatter.ts b/src/main/resources/assets/js/app/browse/ApplicationRowFormatter.ts deleted file mode 100644 index 653f03f8..00000000 --- a/src/main/resources/assets/js/app/browse/ApplicationRowFormatter.ts +++ /dev/null @@ -1,36 +0,0 @@ -import {TreeNode} from '@enonic/lib-admin-ui/ui/treegrid/TreeNode'; -import {ApplicationViewer} from '@enonic/lib-admin-ui/application/ApplicationViewer'; -import {Application, ApplicationUploadMock} from '@enonic/lib-admin-ui/application/Application'; -import {DivEl} from '@enonic/lib-admin-ui/dom/DivEl'; -import {ObjectHelper} from '@enonic/lib-admin-ui/ObjectHelper'; -import {ProgressBar} from '@enonic/lib-admin-ui/ui/ProgressBar'; - -export class ApplicationRowFormatter { - - public static nameFormatter(row: number, cell: number, value: unknown, columnDef: unknown, node: TreeNode) { - let viewer: ApplicationViewer = node.getViewer('name') as ApplicationViewer; - - if (!viewer) { - viewer = new ApplicationViewer(); - viewer.setObject(node.getData()); - node.setViewer('name', viewer); - } - - return viewer.toString(); - } - - public static stateFormatter(row: number, cell: number, value: unknown, columnDef: unknown, node: TreeNode) { - const data: Application = node.getData(); - const statusEl: DivEl = new DivEl(); - - if (data instanceof Application) { // default node - statusEl.getEl().setText(value as string); - } else if (ObjectHelper.iFrameSafeInstanceOf(data, ApplicationUploadMock)) { // uploading node - const status = new ProgressBar((data as ApplicationUploadMock).getUploadItem().getProgress()); - statusEl.appendChild(status); - statusEl.getEl().setWidth('100%'); - } - - return statusEl.toString(); - } -} From f4ecde7940b40d85362ca2aff3569372f59b5d56 Mon Sep 17 00:00:00 2001 From: ashklianko Date: Mon, 16 Sep 2024 10:30:12 +0200 Subject: [PATCH 9/9] Issues in Application Tree grid with ListBox #1745 --- package-lock.json | 54 +++---------------- .../js/app/browse/ApplicationBrowsePanel.ts | 13 +++++ .../js/app/installation/InstallAppDialog.ts | 17 +++--- 3 files changed, 27 insertions(+), 57 deletions(-) diff --git a/package-lock.json b/package-lock.json index 20cd4d39..a7297a33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,7 +46,6 @@ "dependencies": { "@types/dompurify": "^3.0.5", "@types/mousetrap": "^1.6.15", - "@types/slickgrid": "^2.1.36", "dompurify": "^3.1.3", "fine-uploader": "^5.16.2", "jquery": "^3.7.1", @@ -54,7 +53,6 @@ "jquery-ui": "^1.13.3", "mousetrap": "^1.6.5", "q": "^1.5.1", - "slickgrid": "^4.0.1", "validator": "^13.12.0" }, "devDependencies": { @@ -1699,6 +1697,7 @@ "version": "3.5.30", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.30.tgz", "integrity": "sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==", + "dev": true, "dependencies": { "@types/sizzle": "*" } @@ -1762,15 +1761,8 @@ "node_modules/@types/sizzle": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", - "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==" - }, - "node_modules/@types/slickgrid": { - "version": "2.1.36", - "resolved": "https://registry.npmjs.org/@types/slickgrid/-/slickgrid-2.1.36.tgz", - "integrity": "sha512-fBBrjhAakD23OYXKHjmUIyPVH/SRCQoX7JaXXRdN2qBtnh5rpCgDzRDYdy4JQdsoBmm9gI+WYcMG7MFQf6rejA==", - "dependencies": { - "@types/jquery": "*" - } + "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", + "dev": true }, "node_modules/@types/trusted-types": { "version": "2.0.0", @@ -7277,14 +7269,6 @@ "node": ">=8" } }, - "node_modules/slickgrid": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/slickgrid/-/slickgrid-4.0.1.tgz", - "integrity": "sha512-5eB8S7QnqUM+h2aVzVgeZ1HtlqNXV82M9WYrd5/sFgYErD50PMZ2gpzXhloemqg8z2eaDysvgzGREoLLp180Lg==", - "dependencies": { - "sortablejs": "^1.15.0" - } - }, "node_modules/sort-css-media-queries": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", @@ -7318,11 +7302,6 @@ "node": ">=0.10.0" } }, - "node_modules/sortablejs": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", - "integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==" - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -8461,7 +8440,6 @@ "@types/mousetrap": "^1.6.15", "@types/q": "^1.5.8", "@types/semver": "^7.5.8", - "@types/slickgrid": "^2.1.36", "@types/validator": "^13.11.10", "@typescript-eslint/eslint-plugin": "^7.9.0", "@typescript-eslint/parser": "^7.9.0", @@ -8490,7 +8468,6 @@ "postcss-normalize": "^10.0.1", "postcss-sort-media-queries": "^5.2.0", "q": "^1.5.1", - "slickgrid": "^4.0.1", "swc-loader": "^0.2.6", "terser-webpack-plugin": "^5.3.10", "ts-loader": "^9.5.1", @@ -9450,6 +9427,7 @@ "version": "3.5.30", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.30.tgz", "integrity": "sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==", + "dev": true, "requires": { "@types/sizzle": "*" } @@ -9513,15 +9491,8 @@ "@types/sizzle": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", - "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==" - }, - "@types/slickgrid": { - "version": "2.1.36", - "resolved": "https://registry.npmjs.org/@types/slickgrid/-/slickgrid-2.1.36.tgz", - "integrity": "sha512-fBBrjhAakD23OYXKHjmUIyPVH/SRCQoX7JaXXRdN2qBtnh5rpCgDzRDYdy4JQdsoBmm9gI+WYcMG7MFQf6rejA==", - "requires": { - "@types/jquery": "*" - } + "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", + "dev": true }, "@types/trusted-types": { "version": "2.0.0", @@ -13421,14 +13392,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "slickgrid": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/slickgrid/-/slickgrid-4.0.1.tgz", - "integrity": "sha512-5eB8S7QnqUM+h2aVzVgeZ1HtlqNXV82M9WYrd5/sFgYErD50PMZ2gpzXhloemqg8z2eaDysvgzGREoLLp180Lg==", - "requires": { - "sortablejs": "^1.15.0" - } - }, "sort-css-media-queries": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", @@ -13453,11 +13416,6 @@ "sort-keys": "^1.0.0" } }, - "sortablejs": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", - "integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==" - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", diff --git a/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts b/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts index 92e9871f..f6662ab1 100644 --- a/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts +++ b/src/main/resources/assets/js/app/browse/ApplicationBrowsePanel.ts @@ -29,6 +29,7 @@ import {SelectableListBoxKeyNavigator} from '@enonic/lib-admin-ui/ui/selector/li import {GetApplicationRequest} from '../resource/GetApplicationRequest'; import * as Q from 'q'; import {Element} from '@enonic/lib-admin-ui/dom/Element'; +import {ApplicationsListViewer} from './ApplicationsListViewer'; export class ApplicationBrowsePanel extends BrowsePanel { @@ -58,6 +59,17 @@ export class ApplicationBrowsePanel this.treeListBox.whenShown(() => { this.treeListBox.load(); }); + + this.treeListBox.onItemsAdded((items: Application[], itemViews: ApplicationsListViewer[]) => { + items.forEach((item: Application, index) => { + const listElement = itemViews[index]; + + listElement?.onContextMenu((event: MouseEvent) => { + event.preventDefault(); + this.contextMenu.showAt(event.clientX, event.clientY); + }); + }); + }); } private static sendApplicationActionRequest(action: string, applications: Application[]) { @@ -203,6 +215,7 @@ export class ApplicationBrowsePanel (item: Application) => item.getApplicationKey().getName() === event.getApplicationKey().getName()); if (itemToRemove) { + this.selectionWrapper.deselect(itemToRemove); this.treeListBox.removeItems(itemToRemove); } diff --git a/src/main/resources/assets/js/app/installation/InstallAppDialog.ts b/src/main/resources/assets/js/app/installation/InstallAppDialog.ts index 6d7c1f33..a510cbb3 100644 --- a/src/main/resources/assets/js/app/installation/InstallAppDialog.ts +++ b/src/main/resources/assets/js/app/installation/InstallAppDialog.ts @@ -63,6 +63,7 @@ export class InstallAppDialog const hasValue = !StringHelper.isEmpty(searchString); this.clearButton.setVisible(hasValue); this.marketAppsTreeGrid.setSearchString(searchString); + this.updateStatusMessage(); }); this.applicationInput.onAppInstallStarted(() => { @@ -128,17 +129,16 @@ export class InstallAppDialog private toggleStatusMessage(showStatus: boolean) { if (showStatus) { this.statusMessage.showNoResult(); - if (this.getBody().isVisible()) { - this.getBody().hide(); - } } else { this.statusMessage.hide(); - if (!this.getBody().isVisible()) { - this.getBody().show(); - } } } + private updateStatusMessage(): void { + const itemsVisible = this.marketAppsTreeGrid.getItemViews().filter((item) => item.isVisible()).length; + this.toggleStatusMessage(itemsVisible === 0); + } + updateInstallApplications(installApplications: Application[]) { this.marketAppsTreeGrid.updateInstallApplications(installApplications); } @@ -206,6 +206,7 @@ export class InstallAppDialog this.resetFileInputWithUploader(); super.show(); this.statusMessage.reset(); + this.updateStatusMessage(); } hide() { @@ -220,9 +221,7 @@ export class InstallAppDialog } private resetFileInputWithUploader() { - if (this.applicationInput) { - this.applicationInput.reset(); - } + this.applicationInput?.reset(); } }