feat: add healthchecks (#1187)

This commit is contained in:
Manuel
2024-09-28 23:02:28 +02:00
committed by GitHub
parent 8aaa4f5856
commit 08c6303fa6
7 changed files with 161 additions and 56 deletions

1
.gitignore vendored
View File

@@ -56,6 +56,7 @@ yarn-error.log*
apps/tasks/tasks.cjs
apps/websocket/wssServer.cjs
apps/nextjs/.million/
packages/cli/cli.cjs
#personal backgrounds

View File

@@ -30,6 +30,7 @@
"@homarr/modals-collection": "workspace:^0.1.0",
"@homarr/notifications": "workspace:^0.1.0",
"@homarr/old-schema": "workspace:^0.1.0",
"@homarr/redis": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0",
"@homarr/spotlight": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",

View File

@@ -0,0 +1,91 @@
import { performance } from "perf_hooks";
import { db } from "@homarr/db";
import { logger } from "@homarr/log";
import { handshakeAsync } from "@homarr/redis";
export async function GET() {
const timeBeforeHealthCheck = performance.now();
const response = await executeAndAggregateAllHealthChecksAsync();
logger.info(`Completed healthcheck after ${performance.now() - timeBeforeHealthCheck}ms`);
if (response.status === "healthy") {
return new Response(JSON.stringify(response), {
status: 200,
});
}
return new Response(JSON.stringify(response), {
status: 500,
});
}
const executeAndAggregateAllHealthChecksAsync = async (): Promise<{
healthChecks: Record<string, object>;
status: "healthy" | "unhealthy";
}> => {
const healthChecks = [
executeHealthCheckSafelyAsync("database", async () => {
// sqlite driver does not support raw query execution. this is for a heartbeat check only - it doesn't matter if data is returned or not
await db.query.serverSettings.findFirst();
return {};
}),
executeHealthCheckSafelyAsync("redis", async () => {
await handshakeAsync();
return {};
}),
];
const healthCheckResults = await Promise.all(healthChecks);
const anyUnhealthy = healthCheckResults.some((healthCheck) => healthCheck.status === "unhealthy");
const healthCheckValues = healthCheckResults.reduce(
(acc, healthCheck) => {
acc[healthCheck.name] = {
status: healthCheck.status,
...healthCheck.values,
};
return acc;
},
{} as Record<string, object>,
);
return {
status: anyUnhealthy ? "unhealthy" : "healthy",
healthChecks: healthCheckValues,
};
};
const executeHealthCheckSafelyAsync = async (
name: string,
callback: () => Promise<object>,
): Promise<HealthCheckResult> => {
try {
const currentTimeBeforeCallback = performance.now();
const values = await callback();
return {
name,
status: "healthy",
values: {
...values,
latency: performance.now() - currentTimeBeforeCallback,
},
};
} catch (error) {
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
logger.error(`Healthcheck '${name}' has failed: ${error}`);
return {
status: "unhealthy",
values: {
error,
},
name,
};
}
};
interface HealthCheckResult {
status: "healthy" | "unhealthy";
name: string;
values: object;
}

View File

@@ -0,0 +1,5 @@
export function GET() {
return new Response(undefined, {
status: 200,
});
}

View File

@@ -1,6 +1,6 @@
import { createListChannel, createQueueChannel, createSubPubChannel } from "./lib/channel";
export { createCacheChannel, createItemAndIntegrationChannel, createItemChannel } from "./lib/channel";
export { createCacheChannel, createItemAndIntegrationChannel, createItemChannel, handshakeAsync } from "./lib/channel";
export const exampleChannel = createSubPubChannel<{ message: string }>("example");
export const pingChannel = createSubPubChannel<{ url: string; statusCode: number } | { url: string; error: string }>(

View File

@@ -260,3 +260,7 @@ export const createQueueChannel = <TItem>(name: string) => {
},
};
};
export const handshakeAsync = async () => {
await getSetClient.hello();
};

