diff --git a/html/index.ts b/html/index.ts index 7b1101a..cbfe6bd 100644 --- a/html/index.ts +++ b/html/index.ts @@ -1,6 +1,8 @@ // dees tools import * as deesWccTools from '@design.estate/dees-wcctools'; import * as deesDomTools from '@design.estate/dees-domtools'; +// Import demotools to register dees-demowrapper +import '@design.estate/dees-wcctools/demotools'; // elements and pages import * as elements from '../ts_web/elements/index.js'; diff --git a/package.json b/package.json index 3416501..211df8e 100644 --- a/package.json +++ b/package.json @@ -15,19 +15,19 @@ "author": "Lossless GmbH", "license": "UNLICENSED", "dependencies": { - "@design.estate/dees-domtools": "^2.0.1", - "@design.estate/dees-element": "^2.0.4", - "@design.estate/dees-wcctools": "^1.0.73", + "@design.estate/dees-domtools": "^2.3.3", + "@design.estate/dees-element": "^2.0.45", + "@design.estate/dees-wcctools": "^1.1.0", "@uptime.link/interfaces": "^2.0.21" }, "devDependencies": { - "@git.zone/tsbuild": "^2.1.61", - "@git.zone/tsbundle": "^2.0.7", - "@git.zone/tsrun": "^1.2.39", - "@git.zone/tswatch": "^2.0.5", + "@git.zone/tsbuild": "^2.6.4", + "@git.zone/tsbundle": "^2.5.1", + "@git.zone/tsrun": "^1.3.3", + "@git.zone/tswatch": "^2.1.2", "@push.rocks/projectinfo": "^5.0.1", "@push.rocks/smartenv": "^5.0.0", - "@types/node": "^18.11.18" + "@types/node": "^24.0.7" }, "files": [ "ts/**/*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 15b7145..f1d60c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,30 +9,30 @@ importers: .: dependencies: '@design.estate/dees-domtools': - specifier: ^2.0.1 - version: 2.0.57 + specifier: ^2.3.3 + version: 2.3.3 '@design.estate/dees-element': - specifier: ^2.0.4 - version: 2.0.34 + specifier: ^2.0.45 + version: 2.0.45 '@design.estate/dees-wcctools': - specifier: ^1.0.73 - version: 1.0.90 + specifier: ^1.1.0 + version: 1.1.0 '@uptime.link/interfaces': specifier: ^2.0.21 version: 2.0.21 devDependencies: '@git.zone/tsbuild': - specifier: ^2.1.61 - version: 2.1.82 + specifier: ^2.6.4 + version: 2.6.4 '@git.zone/tsbundle': - specifier: ^2.0.7 - version: 2.0.15 + specifier: ^2.5.1 + version: 2.5.1 '@git.zone/tsrun': - specifier: ^1.2.39 - version: 1.2.49(@types/node@18.19.39) + specifier: ^1.3.3 + version: 1.3.3 '@git.zone/tswatch': - specifier: ^2.0.5 - version: 2.0.23(@types/node@18.19.39) + specifier: ^2.1.2 + version: 2.1.2 '@push.rocks/projectinfo': specifier: ^5.0.1 version: 5.0.2 @@ -40,8 +40,8 @@ importers: specifier: ^5.0.0 version: 5.0.12 '@types/node': - specifier: ^18.11.18 - version: 18.19.39 + specifier: ^24.0.7 + version: 24.0.7 packages: @@ -51,11 +51,11 @@ packages: '@api.global/typedrequest-interfaces@3.0.19': resolution: {integrity: sha512-uuHUXJeOy/inWSDrwD0Cwax2rovpxYllDhM2RWh+6mVpQuNmZ3uw6IVg6dA2G1rOe24Ebs+Y9SzEogo+jYN7vw==} - '@api.global/typedrequest@3.0.30': - resolution: {integrity: sha512-Pp3KVr8QHZ/44u2GE9r8JpWbs5yxA+CZLwxXXcrOBnmJ2Pkp+5PWtO7QZbqnshWAdMTJTYD+nXwlqO0XiPiWGg==} + '@api.global/typedrequest@3.1.10': + resolution: {integrity: sha512-EiCp44XVcMjBvEs4oM1nMUaeY4ySU0Pzt3+mDwVG5DNP6EV87Nwancbr2jKScvaFNel9eeDgGtgEnFBKjOnApA==} - '@api.global/typedserver@3.0.50': - resolution: {integrity: sha512-WWZhLVcjqfJO3kq5RB/kYrss7hIiu3yBqBVA/o9cn7jwu3XHaC2DrT/HC7LrcKm1hndk0XbKMgBEb2orSaVl3g==} + '@api.global/typedserver@3.0.74': + resolution: {integrity: sha512-lrXaCPaVZLihlF9w39pEqTw2kiHFCheRKTZuK07S7gTGyfdXKPmccVR/EK4ox58E1gjh9A2K8yY8ZWGcjuSJkw==} '@api.global/typedsocket@3.0.1': resolution: {integrity: sha512-xojiAVNXtHoxkpBo8U2HHJG8FrVXXuLvDNndSHXwx4C9VslUwDn5zSCI+PdBl8iAg+ZuBmKjqkpZZ9sL6DC5yQ==} @@ -63,220 +63,440 @@ packages: '@apiglobal/typedrequest-interfaces@2.0.1': resolution: {integrity: sha512-Oi7pNU4vKo5UvcCJmqkH43Us237Ws/Pp/WDYnwnonRnTmIMd+6QjNfN/gXcPnP6tbamk8r8Xzcz9mgnSDM2ysw==} - '@babel/runtime@7.23.4': - resolution: {integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==} + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/crc32c@5.2.0': + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + + '@aws-crypto/sha1-browser@5.2.0': + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-s3@3.839.0': + resolution: {integrity: sha512-7zDInY+qltKxeG+9d/97nbs+FWINcAi5bChBrleUQkuQ/dA9pSP1URo/6JlVzD2Ejvksm+hVK6z3VUWZaIAVOw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/client-sso@3.839.0': + resolution: {integrity: sha512-AZABysUhbfcwXVlMo97/vwHgsfJNF81wypCAowpqAJkSjP2KrqsqHpb71/RoR2w8JGmEnBBXRD4wIxDhnmifWg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/core@3.839.0': + resolution: {integrity: sha512-KdwL5RaK7eUIlOpdOoZ5u+2t4X1rdX/MTZgz3IV/aBzjVUoGsp+uUnbyqXomLQSUitPHp72EE/NHDsvWW/IHvQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-env@3.839.0': + resolution: {integrity: sha512-cWTadewPPz1OvObZJB+olrgh8VwcgIVcT293ZUT9V0CMF0UU7QaPwJP7uNXcNxltTh+sk1yhjH4UlcnJigZZbA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-http@3.839.0': + resolution: {integrity: sha512-fv0BZwrDhWDju4D1MCLT4I2aPjr0dVQ6P+MpqvcGNOA41Oa9UdRhYTV5iuy5NLXzIzoCmnS+XfSq5Kbsf6//xw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-ini@3.839.0': + resolution: {integrity: sha512-GHm0hF4CiDxIDR7TauMaA6iI55uuSqRxMBcqTAHaTPm6+h1A+MS+ysQMxZ+Jvwtoy8WmfTIGrJVxSCw0sK2hvA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-node@3.839.0': + resolution: {integrity: sha512-7bR+U2h+ft0V8chyeu9Bh/pvau4ZkQMeRt5f0dAULoepZQ77QQVRP4H04yJPTg9DCtqbVULQ3uf5YOp1/08vQw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-process@3.839.0': + resolution: {integrity: sha512-qShpekjociUZ+isyQNa0P7jo+0q3N2+0eJDg8SGyP6K6hHTcGfiqxTDps+IKl6NreCPhZCBzyI9mWkP0xSDR6g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-sso@3.839.0': + resolution: {integrity: sha512-w10zBLHhU8SBQcdrSPMI02haLoRGZg+gP7mH/Er8VhIXfHefbr7o4NirmB0hwdw/YAH8MLlC9jj7c2SJlsNhYA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.839.0': + resolution: {integrity: sha512-EvqTc7J1kgmiuxknpCp1S60hyMQvmKxsI5uXzQtcogl/N55rxiXEqnCLI5q6p33q91PJegrcMCM5Q17Afhm5qA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-bucket-endpoint@3.830.0': + resolution: {integrity: sha512-ElVeCReZSH5Ds+/pkL5ebneJjuo8f49e9JXV1cYizuH0OAOQfYaBU9+M+7+rn61pTttOFE8W//qKzrXBBJhfMg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-expect-continue@3.821.0': + resolution: {integrity: sha512-zAOoSZKe1njOrtynvK6ZORU57YGv5I7KP4+rwOvUN3ZhJbQ7QPf8gKtFUCYAPRMegaXCKF/ADPtDZBAmM+zZ9g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-flexible-checksums@3.839.0': + resolution: {integrity: sha512-2LEuDUviV3wardiHoHCKx0WUvmiK1gBGmnw12aj5f/KKcWOaqnWI2h1K7nDQC/ZARQ1bbMZZ5kvOv5ueuMg1RA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-host-header@3.821.0': + resolution: {integrity: sha512-xSMR+sopSeWGx5/4pAGhhfMvGBHioVBbqGvDs6pG64xfNwM5vq5s5v6D04e2i+uSTj4qGa71dLUs5I0UzAK3sw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-location-constraint@3.821.0': + resolution: {integrity: sha512-sKrm80k0t3R0on8aA/WhWFoMaAl4yvdk+riotmMElLUpcMcRXAd1+600uFVrxJqZdbrKQ0mjX0PjT68DlkYXLg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-logger@3.821.0': + resolution: {integrity: sha512-0cvI0ipf2tGx7fXYEEN5fBeZDz2RnHyb9xftSgUsEq7NBxjV0yTZfLJw6Za5rjE6snC80dRN8+bTNR1tuG89zA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.821.0': + resolution: {integrity: sha512-efmaifbhBoqKG3bAoEfDdcM8hn1psF+4qa7ykWuYmfmah59JBeqHLfz5W9m9JoTwoKPkFcVLWZxnyZzAnVBOIg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.839.0': + resolution: {integrity: sha512-NwprpzJdkuUnUWxoZwKqAcL1/AsrM1YESVpLeL0pW747Vq6rIiUgkuoyQ1fASV9r5mUoWor7iMu8k5ZCisAh7A==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-ssec@3.821.0': + resolution: {integrity: sha512-YYi1Hhr2AYiU/24cQc8HIB+SWbQo6FBkMYojVuz/zgrtkFmALxENGF/21OPg7f/QWd+eadZJRxCjmRwh5F2Cxg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-user-agent@3.839.0': + resolution: {integrity: sha512-2u74uRM1JWq6Sf7+3YpjejPM9YkomGt4kWhrmooIBEq1k5r2GTbkH7pNCxBQwBueXM21jAGVDxxeClpTx+5hig==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/nested-clients@3.839.0': + resolution: {integrity: sha512-Glic0pg2THYP3aRhJORwJJBe1JLtJoEdWV/MFZNyzCklfMwEzpWtZAyxy+tQyFmMeW50uBAnh2R0jhMMcf257w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/region-config-resolver@3.821.0': + resolution: {integrity: sha512-t8og+lRCIIy5nlId0bScNpCkif8sc0LhmtaKsbm0ZPm3sCa/WhCbSZibjbZ28FNjVCV+p0D9RYZx0VDDbtWyjw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.839.0': + resolution: {integrity: sha512-/O+lh6qXKTMWPcip8ccGL7OgTceUTDmy3wBD22+tPHLeOUSMGUQTZcsmHeDB7vSHLpVY9H6GhOsdes7uQQMUwA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/token-providers@3.839.0': + resolution: {integrity: sha512-2nlafqdSbet/2WtYIoZ7KEGFowFonPBDYlTjrUvwU2yooE10VhvzhLSCTB2aKIVzo2Z2wL5WGFQsqAY5QwK6Bw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/types@3.821.0': + resolution: {integrity: sha512-Znroqdai1a90TlxGaJ+FK1lwC0fHpo97Xjsp5UKGR5JODYm7f9+/fF17ebO1KdoBr/Rm0UIFiF5VmI8ts9F1eA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-arn-parser@3.804.0': + resolution: {integrity: sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-endpoints@3.828.0': + resolution: {integrity: sha512-RvKch111SblqdkPzg3oCIdlGxlQs+k+P7Etory9FmxPHyPDvsP1j1c74PmgYqtzzMWmoXTjd+c9naUHh9xG8xg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-locate-window@3.804.0': + resolution: {integrity: sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-user-agent-browser@3.821.0': + resolution: {integrity: sha512-irWZHyM0Jr1xhC+38OuZ7JB6OXMLPZlj48thElpsO1ZSLRkLZx5+I7VV6k3sp2yZ7BYbKz/G2ojSv4wdm7XTLw==} + + '@aws-sdk/util-user-agent-node@3.839.0': + resolution: {integrity: sha512-MuunkIG1bJVMtTH7MbjXOrhHleU5wjHz5eCAUc6vj7M9rwol71nqjj9b8RLnkO5gsJcKc29Qk8iV6xQuzKWNMw==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/xml-builder@3.821.0': + resolution: {integrity: sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==} + engines: {node: '>=18.0.0'} + + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} engines: {node: '>=6.9.0'} - '@cloudflare/workers-types@4.20240620.0': - resolution: {integrity: sha512-CQD8YS6evRob7LChvIX3gE3zYo0KVgaLDOu1SwNP1BVIS2Sa0b+FC8S1e1hhrNN8/E4chYlVN+FDAgA4KRDUEQ==} - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} + '@cloudflare/workers-types@4.20250628.0': + resolution: {integrity: sha512-V4HthfhtQU2vTpwLeUic8FTLgGSjglsGZMJc9jKBNYEU/k0A1rE55UgQoTb5blKQdGtpQKfVKs3FROeY/lXmbw==} '@design.estate/dees-comms@1.0.27': resolution: {integrity: sha512-GvzTUwkV442LD60T08iqSoqvhA02Mou5lFvvqBPc4yBUiU7cZISqBx+76xvMgMIEI9Dx9JfTl4/2nW8MoVAanw==} - '@design.estate/dees-domtools@2.0.57': - resolution: {integrity: sha512-sA27nOl+vdY3hR0Y/QPs4wtUJU15W34CeMshjWModUtm7WgogJgAhbHHY+I38yf3gwvBFfFkBZHo/GL9l/lR2A==} + '@design.estate/dees-domtools@2.3.3': + resolution: {integrity: sha512-diIRuEWNRko508+eXDGVD9yxte+50VSuSsxBvWXUnE7ZPOLo9Y0oNyVi+R1Rb1AVJiXcGCORLdCtmCIcId40VA==} - '@design.estate/dees-element@2.0.34': - resolution: {integrity: sha512-4S5liIPTezEyFen6N6LBpSoYqHe05wvKJw/597SMyjgnvtW+e30MFdN+QTYY428xnKcIVId+tMVlJRZzSf0orw==} + '@design.estate/dees-element@2.0.45': + resolution: {integrity: sha512-dj8nOOtfwvqEtQceTXQQ5IEy75HIFZ+iuDxPeIynLedYpxtHPsxFrHW8IQ7/ad9MNvVO0kTnlwUOmkjylul+DA==} - '@design.estate/dees-wcctools@1.0.90': - resolution: {integrity: sha512-EHYWHiOe+P261e9fBbOBmkD7lIsOpD+tu4VZQr20oc8vhsFjeUGJqYeBm/Ghwg+Gck/dto+K9zyJNIyQ642cEw==} + '@design.estate/dees-wcctools@1.1.0': + resolution: {integrity: sha512-eniG2JsGgcVXQLkSE6M7azJ7av/UeTvvzhE6s3JbcIieHd589SCxQqF+BhlOyKqzJQ1n5jJ7KKdmhvQU5bbdtg==} - '@designestate/dees-element@2.0.23': - resolution: {integrity: sha512-TcDp9tAk7n65LwEX1oyMvG+g6g9+dWlOHea7G+k+HGNBAoGnSDrHhe9M/zAmxNVnQ08O/opgxiIgdr3viouTWA==} - deprecated: This package has been deprecated in favour of the new package at @design.estate/dees-element + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@git.zone/tsbuild@2.1.82': - resolution: {integrity: sha512-eIobXRWfDe1gmymwoVcLvZGXl2kSIr2lWIFqsYC9W+QVEFjHpec/5I0aKufHbKMsGpp3Jb9DlleUnk5HTeMs/w==} + '@git.zone/tsbuild@2.6.4': + resolution: {integrity: sha512-eeNW5hnXHU9lPzTaMbtdYDkb6cpFFC8fF5849BiwLO4N1Ga9Q5Om/6w5SZyJQcct8rHjcTgOOWdlxhjeKCr6NQ==} hasBin: true - '@git.zone/tsbundle@2.0.15': - resolution: {integrity: sha512-ZrPkScaBQ7hHx6BUchRFfPB9tvb7RlNXwjk9qjkp6AcBcF38JgLcu/UDKDqRsuaFJpkK9oclyhA5bDA7SjXWZg==} + '@git.zone/tsbundle@2.5.1': + resolution: {integrity: sha512-gBskgM3ECy9FEmhCWnQahDyFCAjjw/7emjx/KYM/FOlPqGV+hmYzt368zwSlkzOGgYF8k9OZ+mp6vexDL/+f2w==} hasBin: true - '@git.zone/tsrun@1.2.49': - resolution: {integrity: sha512-RnUDdny6jAuuBLx7HqUE38JsHx9nnUUYkDM5vAOREoc6oCI9XVM0QeqIdwFmDz6eeDLBH1+yqjSQPoW5UvflJA==} + '@git.zone/tspublish@1.9.1': + resolution: {integrity: sha512-aLMt2Ew75+5FfhTL6uKPtO0wT2q3gd5zwgEaP7bxgOSlfUhv19nYMp+Hq2XtYB12C1BSdhJ/OyrPEA5tx8Hv0Q==} hasBin: true - '@git.zone/tswatch@2.0.23': - resolution: {integrity: sha512-ADloBDzuyyOjzDLwOVx+5lBEKJdx+r58Qat+oCDOOlRMwDOJcjI4qQOU8PVzFYCh7otraia6aNeXWXfKgKA92g==} + '@git.zone/tsrun@1.3.3': + resolution: {integrity: sha512-DDzWunkxXLtXJTxBf4EioXLwhuqdA2VzdTmOzWrw4Z4Qnms/YM67q36yajwNohAajPYyRz5DayU0ikrceFXyVw==} hasBin: true - '@happy-dom/global-registrator@8.9.0': - resolution: {integrity: sha512-Kw/YMNv1kmH862kQUzXM6K0Y4AW5b0I/+2EIopVc7edurBwY8LHSKd5gJzEEQvdgapSeDJowhOCgL0tkhJWi4A==} + '@git.zone/tswatch@2.1.2': + resolution: {integrity: sha512-ktMILGrSpee2tXP4ex2HB/PShz5u28Dfgyccfnj4VdGVQW8lkCtGRw/Najf/p5qssq46qqIbUSyxz4IuzDtNeg==} + hasBin: true + + '@happy-dom/global-registrator@15.11.7': + resolution: {integrity: sha512-mfOoUlIw8VBiJYPrl5RZfMzkXC/z7gbSpi2ecycrj/gRWLq2CMV+Q+0G+JPjeOmuNFgg0skEIzkVFzVYFP6URw==} + engines: {node: '>=18.0.0'} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + '@lit-labs/ssr-dom-shim@1.3.0': + resolution: {integrity: sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@lit-labs/ssr-dom-shim@1.2.0': - resolution: {integrity: sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==} - - '@lit/reactive-element@1.6.3': - resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} - - '@lit/reactive-element@2.0.4': - resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==} + '@lit/reactive-element@2.1.0': + resolution: {integrity: sha512-L2qyoZSQClcBmq0qajBVbhYEcG6iK0XfLn66ifLe/RfC0/ihpc+pl0Wdn8bJ8o+hj38cG0fGXRgSS20MuXn7qA==} '@mixmark-io/domino@2.2.0': resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} + '@module-federation/error-codes@0.15.0': + resolution: {integrity: sha512-CFJSF+XKwTcy0PFZ2l/fSUpR4z247+Uwzp1sXVkdIfJ/ATsnqf0Q01f51qqSEA6MYdQi6FKos9FIcu3dCpQNdg==} + + '@module-federation/runtime-core@0.15.0': + resolution: {integrity: sha512-RYzI61fRDrhyhaEOXH3AgIGlHiot0wPFXu7F43cr+ZnTi+VlSYWLdlZ4NBuT9uV6JSmH54/c+tEZm5SXgKR2sQ==} + + '@module-federation/runtime-tools@0.15.0': + resolution: {integrity: sha512-kzFn3ObUeBp5vaEtN1WMxhTYBuYEErxugu1RzFUERD21X3BZ+b4cWwdFJuBDlsmVjctIg/QSOoZoPXRKAO0foA==} + + '@module-federation/runtime@0.15.0': + resolution: {integrity: sha512-dTPsCNum9Bhu3yPOcrPYq0YnM9eCMMMNB1wuiqf1+sFbQlNApF0vfZxooqz3ln0/MpgE0jerVvFsLVGfqvC9Ug==} + + '@module-federation/sdk@0.15.0': + resolution: {integrity: sha512-PWiYbGcJrKUD6JZiEPihrXhV3bgXdll4bV7rU+opV7tHaun+Z0CdcawjZ82Xnpb8MCPGmqHwa1MPFeUs66zksw==} + + '@module-federation/webpack-bundler-runtime@0.15.0': + resolution: {integrity: sha512-i+3wu2Ljh2TmuUpsnjwZVupOVqV50jP0ndA8PSP4gwMKlgdGeaZ4VH5KkHAXGr2eiYUxYLMrJXz1+eILJqeGDg==} + + '@napi-rs/wasm-runtime@0.2.11': + resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} + + '@oozcitak/dom@1.15.10': + resolution: {integrity: sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==} + engines: {node: '>=8.0'} + + '@oozcitak/infra@1.0.8': + resolution: {integrity: sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==} + engines: {node: '>=6.0'} + + '@oozcitak/url@1.0.4': + resolution: {integrity: sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==} + engines: {node: '>=8.0'} + + '@oozcitak/util@8.3.8': + resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} + engines: {node: '>=8.0'} + + '@oxc-project/runtime@0.75.0': + resolution: {integrity: sha512-gzRmVI/vorsPmbDXt7GD4Uh2lD3rCOku/1xWPB4Yx48k0EP4TZmzQudWapjN4+7Vv+rgXr0RqCHQadeaMvdBuw==} + engines: {node: '>=6.9.0'} + + '@oxc-project/types@0.75.0': + resolution: {integrity: sha512-QMW+06WOXs7+F301Y3X0VpmWhwuQVc/X/RP2zF9OIwvSMmsif3xURS2wxbakFIABYsytgBcHpUcFepVS0Qnd3A==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@2.3.1': + resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} + engines: {node: '>=12'} + '@push.rocks/consolecolor@2.0.2': resolution: {integrity: sha512-IBwxCLX+YF3f5wB2N4LfuvFqm9WPlBMiEeSAfjN8YQCyYec6u1hlrR3EIj8vT300pppjeGrybJHK+GyjdGXZJw==} @@ -289,24 +509,39 @@ packages: '@push.rocks/isounique@1.0.5': resolution: {integrity: sha512-Z0BVqZZOCif1THTbIKWMgg0wxCzt9CyBtBBqQJiZ+jJ0KlQFrQHNHrPt81/LXe/L4x0cxWsn0bpL6W5DNSvNLw==} + '@push.rocks/levelcache@3.1.1': + resolution: {integrity: sha512-+JpDNEt+EuvmbtADGH9SkODxBy+slHDDzs43mAbuMbwpVvi6uNuMK0Mkhrfz9UFpxUSp+cJE/jl/OxdpD0xL1A==} + '@push.rocks/lik@6.0.15': resolution: {integrity: sha512-rZxln6l4NAU931MTxnsjy1pue+S3AXtDCidHH/tbkqBtrWIzWuXduo6Nz3zYkndbD64Knyta7F60JRvcOe4XqA==} + '@push.rocks/lik@6.2.2': + resolution: {integrity: sha512-j64FFPPyMXeeUorjKJVF6PWaJUfiIrF3pc41iJH4lOh0UUpBAHpcNzHVxTR58orwbVA/h3Hz+DQd4b1Rq0dFDQ==} + '@push.rocks/projectinfo@5.0.2': resolution: {integrity: sha512-zzieCal6jwR++o+fDl8gMpWkNV2cGEsbT96vCNZu/H9kr0iqRmapOiA4DFadkhOnhlDqvRr6TPaXESu2YUbI8Q==} - '@push.rocks/smartbuffer@3.0.4': - resolution: {integrity: sha512-TLfhx/JD61YC8XGO9TI6Ux6US38R14HaIM84QT8hZZod8axfXrg+h8xA8tMUBpSV8PXsQy9LzxmOq0Il1fmDXw==} + '@push.rocks/smartarchive@3.0.8': + resolution: {integrity: sha512-1jPmR0b7hXmjYQoRiTlRXrIbZcdcFmSdGOfznufjcDpGPe86Km0d8TBnzqghTx4dTihzKC67IxAaz/DM3lvxpA==} + + '@push.rocks/smartbucket@3.3.7': + resolution: {integrity: sha512-RiOuEtwHJ+HFbV1nlZgh5VuMvP6PXElX6rVe7OSQsyNCBybRQa/d1qDic92+2Ejx852DGeHlyREELQCxd/a/7w==} + + '@push.rocks/smartbuffer@3.0.5': + resolution: {integrity: sha512-pWYF08Mn8s/KF/9nHRk7pZPzuMjmYVQay2c5gGexdayxn1W4eCSYYhWH73vR2JBfGeGq/izbRNuUuEaIEeTIKA==} '@push.rocks/smartcache@1.0.16': resolution: {integrity: sha512-UAXf74eDuH4/RebJhydIbHlYVR3ACYJjniEY/9ZePblu7bIPgwFZqLBE9g1lcKVogbH9yY62dk3rSpgBzenyfQ==} - '@push.rocks/smartchok@1.0.34': - resolution: {integrity: sha512-YzFjUbyzYREFDc4khcySObLzB21R98yIRFvpu3cB2kRmhEfVD2IEO6Wzp4aWFMhkq5A/dDBJRNmRPtgMVGNqKA==} + '@push.rocks/smartchok@1.1.1': + resolution: {integrity: sha512-WmNigGmn1muBJMANVuJb4F8x3TzgYrnn6YZm6ixTsG+0WFbYevivEwp+J4S7npobLHsR7ynf+Ky8LxRYmsL50A==} '@push.rocks/smartcli@4.0.11': resolution: {integrity: sha512-KDWfUqWBoUZsOEtsDx36d6qc8GG7Zo5E+HHamYY68KVDO8BMu6jbBucoUUPDksczLEmbXKLmroBP1mn/xozQOA==} + '@push.rocks/smartclickhouse@2.0.17': + resolution: {integrity: sha512-IYO8Obor/Ruam2KQ2B/+5uQ+rL0exU5KZoSgOc3jkkrfjn+zZenN2xoV8lVqavAtxZVfG7MfxFrcv6I7I9ZMmA==} + '@push.rocks/smartdelay@3.0.5': resolution: {integrity: sha512-mUuI7kj2f7ztjpic96FvRIlf2RsKBa5arw81AHNsndbxO6asRcxuWL8dTVxouEIK8YsBUlj0AsrCkHhMbLQdHw==} @@ -325,15 +560,18 @@ packages: '@push.rocks/smartfile@10.0.41': resolution: {integrity: sha512-xOOy0duI34M2qrJZggpk51EHGXmg9+mBL1Q55tNiQKXzfx89P3coY1EAZG8tvmep3qB712QEKe7T+u04t42Kjg==} - '@push.rocks/smartfile@11.0.21': - resolution: {integrity: sha512-ZtF8QPGeR/2MJxtHgJY1+FLrOZ+GTLWqwyDz7Woq1x+K9nb4almA1OpdW5IQPBK3ECHur0ghg5bzzKMuR5ZSzg==} + '@push.rocks/smartfile@11.2.5': + resolution: {integrity: sha512-Szmv0dFvDZBLsAOC2kJ0r0J0vZM0zqMAXT1G8XH11maU8pNYtYC1vceTpxoZGy4qbJcko7oGpgNUAlY+8LN3HA==} - '@push.rocks/smartguard@3.0.2': - resolution: {integrity: sha512-9TuYPSRxNj0DS84d5ZvSARXRehVCqVq7nC85o/p58kb3aeRtY0A6Hz9dtSdFjEvprEBCqEEzdmiFlNsNYBpwbQ==} + '@push.rocks/smartguard@3.1.0': + resolution: {integrity: sha512-J23q84f1O+TwFGmd4lrO9XLHUh2DaLXo9PN/9VmTWYzTkQDv5JehmifXVI0esophXcCIfbdIu6hbt7/aHlDF4A==} '@push.rocks/smarthash@3.0.4': resolution: {integrity: sha512-HJ/fSx41jm0CvSaqMLa6b2nuNK5rHAqAeAq3dAB7Sq9BCPm2M0J5ZVDTzEAH8pS91XYniUiwuE0jwPERNn9hmw==} + '@push.rocks/smarthash@3.2.0': + resolution: {integrity: sha512-+dgvrtj9hwE/Xxqy9NLEDw8kmbn4TybFhwHsU6C0baVt7oTy97fj39PO0ooyNCKVfNrfLGhq5iSUTAJiGWnMlQ==} + '@push.rocks/smartjson@5.0.20': resolution: {integrity: sha512-ogGBLyOTluphZVwBYNyjhm5sziPGuiAwWihW07OSRxD4HQUyqj9Ek6r1pqH07JUG5EbtRYivM1Yt1cCwnu3JVQ==} @@ -346,8 +584,8 @@ packages: '@push.rocks/smartlog-interfaces@3.0.2': resolution: {integrity: sha512-8hGRTJehbsFSJxLhCQkA018mZtXVPxPTblbg9VaE/EqISRzUw+eosJ2EJV7M4Qu0eiTJZjnWnNLn8CkD77ziWw==} - '@push.rocks/smartlog@3.0.7': - resolution: {integrity: sha512-WHOw0iHHjCEbYY4KGX40iFtLI11QJvvWIbC9yFn3Mt+nrdupMnry7Ztc5v/PqO8lu33Q6xDBMXiNQ9yNY0HVGw==} + '@push.rocks/smartlog@3.1.8': + resolution: {integrity: sha512-j4H5x4/hEmiIO7q+/LKyX3N+AhRIOj1jDE4TvZDvujZkbT/9wEWfpO1bqeMe/EQbg1eOQMlAuyrcLXUcDICpQg==} '@push.rocks/smartmanifest@2.0.2': resolution: {integrity: sha512-QGc5C9vunjfUbYsPGz5bynV/mVmPHkrQDkWp8ZO8VJtK1GZe+njgbrNyxn2SUHR0IhSAbSXl1j4JvBqYf5eTVg==} @@ -361,11 +599,14 @@ packages: '@push.rocks/smartmime@1.0.6': resolution: {integrity: sha512-PHd+I4UcsnOATNg8wjDsSAmmJ4CwQFrQCNzd0HSJMs4ZpiK3Ya91almd6GLpDPU370U4HFh4FaPF4eEAI6vkJQ==} - '@push.rocks/smartmime@2.0.2': - resolution: {integrity: sha512-aXH1sFD73q9cEwPdeSeN7Zxd2aoVt9wE97ILFCW5gORylvm85Hgfq7SYkqykjQzEL8IDJKJF3G78+xcL2rALTg==} + '@push.rocks/smartmime@2.0.4': + resolution: {integrity: sha512-mG6lRBLr5nF+GLZmgCcdjhdDsmTtJWBFZDCa1eJ8Au9TvUzbPW0fY5aqJBb3UwfyZzH6St8Th9cJSXjagOQkYA==} - '@push.rocks/smartntml@2.0.4': - resolution: {integrity: sha512-cO1190fQsGZu5ycar1C6i7gCC16y/ywc8Ipn+aTKpDMMLO2HMuCvTurMBgjT0NeD8ZEXjc/yZ7n0m3KTxw6NSg==} + '@push.rocks/smartnpm@2.0.4': + resolution: {integrity: sha512-ljRPqnUsXzL5qnuAEt5POy0NnfKs7eYPuuJPJjYiK9VUdP/CyF4h14qTB4H816vNEuF7VU/ASRtz0qDlXmrztg==} + + '@push.rocks/smartntml@2.0.8': + resolution: {integrity: sha512-LIYeOQbmav2m2kZQz4pGS74xvWAm4YAGQnbPkofA2oas4RW9SGR1JTRpFd9pxGCOXd6djYdNGsZZ/xz+k/vRPQ==} '@push.rocks/smartobject@1.0.12': resolution: {integrity: sha512-xSMiqXiZXXUOixT3QIPsOUKOWjL3YA/1h9/YTiCzqs5C0D3tyfTbojnfcp6YbKZoBzans2I5LghaDHsGid2DKQ==} @@ -379,35 +620,44 @@ packages: '@push.rocks/smartpromise@4.0.4': resolution: {integrity: sha512-Mbh+DnX4+rVPEZgYU7LtTJI/AYoNn7+h27AycEFpPJW41DCfjTiXiI0+ecNdyO1AfbcL0Q02RQjoEauEWx5FQg==} + '@push.rocks/smartpromise@4.2.3': + resolution: {integrity: sha512-Ycg/TJR+tMt+S3wSFurOpEoW6nXv12QBtKXgBcjMZ4RsdO28geN46U09osPn9N9WuwQy1PkmTV5J/V4F9U8qEw==} + '@push.rocks/smartrequest@2.0.22': resolution: {integrity: sha512-EfgmdEsLtDJ8aNOLOh59ca1NMsiiFz54aoHRigQFQ0cuoUs6phxejIY2FdMoPFn68ubTpkztdL2P4L1/cRYyHg==} - '@push.rocks/smartrouter@1.0.16': - resolution: {integrity: sha512-GsEv6paOuIbC3vkIS5LxNroK68mNygB+oSDJRaUOE8/OCJLk0aPfI579nEiuXP/DkGjC1SjQ2bUWc3BTaUM3GQ==} + '@push.rocks/smartrequest@2.1.0': + resolution: {integrity: sha512-3eHLTRInHA+u+W98TqJwgTES7rRimBAsJC4JxVNQC3UUezmblAhM5/TIQsEBQTsbjAY8SeQKy6NHzW6iTiaD8w==} + + '@push.rocks/smartrouter@1.3.2': + resolution: {integrity: sha512-JtkxClN4CaHXMSeLDNvfWPwiVEPdEoQVSX2ee3gLgbXNO9dt9hvXdIhFrnFeLwyeA6M8nJdb9SqjrjZroYJsxw==} + + '@push.rocks/smartrx@3.0.10': + resolution: {integrity: sha512-USjIYcsSfzn14cwOsxgq/bBmWDTTzy3ouWAnW5NdMyRRzEbmeNrvmy6TRqNeDlJ2PsYNTt1rr/zGUqvIy72ITg==} '@push.rocks/smartrx@3.0.7': resolution: {integrity: sha512-qCWy0s3RLAgGSnaw/Gu0BNaJ59CsI6RK5OJDCCqxc7P2X/S755vuLtnAR5/0dEjdhCHXHX9ytPZx+o9g/CNiyA==} - '@push.rocks/smartshell@3.0.5': - resolution: {integrity: sha512-kHh86kpkrXHM/xgftcFQ2psU+DJrINzbeD1gIKR/I6cEXjWyYfs+I6UnFMhY3Bcpx9FdTElpRy5qVsumWURQSw==} + '@push.rocks/smartshell@3.2.3': + resolution: {integrity: sha512-BWA/DH1H9lG7Er23d4uYgirfYaya5dX4g/WpWm2la7mOzuL9o2FnPIhel52DQUKIh7ty3Ql305ApV8YaAb4+/w==} '@push.rocks/smartsitemap@2.0.3': resolution: {integrity: sha512-jIcms8V1b2mt3dS4PKNlLR1DRC8pCDWMRVbnyM/2+snZOJZonQRlQzAyX8No0EfLbfdrfnxv2IjPX13X29Re6g==} - '@push.rocks/smartsocket@2.0.27': - resolution: {integrity: sha512-planM3EkBvx/+guLLWHLBNnNp4mcWDwp1k9G0It0ul7IhdaBQsSWzKSQJxym3Bx2dypgA2UIeT3/hRvSa5Nqdw==} + '@push.rocks/smartsocket@2.1.0': + resolution: {integrity: sha512-etOGyfiDFQz/1WJnD3jFL2N7ykujTjiudAz6qZTz82xE5oabKuKX+Cn8SdM9dOwzyWmBUKbUdll8QhovAXjn+g==} '@push.rocks/smartspawn@3.0.3': resolution: {integrity: sha512-DyrGPV69wwOiJgKkyruk5hS3UEGZ99xFAqBE9O2nM8VXCRLbbty3xt1Ug5Z092ZZmJYaaGMSnMw3ijyZJFCT0Q==} - '@push.rocks/smartstate@2.0.17': - resolution: {integrity: sha512-ucx0zq8gWL3MuN4ogibUiGJlEH0of9WyDfxu+4pQySEdaZBJw0/UFkBM8wButkj0dF8w4wsVMN4YwZAdVqsAXg==} + '@push.rocks/smartstate@2.0.20': + resolution: {integrity: sha512-KKrISIgtyhscVr7Td5O8SqOrAli0zhU9qohjG8R5fyBS/1WSPEt2RI9aRU2M2UTH3WQS4ZXK/zmagTbguUjRhA==} '@push.rocks/smartstream@2.0.8': resolution: {integrity: sha512-GlF/9cCkvBHwKa3DK4DO5wjfSgqkj6gAS4TrY9uD5NMHu9RQv4WiNrElTYj7iCEpnZgUnLO3tzw1JA3NRIMnnA==} - '@push.rocks/smartstream@3.0.44': - resolution: {integrity: sha512-BZwSUmhVD/CEzRdG/e2UachlyNjshiknqBnwHzIFPIjVKC66UgWX5lYCs2LOwJtuUEpfL1vTMOAYUFNcmPjW9A==} + '@push.rocks/smartstream@3.2.5': + resolution: {integrity: sha512-PLGGIFDy8JLNVUnnntMSIYN4W081YSbNC7Y/sWpvUT8PAXtbEXXUiDFgK5o3gcI0ptpKQxHAwxhzNlPj0sbFVg==} '@push.rocks/smartstring@4.0.15': resolution: {integrity: sha512-NTNeOjWyg+aHtBTiQEyXamr7oTvYZ3wS1fudHo9ua7CLrykpK+i+RxFyJaLg1zB5x9xQF3NLEQecB14HPFX8Cg==} @@ -415,14 +665,23 @@ packages: '@push.rocks/smarttime@4.0.8': resolution: {integrity: sha512-He+1ebBowVd8rW+VHZMFmz407xVMQf/JbyKr3s1ozoIlJS1AhZpDvlkzyqLV2tNMP1/cEBeo25ImJN2x1pksBA==} + '@push.rocks/smarttime@4.1.1': + resolution: {integrity: sha512-Ha/3J/G+zfTl4ahpZgF6oUOZnUjpLhrBja0OQ2cloFxF9sKT8I1COaSqIfBGDtoK2Nly4UD4aTJ3JcJNOg/kgA==} + '@push.rocks/smartunique@3.0.9': resolution: {integrity: sha512-q6DYQgT7/dqdWi9HusvtWCjdsFzLFXY9LTtaZV6IYNJt6teZOonoygxTdNt9XLn6niBSbLYrHSKvJNTRH/uK+g==} '@push.rocks/smarturl@3.0.7': resolution: {integrity: sha512-nx4EWjQD9JeO7QVbOsxd1PFeDQYoSQOOOYCZ+r7QWXHLJG52iYzgvJDCQyX6p705HDkYMJWozW2ZzhR22qLKbw==} - '@push.rocks/smartxml@1.0.8': - resolution: {integrity: sha512-idrPsBj9t6oxkLZJZgWtyZK6PnQ5BVDbBErk0UfGanXgSWJc+ZEKNYjVqr850+Na3+y0CT6AQdug7pnaokygwg==} + '@push.rocks/smarturl@3.1.0': + resolution: {integrity: sha512-ij73Q4GERojdPSHxAvYKvspimcpAJC6GGQCWsC4b+1sAiOSByjfmkUHK8yiEEOPRU9AeGuyaIVqK6ZzKLEZ3vA==} + + '@push.rocks/smartversion@3.0.5': + resolution: {integrity: sha512-8MZSo1yqyaKxKq0Q5N188l4un++9GFWVbhCAX5mXJwewZHn97ujffTeL+eOQYpWFTEpUhaq1QhL4NhqObBCt1Q==} + + '@push.rocks/smartxml@1.1.1': + resolution: {integrity: sha512-1toSmLE1EGK8oENh09XjV588+IdzUB3x1PCaxKjSyIsAt54bUQj3kH/yzLODF+19p07OE0KM5U1oqWpjOcFCzA==} '@push.rocks/smartyaml@2.0.5': resolution: {integrity: sha512-tBcf+HaOIfeEsTMwgUZDtZERCxXQyRsWO8Ar5DjBdiSRchbhVGZQEBzXswMS0W5ZoRenjgPK+4tPW3JQGRTfbg==} @@ -498,15 +757,363 @@ packages: resolution: {integrity: sha512-5SpUqD3X/2IZCTezCpk48Ss7cDc9QOuQAkeAYnJrRjDL4UCLakA3lBeHXRD/rsIB7S1smtXlayQ/vizfYzdbfw==} deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarttime + '@rolldown/binding-darwin-arm64@1.0.0-beta.21': + resolution: {integrity: sha512-FFkhqqq4kz7UCa4mGkexdsPK5++31zBTnhUTYhDUX+hdCwcYOlh2r2WsjHY+fQCMbIJ2UqOdAIocVGirs6/f7w==} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.21': + resolution: {integrity: sha512-To/Ma+/5rxSoCVO/EInVCpQBB5YA4PDme0yYsbC5b76d+1OzuENaY4iq8vmCcEDZVnTU+xnfwfiMR9X+gB8W/w==} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.21': + resolution: {integrity: sha512-Z1lct0slFVDp08xzmRX6dPI7/uh6JG8dAswVdM4h5jjeXksC2AQpzBj4YgeX6t0OI428PC7FKP1k6T8HZS7Frg==} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.21': + resolution: {integrity: sha512-XKfjZLMODXpgHW1gZUkP/3giahuZD+35ft92nJX6qzEAjcwsZRNsAW2mlWPH68Kp97TBw09+zkNuL8vP66L9uw==} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.21': + resolution: {integrity: sha512-Q+5C4gUakWccecCmsr3ts6ypQzGPHUp+ooUQhQAf7L6bTv6037gsRYGDdkxla77S5+VfLXBwNXKZFsndDOuZoQ==} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.21': + resolution: {integrity: sha512-xf30hS7YvyZlkqR3NZAWm+so0m9Rrp24TRq1F4UmNWpDL5Cwbmgak/Cn4IYUEY6PE960+ZejuAhbCDPt5Bxaeg==} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.21': + resolution: {integrity: sha512-/X3MvmRcIQSxmHF/TxO2SI0snHjGlY2uO3BKwgPA100hSmvVDuz6cFB80tcGNCUVSJAtRHt/FniNTmbMHfdHLQ==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.21': + resolution: {integrity: sha512-z5rjicKLgYiffiHOQgM3kROyEUILRZx3GeLtRnrf9yjgMDdpguRl3ggB67ej5ytgRXn5K5F13lsIv5R0i9KRFQ==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.21': + resolution: {integrity: sha512-v5eFQYJcD4a2FBb/KDzS+bhVW2tf5aolJCbAiqlVnJwD3dbYMQtwJRwej2kISDerGplx6yQIHp5R5Y7GRoEGhw==} + engines: {node: '>=14.21.3'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.21': + resolution: {integrity: sha512-1QZIJXSlbIlHJT6xY1YCuyF54sSOoOlsUaX3pWlJvuZs4fbgl894gN4wZATYd0V7KT62qfRdB40wg0yfrTkfFQ==} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.21': + resolution: {integrity: sha512-JXTN7gKNmQoFtqYrCK0If4HuZagvBQ7ThY6fl2rAMbUXpq3mtVd+Z2k0TzzeWB7Nxwo6FusLYYlbmPYS5QCl1w==} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.21': + resolution: {integrity: sha512-wp7kF6IpuVVqQVzkaDxrxJqBByMSEJ8uAa9LTW1fK2x8TulNRjlxPRpjeDNji2uiEGa+QbdQDfRm/WS8ROnutg==} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.21': + resolution: {integrity: sha512-OTjWr7XYqRZaSzi6dTe0fP25EEsYEQ2H04xIedXG3D0Hrs+Bpe3V5L48R6y+R5ohTygp1ijC09mbrd7vlslpzA==} + + '@rspack/binding-darwin-arm64@1.4.1': + resolution: {integrity: sha512-enh5DYbpaexdEmjbcxj3BJDauP3w+20jFKWvKROtAQV350PUw0bf2b4WOgngIH9hBzlfjpXNYAk6T5AhVAlY3Q==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.4.1': + resolution: {integrity: sha512-KoehyhBji4TLXhn4mqOUw6xsQNRzNVA9XcCm1Jx+M1Qb0dhMTNfduvBSyXuRV5+/QaRbk7+4UJbyRNFUtt96kA==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.4.1': + resolution: {integrity: sha512-PJ5cHqvrj1bK7jH5DVrdKoR8Fy+p6l9baxXajq/6xWTxP+4YTdEtLsRZnpLMS1Ho2RRpkxDWJn+gdlKuleNioQ==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.4.1': + resolution: {integrity: sha512-cpDz+z3FwVQfK6VYfXQEb0ym6fFIVmvK4y3R/2VAbVGWYVxZB5I6AcSdOWdDnpppHmcHpf+qQFlwhHvbpMMJNQ==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.4.1': + resolution: {integrity: sha512-jjTx53CpiYWK7fAv5qS8xHEytFK6gLfZRk+0kt2YII6uqez/xQ3SRcboreH8XbJcBoxINBzMNMf5/SeMBZ939A==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.4.1': + resolution: {integrity: sha512-FAyR3Og81Smtr/CnsuTiW4ZCYAPCqeV73lzMKZ9xdVUgM9324ryEgqgX38GZLB5Mo7cvQhv7/fpMeHQo16XQCw==} + cpu: [x64] + os: [linux] + + '@rspack/binding-wasm32-wasi@1.4.1': + resolution: {integrity: sha512-3Q1VICIQP4GsaTJEmmwfowQ48NvhlL0CKH88l5+mbji2rBkGx7yR67pPdfCVNjXcCtFoemTYw98eaumJTjC++g==} + cpu: [wasm32] + + '@rspack/binding-win32-arm64-msvc@1.4.1': + resolution: {integrity: sha512-DdLPOy1J98kn45uEhiEqlBKgMvet+AxOzX2OcrnU0wQXthGM9gty1YXYNryOhlK+X+eOcwcP3GbnDOAKi8nKqw==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.4.1': + resolution: {integrity: sha512-13s8fYtyC9DyvKosD2Kvzd6fVZDZZyPp91L4TEXWaO0CFhaCbtLTYIntExq9MwtKHYKKx7bchIFw93o0xjKjUg==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.4.1': + resolution: {integrity: sha512-ubQW8FcLnwljDanwTzkC9Abyo59gmX8m9uVr1GHOEuEU9Cua0KMijX2j/MYfiziz4nuQgv1saobY7K1I5nE3YA==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.4.1': + resolution: {integrity: sha512-zYgOmI+LC2zxB/LIcnaeK66ElFHaPChdWzRruTT1LAFFwpgGkBGAwFoP27PDnxQW0Aejci21Ld8X9tyxm08QFw==} + + '@rspack/core@1.4.1': + resolution: {integrity: sha512-UTRCTQk2G8YiPBiMvfn8FcysxeO4Muek6a/Z39Cw2r4ZI8k5iPnKiyZboTJLS7120PwWBw2SO+QQje35Z44x0g==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@rspack/lite-tapable@1.0.1': + resolution: {integrity: sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==} + engines: {node: '>=16.0.0'} + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + '@smithy/abort-controller@4.0.4': + resolution: {integrity: sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader-native@4.0.0': + resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader@5.0.0': + resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} + engines: {node: '>=18.0.0'} + + '@smithy/config-resolver@4.1.4': + resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.6.0': + resolution: {integrity: sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.0.6': + resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-codec@4.0.4': + resolution: {integrity: sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-browser@4.0.4': + resolution: {integrity: sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-config-resolver@4.1.2': + resolution: {integrity: sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-node@4.0.4': + resolution: {integrity: sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-universal@4.0.4': + resolution: {integrity: sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.0.4': + resolution: {integrity: sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-blob-browser@4.0.4': + resolution: {integrity: sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-node@4.0.4': + resolution: {integrity: sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-stream-node@4.0.4': + resolution: {integrity: sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==} + engines: {node: '>=18.0.0'} + + '@smithy/invalid-dependency@4.0.4': + resolution: {integrity: sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==} + engines: {node: '>=18.0.0'} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@4.0.0': + resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} + engines: {node: '>=18.0.0'} + + '@smithy/md5-js@4.0.4': + resolution: {integrity: sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-content-length@4.0.4': + resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-endpoint@4.1.13': + resolution: {integrity: sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.1.14': + resolution: {integrity: sha512-eoXaLlDGpKvdmvt+YBfRXE7HmIEtFF+DJCbTPwuLunP0YUnrydl+C4tS+vEM0+nyxXrX3PSUFqC+lP1+EHB1Tw==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-serde@4.0.8': + resolution: {integrity: sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-stack@4.0.4': + resolution: {integrity: sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==} + engines: {node: '>=18.0.0'} + + '@smithy/node-config-provider@4.1.3': + resolution: {integrity: sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.0.6': + resolution: {integrity: sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==} + engines: {node: '>=18.0.0'} + + '@smithy/property-provider@4.0.4': + resolution: {integrity: sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==} + engines: {node: '>=18.0.0'} + + '@smithy/protocol-http@5.1.2': + resolution: {integrity: sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-builder@4.0.4': + resolution: {integrity: sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-parser@4.0.4': + resolution: {integrity: sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==} + engines: {node: '>=18.0.0'} + + '@smithy/service-error-classification@4.0.6': + resolution: {integrity: sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.0.4': + resolution: {integrity: sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.1.2': + resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} + engines: {node: '>=18.0.0'} + + '@smithy/smithy-client@4.4.5': + resolution: {integrity: sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.3.1': + resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} + engines: {node: '>=18.0.0'} + + '@smithy/url-parser@4.0.4': + resolution: {integrity: sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-base64@4.0.0': + resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-browser@4.0.0': + resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-node@4.0.0': + resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@4.0.0': + resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} + engines: {node: '>=18.0.0'} + + '@smithy/util-config-provider@4.0.0': + resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-browser@4.0.21': + resolution: {integrity: sha512-wM0jhTytgXu3wzJoIqpbBAG5U6BwiubZ6QKzSbP7/VbmF1v96xlAbX2Am/mz0Zep0NLvLh84JT0tuZnk3wmYQA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-node@4.0.21': + resolution: {integrity: sha512-/F34zkoU0GzpUgLJydHY8Rxu9lBn8xQC/s/0M0U9lLBkYbA1htaAFjWYJzpzsbXPuri5D1H8gjp2jBum05qBrA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-endpoints@3.0.6': + resolution: {integrity: sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-hex-encoding@4.0.0': + resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-middleware@4.0.4': + resolution: {integrity: sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-retry@4.0.6': + resolution: {integrity: sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-stream@4.2.2': + resolution: {integrity: sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==} + engines: {node: '>=18.0.0'} + + '@smithy/util-uri-escape@4.0.0': + resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@4.0.0': + resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} + engines: {node: '>=18.0.0'} + + '@smithy/util-waiter@4.0.6': + resolution: {integrity: sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg==} + engines: {node: '>=18.0.0'} + '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + '@tempfix/idb@8.0.3': resolution: {integrity: sha512-hPJQKO7+oAIY+pDNImrZ9QAINbz9KmwT+yO4iRVwdPanok2YKpaUxdJzIvCUwY0YgAawlvYdffbLvRLV5hbs2g==} - '@tempfix/watcher@2.3.0': - resolution: {integrity: sha512-a2qVQffcrnetehvwsN+LdipxQ6jejwZLgAvS9/91+C0gP4CKyikY01c0tSs0I4tSL7qHdCw1Fx0quLw+A9uyLA==} - '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -516,20 +1123,20 @@ packages: '@tsclass/tsclass@4.0.61': resolution: {integrity: sha512-E+LEX/cpRy0uMOJ3oQz3rBqfeMyCraVPeromT7VH9esYxUPh2SiRMIN6Im250IHXx7ANl0TNyX27UmbaD347GQ==} - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + '@tsclass/tsclass@4.4.4': + resolution: {integrity: sha512-YZOAF+u+r4u5rCev2uUd1KBTBdfyFdtDmcv4wuN+864lMccbdfRICR3SlJwCfYS1lbeV3QNLYGD30wjRXgvCJA==} - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + '@tsclass/tsclass@8.2.1': + resolution: {integrity: sha512-bRDCfJTipsTcK6eEokWdsOR1mGCQFeM7zTg6PRHzbxTWQcWQD9AhEr2q3CrPcmAbvIS7fvkO6/pU/mPm1MZxhQ==} - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + '@tsclass/tsclass@9.2.0': + resolution: {integrity: sha512-A6ULEkQfYgOnCKQVQRt26O7PRzFo4PE2EoD25RAtnuFuVrNwGynYC20Vee2c8KAOyI7nQ/LaREki9KAX4AHOHQ==} - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} '@types/buffer-json@2.0.3': resolution: {integrity: sha512-ItD4UfF3Q5jA+PEV6ZUWEHvlWaXJbd0rpuBKOIrEebM053FHaJddKsgUf0vy7nLSTs44nqFj3Mh8J3TiT0xv4g==} @@ -540,20 +1147,17 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/cookie@0.4.1': - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - - '@types/cors@2.8.17': - resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/express-serve-static-core@4.19.5': - resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} + '@types/express-serve-static-core@5.0.6': + resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@5.0.3': + resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} '@types/from2@2.3.5': resolution: {integrity: sha512-giavnjf3kNlJnE+HpZA1CQ3UKHxgehzsTuIMGda8pGMbOiLYGVNADEskey44OZcADHm/HOoBany8IV+0x28XFw==} @@ -564,14 +1168,20 @@ packages: '@types/glob@8.1.0': resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + '@types/gunzip-maybe@1.4.2': + resolution: {integrity: sha512-2uqXZg1jTCKE1Pjbab8qb74+f2+i9h/jz8rQ+jRR+zaNJF75zWwrpbX8/TjF4m56m3KFOg9umHdCJ074KwiVxg==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} '@types/html-minifier@4.0.5': resolution: {integrity: sha512-LfE7f7MFd+YUfZnlBz8W43P4NgSObWiqyKapANsWCj63Aqeqli8/9gVsGP4CwC8jPpTTYlTopKCk9rJSuht/ew==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} '@types/js-yaml@3.12.10': resolution: {integrity: sha512-/Mtaq/wf+HxXpvhzFYzrzCqNRcA958sW++7JOFC8nPrZcvfi/TrzOaaGbvt27ltJB2NQbHVAg5a1wUCsyMH7NA==} @@ -594,14 +1204,14 @@ packages: '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@18.19.39': - resolution: {integrity: sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==} + '@types/node@24.0.7': + resolution: {integrity: sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw==} - '@types/qs@6.9.15': - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/randomatic@3.1.5': resolution: {integrity: sha512-VCwCTw6qh1pRRw+5rNTAwqPmf6A+hdrkdM7dBpZVmhl7g+em3ONXlYK/bWPVKqVGMWgP0d1bog8Vc/X6zRwRRQ==} @@ -612,29 +1222,35 @@ packages: '@types/relateurl@0.2.33': resolution: {integrity: sha512-bTQCKsVbIdzLqZhLkF5fcJQreE4y1ro4DIyVrlDNSCJRRwHhB8Z+4zXXa8jN6eDvc2HbRsEYgbvrnGvi54EpSw==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} '@types/symbol-tree@3.2.5': resolution: {integrity: sha512-zXnnyENt1TYQcS21MkPaJCVjfcPq7p7yc5mo5JACuumXp6sly5jnlS0IokHd+xmmuCbx6V7JqkMBpswR+nZAcw==} + '@types/tar-stream@2.2.3': + resolution: {integrity: sha512-if3mugZfjVkXOMZdFjIHySxY13r6GXPpyOlsDmLffvyI7tLz9wXE8BFjNivXsvUeyJ1KNlOpfLnag+ISmxgxPw==} + '@types/through2@2.0.41': resolution: {integrity: sha512-ryQ0tidWkb1O1JuYvWKyMLYEtOWDqF5mHerJzKz/gQpoAaJq2l/dsMPBF0B5BNVT34rbARYJ5/tsZwLfUi2kwQ==} '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/turndown@5.0.4': - resolution: {integrity: sha512-28GI33lCCkU4SGH1GvjDhFgOVr+Tym4PXGBIU1buJUa6xQolniPArtUT+kv42RR2N9MsMLInkr904Aq+ESHBJg==} + '@types/turndown@5.0.5': + resolution: {integrity: sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==} '@types/uglify-js@3.17.5': resolution: {integrity: sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==} - '@types/unist@3.0.2': - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} @@ -642,8 +1258,8 @@ packages: '@types/which@3.0.4': resolution: {integrity: sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w==} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} '@uptime.link/interfaces@2.0.21': resolution: {integrity: sha512-sy7WBzHOxU7Kt0BGofK0R3CS8D8QtbTXB00i75QKYXkEesdLd91SbFL80wTupKfjzeldE0ejUVSgvtlZEr8XlQ==} @@ -652,19 +1268,14 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} - acorn-walk@8.3.3: - resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} - engines: {node: '>=0.4.0'} - - acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} - engines: {node: '>=0.4.0'} - hasBin: true - agentkeepalive@4.5.0: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + ansi-256-colors@1.1.0: resolution: {integrity: sha1-kQ3lDvzHwJ49gvL4er1rcAwYgYo=} engines: {node: '>=0.10.0'} @@ -685,8 +1296,9 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + engines: {node: '>=14'} argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -700,15 +1312,17 @@ packages: asynckit@0.4.0: resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-arraybuffer-es6@0.7.0: - resolution: {integrity: sha512-ESyU/U1CFZDJUdr+neHRhNozeCv72Y7Vm0m1DCbjX3KBjT6eYocvAJlSk6+8+HkVwXlT1FNxhGW6q3UKAlCvvw==} - engines: {node: '>=6.0.0'} + bare-events@2.5.4: + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -717,18 +1331,27 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - broadcast-channel@7.0.0: - resolution: {integrity: sha512-a2tW0Ia1pajcPBOGUF2jXlDnvE9d5/dg6BG9h60OmRUcZVr/veUrU8vEQFwwQIhwG3KVzYwSk3v2nRRGFgQDXQ==} + broadcast-channel@7.1.0: + resolution: {integrity: sha512-InJljddsYWbEL8LBnopnCg+qMQp9KcowvYWOt4YWrjD5HmxzDYKdVbDS1w/ji5rFZdRD58V5UxJPtBdpEbEJYw==} + + browserify-zlib@0.1.4: + resolution: {integrity: sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} buffer-json@2.0.0: resolution: {integrity: sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==} @@ -740,10 +1363,26 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -763,6 +1402,14 @@ packages: character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + clean-css@4.2.4: resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} engines: {node: '>= 4.0'} @@ -791,6 +1438,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -802,12 +1452,12 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} - cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} core-util-is@1.0.3: @@ -817,9 +1467,6 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - croner@5.7.0: resolution: {integrity: sha512-9pSLe+tDJnmNak2JeMkz6ZmTCXP5p6vCxSd4kvDqrTJkqAP62j2uAEIZjf8cPDZIakStujqVzh5Y5MIWH3yYAw==} engines: {node: '>=6.0'} @@ -828,20 +1475,31 @@ packages: resolution: {integrity: sha512-05wALDHKjt9zG1JbpziNnWPCwwv9fUKbNf6q0dWaDMJ/eDxW0394Q2R1VAzKvDgoEZBT9FhWSHHFIcgwLgXjcQ==} engines: {node: '>=6.0'} + croner@9.1.0: + resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==} + engines: {node: '>=18.0'} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + crypto-random-string@5.0.0: resolution: {integrity: sha512-KWjTXWwxFd6a94m5CdRGW/t82Tr8DoBc9dNnPCAbFI1EBweN6v1tv8y4Y1m7ndkp/nkIBRxUxAzpaBnR2k3bcQ==} engines: {node: '>=14.16'} - css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} dayjs@1.11.11: resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -850,8 +1508,8 @@ packages: supports-color: optional: true - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -859,8 +1517,29 @@ packages: supports-color: optional: true - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} @@ -893,12 +1572,12 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} - domexception@1.0.1: - resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -916,15 +1595,22 @@ packages: resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=} engines: {node: '>= 0.8'} - engine.io-client@6.5.4: - resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} - engine.io-parser@5.2.2: - resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + engine.io-client@6.6.3: + resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - engine.io@6.5.4: - resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} + engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} engines: {node: '>=10.2.0'} entities@2.2.0: @@ -938,13 +1624,25 @@ packages: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + engines: {node: '>=18'} hasBin: true escape-html@1.0.3: @@ -974,28 +1672,36 @@ packages: resolution: {integrity: sha1-AbK0mK5v0uQRUrIrV6Phc3c69n4=} engines: {node: '>=0.2.2'} - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - fake-indexeddb@4.0.2: - resolution: {integrity: sha512-SdTwEhnakbgazc7W3WUXOJfGmhH0YfG4d+dRPOFoYDRTL6U5t8tvrmkf2W/C3W1jk2ylV7Wrnj44RASqpX/lEw==} - fake-indexeddb@5.0.2: resolution: {integrity: sha512-cB507r5T3D55DfclY01GLkninZLfU7HXV/mhVRTnTRm5k2u+fY7Fof2dBkr80p5t7G7dlA/G5dI87QiMdPpMCQ==} engines: {node: '>=18'} + fake-indexeddb@6.0.1: + resolution: {integrity: sha512-He2AjQGHe46svIFq5+L2Nx/eHDTI1oKgoevBP+TthnjymXiKkeJQ3+ITeWey99Y5+2OaPFbI1qEsx/5RsGtWnQ==} + engines: {node: '>=18'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-xml-parser@4.4.0: - resolution: {integrity: sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==} + fast-xml-parser@4.4.1: + resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} + hasBin: true + + fast-xml-parser@4.5.3: + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} hasBin: true fault@2.0.1: @@ -1005,12 +1711,12 @@ packages: resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} engines: {node: '>=0.4.0'} - file-type@19.0.0: - resolution: {integrity: sha512-s7cxa7/leUWLiXO78DVVfBVse+milos9FitauDLG1pI7lNaJ2+5lzPnr2N24ym+84HVwJL6hVuGfgVE+ALvU8Q==} + file-type@19.6.0: + resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} engines: {node: '>=18'} - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} foreground-child@2.0.0: @@ -1021,10 +1727,22 @@ packages: resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} + engines: {node: '>= 6'} + format@0.2.2: resolution: {integrity: sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=} engines: {node: '>=0.4.x'} @@ -1044,9 +1762,22 @@ packages: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + fs.realpath@1.0.0: resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -1054,22 +1785,62 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + glob@10.4.2: resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} engines: {node: '>=16 || 14 >=14.18'} hasBin: true + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - happy-dom@8.9.0: - resolution: {integrity: sha512-JZwJuGdR7ko8L61136YzmrLv7LgTh5b8XaEM3P709mLjyQuXJ3zHTDXvUtBBahRjGlcYW0zGjIiEWizoTUGKfA==} + gunzip-maybe@1.4.2: + resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} + hasBin: true + + happy-dom@15.11.7: + resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} + engines: {node: '>=18.0.0'} has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -1082,34 +1853,27 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} - hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - - hast-util-raw@9.0.4: - resolution: {integrity: sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==} - - hast-util-sanitize@5.0.1: - resolution: {integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==} - - hast-util-to-html@9.0.1: - resolution: {integrity: sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==} - - hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} - he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -1122,10 +1886,17 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + humanize-ms@1.2.1: resolution: {integrity: sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=} @@ -1133,10 +1904,6 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -1146,10 +1913,16 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + is-deflate@1.0.0: + resolution: {integrity: sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ=} + is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -1159,6 +1932,10 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-gzip@1.0.0: + resolution: {integrity: sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=} + engines: {node: '>=0.10.0'} + is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} @@ -1175,6 +1952,10 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -1197,6 +1978,10 @@ packages: resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} engines: {node: '>=14'} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} @@ -1208,30 +1993,41 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - lit-element@3.3.3: - resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + lenis@1.3.4: + resolution: {integrity: sha512-WIGk8wiV2ABm/T7M+NC+tAV8fjzNJD1J4z11aZ3mTtx7WAZX/4QdCNhBO0g/TqXISA+/3hTbzrPC4FW1nhoNMQ==} + peerDependencies: + '@nuxt/kit': '>=3.0.0' + react: '>=17.0.0' + vue: '>=3.0.0' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + react: + optional: true + vue: + optional: true - lit-element@4.0.6: - resolution: {integrity: sha512-U4sdJ3CSQip7sLGZ/uJskO5hGiqtlpxndsLr6mt3IQIjheg93UKYeGQjWMRql1s/cXNOaRrCzC2FQwjIwSUqkg==} + lit-element@4.2.0: + resolution: {integrity: sha512-MGrXJVAI5x+Bfth/pU9Kst1iWID6GHDLEzFEnyULB/sFiRLgkd8NPK/PeeXxktA3T6EIIaq8U3KcbTU5XFcP2Q==} - lit-html@2.8.0: - resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + lit-html@3.3.0: + resolution: {integrity: sha512-RHoswrFAxY2d8Cf2mm4OZ1DgzCoBKUKSPvA1fhtSELxUERq2aQQ2h05pO9j81gS1o7RIRJ+CePLogfyahwmynw==} - lit-html@3.1.4: - resolution: {integrity: sha512-yKKO2uVv7zYFHlWMfZmqc+4hkmSbFp8jgjdZY9vvR9jr4J8fH6FUMXhr+ljfELgmjpvlF7Z1SJ5n5/Jeqtc9YA==} - - lit@2.8.0: - resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} - - lit@3.1.4: - resolution: {integrity: sha512-q6qKnKXHy2g1kjBaNfcoLlgbI3+aSOZ9Q4tiGa9bGYXq5RBXxkVTqTIVmP2VWMp29L4GyvCFm8ZQ2o56eUAMyA==} + lit@3.3.0: + resolution: {integrity: sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==} lodash._baseassign@3.2.0: resolution: {integrity: sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=} @@ -1269,19 +2065,24 @@ packages: lodash.restparam@3.6.1: resolution: {integrity: sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} lower-case@1.1.4: resolution: {integrity: sha1-miyr0bno4K6ZOkv31YdcOcQujqw=} + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lru-cache@10.2.2: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} + lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} + make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -1292,30 +2093,34 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} matcher@5.0.0: resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + math-random@1.0.4: resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} - mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} - mdast-util-from-markdown@2.0.1: - resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} mdast-util-frontmatter@2.0.1: resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} - mdast-util-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - mdast-util-gfm-footnote@2.0.0: - resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} mdast-util-gfm-strikethrough@2.0.0: resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} @@ -1326,8 +2131,8 @@ packages: mdast-util-gfm-task-list-item@2.0.0: resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - mdast-util-gfm@3.0.0: - resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} @@ -1335,8 +2140,8 @@ packages: mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} - mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} @@ -1345,99 +2150,99 @@ packages: resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} engines: {node: '>= 0.6'} - merge-descriptors@1.0.1: - resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} methods@1.1.2: resolution: {integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=} engines: {node: '>= 0.6'} - micromark-core-commonmark@2.0.1: - resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} micromark-extension-frontmatter@2.0.0: resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} - micromark-extension-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - micromark-extension-gfm-footnote@2.0.0: - resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - micromark-extension-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - micromark-extension-gfm-table@2.0.0: - resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} micromark-extension-gfm-tagfilter@2.0.0: resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - micromark-extension-gfm-task-list-item@2.0.1: - resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@2.0.1: - resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} @@ -1452,15 +2257,27 @@ packages: engines: {node: '>=4'} hasBin: true - mime@4.0.3: - resolution: {integrity: sha512-KgUb15Oorc0NEKPbvfa0wRU+PItIEZmiv+pyAO2i0oTIVTJhlzMclU7w4RXWQrSOVH5ax/p/CkIO7KI4OyFJTQ==} + mime@4.0.7: + resolution: {integrity: sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==} engines: {node: '>=16'} hasBin: true + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1468,16 +2285,33 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + ms@2.0.0: resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1493,19 +2327,14 @@ packages: no-case@2.3.2: resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - normalize-newline@4.1.0: resolution: {integrity: sha512-ff4jKqMI8Xl50/4Mms/9jPobzAV/UK+kXG2XJ/7AqOmxIx8mqfqTIHYxuAnEgJ2AQeBbLnlbmZ5+38Y9A0w/YA==} engines: {node: '>=12'} + normalize-url@8.0.2: + resolution: {integrity: sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==} + engines: {node: '>=14.16'} + object-assign@4.1.1: resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} engines: {node: '>=0.10.0'} @@ -1514,6 +2343,10 @@ packages: resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -1536,6 +2369,10 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + p-finally@1.0.0: resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=} engines: {node: '>=4'} @@ -1551,6 +2388,16 @@ packages: package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + + pako@0.2.9: + resolution: {integrity: sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=} + param-case@2.1.1: resolution: {integrity: sha1-35T9jPZTHs915r75oIWPvHK+Ikc=} @@ -1558,8 +2405,9 @@ packages: resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} engines: {node: '>=12'} - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -1577,45 +2425,74 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@0.1.7: - resolution: {integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} - path-to-regexp@6.2.2: - resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - peek-readable@5.0.0: - resolution: {integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + peek-readable@5.4.2: + resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} engines: {node: '>=14.16'} + peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pretty-ms@8.0.0: resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} engines: {node: '>=14.16'} + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + proto-list@1.2.4: + resolution: {integrity: sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=} proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + punycode@1.4.1: resolution: {integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4=} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - qs@6.12.1: resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} engines: {node: '>=0.6'} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + randomatic@3.1.1: resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} engines: {node: '>= 0.10.0'} @@ -1628,6 +2505,10 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -1635,16 +2516,21 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readable-web-to-node-stream@3.0.2: - resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} - engines: {node: '>=8'} - - realistic-structured-clone@3.0.0: - resolution: {integrity: sha512-rOjh4nuWkAqf9PWu6JVpOWD4ndI+JHfgiZeMmujYcPi+fvILUu7g6l26TC1K5aBIp34nV+jE1cDO75EKOfHC5Q==} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + registry-auth-token@5.1.0: + resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + relateurl@0.2.7: resolution: {integrity: sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=} engines: {node: '>= 0.10'} @@ -1652,8 +2538,8 @@ packages: remark-frontmatter@5.0.0: resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} - remark-gfm@4.0.0: - resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} remark-html@16.0.1: resolution: {integrity: sha512-B9JqA5i0qZe0Nsf49q3OXyGvyXuZFDzAP2iOFLEumymuYJITVpiH1IgsTEwTpdptDmZlMDMWeDmSawdaJIGCXQ==} @@ -1668,16 +2554,33 @@ packages: resolution: {integrity: sha512-ly3OKwKu+3T55DjP5PjIMzxgz9lFx6dQnBmAIxryZyRKl8f22juy12ShOyuq8WrQE5UlFOseZgQZDua0iF9DHw==} engines: {node: '>=4'} + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true + rolldown@1.0.0-beta.21: + resolution: {integrity: sha512-pjU+yNElXbreaNNz2EDOPrf5Yj6aoT8cTfd4pViBSdO7Nr0MOqHV0vDR9w3V8venZmjzF4LAfs03Cbl46YsdVw==} + hasBin: true + rss-parser@3.13.0: resolution: {integrity: sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==} rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -1694,12 +2597,17 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} set-function-length@1.2.2: @@ -1717,10 +2625,26 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -1731,16 +2655,16 @@ packages: socket.io-adapter@2.5.5: resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} - socket.io-client@4.7.5: - resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} + socket.io-client@4.8.1: + resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} engines: {node: '>=10.0.0'} socket.io-parser@4.2.4: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} - socket.io@4.7.5: - resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} engines: {node: '>=10.2.0'} source-map@0.6.1: @@ -1761,6 +2685,12 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + streamx@2.22.1: + resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1790,15 +2720,16 @@ packages: resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} engines: {node: '>=12'} - strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + strip-json-comments@2.0.1: + resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=} + engines: {node: '>=0.10.0'} - strtok3@7.0.0: - resolution: {integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==} - engines: {node: '>=14.16'} + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - stubborn-fs@1.2.5: - resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} + strtok3@9.1.1: + resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} + engines: {node: '>=16'} sweet-scroll@4.0.0: resolution: {integrity: sha512-mR6fRsAQANtm3zpzhUE73KAOt2aT4ZsWzNSggiEsSqdO6Zh4gM7ioJG81EngrZEl0XAc3ZvzEfhxggOoEBc8jA==} @@ -1806,9 +2737,22 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + threads@1.7.0: resolution: {integrity: sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==} + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} @@ -1819,17 +2763,10 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - token-types@5.0.1: - resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} + token-types@6.0.3: + resolution: {integrity: sha512-IKJ6EzuPPWtKtEIEPpIdXv9j5j2LGJEYk0CKY2efgKoYKLBiZdh6iQkLVBow/CB3phyWAWCyk+bZeaimJn6uRQ==} engines: {node: '>=14.16'} - tr46@0.0.3: - resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} - - tr46@2.1.0: - resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} - engines: {node: '>=8'} - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -1840,23 +2777,17 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.20.3: + resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} + engines: {node: '>=18.0.0'} + hasBin: true + turndown-plugin-gfm@1.0.2: resolution: {integrity: sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==} @@ -1871,39 +2802,30 @@ packages: resolution: {integrity: sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==} engines: {node: '>=16'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true - typescript@5.5.2: - resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} - engines: {node: '>=14.17'} - hasBin: true - - typeson-registry@1.0.0-alpha.39: - resolution: {integrity: sha512-NeGDEquhw+yfwNhguLPcZ9Oj0fzbADiX4R0WxvoY8nGhy98IbzQy1sezjoEFWOywOboj/DWehI+/aUlRVrJnnw==} - engines: {node: '>=10.0.0'} - - typeson@6.1.0: - resolution: {integrity: sha512-6FTtyGr8ldU0pfbvW/eOZrEtEkczHRUtduBnA90Jh9kMPCiFNnXIon3vF41N0S4tV1HHQt4Hk1j4srpESziCaA==} - engines: {node: '>=0.1.14'} - - uglify-js@3.18.0: - resolution: {integrity: sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true - uint8array-extras@1.1.0: - resolution: {integrity: sha512-CVaBSyOmGoFHu+zOVPbetXEXykOd8KHVBHLlqvmaMWpwcq3rewj18xVNbU5uzf48hclnNQhfNaNany2cMHFK/g==} + uint8array-extras@1.4.0: + resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} engines: {node: '>=18'} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -1940,6 +2862,10 @@ packages: url@0.11.3: resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + util-deprecate@1.0.2: resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} @@ -1951,62 +2877,32 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - vary@1.1.2: resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} engines: {node: '>= 0.8'} - vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} - vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - - web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - - webidl-conversions@3.0.1: - resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} - - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - - webidl-conversions@6.1.0: - resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} - engines: {node: '>=10.4'} + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} - whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} - whatwg-url@5.0.0: - resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} - - whatwg-url@8.7.0: - resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} - engines: {node: '>=10'} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true - which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} hasBin: true wrap-ansi@7.0.0: @@ -2020,18 +2916,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} - ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.17.1: resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} @@ -2052,22 +2936,29 @@ packages: resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} engines: {node: '>=4.0.0'} + xmlbuilder2@3.1.1: + resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} + engines: {node: '>=12.0'} + xmlbuilder@11.0.1: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} - xmlhttprequest-ssl@2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} engines: {node: '>=0.4.0'} + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -2077,284 +2968,791 @@ snapshots: '@api.global/typedrequest-interfaces@3.0.19': {} - '@api.global/typedrequest@3.0.30': + '@api.global/typedrequest@3.1.10': dependencies: '@api.global/typedrequest-interfaces': 3.0.19 '@push.rocks/isounique': 1.0.5 - '@push.rocks/lik': 6.0.15 - '@push.rocks/smartbuffer': 3.0.4 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartbuffer': 3.0.5 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartguard': 3.0.2 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartguard': 3.1.0 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/webrequest': 3.0.37 '@push.rocks/webstream': 1.0.10 - '@api.global/typedserver@3.0.50': + '@api.global/typedserver@3.0.74': dependencies: - '@api.global/typedrequest': 3.0.30 + '@api.global/typedrequest': 3.1.10 '@api.global/typedrequest-interfaces': 3.0.19 '@api.global/typedsocket': 3.0.1 - '@cloudflare/workers-types': 4.20240620.0 + '@cloudflare/workers-types': 4.20250628.0 '@design.estate/dees-comms': 1.0.27 - '@push.rocks/lik': 6.0.15 - '@push.rocks/smartchok': 1.0.34 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartchok': 1.1.1 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartenv': 5.0.12 '@push.rocks/smartfeed': 1.0.11 - '@push.rocks/smartfile': 11.0.21 + '@push.rocks/smartfile': 11.2.5 '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartlog': 3.1.8 '@push.rocks/smartlog-destination-devtools': 1.0.12 '@push.rocks/smartlog-interfaces': 3.0.2 '@push.rocks/smartmanifest': 2.0.2 '@push.rocks/smartmatch': 2.0.0 - '@push.rocks/smartmime': 2.0.2 - '@push.rocks/smartntml': 2.0.4 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartntml': 2.0.8 '@push.rocks/smartopen': 2.0.0 '@push.rocks/smartpath': 5.0.18 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrequest': 2.0.22 - '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 + '@push.rocks/smartrx': 3.0.10 '@push.rocks/smartsitemap': 2.0.3 - '@push.rocks/smartstream': 3.0.44 - '@push.rocks/smarttime': 4.0.8 + '@push.rocks/smartstream': 3.2.5 + '@push.rocks/smarttime': 4.1.1 '@push.rocks/taskbuffer': 3.1.7 '@push.rocks/webrequest': 3.0.37 '@push.rocks/webstore': 2.0.20 - '@tsclass/tsclass': 4.0.61 - '@types/express': 4.17.21 - body-parser: 1.20.2 + '@tsclass/tsclass': 8.2.1 + '@types/express': 5.0.3 + body-parser: 1.20.3 cors: 2.8.5 - express: 4.19.2 + express: 4.21.2 express-force-ssl: 0.3.2 - lit: 3.1.4 + lit: 3.3.0 transitivePeerDependencies: + - '@nuxt/kit' - bufferutil - - encoding + - react - supports-color - utf-8-validate + - vue '@api.global/typedsocket@3.0.1': dependencies: - '@api.global/typedrequest': 3.0.30 + '@api.global/typedrequest': 3.1.10 '@api.global/typedrequest-interfaces': 3.0.19 '@push.rocks/isohash': 2.0.1 '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartrx': 3.0.7 - '@push.rocks/smartsocket': 2.0.27 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartsocket': 2.1.0 '@push.rocks/smartstring': 4.0.15 - '@push.rocks/smarturl': 3.0.7 + '@push.rocks/smarturl': 3.1.0 transitivePeerDependencies: + - '@nuxt/kit' - bufferutil - - encoding + - react - supports-color - utf-8-validate + - vue '@apiglobal/typedrequest-interfaces@2.0.1': {} - '@babel/runtime@7.23.4': + '@aws-crypto/crc32@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.821.0 + tslib: 2.8.1 + + '@aws-crypto/crc32c@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.821.0 + tslib: 2.8.1 + + '@aws-crypto/sha1-browser@5.2.0': + dependencies: + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-locate-window': 3.804.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-locate-window': 3.804.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.821.0 + tslib: 2.8.1 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.8.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-sdk/client-s3@3.839.0': + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.839.0 + '@aws-sdk/credential-provider-node': 3.839.0 + '@aws-sdk/middleware-bucket-endpoint': 3.830.0 + '@aws-sdk/middleware-expect-continue': 3.821.0 + '@aws-sdk/middleware-flexible-checksums': 3.839.0 + '@aws-sdk/middleware-host-header': 3.821.0 + '@aws-sdk/middleware-location-constraint': 3.821.0 + '@aws-sdk/middleware-logger': 3.821.0 + '@aws-sdk/middleware-recursion-detection': 3.821.0 + '@aws-sdk/middleware-sdk-s3': 3.839.0 + '@aws-sdk/middleware-ssec': 3.821.0 + '@aws-sdk/middleware-user-agent': 3.839.0 + '@aws-sdk/region-config-resolver': 3.821.0 + '@aws-sdk/signature-v4-multi-region': 3.839.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-endpoints': 3.828.0 + '@aws-sdk/util-user-agent-browser': 3.821.0 + '@aws-sdk/util-user-agent-node': 3.839.0 + '@aws-sdk/xml-builder': 3.821.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.6.0 + '@smithy/eventstream-serde-browser': 4.0.4 + '@smithy/eventstream-serde-config-resolver': 4.1.2 + '@smithy/eventstream-serde-node': 4.0.4 + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/hash-blob-browser': 4.0.4 + '@smithy/hash-node': 4.0.4 + '@smithy/hash-stream-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/md5-js': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.13 + '@smithy/middleware-retry': 4.1.14 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.0.6 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.5 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.21 + '@smithy/util-defaults-mode-node': 4.0.21 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.6 + '@smithy/util-stream': 4.2.2 + '@smithy/util-utf8': 4.0.0 + '@smithy/util-waiter': 4.0.6 + '@types/uuid': 9.0.8 + tslib: 2.8.1 + uuid: 9.0.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.839.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.839.0 + '@aws-sdk/middleware-host-header': 3.821.0 + '@aws-sdk/middleware-logger': 3.821.0 + '@aws-sdk/middleware-recursion-detection': 3.821.0 + '@aws-sdk/middleware-user-agent': 3.839.0 + '@aws-sdk/region-config-resolver': 3.821.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-endpoints': 3.828.0 + '@aws-sdk/util-user-agent-browser': 3.821.0 + '@aws-sdk/util-user-agent-node': 3.839.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.6.0 + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/hash-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.13 + '@smithy/middleware-retry': 4.1.14 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.0.6 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.5 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.21 + '@smithy/util-defaults-mode-node': 4.0.21 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.6 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.839.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@aws-sdk/xml-builder': 3.821.0 + '@smithy/core': 3.6.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/signature-v4': 5.1.2 + '@smithy/smithy-client': 4.4.5 + '@smithy/types': 4.3.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-utf8': 4.0.0 + fast-xml-parser: 4.4.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.839.0': + dependencies: + '@aws-sdk/core': 3.839.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.839.0': + dependencies: + '@aws-sdk/core': 3.839.0 + '@aws-sdk/types': 3.821.0 + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/node-http-handler': 4.0.6 + '@smithy/property-provider': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.5 + '@smithy/types': 4.3.1 + '@smithy/util-stream': 4.2.2 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.839.0': + dependencies: + '@aws-sdk/core': 3.839.0 + '@aws-sdk/credential-provider-env': 3.839.0 + '@aws-sdk/credential-provider-http': 3.839.0 + '@aws-sdk/credential-provider-process': 3.839.0 + '@aws-sdk/credential-provider-sso': 3.839.0 + '@aws-sdk/credential-provider-web-identity': 3.839.0 + '@aws-sdk/nested-clients': 3.839.0 + '@aws-sdk/types': 3.821.0 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.839.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.839.0 + '@aws-sdk/credential-provider-http': 3.839.0 + '@aws-sdk/credential-provider-ini': 3.839.0 + '@aws-sdk/credential-provider-process': 3.839.0 + '@aws-sdk/credential-provider-sso': 3.839.0 + '@aws-sdk/credential-provider-web-identity': 3.839.0 + '@aws-sdk/types': 3.821.0 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-process@3.839.0': + dependencies: + '@aws-sdk/core': 3.839.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.839.0': + dependencies: + '@aws-sdk/client-sso': 3.839.0 + '@aws-sdk/core': 3.839.0 + '@aws-sdk/token-providers': 3.839.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.839.0': + dependencies: + '@aws-sdk/core': 3.839.0 + '@aws-sdk/nested-clients': 3.839.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/middleware-bucket-endpoint@3.830.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-arn-parser': 3.804.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-config-provider': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-expect-continue@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-flexible-checksums@3.839.0': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.839.0 + '@aws-sdk/types': 3.821.0 + '@smithy/is-array-buffer': 4.0.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-stream': 4.2.2 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-host-header@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-location-constraint@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.839.0': + dependencies: + '@aws-sdk/core': 3.839.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-arn-parser': 3.804.0 + '@smithy/core': 3.6.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/signature-v4': 5.1.2 + '@smithy/smithy-client': 4.4.5 + '@smithy/types': 4.3.1 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-stream': 4.2.2 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-ssec@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.839.0': + dependencies: + '@aws-sdk/core': 3.839.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-endpoints': 3.828.0 + '@smithy/core': 3.6.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.839.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.839.0 + '@aws-sdk/middleware-host-header': 3.821.0 + '@aws-sdk/middleware-logger': 3.821.0 + '@aws-sdk/middleware-recursion-detection': 3.821.0 + '@aws-sdk/middleware-user-agent': 3.839.0 + '@aws-sdk/region-config-resolver': 3.821.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-endpoints': 3.828.0 + '@aws-sdk/util-user-agent-browser': 3.821.0 + '@aws-sdk/util-user-agent-node': 3.839.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.6.0 + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/hash-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.13 + '@smithy/middleware-retry': 4.1.14 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.0.6 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.5 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.21 + '@smithy/util-defaults-mode-node': 4.0.21 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.6 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/region-config-resolver@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.4 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.839.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.839.0 + '@aws-sdk/types': 3.821.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/signature-v4': 5.1.2 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.839.0': + dependencies: + '@aws-sdk/core': 3.839.0 + '@aws-sdk/nested-clients': 3.839.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/types@3.821.0': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/util-arn-parser@3.804.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.828.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 + '@smithy/util-endpoints': 3.0.6 + tslib: 2.8.1 + + '@aws-sdk/util-locate-window@3.804.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 + bowser: 2.11.0 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.839.0': + dependencies: + '@aws-sdk/middleware-user-agent': 3.839.0 + '@aws-sdk/types': 3.821.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.821.0': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@babel/runtime@7.27.0': dependencies: regenerator-runtime: 0.14.1 - '@cloudflare/workers-types@4.20240620.0': {} - - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 + '@cloudflare/workers-types@4.20250628.0': {} '@design.estate/dees-comms@1.0.27': dependencies: - '@api.global/typedrequest': 3.0.30 + '@api.global/typedrequest': 3.1.10 '@api.global/typedrequest-interfaces': 3.0.19 '@push.rocks/smartdelay': 3.0.5 - broadcast-channel: 7.0.0 + broadcast-channel: 7.1.0 - '@design.estate/dees-domtools@2.0.57': + '@design.estate/dees-domtools@2.3.3': dependencies: - '@api.global/typedrequest': 3.0.30 + '@api.global/typedrequest': 3.1.10 '@design.estate/dees-comms': 1.0.27 - '@push.rocks/lik': 6.0.15 + '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartjson': 5.0.20 '@push.rocks/smartmarkdown': 3.0.3 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrouter': 1.0.16 - '@push.rocks/smartrx': 3.0.7 - '@push.rocks/smartstate': 2.0.17 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrouter': 1.3.2 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstate': 2.0.20 '@push.rocks/smartstring': 4.0.15 - '@push.rocks/smarturl': 3.0.7 + '@push.rocks/smarturl': 3.1.0 '@push.rocks/webrequest': 3.0.37 '@push.rocks/websetup': 3.0.19 '@push.rocks/webstore': 2.0.20 - lit: 3.1.4 + lenis: 1.3.4 + lit: 3.3.0 sweet-scroll: 4.0.0 transitivePeerDependencies: + - '@nuxt/kit' + - react - supports-color + - vue - '@design.estate/dees-element@2.0.34': + '@design.estate/dees-element@2.0.45': dependencies: - '@design.estate/dees-domtools': 2.0.57 + '@design.estate/dees-domtools': 2.3.3 '@push.rocks/isounique': 1.0.5 - '@push.rocks/smartrx': 3.0.7 - lit: 3.1.4 + '@push.rocks/smartrx': 3.0.10 + lit: 3.3.0 transitivePeerDependencies: + - '@nuxt/kit' + - react - supports-color + - vue - '@design.estate/dees-wcctools@1.0.90': + '@design.estate/dees-wcctools@1.1.0': dependencies: - '@design.estate/dees-domtools': 2.0.57 - '@design.estate/dees-element': 2.0.34 + '@design.estate/dees-domtools': 2.3.3 + '@design.estate/dees-element': 2.0.45 '@push.rocks/smartdelay': 3.0.5 - lit: 3.1.4 + lit: 3.3.0 transitivePeerDependencies: + - '@nuxt/kit' + - react - supports-color + - vue - '@designestate/dees-element@2.0.23': + '@emnapi/core@1.4.3': dependencies: - '@design.estate/dees-domtools': 2.0.57 - '@push.rocks/isounique': 1.0.5 - '@push.rocks/smartrx': 3.0.7 - lit: 2.8.0 - transitivePeerDependencies: - - supports-color - - '@esbuild/aix-ppc64@0.19.12': + '@emnapi/wasi-threads': 1.0.2 + tslib: 2.8.1 optional: true - '@esbuild/android-arm64@0.19.12': - optional: true - - '@esbuild/android-arm@0.19.12': - optional: true - - '@esbuild/android-x64@0.19.12': - optional: true - - '@esbuild/darwin-arm64@0.19.12': - optional: true - - '@esbuild/darwin-x64@0.19.12': - optional: true - - '@esbuild/freebsd-arm64@0.19.12': - optional: true - - '@esbuild/freebsd-x64@0.19.12': - optional: true - - '@esbuild/linux-arm64@0.19.12': - optional: true - - '@esbuild/linux-arm@0.19.12': - optional: true - - '@esbuild/linux-ia32@0.19.12': - optional: true - - '@esbuild/linux-loong64@0.19.12': - optional: true - - '@esbuild/linux-mips64el@0.19.12': - optional: true - - '@esbuild/linux-ppc64@0.19.12': - optional: true - - '@esbuild/linux-riscv64@0.19.12': - optional: true - - '@esbuild/linux-s390x@0.19.12': - optional: true - - '@esbuild/linux-x64@0.19.12': - optional: true - - '@esbuild/netbsd-x64@0.19.12': - optional: true - - '@esbuild/openbsd-x64@0.19.12': - optional: true - - '@esbuild/sunos-x64@0.19.12': - optional: true - - '@esbuild/win32-arm64@0.19.12': - optional: true - - '@esbuild/win32-ia32@0.19.12': - optional: true - - '@esbuild/win32-x64@0.19.12': - optional: true - - '@git.zone/tsbuild@2.1.82': + '@emnapi/runtime@1.4.3': dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.0.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.25.5': + optional: true + + '@esbuild/android-arm64@0.25.5': + optional: true + + '@esbuild/android-arm@0.25.5': + optional: true + + '@esbuild/android-x64@0.25.5': + optional: true + + '@esbuild/darwin-arm64@0.25.5': + optional: true + + '@esbuild/darwin-x64@0.25.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.5': + optional: true + + '@esbuild/freebsd-x64@0.25.5': + optional: true + + '@esbuild/linux-arm64@0.25.5': + optional: true + + '@esbuild/linux-arm@0.25.5': + optional: true + + '@esbuild/linux-ia32@0.25.5': + optional: true + + '@esbuild/linux-loong64@0.25.5': + optional: true + + '@esbuild/linux-mips64el@0.25.5': + optional: true + + '@esbuild/linux-ppc64@0.25.5': + optional: true + + '@esbuild/linux-riscv64@0.25.5': + optional: true + + '@esbuild/linux-s390x@0.25.5': + optional: true + + '@esbuild/linux-x64@0.25.5': + optional: true + + '@esbuild/netbsd-arm64@0.25.5': + optional: true + + '@esbuild/netbsd-x64@0.25.5': + optional: true + + '@esbuild/openbsd-arm64@0.25.5': + optional: true + + '@esbuild/openbsd-x64@0.25.5': + optional: true + + '@esbuild/sunos-x64@0.25.5': + optional: true + + '@esbuild/win32-arm64@0.25.5': + optional: true + + '@esbuild/win32-ia32@0.25.5': + optional: true + + '@esbuild/win32-x64@0.25.5': + optional: true + + '@git.zone/tsbuild@2.6.4': + dependencies: + '@git.zone/tspublish': 1.9.1 '@push.rocks/early': 4.0.4 '@push.rocks/smartcli': 4.0.11 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfile': 11.0.21 - '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartlog': 3.1.8 '@push.rocks/smartpath': 5.0.18 - '@push.rocks/smartpromise': 4.0.4 - typescript: 5.5.2 + '@push.rocks/smartpromise': 4.2.3 + typescript: 5.8.3 + transitivePeerDependencies: + - aws-crt - '@git.zone/tsbundle@2.0.15': + '@git.zone/tsbundle@2.5.1': dependencies: '@push.rocks/early': 4.0.4 '@push.rocks/smartcli': 4.0.11 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfile': 11.0.21 - '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartlog': 3.1.8 '@push.rocks/smartlog-destination-local': 9.0.2 '@push.rocks/smartpath': 5.0.18 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartspawn': 3.0.3 + '@rspack/core': 1.4.1 '@types/html-minifier': 4.0.5 - esbuild: 0.19.12 + esbuild: 0.25.5 html-minifier: 4.0.0 - typescript: 5.3.3 + rolldown: 1.0.0-beta.21 + typescript: 5.8.3 transitivePeerDependencies: + - '@swc/helpers' - supports-color - '@git.zone/tsrun@1.2.49(@types/node@18.19.39)': + '@git.zone/tspublish@1.9.1': dependencies: - '@push.rocks/smartfile': 11.0.21 - '@push.rocks/smartshell': 3.0.5 - ts-node: 10.9.2(@types/node@18.19.39)(typescript@5.5.2) - typescript: 5.5.2 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - '@git.zone/tswatch@2.0.23(@types/node@18.19.39)': - dependencies: - '@api.global/typedserver': 3.0.50 - '@git.zone/tsbundle': 2.0.15 - '@git.zone/tsrun': 1.2.49(@types/node@18.19.39) - '@push.rocks/early': 4.0.4 - '@push.rocks/lik': 6.0.15 - '@push.rocks/smartchok': 1.0.34 '@push.rocks/smartcli': 4.0.11 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartnpm': 2.0.4 + '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartrequest': 2.1.0 + '@push.rocks/smartshell': 3.2.3 + transitivePeerDependencies: + - aws-crt + + '@git.zone/tsrun@1.3.3': + dependencies: + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartshell': 3.2.3 + tsx: 4.20.3 + + '@git.zone/tswatch@2.1.2': + dependencies: + '@api.global/typedserver': 3.0.74 + '@git.zone/tsbundle': 2.5.1 + '@git.zone/tsrun': 1.3.3 + '@push.rocks/early': 4.0.4 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartchok': 1.1.1 + '@push.rocks/smartcli': 4.0.11 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartlog': 3.1.8 '@push.rocks/smartlog-destination-local': 9.0.2 - '@push.rocks/smartshell': 3.0.5 + '@push.rocks/smartshell': 3.2.3 '@push.rocks/taskbuffer': 3.1.7 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' + - '@nuxt/kit' + - '@swc/helpers' - bufferutil - - encoding + - react - supports-color - utf-8-validate + - vue - '@happy-dom/global-registrator@8.9.0': + '@happy-dom/global-registrator@15.11.7': dependencies: - happy-dom: 8.9.0 - transitivePeerDependencies: - - encoding + happy-dom: 15.11.7 + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 '@isaacs/cliui@8.0.2': dependencies: @@ -2365,30 +3763,82 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jridgewell/resolve-uri@3.1.2': {} + '@lit-labs/ssr-dom-shim@1.3.0': {} - '@jridgewell/sourcemap-codec@1.4.15': {} - - '@jridgewell/trace-mapping@0.3.9': + '@lit/reactive-element@2.1.0': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@lit-labs/ssr-dom-shim@1.2.0': {} - - '@lit/reactive-element@1.6.3': - dependencies: - '@lit-labs/ssr-dom-shim': 1.2.0 - - '@lit/reactive-element@2.0.4': - dependencies: - '@lit-labs/ssr-dom-shim': 1.2.0 + '@lit-labs/ssr-dom-shim': 1.3.0 '@mixmark-io/domino@2.2.0': {} + '@module-federation/error-codes@0.15.0': {} + + '@module-federation/runtime-core@0.15.0': + dependencies: + '@module-federation/error-codes': 0.15.0 + '@module-federation/sdk': 0.15.0 + + '@module-federation/runtime-tools@0.15.0': + dependencies: + '@module-federation/runtime': 0.15.0 + '@module-federation/webpack-bundler-runtime': 0.15.0 + + '@module-federation/runtime@0.15.0': + dependencies: + '@module-federation/error-codes': 0.15.0 + '@module-federation/runtime-core': 0.15.0 + '@module-federation/sdk': 0.15.0 + + '@module-federation/sdk@0.15.0': {} + + '@module-federation/webpack-bundler-runtime@0.15.0': + dependencies: + '@module-federation/runtime': 0.15.0 + '@module-federation/sdk': 0.15.0 + + '@napi-rs/wasm-runtime@0.2.11': + dependencies: + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 + '@tybys/wasm-util': 0.9.0 + optional: true + + '@oozcitak/dom@1.15.10': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/url': 1.0.4 + '@oozcitak/util': 8.3.8 + + '@oozcitak/infra@1.0.8': + dependencies: + '@oozcitak/util': 8.3.8 + + '@oozcitak/url@1.0.4': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + + '@oozcitak/util@8.3.8': {} + + '@oxc-project/runtime@0.75.0': {} + + '@oxc-project/types@0.75.0': {} + '@pkgjs/parseargs@0.11.0': optional: true + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@2.3.1': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + '@push.rocks/consolecolor@2.0.2': dependencies: ansi-256-colors: 1.1.0 @@ -2396,7 +3846,7 @@ snapshots: '@push.rocks/early@4.0.4': dependencies: '@push.rocks/consolecolor': 2.0.2 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/isohash@2.0.1': dependencies: @@ -2405,6 +3855,24 @@ snapshots: '@push.rocks/isounique@1.0.5': {} + '@push.rocks/levelcache@3.1.1': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartbucket': 3.3.7 + '@push.rocks/smartcache': 1.0.16 + '@push.rocks/smartenv': 5.0.12 + '@push.rocks/smartexit': 1.0.23 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartstring': 4.0.15 + '@push.rocks/smartunique': 3.0.9 + '@push.rocks/taskbuffer': 3.1.7 + '@tsclass/tsclass': 4.4.4 + transitivePeerDependencies: + - aws-crt + '@push.rocks/lik@6.0.15': dependencies: '@push.rocks/smartdelay': 3.0.5 @@ -2416,6 +3884,17 @@ snapshots: '@types/symbol-tree': 3.2.5 symbol-tree: 3.2.4 + '@push.rocks/lik@6.2.2': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartmatch': 2.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarttime': 4.1.1 + '@types/minimatch': 5.1.2 + '@types/symbol-tree': 3.2.5 + symbol-tree: 3.2.4 + '@push.rocks/projectinfo@5.0.2': dependencies: '@push.rocks/smartfile': 10.0.41 @@ -2423,9 +3902,38 @@ snapshots: '@push.rocks/smartpromise': 4.0.4 '@push.rocks/smartstring': 4.0.15 - '@push.rocks/smartbuffer@3.0.4': + '@push.rocks/smartarchive@3.0.8': dependencies: - uint8array-extras: 1.1.0 + '@push.rocks/smartfile': 10.0.41 + '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstream': 2.0.8 + '@push.rocks/smartunique': 3.0.9 + '@types/gunzip-maybe': 1.4.2 + '@types/tar-stream': 2.2.3 + gunzip-maybe: 1.4.2 + tar: 6.2.1 + tar-stream: 3.1.7 + + '@push.rocks/smartbucket@3.3.7': + dependencies: + '@aws-sdk/client-s3': 3.839.0 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstream': 3.2.5 + '@push.rocks/smartstring': 4.0.15 + '@push.rocks/smartunique': 3.0.9 + '@tsclass/tsclass': 4.4.4 + transitivePeerDependencies: + - aws-crt + + '@push.rocks/smartbuffer@3.0.5': + dependencies: + uint8array-extras: 1.4.0 '@push.rocks/smartcache@1.0.16': dependencies: @@ -2435,22 +3943,32 @@ snapshots: '@pushrocks/smartpromise': 3.1.10 '@pushrocks/smarttime': 4.0.1 - '@push.rocks/smartchok@1.0.34': + '@push.rocks/smartchok@1.1.1': dependencies: - '@push.rocks/lik': 6.0.15 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrx': 3.0.7 - '@tempfix/watcher': 2.3.0 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + chokidar: 4.0.3 + picomatch: 4.0.2 '@push.rocks/smartcli@4.0.11': dependencies: - '@push.rocks/lik': 6.0.15 - '@push.rocks/smartlog': 3.0.7 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartlog': 3.1.8 '@push.rocks/smartobject': 1.0.12 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 yargs-parser: 21.1.1 + '@push.rocks/smartclickhouse@2.0.17': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartobject': 1.0.12 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarturl': 3.1.0 + '@push.rocks/webrequest': 3.0.37 + '@push.rocks/smartdelay@3.0.5': dependencies: '@push.rocks/smartpromise': 4.0.4 @@ -2461,9 +3979,9 @@ snapshots: '@push.rocks/smartexit@1.0.23': dependencies: - '@push.rocks/lik': 6.0.15 + '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 tree-kill: 1.2.2 '@push.rocks/smartfeed@1.0.11': @@ -2493,29 +4011,29 @@ snapshots: glob: 10.4.2 js-yaml: 4.1.0 - '@push.rocks/smartfile@11.0.21': + '@push.rocks/smartfile@11.2.5': dependencies: - '@push.rocks/lik': 6.0.15 + '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartfile-interfaces': 1.0.7 - '@push.rocks/smarthash': 3.0.4 + '@push.rocks/smarthash': 3.2.0 '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartmime': 2.0.2 + '@push.rocks/smartmime': 2.0.4 '@push.rocks/smartpath': 5.0.18 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrequest': 2.0.22 - '@push.rocks/smartstream': 3.0.44 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 + '@push.rocks/smartstream': 3.2.5 '@types/fs-extra': 11.0.4 '@types/glob': 8.1.0 '@types/js-yaml': 4.0.9 - fs-extra: 11.2.0 - glob: 10.4.2 + fs-extra: 11.3.0 + glob: 11.0.3 js-yaml: 4.1.0 - '@push.rocks/smartguard@3.0.2': + '@push.rocks/smartguard@3.1.0': dependencies: - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrequest': 2.0.22 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 '@push.rocks/smarthash@3.0.4': dependencies: @@ -2524,6 +4042,14 @@ snapshots: '@types/through2': 2.0.41 through2: 4.0.2 + '@push.rocks/smarthash@3.2.0': + dependencies: + '@push.rocks/smartenv': 5.0.12 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartpromise': 4.2.3 + '@types/through2': 2.0.41 + through2: 4.0.2 + '@push.rocks/smartjson@5.0.20': dependencies: '@push.rocks/smartenv': 5.0.12 @@ -2539,26 +4065,34 @@ snapshots: dependencies: '@push.rocks/consolecolor': 2.0.2 '@push.rocks/smartlog-interfaces': 3.0.2 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartlog-interfaces@3.0.2': dependencies: '@api.global/typedrequest-interfaces': 2.0.2 - '@tsclass/tsclass': 4.0.61 + '@tsclass/tsclass': 4.4.4 - '@push.rocks/smartlog@3.0.7': + '@push.rocks/smartlog@3.1.8': dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/consolecolor': 2.0.2 '@push.rocks/isounique': 1.0.5 - '@push.rocks/smartlog-interfaces': 3.0.2 + '@push.rocks/smartclickhouse': 2.0.17 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smarthash': 3.2.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/webrequest': 3.0.37 + '@tsclass/tsclass': 9.2.0 '@push.rocks/smartmanifest@2.0.2': {} '@push.rocks/smartmarkdown@3.0.3': dependencies: '@push.rocks/smartyaml': 2.0.5 - '@types/turndown': 5.0.4 + '@types/turndown': 5.0.5 remark-frontmatter: 5.0.0 - remark-gfm: 4.0.0 + remark-gfm: 4.0.1 remark-html: 16.0.1 remark-parse: 11.0.0 remark-stringify: 11.0.0 @@ -2577,21 +4111,38 @@ snapshots: '@types/mime-types': 2.1.4 mime-types: 2.1.35 - '@push.rocks/smartmime@2.0.2': + '@push.rocks/smartmime@2.0.4': dependencies: '@types/mime-types': 2.1.4 - file-type: 19.0.0 - mime: 4.0.3 + file-type: 19.6.0 + mime: 4.0.7 - '@push.rocks/smartntml@2.0.4': + '@push.rocks/smartnpm@2.0.4': dependencies: - '@designestate/dees-element': 2.0.23 - '@happy-dom/global-registrator': 8.9.0 - '@pushrocks/smartpromise': 3.1.10 - fake-indexeddb: 4.0.2 + '@push.rocks/consolecolor': 2.0.2 + '@push.rocks/levelcache': 3.1.1 + '@push.rocks/smartarchive': 3.0.8 + '@push.rocks/smartfile': 10.0.41 + '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/smartversion': 3.0.5 + package-json: 8.1.1 transitivePeerDependencies: - - encoding + - aws-crt + + '@push.rocks/smartntml@2.0.8': + dependencies: + '@design.estate/dees-element': 2.0.45 + '@happy-dom/global-registrator': 15.11.7 + '@push.rocks/smartpromise': 4.2.3 + fake-indexeddb: 6.0.1 + transitivePeerDependencies: + - '@nuxt/kit' + - react - supports-color + - vue '@push.rocks/smartobject@1.0.12': dependencies: @@ -2606,6 +4157,8 @@ snapshots: '@push.rocks/smartpromise@4.0.4': {} + '@push.rocks/smartpromise@4.2.3': {} + '@push.rocks/smartrequest@2.0.22': dependencies: '@push.rocks/smartpromise': 4.0.4 @@ -2613,72 +4166,88 @@ snapshots: agentkeepalive: 4.5.0 form-data: 4.0.0 - '@push.rocks/smartrouter@1.0.16': + '@push.rocks/smartrequest@2.1.0': dependencies: - path-to-regexp: 6.2.2 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarturl': 3.1.0 + agentkeepalive: 4.6.0 + form-data: 4.0.3 + + '@push.rocks/smartrouter@1.3.2': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartrx': 3.0.10 + path-to-regexp: 8.2.0 + + '@push.rocks/smartrx@3.0.10': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + rxjs: 7.8.2 '@push.rocks/smartrx@3.0.7': dependencies: '@push.rocks/smartpromise': 4.0.4 rxjs: 7.8.1 - '@push.rocks/smartshell@3.0.5': + '@push.rocks/smartshell@3.2.3': dependencies: '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartexit': 1.0.23 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 '@types/which': 3.0.4 tree-kill: 1.2.2 - which: 4.0.0 + which: 5.0.0 '@push.rocks/smartsitemap@2.0.3': dependencies: '@push.rocks/smartcache': 1.0.16 '@push.rocks/smartfeed': 1.0.11 - '@push.rocks/smartxml': 1.0.8 + '@push.rocks/smartxml': 1.1.1 '@push.rocks/smartyaml': 2.0.5 '@push.rocks/webrequest': 3.0.37 - '@tsclass/tsclass': 4.0.61 + '@tsclass/tsclass': 4.4.4 - '@push.rocks/smartsocket@2.0.27': + '@push.rocks/smartsocket@2.1.0': dependencies: '@api.global/typedrequest-interfaces': 3.0.19 - '@api.global/typedserver': 3.0.50 + '@api.global/typedserver': 3.0.74 '@push.rocks/isohash': 2.0.1 '@push.rocks/isounique': 1.0.5 - '@push.rocks/lik': 6.0.15 + '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartenv': 5.0.12 '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartlog': 3.0.7 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrx': 3.0.7 - '@push.rocks/smarttime': 4.0.8 - engine.io: 6.5.4 - socket.io: 4.7.5 - socket.io-client: 4.7.5 + '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarttime': 4.1.1 + engine.io: 6.6.4 + socket.io: 4.8.1 + socket.io-client: 4.8.1 transitivePeerDependencies: + - '@nuxt/kit' - bufferutil - - encoding + - react - supports-color - utf-8-validate + - vue '@push.rocks/smartspawn@3.0.3': dependencies: - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 spawn-wrap: 2.0.0 threads: 1.7.0 tiny-worker: 2.3.0 transitivePeerDependencies: - supports-color - '@push.rocks/smartstate@2.0.17': + '@push.rocks/smartstate@2.0.20': dependencies: - '@push.rocks/isohash': 2.0.1 - '@push.rocks/lik': 6.0.15 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smarthash': 3.2.0 '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 '@push.rocks/webstore': 2.0.20 '@push.rocks/smartstream@2.0.8': @@ -2690,12 +4259,12 @@ snapshots: from2: 2.3.0 through2: 4.0.2 - '@push.rocks/smartstream@3.0.44': + '@push.rocks/smartstream@3.2.5': dependencies: - '@push.rocks/lik': 6.0.15 + '@push.rocks/lik': 6.2.2 '@push.rocks/smartenv': 5.0.12 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 '@push.rocks/smartstring@4.0.15': dependencies: @@ -2718,6 +4287,17 @@ snapshots: is-nan: 1.3.2 pretty-ms: 8.0.0 + '@push.rocks/smarttime@4.1.1': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpromise': 4.2.3 + croner: 9.1.0 + date-fns: 4.1.0 + dayjs: 1.11.13 + is-nan: 1.3.2 + pretty-ms: 9.2.0 + '@push.rocks/smartunique@3.0.9': dependencies: '@types/uuid': 9.0.8 @@ -2726,9 +4306,17 @@ snapshots: '@push.rocks/smarturl@3.0.7': {} - '@push.rocks/smartxml@1.0.8': + '@push.rocks/smarturl@3.1.0': {} + + '@push.rocks/smartversion@3.0.5': dependencies: - fast-xml-parser: 4.4.0 + '@types/semver': 7.7.0 + semver: 7.7.2 + + '@push.rocks/smartxml@1.1.1': + dependencies: + fast-xml-parser: 4.5.3 + xmlbuilder2: 3.1.1 '@push.rocks/smartyaml@2.0.5': dependencies: @@ -2737,12 +4325,12 @@ snapshots: '@push.rocks/taskbuffer@3.1.7': dependencies: - '@push.rocks/lik': 6.0.15 + '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartlog': 3.0.7 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrx': 3.0.7 - '@push.rocks/smarttime': 4.0.8 + '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarttime': 4.1.1 '@push.rocks/smartunique': 3.0.9 '@push.rocks/webrequest@3.0.37': @@ -2750,23 +4338,23 @@ snapshots: '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartenv': 5.0.12 '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/webstore': 2.0.20 '@push.rocks/websetup@3.0.19': dependencies: '@pushrocks/smartdelay': 3.0.1 '@pushrocks/smartpromise': 4.0.2 - '@tsclass/tsclass': 4.0.61 + '@tsclass/tsclass': 4.4.4 '@push.rocks/webstore@2.0.20': dependencies: '@api.global/typedrequest-interfaces': 3.0.19 - '@push.rocks/lik': 6.0.15 + '@push.rocks/lik': 6.2.2 '@push.rocks/smartenv': 5.0.12 '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 '@tempfix/idb': 8.0.3 fake-indexeddb: 5.0.2 @@ -2830,7 +4418,7 @@ snapshots: '@pushrocks/smartrx@3.0.2': dependencies: '@pushrocks/smartpromise': 4.0.2 - rxjs: 7.8.1 + rxjs: 7.8.2 '@pushrocks/smartstring@4.0.7': dependencies: @@ -2843,7 +4431,7 @@ snapshots: normalize-newline: 4.1.0 randomatic: 3.1.1 strip-indent: 4.0.0 - url: 0.11.3 + url: 0.11.4 '@pushrocks/smarttime@4.0.1': dependencies: @@ -2851,17 +4439,447 @@ snapshots: '@pushrocks/smartdelay': 2.0.13 '@pushrocks/smartpromise': 3.1.10 croner: 5.7.0 - dayjs: 1.11.11 + dayjs: 1.11.13 is-nan: 1.3.2 pretty-ms: 8.0.0 + '@rolldown/binding-darwin-arm64@1.0.0-beta.21': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.21': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.21': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.21': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.21': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.21': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.21': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.21': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.21': + dependencies: + '@napi-rs/wasm-runtime': 0.2.11 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.21': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.21': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.21': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.21': {} + + '@rspack/binding-darwin-arm64@1.4.1': + optional: true + + '@rspack/binding-darwin-x64@1.4.1': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.4.1': + optional: true + + '@rspack/binding-linux-arm64-musl@1.4.1': + optional: true + + '@rspack/binding-linux-x64-gnu@1.4.1': + optional: true + + '@rspack/binding-linux-x64-musl@1.4.1': + optional: true + + '@rspack/binding-wasm32-wasi@1.4.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.11 + optional: true + + '@rspack/binding-win32-arm64-msvc@1.4.1': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.4.1': + optional: true + + '@rspack/binding-win32-x64-msvc@1.4.1': + optional: true + + '@rspack/binding@1.4.1': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.4.1 + '@rspack/binding-darwin-x64': 1.4.1 + '@rspack/binding-linux-arm64-gnu': 1.4.1 + '@rspack/binding-linux-arm64-musl': 1.4.1 + '@rspack/binding-linux-x64-gnu': 1.4.1 + '@rspack/binding-linux-x64-musl': 1.4.1 + '@rspack/binding-wasm32-wasi': 1.4.1 + '@rspack/binding-win32-arm64-msvc': 1.4.1 + '@rspack/binding-win32-ia32-msvc': 1.4.1 + '@rspack/binding-win32-x64-msvc': 1.4.1 + + '@rspack/core@1.4.1': + dependencies: + '@module-federation/runtime-tools': 0.15.0 + '@rspack/binding': 1.4.1 + '@rspack/lite-tapable': 1.0.1 + + '@rspack/lite-tapable@1.0.1': {} + + '@sec-ant/readable-stream@0.4.1': {} + + '@sindresorhus/is@5.6.0': {} + + '@smithy/abort-controller@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader-native@4.0.0': + dependencies: + '@smithy/util-base64': 4.0.0 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader@5.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/config-resolver@4.1.4': + dependencies: + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.4 + tslib: 2.8.1 + + '@smithy/core@3.6.0': + dependencies: + '@smithy/middleware-serde': 4.0.8 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-stream': 4.2.2 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.0.6': + dependencies: + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + tslib: 2.8.1 + + '@smithy/eventstream-codec@4.0.4': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.3.1 + '@smithy/util-hex-encoding': 4.0.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-browser@4.0.4': + dependencies: + '@smithy/eventstream-serde-universal': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/eventstream-serde-config-resolver@4.1.2': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/eventstream-serde-node@4.0.4': + dependencies: + '@smithy/eventstream-serde-universal': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/eventstream-serde-universal@4.0.4': + dependencies: + '@smithy/eventstream-codec': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.0.4': + dependencies: + '@smithy/protocol-http': 5.1.2 + '@smithy/querystring-builder': 4.0.4 + '@smithy/types': 4.3.1 + '@smithy/util-base64': 4.0.0 + tslib: 2.8.1 + + '@smithy/hash-blob-browser@4.0.4': + dependencies: + '@smithy/chunked-blob-reader': 5.0.0 + '@smithy/chunked-blob-reader-native': 4.0.0 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/hash-node@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/hash-stream-node@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/is-array-buffer@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/md5-js@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/middleware-content-length@4.0.4': + dependencies: + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/middleware-endpoint@4.1.13': + dependencies: + '@smithy/core': 3.6.0 + '@smithy/middleware-serde': 4.0.8 + '@smithy/node-config-provider': 4.1.3 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + '@smithy/util-middleware': 4.0.4 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.1.14': + dependencies: + '@smithy/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/service-error-classification': 4.0.6 + '@smithy/smithy-client': 4.4.5 + '@smithy/types': 4.3.1 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.6 + tslib: 2.8.1 + uuid: 9.0.1 + + '@smithy/middleware-serde@4.0.8': + dependencies: + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/middleware-stack@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/node-config-provider@4.1.3': + dependencies: + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.0.6': + dependencies: + '@smithy/abort-controller': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/querystring-builder': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/property-provider@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/protocol-http@5.1.2': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/querystring-builder@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + '@smithy/util-uri-escape': 4.0.0 + tslib: 2.8.1 + + '@smithy/querystring-parser@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/service-error-classification@4.0.6': + dependencies: + '@smithy/types': 4.3.1 + + '@smithy/shared-ini-file-loader@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/signature-v4@5.1.2': + dependencies: + '@smithy/is-array-buffer': 4.0.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-uri-escape': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/smithy-client@4.4.5': + dependencies: + '@smithy/core': 3.6.0 + '@smithy/middleware-endpoint': 4.1.13 + '@smithy/middleware-stack': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-stream': 4.2.2 + tslib: 2.8.1 + + '@smithy/types@4.3.1': + dependencies: + tslib: 2.8.1 + + '@smithy/url-parser@4.0.4': + dependencies: + '@smithy/querystring-parser': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/util-base64@4.0.0': + dependencies: + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/util-body-length-browser@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-body-length-node@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-buffer-from@4.0.0': + dependencies: + '@smithy/is-array-buffer': 4.0.0 + tslib: 2.8.1 + + '@smithy/util-config-provider@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-defaults-mode-browser@4.0.21': + dependencies: + '@smithy/property-provider': 4.0.4 + '@smithy/smithy-client': 4.4.5 + '@smithy/types': 4.3.1 + bowser: 2.11.0 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-node@4.0.21': + dependencies: + '@smithy/config-resolver': 4.1.4 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/smithy-client': 4.4.5 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/util-endpoints@3.0.6': + dependencies: + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/util-hex-encoding@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-middleware@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/util-retry@4.0.6': + dependencies: + '@smithy/service-error-classification': 4.0.6 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/util-stream@4.2.2': + dependencies: + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/node-http-handler': 4.0.6 + '@smithy/types': 4.3.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/util-uri-escape@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-utf8@4.0.0': + dependencies: + '@smithy/util-buffer-from': 4.0.0 + tslib: 2.8.1 + + '@smithy/util-waiter@4.0.6': + dependencies: + '@smithy/abort-controller': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@socket.io/component-emitter@3.1.2': {} - '@tempfix/idb@8.0.3': {} - - '@tempfix/watcher@2.3.0': + '@szmarczak/http-timer@5.0.1': dependencies: - stubborn-fs: 1.2.5 + defer-to-connect: 2.0.1 + + '@tempfix/idb@8.0.3': {} '@tokenizer/token@0.3.0': {} @@ -2873,71 +4891,81 @@ snapshots: dependencies: type-fest: 4.20.1 - '@tsconfig/node10@1.0.11': {} + '@tsclass/tsclass@4.4.4': + dependencies: + type-fest: 4.41.0 - '@tsconfig/node12@1.0.11': {} + '@tsclass/tsclass@8.2.1': + dependencies: + type-fest: 4.41.0 - '@tsconfig/node14@1.0.3': {} + '@tsclass/tsclass@9.2.0': + dependencies: + type-fest: 4.41.0 - '@tsconfig/node16@1.0.4': {} + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.1 + optional: true - '@types/body-parser@1.19.5': + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 18.19.39 + '@types/node': 24.0.7 '@types/buffer-json@2.0.3': {} '@types/clean-css@4.2.11': dependencies: - '@types/node': 18.19.39 + '@types/node': 24.0.7 source-map: 0.6.1 '@types/connect@3.4.38': dependencies: - '@types/node': 18.19.39 + '@types/node': 24.0.7 - '@types/cookie@0.4.1': {} - - '@types/cors@2.8.17': + '@types/cors@2.8.19': dependencies: - '@types/node': 18.19.39 + '@types/node': 24.0.7 '@types/debug@4.1.12': dependencies: - '@types/ms': 0.7.34 + '@types/ms': 2.1.0 - '@types/express-serve-static-core@4.19.5': + '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 18.19.39 - '@types/qs': 6.9.15 + '@types/node': 24.0.7 + '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + '@types/send': 0.17.5 - '@types/express@4.17.21': + '@types/express@5.0.3': dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.5 - '@types/qs': 6.9.15 - '@types/serve-static': 1.15.7 + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.0.6 + '@types/serve-static': 1.15.8 '@types/from2@2.3.5': dependencies: - '@types/node': 18.19.39 + '@types/node': 24.0.7 '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 18.19.39 + '@types/node': 24.0.7 '@types/glob@8.1.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.19.39 + '@types/node': 24.0.7 + + '@types/gunzip-maybe@1.4.2': + dependencies: + '@types/node': 24.0.7 '@types/hast@3.0.4': dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 '@types/html-minifier@4.0.5': dependencies: @@ -2945,7 +4973,9 @@ snapshots: '@types/relateurl': 0.2.33 '@types/uglify-js': 3.17.5 - '@types/http-errors@2.0.4': {} + '@types/http-cache-semantics@4.0.4': {} + + '@types/http-errors@2.0.5': {} '@types/js-yaml@3.12.10': {} @@ -2953,11 +4983,11 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 18.19.39 + '@types/node': 24.0.7 '@types/mdast@4.0.4': dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 '@types/mime-types@2.1.4': {} @@ -2965,13 +4995,13 @@ snapshots: '@types/minimatch@5.1.2': {} - '@types/ms@0.7.34': {} + '@types/ms@2.1.0': {} - '@types/node@18.19.39': + '@types/node@24.0.7': dependencies: - undici-types: 5.26.5 + undici-types: 7.8.0 - '@types/qs@6.9.15': {} + '@types/qs@6.14.0': {} '@types/randomatic@3.1.5': {} @@ -2979,38 +5009,44 @@ snapshots: '@types/relateurl@0.2.33': {} - '@types/send@0.17.4': + '@types/semver@7.7.0': {} + + '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 18.19.39 + '@types/node': 24.0.7 - '@types/serve-static@1.15.7': + '@types/serve-static@1.15.8': dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 18.19.39 - '@types/send': 0.17.4 + '@types/http-errors': 2.0.5 + '@types/node': 24.0.7 + '@types/send': 0.17.5 '@types/symbol-tree@3.2.5': {} + '@types/tar-stream@2.2.3': + dependencies: + '@types/node': 24.0.7 + '@types/through2@2.0.41': dependencies: - '@types/node': 18.19.39 + '@types/node': 24.0.7 '@types/trusted-types@2.0.7': {} - '@types/turndown@5.0.4': {} + '@types/turndown@5.0.5': {} '@types/uglify-js@3.17.5': dependencies: source-map: 0.6.1 - '@types/unist@3.0.2': {} + '@types/unist@3.0.3': {} '@types/uuid@9.0.8': {} '@types/which@3.0.4': {} - '@ungap/structured-clone@1.2.0': {} + '@ungap/structured-clone@1.3.0': {} '@uptime.link/interfaces@2.0.21': dependencies: @@ -3022,16 +5058,14 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-walk@8.3.3: - dependencies: - acorn: 8.12.0 - - acorn@8.12.0: {} - agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + ansi-256-colors@1.1.0: {} ansi-regex@5.0.1: {} @@ -3044,7 +5078,7 @@ snapshots: ansi-styles@6.2.1: {} - arg@4.1.3: {} + ansis@4.1.0: {} argparse@1.0.10: dependencies: @@ -3056,17 +5090,20 @@ snapshots: asynckit@0.4.0: {} + b4a@1.6.7: {} + bail@2.0.2: {} balanced-match@1.0.2: {} - base64-arraybuffer-es6@0.7.0: {} + bare-events@2.5.4: + optional: true base64-js@1.5.1: {} base64id@2.0.0: {} - body-parser@1.20.2: + body-parser@1.20.3: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -3076,14 +5113,16 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.11.0 + qs: 6.13.0 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: - supports-color - brace-expansion@1.1.11: + bowser@2.11.0: {} + + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -3092,13 +5131,19 @@ snapshots: dependencies: balanced-match: 1.0.2 - broadcast-channel@7.0.0: + broadcast-channel@7.1.0: dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.27.0 oblivious-set: 1.4.0 p-queue: 6.6.2 unload: 2.4.1 + browserify-zlib@0.1.4: + dependencies: + pako: 0.2.9 + + buffer-from@1.1.2: {} + buffer-json@2.0.0: {} buffer@6.0.3: @@ -3108,6 +5153,23 @@ snapshots: bytes@3.1.2: {} + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.2 + responselike: 3.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -3116,6 +5178,11 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} camel-case@3.0.0: @@ -3131,6 +5198,12 @@ snapshots: character-entities@2.0.2: {} + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@2.0.0: {} + clean-css@4.2.4: dependencies: source-map: 0.6.1 @@ -3153,6 +5226,11 @@ snapshots: concat-map@0.0.1: {} + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -3161,9 +5239,9 @@ snapshots: cookie-signature@1.0.6: {} - cookie@0.4.2: {} + cookie@0.7.1: {} - cookie@0.6.0: {} + cookie@0.7.2: {} core-util-is@1.0.3: {} @@ -3172,38 +5250,58 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - create-require@1.1.1: {} - croner@5.7.0: {} croner@7.0.7: {} + croner@9.1.0: {} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + crypto-random-string@5.0.0: dependencies: type-fest: 2.19.0 - css.escape@1.5.1: {} + date-fns@4.1.0: {} dayjs@1.11.11: {} + dayjs@1.11.13: {} + debug@2.6.9: dependencies: ms: 2.0.0 - debug@4.3.5: + debug@4.3.7: dependencies: - ms: 2.1.2 + ms: 2.1.3 - decode-named-character-reference@1.0.2: + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-extend@0.6.0: {} + + defer-to-connect@2.0.1: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 @@ -3230,11 +5328,18 @@ snapshots: dependencies: dequal: 2.0.3 - diff@4.0.2: {} - - domexception@1.0.1: + dunder-proto@1.0.1: dependencies: - webidl-conversions: 4.0.2 + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexify@3.7.1: + dependencies: + end-of-stream: 1.4.5 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 eastasianwidth@0.2.0: {} @@ -3246,32 +5351,37 @@ snapshots: encodeurl@1.0.2: {} - engine.io-client@6.5.4: + encodeurl@2.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + engine.io-client@6.6.3: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.5 - engine.io-parser: 5.2.2 + debug: 4.3.7 + engine.io-parser: 5.2.3 ws: 8.17.1 - xmlhttprequest-ssl: 2.0.0 + xmlhttprequest-ssl: 2.1.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - engine.io-parser@5.2.2: {} + engine.io-parser@5.2.3: {} - engine.io@6.5.4: + engine.io@6.6.4: dependencies: - '@types/cookie': 0.4.1 - '@types/cors': 2.8.17 - '@types/node': 18.19.39 + '@types/cors': 2.8.19 + '@types/node': 24.0.7 accepts: 1.3.8 base64id: 2.0.0 - cookie: 0.4.2 + cookie: 0.7.2 cors: 2.8.5 - debug: 4.3.5 - engine.io-parser: 5.2.2 - ws: 8.11.0 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 transitivePeerDependencies: - bufferutil - supports-color @@ -3285,33 +5395,48 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} + es-errors@1.3.0: {} - esbuild@0.19.12: + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.25.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 escape-html@1.0.3: {} @@ -3329,34 +5454,34 @@ snapshots: dependencies: lodash.assign: 3.2.0 - express@4.19.2: + express@4.21.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.2 + body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.6.0 + cookie: 0.7.1 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 + finalhandler: 1.3.1 fresh: 0.5.2 http-errors: 2.0.0 - merge-descriptors: 1.0.1 + merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.7 + path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.13.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.19.0 + serve-static: 1.16.2 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -3367,19 +5492,23 @@ snapshots: extend@3.0.2: {} - fake-indexeddb@4.0.2: - dependencies: - realistic-structured-clone: 3.0.0 - fake-indexeddb@5.0.2: {} + fake-indexeddb@6.0.1: {} + fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-json-stable-stringify@2.1.0: {} - fast-xml-parser@4.4.0: + fast-xml-parser@4.4.1: dependencies: - strnum: 1.0.5 + strnum: 1.1.2 + + fast-xml-parser@4.5.3: + dependencies: + strnum: 1.1.2 fault@2.0.1: dependencies: @@ -3389,16 +5518,17 @@ snapshots: dependencies: xml-js: 1.6.11 - file-type@19.0.0: + file-type@19.6.0: dependencies: - readable-web-to-node-stream: 3.0.2 - strtok3: 7.0.0 - token-types: 5.0.1 + get-stream: 9.0.1 + strtok3: 9.1.1 + token-types: 6.0.3 + uint8array-extras: 1.4.0 - finalhandler@1.2.0: + finalhandler@1.3.1: dependencies: debug: 2.6.9 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 @@ -3409,7 +5539,7 @@ snapshots: foreground-child@2.0.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 3.0.7 foreground-child@3.2.1: @@ -3417,12 +5547,27 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data-encoder@2.1.4: {} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 + form-data@4.0.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + format@0.2.2: {} forwarded@0.2.0: {} @@ -3440,8 +5585,21 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + fs.realpath@1.0.0: {} + fsevents@2.3.3: + optional: true + function-bind@1.1.2: {} get-intrinsic@1.2.4: @@ -3452,6 +5610,35 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + glob@10.4.2: dependencies: foreground-child: 3.2.1 @@ -3461,6 +5648,15 @@ snapshots: package-json-from-dist: 1.0.0 path-scurry: 1.11.1 + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -3474,19 +5670,40 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + gopd@1.2.0: {} + + got@12.6.1: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + graceful-fs@4.2.10: {} + graceful-fs@4.2.11: {} - happy-dom@8.9.0: + gunzip-maybe@1.4.2: dependencies: - css.escape: 1.5.1 - he: 1.2.0 - iconv-lite: 0.6.3 - node-fetch: 2.7.0 + browserify-zlib: 0.1.4 + is-deflate: 1.0.0 + is-gzip: 1.0.0 + peek-stream: 1.1.3 + pumpify: 1.5.1 + through2: 2.0.5 + + happy-dom@15.11.7: + dependencies: + entities: 4.5.0 webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 - transitivePeerDependencies: - - encoding has-property-descriptors@1.0.2: dependencies: @@ -3496,84 +5713,40 @@ snapshots: has-symbols@1.0.3: {} + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + hasown@2.0.2: dependencies: function-bind: 1.1.2 - hast-util-from-parse5@8.0.1: + hast-util-sanitize@5.0.2: dependencies: '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.5.0 - vfile: 6.0.1 - vfile-location: 5.0.2 - web-namespaces: 2.0.1 - - hast-util-parse-selector@4.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-raw@9.0.4: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - '@ungap/structured-clone': 1.2.0 - hast-util-from-parse5: 8.0.1 - hast-util-to-parse5: 8.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - parse5: 7.1.2 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-sanitize@5.0.1: - dependencies: - '@types/hast': 3.0.4 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.3.0 unist-util-position: 5.0.0 - hast-util-to-html@9.0.1: + hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 ccount: 2.0.1 comma-separated-tokens: 2.0.3 - hast-util-raw: 9.0.4 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-parse5@8.0.0: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 - hastscript@8.0.0: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - he@1.2.0: {} html-minifier@4.0.0: @@ -3584,10 +5757,12 @@ snapshots: he: 1.2.0 param-case: 2.1.1 relateurl: 0.2.7 - uglify-js: 3.18.0 + uglify-js: 3.19.3 html-void-elements@3.0.0: {} + http-cache-semantics@4.2.0: {} + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -3596,6 +5771,11 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + humanize-ms@1.2.1: dependencies: ms: 2.1.3 @@ -3604,10 +5784,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - ieee754@1.2.1: {} inflight@1.0.6: @@ -3617,12 +5793,18 @@ snapshots: inherits@2.0.4: {} + ini@1.3.8: {} + ipaddr.js@1.9.1: {} + is-deflate@1.0.0: {} + is-docker@2.2.1: {} is-fullwidth-code-point@3.0.0: {} + is-gzip@1.0.0: {} + is-nan@1.3.2: dependencies: call-bind: 1.0.7 @@ -3634,6 +5816,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-stream@4.0.1: {} + is-windows@1.0.2: {} is-wsl@2.2.0: @@ -3652,6 +5836,10 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + js-base64@3.7.7: {} js-yaml@3.14.1: @@ -3663,45 +5851,37 @@ snapshots: dependencies: argparse: 2.0.1 + json-buffer@3.0.1: {} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + kind-of@6.0.3: {} - lit-element@3.3.3: - dependencies: - '@lit-labs/ssr-dom-shim': 1.2.0 - '@lit/reactive-element': 1.6.3 - lit-html: 2.8.0 + lenis@1.3.4: {} - lit-element@4.0.6: + lit-element@4.2.0: dependencies: - '@lit-labs/ssr-dom-shim': 1.2.0 - '@lit/reactive-element': 2.0.4 - lit-html: 3.1.4 + '@lit-labs/ssr-dom-shim': 1.3.0 + '@lit/reactive-element': 2.1.0 + lit-html: 3.3.0 - lit-html@2.8.0: + lit-html@3.3.0: dependencies: '@types/trusted-types': 2.0.7 - lit-html@3.1.4: + lit@3.3.0: dependencies: - '@types/trusted-types': 2.0.7 - - lit@2.8.0: - dependencies: - '@lit/reactive-element': 1.6.3 - lit-element: 3.3.3 - lit-html: 2.8.0 - - lit@3.1.4: - dependencies: - '@lit/reactive-element': 2.0.4 - lit-element: 4.0.6 - lit-html: 3.1.4 + '@lit/reactive-element': 2.1.0 + lit-element: 4.2.0 + lit-html: 3.3.0 lodash._baseassign@3.2.0: dependencies: @@ -3742,14 +5922,16 @@ snapshots: lodash.restparam@3.6.1: {} - lodash@4.17.21: {} - longest-streak@3.1.0: {} lower-case@1.1.4: {} + lowercase-keys@3.0.0: {} + lru-cache@10.2.2: {} + lru-cache@11.1.0: {} + make-dir@3.1.0: dependencies: semver: 6.3.1 @@ -3760,34 +5942,36 @@ snapshots: make-error@1.3.6: {} - markdown-table@3.0.3: {} + markdown-table@3.0.4: {} matcher@5.0.0: dependencies: escape-string-regexp: 5.0.0 + math-intrinsics@1.1.0: {} + math-random@1.0.4: {} - mdast-util-find-and-replace@3.0.1: + mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - mdast-util-from-markdown@2.0.1: + mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 - decode-named-character-reference: 1.0.2 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color @@ -3797,35 +5981,35 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: - supports-color - mdast-util-gfm-autolink-literal@2.0.0: + mdast-util-gfm-autolink-literal@2.0.1: dependencies: '@types/mdast': 4.0.4 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 - mdast-util-gfm-footnote@2.0.0: + mdast-util-gfm-footnote@2.1.0: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color mdast-util-gfm-strikethrough@2.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -3833,9 +6017,9 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -3843,20 +6027,20 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm@3.0.0: + mdast-util-gfm@3.1.0: dependencies: - mdast-util-from-markdown: 2.0.1 - mdast-util-gfm-autolink-literal: 2.0.0 - mdast-util-gfm-footnote: 2.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 mdast-util-gfm-strikethrough: 2.0.0 mdast-util-gfm-table: 2.0.0 mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -3869,22 +6053,23 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.3.0 devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 + micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 - vfile: 6.0.1 + vfile: 6.0.3 - mdast-util-to-markdown@2.1.0: + mdast-util-to-markdown@2.1.2: dependencies: '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 unist-util-visit: 5.0.0 zwitch: 2.0.4 @@ -3894,205 +6079,205 @@ snapshots: media-typer@0.3.0: {} - merge-descriptors@1.0.1: {} + merge-descriptors@1.0.3: {} methods@1.1.2: {} - micromark-core-commonmark@2.0.1: + micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-frontmatter@2.0.0: dependencies: fault: 2.0.1 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-gfm-autolink-literal@2.0.0: + micromark-extension-gfm-autolink-literal@2.1.0: dependencies: - micromark-util-character: 2.1.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-gfm-footnote@2.0.0: + micromark-extension-gfm-footnote@2.1.0: dependencies: devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-gfm-strikethrough@2.0.0: + micromark-extension-gfm-strikethrough@2.1.0: dependencies: devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-gfm-table@2.0.0: + micromark-extension-gfm-table@2.1.1: dependencies: devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-tagfilter@2.0.0: dependencies: - micromark-util-types: 2.0.0 + micromark-util-types: 2.0.2 - micromark-extension-gfm-task-list-item@2.0.1: + micromark-extension-gfm-task-list-item@2.1.0: dependencies: devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm@3.0.0: dependencies: - micromark-extension-gfm-autolink-literal: 2.0.0 - micromark-extension-gfm-footnote: 2.0.0 - micromark-extension-gfm-strikethrough: 2.0.0 - micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.0.1 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-destination@2.0.0: + micromark-factory-destination@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-label@2.0.0: + micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-space@2.0.0: + micromark-factory-space@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 - micromark-factory-title@2.0.0: + micromark-factory-title@2.0.1: dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-whitespace@2.0.0: + micromark-factory-whitespace@2.0.1: dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-character@2.1.0: + micromark-util-character@2.1.1: dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-chunked@2.0.0: + micromark-util-chunked@2.0.1: dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-classify-character@2.0.0: + micromark-util-classify-character@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-combine-extensions@2.0.0: + micromark-util-combine-extensions@2.0.1: dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-decode-numeric-character-reference@2.0.1: + micromark-util-decode-numeric-character-reference@2.0.2: dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-decode-string@2.0.0: + micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.1.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 - micromark-util-encode@2.0.0: {} + micromark-util-encode@2.0.1: {} - micromark-util-html-tag-name@2.0.0: {} + micromark-util-html-tag-name@2.0.1: {} - micromark-util-normalize-identifier@2.0.0: + micromark-util-normalize-identifier@2.0.1: dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-resolve-all@2.0.0: + micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.0 + micromark-util-types: 2.0.2 - micromark-util-sanitize-uri@2.0.0: + micromark-util-sanitize-uri@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.1: + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-symbol@2.0.0: {} + micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.0: {} + micromark-util-types@2.0.2: {} - micromark@4.0.0: + micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.3.5 - decode-named-character-reference: 1.0.2 + debug: 4.4.1 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color @@ -4104,23 +6289,44 @@ snapshots: mime@1.6.0: {} - mime@4.0.3: {} + mime@4.0.7: {} + + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} min-indent@1.0.1: {} + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + minipass@7.1.2: {} - ms@2.0.0: {} + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 - ms@2.1.2: {} + mkdirp@1.0.4: {} + + ms@2.0.0: {} ms@2.1.3: {} @@ -4132,18 +6338,18 @@ snapshots: dependencies: lower-case: 1.1.4 - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - normalize-newline@4.1.0: dependencies: replace-buffer: 1.2.1 + normalize-url@8.0.2: {} + object-assign@4.1.1: {} object-inspect@1.13.2: {} + object-inspect@1.13.4: {} + object-keys@1.1.1: {} oblivious-set@1.4.0: {} @@ -4164,6 +6370,8 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 + p-cancelable@3.0.0: {} + p-finally@1.0.0: {} p-queue@6.6.2: @@ -4177,15 +6385,24 @@ snapshots: package-json-from-dist@1.0.0: {} + package-json-from-dist@1.0.1: {} + + package-json@8.1.1: + dependencies: + got: 12.6.1 + registry-auth-token: 5.1.0 + registry-url: 6.0.1 + semver: 7.7.2 + + pako@0.2.9: {} + param-case@2.1.1: dependencies: no-case: 2.3.2 parse-ms@3.0.0: {} - parse5@7.1.2: - dependencies: - entities: 4.5.0 + parse-ms@4.0.0: {} parseurl@1.3.3: {} @@ -4198,37 +6415,71 @@ snapshots: lru-cache: 10.2.2 minipass: 7.1.2 - path-to-regexp@0.1.7: {} + path-scurry@2.0.0: + dependencies: + lru-cache: 11.1.0 + minipass: 7.1.2 - path-to-regexp@6.2.2: {} + path-to-regexp@0.1.12: {} - peek-readable@5.0.0: {} + path-to-regexp@8.2.0: {} + + peek-readable@5.4.2: {} + + peek-stream@1.1.3: + dependencies: + buffer-from: 1.1.2 + duplexify: 3.7.1 + through2: 2.0.5 + + picomatch@4.0.2: {} pretty-ms@8.0.0: dependencies: parse-ms: 3.0.0 + pretty-ms@9.2.0: + dependencies: + parse-ms: 4.0.0 + process-nextick-args@2.0.1: {} - property-information@6.5.0: {} + property-information@7.1.0: {} + + proto-list@1.2.4: {} proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - punycode@1.4.1: {} - - punycode@2.3.1: {} - - qs@6.11.0: + pump@2.0.1: dependencies: - side-channel: 1.0.6 + end-of-stream: 1.4.5 + once: 1.4.0 + + pumpify@1.5.1: + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + + punycode@1.4.1: {} qs@6.12.1: dependencies: side-channel: 1.0.6 + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + quick-lru@5.1.1: {} + randomatic@3.1.1: dependencies: is-number: 4.0.0 @@ -4244,6 +6495,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -4260,18 +6518,18 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-web-to-node-stream@3.0.2: - dependencies: - readable-stream: 3.6.2 - - realistic-structured-clone@3.0.0: - dependencies: - domexception: 1.0.1 - typeson: 6.1.0 - typeson-registry: 1.0.0-alpha.39 + readdirp@4.1.2: {} regenerator-runtime@0.14.1: {} + registry-auth-token@5.1.0: + dependencies: + '@pnpm/npm-conf': 2.3.1 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + relateurl@0.2.7: {} remark-frontmatter@5.0.0: @@ -4283,10 +6541,10 @@ snapshots: transitivePeerDependencies: - supports-color - remark-gfm@4.0.0: + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 - mdast-util-gfm: 3.0.0 + mdast-util-gfm: 3.1.0 micromark-extension-gfm: 3.0.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 @@ -4297,16 +6555,16 @@ snapshots: remark-html@16.0.1: dependencies: '@types/mdast': 4.0.4 - hast-util-sanitize: 5.0.1 - hast-util-to-html: 9.0.1 + hast-util-sanitize: 5.0.2 + hast-util-to-html: 9.0.5 mdast-util-to-hast: 13.2.0 unified: 11.0.5 remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.1 - micromark-util-types: 2.0.0 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -4314,15 +6572,43 @@ snapshots: remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 unified: 11.0.5 replace-buffer@1.2.1: {} + resolve-alpn@1.2.1: {} + + resolve-pkg-maps@1.0.0: {} + + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + rimraf@3.0.2: dependencies: glob: 7.2.3 + rolldown@1.0.0-beta.21: + dependencies: + '@oxc-project/runtime': 0.75.0 + '@oxc-project/types': 0.75.0 + '@rolldown/pluginutils': 1.0.0-beta.21 + ansis: 4.1.0 + optionalDependencies: + '@rolldown/binding-darwin-arm64': 1.0.0-beta.21 + '@rolldown/binding-darwin-x64': 1.0.0-beta.21 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.21 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.21 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.21 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.21 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.21 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.21 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.21 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.21 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.21 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.21 + rss-parser@3.13.0: dependencies: entities: 2.2.0 @@ -4332,6 +6618,10 @@ snapshots: dependencies: tslib: 2.6.3 + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} @@ -4342,7 +6632,9 @@ snapshots: semver@6.3.1: {} - send@0.18.0: + semver@7.7.2: {} + + send@0.19.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -4360,12 +6652,12 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@1.15.0: + serve-static@1.16.2: dependencies: - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.19.0 transitivePeerDependencies: - supports-color @@ -4386,6 +6678,26 @@ snapshots: shebang-regex@3.0.0: {} + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -4393,24 +6705,32 @@ snapshots: get-intrinsic: 1.2.4 object-inspect: 1.13.2 + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + signal-exit@3.0.7: {} signal-exit@4.1.0: {} socket.io-adapter@2.5.5: dependencies: - debug: 4.3.5 + debug: 4.3.7 ws: 8.17.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socket.io-client@4.7.5: + socket.io-client@4.8.1: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.5 - engine.io-client: 6.5.4 + debug: 4.3.7 + engine.io-client: 6.6.3 socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil @@ -4420,17 +6740,17 @@ snapshots: socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.5 + debug: 4.3.7 transitivePeerDependencies: - supports-color - socket.io@4.7.5: + socket.io@4.8.1: dependencies: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.5 - engine.io: 6.5.4 + debug: 4.3.7 + engine.io: 6.6.4 socket.io-adapter: 2.5.5 socket.io-parser: 4.2.4 transitivePeerDependencies: @@ -4455,6 +6775,15 @@ snapshots: statuses@2.0.1: {} + stream-shift@1.0.3: {} + + streamx@2.22.1: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.5.4 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -4492,23 +6821,42 @@ snapshots: dependencies: min-indent: 1.0.1 - strnum@1.0.5: {} + strip-json-comments@2.0.1: {} - strtok3@7.0.0: + strnum@1.1.2: {} + + strtok3@9.1.1: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 5.0.0 - - stubborn-fs@1.2.5: {} + peek-readable: 5.4.2 sweet-scroll@4.0.0: {} symbol-tree@3.2.4: {} + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.1 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + threads@1.7.0: dependencies: callsites: 3.1.0 - debug: 4.3.5 + debug: 4.4.1 is-observable: 2.1.0 observable-fns: 0.6.1 optionalDependencies: @@ -4516,6 +6864,11 @@ snapshots: transitivePeerDependencies: - supports-color + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + through2@4.0.2: dependencies: readable-stream: 3.6.2 @@ -4526,43 +6879,28 @@ snapshots: toidentifier@1.0.1: {} - token-types@5.0.1: + token-types@6.0.3: dependencies: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 - tr46@0.0.3: {} - - tr46@2.1.0: - dependencies: - punycode: 2.3.1 - tree-kill@1.2.2: {} trim-lines@3.0.1: {} trough@2.2.0: {} - ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.2): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.39 - acorn: 8.12.0 - acorn-walk: 8.3.3 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.5.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - tslib@2.6.3: {} + tslib@2.8.1: {} + + tsx@4.20.3: + dependencies: + esbuild: 0.25.5 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 + turndown-plugin-gfm@1.0.2: {} turndown@7.2.0: @@ -4573,59 +6911,51 @@ snapshots: type-fest@4.20.1: {} + type-fest@4.41.0: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - typescript@5.3.3: {} + typescript@5.8.3: {} - typescript@5.5.2: {} + uglify-js@3.19.3: {} - typeson-registry@1.0.0-alpha.39: - dependencies: - base64-arraybuffer-es6: 0.7.0 - typeson: 6.1.0 - whatwg-url: 8.7.0 + uint8array-extras@1.4.0: {} - typeson@6.1.0: {} - - uglify-js@3.18.0: {} - - uint8array-extras@1.1.0: {} - - undici-types@5.26.5: {} + undici-types@7.8.0: {} unified@11.0.5: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 bail: 2.0.2 devlop: 1.1.0 extend: 3.0.2 is-plain-obj: 4.1.0 trough: 2.2.0 - vfile: 6.0.1 + vfile: 6.0.3 unist-util-is@6.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-position@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-stringify-position@4.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-visit-parents@6.0.1: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 @@ -4642,64 +6972,38 @@ snapshots: punycode: 1.4.1 qs: 6.12.1 + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.14.0 + util-deprecate@1.0.2: {} utils-merge@1.0.1: {} uuid@9.0.1: {} - v8-compile-cache-lib@3.0.1: {} - vary@1.1.2: {} - vfile-location@5.0.2: - dependencies: - '@types/unist': 3.0.2 - vfile: 6.0.1 - vfile-message@4.0.2: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 - vfile@6.0.1: + vfile@6.0.3: dependencies: - '@types/unist': 3.0.2 - unist-util-stringify-position: 4.0.0 + '@types/unist': 3.0.3 vfile-message: 4.0.2 - web-namespaces@2.0.1: {} - - webidl-conversions@3.0.1: {} - - webidl-conversions@4.0.2: {} - - webidl-conversions@6.1.0: {} - webidl-conversions@7.0.0: {} - whatwg-encoding@2.0.0: - dependencies: - iconv-lite: 0.6.3 - whatwg-mimetype@3.0.0: {} - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - whatwg-url@8.7.0: - dependencies: - lodash: 4.17.21 - tr46: 2.1.0 - webidl-conversions: 6.1.0 - which@2.0.2: dependencies: isexe: 2.0.0 - which@4.0.0: + which@5.0.0: dependencies: isexe: 3.1.1 @@ -4717,8 +7021,6 @@ snapshots: wrappy@1.0.2: {} - ws@8.11.0: {} - ws@8.17.1: {} xml-js@1.6.11: @@ -4730,12 +7032,21 @@ snapshots: sax: 1.4.1 xmlbuilder: 11.0.1 + xmlbuilder2@3.1.1: + dependencies: + '@oozcitak/dom': 1.15.10 + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + js-yaml: 3.14.1 + xmlbuilder@11.0.1: {} - xmlhttprequest-ssl@2.0.0: {} + xmlhttprequest-ssl@2.1.2: {} + + xtend@4.0.2: {} + + yallist@4.0.0: {} yargs-parser@21.1.1: {} - yn@3.1.1: {} - zwitch@2.0.4: {} diff --git a/readme.hints.md b/readme.hints.md index e69de29..a2bbb09 100644 --- a/readme.hints.md +++ b/readme.hints.md @@ -0,0 +1,272 @@ +# Project Hints and Analysis + +## Project Overview +The @uptime.link/statuspage (v1.0.74) is a web components catalog specifically designed for building status pages for UptimeLink - an uptime monitoring platform. This catalog provides pre-built, customizable UI components that can be assembled to create complete status pages. + +## Core Purpose +- **Primary Function**: Provide a comprehensive set of web components for building status monitoring dashboards +- **Target Audience**: Developers building status pages for services using UptimeLink monitoring +- **Key Features**: Real-time status display, incident management, historical data visualization + +## Architecture +- **Package Name**: @uptime.link/statuspage (v1.0.74) +- **Project Type**: Web Component Catalog (wcc) +- **Module Type**: ESM (ECMAScript Modules) +- **Distribution**: Private npm package on verdaccio.lossless.one registry +- **License**: UNLICENSED (proprietary to Lossless GmbH) + +## Technology Stack +- **Framework**: @design.estate/dees-element - A web components framework with: + - TypeScript decorators for component registration + - Built-in CSS-in-JS with theme support + - Shadow DOM encapsulation + - Property binding system +- **DOM Utilities**: @design.estate/dees-domtools for DOM manipulation +- **Interfaces**: @uptime.link/interfaces for shared data structures +- **Build Tools**: + - tsbuild: TypeScript compilation with --allowimplicitany flag + - tsbundle: Creates production bundles for web components + - tswatch: Development file watching + - TypeScript target: ES2022 with NodeNext module resolution + +## Component Library +The catalog provides 7 main components + 1 internal component: + +### Main Components: +1. **upl-statuspage-header**: + - Page header with customizable title + - Action buttons for "Report Incident" and "Subscribe to Updates" + - Emits custom events: 'reportNewIncident' and 'statusSubscribe' + +2. **upl-statuspage-statusbar**: + - Main status indicator showing overall system health + - Visual status representation (likely green/yellow/red indicators) + +3. **upl-statuspage-assetsselector**: + - Component for selecting/filtering which assets to view + - Useful for multi-service status pages + +4. **upl-statuspage-statusdetails**: + - Detailed status information display + - Shows granular status data for selected services + +5. **upl-statuspage-statusmonth**: + - Monthly calendar view of status history + - Visual representation of uptime/downtime over time + +6. **upl-statuspage-incidents**: + - Incident management display + - Properties: currentIncidences and pastIncidences (arrays of IIncident) + - Supports whitelabel mode + - Shows active and historical incidents + +7. **upl-statuspage-footer**: + - Page footer with legal information link + - Customizable legal URL + +### Internal Components: +- **uplinternal-miniheading**: Internal component for consistent heading styling + +## Data Flow & Integration +- Components receive data through properties (using @property decorator) +- Incident data follows the IIncident interface from @uptime.link/interfaces +- Components are designed to work standalone or together +- Event-driven communication between components + +## Styling & Theming +- CSS-in-JS approach using cssManager +- Built-in light/dark theme support via bdTheme() helper +- Font: Inter (loaded via assetbroker) +- Responsive design with max-width constraints (900px) +- Background colors: Light (#eeeeeb) / Dark (#222222) +- Text colors: Light (#333333) / Dark (#ffffff) + +## Build Output Structure +- Source: ts_web/ directory +- Compiled output: dist_ts_web/ (ES modules with TypeScript definitions) +- Bundle output: dist_bundle/ (production-ready bundle with source maps) +- Development server: dist_watch/ with index.html for testing + +## Usage Pattern +1. Import components from the package +2. Create elements using document.createElement() +3. Set properties programmatically +4. Append to DOM +5. Handle custom events for user interactions + +## Recent Updates (from changelog) +- v1.0.74: Improved font loading strategy using single assetbroker link +- v1.0.73: Enhanced documentation and aligned project descriptions +- v1.0.72: Fixed import paths and updated package configurations + +## Development Workflow +- `pnpm build`: Compile TypeScript and create production bundle +- `pnpm watch`: Start development server with hot reload +- `pnpm test`: Currently just runs build (no actual tests implemented) +- Demo page available at html/index.html using page1 template + +## Key Observations +1. The project follows a consistent pattern for all components +2. Each component is self-contained with its own styling +3. Theme support is built-in for all components +4. The project is part of a larger UptimeLink ecosystem +5. Components are designed for composition into complete status pages +6. No test files are currently implemented despite test infrastructure being set up + +## Production Readiness Analysis (v1.0.74) + +### Current State +The components are essentially **UI shells** - they have styling and structure but lack actual functionality. They display static/hardcoded content with no real data integration. + +### Major Missing Functionality + +#### 1. Data Integration +- **No API client or data fetching logic** - components can't retrieve real status data +- **No authentication/authorization** - no secure API communication +- **No real-time updates** - no WebSocket/SSE implementation +- **Static content only** - statusbar always shows "Everything is working normally!" +- **Empty data properties** - currentIncidences/pastIncidences arrays are never populated + +#### 2. Component Implementation Gaps +- **upl-statuspage-assetsselector**: Only shows "Hello!" - missing entire asset selection UI +- **upl-statuspage-statusbar**: Hardcoded green status - no dynamic status calculation +- **upl-statuspage-statusdetails**: Shows 48 static green bars - no actual hourly data +- **upl-statuspage-statusmonth**: Shows 150 static green days - no real uptime data +- **upl-statuspage-incidents**: Only shows "No incidents" - missing incident card rendering +- **upl-statuspage-footer**: Placeholder "Hi there" - missing actual footer content + +#### 3. Error Handling & States +- No loading indicators during data fetch +- No error states for failed requests +- No offline detection or handling +- No retry mechanisms +- No skeleton screens + +#### 4. Accessibility Issues +- No ARIA labels on interactive elements +- No keyboard navigation support +- No focus management +- No screen reader announcements +- Missing semantic HTML (divs instead of buttons/nav) +- No skip navigation links + +#### 5. Responsive Design Issues +- Fixed 900px max-width with no proper mobile breakpoints +- Grid layouts won't adapt to small screens +- No touch-friendly tap targets +- Font sizes not responsive + +#### 6. Internationalization +- All text hardcoded in English +- No i18n framework or translation system +- No locale-aware date/time formatting +- No RTL language support + +#### 7. Missing Infrastructure +- No configuration system for API endpoints +- No analytics integration +- No performance monitoring +- No PWA capabilities +- No export functionality +- No proper TypeScript interfaces for data models +- **No tests whatsoever** despite test infrastructure + +### Production Requirements Summary +To make these components production-ready requires implementing: +1. Complete data layer with API client +2. State management system +3. All missing UI functionality +4. Comprehensive error handling +5. Full accessibility compliance +6. Proper responsive design +7. Internationalization support +8. Authentication/authorization +9. Real-time update capabilities +10. Comprehensive test suite + +## Recent Updates (Post v1.0.74) + +### Components Made Production-Ready +All components have been significantly enhanced with the following improvements: + +1. **upl-statuspage-header** + - Added properties: showReportButton, showSubscribeButton, brandColor, logoUrl, customStyles, loading + - Supports custom branding with dynamic colors + - Loading state with skeleton animation + - Configurable button visibility + +2. **upl-statuspage-statusbar** + - Already production-ready with full functionality + - Supports all status states (operational, degraded, partial_outage, major_outage, maintenance) + - Loading state and expandable behavior + +3. **upl-statuspage-assetsselector** + - Complete implementation with service selection grid + - Full filtering capabilities (text, category, selected-only) + - Select all/none functionality + - Real-time status updates + - Event emissions for selection changes + - Loading states and empty states + +4. **upl-statuspage-statusdetails** + - Hourly status bars with tooltips + - Skeleton loading states + - Real-time data updates + - Important: Expects hourly-aligned timestamps in data + +5. **upl-statuspage-statusmonth** + - Calendar grid display with status colors + - Weekday labels and proper month alignment + - Hover tooltips with detailed information + - Day click events + +6. **upl-statuspage-incidents** + - Full incident management with current/past incidents + - Multiple incident statuses (investigating, identified, monitoring, resolved, postmortem) + - Incident updates timeline + - Affected services display + - Root cause and resolution information + +7. **upl-statuspage-footer** (Completely rebuilt) + - Comprehensive footer implementation with all expected properties + - Social media links with SVG icons (Twitter, GitHub, LinkedIn, Facebook, YouTube, Instagram, Slack, Discord) + - Subscribe/Report issue functionality + - Language selector and theme toggle + - Whitelabel support + - Custom branding options + - Loading and error states + - RSS feed and API status links + - Last updated timestamp with relative formatting + +### Demo Architecture +- All demos have been updated to use dees-demowrapper with runAfterRender callbacks +- Properties are set dynamically on elements within runAfterRender +- Multiple demo sections show different use cases and states +- Event logging demonstrates interactivity +- Demos can be instrumented with multiple wrappers for different scenarios + +### Interfaces Implemented +Created comprehensive TypeScript interfaces in ts_web/interfaces/index.ts: +- IServiceStatus - Service monitoring data +- IOverallStatus - Overall system status +- IIncidentUpdate - Incident update entries +- IIncidentDetails - Full incident information +- IMonthlyUptime - Monthly uptime calendar data +- IStatusDetail - Hourly status data points +- IStatusPageConfig - Configuration options + +### Remaining Tasks +- Integration with actual UptimeLink API +- WebSocket/SSE for real-time updates +- Authentication/authorization implementation +- Accessibility improvements (ARIA labels, keyboard navigation) +- More comprehensive responsive design +- Internationalization system +- Unit and integration tests + +### Important Fix Applied +The `dees-demowrapper` component was not functioning because it wasn't being imported. Fixed by adding: +```typescript +import '@design.estate/dees-wcctools/demotools'; +``` +to `html/index.ts`. This registers the `dees-demowrapper` custom element which properly executes the `runAfterRender` callbacks in demos. \ No newline at end of file diff --git a/readme.plan.md b/readme.plan.md new file mode 100644 index 0000000..8d87aa1 --- /dev/null +++ b/readme.plan.md @@ -0,0 +1,261 @@ +# Production-Ready Elements Implementation Plan + +## First: Reread CLAUDE.md guidelines + +## Overview +Transform the @uptime.link/statuspage components from UI shells into fully functional, production-ready web components with real data integration, proper error handling, accessibility, and comprehensive testing. + +## Phase 1: Core Infrastructure (Foundation) + +### 1.1 Data Layer & API Client +- [ ] Create `ts_web/services/api.client.ts` for API communication +- [ ] Implement authentication/token management +- [ ] Add request/response interceptors for error handling +- [ ] Create retry logic with exponential backoff +- [ ] Add request caching mechanism + +### 1.2 TypeScript Interfaces & Models +- [ ] Create `ts_web/interfaces/` directory +- [ ] Define comprehensive interfaces for: + - Service status data + - Incident details with severity levels + - Asset/service definitions + - API responses + - Configuration options + - User preferences + +### 1.3 State Management +- [ ] Create `ts_web/services/state.manager.ts` +- [ ] Implement observable state pattern +- [ ] Add state persistence (localStorage) +- [ ] Create state update notifications + +### 1.4 Real-time Updates +- [ ] Create `ts_web/services/realtime.service.ts` +- [ ] Implement WebSocket connection management +- [ ] Add fallback to Server-Sent Events (SSE) +- [ ] Create reconnection logic +- [ ] Add heartbeat/ping mechanism + +### 1.5 Configuration System +- [ ] Create `ts_web/config/default.config.ts` +- [ ] Add environment-based configuration +- [ ] Implement config validation +- [ ] Add runtime config updates + +## Phase 2: Component Implementation + +### 2.1 upl-statuspage-header +- [ ] Add loading state during actions +- [ ] Implement proper event handling with data +- [ ] Add keyboard shortcuts (Alt+R for report, Alt+S for subscribe) +- [ ] Add ARIA labels and roles +- [ ] Implement focus management + +### 2.2 upl-statuspage-statusbar +- [ ] Connect to real status data +- [ ] Implement dynamic status calculation +- [ ] Add status levels (operational, degraded, partial outage, major outage) +- [ ] Color coding (green, yellow, orange, red) +- [ ] Add animated transitions between states +- [ ] Implement click to expand details +- [ ] Add ARIA live region for status changes + +### 2.3 upl-statuspage-assetsselector +- [ ] Implement complete asset listing UI +- [ ] Add search/filter functionality +- [ ] Create checkbox/toggle selection +- [ ] Add select all/none buttons +- [ ] Implement category grouping +- [ ] Add asset status indicators +- [ ] Emit selection change events +- [ ] Add keyboard navigation (arrow keys) + +### 2.4 upl-statuspage-statusdetails +- [ ] Connect to real hourly status data +- [ ] Implement dynamic color coding +- [ ] Add hover tooltips with exact times +- [ ] Create time zone support +- [ ] Add zoom in/out functionality +- [ ] Implement data aggregation options +- [ ] Add export to CSV/JSON +- [ ] Make responsive for mobile + +### 2.5 upl-statuspage-statusmonth +- [ ] Connect to real daily uptime data +- [ ] Add month/year navigation +- [ ] Implement uptime percentage calculation +- [ ] Color coding by uptime percentage +- [ ] Add detailed day tooltips +- [ ] Create calendar grid with proper labels +- [ ] Add click to drill down +- [ ] Implement date range selection + +### 2.6 upl-statuspage-incidents +- [ ] Create incident card component +- [ ] Implement incident rendering from data +- [ ] Add severity indicators (critical, major, minor) +- [ ] Create incident timeline +- [ ] Add affected services display +- [ ] Implement status updates (investigating, identified, monitoring, resolved) +- [ ] Add time calculations (duration, time to resolution) +- [ ] Create incident filtering/search +- [ ] Add pagination for historical incidents + +### 2.7 upl-statuspage-footer +- [ ] Implement configurable footer content +- [ ] Add RSS feed link +- [ ] Create API status endpoint link +- [ ] Add social media links +- [ ] Implement "Report Incident" modal +- [ ] Create "Subscribe" functionality +- [ ] Add language selector +- [ ] Include last update timestamp + +## Phase 3: User Experience Enhancements + +### 3.1 Loading States +- [ ] Create skeleton screens for each component +- [ ] Add loading spinners/indicators +- [ ] Implement progressive loading +- [ ] Add loading progress for large datasets + +### 3.2 Error Handling +- [ ] Create error boundary components +- [ ] Design error state UI for each component +- [ ] Add retry buttons +- [ ] Implement offline detection +- [ ] Create fallback content +- [ ] Add error logging/reporting + +### 3.3 Accessibility (WCAG 2.1 AA) +- [ ] Add comprehensive ARIA labels +- [ ] Implement keyboard navigation +- [ ] Create skip navigation links +- [ ] Add focus indicators +- [ ] Implement screen reader announcements +- [ ] Ensure color contrast compliance +- [ ] Add reduced motion support + +### 3.4 Responsive Design +- [ ] Create mobile breakpoints +- [ ] Implement touch-friendly interactions +- [ ] Add swipe gestures for navigation +- [ ] Create responsive typography +- [ ] Optimize layouts for tablets +- [ ] Add horizontal scroll prevention + +### 3.5 Internationalization +- [ ] Create i18n service +- [ ] Add translation files (en, de, es, fr, ja) +- [ ] Implement locale detection +- [ ] Add date/time formatting +- [ ] Create number formatting +- [ ] Add RTL support +- [ ] Implement pluralization rules + +## Phase 4: Advanced Features + +### 4.1 Performance Optimization +- [ ] Implement virtual scrolling for long lists +- [ ] Add lazy loading for historical data +- [ ] Create data pagination +- [ ] Implement request debouncing +- [ ] Add response caching +- [ ] Optimize re-renders + +### 4.2 Analytics & Monitoring +- [ ] Add page view tracking +- [ ] Implement user interaction tracking +- [ ] Create performance metrics +- [ ] Add error tracking +- [ ] Implement custom event tracking + +### 4.3 PWA Capabilities +- [ ] Create service worker +- [ ] Implement offline support +- [ ] Add push notifications +- [ ] Create app manifest +- [ ] Enable installation prompt + +### 4.4 Export & Reporting +- [ ] Add PDF export for status reports +- [ ] Create CSV export for data +- [ ] Implement scheduled reports +- [ ] Add print stylesheets +- [ ] Create shareable status links + +## Phase 5: Testing & Documentation + +### 5.1 Unit Tests +- [ ] Set up testing framework (@git.zone/tstest) +- [ ] Create tests for all services +- [ ] Test component logic +- [ ] Add API client tests +- [ ] Test state management +- [ ] Create test utilities + +### 5.2 Integration Tests +- [ ] Test component interactions +- [ ] Test data flow +- [ ] Test error scenarios +- [ ] Test real-time updates +- [ ] Test offline behavior + +### 5.3 E2E Tests +- [ ] Set up Playwright +- [ ] Test user workflows +- [ ] Test accessibility +- [ ] Test responsive behavior +- [ ] Test cross-browser compatibility + +### 5.4 Documentation +- [ ] Create component API documentation +- [ ] Add usage examples +- [ ] Create integration guide +- [ ] Add configuration documentation +- [ ] Create troubleshooting guide + +## Implementation Order + +1. **Week 1-2**: Core Infrastructure (Phase 1) +2. **Week 3-4**: Basic Component Functionality (Phase 2.1-2.3) +3. **Week 5-6**: Advanced Components (Phase 2.4-2.7) +4. **Week 7**: User Experience (Phase 3) +5. **Week 8**: Advanced Features (Phase 4) +6. **Week 9-10**: Testing & Documentation (Phase 5) + +## Success Criteria + +- All components display real data from API +- Full accessibility compliance (WCAG 2.1 AA) +- 90%+ test coverage +- Sub-3 second initial load time +- Works offline with cached data +- Supports 5+ languages +- Mobile-responsive design +- Real-time updates working +- Comprehensive error handling +- Production-ready documentation + +## Dependencies to Add + +```json +{ + "dependencies": { + "@push.rocks/smartrequest": "*", + "@push.rocks/smartwebsocket": "*", + "@push.rocks/smartstate": "*", + "@push.rocks/smarti18n": "*", + "@push.rocks/smarttime": "*" + }, + "devDependencies": { + "@git.zone/tstest": "*", + "@playwright/test": "*" + } +} +``` + +--- + +Would you like me to proceed with implementing this plan? I recommend starting with Phase 1 (Core Infrastructure) as it provides the foundation for all other functionality. \ No newline at end of file diff --git a/ts_web/elements/index.ts b/ts_web/elements/index.ts index 3f0c3be..038a70e 100644 --- a/ts_web/elements/index.ts +++ b/ts_web/elements/index.ts @@ -1,3 +1,4 @@ +// Export components export * from './upl-statuspage-assetsselector.js'; export * from './upl-statuspage-footer.js'; export * from './upl-statuspage-header.js'; @@ -5,3 +6,6 @@ export * from './upl-statuspage-incidents.js'; export * from './upl-statuspage-statusbar.js'; export * from './upl-statuspage-statusdetails.js'; export * from './upl-statuspage-statusmonth.js'; + +// Export interfaces +export * from '../interfaces/index.js'; diff --git a/ts_web/elements/internal/uplinternal-miniheading.ts b/ts_web/elements/internal/uplinternal-miniheading.ts index 559071e..4e022f2 100644 --- a/ts_web/elements/internal/uplinternal-miniheading.ts +++ b/ts_web/elements/internal/uplinternal-miniheading.ts @@ -1,26 +1,33 @@ -import { customElement, DeesElement, html, type TemplateResult } from '@design.estate/dees-element'; - +import { customElement, DeesElement, html, type TemplateResult, css, cssManager, unsafeCSS } from '@design.estate/dees-element'; import * as domtools from '@design.estate/dees-domtools'; +import { fonts, colors, spacing } from '../../styles/shared.styles.js'; @customElement('uplinternal-miniheading') export class UplinternalMiniheading extends DeesElement { + public static styles = [ + domtools.elementBasic.staticStyles, + css` + :host { + display: block; + font-family: ${unsafeCSS(fonts.base)}; + } + + h5 { + display: block; + max-width: 1200px; + margin: 0px auto; + padding: 0px 0px ${unsafeCSS(spacing.md)} 0px; + color: ${colors.text.secondary}; + font-size: 14px; + font-weight: 600; + letter-spacing: 0.025em; + text-transform: uppercase; + } + ` + ]; + public render(): TemplateResult { return html` - ${domtools.elementBasic.styles} -
${this.textContent}
`; } diff --git a/ts_web/elements/upl-statuspage-assetsselector.demo.ts b/ts_web/elements/upl-statuspage-assetsselector.demo.ts new file mode 100644 index 0000000..7af2da5 --- /dev/null +++ b/ts_web/elements/upl-statuspage-assetsselector.demo.ts @@ -0,0 +1,607 @@ +import { html } from '@design.estate/dees-element'; +import type { IServiceStatus } from '../interfaces/index.js'; + +export const demoFunc = () => html` + + +
+ +
+
Full Featured Service Selector
+ { + const assetsSelector = wrapperElement.querySelector('upl-statuspage-assetsselector') as any; + + // Comprehensive demo data + const demoServices: IServiceStatus[] = [ + // Infrastructure + { + id: 'api-gateway', + name: 'api-gateway', + displayName: 'API Gateway', + description: 'Main API endpoint for all services', + currentStatus: 'operational', + lastChecked: Date.now(), + uptime30d: 99.95, + uptime90d: 99.92, + responseTime: 45, + category: 'Infrastructure', + selected: true + }, + { + id: 'web-server', + name: 'web-server', + displayName: 'Web Server', + description: 'Frontend web application server', + currentStatus: 'operational', + lastChecked: Date.now(), + uptime30d: 99.99, + uptime90d: 99.97, + responseTime: 28, + category: 'Infrastructure', + selected: true + }, + { + id: 'load-balancer', + name: 'load-balancer', + displayName: 'Load Balancer', + description: 'Traffic distribution system', + currentStatus: 'operational', + lastChecked: Date.now(), + uptime30d: 100, + uptime90d: 99.99, + responseTime: 5, + category: 'Infrastructure', + selected: false + }, + { + id: 'cdn', + name: 'cdn', + displayName: 'CDN', + description: 'Content delivery network', + currentStatus: 'operational', + lastChecked: Date.now(), + uptime30d: 100, + uptime90d: 99.99, + responseTime: 12, + category: 'Infrastructure', + selected: false + }, + // Data Services + { + id: 'database', + name: 'database', + displayName: 'Database Cluster', + description: 'Primary database cluster with replicas', + currentStatus: 'degraded', + lastChecked: Date.now(), + uptime30d: 98.5, + uptime90d: 99.1, + responseTime: 120, + category: 'Data', + selected: true + }, + { + id: 'redis-cache', + name: 'redis-cache', + displayName: 'Redis Cache', + description: 'In-memory data caching', + currentStatus: 'operational', + lastChecked: Date.now(), + uptime30d: 99.98, + uptime90d: 99.96, + responseTime: 5, + category: 'Data', + selected: true + }, + { + id: 'elasticsearch', + name: 'elasticsearch', + displayName: 'Search Engine', + description: 'Full-text search service', + currentStatus: 'partial_outage', + lastChecked: Date.now(), + uptime30d: 95.2, + uptime90d: 97.8, + responseTime: 180, + category: 'Data', + selected: false + }, + { + id: 'backup-service', + name: 'backup-service', + displayName: 'Backup Service', + description: 'Automated backup and recovery', + currentStatus: 'operational', + lastChecked: Date.now(), + uptime30d: 100, + uptime90d: 99.99, + responseTime: 95, + category: 'Data', + selected: true + }, + // Application Services + { + id: 'auth-service', + name: 'auth-service', + displayName: 'Authentication Service', + description: 'User authentication and authorization', + currentStatus: 'operational', + lastChecked: Date.now(), + uptime30d: 99.98, + uptime90d: 99.95, + responseTime: 65, + category: 'Services', + selected: true + }, + { + id: 'payment-gateway', + name: 'payment-gateway', + displayName: 'Payment Gateway', + description: 'Payment processing service', + currentStatus: 'maintenance', + lastChecked: Date.now(), + uptime30d: 97.5, + uptime90d: 98.8, + responseTime: 250, + category: 'Services', + selected: false + }, + { + id: 'email-service', + name: 'email-service', + displayName: 'Email Service', + description: 'Transactional email delivery', + currentStatus: 'operational', + lastChecked: Date.now(), + uptime30d: 99.9, + uptime90d: 99.85, + responseTime: 150, + category: 'Services', + selected: true + }, + { + id: 'notification-service', + name: 'notification-service', + displayName: 'Notification Service', + description: 'Push notifications and alerts', + currentStatus: 'operational', + lastChecked: Date.now(), + uptime30d: 99.7, + uptime90d: 99.8, + responseTime: 88, + category: 'Services', + selected: false + }, + { + id: 'analytics', + name: 'analytics', + displayName: 'Analytics Engine', + description: 'Real-time analytics processing', + currentStatus: 'major_outage', + lastChecked: Date.now(), + uptime30d: 89.5, + uptime90d: 94.2, + responseTime: 450, + category: 'Services', + selected: false + }, + // Monitoring + { + id: 'monitoring', + name: 'monitoring', + displayName: 'Monitoring System', + description: 'System health and metrics monitoring', + currentStatus: 'operational', + lastChecked: Date.now(), + uptime30d: 99.95, + uptime90d: 99.93, + responseTime: 78, + category: 'Monitoring', + selected: true + }, + { + id: 'logging', + name: 'logging', + displayName: 'Logging Service', + description: 'Centralized log management', + currentStatus: 'operational', + lastChecked: Date.now(), + uptime30d: 99.9, + uptime90d: 99.88, + responseTime: 92, + category: 'Monitoring', + selected: false + } + ]; + + // Set initial data + assetsSelector.services = demoServices; + + // Demo loading state + assetsSelector.loading = true; + setTimeout(() => { + assetsSelector.loading = false; + }, 1000); + + // Create event log + const eventLog = document.createElement('div'); + eventLog.className = 'event-log'; + eventLog.innerHTML = 'Event Log:
'; + wrapperElement.appendChild(eventLog); + + const logEvent = (message: string) => { + const time = new Date().toLocaleTimeString(); + eventLog.innerHTML += `[${time}] ${message}
`; + eventLog.scrollTop = eventLog.scrollHeight; + }; + + // Listen for selection changes + assetsSelector.addEventListener('selectionChanged', (event: CustomEvent) => { + const selected = event.detail.selectedServices.length; + const total = demoServices.length; + logEvent(`Selection changed: ${selected}/${total} services selected`); + }); + + // Simulate status updates + setInterval(() => { + const randomService = demoServices[Math.floor(Math.random() * demoServices.length)]; + const statuses: Array = ['operational', 'degraded', 'partial_outage', 'major_outage', 'maintenance']; + const newStatus = statuses[Math.floor(Math.random() * statuses.length)]; + + if (randomService.currentStatus !== newStatus) { + const oldStatus = randomService.currentStatus; + randomService.currentStatus = newStatus; + randomService.lastChecked = Date.now(); + assetsSelector.requestUpdate(); + logEvent(`${randomService.displayName}: ${oldStatus} → ${newStatus}`); + } + }, 5000); + }} + > + +
+
+ + +
+
Empty State
+ { + const assetsSelector = wrapperElement.querySelector('upl-statuspage-assetsselector') as any; + + // No services + assetsSelector.services = []; + + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = ` + + `; + wrapperElement.appendChild(controls); + + controls.querySelector('#addServices')?.addEventListener('click', () => { + assetsSelector.services = [ + { + id: 'new-service-1', + name: 'new-service-1', + displayName: 'New Service 1', + description: 'Just added', + currentStatus: 'operational', + lastChecked: Date.now(), + uptime30d: 100, + uptime90d: 100, + responseTime: 50, + selected: true + }, + { + id: 'new-service-2', + name: 'new-service-2', + displayName: 'New Service 2', + description: 'Just added', + currentStatus: 'operational', + lastChecked: Date.now(), + uptime30d: 100, + uptime90d: 100, + responseTime: 60, + selected: false + } + ]; + }); + }} + > + + +
+ + +
+
Advanced Filtering Demo
+ { + const assetsSelector = wrapperElement.querySelector('upl-statuspage-assetsselector') as any; + + // Generate many services for filtering + const generateServices = (): IServiceStatus[] => { + const services: IServiceStatus[] = []; + const regions = ['us-east', 'us-west', 'eu-central', 'ap-south']; + const types = ['api', 'web', 'db', 'cache', 'queue']; + const statuses: Array = ['operational', 'degraded', 'partial_outage']; + + regions.forEach(region => { + types.forEach(type => { + const id = `${region}-${type}`; + services.push({ + id, + name: id, + displayName: `${region.toUpperCase()} ${type.toUpperCase()}`, + description: `${type} service in ${region} region`, + currentStatus: statuses[Math.floor(Math.random() * statuses.length)], + lastChecked: Date.now(), + uptime30d: 95 + Math.random() * 5, + uptime90d: 94 + Math.random() * 6, + responseTime: 20 + Math.random() * 200, + category: region, + selected: Math.random() > 0.5 + }); + }); + }); + + return services; + }; + + assetsSelector.services = generateServices(); + + // Demo different filter scenarios + const scenarios = [ + { + name: 'Show All', + action: () => { + assetsSelector.filterText = ''; + assetsSelector.filterCategory = 'all'; + assetsSelector.showOnlySelected = false; + } + }, + { + name: 'Filter by Text: "api"', + action: () => { + assetsSelector.filterText = 'api'; + assetsSelector.filterCategory = 'all'; + assetsSelector.showOnlySelected = false; + } + }, + { + name: 'Filter by Region: EU', + action: () => { + assetsSelector.filterText = ''; + assetsSelector.filterCategory = 'eu-central'; + assetsSelector.showOnlySelected = false; + } + }, + { + name: 'Show Only Selected', + action: () => { + assetsSelector.filterText = ''; + assetsSelector.filterCategory = 'all'; + assetsSelector.showOnlySelected = true; + } + }, + { + name: 'Complex: "db" in US regions', + action: () => { + assetsSelector.filterText = 'db'; + assetsSelector.filterCategory = 'us-east'; + assetsSelector.showOnlySelected = false; + } + } + ]; + + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + scenarios.forEach(scenario => { + const button = document.createElement('button'); + button.className = 'demo-button'; + button.textContent = scenario.name; + button.onclick = scenario.action; + controls.appendChild(button); + }); + wrapperElement.appendChild(controls); + + const info = document.createElement('div'); + info.className = 'demo-info'; + wrapperElement.appendChild(info); + + // Update info on changes + const updateInfo = () => { + const filtered = assetsSelector.getFilteredServices(); + const selected = assetsSelector.services.filter((s: any) => s.selected).length; + info.innerHTML = ` + Filter Status:
+ Total Services: ${assetsSelector.services.length}
+ Visible Services: ${filtered.length}
+ Selected Services: ${selected}
+ Active Filters: ${assetsSelector.filterText ? 'Text="' + assetsSelector.filterText + '" ' : ''}${assetsSelector.filterCategory !== 'all' ? 'Category=' + assetsSelector.filterCategory + ' ' : ''}${assetsSelector.showOnlySelected ? 'Selected Only' : ''} + `; + }; + + // Watch for changes + assetsSelector.addEventListener('selectionChanged', updateInfo); + setInterval(updateInfo, 500); + updateInfo(); + }} + > + +
+
+ + +
+
Performance Test - Many Services
+ { + const assetsSelector = wrapperElement.querySelector('upl-statuspage-assetsselector') as any; + + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = ` + + + + + `; + wrapperElement.appendChild(controls); + + const loadServices = (count: number) => { + const services: IServiceStatus[] = []; + const statuses: Array = ['operational', 'degraded', 'partial_outage', 'major_outage', 'maintenance']; + + for (let i = 0; i < count; i++) { + services.push({ + id: `service-${i}`, + name: `service-${i}`, + displayName: `Service ${i}`, + description: `Auto-generated service number ${i}`, + currentStatus: statuses[Math.floor(Math.random() * statuses.length)], + lastChecked: Date.now() - Math.random() * 3600000, + uptime30d: 85 + Math.random() * 15, + uptime90d: 80 + Math.random() * 20, + responseTime: 10 + Math.random() * 500, + category: `Category ${Math.floor(i / 10)}`, + selected: Math.random() > 0.7 + }); + } + + assetsSelector.loading = true; + setTimeout(() => { + assetsSelector.services = services; + assetsSelector.loading = false; + }, 500); + }; + + controls.querySelector('#load50')?.addEventListener('click', () => loadServices(50)); + controls.querySelector('#load100')?.addEventListener('click', () => loadServices(100)); + controls.querySelector('#load200')?.addEventListener('click', () => loadServices(200)); + controls.querySelector('#clear')?.addEventListener('click', () => { + assetsSelector.services = []; + }); + + // Start with 50 services + loadServices(50); + }} + > + + +
+ + +
+
Loading and Error States
+ { + const assetsSelector = wrapperElement.querySelector('upl-statuspage-assetsselector') as any; + + // Start with loading + assetsSelector.loading = true; + + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = ` + + + + `; + wrapperElement.appendChild(controls); + + controls.querySelector('#toggleLoading')?.addEventListener('click', () => { + assetsSelector.loading = !assetsSelector.loading; + }); + + controls.querySelector('#simulateError')?.addEventListener('click', () => { + assetsSelector.loading = true; + setTimeout(() => { + assetsSelector.loading = false; + assetsSelector.services = []; + // You could add an error message property to the component + assetsSelector.errorMessage = 'Failed to load services'; + }, 1500); + }); + + controls.querySelector('#loadSuccess')?.addEventListener('click', () => { + assetsSelector.loading = true; + setTimeout(() => { + assetsSelector.loading = false; + assetsSelector.services = [ + { + id: 'loaded-1', + name: 'loaded-1', + displayName: 'Successfully Loaded Service', + description: 'This service was loaded after simulated delay', + currentStatus: 'operational', + lastChecked: Date.now(), + uptime30d: 99.9, + uptime90d: 99.8, + responseTime: 45, + selected: true + } + ]; + }, 1000); + }); + }} + > + + +
+
+`; \ No newline at end of file diff --git a/ts_web/elements/upl-statuspage-assetsselector.ts b/ts_web/elements/upl-statuspage-assetsselector.ts index ea3a9a1..a4d5ecb 100644 --- a/ts_web/elements/upl-statuspage-assetsselector.ts +++ b/ts_web/elements/upl-statuspage-assetsselector.ts @@ -6,10 +6,14 @@ import { type TemplateResult, cssManager, css, + unsafeCSS, } from '@design.estate/dees-element'; import * as domtools from '@design.estate/dees-domtools'; +import type { IServiceStatus } from '../interfaces/index.js'; +import { fonts, colors, shadows, borderRadius, spacing, commonStyles, getStatusColor } from '../styles/shared.styles.js'; import './internal/uplinternal-miniheading.js'; +import { demoFunc } from './upl-statuspage-assetsselector.demo.js'; declare global { interface HTMLElementTagNameMap { @@ -19,9 +23,22 @@ declare global { @customElement('upl-statuspage-assetsselector') export class UplStatuspageAssetsselector extends DeesElement { - public static demo = () => html` - - `; + public static demo = demoFunc; + + @property({ type: Array }) + public services: IServiceStatus[] = []; + + @property({ type: String }) + public filterText: string = ''; + + @property({ type: String }) + public filterCategory: string = 'all'; + + @property({ type: Boolean }) + public showOnlySelected: boolean = false; + + @property({ type: Boolean }) + public loading: boolean = false; constructor() { super(); @@ -29,35 +46,398 @@ export class UplStatuspageAssetsselector extends DeesElement { public static styles = [ cssManager.defaultStyles, + commonStyles, css` :host { - padding: 0px 0px 15px 0px; display: block; - background: ${cssManager.bdTheme('#eeeeeb', '#222222')}; - font-family: Inter; - color: #fff; + background: transparent; + font-family: ${unsafeCSS(fonts.base)}; + color: ${colors.text.primary}; } - .mainbox { - margin: auto; - max-width: 900px; + .container { + max-width: 1200px; + margin: 0 auto; + padding: 0 ${unsafeCSS(spacing.lg)} ${unsafeCSS(spacing.lg)} ${unsafeCSS(spacing.lg)}; + } + + .controls { + display: flex; + gap: ${unsafeCSS(spacing.sm)}; + margin-bottom: ${unsafeCSS(spacing.lg)}; + flex-wrap: wrap; + align-items: center; + } + + .search-input { + flex: 1; + min-width: 240px; + padding: ${unsafeCSS(spacing.sm)} ${unsafeCSS(spacing.md)}; + border: 1px solid ${colors.border.default}; + border-radius: ${unsafeCSS(borderRadius.base)}; + background: ${colors.background.primary}; + color: ${colors.text.primary}; + font-size: 14px; + font-family: ${unsafeCSS(fonts.base)}; + transition: all 0.2s ease; + } + + .search-input:focus { + outline: none; + border-color: ${colors.text.primary}; + box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(0, 0, 0, 0.05)', 'rgba(255, 255, 255, 0.05)')}; + } + + .search-input::placeholder { + color: ${colors.text.muted}; + } + + .filter-button { + display: inline-flex; + align-items: center; + justify-content: center; + padding: ${unsafeCSS(spacing.sm)} ${unsafeCSS(spacing.md)}; + border: 1px solid ${colors.border.default}; + border-radius: ${unsafeCSS(borderRadius.base)}; + background: transparent; + color: ${colors.text.primary}; + cursor: pointer; + font-size: 14px; + font-weight: 500; + font-family: ${unsafeCSS(fonts.base)}; + transition: all 0.2s ease; + height: 36px; + } + + .filter-button:hover { + background: ${colors.background.secondary}; + border-color: ${colors.border.muted}; + transform: translateY(-1px); + } + + .filter-button:active { + transform: translateY(0); + } + + .filter-button.active { + background: ${colors.text.primary}; + color: ${colors.background.primary}; + border-color: ${colors.text.primary}; + } + + .filter-button.active:hover { + background: ${cssManager.bdTheme('#262626', '#f4f4f5')}; + border-color: ${cssManager.bdTheme('#262626', '#f4f4f5')}; + } + + .assets-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + gap: ${unsafeCSS(spacing.md)}; + background: ${colors.background.card}; + padding: ${unsafeCSS(spacing.lg)}; + border-radius: ${unsafeCSS(borderRadius.md)}; + border: 1px solid ${colors.border.default}; + min-height: 200px; + box-shadow: ${unsafeCSS(shadows.sm)}; + } + + .asset-card { + display: flex; + align-items: center; + padding: ${unsafeCSS(spacing.md)}; + background: ${colors.background.secondary}; + border-radius: ${unsafeCSS(borderRadius.base)}; + cursor: pointer; + transition: all 0.2s ease; + border: 1px solid ${colors.border.default}; + gap: ${unsafeCSS(spacing.md)}; + } + + .asset-card:hover { + transform: translateY(-2px); + box-shadow: ${unsafeCSS(shadows.md)}; + border-color: ${colors.border.muted}; + } + + .asset-card.selected { + border-color: ${colors.text.primary}; + background: ${colors.background.muted}; + box-shadow: 0 0 0 1px ${colors.text.primary}; + } + + .asset-checkbox { + width: 16px; + height: 16px; + cursor: pointer; + accent-color: ${colors.text.primary}; + flex-shrink: 0; + } + + .asset-info { + flex: 1; + min-width: 0; + } + + .asset-name { + font-weight: 600; + font-size: 14px; + margin-bottom: ${unsafeCSS(spacing.xs)}; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .asset-description { + font-size: 13px; + color: ${colors.text.secondary}; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .asset-status { + display: flex; + align-items: center; + gap: ${unsafeCSS(spacing.xs)}; + flex-shrink: 0; + } + + .status-indicator { + width: 8px; + height: 8px; + border-radius: ${unsafeCSS(borderRadius.full)}; + } + + .status-indicator.operational { background: ${colors.status.operational}; } + .status-indicator.degraded { background: ${colors.status.degraded}; } + .status-indicator.partial_outage { background: ${colors.status.partial}; } + .status-indicator.major_outage { background: ${colors.status.major}; } + .status-indicator.maintenance { background: ${colors.status.maintenance}; } + + .status-text { + font-size: 12px; + text-transform: capitalize; + color: ${colors.text.secondary}; + } + + .loading-message, + .no-results { + grid-column: 1 / -1; text-align: center; - height: 50px; - border-radius: 3px; - background: ${cssManager.bdTheme('#ffffff', '#333333')};; + padding: ${unsafeCSS(spacing['2xl'])}; + color: ${colors.text.secondary}; + } + + .summary { + text-align: right; + font-size: 13px; + margin-top: ${unsafeCSS(spacing.md)}; + color: ${colors.text.secondary}; + } + + @media (max-width: 640px) { + .container { + padding: 0 ${unsafeCSS(spacing.md)} ${unsafeCSS(spacing.md)} ${unsafeCSS(spacing.md)}; + } + + .controls { + flex-direction: column; + align-items: stretch; + } + + .search-input { + width: 100%; + } + + .assets-grid { + grid-template-columns: 1fr; + padding: ${unsafeCSS(spacing.md)}; + } + + .asset-card { + padding: ${unsafeCSS(spacing.sm)}; + } } `, ] public render(): TemplateResult { + const filteredServices = this.getFilteredServices(); + const selectedCount = this.services.filter(s => s.selected).length; + const categories = this.getUniqueCategories(); + return html` - - Monitored Assets -
- Hello! +
+ { + this.filterText = (e.target as HTMLInputElement).value; + }} + /> + + + + ${categories.map(category => html` + + `)} + + + + + + +
+ +
+ ${this.loading ? html` +
Loading services...
+ ` : filteredServices.length === 0 ? html` +
No services found matching your criteria
+ ` : filteredServices.map(service => html` +
this.toggleService(service.id)} + > + e.stopPropagation()} + @change=${(e: Event) => { + e.stopPropagation(); + this.toggleService(service.id); + }} + /> + +
+
${service.displayName}
+ ${service.description ? html` +
${service.description}
+ ` : ''} +
+ +
+
+
${service.currentStatus.replace(/_/g, ' ')}
+
+
+ `)} +
+ +
+ ${selectedCount} of ${this.services.length} services selected +
`; } + + private getFilteredServices(): IServiceStatus[] { + return this.services.filter(service => { + // Apply text filter + if (this.filterText && !service.displayName.toLowerCase().includes(this.filterText.toLowerCase()) && + (!service.description || !service.description.toLowerCase().includes(this.filterText.toLowerCase()))) { + return false; + } + + // Apply category filter + if (this.filterCategory !== 'all' && service.category !== this.filterCategory) { + return false; + } + + // Apply selected filter + if (this.showOnlySelected && !service.selected) { + return false; + } + + return true; + }); + } + + private getUniqueCategories(): string[] { + const categories = new Set(); + this.services.forEach(service => { + if (service.category) { + categories.add(service.category); + } + }); + return Array.from(categories).sort(); + } + + private toggleService(serviceId: string) { + const service = this.services.find(s => s.id === serviceId); + if (service) { + service.selected = !service.selected; + this.requestUpdate(); + + this.dispatchEvent(new CustomEvent('selectionChanged', { + detail: { + serviceId, + selected: service.selected, + selectedServices: this.services.filter(s => s.selected).map(s => s.id) + }, + bubbles: true, + composed: true + })); + } + } + + private selectAll() { + const filteredServices = this.getFilteredServices(); + filteredServices.forEach(service => { + service.selected = true; + }); + this.requestUpdate(); + this.emitSelectionUpdate(); + } + + private selectNone() { + const filteredServices = this.getFilteredServices(); + filteredServices.forEach(service => { + service.selected = false; + }); + this.requestUpdate(); + this.emitSelectionUpdate(); + } + + private emitSelectionUpdate() { + this.dispatchEvent(new CustomEvent('selectionChanged', { + detail: { + selectedServices: this.services.filter(s => s.selected).map(s => s.id) + }, + bubbles: true, + composed: true + })); + } } diff --git a/ts_web/elements/upl-statuspage-footer.demo.ts b/ts_web/elements/upl-statuspage-footer.demo.ts new file mode 100644 index 0000000..4edb6b3 --- /dev/null +++ b/ts_web/elements/upl-statuspage-footer.demo.ts @@ -0,0 +1,744 @@ +import { html } from '@design.estate/dees-element'; +import type { IStatusPageConfig } from '../interfaces/index.js'; + +export const demoFunc = () => html` + + +
+ +
+
Different Footer Configurations
+ { + const footer = wrapperElement.querySelector('upl-statuspage-footer') as any; + + // Configuration presets + const configPresets = { + minimal: { + name: 'Minimal', + config: { + companyName: 'SimpleStatus', + whitelabel: true, + lastUpdated: Date.now() + } + }, + standard: { + name: 'Standard', + config: { + companyName: 'TechCorp Solutions', + legalUrl: 'https://example.com/legal', + supportEmail: 'support@techcorp.com', + statusPageUrl: 'https://status.techcorp.com', + whitelabel: false, + lastUpdated: Date.now(), + currentYear: new Date().getFullYear() + } + }, + fullFeatured: { + name: 'Full Featured', + config: { + companyName: 'Enterprise Cloud Platform', + legalUrl: 'https://enterprise.com/legal', + supportEmail: 'support@enterprise.com', + statusPageUrl: 'https://status.enterprise.com', + whitelabel: false, + socialLinks: [ + { platform: 'twitter', url: 'https://twitter.com/enterprise' }, + { platform: 'github', url: 'https://github.com/enterprise' }, + { platform: 'linkedin', url: 'https://linkedin.com/company/enterprise' }, + { platform: 'facebook', url: 'https://facebook.com/enterprise' }, + { platform: 'youtube', url: 'https://youtube.com/enterprise' } + ], + rssFeedUrl: 'https://status.enterprise.com/rss', + apiStatusUrl: 'https://api.enterprise.com/v1/status', + lastUpdated: Date.now(), + currentYear: new Date().getFullYear(), + language: 'en', + additionalLinks: [ + { label: 'API Docs', url: 'https://docs.enterprise.com' }, + { label: 'Service SLA', url: 'https://enterprise.com/sla' }, + { label: 'Security', url: 'https://enterprise.com/security' } + ] + } + }, + international: { + name: 'International', + config: { + companyName: 'Global Services GmbH', + legalUrl: 'https://global.eu/legal', + supportEmail: 'support@global.eu', + statusPageUrl: 'https://status.global.eu', + whitelabel: false, + language: 'de', + currentYear: new Date().getFullYear(), + lastUpdated: Date.now(), + languageOptions: [ + { code: 'en', label: 'English' }, + { code: 'de', label: 'Deutsch' }, + { code: 'fr', label: 'Français' }, + { code: 'es', label: 'Español' }, + { code: 'ja', label: '日本語' } + ], + socialLinks: [ + { platform: 'twitter', url: 'https://twitter.com/global_eu' }, + { platform: 'linkedin', url: 'https://linkedin.com/company/global-eu' } + ] + } + }, + whitelabel: { + name: 'Whitelabel', + config: { + companyName: 'Custom Brand Status', + whitelabel: true, + customBranding: { + primaryColor: '#FF5722', + logoUrl: 'https://example.com/custom-logo.png', + footerText: 'Powered by Custom Infrastructure' + }, + lastUpdated: Date.now(), + currentYear: new Date().getFullYear() + } + } + }; + + // Initial setup + let currentPreset = 'standard'; + const applyPreset = (preset: any) => { + Object.keys(preset.config).forEach(key => { + footer[key] = preset.config[key]; + }); + updateConfigDisplay(preset.config); + }; + + applyPreset(configPresets[currentPreset]); + + // Create controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + + Object.entries(configPresets).forEach(([key, preset]) => { + const button = document.createElement('button'); + button.className = 'demo-button' + (key === currentPreset ? ' active' : ''); + button.textContent = preset.name; + button.onclick = () => { + controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active')); + button.classList.add('active'); + + currentPreset = key; + footer.loading = true; + setTimeout(() => { + applyPreset(preset); + footer.loading = false; + }, 500); + }; + controls.appendChild(button); + }); + + wrapperElement.appendChild(controls); + + // Add configuration display + const configDisplay = document.createElement('div'); + configDisplay.className = 'config-display'; + wrapperElement.appendChild(configDisplay); + + const updateConfigDisplay = (config: any) => { + configDisplay.innerHTML = Object.entries(config) + .filter(([key]) => key !== 'socialLinks' && key !== 'additionalLinks' && key !== 'languageOptions') + .map(([key, value]) => ` +
+
${key}
+
${value}
+
+ `).join(''); + }; + + // Handle events + footer.addEventListener('footerLinkClick', (event: CustomEvent) => { + console.log('Footer link clicked:', event.detail); + alert(`Link clicked: ${event.detail.type} - ${event.detail.url}`); + }); + + footer.addEventListener('subscribeClick', () => { + alert('Subscribe feature would open here'); + }); + + footer.addEventListener('reportIncidentClick', () => { + alert('Report incident form would open here'); + }); + + footer.addEventListener('languageChange', (event: CustomEvent) => { + alert(`Language changed to: ${event.detail.language}`); + }); + }} + > + +
+
+ + +
+
Loading and Error States
+ { + const footer = wrapperElement.querySelector('upl-statuspage-footer') as any; + + // Start with loading + footer.loading = true; + footer.companyName = 'LoadingCorp'; + + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = ` + + + + + + `; + wrapperElement.appendChild(controls); + + controls.querySelector('#toggleLoading')?.addEventListener('click', () => { + footer.loading = !footer.loading; + }); + + controls.querySelector('#loadSuccess')?.addEventListener('click', () => { + footer.loading = true; + setTimeout(() => { + footer.companyName = 'Successfully Loaded Inc'; + footer.legalUrl = 'https://example.com/legal'; + footer.supportEmail = 'support@loaded.com'; + footer.statusPageUrl = 'https://status.loaded.com'; + footer.lastUpdated = Date.now(); + footer.socialLinks = [ + { platform: 'twitter', url: 'https://twitter.com/loaded' }, + { platform: 'github', url: 'https://github.com/loaded' } + ]; + footer.loading = false; + footer.errorMessage = null; + }, 1000); + }); + + controls.querySelector('#simulateError')?.addEventListener('click', () => { + footer.loading = true; + setTimeout(() => { + footer.loading = false; + footer.errorMessage = 'Failed to load footer configuration'; + footer.companyName = 'Error Loading'; + footer.socialLinks = []; + }, 1500); + }); + + controls.querySelector('#simulateOffline')?.addEventListener('click', () => { + footer.offline = true; + footer.errorMessage = 'You are currently offline'; + footer.lastUpdated = null; + }); + + controls.querySelector('#brokenLinks')?.addEventListener('click', () => { + footer.companyName = 'Broken Links Demo'; + footer.legalUrl = 'https://broken.invalid/legal'; + footer.supportEmail = 'invalid-email'; + footer.socialLinks = [ + { platform: 'twitter', url: '' }, + { platform: 'github', url: 'not-a-url' } + ]; + footer.rssFeedUrl = 'https://broken.invalid/rss'; + footer.apiStatusUrl = null; + }); + + // Add info display + const info = document.createElement('div'); + info.className = 'demo-info'; + info.innerHTML = 'Test different loading states and error scenarios using the controls above.'; + wrapperElement.appendChild(info); + }} + > + + +
+ + +
+
Dynamic Updates and Real-time Features
+ { + const footer = wrapperElement.querySelector('upl-statuspage-footer') as any; + + // Initial configuration + footer.companyName = 'RealTime Systems'; + footer.legalUrl = 'https://realtime.com/legal'; + footer.supportEmail = 'support@realtime.com'; + footer.statusPageUrl = 'https://status.realtime.com'; + footer.lastUpdated = Date.now(); + footer.currentYear = new Date().getFullYear(); + + // Dynamic social links + const allSocialPlatforms = [ + { platform: 'twitter', url: 'https://twitter.com/realtime' }, + { platform: 'github', url: 'https://github.com/realtime' }, + { platform: 'linkedin', url: 'https://linkedin.com/company/realtime' }, + { platform: 'facebook', url: 'https://facebook.com/realtime' }, + { platform: 'youtube', url: 'https://youtube.com/realtime' }, + { platform: 'instagram', url: 'https://instagram.com/realtime' }, + { platform: 'slack', url: 'https://realtime.slack.com' }, + { platform: 'discord', url: 'https://discord.gg/realtime' } + ]; + + footer.socialLinks = allSocialPlatforms.slice(0, 3); + + // Real-time status feed + footer.rssFeedUrl = 'https://status.realtime.com/rss'; + footer.apiStatusUrl = 'https://api.realtime.com/v1/status'; + + // Status feed simulation + const statusUpdates = [ + 'All systems operational', + 'Investigating API latency', + 'Maintenance scheduled for tonight', + 'Performance improvements deployed', + 'New datacenter online', + 'Security patch applied' + ]; + + let updateIndex = 0; + footer.latestStatusUpdate = statusUpdates[0]; + + // Auto-update last updated time + const updateInterval = setInterval(() => { + footer.lastUpdated = Date.now(); + }, 5000); + + // Rotate status updates + const statusInterval = setInterval(() => { + updateIndex = (updateIndex + 1) % statusUpdates.length; + footer.latestStatusUpdate = statusUpdates[updateIndex]; + logEvent(`Status update: ${statusUpdates[updateIndex]}`); + }, 8000); + + // Create controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = ` + + + + + `; + wrapperElement.appendChild(controls); + + controls.querySelector('#addSocial')?.addEventListener('click', () => { + if (footer.socialLinks.length < allSocialPlatforms.length) { + footer.socialLinks = [...footer.socialLinks, allSocialPlatforms[footer.socialLinks.length]]; + logEvent(`Added ${allSocialPlatforms[footer.socialLinks.length - 1].platform} link`); + } + }); + + controls.querySelector('#removeSocial')?.addEventListener('click', () => { + if (footer.socialLinks.length > 0) { + const removed = footer.socialLinks[footer.socialLinks.length - 1]; + footer.socialLinks = footer.socialLinks.slice(0, -1); + logEvent(`Removed ${removed.platform} link`); + } + }); + + controls.querySelector('#updateStatus')?.addEventListener('click', () => { + const customStatus = prompt('Enter custom status update:'); + if (customStatus) { + footer.latestStatusUpdate = customStatus; + footer.lastUpdated = Date.now(); + logEvent(`Custom status: ${customStatus}`); + } + }); + + controls.querySelector('#changeYear')?.addEventListener('click', () => { + footer.currentYear = footer.currentYear + 1; + logEvent(`Year changed to ${footer.currentYear}`); + }); + + // Event log + const eventLog = document.createElement('div'); + eventLog.className = 'event-log'; + eventLog.innerHTML = 'Event Log:
'; + wrapperElement.appendChild(eventLog); + + const logEvent = (message: string) => { + const time = new Date().toLocaleTimeString(); + eventLog.innerHTML += `[${time}] ${message}
`; + eventLog.scrollTop = eventLog.scrollHeight; + }; + + logEvent('Real-time updates started'); + + // Cleanup + wrapperElement.addEventListener('remove', () => { + clearInterval(updateInterval); + clearInterval(statusInterval); + }); + }} + > + +
+
+ + +
+
Interactive Features and Actions
+ { + const footer = wrapperElement.querySelector('upl-statuspage-footer') as any; + + // Setup interactive footer + footer.companyName = 'Interactive Corp'; + footer.legalUrl = 'https://interactive.com/legal'; + footer.supportEmail = 'help@interactive.com'; + footer.statusPageUrl = 'https://status.interactive.com'; + footer.whitelabel = false; + footer.lastUpdated = Date.now(); + footer.currentYear = new Date().getFullYear(); + + // Interactive features + footer.enableSubscribe = true; + footer.enableReportIssue = true; + footer.enableLanguageSelector = true; + footer.enableThemeToggle = true; + + footer.languageOptions = [ + { code: 'en', label: 'English' }, + { code: 'es', label: 'Español' }, + { code: 'fr', label: 'Français' }, + { code: 'de', label: 'Deutsch' }, + { code: 'ja', label: '日本語' }, + { code: 'zh', label: '中文' } + ]; + + footer.socialLinks = [ + { platform: 'twitter', url: 'https://twitter.com/interactive' }, + { platform: 'github', url: 'https://github.com/interactive' }, + { platform: 'discord', url: 'https://discord.gg/interactive' } + ]; + + footer.additionalLinks = [ + { label: 'API Documentation', url: 'https://docs.interactive.com' }, + { label: 'Service Level Agreement', url: 'https://interactive.com/sla' }, + { label: 'Privacy Policy', url: 'https://interactive.com/privacy' }, + { label: 'Terms of Service', url: 'https://interactive.com/terms' } + ]; + + // Subscribe functionality + let subscriberCount = 1234; + footer.subscriberCount = subscriberCount; + + footer.addEventListener('subscribeClick', (event: CustomEvent) => { + const email = prompt('Enter your email to subscribe:'); + if (email && email.includes('@')) { + subscriberCount++; + footer.subscriberCount = subscriberCount; + logAction(`New subscriber: ${email} (Total: ${subscriberCount})`); + alert(`Successfully subscribed! You are subscriber #${subscriberCount}`); + } + }); + + // Report issue functionality + footer.addEventListener('reportIncidentClick', (event: CustomEvent) => { + const issue = prompt('Describe the issue you are experiencing:'); + if (issue) { + const ticketId = `INC-${Date.now().toString().slice(-6)}`; + logAction(`Issue reported: ${ticketId} - ${issue.substring(0, 50)}...`); + alert(`Thank you! Your issue has been logged.\nTicket ID: ${ticketId}\nWe will investigate and update you at the provided email.`); + } + }); + + // Language change + footer.addEventListener('languageChange', (event: CustomEvent) => { + const newLang = event.detail.language; + footer.currentLanguage = newLang; + logAction(`Language changed to: ${newLang}`); + + // Simulate translation + const translations = { + en: 'Interactive Corp', + es: 'Corporación Interactiva', + fr: 'Corp Interactif', + de: 'Interaktive GmbH', + ja: 'インタラクティブ株式会社', + zh: '互动公司' + }; + + footer.companyName = translations[newLang] || translations.en; + }); + + // Theme toggle + footer.addEventListener('themeToggle', (event: CustomEvent) => { + const theme = event.detail.theme; + logAction(`Theme changed to: ${theme}`); + footer.currentTheme = theme; + }); + + // Click tracking + footer.addEventListener('footerLinkClick', (event: CustomEvent) => { + logAction(`Link clicked: ${event.detail.type} - ${event.detail.label || event.detail.url}`); + }); + + // Action log + const actionLog = document.createElement('div'); + actionLog.className = 'event-log'; + actionLog.innerHTML = 'User Actions:
'; + wrapperElement.appendChild(actionLog); + + const logAction = (message: string) => { + const time = new Date().toLocaleTimeString(); + actionLog.innerHTML += `[${time}] ${message}
`; + actionLog.scrollTop = actionLog.scrollHeight; + }; + + logAction('Interactive footer ready'); + + // Add info + const info = document.createElement('div'); + info.className = 'demo-info'; + info.innerHTML = 'Try clicking on various footer elements to see the interactive features in action.'; + wrapperElement.appendChild(info); + }} + > + +
+
+ + +
+
Edge Cases and Special Scenarios
+ { + const footer = wrapperElement.querySelector('upl-statuspage-footer') as any; + + const edgeCases = { + empty: { + name: 'Empty/Minimal', + config: { + companyName: '', + whitelabel: true, + lastUpdated: null + } + }, + veryLong: { + name: 'Very Long Content', + config: { + companyName: 'International Mega Corporation with an Extremely Long Company Name That Tests Layout Limits Inc.', + legalUrl: 'https://very-long-domain-name-that-might-break-layouts.international-corporation.com/legal/terms-and-conditions/privacy-policy/cookie-policy', + supportEmail: 'customer.support.team@very-long-domain-name.international-corporation.com', + socialLinks: Array.from({ length: 15 }, (_, i) => ({ + platform: ['twitter', 'github', 'linkedin', 'facebook', 'youtube'][i % 5], + url: `https://social-${i}.com/long-username-handle-that-tests-limits` + })), + additionalLinks: Array.from({ length: 10 }, (_, i) => ({ + label: `Very Long Link Label That Might Cause Layout Issues #${i + 1}`, + url: `https://example.com/very/long/path/structure/that/goes/on/and/on/page-${i}` + })) + } + }, + unicode: { + name: 'Unicode/International', + config: { + companyName: '🌍 全球服务 • グローバル • العالمية • Глобальный 🌏', + legalUrl: 'https://unicode.test/法律', + supportEmail: 'support@日本.jp', + currentYear: new Date().getFullYear(), + socialLinks: [ + { platform: 'twitter', url: 'https://twitter.com/🌐' }, + { platform: 'github', url: 'https://github.com/世界' } + ], + additionalLinks: [ + { label: '📋 Terms & Conditions', url: '#' }, + { label: '🔒 Privacy Policy', url: '#' }, + { label: '🛡️ Security', url: '#' } + ] + } + }, + brokenData: { + name: 'Broken/Invalid Data', + config: { + companyName: null, + legalUrl: 'not-a-valid-url', + supportEmail: 'not-an-email', + currentYear: 'not-a-year', + lastUpdated: 'invalid-timestamp', + socialLinks: [ + { platform: null, url: null }, + { platform: 'unknown-platform', url: '' }, + { url: 'https://missing-platform.com' }, + { platform: 'twitter' } + ], + rssFeedUrl: '', + apiStatusUrl: undefined + } + }, + maxData: { + name: 'Maximum Data', + config: { + companyName: 'Maximum Configuration Demo', + legalUrl: 'https://max.demo/legal', + supportEmail: 'all@max.demo', + statusPageUrl: 'https://status.max.demo', + whitelabel: false, + currentYear: new Date().getFullYear(), + lastUpdated: Date.now(), + language: 'en', + theme: 'dark', + socialLinks: Array.from({ length: 20 }, (_, i) => ({ + platform: 'generic', + url: `https://social${i}.com` + })), + additionalLinks: Array.from({ length: 15 }, (_, i) => ({ + label: `Link ${i + 1}`, + url: `#link${i + 1}` + })), + rssFeedUrl: 'https://status.max.demo/rss', + apiStatusUrl: 'https://api.max.demo/status', + subscriberCount: 999999, + enableSubscribe: true, + enableReportIssue: true, + enableLanguageSelector: true, + enableThemeToggle: true, + languageOptions: Array.from({ length: 50 }, (_, i) => ({ + code: `lang${i}`, + label: `Language ${i}` + })) + } + } + }; + + // Initial setup + let currentCase = 'empty'; + const applyCase = (edgeCase: any) => { + // Clear all properties first + Object.keys(footer).forEach(key => { + if (typeof footer[key] !== 'function') { + footer[key] = undefined; + } + }); + + // Apply new config + Object.keys(edgeCase.config).forEach(key => { + footer[key] = edgeCase.config[key]; + }); + }; + + applyCase(edgeCases[currentCase]); + + // Create controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + + Object.entries(edgeCases).forEach(([key, edgeCase]) => { + const button = document.createElement('button'); + button.className = 'demo-button' + (key === currentCase ? ' active' : ''); + button.textContent = edgeCase.name; + button.onclick = () => { + controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active')); + button.classList.add('active'); + + currentCase = key; + applyCase(edgeCase); + }; + controls.appendChild(button); + }); + + wrapperElement.appendChild(controls); + + // Add description + const info = document.createElement('div'); + info.className = 'demo-info'; + info.innerHTML = ` + Edge Case Descriptions:
+ Empty: Minimal configuration with missing data
+ Very Long: Tests layout with extremely long content
+ Unicode: International characters and emojis
+ Broken Data: Invalid or malformed configuration
+ Maximum Data: All features with maximum content + `; + wrapperElement.appendChild(info); + }} + > + +
+
+
+`; \ No newline at end of file diff --git a/ts_web/elements/upl-statuspage-footer.ts b/ts_web/elements/upl-statuspage-footer.ts index ed689d9..63236f7 100644 --- a/ts_web/elements/upl-statuspage-footer.ts +++ b/ts_web/elements/upl-statuspage-footer.ts @@ -1,5 +1,7 @@ -import { DeesElement, property, html, customElement, type TemplateResult, css, cssManager } from '@design.estate/dees-element'; +import { DeesElement, property, html, customElement, type TemplateResult, css, cssManager, unsafeCSS } from '@design.estate/dees-element'; import * as domtools from '@design.estate/dees-domtools'; +import { fonts, colors, shadows, borderRadius, spacing, commonStyles } from '../styles/shared.styles.js'; +import { demoFunc } from './upl-statuspage-footer.demo.js'; declare global { interface HTMLElementTagNameMap { @@ -10,18 +12,80 @@ declare global { @customElement('upl-statuspage-footer') export class UplStatuspageFooter extends DeesElement { // STATIC - public static demo = () => html` - - `; + public static demo = demoFunc; // INSTANCE - @property() - public legalInfo: string = "https://lossless.gmbh"; + @property({ type: String }) + public companyName: string = ''; - @property({ - type: Boolean - }) - public whitelabel = false; + @property({ type: String }) + public legalUrl: string = ''; + + @property({ type: String }) + public supportEmail: string = ''; + + @property({ type: String }) + public statusPageUrl: string = ''; + + @property({ type: Boolean }) + public whitelabel: boolean = false; + + @property({ type: Number }) + public lastUpdated: number | null = null; + + @property({ type: Number }) + public currentYear: number = new Date().getFullYear(); + + @property({ type: Array }) + public socialLinks: Array<{ platform: string; url: string }> = []; + + @property({ type: Array }) + public additionalLinks: Array<{ label: string; url: string }> = []; + + @property({ type: String }) + public rssFeedUrl: string = ''; + + @property({ type: String }) + public apiStatusUrl: string = ''; + + @property({ type: Boolean }) + public loading: boolean = false; + + @property({ type: String }) + public errorMessage: string | null = null; + + @property({ type: Boolean }) + public offline: boolean = false; + + @property({ type: String }) + public latestStatusUpdate: string = ''; + + @property({ type: Boolean }) + public enableSubscribe: boolean = false; + + @property({ type: Boolean }) + public enableReportIssue: boolean = false; + + @property({ type: Boolean }) + public enableLanguageSelector: boolean = false; + + @property({ type: Boolean }) + public enableThemeToggle: boolean = false; + + @property({ type: Array }) + public languageOptions: Array<{ code: string; label: string }> = []; + + @property({ type: String }) + public currentLanguage: string = 'en'; + + @property({ type: String }) + public currentTheme: string = 'light'; + + @property({ type: Number }) + public subscriberCount: number = 0; + + @property({ type: Object }) + public customBranding: { primaryColor?: string; logoUrl?: string; footerText?: string } | null = null; constructor() { @@ -30,43 +94,545 @@ export class UplStatuspageFooter extends DeesElement { public static styles = [ domtools.elementBasic.staticStyles, + commonStyles, css` :host { - display: block; - background: ${cssManager.bdTheme('#ffffff', '#000000')}; - font-family: Inter; - color: ${cssManager.bdTheme('#333333', '#ffffff')}; - } + display: block; + background: ${colors.background.primary}; + font-family: ${unsafeCSS(fonts.base)}; + color: ${colors.text.primary}; + font-size: 14px; + border-top: 1px solid ${colors.border.default}; + } - .mainbox { - max-width: 900px; - margin: auto; - padding-top: 20px; - padding-bottom: 20px; + .container { + max-width: 1200px; + margin: 0 auto; + padding: ${unsafeCSS(spacing['2xl'])} ${unsafeCSS(spacing.lg)}; + } + + .footer-content { + display: flex; + flex-direction: column; + gap: ${unsafeCSS(spacing.xl)}; + } + + .footer-main { + display: grid; + grid-template-columns: 1fr auto; + gap: ${unsafeCSS(spacing['2xl'])}; + align-items: start; + } + + .company-info { + display: flex; + flex-direction: column; + gap: ${unsafeCSS(spacing.lg)}; + } + + .company-name { + font-size: 20px; + font-weight: 600; + color: ${colors.text.primary}; + } + + .company-links { + display: flex; + flex-wrap: wrap; + gap: ${unsafeCSS(spacing.lg)}; + } + + .footer-link { + color: ${colors.text.secondary}; + text-decoration: none; + transition: color 0.2s ease; + font-size: 14px; + } + + .footer-link:hover { + color: ${colors.text.primary}; + text-decoration: underline; + } + + .footer-actions { + display: flex; + flex-direction: column; + gap: ${unsafeCSS(spacing.md)}; + } + + .action-button { + padding: ${unsafeCSS(spacing.sm)} ${unsafeCSS(spacing.md)}; + border: 1px solid ${colors.border.default}; + background: transparent; + border-radius: ${unsafeCSS(borderRadius.base)}; + cursor: pointer; + text-align: center; + transition: all 0.2s ease; + white-space: nowrap; + font-size: 14px; + font-weight: 500; + color: ${colors.text.primary}; + font-family: ${unsafeCSS(fonts.base)}; + } + + .action-button:hover { + background: ${colors.background.secondary}; + border-color: ${colors.border.muted}; + transform: translateY(-1px); + } + + .action-button:active { + transform: translateY(0); + } + + .footer-bottom { + display: flex; + justify-content: space-between; + align-items: center; + padding-top: ${unsafeCSS(spacing.xl)}; + margin-top: ${unsafeCSS(spacing.xl)}; + border-top: 1px solid ${colors.border.default}; + } + + .footer-meta { + display: flex; + gap: ${unsafeCSS(spacing.lg)}; + align-items: center; + flex-wrap: wrap; + } + + .social-links { + display: flex; + gap: ${unsafeCSS(spacing.md)}; + align-items: center; + } + + .social-link { + display: inline-block; + width: 20px; + height: 20px; + opacity: 0.7; + transition: all 0.2s ease; + color: ${colors.text.secondary}; + } + + .social-link:hover { + opacity: 1; + color: ${colors.text.primary}; + transform: translateY(-1px); + } + + .social-link svg { + width: 100%; + height: 100%; + fill: currentColor; + } + + .copyright { + font-size: 14px; + color: ${colors.text.secondary}; + } + + .last-updated { + font-size: 13px; + color: ${colors.text.muted}; + } + + .powered-by { + font-size: 13px; + color: ${colors.text.muted}; + text-align: right; + } + + .powered-by a { + color: ${colors.text.secondary}; + text-decoration: none; + transition: color 0.2s ease; + } + + .powered-by a:hover { + color: ${colors.text.primary}; + text-decoration: underline; + } + + .status-update { + padding: ${unsafeCSS(spacing.md)} ${unsafeCSS(spacing.lg)}; + background: ${colors.background.muted}; + border-radius: ${unsafeCSS(borderRadius.base)}; + font-size: 14px; + margin-bottom: ${unsafeCSS(spacing.lg)}; + line-height: 1.6; + } + + .language-selector { + position: relative; + } + + .language-selector select { + padding: ${unsafeCSS(spacing.xs)} ${unsafeCSS(spacing.sm)}; + border: 1px solid ${colors.border.default}; + background: ${colors.background.primary}; + color: ${colors.text.primary}; + border-radius: ${unsafeCSS(borderRadius.base)}; + font-size: 14px; + cursor: pointer; + font-family: ${unsafeCSS(fonts.base)}; + } + + .theme-toggle { + cursor: pointer; + padding: ${unsafeCSS(spacing.xs)} ${unsafeCSS(spacing.sm)}; + border: 1px solid ${colors.border.default}; + background: transparent; + border-radius: ${unsafeCSS(borderRadius.base)}; + font-size: 14px; + transition: all 0.2s ease; + color: ${colors.text.primary}; + font-family: ${unsafeCSS(fonts.base)}; + } + + .theme-toggle:hover { + background: ${colors.background.secondary}; + border-color: ${colors.border.muted}; + } + + .subscriber-count { + font-size: 12px; + color: ${colors.text.muted}; + margin-top: ${unsafeCSS(spacing.xs)}; + } + + .error-message { + padding: ${unsafeCSS(spacing.md)}; + background: ${cssManager.bdTheme('#fee9e9', '#7f1d1d')}; + color: ${cssManager.bdTheme('#dc2626', '#fca5a5')}; + border-radius: ${unsafeCSS(borderRadius.base)}; + margin-bottom: ${unsafeCSS(spacing.lg)}; + font-size: 14px; + border: 1px solid ${cssManager.bdTheme('#fecaca', '#991b1b')}; + } + + .offline-indicator { + display: inline-flex; + align-items: center; + gap: ${unsafeCSS(spacing.xs)}; + padding: ${unsafeCSS(spacing.xs)} ${unsafeCSS(spacing.md)}; + background: ${colors.status.degraded}; + color: white; + border-radius: ${unsafeCSS(borderRadius.full)}; + font-size: 13px; + font-weight: 500; + } + + .loading-skeleton { + height: 200px; + background: ${cssManager.bdTheme( + 'linear-gradient(90deg, #f3f4f6 25%, #e5e7eb 50%, #f3f4f6 75%)', + 'linear-gradient(90deg, #1f1f1f 25%, #262626 50%, #1f1f1f 75%)' + )}; + background-size: 200% 100%; + animation: loading 1.5s infinite; + border-radius: ${unsafeCSS(borderRadius.md)}; + } + + @keyframes loading { + 0% { background-position: 200% 0; } + 100% { background-position: -200% 0; } + } + + .additional-links { + display: flex; + flex-wrap: wrap; + gap: ${unsafeCSS(spacing.md)}; + margin-top: ${unsafeCSS(spacing.md)}; + } + + .additional-link { + font-size: 14px; + color: ${colors.text.secondary}; + text-decoration: none; + transition: color 0.2s ease; + } + + .additional-link:hover { + color: ${colors.text.primary}; + text-decoration: underline; + } + + @media (max-width: 640px) { + .container { + padding: ${unsafeCSS(spacing.xl)} ${unsafeCSS(spacing.md)}; } + .footer-main { + grid-template-columns: 1fr; + gap: ${unsafeCSS(spacing.xl)}; + } + + .footer-bottom { + flex-direction: column; + gap: ${unsafeCSS(spacing.lg)}; + align-items: start; + } + + .footer-meta { + flex-direction: column; + align-items: start; + gap: ${unsafeCSS(spacing.md)}; + } + + .company-links { + flex-direction: column; + gap: ${unsafeCSS(spacing.sm)}; + } + + .powered-by { + text-align: left; + } + } ` ] public render(): TemplateResult { + if (this.loading) { + return html` +
+
+
+ `; + } + return html` - ${domtools.elementBasic.styles} - -
- Hi there +
+
`; } + private isValidUrl(url: string): boolean { + if (!url) return false; + try { + new URL(url); + return true; + } catch { + return url.startsWith('#') || url.startsWith('/'); + } + } + + private isValidEmail(email: string): boolean { + if (!email) return false; + return email.includes('@'); + } + + private formatLastUpdated(): string { + if (!this.lastUpdated) return 'Never'; + const date = new Date(this.lastUpdated); + const now = Date.now(); + const diff = now - this.lastUpdated; + + if (diff < 60000) { + return 'Just now'; + } else if (diff < 3600000) { + const minutes = Math.floor(diff / 60000); + return `${minutes} minute${minutes !== 1 ? 's' : ''} ago`; + } else if (diff < 86400000) { + const hours = Math.floor(diff / 3600000); + return `${hours} hour${hours !== 1 ? 's' : ''} ago`; + } else { + return date.toLocaleDateString(); + } + } + + private getSocialIcon(platform: string): TemplateResult { + const icons: Record = { + twitter: html``, + github: html``, + linkedin: html``, + facebook: html``, + youtube: html``, + instagram: html``, + slack: html``, + discord: html``, + generic: html`` + }; + return icons[platform.toLowerCase()] || icons.generic; + } + + private handleLinkClick(event: Event, type: string, url: string, label?: string) { + this.dispatchEvent(new CustomEvent('footerLinkClick', { + detail: { type, url, label }, + bubbles: true, + composed: true + })); + } + + private handleSubscribeClick() { + this.dispatchEvent(new CustomEvent('subscribeClick', { + bubbles: true, + composed: true + })); + } + + private handleReportIncidentClick() { + this.dispatchEvent(new CustomEvent('reportIncidentClick', { + bubbles: true, + composed: true + })); + } + + private handleLanguageChange(event: Event) { + const select = event.target as HTMLSelectElement; + const language = select.value; + this.currentLanguage = language; + this.dispatchEvent(new CustomEvent('languageChange', { + detail: { language }, + bubbles: true, + composed: true + })); + } + + private handleThemeToggle() { + const newTheme = this.currentTheme === 'dark' ? 'light' : 'dark'; + this.currentTheme = newTheme; + this.dispatchEvent(new CustomEvent('themeToggle', { + detail: { theme: newTheme }, + bubbles: true, + composed: true + })); + } + public dispatchReportNewIncident() { - this.dispatchEvent(new CustomEvent('reportNewIncident', { - - })) + this.handleReportIncidentClick(); } public dispatchStatusSubscribe() { - this.dispatchEvent(new CustomEvent('statusSubscribe', { - - })) + this.handleSubscribeClick(); } } \ No newline at end of file diff --git a/ts_web/elements/upl-statuspage-header.demo.ts b/ts_web/elements/upl-statuspage-header.demo.ts new file mode 100644 index 0000000..b8fffc8 --- /dev/null +++ b/ts_web/elements/upl-statuspage-header.demo.ts @@ -0,0 +1,241 @@ +import { html } from '@design.estate/dees-element'; + +export const demoFunc = () => html` + + +
+ +
+
Basic Header with Dynamic Title
+ { + const header = wrapperElement.querySelector('upl-statuspage-header') as any; + + // Demo different titles + const titles = [ + 'MyService Status Page', + 'Production Environment Status', + 'API Health Dashboard', + 'Global Infrastructure Status', + '🚀 Rocket Systems Monitor', + 'Multi-Region Service Status' + ]; + + let titleIndex = 0; + header.pageTitle = titles[titleIndex]; + + // Add event listeners + header.addEventListener('reportNewIncident', (event: CustomEvent) => { + console.log('Report incident clicked'); + alert('Report Incident form would open here'); + }); + + header.addEventListener('statusSubscribe', (event: CustomEvent) => { + console.log('Subscribe clicked'); + alert('Subscribe modal would open here'); + }); + + // Cycle through titles + setInterval(() => { + titleIndex = (titleIndex + 1) % titles.length; + header.pageTitle = titles[titleIndex]; + }, 2000); + }} + > + + +
+ + +
+
Header with Configurable Buttons
+ { + const header = wrapperElement.querySelector('upl-statuspage-header') as any; + header.pageTitle = 'Configurable Button States'; + + // Add properties to control button visibility + header.showReportButton = true; + header.showSubscribeButton = true; + + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = ` + + + + + `; + wrapperElement.appendChild(controls); + + controls.querySelector('#toggleReport')?.addEventListener('click', () => { + header.showReportButton = !header.showReportButton; + }); + + controls.querySelector('#toggleSubscribe')?.addEventListener('click', () => { + header.showSubscribeButton = !header.showSubscribeButton; + }); + + controls.querySelector('#toggleBoth')?.addEventListener('click', () => { + header.showReportButton = false; + header.showSubscribeButton = false; + }); + + controls.querySelector('#showBoth')?.addEventListener('click', () => { + header.showReportButton = true; + header.showSubscribeButton = true; + }); + }} + > + + +
+ + +
+
Header with Custom Branding
+ { + const header = wrapperElement.querySelector('upl-statuspage-header') as any; + header.pageTitle = 'Enterprise Cloud Platform'; + + // Custom branding properties + header.brandColor = '#1976D2'; + header.logoUrl = 'https://via.placeholder.com/120x40/1976D2/ffffff?text=LOGO'; + header.customStyles = true; + + // Simulate different brand states + const brands = [ + { title: 'Enterprise Cloud Platform', color: '#1976D2', logo: 'ENTERPRISE' }, + { title: 'StartUp SaaS Monitor', color: '#00BCD4', logo: 'STARTUP' }, + { title: 'Government Services Status', color: '#4CAF50', logo: 'GOV' }, + { title: 'Financial Systems Health', color: '#673AB7', logo: 'FINTECH' } + ]; + + let brandIndex = 0; + setInterval(() => { + brandIndex = (brandIndex + 1) % brands.length; + const brand = brands[brandIndex]; + header.pageTitle = brand.title; + header.brandColor = brand.color; + header.logoUrl = `https://via.placeholder.com/120x40/${brand.color.slice(1)}/ffffff?text=${brand.logo}`; + }, 3000); + }} + > + + +
+ + +
+
Header with Loading States
+ { + const header = wrapperElement.querySelector('upl-statuspage-header') as any; + header.pageTitle = 'Loading State Demo'; + header.loading = true; + + // Simulate loading completion + setTimeout(() => { + header.loading = false; + header.pageTitle = 'Status Page Loaded'; + }, 2000); + + // Add loading toggle + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = ` + + `; + wrapperElement.appendChild(controls); + + controls.querySelector('#toggleLoading')?.addEventListener('click', () => { + header.loading = !header.loading; + if (header.loading) { + header.pageTitle = 'Loading...'; + setTimeout(() => { + header.loading = false; + header.pageTitle = 'Status Page Ready'; + }, 2000); + } + }); + }} + > + + +
+ + +
+
Header with Event Tracking
+ { + const header = wrapperElement.querySelector('upl-statuspage-header') as any; + header.pageTitle = 'Event Tracking Demo'; + + let reportCount = 0; + let subscribeCount = 0; + + // Create counter display + const counterDisplay = document.createElement('div'); + counterDisplay.style.marginTop = '16px'; + counterDisplay.style.fontSize = '14px'; + counterDisplay.innerHTML = ` +
Report Clicks: 0
+
Subscribe Clicks: 0
+ `; + wrapperElement.appendChild(counterDisplay); + + header.addEventListener('reportNewIncident', () => { + reportCount++; + counterDisplay.querySelector('#reportCount').textContent = reportCount.toString(); + console.log(`Report incident clicked ${reportCount} times`); + }); + + header.addEventListener('statusSubscribe', () => { + subscribeCount++; + counterDisplay.querySelector('#subscribeCount').textContent = subscribeCount.toString(); + console.log(`Subscribe clicked ${subscribeCount} times`); + }); + }} + > + +
+
+
+`; \ No newline at end of file diff --git a/ts_web/elements/upl-statuspage-header.ts b/ts_web/elements/upl-statuspage-header.ts index b3015a0..266fbed 100644 --- a/ts_web/elements/upl-statuspage-header.ts +++ b/ts_web/elements/upl-statuspage-header.ts @@ -1,5 +1,7 @@ -import { DeesElement, property, html, customElement, type TemplateResult, css, cssManager } from '@design.estate/dees-element'; +import { DeesElement, property, html, customElement, type TemplateResult, css, cssManager, unsafeCSS } from '@design.estate/dees-element'; import * as domtools from '@design.estate/dees-domtools'; +import { fonts } from '../styles/shared.styles.js'; +import { demoFunc } from './upl-statuspage-header.demo.js'; declare global { interface HTMLElementTagNameMap { @@ -10,14 +12,30 @@ declare global { @customElement('upl-statuspage-header') export class UplStatuspageHeader extends DeesElement { // STATIC - public static demo = () => html` - - `; + public static demo = demoFunc; // INSTANCE - @property() + @property({ type: String }) public pageTitle: string = "Statuspage Title"; + @property({ type: Boolean }) + public showReportButton: boolean = true; + + @property({ type: Boolean }) + public showSubscribeButton: boolean = true; + + @property({ type: String }) + public brandColor: string = ''; + + @property({ type: String }) + public logoUrl: string = ''; + + @property({ type: Boolean }) + public customStyles: boolean = false; + + @property({ type: Boolean }) + public loading: boolean = false; + constructor() { super(); @@ -28,70 +46,162 @@ export class UplStatuspageHeader extends DeesElement { css` :host { display: block; - background: ${cssManager.bdTheme('#eeeeeb', '#222222')}; - font-family: Inter; - color: ${cssManager.bdTheme('#333333', '#ffffff')}; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + font-family: ${unsafeCSS(fonts.base)}; + color: ${cssManager.bdTheme('#0a0a0a', '#fafafa')}; + border-bottom: 1px solid ${cssManager.bdTheme('#e5e7eb', '#262626')}; } .mainbox { margin: auto; - max-width: 900px; + max-width: 1200px; + padding: 0 24px; } .mainbox .actions { display: flex; justify-content: flex-end; - padding: 20px 0px 40px 0px; + gap: 8px; + padding: 24px 0; } .mainbox .actions .actionButton { - background: ${cssManager.bdTheme('#00000000', '#ffffff00')}; - - font-size: 12px; - border: 1px solid ${cssManager.bdTheme('#333', '#CCC')}; - padding: 6px 10px 7px 10px; - margin-left: 10px; - border-radius: 3px; + background: transparent; + font-size: 14px; + font-weight: 500; + border: 1px solid ${cssManager.bdTheme('#e5e7eb', '#262626')}; + padding: 8px 16px; + border-radius: 6px; cursor: pointer; user-select: none; + transition: all 0.2s ease; + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 36px; + color: ${cssManager.bdTheme('#0a0a0a', '#fafafa')}; } .mainbox .actions .actionButton:hover { - background: ${cssManager.bdTheme('#333333', '#efefef')}; - border: 1px solid ${cssManager.bdTheme('#333333', '#efefef')}; - color: ${cssManager.bdTheme('#fff', '#333333')}; + background: ${cssManager.bdTheme('#f9fafb', '#262626')}; + border-color: ${cssManager.bdTheme('#d1d5db', '#404040')}; + transform: translateY(-1px); + } + + .mainbox .actions .actionButton:active { + transform: translateY(0); + } + + .header-content { + padding: 48px 0 64px 0; + text-align: center; } h1 { - margin: 0px; - text-align: center; - font-weight: 600; - font-size: 35px; + margin: 0; + font-size: 48px; + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.1; + color: ${cssManager.bdTheme('#0a0a0a', '#fafafa')}; } - h2 { - margin: 0px; - margin-top: 10px; - text-align: center; - font-weight: 600; - font-size: 18px; + .subtitle { + margin: 16px 0 0 0; + font-size: 16px; + font-weight: 400; + color: ${cssManager.bdTheme('#6b7280', '#a1a1aa')}; + letter-spacing: 0.02em; + text-transform: uppercase; + } + + .logo { + display: block; + margin: 0 auto 32px; + max-width: 180px; + height: auto; + filter: ${cssManager.bdTheme('none', 'brightness(0) invert(1)')}; + } + + .loading-skeleton { + height: 200px; + background: ${cssManager.bdTheme( + 'linear-gradient(90deg, #f3f4f6 25%, #e5e7eb 50%, #f3f4f6 75%)', + 'linear-gradient(90deg, #1f1f1f 25%, #262626 50%, #1f1f1f 75%)' + )}; + background-size: 200% 100%; + animation: loading 1.5s infinite; + border-radius: 6px; + margin: 24px 0; + } + + @keyframes loading { + 0% { background-position: 200% 0; } + 100% { background-position: -200% 0; } + } + + /* Primary button variant */ + .actionButton.primary { + background: ${cssManager.bdTheme('#0a0a0a', '#fafafa')}; + color: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border-color: ${cssManager.bdTheme('#0a0a0a', '#fafafa')}; + } + + .actionButton.primary:hover { + background: ${cssManager.bdTheme('#262626', '#f4f4f5')}; + border-color: ${cssManager.bdTheme('#262626', '#f4f4f5')}; } ` ] public render(): TemplateResult { + if (this.loading) { + return html` +
+
+
+ `; + } + return html` ${domtools.elementBasic.styles}
-
report new incident
-
subscribe
+ ${this.showReportButton ? html` +
Report Issue
+ ` : ''} + ${this.showSubscribeButton ? html` +
Subscribe
+ ` : ''} +
+
+ ${this.logoUrl ? html` + + ` : ''} +

${this.pageTitle}

+
System Status
-

${this.pageTitle}

-

STATUS BOARD

`; } diff --git a/ts_web/elements/upl-statuspage-incidents.demo.ts b/ts_web/elements/upl-statuspage-incidents.demo.ts new file mode 100644 index 0000000..b7c4e80 --- /dev/null +++ b/ts_web/elements/upl-statuspage-incidents.demo.ts @@ -0,0 +1,1031 @@ +import { html } from '@design.estate/dees-element'; +import type { IIncidentDetails, IIncidentUpdate } from '../interfaces/index.js'; + +export const demoFunc = () => html` + + +
+ +
+
Different Incident Types and Severities
+ { + const incidents = wrapperElement.querySelector('upl-statuspage-incidents') as any; + + // Generate different types of incidents + const incidentScenarios = { + critical: { + name: 'Critical Outage', + incidents: [ + { + id: 'crit-001', + title: 'Complete Platform Outage', + status: 'investigating' as const, + severity: 'critical' as const, + affectedServices: ['api-gateway', 'web-server', 'database', 'cdn'], + startTime: Date.now() - 15 * 60 * 1000, + impact: 'All services are currently unavailable. We are working on immediate resolution.', + updates: [ + { + id: 'upd-c1', + timestamp: Date.now() - 15 * 60 * 1000, + status: 'investigating' as const, + message: 'Multiple alerts triggered. All hands on deck.', + author: 'Incident Commander' + }, + { + id: 'upd-c2', + timestamp: Date.now() - 10 * 60 * 1000, + status: 'investigating' as const, + message: 'Root cause appears to be datacenter power failure.', + author: 'Infrastructure Team' + } + ] + } + ] + }, + major: { + name: 'Major Issues', + incidents: [ + { + id: 'maj-001', + title: 'Database Performance Degradation', + status: 'identified' as const, + severity: 'major' as const, + affectedServices: ['database', 'api-gateway'], + startTime: Date.now() - 45 * 60 * 1000, + impact: 'Significant slowdown in database queries affecting 60% of API requests.', + updates: [ + { + id: 'upd-m1', + timestamp: Date.now() - 45 * 60 * 1000, + status: 'investigating' as const, + message: 'Investigating database performance issues.', + author: 'Database Team' + }, + { + id: 'upd-m2', + timestamp: Date.now() - 30 * 60 * 1000, + status: 'identified' as const, + message: 'Identified runaway queries causing resource exhaustion.', + author: 'Database Team' + } + ] + }, + { + id: 'maj-002', + title: 'CDN Routing Issues', + status: 'monitoring' as const, + severity: 'major' as const, + affectedServices: ['cdn'], + startTime: Date.now() - 2 * 60 * 60 * 1000, + impact: 'Assets loading slowly for users in EU region.', + updates: [ + { + id: 'upd-m3', + timestamp: Date.now() - 2 * 60 * 60 * 1000, + status: 'investigating' as const, + message: 'Reports of slow asset loading from EU users.', + author: 'CDN Team' + }, + { + id: 'upd-m4', + timestamp: Date.now() - 90 * 60 * 1000, + status: 'identified' as const, + message: 'CDN provider experiencing issues with EU PoPs.', + author: 'CDN Team' + }, + { + id: 'upd-m5', + timestamp: Date.now() - 30 * 60 * 1000, + status: 'monitoring' as const, + message: 'Rerouted traffic to alternate PoPs. Monitoring performance.', + author: 'CDN Team' + } + ] + } + ] + }, + minor: { + name: 'Minor Incidents', + incidents: [ + { + id: 'min-001', + title: 'Delayed Webhook Deliveries', + status: 'monitoring' as const, + severity: 'minor' as const, + affectedServices: ['webhook-service'], + startTime: Date.now() - 3 * 60 * 60 * 1000, + impact: 'Webhooks experiencing 2-5 minute delays.', + updates: [ + { + id: 'upd-n1', + timestamp: Date.now() - 3 * 60 * 60 * 1000, + status: 'investigating' as const, + message: 'Investigating webhook delivery delays.', + author: 'API Team' + }, + { + id: 'upd-n2', + timestamp: Date.now() - 2 * 60 * 60 * 1000, + status: 'monitoring' as const, + message: 'Queue processing optimized. Delays reducing.', + author: 'API Team' + } + ] + }, + { + id: 'min-002', + title: 'Search Indexing Lag', + status: 'identified' as const, + severity: 'minor' as const, + affectedServices: ['search-service'], + startTime: Date.now() - 4 * 60 * 60 * 1000, + impact: 'New content taking up to 30 minutes to appear in search results.', + updates: [ + { + id: 'upd-n3', + timestamp: Date.now() - 4 * 60 * 60 * 1000, + status: 'identified' as const, + message: 'Search indexing pipeline experiencing backlog.', + author: 'Search Team' + } + ] + } + ] + }, + maintenance: { + name: 'Maintenance', + incidents: [ + { + id: 'maint-001', + title: 'Scheduled Database Maintenance', + status: 'identified' as const, + severity: 'maintenance' as const, + affectedServices: ['database'], + startTime: Date.now() + 24 * 60 * 60 * 1000, + endTime: Date.now() + 26 * 60 * 60 * 1000, + impact: 'Database will be in read-only mode during maintenance window.', + updates: [ + { + id: 'upd-mt1', + timestamp: Date.now(), + status: 'identified' as const, + message: 'Scheduled maintenance for database version upgrade.', + author: 'Database Team' + } + ] + }, + { + id: 'maint-002', + title: 'Network Equipment Upgrade', + status: 'identified' as const, + severity: 'maintenance' as const, + affectedServices: ['cdn', 'api-gateway'], + startTime: Date.now() + 48 * 60 * 60 * 1000, + endTime: Date.now() + 49 * 60 * 60 * 1000, + impact: 'Brief connectivity interruptions expected during upgrade window.', + updates: [ + { + id: 'upd-mt2', + timestamp: Date.now() - 2 * 60 * 60 * 1000, + status: 'identified' as const, + message: 'Core network switches scheduled for firmware upgrade.', + author: 'Network Team' + } + ] + } + ] + } + }; + + // Initial setup + let currentScenario = 'major'; + incidents.currentIncidents = incidentScenarios[currentScenario].incidents; + incidents.pastIncidents = []; + + // Create controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + + Object.entries(incidentScenarios).forEach(([key, scenario]) => { + const button = document.createElement('button'); + button.className = 'demo-button' + (key === currentScenario ? ' active' : ''); + button.textContent = scenario.name; + button.onclick = () => { + controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active')); + button.classList.add('active'); + + currentScenario = key; + incidents.loading = true; + setTimeout(() => { + incidents.currentIncidents = scenario.incidents; + incidents.loading = false; + updateStats(); + }, 500); + }; + controls.appendChild(button); + }); + + wrapperElement.appendChild(controls); + + // Add statistics + const statsDiv = document.createElement('div'); + statsDiv.className = 'incident-stats'; + wrapperElement.appendChild(statsDiv); + + const updateStats = () => { + const current = incidents.currentIncidents || []; + const critical = current.filter(i => i.severity === 'critical').length; + const major = current.filter(i => i.severity === 'major').length; + const minor = current.filter(i => i.severity === 'minor').length; + const maintenance = current.filter(i => i.severity === 'maintenance').length; + + statsDiv.innerHTML = ` +
+
${critical}
+
Critical
+
+
+
${major}
+
Major
+
+
+
${minor}
+
Minor
+
+
+
${maintenance}
+
Maintenance
+
+ `; + }; + + updateStats(); + + // Handle incident clicks + incidents.addEventListener('incidentClick', (event: CustomEvent) => { + alert(`Incident Details:\n\nTitle: ${event.detail.incident.title}\nSeverity: ${event.detail.incident.severity}\nStatus: ${event.detail.incident.status}\nImpact: ${event.detail.incident.impact}`); + }); + }} + > + +
+
+ + +
+
Real-time Incident Progression
+ { + const incidents = wrapperElement.querySelector('upl-statuspage-incidents') as any; + + // Create a progressing incident + const progressingIncident: IIncidentDetails = { + id: 'prog-001', + title: 'Live Incident: Payment Processing Delays', + status: 'investigating', + severity: 'major', + affectedServices: ['payment-gateway', 'api-gateway'], + startTime: Date.now(), + impact: 'Payment processing experiencing intermittent failures.', + updates: [ + { + id: 'upd-p1', + timestamp: Date.now(), + status: 'investigating', + message: 'We are investigating reports of payment processing failures.', + author: 'Payment Team' + } + ] + }; + + incidents.currentIncidents = [progressingIncident]; + incidents.pastIncidents = []; + + // Progression timeline + const progressionSteps = [ + { + delay: 10000, + update: { + status: 'investigating' as const, + message: 'Initial investigation shows 30% of payment attempts failing.', + author: 'Payment Team' + } + }, + { + delay: 20000, + update: { + status: 'identified' as const, + message: 'Root cause identified: Third-party payment processor API rate limiting.', + author: 'Engineering Team' + }, + incidentUpdate: { status: 'identified' as const } + }, + { + delay: 30000, + update: { + status: 'monitoring' as const, + message: 'Implemented retry logic and request throttling. Success rate improving.', + author: 'Engineering Team' + }, + incidentUpdate: { status: 'monitoring' as const } + }, + { + delay: 40000, + update: { + status: 'monitoring' as const, + message: 'Payment success rate now at 95%. Continuing to monitor.', + author: 'Payment Team' + } + }, + { + delay: 50000, + update: { + status: 'resolved' as const, + message: 'All systems back to normal. Payment processing fully restored.', + author: 'Payment Team' + }, + incidentUpdate: { + status: 'resolved' as const, + endTime: Date.now() + 50000, + resolution: 'Implemented rate limiting and retry logic to prevent future occurrences.' + } + } + ]; + + // Progress through steps + progressionSteps.forEach((step, index) => { + setTimeout(() => { + const newUpdate: IIncidentUpdate = { + id: `upd-p${index + 2}`, + timestamp: Date.now(), + ...step.update + }; + + progressingIncident.updates.push(newUpdate); + + if (step.incidentUpdate) { + Object.assign(progressingIncident, step.incidentUpdate); + } + + if (progressingIncident.status === 'resolved') { + // Move to past incidents + incidents.pastIncidents = [progressingIncident, ...incidents.pastIncidents]; + incidents.currentIncidents = []; + } + + incidents.requestUpdate(); + logUpdate(`[${step.update.status.toUpperCase()}] ${step.update.message}`); + }, step.delay); + }); + + // Create controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = ` + + + + `; + wrapperElement.appendChild(controls); + + controls.querySelector('#addUpdate')?.addEventListener('click', () => { + if (progressingIncident.status !== 'resolved') { + const message = prompt('Enter update message:'); + if (message) { + progressingIncident.updates.push({ + id: `upd-custom-${Date.now()}`, + timestamp: Date.now(), + status: progressingIncident.status, + message, + author: 'Manual Update' + }); + incidents.requestUpdate(); + logUpdate(`[MANUAL] ${message}`); + } + } + }); + + controls.querySelector('#escalate')?.addEventListener('click', () => { + if (progressingIncident.status !== 'resolved') { + progressingIncident.severity = 'critical'; + progressingIncident.updates.push({ + id: `upd-esc-${Date.now()}`, + timestamp: Date.now(), + status: progressingIncident.status, + message: 'Incident escalated to CRITICAL severity.', + author: 'Incident Commander' + }); + incidents.requestUpdate(); + logUpdate('[ESCALATED] Incident severity raised to CRITICAL'); + } + }); + + controls.querySelector('#resolve')?.addEventListener('click', () => { + if (progressingIncident.status !== 'resolved') { + progressingIncident.status = 'resolved'; + progressingIncident.endTime = Date.now(); + progressingIncident.resolution = 'Manually resolved.'; + progressingIncident.updates.push({ + id: `upd-res-${Date.now()}`, + timestamp: Date.now(), + status: 'resolved', + message: 'Incident manually resolved.', + author: 'Manual Resolution' + }); + incidents.pastIncidents = [progressingIncident, ...incidents.pastIncidents]; + incidents.currentIncidents = []; + incidents.requestUpdate(); + logUpdate('[RESOLVED] Incident manually resolved'); + } + }); + + // Add update log + const logDiv = document.createElement('div'); + logDiv.className = 'incident-log'; + logDiv.innerHTML = 'Incident Timeline:
'; + wrapperElement.appendChild(logDiv); + + const logUpdate = (message: string) => { + const time = new Date().toLocaleTimeString(); + logDiv.innerHTML += `[${time}] ${message}
`; + logDiv.scrollTop = logDiv.scrollHeight; + }; + + logUpdate('[CREATED] New incident: Payment Processing Delays'); + }} + > + +
+
+ + +
+
Historical Incident Patterns
+ { + const incidents = wrapperElement.querySelector('upl-statuspage-incidents') as any; + + // Generate historical patterns + const generateHistoricalIncidents = (pattern: 'frequent' | 'seasonal' | 'improving' | 'stable'): IIncidentDetails[] => { + const incidents: IIncidentDetails[] = []; + const now = Date.now(); + + switch (pattern) { + case 'frequent': + // Many incidents in recent history + for (let i = 0; i < 20; i++) { + const daysAgo = Math.floor(Math.random() * 30); + const duration = Math.floor(Math.random() * 4 + 1) * 60 * 60 * 1000; + const startTime = now - daysAgo * 24 * 60 * 60 * 1000; + + incidents.push({ + id: `freq-${i}`, + title: `Service Disruption #${20 - i}`, + status: 'resolved', + severity: Math.random() < 0.3 ? 'major' : 'minor', + affectedServices: ['api-gateway', 'database'].slice(0, Math.floor(Math.random() * 2) + 1), + startTime, + endTime: startTime + duration, + impact: 'Service degradation affecting subset of users.', + rootCause: 'Various infrastructure issues.', + resolution: 'Applied temporary fixes.', + updates: [ + { + id: `upd-${i}-1`, + timestamp: startTime, + status: 'investigating', + message: 'Investigating service issues.', + author: 'Ops Team' + }, + { + id: `upd-${i}-2`, + timestamp: startTime + duration, + status: 'resolved', + message: 'Issue resolved.', + author: 'Ops Team' + } + ] + }); + } + break; + + case 'seasonal': + // Incidents clustered around specific times + const peakDays = [7, 14, 21, 28]; // Weekly pattern + peakDays.forEach((day, index) => { + for (let j = 0; j < 3; j++) { + const startTime = now - day * 24 * 60 * 60 * 1000 + (j - 1) * 60 * 60 * 1000; + incidents.push({ + id: `seas-${index}-${j}`, + title: `Peak Traffic Overload`, + status: 'resolved', + severity: 'minor', + affectedServices: ['api-gateway'], + startTime, + endTime: startTime + 30 * 60 * 1000, + impact: 'Slow response times during peak hours.', + rootCause: 'Insufficient capacity for peak traffic.', + resolution: 'Auto-scaling adjusted.', + updates: [ + { + id: `upd-s-${index}-${j}`, + timestamp: startTime, + status: 'resolved', + message: 'Peak traffic handled by auto-scaling.', + author: 'Auto-remediation' + } + ] + }); + } + }); + break; + + case 'improving': + // Fewer incidents over time + for (let i = 0; i < 15; i++) { + const daysAgo = 30 - i * 2; + if (Math.random() < (15 - i) / 15) { + const startTime = now - daysAgo * 24 * 60 * 60 * 1000; + incidents.push({ + id: `imp-${i}`, + title: `System Issue #${i + 1}`, + status: 'resolved', + severity: i < 5 ? 'major' : 'minor', + affectedServices: ['database'], + startTime, + endTime: startTime + 2 * 60 * 60 * 1000, + impact: 'Database performance issues.', + rootCause: 'Legacy infrastructure limitations.', + resolution: 'Infrastructure improvements implemented.', + updates: [ + { + id: `upd-imp-${i}`, + timestamp: startTime, + status: 'resolved', + message: 'Resolved with infrastructure improvements.', + author: 'Infrastructure Team' + } + ] + }); + } + } + break; + + case 'stable': + // Very few incidents, all minor + for (let i = 0; i < 3; i++) { + const daysAgo = Math.floor(Math.random() * 30); + const startTime = now - daysAgo * 24 * 60 * 60 * 1000; + incidents.push({ + id: `stab-${i}`, + title: ['Routine Maintenance', 'Minor Configuration Update', 'Planned Restart'][i], + status: 'resolved', + severity: 'maintenance', + affectedServices: ['web-server'], + startTime, + endTime: startTime + 15 * 60 * 1000, + impact: 'No user impact.', + resolution: 'Completed as planned.', + updates: [ + { + id: `upd-stab-${i}`, + timestamp: startTime, + status: 'resolved', + message: 'Maintenance completed successfully.', + author: 'Maintenance Team' + } + ] + }); + } + break; + } + + return incidents.sort((a, b) => b.startTime - a.startTime); + }; + + // Initial setup + let currentPattern: 'frequent' | 'seasonal' | 'improving' | 'stable' = 'frequent'; + incidents.currentIncidents = []; + incidents.pastIncidents = generateHistoricalIncidents(currentPattern); + + // Create pattern controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + + const patterns = [ + { key: 'frequent', label: 'Frequent Incidents' }, + { key: 'seasonal', label: 'Seasonal Pattern' }, + { key: 'improving', label: 'Improving Trend' }, + { key: 'stable', label: 'Stable System' } + ]; + + patterns.forEach((pattern) => { + const button = document.createElement('button'); + button.className = 'demo-button' + (pattern.key === currentPattern ? ' active' : ''); + button.textContent = pattern.label; + button.onclick = () => { + controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active')); + button.classList.add('active'); + + currentPattern = pattern.key as any; + incidents.loading = true; + setTimeout(() => { + incidents.pastIncidents = generateHistoricalIncidents(currentPattern as any); + incidents.loading = false; + }, 500); + }; + controls.appendChild(button); + }); + + wrapperElement.appendChild(controls); + + // Add info about the pattern + const info = document.createElement('div'); + info.className = 'demo-info'; + info.innerHTML = ` + Pattern Description:
+ Frequent: Many incidents indicating stability issues
+ Seasonal: Incidents following a predictable pattern
+ Improving: Decreasing incident frequency over time
+ Stable: Minimal incidents, mostly maintenance + `; + wrapperElement.appendChild(info); + }} + > + +
+
+ + +
+
Edge Cases and Special Scenarios
+ { + const incidents = wrapperElement.querySelector('upl-statuspage-incidents') as any; + + const edgeCases = { + none: { + name: 'No Incidents', + current: [], + past: [] + }, + manyActive: { + name: 'Many Active', + current: Array.from({ length: 8 }, (_, i) => ({ + id: `many-${i}`, + title: `Concurrent Issue #${i + 1}`, + status: ['investigating', 'identified', 'monitoring'][i % 3] as any, + severity: ['critical', 'major', 'minor'][i % 3] as any, + affectedServices: [`service-${i}`], + startTime: Date.now() - (i + 1) * 30 * 60 * 1000, + impact: `Impact on service ${i + 1}`, + updates: [{ + id: `upd-many-${i}`, + timestamp: Date.now() - (i + 1) * 30 * 60 * 1000, + status: 'investigating' as const, + message: 'Investigating issue.', + author: 'Team' + }] + })), + past: [] + }, + longRunning: { + name: 'Long Running', + current: [{ + id: 'long-001', + title: 'Persistent Infrastructure Issue', + status: 'monitoring' as const, + severity: 'major' as const, + affectedServices: ['database', 'api-gateway'], + startTime: Date.now() - 7 * 24 * 60 * 60 * 1000, // 7 days ago + impact: 'Intermittent issues affecting 5-10% of requests.', + updates: Array.from({ length: 50 }, (_, i) => ({ + id: `upd-long-${i}`, + timestamp: Date.now() - 7 * 24 * 60 * 60 * 1000 + i * 3 * 60 * 60 * 1000, + status: 'monitoring' as const, + message: `Update #${i + 1}: Continuing to monitor. Partial mitigation in place.`, + author: 'Ops Team' + })) + }], + past: [] + }, + complexUpdates: { + name: 'Complex Updates', + current: [{ + id: 'complex-001', + title: 'Multi-phase Incident Resolution', + status: 'monitoring' as const, + severity: 'critical' as const, + affectedServices: ['api-gateway', 'database', 'cdn', 'email-service'], + startTime: Date.now() - 4 * 60 * 60 * 1000, + impact: 'Multiple services experiencing cascading failures.', + updates: [ + { + id: 'upd-c1', + timestamp: Date.now() - 4 * 60 * 60 * 1000, + status: 'investigating' as const, + message: '🚨 CRITICAL: Multiple service alerts triggered simultaneously.', + author: 'Monitoring System' + }, + { + id: 'upd-c2', + timestamp: Date.now() - 3.5 * 60 * 60 * 1000, + status: 'investigating' as const, + message: 'All hands on deck. Incident commander taking charge.\n\n- API Gateway: DOWN\n- Database: DEGRADED\n- CDN: PARTIAL OUTAGE\n- Email: DELAYED', + author: 'Incident Commander' + }, + { + id: 'upd-c3', + timestamp: Date.now() - 3 * 60 * 60 * 1000, + status: 'identified' as const, + message: 'Root cause identified: Cascading failure triggered by database connection pool exhaustion.\n\nAction items:\n1. Restart connection pools\n2. Implement circuit breakers\n3. Scale up database replicas', + author: 'Engineering Lead' + }, + { + id: 'upd-c4', + timestamp: Date.now() - 2 * 60 * 60 * 1000, + status: 'monitoring' as const, + message: 'Partial recovery achieved:\n✅ API Gateway: RESTORED\n⚠️ Database: RECOVERING\n✅ CDN: OPERATIONAL\n⚠️ Email: CATCHING UP\n\nContinuing remediation efforts.', + author: 'Ops Team' + } + ] + }], + past: [] + } + }; + + // Initial setup + let currentCase = 'none'; + incidents.currentIncidents = edgeCases[currentCase].current; + incidents.pastIncidents = edgeCases[currentCase].past; + + // Create controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + + Object.entries(edgeCases).forEach(([key, scenario]) => { + const button = document.createElement('button'); + button.className = 'demo-button' + (key === currentCase ? ' active' : ''); + button.textContent = scenario.name; + button.onclick = () => { + controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active')); + button.classList.add('active'); + + currentCase = key; + incidents.loading = true; + setTimeout(() => { + incidents.currentIncidents = scenario.current; + incidents.pastIncidents = scenario.past; + incidents.loading = false; + }, 300); + }; + controls.appendChild(button); + }); + + wrapperElement.appendChild(controls); + }} + > + + +
+ + +
+
Loading States and Filtering
+ { + const incidents = wrapperElement.querySelector('upl-statuspage-incidents') as any; + + // Start with loading + incidents.loading = true; + + // Generate mixed incidents for filtering + const allIncidents: IIncidentDetails[] = [ + { + id: 'filter-1', + title: 'Critical Database Failure', + status: 'resolved', + severity: 'critical', + affectedServices: ['database'], + startTime: Date.now() - 2 * 24 * 60 * 60 * 1000, + endTime: Date.now() - 2 * 24 * 60 * 60 * 1000 + 4 * 60 * 60 * 1000, + impact: 'Complete database unavailability.', + resolution: 'Failed over to secondary cluster.', + updates: [{ + id: 'u1', + timestamp: Date.now() - 2 * 24 * 60 * 60 * 1000, + status: 'resolved', + message: 'Database restored.', + author: 'DBA Team' + }] + }, + { + id: 'filter-2', + title: 'API Rate Limiting Issues', + status: 'resolved', + severity: 'major', + affectedServices: ['api-gateway'], + startTime: Date.now() - 5 * 24 * 60 * 60 * 1000, + endTime: Date.now() - 5 * 24 * 60 * 60 * 1000 + 2 * 60 * 60 * 1000, + impact: 'API requests throttled for some users.', + resolution: 'Rate limits adjusted.', + updates: [{ + id: 'u2', + timestamp: Date.now() - 5 * 24 * 60 * 60 * 1000, + status: 'resolved', + message: 'Rate limiting resolved.', + author: 'API Team' + }] + }, + { + id: 'filter-3', + title: 'Email Delays', + status: 'resolved', + severity: 'minor', + affectedServices: ['email-service'], + startTime: Date.now() - 10 * 24 * 60 * 60 * 1000, + endTime: Date.now() - 10 * 24 * 60 * 60 * 1000 + 30 * 60 * 1000, + impact: 'Emails delayed by 5-10 minutes.', + resolution: 'Queue cleared.', + updates: [{ + id: 'u3', + timestamp: Date.now() - 10 * 24 * 60 * 60 * 1000, + status: 'resolved', + message: 'Email queue cleared.', + author: 'Email Team' + }] + }, + { + id: 'filter-4', + title: 'Scheduled Maintenance', + status: 'resolved', + severity: 'maintenance', + affectedServices: ['web-server'], + startTime: Date.now() - 15 * 24 * 60 * 60 * 1000, + endTime: Date.now() - 15 * 24 * 60 * 60 * 1000 + 60 * 60 * 1000, + impact: 'Brief downtime during upgrade.', + resolution: 'Upgrade completed.', + updates: [{ + id: 'u4', + timestamp: Date.now() - 15 * 24 * 60 * 60 * 1000, + status: 'resolved', + message: 'Maintenance completed.', + author: 'Ops Team' + }] + } + ]; + + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = ` + + + + + + `; + wrapperElement.appendChild(controls); + + controls.querySelector('#toggleLoading')?.addEventListener('click', () => { + incidents.loading = !incidents.loading; + }); + + controls.querySelector('#loadSuccess')?.addEventListener('click', () => { + incidents.loading = true; + setTimeout(() => { + incidents.currentIncidents = [ + { + id: 'current-1', + title: 'Ongoing Investigation', + status: 'investigating', + severity: 'minor', + affectedServices: ['api-gateway'], + startTime: Date.now() - 30 * 60 * 1000, + impact: 'Elevated error rates on API endpoints.', + updates: [{ + id: 'u-current', + timestamp: Date.now() - 30 * 60 * 1000, + status: 'investigating', + message: 'Investigating elevated error rates.', + author: 'API Team' + }] + } + ]; + incidents.pastIncidents = allIncidents; + incidents.loading = false; + }, 1000); + }); + + controls.querySelector('#loadError')?.addEventListener('click', () => { + incidents.loading = true; + setTimeout(() => { + incidents.loading = false; + incidents.currentIncidents = []; + incidents.pastIncidents = []; + incidents.errorMessage = 'Failed to load incident data'; + }, 1500); + }); + + controls.querySelector('#filterCritical')?.addEventListener('click', () => { + incidents.pastIncidents = allIncidents.filter(i => i.severity === 'critical'); + }); + + controls.querySelector('#showAll')?.addEventListener('click', () => { + incidents.pastIncidents = allIncidents; + }); + + // Initial load after delay + setTimeout(() => { + incidents.currentIncidents = []; + incidents.pastIncidents = allIncidents; + incidents.loading = false; + }, 2000); + }} + > + + +
+
+`; \ No newline at end of file diff --git a/ts_web/elements/upl-statuspage-incidents.ts b/ts_web/elements/upl-statuspage-incidents.ts index 1dcb199..359f847 100644 --- a/ts_web/elements/upl-statuspage-incidents.ts +++ b/ts_web/elements/upl-statuspage-incidents.ts @@ -7,7 +7,12 @@ import { type TemplateResult, css, cssManager, + unsafeCSS, } from '@design.estate/dees-element'; +import type { IIncidentDetails } from '../interfaces/index.js'; +import { fonts, colors, shadows, borderRadius, spacing, commonStyles } from '../styles/shared.styles.js'; +import './internal/uplinternal-miniheading.js'; +import { demoFunc } from './upl-statuspage-incidents.demo.js'; declare global { interface HTMLElementTagNameMap { @@ -18,73 +23,490 @@ declare global { @customElement('upl-statuspage-incidents') export class UplStatuspageIncidents extends DeesElement { // STATIC - public static demo = () => html` `; + public static demo = demoFunc; // INSTANCE @property({ type: Array, }) - public currentIncidences: plugins.uplInterfaces.data.IIncident[] = []; + public currentIncidents: IIncidentDetails[] = []; @property({ type: Array, }) - public pastIncidences: plugins.uplInterfaces.data.IIncident[] = []; + public pastIncidents: IIncidentDetails[] = []; @property({ type: Boolean, }) public whitelabel = false; + @property({ + type: Boolean, + }) + public loading = false; + + @property({ + type: Number, + }) + public daysToShow = 90; + constructor() { super(); } public static styles = [ plugins.domtools.elementBasic.staticStyles, + commonStyles, css` :host { display: block; - background: ${cssManager.bdTheme('#eeeeeb', '#222222')}; - font-family: Inter; - color: ${cssManager.bdTheme('#333333', '#ffffff')}; + background: transparent; + font-family: ${unsafeCSS(fonts.base)}; + color: ${colors.text.primary}; } - .mainbox { - max-width: 900px; - margin: auto; + .container { + max-width: 1200px; + margin: 0 auto; + padding: 0 ${unsafeCSS(spacing.lg)} ${unsafeCSS(spacing.lg)} ${unsafeCSS(spacing.lg)}; } .noIncidentBox { - background: ${cssManager.bdTheme('#ffffff', '#333333')};; - padding: 10px; - margin-bottom: 15px; - border-radius: 3px; + background: ${colors.background.card}; + padding: ${unsafeCSS(spacing.xl)}; + margin-bottom: ${unsafeCSS(spacing.lg)}; + border-radius: ${unsafeCSS(borderRadius.md)}; + border: 1px solid ${colors.border.default}; + text-align: center; + color: ${colors.text.secondary}; + box-shadow: ${unsafeCSS(shadows.sm)}; + } + + .incident-card { + background: ${colors.background.card}; + border-radius: ${unsafeCSS(borderRadius.md)}; + margin-bottom: ${unsafeCSS(spacing.lg)}; + overflow: hidden; + box-shadow: ${unsafeCSS(shadows.sm)}; + border: 1px solid ${colors.border.default}; + transition: all 0.2s ease; + cursor: pointer; + } + + .incident-card:hover { + box-shadow: ${unsafeCSS(shadows.md)}; + transform: translateY(-2px); + } + + .incident-header { + padding: ${unsafeCSS(spacing.lg)} ${unsafeCSS(spacing.lg)}; + border-left: 4px solid; + display: flex; + align-items: start; + justify-content: space-between; + gap: ${unsafeCSS(spacing.md)}; + } + + .incident-header.critical { + border-left-color: ${colors.status.major}; + } + + .incident-header.major { + border-left-color: ${colors.status.partial}; + } + + .incident-header.minor { + border-left-color: ${colors.status.degraded}; + } + + .incident-header.maintenance { + border-left-color: ${colors.status.maintenance}; + } + + .incident-title { + font-size: 18px; + font-weight: 600; + margin: 0; + line-height: 1.3; + } + + .incident-meta { + display: flex; + gap: ${unsafeCSS(spacing.lg)}; + margin-top: ${unsafeCSS(spacing.sm)}; + font-size: 13px; + color: ${colors.text.secondary}; + flex-wrap: wrap; + } + + .incident-status { + display: inline-flex; + align-items: center; + gap: ${unsafeCSS(spacing.xs)}; + padding: ${unsafeCSS(spacing.xs)} ${unsafeCSS(spacing.md)}; + border-radius: ${unsafeCSS(borderRadius.full)}; + font-size: 12px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.02em; + flex-shrink: 0; + } + + .incident-status.investigating { + background: ${cssManager.bdTheme('#fef3c7', '#78350f')}; + color: ${cssManager.bdTheme('#92400e', '#fbbf24')}; + } + + .incident-status.identified { + background: ${cssManager.bdTheme('#e9d5ff', '#581c87')}; + color: ${cssManager.bdTheme('#6b21a8', '#d8b4fe')}; + } + + .incident-status.monitoring { + background: ${cssManager.bdTheme('#dbeafe', '#1e3a8a')}; + color: ${cssManager.bdTheme('#1e40af', '#93c5fd')}; + } + + .incident-status.resolved { + background: ${cssManager.bdTheme('#d1fae5', '#064e3b')}; + color: ${cssManager.bdTheme('#047857', '#6ee7b7')}; + } + + .incident-status.postmortem { + background: ${cssManager.bdTheme('#e5e7eb', '#374151')}; + color: ${cssManager.bdTheme('#4b5563', '#d1d5db')}; + } + + .incident-body { + padding: 0 ${unsafeCSS(spacing.lg)} ${unsafeCSS(spacing.lg)} ${unsafeCSS(spacing.lg)}; + } + + .incident-impact { + margin: ${unsafeCSS(spacing.md)} 0; + padding: ${unsafeCSS(spacing.md)}; + background: ${colors.background.secondary}; + border-radius: ${unsafeCSS(borderRadius.base)}; + font-size: 14px; + line-height: 1.6; + } + + .affected-services { + margin-top: ${unsafeCSS(spacing.md)}; + } + + .affected-services-title { + font-size: 13px; + font-weight: 600; + margin-bottom: ${unsafeCSS(spacing.sm)}; + color: ${colors.text.primary}; + } + + .service-tag { + display: inline-block; + padding: ${unsafeCSS(spacing.xs)} ${unsafeCSS(spacing.sm)}; + margin: 2px; + background: ${colors.background.muted}; + border-radius: ${unsafeCSS(borderRadius.sm)}; + font-size: 12px; + color: ${colors.text.secondary}; + } + + .incident-updates { + margin-top: ${unsafeCSS(spacing.lg)}; + border-top: 1px solid ${colors.border.default}; + padding-top: ${unsafeCSS(spacing.lg)}; + } + + .update-item { + position: relative; + padding-left: ${unsafeCSS(spacing.lg)}; + margin-bottom: ${unsafeCSS(spacing.md)}; + } + + .update-item::before { + content: ''; + position: absolute; + left: 0; + top: 6px; + width: 8px; + height: 8px; + border-radius: ${unsafeCSS(borderRadius.full)}; + background: ${colors.border.muted}; + } + + .update-time { + font-size: 12px; + color: ${colors.text.secondary}; + margin-bottom: ${unsafeCSS(spacing.xs)}; + font-family: ${unsafeCSS(fonts.mono)}; + } + + .update-message { + font-size: 14px; + line-height: 1.6; + color: ${colors.text.primary}; + } + + .update-author { + font-size: 12px; + color: ${colors.text.secondary}; + margin-top: ${unsafeCSS(spacing.xs)}; + font-style: italic; + } + + .loading-skeleton { + height: 140px; + background: ${cssManager.bdTheme( + 'linear-gradient(90deg, #f3f4f6 25%, #e5e7eb 50%, #f3f4f6 75%)', + 'linear-gradient(90deg, #1f1f1f 25%, #262626 50%, #1f1f1f 75%)' + )}; + background-size: 200% 100%; + animation: loading 1.5s infinite; + border-radius: ${unsafeCSS(borderRadius.md)}; + margin-bottom: ${unsafeCSS(spacing.lg)}; + } + + @keyframes loading { + 0% { background-position: 200% 0; } + 100% { background-position: -200% 0; } + } + + .show-more { + text-align: center; + margin-top: ${unsafeCSS(spacing.lg)}; + } + + .show-more-button { + display: inline-flex; + align-items: center; + justify-content: center; + padding: ${unsafeCSS(spacing.sm)} ${unsafeCSS(spacing.lg)}; + background: transparent; + border: 1px solid ${colors.border.default}; + border-radius: ${unsafeCSS(borderRadius.base)}; + cursor: pointer; + font-size: 14px; + font-weight: 500; + transition: all 0.2s ease; + color: ${colors.text.primary}; + font-family: ${unsafeCSS(fonts.base)}; + } + + .show-more-button:hover { + background: ${colors.background.secondary}; + border-color: ${colors.border.muted}; + transform: translateY(-1px); + } + + .show-more-button:active { + transform: translateY(0); + } + + @media (max-width: 640px) { + .container { + padding: 0 ${unsafeCSS(spacing.md)} ${unsafeCSS(spacing.md)} ${unsafeCSS(spacing.md)}; + } + + .incident-header { + flex-direction: column; + align-items: start; + gap: ${unsafeCSS(spacing.sm)}; + } + + .incident-meta { + flex-direction: column; + gap: ${unsafeCSS(spacing.xs)}; + } } `, ]; public render(): TemplateResult { return html` - -
- Current Incidents - ${this.currentIncidences.length - ? html`` - : html`
No incidents ongoing.
`} - Past Incidents - ${this.pastIncidences.length - ? html`` - : html`
No past incidents in the last 90 days.
`} +
+ Current Incidents + ${this.loading ? html` +
+ ` : this.currentIncidents.length ? + this.currentIncidents.map(incident => this.renderIncident(incident, true)) : + html`
No incidents ongoing.
` + } + + Past Incidents + ${this.loading ? html` +
+
+ ` : this.pastIncidents.length ? + this.pastIncidents.slice(0, 5).map(incident => this.renderIncident(incident, false)) : + html`
No past incidents in the last ${this.daysToShow} days.
` + } + + ${this.pastIncidents.length > 5 && !this.loading ? html` +
+ +
+ ` : ''}
`; } + private renderIncident(incident: IIncidentDetails, isCurrent: boolean): TemplateResult { + const latestUpdate = incident.updates[incident.updates.length - 1]; + const duration = incident.endTime ? + this.formatDuration(incident.endTime - incident.startTime) : + this.formatDuration(Date.now() - incident.startTime); + + return html` +
this.handleIncidentClick(incident)}> +
+
+

${incident.title}

+
+ Started: ${this.formatDate(incident.startTime)} + Duration: ${duration} + ${incident.endTime ? html` + Ended: ${this.formatDate(incident.endTime)} + ` : ''} +
+
+
+ ${this.getStatusIcon(latestUpdate.status)} + ${latestUpdate.status.replace(/_/g, ' ')} +
+
+ +
+
+ Impact: ${incident.impact} +
+ + ${incident.affectedServices.length > 0 ? html` +
+
Affected Services:
+ ${incident.affectedServices.map(service => html` + ${service} + `)} +
+ ` : ''} + + ${incident.updates.length > 0 ? html` +
+

Updates

+ ${incident.updates.slice(-3).reverse().map(update => this.renderUpdate(update))} +
+ ` : ''} + + ${incident.rootCause && isCurrent === false ? html` +
+ Root Cause: ${incident.rootCause} +
+ ` : ''} + + ${incident.resolution && isCurrent === false ? html` +
+ Resolution: ${incident.resolution} +
+ ` : ''} +
+
+ `; + } + + private renderUpdate(update: any): TemplateResult { + return html` +
+
${this.formatDate(update.timestamp)}
+
${update.message}
+ ${update.author ? html` +
— ${update.author}
+ ` : ''} +
+ `; + } + + private getStatusIcon(status: string): string { + const icons: Record = { + investigating: '🔍', + identified: '🎯', + monitoring: '👁️', + resolved: '✅', + postmortem: '📋' + }; + return icons[status] || '•'; + } + + private formatDate(timestamp: number): string { + const date = new Date(timestamp); + const now = Date.now(); + const diff = now - timestamp; + + // Less than 1 hour ago + if (diff < 60 * 60 * 1000) { + const minutes = Math.floor(diff / (60 * 1000)); + return `${minutes} minute${minutes !== 1 ? 's' : ''} ago`; + } + + // Less than 24 hours ago + if (diff < 24 * 60 * 60 * 1000) { + const hours = Math.floor(diff / (60 * 60 * 1000)); + return `${hours} hour${hours !== 1 ? 's' : ''} ago`; + } + + // Less than 7 days ago + if (diff < 7 * 24 * 60 * 60 * 1000) { + const days = Math.floor(diff / (24 * 60 * 60 * 1000)); + return `${days} day${days !== 1 ? 's' : ''} ago`; + } + + // Default to full date + return date.toLocaleDateString('en-US', { + month: 'short', + day: 'numeric', + year: date.getFullYear() !== new Date().getFullYear() ? 'numeric' : undefined + }); + } + + private formatDuration(milliseconds: number): string { + const minutes = Math.floor(milliseconds / (60 * 1000)); + const hours = Math.floor(minutes / 60); + const days = Math.floor(hours / 24); + + if (days > 0) { + return `${days}d ${hours % 24}h`; + } else if (hours > 0) { + return `${hours}h ${minutes % 60}m`; + } else { + return `${minutes}m`; + } + } + + private handleIncidentClick(incident: IIncidentDetails) { + this.dispatchEvent(new CustomEvent('incidentClick', { + detail: { incident }, + bubbles: true, + composed: true + })); + } + + private handleShowMore() { + // This would typically load more incidents or navigate to a full list + console.log('Show more incidents'); + } + public dispatchReportNewIncident() { - this.dispatchEvent(new CustomEvent('reportNewIncident', {})); + this.dispatchEvent(new CustomEvent('reportNewIncident', { + bubbles: true, + composed: true + })); } public dispatchStatusSubscribe() { - this.dispatchEvent(new CustomEvent('statusSubscribe', {})); + this.dispatchEvent(new CustomEvent('statusSubscribe', { + bubbles: true, + composed: true + })); } } diff --git a/ts_web/elements/upl-statuspage-statusbar.demo.ts b/ts_web/elements/upl-statuspage-statusbar.demo.ts new file mode 100644 index 0000000..a53b005 --- /dev/null +++ b/ts_web/elements/upl-statuspage-statusbar.demo.ts @@ -0,0 +1,393 @@ +import { html } from '@design.estate/dees-element'; +import type { IOverallStatus } from '../interfaces/index.js'; + +export const demoFunc = () => html` + + +
+ +
+
Automatic Status Cycling
+ { + const statusBar = wrapperElement.querySelector('upl-statuspage-statusbar') as any; + + const statusStates: IOverallStatus[] = [ + { + status: 'operational', + message: 'All Systems Operational', + lastUpdated: Date.now(), + affectedServices: 0, + totalServices: 12 + }, + { + status: 'degraded', + message: 'Minor Service Degradation', + lastUpdated: Date.now(), + affectedServices: 2, + totalServices: 12 + }, + { + status: 'partial_outage', + message: 'Partial System Outage', + lastUpdated: Date.now(), + affectedServices: 4, + totalServices: 12 + }, + { + status: 'major_outage', + message: 'Major Service Disruption', + lastUpdated: Date.now(), + affectedServices: 8, + totalServices: 12 + }, + { + status: 'maintenance', + message: 'Scheduled Maintenance in Progress', + lastUpdated: Date.now(), + affectedServices: 3, + totalServices: 12 + } + ]; + + let statusIndex = 0; + + // Initial loading demo + statusBar.loading = true; + setTimeout(() => { + statusBar.loading = false; + statusBar.overallStatus = statusStates[0]; + }, 1500); + + // Cycle through states + setInterval(() => { + statusIndex = (statusIndex + 1) % statusStates.length; + statusBar.overallStatus = statusStates[statusIndex]; + statusBar.overallStatus = { ...statusBar.overallStatus, lastUpdated: Date.now() }; + }, 3000); + + // Handle clicks + statusBar.addEventListener('statusClick', (event: CustomEvent) => { + console.log('Status bar clicked:', event.detail); + alert(`Status Details:\n\nStatus: ${event.detail.status.status}\nMessage: ${event.detail.status.message}\nAffected Services: ${event.detail.status.affectedServices}`); + }); + }} + > + + +
+ + +
+
Manual Status Control
+ { + const statusBar = wrapperElement.querySelector('upl-statuspage-statusbar') as any; + + // Initial state + statusBar.overallStatus = { + status: 'operational', + message: 'All Systems Operational', + lastUpdated: Date.now(), + affectedServices: 0, + totalServices: 15 + }; + + // Create controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = ` + + + + + + `; + wrapperElement.appendChild(controls); + + // Status messages + const statusMessages = { + operational: 'All Systems Operational', + degraded: 'Performance Issues Detected', + partial_outage: 'Some Services Unavailable', + major_outage: 'Critical System Failure', + maintenance: 'Planned Maintenance Window' + }; + + const affectedCounts = { + operational: 0, + degraded: 3, + partial_outage: 7, + major_outage: 12, + maintenance: 5 + }; + + // Handle button clicks + controls.querySelectorAll('.demo-button').forEach(button => { + button.addEventListener('click', () => { + const status = button.getAttribute('data-status') as keyof typeof statusMessages; + statusBar.overallStatus = { + status: status as any, + message: statusMessages[status], + lastUpdated: Date.now(), + affectedServices: affectedCounts[status], + totalServices: 15 + }; + }); + }); + }} + > + + +
+ + +
+
Loading and Refresh States
+ { + const statusBar = wrapperElement.querySelector('upl-statuspage-statusbar') as any; + + // Initial loading + statusBar.loading = true; + + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = ` + + + + `; + wrapperElement.appendChild(controls); + + // Set initial status after loading + setTimeout(() => { + statusBar.loading = false; + statusBar.overallStatus = { + status: 'operational', + message: 'All Systems Operational', + lastUpdated: Date.now(), + affectedServices: 0, + totalServices: 10 + }; + }, 2000); + + // Toggle loading + controls.querySelector('#toggleLoading')?.addEventListener('click', () => { + statusBar.loading = !statusBar.loading; + }); + + // Refresh simulation + controls.querySelector('#refresh')?.addEventListener('click', () => { + statusBar.loading = true; + setTimeout(() => { + statusBar.loading = false; + // Simulate random status after refresh + const statuses = ['operational', 'degraded', 'partial_outage']; + const randomStatus = statuses[Math.floor(Math.random() * statuses.length)]; + statusBar.overallStatus = { + status: randomStatus as any, + message: 'Status refreshed at ' + new Date().toLocaleTimeString(), + lastUpdated: Date.now(), + affectedServices: randomStatus === 'operational' ? 0 : Math.floor(Math.random() * 5) + 1, + totalServices: 10 + }; + }, 1000); + }); + + // Error simulation + controls.querySelector('#simulateError')?.addEventListener('click', () => { + statusBar.loading = true; + setTimeout(() => { + statusBar.loading = false; + statusBar.overallStatus = { + status: 'major_outage', + message: 'Unable to fetch status - Connection Error', + lastUpdated: Date.now(), + affectedServices: -1, // Unknown + totalServices: -1 + }; + }, 1500); + }); + }} + > + + +
+ + +
+
Edge Cases and Special States
+ { + const statusBar = wrapperElement.querySelector('upl-statuspage-statusbar') as any; + + const edgeCases = [ + { + label: 'No Services', + status: { + status: 'operational', + message: 'No services to monitor', + lastUpdated: Date.now(), + affectedServices: 0, + totalServices: 0 + } + }, + { + label: 'All Services Down', + status: { + status: 'major_outage', + message: 'Complete System Failure', + lastUpdated: Date.now(), + affectedServices: 25, + totalServices: 25 + } + }, + { + label: 'Very Long Message', + status: { + status: 'degraded', + message: 'Multiple services experiencing degraded performance due to increased load from seasonal traffic surge', + lastUpdated: Date.now(), + affectedServices: 7, + totalServices: 20 + } + }, + { + label: 'Old Timestamp', + status: { + status: 'operational', + message: 'Status data may be stale', + lastUpdated: Date.now() - 24 * 60 * 60 * 1000, // 24 hours ago + affectedServices: 0, + totalServices: 10 + } + }, + { + label: 'Future Maintenance', + status: { + status: 'maintenance', + message: 'Scheduled maintenance starting in 2 hours', + lastUpdated: Date.now(), + affectedServices: 0, + totalServices: 15 + } + } + ]; + + let currentCase = 0; + statusBar.overallStatus = edgeCases[0].status; + + // Create info display + const info = document.createElement('div'); + info.className = 'status-info'; + info.innerHTML = `Current Case: ${edgeCases[0].label}`; + wrapperElement.appendChild(info); + + // Create controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = ` + + + `; + wrapperElement.appendChild(controls); + + const updateCase = (index: number) => { + currentCase = index; + statusBar.overallStatus = edgeCases[currentCase].status; + info.innerHTML = `Current Case: ${edgeCases[currentCase].label}`; + }; + + controls.querySelector('#prevCase')?.addEventListener('click', () => { + const newIndex = (currentCase - 1 + edgeCases.length) % edgeCases.length; + updateCase(newIndex); + }); + + controls.querySelector('#nextCase')?.addEventListener('click', () => { + const newIndex = (currentCase + 1) % edgeCases.length; + updateCase(newIndex); + }); + }} + > + + +
+ + +
+
Non-Expandable Status Bar
+ { + const statusBar = wrapperElement.querySelector('upl-statuspage-statusbar') as any; + + // Disable expandable behavior + statusBar.expandable = false; + + statusBar.overallStatus = { + status: 'operational', + message: 'This status bar cannot be clicked', + lastUpdated: Date.now(), + affectedServices: 0, + totalServices: 8 + }; + + // This event won't fire since expandable is false + statusBar.addEventListener('statusClick', (event: CustomEvent) => { + console.log('This should not fire'); + }); + + const info = document.createElement('div'); + info.className = 'status-info'; + info.innerHTML = 'Try clicking the status bar - it should not respond to clicks when expandable=false'; + wrapperElement.appendChild(info); + }} + > + + +
+
+`; \ No newline at end of file diff --git a/ts_web/elements/upl-statuspage-statusbar.ts b/ts_web/elements/upl-statuspage-statusbar.ts index 743255d..0b5a96c 100644 --- a/ts_web/elements/upl-statuspage-statusbar.ts +++ b/ts_web/elements/upl-statuspage-statusbar.ts @@ -1,5 +1,8 @@ -import { DeesElement, property, html, customElement, type TemplateResult, cssManager, css } from '@design.estate/dees-element'; +import { DeesElement, property, html, customElement, type TemplateResult, cssManager, css, unsafeCSS } from '@design.estate/dees-element'; import * as domtools from '@design.estate/dees-domtools'; +import type { IOverallStatus } from '../interfaces/index.js'; +import { fonts } from '../styles/shared.styles.js'; +import { demoFunc } from './upl-statuspage-statusbar.demo.js'; declare global { interface HTMLElementTagNameMap { @@ -9,9 +12,22 @@ declare global { @customElement('upl-statuspage-statusbar') export class UplStatuspageStatusbar extends DeesElement { - public static demo = () => html` - - `; + public static demo = demoFunc; + + @property({ type: Object }) + public overallStatus: IOverallStatus = { + status: 'operational', + message: 'All Systems Operational', + lastUpdated: Date.now(), + affectedServices: 0, + totalServices: 0 + }; + + @property({ type: Boolean }) + public loading: boolean = false; + + @property({ type: Boolean }) + public expandable: boolean = true; constructor() { super(); @@ -21,30 +37,200 @@ export class UplStatuspageStatusbar extends DeesElement { cssManager.defaultStyles, css` :host { - padding: 20px 0px 15px 0px; + padding: 0; display: block; - background: ${cssManager.bdTheme('#eeeeeb', '#222222')};; - font-family: Inter; - color: #fff; + background: transparent; + font-family: ${unsafeCSS(fonts.base)}; } - .mainbox { + .statusbar-container { margin: auto; - max-width: 900px; - text-align: center; - background: #19572E; - line-height: 50px; - border-radius: 3px; + max-width: 1200px; + padding: 0 24px 24px 24px; + position: relative; + } + + .statusbar-inner { + display: flex; + align-items: center; + justify-content: center; + min-height: 64px; + padding: 16px 24px; + border-radius: 8px; + cursor: pointer; + transition: all 0.2s ease; + position: relative; + overflow: hidden; + font-weight: 500; + font-size: 16px; + border: 1px solid transparent; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06); + } + + .statusbar-inner:hover { + transform: translateY(-1px); + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.06); + } + + .statusbar-inner:active { + transform: translateY(0); + } + + .statusbar-inner.operational { + background: ${cssManager.bdTheme('#10b981', '#064e3b')}; + border-color: ${cssManager.bdTheme('#10b981', '#064e3b')}; + color: white; + } + + .statusbar-inner.degraded { + background: ${cssManager.bdTheme('#f59e0b', '#78350f')}; + border-color: ${cssManager.bdTheme('#f59e0b', '#78350f')}; + color: white; + } + + .statusbar-inner.partial_outage { + background: ${cssManager.bdTheme('#ef4444', '#7f1d1d')}; + border-color: ${cssManager.bdTheme('#ef4444', '#7f1d1d')}; + color: white; + } + + .statusbar-inner.major_outage { + background: ${cssManager.bdTheme('#dc2626', '#450a0a')}; + border-color: ${cssManager.bdTheme('#dc2626', '#450a0a')}; + color: white; + } + + .statusbar-inner.maintenance { + background: ${cssManager.bdTheme('#3b82f6', '#1e3a8a')}; + border-color: ${cssManager.bdTheme('#3b82f6', '#1e3a8a')}; + color: white; + } + + .status-content { + display: flex; + flex-direction: column; + align-items: center; + gap: 4px; + } + + .status-main { + display: flex; + align-items: center; + gap: 8px; + } + + .status-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 20px; + height: 20px; + font-size: 14px; + } + + .loading-skeleton { + background: ${cssManager.bdTheme( + 'linear-gradient(90deg, #f3f4f6 25%, #e5e7eb 50%, #f3f4f6 75%)', + 'linear-gradient(90deg, #1f1f1f 25%, #262626 50%, #1f1f1f 75%)' + )}; + background-size: 200% 100%; + animation: loading 1.5s infinite; + height: 64px; + border-radius: 8px; + } + + @keyframes loading { + 0% { + background-position: 200% 0; + } + 100% { + background-position: -200% 0; + } + } + + .status-details { + font-size: 14px; + opacity: 0.9; + } + + .last-updated { + font-size: 13px; + text-align: right; + margin-top: 12px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + @media (max-width: 640px) { + .statusbar-inner { + font-size: 14px; + padding: 12px 16px; + min-height: 56px; + } + + .status-icon { + width: 18px; + height: 18px; + font-size: 12px; + } } `, ] public render(): TemplateResult { + const getStatusIcon = () => { + switch (this.overallStatus.status) { + case 'operational': + return '✓'; + case 'degraded': + return '!'; + case 'partial_outage': + return '⚠'; + case 'major_outage': + return '✕'; + case 'maintenance': + return '🔧'; + default: + return ''; + } + }; + + const formatLastUpdated = () => { + const date = new Date(this.overallStatus.lastUpdated); + return date.toLocaleString(); + }; + + const handleClick = () => { + if (this.expandable) { + this.dispatchEvent(new CustomEvent('statusClick', { + detail: { status: this.overallStatus }, + bubbles: true, + composed: true + })); + } + }; + return html` - -
- Everything is working normally! +
+ ${this.loading ? html` +
+ ` : html` +
+
+
+ ${getStatusIcon()} + ${this.overallStatus.message} +
+ ${this.overallStatus.affectedServices > 0 ? html` +
+ ${this.overallStatus.affectedServices} of ${this.overallStatus.totalServices} services affected +
+ ` : ''} +
+
+
+ Last updated: ${formatLastUpdated()} +
+ `}
`; } diff --git a/ts_web/elements/upl-statuspage-statusdetails.demo.ts b/ts_web/elements/upl-statuspage-statusdetails.demo.ts new file mode 100644 index 0000000..73cdaa2 --- /dev/null +++ b/ts_web/elements/upl-statuspage-statusdetails.demo.ts @@ -0,0 +1,754 @@ +import { html } from '@design.estate/dees-element'; +import type { IStatusHistoryPoint } from '../interfaces/index.js'; + +export const demoFunc = () => html` + + +
+ +
+
Different Time Ranges
+ { + const statusDetails = wrapperElement.querySelector('upl-statuspage-statusdetails') as any; + + // Generate data for different time ranges + const generateDataForRange = (hours: number, pattern: 'stable' | 'degrading' | 'improving' | 'volatile' = 'stable'): IStatusHistoryPoint[] => { + const now = Date.now(); + const data: IStatusHistoryPoint[] = []; + + // For proper display, we need hourly data points that align with actual hours + for (let i = hours - 1; i >= 0; i--) { + // Create timestamp at the start of each hour + const date = new Date(); + date.setMinutes(0, 0, 0); + date.setHours(date.getHours() - i); + const timestamp = date.getTime(); + let status: IStatusHistoryPoint['status'] = 'operational'; + let responseTime = 50 + Math.random() * 50; + let errorRate = 0; + + switch (pattern) { + case 'degrading': + // Getting worse over time + const degradation = (hours - i) / hours; + if (degradation > 0.7) { + status = 'major_outage'; + responseTime = 800 + Math.random() * 200; + errorRate = 0.3 + Math.random() * 0.2; + } else if (degradation > 0.5) { + status = 'partial_outage'; + responseTime = 500 + Math.random() * 200; + errorRate = 0.1 + Math.random() * 0.1; + } else if (degradation > 0.3) { + status = 'degraded'; + responseTime = 200 + Math.random() * 100; + errorRate = 0.02 + Math.random() * 0.03; + } + break; + + case 'improving': + // Getting better over time + const improvement = i / hours; + if (improvement < 0.3) { + status = 'major_outage'; + responseTime = 800 + Math.random() * 200; + errorRate = 0.3 + Math.random() * 0.2; + } else if (improvement < 0.5) { + status = 'partial_outage'; + responseTime = 500 + Math.random() * 200; + errorRate = 0.1 + Math.random() * 0.1; + } else if (improvement < 0.7) { + status = 'degraded'; + responseTime = 200 + Math.random() * 100; + errorRate = 0.02 + Math.random() * 0.03; + } + break; + + case 'volatile': + // Random ups and downs + const rand = Math.random(); + if (rand < 0.05) { + status = 'major_outage'; + responseTime = 800 + Math.random() * 200; + errorRate = 0.3 + Math.random() * 0.2; + } else if (rand < 0.1) { + status = 'partial_outage'; + responseTime = 500 + Math.random() * 200; + errorRate = 0.1 + Math.random() * 0.1; + } else if (rand < 0.2) { + status = 'degraded'; + responseTime = 200 + Math.random() * 100; + errorRate = 0.02 + Math.random() * 0.03; + } else if (rand < 0.25) { + status = 'maintenance'; + responseTime = 100 + Math.random() * 50; + errorRate = 0; + } + break; + + default: + // Stable with occasional hiccups + if (Math.random() < 0.02) { + status = 'degraded'; + responseTime = 200 + Math.random() * 100; + errorRate = 0.01 + Math.random() * 0.02; + } + } + + data.push({ + timestamp, + status, + responseTime, + errorRate + }); + } + + return data; + }; + + // Initial setup + statusDetails.serviceId = 'api-gateway'; + statusDetails.serviceName = 'API Gateway'; + statusDetails.historyData = generateDataForRange(24); + + // Create controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + + const timeRanges = [ + { hours: 24, label: '24 Hours' }, + { hours: 168, label: '7 Days' }, + { hours: 720, label: '30 Days' }, + { hours: 2160, label: '90 Days' } + ]; + + timeRanges.forEach((range, index) => { + const button = document.createElement('button'); + button.className = 'demo-button' + (index === 0 ? ' active' : ''); + button.textContent = range.label; + button.onclick = () => { + // Update active button + controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active')); + button.classList.add('active'); + + // Load new data with loading state + statusDetails.loading = true; + setTimeout(() => { + statusDetails.historyData = generateDataForRange(range.hours, 'volatile'); + statusDetails.loading = false; + updateStats(); + }, 500); + }; + controls.appendChild(button); + }); + + wrapperElement.appendChild(controls); + + // Add statistics display + const statsDiv = document.createElement('div'); + statsDiv.className = 'stats-grid'; + wrapperElement.appendChild(statsDiv); + + const updateStats = () => { + const data = statusDetails.historyData || []; + const operational = data.filter(d => d.status === 'operational').length; + const avgResponseTime = data.reduce((sum, d) => sum + (d.responseTime || 0), 0) / data.length; + const uptime = (operational / data.length) * 100; + const incidents = data.filter(d => d.status !== 'operational' && d.status !== 'maintenance').length; + + statsDiv.innerHTML = ` +
+
${uptime.toFixed(2)}%
+
Uptime
+
+
+
${avgResponseTime.toFixed(0)}ms
+
Avg Response Time
+
+
+
${incidents}
+
Incidents
+
+
+
${data.length}
+
Data Points
+
+ `; + }; + + updateStats(); + + // Handle bar clicks + statusDetails.addEventListener('barClick', (event: CustomEvent) => { + const { timestamp, status, responseTime, errorRate } = event.detail; + const date = new Date(timestamp); + alert(`Details for ${date.toLocaleString()}:\n\nStatus: ${status}\nResponse Time: ${responseTime.toFixed(0)}ms\nError Rate: ${(errorRate * 100).toFixed(2)}%`); + }); + }} + > + +
+
+ + +
+
Different Data Patterns
+ { + const statusDetails = wrapperElement.querySelector('upl-statuspage-statusdetails') as any; + + // Pattern generators + const patterns = { + stable: () => { + const data: IStatusHistoryPoint[] = []; + for (let i = 47; i >= 0; i--) { + const date = new Date(); + date.setMinutes(0, 0, 0); + date.setHours(date.getHours() - i); + data.push({ + timestamp: date.getTime(), + status: 'operational', + responseTime: 40 + Math.random() * 20, + errorRate: 0 + }); + } + return data; + }, + + degrading: () => { + const now = Date.now(); + const data: IStatusHistoryPoint[] = []; + for (let i = 47; i >= 0; i--) { + const degradation = (47 - i) / 47; + let status: IStatusHistoryPoint['status'] = 'operational'; + let responseTime = 50; + let errorRate = 0; + + if (degradation > 0.8) { + status = 'major_outage'; + responseTime = 800 + Math.random() * 200; + errorRate = 0.4; + } else if (degradation > 0.6) { + status = 'partial_outage'; + responseTime = 500 + Math.random() * 100; + errorRate = 0.2; + } else if (degradation > 0.4) { + status = 'degraded'; + responseTime = 200 + Math.random() * 100; + errorRate = 0.05; + } else { + responseTime = 50 + degradation * 100; + } + + data.push({ + timestamp: now - (i * 60 * 60 * 1000), + status, + responseTime, + errorRate + }); + } + return data; + }, + + recovering: () => { + const now = Date.now(); + const data: IStatusHistoryPoint[] = []; + for (let i = 47; i >= 0; i--) { + const recovery = i / 47; + let status: IStatusHistoryPoint['status'] = 'operational'; + let responseTime = 50; + let errorRate = 0; + + if (recovery < 0.2) { + status = 'operational'; + responseTime = 50 + Math.random() * 20; + } else if (recovery < 0.4) { + status = 'degraded'; + responseTime = 150 + Math.random() * 50; + errorRate = 0.02; + } else if (recovery < 0.7) { + status = 'partial_outage'; + responseTime = 400 + Math.random() * 100; + errorRate = 0.15; + } else { + status = 'major_outage'; + responseTime = 800 + Math.random() * 200; + errorRate = 0.35; + } + + data.push({ + timestamp: now - (i * 60 * 60 * 1000), + status, + responseTime, + errorRate + }); + } + return data; + }, + + periodic: () => { + const now = Date.now(); + const data: IStatusHistoryPoint[] = []; + for (let i = 47; i >= 0; i--) { + // Issues every 12 hours + const hourOfDay = i % 24; + let status: IStatusHistoryPoint['status'] = 'operational'; + let responseTime = 50 + Math.random() * 30; + let errorRate = 0; + + if (hourOfDay >= 9 && hourOfDay <= 11) { + // Morning peak + status = 'degraded'; + responseTime = 200 + Math.random() * 100; + errorRate = 0.05; + } else if (hourOfDay >= 18 && hourOfDay <= 20) { + // Evening peak + status = 'degraded'; + responseTime = 250 + Math.random() * 150; + errorRate = 0.08; + } + + data.push({ + timestamp: now - (i * 60 * 60 * 1000), + status, + responseTime, + errorRate + }); + } + return data; + }, + + maintenance: () => { + const now = Date.now(); + const data: IStatusHistoryPoint[] = []; + for (let i = 47; i >= 0; i--) { + let status: IStatusHistoryPoint['status'] = 'operational'; + let responseTime = 50 + Math.random() * 30; + let errorRate = 0; + + // Maintenance window from hour 20-24 + if (i >= 20 && i <= 24) { + status = 'maintenance'; + responseTime = 0; + errorRate = 0; + } + + data.push({ + timestamp: now - (i * 60 * 60 * 1000), + status, + responseTime, + errorRate + }); + } + return data; + } + }; + + // Initial setup + statusDetails.serviceId = 'web-server'; + statusDetails.serviceName = 'Web Server'; + statusDetails.historyData = patterns.stable(); + + // Create controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + + Object.entries(patterns).forEach(([name, generator]) => { + const button = document.createElement('button'); + button.className = 'demo-button' + (name === 'stable' ? ' active' : ''); + button.textContent = name.charAt(0).toUpperCase() + name.slice(1); + button.onclick = () => { + controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active')); + button.classList.add('active'); + + statusDetails.loading = true; + setTimeout(() => { + statusDetails.historyData = generator(); + statusDetails.loading = false; + updateInfo(name); + }, 300); + }; + controls.appendChild(button); + }); + + wrapperElement.appendChild(controls); + + // Add info display + const info = document.createElement('div'); + info.className = 'demo-info'; + wrapperElement.appendChild(info); + + const updateInfo = (pattern: string) => { + const descriptions = { + stable: 'Service running smoothly with consistent performance', + degrading: 'Service health deteriorating over time', + recovering: 'Service recovering from a major outage', + periodic: 'Regular performance issues during peak hours (9-11 AM and 6-8 PM)', + maintenance: 'Scheduled maintenance window (hours 20-24)' + }; + + info.innerHTML = `Pattern: ${descriptions[pattern as keyof typeof descriptions] || pattern}`; + }; + + updateInfo('stable'); + }} + > + + +
+ + +
+
Real-time Updates with Manual Control
+ { + const statusDetails = wrapperElement.querySelector('upl-statuspage-statusdetails') as any; + + // Initialize with recent data + const now = Date.now(); + const initialData: IStatusHistoryPoint[] = []; + for (let i = 23; i >= 0; i--) { + initialData.push({ + timestamp: now - (i * 60 * 60 * 1000), + status: 'operational', + responseTime: 50 + Math.random() * 30, + errorRate: 0 + }); + } + + statusDetails.serviceId = 'real-time-api'; + statusDetails.serviceName = 'Real-time API'; + statusDetails.historyData = initialData; + statusDetails.timeRange = '24h'; + + // Create controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = ` + + + + + + `; + wrapperElement.appendChild(controls); + + const addDataPoint = (status: IStatusHistoryPoint['status'], responseTime: number, errorRate: number = 0) => { + const data = [...(statusDetails.historyData || [])]; + if (data.length >= 24) { + data.shift(); // Keep only 24 points + } + + data.push({ + timestamp: Date.now(), + status, + responseTime, + errorRate + }); + + statusDetails.historyData = data; + }; + + controls.querySelector('#addHealthy')?.addEventListener('click', () => { + addDataPoint('operational', 50 + Math.random() * 30); + }); + + controls.querySelector('#addDegraded')?.addEventListener('click', () => { + addDataPoint('degraded', 200 + Math.random() * 100, 0.05); + }); + + controls.querySelector('#addOutage')?.addEventListener('click', () => { + addDataPoint('major_outage', 800 + Math.random() * 200, 0.5); + }); + + controls.querySelector('#simulateSpike')?.addEventListener('click', () => { + // Add several degraded points + for (let i = 0; i < 3; i++) { + setTimeout(() => { + addDataPoint('degraded', 300 + Math.random() * 200, 0.1 + Math.random() * 0.1); + }, i * 1000); + } + }); + + controls.querySelector('#clearData')?.addEventListener('click', () => { + statusDetails.historyData = []; + }); + + // Auto-update every 5 seconds + let autoUpdate = setInterval(() => { + const rand = Math.random(); + if (rand < 0.8) { + addDataPoint('operational', 40 + Math.random() * 40); + } else if (rand < 0.95) { + addDataPoint('degraded', 150 + Math.random() * 100, 0.02); + } else { + addDataPoint('partial_outage', 400 + Math.random() * 200, 0.15); + } + }, 5000); + + // Add toggle for auto-updates + const autoToggle = document.createElement('button'); + autoToggle.className = 'demo-button active'; + autoToggle.textContent = 'Auto-update: ON'; + autoToggle.style.marginLeft = '10px'; + autoToggle.onclick = () => { + if (autoUpdate) { + clearInterval(autoUpdate); + autoUpdate = null; + autoToggle.textContent = 'Auto-update: OFF'; + autoToggle.classList.remove('active'); + } else { + autoUpdate = setInterval(() => { + const rand = Math.random(); + if (rand < 0.8) { + addDataPoint('operational', 40 + Math.random() * 40); + } else if (rand < 0.95) { + addDataPoint('degraded', 150 + Math.random() * 100, 0.02); + } else { + addDataPoint('partial_outage', 400 + Math.random() * 200, 0.15); + } + }, 5000); + autoToggle.textContent = 'Auto-update: ON'; + autoToggle.classList.add('active'); + } + }; + controls.appendChild(autoToggle); + + // Cleanup on unmount + wrapperElement.addEventListener('remove', () => { + if (autoUpdate) clearInterval(autoUpdate); + }); + }} + > + + +
+ + +
+
Edge Cases and Special Scenarios
+ { + const statusDetails = wrapperElement.querySelector('upl-statuspage-statusdetails') as any; + + const scenarios = { + noData: { + name: 'No Data Available', + data: [] + }, + singlePoint: { + name: 'Single Data Point', + data: [{ + timestamp: Date.now(), + status: 'operational' as const, + responseTime: 75, + errorRate: 0 + }] + }, + allDown: { + name: 'Complete Outage', + data: Array.from({ length: 48 }, (_, i) => ({ + timestamp: Date.now() - (i * 60 * 60 * 1000), + status: 'major_outage' as const, + responseTime: 0, + errorRate: 1 + })) + }, + highLatency: { + name: 'High Latency Issues', + data: Array.from({ length: 48 }, (_, i) => ({ + timestamp: Date.now() - (i * 60 * 60 * 1000), + status: 'operational' as const, + responseTime: 2000 + Math.random() * 1000, + errorRate: 0 + })) + }, + mixedStatuses: { + name: 'All Status Types', + data: Array.from({ length: 50 }, (_, i) => { + const statuses: IStatusHistoryPoint['status'][] = ['operational', 'degraded', 'partial_outage', 'major_outage', 'maintenance']; + const status = statuses[i % statuses.length]; + return { + timestamp: Date.now() - (i * 60 * 60 * 1000), + status, + responseTime: status === 'operational' ? 50 : status === 'maintenance' ? 0 : 200 + Math.random() * 600, + errorRate: status === 'operational' || status === 'maintenance' ? 0 : 0.1 + Math.random() * 0.4 + }; + }) + } + }; + + // Initial scenario + let currentScenario = 'noData'; + statusDetails.serviceId = 'edge-case-service'; + statusDetails.serviceName = 'Edge Case Service'; + statusDetails.historyData = scenarios[currentScenario].data; + + // Create scenario buttons + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + + Object.entries(scenarios).forEach(([key, scenario]) => { + const button = document.createElement('button'); + button.className = 'demo-button' + (key === currentScenario ? ' active' : ''); + button.textContent = scenario.name; + button.onclick = () => { + controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active')); + button.classList.add('active'); + + currentScenario = key; + statusDetails.loading = true; + setTimeout(() => { + statusDetails.historyData = scenario.data; + statusDetails.loading = false; + }, 300); + }; + controls.appendChild(button); + }); + + wrapperElement.appendChild(controls); + }} + > + + +
+ + +
+
Loading and Error Handling
+ { + const statusDetails = wrapperElement.querySelector('upl-statuspage-statusdetails') as any; + + // Start with loading + statusDetails.loading = true; + statusDetails.serviceId = 'loading-demo'; + statusDetails.serviceName = 'Loading Demo Service'; + + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = ` + + + + + `; + wrapperElement.appendChild(controls); + + controls.querySelector('#toggleLoading')?.addEventListener('click', () => { + statusDetails.loading = !statusDetails.loading; + }); + + controls.querySelector('#loadSuccess')?.addEventListener('click', () => { + statusDetails.loading = true; + setTimeout(() => { + const now = Date.now(); + statusDetails.historyData = Array.from({ length: 24 }, (_, i) => ({ + timestamp: now - (i * 60 * 60 * 1000), + status: Math.random() > 0.9 ? 'degraded' : 'operational', + responseTime: 50 + Math.random() * 50, + errorRate: 0 + })); + statusDetails.loading = false; + }, 500); + }); + + controls.querySelector('#loadError')?.addEventListener('click', () => { + statusDetails.loading = true; + setTimeout(() => { + statusDetails.loading = false; + statusDetails.historyData = []; + statusDetails.errorMessage = 'Failed to load status data: Connection timeout'; + }, 1500); + }); + + controls.querySelector('#loadSlowly')?.addEventListener('click', () => { + statusDetails.loading = true; + setTimeout(() => { + const now = Date.now(); + statusDetails.historyData = Array.from({ length: 48 }, (_, i) => ({ + timestamp: now - (i * 60 * 60 * 1000), + status: 'operational', + responseTime: 45 + Math.random() * 30, + errorRate: 0 + })); + statusDetails.loading = false; + }, 3000); + }); + }} + > + + +
+
+`; \ No newline at end of file diff --git a/ts_web/elements/upl-statuspage-statusdetails.ts b/ts_web/elements/upl-statuspage-statusdetails.ts index 9c7870b..be3afe6 100644 --- a/ts_web/elements/upl-statuspage-statusdetails.ts +++ b/ts_web/elements/upl-statuspage-statusdetails.ts @@ -7,9 +7,13 @@ import { type TemplateResult, css, cssManager, + unsafeCSS, } from '@design.estate/dees-element'; +import type { IStatusHistoryPoint } from '../interfaces/index.js'; +import { fonts, colors, shadows, borderRadius, spacing, commonStyles, getStatusColor } from '../styles/shared.styles.js'; import './internal/uplinternal-miniheading.js'; +import { demoFunc } from './upl-statuspage-statusdetails.demo.js'; declare global { interface HTMLElementTagNameMap { @@ -19,7 +23,22 @@ declare global { @customElement('upl-statuspage-statusdetails') export class UplStatuspageStatusdetails extends DeesElement { - public static demo = () => html` `; + public static demo = demoFunc; + + @property({ type: Array }) + public historyData: IStatusHistoryPoint[] = []; + + @property({ type: String }) + public serviceId: string = ''; + + @property({ type: String }) + public serviceName: string = 'Service'; + + @property({ type: Boolean }) + public loading: boolean = false; + + @property({ type: Number }) + public hoursToShow: number = 48; constructor() { super(); @@ -27,69 +46,342 @@ export class UplStatuspageStatusdetails extends DeesElement { public static styles = [ plugins.domtools.elementBasic.staticStyles, + commonStyles, css` :host { position: relative; - padding: 0px 0px 15px 0px; display: block; - background: ${cssManager.bdTheme('#eeeeeb', '#222222')};; - font-family: Inter; - color: #fff; + background: transparent; + font-family: ${unsafeCSS(fonts.base)}; + color: ${colors.text.primary}; + } + + .container { + max-width: 1200px; + margin: 0 auto; + padding: 0 ${unsafeCSS(spacing.lg)} ${unsafeCSS(spacing.lg)} ${unsafeCSS(spacing.lg)}; } .mainbox { - margin: auto; - max-width: 900px; - text-align: right; - background: ${cssManager.bdTheme('#ffffff', '#333333')};; - line-height: 50px; - border-radius: 3px; + background: ${colors.background.card}; + border: 1px solid ${colors.border.default}; + border-radius: ${unsafeCSS(borderRadius.md)}; + padding: ${unsafeCSS(spacing.md)}; + box-shadow: ${unsafeCSS(shadows.sm)}; } .mainbox .barContainer { position: relative; display: flex; - padding: 6px; + gap: 2px; + padding: ${unsafeCSS(spacing.sm)}; + background: ${colors.background.secondary}; + border-radius: ${unsafeCSS(borderRadius.base)}; overflow: hidden; } .mainbox .barContainer .bar { - margin: 4px; - width: 11px; - border-radius: 3px; - height: 40px; - background: #2deb51; + flex: 1; + height: 48px; + border-radius: ${unsafeCSS(borderRadius.sm)}; + cursor: pointer; + transition: all 0.2s ease; + position: relative; + opacity: 0.9; } + + .mainbox .barContainer .bar:hover { + opacity: 1; + transform: scaleY(1.05); + } + + .mainbox .barContainer .bar.operational { + background: ${colors.status.operational}; + } + + .mainbox .barContainer .bar.degraded { + background: ${colors.status.degraded}; + } + + .mainbox .barContainer .bar.partial_outage { + background: ${colors.status.partial}; + } + + .mainbox .barContainer .bar.major_outage { + background: ${colors.status.major}; + } + + .mainbox .barContainer .bar.maintenance { + background: ${colors.status.maintenance}; + } + + .mainbox .barContainer .bar.no-data { + background: ${colors.border.muted}; + opacity: 0.3; + } + .timeIndicator { position: absolute; - width: 11px; - height: 11px; - background: #FF9800; - top: 56px; - left: 400px; - transform: rotate(45deg); + width: 2px; + height: calc(100% - ${unsafeCSS(spacing.md)}); + background: ${colors.text.primary}; + top: ${unsafeCSS(spacing.sm)}; + transition: left 0.3s; + opacity: 0.5; + pointer-events: none; + } + + .time-labels { + display: flex; + justify-content: space-between; + padding: ${unsafeCSS(spacing.sm)} ${unsafeCSS(spacing.sm)} 0; + font-size: 12px; + color: ${colors.text.secondary}; + font-family: ${unsafeCSS(fonts.mono)}; + } + + .tooltip { + position: absolute; + background: ${cssManager.bdTheme('#1a1a1a', '#ffffff')}; + color: ${cssManager.bdTheme('#ffffff', '#1a1a1a')}; + padding: ${unsafeCSS(spacing.sm)} ${unsafeCSS(spacing.md)}; + border-radius: ${unsafeCSS(borderRadius.base)}; + font-size: 13px; + pointer-events: none; + opacity: 0; + transition: opacity 0.2s; + z-index: 10; + white-space: nowrap; + box-shadow: ${unsafeCSS(shadows.lg)}; + border: 1px solid ${colors.border.default}; + } + + .tooltip.visible { + opacity: 0.95; + } + + .tooltip strong { + font-weight: 600; + display: block; + margin-bottom: ${unsafeCSS(spacing.xs)}; + color: ${cssManager.bdTheme('#ffffff', '#1a1a1a')}; + } + + .tooltip div { + line-height: 1.4; + } + + .loading-skeleton { + display: flex; + padding: ${unsafeCSS(spacing.sm)}; + gap: 2px; + background: ${colors.background.secondary}; + border-radius: ${unsafeCSS(borderRadius.base)}; + } + + .loading-skeleton .skeleton-bar { + flex: 1; + height: 48px; + background: ${cssManager.bdTheme( + 'linear-gradient(90deg, #f3f4f6 25%, #e5e7eb 50%, #f3f4f6 75%)', + 'linear-gradient(90deg, #1f1f1f 25%, #262626 50%, #1f1f1f 75%)' + )}; + background-size: 200% 100%; + animation: loading 1.5s infinite; + border-radius: ${unsafeCSS(borderRadius.sm)}; + } + + @keyframes loading { + 0% { background-position: 200% 0; } + 100% { background-position: -200% 0; } + } + + .status-legend { + display: flex; + gap: ${unsafeCSS(spacing.lg)}; + justify-content: center; + margin-top: ${unsafeCSS(spacing.lg)}; + font-size: 13px; + flex-wrap: wrap; + } + + .legend-item { + display: flex; + align-items: center; + gap: ${unsafeCSS(spacing.xs)}; + } + + .legend-color { + width: 12px; + height: 12px; + border-radius: ${unsafeCSS(borderRadius.sm)}; + } + + @media (max-width: 640px) { + .container { + padding: 0 ${unsafeCSS(spacing.md)} ${unsafeCSS(spacing.md)} ${unsafeCSS(spacing.md)}; + } + + .mainbox { + padding: ${unsafeCSS(spacing.sm)}; + } + + .time-labels { + font-size: 11px; + } + + .status-legend { + gap: ${unsafeCSS(spacing.md)}; + font-size: 12px; + } } `, ]; public render(): TemplateResult { + const now = Date.now(); + const currentHour = new Date().getHours(); + const timeIndicatorPosition = this.calculateTimeIndicatorPosition(); + return html` - - Yesterday & Today + ${this.serviceName} - Last ${this.hoursToShow} Hours
-
- ${(() => { - let counter = 0; - const returnArray: TemplateResult[] = []; - while (counter < 48) { - counter++; - returnArray.push(html`
`); - } - return returnArray; - })()} -
-
+ ${this.loading ? html` +
+ ${Array(this.hoursToShow).fill(0).map(() => html`
`)} +
+ ` : html` +
+ ${this.renderBars()} +
+
+
+ ${this.getTimeLabel(0)} + ${this.getTimeLabel(Math.floor(this.hoursToShow / 4))} + ${this.getTimeLabel(Math.floor(this.hoursToShow / 2))} + ${this.getTimeLabel(Math.floor(this.hoursToShow * 3 / 4))} + Now +
+ `}
+ ${!this.loading ? html` +
+
+
+ Operational +
+
+
+ Degraded +
+
+
+ Partial Outage +
+
+
+ Major Outage +
+
+
+ Maintenance +
+
+ ` : ''} +
`; } + + private renderBars(): TemplateResult[] { + const bars: TemplateResult[] = []; + const now = Date.now(); + + for (let i = 0; i < this.hoursToShow; i++) { + const hourIndex = this.hoursToShow - 1 - i; + const timestamp = now - (hourIndex * 60 * 60 * 1000); + const dataPoint = this.findDataPointForTime(timestamp); + + const status = dataPoint?.status || 'no-data'; + const responseTime = dataPoint?.responseTime || 0; + + bars.push(html` +
this.showTooltip(e, timestamp, status, responseTime)} + @click=${() => this.handleBarClick(timestamp, status, responseTime)} + >
+ `); + } + + return bars; + } + + private findDataPointForTime(timestamp: number): IStatusHistoryPoint | undefined { + if (!this.historyData || this.historyData.length === 0) return undefined; + + // Find the closest data point within the same hour + const targetHour = new Date(timestamp).getHours(); + const targetDate = new Date(timestamp).toDateString(); + + return this.historyData.find(point => { + const pointDate = new Date(point.timestamp); + return pointDate.toDateString() === targetDate && + pointDate.getHours() === targetHour; + }); + } + + private calculateTimeIndicatorPosition(): number { + const containerWidth = 888; // Approximate width minus padding + const barWidth = 19; // Width + margin + const totalBars = this.hoursToShow; + const currentMinutes = new Date().getMinutes(); + const currentPosition = (totalBars - 1 + currentMinutes / 60) * barWidth + 6; + return Math.min(currentPosition, containerWidth - 11); + } + + private getTimeLabel(hoursAgo: number): string { + const date = new Date(Date.now() - (hoursAgo * 60 * 60 * 1000)); + if (hoursAgo >= 24) { + return `${date.getMonth() + 1}/${date.getDate()} ${date.getHours()}:00`; + } + return `${date.getHours()}:00`; + } + + private showTooltip(event: MouseEvent, timestamp: number, status: string, responseTime: number) { + const tooltip = this.shadowRoot?.getElementById('tooltip') as HTMLElement; + if (!tooltip) return; + + const date = new Date(timestamp); + const timeStr = date.toLocaleString(); + const statusStr = status.replace(/_/g, ' ').replace('no-data', 'No Data'); + + tooltip.innerHTML = ` +
${timeStr}
+
Status: ${statusStr}
+ ${responseTime > 0 ? `
Response Time: ${responseTime.toFixed(0)}ms
` : ''} + `; + + const rect = (event.target as HTMLElement).getBoundingClientRect(); + const containerRect = this.getBoundingClientRect(); + + tooltip.style.left = `${rect.left - containerRect.left + rect.width / 2}px`; + tooltip.style.top = `${rect.top - containerRect.top - 60}px`; + tooltip.style.transform = 'translateX(-50%)'; + tooltip.classList.add('visible'); + } + + private hideTooltip() { + const tooltip = this.shadowRoot?.getElementById('tooltip') as HTMLElement; + if (tooltip) { + tooltip.classList.remove('visible'); + } + } + + private handleBarClick(timestamp: number, status: string, responseTime: number) { + this.dispatchEvent(new CustomEvent('barClick', { + detail: { timestamp, status, responseTime, serviceId: this.serviceId }, + bubbles: true, + composed: true + })); + } } diff --git a/ts_web/elements/upl-statuspage-statusmonth.demo.ts b/ts_web/elements/upl-statuspage-statusmonth.demo.ts new file mode 100644 index 0000000..9cee67b --- /dev/null +++ b/ts_web/elements/upl-statuspage-statusmonth.demo.ts @@ -0,0 +1,876 @@ +import { html } from '@design.estate/dees-element'; +import type { IMonthlyUptime, IUptimeDay } from '../interfaces/index.js'; + +export const demoFunc = () => html` + + +
+ +
+
Different Month Patterns
+ { + const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth') as any; + + // Pattern generators + const generateMonthPattern = (monthCount: number, pattern: 'perfect' | 'problematic' | 'improving' | 'degrading' | 'seasonal'): IMonthlyUptime[] => { + const months: IMonthlyUptime[] = []; + const now = new Date(); + + for (let monthOffset = monthCount - 1; monthOffset >= 0; monthOffset--) { + const monthDate = new Date(now.getFullYear(), now.getMonth() - monthOffset, 1); + const year = monthDate.getFullYear(); + const month = monthDate.getMonth(); + const monthKey = `${year}-${String(month + 1).padStart(2, '0')}`; + const daysInMonth = new Date(year, month + 1, 0).getDate(); + + const days: IUptimeDay[] = []; + let totalIncidents = 0; + let totalUptimeMinutes = 0; + + for (let day = 1; day <= daysInMonth; day++) { + let uptime = 100; + let incidents = 0; + let downtime = 0; + let status: IUptimeDay['status'] = 'operational'; + + switch (pattern) { + case 'perfect': + // Near perfect uptime + if (Math.random() < 0.02) { + uptime = 99.9 + Math.random() * 0.099; + status = 'degraded'; + } + break; + + case 'problematic': + // Frequent issues + const problemRand = Math.random(); + if (problemRand < 0.1) { + uptime = 70 + Math.random() * 20; + incidents = 2 + Math.floor(Math.random() * 3); + status = 'major_outage'; + } else if (problemRand < 0.25) { + uptime = 90 + Math.random() * 8; + incidents = 1 + Math.floor(Math.random() * 2); + status = 'partial_outage'; + } else if (problemRand < 0.4) { + uptime = 98 + Math.random() * 1.5; + incidents = 1; + status = 'degraded'; + } + break; + + case 'improving': + // Getting better over time + const improvementFactor = (monthCount - monthOffset) / monthCount; + const improveRand = Math.random(); + if (improveRand < 0.3 * (1 - improvementFactor)) { + uptime = 85 + Math.random() * 10 + (improvementFactor * 10); + incidents = Math.max(0, 3 - Math.floor(improvementFactor * 3)); + status = improvementFactor > 0.7 ? 'degraded' : 'partial_outage'; + } + break; + + case 'degrading': + // Getting worse over time + const degradationFactor = monthOffset / monthCount; + const degradeRand = Math.random(); + if (degradeRand < 0.3 * (1 - degradationFactor)) { + uptime = 85 + Math.random() * 10 + (degradationFactor * 10); + incidents = Math.max(0, 3 - Math.floor(degradationFactor * 3)); + status = degradationFactor > 0.7 ? 'degraded' : 'major_outage'; + } + break; + + case 'seasonal': + // Worse during certain months (simulating high traffic periods) + const monthNum = month; + if (monthNum === 11 || monthNum === 0) { // December, January + if (Math.random() < 0.3) { + uptime = 92 + Math.random() * 6; + incidents = 1 + Math.floor(Math.random() * 2); + status = 'degraded'; + } + } else if (monthNum === 6 || monthNum === 7) { // July, August + if (Math.random() < 0.2) { + uptime = 94 + Math.random() * 5; + incidents = 1; + status = 'degraded'; + } + } + break; + } + + downtime = Math.floor((100 - uptime) * 14.4); + totalIncidents += incidents; + totalUptimeMinutes += uptime * 14.4; + + days.push({ + date: `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`, + uptime, + incidents, + totalDowntime: downtime, + status + }); + } + + const overallUptime = totalUptimeMinutes / (daysInMonth * 1440) * 100; + + months.push({ + month: monthKey, + days, + overallUptime, + totalIncidents + }); + } + + return months; + }; + + // Initial setup + statusMonth.serviceId = 'production-api'; + statusMonth.serviceName = 'Production API'; + statusMonth.monthlyData = generateMonthPattern(6, 'perfect'); + + // Create pattern controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + + const patterns = [ + { key: 'perfect', label: 'Perfect Uptime' }, + { key: 'problematic', label: 'Problematic' }, + { key: 'improving', label: 'Improving Trend' }, + { key: 'degrading', label: 'Degrading Trend' }, + { key: 'seasonal', label: 'Seasonal Pattern' } + ]; + + patterns.forEach((pattern, index) => { + const button = document.createElement('button'); + button.className = 'demo-button' + (index === 0 ? ' active' : ''); + button.textContent = pattern.label; + button.onclick = () => { + controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active')); + button.classList.add('active'); + + statusMonth.loading = true; + setTimeout(() => { + statusMonth.monthlyData = generateMonthPattern(6, pattern.key as any); + statusMonth.loading = false; + updateStats(); + }, 500); + }; + controls.appendChild(button); + }); + + wrapperElement.appendChild(controls); + + // Add statistics display + const statsDiv = document.createElement('div'); + statsDiv.className = 'stats-display'; + wrapperElement.appendChild(statsDiv); + + const updateStats = () => { + const data = statusMonth.monthlyData || []; + const avgUptime = data.reduce((sum, month) => sum + month.overallUptime, 0) / data.length; + const totalIncidents = data.reduce((sum, month) => sum + month.totalIncidents, 0); + const worstMonth = data.reduce((worst, month) => + month.overallUptime < worst.overallUptime ? month : worst, data[0]); + + statsDiv.innerHTML = ` +
+
${avgUptime.toFixed(3)}%
+
Avg Uptime
+
+
+
${totalIncidents}
+
Total Incidents
+
+
+
${data.length}
+
Months
+
+
+
${worstMonth ? worstMonth.overallUptime.toFixed(2) : '100'}%
+
Worst Month
+
+ `; + }; + + updateStats(); + + // Handle day clicks + statusMonth.addEventListener('dayClick', (event: CustomEvent) => { + const { date, uptime, incidents, status, totalDowntime } = event.detail; + alert(`Day Details for ${date}:\n\nUptime: ${uptime.toFixed(3)}%\nIncidents: ${incidents}\nStatus: ${status}\nDowntime: ${totalDowntime} minutes`); + }); + }} + > + +
+
+ + +
+
Different Time Spans
+ { + const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth') as any; + + // Generate data for different time spans + const generateTimeSpanData = (months: number): IMonthlyUptime[] => { + const data: IMonthlyUptime[] = []; + const now = new Date(); + + for (let monthOffset = months - 1; monthOffset >= 0; monthOffset--) { + const monthDate = new Date(now.getFullYear(), now.getMonth() - monthOffset, 1); + const year = monthDate.getFullYear(); + const month = monthDate.getMonth(); + const monthKey = `${year}-${String(month + 1).padStart(2, '0')}`; + const daysInMonth = new Date(year, month + 1, 0).getDate(); + + const days: IUptimeDay[] = []; + let totalIncidents = 0; + let totalUptimeMinutes = 0; + + for (let day = 1; day <= daysInMonth; day++) { + // Create realistic patterns + let uptime = 99.9 + Math.random() * 0.099; + let incidents = 0; + let status: IUptimeDay['status'] = 'operational'; + + if (Math.random() < 0.05) { + uptime = 95 + Math.random() * 4.9; + incidents = 1; + status = 'degraded'; + } else if (Math.random() < 0.01) { + uptime = 85 + Math.random() * 10; + incidents = 2; + status = 'partial_outage'; + } + + const downtime = Math.floor((100 - uptime) * 14.4); + totalIncidents += incidents; + totalUptimeMinutes += uptime * 14.4; + + days.push({ + date: `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`, + uptime, + incidents, + totalDowntime: downtime, + status + }); + } + + const overallUptime = totalUptimeMinutes / (daysInMonth * 1440) * 100; + + data.push({ + month: monthKey, + days, + overallUptime, + totalIncidents + }); + } + + return data; + }; + + // Initial setup + statusMonth.serviceId = 'multi-region-lb'; + statusMonth.serviceName = 'Multi-Region Load Balancer'; + statusMonth.monthlyData = generateTimeSpanData(3); + + // Create time span controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + + const timeSpans = [ + { months: 3, label: 'Last 3 Months' }, + { months: 6, label: 'Last 6 Months' }, + { months: 12, label: 'Last 12 Months' }, + { months: 24, label: 'Last 24 Months' } + ]; + + timeSpans.forEach((span, index) => { + const button = document.createElement('button'); + button.className = 'demo-button' + (index === 0 ? ' active' : ''); + button.textContent = span.label; + button.onclick = () => { + controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active')); + button.classList.add('active'); + + statusMonth.loading = true; + setTimeout(() => { + statusMonth.monthlyData = generateTimeSpanData(span.months); + statusMonth.loading = false; + }, 500); + }; + controls.appendChild(button); + }); + + wrapperElement.appendChild(controls); + + // Add info display + const info = document.createElement('div'); + info.className = 'demo-info'; + info.innerHTML = 'Click on different time spans to see historical uptime data. The component automatically adjusts the display based on the number of months.'; + wrapperElement.appendChild(info); + }} + > + + +
+ + +
+
Current Month with Real-time Updates
+ { + const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth') as any; + + // Generate current month data + const generateCurrentMonthData = (): IMonthlyUptime[] => { + const now = new Date(); + const year = now.getFullYear(); + const month = now.getMonth(); + const today = now.getDate(); + const monthKey = `${year}-${String(month + 1).padStart(2, '0')}`; + const daysInMonth = new Date(year, month + 1, 0).getDate(); + + const days: IUptimeDay[] = []; + let totalIncidents = 0; + let totalUptimeMinutes = 0; + + // Generate data only up to today + for (let day = 1; day <= today; day++) { + let uptime = 99.9 + Math.random() * 0.099; + let incidents = 0; + let status: IUptimeDay['status'] = 'operational'; + + // Today might have ongoing issues + if (day === today) { + if (Math.random() < 0.3) { + uptime = 95 + Math.random() * 4; + incidents = 1; + status = 'degraded'; + } + } else if (Math.random() < 0.05) { + uptime = 97 + Math.random() * 2.9; + incidents = 1; + status = 'degraded'; + } + + const downtime = Math.floor((100 - uptime) * 14.4); + totalIncidents += incidents; + totalUptimeMinutes += uptime * 14.4; + + days.push({ + date: `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`, + uptime, + incidents, + totalDowntime: downtime, + status + }); + } + + // Fill remaining days with placeholder + for (let day = today + 1; day <= daysInMonth; day++) { + days.push({ + date: `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`, + uptime: 0, + incidents: 0, + totalDowntime: 0, + status: 'operational' + }); + } + + const overallUptime = today > 0 ? totalUptimeMinutes / (today * 1440) * 100 : 100; + + return [{ + month: monthKey, + days, + overallUptime, + totalIncidents + }]; + }; + + // Initial setup + statusMonth.serviceId = 'realtime-monitor'; + statusMonth.serviceName = 'Real-time Monitoring Service'; + statusMonth.monthlyData = generateCurrentMonthData(); + statusMonth.showCurrentDay = true; + + // Update today's status periodically + const updateInterval = setInterval(() => { + const data = statusMonth.monthlyData; + if (data && data.length > 0) { + const currentMonth = data[0]; + const today = new Date().getDate() - 1; + + if (currentMonth.days[today]) { + // Simulate status changes + const rand = Math.random(); + if (rand < 0.1) { + currentMonth.days[today].uptime = 95 + Math.random() * 4.9; + currentMonth.days[today].incidents = (currentMonth.days[today].incidents || 0) + 1; + currentMonth.days[today].status = 'degraded'; + currentMonth.days[today].totalDowntime = Math.floor((100 - currentMonth.days[today].uptime) * 14.4); + + // Recalculate overall uptime + let totalUptime = 0; + let validDays = 0; + currentMonth.days.forEach((day, index) => { + if (index <= today && day.uptime > 0) { + totalUptime += day.uptime; + validDays++; + } + }); + currentMonth.overallUptime = validDays > 0 ? totalUptime / validDays : 100; + currentMonth.totalIncidents = currentMonth.days.reduce((sum, day) => sum + (day.incidents || 0), 0); + + statusMonth.requestUpdate(); + logUpdate('Status degraded - Uptime: ' + currentMonth.days[today].uptime.toFixed(2) + '%'); + } else if (rand < 0.05 && currentMonth.days[today].status !== 'operational') { + // Recover from issues + currentMonth.days[today].uptime = 99.9 + Math.random() * 0.099; + currentMonth.days[today].status = 'operational'; + currentMonth.days[today].totalDowntime = Math.floor((100 - currentMonth.days[today].uptime) * 14.4); + + statusMonth.requestUpdate(); + logUpdate('Service recovered to operational status'); + } + } + } + }, 3000); + + // Create controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = '' + + '' + + ''; + wrapperElement.appendChild(controls); + + controls.querySelector('#simulateOutage')?.addEventListener('click', () => { + const data = statusMonth.monthlyData; + if (data && data.length > 0) { + const today = new Date().getDate() - 1; + data[0].days[today].uptime = 85 + Math.random() * 10; + data[0].days[today].incidents = (data[0].days[today].incidents || 0) + 1; + data[0].days[today].status = 'major_outage'; + data[0].days[today].totalDowntime = Math.floor((100 - data[0].days[today].uptime) * 14.4); + statusMonth.requestUpdate(); + logUpdate('Major outage simulated'); + } + }); + + controls.querySelector('#simulateRecovery')?.addEventListener('click', () => { + const data = statusMonth.monthlyData; + if (data && data.length > 0) { + const today = new Date().getDate() - 1; + data[0].days[today].uptime = 99.95; + data[0].days[today].status = 'operational'; + data[0].days[today].totalDowntime = Math.floor((100 - data[0].days[today].uptime) * 14.4); + statusMonth.requestUpdate(); + logUpdate('Service recovered'); + } + }); + + controls.querySelector('#refreshData')?.addEventListener('click', () => { + statusMonth.monthlyData = generateCurrentMonthData(); + logUpdate('Data refreshed'); + }); + + // Add update log + const logDiv = document.createElement('div'); + logDiv.className = 'demo-info'; + logDiv.style.maxHeight = '100px'; + logDiv.style.overflowY = 'auto'; + logDiv.innerHTML = 'Update Log:
'; + wrapperElement.appendChild(logDiv); + + const logUpdate = (message: string) => { + const time = new Date().toLocaleTimeString(); + logDiv.innerHTML += '[' + time + '] ' + message + '
'; + logDiv.scrollTop = logDiv.scrollHeight; + }; + + // Cleanup + wrapperElement.addEventListener('remove', () => { + clearInterval(updateInterval); + }); + }} + > + +
+
+ + +
+
Edge Cases and Special Scenarios
+ { + const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth') as any; + + const scenarios = { + noData: { + name: 'No Data', + data: [] + }, + singleMonth: { + name: 'Single Month', + data: [{ + month: '2024-01', + days: Array.from({ length: 31 }, (_, i) => ({ + date: `2024-01-${String(i + 1).padStart(2, '0')}`, + uptime: 99.9 + Math.random() * 0.099, + incidents: 0, + totalDowntime: 0, + status: 'operational' as const + })), + overallUptime: 99.95, + totalIncidents: 0 + }] + }, + allDown: { + name: 'Complete Outage Month', + data: [{ + month: '2024-01', + days: Array.from({ length: 31 }, (_, i) => ({ + date: `2024-01-${String(i + 1).padStart(2, '0')}`, + uptime: 0, + incidents: 5, + totalDowntime: 1440, + status: 'major_outage' as const + })), + overallUptime: 0, + totalIncidents: 155 + }] + }, + maintenanceMonth: { + name: 'Maintenance Heavy Month', + data: [{ + month: '2024-01', + days: Array.from({ length: 31 }, (_, i) => { + // Maintenance every weekend + const dayOfWeek = new Date(2024, 0, i + 1).getDay(); + if (dayOfWeek === 0 || dayOfWeek === 6) { + return { + date: `2024-01-${String(i + 1).padStart(2, '0')}`, + uptime: 95, + incidents: 0, + totalDowntime: 72, + status: 'maintenance' as const + }; + } + return { + date: `2024-01-${String(i + 1).padStart(2, '0')}`, + uptime: 99.95, + incidents: 0, + totalDowntime: 0.7, + status: 'operational' as const + }; + }), + overallUptime: 98.2, + totalIncidents: 0 + }] + }, + mixedYear: { + name: 'Full Year Mixed', + data: Array.from({ length: 12 }, (_, monthIndex) => { + const year = 2023; + const month = monthIndex; + const daysInMonth = new Date(year, month + 1, 0).getDate(); + + // Different pattern each quarter + let monthPattern = 'operational'; + if (monthIndex < 3) monthPattern = 'degraded'; + else if (monthIndex < 6) monthPattern = 'improving'; + else if (monthIndex < 9) monthPattern = 'stable'; + else monthPattern = 'volatile'; + + const days = Array.from({ length: daysInMonth }, (_, dayIndex) => { + let uptime = 99.9; + let status: IUptimeDay['status'] = 'operational'; + let incidents = 0; + + if (monthPattern === 'degraded' && Math.random() < 0.3) { + uptime = 85 + Math.random() * 10; + status = 'degraded'; + incidents = 1; + } else if (monthPattern === 'volatile' && Math.random() < 0.2) { + uptime = 90 + Math.random() * 9; + status = Math.random() < 0.5 ? 'partial_outage' : 'degraded'; + incidents = Math.floor(Math.random() * 3) + 1; + } + + return { + date: `${year}-${String(month + 1).padStart(2, '0')}-${String(dayIndex + 1).padStart(2, '0')}`, + uptime, + incidents, + totalDowntime: Math.floor((100 - uptime) * 14.4), + status + }; + }); + + const totalIncidents = days.reduce((sum, day) => sum + day.incidents, 0); + const overallUptime = days.reduce((sum, day) => sum + day.uptime, 0) / days.length; + + return { + month: `${year}-${String(month + 1).padStart(2, '0')}`, + days, + overallUptime, + totalIncidents + }; + }) + } + }; + + // Initial setup + let currentScenario = 'singleMonth'; + statusMonth.serviceId = 'edge-case-service'; + statusMonth.serviceName = 'Edge Case Service'; + statusMonth.monthlyData = scenarios[currentScenario].data; + + // Create scenario controls + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + + Object.entries(scenarios).forEach(([key, scenario]) => { + const button = document.createElement('button'); + button.className = 'demo-button' + (key === currentScenario ? ' active' : ''); + button.textContent = scenario.name; + button.onclick = () => { + controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active')); + button.classList.add('active'); + + currentScenario = key; + statusMonth.loading = true; + setTimeout(() => { + statusMonth.monthlyData = scenario.data; + statusMonth.loading = false; + }, 300); + }; + controls.appendChild(button); + }); + + wrapperElement.appendChild(controls); + }} + > + + +
+ + +
+
Loading and Navigation Features
+ { + const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth') as any; + + // Start with loading + statusMonth.loading = true; + statusMonth.serviceId = 'navigation-demo'; + statusMonth.serviceName = 'Navigation Demo Service'; + + const controls = document.createElement('div'); + controls.className = 'demo-controls'; + controls.innerHTML = '' + + '' + + '' + + ''; + wrapperElement.appendChild(controls); + + controls.querySelector('#toggleLoading')?.addEventListener('click', () => { + statusMonth.loading = !statusMonth.loading; + }); + + controls.querySelector('#loadSuccess')?.addEventListener('click', () => { + statusMonth.loading = true; + setTimeout(() => { + const months = 6; + const data: IMonthlyUptime[] = []; + const now = new Date(); + + for (let i = months - 1; i >= 0; i--) { + const monthDate = new Date(now.getFullYear(), now.getMonth() - i, 1); + const year = monthDate.getFullYear(); + const month = monthDate.getMonth(); + const daysInMonth = new Date(year, month + 1, 0).getDate(); + + data.push({ + month: `${year}-${String(month + 1).padStart(2, '0')}`, + days: Array.from({ length: daysInMonth }, (_, d) => ({ + date: `${year}-${String(month + 1).padStart(2, '0')}-${String(d + 1).padStart(2, '0')}`, + uptime: 99 + Math.random(), + incidents: Math.random() < 0.05 ? 1 : 0, + totalDowntime: Math.random() < 0.05 ? Math.floor(Math.random() * 60) : 0, + status: Math.random() < 0.05 ? 'degraded' : 'operational' + })), + overallUptime: 99.5 + Math.random() * 0.4, + totalIncidents: Math.floor(Math.random() * 5) + }); + } + + statusMonth.monthlyData = data; + statusMonth.loading = false; + }, 1000); + }); + + controls.querySelector('#loadError')?.addEventListener('click', () => { + statusMonth.loading = true; + setTimeout(() => { + statusMonth.loading = false; + statusMonth.monthlyData = []; + statusMonth.errorMessage = 'Failed to load monthly uptime data'; + }, 1500); + }); + + controls.querySelector('#toggleTooltip')?.addEventListener('click', () => { + statusMonth.showTooltip = !statusMonth.showTooltip; + const btn = controls.querySelector('#toggleTooltip'); + if (btn) btn.textContent = 'Toggle Tooltip (' + (statusMonth.showTooltip ? 'ON' : 'OFF') + ')'; + }); + + // Month navigation + const navDiv = document.createElement('div'); + navDiv.className = 'month-nav'; + navDiv.innerHTML = '' + + 'Loading...' + + ''; + wrapperElement.appendChild(navDiv); + + let currentMonthIndex = 0; + const updateNavigation = () => { + const data = statusMonth.monthlyData || []; + if (data.length > 0 && currentMonthIndex < data.length) { + const month = data[currentMonthIndex]; + const currentMonthEl = navDiv.querySelector('#currentMonth'); + if (currentMonthEl) currentMonthEl.textContent = month.month; + const prevBtn = navDiv.querySelector('#prevMonth') as HTMLButtonElement; + const nextBtn = navDiv.querySelector('#nextMonth') as HTMLButtonElement; + if (prevBtn) prevBtn.disabled = currentMonthIndex === 0; + if (nextBtn) nextBtn.disabled = currentMonthIndex === data.length - 1; + } + }; + + navDiv.querySelector('#prevMonth')?.addEventListener('click', () => { + if (currentMonthIndex > 0) { + currentMonthIndex--; + updateNavigation(); + // Highlight the month somehow + statusMonth.highlightMonth = statusMonth.monthlyData[currentMonthIndex].month; + } + }); + + navDiv.querySelector('#nextMonth')?.addEventListener('click', () => { + if (currentMonthIndex < (statusMonth.monthlyData?.length || 0) - 1) { + currentMonthIndex++; + updateNavigation(); + statusMonth.highlightMonth = statusMonth.monthlyData[currentMonthIndex].month; + } + }); + + // Initial load + setTimeout(() => { + const data = Array.from({ length: 3 }, (_, i) => ({ + month: `2024-${String(i + 1).padStart(2, '0')}`, + days: Array.from({ length: 31 }, (_, d) => ({ + date: `2024-${String(i + 1).padStart(2, '0')}-${String(d + 1).padStart(2, '0')}`, + uptime: 99.5 + Math.random() * 0.5, + incidents: 0, + totalDowntime: 0, + status: 'operational' as const + })), + overallUptime: 99.7 + Math.random() * 0.3, + totalIncidents: Math.floor(Math.random() * 3) + })); + + statusMonth.monthlyData = data; + statusMonth.loading = false; + statusMonth.showTooltip = true; + updateNavigation(); + }, 1000); + }} + > + + +
+
+`; \ No newline at end of file diff --git a/ts_web/elements/upl-statuspage-statusmonth.ts b/ts_web/elements/upl-statuspage-statusmonth.ts index 207d8f8..d17b20a 100644 --- a/ts_web/elements/upl-statuspage-statusmonth.ts +++ b/ts_web/elements/upl-statuspage-statusmonth.ts @@ -5,11 +5,15 @@ import { customElement, type TemplateResult, css, - cssManager + cssManager, + unsafeCSS } from '@design.estate/dees-element'; import * as domtools from '@design.estate/dees-domtools'; +import type { IMonthlyUptime } from '../interfaces/index.js'; +import { fonts, colors, shadows, borderRadius, spacing, commonStyles } from '../styles/shared.styles.js'; import './internal/uplinternal-miniheading.js'; +import { demoFunc } from './upl-statuspage-statusmonth.demo.js'; declare global { interface HTMLElementTagNameMap { @@ -19,7 +23,25 @@ declare global { @customElement('upl-statuspage-statusmonth') export class UplStatuspageStatusmonth extends DeesElement { - public static demo = () => html` `; + public static demo = demoFunc; + + @property({ type: Array }) + public monthlyData: IMonthlyUptime[] = []; + + @property({ type: String }) + public serviceId: string = ''; + + @property({ type: String }) + public serviceName: string = 'Service'; + + @property({ type: Boolean }) + public loading: boolean = false; + + @property({ type: Boolean }) + public showTooltip: boolean = true; + + @property({ type: Number }) + public monthsToShow: number = 5; constructor() { super(); @@ -27,104 +49,310 @@ export class UplStatuspageStatusmonth extends DeesElement { public static styles = [ domtools.elementBasic.staticStyles, + commonStyles, css` :host { position: relative; - padding: 0px 0px 15px 0px; display: block; - background: ${cssManager.bdTheme('#eeeeeb', '#222222')};; - font-family: Inter; - color: #fff; + background: transparent; + font-family: ${unsafeCSS(fonts.base)}; + color: ${colors.text.primary}; + } + + .container { + max-width: 1200px; + margin: 0 auto; + padding: 0 ${unsafeCSS(spacing.lg)} ${unsafeCSS(spacing.lg)} ${unsafeCSS(spacing.lg)}; } .mainbox { - margin: auto; - max-width: 900px; display: grid; - grid-template-columns: repeat(5, calc(100% / 5 - 80px / 5)); - grid-column-gap: 20px; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: ${unsafeCSS(spacing.lg)}; } .statusMonth { - background: ${cssManager.bdTheme('#ffffff', '#333333')};; - min-height: 20px; - display: grid; - padding: 10px; - grid-template-columns: repeat(6, auto); - grid-gap: 9px; - border-radius: 3px; + background: ${colors.background.card}; + padding: ${unsafeCSS(spacing.lg)}; + border-radius: ${unsafeCSS(borderRadius.md)}; + border: 1px solid ${colors.border.default}; + box-shadow: ${unsafeCSS(shadows.sm)}; + position: relative; } - .statusMonth .statusDay { - width: 16px; - height: 16px; - background: #2deb51; - border-radius: 3px; + .month-header { + font-size: 14px; + font-weight: 600; + margin-bottom: ${unsafeCSS(spacing.md)}; + text-align: center; + color: ${colors.text.primary}; + letter-spacing: 0.02em; + } + + .days-grid { + display: grid; + grid-template-columns: repeat(7, 1fr); + gap: 3px; + } + + .weekday-label { + font-size: 12px; + text-align: center; + color: ${colors.text.secondary}; + font-weight: 500; + height: 20px; + line-height: 20px; + margin-bottom: ${unsafeCSS(spacing.xs)}; + } + + .statusDay { + aspect-ratio: 1; + border-radius: ${unsafeCSS(borderRadius.sm)}; + cursor: pointer; + transition: all 0.2s ease; + position: relative; + } + + .statusDay:hover { + transform: scale(1.15); + box-shadow: ${unsafeCSS(shadows.md)}; + z-index: 1; + } + + .statusDay.operational { + background: ${colors.status.operational}; + } + + .statusDay.degraded { + background: ${colors.status.degraded}; + } + + .statusDay.partial_outage { + background: ${colors.status.partial}; + } + + .statusDay.major_outage { + background: ${colors.status.major}; + } + + .statusDay.no-data { + background: ${colors.border.muted}; + opacity: 0.3; + } + + .statusDay.empty { + background: transparent; + cursor: default; + } + + .statusDay.empty:hover { + transform: none; + box-shadow: none; + } + + .overall-uptime { + text-align: center; + font-size: 13px; + margin-top: ${unsafeCSS(spacing.md)}; + color: ${colors.text.secondary}; + line-height: 1.4; + } + + .loading-skeleton { + height: 280px; + background: ${cssManager.bdTheme( + 'linear-gradient(90deg, #f3f4f6 25%, #e5e7eb 50%, #f3f4f6 75%)', + 'linear-gradient(90deg, #1f1f1f 25%, #262626 50%, #1f1f1f 75%)' + )}; + background-size: 200% 100%; + animation: loading 1.5s infinite; + border-radius: ${unsafeCSS(borderRadius.md)}; + } + + @keyframes loading { + 0% { background-position: 200% 0; } + 100% { background-position: -200% 0; } + } + + .tooltip { + position: absolute; + background: ${cssManager.bdTheme('#1a1a1a', '#ffffff')}; + color: ${cssManager.bdTheme('#ffffff', '#1a1a1a')}; + padding: ${unsafeCSS(spacing.sm)} ${unsafeCSS(spacing.md)}; + border-radius: ${unsafeCSS(borderRadius.base)}; + font-size: 12px; + pointer-events: none; + opacity: 0; + transition: opacity 0.2s; + z-index: 10; + white-space: nowrap; + box-shadow: ${unsafeCSS(shadows.lg)}; + border: 1px solid ${colors.border.default}; + } + + .tooltip.visible { + opacity: 0.95; + } + + .tooltip strong { + font-weight: 600; + display: block; + margin-bottom: ${unsafeCSS(spacing.xs)}; + color: ${cssManager.bdTheme('#ffffff', '#1a1a1a')}; + } + + .no-data-message { + grid-column: 1 / -1; + text-align: center; + padding: ${unsafeCSS(spacing['2xl'])}; + color: ${colors.text.secondary}; + } + + @media (max-width: 640px) { + .container { + padding: 0 ${unsafeCSS(spacing.md)} ${unsafeCSS(spacing.md)} ${unsafeCSS(spacing.md)}; + } + + .mainbox { + grid-template-columns: 1fr; + gap: ${unsafeCSS(spacing.md)}; + } + + .statusMonth { + padding: ${unsafeCSS(spacing.md)}; + } } ` ] public render(): TemplateResult { + const totalDays = this.monthlyData.reduce((sum, month) => sum + month.days.length, 0); + return html` - - Last 150 days -
-
- ${(() => { - let counter = 0; - const returnArray: TemplateResult[] = []; - while (counter < 30) { - counter++; - returnArray.push(html`
`); - } - return returnArray; - })()} +
+ ${this.serviceName} - Last ${totalDays} Days +
+ ${this.loading ? html` + ${Array(this.monthsToShow).fill(0).map(() => html` +
+
+
+ `)} + ` : this.monthlyData.length === 0 ? html` +
No uptime data available
+ ` : this.monthlyData.map(month => this.renderMonth(month))}
-
- ${(() => { - let counter = 0; - const returnArray: TemplateResult[] = []; - while (counter < 30) { - counter++; - returnArray.push(html`
`); - } - return returnArray; - })()} + ${this.showTooltip ? html`
` : ''} +
+ `; + } + + private renderMonth(monthData: IMonthlyUptime): TemplateResult { + const monthDate = new Date(monthData.month + '-01'); + const monthName = monthDate.toLocaleDateString('en-US', { month: 'short', year: 'numeric' }); + const firstDayOfWeek = new Date(monthDate.getFullYear(), monthDate.getMonth(), 1).getDay(); + + return html` +
+
${monthName}
+
+ ${this.renderWeekdayLabels()} + ${this.renderEmptyDays(firstDayOfWeek)} + ${monthData.days.map(day => this.renderDay(day))}
-
- ${(() => { - let counter = 0; - const returnArray: TemplateResult[] = []; - while (counter < 30) { - counter++; - returnArray.push(html`
`); - } - return returnArray; - })()} -
-
- ${(() => { - let counter = 0; - const returnArray: TemplateResult[] = []; - while (counter < 30) { - counter++; - returnArray.push(html`
`); - } - return returnArray; - })()} -
-
- ${(() => { - let counter = 0; - const returnArray: TemplateResult[] = []; - while (counter < 30) { - counter++; - returnArray.push(html`
`); - } - return returnArray; - })()} +
+ ${monthData.overallUptime.toFixed(2)}% uptime + ${monthData.totalIncidents > 0 ? html`
${monthData.totalIncidents} incidents` : ''}
`; } + + private renderWeekdayLabels(): TemplateResult[] { + const weekdays = ['S', 'M', 'T', 'W', 'T', 'F', 'S']; + return weekdays.map(day => html`
${day}
`); + } + + private renderEmptyDays(count: number): TemplateResult[] { + return Array(count).fill(0).map(() => html`
`); + } + + private renderDay(day: any): TemplateResult { + const status = day.status || 'no-data'; + const date = new Date(day.date); + const dayNumber = date.getDate(); + + return html` +
this.showTooltip && this.showDayTooltip(e, day)} + @click=${() => this.handleDayClick(day)} + > + ${status === 'major_outage' || status === 'partial_outage' ? html` +
${day.incidents}
+ ` : ''} +
+ `; + } + + private showDayTooltip(event: MouseEvent, day: any) { + const tooltip = this.shadowRoot?.getElementById('tooltip') as HTMLElement; + if (!tooltip) return; + + const date = new Date(day.date); + const dateStr = date.toLocaleDateString('en-US', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric' + }); + + let statusText = day.status.replace(/_/g, ' '); + statusText = statusText.charAt(0).toUpperCase() + statusText.slice(1); + + tooltip.innerHTML = ` +
${dateStr}
+
Status: ${statusText}
+
Uptime: ${day.uptime.toFixed(2)}%
+ ${day.incidents > 0 ? `
Incidents: ${day.incidents}
` : ''} + ${day.totalDowntime > 0 ? `
Downtime: ${day.totalDowntime} minutes
` : ''} + `; + + const rect = (event.target as HTMLElement).getBoundingClientRect(); + const containerRect = this.getBoundingClientRect(); + + tooltip.style.left = `${rect.left - containerRect.left + rect.width / 2}px`; + tooltip.style.top = `${rect.top - containerRect.top - 80}px`; + tooltip.style.transform = 'translateX(-50%)'; + tooltip.classList.add('visible'); + } + + private hideTooltip() { + const tooltip = this.shadowRoot?.getElementById('tooltip') as HTMLElement; + if (tooltip) { + tooltip.classList.remove('visible'); + } + } + + private handleDayClick(day: any) { + this.dispatchEvent(new CustomEvent('dayClick', { + detail: { + date: day.date, + uptime: day.uptime, + incidents: day.incidents, + status: day.status, + serviceId: this.serviceId + }, + bubbles: true, + composed: true + })); + } } diff --git a/ts_web/interfaces/index.ts b/ts_web/interfaces/index.ts new file mode 100644 index 0000000..e1c2bb4 --- /dev/null +++ b/ts_web/interfaces/index.ts @@ -0,0 +1,95 @@ +export interface IServiceStatus { + id: string; + name: string; + displayName: string; + description?: string; + currentStatus: 'operational' | 'degraded' | 'partial_outage' | 'major_outage' | 'maintenance'; + lastChecked: number; // timestamp + uptime30d: number; // percentage + uptime90d: number; // percentage + responseTime: number; // milliseconds + category?: string; + dependencies?: string[]; + selected?: boolean; +} + +export interface IStatusHistoryPoint { + timestamp: number; + status: 'operational' | 'degraded' | 'partial_outage' | 'major_outage' | 'maintenance'; + responseTime?: number; + errorRate?: number; +} + +export interface IIncidentUpdate { + id: string; + timestamp: number; + status: 'investigating' | 'identified' | 'monitoring' | 'resolved' | 'postmortem'; + message: string; + author?: string; +} + +export interface IIncidentDetails { + id: string; + title: string; + status: 'investigating' | 'identified' | 'monitoring' | 'resolved' | 'postmortem'; + severity: 'critical' | 'major' | 'minor' | 'maintenance'; + affectedServices: string[]; + startTime: number; + endTime?: number; + updates: IIncidentUpdate[]; + impact: string; + rootCause?: string; + resolution?: string; +} + +export interface IUptimeDay { + date: string; // YYYY-MM-DD + uptime: number; // percentage + incidents: number; + totalDowntime: number; // minutes + status: 'operational' | 'degraded' | 'partial_outage' | 'major_outage'; +} + +export interface IMonthlyUptime { + month: string; // YYYY-MM + days: IUptimeDay[]; + overallUptime: number; // percentage + totalIncidents: number; +} + +export interface IOverallStatus { + status: 'operational' | 'degraded' | 'partial_outage' | 'major_outage' | 'maintenance'; + message: string; + lastUpdated: number; + affectedServices: number; + totalServices: number; +} + +export interface IStatusPageConfig { + apiEndpoint?: string; + refreshInterval?: number; // milliseconds + timeZone?: string; + dateFormat?: string; + enableWebSocket?: boolean; + enableNotifications?: boolean; + theme?: 'light' | 'dark' | 'auto'; + language?: string; + showHistoricalDays?: number; + whitelabel?: boolean; + companyName?: string; + companyLogo?: string; + supportEmail?: string; + statusPageUrl?: string; + legalUrl?: string; +} + +export interface ISubscription { + email?: string; + phone?: string; + webhook?: string; + services: string[]; + severityFilter: ('critical' | 'major' | 'minor' | 'maintenance')[]; +} + +// Re-export the incident interface from @uptime.link/interfaces if needed +// Note: The IIncident interface is imported in the incidents component directly from plugins \ No newline at end of file diff --git a/ts_web/styles/shared.styles.ts b/ts_web/styles/shared.styles.ts new file mode 100644 index 0000000..c6db558 --- /dev/null +++ b/ts_web/styles/shared.styles.ts @@ -0,0 +1,181 @@ +import { css, cssManager, unsafeCSS } from '@design.estate/dees-element'; + +export const fonts = { + base: `'Geist Sans', -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif`, + mono: `'Geist Mono', ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace` +}; + +export const colors = { + // Background colors + background: { + primary: cssManager.bdTheme('#ffffff', '#0a0a0a'), + secondary: cssManager.bdTheme('#f9fafb', '#18181b'), + muted: cssManager.bdTheme('#f3f4f6', '#27272a'), + card: cssManager.bdTheme('#ffffff', '#18181b') + }, + + // Border colors + border: { + default: cssManager.bdTheme('#e5e7eb', '#27272a'), + muted: cssManager.bdTheme('#f3f4f6', '#3f3f46') + }, + + // Text colors + text: { + primary: cssManager.bdTheme('#0a0a0a', '#fafafa'), + secondary: cssManager.bdTheme('#6b7280', '#a1a1aa'), + muted: cssManager.bdTheme('#9ca3af', '#71717a') + }, + + // Status colors + status: { + operational: cssManager.bdTheme('#10b981', '#064e3b'), + degraded: cssManager.bdTheme('#f59e0b', '#78350f'), + partial: cssManager.bdTheme('#ef4444', '#7f1d1d'), + major: cssManager.bdTheme('#dc2626', '#450a0a'), + maintenance: cssManager.bdTheme('#3b82f6', '#1e3a8a') + } +}; + +export const shadows = { + sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)', + base: '0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06)', + md: '0 4px 6px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.06)', + lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)', + xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)' +}; + +export const borderRadius = { + sm: '4px', + base: '6px', + md: '8px', + lg: '12px', + xl: '16px', + full: '9999px' +}; + +export const spacing = { + xs: '4px', + sm: '8px', + md: '16px', + lg: '24px', + xl: '32px', + '2xl': '48px', + '3xl': '64px' +}; + +export const commonStyles = css` + /* Button styles */ + .button { + display: inline-flex; + align-items: center; + justify-content: center; + font-family: ${unsafeCSS(fonts.base)}; + font-size: 14px; + font-weight: 500; + height: 36px; + padding: 0 16px; + border-radius: ${unsafeCSS(borderRadius.base)}; + border: 1px solid ${colors.border.default}; + background: transparent; + color: ${colors.text.primary}; + cursor: pointer; + user-select: none; + transition: all 0.2s ease; + gap: 8px; + } + + .button:hover { + background: ${cssManager.bdTheme('#f9fafb', '#262626')}; + border-color: ${cssManager.bdTheme('#d1d5db', '#404040')}; + transform: translateY(-1px); + } + + .button:active { + transform: translateY(0); + } + + .button.primary { + background: ${colors.text.primary}; + color: ${colors.background.primary}; + border-color: ${colors.text.primary}; + } + + .button.primary:hover { + background: ${cssManager.bdTheme('#262626', '#f4f4f5')}; + border-color: ${cssManager.bdTheme('#262626', '#f4f4f5')}; + } + + /* Card styles */ + .card { + background: ${colors.background.card}; + border: 1px solid ${colors.border.default}; + border-radius: ${unsafeCSS(borderRadius.md)}; + padding: ${unsafeCSS(spacing.lg)}; + box-shadow: ${unsafeCSS(shadows.sm)}; + } + + /* Loading skeleton */ + .skeleton { + background: ${cssManager.bdTheme( + 'linear-gradient(90deg, #f3f4f6 25%, #e5e7eb 50%, #f3f4f6 75%)', + 'linear-gradient(90deg, #1f1f1f 25%, #262626 50%, #1f1f1f 75%)' + )}; + background-size: 200% 100%; + animation: skeleton-loading 1.5s infinite; + border-radius: ${unsafeCSS(borderRadius.base)}; + } + + @keyframes skeleton-loading { + 0% { background-position: 200% 0; } + 100% { background-position: -200% 0; } + } + + /* Container styles */ + .container { + max-width: 1200px; + margin: 0 auto; + padding: 0 ${unsafeCSS(spacing.lg)}; + } + + /* Responsive utilities */ + @media (max-width: 640px) { + .container { + padding: 0 ${unsafeCSS(spacing.md)}; + } + } +`; + +export const getStatusColor = (status: string) => { + switch (status) { + case 'operational': + return colors.status.operational; + case 'degraded': + return colors.status.degraded; + case 'partial_outage': + return colors.status.partial; + case 'major_outage': + return colors.status.major; + case 'maintenance': + return colors.status.maintenance; + default: + return colors.text.secondary; + } +}; + +export const getStatusIcon = (status: string) => { + switch (status) { + case 'operational': + return '✓'; + case 'degraded': + return '!'; + case 'partial_outage': + return '⚠'; + case 'major_outage': + return '✕'; + case 'maintenance': + return '🔧'; + default: + return '?'; + } +}; \ No newline at end of file