diff --git a/.nx/cache/18.3.4-nx.darwin-arm64.node b/.nx/cache/18.3.4-nx.darwin-arm64.node new file mode 100644 index 00000000..5986ac23 Binary files /dev/null and b/.nx/cache/18.3.4-nx.darwin-arm64.node differ diff --git a/.nx/cache/19.0.3-nx.darwin-arm64.node b/.nx/cache/19.0.3-nx.darwin-arm64.node new file mode 100644 index 00000000..d8945cac Binary files /dev/null and b/.nx/cache/19.0.3-nx.darwin-arm64.node differ diff --git a/angular.json b/angular.json index ded479c4..131ed931 100644 --- a/angular.json +++ b/angular.json @@ -3,6 +3,11 @@ "version": 1, "projects": { "@rero/ng-core": { + "schematics": { + "@schematics/angular:component": { + "standalone": false + } + }, "projectType": "library", "root": "projects/rero/ng-core", "sourceRoot": "projects/rero/ng-core/src", @@ -40,7 +45,8 @@ "projectType": "application", "schematics": { "@schematics/angular:component": { - "style": "scss" + "style": "scss", + "standalone": false } }, "root": "projects/ng-core-tester", @@ -66,13 +72,7 @@ "projects/ng-core-tester/src/assets" ], "styles": [ - "projects/ng-core-tester/src/styles.scss", - "node_modules/primeng/resources/themes/lara-light-blue/theme.css", - "node_modules/primeng/resources/primeng.min.css", - "node_modules/primeflex/primeflex.min.css", - "node_modules/primeicons/primeicons.css", - "node_modules/ngx-spinner/animations/ball-zig-zag.css", - "node_modules/ngx-bootstrap/datepicker/bs-datepicker.css" + "projects/ng-core-tester/src/styles.scss" ], "vendorChunk": true, "extractLicenses": false, @@ -144,10 +144,6 @@ "assets": [ "projects/ng-core-tester/src/favicon.ico", "projects/ng-core-tester/src/assets" - ], - "styles": [ - "projects/ng-core-tester/src/styles.scss", - "node_modules/ngx-bootstrap/datepicker/bs-datepicker.css" ] } }, diff --git a/package-lock.json b/package-lock.json index b44d308e..c0538988 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,8 +35,8 @@ "ngx-spinner": "^16.0.2", "ngx-toastr": "^18.0.0", "primeflex": "^3.3.1", - "primeicons": "^6.0.1", - "primeng": "^17.5.0", + "primeicons": "^7.0.0", + "primeng": "^17.18.0", "rxjs": "~7.8.1", "tslib": "^2.6.2", "zone.js": "~0.14.3" @@ -81,12 +81,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1703.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.7.tgz", - "integrity": "sha512-SwXbdsZqEE3JtvujCLChAii+FA20d1931VDjDYffrGWdQEViTBAr4NKtDr/kOv8KkgiL3fhGibPnRNUHTeAMtg==", + "version": "0.1703.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.8.tgz", + "integrity": "sha512-lKxwG4/QABXZvJpqeSIn/kAwnY6MM9HdHZUV+o5o3UiTi+vO8rZApG4CCaITH3Bxebm7Nam7Xbk8RuukC5rq6g==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.3.7", + "@angular-devkit/core": "17.3.8", "rxjs": "7.8.1" }, "engines": { @@ -96,15 +96,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.7.tgz", - "integrity": "sha512-AsV80kiFMIPIhm3uzJgOHDj4u6JteUkZedPTKAFFFJC7CTat1luW5qx306vfF7wj62aMvUl5g9HFWaeLghTQGA==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.8.tgz", + "integrity": "sha512-ixsdXggWaFRP7Jvxd0AMukImnePuGflT9Yy7NJ9/y0cL/k//S/3RnkQv5i411KzN+7D4RIbNkRGGTYeqH24zlg==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1703.7", - "@angular-devkit/build-webpack": "0.1703.7", - "@angular-devkit/core": "17.3.7", + "@angular-devkit/architect": "0.1703.8", + "@angular-devkit/build-webpack": "0.1703.8", + "@angular-devkit/core": "17.3.8", "@babel/core": "7.24.0", "@babel/generator": "7.23.6", "@babel/helper-annotate-as-pure": "7.22.5", @@ -115,7 +115,7 @@ "@babel/preset-env": "7.24.0", "@babel/runtime": "7.24.0", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.3.7", + "@ngtools/webpack": "17.3.8", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.18", @@ -224,13 +224,19 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1703.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.7.tgz", - "integrity": "sha512-gpt2Ia5I1gmdp3hdbtB7tkZTba5qWmKeVhlCYswa/LvbceKmkjedoeNRAoyr1UKM9GeGqt6Xl1B2eHzCH+ykrg==", + "version": "0.1703.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.8.tgz", + "integrity": "sha512-9u6fl8VVOxcLOEMzrUeaybSvi9hSLSRucHnybneYrabsgreDo32tuy/4G8p6YAHQjpWEj9jvF9Um13ertdni5Q==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1703.7", + "@angular-devkit/architect": "0.1703.8", "rxjs": "7.8.1" }, "engines": { @@ -244,9 +250,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.7.tgz", - "integrity": "sha512-qpZ7BShyqS/Jqld36E7kL02cyb2pjn1Az1p9439SbP8nsvJgYlsyjwYK2Kmcn/Wi+TZGIKxkqxgBBw9vqGgeJw==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -271,12 +277,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.7.tgz", - "integrity": "sha512-d7NKSwstdxYLYmPsbcYO3GOFNfXxXwOyHxSqDa1JNKoSzMdbLj4tvlCpfXw0ThNM7gioMx8aLBaaH1ac+yk06Q==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.8.tgz", + "integrity": "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.3.7", + "@angular-devkit/core": "17.3.8", "jsonc-parser": "3.2.1", "magic-string": "0.30.8", "ora": "5.4.1", @@ -289,13 +295,13 @@ } }, "node_modules/@angular-eslint/builder": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.4.0.tgz", - "integrity": "sha512-+3ujbi+ar/iqAAwnJ2bTdWzQpHh9iVEPgjHUOeQhrEM8gcaOLnZXMlUyZL7D+NlXg7aDoEIxETb73dgbIBm55A==", + "version": "17.5.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.5.2.tgz", + "integrity": "sha512-bvegxJuocWeHdvISPfCXeLQPSjrMCEVzxXPg16JJKksKWSeRA1JnbXnfnb7eoLdq1+riMHKqbH6Fs4rORAvUiA==", "dev": true, "dependencies": { - "@nx/devkit": "^17.2.8 || ^18.0.0", - "nx": "^17.2.8 || ^18.0.0" + "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", + "nx": "^17.2.8 || ^18.0.0 || ^19.0.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -303,20 +309,20 @@ } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.0.tgz", - "integrity": "sha512-cYEJs4PO+QLDt1wfgWh9q8OjOphnoe1OTTFtMqm9lHl0AkBynPnFA6ghiiG5NaT03l7HXi2TQ23rLFlXl3JOBg==", + "version": "17.5.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.5.2.tgz", + "integrity": "sha512-K4hVnMyI98faMJmsA4EOBkD0tapDjWV5gy0j/wJ2uSL46d3JgZPZNJSO1zStf/b3kT4gLOlQ/ulWFiUf1DxgIw==", "dev": true }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.4.0.tgz", - "integrity": "sha512-E+/O83PXttQUACurGEskLDU+wboBqMMVqvo4T8C/iMcpLx+01M5UBzqpCmfz6ri609G96Au7uDbUEedU1hwqmQ==", + "version": "17.5.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.5.2.tgz", + "integrity": "sha512-kzPALKyT5XIEbgoNmY/hEZWdMWKTX56Pap9fVLJSC/b+Nd+MXc7TNly2s0XoC0Ru1/kMiVzbmSGPheu/rw+9aA==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.4.0", - "@angular-eslint/utils": "17.4.0", - "@typescript-eslint/utils": "7.8.0" + "@angular-eslint/bundled-angular-compiler": "17.5.2", + "@angular-eslint/utils": "17.5.2", + "@typescript-eslint/utils": "7.11.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -462,16 +468,16 @@ } }, "node_modules/@angular-eslint/schematics": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.4.0.tgz", - "integrity": "sha512-3WQQbwwBD1N3dZbbx1a1KY/jRujUQgz5778Ac21LU+AdCtvbjnmSpxRfsE3HH8MAreqr8Lv1kjLyiRzPTS5GQQ==", + "version": "17.5.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.5.2.tgz", + "integrity": "sha512-HcvqrBEJfYMTc+fZ6YdRkb+9YcXsy2XSv59Yhd0bBqZ4ZdM4QuuVFxWlLNvhV6TF1DtO24CzpN4OyE+AO5EWBA==", "dev": true, "dependencies": { - "@angular-eslint/eslint-plugin": "17.4.0", - "@angular-eslint/eslint-plugin-template": "17.4.0", - "@nx/devkit": "^17.2.8 || ^18.0.0", + "@angular-eslint/eslint-plugin": "17.5.2", + "@angular-eslint/eslint-plugin-template": "17.5.2", + "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", "ignore": "5.3.1", - "nx": "^17.2.8 || ^18.0.0", + "nx": "^17.2.8 || ^18.0.0 || ^19.0.0", "strip-json-comments": "3.1.1", "tmp": "0.2.3" }, @@ -480,15 +486,15 @@ } }, "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin-template": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.4.0.tgz", - "integrity": "sha512-o1Vb7rt3TpPChVzaxswOKBDWRboMcpC4qUUyoHfeSYa7sDuQHMeIQlCS5QXuykR/RYnIQJSKd89FOd28nGmmRw==", + "version": "17.5.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.5.2.tgz", + "integrity": "sha512-6sxVwrJ7yElZxcjxHSA0Ujs29bCD/cMubd9n6TDFI9e3v+ktpoMW4Nv/TCHv0OuYatIOZ7bcJxi38cAO8Vhfhw==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.4.0", - "@angular-eslint/utils": "17.4.0", - "@typescript-eslint/type-utils": "7.8.0", - "@typescript-eslint/utils": "7.8.0", + "@angular-eslint/bundled-angular-compiler": "17.5.2", + "@angular-eslint/utils": "17.5.2", + "@typescript-eslint/type-utils": "7.11.0", + "@typescript-eslint/utils": "7.11.0", "aria-query": "5.3.0", "axobject-query": "4.0.0" }, @@ -498,13 +504,13 @@ } }, "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/type-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", - "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.11.0.tgz", + "integrity": "sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/typescript-estree": "7.11.0", + "@typescript-eslint/utils": "7.11.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -525,9 +531,9 @@ } }, "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", - "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", + "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -538,13 +544,13 @@ } }, "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", - "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.11.0.tgz", + "integrity": "sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -566,12 +572,12 @@ } }, "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", - "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", + "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/types": "7.11.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -583,9 +589,9 @@ } }, "node_modules/@angular-eslint/schematics/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "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" @@ -598,12 +604,12 @@ } }, "node_modules/@angular-eslint/template-parser": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.4.0.tgz", - "integrity": "sha512-vT/Tg8dl6Uy++MS9lPS0l37SynH3EaMcggDiTJqn15pIb4ePO65fafOIIKKYG+BN6R6iFe/g9mH/9nb8ohlzdQ==", + "version": "17.5.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.5.2.tgz", + "integrity": "sha512-46emLElmnIUzW0bpEpSf0u05ofRVUwlfttDOMLedhi700peUKbB9Y6iyz3GzAtQCMklBbJC9nR87LQRH9aSlog==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.4.0", + "@angular-eslint/bundled-angular-compiler": "17.5.2", "eslint-scope": "^8.0.0" }, "peerDependencies": { @@ -612,13 +618,13 @@ } }, "node_modules/@angular-eslint/utils": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.4.0.tgz", - "integrity": "sha512-lHgRXyT878fauDITygraICDM6RHLb51QAJ3gWNZLr7SXcywsZg5d3rxRPCjrCnjgdxNPU0fJ+VJZ5AMt5Ibn7w==", + "version": "17.5.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.5.2.tgz", + "integrity": "sha512-bTMPFqtoetBJsYR/xqREEOCy/CdsKGf2gZkRdH73gG6pOpskWt8J/PbRcMZsC349paV4HFixByVm89inqA0TNg==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.4.0", - "@typescript-eslint/utils": "7.8.0" + "@angular-eslint/bundled-angular-compiler": "17.5.2", + "@typescript-eslint/utils": "7.11.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -626,9 +632,9 @@ } }, "node_modules/@angular/animations": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.8.tgz", - "integrity": "sha512-ywT3dH0yZeAlo+Vu/6RpRozxzTbu4Bwqky6RgNfk/UMoyXZ5UiFStszDqO/HAyBGGCDHagm1XJkgsNZcStWq8A==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.12.tgz", + "integrity": "sha512-9hsdWF4gRRcVJtPcCcYLaX1CIyM9wUu6r+xRl6zU5hq8qhl35hig6ounz7CXFAzLf0WDBdM16bPHouVGaG76lg==", "dependencies": { "tslib": "^2.3.0" }, @@ -636,13 +642,13 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.8" + "@angular/core": "17.3.12" } }, "node_modules/@angular/cdk": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.8.tgz", - "integrity": "sha512-9UQovtq1R3iGppBP6c1xgnokhG3LaUObpm6htMyuQ2v034WinemoeMdHbqs/OvyUbqOUttQI/9vz37TVB0DjXA==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.10.tgz", + "integrity": "sha512-b1qktT2c1TTTe5nTji/kFAVW92fULK0YhYAvJ+BjZTPKu2FniZNe8o4qqQ0pUuvtMu+ZQxp/QqFYoidIVCjScg==", "dependencies": { "tslib": "^2.3.0" }, @@ -656,15 +662,15 @@ } }, "node_modules/@angular/cli": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.7.tgz", - "integrity": "sha512-JgCav3sdRCoJHwLXxmF/EMzArYjwbqB+AGUW/xIR98oZET8QxCB985bOFUAm02SkAEUVcMJvjxec+WCaa60m/A==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.8.tgz", + "integrity": "sha512-X5ZOQ6ZTKVHjhIsfl32ZRqbs+FUoeHLbT7x4fh2Os/8ObDDwrUcCJPqxe2b2RB5E2d0vepYigknHeLE7gwzlNQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1703.7", - "@angular-devkit/core": "17.3.7", - "@angular-devkit/schematics": "17.3.7", - "@schematics/angular": "17.3.7", + "@angular-devkit/architect": "0.1703.8", + "@angular-devkit/core": "17.3.8", + "@angular-devkit/schematics": "17.3.8", + "@schematics/angular": "17.3.8", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.2", @@ -690,9 +696,9 @@ } }, "node_modules/@angular/common": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.8.tgz", - "integrity": "sha512-HEhTibrsWmoKilyhvAFmqg4SH1hWBP3eV9Y689lmsxBQCTRAmRI2pMAoRKQ+dBcoYLE/FZhcmdHJUSl5jR7Isg==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.12.tgz", + "integrity": "sha512-vabJzvrx76XXFrm1RJZ6o/CyG32piTB/1sfFfKHdlH1QrmArb8It4gyk9oEjZ1IkAD0HvBWlfWmn+T6Vx3pdUw==", "dependencies": { "tslib": "^2.3.0" }, @@ -700,14 +706,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.8", + "@angular/core": "17.3.12", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.8.tgz", - "integrity": "sha512-7vZSh2Oa95lZdRR4MhE0icvZ7JUuYY+NSo3eTSOMZSlH5I9rtwQoSFqfoGW+35rXCzGFLOhQmZBbXkxDPDs97Q==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.12.tgz", + "integrity": "sha512-vwI8oOL/gM+wPnptOVeBbMfZYwzRxQsovojZf+Zol9szl0k3SZ3FycWlxxXZGFu3VIEfrP6pXplTmyODS/Lt1w==", "dependencies": { "tslib": "^2.3.0" }, @@ -715,7 +721,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.8" + "@angular/core": "17.3.12" }, "peerDependenciesMeta": { "@angular/core": { @@ -724,9 +730,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.8.tgz", - "integrity": "sha512-/TsbCmk7QJUEEZnRdNzi6znsPfoDJuy6vHDqcwWVEcw7y6W7DjirSFmtT9u1QwrV67KM6kOh22+RvPdGM8sPmg==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.12.tgz", + "integrity": "sha512-1F8M7nWfChzurb7obbvuE7mJXlHtY1UG58pcwcomVtpPb+kPavgAO8OEvJHYBMV+bzSxkXt5UIwL9lt9jHUxZA==", "dev": true, "dependencies": { "@babel/core": "7.23.9", @@ -747,7 +753,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.3.8", + "@angular/compiler": "17.3.12", "typescript": ">=5.2 <5.5" } }, @@ -797,9 +803,9 @@ } }, "node_modules/@angular/core": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.8.tgz", - "integrity": "sha512-+tUQ+B1yVvNbczzaWBCgJWWIgZ2z+GVJWu+UNOHHWzdqD8qpXjuIkDfnhyLNeGvvXgsqey4u6ApFf2SoFYLjuA==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.12.tgz", + "integrity": "sha512-MuFt5yKi161JmauUta4Dh0m8ofwoq6Ino+KoOtkYMBGsSx+A7dSm+DUxxNwdj7+DNyg3LjVGCFgBFnq4g8z06A==", "dependencies": { "tslib": "^2.3.0" }, @@ -812,9 +818,9 @@ } }, "node_modules/@angular/forms": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.8.tgz", - "integrity": "sha512-ZoPJMx3O1eKliK6oEUqtKJNqrLwwOLBC5x+zbCHrwJeBB3lbgWXrrnTrFvCXpp3QVERAboZTzZ3XBmHX1o6gmw==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.12.tgz", + "integrity": "sha512-tV6r12Q3yEUlXwpVko4E+XscunTIpPkLbaiDn/MTL3Vxi2LZnsLgHyd/i38HaHN+e/H3B0a1ToSOhV5wf3ay4Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -822,25 +828,25 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.8", - "@angular/core": "17.3.8", - "@angular/platform-browser": "17.3.8", + "@angular/common": "17.3.12", + "@angular/core": "17.3.12", + "@angular/platform-browser": "17.3.12", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-17.3.8.tgz", - "integrity": "sha512-Vyad/h0FSgLF17STiJujlOeulRq/PSmH+5sUtd3Zsw4jcy2C0QRr4FaP5s9ZidMMAnfMMFlc5Sh/0QEJV/dbJQ==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-17.3.12.tgz", + "integrity": "sha512-MVmEXonXwdhFtIpU4q8qbXHsrAsdTjZcPPuWCU0zXVQ+VaB/y6oF7BVpmBtfyBcBCums1guEncPP+AZVvulXmQ==", "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0" } }, "node_modules/@angular/platform-browser": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.8.tgz", - "integrity": "sha512-UMGSV3TdJqMtf2xvhbW6fx8TKJLOoHQgFxohhy3y8GvxHBu+PUyrwhovb7r03bs+muY6u4ygGCMm7Mt1TFVwfQ==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.12.tgz", + "integrity": "sha512-DYY04ptWh/ulMHzd+y52WCE8QnEYGeIiW3hEIFjCN8z0kbIdFdUtEB0IK5vjNL3ejyhUmphcpeT5PYf3YXtqWQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -848,9 +854,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "17.3.8", - "@angular/common": "17.3.8", - "@angular/core": "17.3.8" + "@angular/animations": "17.3.12", + "@angular/common": "17.3.12", + "@angular/core": "17.3.12" }, "peerDependenciesMeta": { "@angular/animations": { @@ -859,9 +865,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.8.tgz", - "integrity": "sha512-uL6FPh+Pr9xzIjyiv3p66jteq/CytHP1+m5jOsIKa1LUwTXx0a2pmOYcZxXpNkQGR9Ir/dlbrYmKlSP3QZf7uw==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.12.tgz", + "integrity": "sha512-DQwV7B2x/DRLRDSisngZRdLqHdYbbrqZv2Hmu4ZbnNYaWPC8qvzgE/0CvY+UkDat3nCcsfwsMnlDeB6TL7/IaA==", "dependencies": { "tslib": "^2.3.0" }, @@ -869,16 +875,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.8", - "@angular/compiler": "17.3.8", - "@angular/core": "17.3.8", - "@angular/platform-browser": "17.3.8" + "@angular/common": "17.3.12", + "@angular/compiler": "17.3.12", + "@angular/core": "17.3.12", + "@angular/platform-browser": "17.3.12" } }, "node_modules/@angular/router": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.8.tgz", - "integrity": "sha512-2JKTW1u1H+iNDfAmIjEiMJjQHfzb97TBk23/euIR0JuyGHjyywkrQ97HHiOEAJyy/Zpr0Vbem3HRqDqSfjTWvg==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.12.tgz", + "integrity": "sha512-dg7PHBSW9fmPKTVzwvHEeHZPZdpnUqW/U7kj8D29HTP9ur8zZnx9QcnbplwPeYb8yYa62JMnZSEel2X4PxdYBg==", "dependencies": { "tslib": "^2.3.0" }, @@ -886,19 +892,19 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.8", - "@angular/core": "17.3.8", - "@angular/platform-browser": "17.3.8", + "@angular/common": "17.3.12", + "@angular/core": "17.3.12", + "@angular/platform-browser": "17.3.12", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { @@ -906,9 +912,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -987,26 +993,27 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -1024,19 +1031,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", - "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", + "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.24.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/traverse": "^7.25.0", "semver": "^6.3.1" }, "engines": { @@ -1046,13 +1051,13 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1068,12 +1073,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -1084,6 +1089,18 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1110,74 +1127,53 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", - "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", - "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-simple-access": "^7.24.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/helper-validator-identifier": "^7.24.5" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -1186,48 +1182,36 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", - "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1236,15 +1220,27 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1254,24 +1250,26 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", - "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1290,67 +1288,66 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", - "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.23.0", - "@babel/template": "^7.24.0", - "@babel/types": "^7.24.5" + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dev": true, "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", - "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -1360,10 +1357,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", "dev": true, + "dependencies": { + "@babel/types": "^7.25.2" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -1372,12 +1372,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1387,14 +1387,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1404,13 +1404,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1495,12 +1495,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1510,12 +1510,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1667,12 +1667,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1717,12 +1717,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1732,12 +1732,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", - "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1747,13 +1747,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1763,13 +1763,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1780,18 +1780,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", - "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", + "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.0", "globals": "^11.1.0" }, "engines": { @@ -1801,26 +1799,26 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1830,12 +1828,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", - "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1845,13 +1843,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1861,12 +1859,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1876,12 +1874,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1892,13 +1890,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1908,12 +1906,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1924,13 +1922,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1940,14 +1938,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" }, "engines": { "node": ">=6.9.0" @@ -1957,12 +1955,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1973,12 +1971,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1988,12 +1986,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -2004,12 +2002,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2019,13 +2017,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2035,14 +2033,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2052,15 +2050,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -2070,13 +2068,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2086,13 +2084,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2102,12 +2100,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2117,12 +2115,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -2133,12 +2131,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -2149,15 +2147,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", - "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.5" + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2167,13 +2165,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2183,12 +2181,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -2199,13 +2197,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", - "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -2216,12 +2214,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", - "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2231,13 +2229,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2247,14 +2245,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", - "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -2264,13 +2262,25 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2280,12 +2290,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" }, "engines": { @@ -2296,12 +2306,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2340,12 +2350,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2355,13 +2365,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2371,12 +2381,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2386,12 +2396,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2401,12 +2411,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", - "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -2416,12 +2426,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2431,13 +2441,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2447,13 +2457,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2463,13 +2473,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2614,33 +2624,30 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", - "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2649,12 +2656,12 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5", + "@babel/types": "^7.25.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -2663,26 +2670,14 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", - "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.1", - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2720,6 +2715,34 @@ "node": ">=10.0.0" } }, + "node_modules/@emnapi/core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.2.0.tgz", + "integrity": "sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==", + "dev": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", + "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", + "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", @@ -3104,9 +3127,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "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" @@ -3237,6 +3260,7 @@ "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.2", @@ -3286,6 +3310,7 @@ "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": { @@ -3412,9 +3437,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "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": { @@ -3445,10 +3470,21 @@ "node": ">= 0.4" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "dev": true, + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" + } + }, "node_modules/@ngtools/webpack": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.7.tgz", - "integrity": "sha512-kQNS68jsPQlaWAnKcVeFKNHp6K90uQANvq+9oXb/i+JnYWzuBsHzn2r8bVdMmvjd1HdBRiGtg767XRk3u+jgRw==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.8.tgz", + "integrity": "sha512-CjSVVa/9fzMpEDQP01SC4colKCbZwj7vUq0H2bivp8jVsmd21x9Fu0gDBH0Y9NdfAIm4eGZvmiZKMII3vIOaYQ==", "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0", @@ -3694,13 +3730,10 @@ } }, "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "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/@npmcli/fs": { "version": "3.1.1", @@ -3715,12 +3748,13 @@ } }, "node_modules/@npmcli/git": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.7.tgz", - "integrity": "sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", "dev": true, "dependencies": { "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", "proc-log": "^4.0.0", @@ -3733,6 +3767,15 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@npmcli/git/node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@npmcli/git/node_modules/isexe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", @@ -3743,13 +3786,10 @@ } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "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/@npmcli/git/node_modules/proc-log": { "version": "4.2.0", @@ -3801,9 +3841,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.1.0.tgz", - "integrity": "sha512-1aL4TuVrLS9sf8quCLerU3H9J4vtCtgu8VauYozrmEyU57i/EdKleCnsQ7vpnABIH6c9mnTxcH5sFkO3BlV8wQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", + "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", "dev": true, "dependencies": { "@npmcli/git": "^5.0.0", @@ -3913,21 +3953,21 @@ } }, "node_modules/@nrwl/devkit": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-18.3.4.tgz", - "integrity": "sha512-Fty9Huqm12OYueU3uLJl3uvBUl5BvEyPfvw8+rLiNx9iftdEattM8C+268eAbIRRSLSOVXlWsJH4brlc6QZYYw==", + "version": "19.6.1", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-19.6.1.tgz", + "integrity": "sha512-aoS5RwtUqd8gUWgubOtQ4kzqO8UVjYxtecutvSnDN6gKyG2ylZcDR2OnWL+AB7HbVgRjm/6/QALdcaev9Ljd8w==", "dev": true, "dependencies": { - "@nx/devkit": "18.3.4" + "@nx/devkit": "19.6.1" } }, "node_modules/@nrwl/tao": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-18.3.4.tgz", - "integrity": "sha512-+7KsDYmGj1cvNaXZcjSYOPN1h17hsGFBtVX7MqnpJLLkQTUhKg2rQxqyluzshJ+RoDUVtYPGyHg1AizlB66RIA==", + "version": "19.6.1", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.6.1.tgz", + "integrity": "sha512-nl/NcBRkHr5r0drCq9ROPcKx/Q7SioPvNMl7edo/PdjdKcmJ3gXqvgTxPjwbYH2/ScNX2yjm353qrNyffSs6Rw==", "dev": true, "dependencies": { - "nx": "18.3.4", + "nx": "19.6.1", "tslib": "^2.3.0" }, "bin": { @@ -3935,28 +3975,29 @@ } }, "node_modules/@nx/devkit": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-18.3.4.tgz", - "integrity": "sha512-M3htxl5WvlNKK5KNOndCAApbyBCZNTFFs+rtdwvudNZk5+84zAAPaWzSoX9C4XLAW78/f98LzF68/ch05aN12A==", + "version": "19.6.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.6.1.tgz", + "integrity": "sha512-FGfPM9R7QdEGllNr7Jlx81QbiufNNRHehrJ/4aqftzHWT5ptYmH45bPnd/Wu0qDK4rg1c4PMrjEOLpyCAFXg1Q==", "dev": true, "dependencies": { - "@nrwl/devkit": "18.3.4", + "@nrwl/devkit": "19.6.1", "ejs": "^3.1.7", "enquirer": "~2.3.6", "ignore": "^5.0.4", + "minimatch": "9.0.3", "semver": "^7.5.3", "tmp": "~0.2.1", "tslib": "^2.3.0", "yargs-parser": "21.1.1" }, "peerDependencies": { - "nx": ">= 16 <= 19" + "nx": ">= 17 <= 20" } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.3.4.tgz", - "integrity": "sha512-MOGk9z4fIoOkJB68diH3bwoWrC8X9IzMNsz1mu0cbVfgCRAfIV3b+lMsiwQYzWal3UWW5DE5Rkss4F8whiV5Uw==", + "version": "19.6.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.6.1.tgz", + "integrity": "sha512-xxAdyIUckvsIID0BnYCHM86s35n0tDsBYuoqpOFG+22PEk0bzoSVOyxeJQ5UKDCvXe5wa2MbcgyhbHKhj7Osnw==", "cpu": [ "arm64" ], @@ -3970,9 +4011,9 @@ } }, "node_modules/@nx/nx-darwin-x64": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-18.3.4.tgz", - "integrity": "sha512-tSzPRnNB3QdPM+KYiIuRCUtyCwcuIRC95FfP0ZB3WvfDeNxJChEAChNqmCMDE4iFvZhGuze8WqkJuIVdte+lyQ==", + "version": "19.6.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.6.1.tgz", + "integrity": "sha512-ISwb09KKtAydrAbyxwOjce8pdVzOSuzC068Uo8TcHp2Xao2b+N9zmkQquLzC+G4dgwxDxxVYoZcuZ6urRFV7Cg==", "cpu": [ "x64" ], @@ -3986,9 +4027,9 @@ } }, "node_modules/@nx/nx-freebsd-x64": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.3.4.tgz", - "integrity": "sha512-bjSPak/d+bcR95/pxHMRhnnpHc6MnrQcG6f5AjX15Esm4JdrdQKPBmG1RybuK0WKSyD5wgVhkAGc/QQUom9l8g==", + "version": "19.6.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.6.1.tgz", + "integrity": "sha512-IzR+K0tW8A6kl95V6k8Pp8tknjiDGOUB+E2p8YN7UlYPP7gaBK+rojERF4V7jD5pEvSxrKMwuJoD+WH/b52TNA==", "cpu": [ "x64" ], @@ -4002,9 +4043,9 @@ } }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.3.4.tgz", - "integrity": "sha512-/1HnUL7jhH0S7PxJqf6R1pk3QlAU22GY89EQV9fd+RDUtp7IyzaTlkebijTIqfxlSjC4OO3bPizaxEaxdd3uKQ==", + "version": "19.6.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.6.1.tgz", + "integrity": "sha512-8mHceXwpBIp1gF+hSKGg7XRYpcB9QN8YROSn4dzvDoUMEusOE27jzXKKS9dRkjdULYENKDkv0NbuhcoxoWx+KA==", "cpu": [ "arm" ], @@ -4018,9 +4059,9 @@ } }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.3.4.tgz", - "integrity": "sha512-g/2IaB2bZTKaBNPEf9LxtIXb1XHdhh3VO9PnePIrwkkixPMLN0dTxT5Sttt75lvLP3EU1AUR5w3Aaz2Q1mYtWA==", + "version": "19.6.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.6.1.tgz", + "integrity": "sha512-eqxWqhUrFEz3Rnoz9RKhMlrCY6AF0AVGgTGto5TdB16kIgTA53i18bf9jaq2MSBZQHE1kySVUgPfxQQxPzWKaA==", "cpu": [ "arm64" ], @@ -4034,9 +4075,9 @@ } }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.3.4.tgz", - "integrity": "sha512-MgfKLoEF6I1cCS+0ooFLEjJSSVdCYyCT9Q96IHRJntAEL8u/0GR2OUoBoLC+q1lnbIkJr/uqTJxA2Jh+sJTIbA==", + "version": "19.6.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.6.1.tgz", + "integrity": "sha512-3lfazErzsJgO8G2dEcuGmtJoi9fQ3CPvLA+RiE7CKBQ4a/5Zb1o2rqlZ1YTfnfiUcOh4knt7gWcXm16eSKbLoQ==", "cpu": [ "arm64" ], @@ -4050,9 +4091,9 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.3.4.tgz", - "integrity": "sha512-vbHxv7m3gjthBvw50EYCtgyY0Zg5nVTaQtX+wRsmKybV2i7wHbw5zIe1aL4zHUm6TcPGbIQK+utVM+hyCqKHVA==", + "version": "19.6.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.6.1.tgz", + "integrity": "sha512-Rt4NkuJZpRyVunRoCC5shaUqPk6wrMH3x55WEb0HBzlKjkItgrFpPInPS4hp9hFsJ8vX2AkBX2qrTWRaLMbOyQ==", "cpu": [ "x64" ], @@ -4066,9 +4107,9 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.3.4.tgz", - "integrity": "sha512-qIJKJCYFRLVSALsvg3avjReOjuYk91Q0hFXMJ2KaEM1Y3tdzcFN0fKBiaHexgbFIUk8zJuS4dJObTqSYMXowbg==", + "version": "19.6.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.6.1.tgz", + "integrity": "sha512-P0RnxCfcgb6t4l+WWVNlTDzqpcM/Du77EfgvNc3Z1mRLQMP4E5TkLt8J/aTTjh2GwtnP95oxQSOYBzg+sJwNPQ==", "cpu": [ "x64" ], @@ -4082,9 +4123,9 @@ } }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.3.4.tgz", - "integrity": "sha512-UxC8mRkFTPdZbKFprZkiBqVw8624xU38kI0xyooxKlFpt5lccTBwJ0B7+R8p1RoWyvh2DSyFI9VvfD7lczg1lA==", + "version": "19.6.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.6.1.tgz", + "integrity": "sha512-CFaRqK+Sv7Gi7d+WUJqFLV0t4D2ImnO7BoeZWnT6oEfIl94hikCtbu4693Fsu7eg37JMa+4xwdAUvOOq1rFhJg==", "cpu": [ "arm64" ], @@ -4098,9 +4139,9 @@ } }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.3.4.tgz", - "integrity": "sha512-/RqEjNU9hxIBxRLafCNKoH3SaB2FShf+1ZnIYCdAoCZBxLJebDpnhiyrVs0lPnMj9248JbizEMdJj1+bs/bXig==", + "version": "19.6.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.6.1.tgz", + "integrity": "sha512-l2vAK0/2c9oEAqI0KdeJkkkZlr72LeWV5zds/FIuFHBRyweJanplRelhD7t199BnGr2FfulOpFrc1TyYzvntkg==", "cpu": [ "x64" ], @@ -4216,9 +4257,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", - "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", + "integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==", "cpu": [ "arm" ], @@ -4229,9 +4270,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", - "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz", + "integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==", "cpu": [ "arm64" ], @@ -4242,9 +4283,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", - "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz", + "integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==", "cpu": [ "arm64" ], @@ -4255,9 +4296,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", - "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz", + "integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==", "cpu": [ "x64" ], @@ -4268,9 +4309,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", - "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz", + "integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==", "cpu": [ "arm" ], @@ -4281,9 +4322,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", - "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz", + "integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==", "cpu": [ "arm" ], @@ -4294,9 +4335,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", - "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz", + "integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==", "cpu": [ "arm64" ], @@ -4307,9 +4348,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", - "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz", + "integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==", "cpu": [ "arm64" ], @@ -4320,9 +4361,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", - "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz", + "integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==", "cpu": [ "ppc64" ], @@ -4333,9 +4374,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", - "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz", + "integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==", "cpu": [ "riscv64" ], @@ -4346,9 +4387,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", - "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz", + "integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==", "cpu": [ "s390x" ], @@ -4359,9 +4400,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", - "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz", + "integrity": "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==", "cpu": [ "x64" ], @@ -4372,9 +4413,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", - "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz", + "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==", "cpu": [ "x64" ], @@ -4385,9 +4426,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", - "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz", + "integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==", "cpu": [ "arm64" ], @@ -4398,9 +4439,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", - "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz", + "integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==", "cpu": [ "ia32" ], @@ -4411,9 +4452,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", - "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz", + "integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==", "cpu": [ "x64" ], @@ -4424,9 +4465,9 @@ ] }, "node_modules/@rollup/wasm-node": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.17.2.tgz", - "integrity": "sha512-4F6C3XaUn02XY/GJMQTXncWrLyCkRHdRZe4OyWuQUprWKmU2u+esISOtCYdr3Bp9AqCIo/X3So2Ik7N9dNDwow==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.21.0.tgz", + "integrity": "sha512-CqLrY1oc68dyB44h4qfAa/4LM+R+xvqaJSTBV0hWeLXiIdXhgrHlaalXOTrL5vWz+mgnyzlUgy3bhTkZjKt1LQ==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -4443,13 +4484,13 @@ } }, "node_modules/@schematics/angular": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.7.tgz", - "integrity": "sha512-HaJroKaberriP4wFefTTSVFrtU9GMvnG3I6ELbOteOyKMH7o2V91FXGJDJ5KnIiLRlBmC30G3r+9Ybc/rtAYkw==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.8.tgz", + "integrity": "sha512-2g4OmSyE9YGq50Uj7fNI26P/TSAFJ7ZuirwTF2O7Xc4XRQ29/tYIIqhezpNlTb6rlYblcQuMcUZBrMfWJHcqJw==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.3.7", - "@angular-devkit/schematics": "17.3.7", + "@angular-devkit/core": "17.3.8", + "@angular-devkit/schematics": "17.3.8", "jsonc-parser": "3.2.1" }, "engines": { @@ -4459,12 +4500,12 @@ } }, "node_modules/@sigstore/bundle": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.1.tgz", - "integrity": "sha512-eqV17lO3EIFqCWK3969Rz+J8MYrRZKw9IBHpSo6DEcEX2c+uzDFOgHE9f2MnyDpfs48LFO4hXmk9KhQ74JzU1g==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", + "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.3.1" + "@sigstore/protobuf-specs": "^0.3.2" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -4489,14 +4530,14 @@ } }, "node_modules/@sigstore/sign": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.1.tgz", - "integrity": "sha512-YZ71wKIOweC8ViUeZXboz0iPLqMkskxuoeN/D1CEpAyZvEepbX9oRMIoO6a/DxUqO1VEaqmcmmqzSiqtOsvSmw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", + "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.3.0", + "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.1", + "@sigstore/protobuf-specs": "^0.3.2", "make-fetch-happen": "^13.0.1", "proc-log": "^4.2.0", "promise-retry": "^2.0.1" @@ -4515,12 +4556,12 @@ } }, "node_modules/@sigstore/tuf": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.3.tgz", - "integrity": "sha512-agQhHNkIddXFslkudjV88vTXiAMEyUtso3at6ZHUNJ1agZb7Ze6VW/PddHipdWBu1t+8OWLW5X5yZOPiOnaWJQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", + "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.3.0", + "@sigstore/protobuf-specs": "^0.3.2", "tuf-js": "^2.2.1" }, "engines": { @@ -4528,14 +4569,14 @@ } }, "node_modules/@sigstore/verify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.0.tgz", - "integrity": "sha512-hQF60nc9yab+Csi4AyoAmilGNfpXT+EXdBgFkP9OgPwIBPwyqVf7JAWPtmqrrrneTmAT6ojv7OlH1f6Ix5BG4Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", + "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.3.1", + "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.1" + "@sigstore/protobuf-specs": "^0.3.2" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -4576,9 +4617,9 @@ } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "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" @@ -4590,6 +4631,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -4652,9 +4702,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", + "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", "dev": true, "dependencies": { "@types/estree": "*", @@ -4672,9 +4722,9 @@ } }, "node_modules/@types/esquery": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/esquery/-/esquery-1.5.3.tgz", - "integrity": "sha512-c55hQOcoPkWDfuEN9EdP1YyNH4D909U40gUEpY0nB5PWHExWHEPxcx3sx0fJ1Gzf4j1OpWktmIgciIlpgHtfDg==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/esquery/-/esquery-1.5.4.tgz", + "integrity": "sha512-yYO4Q8H+KJHKW1rEeSzHxcZi90durqYgWVfnh5K6ZADVBjBv2e1NEveYX5yT2bffgN7RqzH3k9930m+i2yBoMA==", "dev": true, "dependencies": { "@types/estree": "*" @@ -4698,9 +4748,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", - "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, "dependencies": { "@types/node": "*", @@ -4716,9 +4766,9 @@ "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -4748,12 +4798,12 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "version": "22.4.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.4.1.tgz", + "integrity": "sha512-1tbpb9325+gPnKK0dMm+/LMriX0vKxf6RnB0SZUqfyVkQ4fMgUSySqhxE/y8Jvs4NyF1yHzTfG9KlnkIODxPKg==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/node-forge": { @@ -4843,9 +4893,9 @@ } }, "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -5152,18 +5202,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.11.0.tgz", + "integrity": "sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" + "@typescript-eslint/scope-manager": "7.11.0", + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/typescript-estree": "7.11.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -5177,13 +5224,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", - "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.11.0.tgz", + "integrity": "sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0" + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -5194,9 +5241,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", - "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", + "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -5207,13 +5254,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", - "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.11.0.tgz", + "integrity": "sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5235,12 +5282,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", - "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", + "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/types": "7.11.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -5252,9 +5299,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "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" @@ -5505,9 +5552,9 @@ } }, "node_modules/@zkochan/js-yaml": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", - "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", + "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", "dev": true, "dependencies": { "argparse": "^2.0.1" @@ -5557,9 +5604,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "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" @@ -5840,9 +5887,9 @@ } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, "node_modules/asynckit": { @@ -5889,9 +5936,9 @@ } }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "dev": true, "dependencies": { "follow-redirects": "^1.15.6", @@ -6262,9 +6309,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "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": [ { @@ -6281,10 +6328,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "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" @@ -6345,9 +6392,9 @@ } }, "node_modules/cacache": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.3.tgz", - "integrity": "sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", @@ -6368,13 +6415,10 @@ } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "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/call-bind": { "version": "1.0.7", @@ -6414,9 +6458,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001618", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz", - "integrity": "sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==", + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", "dev": true, "funding": [ { @@ -6487,9 +6531,9 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "engines": { "node": ">=6.0" @@ -6657,9 +6701,9 @@ } }, "node_modules/codemirror": { - "version": "5.65.16", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz", - "integrity": "sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==" + "version": "5.65.17", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.17.tgz", + "integrity": "sha512-1zOsUx3lzAOu/gnMAZkQ9kpIHcPYOc9y1Fbm2UVk5UBPkdq380nhkelG0qUwm1f7wPvTbndu9ZYlug35EwAZRQ==" }, "node_modules/codemirror-spell-checker": { "version": "1.1.2", @@ -6712,9 +6756,9 @@ } }, "node_modules/commander": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", - "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "engines": { "node": ">=18" @@ -6959,12 +7003,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", - "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dev": true, "dependencies": { - "browserslist": "^4.23.0" + "browserslist": "^4.23.3" }, "funding": { "type": "opencollective", @@ -7229,9 +7273,9 @@ } }, "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" @@ -7481,24 +7525,30 @@ } }, "node_modules/dotenv": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.2.tgz", - "integrity": "sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/dotenv-expand": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", - "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", + "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", "dev": true, + "dependencies": { + "dotenv": "^16.4.4" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, "node_modules/duplexer": { @@ -7558,9 +7608,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.767", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.767.tgz", - "integrity": "sha512-nzzHfmQqBss7CE3apQHkHjXW77+8w3ubGCIoEijKCJebPufREaFETgGXWTkh32t259F3Kcq+R8MZdFdOJROgYw==", + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.12.tgz", + "integrity": "sha512-tIhPkdlEoCL1Y+PToq3zRNehUaKp3wBX/sr7aclAWdIWjvqAe/Im/H0SiCM4c1Q8BLPHCdoJTol+ZblflydehA==", "dev": true }, "node_modules/emoji-regex": { @@ -7627,18 +7677,18 @@ } }, "node_modules/engine.io-parser": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", - "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, "engines": { "node": ">=10.0.0" } }, "node_modules/enhanced-resolve": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz", - "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==", + "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", @@ -7661,10 +7711,16 @@ } }, "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.1.tgz", + "integrity": "sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==", + "dev": true, + "dependencies": { + "punycode": "^1.4.1" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/entities": { "version": "4.5.0", @@ -7737,9 +7793,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", - "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "node_modules/esbuild": { @@ -7873,9 +7929,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", - "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -8191,9 +8247,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -8690,9 +8746,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -8750,6 +8806,15 @@ "node": ">= 0.6" } }, + "node_modules/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dev": true, + "dependencies": { + "js-yaml": "^3.13.1" + } + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -8888,23 +8953,21 @@ } }, "node_modules/glob": { - "version": "10.3.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", - "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", + "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": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.11.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" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -8927,6 +8990,21 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "node_modules/glob/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/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -9056,13 +9134,10 @@ } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "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/hpack.js": { "version": "2.1.6", @@ -9336,9 +9411,9 @@ } }, "node_modules/immutable": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", - "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", "dev": true }, "node_modules/import-fresh": { @@ -9388,6 +9463,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "dependencies": { "once": "^1.3.0", @@ -9585,12 +9661,15 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9814,16 +9893,13 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "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" }, @@ -9832,9 +9908,9 @@ } }, "node_modules/jake": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", - "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, "dependencies": { "async": "^3.2.3", @@ -9942,9 +10018,9 @@ } }, "node_modules/jasmine-core": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.1.2.tgz", - "integrity": "sha512-2oIUMGn00FdUiqz6epiiJr7xcFyNYj3rDcfmnzfkBnHyBQ3cBQUs4mmyGsOb7TTLb9kxk7dBcmEmqhDKkBoDyA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.2.0.tgz", + "integrity": "sha512-tSAtdrvWybZkQmmaIoDgnvHG8ORUNw5kEVlO5CvrXj02Jjr9TZrmjFq7FUiOUzJiOP2wLGYT6PgrQgQF4R1xiw==", "dev": true }, "node_modules/jasmine-spec-reporter": { @@ -10089,9 +10165,9 @@ } }, "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "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" @@ -10215,9 +10291,9 @@ ] }, "node_modules/karma": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", - "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==", + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "dev": true, "dependencies": { "@colors/colors": "1.5.0", @@ -10300,9 +10376,9 @@ } }, "node_modules/karma-jasmine/node_modules/jasmine-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", - "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", + "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", "dev": true }, "node_modules/karma-source-map-support": { @@ -10378,6 +10454,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -10501,9 +10578,9 @@ } }, "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.1.tgz", + "integrity": "sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA==", "dev": true, "dependencies": { "picocolors": "^1.0.0", @@ -10913,12 +10990,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -11030,9 +11107,9 @@ } }, "node_modules/minipass": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", - "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", + "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" @@ -11098,9 +11175,9 @@ "dev": true }, "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz", + "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==", "dev": true, "dependencies": { "jsonparse": "^1.3.1", @@ -11512,9 +11589,9 @@ } }, "node_modules/node-gyp": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", - "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", "dev": true, "dependencies": { "env-paths": "^2.2.0", @@ -11523,9 +11600,9 @@ "graceful-fs": "^4.2.6", "make-fetch-happen": "^13.0.0", "nopt": "^7.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.1.0", "semver": "^7.3.5", - "tar": "^6.1.2", + "tar": "^6.2.1", "which": "^4.0.0" }, "bin": { @@ -11556,6 +11633,15 @@ "node": ">=16" } }, + "node_modules/node-gyp/node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/node-gyp/node_modules/which": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", @@ -11578,9 +11664,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "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/nopt": { @@ -11599,13 +11685,12 @@ } }, "node_modules/normalize-package-data": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz", - "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, "dependencies": { "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, @@ -11759,30 +11844,31 @@ } }, "node_modules/nx": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/nx/-/nx-18.3.4.tgz", - "integrity": "sha512-7rOHRyxpnZGJ3pHnwmpoAMHt9hNuwibWhOhPBJDhJVcbQJtGfwcWWyV/iSEnVXwKZ2lfHVE3TwE+gXFdT/GFiw==", + "version": "19.6.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-19.6.1.tgz", + "integrity": "sha512-F7NH8/lMwd2ogPjvjMDGUJMaRuEc60DEmpd8U/3R7WgFRHWuF5ily1AKQiLfQg6V5ArQUrkBJesulTAnlHR7+g==", "dev": true, "hasInstallScript": true, "dependencies": { - "@nrwl/tao": "18.3.4", + "@napi-rs/wasm-runtime": "0.2.4", + "@nrwl/tao": "19.6.1", "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "3.0.0-rc.46", - "@zkochan/js-yaml": "0.0.6", - "axios": "^1.6.0", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.7.4", "chalk": "^4.1.0", "cli-cursor": "3.1.0", "cli-spinners": "2.6.1", "cliui": "^8.0.1", - "dotenv": "~16.3.1", - "dotenv-expand": "~10.0.0", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", "enquirer": "~2.3.6", "figures": "3.2.0", "flat": "^5.0.2", + "front-matter": "^4.0.2", "fs-extra": "^11.1.0", "ignore": "^5.0.4", "jest-diff": "^29.4.1", - "js-yaml": "4.1.0", "jsonc-parser": "3.2.0", "lines-and-columns": "~2.0.3", "minimatch": "9.0.3", @@ -11805,16 +11891,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "18.3.4", - "@nx/nx-darwin-x64": "18.3.4", - "@nx/nx-freebsd-x64": "18.3.4", - "@nx/nx-linux-arm-gnueabihf": "18.3.4", - "@nx/nx-linux-arm64-gnu": "18.3.4", - "@nx/nx-linux-arm64-musl": "18.3.4", - "@nx/nx-linux-x64-gnu": "18.3.4", - "@nx/nx-linux-x64-musl": "18.3.4", - "@nx/nx-win32-arm64-msvc": "18.3.4", - "@nx/nx-win32-x64-msvc": "18.3.4" + "@nx/nx-darwin-arm64": "19.6.1", + "@nx/nx-darwin-x64": "19.6.1", + "@nx/nx-freebsd-x64": "19.6.1", + "@nx/nx-linux-arm-gnueabihf": "19.6.1", + "@nx/nx-linux-arm64-gnu": "19.6.1", + "@nx/nx-linux-arm64-musl": "19.6.1", + "@nx/nx-linux-x64-gnu": "19.6.1", + "@nx/nx-linux-x64-musl": "19.6.1", + "@nx/nx-win32-arm64-msvc": "19.6.1", + "@nx/nx-win32-x64-msvc": "19.6.1" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -11844,12 +11930,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/nx/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/nx/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -11899,18 +11979,6 @@ "node": ">=8" } }, - "node_modules/nx/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/nx/node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", @@ -11975,10 +12043,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12243,6 +12314,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/pacote": { "version": "17.0.6", "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.6.tgz", @@ -12423,13 +12500,10 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "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/path-to-regexp": { "version": "0.1.7", @@ -12569,9 +12643,9 @@ } }, "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, "engines": { "node": ">=12.20" @@ -12716,9 +12790,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "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", @@ -12775,21 +12849,21 @@ "integrity": "sha512-zaOq3YvcOYytbAmKv3zYc+0VNS9Wg5d37dfxZnveKBFPr7vEIwfV5ydrpiouTft8MVW6qNjfkaQphHSnvgQbpQ==" }, "node_modules/primeicons": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/primeicons/-/primeicons-6.0.1.tgz", - "integrity": "sha512-KDeO94CbWI4pKsPnYpA1FPjo79EsY9I+M8ywoPBSf9XMXoe/0crjbUK7jcQEDHuc0ZMRIZsxH3TYLv4TUtHmAA==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/primeicons/-/primeicons-7.0.0.tgz", + "integrity": "sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==" }, "node_modules/primeng": { - "version": "17.16.1", - "resolved": "https://registry.npmjs.org/primeng/-/primeng-17.16.1.tgz", - "integrity": "sha512-bNCUxdXgT4ikOG/aKA2PW9FCFnD/EtB+fLoGLuQXAGB1PJU72x5c0yQoGFDQcAgx78o3d/4LjZOdOPYwovN9Lg==", + "version": "17.18.9", + "resolved": "https://registry.npmjs.org/primeng/-/primeng-17.18.9.tgz", + "integrity": "sha512-1FT0B8wtgvs/joduB1DDOLe2IsP1pegOiEfSPAHSbc6otgNx/6iLR0k2M/xr2c9Ur1aC7tAikkVfH3FGpWof3w==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": "^17.0.0", - "@angular/core": "^17.0.0", - "@angular/forms": "^17.0.0", + "@angular/common": "^17.0.0 || ^18.0.0", + "@angular/core": "^17.0.0 || ^18.0.0", + "@angular/forms": "^17.0.0 || ^18.0.0", "rxjs": "^6.0.0 || ^7.8.1", "zone.js": "~0.14.0" } @@ -12873,13 +12947,10 @@ "optional": true }, "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true }, "node_modules/qjobs": { "version": "1.2.0", @@ -12980,6 +13051,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.1.tgz", "integrity": "sha512-8PcDiZ8DXUjLf687Ol4BR8Bpm2umR7vhoZOzNRt+uxD9GpBh/K+CAAALVIiYFknmvlmyg7hM7BSNUXPaCCqd0Q==", + "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", "dev": true, "dependencies": { "glob": "^10.2.2", @@ -13279,15 +13351,16 @@ } }, "node_modules/rfdc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -13313,6 +13386,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -13342,9 +13416,9 @@ } }, "node_modules/rollup": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", - "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz", + "integrity": "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -13357,22 +13431,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.17.2", - "@rollup/rollup-android-arm64": "4.17.2", - "@rollup/rollup-darwin-arm64": "4.17.2", - "@rollup/rollup-darwin-x64": "4.17.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", - "@rollup/rollup-linux-arm-musleabihf": "4.17.2", - "@rollup/rollup-linux-arm64-gnu": "4.17.2", - "@rollup/rollup-linux-arm64-musl": "4.17.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", - "@rollup/rollup-linux-riscv64-gnu": "4.17.2", - "@rollup/rollup-linux-s390x-gnu": "4.17.2", - "@rollup/rollup-linux-x64-gnu": "4.17.2", - "@rollup/rollup-linux-x64-musl": "4.17.2", - "@rollup/rollup-win32-arm64-msvc": "4.17.2", - "@rollup/rollup-win32-ia32-msvc": "4.17.2", - "@rollup/rollup-win32-x64-msvc": "4.17.2", + "@rollup/rollup-android-arm-eabi": "4.21.0", + "@rollup/rollup-android-arm64": "4.21.0", + "@rollup/rollup-darwin-arm64": "4.21.0", + "@rollup/rollup-darwin-x64": "4.21.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.0", + "@rollup/rollup-linux-arm-musleabihf": "4.21.0", + "@rollup/rollup-linux-arm64-gnu": "4.21.0", + "@rollup/rollup-linux-arm64-musl": "4.21.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.0", + "@rollup/rollup-linux-riscv64-gnu": "4.21.0", + "@rollup/rollup-linux-s390x-gnu": "4.21.0", + "@rollup/rollup-linux-x64-gnu": "4.21.0", + "@rollup/rollup-linux-x64-musl": "4.21.0", + "@rollup/rollup-win32-arm64-msvc": "4.21.0", + "@rollup/rollup-win32-ia32-msvc": "4.21.0", + "@rollup/rollup-win32-x64-msvc": "4.21.0", "fsevents": "~2.3.2" } }, @@ -13500,9 +13574,9 @@ } }, "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "dev": true, "optional": true }, @@ -13832,17 +13906,17 @@ } }, "node_modules/sigstore": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.0.tgz", - "integrity": "sha512-q+o8L2ebiWD1AxD17eglf1pFrl9jtW7FHa0ygqY6EKvibK8JHyq9Z26v9MZXeDiw+RbfOJ9j2v70M10Hd6E06A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", + "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.3.1", + "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.1", - "@sigstore/sign": "^2.3.0", - "@sigstore/tuf": "^2.3.1", - "@sigstore/verify": "^1.2.0" + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -13934,14 +14008,14 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", "dev": true, "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" @@ -14038,9 +14112,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", "dev": true }, "node_modules/spdy": { @@ -14658,6 +14732,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -14779,9 +14854,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tuf-js": { "version": "2.2.1", @@ -14859,9 +14934,9 @@ "integrity": "sha512-Oy/k+tFle5NAA3J/yrrYGfvEnPVrDZ8s8/WCwjUE75k331QyKIsFss7byQ/PzBmXLY6h1moRnZbnaxWBe3I3CA==" }, "node_modules/ua-parser-js": { - "version": "0.7.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", - "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", + "version": "0.7.38", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.38.tgz", + "integrity": "sha512-fYmIy7fKTSFAhG3fuPlubeGaMoAd6r0rSnfEsO5nEY55i26KSLt9EH7PLQiiqPUhNqYIJvSkTy1oArIcXAbPbA==", "dev": true, "funding": [ { @@ -14891,9 +14966,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -14979,9 +15054,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", - "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", + "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": [ { @@ -14999,7 +15074,7 @@ ], "dependencies": { "escalade": "^3.1.2", - "picocolors": "^1.0.0" + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -15017,6 +15092,15 @@ "punycode": "^2.1.0" } }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16145,12 +16229,9 @@ } }, "node_modules/zone.js": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.5.tgz", - "integrity": "sha512-9XYWZzY6PhHOSdkYryNcMm7L8EK7a4q+GbTvxbIA2a9lMdRUpGuyaYvLDcg8D6bdn+JomSsbPcilVKg6SmUx6w==", - "dependencies": { - "tslib": "^2.3.0" - } + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz", + "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==" } } } diff --git a/package.json b/package.json index da0c6184..53659e1f 100644 --- a/package.json +++ b/package.json @@ -41,8 +41,8 @@ "ngx-spinner": "^16.0.2", "ngx-toastr": "^18.0.0", "primeflex": "^3.3.1", - "primeicons": "^6.0.1", - "primeng": "^17.5.0", + "primeicons": "^7.0.0", + "primeng": "^17.18.0", "rxjs": "~7.8.1", "tslib": "^2.6.2", "zone.js": "~0.14.3" diff --git a/projects/ng-core-tester/src/app/app-routing.module.ts b/projects/ng-core-tester/src/app/app-routing.module.ts index f2b2f49d..f591aa83 100644 --- a/projects/ng-core-tester/src/app/app-routing.module.ts +++ b/projects/ng-core-tester/src/app/app-routing.module.ts @@ -21,8 +21,8 @@ import { Observable, of } from 'rxjs'; import { HomeComponent } from './home/home.component'; import { DetailComponent } from './record/document/detail/detail.component'; import { DocumentComponent } from './record/document/document.component'; -import { RouteService } from './routes/route.service'; import { EditorComponent } from './record/editor/editor.component'; +import { RouteService } from './routes/route.service'; /** * Disallows access to admin functionalities. @@ -207,6 +207,14 @@ const routes: Routes = [ longMode: true }, component: DocumentComponent + }, + { + key: 'normal', + label: 'normal', + editorSettings: { + longMode: false + }, + component: DocumentComponent } ] } @@ -377,6 +385,16 @@ const routes: Routes = [ label: 'Title', value: 'title' } + ], + exportFormats: [ + { + label: 'CSV', + url: 'CSV' + }, + { + label: 'TXT', + url: 'txt' + } ] }, { @@ -407,13 +425,7 @@ const routes: Routes = [ exports: [RouterModule] }) export class AppRoutingModule { - /** - * Constructor - * - * Initializes routes. - * - * @param _routeService Route service - */ + constructor(private _routeService: RouteService) { this._routeService.initializeRoutes(); } diff --git a/projects/ng-core-tester/src/app/app.component.html b/projects/ng-core-tester/src/app/app.component.html index 889e498e..b69e8965 100644 --- a/projects/ng-core-tester/src/app/app.component.html +++ b/projects/ng-core-tester/src/app/app.component.html @@ -14,23 +14,18 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . --> - - -
diff --git a/projects/ng-core-tester/src/app/app.component.ts b/projects/ng-core-tester/src/app/app.component.ts index 35453b7f..057a7d42 100644 --- a/projects/ng-core-tester/src/app/app.component.ts +++ b/projects/ng-core-tester/src/app/app.component.ts @@ -14,11 +14,9 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { Component, OnInit } from '@angular/core'; -import { CoreConfigService, MenuItem, RecordEvent, RecordService, TitleMetaService, TranslateService } from '@rero/ng-core'; -import { BsLocaleService } from 'ngx-bootstrap/datepicker'; -import { ToastrService } from 'ngx-toastr'; -import { AppMenuService } from './service/app-menu.service'; +import { Component, OnInit, inject } from '@angular/core'; +import { CoreConfigService, RecordEvent, RecordService, TitleMetaService, TranslateService } from '@rero/ng-core'; +import { MenuItem, MessageService } from 'primeng/api'; /** * Main component of the application. @@ -28,6 +26,14 @@ import { AppMenuService } from './service/app-menu.service'; templateUrl: './app.component.html' }) export class AppComponent implements OnInit { + + /** Service injection */ + translateService = inject(TranslateService); + configService = inject(CoreConfigService); + titleMetaService = inject(TitleMetaService); + recordService = inject(RecordService); + messageService = inject(MessageService); + // Current lang of the application lang: string = document.documentElement.lang; @@ -42,28 +48,6 @@ export class AppComponent implements OnInit { // Application language menu languageMenu: MenuItem; - - /** - * Constructor. - * @param _translateService Translate service. - * @param _configService Configuration service. - * @param _titleMetaService Meta service. - * @param _recordService Record service. - * @param _toastrService Toast service. - * @param _bsLocaleService Locale service for bootstrap. - * @param _menuService Interface menu - */ - constructor( - private _translateService: TranslateService, - private _configService: CoreConfigService, - private _titleMetaService: TitleMetaService, - private _recordService: RecordService, - private _toastrService: ToastrService, - private _bsLocaleService: BsLocaleService, - private _appMenuService: AppMenuService - ) { - } - /** * Component initialization. * @@ -73,52 +57,30 @@ export class AppComponent implements OnInit { */ ngOnInit() { this.initializeEvents(); - this._translateService.setLanguage(this.lang); - this.appMenu = this._appMenuService.generateApplicationMenu(); - this.languageMenu = this._appMenuService.generateLanguageMenu( - this._configService.languages, - this.lang - ); + this.translateService.setLanguage(this.lang); // Set default title window when application start - const prefix = this._configService.prefixWindow; + const prefix = this.configService.prefixWindow; if (prefix) { - this._titleMetaService.setPrefix(prefix); + this.titleMetaService.setPrefix(prefix); } - this._titleMetaService.setTitle('Welcome'); - } - - /** - * Event change language - * @param item - MenuItem - */ - eventChangeLang(item: MenuItem) { - this.languageMenu.getChildren().forEach((menu: MenuItem) => { - if (menu.isActive()) { - menu.deleteLabelAttribute('class'); - menu.setActive(false); - } - }); - item.setLabelAttribute('class', 'font-weight-bold') - .setActive(true); - this._translateService.setLanguage(item.getName()); - this._bsLocaleService.use(item.getName()); + this.titleMetaService.setTitle('Welcome'); } /** * Initializes listening of events when a record is changed. */ private initializeEvents() { - this._recordService.onCreate$.subscribe((recordEvent: RecordEvent) => { - const pid = recordEvent.data.record.pid; - this._toastrService.info(`Call Record Event on create (Record Pid: ${pid})`); + this.recordService.onCreate$.subscribe((recordEvent: RecordEvent) => { + const {pid} = recordEvent.data.record; + this.messageService.add({ severity: 'info', summary: 'Record', detail: `Call Record Event on create (Record Pid: ${pid})`}); }); - this._recordService.onUpdate$.subscribe((recordEvent: RecordEvent) => { - const pid = recordEvent.data.record.pid; - this._toastrService.info(`Call Record Event on update (Record Pid: ${pid})`); + this.recordService.onUpdate$.subscribe((recordEvent: RecordEvent) => { + const {pid} = recordEvent.data.record; + this.messageService.add({ severity: 'info', summary: 'Record', detail: `Call Record Event on update (Record Pid: ${pid})`}); }); - this._recordService.onDelete$.subscribe((recordEvent: RecordEvent) => { - const pid = recordEvent.data.pid; - this._toastrService.info(`Call Record Event on delete (Record Pid: ${pid})`); + this.recordService.onDelete$.subscribe((recordEvent: RecordEvent) => { + const {pid} = recordEvent.data.record; + this.messageService.add({ severity: 'info', summary: 'Record', detail: `Call Record Event on delete (Record Pid: ${pid})`}); }); } } diff --git a/projects/ng-core-tester/src/app/app.module.ts b/projects/ng-core-tester/src/app/app.module.ts index 8338201f..0f117d10 100644 --- a/projects/ng-core-tester/src/app/app.module.ts +++ b/projects/ng-core-tester/src/app/app.module.ts @@ -20,21 +20,25 @@ import { FormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { TranslateLoader as BaseTranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { CoreConfigService, RecordModule, RecordService, TranslateLoader } from '@rero/ng-core'; +import { CoreConfigService, RecordModule, RecordService, RemoteAutocompleteService, TranslateLoader } from '@rero/ng-core'; import { defineLocale } from 'ngx-bootstrap/chronos'; import { CollapseModule } from 'ngx-bootstrap/collapse'; -import { BsLocaleService } from 'ngx-bootstrap/datepicker'; import { deLocale, enGbLocale, frLocale, itLocale } from 'ngx-bootstrap/locale'; import { TypeaheadModule } from 'ngx-bootstrap/typeahead'; +import { MenubarModule } from 'primeng/menubar'; import { AppConfigService } from './app-config.service'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; +import { AppDialogComponent } from './home/dialog/app-dialog.component'; import { HomeComponent } from './home/home.component'; +import { ToastComponent } from './home/toast/toast.component'; import { DetailComponent } from './record/document/detail/detail.component'; import { DocumentComponent } from './record/document/document.component'; import { EditorComponent } from './record/editor/editor.component'; -import { SearchBarComponent } from './search-bar/search-bar.component'; import { RecordServiceMock } from './record/editor/record-service-mock'; +import { SearchBarComponent } from './search-bar/search-bar.component'; +import { MenuComponent } from './menu/menu.component'; +import { AppRemoteAutocompleteService } from './service/app-remote-autocomplete.service'; @NgModule({ declarations: [ @@ -43,7 +47,10 @@ import { RecordServiceMock } from './record/editor/record-service-mock'; HomeComponent, DetailComponent, SearchBarComponent, - EditorComponent + EditorComponent, + ToastComponent, + AppDialogComponent, + MenuComponent ], imports: [ BrowserModule, @@ -60,17 +67,21 @@ import { RecordServiceMock } from './record/editor/record-service-mock'; deps: [CoreConfigService, HttpClient] } }), - RecordModule + RecordModule, + MenubarModule, ], providers: [ { - provide: CoreConfigService, - useClass: AppConfigService + provide: CoreConfigService, + useClass: AppConfigService + }, + { + provide: RecordService, + useClass: RecordServiceMock }, - BsLocaleService, { - provide: RecordService, - useClass: RecordServiceMock + provide: RemoteAutocompleteService, + useClass: AppRemoteAutocompleteService } ], bootstrap: [AppComponent] diff --git a/projects/ng-core-tester/src/app/home/dialog/app-dialog.component.html b/projects/ng-core-tester/src/app/home/dialog/app-dialog.component.html new file mode 100644 index 00000000..a40bb608 --- /dev/null +++ b/projects/ng-core-tester/src/app/home/dialog/app-dialog.component.html @@ -0,0 +1,17 @@ + + diff --git a/projects/ng-core-tester/src/app/home/dialog/app-dialog.component.ts b/projects/ng-core-tester/src/app/home/dialog/app-dialog.component.ts new file mode 100644 index 00000000..b0b0cfe6 --- /dev/null +++ b/projects/ng-core-tester/src/app/home/dialog/app-dialog.component.ts @@ -0,0 +1,58 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { Component, inject } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { ConfirmationService, MessageService } from 'primeng/api'; + +@Component({ + selector: 'app-dialog', + templateUrl: './app-dialog.component.html' +}) +export class AppDialogComponent { + translate = inject(TranslateService); + confirmationService = inject(ConfirmationService); + messageService = inject(MessageService); + + confirm(event: Event): void { + this.confirmationService.confirm({ + target: event.target as EventTarget, + acceptLabel: this.translate.instant('Yes'), + rejectLabel: this.translate.instant('No'), + message: this.translate.instant('Are you sure that you want to proceed?'), + header: this.translate.instant('Confirmation'), + icon: 'pi pi-exclamation-triangle', + acceptIcon:"none", + rejectIcon:"none", + rejectButtonStyleClass:"p-button-text", + accept: () => { + this.messageService.add({ + severity: 'info', + summary: this.translate.instant('Confirmed'), + detail: this.translate.instant('You have accepted') + }); + }, + reject: () => { + this.messageService.add({ + severity: 'error', + summary: this.translate.instant('Rejected'), + detail: this.translate.instant('You have rejected'), + life: 3000 + }); + } + }); + } +} diff --git a/projects/ng-core-tester/src/app/home/home.component.html b/projects/ng-core-tester/src/app/home/home.component.html index 4c3fb7bb..341d9433 100644 --- a/projects/ng-core-tester/src/app/home/home.component.html +++ b/projects/ng-core-tester/src/app/home/home.component.html @@ -1,6 +1,6 @@ -

Search component

-
-
- - -
-
+ + + -

Alert component

-
-
- -
-
- -
-
- -
-
+ + + -

Dialog component

- - -

Search input

- - -

API Data

-

{{ apiData | json }}

- -

Language translation

-

Translate "fr" code in french: {{ testLanguageTranslation }}

- -

Nl2br pipe

-
+
+ -

Translate Language pipe

-

Translate "fr" code in deutsch: {{ 'fr' | translateLanguage: 'de' }}

-

Translate "zzz" code in italian: {{ 'zzz' | translateLanguage: 'it' }} (code not available)

-

Translate "fr" code in not language loaded: {{ 'fr' | translateLanguage: 'pt' }} (return initial + +

Translate "fre" code in german: {{ 'fre' | translateLanguage: 'de' }}

+

Translate "zzz" code in italian: {{ 'zzz' | translateLanguage: 'it' }} (code not available)

+

Translate "fre" code in not language loaded: {{ 'fre' | translateLanguage: 'pt' }} (return initial value)

+ -

Menu

- - -

Spinner

- + + + -

Markdown pipe

- -
+ + +
+
diff --git a/projects/ng-core-tester/src/app/home/home.component.ts b/projects/ng-core-tester/src/app/home/home.component.ts index 297ea323..3e9b942d 100644 --- a/projects/ng-core-tester/src/app/home/home.component.ts +++ b/projects/ng-core-tester/src/app/home/home.component.ts @@ -1,6 +1,6 @@ /* * RERO angular core - * Copyright (C) 2020 RERO + * Copyright (C) 2020-2024 RERO * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -14,23 +14,19 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { Component, OnInit } from '@angular/core'; -import { ApiService, DialogService, MenuItem, RecordSearchService, TranslateLanguageService } from '@rero/ng-core'; +import { Component, inject, OnInit } from '@angular/core'; +import { RecordSearchService } from '@rero/ng-core'; import { NgxSpinnerService } from 'ngx-spinner'; -import { ToastrService } from 'ngx-toastr'; import { DocumentComponent } from '../record/document/document.component'; -import { MenuService } from '../service/menu.service'; @Component({ selector: 'app-home', templateUrl: './home.component.html' }) export class HomeComponent implements OnInit { - // Object containing API paths. - apiData: any; - - // Contains the full translated language of a language code. - testLanguageTranslation: string; + // Inject + private recordSearchService = inject(RecordSearchService); + private spinner = inject(NgxSpinnerService); // Configuration for resources. recordConfig: Array = [ @@ -62,150 +58,21 @@ export class HomeComponent implements OnInit { } ]; - // Menu - menuApplication: MenuItem; - - // Menu click - menuClick: MenuItem; - // Markdown text markdownText = '*Hello* **world**'; - /** - * Component initialization - * - * - Initializes application menu - */ - ngOnInit() { - this.menuApplication = this._menuService.generateApplicationMenu(); - } - - /** - * Menu selected by user - * @param item - Menu Item - */ - eventMenuClick(item: MenuItem) { - this._toastrService.success(`menu ${item.getName()} clicked`); + ngOnInit(): void { + // Initializes aggregations filters to launch the first search. + this.recordSearchService.setAggregationsFilters([]); } - /** * Show spinner for 5 seconds */ showSpinner() { - this._spinner.show(); + this.spinner.show(); setTimeout(() => { - this._spinner.hide(); - }, 5000); - } - - /** - * Constructor. - * - * - Initializes API object paths. - * - Stores translated language. - * - Empties aggregations filters. - * - * @param _dialogService Dialog service. - * @param _apiService API service. - * @param _translateLanguageService Translate language service. - * @param _toastrService Toastr service. - * @param _recordSearchService Record search service. - * @param _spinner Spinner service - */ - constructor( - private _dialogService: DialogService, - private _apiService: ApiService, - private _translateLanguageService: TranslateLanguageService, - private _toastrService: ToastrService, - private _recordSearchService: RecordSearchService, - private _spinner: NgxSpinnerService, - private _menuService: MenuService - ) { - this.apiData = { - relative: this._apiService.getEndpointByType('documents'), - absolute: this._apiService.getEndpointByType('documents', true), - }; - - this.testLanguageTranslation = this._translateLanguageService.translate('fr', 'fr'); - - // Initializes aggregations filters to launch the first search. - this._recordSearchService.setAggregationsFilters([]); - } - - /** - * Show a confirmation dialog box. - */ - showDialog() { - const config = { - ignoreBackdropClick: true, - initialState: { - title: 'Confirmation', - body: 'Exit without saving changes?', - confirmButton: true, - cancelTitleButton: 'Abort', - confirmTitleButton: 'Confirm' - } - }; - - this._dialogService.show(config).subscribe((confirm: boolean) => { - if (confirm) { - console.log('Confirmed !'); - } - }); - } - - /** - * Simulates a search by only log infos. - * - * @param searchText String to search. - */ - doSearch(searchText: string) { - console.log(`You search for: ${searchText}`); - } - - /** - * Shows an alert message with toastr. - */ - addAlert() { - const type = (document.getElementById('alert-type')) as HTMLSelectElement; - const message = (document.getElementById('alert-message')) as HTMLInputElement; - switch (type.value) { - // Checkbox controls - case 'success': - this._toastrService.success(message.value); - break; - case 'info': - this._toastrService.info(message.value); - break; - case 'warning': - this._toastrService.warning(message.value); - break; - case 'danger': - this._toastrService.error(message.value); - break; - } - } - - /** - * Show a message when item menu is clicked. - * - * @param item Menu item. - */ - clickLinkItemMenu(item: any) { - this._toastrService.success(`menu ${item.name} clicked`); - } - - /** - * Whether a menu item is visible or not. - * - * @param itemMenu Menu item. - * @return True if the menu is visible. - */ - isItemMenuVisible(itemMenu: any) { - if (itemMenu.name === 'Hidden') { - return false; - } - return true; + this.spinner.hide(); + }, 3000); } } diff --git a/projects/ng-core-tester/src/app/home/toast/toast.component.html b/projects/ng-core-tester/src/app/home/toast/toast.component.html new file mode 100644 index 00000000..41196516 --- /dev/null +++ b/projects/ng-core-tester/src/app/home/toast/toast.component.html @@ -0,0 +1,32 @@ + +
+
+ +
+
+ +
+
+ +
+
diff --git a/projects/ng-core-tester/src/app/home/toast/toast.component.ts b/projects/ng-core-tester/src/app/home/toast/toast.component.ts new file mode 100644 index 00000000..e18be9c3 --- /dev/null +++ b/projects/ng-core-tester/src/app/home/toast/toast.component.ts @@ -0,0 +1,71 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { Component, OnInit, inject } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { Message, MessageService } from 'primeng/api'; + +interface IToastType { + name: string; + code: string; +} + +@Component({ + selector: 'app-toast', + templateUrl: './toast.component.html' +}) +export class ToastComponent implements OnInit { + + translateService = inject(TranslateService); + messageService = inject(MessageService); + + toastTypes: IToastType[]; + + toastType: any; + + toastMessage: string; + + ngOnInit(): void { + this.toastMessage = this.translateService.instant('This is the message'); + this.toastTypes = [ + { name: this.translateService.instant('Success'), code: 'success' }, + { name: this.translateService.instant('Info'), code: 'info' }, + { name: this.translateService.instant('Warn'), code: 'warn' }, + { name: this.translateService.instant('Error'), code: 'error' }, + ]; + this.translateService.onLangChange.subscribe(() => { + this.toastMessage = this.translateService.instant('This is the message'); + this.toastTypes.forEach((type: any) => { + type.name = this.translateService.instant(type.code); + }); + this.toastType = undefined; + }); + } + + showToast(): void { + const message: Message = { + severity: 'error', + summary: this.translateService.instant('Error'), + detail: this.translateService.instant('Please select a type') + }; + if (this.toastType) { + message.severity = this.toastType.code; + message.summary = this.toastType.name; + message.detail = this.toastMessage; + } + this.messageService.add(message); + } +} diff --git a/projects/ng-core-tester/src/app/menu/menu.component.html b/projects/ng-core-tester/src/app/menu/menu.component.html new file mode 100644 index 00000000..a981f82d --- /dev/null +++ b/projects/ng-core-tester/src/app/menu/menu.component.html @@ -0,0 +1,65 @@ + + + + + + + + + @if (item.routerLink && !item.url) { + + @if (item.icon) { + + } + {{ item.label }} + @if (item.badge) { + + } + @if (item.shortcut) { + {{ item.shortcut }} + } + + } + @if (item.url && !item.routerLink) { + + @if (item.icon) { + + } + {{ item.label }} + @if (item.badge) { + + } + @if (item.shortcut) { + {{ item.shortcut }} + } + + } + @if (!item.url && !item.routerLink) { + + } + + + diff --git a/projects/ng-core-tester/src/app/menu/menu.component.scss b/projects/ng-core-tester/src/app/menu/menu.component.scss new file mode 100644 index 00000000..af9a8ea5 --- /dev/null +++ b/projects/ng-core-tester/src/app/menu/menu.component.scss @@ -0,0 +1,3 @@ +:host ::ng-deep .p-submenu-list { + z-index: 1000; +} diff --git a/projects/ng-core-tester/src/app/menu/menu.component.ts b/projects/ng-core-tester/src/app/menu/menu.component.ts new file mode 100644 index 00000000..42fb2b8f --- /dev/null +++ b/projects/ng-core-tester/src/app/menu/menu.component.ts @@ -0,0 +1,191 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { Component, OnInit, inject } from '@angular/core'; +import { MenuItem, MessageService } from 'primeng/api'; +import { Router } from '@angular/router'; +import { CoreConfigService } from '@rero/ng-core'; +import { LangChangeEvent, TranslateService } from '@ngx-translate/core'; + +@Component({ + selector: 'app-menu', + templateUrl: './menu.component.html', + styleUrl: './menu.component.scss' +}) +export class MenuComponent implements OnInit { + + messageService = inject(MessageService); + translateService = inject(TranslateService); + router = inject(Router); + config = inject(CoreConfigService); + + menuItems: MenuItem[]; + + ngOnInit(): void { + this.menuItems = [ + { + label: this.translateService.instant('home'), + untranslatedLabel: 'home', + icon: 'pi pi-home', + command: () => { + this.router.navigate(['/']); + this.messageService.add({ severity: 'success', detail: 'Home menu selected', life: 2000 }); + } + }, + { + label: this.translateService.instant('Records'), + untranslatedLabel: 'Records', + id: 'records', + items: [ + { + label: this.translateService.instant('Global records'), + untranslatedLabel: 'Global records', + icon: 'fa fa-book', + routerLink: ['/record', 'search', 'documents'] + }, + { + label: this.translateService.instant('UNISI records'), + untranslatedLabel: 'UNISI records', + icon: 'fa fa-book', + routerLink: ['/unisi', 'record', 'search', 'documents'] + }, + { + label: this.translateService.instant('Backend records'), + untranslatedLabel: 'Backend records', + icon: 'fa fa-book', + routerLink: ['/admin', 'record', 'search', 'documents'] + }, + { + label: this.translateService.instant('Documents'), + untranslatedLabel: 'Documents', + icon: 'fa fa-book', + items: [ + { + label: this.translateService.instant('Document records'), + untranslatedLabel: 'Document records', + icon: 'fa fa-book', + routerLink: ['/records', 'documents'] + }, + { + label: this.translateService.instant('Document records with query params'), + untranslatedLabel: 'Document records with query params', + icon: 'fa fa-book', + routerLink: ['/records', 'documents'], + queryParams: { q: 'anatomic', page: 1, size: 10 } + } + ] + }, + { + label: this.translateService.instant('Organisation'), + untranslatedLabel: 'Organisation', + icon: 'fa fa-industry', + routerLink: ['/records', 'organisations'] + }, + { + separator: true + }, + { + label: this.translateService.instant('Editor'), + untranslatedLabel: 'Editor', + icon: 'fa fa-pencil-square-o', + items: [ + { + label: this.translateService.instant('Long mode'), + items: [ + { + label: this.translateService.instant('Add mode'), + untranslatedLabel: 'Add mode', + icon: 'fa fa-pencil-square-o', + routerLink: ['/editor', 'demo'] + }, + { + label: this.translateService.instant('Edit mode'), + untranslatedLabel: 'Edit mode', + icon: 'fa fa-pencil-square-o', + routerLink: ['/editor', 'demo', '1'] + } + ] + }, + { + label: this.translateService.instant('Simple mode'), + items: [ + { + label: this.translateService.instant('Add mode'), + untranslatedLabel: 'Add mode', + icon: 'fa fa-pencil-square-o', + routerLink: ['/editor', 'normal'] + }, + { + label: this.translateService.instant('Edit mode'), + untranslatedLabel: 'Edit mode', + icon: 'fa fa-pencil-square-o', + routerLink: ['/editor', 'normal', '1'] + } + ] + } + ] + } + ] + }, + { + label: 'Rero website', + id: 'rero_website', + icon: 'fa fa-external-link', + url: 'https://www.rero.ch', + target: '_blank' + }, + { + label: this.translateService.instant('Language'), + untranslatedLabel: 'Language', + id: 'language', + icon: 'fa fa-language', + items: [] + } + ]; + + const languageMenu = this.menuItems.find((item: MenuItem) => item.id === 'language'); + this.config.languages.map((language: string) => { + const lang = { + label: this.translateService.instant(language), + untranslatedLabel: language, + id: language, + styleClass: undefined, + command: () => { + this.translateService.use(language); + this.messageService.add({ severity: 'info', detail: `Language change to ${language}`, life: 2000 }); + } + } + languageMenu.items.push(lang); + }); + this.translateService.onLangChange.subscribe((event: LangChangeEvent) => { + this.translateItems(this.menuItems) + languageMenu.items.map((item: MenuItem) => { + item.styleClass = item.id === event.lang ? 'font-bold': '' + }); + }); + } + + private translateItems(menuItems: MenuItem[]): void { + menuItems.map((item: MenuItem) => { + if (item.untranslatedLabel) { + item.label = this.translateService.instant(item.untranslatedLabel); + } + if (item.items) { + this.translateItems(item.items); + } + }) + } +} diff --git a/projects/ng-core-tester/src/app/record/document/detail/detail.component.html b/projects/ng-core-tester/src/app/record/document/detail/detail.component.html index 5edb41b9..a50841f2 100644 --- a/projects/ng-core-tester/src/app/record/document/detail/detail.component.html +++ b/projects/ng-core-tester/src/app/record/document/detail/detail.component.html @@ -15,15 +15,8 @@ along with this program. If not, see . --> @if (record) { -

{{ record.metadata.title[0].mainTitle[0].value }}

-

- @for (author of record.metadata.authors; track author) { - {{ author.name }} - } -

- @if (record.metadata.abstracts) { -
- {{ record.metadata.abstracts[0].value }} -
- } +

Record display

+
+    
{{ record.metadata | json }}
+
} diff --git a/projects/ng-core-tester/src/app/record/document/detail/detail.component.ts b/projects/ng-core-tester/src/app/record/document/detail/detail.component.ts index 5c5d5d79..1182546e 100644 --- a/projects/ng-core-tester/src/app/record/document/detail/detail.component.ts +++ b/projects/ng-core-tester/src/app/record/document/detail/detail.component.ts @@ -1,6 +1,6 @@ /* * RERO angular core - * Copyright (C) 2020 RERO + * Copyright (C) 2020-2024 RERO * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { Component, OnInit } from '@angular/core'; +import { Component, inject, OnInit } from '@angular/core'; import { TitleMetaService } from '@rero/ng-core'; import { DetailRecord } from '@rero/ng-core/lib/record/detail/view/detail-record'; import { Observable } from 'rxjs'; @@ -27,6 +27,9 @@ import { Observable } from 'rxjs'; templateUrl: './detail.component.html' }) export class DetailComponent implements DetailRecord, OnInit { + // Inject + private titleMetaService = inject(TitleMetaService); + // Observable resolving record data record$: Observable; @@ -36,21 +39,8 @@ export class DetailComponent implements DetailRecord, OnInit { // Record data record: any; - /** - * Constructor - * - * @param _titleMetaService Title meta service. - */ - constructor(private _titleMetaService: TitleMetaService) { } - - /** - * Component initialization. - * - * Set meta title. - * Subscribe to record observable. - */ ngOnInit(): void { - this._titleMetaService.setTitle('Detail of ' + this.type); + this.titleMetaService.setTitle('Detail of ' + this.type); this.record$.subscribe((record) => { this.record = record; diff --git a/projects/ng-core-tester/src/app/record/document/document.component.html b/projects/ng-core-tester/src/app/record/document/document.component.html index cabcfab4..76a18203 100644 --- a/projects/ng-core-tester/src/app/record/document/document.component.html +++ b/projects/ng-core-tester/src/app/record/document/document.component.html @@ -34,6 +34,6 @@
{{ author.name }} }

-@if (record.metadata.abstracts) { + diff --git a/projects/ng-core-tester/src/app/record/document/document.component.ts b/projects/ng-core-tester/src/app/record/document/document.component.ts index 06727f1a..f678d97f 100644 --- a/projects/ng-core-tester/src/app/record/document/document.component.ts +++ b/projects/ng-core-tester/src/app/record/document/document.component.ts @@ -1,6 +1,6 @@ /* * RERO angular core - * Copyright (C) 2020 RERO + * Copyright (C) 2020-2024 RERO * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, inject, Input, OnInit } from '@angular/core'; import { ResultItem, TitleMetaService } from '@rero/ng-core'; /** @@ -24,31 +24,19 @@ import { ResultItem, TitleMetaService } from '@rero/ng-core'; templateUrl: './document.component.html' }) export class DocumentComponent implements OnInit, ResultItem { + // Inject + private titleMetaService = inject(TitleMetaService); + // Record data. - @Input() - record: any; + @Input() record: any; // Type of resource. - @Input() - type: string; + @Input() type: string; // Object containing link to detail. - @Input() - detailUrl: { link: string, external: boolean }; - - /** - * Constructor - * - * @param _titleMetaService TitleMetaService - */ - constructor(private _titleMetaService: TitleMetaService) { } + @Input() detailUrl: { link: string, external: boolean }; - /** - * Component initialization. - * - * Set meta title. - */ ngOnInit() { - this._titleMetaService.setTitle(this.type); + this.titleMetaService.setTitle(this.type); } } diff --git a/projects/ng-core-tester/src/app/record/editor/editor.component.html b/projects/ng-core-tester/src/app/record/editor/editor.component.html index e3c32882..848f1e71 100644 --- a/projects/ng-core-tester/src/app/record/editor/editor.component.html +++ b/projects/ng-core-tester/src/app/record/editor/editor.component.html @@ -15,12 +15,12 @@ along with this program. If not, see . --> -
-
- Model ({{ mode }}) -
+ +

   
+
+
+
- diff --git a/projects/ng-core-tester/src/app/record/editor/editor.component.spec.ts b/projects/ng-core-tester/src/app/record/editor/editor.component.spec.ts index bb47ebec..3aabbc5e 100644 --- a/projects/ng-core-tester/src/app/record/editor/editor.component.spec.ts +++ b/projects/ng-core-tester/src/app/record/editor/editor.component.spec.ts @@ -18,10 +18,9 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { RouterTestingModule } from '@angular/router/testing'; +import { RouterModule } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { RecordModule } from '@rero/ng-core'; - import { EditorComponent } from './editor.component'; describe('EditorComponent', () => { @@ -34,7 +33,7 @@ describe('EditorComponent', () => { RecordModule, HttpClientTestingModule, TranslateModule.forRoot(), - RouterTestingModule, + RouterModule.forRoot([]), BrowserAnimationsModule ], declarations: [ EditorComponent ] diff --git a/projects/ng-core-tester/src/app/record/editor/editor.component.ts b/projects/ng-core-tester/src/app/record/editor/editor.component.ts index 119361b9..bbee7fdf 100644 --- a/projects/ng-core-tester/src/app/record/editor/editor.component.ts +++ b/projects/ng-core-tester/src/app/record/editor/editor.component.ts @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { AfterContentChecked, Component, OnChanges, OnInit, SimpleChanges } from '@angular/core'; +import { AfterContentChecked, Component, inject, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; @Component({ @@ -22,6 +22,8 @@ import { ActivatedRoute } from '@angular/router'; templateUrl: './editor.component.html' }) export class EditorComponent implements OnInit, AfterContentChecked { + // Inject + private route = inject(ActivatedRoute); /* form initial values */ model = {}; @@ -32,12 +34,6 @@ export class EditorComponent implements OnInit, AfterContentChecked { /** Edit or New mode */ mode: 'Edit' | 'New' = 'New'; - /** - * Constructor - * @param route - ActivatedRoute - */ - constructor(private route: ActivatedRoute) {} - /** OnInit hook */ ngOnInit(): void { this.mode = 'pid' in this.route.snapshot.params ? 'Edit' : 'New'; diff --git a/projects/ng-core-tester/src/app/record/editor/record-service-mock.ts b/projects/ng-core-tester/src/app/record/editor/record-service-mock.ts index 8a8f6f44..3e6d62a1 100644 --- a/projects/ng-core-tester/src/app/record/editor/record-service-mock.ts +++ b/projects/ng-core-tester/src/app/record/editor/record-service-mock.ts @@ -18,13 +18,19 @@ import { Error, RecordService } from "@rero/ng-core"; import { Observable, of } from "rxjs"; import data from './recordData.json'; import JSONSchema from './schema.json'; +import SimpleJSONSchema from './simple-schema.json'; +import simpleData from './simple-record-data.json'; +import { Injectable } from "@angular/core"; +@Injectable({ + providedIn: 'root' +}) export class RecordServiceMock extends RecordService { getSchemaForm(recordType: string): Observable { - return of({ schema: JSONSchema }); + return of({ schema: recordType === 'demo' ? JSONSchema : SimpleJSONSchema }); } getRecord(type: string, pid: string, resolve = 0, headers: any = {}): Observable { - return of(data); + return of(type === 'demo' ? data : simpleData); } } diff --git a/projects/ng-core-tester/src/app/record/editor/recordData.json b/projects/ng-core-tester/src/app/record/editor/recordData.json index 27a673e0..0165fbba 100644 --- a/projects/ng-core-tester/src/app/record/editor/recordData.json +++ b/projects/ng-core-tester/src/app/record/editor/recordData.json @@ -16,6 +16,7 @@ "hidden_with_default": "Default hidden", "readonly_changeable": "Value 1", "hide_with_required_expression_control": "Optional", + "treeSelect": "node5", "selectMultiple": ["value2", "value3"], "markdown": "Hello **world**.\nGreat day.", "array_with_multicheckbox": ["checkbox1", "checkbox2"], @@ -26,7 +27,9 @@ "type": "staff_note", "content": "test" } - ] + ], + "date_only": "2024-08-06", + "date_range": ["2024-08-06", "2024-08-20"] }, "updated": "2024-03-06T07:47:33.944197+00:00" } diff --git a/projects/ng-core-tester/src/app/record/editor/schema.json b/projects/ng-core-tester/src/app/record/editor/schema.json index 51885b01..a48c3357 100644 --- a/projects/ng-core-tester/src/app/record/editor/schema.json +++ b/projects/ng-core-tester/src/app/record/editor/schema.json @@ -29,7 +29,7 @@ "hide_with_required_expression", "hidden_sub_property_hide_expr", "array_of_objects_with_sub_objects", - "select", + "treeSelect", "selectGroup", "selectMultiple", "selectMultipleWithLabelTranslation", @@ -38,10 +38,11 @@ "email", "date_time", "date_only", + "date_range", "password", "array_with_multicheckbox", - "remoteTypeaheadWithoutFilters", - "remoteTypeaheadWithFilters", + "remoteAutoCompleteWithFilters", + "remoteAutocompleteWithoutFilters", "input_with_default_value", "name_with_definition", "field_expressions", @@ -76,7 +77,6 @@ "default": "staff_note", "widget": { "formlyConfig": { - "type": "selectWithSort", "props": { "options": [ { @@ -702,14 +702,7 @@ "enum": [ "optional", "required" - ], - "widget": { - "formlyConfig": { - "props": { - "cssClass": "w-md-25" - } - } - } + ] }, "hide_with_required_expression": { "title": "Hidden Property with required expression.", @@ -804,7 +797,7 @@ ] } }, - "select": { + "treeSelect": { "title": "Select with option tree", "type": "string", "enum": [ @@ -814,50 +807,48 @@ ], "widget": { "formlyConfig": { + "type": "tree-select", "props": { "options": [ { - "label": "3 Value", - "value": "value3" + "label": "Node 1", + "data": "node1" }, { - "label": "Group", + "label": "Node 2", + "selectable": false, "children": [ { - "label": "2 Value", - "value": "value2" + "label": "Node 3", + "data": "node3" }, { - "label": "1 Value", - "value": "value1", + "label": "Node 4", + "selectable": false, "children": [ { - "label": "3 Value", - "value": "value3", - "preferred": true + "label": "Node 5", + "data": "node5" }, { - "label": "2 Value", - "value": "value2", - "disabled": true + "label": "Node 6", + "data": "node6" } ] } ] }, { - "label": "2 Value", - "value": "value2", - "preferred": true + "label": "Node 7", + "data": "node7" } - ], - "minItemsToDisplaySearch": 3 + ] } } } }, "selectGroup": { - "title": "Select group (compatibility)", + "title": "Select with group", "type": "string", "enum": [ "value1", @@ -867,20 +858,29 @@ "widget": { "formlyConfig": { "props": { + "group": true, "options": [ { - "label": "3 Value", - "value": "value3", - "group": "test" - }, - { - "label": "1 Value", - "value": "value1" + "label": "Default", + "items": [ + { + "label": "Value 1", + "value": "value1" + } + ] }, { - "label": "2 Value", - "value": "value2", - "group": "test" + "label": "Test", + "items": [ + { + "label": "Value 3", + "value": "value3" + }, + { + "label": "Value 2", + "value": "value2" + } + ] } ] } @@ -888,7 +888,7 @@ } }, "selectMultiple": { - "title": "Multiple select", + "title": "Select Multiple", "type": "array", "minItems": 1, "uniqueItems": true, @@ -906,6 +906,7 @@ }, "widget": { "formlyConfig": { + "type": "multi-select", "props": { "options": [ { @@ -941,6 +942,7 @@ }, "widget": { "formlyConfig": { + "type": "multi-select", "props": { "options": [ { @@ -971,7 +973,10 @@ "default": "Hello **world**", "widget": { "formlyConfig": { - "type": "markdown" + "type": "markdown", + "props": { + "minHeight": "300px" + } } } }, @@ -1032,14 +1037,32 @@ "pattern": "^[0-9]{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$", "widget": { "formlyConfig": { - "type": "datepicker", + "type": "datePicker", "props": { "placement": "top", "validation": { "messages": { "patternMessage": "Should be in the following format: 2022-12-31 (YYYY-MM-DD)." } - } + }, + "disabledDates": [ + "2024-08-10", + "2024-08-12" + ] + } + } + } + }, + "date_range": { + "title": "Date picker range", + "type": "string", + "widget": { + "formlyConfig": { + "type": "datePicker", + "props": { + "selectionMode": "range", + "numberOfMonths": 2, + "showButtonBar": true } } } @@ -1062,8 +1085,8 @@ "type": "multicheckbox", "minItems": 1, "default": [ - "checkbox1", - "checkbox2" + "checkbox2", + "checkbox3" ], "items": { "type": "string", @@ -1076,8 +1099,9 @@ }, "widget": { "formlyConfig": { + "type": "multi-checkbox", "props": { - "type": "array", + "style": "inline", "options": [ { "label": "Checkbox 1", @@ -1101,46 +1125,53 @@ } } }, - "remoteTypeaheadWithFilters": { - "title": "Remote typeahead with filters", + "remoteAutoCompleteWithFilters": { + "title": "Remote Autocomplete with filters", "type": "string", "widget": { "formlyConfig": { - "type": "remoteTypeahead", + "type": "remoteAutoComplete", "props": { - "remoteTypeahead": { - "enableGroupField": true, - "filters": { - "default": "value2", - "options": [ - { - "label": "Value 1", - "value": "value1" - }, - { - "label": "Value 2", - "value": "value2" - }, - { - "label": "Value 3", - "value": "value3" - } - ] - } + "group": true, + "scrollHeight": "300px", + "queryOptions": { + "type": "documents", + "maxOfResult": 10 + }, + "filters": { + "selected": "value2", + "options": [ + { + "label": "Value 1", + "value": "value1" + }, + { + "label": "Value 2", + "value": "value2" + }, + { + "label": "Value 3", + "value": "value3" + } + ] } } } } }, - "remoteTypeaheadWithoutFilters": { + + "remoteAutocompleteWithoutFilters": { "title": "Remote typeahead without filters", "type": "string", "widget": { "formlyConfig": { - "type": "remoteTypeahead", + "type": "remoteAutoComplete", "props": { - "remoteTypeahead": { - "enableGroupField": true + "group": true, + "scrollHeight": "300px", + "queryOptions": { + "type": "documents", + "maxOfResult": 10 } } } diff --git a/projects/ng-core-tester/src/app/record/editor/simple-record-data.json b/projects/ng-core-tester/src/app/record/editor/simple-record-data.json new file mode 100644 index 00000000..85d2a274 --- /dev/null +++ b/projects/ng-core-tester/src/app/record/editor/simple-record-data.json @@ -0,0 +1,13 @@ +{ + "created": "2024-03-06T07:47:33.944191+00:00", + "id": "1", + "links": { + "self": "https://ilsdev.test.rero.ch/api/demo/1" + }, + "metadata": { + "$schema": "https://bib.rero.ch/schemas/demo/demo.json", + "pid": "normal", + "required": "value required", + "textarea": "Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un imprimeur anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n'a pas fait que survivre cinq siècles, mais s'est aussi adapté à la bureautique informatique, sans que son contenu n'en soit modifié. Il a été popularisé dans les années 1960 grâce à la vente de feuilles Letraset contenant des passages du Lorem Ipsum, et, plus récemment, par son inclusion dans des applications de mise en page de texte, comme Aldus PageMaker." + } +} diff --git a/projects/ng-core-tester/src/app/record/editor/simple-schema.json b/projects/ng-core-tester/src/app/record/editor/simple-schema.json new file mode 100644 index 00000000..ced22e33 --- /dev/null +++ b/projects/ng-core-tester/src/app/record/editor/simple-schema.json @@ -0,0 +1,77 @@ +{ + "schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "title": "Test editor", + "additionalProperties": false, + "required": [ + "required" + ], + "propertiesOrder": [ + "optional", + "required", + "essential", + "textarea" + ], + "properties": { + "$schema": { + "title": "Schema", + "type": "string", + "minLength": 9, + "default": "https://bib.rero.ch/schemas/demo/demo.json" + }, + "pid": { + "title": "Demo ID", + "type": "string", + "minLength": 1 + }, + "optional": { + "title": "Optional", + "type": "string", + "minLength": 3 + }, + "required": { + "title": "Required", + "type": "string", + "minLength": 3, + "widget": { + "formlyConfig": { + "props": { + "doNotSubmitOnEnter": true + } + } + } + }, + "essential": { + "title": "Essential", + "type": "string", + "minLength": 3, + "widget": { + "formlyConfig": { + "props": { + "hide": true, + "navigation": { + "essential": true + } + } + } + } + }, + "textarea": { + "title": "Textarea", + "type": "string", + "widget": { + "formlyConfig": { + "type": "textarea", + "props": { + "placeholder": "Type your text here", + "displayChars": true, + "displayWords": true, + "limitChars": 200, + "limitWords": 10, + "rows": 5 + } + } + } + } + } +} diff --git a/projects/ng-core-tester/src/app/routes/documents-route.ts b/projects/ng-core-tester/src/app/routes/documents-route.ts index 8d4b61a6..5b353c7d 100644 --- a/projects/ng-core-tester/src/app/routes/documents-route.ts +++ b/projects/ng-core-tester/src/app/routes/documents-route.ts @@ -31,6 +31,7 @@ import { DocumentComponent } from '../record/document/document.component'; * Routes for document resources */ export class DocumentsRoute implements RouteInterface { + // Route name readonly name = 'documents'; @@ -127,12 +128,12 @@ export class DocumentsRoute implements RouteInterface { message: '' }); }, - deleteMessage: (pid: string): Observable => { + deleteMessage: (): string[] => { // If you want to translate the strings, you have to do it here - return of([ + return [ this.translateService.instant('Document: Do you really want to delete this record?'), this.translateService.instant('Attached items will also be deleted.') - ]); + ]; } } ] diff --git a/projects/ng-core-tester/src/app/routes/route.service.ts b/projects/ng-core-tester/src/app/routes/route.service.ts index 9604ea96..455b8963 100644 --- a/projects/ng-core-tester/src/app/routes/route.service.ts +++ b/projects/ng-core-tester/src/app/routes/route.service.ts @@ -1,6 +1,6 @@ /* * RERO angular core - * Copyright (C) 2020 RERO + * Copyright (C) 2020-2024 RERO * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { Injectable } from '@angular/core'; +import { inject, Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { RouteCollectionService } from '@rero/ng-core'; @@ -27,27 +27,17 @@ import { DocumentsRoute } from './documents-route'; providedIn: 'root' }) export class RouteService { - /** - * Constructor. - * - * @param _routeCollectionService RouteCollectionService. - * @param _router Router. - */ - constructor( - private _routeCollectionService: RouteCollectionService, - private _router: Router, - private _translateService: TranslateService - ) { } + // Inject + private routeCollectionService = inject(RouteCollectionService); + private router = inject(Router); + private translateService = inject(TranslateService); - /** - * Initialize routes. - */ initializeRoutes() { - this._routeCollectionService - .addRoute(new DocumentsRoute(this._translateService)); + this.routeCollectionService + .addRoute(new DocumentsRoute(this.translateService)); - this._routeCollectionService.getRoutes().map((route: any) => { - this._router.config.push(route); + this.routeCollectionService.getRoutes().map((route: any) => { + this.router.config.push(route); }); } } diff --git a/projects/ng-core-tester/src/app/search-bar/search-bar.component.html b/projects/ng-core-tester/src/app/search-bar/search-bar.component.html index 39d57b10..58b471e4 100644 --- a/projects/ng-core-tester/src/app/search-bar/search-bar.component.html +++ b/projects/ng-core-tester/src/app/search-bar/search-bar.component.html @@ -1,6 +1,6 @@ - - + diff --git a/projects/ng-core-tester/src/app/search-bar/search-bar.component.spec.ts b/projects/ng-core-tester/src/app/search-bar/search-bar.component.spec.ts deleted file mode 100644 index 25e0940d..00000000 --- a/projects/ng-core-tester/src/app/search-bar/search-bar.component.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * RERO angular core - * Copyright (C) 2020 RERO - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -import { HttpClientModule } from '@angular/common/http'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; -import { TranslateModule } from '@ngx-translate/core'; -import { AutocompleteComponent, CoreModule } from '@rero/ng-core'; -import { TypeaheadModule } from 'ngx-bootstrap/typeahead'; -import { SearchBarComponent } from './search-bar.component'; - -describe('SearchBarComponent', () => { - let component: SearchBarComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ SearchBarComponent, AutocompleteComponent ], - imports: [ - RouterTestingModule, - HttpClientModule, - FormsModule, - ReactiveFormsModule, - TranslateModule.forRoot(), - TypeaheadModule.forRoot(), - CoreModule - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(SearchBarComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/projects/ng-core-tester/src/app/search-bar/search-bar.component.ts b/projects/ng-core-tester/src/app/search-bar/search-bar.component.ts index eedee563..d3d8fc6f 100644 --- a/projects/ng-core-tester/src/app/search-bar/search-bar.component.ts +++ b/projects/ng-core-tester/src/app/search-bar/search-bar.component.ts @@ -1,6 +1,6 @@ /* * RERO angular core - * Copyright (C) 2020 RERO + * Copyright (C) 2020-2024 RERO * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -14,8 +14,11 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, inject, input, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; +import { IAutoComplete, IRecordType, Record } from '@rero/ng-core'; +import { MessageService } from 'primeng/api'; /** * Component showing the search bar for searching records. @@ -25,120 +28,96 @@ import { TranslateService } from '@ngx-translate/core'; templateUrl: './search-bar.component.html' }) export class SearchBarComponent implements OnInit { - // Code of the organisation. - @Input() viewcode: string; + // Inject + private translateService = inject(TranslateService); + private messageService = inject(MessageService); + private router = inject(Router); - // Size. - @Input() size: string = undefined; - - // Suggestions max length. - @Input() maxLengthSuggestion = 100; + viewcode = input(); // List of resource type - recordTypes = []; - - /** - * Returns person name for given metadata. - * - * @param metadata Metadata. - * @return Person name. - */ - static getPersonName(metadata: string) { - for (const source of ['rero', 'bnf', 'gnd']) { - if (metadata[source] && metadata[source].preferred_name_for_person) { - return metadata[source].preferred_name_for_person; - } - } - } + recordTypes: IRecordType[] = []; - /** - * Constructor. - * - * @param _translateService Translate service. - */ - constructor(private _translateService: TranslateService) { } + value: string = undefined; - /** - * Component initialization. - * - * Initializes record types. - */ ngOnInit() { - this.recordTypes = [{ - type: 'documents', - field: 'title', - getSuggestions: (query: string, persons: any) => this.getDocumentsSuggestions(query, persons), - preFilters: this.viewcode ? { view: this.viewcode } : {} - }, { - type: 'organisations', - field: 'name', - getSuggestions: (query: string, persons: any) => this.getOrganisationsSuggestions(query, persons), - component: this, - preFilters: this.viewcode ? { view: this.viewcode } : {} - }]; + this.recordTypes = [ + { + index: 'documents', + field: 'title', + groupLabel: this.translateService.instant('Documents'), + processSuggestions: (data: any, query: string) => this.processDocuments(data, query), + preFilters: this.viewcode() ? { view: this.viewcode() } : {} + }, + { + index: 'organisations', + field: 'name', + groupLabel: this.translateService.instant('Organisations'), + processSuggestions: (data: any) => this.processOrganisations(data), + preFilters: this.viewcode() ? { view: this.viewcode() } : {} + } + ]; } - /** - * Link to record search. - * - * @return Link to record search. - */ - get action(): string { - return `/records/documents`; + onSelect(event: IAutoComplete) { + const label = event.originalLabel ? event.originalLabel : event.label; + const doc = new DOMParser().parseFromString(label, 'text/html'); + this.value = doc.body.textContent || ''; + switch(event.index) { + case 'documents': + this.messageService.add({ + severity: 'success', + summary: 'DOCUMENTS', + detail: 'navigate to document: ' + event.value + }); + this.router.navigate(['/record', 'search', 'documents', 'detail', event.value]); + break; + case 'organisations': + this.messageService.add({ + severity: 'success', + summary: 'ORGANISATIONS', + detail: 'navigate to organisation: ' + event.value + }); + break; + } } - /** - * Return a list of suggestions for organisations. - * - * @param query String query. - * @param organisations List of organisations. - * @return List of suggestions. - */ - getOrganisationsSuggestions(query: string, organisations: any): Array { - const values = []; - organisations.hits.hits.map((hit: any) => { - let text = hit.metadata.name; - text = text.replace(new RegExp(query, 'gi'), `${query}`); + private processDocuments(data: Record, query: string): any { + const values: IAutoComplete[] = []; + data.hits.hits.map((hit: any) => { + const title = hit.metadata.title[0].mainTitle[0].value.replace(/[:\-\[\]()/"]/g, ' ').replace(/\s\s+/g, ' '); values.push({ - text, - query: '', - index: 'organisations', - category: this._translateService.instant('direct links'), - href: `/records/organisations/detail/${hit.id}`, - iconCssClass: 'fa fa-bank' + iconClass: 'fa fa-book', + index: 'documents', + label: this.processLabel(title, query, 80), + value: hit.metadata.pid, + originalLabel: title, }); }); + return values; } - /** - * Return a list of suggestions for documents. - * - * @param query String query. - * @param documents List of documents. - * @return List of suggestions. - */ - getDocumentsSuggestions(query: string, documents: any): Array { - const values = []; - documents.hits.hits.map((hit: any) => { - let text = hit.metadata.title; - let truncate = false; - if (text.length > this.maxLengthSuggestion) { - truncate = true; - text = hit.metadata.title.substr(0, this.maxLengthSuggestion); - } - text = text.replace(new RegExp(query, 'gi'), `${query}`); - if (truncate) { - text += ' ...'; - } + private processOrganisations(data: Record): any { + const values: IAutoComplete[] = []; + data.hits.hits.map((hit: any) => { values.push({ - text, - query: hit.metadata.title.replace(/[:\-\[\]()/"]/g, ' ').replace(/\s\s+/g, ' '), - index: 'documents', - category: this._translateService.instant('documents') - // href: `/${this.viewcode}/documents/${hit.id}` + iconClass: 'fa fa-industry', + id: hit.metadata.pid, + index: 'organisations', + label: hit.metadata.name, + value: hit.metadata.pid, }); }); + return values; } + + private processLabel(label: string, query: string, truncateSize?: number): string { + if (truncateSize && label.length > truncateSize) { + label = label.substring(0, truncateSize) + '…'; + } + + return label.replace(new RegExp(query, 'gi'), `${query}`); + } } diff --git a/projects/ng-core-tester/src/app/service/app-menu.service.spec.ts b/projects/ng-core-tester/src/app/service/app-menu.service.spec.ts deleted file mode 100644 index ff5441ee..00000000 --- a/projects/ng-core-tester/src/app/service/app-menu.service.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * RERO angular core - * Copyright (C) 2020 RERO - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -/* tslint:disable:no-unused-variable */ - -import { inject, TestBed } from '@angular/core/testing'; -import { TranslateModule } from '@ngx-translate/core'; -import { AppMenuService } from './app-menu.service'; - -describe('Service: AppMenu', () => { - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [AppMenuService], - imports: [TranslateModule.forRoot()] - }); - }); - - it('should ...', inject([AppMenuService], (service: AppMenuService) => { - expect(service).toBeTruthy(); - })); -}); diff --git a/projects/ng-core-tester/src/app/service/app-menu.service.ts b/projects/ng-core-tester/src/app/service/app-menu.service.ts deleted file mode 100644 index 461ec437..00000000 --- a/projects/ng-core-tester/src/app/service/app-menu.service.ts +++ /dev/null @@ -1,100 +0,0 @@ -/* - * RERO angular core - * Copyright (C) 2020 RERO - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -import { Injectable } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { MenuFactory, MenuItem } from '@rero/ng-core'; - -@Injectable({ - providedIn: 'root' -}) -export class AppMenuService { - - /** Menu Factory */ - private _factory: MenuFactory; - - /** - * Constructor - * @param _translate - TranslateService - */ - constructor(private _translate: TranslateService) { - this._factory = new MenuFactory(); - } - - /** - * Application Menu - * @return MenuItem - */ - generateApplicationMenu() { - const menu = this._factory.createItem('Application'); - - /* Home */ - menu - .addChild('Home') - .setAttribute('id', 'home') - .setExtra('iconClass', 'fa fa-home') - .setRouterLink(['/']); - - const records = menu.addChild('Records'); - this._recordsMenu(records); - - return menu; - } - - /** - * Menu Languages - * @return MenuItem - */ - generateLanguageMenu(languages: string[], currentLanguage: string) { - const languagesMenu = this._factory.createItem('Language'); - languages.forEach(lang => { - const languageMenu = languagesMenu - .addChild(this._translate.instant(lang)); - if (lang === currentLanguage) { - languageMenu - .setLabelAttribute('class', 'font-weight-bold') - .setActive(true); - } - }); - - return languagesMenu; - } - - /** - * Sub Menu Records - * @param menu - MenuItem - */ - private _recordsMenu(menu: MenuItem) { - menu.addChild('Global records') - .setAttribute('id', 'app-global-records') - .setExtra('iconClass', 'fa fa-book') - .setRouterLink(['/record', 'search', 'documents']); - menu.addChild('UNISI records') - .setRouterLink(['/unisi', 'record', 'search', 'documents']); - menu.addChild('Backend records') - .setRouterLink(['/admin', 'record', 'search', 'documents']); - menu.addChild('Document records') - .setRouterLink(['/records', 'documents']); - menu.addChild('Organisation records') - .setRouterLink(['/records', 'organisations']); - menu.addChild('Editor') - .setRouterLink(['/editor', 'demo']) - .setExtra('iconClass', 'fa fa-edit'); - menu.addChild('Editor mode edit') - .setRouterLink(['/editor', 'demo', '1']) - .setExtra('iconClass', 'fa fa-edit'); - } -} diff --git a/projects/ng-core-tester/src/app/service/app-remote-autocomplete.service.spec.ts b/projects/ng-core-tester/src/app/service/app-remote-autocomplete.service.spec.ts new file mode 100644 index 00000000..ba77dfb2 --- /dev/null +++ b/projects/ng-core-tester/src/app/service/app-remote-autocomplete.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AppRemoteAutocompleteService } from './app-remote-autocomplete.service'; + +describe('AppRemoteAutocompleteService', () => { + let service: AppRemoteAutocompleteService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(AppRemoteAutocompleteService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/ng-core-tester/src/app/service/app-remote-autocomplete.service.ts b/projects/ng-core-tester/src/app/service/app-remote-autocomplete.service.ts new file mode 100644 index 00000000..2fd17dbd --- /dev/null +++ b/projects/ng-core-tester/src/app/service/app-remote-autocomplete.service.ts @@ -0,0 +1,68 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { Injectable } from "@angular/core"; +import { IQueryOptions, IRemoteAutocomplete, ISuggestionItem } from "@rero/prime/remote-autocomplete"; +import { Observable, of } from "rxjs"; + +@Injectable({ + providedIn: 'root' +}) +export class AppRemoteAutocompleteService implements IRemoteAutocomplete { + + private data: ISuggestionItem[] = [ + { label: 'House', value: 'house' , summary: 'House description' }, + { label: 'Mystery', value: 'mystery' }, + ]; + + public getSuggestions(query: string, queryOptions: IQueryOptions = {}, currentPid: string): Observable { + if (!query) { + return of([]); + } + if (query.startsWith('*')) { + return of(this.processName(queryOptions.filter)); + } + + return of(this.processName(queryOptions.filter).filter((element: ISuggestionItem) => + element.label.toLowerCase().includes(query.toLowerCase()) + )); + } + + getValueAsHTML(queryOptions: IQueryOptions, item: ISuggestionItem): Observable { + if (!item) { + return of(undefined); + } + + let value = item.label; + if (item.summary) { + value += '
' + item.summary + ''; + } + + return of(value); + } + + private processName(filter?: string): ISuggestionItem[] { + if (filter) { + return structuredClone(this.data).map((element: ISuggestionItem) => { + element.label = `${filter} - ${element.label}`; + + return element; + }); + } else { + return this.data; + } + } +} diff --git a/projects/ng-core-tester/src/app/service/menu.service.ts b/projects/ng-core-tester/src/app/service/menu.service.ts deleted file mode 100644 index b20c9435..00000000 --- a/projects/ng-core-tester/src/app/service/menu.service.ts +++ /dev/null @@ -1,114 +0,0 @@ -/* - * RERO angular core - * Copyright (C) 2020 RERO - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -import { Injectable } from '@angular/core'; -import { MenuFactory, MenuItem } from '@rero/ng-core'; - -@Injectable({ - providedIn: 'root' -}) -export class MenuService { - - /** - * Menu Application - * @return MenuItem - */ - generateApplicationMenu() { - const factory = new MenuFactory(); - const menu = factory.createItem('Demo'); - /** - * Definition with short syntax - */ - menu.addChild( - 'Home', - { - attributes: { id: 'home' }, - labelAttributes: { hideLabel: true }, - extras: { iconClass: 'fa fa-home'}, routerlink: ['/'], - } - ); - /** - * Same menu with fluid syntax - * menu.addChild('Home') - * .setAttribute('id', 'home') - * .setExtra('iconClass', 'fa fa-home') - * .setRouterLink(['/']); - */ - menu.addChild('No link') - .disable(); - - - this._recordsMenu(menu); - - /** - * Menu with multiples attributes definition - */ - menu.addChild('Sonar') - .setUri('http://sonar.ch') - .setAttributes({ id: 'sonar-link', target: '_blank' }) - .setExtra('iconClass', 'fa fa-external-link') - .setActive(true); - - this._externalLinks(menu); - - return menu; - } - - /** - * Generate records menu - * @param menu - MenuItem - */ - private _recordsMenu(menu: MenuItem) { - const records = menu.addChild('Records') - .setAttribute('class', 'dropdown-menu-right'); - records.addChild('Global records') - .setAttribute('id', 'global-records') - .setExtra('iconClass', 'fa fa-book') - .setRouterLink(['/record', 'search', 'documents']); - records.addChild('UNISI records') - .setRouterLink(['/unisi', 'record', 'search', 'documents']) - .disable(); - records.addChild('Backend records') - .setPrefix('[admin]', 'mr-2') - .setSuffix('[search]', 'ml-2 text-warning') - .setRouterLink(['/admin', 'record', 'search', 'documents']) - .setExtra('divider', 'dropdown-divider'); - records.addChild('Document records') - .setRouterLink(['/records', 'documents']); - records.addChild('Document records') - .setSuffix('[with query params]', 'ml-2 font-weight-bold') - .setRouterLink(['/records', 'documents']) - .setQueryParams({ - q: 'anatomic', - page: 1, - size: 10 - }) - .setExtra('divider', 'dropdown-divider'); - records.addChild('Organisation records') - .setRouterLink(['/records', 'organisations']); - } - - /** - * Generate external menu links - * @param menu - MenuItem - */ - private _externalLinks(menu: MenuItem) { - const external = menu.addChild('External links'); - external.addChild('RERO') - .setUri('https://www.rero.ch') - .setAttributes({ id: 'rero-link', target: '_blank' }); - } -} diff --git a/projects/ng-core-tester/src/assets/angular.svg b/projects/ng-core-tester/src/assets/angular.svg new file mode 100644 index 00000000..79e613f0 --- /dev/null +++ b/projects/ng-core-tester/src/assets/angular.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/projects/ng-core-tester/src/assets/i18n/de.json b/projects/ng-core-tester/src/assets/i18n/de.json index 71a7eb99..94c78119 100644 --- a/projects/ng-core-tester/src/assets/i18n/de.json +++ b/projects/ng-core-tester/src/assets/i18n/de.json @@ -5,5 +5,26 @@ "library": "Bibliothek", "German": "Deutsch", "from": "Von", - "day(s)": "Tag(e)" + "day(s)": "Tag(e)", + "Language": "Sprache", + "Yes": "Ja", + "No": "Nein", + "Are you sure that you want to proceed?": "Sind Sie sicher, dass Sie fortfahren wollen?", + "Confirmation": "Konfirmation", + "Confirmed": "Bestätigt", + "You have accepted": "Sie haben akzeptiert", + "Rejected": "Abgelehnt", + "You have rejected": "Sie haben abgelehnt", + "info": "Info", + "success": "Erfolg", + "error": "Fehler", + "warn": "warnen", + "This is the message": "Dies ist die Nachricht", + "Select a toast type": "Wählen Sie eine Toastart", + "Records": "Aufzeichnungen", + "Editor": "Herausgeber", + "Add mode": "hinzufügenmodus", + "Please select a type": "Bitte wählen Sie einen Typ", + "Full-text": "Volltext", + "Main title": "Haupttitel" } diff --git a/projects/ng-core-tester/src/assets/i18n/en.json b/projects/ng-core-tester/src/assets/i18n/en.json index 90273088..c16bb627 100644 --- a/projects/ng-core-tester/src/assets/i18n/en.json +++ b/projects/ng-core-tester/src/assets/i18n/en.json @@ -2,5 +2,9 @@ "location": "Location", "created year": "Creation year", "library": "Library", - "German": "German" + "German": "German", + "info": "Info", + "success": "Success", + "error": "Error", + "warn": "Warn" } diff --git a/projects/ng-core-tester/src/assets/i18n/fr.json b/projects/ng-core-tester/src/assets/i18n/fr.json index 71c13e45..6cbbd08e 100644 --- a/projects/ng-core-tester/src/assets/i18n/fr.json +++ b/projects/ng-core-tester/src/assets/i18n/fr.json @@ -21,5 +21,26 @@ "Hidden field with a default value.": "Champ caché avec une valeur par défaut.", "Hidden field with a default value must not be added to the form.": "Les champs cachés avec une valeur par défaut ne doivent pas être ajoutés au formulaire.", "Readonly values must not be changeable.": "Les valeurs en lecture seule ne doivent pas être modifiables.", - "Hidden Property with required expression control": "Propriété cachée avec contrôle de l'expression requise." + "Hidden Property with required expression control": "Propriété cachée avec contrôle de l'expression requise.", + "Language": "Langue", + "Yes": "oui", + "No": "Non", + "Are you sure that you want to proceed?": "Êtes-vous sûr de vouloir continuer?", + "Confirmation": "Confirmation", + "Confirmed": "Confirmé", + "You have accepted": "Vous avez accepté", + "Rejected": "Rejeté", + "You have rejected": "Vous avez rejeté", + "info": "Information", + "success": "Succès", + "error": "Erreur", + "warn": "Avertir", + "This is the message": "Ceci est un message", + "Select a toast type": "Sélectionner un type de toast", + "Records": "Enregistrements", + "Editor": "Editeur", + "Add mode": "Mode ajout", + "Please select a type": "Veuillez sélectionner un type", + "Full-text": "Texte complet", + "Main title": "Titre principal" } diff --git a/projects/ng-core-tester/src/assets/i18n/it.json b/projects/ng-core-tester/src/assets/i18n/it.json index a0b843c9..1fd25fdf 100644 --- a/projects/ng-core-tester/src/assets/i18n/it.json +++ b/projects/ng-core-tester/src/assets/i18n/it.json @@ -5,5 +5,26 @@ "library": "Biblioteca", "German": "Tedesco", "from": "Da", - "day(s)": "giorni" + "day(s)": "giorni", + "Language": "Lingua", + "Yes": "Sì", + "No": "No", + "Are you sure that you want to proceed?": "È sicuro di voler procedere?", + "Confirmation": "Conferma", + "Confirmed": "Confermato", + "You have accepted": "Avete accettato", + "Rejected": "Rifiutato", + "You have rejected": "Avete rifiutato", + "info": "Info", + "success": "Successo", + "error": "Errore", + "warn": "Avvertire", + "This is the message": "Questo è il messaggio", + "Select a toast type": "Selezionare un tipo di toast", + "Records": "Registrazioni", + "Editor": "Editore", + "Add mode": "Aggiungi modalità", + "Please select a type": "Selezionare un tipo", + "Full-text": "Testo integrale", + "Main title": "Titolo principale" } diff --git a/projects/ng-core-tester/src/styles.scss b/projects/ng-core-tester/src/styles.scss index 29602a60..e404ce20 100644 --- a/projects/ng-core-tester/src/styles.scss +++ b/projects/ng-core-tester/src/styles.scss @@ -1,6 +1,6 @@ /* * RERO angular core - * Copyright (C) 2020 RERO + * Copyright (C) 2020-2024 RERO * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -16,42 +16,59 @@ */ $fa-font-path: "~font-awesome/fonts"; -@import "bootstrap/scss/bootstrap.scss"; +// @import "bootstrap/scss/bootstrap.scss"; @import "font-awesome/scss/font-awesome.scss"; -@import "ngx-toastr/toastr-bs4-alert"; +// @import "ngx-toastr/toastr-bs4-alert"; -// Styles for markdown editor +@import "../../rero/ng-core/assets/scss/ng-core.scss"; +@import "node_modules/primeng/resources/themes/lara-light-blue/theme.css"; +@import "node_modules/primeng/resources/primeng.min.css"; +@import "node_modules/primeflex/primeflex.min.css"; +@import "node_modules/primeicons/primeicons.css"; @import "easymde/dist/easymde.min"; -.CodeMirror, .CodeMirror-scroll { - min-height: 120px; -} -ng-core-formly-field-primeng-input > input, -formly-field > input { - width: 100%; +.p-menubar { + background-color: white; + border: none; + margin-bottom: 0; } -input { - padding: 0.5em; +.container { + padding: 1.5rem; + border: 1px solid #e5e7eb; + border-radius: 6px; } -input[type="number"] { - padding: 0.1em; -} +// .CodeMirror, .CodeMirror-scroll { +// min-height: 120px; +// } +// ng-core-formly-field-primeng-input > input, +// formly-field > input { +// width: 100%; +// } -// ADJUST BOOTSTRAP / PRIMENG ------------------- -.col, .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12 { - padding-top: 0; - padding-bottom: 0; -} +// input { +// padding: 0.5em; +// } -dt, dl, dd { - margin-bottom: 0; - padding-bottom: 0; -} +// input[type="number"] { +// padding: 0.1em; +// } -div.object .row { - margin-left: 4px !important; - margin-top: 0.4rem; -} + +// // ADJUST BOOTSTRAP / PRIMENG ------------------- +// .col, .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12 { +// padding-top: 0; +// padding-bottom: 0; +// } + +// dt, dl, dd { +// margin-bottom: 0; +// padding-bottom: 0; +// } + +// div.object .row { +// margin-left: 4px !important; +// margin-top: 0.4rem; +// } diff --git a/projects/rero/ng-core/assets/scss/_border.scss b/projects/rero/ng-core/assets/scss/_border.scss new file mode 100644 index 00000000..9113b875 --- /dev/null +++ b/projects/rero/ng-core/assets/scss/_border.scss @@ -0,0 +1,21 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.border { border: $border-width solid $border-color !important; } +.border-top { border-top: $border-width solid $border-color !important; } +.border-right { border-right: $border-width solid $border-color !important; } +.border-bottom { border-bottom: $border-width solid $border-color !important; } +.border-left { border-left: $border-width solid $border-color !important; } diff --git a/projects/rero/ng-core/src/lib/record/editor/type/custom-select/interfaces.ts b/projects/rero/ng-core/assets/scss/_button.scss similarity index 68% rename from projects/rero/ng-core/src/lib/record/editor/type/custom-select/interfaces.ts rename to projects/rero/ng-core/assets/scss/_button.scss index 38f80103..54f8024b 100644 --- a/projects/rero/ng-core/src/lib/record/editor/type/custom-select/interfaces.ts +++ b/projects/rero/ng-core/assets/scss/_button.scss @@ -1,6 +1,6 @@ /* * RERO angular core - * Copyright (C) 2020 RERO + * Copyright (C) 2024 RERO * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -14,17 +14,18 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ +.button-bar { + height: 3rem; +} -/** - * Interface representing an option in select box. - */ -export interface SelectOption { - label: string; - translatedLabel?: string; - value?: string; - group?: string; - disabled?: boolean; - preferred?: boolean; - level?: number; - children?: Array; +p-button:disabled, p-button.disabled { + color: $color-white; + pointer-events: none; + border-color: $button-disabled-background-color; + opacity: 0.65; +} + +button:focus { + outline: none; + box-shadow: none; } diff --git a/projects/rero/ng-core/assets/scss/_style.scss b/projects/rero/ng-core/assets/scss/_style.scss new file mode 100644 index 00000000..a7f8cfb7 --- /dev/null +++ b/projects/rero/ng-core/assets/scss/_style.scss @@ -0,0 +1,98 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + + @layer reset, ng-core, primeng; + + @layer ng-core { + html, body { + line-height: normal; + font-size: 14px; + } + + .header { + margin-top: 0.5em; + } + + .invalid-feedback { + color: red; + } + + formly-field { + .p-button { + padding: 0px; + } + .p-button.p-button-icon-only { + width: 1.5rem; + } + } + + ng-core-card-wrapper { + p-card > .p-card > .p-card-header { + padding-top: 1rem; + margin-left: 1rem; + font-size: 1.2rem; + } + + .p-card { + .p-card-body { + padding: 1.25rem 1rem; + } + .p-card-content { + padding: 0.25rem 0; + } + } + } + + ng-core-editor-add-field-editor { + .p-button-label { + font-weight: 500; + } + } + + ng-core-editor-formly-object-type { + margin-top: 1.5rem + } + + ng-core-editor-formly-field-textarea, + ng-core-formly-field-primeng-input, + ng-core-tree-select, + ng-core-multi-select, + ng-core-primeng-select, + ng-core-date-picker { + width: 100%; + } + + .list-result { + padding: 0; + margin: 0 10px; + } + + .list-unstyled { + padding-left: 0; + list-style: none; + } + + .add-field-info { + margin-top: .5rem; + } + } + + @layer reset { + a { + text-decoration: none; + } + } diff --git a/projects/rero/ng-core/assets/scss/_typography.scss b/projects/rero/ng-core/assets/scss/_typography.scss new file mode 100644 index 00000000..79bcfd53 --- /dev/null +++ b/projects/rero/ng-core/assets/scss/_typography.scss @@ -0,0 +1,73 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +h1, .h1 { + font-size: 2.5rem; +} + +h2, .h2 { + font-size: 2rem; +} + +h3, .h3 { + font-size: 1.75rem; +} + +h4, .h4 { + font-size: 1.5rem; +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +label { + display: inline-block; + margin-bottom: .5rem; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important; +} diff --git a/projects/ng-core-tester/src/app/service/menu.service.spec.ts b/projects/rero/ng-core/assets/scss/_variables.scss similarity index 63% rename from projects/ng-core-tester/src/app/service/menu.service.spec.ts rename to projects/rero/ng-core/assets/scss/_variables.scss index 70956e88..3a464061 100644 --- a/projects/ng-core-tester/src/app/service/menu.service.spec.ts +++ b/projects/rero/ng-core/assets/scss/_variables.scss @@ -1,6 +1,6 @@ /* * RERO angular core - * Copyright (C) 2020 RERO + * Copyright (C) 2024 RERO * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -14,17 +14,15 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { TestBed, inject } from '@angular/core/testing'; -import { MenuService } from './menu.service'; -describe('Service: Menu', () => { - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [MenuService] - }); - }); +// Color +$gray-300: #dee2e6 !default; +$color-white: #fff; - it('should ...', inject([MenuService], (service: MenuService) => { - expect(service).toBeTruthy(); - })); -}); +// Border +$border-width: 1px !default; +$border-color: $gray-300 !default; + +// Button +$button-disabled-background-color: #198754; +$button-disabled-opacity: 0.65; diff --git a/projects/rero/ng-core/assets/scss/ng-core.scss b/projects/rero/ng-core/assets/scss/ng-core.scss new file mode 100644 index 00000000..f00adc1b --- /dev/null +++ b/projects/rero/ng-core/assets/scss/ng-core.scss @@ -0,0 +1,22 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +@import "./variables"; +@import "./border"; +@import "./button"; +@import "./style"; +@import "./typography"; diff --git a/projects/rero/ng-core/ng-package.json b/projects/rero/ng-core/ng-package.json index e11805c6..af14cf8b 100644 --- a/projects/rero/ng-core/ng-package.json +++ b/projects/rero/ng-core/ng-package.json @@ -1,6 +1,7 @@ { "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", "dest": "../../../dist/rero/ng-core", + "assets": ["./assets"], "lib": { "entryFile": "src/public-api.ts" } diff --git a/projects/rero/ng-core/package.json b/projects/rero/ng-core/package.json index 334fcbdb..f08653e4 100644 --- a/projects/rero/ng-core/package.json +++ b/projects/rero/ng-core/package.json @@ -30,7 +30,10 @@ "ngx-toastr": "^18.0.0", "easymde": "^2.18.0", "marked": "^10.0.0", - "@types/marked": "^4.0.8" + "@types/marked": "^4.0.8", + "primeflex": "^3.3.1", + "primeicons": "^7.0.0", + "primeng": "^17.18.0" }, "publishConfig": { "access": "public" diff --git a/projects/rero/ng-core/src/lib/core.module.ts b/projects/rero/ng-core/src/lib/core.module.ts index 5a373fbf..81d1ed10 100644 --- a/projects/rero/ng-core/src/lib/core.module.ts +++ b/projects/rero/ng-core/src/lib/core.module.ts @@ -1,6 +1,6 @@ /* * RERO angular core - * Copyright (C) 2020 RERO + * Copyright (C) 2020-2024 RERO * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -23,6 +23,7 @@ import { BsDropdownModule } from 'ngx-bootstrap/dropdown'; import { ModalModule } from 'ngx-bootstrap/modal'; import { NgxSpinnerModule } from 'ngx-spinner'; import { ToastrModule } from 'ngx-toastr'; +import { ConfirmationService, MessageService } from 'primeng/api'; import { CoreConfigService } from './core-config.service'; import { DialogComponent } from './dialog/dialog.component'; import { AutofocusDirective } from './directives/autofocus.directive'; @@ -67,7 +68,7 @@ import { SortListComponent } from './widget/sort-list/sort-list.component'; SortListComponent, NgVarDirective, MarkdownPipe, - AutofocusDirective + AutofocusDirective, ], imports: [ CommonModule, @@ -83,7 +84,7 @@ import { SortListComponent } from './widget/sort-list/sort-list.component'; BsDropdownModule.forRoot(), ToastrModule.forRoot(), NgxSpinnerModule, - PrimeNgCoreModule + PrimeNgCoreModule, ], exports: [ PrimeNgCoreModule, @@ -109,10 +110,12 @@ import { SortListComponent } from './widget/sort-list/sort-list.component'; SortListComponent, NgVarDirective, MarkdownPipe, - AutofocusDirective + AutofocusDirective, ], providers: [ - ComponentCanDeactivateGuard + ComponentCanDeactivateGuard, + ConfirmationService, + MessageService ] }) export class CoreModule { } diff --git a/projects/rero/ng-core/src/lib/prime-ng-core-module.ts b/projects/rero/ng-core/src/lib/prime-ng-core-module.ts index 496baaaf..056eae5d 100644 --- a/projects/rero/ng-core/src/lib/prime-ng-core-module.ts +++ b/projects/rero/ng-core/src/lib/prime-ng-core-module.ts @@ -16,16 +16,65 @@ */ import { ClipboardModule } from "@angular/cdk/clipboard"; import { NgModule } from "@angular/core"; +import { ConfirmationService, MessageService } from "primeng/api"; +import { AutoCompleteModule } from 'primeng/autocomplete'; +import { AutoFocusModule } from 'primeng/autofocus'; +import { BadgeModule } from 'primeng/badge'; +import { ButtonModule } from 'primeng/button'; import { CalendarModule } from "primeng/calendar"; +import { CardModule } from 'primeng/card'; +import { CheckboxModule } from 'primeng/checkbox'; +import { ConfirmDialogModule } from 'primeng/confirmdialog'; +import { DropdownModule } from "primeng/dropdown"; +import { InputGroupModule } from 'primeng/inputgroup'; +import { InputGroupAddonModule } from 'primeng/inputgroupaddon'; +import { InputSwitchModule } from 'primeng/inputswitch'; +import { InputTextModule } from 'primeng/inputtext'; +import { InputTextareaModule } from 'primeng/inputtextarea'; +import { MessagesModule } from 'primeng/messages'; import { PaginatorModule } from 'primeng/paginator'; +import { PanelModule } from 'primeng/panel'; import { RadioButtonModule } from "primeng/radiobutton"; +import { SplitButtonModule } from 'primeng/splitbutton'; +import { TabViewModule } from 'primeng/tabview'; +import { TagModule } from 'primeng/tag'; +import { TieredMenuModule } from 'primeng/tieredmenu'; +import { ToastModule } from 'primeng/toast'; +import { TooltipModule } from 'primeng/tooltip'; +import { TriStateCheckboxModule } from 'primeng/tristatecheckbox'; @NgModule({ + providers: [ + MessageService, + ConfirmationService + ], exports: [ + AutoCompleteModule, + AutoFocusModule, + BadgeModule, + ButtonModule, CalendarModule, + CardModule, + CheckboxModule, ClipboardModule, + ConfirmDialogModule, + DropdownModule, + InputGroupModule, + InputGroupAddonModule, + InputSwitchModule, + InputTextModule, + InputTextareaModule, + MessagesModule, PaginatorModule, + PanelModule, RadioButtonModule, + SplitButtonModule, + TabViewModule, + TagModule, + TieredMenuModule, + ToastModule, + TooltipModule, + TriStateCheckboxModule, ] }) export class PrimeNgCoreModule { } diff --git a/projects/rero/ng-core/src/lib/record/autocomplete/autocomplete.component.html b/projects/rero/ng-core/src/lib/record/autocomplete/autocomplete.component.html deleted file mode 100644 index f6667c90..00000000 --- a/projects/rero/ng-core/src/lib/record/autocomplete/autocomplete.component.html +++ /dev/null @@ -1,58 +0,0 @@ - - - @if (model.iconCssClass) { -   - } - - - - diff --git a/projects/rero/ng-core/src/lib/record/autocomplete/autocomplete.component.spec.ts b/projects/rero/ng-core/src/lib/record/autocomplete/autocomplete.component.spec.ts deleted file mode 100644 index 113f7ebf..00000000 --- a/projects/rero/ng-core/src/lib/record/autocomplete/autocomplete.component.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * RERO angular core - * Copyright (C) 2020 RERO - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -import { HttpClientModule } from '@angular/common/http'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { FormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; -import { TranslateModule } from '@ngx-translate/core'; -import { TypeaheadModule } from 'ngx-bootstrap/typeahead'; -import { CoreModule } from '../../core.module'; -import { AutocompleteComponent } from './autocomplete.component'; - -describe('AutocompleteComponent', () => { - let component: AutocompleteComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - FormsModule, - TypeaheadModule.forRoot(), - RouterTestingModule, - TranslateModule.forRoot(), - CoreModule - ], - declarations: [ AutocompleteComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AutocompleteComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/projects/rero/ng-core/src/lib/record/autocomplete/autocomplete.component.ts b/projects/rero/ng-core/src/lib/record/autocomplete/autocomplete.component.ts deleted file mode 100644 index 4e515c59..00000000 --- a/projects/rero/ng-core/src/lib/record/autocomplete/autocomplete.component.ts +++ /dev/null @@ -1,225 +0,0 @@ -/* - * RERO angular core - * Copyright (C) 2020-2024 RERO - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -import { Component, Input, OnInit, ViewChild } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { TypeaheadMatch } from 'ngx-bootstrap/typeahead'; -import { combineLatest, Observable, of, Subscriber } from 'rxjs'; -import { map, switchMap } from 'rxjs/operators'; -import { RecordService } from '../record.service'; - -@Component({ - selector: 'ng-core-autocomplete', - templateUrl: './autocomplete.component.html' -}) -export class AutocompleteComponent implements OnInit { - // The submit button css class. - @Input() buttonCssClass = 'btn btn-light'; - - // The form action i.e. '/search' - @Input() action: string; - - // The autocomplete record type configuration. - @Input() recordTypes: Array = []; - - // The search input field size: small or large - @Input() size: string; - - // The search input field placeholder. - @Input() placeholder: string; - - // The routing mode, angular for internal or href for external. - @Input() internalRouting = true; - - // The minimal number of characters that needs to be entered before typeahead kicks-in. - @Input() typeaheadMinLength = 3; - - // The minimal wait time after last character typed before typeahead kicks-in. - @Input() typeaheadWaitMs = 300; - - // The maximum length of the total number of suggestions in the list. The default value is 10. - @Input() typeaheadOptionsLimit = 10; - - // Additional query parameters - @Input() extraQueryParams = { page: '1', size: '10' }; - - // The current selected suggestion. - asyncSelected = { - text: undefined, - query: undefined, - index: undefined, - category: undefined, - href: undefined - }; - - // The remote suggestions loading status. - typeaheadLoading: boolean; - - // The remote suggestions list. - dataSource: Observable; - - // The current form object from the template. - @ViewChild('form') - form: any; - - // The suggestion list subscriber, used to close the dropdown - suggestions$: Subscriber; - /** - * Constructor. - * - * @param recordService - REST API record service - * @param route - Angular current route - * @param router - Angular router for navigation - */ - constructor( - private recordService: RecordService, - private route: ActivatedRoute, - private router: Router - ) { } - - /** - * On init hook - */ - ngOnInit() { - this.route.queryParamMap.subscribe((params: any) => { - if (this.action === this.router.url.split('?')[0]) { - // get the query form the URL - const query = params.get('q'); - if (query) { - this.asyncSelected = { - query, - text: query, - index: undefined, - category: undefined, - href: undefined - }; - } - } - this.dataSource = new Observable((suggestions$: Subscriber) => { - // Runs on every search - this.suggestions$ = suggestions$; - this.suggestions$.next(this.asyncSelected); - }).pipe( - switchMap((asyncSelected: any) => { - if (asyncSelected == null) { - return of([]); - } - return this.getSuggestions(asyncSelected.query); - } - ) - ); - }); - } - - /** - * Apply search action - * @param event - Event, DOM event - */ - doSearch(event: any = null) { - if (event != null) { - event.preventDefault(); - } - if (this.internalRouting) { - this.router.navigate([this.action], { - queryParams: { - ...this.extraQueryParams, - q: this.asyncSelected.query - } - }); - // empty the suggestion list to close the dropdown - this.suggestions$.next(null); - } else { - this.form.nativeElement.submit(); - } - } - - /** - * Get remote suggestions - * @param query - string, search query string - */ - getSuggestions(query: string): Observable { - // patch non working typeaheadMinLength properties - if (query.length < this.typeaheadMinLength) { - return of([]); - } - const combineGetRecords = []; - const recordTypesKeys = this.recordTypes.map(recordType => recordType.type); - this.recordTypes.forEach(recordType => { - const queryParams = []; - // use queryParams only if ES filter does not exist. - if ('queryParams' in recordType) { - Object.keys(recordType.queryParams).forEach(key => { - queryParams.push(`${key}:${recordType.queryParams[key].replace(':', '\\:')}`); - }); - } - let queryRecord = `${recordType.field}:${query}`; - if (queryParams.length > 0) { - queryRecord += ` AND ${queryParams.join(' AND ')}`; - } - combineGetRecords.push( - this.recordService.getRecords( - recordType.index ? recordType.index : recordType.type, - queryRecord, - 1, - recordType.maxNumberOfSuggestions - ? recordType.maxNumberOfSuggestions - : 10, - [], - recordType.preFilters ? recordType.preFilters : {} - ) - ); - }); - return combineLatest(combineGetRecords).pipe( - map((getRecordsValues: Array) => { - // add query at the top - let values = []; - recordTypesKeys.forEach((recordType, index) => { - values = values.concat( - this.recordTypes[index].getSuggestions( - query, - getRecordsValues[index] - ) - ); - }); - return values; - }) - ); - } - - /** - * Store the loading state - * @param e - boolean, true if loading - */ - changeTypeaheadLoading(e: boolean): void { - this.typeaheadLoading = e; - } - - /** - * A suggestion is selected - * @param e - TypeaheadMatch, contains the selected suggestion - */ - typeaheadOnSelect(e: TypeaheadMatch): void { - if (e.item.href) { - if (this.internalRouting) { - this.router.navigate([e.item.href]); - } else { - window.location.href = e.item.href; - } - } else { - this.doSearch(); - } - } -} diff --git a/projects/rero/ng-core/src/lib/record/detail/detail-button/detail-button.component.html b/projects/rero/ng-core/src/lib/record/detail/detail-button/detail-button.component.html index f5dfbf05..5b20ecc6 100644 --- a/projects/rero/ng-core/src/lib/record/detail/detail-button/detail-button.component.html +++ b/projects/rero/ng-core/src/lib/record/detail/detail-button/detail-button.component.html @@ -14,49 +14,61 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . --> - - {{ 'Back' | translate }} - -
- - @if (record && adminMode.can) { - @if (useStatus && useStatus.can && useStatus.url) { - - } - @if (updateStatus && updateStatus.can) { - - } - @if (deleteStatus.can) { - - } @else { - @if (deleteStatus.message) { - +
+
+ +
+
+ + @if (record && adminMode().can) { + @if (useStatus && useStatus.can && useStatus.url) { + + } + @if (updateStatus() && updateStatus().can) { + + } + @if (deleteStatus().can) { + + } @else { + @if (deleteStatus().message) { + + } } } - } - + +
diff --git a/projects/rero/ng-core/src/lib/record/detail/detail-button/detail-button.component.ts b/projects/rero/ng-core/src/lib/record/detail/detail-button/detail-button.component.ts index 21902884..880bb055 100644 --- a/projects/rero/ng-core/src/lib/record/detail/detail-button/detail-button.component.ts +++ b/projects/rero/ng-core/src/lib/record/detail/detail-button/detail-button.component.ts @@ -15,7 +15,7 @@ * along with this program. If not, see . */ import { Location } from '@angular/common'; -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { Component, inject, input, output } from '@angular/core'; import { ActionStatus } from '../../action-status'; import { IRecordEvent } from './IRecordEvent.interface'; @@ -25,35 +25,32 @@ import { IRecordEvent } from './IRecordEvent.interface'; }) export class DetailButtonComponent { + // Inject + location = inject(Location); + /** Record */ - @Input() record: any; + record = input(); /** Record type */ - @Input() type: string; + type = input(); /** Admin mode for CRUD operations */ - @Input() adminMode: ActionStatus = { can: false, message: '' }; + adminMode = input({ can: false, message: '' }); /** Record can be used ? */ - @Input() useStatus: ActionStatus = { can: false, message: '', url: '' }; + useStatus = input({ can: false, message: '', url: '' }); /** Record can be updated ? */ - @Input() updateStatus: ActionStatus = { can: false, message: '' }; + updateStatus = input({ can: false, message: '' }); /** Record can be deleted ? */ - @Input() deleteStatus: ActionStatus = { can: false, message: '' }; + deleteStatus = input({ can: false, message: '' }); /** Record event */ - @Output() recordEvent = new EventEmitter(); + recordEvent = output(); /** Delete record message event */ - @Output() deleteMessageEvent = new EventEmitter(); - - /** - * Constructor - * @param location - Location - */ - constructor(private location: Location) { } + deleteMessageEvent = output(); /** * define if an action is the primary action for the resource @@ -64,9 +61,9 @@ export class DetailButtonComponent { switch (actionName) { case 'edit': case 'update': - return this.updateStatus && this.updateStatus.can && (!this.useStatus || !this.useStatus.can); + return this.updateStatus() && this.updateStatus().can && (!this.useStatus() || !this.useStatus().can); case 'use': - return this.useStatus && this.useStatus.can; + return this.useStatus() && this.useStatus().can; default: return false; } @@ -74,7 +71,7 @@ export class DetailButtonComponent { /** Use the record */ useRecord(): void { - this.recordEvent.emit({ action: 'use', url: this.updateStatus.url }) + this.recordEvent.emit({ action: 'use', url: this.updateStatus().url }) } /** @@ -98,7 +95,7 @@ export class DetailButtonComponent { * @param message - message to display into modal */ showDeleteMessage(message: string) { - this.deleteMessageEvent.emit(message); + this.deleteMessageEvent.emit(message.replace(new RegExp('\n', 'g'), '
')); } /** Go back to previous page */ diff --git a/projects/rero/ng-core/src/lib/record/detail/detail.component.html b/projects/rero/ng-core/src/lib/record/detail/detail.component.html index 297eac73..666121f9 100644 --- a/projects/rero/ng-core/src/lib/record/detail/detail.component.html +++ b/projects/rero/ng-core/src/lib/record/detail/detail.component.html @@ -31,5 +31,4 @@ } -
diff --git a/projects/rero/ng-core/src/lib/record/detail/view/json.component.ts b/projects/rero/ng-core/src/lib/record/detail/view/json.component.ts index 500e00e7..aa77a8ac 100644 --- a/projects/rero/ng-core/src/lib/record/detail/view/json.component.ts +++ b/projects/rero/ng-core/src/lib/record/detail/view/json.component.ts @@ -25,7 +25,9 @@ import { DetailRecord } from './detail-record'; template: ` @if (record) {

Record of type "{{ type }}" #{{ record.id }}

- {{ record|json }} +
+        
{{ record|json }}
+
} ` }) diff --git a/projects/rero/ng-core/src/lib/record/editor/editor.component.html b/projects/rero/ng-core/src/lib/record/editor/editor.component.html index 834d1a82..19cb021c 100644 --- a/projects/rero/ng-core/src/lib/record/editor/editor.component.html +++ b/projects/rero/ng-core/src/lib/record/editor/editor.component.html @@ -15,110 +15,90 @@ along with this program. If not, see . -->
-
- -
- @if (rootField) { - - - {{ title || recordType | ucfirst | translate }} - - - } - -
- - - - @if (canLoadTemplate()) { - - } - -
- - @if (saveAlternatives.length > 0) { - - - - - } -
-
-
- - - - @if (editorSettings.longMode) { -
- - -
- - +
+
+
+ @if (rootField) { + + + {{ title || recordType | ucfirst | translate }} + + + } +
+
+ + + + @if (canLoadTemplate()) { + + } + + @if (saveAlternatives.length === 0) { + + } @else { + } +
+
+ + + @if (editorSettings.longMode) { +
+ +
+ + + } - -
- - -
+ +
+ +
+
@if (error) { - + } diff --git a/projects/rero/ng-core/src/lib/record/editor/editor.component.ts b/projects/rero/ng-core/src/lib/record/editor/editor.component.ts index c86d10e0..d51fa053 100644 --- a/projects/rero/ng-core/src/lib/record/editor/editor.component.ts +++ b/projects/rero/ng-core/src/lib/record/editor/editor.component.ts @@ -106,7 +106,7 @@ export class EditorComponent extends AbstractCanDeactivateComponent implements O @Input() pid = null; // save alternatives - saveAlternatives: { label: string, action: any }[] = []; + saveAlternatives: { label: string, command: any }[] = []; // current record type from the url recordType = null; @@ -265,7 +265,7 @@ export class EditorComponent extends AbstractCanDeactivateComponent implements O if (this.editorSettings.template.saveAsTemplate) { this.saveAlternatives.push({ label: this.translateService.instant('Save as template') + '…', - action: this._saveAsTemplate + command: () => this._saveAsTemplate }); } diff --git a/projects/rero/ng-core/src/lib/record/editor/extensions.ts b/projects/rero/ng-core/src/lib/record/editor/extensions.ts index b63f259d..6e5fb025 100644 --- a/projects/rero/ng-core/src/lib/record/editor/extensions.ts +++ b/projects/rero/ng-core/src/lib/record/editor/extensions.ts @@ -31,15 +31,17 @@ export class NgCoreFormlyExtension { private _horizontalWrapperTypes = [ 'enum', 'string', - 'remoteTypeahead', - 'selectWithSort', 'integer', 'textarea', - 'datepicker' + 'datepicker', + 'multi-checkbox', + 'multi-select', + 'remoteAutoComplete', + 'tree-select' ]; // Types to apply field wrapper on - private _fieldWrapperTypes = ['boolean', 'datepicker', 'passwordGenerator', 'remoteTypeahead', 'selectWithSort']; + private _fieldWrapperTypes = ['boolean', 'datepicker', 'passwordGenerator']; /** * Constructor @@ -108,13 +110,14 @@ export class NgCoreFormlyExtension { // add automatically a card wrapper for the first level fields const { parent } = field; if (parent && parent.props && parent.props.isRoot === true && !field.wrappers.includes('card')) { - field.wrappers.push('card'); + field.wrappers.unshift('card'); + // field.wrappers.push('card'); } // Add an horizontal wrapper for all given field types - if (this._horizontalWrapperTypes.some((elem) => elem === field.type)) { - field.wrappers = field.wrappers.filter((w) => w !== 'form-field'); - field.wrappers.push('form-field-horizontal'); - } + // if (this._horizontalWrapperTypes.some((elem) => elem === field.type)) { + // field.wrappers = field.wrappers.filter((w) => w !== 'form-field'); + // field.wrappers.push('form-field-horizontal'); + // } } else { // adds form-fields for non standard field types if (this._fieldWrapperTypes.some((elem) => elem === field.type)) { diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/date-picker/date-picker.spec.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/date-picker/date-picker.spec.ts new file mode 100644 index 00000000..0624ab2d --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/date-picker/date-picker.spec.ts @@ -0,0 +1,72 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { ReactiveFormsModule } from '@angular/forms'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core'; +import { createFieldComponent } from '@ngx-formly/core/testing'; +import { FormFieldWrapperComponent } from '../../../wrappers/form-field-wrapper/form-field-wrapper.component'; +import { IDateTimePickerProps, NgCoreFormlyDatePickerModule } from './date-picker'; + +const renderComponent = (field: FormlyFieldConfig) => { + return createFieldComponent(field, { + imports: [ + NgCoreFormlyDatePickerModule, + ReactiveFormsModule, + FormlyModule.forRoot({ + wrappers: [ + { name: 'form-field', component: FormFieldWrapperComponent } + ] + }), + NoopAnimationsModule, + ], + }); +}; + +describe('DatePickerComponent', () => { + it('should create', () => { + const { query } = renderComponent({ + key: 'name', + type: 'datePicker', + props: { + clearButtonStyleClass: 'p-button-text', + dataType: 'string', + dateFormat: 'yy-mm-dd', + disabled: false, + firstDayOfWeek: 0, + inline: false, + numberOfMonths: 1, + outputDateFormat: 'yyyy-MM-dd', + required: false, + selectionMode: 'single', + showButtonBar: false, + showIcon: false, + showSeconds: false, + showTime: false, + stepHour: 1, + stepMinute: 1, + stepSecond: 1, + styleClass: 'w-full', + todayButtonStyleClass: 'p-button-text', + view: 'date' + } + }); + + const element = query('p-calendar'); + expect(element).not.toBeNull(); + }); +}); diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/date-picker/date-picker.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/date-picker/date-picker.ts new file mode 100644 index 00000000..c6b3b209 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/date-picker/date-picker.ts @@ -0,0 +1,179 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { CommonModule } from '@angular/common'; +import { Component, inject, LOCALE_ID, NgModule, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { FieldType, FormlyFieldConfig, FormlyFieldProps, FormlyModule } from '@ngx-formly/core'; +import { CalendarModule } from 'primeng/calendar'; + +// Calendar options: https://primeng.org/calendar +export interface IDateTimePickerProps extends FormlyFieldProps { + clearButtonStyleClass: string; + dataType: 'date' | 'string'; + dateFormat?: string; + defaultDate?: Date; + disabledDates?: Date[]; + disabledDays?: number[]; + firstDayOfWeek?: number; + hourFormat?: string; + inline: boolean; + inputStyleClass?: string; + outputDateFormat: string; + maxDate?: Date; + minDate?: Date; + numberOfMonths: number; + readonlyInput?: boolean; + selectionMode: 'multiple' | 'range' | 'single'; + showButtonBar: boolean; + showIcon: boolean; + showSeconds: boolean; + showTime?: boolean; + stepHour: number; + stepMinute: number; + stepSecond: number; + styleClass: string; + todayButtonStyleClass: string; + view?: 'date' | 'month' | 'year'; +} + +@Component({ + selector: 'ng-core-date-picker', + template: ` + + `, +}) +export class DatePickerComponent extends FieldType> implements OnInit { + + private locale = inject(LOCALE_ID); + + defaultOptions: Partial> = { + props: { + clearButtonStyleClass: 'p-button-text', + dataType: 'string', + dateFormat: 'yy-mm-dd', + disabled: false, + firstDayOfWeek: 0, + inline: false, + numberOfMonths: 1, + outputDateFormat: 'yyyy-MM-dd', + required: false, + selectionMode: 'single', + showButtonBar: false, + showIcon: false, + showSeconds: false, + showTime: false, + stepHour: 1, + stepMinute: 1, + stepSecond: 1, + styleClass: 'w-full', + todayButtonStyleClass: 'p-button-text', + view: 'date' + }, + }; + + private fieldModel: Date | Date[]; + + set model(value: Date | Date[]) { + this.formControl.patchValue(value); + } + + get model(): Date | Date[] { + return this.fieldModel; + } + + defaultDate: Date = undefined; + disabledDates: Date[] = undefined; + maxDate: Date = undefined; + minDate: Date = undefined; + + ngOnInit(): void { + if (this.formControl.value) { + this.fieldModel = this.formControl.value; + } + if (!this.formControl.value && this.props.defaultDate) { + this.defaultDate = this.processDate(this.props.defaultDate); + } + if (this.props.disabledDates) { + this.disabledDates = this.props.disabledDates.map((date: any) =>this.processDate(date)); + } + if (this.props.minDate) { + this.minDate = this.processDate(this.props.minDate); + } + if (this.props.maxDate) { + this.maxDate = this.processDate(this.props.maxDate); + } + } + + private processDate(date: string | Date ): Date { + return date instanceof Date ? date : new Date(date); + } +} + + +@NgModule({ + declarations: [ DatePickerComponent ], + imports: [ + CommonModule, + CalendarModule, + FormsModule, + FormlyModule.forChild({ + types: [ + { + name: 'datePicker', + component: DatePickerComponent, + wrappers: ['form-field'], + }, + { + name: 'dateTimePicker', // For compatibility + extends: 'datePicker' + } + ], + }), + ], +}) +export class NgCoreFormlyDatePickerModule { } diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/date-picker/ng-package.json b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/date-picker/ng-package.json new file mode 100644 index 00000000..3a74fd76 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/date-picker/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "public_api.ts" + } +} diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/date-picker/public_api.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/date-picker/public_api.ts new file mode 100644 index 00000000..f6f29ddb --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/date-picker/public_api.ts @@ -0,0 +1,17 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +export * from './date-picker'; diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-checkbox/multi-checkbox.spec.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-checkbox/multi-checkbox.spec.ts new file mode 100644 index 00000000..73b8e1a7 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-checkbox/multi-checkbox.spec.ts @@ -0,0 +1,69 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core'; +import { createFieldComponent } from '@ngx-formly/core/testing'; +import { FormFieldWrapperComponent } from '../../../wrappers/form-field-wrapper/form-field-wrapper.component'; +import { IMultiCheckBoxProps, NgCoreFormlyMultiCheckboxModule } from './multi-checkbox'; + +const renderComponent = (field: FormlyFieldConfig) => { + return createFieldComponent(field, { + imports: [ + NgCoreFormlyMultiCheckboxModule, + FormlyModule.forRoot({ + wrappers: [ + { name: 'form-field', component: FormFieldWrapperComponent } + ] + }), + ], + }); +}; + +describe('MultiCheckboxComponent', () => { + + it('should return stacked checkboxes', () => { + const { queryAll } = renderComponent({ + key: 'name', + type: 'multi-checkbox', + props: { + style: 'stacked', + options: [ + { label: 'foo', value: 'foo' }, + { label: 'bar', value: 'bar' }, + ], + } + }); + expect(queryAll('p-checkbox')).toHaveSize(2); + expect(queryAll('div.flex.flex-column.gap-1')).toHaveSize(1); + }); + + it('should return checkboxes in line', () => { + const { queryAll } = renderComponent({ + key: 'name', + type: 'multi-checkbox', + props: { + style: 'inline', + options: [ + { label: 'foo', value: 'foo' }, + { label: 'bar', value: 'bar' }, + ], + } + }); + expect(queryAll('p-checkbox')).toHaveSize(2); + expect(queryAll('div.flex.gap-3')).toHaveSize(1); + }); +}); diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-checkbox/multi-checkbox.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-checkbox/multi-checkbox.ts new file mode 100644 index 00000000..0be2999a --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-checkbox/multi-checkbox.ts @@ -0,0 +1,86 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { CommonModule } from '@angular/common'; +import { Component, NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { FieldType, FormlyFieldConfig, FormlyFieldProps, FormlyModule } from '@ngx-formly/core'; +import { FormlySelectModule } from '@ngx-formly/core/select'; +import { CheckboxChangeEvent, CheckboxModule } from 'primeng/checkbox'; + +export interface IMultiCheckBoxProps extends FormlyFieldProps { + labelStyleClass?: string; + style: 'stacked' | 'inline'; + styleClass?: string; +} + +@Component({ + selector: 'ng-core-multi-checkbox', + template: ` +
+ @for (option of props.options | formlySelectOptions : field | async; track option) { +
+ +
+ } +
+ `, +}) +export class MultiCheckboxComponent extends FieldType> { + /** Default options */ + defaultOptions?: Partial> = { + props: { + style: 'stacked' + } + }; + + multiCheckBoxValue: string[] = []; + + onChange(event: CheckboxChangeEvent): void { + this.field.formControl.patchValue(event.checked); + } +} + +@NgModule({ + declarations: [ MultiCheckboxComponent ], + imports: [ + CommonModule, + CheckboxModule, + FormsModule, + FormlySelectModule, + FormlyModule.forChild({ + types: [ + { + name: 'multi-checkbox', + component: MultiCheckboxComponent, + wrappers: ['form-field'], + } + ], + }), + ], +}) +export class NgCoreFormlyMultiCheckboxModule { } diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-checkbox/ng-package.json b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-checkbox/ng-package.json new file mode 100644 index 00000000..5cb8e1e4 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-checkbox/ng-package.json @@ -0,0 +1,5 @@ +{ + "lib": { + "entryFile": "public_api.ts" + } +} diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-checkbox/public_api.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-checkbox/public_api.ts new file mode 100644 index 00000000..2bf1d214 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-checkbox/public_api.ts @@ -0,0 +1,17 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +export { MultiCheckboxComponent, NgCoreFormlyMultiCheckboxModule } from './multi-checkbox'; diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-select/multi-select.spec.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-select/multi-select.spec.ts new file mode 100644 index 00000000..3a62b521 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-select/multi-select.spec.ts @@ -0,0 +1,64 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core'; +import { createFieldComponent } from '@ngx-formly/core/testing'; +import { FormFieldWrapperComponent } from '../../../wrappers/form-field-wrapper/form-field-wrapper.component'; +import { IMultiSelectProps, NgCoreFormlyMultiSelectModule } from './multi-select'; + +const renderComponent = (field: FormlyFieldConfig) => { + return createFieldComponent(field, { + imports: [ + NgCoreFormlyMultiSelectModule, + FormlyModule.forRoot({ + wrappers: [ + { name: 'form-field', component: FormFieldWrapperComponent } + ] + }), + NoopAnimationsModule, + ], + }); +}; + +describe('MultiSelectComponent', () => { + it('should create', () => { + const { queryAll } = renderComponent({ + key: 'name', + type: 'multi-select', + props: { + class: 'w-full', + display: 'comma', + editable: false, + filter: true, + filterMatchMode: 'contains', + group: false, + options: [], + optionGroupChildren: 'items', + optionGroupLabel: 'label', + panelStyleClass: 'w-full', + required: false, + scrollHeight: '250px', + showClear: false, + styleClass: 'w-full mb-1', + tooltipPosition: 'top', + tooltipPositionStyle: 'absolute', + variant: 'outlined' + } + }); + expect(queryAll('p-multiSelect')).not.toBeNull(); + }); +}); diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-select/multi-select.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-select/multi-select.ts new file mode 100644 index 00000000..9b0ecc86 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-select/multi-select.ts @@ -0,0 +1,144 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { CommonModule } from '@angular/common'; +import { Component, NgModule, OnInit, Type } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { FieldType, FormlyFieldConfig, FormlyFieldProps, FormlyModule } from '@ngx-formly/core'; +import { FormlyFieldSelectProps } from '@ngx-formly/core/select'; +import { MultiSelectModule as PrimeNgMultiSelectModule } from 'primeng/multiselect'; +import { isObservable, of } from 'rxjs'; + +export interface IMultiSelectProps extends FormlyFieldProps, FormlyFieldSelectProps { + appendTo?: any; + class?: string; + display: string; + dropdownIcon?: string; + editable: boolean; + emptyFilterMessage?: string; + emptyMessage?: string; + filter: boolean; + filterMatchMode: 'endsWith' | 'startsWith' | 'contains' | 'equals' | 'notEquals' | 'in' | 'lt' | 'lte' | 'gt' | 'gte'; + group: boolean; + loadingIcon?: string; + optionDisabled?: string; + optionGroupChildren: string; + optionGroupLabel: string; + optionLabel?: string; + optionValue?: string; + panelStyleClass?: string; + required: boolean; + scrollHeight: string; + showClear?: boolean; + styleClass?: string; + tooltip?: string; + tooltipPosition: 'left' | 'top' | 'bottom' | 'right'; + tooltipPositionStyle: string; + tooltipStyleClass?: string; + variant: 'outlined' | 'filled'; +} + +export interface FormlyMultiSelectFieldConfig extends FormlyFieldConfig { + type: 'multi-select' | Type; +} + +@Component({ + selector: 'ng-core-multi-select', + template: ` + + `, +}) +export class MultiSelectComponent extends FieldType> implements OnInit { + + /** Default properties */ + defaultOptions: Partial> = { + props: { + class: 'w-full', + display: 'comma', + editable: false, + filter: true, + filterMatchMode: 'contains', + group: false, + optionGroupChildren: 'items', + optionGroupLabel: 'label', + panelStyleClass: 'w-full', + required: false, + scrollHeight: '250px', + showClear: false, + styleClass: 'w-full mb-1', + tooltipPosition: 'top', + tooltipPositionStyle: 'absolute', + variant: 'outlined' + } + }; + + selectOptions: any[] = []; + + ngOnInit(): void { + if (!isObservable(this.props.options)) { + this.props.options = of(this.props.options); + } + this.props.options.subscribe((options: any) => this.selectOptions = options); + } +} + + +@NgModule({ + declarations: [ MultiSelectComponent ], + imports: [ + CommonModule, + ReactiveFormsModule, + PrimeNgMultiSelectModule, + FormlyModule.forChild({ + types: [ + { + name: 'multi-select', + component: MultiSelectComponent, + wrappers: ['form-field'], + }, + ], + }), + ], +}) +export class NgCoreFormlyMultiSelectModule { } diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-select/ng-package.json b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-select/ng-package.json new file mode 100644 index 00000000..5cb8e1e4 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-select/ng-package.json @@ -0,0 +1,5 @@ +{ + "lib": { + "entryFile": "public_api.ts" + } +} diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-select/public_api.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-select/public_api.ts new file mode 100644 index 00000000..8188de05 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-select/public_api.ts @@ -0,0 +1,17 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +export { FormlyMultiSelectFieldConfig, MultiSelectComponent, NgCoreFormlyMultiSelectModule } from './multi-select'; diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/ng-package.json b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/ng-package.json new file mode 100644 index 00000000..5cb8e1e4 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/ng-package.json @@ -0,0 +1,5 @@ +{ + "lib": { + "entryFile": "public_api.ts" + } +} diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/public_api.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/public_api.ts new file mode 100644 index 00000000..0563b9f9 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/public_api.ts @@ -0,0 +1,20 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +export { NgCoreFormlyRemoteAutocompleteModule } from './remote-autocomplete'; +export { IQueryOptions, IRemoteAutoCompleteFilter, IRemoteAutocomplete, ISuggestionItem } from './remote-autocomplete.interface'; +export { RemoteAutocompleteService } from './remote-autocomplete.service'; diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/remote-autocomplete.interface.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/remote-autocomplete.interface.ts new file mode 100644 index 00000000..97e793b8 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/remote-autocomplete.interface.ts @@ -0,0 +1,47 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { Observable } from "rxjs"; + +export interface IRemoteAutocomplete { + getSuggestions(query: string, queryOptions: IQueryOptions, currentPid: string): Observable; + getValueAsHTML(queryOptions: IQueryOptions, item: ISuggestionItem): Observable; +} + +export interface IQueryOptions { + allowAdd?: boolean; + field?: string; + filter?: string; + isNotRef?: boolean; + label?: string; + maxOfResult?: number; + suggest?: string; + type?: string; +}; + +export interface ISuggestionItem { + label: string; + value?: string, + summary?: string; +} + +export interface IRemoteAutoCompleteFilter { + selected: string; + options: { + label: string; + value: string; + }[] +} diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/remote-autocomplete.service.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/remote-autocomplete.service.ts new file mode 100644 index 00000000..89919ab8 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/remote-autocomplete.service.ts @@ -0,0 +1,36 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { Injectable } from "@angular/core"; +import { Observable, of } from "rxjs"; +import { IQueryOptions, IRemoteAutocomplete, ISuggestionItem } from "./remote-autocomplete.interface"; + +// Override this service in your application to implement your logic + +@Injectable({ + providedIn: 'root' +}) +export class RemoteAutocompleteService implements IRemoteAutocomplete { + + public getSuggestions(query: string, queryOptions: IQueryOptions, currentPid: string): Observable { + return of([]); + + } + + getValueAsHTML(queryOptions: IQueryOptions, item: ISuggestionItem): Observable { + return of(item.label); + } +} diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/remote-autocomplete.spec.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/remote-autocomplete.spec.ts new file mode 100644 index 00000000..494465ae --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/remote-autocomplete.spec.ts @@ -0,0 +1,83 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; +import { FormlyModule } from '@ngx-formly/core'; +import { AutoCompleteModule } from 'primeng/autocomplete'; +import { of } from 'rxjs'; +import { RemoteAutocomplete } from './remote-autocomplete'; +import { RemoteAutocompleteService } from './remote-autocomplete.service'; + +describe('RemoteAutocompleteComponent', () => { + let component: RemoteAutocomplete; + let fixture: ComponentFixture; + + const suggestions = [ + { label: 'Foo', value: 'foo' }, + { label: 'Bar', value: 'bar' }, + ]; + + const valueHtml = 'My value as html'; + + const remoteAutocompleteServiceSpy = jasmine.createSpyObj('RemoteAutocompleteService', ['getSuggestions', 'getValueAsHTML']); + remoteAutocompleteServiceSpy.getSuggestions.and.returnValue(of(suggestions)); + remoteAutocompleteServiceSpy.getValueAsHTML.and.returnValue(of(valueHtml)); + + const autoCompleteCompleteEventSpy = jasmine.createSpyObj('AutoCompleteCompleteEvent', ['']); + autoCompleteCompleteEventSpy.query = '*'; + + const autoCompleteSelectEventSpy = jasmine.createSpyObj('AutoCompleteSelectEvent', ['']); + autoCompleteSelectEventSpy.value = 'myValue'; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [RemoteAutocomplete], + imports: [ + AutoCompleteModule, + FormsModule, + ReactiveFormsModule, + FormlyModule, + RouterModule.forRoot([]), + ], + providers: [ + RemoteAutocompleteService, + { provide: RemoteAutocompleteService, useValue: remoteAutocompleteServiceSpy } + ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(RemoteAutocomplete); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should return the list of suggestions', () => { + component.search(autoCompleteCompleteEventSpy); + expect(component.suggestions()).toEqual(suggestions); + }); + + it('should return the value html', () => { + spyOnProperty(component, 'formControl').and.returnValue(new FormControl()); + component.onSelect(autoCompleteSelectEventSpy); + expect(component.valueSelected()).toEqual(valueHtml); + }); +}); diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/remote-autocomplete.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/remote-autocomplete.ts new file mode 100644 index 00000000..7c3889a3 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/remote-autocomplete.ts @@ -0,0 +1,170 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { CommonModule } from '@angular/common'; +import { Component, inject, NgModule, OnInit } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { FormsModule } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { FieldType, FormlyFieldConfig, FormlyModule } from '@ngx-formly/core'; +import { FormlyFieldProps } from '@ngx-formly/primeng/form-field'; +import { AutoCompleteCompleteEvent, AutoCompleteModule, AutoCompleteSelectEvent } from 'primeng/autocomplete'; +import { ButtonModule } from 'primeng/button'; +import { DropdownChangeEvent, DropdownModule } from 'primeng/dropdown'; +import { Subject, switchMap } from 'rxjs'; +import { IQueryOptions, IRemoteAutoCompleteFilter, ISuggestionItem } from './remote-autocomplete.interface'; +import { RemoteAutocompleteService } from './remote-autocomplete.service'; + +export interface IRemoteAutoCompleteProps extends FormlyFieldProps { + delay: number; + filters?: IRemoteAutoCompleteFilter; + group: boolean; + minLength: number; + maxLength?: number; + queryOptions: IQueryOptions; + placeholder?: string; + scrollHeight: string; + summaryClass?: string +} + +@Component({ + selector: 'ng-core-remote-autocomplete', + template: ` +
+ @if (!valueSelected()) { + @if (props.filters?.options) { +
+ +
+ } +
+ + +
{{ data.label }}
+ @if (data.summary) { +
+ } +
+
+
+ } @else { +
+ + +
+ } +
+ `, +}) +export class RemoteAutocomplete extends FieldType> implements OnInit { + + private remoteAutocompleteService = inject(RemoteAutocompleteService); + private route = inject(ActivatedRoute); + + private query = new Subject(); + + private onValueSelect = new Subject(); + + suggestions = toSignal(this.query.pipe( + switchMap((query: string) => this.remoteAutocompleteService.getSuggestions( + query, + this.props.queryOptions, + this.route.snapshot.params.pid || null + )) + ), { initialValue: []}); + + valueSelected = toSignal(this.onValueSelect.pipe( + switchMap((selected?: ISuggestionItem) => this.remoteAutocompleteService.getValueAsHTML( + this.props.queryOptions, + selected + )) + )); + + /** Default properties */ + defaultOptions: Partial> = { + props: { + delay: 300, + group: false, + minLength: 1, + scrollHeight: '250px', + queryOptions: { + allowAdd: false, + } + } + }; + + value: string = ''; + + ngOnInit(): void { + if (this.props.filters) { + this.props.queryOptions.filter = this.props.filters.selected; + } + } + changeFilter(filter: DropdownChangeEvent): void { + this.props.queryOptions.filter = filter.value; + this.value = ''; + } + + search(event: AutoCompleteCompleteEvent): void { + this.query.next(event.query); + } + + onSelect(event: AutoCompleteSelectEvent): void { + this.onValueSelect.next(event.value); + this.formControl.patchValue(event.value.value); + } + + clear(): void { + this.value = ''; + this.formControl.reset(null); + this.onValueSelect.next(null); + this.field.focus = true; + } +} + +@NgModule({ + declarations: [RemoteAutocomplete], + imports: [ + AutoCompleteModule, + ButtonModule, + CommonModule, + DropdownModule, + FormsModule, + FormlyModule.forChild({ + types: [ + { name: 'remoteAutoComplete', component: RemoteAutocomplete } + ] + }), + ] +}) +export class NgCoreFormlyRemoteAutocompleteModule { } diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/select/ng-package.json b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/select/ng-package.json new file mode 100644 index 00000000..5cb8e1e4 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/select/ng-package.json @@ -0,0 +1,5 @@ +{ + "lib": { + "entryFile": "public_api.ts" + } +} diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/select/public_api.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/select/public_api.ts new file mode 100644 index 00000000..aafce67f --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/select/public_api.ts @@ -0,0 +1,17 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +export * from './select'; diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/select/select.spec.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/select/select.spec.ts new file mode 100644 index 00000000..fe95ee83 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/select/select.spec.ts @@ -0,0 +1,65 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core'; +import { createFieldComponent } from '@ngx-formly/core/testing'; +import { FormFieldWrapperComponent } from '../../../wrappers/form-field-wrapper/form-field-wrapper.component'; +import { ISelectProps, NgCoreFormlySelectModule } from './select'; + +const renderComponent = (field: FormlyFieldConfig) => { + return createFieldComponent(field, { + imports: [ + NgCoreFormlySelectModule, + NoopAnimationsModule, + FormlyModule.forRoot({ + wrappers: [ + { name: 'form-field', component: FormFieldWrapperComponent } + ] + }) + ], + }); +}; + +describe('SelectComponent', () => { + it('should create', () => { + const { query } = renderComponent({ + key: 'name', + type: 'select', + props: { + class: 'w-full', + editable: false, + filter: false, + filterMatchMode: 'contains', + group: false, + options: [ + { label: 'Foo', value: 'foo' }, + { label: 'Bar', value: 'bar' }, + ], + optionGroupChildren: 'items', + optionGroupLabel: 'label', + panelStyleClass: 'w-full', + required: false, + scrollHeight: '250px', + showClear: false, + styleClass: 'w-full mb-1', + tooltipPosition: 'top', + tooltipPositionStyle: 'absolute' + } + }); + expect(query('p-dropdown')).toHaveSize(1); + }); +}); diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/select/select.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/select/select.ts new file mode 100644 index 00000000..442291db --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/select/select.ts @@ -0,0 +1,143 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { CommonModule } from '@angular/common'; +import { Component, NgModule, OnInit, Type } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { FieldType, FormlyFieldConfig, FormlyModule } from '@ngx-formly/core'; +import { FormlySelectModule as FormlyCoreSelectModule, FormlyFieldSelectProps } from '@ngx-formly/core/select'; +import { FormlyFieldProps } from '@ngx-formly/primeng/form-field'; +import { DropdownModule } from 'primeng/dropdown'; +import { isObservable, of } from 'rxjs'; + +export interface ISelectProps extends FormlyFieldProps, FormlyFieldSelectProps { + appendTo?: any; + class?: string; + dropdownIcon?: string; + editable: boolean; + emptyFilterMessage?: string; + emptyMessage?: string; + filter: boolean; + filterMatchMode: 'endsWith' | 'startsWith' | 'contains' | 'equals' | 'notEquals' | 'in' | 'lt' | 'lte' | 'gt' | 'gte'; + group: boolean; + loadingIcon?: string; + optionDisabled?: string; + optionGroupChildren: string; + optionGroupLabel: string; + optionLabel?: string; + optionValue?: string; + panelStyleClass?: string; + required: boolean; + scrollHeight: string; + showClear?: boolean; + styleClass?: string; + tooltip?: string; + tooltipPosition: 'left' | 'top' | 'bottom' | 'right'; + tooltipPositionStyle: string; + tooltipStyleClass?: string; +} + +export interface IFormlySelectFieldConfig extends FormlyFieldConfig { + type: 'select' | Type; +} + +@Component({ + selector: 'ng-core-primeng-select', + template: ` + + `, +}) +export class SelectComponent extends FieldType> implements OnInit { + + /** Default properties */ + defaultOptions: Partial> = { + props: { + class: 'w-full', + editable: false, + filter: false, + filterMatchMode: 'contains', + group: false, + optionGroupChildren: 'items', + optionGroupLabel: 'label', + panelStyleClass: 'w-full', + required: false, + scrollHeight: '250px', + showClear: false, + styleClass: 'w-full mb-1', + tooltipPosition: 'top', + tooltipPositionStyle: 'absolute' + } + }; + + selectOptions: any[] = []; + + ngOnInit(): void { + if (!isObservable(this.props.options)) { + this.props.options = of(this.props.options); + } + this.props.options.subscribe((options: any) => this.selectOptions = options); + } +} + +@NgModule({ + declarations: [ SelectComponent ], + imports: [ + CommonModule, + DropdownModule, + ReactiveFormsModule, + FormlyCoreSelectModule, + FormlyModule.forChild({ + types: [ + { + name: 'select', + component: SelectComponent, + wrappers: ['form-field'], + }, + { name: 'enum', extends: 'select' }, + ], + }), + ], +}) +export class NgCoreFormlySelectModule { } diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/tree-select/ng-package.json b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/tree-select/ng-package.json new file mode 100644 index 00000000..5cb8e1e4 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/tree-select/ng-package.json @@ -0,0 +1,5 @@ +{ + "lib": { + "entryFile": "public_api.ts" + } +} diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/tree-select/public_api.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/tree-select/public_api.ts new file mode 100644 index 00000000..20c31c26 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/tree-select/public_api.ts @@ -0,0 +1,17 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +export * from './tree-select'; diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/tree-select/tree-select.spec.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/tree-select/tree-select.spec.ts new file mode 100644 index 00000000..d8c57586 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/tree-select/tree-select.spec.ts @@ -0,0 +1,67 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core'; +import { createFieldComponent } from '@ngx-formly/core/testing'; +import { FormFieldWrapperComponent } from '../../../wrappers/form-field-wrapper/form-field-wrapper.component'; +import { ITreeSelectProps, NgCoreFormlyTreeSelectModule } from './tree-select'; + +const renderComponent = (field: FormlyFieldConfig) => { + return createFieldComponent(field, { + imports: [ + NgCoreFormlyTreeSelectModule, + NoopAnimationsModule, + FormlyModule.forRoot({ + wrappers: [ + { name: 'form-field', component: FormFieldWrapperComponent } + ] + }) + ], + }); +}; + +describe('TreeSelectComponent', () => { + it('should create', () => { + const { query } = renderComponent({ + key: 'name', + type: 'tree-select', + props: { + class: 'w-full', + containerStyleClass: 'w-full', + filter: false, + filterBy: 'label', + options: [ + { + key: 'label_1', + label: 'Tree 1', + children: [ + { key: 'label_1_1', label: 'Subtree 1', data: 'subtree1' }, + { key: 'label_1_2', label: 'Subtree 2', data: 'subtree2' } + ] + } + ], + panelClass: 'w-full', + panelStyleClass: 'w-full', + scrollHeight: '400px', + showClear: false, + variant: 'outlined' + } + }); + expect(query('p-treeSelect')).toHaveSize(1); + }); +}); diff --git a/projects/rero/ng-core/src/lib/record/editor/formly/primeng/tree-select/tree-select.ts b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/tree-select/tree-select.ts new file mode 100644 index 00000000..2848d4e8 --- /dev/null +++ b/projects/rero/ng-core/src/lib/record/editor/formly/primeng/tree-select/tree-select.ts @@ -0,0 +1,147 @@ +/* + * RERO angular core + * Copyright (C) 2024 RERO + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { CommonModule } from '@angular/common'; +import { Component, NgModule, OnInit, Type } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { FieldType, FormlyFieldConfig, FormlyFieldProps, FormlyModule } from '@ngx-formly/core'; +import { TreeNode } from 'primeng/api'; +import { TreeNodeSelectEvent } from 'primeng/tree'; +import { TreeSelectModule as PrimeNgTreeSelectModule } from 'primeng/treeselect'; +import { isObservable, of } from 'rxjs'; + +// Doc https://primeng.org/treeselect + +export interface ITreeSelectProps extends FormlyFieldProps { + class: string; + containerStyleClass: string; + disabled?: boolean; + filter: boolean; + filterBy: string; + filterPlaceholder?: string; + panelClass: string; + panelStyleClass: string; + scrollHeight: string; + showClear: boolean; + variant: string; +} + +export interface FormlyTreeSelectFieldConfig extends FormlyFieldConfig { + type: 'tree-select' | Type; +} + +@Component({ + selector: 'ng-core-tree-select', + template: ` + + `, +}) +export class TreeSelectComponent extends FieldType> implements OnInit { + + /** Default properties */ + defaultOptions: Partial> = { + props: { + class: 'w-full', + containerStyleClass: 'w-full', + filter: false, + filterBy: 'label', + panelClass: 'w-full', + panelStyleClass: 'w-full', + scrollHeight: '400px', + showClear: false, + variant: 'outlined' + } + }; + + nodeSelected: any = undefined; + + // Doc for TreeNode https://primeng.org/treeselect#api.treeselect.interfaces.TreeNode + selectOptions: TreeNode[] = []; + + ngOnInit(): void { + if (!isObservable(this.props.options)) { + this.props.options = of(this.props.options); + } + this.props.options.subscribe((options: any) => { + this.selectOptions = options; + if (this.field.formControl.value) { + this.nodeSelected = this.findNodeByValue( + this.selectOptions, + this.field.formControl.value + ); + } + }); + } + + onNodeSelect(event: TreeNodeSelectEvent): void { + this.formControl.patchValue(event.node.data); + } + + onNodeUnselect(): void { + this.formControl.reset(); + } + + private findNodeByValue(node: TreeNode[], value: string, data?: TreeNode): any { + if (!data) { + node.map((treeNode: TreeNode) => { + if (treeNode.data === value) { + data = treeNode; + } + else if (treeNode.children) { + data = this.findNodeByValue(treeNode.children, value, data); + } + }); + } + + return data; + } +} + +@NgModule({ + declarations: [ TreeSelectComponent ], + imports: [ + CommonModule, + FormsModule, + PrimeNgTreeSelectModule, + FormlyModule.forChild({ + types: [ + { + name: 'tree-select', + component: TreeSelectComponent, + wrappers: ['form-field'], + } + ], + }), + ], +}) +export class NgCoreFormlyTreeSelectModule { } diff --git a/projects/rero/ng-core/src/lib/record/editor/services/jsonschema.service.ts b/projects/rero/ng-core/src/lib/record/editor/services/jsonschema.service.ts index ddd5bf67..d74b77dd 100644 --- a/projects/rero/ng-core/src/lib/record/editor/services/jsonschema.service.ts +++ b/projects/rero/ng-core/src/lib/record/editor/services/jsonschema.service.ts @@ -46,7 +46,7 @@ export class JSONSchemaService { processField(field: FormlyFieldConfig, jsonSchema: JSONSchema7) { // initial population of arrays with a minItems constraints - if (jsonSchema.minItems && !jsonSchema.hasOwnProperty('default')) { + if (field.type === 'array' && jsonSchema.minItems && !jsonSchema.hasOwnProperty('default')) { field.defaultValue = new Array(jsonSchema.minItems); } // If 'format' is defined into the jsonSchema, use it as props to try a validation on this field. @@ -62,7 +62,8 @@ export class JSONSchemaService { this.setSimpleOptions(field, props); this.setValidation(field, props); this.setRemoteSelectOptions(field, props); - this.setRemoteTypeahead(field, props); + // TODO: Check with autocomplete + // this.setRemoteTypeahead(field, props); } } diff --git a/projects/rero/ng-core/src/lib/record/editor/type/array-type/array-type.component.html b/projects/rero/ng-core/src/lib/record/editor/type/array-type/array-type.component.html index bb7a3b00..fa16268d 100644 --- a/projects/rero/ng-core/src/lib/record/editor/type/array-type/array-type.component.html +++ b/projects/rero/ng-core/src/lib/record/editor/type/array-type/array-type.component.html @@ -17,14 +17,13 @@ @if (props.label && field.props.hideLabel !== true) { - - + }
@if (showError && formControl.errors) { - `, }) -export class MarkdownFieldComponent extends FormlyFieldTextArea implements AfterViewInit { +export class MarkdownFieldComponent extends FieldType> implements AfterViewInit { // Reference to textarea element. @ViewChild('textarea') textarea: ElementRef; - /** - * Markdown editor initialization and listen for changes to update the model - * value. - */ - ngAfterViewInit(): void { - const mde = new EasyMDE({ - spellChecker: false, + /** Default options */ + defaultOptions?: Partial> = { + props: { + minHeight: '500px', promptURLs: true, - initialValue: this.formControl.value, + spellChecker: false, + status: false, toolbar: [ 'bold', 'italic', @@ -62,9 +76,24 @@ export class MarkdownFieldComponent extends FormlyFieldTextArea implements After 'fullscreen', '|', 'guide', - ], + ] + } + }; + + /** + * Markdown editor initialization and listen for changes to update the model + * value. + */ + ngAfterViewInit(): void { + const mde = new EasyMDE({ + spellChecker: this.props.spellChecker, + promptURLs: this.props.promptURLs, + initialValue: this.formControl.value, + maxHeight: this.props.maxHeight, + minHeight: this.props.minHeight, + toolbar: this.props.toolbar, element: this.textarea.nativeElement, - status: false, + status: this.props.status, }); mde.codemirror.on('change', () => { diff --git a/projects/rero/ng-core/src/lib/record/editor/type/multicheckbox.component.ts b/projects/rero/ng-core/src/lib/record/editor/type/multicheckbox.component.ts deleted file mode 100644 index 446030a7..00000000 --- a/projects/rero/ng-core/src/lib/record/editor/type/multicheckbox.component.ts +++ /dev/null @@ -1,87 +0,0 @@ -/* - * RERO angular core - * Copyright (C) 2022-2024 RERO - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -import { Component } from '@angular/core'; -import { FieldType, FormlyFieldConfig } from '@ngx-formly/core'; -import { FormlyFieldProps } from '@ngx-formly/primeng/form-field'; - -interface MultiCheckboxProps extends FormlyFieldProps { - style: 'stacked' | 'inline'; -} - -@Component({ - selector: 'ng-core-editor-formly-field-multicheckbox', - template: ` -
- @for (option of props.options | formlySelectOptions : field | async; track option; let i = $index;) { -
- - - @if (showError && formControl.errors) { - - } -
- } - `, -}) -export class MultiCheckboxComponent extends FieldType> { - /** Default options */ - defaultOptions?: Partial> = { - props: { - style: 'stacked' - } - }; - - /** - * Adds or removes the value of a checkbox in the list of values. - * @param value - checkbox value - * @param checked - True if checked - */ - onChange(value: any, checked: boolean): void { - this.formControl.markAsDirty(); - if (Array.isArray(this.formControl.value)) { - this.formControl.patchValue( - checked - ? [...(this.formControl.value || []), value] - : [...(this.formControl.value || [])].filter((o) => o !== value), - ); - } else { - this.formControl.patchValue({ ...this.formControl.value, [value]: checked }); - } - this.formControl.markAsTouched(); - } - - /** - * Activates the checkbox if the value exists in the list. - * @param option - current checkbox - * @return True if the current checkbox value exists in the list of values - */ - isChecked(option: any): boolean { - const { value } = this.formControl; - - return value && (Array.isArray(value) ? value.indexOf(option.value) !== -1 : value[option.value]); - } -} diff --git a/projects/rero/ng-core/src/lib/record/editor/type/multischema/multischema.component.ts b/projects/rero/ng-core/src/lib/record/editor/type/multischema/multischema.component.ts index e8654269..c7433045 100644 --- a/projects/rero/ng-core/src/lib/record/editor/type/multischema/multischema.component.ts +++ b/projects/rero/ng-core/src/lib/record/editor/type/multischema/multischema.component.ts @@ -22,7 +22,7 @@ import { FieldType, FormlyFieldConfig } from '@ngx-formly/core'; template: `
@if (props.label) { - {{ props.label }} + {{ props.label }} } @if (showError && formControl.errors) {