From 59c596c611f04d2de0ebafd5a6e26f68d58fd758 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Thu, 19 Oct 2023 05:54:31 -0500 Subject: [PATCH 01/19] Updated deps --- .../ClientApp/package-lock.json | 230 +++++++++--------- src/Exceptionless.Web/ClientApp/package.json | 13 +- 2 files changed, 128 insertions(+), 115 deletions(-) diff --git a/src/Exceptionless.Web/ClientApp/package-lock.json b/src/Exceptionless.Web/ClientApp/package-lock.json index eaa3eccb9b..be2166ac9e 100644 --- a/src/Exceptionless.Web/ClientApp/package-lock.json +++ b/src/Exceptionless.Web/ClientApp/package-lock.json @@ -13,8 +13,9 @@ "@tanstack/svelte-table": "^8.10.7", "@web3-storage/parse-link-header": "^3.1.0", "class-validator": "^0.14.0", - "daisyui": "^3.9.2", + "daisyui": "^3.9.3", "oidc-client-ts": "^2.3.0", + "svelte-legos": "^0.2.2", "svelte-local-storage-store": "^0.6.4", "svelte-time": "^0.8.0", "tailwindcss": "^3.3.3", @@ -23,10 +24,10 @@ "devDependencies": { "@playwright/test": "^1.39.0", "@sveltejs/adapter-static": "^2.0.3", - "@sveltejs/kit": "^1.25.2", + "@sveltejs/kit": "^1.26.0", "@sveltejs/vite-plugin-svelte": "^2.4.6", - "@typescript-eslint/eslint-plugin": "^6.7.5", - "@typescript-eslint/parser": "^6.7.5", + "@typescript-eslint/eslint-plugin": "^6.8.0", + "@typescript-eslint/parser": "^6.8.0", "autoprefixer": "^10.4.16", "cross-env": "^7.0.3", "eslint": "^8.51.0", @@ -37,12 +38,12 @@ "prettier": "^3.0.3", "prettier-plugin-svelte": "^3.0.3", "prettier-plugin-tailwindcss": "^0.5.6", - "svelte": "^4.2.1", + "svelte": "^4.2.2", "svelte-check": "^3.5.2", "swagger-typescript-api": "^13.0.3", "tslib": "^2.6.2", "typescript": "^5.2.2", - "vite": "^4.4.11", + "vite": "^4.5.0", "vitest": "^0.34.6" } }, @@ -704,6 +705,15 @@ "integrity": "sha512-hmdFF4vVyvXosVdCCnZPCfrgwNPA79y3K5l0QzlKFcK5Qd3nkM9oGKcQYCTnTRWJXIV5SUMkkTFIEIdDFtxQPQ==", "dev": true }, + "node_modules/@fastify/busboy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", + "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.11", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", @@ -899,9 +909,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "1.25.2", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.25.2.tgz", - "integrity": "sha512-USuuSpdAPFDiLi58N2Pwd/TG9bcUSPAlzE5iaAXaLyCTWa3l36HDKH6nV5NqBybwfeux1ZwgtIeITLZJDJ6HDg==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.26.0.tgz", + "integrity": "sha512-CV/AlTziC05yrz7UjVqEd0pH6+2dnrbmcnHGr2d3jXtmOgzNnlDkXtX8g3BfJ6nntsPD+0jtS2PzhvRHblRz4A==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -912,12 +922,12 @@ "esm-env": "^1.0.0", "kleur": "^4.1.5", "magic-string": "^0.30.0", - "mime": "^3.0.0", + "mrmime": "^1.0.1", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", "sirv": "^2.0.2", "tiny-glob": "^0.2.9", - "undici": "~5.25.0" + "undici": "~5.26.2" }, "bin": { "svelte-kit": "svelte-kit.js" @@ -1026,9 +1036,9 @@ "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", "dev": true }, "node_modules/@types/node": { @@ -1044,9 +1054,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", "dev": true }, "node_modules/@types/swagger-schema-official": { @@ -1061,16 +1071,16 @@ "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.5.tgz", - "integrity": "sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz", + "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/type-utils": "6.7.5", - "@typescript-eslint/utils": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/type-utils": "6.8.0", + "@typescript-eslint/utils": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1096,15 +1106,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.5.tgz", - "integrity": "sha512-bIZVSGx2UME/lmhLcjdVc7ePBwn7CLqKarUBL4me1C5feOd663liTGjMBGVcGr+BhnSLeP4SgwdvNnnkbIdkCw==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", + "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/typescript-estree": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", "debug": "^4.3.4" }, "engines": { @@ -1124,13 +1134,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.5.tgz", - "integrity": "sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", + "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5" + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1141,13 +1151,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.5.tgz", - "integrity": "sha512-Gs0qos5wqxnQrvpYv+pf3XfcRXW6jiAn9zE/K+DlmYf6FcpxeNYN0AIETaPR7rHO4K2UY+D0CIbDP9Ut0U4m1g==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz", + "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.5", - "@typescript-eslint/utils": "6.7.5", + "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/utils": "6.8.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1168,9 +1178,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.5.tgz", - "integrity": "sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", + "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1181,13 +1191,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.5.tgz", - "integrity": "sha512-NhJiJ4KdtwBIxrKl0BqG1Ur+uw7FiOnOThcYx9DpOGJ/Abc9z2xNzLeirCG02Ig3vkvrc2qFLmYSSsaITbKjlg==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", + "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1208,17 +1218,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.5.tgz", - "integrity": "sha512-pfRRrH20thJbzPPlPc4j0UNGvH1PjPlhlCMq4Yx7EGjV7lvEeGX0U6MJYe8+SyFutWgSHsdbJ3BXzZccYggezA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz", + "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/typescript-estree": "6.8.0", "semver": "^7.5.4" }, "engines": { @@ -1233,12 +1243,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.5.tgz", - "integrity": "sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", + "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/types": "6.8.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1637,18 +1647,6 @@ "node": "*" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dev": true, - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -1714,6 +1712,15 @@ } ] }, + "node_modules/canvas-confetti": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/canvas-confetti/-/canvas-confetti-1.9.0.tgz", + "integrity": "sha512-0UGU/T5Un/Cd4Aj4fu/p/oVQm8Il+brK5xcmY+y77u7PXuyNJD4ODUWe01A5o3GUI9Bb8lOBlQ10VdaDsY1FBA==", + "funding": { + "type": "donate", + "url": "https://www.paypal.me/kirilvatev" + } + }, "node_modules/chai": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", @@ -1974,9 +1981,9 @@ } }, "node_modules/daisyui": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-3.9.2.tgz", - "integrity": "sha512-yJZ1QjHUaL+r9BkquTdzNHb7KIgAJVFh0zbOXql2Wu0r7zx5qZNLxclhjN0WLoIpY+o2h/8lqXg7ijj8oTigOw==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-3.9.3.tgz", + "integrity": "sha512-8li177QCu6dqlEOzE3h/dAV1y9Movbjx5bzJIO/hNqMNZtJkbHM0trjTzbDejV7N57eNGdjBvAGtxZYKzS4jow==", "dependencies": { "colord": "^2.9", "css-selector-tokenizer": "^0.8", @@ -3627,9 +3634,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", - "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -3691,18 +3698,6 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -4792,6 +4787,19 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/prism-svelte": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/prism-svelte/-/prism-svelte-0.5.0.tgz", + "integrity": "sha512-db91Bf3pRGKDPz1lAqLFSJXeW13mulUJxhycysFpfXV5MIK7RgWWK2E5aPAa71s8TCzQUXxF5JOV42/iOs6QkA==" + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -5354,15 +5362,6 @@ "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", "dev": true }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -5568,9 +5567,9 @@ } }, "node_modules/svelte": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.1.tgz", - "integrity": "sha512-LpLqY2Jr7cRxkrTc796/AaaoMLF/1ax7cto8Ot76wrvKQhrPmZ0JgajiWPmg9mTSDqO16SSLiD17r9MsvAPTmw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.2.tgz", + "integrity": "sha512-My2tytF2e2NnHSpn2M7/3VdXT4JdTglYVUuSuK/mXL2XtulPYbeBfl8Dm1QiaKRn0zoULRnL+EtfZHHP0k4H3A==", "dependencies": { "@ampproject/remapping": "^2.2.1", "@jridgewell/sourcemap-codec": "^1.4.15", @@ -5583,7 +5582,7 @@ "estree-walker": "^3.0.3", "is-reference": "^3.0.1", "locate-character": "^3.0.0", - "magic-string": "^0.30.0", + "magic-string": "^0.30.4", "periscopic": "^3.1.0" }, "engines": { @@ -5651,6 +5650,19 @@ "svelte": "^3.19.0 || ^4.0.0" } }, + "node_modules/svelte-legos": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/svelte-legos/-/svelte-legos-0.2.2.tgz", + "integrity": "sha512-HTVkCIqhrxdy+OpXjxGr/4xIJEGv4d2cRQwTjm0SYfLw/YF1I1l/TQR59nb2WvjccnO8TNFNTvAWP5pgXQnU+w==", + "dependencies": { + "canvas-confetti": "^1.6.0", + "prism-svelte": "^0.5.0", + "prismjs": "^1.29.0" + }, + "peerDependencies": { + "svelte": "^4.0.0" + } + }, "node_modules/svelte-local-storage-store": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/svelte-local-storage-store/-/svelte-local-storage-store-0.6.4.tgz", @@ -6164,12 +6176,12 @@ } }, "node_modules/undici": { - "version": "5.25.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.25.2.tgz", - "integrity": "sha512-tch8RbCfn1UUH1PeVCXva4V8gDpGAud/w0WubD6sHC46vYQ3KDxL+xv1A2UxK0N6jrVedutuPHxe1XIoqerwMw==", + "version": "5.26.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.4.tgz", + "integrity": "sha512-OG+QOf0fTLtazL9P9X7yqWxQ+Z0395Wk6DSkyTxtaq3wQEjIroVe7Y4asCX/vcCxYpNGMnwz8F0qbRYUoaQVMw==", "dev": true, "dependencies": { - "busboy": "^1.6.0" + "@fastify/busboy": "^2.0.0" }, "engines": { "node": ">=14.0" @@ -6299,9 +6311,9 @@ } }, "node_modules/vite": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz", - "integrity": "sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", "dev": true, "dependencies": { "esbuild": "^0.18.10", diff --git a/src/Exceptionless.Web/ClientApp/package.json b/src/Exceptionless.Web/ClientApp/package.json index 85fdb8b167..c4b658fcde 100644 --- a/src/Exceptionless.Web/ClientApp/package.json +++ b/src/Exceptionless.Web/ClientApp/package.json @@ -23,10 +23,10 @@ "devDependencies": { "@playwright/test": "^1.39.0", "@sveltejs/adapter-static": "^2.0.3", - "@sveltejs/kit": "^1.25.2", + "@sveltejs/kit": "^1.26.0", "@sveltejs/vite-plugin-svelte": "^2.4.6", - "@typescript-eslint/eslint-plugin": "^6.7.5", - "@typescript-eslint/parser": "^6.7.5", + "@typescript-eslint/eslint-plugin": "^6.8.0", + "@typescript-eslint/parser": "^6.8.0", "autoprefixer": "^10.4.16", "cross-env": "^7.0.3", "eslint": "^8.51.0", @@ -37,12 +37,12 @@ "prettier": "^3.0.3", "prettier-plugin-svelte": "^3.0.3", "prettier-plugin-tailwindcss": "^0.5.6", - "svelte": "^4.2.1", + "svelte": "^4.2.2", "svelte-check": "^3.5.2", "swagger-typescript-api": "^13.0.3", "tslib": "^2.6.2", "typescript": "^5.2.2", - "vite": "^4.4.11", + "vite": "^4.5.0", "vitest": "^0.34.6" }, "dependencies": { @@ -51,8 +51,9 @@ "@tanstack/svelte-table": "^8.10.7", "@web3-storage/parse-link-header": "^3.1.0", "class-validator": "^0.14.0", - "daisyui": "^3.9.2", + "daisyui": "^3.9.3", "oidc-client-ts": "^2.3.0", + "svelte-legos": "^0.2.2", "svelte-local-storage-store": "^0.6.4", "svelte-time": "^0.8.0", "tailwindcss": "^3.3.3", From d47e1ddff830125b9bfdeb2aef1ed6dea034db39 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Thu, 19 Oct 2023 06:08:53 -0500 Subject: [PATCH 02/19] Added ability to automatically refresh after visibility and websocket reconnect --- .../ClientApp/src/lib/api/WebSocketClient.ts | 25 +++++++++++++++---- .../events/table/EventsTable.svelte | 3 +++ .../events/table/EventsTailLogTable.svelte | 2 ++ .../messaging/CustomEventMessage.svelte | 2 +- .../ClientApp/src/routes/(app)/+layout.svelte | 10 ++++++++ 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/Exceptionless.Web/ClientApp/src/lib/api/WebSocketClient.ts b/src/Exceptionless.Web/ClientApp/src/lib/api/WebSocketClient.ts index 1565d45066..8c6d0c0839 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/api/WebSocketClient.ts +++ b/src/Exceptionless.Web/ClientApp/src/lib/api/WebSocketClient.ts @@ -1,4 +1,5 @@ import { accessToken } from './auth'; +import { documentVisibilityStore } from 'svelte-legos'; export class WebSocketClient { private accessToken: string | null = null; @@ -12,8 +13,8 @@ export class WebSocketClient { private timedOut: boolean = false; private ws: WebSocket | null = null; - public onConnecting: () => void = () => {}; - public onOpen: (ev: Event) => void = () => {}; + public onConnecting: (isReconnect: boolean) => void = () => {}; + public onOpen: (ev: Event, isReconnect: boolean) => void = () => {}; public onMessage: (ev: MessageEvent) => void = () => {}; public onError: (ev: Event) => void = () => {}; public onClose: (ev: CloseEvent) => void = () => {}; @@ -31,15 +32,29 @@ export class WebSocketClient { this.connect(); } }); + + const visibility = documentVisibilityStore(); + visibility.subscribe((visible) => { + if ( + visible === 'visible' && + (this.readyState === WebSocket.CLOSING || this.readyState === WebSocket.CLOSED) + ) { + this.connect(); + } else if (visible === 'hidden') { + this.close(); + } + }); } public connect(reconnectAttempt: boolean = true) { + const isReconnect: boolean = this.forcedClose; + // Reset state this.readyState = WebSocket.CONNECTING; this.forcedClose = false; this.ws = new WebSocket(`${this.url}?access_token=${this.accessToken}`); - this.onConnecting(); + this.onConnecting(isReconnect); const localWs = this.ws; const timeout = setTimeout(() => { @@ -53,7 +68,7 @@ export class WebSocketClient { this.readyState = WebSocket.OPEN; reconnectAttempt = false; - this.onOpen(event); + this.onOpen(event, isReconnect); }; this.ws.onclose = (event: CloseEvent) => { @@ -65,7 +80,7 @@ export class WebSocketClient { this.onClose(event); } else { this.readyState = WebSocket.CONNECTING; - this.onConnecting(); + this.onConnecting(isReconnect); if (!reconnectAttempt && !this.timedOut) { this.onClose(event); } diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/events/table/EventsTable.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/events/table/EventsTable.svelte index d57e50b56a..e922632366 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/components/events/table/EventsTable.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/events/table/EventsTable.svelte @@ -34,6 +34,7 @@ import { persisted } from 'svelte-local-storage-store'; import TimeAgo from '$comp/formatters/TimeAgo.svelte'; import StackUsersSummaryColumn from './StackUsersSummaryColumn.svelte'; + import CustomEventMessage from '$comp/messaging/CustomEventMessage.svelte'; export let mode: GetEventsMode = 'summary'; export let filter: Readable; @@ -239,6 +240,8 @@ const dispatch = createEventDispatcher(); + + ; @@ -151,6 +152,7 @@ const dispatch = createEventDispatcher(); + dispatch('rowclick', event.detail)}> diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/messaging/CustomEventMessage.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/messaging/CustomEventMessage.svelte index c0f1ee8f9c..9ecc8b5707 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/components/messaging/CustomEventMessage.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/messaging/CustomEventMessage.svelte @@ -1,7 +1,7 @@ + + From 96550d438642438b73411c7c74192d0fd6b34a0f Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Sat, 21 Oct 2023 07:55:17 -0500 Subject: [PATCH 06/19] Fixed redirect --- .../ClientApp/src/routes/(auth)/login/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Exceptionless.Web/ClientApp/src/routes/(auth)/login/+page.svelte b/src/Exceptionless.Web/ClientApp/src/routes/(auth)/login/+page.svelte index 639fc278ea..8560982b82 100644 --- a/src/Exceptionless.Web/ClientApp/src/routes/(auth)/login/+page.svelte +++ b/src/Exceptionless.Web/ClientApp/src/routes/(auth)/login/+page.svelte @@ -31,7 +31,7 @@ data.invite_token = $page.url.searchParams.get('token'); let problem = new ProblemDetails(); - const redirectUrl = $page.url.searchParams.get('redirect') ?? '/'; + const redirectUrl = $page.url.searchParams.get('redirect') ?? '/next'; async function onLogin() { if ($loading) { From 8189e290b9d6f53aba120d751b20c088b5df6f6e Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Sat, 21 Oct 2023 07:55:34 -0500 Subject: [PATCH 07/19] Fixed formatting --- .../Utility/AutoValidationActionFilter.cs | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/Exceptionless.Web/Utility/AutoValidationActionFilter.cs b/src/Exceptionless.Web/Utility/AutoValidationActionFilter.cs index cdec601d7f..a13c2cba54 100644 --- a/src/Exceptionless.Web/Utility/AutoValidationActionFilter.cs +++ b/src/Exceptionless.Web/Utility/AutoValidationActionFilter.cs @@ -56,28 +56,28 @@ public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionE if (hasErrors) { - var validationProblem = controllerBase.ProblemDetailsFactory.CreateValidationProblemDetails(context.HttpContext, context.ModelState, 422); - context.Result = new UnprocessableEntityObjectResult(validationProblem); + var validationProblem = controllerBase.ProblemDetailsFactory.CreateValidationProblemDetails(context.HttpContext, context.ModelState, 422); + context.Result = new UnprocessableEntityObjectResult(validationProblem); - return; + return; + } } - } - await next(); -} + await next(); + } -private static bool ShouldValidate(Type type, IServiceProviderIsService? isService = null) => - !IsNonValidatedType(type, isService) && MiniValidator.RequiresValidation(type); + private static bool ShouldValidate(Type type, IServiceProviderIsService? isService = null) => + !IsNonValidatedType(type, isService) && MiniValidator.RequiresValidation(type); -private static bool IsNonValidatedType(Type type, IServiceProviderIsService? isService) => - typeof(HttpContext) == type - || typeof(HttpRequest) == type - || typeof(HttpResponse) == type - || typeof(ClaimsPrincipal) == type - || typeof(CancellationToken) == type - || typeof(IFormFileCollection) == type - || typeof(IFormFile) == type - || typeof(Stream) == type - || typeof(PipeReader) == type - || isService?.IsService(type) == true; + private static bool IsNonValidatedType(Type type, IServiceProviderIsService? isService) => + typeof(HttpContext) == type + || typeof(HttpRequest) == type + || typeof(HttpResponse) == type + || typeof(ClaimsPrincipal) == type + || typeof(CancellationToken) == type + || typeof(IFormFileCollection) == type + || typeof(IFormFile) == type + || typeof(Stream) == type + || typeof(PipeReader) == type + || isService?.IsService(type) == true; } From bfc8028434fec2f9786b0149eca05b95ffc4e0b1 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Sat, 21 Oct 2023 07:56:58 -0500 Subject: [PATCH 08/19] Added filtering for all data types and strongly typed filtering. --- .../components/events/views/Overview.svelte | 125 ++++++++++++------ ...m.svelte => ClickableBooleanFilter.svelte} | 10 +- .../filters/ClickableDateFilter.svelte | 20 +++ .../filters/ClickableNumberFilter.svelte | 20 +++ .../filters/ClickableReferenceFilter.svelte | 19 +++ .../filters/ClickableSessionFilter.svelte | 19 +++ .../filters/ClickableStringFilter.svelte | 20 +++ .../filters/ClickableVersionFilter.svelte | 20 +++ .../src/lib/components/filters/filters.ts | 101 ++++++++++++-- .../src/lib/helpers/persistent-event.ts | 15 +++ .../ClientApp/src/routes/(app)/+page.svelte | 10 +- 11 files changed, 323 insertions(+), 56 deletions(-) rename src/Exceptionless.Web/ClientApp/src/lib/components/filters/{FilterableItem.svelte => ClickableBooleanFilter.svelte} (60%) create mode 100644 src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableDateFilter.svelte create mode 100644 src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableNumberFilter.svelte create mode 100644 src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableReferenceFilter.svelte create mode 100644 src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableSessionFilter.svelte create mode 100644 src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableStringFilter.svelte create mode 100644 src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableVersionFilter.svelte diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte index 9493fe81c5..c72f7fddfd 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte @@ -1,4 +1,6 @@
- + {#if isSessionStart} @@ -79,13 +94,14 @@ @@ -94,8 +110,8 @@ @@ -104,8 +120,8 @@ @@ -114,7 +130,8 @@ @@ -123,8 +140,8 @@ @@ -133,8 +150,8 @@ @@ -142,20 +159,31 @@ {#if !isSessionStart && event.value} - + {/if} {#if message} - {message} {/if} {#if version} - + {/if} {#if location} @@ -169,8 +197,8 @@ @@ -179,7 +207,15 @@ {#if requestUrl} - + {/if}
Occurred On () ()
Reference - {#if isSessionStart} - {event.reference_id}{event.reference_id} {:else} - {event.reference_id} + {event.reference_id} {/if}
{reference.name} {reference.id}{reference.id}
Level
Event Type {event.type}{event.type}
Error Type {errorType}{errorType}
Source {event.source}{event.source}
Value{event.value}{event.value}
Message{message}
Version{version}{version}
Tags {#each event.tags as tag} -
{tag}
{tag}
{/each}
URL{requestUrl}> + {requestUrl} + +
@@ -190,39 +226,54 @@ {#if userEmail} User Email - {userEmail} + {userEmail} + {/if} {#if userIdentity} User Identity - {userIdentity} + {userIdentity} {/if} {#if userName} User Name - {userName} + {userName} {/if} - {#if userDescriptionInfo} + {#if userDescription} User Description - {userDescriptionInfo} + {userDescription} {/if} {/if} {#if hasError} -
- +
+

Stack Trace

+
- -

Stack Trace

{#if event.data?.['@error']} diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/filters/FilterableItem.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableBooleanFilter.svelte similarity index 60% rename from src/Exceptionless.Web/ClientApp/src/lib/components/filters/FilterableItem.svelte rename to src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableBooleanFilter.svelte index cbf33d8bec..9fc82e0f6b 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/components/filters/FilterableItem.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableBooleanFilter.svelte @@ -1,19 +1,15 @@ + + diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableNumberFilter.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableNumberFilter.svelte new file mode 100644 index 0000000000..d5810b44ad --- /dev/null +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableNumberFilter.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableReferenceFilter.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableReferenceFilter.svelte new file mode 100644 index 0000000000..4b8f54cffc --- /dev/null +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableReferenceFilter.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableSessionFilter.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableSessionFilter.svelte new file mode 100644 index 0000000000..368b9730b5 --- /dev/null +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableSessionFilter.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableStringFilter.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableStringFilter.svelte new file mode 100644 index 0000000000..72b033a619 --- /dev/null +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableStringFilter.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableVersionFilter.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableVersionFilter.svelte new file mode 100644 index 0000000000..b299f21d86 --- /dev/null +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/ClickableVersionFilter.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/filters/filters.ts b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/filters.ts index 1daed66894..9f8e7466ac 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/components/filters/filters.ts +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/filters.ts @@ -1,6 +1,7 @@ import type { Serializer } from 'svelte-local-storage-store'; export interface IFilter { + readonly type: string; toFilter(): string; } @@ -10,6 +11,10 @@ export class BooleanFilter implements IFilter { public value?: boolean ) {} + public get type(): string { + return 'boolean'; + } + public toFilter(): string { if (this.value === undefined) { return `_missing_:${this.term}`; @@ -22,20 +27,28 @@ export class BooleanFilter implements IFilter { export class DateFilter implements IFilter { constructor( public term: string, - public value?: Date + public value?: Date | string ) {} + public get type(): string { + return 'date'; + } + public toFilter(): string { if (this.value === undefined) { return `_missing_:${this.term}`; } - return `${this.term}:${this.value}`; + const date = this.value instanceof Date ? this.value.toISOString() : this.value; + return `${this.term}:${quoteIfSpecialCharacters(date)}`; } } export class KeywordFilter implements IFilter { constructor(public keyword: string) {} + public get type(): string { + return 'keyword'; + } public toFilter(): string { return this.keyword; @@ -48,6 +61,10 @@ export class NumberFilter implements IFilter { public value?: number ) {} + public get type(): string { + return 'number'; + } + public toFilter(): string { if (this.value === undefined) { return `_missing_:${this.term}`; @@ -60,31 +77,44 @@ export class NumberFilter implements IFilter { export class ReferenceFilter implements IFilter { constructor(public referenceId: string) {} + public get type(): string { + return 'reference'; + } + public toFilter(): string { - return `reference:${this.referenceId}`; + return `reference:${quoteIfSpecialCharacters(this.referenceId)}`; } } export class SessionFilter implements IFilter { constructor(public sessionId: string) {} + public get type(): string { + return 'session'; + } + public toFilter(): string { - return `(reference:${this.sessionId} OR ref.session:${this.sessionId})`; + const session = quoteIfSpecialCharacters(this.sessionId); + return `(reference:${session} OR ref.session:${session})`; } } export class StringFilter implements IFilter { constructor( public term: string, - public value?: number + public value?: string | null ) {} + public get type(): string { + return 'string'; + } + public toFilter(): string { if (this.value === undefined) { return `_missing_:${this.term}`; } - return `${this.term}:${this.value}`; + return `${this.term}:${quoteIfSpecialCharacters(this.value)}`; } } @@ -94,12 +124,16 @@ export class VersionFilter implements IFilter { public value?: string ) {} + public get type(): string { + return 'version'; + } + public toFilter(): string { if (this.value === undefined) { return `_missing_:${this.term}`; } - return `${this.term}:${this.value}`; + return `${this.term}:${quoteIfSpecialCharacters(this.value)}`; } } @@ -121,6 +155,13 @@ export function quote(value?: string | null): string | undefined { return value ? `"${value}"` : undefined; } +export function toFilter(filters: IFilter[]): string { + return filters + .map((f) => f.toFilter()) + .join(' ') + .trim(); +} + /** * Update the filters with the given filter. If the filter already exists, it will be removed. * @param filters The filters @@ -178,8 +219,48 @@ export function parseFilter(filters: IFilter[], input: string): IFilter[] { return resolvedFilters; } +export class FilterSerializer { + // implements Serializer { + public parse(text: string): IFilter[] { + if (!text) { + return []; + } + + const data = JSON.parse(text); + const filters: IFilter[] = []; + for (const filter of data) { + switch (filter.type) { + case 'boolean': + filters.push(new BooleanFilter(filter.term, filter.value)); + break; + case 'date': + filters.push(new DateFilter(filter.term, filter.value)); + break; + case 'keyword': + filters.push(new KeywordFilter(filter.keyword)); + break; + case 'number': + filters.push(new NumberFilter(filter.term, filter.value)); + break; + case 'reference': + filters.push(new ReferenceFilter(filter.referenceId)); + break; + case 'session': + filters.push(new SessionFilter(filter.sessionId)); + break; + case 'string': + filters.push(new StringFilter(filter.term, filter.value)); + break; + case 'version': + filters.push(new VersionFilter(filter.term, filter.value)); + break; + } + } -export class FilterSerializer implements Serializer { - parse(text: string): IFilter[]; - stringify(object: IFilter[]): string; + return filters; + } + + public stringify(object: IFilter[]): string { + return JSON.stringify(object); + } } diff --git a/src/Exceptionless.Web/ClientApp/src/lib/helpers/persistent-event.ts b/src/Exceptionless.Web/ClientApp/src/lib/helpers/persistent-event.ts index 1117b11650..f421f1f1ab 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/helpers/persistent-event.ts +++ b/src/Exceptionless.Web/ClientApp/src/lib/helpers/persistent-event.ts @@ -21,6 +21,11 @@ export function getLocation(event: PersistentEvent) { }, ''); } +export function getRequestInfoPath(event: PersistentEvent) { + const requestInfo = event.data?.['@request']; + return requestInfo ? requestInfo.path : null; +} + export function getRequestInfoUrl(event: PersistentEvent) { const requestInfo = event.data?.['@request']; if (requestInfo) { @@ -233,3 +238,13 @@ export function getSimpleErrorInfoStackTrace(error: SimpleErrorInfo) { const errors = getErrors(error); return getStackTraceHeader(errors) + buildStackFrames(errors.reverse()); } + +export function getStackTrace(event: PersistentEvent): string | undefined { + const error = event.data?.['@error']; + if (error) { + return getErrorInfoStackTrace(error); + } + + const simpleError = event.data?.['@simple_error']; + return simpleError?.stack_trace; +} diff --git a/src/Exceptionless.Web/ClientApp/src/routes/(app)/+page.svelte b/src/Exceptionless.Web/ClientApp/src/routes/(app)/+page.svelte index 84d13f6d92..e330ef4ab1 100644 --- a/src/Exceptionless.Web/ClientApp/src/routes/(app)/+page.svelte +++ b/src/Exceptionless.Web/ClientApp/src/routes/(app)/+page.svelte @@ -7,7 +7,13 @@ import { persisted } from 'svelte-local-storage-store'; import EventsDrawer from '$comp/events/EventsDrawer.svelte'; import CustomEventMessage from '$comp/messaging/CustomEventMessage.svelte'; - import { type IFilter, updateFilters, parseFilter } from '$comp/filters/filters'; + import { + type IFilter, + updateFilters, + parseFilter, + FilterSerializer, + toFilter + } from '$comp/filters/filters'; import { derived } from 'svelte/store'; let liveMode = persisted('live', true); @@ -20,7 +26,7 @@ let time = persisted('time', ''); - const filters = persisted('filters', []); + const filters = persisted('filters', [], { serializer: new FilterSerializer() }); let filter = derived(filters, ($filters) => toFilter($filters)); function onFilterChanged({ detail }: CustomEvent): void { filters.set(updateFilters($filters, detail)); From 926b6a9ca0fb70c9d3a4785e34cfc7084c2a6d2a Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Sat, 21 Oct 2023 09:12:44 -0500 Subject: [PATCH 09/19] Added toast component --- .../ClientApp/.vscode/settings.json | 2 ++ .../ClientApp/package-lock.json | 9 +++++++ src/Exceptionless.Web/ClientApp/package.json | 1 + src/Exceptionless.Web/ClientApp/src/app.css | 27 +++++++++++++++++++ .../components/CopyToClipboardButton.svelte | 5 ++-- .../ClientApp/src/routes/+layout.svelte | 3 +++ 6 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/Exceptionless.Web/ClientApp/.vscode/settings.json b/src/Exceptionless.Web/ClientApp/.vscode/settings.json index addfae29e4..5b9f1562b1 100644 --- a/src/Exceptionless.Web/ClientApp/.vscode/settings.json +++ b/src/Exceptionless.Web/ClientApp/.vscode/settings.json @@ -1,6 +1,7 @@ { "debug.allowBreakpointsEverywhere": true, "cSpell.words": [ + "colour", "iconify", "keyof", "lucene", @@ -10,6 +11,7 @@ "rowclick", "satellizer", "sessionend", + "svoast", "tailwindcss", "tanstack" ], diff --git a/src/Exceptionless.Web/ClientApp/package-lock.json b/src/Exceptionless.Web/ClientApp/package-lock.json index 8ef7fd09aa..22d908c9dd 100644 --- a/src/Exceptionless.Web/ClientApp/package-lock.json +++ b/src/Exceptionless.Web/ClientApp/package-lock.json @@ -18,6 +18,7 @@ "svelte-legos": "^0.2.2", "svelte-local-storage-store": "^0.6.4", "svelte-time": "^0.8.0", + "svoast": "^2.3.0", "tailwindcss": "^3.3.3", "unplugin-icons": "^0.17.1" }, @@ -5759,6 +5760,14 @@ "dayjs": "^1.11.9" } }, + "node_modules/svoast": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/svoast/-/svoast-2.3.0.tgz", + "integrity": "sha512-ZAjtPy1o478xG6l3JOwZ1VELyd2U7sldXAENp5Yvy+LS7/yuJJ+1u0Q43cDv6pubZwbeAAj0YboXrMpZcEI6iA==", + "peerDependencies": { + "svelte": "^4.0.0" + } + }, "node_modules/swagger-schema-official": { "version": "2.0.0-bab6bed", "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz", diff --git a/src/Exceptionless.Web/ClientApp/package.json b/src/Exceptionless.Web/ClientApp/package.json index 040a215ddc..8292ea5153 100644 --- a/src/Exceptionless.Web/ClientApp/package.json +++ b/src/Exceptionless.Web/ClientApp/package.json @@ -56,6 +56,7 @@ "svelte-legos": "^0.2.2", "svelte-local-storage-store": "^0.6.4", "svelte-time": "^0.8.0", + "svoast": "^2.3.0", "tailwindcss": "^3.3.3", "unplugin-icons": "^0.17.1" }, diff --git a/src/Exceptionless.Web/ClientApp/src/app.css b/src/Exceptionless.Web/ClientApp/src/app.css index b5c61c9567..7d35efe3d3 100644 --- a/src/Exceptionless.Web/ClientApp/src/app.css +++ b/src/Exceptionless.Web/ClientApp/src/app.css @@ -1,3 +1,30 @@ @tailwind base; @tailwind components; @tailwind utilities; + +:root { + /* Spacing for the container and between each toast */ + --svoast-offset: 16px; + --svoast-gap: 16px; + /* The toast itself. */ + --svoast-bg: theme('colors.base-100'); + --svoast-text: theme('colors.neutral'); + --svoast-padding: theme('spacing.6'); + --svoast-radius: theme('borderRadius.lg'); + --svoast-shadow: theme('boxShadow.xl'); + --svoast-font-size: theme('fontSize.sm'); + --svoast-dismiss-gap: 8px; + --svoast-max-width: unset; + /* The current colour of the toast, depending on the type */ + --svoast-colour: ''; + /* Colour for each type */ + --svoast-info-colour: theme('colors.info'); + --svoast-attention-colour: theme('colors.primary'); + --svoast-success-colour: theme('colors.success'); + --svoast-warning-colour: theme('colors.warning'); + --svoast-error-colour: theme('colors.error'); + /* The coloured bar */ + --svoast-bar-width: 3px; + /* Icons */ + --svoast-icon-padding: 2px; +} diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/CopyToClipboardButton.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/CopyToClipboardButton.svelte index edccc8123e..92284c8c5e 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/components/CopyToClipboardButton.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/CopyToClipboardButton.svelte @@ -1,16 +1,17 @@ diff --git a/src/Exceptionless.Web/ClientApp/src/routes/+layout.svelte b/src/Exceptionless.Web/ClientApp/src/routes/+layout.svelte index 9eb7664b3d..2481d7dec3 100644 --- a/src/Exceptionless.Web/ClientApp/src/routes/+layout.svelte +++ b/src/Exceptionless.Web/ClientApp/src/routes/+layout.svelte @@ -1,4 +1,5 @@ + + From ce5a16622c6a518f34dfc86450b388bad516e85d Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Sat, 21 Oct 2023 09:16:47 -0500 Subject: [PATCH 10/19] Ensure we show user name --- .../ClientApp/src/lib/components/events/views/Overview.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte index c72f7fddfd..319e61e974 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte @@ -220,7 +220,7 @@ {/if} -{#if userEmail || userDescription || userIdentity} +{#if userEmail || userIdentity || userName || userDescription}

User Info

{#if userEmail} From 53e14011d2454af093cd92d3909eb2d37ee9660d Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Mon, 30 Oct 2023 21:03:42 -0500 Subject: [PATCH 11/19] Updated deps --- .../ClientApp/package-lock.json | 156 +++++++++--------- src/Exceptionless.Web/ClientApp/package.json | 16 +- 2 files changed, 86 insertions(+), 86 deletions(-) diff --git a/src/Exceptionless.Web/ClientApp/package-lock.json b/src/Exceptionless.Web/ClientApp/package-lock.json index 22d908c9dd..07e4e24edb 100644 --- a/src/Exceptionless.Web/ClientApp/package-lock.json +++ b/src/Exceptionless.Web/ClientApp/package-lock.json @@ -8,27 +8,27 @@ "name": "exceptionless", "version": "8.0.0", "dependencies": { - "@exceptionless/browser": "^3.0.4", - "@iconify-json/mdi": "^1.1.54", + "@exceptionless/browser": "^3.0.5", + "@iconify-json/mdi": "^1.1.55", "@tanstack/svelte-table": "^8.10.7", "@web3-storage/parse-link-header": "^3.1.0", "class-validator": "^0.14.0", - "daisyui": "^3.9.3", - "oidc-client-ts": "^2.3.0", + "daisyui": "^3.9.4", + "oidc-client-ts": "^2.4.0", "svelte-legos": "^0.2.2", "svelte-local-storage-store": "^0.6.4", "svelte-time": "^0.8.0", "svoast": "^2.3.0", - "tailwindcss": "^3.3.3", + "tailwindcss": "^3.3.5", "unplugin-icons": "^0.17.1" }, "devDependencies": { "@playwright/test": "^1.39.0", "@sveltejs/adapter-static": "^2.0.3", - "@sveltejs/kit": "^1.26.0", + "@sveltejs/kit": "^1.27.2", "@sveltejs/vite-plugin-svelte": "^2.4.6", - "@typescript-eslint/eslint-plugin": "^6.8.0", - "@typescript-eslint/parser": "^6.8.0", + "@typescript-eslint/eslint-plugin": "^6.9.1", + "@typescript-eslint/parser": "^6.9.1", "autoprefixer": "^10.4.16", "cross-env": "^7.0.3", "eslint": "^8.52.0", @@ -687,18 +687,18 @@ } }, "node_modules/@exceptionless/browser": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@exceptionless/browser/-/browser-3.0.4.tgz", - "integrity": "sha512-3dgpNMcR9tf0se6CjIoTbQF+2jiEFcMq2FnZA85QKePa7tzGeUfHU3S6qpQodNfKidqqHj6t+kpCxUOgV1lXOg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@exceptionless/browser/-/browser-3.0.5.tgz", + "integrity": "sha512-CbbX9fBCdhODeBwuklE+uqNQ4lqGH5ztFJjxfLseeBgg0RcGvmom7io9+nXNnc38Lp7yKRBnpWWxGoYViHlNGQ==", "dependencies": { - "@exceptionless/core": "3.0.4", + "@exceptionless/core": "3.0.5", "stacktrace-js": "^2.0.2" } }, "node_modules/@exceptionless/core": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@exceptionless/core/-/core-3.0.4.tgz", - "integrity": "sha512-ViI9HV0+J056/iUWconOPoVlZMaeCnYB4LuL+Nfg4O6O/2CrFbIB7NxUurME08qjb6YNv7nbQqKTDTFbVybSmw==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@exceptionless/core/-/core-3.0.5.tgz", + "integrity": "sha512-whBT9bfGdeYNt1ig7jd4ZnrmwIVXLF1nFaJGRd2XfNn9O7bQnnSWan962e1qu7DKnCLTCZV9aVGvQ/F8XG5hUg==" }, "node_modules/@exodus/schemasafe": { "version": "1.2.3", @@ -749,9 +749,9 @@ "dev": true }, "node_modules/@iconify-json/mdi": { - "version": "1.1.54", - "resolved": "https://registry.npmjs.org/@iconify-json/mdi/-/mdi-1.1.54.tgz", - "integrity": "sha512-3QAsxte90EalbN2e8J30OqSSZz9qN2x+kmykQwsPahoW2dOtSvj+BR9YdiUd9A5XKk2nuU4UH5Gj/cq6WZ6CzQ==", + "version": "1.1.55", + "resolved": "https://registry.npmjs.org/@iconify-json/mdi/-/mdi-1.1.55.tgz", + "integrity": "sha512-ycnFub+EQx+3D/aDCg6iC7sjexOUa5GzxUNIZFFl0Pq7aDxbmhIludoyYnguEO3REyWf9FcOOmvVcQkdtwKHTw==", "dependencies": { "@iconify/types": "*" } @@ -910,9 +910,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.26.0.tgz", - "integrity": "sha512-CV/AlTziC05yrz7UjVqEd0pH6+2dnrbmcnHGr2d3jXtmOgzNnlDkXtX8g3BfJ6nntsPD+0jtS2PzhvRHblRz4A==", + "version": "1.27.2", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.2.tgz", + "integrity": "sha512-2w2VbPpK8DI3QCSVa2UNAv5sKNks1LT8GsEdpk41ffOyO2znGx2ZwcRWacsqlvh3d9lncZuDdANvCbTbuKvy3Q==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -1072,16 +1072,16 @@ "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz", - "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", + "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/type-utils": "6.8.0", - "@typescript-eslint/utils": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/type-utils": "6.9.1", + "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1107,15 +1107,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", - "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", + "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/typescript-estree": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4" }, "engines": { @@ -1135,13 +1135,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", - "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", + "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0" + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1152,13 +1152,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz", - "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", + "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.8.0", - "@typescript-eslint/utils": "6.8.0", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/utils": "6.9.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1179,9 +1179,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", - "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", + "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1192,13 +1192,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", - "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", + "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1219,17 +1219,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz", - "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", + "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", "semver": "^7.5.4" }, "engines": { @@ -1244,12 +1244,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", - "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", + "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/types": "6.9.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1951,9 +1951,9 @@ } }, "node_modules/crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, "node_modules/css-selector-tokenizer": { "version": "0.8.0", @@ -1988,9 +1988,9 @@ } }, "node_modules/daisyui": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-3.9.3.tgz", - "integrity": "sha512-8li177QCu6dqlEOzE3h/dAV1y9Movbjx5bzJIO/hNqMNZtJkbHM0trjTzbDejV7N57eNGdjBvAGtxZYKzS4jow==", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-3.9.4.tgz", + "integrity": "sha512-fvi2RGH4YV617/6DntOVGcOugOPym9jTGWW2XySb5ZpvdWO4L7bEG77VHirrnbRUEWvIEVXkBpxUz2KFj0rVnA==", "dependencies": { "colord": "^2.9", "css-selector-tokenizer": "^0.8", @@ -4238,11 +4238,11 @@ } }, "node_modules/oidc-client-ts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-2.3.0.tgz", - "integrity": "sha512-7RUKU+TJFQo+4X9R50IGJAIDF18uRBaFXyZn4VVCfwmwbSUhKcdDnw4zgeut3uEXkiD3NqURq+d88sDPxjf1FA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-2.4.0.tgz", + "integrity": "sha512-WijhkTrlXK2VvgGoakWJiBdfIsVGz6CFzgjNNqZU1hPKV2kyeEaJgLs7RwuiSp2WhLfWBQuLvr2SxVlZnk3N1w==", "dependencies": { - "crypto-js": "^4.1.1", + "crypto-js": "^4.2.0", "jwt-decode": "^3.1.2" }, "engines": { @@ -5876,19 +5876,19 @@ } }, "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.12", + "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.18.2", + "jiti": "^1.19.1", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", diff --git a/src/Exceptionless.Web/ClientApp/package.json b/src/Exceptionless.Web/ClientApp/package.json index 8292ea5153..714e823b81 100644 --- a/src/Exceptionless.Web/ClientApp/package.json +++ b/src/Exceptionless.Web/ClientApp/package.json @@ -23,10 +23,10 @@ "devDependencies": { "@playwright/test": "^1.39.0", "@sveltejs/adapter-static": "^2.0.3", - "@sveltejs/kit": "^1.26.0", + "@sveltejs/kit": "^1.27.2", "@sveltejs/vite-plugin-svelte": "^2.4.6", - "@typescript-eslint/eslint-plugin": "^6.8.0", - "@typescript-eslint/parser": "^6.8.0", + "@typescript-eslint/eslint-plugin": "^6.9.1", + "@typescript-eslint/parser": "^6.9.1", "autoprefixer": "^10.4.16", "cross-env": "^7.0.3", "eslint": "^8.52.0", @@ -46,18 +46,18 @@ "vitest": "^0.34.6" }, "dependencies": { - "@exceptionless/browser": "^3.0.4", - "@iconify-json/mdi": "^1.1.54", + "@exceptionless/browser": "^3.0.5", + "@iconify-json/mdi": "^1.1.55", "@tanstack/svelte-table": "^8.10.7", "@web3-storage/parse-link-header": "^3.1.0", "class-validator": "^0.14.0", - "daisyui": "^3.9.3", - "oidc-client-ts": "^2.3.0", + "daisyui": "^3.9.4", + "oidc-client-ts": "^2.4.0", "svelte-legos": "^0.2.2", "svelte-local-storage-store": "^0.6.4", "svelte-time": "^0.8.0", "svoast": "^2.3.0", - "tailwindcss": "^3.3.3", + "tailwindcss": "^3.3.5", "unplugin-icons": "^0.17.1" }, "type": "module" From f8df24fe4b3800284c99577e3dab0c9d91cc1bfd Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Mon, 30 Oct 2023 21:04:26 -0500 Subject: [PATCH 12/19] Increased width of drawer, added close button, added escape key binding to auto close. --- .../ClientApp/src/routes/(app)/+layout.svelte | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/Exceptionless.Web/ClientApp/src/routes/(app)/+layout.svelte b/src/Exceptionless.Web/ClientApp/src/routes/(app)/+layout.svelte index fdf9d4bf87..d96c1f9c23 100644 --- a/src/Exceptionless.Web/ClientApp/src/routes/(app)/+layout.svelte +++ b/src/Exceptionless.Web/ClientApp/src/routes/(app)/+layout.svelte @@ -1,4 +1,6 @@ + +
+ + + + + + + + + + {#if message} + + + + + {/if} + {#if code} + + + + + {/if} + {#if submissionMethod} + + + + + {/if} +
Occurred On ()
Error Type{errorType}
Message{message}
Code{code}
Submission Method{submissionMethod}
+ +
+

Stack Trace

+ +
+
+ {#if event.data?.['@error']} + + {:else} + + {/if} +
+ + + +{#if modules.length} +
+

Modules

+
+ + + + + + + + + {#each modules as module} + + + + + {/each} +
Module NameVersion
{module.name}{module.version}
+{/if} diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte index 319e61e974..2f948c7971 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte @@ -11,7 +11,8 @@ getMessage, getRequestInfoPath, getRequestInfoUrl, - getStackTrace + getStackTrace, + hasErrorOrSimpleError } from '$lib/helpers/persistent-event'; import SimpleStackTrace from '../SimpleStackTrace.svelte'; import StackTrace from '../StackTrace.svelte'; @@ -27,14 +28,14 @@ export let event: PersistentEvent; //let project: ViewProject = {}; // TODO - const hasError = !!event.data?.['@error'] || !!event.data?.['@simple_error']; + const hasError = hasErrorOrSimpleError(event); const errorType = hasError ? getErrorType(event) : null; const stackTrace = hasError ? getStackTrace(event) : null; const isSessionStart = event.type === 'session'; //let referenceId = isSessionStart ? event.reference_id : null; - const message = event.message || getMessage(event); + const message = getMessage(event); let references: { id: string; name: string }[] = []; const referencePrefix = '@ref:'; Object.entries(event.data || {}).forEach(([key, value]) => { @@ -63,208 +64,213 @@ - - - - - {#if isSessionStart} - - - - - {/if} - - {#if event.reference_id} - - - - - {/if} - {#each references as reference (reference.id)} - - - - - {/each} - {#if level} - - - - - {/if} - {#if event.type !== 'error'} - - - - - {/if} - {#if hasError} - - - - - {/if} - {#if event.source} - - - - - {/if} - {#if !isSessionStart && event.value} + - + - {/if} - {#if message} - - - - - {/if} - {#if version} - - - - - {/if} - {#if location} - - - - - {/if} - {#if event.tags?.length} - - - - - {/if} - {#if requestUrl} - - - + + + {/if} + + {#if event.reference_id} + + + + + {/if} + {#each references as reference (reference.id)} + + + - - - - {/if} -
Occurred On ()
Duration - {#if !event.data?.sessionend} - - {/if} - - {#if event.data?.sessionend} - (ended ) - {/if} -
Reference - {#if isSessionStart} - {event.reference_id} - {:else} - {event.reference_id} - {/if} -
{reference.name}{reference.id}
Level
Event Type{event.type}
Error Type{errorType}
Source{event.source}
ValueOccurred On {event.value} ()
Message{message}
Version{version}
Geo{location}
Tags - {#each event.tags as tag} -
{tag}
- {/each} -
URL - {requestUrl} + Duration + {#if !event.data?.sessionend} + + {/if} + + {#if event.data?.sessionend} + (ended ) + {/if} +
Reference + {#if isSessionStart} + {event.reference_id} + {:else} + {event.reference_id} + {/if} +
{reference.name}{reference.id}
- -{#if userEmail || userIdentity || userName || userDescription} -

User Info

- - {#if userEmail} + + {/each} + {#if level} - + + + {/if} + {#if event.type !== 'error'} + + + {/if} - {#if userIdentity} + {#if hasError} - + {/if} - {#if userName} + {#if event.source} - + {/if} - {#if userDescription} + {#if !isSessionStart && event.value} - + {/if} + {#if message} + + + + + {/if} + {#if version} + + + + + {/if} + {#if location} + + + + + {/if} + {#if event.tags?.length} + + + + + {/if} + {#if requestUrl} + + + + + {/if} + +
User EmailLevel {userEmail} -
Event Type{event.type}
User IdentityError Type {userIdentity}{errorType}
User NameSource {userName}{event.source}
User DescriptionValue {userDescription}{event.value}
Message{message}
Version{version}
Geo{location}
Tags + {#each event.tags as tag} +
{tag}
+ {/each} +
URL + {requestUrl} + +
+ +{#if userEmail || userIdentity || userName || userDescription} +

User Info

+ + + {#if userEmail} + + + + + {/if} + {#if userIdentity} + + + + + {/if} + {#if userName} + + + + + {/if} + {#if userDescription} + + + + + {/if}
User Email{userEmail} +
User Identity{userIdentity}
User Name{userName}
User Description{userDescription}
{/if} diff --git a/src/Exceptionless.Web/ClientApp/src/lib/helpers/persistent-event.ts b/src/Exceptionless.Web/ClientApp/src/lib/helpers/persistent-event.ts index f421f1f1ab..e5d253fcb8 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/helpers/persistent-event.ts +++ b/src/Exceptionless.Web/ClientApp/src/lib/helpers/persistent-event.ts @@ -248,3 +248,7 @@ export function getStackTrace(event: PersistentEvent): string | undefined { const simpleError = event.data?.['@simple_error']; return simpleError?.stack_trace; } + +export function hasErrorOrSimpleError(event: PersistentEvent | null): boolean { + return !!event?.data?.['@error'] || !!event?.data?.['@simple_error']; +} From 0f6cf7f1e3bfd27fef0c19aacfc6b99a57ab58a0 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Mon, 30 Oct 2023 22:19:56 -0500 Subject: [PATCH 16/19] Fixed linting error --- .../ClientApp/src/lib/components/filters/filters.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/filters/filters.ts b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/filters.ts index 9f8e7466ac..2d960642e5 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/components/filters/filters.ts +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/filters/filters.ts @@ -219,8 +219,7 @@ export function parseFilter(filters: IFilter[], input: string): IFilter[] { return resolvedFilters; } -export class FilterSerializer { - // implements Serializer { +export class FilterSerializer implements Serializer { public parse(text: string): IFilter[] { if (!text) { return []; From 1e86f0a8ca0bd63f7e0931b7e4a9677b98e778ce Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Tue, 31 Oct 2023 06:06:34 -0500 Subject: [PATCH 17/19] Fixed failing test after repos upgrade --- .../Search/PersistentEventQueryValidatorTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Exceptionless.Tests/Search/PersistentEventQueryValidatorTests.cs b/tests/Exceptionless.Tests/Search/PersistentEventQueryValidatorTests.cs index 4030bc2db2..6a12b17f61 100644 --- a/tests/Exceptionless.Tests/Search/PersistentEventQueryValidatorTests.cs +++ b/tests/Exceptionless.Tests/Search/PersistentEventQueryValidatorTests.cs @@ -40,7 +40,7 @@ public PersistentEventQueryValidatorTests(ITestOutputHelper output) : base(outpu [InlineData("data.Windows-identity:ejsmith", "idx.windows-identity-s:ejsmith", true, true)] [InlineData("data.age:(>30 AND <=40)", "idx.age-n:(>30 AND <=40)", true, true)] [InlineData("data.age:(+>=10 AND < 20)", "idx.age-n:(+>=10 AND <20)", true, true)] - [InlineData("data.age:(+>=10 +<20)", "idx.age-n:(+>=10 +<20)", true, true)] + [InlineData("data.age:(+>=10 +<20)", "idx.age-n:(+>=10 AND +<20)", true, true)] [InlineData("data.age:(->=10 AND < 20)", "idx.age-n:(->=10 AND <20)", true, true)] [InlineData("data.age:[10 TO *]", "idx.age-n:[10 TO *]", true, true)] [InlineData("data.age:[* TO 10]", "idx.age-n:[* TO 10]", true, true)] From 029ca4abdf4eef452a760021c729ed9a2ef40b46 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Tue, 31 Oct 2023 06:07:36 -0500 Subject: [PATCH 18/19] Fixed another repository test --- .../Search/PersistentEventQueryValidatorTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Exceptionless.Tests/Search/PersistentEventQueryValidatorTests.cs b/tests/Exceptionless.Tests/Search/PersistentEventQueryValidatorTests.cs index 6a12b17f61..a049809d7b 100644 --- a/tests/Exceptionless.Tests/Search/PersistentEventQueryValidatorTests.cs +++ b/tests/Exceptionless.Tests/Search/PersistentEventQueryValidatorTests.cs @@ -29,7 +29,7 @@ public PersistentEventQueryValidatorTests(ITestOutputHelper output) : base(outpu [InlineData("NOT _exists_:data.sessionend", "NOT _exists_:idx.sessionend-d", true, true)] [InlineData("data.SessionEnd:now", "idx.date-d:>now", true, true)] [InlineData("data.date:[now/d-4d TO now/d+1d}", "idx.date-d:[now/d-4d TO now/d+1d}", true, true)] [InlineData("data.date:[2012-01-01 TO 2012-12-31]", "idx.date-d:[2012-01-01 TO 2012-12-31]", true, true)] From 7f6110828e6d081f956cc9075055518db9aaa4f1 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Tue, 31 Oct 2023 09:38:40 -0500 Subject: [PATCH 19/19] Implemented Extended Data Item --- .../components/CopyToClipboardButton.svelte | 1 + .../src/lib/components/ObjectDump.svelte | 52 ++++++++++++ .../components/events/ExtendedDataItem.svelte | 85 +++++++++++++++++++ .../lib/components/events/views/Error.svelte | 23 +++-- .../components/events/views/Overview.svelte | 8 +- .../src/lib/helpers/persistent-event.ts | 40 +++++++++ 6 files changed, 201 insertions(+), 8 deletions(-) create mode 100644 src/Exceptionless.Web/ClientApp/src/lib/components/ObjectDump.svelte create mode 100644 src/Exceptionless.Web/ClientApp/src/lib/components/events/ExtendedDataItem.svelte diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/CopyToClipboardButton.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/CopyToClipboardButton.svelte index 92284c8c5e..ed7436bfd0 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/components/CopyToClipboardButton.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/CopyToClipboardButton.svelte @@ -17,6 +17,7 @@ + + {#if canPromote} + + {/if} +
+
+ + +{#if showRaw} +
{json}
+{:else} + +{/if} diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Error.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Error.svelte index a64f0d698f..e601aea928 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Error.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Error.svelte @@ -2,16 +2,23 @@ import type { PersistentEvent } from '$lib/models/api'; import DateTime from '$comp/formatters/DateTime.svelte'; import TimeAgo from '$comp/formatters/TimeAgo.svelte'; - import { getErrorType, getMessage, getStackTrace } from '$lib/helpers/persistent-event'; + import { + getErrorData, + getErrorType, + getMessage, + getStackTrace + } from '$lib/helpers/persistent-event'; import SimpleStackTrace from '../SimpleStackTrace.svelte'; import StackTrace from '../StackTrace.svelte'; import ClickableStringFilter from '$comp/filters/ClickableStringFilter.svelte'; import ClickableVersionFilter from '$comp/filters/ClickableVersionFilter.svelte'; import ClickableDateFilter from '$comp/filters/ClickableDateFilter.svelte'; import CopyToClipboardButton from '$comp/CopyToClipboardButton.svelte'; + import ExtendedDataItem from '../ExtendedDataItem.svelte'; export let event: PersistentEvent; + const errorData = getErrorData(event); const errorType = getErrorType(event); const stackTrace = getStackTrace(event); @@ -69,10 +76,12 @@ > -
+

Stack Trace

- +
+ +
{#if event.data?.['@error']} @@ -82,7 +91,11 @@ {/if}
- +{#each errorData as ed} +
+ +
+{/each} {#if modules.length}
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte b/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte index 2f948c7971..d0c740c259 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/components/events/views/Overview.svelte @@ -275,10 +275,12 @@ {/if} {#if hasError} -
+

Stack Trace

- +
+ +
{#if event.data?.['@error']} diff --git a/src/Exceptionless.Web/ClientApp/src/lib/helpers/persistent-event.ts b/src/Exceptionless.Web/ClientApp/src/lib/helpers/persistent-event.ts index e5d253fcb8..9c8ad7de03 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/helpers/persistent-event.ts +++ b/src/Exceptionless.Web/ClientApp/src/lib/helpers/persistent-event.ts @@ -50,6 +50,46 @@ export function getMessage(event: PersistentEvent) { return event.message; } +export function getErrorData(event: PersistentEvent) { + const exceptions = getErrorsFromEvent(event); + return exceptions + .map((ex: SimpleErrorInfo | ErrorInfo, index: number) => { + const getAdditionalData = (error: SimpleErrorInfo | ErrorInfo) => { + if (!error.data) { + return; + } + + const additionalData = error.data['@ext'] || {}; + Object.entries(error.data).forEach(([key, value]) => { + if (!key.startsWith('@')) { + additionalData[key] = value; + } + }); + + return additionalData; + }; + + const errorType = ex.type || 'Unknown'; + return { + title: index === 0 ? 'Additional Data' : `${errorType} Additional Data`, + type: errorType, + message: ex.message, + data: getAdditionalData(ex) + }; + }) + .filter((errorData) => !!errorData.data); +} + +function getErrorsFromEvent(event: PersistentEvent): SimpleErrorInfo[] | ErrorInfo[] { + const error = event.data?.['@error']; + if (error) { + return getErrors(error); + } + + const simpleError = event.data?.['@simple_error']; + return getErrors(simpleError); +} + export function getErrors(error: T | undefined): T[] { const errors: T[] = []; let current: T | undefined = error;