113
pnpm-lock.yaml generated
View File

@@ -21,10 +21,10 @@ importers:
version: 2.1.2(@types/node@20.16.10)(typescript@5.6.2)
'@vitejs/plugin-react':
specifier: ^4.3.1
version: 4.3.1(vite@5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))
version: 4.3.1(vite@5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0))
'@vitest/coverage-v8':
specifier: ^2.1.1
version: 2.1.1(vitest@2.1.1(@types/node@20.16.10)(@vitest/ui@2.1.1)(jsdom@25.0.1)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))
version: 2.1.1(vitest@2.1.1(@types/node@20.16.10)(@vitest/ui@2.1.1)(jsdom@25.0.1)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0))
'@vitest/ui':
specifier: ^2.1.1
version: 2.1.1(vitest@2.1.1)
@@ -48,10 +48,10 @@ importers:
version: 5.6.2
vite-tsconfig-paths:
specifier: ^5.0.1
version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))
version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0))
vitest:
specifier: ^2.1.1
version: 2.1.1(@types/node@20.16.10)(@vitest/ui@2.1.1)(jsdom@25.0.1)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)
version: 2.1.1(@types/node@20.16.10)(@vitest/ui@2.1.1)(jsdom@25.0.1)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0)
apps/nextjs:
dependencies:
@@ -100,6 +100,9 @@ importers:
'@homarr/old-schema':
specifier: workspace:^0.1.0
version: link:../../packages/old-schema
'@homarr/redis':
specifier: workspace:^0.1.0
version: link:../../packages/redis
'@homarr/server-settings':
specifier: workspace:^0.1.0
version: link:../../packages/server-settings
@@ -153,16 +156,16 @@ importers:
version: 5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(next@14.2.13(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.4))(react@18.3.1)
'@trpc/client':
specifier: next
version: 11.0.0-rc.544(@trpc/server@11.0.0-rc.544)
version: 11.0.0-rc.552(@trpc/server@11.0.0-rc.552)
'@trpc/next':
specifier: next
version: 11.0.0-rc.544(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.544(@trpc/server@11.0.0-rc.544))(@trpc/react-query@11.0.0-rc.544(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.544(@trpc/server@11.0.0-rc.544))(@trpc/server@11.0.0-rc.544)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.544)(next@14.2.13(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.4))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
version: 11.0.0-rc.552(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.552(@trpc/server@11.0.0-rc.552))(@trpc/react-query@11.0.0-rc.552(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.552(@trpc/server@11.0.0-rc.552))(@trpc/server@11.0.0-rc.552)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.552)(next@14.2.13(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.4))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@trpc/react-query':
specifier: next
version: 11.0.0-rc.544(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.544(@trpc/server@11.0.0-rc.544))(@trpc/server@11.0.0-rc.544)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
version: 11.0.0-rc.552(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.552(@trpc/server@11.0.0-rc.552))(@trpc/server@11.0.0-rc.552)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@trpc/server':
specifier: next
version: 11.0.0-rc.544
version: 11.0.0-rc.552
'@xterm/addon-canvas':
specifier: ^0.7.0
version: 0.7.0(@xterm/xterm@5.5.0)
@@ -502,13 +505,13 @@ importers:
version: link:../validation
'@trpc/client':
specifier: next
version: 11.0.0-rc.544(@trpc/server@11.0.0-rc.544)
version: 11.0.0-rc.552(@trpc/server@11.0.0-rc.552)
'@trpc/react-query':
specifier: next
version: 11.0.0-rc.544(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.544(@trpc/server@11.0.0-rc.544))(@trpc/server@11.0.0-rc.544)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
version: 11.0.0-rc.552(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.552(@trpc/server@11.0.0-rc.552))(@trpc/server@11.0.0-rc.552)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@trpc/server':
specifier: next
version: 11.0.0-rc.544
version: 11.0.0-rc.552
dockerode:
specifier: ^4.0.2
version: 4.0.2
@@ -523,7 +526,7 @@ importers:
version: 2.2.1
trpc-swagger:
specifier: ^1.2.6
version: 1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.544(@trpc/server@11.0.0-rc.544))(@trpc/server@11.0.0-rc.544)(zod@3.23.8)
version: 1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.552(@trpc/server@11.0.0-rc.552))(@trpc/server@11.0.0-rc.552)(zod@3.23.8)
devDependencies:
'@homarr/eslint-config':
specifier: workspace:^0.2.0
@@ -3215,18 +3218,18 @@ packages:
'@tootallnate/quickjs-emscripten@0.23.0':
resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
'@trpc/client@11.0.0-rc.544':
resolution: {integrity: sha512-VympvY3/j597XUNEm8ywcH9Q78rC8f7qvLRpfU6u7Bjm7YgWLNaWlBYLpnOjhej0gXjFQjRLsnF1Ffek8KDtZg==}
'@trpc/client@11.0.0-rc.552':
resolution: {integrity: sha512-jFDclTMI4QLcLNMmEZdAXOZWTXlaSzfdOqhvj0FQLDu38T/Wt6F2EWUY51ALYv6WU0u7dIpH/yi1/XbULz4LUg==}
peerDependencies:
'@trpc/server': 11.0.0-rc.544+f8e8d1715
'@trpc/server': 11.0.0-rc.552+268308497
'@trpc/next@11.0.0-rc.544':
resolution: {integrity: sha512-hSneXAUgapL17RXyTdN9G5ZeN73B/bZ0j2XqduATfD/UgwvTaUuS4uYybgBy3RMLnaOnjr9lxcrYAf4ysiKxCg==}
'@trpc/next@11.0.0-rc.552':
resolution: {integrity: sha512-7JzIcXbUBDqqTNaI4wpz8vt1lOw+9vPo6cBZl8pyBBw+Jy64L2dRoLfBa2r3/RljDWBfPvV0kHNuZx8Ky8vshA==}
peerDependencies:
'@tanstack/react-query': ^5.54.1
'@trpc/client': 11.0.0-rc.544+f8e8d1715
'@trpc/react-query': 11.0.0-rc.544+f8e8d1715
'@trpc/server': 11.0.0-rc.544+f8e8d1715
'@trpc/client': 11.0.0-rc.552+268308497
'@trpc/react-query': 11.0.0-rc.552+268308497
'@trpc/server': 11.0.0-rc.552+268308497
next: '*'
react: '>=16.8.0'
react-dom: '>=16.8.0'
@@ -3236,17 +3239,17 @@ packages:
'@trpc/react-query':
optional: true
'@trpc/react-query@11.0.0-rc.544':
resolution: {integrity: sha512-lieAIbIdbwWsQcZuyUUzIGMB+ouMfkiPoK/H7N864eftiAmZgIuvtaarnO/7wTtLGsJoMOTzTJLE503UvEu0FA==}
'@trpc/react-query@11.0.0-rc.552':
resolution: {integrity: sha512-E2mV9kdAPcUlFKK0HHW5LuPthuobI+ooN7eg0+KJAI2nr+yzERcreF9kXQiOtXPFDDob8hS+2zJ/H/rGYz4lHA==}
peerDependencies:
'@tanstack/react-query': ^5.54.1
'@trpc/client': 11.0.0-rc.544+f8e8d1715
'@trpc/server': 11.0.0-rc.544+f8e8d1715
'@trpc/client': 11.0.0-rc.552+268308497
'@trpc/server': 11.0.0-rc.552+268308497
react: '>=18.2.0'
react-dom: '>=18.2.0'
'@trpc/server@11.0.0-rc.544':
resolution: {integrity: sha512-Hv7w6PV9MQgD+TzX1LI1P1E2siweQaf4fS/xW+b6NCC15REgcYuWNPu69YFFpwcdkl3PuAkh+DL/0NPUpHdiHg==}
'@trpc/server@11.0.0-rc.552':
resolution: {integrity: sha512-3t8jOfs6EmZXQtwRD+FliAZW9WJmG1wC3SlFj/0hBMjwHqYtLttM/gmR1qKEeFmL5VdUhMojfaLQiGg5fxQEZw==}
'@tsconfig/node10@1.0.11':
resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
@@ -9394,30 +9397,30 @@ snapshots:
'@tootallnate/quickjs-emscripten@0.23.0': {}
'@trpc/client@11.0.0-rc.544(@trpc/server@11.0.0-rc.544)':
'@trpc/client@11.0.0-rc.552(@trpc/server@11.0.0-rc.552)':
dependencies:
'@trpc/server': 11.0.0-rc.544
'@trpc/server': 11.0.0-rc.552
'@trpc/next@11.0.0-rc.544(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.544(@trpc/server@11.0.0-rc.544))(@trpc/react-query@11.0.0-rc.544(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.544(@trpc/server@11.0.0-rc.544))(@trpc/server@11.0.0-rc.544)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.544)(next@14.2.13(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.4))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
'@trpc/next@11.0.0-rc.552(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.552(@trpc/server@11.0.0-rc.552))(@trpc/react-query@11.0.0-rc.552(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.552(@trpc/server@11.0.0-rc.552))(@trpc/server@11.0.0-rc.552)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.552)(next@14.2.13(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.4))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@trpc/client': 11.0.0-rc.544(@trpc/server@11.0.0-rc.544)
'@trpc/server': 11.0.0-rc.544
'@trpc/client': 11.0.0-rc.552(@trpc/server@11.0.0-rc.552)
'@trpc/server': 11.0.0-rc.552
next: 14.2.13(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.4)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
optionalDependencies:
'@tanstack/react-query': 5.56.2(react@18.3.1)
'@trpc/react-query': 11.0.0-rc.544(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.544(@trpc/server@11.0.0-rc.544))(@trpc/server@11.0.0-rc.544)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@trpc/react-query': 11.0.0-rc.552(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.552(@trpc/server@11.0.0-rc.552))(@trpc/server@11.0.0-rc.552)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@trpc/react-query@11.0.0-rc.544(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.544(@trpc/server@11.0.0-rc.544))(@trpc/server@11.0.0-rc.544)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
'@trpc/react-query@11.0.0-rc.552(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.552(@trpc/server@11.0.0-rc.552))(@trpc/server@11.0.0-rc.552)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@tanstack/react-query': 5.56.2(react@18.3.1)
'@trpc/client': 11.0.0-rc.544(@trpc/server@11.0.0-rc.544)
'@trpc/server': 11.0.0-rc.544
'@trpc/client': 11.0.0-rc.552(@trpc/server@11.0.0-rc.552)
'@trpc/server': 11.0.0-rc.552
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
'@trpc/server@11.0.0-rc.544': {}
'@trpc/server@11.0.0-rc.552': {}
'@tsconfig/node10@1.0.11': {}
@@ -9772,18 +9775,18 @@ snapshots:
global: 4.4.0
is-function: 1.0.2
'@vitejs/plugin-react@4.3.1(vite@5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))':
'@vitejs/plugin-react@4.3.1(vite@5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0))':
dependencies:
'@babel/core': 7.25.2
'@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2)
'@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
vite: 5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)
vite: 5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0)
transitivePeerDependencies:
- supports-color
'@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@20.16.10)(@vitest/ui@2.1.1)(jsdom@25.0.1)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))':
'@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@20.16.10)(@vitest/ui@2.1.1)(jsdom@25.0.1)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0))':
dependencies:
'@ampproject/remapping': 2.3.0
'@bcoe/v8-coverage': 0.2.3
@@ -9797,7 +9800,7 @@ snapshots:
std-env: 3.7.0
test-exclude: 7.0.1
tinyrainbow: 1.2.0
vitest: 2.1.1(@types/node@20.16.10)(@vitest/ui@2.1.1)(jsdom@25.0.1)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)
vitest: 2.1.1(@types/node@20.16.10)(@vitest/ui@2.1.1)(jsdom@25.0.1)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0)
transitivePeerDependencies:
- supports-color
@@ -9808,13 +9811,13 @@ snapshots:
chai: 5.1.1
tinyrainbow: 1.2.0
'@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))':
'@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0))':
dependencies:
'@vitest/spy': 2.1.1
estree-walker: 3.0.3
magic-string: 0.30.11
optionalDependencies:
vite: 5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)
vite: 5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0)
'@vitest/pretty-format@2.1.1':
dependencies:
@@ -9844,7 +9847,7 @@ snapshots:
sirv: 2.0.4
tinyglobby: 0.2.6
tinyrainbow: 1.2.0
vitest: 2.1.1(@types/node@20.16.10)(@vitest/ui@2.1.1)(jsdom@25.0.1)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)
vitest: 2.1.1(@types/node@20.16.10)(@vitest/ui@2.1.1)(jsdom@25.0.1)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0)
'@vitest/utils@2.1.1':
dependencies:
@@ -13980,10 +13983,10 @@ snapshots:
triple-beam@1.4.1: {}
trpc-swagger@1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.544(@trpc/server@11.0.0-rc.544))(@trpc/server@11.0.0-rc.544)(zod@3.23.8):
trpc-swagger@1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.552(@trpc/server@11.0.0-rc.552))(@trpc/server@11.0.0-rc.552)(zod@3.23.8):
dependencies:
'@trpc/client': 11.0.0-rc.544(@trpc/server@11.0.0-rc.544)
'@trpc/server': 11.0.0-rc.544
'@trpc/client': 11.0.0-rc.552(@trpc/server@11.0.0-rc.552)
'@trpc/server': 11.0.0-rc.552
chalk-scripts: 1.2.8
co-body: 6.2.0
lodash.clonedeep: 4.5.0
@@ -14317,12 +14320,12 @@ snapshots:
dependencies:
global: 4.4.0
vite-node@2.1.1(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0):
vite-node@2.1.1(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0):
dependencies:
cac: 6.7.14
debug: 4.3.7
pathe: 1.1.2
vite: 5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)
vite: 5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0)
transitivePeerDependencies:
- '@types/node'
- less
@@ -14334,18 +14337,18 @@ snapshots:
- supports-color
- terser
vite-tsconfig-paths@5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)):
vite-tsconfig-paths@5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0)):
dependencies:
debug: 4.3.7
globrex: 0.1.2
tsconfck: 3.1.3(typescript@5.6.2)
optionalDependencies:
vite: 5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)
vite: 5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0)
transitivePeerDependencies:
- supports-color
- typescript
vite@5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0):
vite@5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0):
dependencies:
esbuild: 0.21.5
postcss: 8.4.47
@@ -14357,10 +14360,10 @@ snapshots:
sugarss: 4.0.1(postcss@8.4.47)
terser: 5.32.0
vitest@2.1.1(@types/node@20.16.10)(@vitest/ui@2.1.1)(jsdom@25.0.1)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0):
vitest@2.1.1(@types/node@20.16.10)(@vitest/ui@2.1.1)(jsdom@25.0.1)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0):
dependencies:
'@vitest/expect': 2.1.1
'@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))
'@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0))
'@vitest/pretty-format': 2.1.1
'@vitest/runner': 2.1.1
'@vitest/snapshot': 2.1.1
@@ -14375,8 +14378,8 @@ snapshots:
tinyexec: 0.3.0
tinypool: 1.0.1
tinyrainbow: 1.2.0
vite: 5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)
vite-node: 2.1.1(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)
vite: 5.4.5(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0)
vite-node: 2.1.1(@types/node@20.16.10)(sass@1.79.4)(sugarss@4.0.1)(terser@5.32.0)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 20.16.10