diff --git a/package-lock.json b/package-lock.json index 648fd35ae1d..2012f059178 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,6 @@ "dependencies": { "@date-io/date-fns": "^2.16.0", "@fontsource/inter": "^5.0.16", - "@fortawesome/fontawesome-free": "^6.5.1", "@glennsl/bs-json": "^5.0.4", "@googlemaps/react-wrapper": "^1.1.35", "@googlemaps/typescript-guards": "^2.0.3", @@ -2829,15 +2828,6 @@ "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.0.16.tgz", "integrity": "sha512-qF0aH5UiZvCmneX5orJbVRoc2VTyLTV3X/7laMp03Qt28L+B9tFlZODOGUL64wDWc69YVdi1LeJB0cIgd51lvw==" }, - "node_modules/@fortawesome/fontawesome-free": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.1.tgz", - "integrity": "sha512-CNy5vSwN3fsUStPRLX7fUYojyuzoEMSXPl7zSLJ8TgtRfjv24LOnOWKT2zYwaHZCJGkdyRnTmstR0P+Ah503Gw==", - "hasInstallScript": true, - "engines": { - "node": ">=6" - } - }, "node_modules/@glennsl/bs-json": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@glennsl/bs-json/-/bs-json-5.0.4.tgz", @@ -15944,6 +15934,8 @@ }, "node_modules/npm/node_modules/@colors/colors": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -15954,6 +15946,8 @@ }, "node_modules/npm/node_modules/@isaacs/cliui": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "inBundle": true, "license": "ISC", @@ -15971,6 +15965,8 @@ }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "inBundle": true, "license": "MIT", @@ -15983,12 +15979,16 @@ }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "inBundle": true, "license": "MIT", @@ -16006,6 +16006,8 @@ }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -16021,6 +16023,8 @@ }, "node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", "dev": true, "inBundle": true, "license": "ISC" @@ -16093,6 +16097,8 @@ }, "node_modules/npm/node_modules/@npmcli/disparity-colors": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/disparity-colors/-/disparity-colors-3.0.0.tgz", + "integrity": "sha512-5R/z157/f20Fi0Ou4ZttL51V0xz0EdPEOauFtPCEYOLInDBRCj1/TxOJ5aGTrtShxEshN2d+hXb9ZKSi5RLBcg==", "dev": true, "inBundle": true, "license": "ISC", @@ -16105,6 +16111,8 @@ }, "node_modules/npm/node_modules/@npmcli/fs": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "dev": true, "inBundle": true, "license": "ISC", @@ -16117,6 +16125,8 @@ }, "node_modules/npm/node_modules/@npmcli/git": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -16136,6 +16146,8 @@ }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -16152,6 +16164,8 @@ }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz", + "integrity": "sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==", "dev": true, "inBundle": true, "license": "ISC", @@ -16167,6 +16181,8 @@ }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz", + "integrity": "sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q==", "dev": true, "inBundle": true, "license": "ISC", @@ -16182,6 +16198,8 @@ }, "node_modules/npm/node_modules/@npmcli/name-from-folder": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", "dev": true, "inBundle": true, "license": "ISC", @@ -16191,6 +16209,8 @@ }, "node_modules/npm/node_modules/@npmcli/node-gyp": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "dev": true, "inBundle": true, "license": "ISC", @@ -16200,6 +16220,8 @@ }, "node_modules/npm/node_modules/@npmcli/package-json": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==", "dev": true, "inBundle": true, "license": "ISC", @@ -16218,6 +16240,8 @@ }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "dev": true, "inBundle": true, "license": "ISC", @@ -16242,6 +16266,8 @@ }, "node_modules/npm/node_modules/@npmcli/run-script": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "dev": true, "inBundle": true, "license": "ISC", @@ -16258,6 +16284,8 @@ }, "node_modules/npm/node_modules/@pkgjs/parseargs": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "inBundle": true, "license": "MIT", @@ -16290,6 +16318,8 @@ }, "node_modules/npm/node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, "inBundle": true, "license": "MIT", @@ -16299,6 +16329,8 @@ }, "node_modules/npm/node_modules/@tufjs/canonical-json": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -16308,6 +16340,8 @@ }, "node_modules/npm/node_modules/@tufjs/models": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", "dev": true, "inBundle": true, "license": "MIT", @@ -16321,6 +16355,8 @@ }, "node_modules/npm/node_modules/abbrev": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -16342,6 +16378,8 @@ }, "node_modules/npm/node_modules/agent-base": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -16368,6 +16406,8 @@ }, "node_modules/npm/node_modules/aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "inBundle": true, "license": "MIT", @@ -16381,6 +16421,8 @@ }, "node_modules/npm/node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -16390,6 +16432,8 @@ }, "node_modules/npm/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "inBundle": true, "license": "MIT", @@ -16405,12 +16449,16 @@ }, "node_modules/npm/node_modules/aproba": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/archy": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true, "inBundle": true, "license": "MIT" @@ -16430,12 +16478,16 @@ }, "node_modules/npm/node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, "funding": [ { @@ -16471,6 +16523,8 @@ }, "node_modules/npm/node_modules/binary-extensions": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "inBundle": true, "license": "MIT", @@ -16478,6 +16532,17 @@ "node": ">=8" } }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/npm/node_modules/buffer": { "version": "6.0.3", "dev": true, @@ -16504,6 +16569,8 @@ }, "node_modules/npm/node_modules/builtins": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -16536,6 +16603,8 @@ }, "node_modules/npm/node_modules/chalk": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "inBundle": true, "license": "MIT", @@ -16548,6 +16617,8 @@ }, "node_modules/npm/node_modules/chownr": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -16557,6 +16628,8 @@ }, "node_modules/npm/node_modules/ci-info": { "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true, "funding": [ { @@ -16572,6 +16645,8 @@ }, "node_modules/npm/node_modules/cidr-regex": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-3.1.1.tgz", + "integrity": "sha512-RBqYd32aDwbCMFJRL6wHOlDNYJsPNTt8vC82ErHF5vKt8QQzxm1FrkW8s/R5pVrXMf17sba09Uoy91PKiddAsw==", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -16584,6 +16659,8 @@ }, "node_modules/npm/node_modules/clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "inBundle": true, "license": "MIT", @@ -16593,6 +16670,8 @@ }, "node_modules/npm/node_modules/cli-columns": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-columns/-/cli-columns-4.0.0.tgz", + "integrity": "sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -16606,6 +16685,8 @@ }, "node_modules/npm/node_modules/cli-table3": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, "inBundle": true, "license": "MIT", @@ -16621,6 +16702,8 @@ }, "node_modules/npm/node_modules/clone": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "inBundle": true, "license": "MIT", @@ -16639,6 +16722,8 @@ }, "node_modules/npm/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -16651,12 +16736,16 @@ }, "node_modules/npm/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/color-support": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, "inBundle": true, "license": "ISC", @@ -16666,6 +16755,8 @@ }, "node_modules/npm/node_modules/columnify": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", "dev": true, "inBundle": true, "license": "MIT", @@ -16679,24 +16770,32 @@ }, "node_modules/npm/node_modules/common-ancestor-path": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/console-control-strings": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/cross-spawn": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "inBundle": true, "license": "MIT", @@ -16711,6 +16810,8 @@ }, "node_modules/npm/node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "inBundle": true, "license": "ISC", @@ -16726,6 +16827,8 @@ }, "node_modules/npm/node_modules/cssesc": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "inBundle": true, "license": "MIT", @@ -16738,6 +16841,8 @@ }, "node_modules/npm/node_modules/debug": { "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -16755,12 +16860,16 @@ }, "node_modules/npm/node_modules/debug/node_modules/ms": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/defaults": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "inBundle": true, "license": "MIT", @@ -16773,6 +16882,8 @@ }, "node_modules/npm/node_modules/delegates": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true, "inBundle": true, "license": "MIT" @@ -16788,6 +16899,8 @@ }, "node_modules/npm/node_modules/diff": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true, "inBundle": true, "license": "BSD-3-Clause", @@ -16797,18 +16910,24 @@ }, "node_modules/npm/node_modules/eastasianwidth": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/encoding": { "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "inBundle": true, "license": "MIT", @@ -16819,6 +16938,8 @@ }, "node_modules/npm/node_modules/env-paths": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "inBundle": true, "license": "MIT", @@ -16828,6 +16949,8 @@ }, "node_modules/npm/node_modules/err-code": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true, "inBundle": true, "license": "MIT" @@ -16843,6 +16966,8 @@ }, "node_modules/npm/node_modules/events": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "inBundle": true, "license": "MIT", @@ -16852,12 +16977,16 @@ }, "node_modules/npm/node_modules/exponential-backoff": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", "dev": true, "inBundle": true, "license": "Apache-2.0" }, "node_modules/npm/node_modules/fastest-levenshtein": { "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, "inBundle": true, "license": "MIT", @@ -16867,6 +16996,8 @@ }, "node_modules/npm/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==", "dev": true, "inBundle": true, "license": "ISC", @@ -16895,18 +17026,24 @@ }, "node_modules/npm/node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/function-bind": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/gauge": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.1.tgz", + "integrity": "sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -16946,14 +17083,27 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/npm/node_modules/glob/node_modules/minipass": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/npm/node_modules/graceful-fs": { "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/has": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "inBundle": true, "license": "MIT", @@ -16966,12 +17116,16 @@ }, "node_modules/npm/node_modules/has-unicode": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/hosted-git-info": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "dev": true, "inBundle": true, "license": "ISC", @@ -16984,12 +17138,16 @@ }, "node_modules/npm/node_modules/http-cache-semantics": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true, "inBundle": true, "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "inBundle": true, "license": "MIT", @@ -17004,6 +17162,8 @@ }, "node_modules/npm/node_modules/https-proxy-agent": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "inBundle": true, "license": "MIT", @@ -17017,6 +17177,8 @@ }, "node_modules/npm/node_modules/humanize-ms": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -17026,6 +17188,8 @@ }, "node_modules/npm/node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "inBundle": true, "license": "MIT", @@ -17059,6 +17223,8 @@ }, "node_modules/npm/node_modules/ignore-walk": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", "dev": true, "inBundle": true, "license": "ISC", @@ -17071,6 +17237,8 @@ }, "node_modules/npm/node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "inBundle": true, "license": "MIT", @@ -17080,6 +17248,8 @@ }, "node_modules/npm/node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "inBundle": true, "license": "MIT", @@ -17089,6 +17259,8 @@ }, "node_modules/npm/node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "inBundle": true, "license": "ISC", @@ -17099,12 +17271,16 @@ }, "node_modules/npm/node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/ini": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true, "inBundle": true, "license": "ISC", @@ -17114,6 +17290,8 @@ }, "node_modules/npm/node_modules/init-package-json": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-5.0.0.tgz", + "integrity": "sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==", "dev": true, "inBundle": true, "license": "ISC", @@ -17132,12 +17310,16 @@ }, "node_modules/npm/node_modules/ip": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/ip-regex": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", "dev": true, "inBundle": true, "license": "MIT", @@ -17147,6 +17329,8 @@ }, "node_modules/npm/node_modules/is-cidr": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-4.0.2.tgz", + "integrity": "sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA==", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -17171,6 +17355,8 @@ }, "node_modules/npm/node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "inBundle": true, "license": "MIT", @@ -17180,12 +17366,16 @@ }, "node_modules/npm/node_modules/is-lambda": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "inBundle": true, "license": "ISC" @@ -17210,6 +17400,8 @@ }, "node_modules/npm/node_modules/json-parse-even-better-errors": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", "dev": true, "inBundle": true, "license": "MIT", @@ -17219,6 +17411,8 @@ }, "node_modules/npm/node_modules/json-stringify-nice": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", "dev": true, "inBundle": true, "license": "ISC", @@ -17228,6 +17422,8 @@ }, "node_modules/npm/node_modules/jsonparse": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" @@ -17237,18 +17433,24 @@ }, "node_modules/npm/node_modules/just-diff": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", + "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/just-diff-apply": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-7.0.2.tgz", + "integrity": "sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw==", "dev": true, "inBundle": true, "license": "ISC", @@ -17316,6 +17518,8 @@ }, "node_modules/npm/node_modules/libnpmhook": { "version": "9.0.3", + "resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-9.0.3.tgz", + "integrity": "sha512-wMZe58sI7KLhg0+nUWZW5KdMfjNNcOIIbkoP19BDHYoUF9El7eeUWkGNxUGzpHkPKiGoQ1z/v6CYin4deebeuw==", "dev": true, "inBundle": true, "license": "ISC", @@ -17329,6 +17533,8 @@ }, "node_modules/npm/node_modules/libnpmorg": { "version": "5.0.4", + "resolved": "https://registry.npmjs.org/libnpmorg/-/libnpmorg-5.0.4.tgz", + "integrity": "sha512-YqYXLMAN0Y1eJH4w3hUFN9648xfSdvJANMsdeZTOWJOW4Pqp8qapJFzQdqCfUkg+tEuQmnaFQQKXvkMZC51+Mw==", "dev": true, "inBundle": true, "license": "ISC", @@ -17376,6 +17582,8 @@ }, "node_modules/npm/node_modules/libnpmsearch": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/libnpmsearch/-/libnpmsearch-6.0.2.tgz", + "integrity": "sha512-p+5BF19AvnVg8mcIQhy6yWhI6jHQRVMYaIaKeITEfYAffWsqbottA/WZdMtHL76hViC6SFM1WdclM1w5eAIa1g==", "dev": true, "inBundle": true, "license": "ISC", @@ -17388,6 +17596,8 @@ }, "node_modules/npm/node_modules/libnpmteam": { "version": "5.0.3", + "resolved": "https://registry.npmjs.org/libnpmteam/-/libnpmteam-5.0.3.tgz", + "integrity": "sha512-7XOGhi45s+ml6TyrhJUTyrErcoDMKGKfEtiTEco4ofU7BGGAUOalVztKMVLLJgJOOXdIAIlzCHqkTXEuSiyCiA==", "dev": true, "inBundle": true, "license": "ISC", @@ -17401,6 +17611,8 @@ }, "node_modules/npm/node_modules/libnpmversion": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/libnpmversion/-/libnpmversion-4.0.2.tgz", + "integrity": "sha512-n1X70mFHv8Piy4yos+MFWUARSkTbyV5cdsHScaIkuwYvRAF/s2VtYScDzWB4Oe8uNEuGNdjiRR1E/Dh1tMvv6g==", "dev": true, "inBundle": true, "license": "ISC", @@ -17417,6 +17629,8 @@ }, "node_modules/npm/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "inBundle": true, "license": "ISC", @@ -17426,6 +17640,8 @@ }, "node_modules/npm/node_modules/make-fetch-happen": { "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "inBundle": true, "license": "ISC", @@ -17452,6 +17668,8 @@ }, "node_modules/npm/node_modules/minimatch": { "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "inBundle": true, "license": "ISC", @@ -17465,17 +17683,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/npm/node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -17485,6 +17696,8 @@ }, "node_modules/npm/node_modules/minipass-collect": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, "inBundle": true, "license": "ISC", @@ -17497,6 +17710,8 @@ }, "node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "inBundle": true, "license": "ISC", @@ -17526,6 +17741,8 @@ }, "node_modules/npm/node_modules/minipass-flush": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, "inBundle": true, "license": "ISC", @@ -17538,6 +17755,8 @@ }, "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "inBundle": true, "license": "ISC", @@ -17550,6 +17769,8 @@ }, "node_modules/npm/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==", "dev": true, "inBundle": true, "license": "MIT", @@ -17560,6 +17781,8 @@ }, "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "inBundle": true, "license": "ISC", @@ -17572,6 +17795,8 @@ }, "node_modules/npm/node_modules/minipass-pipeline": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, "inBundle": true, "license": "ISC", @@ -17584,6 +17809,8 @@ }, "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "inBundle": true, "license": "ISC", @@ -17596,6 +17823,8 @@ }, "node_modules/npm/node_modules/minipass-sized": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, "inBundle": true, "license": "ISC", @@ -17608,6 +17837,8 @@ }, "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "inBundle": true, "license": "ISC", @@ -17620,6 +17851,8 @@ }, "node_modules/npm/node_modules/minizlib": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "inBundle": true, "license": "MIT", @@ -17633,6 +17866,8 @@ }, "node_modules/npm/node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "inBundle": true, "license": "ISC", @@ -17645,6 +17880,8 @@ }, "node_modules/npm/node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "inBundle": true, "license": "MIT", @@ -17657,12 +17894,16 @@ }, "node_modules/npm/node_modules/ms": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/mute-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "dev": true, "inBundle": true, "license": "ISC", @@ -17672,6 +17913,8 @@ }, "node_modules/npm/node_modules/negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "inBundle": true, "license": "MIT", @@ -17706,12 +17949,16 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/node-gyp/node_modules/are-we-there-yet": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "dev": true, "inBundle": true, "license": "ISC", @@ -17725,6 +17972,8 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "inBundle": true, "license": "MIT", @@ -17735,6 +17984,8 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/gauge": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, "inBundle": true, "license": "ISC", @@ -17754,6 +18005,8 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "inBundle": true, "license": "ISC", @@ -17774,6 +18027,8 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "inBundle": true, "license": "ISC", @@ -17786,6 +18041,8 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "inBundle": true, "license": "ISC", @@ -17801,6 +18058,8 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, "inBundle": true, "license": "ISC", @@ -17816,6 +18075,8 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "inBundle": true, "license": "MIT", @@ -17830,12 +18091,16 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/signal-exit": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/node-gyp/node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "inBundle": true, "license": "ISC", @@ -17851,6 +18116,8 @@ }, "node_modules/npm/node_modules/nopt": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "dev": true, "inBundle": true, "license": "ISC", @@ -17866,6 +18133,8 @@ }, "node_modules/npm/node_modules/normalize-package-data": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -17881,6 +18150,8 @@ }, "node_modules/npm/node_modules/npm-audit-report": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-5.0.0.tgz", + "integrity": "sha512-EkXrzat7zERmUhHaoren1YhTxFwsOu5jypE84k6632SXTHcQE1z8V51GC6GVZt8LxkC+tbBcKMUBZAgk8SUSbw==", "dev": true, "inBundle": true, "license": "ISC", @@ -17890,6 +18161,8 @@ }, "node_modules/npm/node_modules/npm-bundled": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -17914,6 +18187,8 @@ }, "node_modules/npm/node_modules/npm-normalize-package-bin": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -17923,6 +18198,8 @@ }, "node_modules/npm/node_modules/npm-package-arg": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "dev": true, "inBundle": true, "license": "ISC", @@ -17938,6 +18215,8 @@ }, "node_modules/npm/node_modules/npm-packlist": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", "dev": true, "inBundle": true, "license": "ISC", @@ -17965,6 +18244,8 @@ }, "node_modules/npm/node_modules/npm-profile": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npm-profile/-/npm-profile-7.0.1.tgz", + "integrity": "sha512-VReArOY/fCx5dWL66cbJ2OMogTQAVVQA//8jjmjkarboki3V7UJ0XbGFW+khRwiAJFQjuH0Bqr/yF7Y5RZdkMQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -17978,6 +18259,8 @@ }, "node_modules/npm/node_modules/npm-registry-fetch": { "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "dev": true, "inBundle": true, "license": "ISC", @@ -17996,6 +18279,8 @@ }, "node_modules/npm/node_modules/npm-user-validate": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-2.0.0.tgz", + "integrity": "sha512-sSWeqAYJ2dUPStJB+AEj0DyLRltr/f6YNcvCA7phkB8/RMLMnVsQ41GMwHo/ERZLYNDsyB2wPm7pZo1mqPOl7Q==", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -18005,6 +18290,8 @@ }, "node_modules/npm/node_modules/npmlog": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", + "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", "dev": true, "inBundle": true, "license": "ISC", @@ -18020,6 +18307,8 @@ }, "node_modules/npm/node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "inBundle": true, "license": "ISC", @@ -18029,6 +18318,8 @@ }, "node_modules/npm/node_modules/p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -18044,6 +18335,8 @@ }, "node_modules/npm/node_modules/pacote": { "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "dev": true, "inBundle": true, "license": "ISC", @@ -18076,6 +18369,8 @@ }, "node_modules/npm/node_modules/parse-conflict-json": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", + "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", "dev": true, "inBundle": true, "license": "ISC", @@ -18090,6 +18385,8 @@ }, "node_modules/npm/node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "inBundle": true, "license": "MIT", @@ -18099,6 +18396,8 @@ }, "node_modules/npm/node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "inBundle": true, "license": "MIT", @@ -18133,6 +18432,8 @@ }, "node_modules/npm/node_modules/postcss-selector-parser": { "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -18146,6 +18447,8 @@ }, "node_modules/npm/node_modules/proc-log": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "dev": true, "inBundle": true, "license": "ISC", @@ -18155,6 +18458,8 @@ }, "node_modules/npm/node_modules/process": { "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, "inBundle": true, "license": "MIT", @@ -18164,6 +18469,8 @@ }, "node_modules/npm/node_modules/promise-all-reject-late": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", "dev": true, "inBundle": true, "license": "ISC", @@ -18173,6 +18480,8 @@ }, "node_modules/npm/node_modules/promise-call-limit": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", + "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", "dev": true, "inBundle": true, "license": "ISC", @@ -18182,12 +18491,16 @@ }, "node_modules/npm/node_modules/promise-inflight": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/promise-retry": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "inBundle": true, "license": "MIT", @@ -18201,6 +18514,8 @@ }, "node_modules/npm/node_modules/promzard": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.0.tgz", + "integrity": "sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==", "dev": true, "inBundle": true, "license": "ISC", @@ -18213,6 +18528,8 @@ }, "node_modules/npm/node_modules/qrcode-terminal": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", "dev": true, "inBundle": true, "bin": { @@ -18221,6 +18538,8 @@ }, "node_modules/npm/node_modules/read": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read/-/read-2.1.0.tgz", + "integrity": "sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -18233,6 +18552,8 @@ }, "node_modules/npm/node_modules/read-cmd-shim": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", "dev": true, "inBundle": true, "license": "ISC", @@ -18242,6 +18563,8 @@ }, "node_modules/npm/node_modules/read-package-json": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "dev": true, "inBundle": true, "license": "ISC", @@ -18257,6 +18580,8 @@ }, "node_modules/npm/node_modules/read-package-json-fast": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dev": true, "inBundle": true, "license": "ISC", @@ -18285,6 +18610,8 @@ }, "node_modules/npm/node_modules/retry": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "inBundle": true, "license": "MIT", @@ -18294,6 +18621,8 @@ }, "node_modules/npm/node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "inBundle": true, "license": "ISC", @@ -18309,6 +18638,8 @@ }, "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "inBundle": true, "license": "MIT", @@ -18319,6 +18650,8 @@ }, "node_modules/npm/node_modules/rimraf/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "inBundle": true, "license": "ISC", @@ -18339,6 +18672,8 @@ }, "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "inBundle": true, "license": "ISC", @@ -18351,6 +18686,8 @@ }, "node_modules/npm/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -18371,6 +18708,8 @@ }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "inBundle": true, "license": "MIT", @@ -18378,6 +18717,8 @@ }, "node_modules/npm/node_modules/semver": { "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "inBundle": true, "license": "ISC", @@ -18393,6 +18734,8 @@ }, "node_modules/npm/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "inBundle": true, "license": "ISC", @@ -18405,12 +18748,16 @@ }, "node_modules/npm/node_modules/set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "inBundle": true, "license": "MIT", @@ -18423,6 +18770,8 @@ }, "node_modules/npm/node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "inBundle": true, "license": "MIT", @@ -18432,6 +18781,8 @@ }, "node_modules/npm/node_modules/signal-exit": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", "dev": true, "inBundle": true, "license": "ISC", @@ -18461,6 +18812,8 @@ }, "node_modules/npm/node_modules/smart-buffer": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, "inBundle": true, "license": "MIT", @@ -18471,6 +18824,8 @@ }, "node_modules/npm/node_modules/socks": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -18485,6 +18840,8 @@ }, "node_modules/npm/node_modules/socks-proxy-agent": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "inBundle": true, "license": "MIT", @@ -18499,6 +18856,8 @@ }, "node_modules/npm/node_modules/spdx-correct": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -18509,12 +18868,16 @@ }, "node_modules/npm/node_modules/spdx-exceptions": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true, "inBundle": true, "license": "CC-BY-3.0" }, "node_modules/npm/node_modules/spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "inBundle": true, "license": "MIT", @@ -18525,6 +18888,8 @@ }, "node_modules/npm/node_modules/spdx-license-ids": { "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true, "inBundle": true, "license": "CC0-1.0" @@ -18543,6 +18908,8 @@ }, "node_modules/npm/node_modules/string_decoder": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "inBundle": true, "license": "MIT", @@ -18552,6 +18919,8 @@ }, "node_modules/npm/node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "inBundle": true, "license": "MIT", @@ -18567,6 +18936,8 @@ "node_modules/npm/node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "inBundle": true, "license": "MIT", @@ -18581,6 +18952,8 @@ }, "node_modules/npm/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "inBundle": true, "license": "MIT", @@ -18594,6 +18967,8 @@ "node_modules/npm/node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "inBundle": true, "license": "MIT", @@ -18606,6 +18981,8 @@ }, "node_modules/npm/node_modules/supports-color": { "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", "dev": true, "inBundle": true, "license": "MIT", @@ -18618,6 +18995,8 @@ }, "node_modules/npm/node_modules/tar": { "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dev": true, "inBundle": true, "license": "ISC", @@ -18635,6 +19014,8 @@ }, "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "inBundle": true, "license": "ISC", @@ -18647,6 +19028,8 @@ }, "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "inBundle": true, "license": "ISC", @@ -18659,18 +19042,24 @@ }, "node_modules/npm/node_modules/text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/tiny-relative-date": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz", + "integrity": "sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/treeverse": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", + "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -18680,6 +19069,8 @@ }, "node_modules/npm/node_modules/tuf-js": { "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", "dev": true, "inBundle": true, "license": "MIT", @@ -18694,6 +19085,8 @@ }, "node_modules/npm/node_modules/unique-filename": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, "inBundle": true, "license": "ISC", @@ -18706,6 +19099,8 @@ }, "node_modules/npm/node_modules/unique-slug": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -18718,12 +19113,16 @@ }, "node_modules/npm/node_modules/util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -18734,6 +19133,8 @@ }, "node_modules/npm/node_modules/validate-npm-package-name": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -18746,12 +19147,16 @@ }, "node_modules/npm/node_modules/walk-up-path": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/wcwidth": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "inBundle": true, "license": "MIT", @@ -18761,6 +19166,8 @@ }, "node_modules/npm/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "inBundle": true, "license": "ISC", @@ -18776,6 +19183,8 @@ }, "node_modules/npm/node_modules/wide-align": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "inBundle": true, "license": "ISC", @@ -18785,6 +19194,8 @@ }, "node_modules/npm/node_modules/wrap-ansi": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -18803,6 +19214,8 @@ "node_modules/npm/node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "inBundle": true, "license": "MIT", @@ -18820,6 +19233,8 @@ }, "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "inBundle": true, "license": "MIT", @@ -18832,6 +19247,8 @@ }, "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "inBundle": true, "license": "MIT", @@ -18844,12 +19261,16 @@ }, "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "inBundle": true, "license": "MIT", @@ -18867,6 +19288,8 @@ }, "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -18882,12 +19305,16 @@ }, "node_modules/npm/node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/write-file-atomic": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, "inBundle": true, "license": "ISC", @@ -18901,6 +19328,8 @@ }, "node_modules/npm/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "inBundle": true, "license": "ISC" diff --git a/package.json b/package.json index 0f50a65a090..8fdaea4939f 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,6 @@ "dependencies": { "@date-io/date-fns": "^2.16.0", "@fontsource/inter": "^5.0.16", - "@fortawesome/fontawesome-free": "^6.5.1", "@glennsl/bs-json": "^5.0.4", "@googlemaps/react-wrapper": "^1.1.35", "@googlemaps/typescript-guards": "^2.0.3", diff --git a/src/CAREUI/display/FilterBadge.tsx b/src/CAREUI/display/FilterBadge.tsx index 2443130981a..a4cd743b86a 100644 --- a/src/CAREUI/display/FilterBadge.tsx +++ b/src/CAREUI/display/FilterBadge.tsx @@ -1,3 +1,5 @@ +import CareIcon from "../icons/CareIcon"; + export interface FilterBadgeProps { name: string; value: string; @@ -17,11 +19,12 @@ const FilterBadge = ({ name, value, onRemove }: FilterBadgeProps) => { } flex flex-row items-center rounded-full border border-gray-300 bg-white px-3 py-1 text-xs font-medium leading-4 text-gray-600`} > {`${name}: ${value}`} - + /> ); }; diff --git a/src/CAREUI/icons/CareIcon.tsx b/src/CAREUI/icons/CareIcon.tsx index 0c70fbfe298..27a4abe97b4 100644 --- a/src/CAREUI/icons/CareIcon.tsx +++ b/src/CAREUI/icons/CareIcon.tsx @@ -9,6 +9,7 @@ export interface CareIconProps { icon?: IconName; className?: string | undefined; onClick?: React.MouseEventHandler | undefined; + id?: string; } /** @@ -19,14 +20,19 @@ export interface CareIconProps { * * @see [icon library](https://iconscout.com/unicons/) */ -export default function CareIcon({ icon, className, onClick }: CareIconProps) { +export default function CareIcon({ + id, + icon, + className, + onClick, +}: CareIconProps) { const effectiveClassName = icon ? `care-${icon} ${className ?? ""}` : className; useEffect(() => transformIcons(), [effectiveClassName]); return ( - + ); diff --git a/src/Common/constants.tsx b/src/Common/constants.tsx index ada2fc6e2bf..1d3e8c8db40 100644 --- a/src/Common/constants.tsx +++ b/src/Common/constants.tsx @@ -547,77 +547,83 @@ export const DESIGNATION_HEALTH_CARE_WORKER = [ "OTHERS", ]; -export const NOTIFICATION_EVENTS = [ - { id: "MESSAGE", text: "Notice", icon: "fa-regular fa-message" }, +type NotificationEvent = { + id: string; + text: string; + icon: IconName; +}; + +export const NOTIFICATION_EVENTS: NotificationEvent[] = [ + { id: "MESSAGE", text: "Notice", icon: "l-comment-alt-message" }, { id: "PATIENT_CREATED", text: "Patient Created", - icon: "fa-solid fa-user-plus", + icon: "l-user-plus", }, { id: "PATIENT_UPDATED", text: "Patient Updated", - icon: "fa-solid fa-user-pen", + icon: "l-edit", }, { id: "PATIENT_DELETED", text: "Patient Deleted", - icon: "fa-solid fa-user-minus", + icon: "l-user-minus", }, { id: "PATIENT_CONSULTATION_CREATED", text: "Patient Consultation Created", - icon: "fa-solid fa-heart-circle-check", + icon: "l-heart", }, { id: "PATIENT_CONSULTATION_UPDATED", text: "Patient Consultation Updated", - icon: "fa-solid fa-heart-circle-plus", + icon: "l-heart-medical", }, { id: "PATIENT_CONSULTATION_DELETED", text: "Patient Consultation Deleted", - icon: "fa-solid fa-heart-circle-minus", + icon: "l-heartbeat", }, { id: "INVESTIGATION_SESSION_CREATED", text: "Investigation Session Created", - icon: "fa-solid fa-magnifying-glass", + icon: "l-search", }, { id: "INVESTIGATION_UPDATED", text: "Investigation Updated", - icon: "fa-solid fa-magnifying-glass-plus", + icon: "l-search-plus", }, { id: "PATIENT_FILE_UPLOAD_CREATED", text: "Patient File Upload Created", - icon: "fa-solid fa-file-medical", + icon: "l-file-medical", }, { id: "CONSULTATION_FILE_UPLOAD_CREATED", text: "Consultation File Upload Created", - icon: "fa-solid fa-file-waveform", + icon: "l-file-upload", }, { id: "PATIENT_CONSULTATION_UPDATE_CREATED", text: "Patient Consultation Update Created", - icon: "fa-solid fa-file-circle-check", + icon: "l-heart", }, { id: "PATIENT_CONSULTATION_UPDATE_UPDATED", text: "Patient Consultation Update Updated", - icon: "fa-solid fa-file-circle-plus", + icon: "l-heart-medical", }, { id: "SHIFTING_UPDATED", text: "Shifting Updated", - icon: "fa-solid fa-truck-medical", + icon: "l-ambulance", }, { id: "PATIENT_NOTE_ADDED", text: "Patient Note Added", - icon: "fa-solid fa-message", + icon: "l-notes", }, ]; diff --git a/src/Components/ABDM/LinkABHANumberModal.tsx b/src/Components/ABDM/LinkABHANumberModal.tsx index 5d1f7469efc..6297b11152f 100644 --- a/src/Components/ABDM/LinkABHANumberModal.tsx +++ b/src/Components/ABDM/LinkABHANumberModal.tsx @@ -22,9 +22,9 @@ export const validateRule = ( return (
{condition ? ( - + ) : ( - + )}{" "} { className="focus:ring-blue mx-auto mt-4 max-w-xs items-center rounded-md border border-primary-500 bg-white px-3 py-2 text-sm font-medium leading-4 text-primary-700 transition duration-150 ease-in-out hover:text-primary-500 hover:shadow focus:border-primary-300 focus:outline-none active:bg-gray-50 active:text-primary-800" href={sample_format_asset_import} > - {" "} +
@@ -328,7 +333,8 @@ const AssetImportModal = ({ open, onClose, facility, onUpdate }: Props) => {

Print Preview

diff --git a/src/Components/Assets/AssetsList.tsx b/src/Components/Assets/AssetsList.tsx index f210bf04535..228e940de29 100644 --- a/src/Components/Assets/AssetsList.tsx +++ b/src/Components/Assets/AssetsList.tsx @@ -153,7 +153,8 @@ const AssetsList = () => { onClick={() => setIsScannerActive(false)} className="btn btn-default mb-2" > - Close Scanner + + Close Scanner { className="w-full py-[11px]" onClick={() => setIsScannerActive(true)} > - Scan Asset QR + Scan Asset + QR
{ await request(routes.createAssetBed, { @@ -76,7 +77,7 @@ export default function MonitorConfigure({ asset }: { asset: AssetData }) { />
- + {updateLink ? "Update Bed" : "Save Bed"} diff --git a/src/Components/Common/Breadcrumbs.tsx b/src/Components/Common/Breadcrumbs.tsx index 4ea85b0d759..b6c39a38ef1 100644 --- a/src/Components/Common/Breadcrumbs.tsx +++ b/src/Components/Common/Breadcrumbs.tsx @@ -127,7 +127,7 @@ export default function Breadcrumbs(props: any) { > {crumb.name.match(/^\w{8}-(\w{4}-){3}\w{12}$/) ? (
- + # {crumb.name.slice(0, 13) + "..."}
) : ( diff --git a/src/Components/Common/CareIcon.res b/src/Components/Common/CareIcon.res new file mode 100644 index 00000000000..343e01f1ddb --- /dev/null +++ b/src/Components/Common/CareIcon.res @@ -0,0 +1,19 @@ +type reactClass +module CareIcon = { + @module("../../CAREUI/icons/CareIcon.tsx") @react.component + external make: ( + ~icon: option, + ~className: option, + ~onClick: option unit>, + ~id: option + ) => React.element = "default" +} + +@react.component +let make = ( + ~icon = ?, + ~className = ?, + ~onClick = ?, + ~id = ?, +) => + diff --git a/src/Components/Common/FilePreviewDialog.tsx b/src/Components/Common/FilePreviewDialog.tsx index cb16337b238..10e909a9c70 100644 --- a/src/Components/Common/FilePreviewDialog.tsx +++ b/src/Components/Common/FilePreviewDialog.tsx @@ -4,6 +4,7 @@ import CircularProgress from "./components/CircularProgress"; import { useTranslation } from "react-i18next"; import { StateInterface } from "../Patient/FileUpload"; import { Dispatch, Fragment, ReactNode, SetStateAction } from "react"; +import CareIcon, { IconName } from "../../CAREUI/icons/CareIcon"; export const zoom_values = [ "h-1/6 w-1/6 my-40", @@ -121,25 +122,25 @@ const FilePreviewDialog = (props: FilePreviewProps) => { {[ [ t("Zoom In"), - "magnifying-glass-plus", + "l-search-plus", handleZoomIn, file_state.zoom === zoom_values.length, ], [ t("Zoom Out"), - "magnifying-glass-minus", + "l-search-minus", handleZoomOut, file_state.zoom === 1, ], [ t("Rotate Left"), - "rotate-left", + "l-corner-up-left", () => handleRotate(-90), false, ], [ t("Rotate Right"), - "rotate-right", + "l-corner-up-right", () => handleRotate(90), false, ], @@ -150,7 +151,10 @@ const FilePreviewDialog = (props: FilePreviewProps) => { className="z-50 rounded bg-white/60 px-4 py-2 text-black backdrop-blur transition hover:bg-white/70" disabled={button[3] as boolean} > - + {button[0] as string} ))} @@ -164,7 +168,10 @@ const FilePreviewDialog = (props: FilePreviewProps) => { download={`${file_state.name}.${file_state.extension}`} className="z-50 rounded bg-white/60 px-4 py-2 text-black backdrop-blur transition hover:bg-white/70" > - + Download )} @@ -172,7 +179,7 @@ const FilePreviewDialog = (props: FilePreviewProps) => { onClick={onClose} className="z-50 rounded bg-white/60 px-4 py-2 text-black backdrop-blur transition hover:bg-white/70" > - + Close diff --git a/src/Components/Common/PageTitle.tsx b/src/Components/Common/PageTitle.tsx index 65091b9f315..4f29ca892e3 100644 --- a/src/Components/Common/PageTitle.tsx +++ b/src/Components/Common/PageTitle.tsx @@ -3,6 +3,7 @@ import Breadcrumbs from "./Breadcrumbs"; import PageHeadTitle from "./PageHeadTitle"; import { classNames } from "../../Utils/utils"; import useAppHistory from "../../Common/hooks/useAppHistory"; +import CareIcon from "../../CAREUI/icons/CareIcon"; export interface PageTitleProps { title: string; @@ -65,9 +66,10 @@ export default function PageTitle({ goBack(backUrl); }} > - - {" "} - + {" "} )}

{title}

diff --git a/src/Components/Common/Sidebar/Sidebar.tsx b/src/Components/Common/Sidebar/Sidebar.tsx index 1d43180a97a..747fa3949da 100644 --- a/src/Components/Common/Sidebar/Sidebar.tsx +++ b/src/Components/Common/Sidebar/Sidebar.tsx @@ -224,9 +224,10 @@ const ToggleShrink = ({ shrinked, toggle }: ToggleShrinkProps) => ( } transition-all duration-200 ease-in-out`} onClick={toggle} > - diff --git a/src/Components/Common/components/SwitchTabs.tsx b/src/Components/Common/components/SwitchTabs.tsx index 047dba53b4b..a7872d5a400 100644 --- a/src/Components/Common/components/SwitchTabs.tsx +++ b/src/Components/Common/components/SwitchTabs.tsx @@ -1,12 +1,21 @@ +import type { ReactNode } from "react"; +import { classNames } from "../../../Utils/utils"; + export default function SwitchTabs(props: { + className?: string; isTab2Active: boolean; onClickTab1: () => void; onClickTab2: () => void; - tab1: string; - tab2: string; + tab1: ReactNode; + tab2: ReactNode; }) { return ( -
+
void; onBlur?: () => void; }) { + props.tips = []; const { options, tips, value, setValue } = props; const [open, setOpen] = useState(false); @@ -77,7 +79,7 @@ export function PrescriptionDropdown(props: { {tips[option]} - + )}
diff --git a/src/Components/Common/prescription-builder/PrescriptionMultiselect.tsx b/src/Components/Common/prescription-builder/PrescriptionMultiselect.tsx index 6eae36a1233..4fd0e5bada9 100644 --- a/src/Components/Common/prescription-builder/PrescriptionMultiselect.tsx +++ b/src/Components/Common/prescription-builder/PrescriptionMultiselect.tsx @@ -1,5 +1,6 @@ import { useEffect, useRef, useState } from "react"; import { classNames } from "../../../Utils/utils"; +import CareIcon from "../../../CAREUI/icons/CareIcon"; export function PrescriptionMultiDropdown(props: { options: string[]; @@ -51,7 +52,7 @@ export function PrescriptionMultiDropdown(props: { ); }} > - +
); diff --git a/src/Components/CriticalCareRecording/CriticalCare__Index.res b/src/Components/CriticalCareRecording/CriticalCare__Index.res index 131b92df7e5..56bc5623264 100644 --- a/src/Components/CriticalCareRecording/CriticalCare__Index.res +++ b/src/Components/CriticalCareRecording/CriticalCare__Index.res @@ -11,17 +11,17 @@ let renderLine = (title, value) => { let renderIndicators = (title, value, isMin, isMax, minText, maxText) => { let indicator = if isMax { - {str(maxText)} + {str(maxText)} } else if isMin { - {str(minText)} + {str(minText)} } else { - {str("Normal")} + {str("Normal")} } diff --git a/src/Components/CriticalCareRecording/HemodynamicParameters/CriticalCare__HemodynamicParametersEditor.res b/src/Components/CriticalCareRecording/HemodynamicParameters/CriticalCare__HemodynamicParametersEditor.res index 1148706683b..829df2aa078 100644 --- a/src/Components/CriticalCareRecording/HemodynamicParameters/CriticalCare__HemodynamicParametersEditor.res +++ b/src/Components/CriticalCareRecording/HemodynamicParameters/CriticalCare__HemodynamicParametersEditor.res @@ -280,13 +280,13 @@ let make = (~hemodynamicParameter, ~updateCB, ~id, ~consultationId) => { send(SetResp(int_of_string(s)))} getLabel={getStatus(12.0, "Low", 16.0, "High")} - hasError={ValidationUtils.isInputInRangeInt(0, 70, state.resp)} + hasError={ValidationUtils.isInputInRangeInt(0, 150, state.resp)} />
diff --git a/src/Components/CriticalCareRecording/Pain/CriticalCare__PainEditor.res b/src/Components/CriticalCareRecording/Pain/CriticalCare__PainEditor.res index 9b4ec646ae8..da041231265 100644 --- a/src/Components/CriticalCareRecording/Pain/CriticalCare__PainEditor.res +++ b/src/Components/CriticalCareRecording/Pain/CriticalCare__PainEditor.res @@ -280,8 +280,9 @@ let renderBody = (state, send, title, partPaths, substr) => {
{switch selectedPart { | Some(p) => - getIntoView(Pain.regionToString(regionType), false) : _ => send(RemoveFromSelectedParts(p))} diff --git a/src/Components/CriticalCareRecording/PressureSore/CriticalCare__PressureSoreEditor.res b/src/Components/CriticalCareRecording/PressureSore/CriticalCare__PressureSoreEditor.res index 9b8f614f3ef..de3062edeb0 100644 --- a/src/Components/CriticalCareRecording/PressureSore/CriticalCare__PressureSoreEditor.res +++ b/src/Components/CriticalCareRecording/PressureSore/CriticalCare__PressureSoreEditor.res @@ -274,8 +274,9 @@ let renderBody = (state, send, title, partPaths, substr) => { {state.previewMode ? React.null :
{switch selectedPart { | Some(p) => - getIntoView(PressureSore.regionToString(regionType), false) : _ => send(RemoveFromSelectedParts(p))} diff --git a/src/Components/CriticalCareRecording/Recording/CriticalCare__Recording.res b/src/Components/CriticalCareRecording/Recording/CriticalCare__Recording.res index 0316430dcd3..2903ab3e406 100644 --- a/src/Components/CriticalCareRecording/Recording/CriticalCare__Recording.res +++ b/src/Components/CriticalCareRecording/Recording/CriticalCare__Recording.res @@ -35,10 +35,11 @@ let basicEditor = (~facilityId, ~patientId, ~consultationId, ~id) => { className={`rounded-lg border px-4 py-2 mt-4 mx-auto cursor-pointer flex justify-between items-center bg-green-100 border-green-500`} href={`/facility/${facilityId}/patient/${patientId}/consultation/${consultationId}/daily-rounds/${id}/update`}>
- + +
{str("Basic Editor")}
-
+
} let editorNameToString = editor => { @@ -67,8 +68,9 @@ let editorToggle = (editorName, state, send) => { : "bg-green-100 border-green-500"}`} onClick={_ => showEditor(editorName, send)}>
- @@ -81,8 +83,8 @@ let editorToggle = (editorName, state, send) => {
{Belt.Option.isNone(editorUpdated) - ? - : } + ? + : }
} diff --git a/src/Components/CriticalCareRecording/components/CriticalCare__InputGroupError.res b/src/Components/CriticalCareRecording/components/CriticalCare__InputGroupError.res index f4304cc9b4e..47b842e7e53 100644 --- a/src/Components/CriticalCareRecording/components/CriticalCare__InputGroupError.res +++ b/src/Components/CriticalCareRecording/components/CriticalCare__InputGroupError.res @@ -5,7 +5,7 @@ let make = (~message, ~active) => if active {
- + {message |> str}
} else { diff --git a/src/Components/DeathReport/DeathReport.tsx b/src/Components/DeathReport/DeathReport.tsx index 3901996e119..d4fd7d43f10 100644 --- a/src/Components/DeathReport/DeathReport.tsx +++ b/src/Components/DeathReport/DeathReport.tsx @@ -14,6 +14,7 @@ import { navigate } from "raviger"; import dayjs from "dayjs"; import useQuery from "../../Utils/request/useQuery"; import routes from "../../Redux/api"; +import CareIcon from "../../CAREUI/icons/CareIcon"; type DeathReport = { name?: string; @@ -140,13 +141,14 @@ export default function PrintDeathReport(props: { id: string }) { onClick={(_) => window.print()} className="btn btn-primary mr-2" > - Print Death Report + Print Death + Report
diff --git a/src/Components/ExternalResult/ExternalResultUpload.tsx b/src/Components/ExternalResult/ExternalResultUpload.tsx index a8f9e339254..2f5337a242b 100644 --- a/src/Components/ExternalResult/ExternalResultUpload.tsx +++ b/src/Components/ExternalResult/ExternalResultUpload.tsx @@ -146,7 +146,11 @@ export default function ExternalResultUpload() { target="_blank" download > - {" "} +
diff --git a/src/Components/ExternalResult/ResultItem.tsx b/src/Components/ExternalResult/ResultItem.tsx index 0954f704176..88f906a220c 100644 --- a/src/Components/ExternalResult/ResultItem.tsx +++ b/src/Components/ExternalResult/ResultItem.tsx @@ -7,6 +7,7 @@ import ConfirmDialog from "../Common/ConfirmDialog"; import useQuery from "../../Utils/request/useQuery"; import routes from "../../Redux/api"; import request from "../../Utils/request/request"; +import CareIcon from "../../CAREUI/icons/CareIcon.js"; const Loading = lazy(() => import("../Common/Loading")); @@ -63,14 +64,14 @@ export default function ResultItem(props: any) { navigate(`/external_results/${resultItemData.id}/update`) } > - + {t("update_record")} diff --git a/src/Components/ExternalResult/ResultList.tsx b/src/Components/ExternalResult/ResultList.tsx index 82a49e3a8e3..88a385394aa 100644 --- a/src/Components/ExternalResult/ResultList.tsx +++ b/src/Components/ExternalResult/ResultList.tsx @@ -115,8 +115,9 @@ export default function ResultList() { className="inline-flex h-full items-center rounded-full border bg-white px-3 py-1 text-xs font-medium leading-4 text-gray-600" > {`${key}: ${value.name}`} - paramKey === "local_bodies" ? removeLSGFilter(paramKey, value.id) @@ -124,7 +125,7 @@ export default function ResultList() { ? removeWardFilter(paramKey, value.id) : null } - > + />
) ); diff --git a/src/Components/Facility/AssetCreate.tsx b/src/Components/Facility/AssetCreate.tsx index 0c422d1f646..eba5d89a0b3 100644 --- a/src/Components/Facility/AssetCreate.tsx +++ b/src/Components/Facility/AssetCreate.tsx @@ -4,6 +4,7 @@ import { AssetClass, AssetType } from "../Assets/AssetTypes"; import { Cancel, Submit } from "../Common/components/ButtonV2"; import { LegacyRef, + MutableRefObject, RefObject, createRef, lazy, @@ -12,7 +13,7 @@ import { useState, } from "react"; -import CareIcon from "../../CAREUI/icons/CareIcon"; +import CareIcon, { IconName } from "../../CAREUI/icons/CareIcon"; import { FieldErrorText, FieldLabel } from "../Form/FormFields/FormField"; import { LocationSelect } from "../Common/LocationSelect"; import Page from "../Common/components/Page"; @@ -132,19 +133,25 @@ const AssetCreate = (props: AssetProps) => { const [warrantyDetailsVisible, warrantyDetailsRef] = useVisibility(-300); const [serviceDetailsVisible, serviceDetailsRef] = useVisibility(-300); - const sections = { + const sections: { + [key in AssetFormSection]: { + icon: IconName; + isVisible: boolean; + ref: MutableRefObject; + }; + } = { "General Details": { - iconClass: "fa-solid fa-circle-info", + icon: "l-info-circle", isVisible: generalDetailsVisible, ref: generalDetailsRef, }, "Warranty Details": { - iconClass: "fa-solid fa-barcode", + icon: "l-qrcode-scan", isVisible: warrantyDetailsVisible, ref: warrantyDetailsRef, }, "Service Details": { - iconClass: "fas fa-tools", + icon: "l-wrench", isVisible: serviceDetailsVisible, ref: serviceDetailsRef, }, @@ -393,7 +400,7 @@ const AssetCreate = (props: AssetProps) => { className="btn-primary btn mt-5" onClick={() => navigate(`/facility/${facilityId}/location/add`)} > - + {t("add_location")} @@ -408,7 +415,7 @@ const AssetCreate = (props: AssetProps) => { onClick={() => setIsScannerActive(false)} className="btn btn-default mb-2" > - + {t("close_scanner")} { className="col-span-6 -ml-2 mb-6 flex flex-row items-center" ref={section.ref as LegacyRef} > - + @@ -483,7 +490,7 @@ const AssetCreate = (props: AssetProps) => { setCurrentSection(sectionTitle as AssetFormSection); }} > - + {sectionTitle} ); diff --git a/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx b/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx index 56aadcadbdb..949f2f77895 100644 --- a/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx +++ b/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx @@ -13,6 +13,8 @@ import Chip from "../../../CAREUI/display/Chip"; import { formatAge, formatDate, formatDateTime } from "../../../Utils/utils"; import ReadMore from "../../Common/components/Readmore"; import DailyRoundsList from "../Consultations/DailyRoundsList"; +import EventsList from "./Events/EventsList"; +import SwitchTabs from "../../Common/components/SwitchTabs"; import { getVitalsMonitorSocketUrl } from "../../VitalsMonitor/utils"; const PageTitle = lazy(() => import("../../Common/PageTitle")); @@ -23,6 +25,7 @@ export const ConsultationUpdatesTab = (props: ConsultationTabProps) => { const [ventilatorSocketUrl, setVentilatorSocketUrl] = useState(); const [monitorBedData, setMonitorBedData] = useState(); const [ventilatorBedData, setVentilatorBedData] = useState(); + const [showEvents, setShowEvents] = useState(false); const vitals = useVitalsAspectRatioConfig({ default: undefined, @@ -665,7 +668,26 @@ export const ConsultationUpdatesTab = (props: ConsultationTabProps) => {
- + + Events + + beta + +
+ } + tab1="Daily Rounds" + onClickTab1={() => setShowEvents(false)} + onClickTab2={() => setShowEvents(true)} + isTab2Active={showEvents} + /> + {showEvents ? ( + + ) : ( + + )} diff --git a/src/Components/Facility/ConsultationDetails/Events/EventsList.tsx b/src/Components/Facility/ConsultationDetails/Events/EventsList.tsx new file mode 100644 index 00000000000..36991333888 --- /dev/null +++ b/src/Components/Facility/ConsultationDetails/Events/EventsList.tsx @@ -0,0 +1,72 @@ +import { useTranslation } from "react-i18next"; +import { useSlugs } from "../../../../Common/hooks/useSlug"; +import PaginatedList from "../../../../CAREUI/misc/PaginatedList"; +import routes from "../../../../Redux/api"; +import { TimelineNode } from "../../../../CAREUI/display/Timeline"; +import LoadingLogUpdateCard from "../../Consultations/DailyRounds/LoadingCard"; +import GenericEvent from "./GenericEvent"; +import { EventGeneric } from "./types"; +import { getEventIcon } from "./iconMap"; + +export default function EventsList() { + const [consultationId] = useSlugs("consultation"); + const { t } = useTranslation(); + + return ( + + {() => ( + <> +
+
+ + + {t("no_consultation_updates")} + + + + + + className="flex grow flex-col gap-3"> + {(item, items) => ( + + text[0].toUpperCase() + text.toLowerCase().slice(1) + ) + .join(" ") + " Event" + } + event={{ + type: item.change_type.replace(/_/g, " ").toLowerCase(), + timestamp: item.created_date?.toString() ?? "", + by: item.caused_by, + icon: getEventIcon(item.event_type.name), + }} + isLast={items.indexOf(item) == items.length - 1} + > + {(() => { + switch (item.event_type.name) { + case "INTERNAL_TRANSFER": + case "CLINICAL": + case "DIAGNOSIS": + case "ENCOUNTER_SUMMARY": + case "HEALTH": + default: + return ; + } + })()} + + )} + +
+ +
+
+
+ + )} +
+ ); +} diff --git a/src/Components/Facility/ConsultationDetails/Events/GenericEvent.tsx b/src/Components/Facility/ConsultationDetails/Events/GenericEvent.tsx new file mode 100644 index 00000000000..4296bd4c34b --- /dev/null +++ b/src/Components/Facility/ConsultationDetails/Events/GenericEvent.tsx @@ -0,0 +1,90 @@ +import type { ReactNode } from "react"; +import { EventGeneric } from "./types"; + +interface IProps { + event: EventGeneric; +} + +/** + * object - array, date + */ + +const formatValue = (value: unknown, key?: string): ReactNode => { + if (value === undefined || value === null) { + return "N/A"; + } + + if (typeof value === "boolean") { + return value ? "Yes" : "No"; + } + + if (typeof value === "number") { + return value; + } + + if (typeof value === "string") { + const trimmed = value.trim(); + + if (trimmed === "") { + return "Empty"; + } + + if (!isNaN(Number(trimmed))) { + return trimmed; + } + + if (new Date(trimmed).toString() !== "Invalid Date") { + return new Date(trimmed).toLocaleString(); + } + + return trimmed; + } + + if (typeof value === "object") { + if (Array.isArray(value)) { + if (value.length === 0) { + return `No ${key?.replace(/_/g, " ")}`; + } + + return value.map((v) => formatValue(v, key)).join(", "); + } + + if (value instanceof Date) { + return value.toLocaleString(); + } + + if (Object.entries(value).length === 0) { + return `No ${key?.replace(/_/g, " ")}`; + } + + return Object.entries(value).map(([key, value]) => ( +
+ + {key.replace(/_/g, " ")} + + + {formatValue(value, key)} + +
+ )); + } + + return JSON.stringify(value); +}; + +export default function GenericEvent({ event }: IProps) { + return ( +
+ {Object.entries(event.value).map(([key, value]) => ( +
+ + {key.replace(/_/g, " ")} + + + {formatValue(value, key)} + +
+ ))} +
+ ); +} diff --git a/src/Components/Facility/ConsultationDetails/Events/iconMap.ts b/src/Components/Facility/ConsultationDetails/Events/iconMap.ts new file mode 100644 index 00000000000..edf097def22 --- /dev/null +++ b/src/Components/Facility/ConsultationDetails/Events/iconMap.ts @@ -0,0 +1,13 @@ +import { IconName } from "../../../../CAREUI/icons/CareIcon"; + +const eventIconMap: Record = { + INTERNAL_TRANSFER: "l-exchange-alt", + CLINICAL: "l-stethoscope", + DIAGNOSIS: "l-tablets", + ENCOUNTER_SUMMARY: "l-file-medical-alt", + HEALTH: "l-heartbeat", +}; + +export const getEventIcon = (eventType: string): IconName => { + return eventIconMap[eventType] || "l-robot"; +}; diff --git a/src/Components/Facility/ConsultationDetails/Events/types.ts b/src/Components/Facility/ConsultationDetails/Events/types.ts new file mode 100644 index 00000000000..f5cf3c9abec --- /dev/null +++ b/src/Components/Facility/ConsultationDetails/Events/types.ts @@ -0,0 +1,30 @@ +import { UserBareMinimum } from "../../../Users/models"; + +export type Type = { + id: number; + parent: number | null; + name: string; + description: string | null; + model: string; + fields: string[]; +}; + +export type CausedBy = UserBareMinimum; + +export type EventGeneric = { + id: string; + event_type: Type; + created_date: string; + object_model: string; + object_id: number; + is_latest: boolean; + meta: { + external_id: string; + }; + value: Record; + change_type: "CREATED" | "UPDATED" | "DELETED"; + consultation: number; + caused_by: UserBareMinimum; +}; + +// TODO: Once event types are finalized, define specific types for each event diff --git a/src/Components/Facility/Consultations/Beds.tsx b/src/Components/Facility/Consultations/Beds.tsx index 518121e6e69..32023bc9f5f 100644 --- a/src/Components/Facility/Consultations/Beds.tsx +++ b/src/Components/Facility/Consultations/Beds.tsx @@ -225,7 +225,7 @@ const Beds = (props: BedsProps) => {
- + Move to bed
diff --git a/src/Components/Facility/Consultations/DailyRoundsList.tsx b/src/Components/Facility/Consultations/DailyRoundsList.tsx index 0d569eade41..76d48ec86ba 100644 --- a/src/Components/Facility/Consultations/DailyRoundsList.tsx +++ b/src/Components/Facility/Consultations/DailyRoundsList.tsx @@ -6,7 +6,6 @@ import { useTranslation } from "react-i18next"; import LoadingLogUpdateCard from "./DailyRounds/LoadingCard"; import routes from "../../../Redux/api"; import PaginatedList from "../../../CAREUI/misc/PaginatedList"; -import PageTitle from "../../Common/PageTitle"; import DailyRoundsFilter from "./DailyRoundsFilter"; import { ConsultationModel } from "../models"; import { useSlugs } from "../../../Common/hooks/useSlug"; @@ -34,8 +33,7 @@ export default function DailyRoundsList({ consultation }: Props) { > {() => ( <> -
- +
{ setQuery(query); @@ -43,7 +41,7 @@ export default function DailyRoundsList({ consultation }: Props) { />
-
+
diff --git a/src/Components/Facility/Consultations/LiveFeed.tsx b/src/Components/Facility/Consultations/LiveFeed.tsx index 8cf3d00836b..3cd731c6253 100644 --- a/src/Components/Facility/Consultations/LiveFeed.tsx +++ b/src/Components/Facility/Consultations/LiveFeed.tsx @@ -586,13 +586,13 @@ const LiveFeed = (props: any) => { onClick={() => setToUpdate(preset)} className="flex w-1/2 items-center justify-center gap-2 bg-green-200 py-1 text-sm text-green-800 hover:bg-green-800 hover:text-green-200 " > - +
@@ -610,7 +610,7 @@ const LiveFeed = (props: any) => { setPresetsPage(presetsPage - 10); }} > - +
) : ( @@ -631,7 +631,7 @@ const LiveFeed = (props: any) => { handlePagination(page.offset - page.limit); }} > - +
)} diff --git a/src/Components/Facility/DoctorVideoSlideover.tsx b/src/Components/Facility/DoctorVideoSlideover.tsx index c2cd94e0ded..6457d4d42bc 100644 --- a/src/Components/Facility/DoctorVideoSlideover.tsx +++ b/src/Components/Facility/DoctorVideoSlideover.tsx @@ -4,7 +4,7 @@ import SlideOver from "../../CAREUI/interactive/SlideOver"; import { getFacilityUsers } from "../../Redux/actions"; import { UserAssignedModel } from "../Users/models"; import { SkillObjectModel } from "../Users/models"; -import CareIcon from "../../CAREUI/icons/CareIcon"; +import CareIcon, { IconName } from "../../CAREUI/icons/CareIcon"; import { relativeTime } from "../../Utils/utils"; import useAuthUser from "../../Common/hooks/useAuthUser"; import { triggerGoal } from "../../Integrations/Plausible"; @@ -108,8 +108,8 @@ export default function DoctorVideoSlideover(props: { function UserListItem(props: { user: UserAssignedModel }) { const user = props.user; - const icon = - user.user_type === "Doctor" ? "fa-user-doctor " : " fa-user-nurse"; + const icon: IconName = + user.user_type === "Doctor" ? "l-user-md" : "l-user-nurse"; const authUser = useAuthUser(); return ( @@ -145,9 +145,9 @@ function UserListItem(props: { user: UserAssignedModel }) { // Show online icon based on last_login user.last_login && Number(new Date()) - Number(new Date(user.last_login)) < 60000 ? ( - + ) : ( - + ) }
diff --git a/src/Components/Facility/FacilityBedCapacity.tsx b/src/Components/Facility/FacilityBedCapacity.tsx index 30d67bfcf33..2f7e5217fba 100644 --- a/src/Components/Facility/FacilityBedCapacity.tsx +++ b/src/Components/Facility/FacilityBedCapacity.tsx @@ -8,6 +8,7 @@ import ButtonV2 from "../Common/components/ButtonV2"; import { BedCapacity } from "./BedCapacity"; import BedTypeCard from "./BedTypeCard"; import useConfig from "../../Common/hooks/useConfig"; +import CareIcon from "../../CAREUI/icons/CareIcon"; export const FacilityBedCapacity = (props: any) => { const [bedCapacityModalOpen, setBedCapacityModalOpen] = useState(false); @@ -92,7 +93,7 @@ export const FacilityBedCapacity = (props: any) => { onClick={() => setBedCapacityModalOpen(true)} authorizeFor={NonReadOnlyUsers} > - + Add More Bed Types diff --git a/src/Components/Facility/FacilityCard.tsx b/src/Components/Facility/FacilityCard.tsx index 8e8dd6da601..6305fec69cf 100644 --- a/src/Components/Facility/FacilityCard.tsx +++ b/src/Components/Facility/FacilityCard.tsx @@ -61,7 +61,10 @@ export const FacilityCard = (props: { facility: any; userType: any }) => { className="h-full max-h-32 w-full object-cover" /> )) || ( - + )} @@ -79,7 +82,10 @@ export const FacilityCard = (props: { facility: any; userType: any }) => { className="h-full w-full rounded-md object-cover" /> )) || ( - + )}
diff --git a/src/Components/Facility/FacilityDoctorList.tsx b/src/Components/Facility/FacilityDoctorList.tsx index fddc1973aa3..efff861d2b7 100644 --- a/src/Components/Facility/FacilityDoctorList.tsx +++ b/src/Components/Facility/FacilityDoctorList.tsx @@ -9,6 +9,7 @@ import routes from "../../Redux/api"; import { DoctorModal } from "./models"; import DoctorsCountCard from "./DoctorsCountCard"; import { DoctorIcon } from "../TeleIcu/Icons/DoctorIcon"; +import CareIcon from "../../CAREUI/icons/CareIcon"; export const FacilityDoctorList = (props: any) => { const [doctorCapacityModalOpen, setDoctorCapacityModalOpen] = useState(false); @@ -94,7 +95,7 @@ export const FacilityDoctorList = (props: any) => { disabled={doctorList.length === DOCTOR_SPECIALIZATION.length} authorizeFor={NonReadOnlyUsers} > - + Add Doctor Types
diff --git a/src/Components/Facility/FacilityHome.tsx b/src/Components/Facility/FacilityHome.tsx index 4b4754b894c..4120f4a5469 100644 --- a/src/Components/Facility/FacilityHome.tsx +++ b/src/Components/Facility/FacilityHome.tsx @@ -108,7 +108,7 @@ export const FacilityHome = (props: any) => { id="facility-coverimage" className="absolute right-0 top-0 z-10 flex h-full w-full flex-col items-center justify-center bg-black text-sm text-gray-300 opacity-0 transition-[opacity] hover:opacity-60 md:h-[88px]" > - + {`${hasCoverImage ? "Edit" : "Upload"}`} ); @@ -171,10 +171,11 @@ export const FacilityHome = (props: any) => { hasPermissionToEditCoverImage && setEditCoverImage(true) } > - + /> {editCoverImageTooltip} )} diff --git a/src/Components/Facility/FacilityHomeTriage.tsx b/src/Components/Facility/FacilityHomeTriage.tsx index ba1cd199044..41bf40a4904 100644 --- a/src/Components/Facility/FacilityHomeTriage.tsx +++ b/src/Components/Facility/FacilityHomeTriage.tsx @@ -3,6 +3,7 @@ import ButtonV2 from "../Common/components/ButtonV2"; import Table from "../Common/components/Table"; import useQuery from "../../Utils/request/useQuery"; import routes from "../../Redux/api"; +import CareIcon from "../../CAREUI/icons/CareIcon"; export const FacilityHomeTriage = (props: any) => { const triageQuery = useQuery(routes.getTriage, { @@ -58,7 +59,10 @@ export const FacilityHomeTriage = (props: any) => { onClick={() => navigate(`/facility/${props.facilityId}/triage`)} authorizeFor={props.NonReadOnlyUsers} > - + Add Triage diff --git a/src/Components/Facility/FacilityUsers.tsx b/src/Components/Facility/FacilityUsers.tsx index f18b9578192..2985649a543 100644 --- a/src/Components/Facility/FacilityUsers.tsx +++ b/src/Components/Facility/FacilityUsers.tsx @@ -301,13 +301,6 @@ export default function FacilityUsers(props: any) { className="mt-2 flex gap-3 text-2xl font-bold capitalize" > {`${user.first_name} ${user.last_name}`} - - {user.last_login && isUserOnline(user) ? ( - - ) : null} {showUserDelete(authUser, user) && (
import("../Common/Loading")); @@ -139,7 +140,7 @@ export const HospitalList = () => { className="border-grey-500 mt-4 cursor-pointer whitespace-nowrap rounded-md border bg-white p-16 text-center text-sm font-semibold shadow hover:bg-gray-300" onClick={() => navigate("/facility/create")} > - +
{t("create_facility")}
{t("no_duplicate_facility")} diff --git a/src/Components/Facility/InventoryLog.tsx b/src/Components/Facility/InventoryLog.tsx index 474de009f76..96dd564d53c 100644 --- a/src/Components/Facility/InventoryLog.tsx +++ b/src/Components/Facility/InventoryLog.tsx @@ -94,7 +94,10 @@ export default function InventoryLog(props: any) { {inventoryItem.quantity_in_default_unit}{" "} {inventoryItem.item_object?.default_unit?.name} {inventoryItem.probable_accident && ( - + )}

diff --git a/src/Components/Facility/Investigations/InvestigationSuggestions.tsx b/src/Components/Facility/Investigations/InvestigationSuggestions.tsx index 4d614d224e6..3be01b5d7e8 100644 --- a/src/Components/Facility/Investigations/InvestigationSuggestions.tsx +++ b/src/Components/Facility/Investigations/InvestigationSuggestions.tsx @@ -128,7 +128,7 @@ export default function ViewInvestigationSuggestions(props: { {type} {investigationMissed && (
- +
Investigation Missed!
@@ -136,7 +136,7 @@ export default function ViewInvestigationSuggestions(props: { )} {investigated && !investigationMissed && (
- +
Investigation Recorded
diff --git a/src/Components/Facility/LocationManagement.tsx b/src/Components/Facility/LocationManagement.tsx index f296f4d0bbd..985d6a029fe 100644 --- a/src/Components/Facility/LocationManagement.tsx +++ b/src/Components/Facility/LocationManagement.tsx @@ -211,16 +211,13 @@ const Location = ({ }: LocationProps) => (
-
-
-

+

+
+

{name}

diff --git a/src/Components/Facility/PatientNotesSlideover.tsx b/src/Components/Facility/PatientNotesSlideover.tsx index 8943d7fe21a..2e04312d277 100644 --- a/src/Components/Facility/PatientNotesSlideover.tsx +++ b/src/Components/Facility/PatientNotesSlideover.tsx @@ -12,6 +12,8 @@ import routes from "../../Redux/api"; import { PatientNoteStateType } from "./models"; import useKeyboardShortcut from "use-keyboard-shortcut"; import AutoExpandingTextInputFormField from "../Form/FormFields/AutoExpandingTextInputFormField.js"; +import * as Sentry from "@sentry/browser"; +import useAuthUser from "../../Common/hooks/useAuthUser"; interface PatientNotesProps { patientId: string; @@ -26,6 +28,33 @@ export default function PatientNotesSlideover(props: PatientNotesProps) { const [reload, setReload] = useState(false); const [focused, setFocused] = useState(false); + const { username } = useAuthUser(); + + const intialSubscriptionState = async () => { + try { + const res = await request(routes.getUserPnconfig, { + pathParams: { username }, + }); + const reg = await navigator.serviceWorker.ready; + const subscription = await reg.pushManager.getSubscription(); + if (!subscription && !res.data?.pf_endpoint) { + Notification.Warn({ + msg: "Please subscribe to notifications to get live updates on doctor notes.", + }); + } else if (subscription?.endpoint !== res.data?.pf_endpoint) { + Notification.Warn({ + msg: "Please subscribe to notifications on this device to get live updates on doctor notes.", + }); + } + } catch (error) { + Sentry.captureException(error); + } + }; + + useEffect(() => { + intialSubscriptionState(); + }, []); + const initialData: PatientNoteStateType = { notes: [], cPage: 1, diff --git a/src/Components/Facility/TreatmentSummary.tsx b/src/Components/Facility/TreatmentSummary.tsx index b6caebc750e..b55c86216a7 100644 --- a/src/Components/Facility/TreatmentSummary.tsx +++ b/src/Components/Facility/TreatmentSummary.tsx @@ -4,6 +4,7 @@ import useSlug from "../../Common/hooks/useSlug"; import useAppHistory from "../../Common/hooks/useAppHistory"; import routes from "../../Redux/api"; import useQuery from "../../Utils/request/useQuery"; +import CareIcon from "../../CAREUI/icons/CareIcon"; const TreatmentSummary = (props: any) => { const { consultationId, patientId } = props; @@ -35,10 +36,10 @@ const TreatmentSummary = (props: any) => { onClick={(_) => window.print()} className="btn btn-primary mr-2" > - Print Treatment Summary + Print Treatment Summary

diff --git a/src/Components/HCX/misc.ts b/src/Components/HCX/misc.ts index 9476f19c081..dba0a290b85 100644 --- a/src/Components/HCX/misc.ts +++ b/src/Components/HCX/misc.ts @@ -1,9 +1,3 @@ -export interface PerformedByModel { - id: string; - first_name: string; - last_name: string; - username: string; - email: string; - user_type: string; - last_login: string; -} +import { UserBareMinimum } from "../Users/models"; + +export type PerformedByModel = UserBareMinimum; diff --git a/src/Components/Notifications/NotificationsList.tsx b/src/Components/Notifications/NotificationsList.tsx index 6066bf6c66b..1ce23dafdbc 100644 --- a/src/Components/Notifications/NotificationsList.tsx +++ b/src/Components/Notifications/NotificationsList.tsx @@ -4,7 +4,7 @@ import Spinner from "../Common/Spinner"; import { NOTIFICATION_EVENTS } from "../../Common/constants"; import { Error } from "../../Utils/Notifications.js"; import { classNames, formatDateTime } from "../../Utils/utils"; -import CareIcon from "../../CAREUI/icons/CareIcon"; +import CareIcon, { IconName } from "../../CAREUI/icons/CareIcon"; import * as Sentry from "@sentry/browser"; import { ShrinkedSidebarItem, @@ -73,8 +73,9 @@ const NotificationTile = ({ const getNotificationTitle = (id: string) => NOTIFICATION_EVENTS.find((notification) => notification.id === id)?.text; - const getNotificationIcon = (id: string) => - NOTIFICATION_EVENTS.find((notification) => notification.id === id)?.icon; + const getNotificationIcon = (id: string): IconName => + NOTIFICATION_EVENTS.find((notification) => notification.id === id)?.icon || + "default"; return (
{ @@ -93,7 +94,10 @@ const NotificationTile = ({ {getNotificationTitle(result.event)}
- +
{result.message}
@@ -479,13 +483,13 @@ export default function NotificationsList({
o.text} optionValue={(o) => o.id} - optionIcon={(o) => } + optionIcon={(o) => } onChange={(v) => setEventFilter(v || "")} />
diff --git a/src/Components/Patient/DailyRounds.tsx b/src/Components/Patient/DailyRounds.tsx index 56e26dff022..288d46f7359 100644 --- a/src/Components/Patient/DailyRounds.tsx +++ b/src/Components/Patient/DailyRounds.tsx @@ -575,7 +575,7 @@ export const DailyRounds = (props: any) => { label="Respiratory Rate" unit="bpm" start={0} - end={50} + end={150} step={1} thresholds={[ { diff --git a/src/Components/Patient/FileUpload.tsx b/src/Components/Patient/FileUpload.tsx index 77c67abeadd..4976bb0c91f 100644 --- a/src/Components/Patient/FileUpload.tsx +++ b/src/Components/Patient/FileUpload.tsx @@ -3,21 +3,12 @@ import CircularProgress from "../Common/components/CircularProgress"; import { useCallback, useState, - useEffect, useRef, lazy, ChangeEvent, + useEffect, } from "react"; -import { useDispatch } from "react-redux"; -import { statusType, useAbortableEffect } from "../../Common/utils"; -import { - viewUpload, - retrieveUpload, - createUpload, - getPatient, - editUpload, -} from "../../Redux/actions"; -import { FileUploadModel } from "./models"; +import { CreateFileResponse, FileUploadModel } from "./models"; import * as Notification from "../../Utils/Notifications.js"; import { VoiceRecorder } from "../../Utils/VoiceRecorder"; import Pagination from "../Common/Pagination"; @@ -39,6 +30,9 @@ import AuthorizedChild from "../../CAREUI/misc/AuthorizedChild"; import Page from "../Common/components/Page"; import FilePreviewDialog from "../Common/FilePreviewDialog"; import useAuthUser from "../../Common/hooks/useAuthUser"; +import useQuery from "../../Utils/request/useQuery"; +import routes from "../../Redux/api"; +import request from "../../Utils/request/request"; const Loading = lazy(() => import("../Common/Loading")); @@ -145,7 +139,6 @@ export const FileUpload = (props: FileUploadProps) => { claimId, } = props; const id = patientId; - const dispatch: any = useDispatch(); const [isLoading, setIsLoading] = useState(false); const [uploadedArchievedFiles, setuploadedArchievedFiles] = useState< Array @@ -157,7 +150,6 @@ export const FileUpload = (props: FileUploadProps) => { useState>([{}]); const [uploadStarted, setUploadStarted] = useState(false); const [audiouploadStarted, setAudioUploadStarted] = useState(false); - const [reload, setReload] = useState(false); const [uploadPercent, setUploadPercent] = useState(0); const [uploadFileName, setUploadFileName] = useState(""); const [uploadFileError, setUploadFileError] = useState(""); @@ -204,8 +196,6 @@ export const FileUpload = (props: FileUploadProps) => { const [totalDischargeSummaryFilesCount, setTotalDischargeSummaryFilesCount] = useState(0); const [offset, setOffset] = useState(0); - const [facilityName, setFacilityName] = useState(""); - const [patientName, setPatientName] = useState(""); const [modalOpenForEdit, setModalOpenForEdit] = useState(false); const [modalOpenForCamera, setModalOpenForCamera] = useState(false); const [modalOpenForArchive, setModalOpenForArchive] = useState(false); @@ -219,28 +209,15 @@ export const FileUpload = (props: FileUploadProps) => { const [sortFileState, setSortFileState] = useState("UNARCHIVED"); const authUser = useAuthUser(); const limit = RESULTS_PER_PAGE_LIMIT; - const [isActive, setIsActive] = useState(true); const [tabs, setTabs] = useState([ { name: "Unarchived Files", value: "UNARCHIVED" }, { name: "Archived Files", value: "ARCHIVED" }, ]); - useEffect(() => { - async function fetchPatientName() { - if (patientId) { - const res = await dispatch(getPatient({ id: patientId })); - if (res.data) { - setPatientName(res.data.name); - setFacilityName(res.data.facility_object.name); - setIsActive(res.data.is_active); - } - } else { - setPatientName(""); - setFacilityName(""); - } - } - fetchPatientName(); - }, [dispatch, patientId]); + const { data: patient } = useQuery(routes.getPatient, { + pathParams: { id: patientId }, + prefetch: !!patientId, + }); const captureImage = () => { setPreviewImage(webRef.current.getScreenshot()); @@ -298,104 +275,93 @@ export const FileUpload = (props: FileUploadProps) => { } }; - const fetchData = useCallback( - async (status: statusType) => { - setIsLoading(true); - const unarchivedFileData = { + const fetchData = useCallback(async () => { + setIsLoading(true); + + const unarchivedQuery = await request(routes.viewUpload, { + query: { file_type: type, associating_id: getAssociatedId(), is_archived: false, limit: limit, offset: offset, - }; - let res = await dispatch(viewUpload(unarchivedFileData)); - if (!status.aborted) { - if (res?.data) { - audio_urls(res.data.results); - setuploadedUnarchievedFiles( - res?.data?.results?.filter( - (file: FileUploadModel) => - file.upload_completed || file.file_category === "AUDIO" - ) - ); - setTotalUnarchievedFilesCount(res.data.count); - } - setIsLoading(false); - } - const archivedFileData = { + }, + }); + + if (unarchivedQuery.data) { + audio_urls(unarchivedQuery.data.results); + setuploadedUnarchievedFiles( + unarchivedQuery.data.results?.filter( + (file) => file.upload_completed || file.file_category === "AUDIO" + ) + ); + setTotalUnarchievedFilesCount(unarchivedQuery.data.count); + } + + const archivedQuery = await request(routes.viewUpload, { + query: { file_type: type, associating_id: getAssociatedId(), is_archived: true, limit: limit, offset: offset, - }; - res = await dispatch(viewUpload(archivedFileData)); - if (!status.aborted) { - if (res?.data) { - setuploadedArchievedFiles(res.data.results); - setTotalArchievedFilesCount(res.data.count); - } - setIsLoading(false); - } - if (type === "CONSULTATION") { - const dischargeSummaryFileData = { + }, + }); + + if (archivedQuery.data) { + setuploadedArchievedFiles(archivedQuery.data.results); + setTotalArchievedFilesCount(archivedQuery.data.count); + } + + if (type === "CONSULTATION") { + const dischargeSummaryQuery = await request(routes.viewUpload, { + query: { file_type: "DISCHARGE_SUMMARY", associating_id: getAssociatedId(), is_archived: false, limit: limit, offset: offset, - }; - res = await dispatch(viewUpload(dischargeSummaryFileData)); - if (!status.aborted) { - if (res?.data) { - setuploadedDischargeSummaryFiles(res.data.results); - setTotalDischargeSummaryFilesCount(res.data.count); - if (res?.data?.results?.length > 0) { - setTabs([ - ...tabs, - { - name: "Discharge Summary", - value: "DISCHARGE_SUMMARY", - }, - ]); - } - } + }, + }); + if (dischargeSummaryQuery.data) { + setuploadedDischargeSummaryFiles(dischargeSummaryQuery.data.results); + setTotalDischargeSummaryFilesCount(dischargeSummaryQuery.data.count); + if (dischargeSummaryQuery.data?.results?.length) { + setTabs([ + ...tabs, + { + name: "Discharge Summary", + value: "DISCHARGE_SUMMARY", + }, + ]); } - setIsLoading(false); } - }, - [dispatch, id, offset] - ); + } - // Store all audio urls for each audio file - const audio_urls = (files: any) => { - let audio_files = files || []; - audio_files = audio_files.filter( - (x: FileUploadModel) => x.file_category === "AUDIO" - ); + setIsLoading(false); + }, [id, offset]); - const getURL = async (audio_files: any) => { - const data = { file_type: type, associating_id: getAssociatedId() }; - const all_urls: any = {}; + useEffect(() => { + fetchData(); + }, [fetchData]); - for (const x of audio_files) { - if (x.id) { - const responseData = await dispatch(retrieveUpload(data, x.id)); - all_urls[`${x.id}`] = responseData.data.read_signed_url; - } - } - seturl(all_urls); - }; - getURL(audio_files); + // Store all audio urls for each audio file + const audio_urls = async (files: FileUploadModel[]) => { + const audioFiles = files.filter((x) => x.file_category === "AUDIO"); + const query = { file_type: type, associating_id: getAssociatedId() }; + const urls = await Promise.all( + audioFiles.map(async (file) => { + const id = file.id as string; + const { data } = await request(routes.retrieveUpload, { + query, + pathParams: { id: id as string }, + }); + return [id, data?.read_signed_url]; + }) + ); + seturl(Object.fromEntries(urls)); }; - useAbortableEffect( - (status: statusType) => { - fetchData(status); - }, - [dispatch, fetchData, id, reload] - ); - // Function to extract the extension of the file const getExtension = (url: string) => { const div1 = url.split("?")[0].split("."); @@ -404,6 +370,7 @@ export const FileUpload = (props: FileUploadProps) => { }; const getIconClassName = (extensionName: string | undefined) => { + if (!extensionName) return "l-file-medical"; // check for image files if ( [ @@ -421,9 +388,9 @@ export const FileUpload = (props: FileUploadProps) => { ".pjp", ".svg", ".webp", - ].some((ext) => ext === extensionName) + ].includes(extensionName) ) { - return "fa-solid fa-file-image"; + return "l-image"; } // check for video files if ( @@ -443,58 +410,46 @@ export const FileUpload = (props: FileUploadProps) => { ".qt", ".flv", ".swf", - ].some((ext) => ext === extensionName) + ].includes(extensionName) ) { - return "fa-solid fa-file-video"; - } - // check for compressed files - if (extensionName === ".zip" || extensionName === ".rar") { - return "fa-solid fa-file-zipper"; - } - // check for misclaneous files whose icons are available freely in fontawesome - if (extensionName === ".pdf") { - return "fa-solid fa-file-pdf"; - } - if (extensionName === ".docx") { - return "fa-solid fa-file-word"; - } - if (extensionName === ".csv") { - return "fa-solid fa-file-csv"; - } - if (extensionName === ".xlsx") { - return "fa-solid fa-file-excel"; - } - if (extensionName === ".txt") { - return "fa-solid fa-file-lines"; + return "l-video"; } + if (extensionName === ".pptx") { - return "fa-solid fa-file-powerpoint"; + return "l-presentation-play"; } - return "fa-solid fa-file-medical"; + return "l-file-medical"; }; - const loadFile = async (id: any) => { + const loadFile = async (id: string) => { setFileUrl(""); setFileState({ ...file_state, open: true }); - const data = { - file_type: sortFileState === "DISCHARGE_SUMMARY" ? sortFileState : type, - associating_id: getAssociatedId(), - }; - const responseData = await dispatch(retrieveUpload(data, id)); - const file_extension = getExtension(responseData.data.read_signed_url); - if (file_extension === "pdf") { - window.open(responseData.data.read_signed_url, "_blank"); + const { data } = await request(routes.retrieveUpload, { + query: { + file_type: sortFileState === "DISCHARGE_SUMMARY" ? sortFileState : type, + associating_id: getAssociatedId(), + }, + pathParams: { id }, + }); + + if (!data) return; + + const signedUrl = data.read_signed_url as string; + const extension = getExtension(signedUrl); + + if (extension === "pdf") { + window.open(signedUrl, "_blank"); setFileState({ ...file_state, open: false }); } else { setFileState({ ...file_state, open: true, - name: responseData.data.name, - extension: file_extension, - isImage: ExtImage.includes(file_extension), + name: data.name as string, + extension, + isImage: ExtImage.includes(extension), }); - downloadFileUrl(responseData.data.read_signed_url); - setFileUrl(responseData.data.read_signed_url); + downloadFileUrl(signedUrl); + setFileUrl(signedUrl); } }; @@ -518,63 +473,54 @@ export const FileUpload = (props: FileUploadProps) => { } }; - const partialupdateFileName = async (id: any, name: string) => { - const data = { - file_type: sortFileState === "DISCHARGE_SUMMARY" ? sortFileState : type, - name: name, - associating_id: getAssociatedId(), - }; - if (validateEditFileName(name)) { - const res = await dispatch( - editUpload({ name: data.name }, id, data.file_type, data.associating_id) - ); - if (res && res.status === 200) { - fetchData(res.status); - Notification.Success({ - msg: "File name changed successfully", - }); - setbtnloader(false); - setModalOpenForEdit(false); - } else { - setbtnloader(false); - } - } else { + const partialupdateFileName = async (id: string, name: string) => { + if (!validateEditFileName(name)) { setbtnloader(false); + return; } + + const fileType = + sortFileState === "DISCHARGE_SUMMARY" ? sortFileState : type; + + const { res } = await request(routes.editUpload, { + body: { name }, + pathParams: { + id, + fileType, + associatingId: getAssociatedId(), + }, + }); + + if (res?.ok) { + fetchData(); + Notification.Success({ msg: "File name changed successfully" }); + setModalOpenForEdit(false); + } + setbtnloader(false); }; - const archiveFile = async (id: any, archiveReason: string) => { - const data = { - file_type: type, - is_archived: true, - archive_reason: archiveReason, - associating_id: getAssociatedId(), - }; - if (validateArchiveReason(archiveReason)) { - const res = await dispatch( - editUpload( - { - is_archived: data.is_archived, - archive_reason: data.archive_reason, - }, - id, - data.file_type, - data.associating_id - ) - ); - if (res && res.status === 200) { - fetchData(res.status); - Notification.Success({ - msg: "File archived successfully", - }); - setbtnloader(false); - setModalOpenForArchive(false); - } else { - setbtnloader(false); - } - } else { + const archiveFile = async (id: string, archive_reason: string) => { + if (!validateArchiveReason(archiveReason)) { setbtnloader(false); + return; } + + const { res } = await request(routes.editUpload, { + body: { is_archived: true, archive_reason }, + pathParams: { + id, + fileType: type, + associatingId: getAssociatedId(), + }, + }); + + if (res?.ok) { + fetchData(); + Notification.Success({ msg: "File archived successfully" }); + setModalOpenForArchive(false); + } + + setbtnloader(false); }; const renderFileUpload = (item: FileUploadModel) => { @@ -590,7 +536,10 @@ export const FileUpload = (props: FileUploadProps) => {
- +
@@ -703,11 +652,10 @@ export const FileUpload = (props: FileUploadProps) => {
- +
@@ -739,7 +687,7 @@ export const FileUpload = (props: FileUploadProps) => {
{ - loadFile(item.id); + loadFile(item.id!); }} className="m-1 w-full sm:w-auto" > @@ -813,7 +761,10 @@ export const FileUpload = (props: FileUploadProps) => { /> - +
) : (
@@ -832,11 +783,10 @@ export const FileUpload = (props: FileUploadProps) => { /> - +
)}
@@ -932,9 +882,9 @@ export const FileUpload = (props: FileUploadProps) => { setFile(f); }; - const uploadfile = (response: any) => { - const url = response.data.signed_url; - const internal_name = response.data.internal_name; + const uploadfile = async (data: CreateFileResponse) => { + const url = data.signed_url; + const internal_name = data.internal_name; const f = file; if (!f) return; const newFile = new File([f], `${internal_name}`); @@ -951,6 +901,7 @@ export const FileUpload = (props: FileUploadProps) => { setUploadPercent(percentCompleted); }, }; + return new Promise((resolve, reject) => { axios .put(url, newFile, config) @@ -959,13 +910,12 @@ export const FileUpload = (props: FileUploadProps) => { // setUploadSuccess(true); setFile(null); setUploadFileName(""); - setReload(!reload); - fetchData({ aborted: false }); + fetchData(); Notification.Success({ msg: "File Uploaded Successfully", }); setUploadFileError(""); - resolve(response); + resolve(); }) .catch((e) => { Notification.Error({ @@ -994,18 +944,18 @@ export const FileUpload = (props: FileUploadProps) => { } return true; }; - const markUploadComplete = async (response: any) => { - return dispatch( - editUpload( - { upload_completed: true }, - response.data.id, - type, - getAssociatedId() - ) - ); + const markUploadComplete = (data: CreateFileResponse) => { + return request(routes.editUpload, { + body: { upload_completed: true }, + pathParams: { + id: data.id, + fileType: type, + associatingId: getAssociatedId(), + }, + }); }; - const handleUpload = async (status: any) => { + const handleUpload = async () => { if (!validateFileUpload()) return; const f = file; @@ -1013,24 +963,23 @@ export const FileUpload = (props: FileUploadProps) => { const filename = uploadFileName === "" && f ? f.name : uploadFileName; const name = f?.name; setUploadStarted(true); - // setUploadSuccess(false); - const requestData = { - original_name: name, - file_type: type, - name: filename, - associating_id: getAssociatedId(), - file_category: category, - mime_type: f?.type, - }; - dispatch(createUpload(requestData)) - .then(uploadfile) - .then(markUploadComplete) - .catch(() => { - setUploadStarted(false); - }) - .then(() => { - fetchData(status); - }); + + const { data } = await request(routes.createUpload, { + body: { + original_name: name, + file_type: type, + name: filename, + associating_id: getAssociatedId(), + file_category: category, + mime_type: f?.type, + }, + }); + + if (data) { + await uploadfile(data); + await markUploadComplete(data); + await fetchData(); + } }; const createAudioBlob = (createdBlob: Blob) => { @@ -1071,7 +1020,7 @@ export const FileUpload = (props: FileUploadProps) => { setAudioUploadStarted(false); // setUploadSuccess(true); setAudioName(""); - setReload(!reload); + fetchData(); Notification.Success({ msg: "File Uploaded Successfully", }); @@ -1102,16 +1051,17 @@ export const FileUpload = (props: FileUploadProps) => { const filename = audioName.trim().length === 0 ? Date.now().toString() : audioName.trim(); setAudioUploadStarted(true); - // setUploadSuccess(false); - const requestData = { - original_name: name, - file_type: type, - name: filename, - associating_id: getAssociatedId(), - file_category: category, - mime_type: audioBlob?.type, - }; - dispatch(createUpload(requestData)) + + request(routes.createUpload, { + body: { + original_name: name, + file_type: type, + name: filename, + associating_id: getAssociatedId(), + file_category: category, + mime_type: audioBlob?.type, + }, + }) .then(uploadAudiofile) .catch(() => { setAudioUploadStarted(false); @@ -1318,7 +1268,7 @@ export const FileUpload = (props: FileUploadProps) => { onSubmit={(event: any) => { event.preventDefault(); setbtnloader(true); - partialupdateFileName(modalDetails?.id, editFileName); + partialupdateFileName(modalDetails!.id!, editFileName); }} className="flex w-full flex-col" > @@ -1364,7 +1314,7 @@ export const FileUpload = (props: FileUploadProps) => { onSubmit={(event: any) => { event.preventDefault(); setbtnloader(true); - archiveFile(modalDetails?.id, archiveReason); + archiveFile(modalDetails!.id!, archiveReason); }} className="mx-2 my-4 flex w-full flex-col" > @@ -1433,8 +1383,8 @@ export const FileUpload = (props: FileUploadProps) => { hideBack={hideBack} breadcrumbs={false} crumbsReplacements={{ - [facilityId]: { name: facilityName }, - [patientId]: { name: patientName }, + [facilityId]: { name: patient?.facility_object?.name }, + [patientId]: { name: patient?.name }, }} backUrl={ type === "CONSULTATION" @@ -1558,8 +1508,12 @@ export const FileUpload = (props: FileUploadProps) => { handleUpload({ status })} + disabled={ + !file || + !uploadFileName || + (patient && !patient.is_active) + } + onClick={handleUpload} className="w-full" > @@ -1576,7 +1530,7 @@ export const FileUpload = (props: FileUploadProps) => { setUploadFileName(""); }} > - +
)} diff --git a/src/Components/Patient/ManagePatients.tsx b/src/Components/Patient/ManagePatients.tsx index 534a3e876a1..d853a5cf71a 100644 --- a/src/Components/Patient/ManagePatients.tsx +++ b/src/Components/Patient/ManagePatients.tsx @@ -511,7 +511,10 @@ export const PatientManager = () => {
) : (
- +
)}
diff --git a/src/Components/Patient/PatientHome.tsx b/src/Components/Patient/PatientHome.tsx index 22dc86117f4..1e74b1ac566 100644 --- a/src/Components/Patient/PatientHome.tsx +++ b/src/Components/Patient/PatientHome.tsx @@ -284,7 +284,7 @@ export const PatientHome = (props: any) => { target="_blank" rel="noreferrer" > - Video Call + Video Call )}

@@ -308,7 +308,7 @@ export const PatientHome = (props: any) => {

- + You have not created a consultation for the patient in{" "} {patientData.facility_object?.name || "-"} @@ -409,7 +409,10 @@ export const PatientHome = (props: any) => {

- + {patientData.facility_object?.name || "-"}

@@ -445,7 +448,7 @@ export const PatientHome = (props: any) => { className="text-sm font-normal text-sky-600 hover:text-sky-300" rel="noreferrer" > - Chat on WhatsApp + Chat on WhatsApp

@@ -470,7 +473,7 @@ export const PatientHome = (props: any) => { className="text-sm font-normal text-sky-600 hover:text-sky-300" rel="noreferrer" > - Chat on WhatsApp + Chat on WhatsApp
@@ -548,7 +551,7 @@ export const PatientHome = (props: any) => { : " bg-red-600/5 p-1 text-sm font-normal text-red-600") } > - +

{(dayjs().isBefore(patientData.review_time) ? "Review before: " @@ -616,7 +619,7 @@ export const PatientHome = (props: any) => { name="death_report" onClick={() => navigate(`/death_report/${id}`)} > - + Death Report

diff --git a/src/Components/Patient/PatientInfoCard.tsx b/src/Components/Patient/PatientInfoCard.tsx index 25683e1a461..fe6c7b64895 100644 --- a/src/Components/Patient/PatientInfoCard.tsx +++ b/src/Components/Patient/PatientInfoCard.tsx @@ -185,7 +185,10 @@ export default function PatientInfoCard(props: {
) : (
- +
)}
@@ -218,10 +221,11 @@ export default function PatientInfoCard(props: { href={`/facility/${consultation?.facility}`} className="mt-2 items-center justify-center text-sm font-semibold text-black hover:text-primary-600 lg:hidden" > - + /> {consultation?.facility_name}
@@ -234,10 +238,11 @@ export default function PatientInfoCard(props: { href={`/facility/${consultation?.facility}`} className="hidden font-semibold text-black hover:text-primary-600 lg:block" > - + /> {consultation?.facility_name} @@ -301,7 +306,7 @@ export default function PatientInfoCard(props: { : " bg-red-400 text-white") } > - + {dayjs().isBefore(patient.review_time) ? "Review before: " : "Review Missed: "} @@ -432,7 +437,10 @@ export default function PatientInfoCard(props: { {consultation?.treating_physician_object ? `${consultation?.treating_physician_object.first_name} ${consultation?.treating_physician_object.last_name}` : consultation?.deprecated_verified_by} - +
)}
@@ -531,7 +539,7 @@ export default function PatientInfoCard(props: { title={"Manage Patient"} icon={} className="xl:justify-center" - containerClassName="w-full lg:w-auto mt-2 2xl:mt-0 flex justify-center" + containerClassName="w-full lg:w-auto mt-2 2xl:mt-0 flex justify-center z-20" >
{[ diff --git a/src/Components/Patient/PatientRegister.tsx b/src/Components/Patient/PatientRegister.tsx index 2f18ef36dbb..c6b260efe87 100644 --- a/src/Components/Patient/PatientRegister.tsx +++ b/src/Components/Patient/PatientRegister.tsx @@ -1387,7 +1387,10 @@ export const PatientRegister = (props: PatientRegisterProps) => { /> {showAutoFilledPincode && (
- + State and District auto-filled from Pincode diff --git a/src/Components/Patient/UpdateStatusDialog.tsx b/src/Components/Patient/UpdateStatusDialog.tsx index 11f442b7a65..c302aa1b957 100644 --- a/src/Components/Patient/UpdateStatusDialog.tsx +++ b/src/Components/Patient/UpdateStatusDialog.tsx @@ -5,10 +5,8 @@ import { SAMPLE_TEST_RESULT, SAMPLE_FLOW_RULES, } from "../../Common/constants"; -import { SampleTestModel } from "./models"; +import { CreateFileResponse, SampleTestModel } from "./models"; import * as Notification from "../../Utils/Notifications.js"; -import { createUpload, editUpload } from "../../Redux/actions"; -import { useDispatch } from "react-redux"; import { header_content_type, LinearProgressWithLabel } from "./FileUpload"; import { Submit } from "../Common/components/ButtonV2"; import CareIcon from "../../CAREUI/icons/CareIcon"; @@ -18,6 +16,8 @@ import { FieldChangeEvent } from "../Form/FormFields/Utils"; import TextFormField from "../Form/FormFields/TextFormField"; import CheckBoxFormField from "../Form/FormFields/CheckBoxFormField"; import { useTranslation } from "react-i18next"; +import request from "../../Utils/request/request"; +import routes from "../../Redux/api"; interface Props { sample: SampleTestModel; @@ -62,7 +62,6 @@ const UpdateStatusDialog = (props: Props) => { const [uploadPercent, setUploadPercent] = useState(0); const [uploadStarted, setUploadStarted] = useState(false); const [uploadDone, setUploadDone] = useState(false); - const redux_dispatch: any = useDispatch(); const currentStatus = SAMPLE_TEST_STATUS.find( (i) => i.text === sample.status @@ -97,9 +96,10 @@ const UpdateStatusDialog = (props: Props) => { dispatch({ type: "set_form", form }); }; - const uploadfile = (response: any) => { - const url = response.data.signed_url; - const internal_name = response.data.internal_name; + const uploadfile = (data: CreateFileResponse) => { + const url = data.signed_url; + const internal_name = data.internal_name; + const f = file; if (f === undefined) return; const newFile = new File([f], `${internal_name}`); @@ -116,29 +116,27 @@ const UpdateStatusDialog = (props: Props) => { setUploadPercent(percentCompleted); }, }; + axios .put(url, newFile, config) .then(() => { setUploadStarted(false); setUploadDone(true); - redux_dispatch( - editUpload( - { upload_completed: true }, - response.data.id, - "SAMPLE_MANAGEMENT", - sample.id?.toString() ?? "" - ) - ); - Notification.Success({ - msg: "File Uploaded Successfully", + request(routes.editUpload, { + pathParams: { + id: data.id, + fileType: "SAMPLE_MANAGEMENT", + associatingId: sample.id?.toString() ?? "", + }, + body: { upload_completed: true }, }); + + Notification.Success({ msg: "File Uploaded Successfully" }); }) - .catch(() => { - setUploadStarted(false); - }); + .catch(() => setUploadStarted(false)); }; - const onFileChange = (e: React.ChangeEvent): any => { + const onFileChange = (e: React.ChangeEvent) => { if (e.target.files == null) { throw new Error("Error finding e.target.files"); } @@ -155,19 +153,21 @@ const UpdateStatusDialog = (props: Props) => { const name = f.name; setUploadStarted(true); setUploadDone(false); - const requestData = { - original_name: name, - file_type: "SAMPLE_MANAGEMENT", - name: `${sample.patient_name} Sample Report`, - associating_id: sample.id, - file_category: category, - mime_type: contentType, - }; - redux_dispatch(createUpload(requestData)) - .then(uploadfile) - .catch(() => { - setUploadStarted(false); - }); + + const { data } = await request(routes.createUpload, { + body: { + original_name: name, + file_type: "SAMPLE_MANAGEMENT", + name: `${sample.patient_name} Sample Report`, + associating_id: sample.id, + file_category: category, + mime_type: contentType, + }, + }); + + if (data) { + uploadfile(data); + } }; return ( diff --git a/src/Components/Patient/models.tsx b/src/Components/Patient/models.tsx index fc87bedcb14..05eb780069d 100644 --- a/src/Components/Patient/models.tsx +++ b/src/Components/Patient/models.tsx @@ -147,7 +147,7 @@ export interface SampleTestModel { is_unusual_course?: boolean; sample_type?: string; sample_type_other?: string; - id?: number; + id?: string; status?: string; result?: string; icmr_category?: string; @@ -337,16 +337,36 @@ export interface FacilityNameModel { // File Upload Models +type FileCategory = "UNSPECIFIED" | "XRAY" | "AUDIO" | "IDENTITY_PROOF"; + +export interface CreateFileRequest { + file_type: string; + file_category: FileCategory; + name: string; + associating_id: string; + original_name: string; + mime_type: string; +} + +export interface CreateFileResponse { + id: string; + file_type: string; + file_category: FileCategory; + signed_url: string; + internal_name: string; +} + export interface FileUploadModel { id?: string; name?: string; created_date?: string; upload_completed?: boolean; - uploaded_by?: { username?: string }; - file_category?: string; + uploaded_by?: PerformedByModel; + file_category?: FileCategory; + read_signed_url?: string; is_archived?: boolean; archive_reason?: string; extension?: string; - archived_by?: { username?: string }; + archived_by?: PerformedByModel; archived_datetime?: string; } diff --git a/src/Components/Resource/ListView.tsx b/src/Components/Resource/ListView.tsx index 05b2ce2f4bb..2cf8b9eb26d 100644 --- a/src/Components/Resource/ListView.tsx +++ b/src/Components/Resource/ListView.tsx @@ -77,7 +77,7 @@ export default function ListView() { title="Resource status" className="flex items-center text-sm font-medium leading-5 text-gray-500" > - +
{resource.status}
@@ -88,7 +88,7 @@ export default function ListView() { title=" Origin facility" className="flex items-center text-sm font-medium leading-5 text-gray-500" > - +
{(resource.origin_facility_object || {}).name}
@@ -99,7 +99,7 @@ export default function ListView() { title="Resource approving facility" className="flex items-center text-sm font-medium leading-5 text-gray-500" > - +
{(resource.approving_facility_object || {}).name}
@@ -110,7 +110,7 @@ export default function ListView() { title=" Assigned facility" className="flex items-center text-sm font-medium leading-5 text-gray-500" > - +
{(resource.assigned_facility_object || {}).name || @@ -131,7 +131,7 @@ export default function ListView() { : "rounded bg-red-400 p-1 text-white") } > - +
{formatDateTime(resource.modified_date) || "--"}
@@ -146,7 +146,7 @@ export default function ListView() { onClick={(_) => navigate(`/resource/${resource.id}`)} className="btn btn-default mr-2 w-full bg-white" > - All Details + All Details
@@ -204,7 +204,11 @@ export default function ListView() { className="text-xs hover:text-blue-800" onClick={() => refetch()} > - +
diff --git a/src/Components/Resource/ResourceBoard.tsx b/src/Components/Resource/ResourceBoard.tsx index 0f16391b9ab..0cedb5a46c7 100644 --- a/src/Components/Resource/ResourceBoard.tsx +++ b/src/Components/Resource/ResourceBoard.tsx @@ -11,6 +11,7 @@ import routes from "../../Redux/api"; import { PaginatedResponse } from "../../Utils/request/types"; import { IResource } from "./models"; import request from "../../Utils/request/request"; +import CareIcon from "../../CAREUI/icons/CareIcon"; interface boardProps { board: string; @@ -67,7 +68,7 @@ const ResourceCard = ({ resource }: any) => { title=" Origin facility" className="flex items-center text-sm font-medium leading-5 text-gray-500" > - +
{(resource.origin_facility_object || {}).name}
@@ -78,7 +79,7 @@ const ResourceCard = ({ resource }: any) => { title="Resource approving facility" className="flex items-center text-sm font-medium leading-5 text-gray-500" > - +
{(resource.approving_facility_object || {}).name}
@@ -90,7 +91,7 @@ const ResourceCard = ({ resource }: any) => { title=" Assigned facility" className="flex items-center text-sm font-medium leading-5 text-gray-500" > - +
{(resource.assigned_facility_object || {}).name || @@ -111,7 +112,7 @@ const ResourceCard = ({ resource }: any) => { : "rounded bg-red-400 p-1 text-white") } > - +
{formatDateTime(resource.modified_date) || "--"}
@@ -123,7 +124,7 @@ const ResourceCard = ({ resource }: any) => { title="Assigned to" className="flex items-center text-sm font-medium leading-5 text-gray-500" > - +
{resource.assigned_to_object.first_name}{" "} {resource.assigned_to_object.last_name} -{" "} @@ -140,7 +141,7 @@ const ResourceCard = ({ resource }: any) => { onClick={(_) => navigate(`/resource/${resource.id}`)} className="btn btn-default mr-2 w-full bg-white" > - All Details + All Details diff --git a/src/Components/Resource/ResourceDetails.tsx b/src/Components/Resource/ResourceDetails.tsx index c42cd79b8e5..952554c61ef 100644 --- a/src/Components/Resource/ResourceDetails.tsx +++ b/src/Components/Resource/ResourceDetails.tsx @@ -9,6 +9,7 @@ import ConfirmDialog from "../Common/ConfirmDialog"; import useQuery from "../../Utils/request/useQuery"; import routes from "../../Redux/api"; import request from "../../Utils/request/request"; +import CareIcon from "../../CAREUI/icons/CareIcon"; const Loading = lazy(() => import("../Common/Loading")); export default function ResourceDetails(props: { id: string }) { @@ -217,10 +218,11 @@ export default function ResourceDetails(props: { id: string }) {
window.print()}> - Print Approval Letter + Print + Approval Letter setIsPrintMode(false)} variant="secondary"> - Close + Close
{ApprovalLetter(data)} @@ -229,7 +231,8 @@ export default function ResourceDetails(props: { id: string }) {
setIsPrintMode(true)}> - Approval Letter + Approval + Letter
{data.assigned_to_object && ( diff --git a/src/Components/Shifting/ListView.tsx b/src/Components/Shifting/ListView.tsx index 45a484af933..228732f9ced 100644 --- a/src/Components/Shifting/ListView.tsx +++ b/src/Components/Shifting/ListView.tsx @@ -110,7 +110,7 @@ export default function ListView() { title={t("shifting_status")} className="flex items-center text-sm font-medium leading-5 text-gray-500" > - +
{shift.status}
@@ -121,7 +121,7 @@ export default function ListView() { title={t("phone_number")} className="flex items-center text-sm font-medium leading-5 text-gray-500" > - +
{shift.patient_object.phone_number || ""}
@@ -132,7 +132,7 @@ export default function ListView() { title={t("origin_facility")} className="flex items-center text-sm font-medium leading-5 text-gray-500" > - +
{(shift.origin_facility_object || {}).name}
@@ -144,7 +144,7 @@ export default function ListView() { title={t("shifting_approving_facility")} className="flex items-center text-sm font-medium leading-5 text-gray-500" > - +
{(shift.shifting_approving_facility_object || {}).name}
@@ -156,7 +156,7 @@ export default function ListView() { title={t("assigned_facility")} className="flex items-center text-sm font-medium leading-5 text-gray-500" > - +
{shift.assigned_facility_external || @@ -178,7 +178,7 @@ export default function ListView() { : "rounded bg-red-400 p-1 text-white") } > - +
{formatDateTime(shift.modified_date) || "--"}
@@ -190,7 +190,7 @@ export default function ListView() { title={t("patient_address")} className="flex items-center text-sm font-medium leading-5 text-gray-500" > - +
{shift.patient_object.address || "--"}
@@ -206,7 +206,7 @@ export default function ListView() { border className="w-full" > - {t("all_details")} + {t("all_details")} {shift.status === "COMPLETED" && shift.assigned_facility && ( @@ -298,7 +298,11 @@ export default function ListView() { className="text-xs hover:text-blue-800" onClick={() => fetchData()} > - +