diff --git a/apps/supervisor/package.json b/apps/supervisor/package.json index c4a0c984d4..8b29055f9a 100644 --- a/apps/supervisor/package.json +++ b/apps/supervisor/package.json @@ -8,7 +8,8 @@ "build": "tsc", "dev": "tsx --require dotenv/config --watch src/index.ts || (echo '!! Remember to run: nvm use'; exit 1)", "start": "node dist/index.js", - "test:watch": "vitest", + "test:run": "vitest --no-file-parallelism --run", + "test:watch": "vitest --no-file-parallelism", "typecheck": "tsc --noEmit" }, "dependencies": { @@ -24,6 +25,7 @@ }, "devDependencies": { "@types/dockerode": "^3.3.33", - "docker-api-ts": "^0.2.2" + "docker-api-ts": "^0.2.2", + "vitest": "^1.4.0" } } diff --git a/apps/supervisor/src/env.ts b/apps/supervisor/src/env.ts index 5009206a29..6c64c0bc44 100644 --- a/apps/supervisor/src/env.ts +++ b/apps/supervisor/src/env.ts @@ -35,6 +35,7 @@ const Env = z.object({ // Optional services TRIGGER_WARM_START_URL: z.string().optional(), TRIGGER_CHECKPOINT_URL: z.string().optional(), + TRIGGER_METADATA_URL: z.string().optional(), // Used by the workload manager, e.g docker/k8s DOCKER_NETWORK: z.string().default("host"), diff --git a/apps/supervisor/src/index.ts b/apps/supervisor/src/index.ts index 3d9947e00a..2f4143e4c4 100644 --- a/apps/supervisor/src/index.ts +++ b/apps/supervisor/src/index.ts @@ -61,6 +61,7 @@ class ManagedSupervisor { workloadApiDomain: env.TRIGGER_WORKLOAD_API_DOMAIN, workloadApiPort: env.TRIGGER_WORKLOAD_API_PORT_EXTERNAL, warmStartUrl: this.warmStartUrl, + metadataUrl: env.TRIGGER_METADATA_URL, imagePullSecrets: env.KUBERNETES_IMAGE_PULL_SECRETS?.split(","), heartbeatIntervalSeconds: env.RUNNER_HEARTBEAT_INTERVAL_SECONDS, snapshotPollIntervalSeconds: env.RUNNER_SNAPSHOT_POLL_INTERVAL_SECONDS, diff --git a/apps/supervisor/src/services/failedPodHandler.test.ts b/apps/supervisor/src/services/failedPodHandler.test.ts index 28458ea8ef..d05783288e 100644 --- a/apps/supervisor/src/services/failedPodHandler.test.ts +++ b/apps/supervisor/src/services/failedPodHandler.test.ts @@ -314,6 +314,102 @@ describe("FailedPodHandler Integration Tests", () => { await handler.stop(); } }, 60000); + + it("should handle graceful shutdown pods differently", async () => { + const handler = new FailedPodHandler({ namespace, k8s, register }); + + try { + // Create first batch of pods before starting handler + const firstBatchPodNames = await createTestPods({ + k8sApi: k8s, + namespace, + count: 2, + exitCode: FailedPodHandler.GRACEFUL_SHUTDOWN_EXIT_CODE, + }); + + // Wait for pods to reach Failed state + await waitForPodsPhase({ + k8sApi: k8s, + namespace, + podNames: firstBatchPodNames, + phase: "Failed", + }); + + // Start the handler + await handler.start(); + + // Wait for first batch to be deleted + await waitForPodsDeletion({ + k8sApi: k8s, + namespace, + podNames: firstBatchPodNames, + }); + + // Create second batch of pods after handler is running + const secondBatchPodNames = await createTestPods({ + k8sApi: k8s, + namespace, + count: 3, + exitCode: FailedPodHandler.GRACEFUL_SHUTDOWN_EXIT_CODE, + }); + + // Wait for second batch to be deleted + await waitForPodsDeletion({ + k8sApi: k8s, + namespace, + podNames: secondBatchPodNames, + }); + + // Verify metrics + const metrics = handler.getMetrics(); + + // Check informer events were recorded for both batches + const informerEvents = await metrics.informerEventsTotal.get(); + expect(informerEvents.values).toContainEqual( + expect.objectContaining({ + labels: expect.objectContaining({ + namespace, + verb: "add", + }), + value: 5, // 2 from first batch + 3 from second batch + }) + ); + + // Check pods were processed as graceful shutdowns + const processedPods = await metrics.processedPodsTotal.get(); + + // Should not be marked as Failed + const failedPods = processedPods.values.find( + (v) => v.labels.namespace === namespace && v.labels.status === "Failed" + ); + expect(failedPods).toBeUndefined(); + + // Should be marked as GracefulShutdown + const gracefulShutdowns = processedPods.values.find( + (v) => v.labels.namespace === namespace && v.labels.status === "GracefulShutdown" + ); + expect(gracefulShutdowns).toBeDefined(); + expect(gracefulShutdowns?.value).toBe(5); // Total from both batches + + // Check pods were still deleted + const deletedPods = await metrics.deletedPodsTotal.get(); + expect(deletedPods.values).toContainEqual( + expect.objectContaining({ + labels: expect.objectContaining({ + namespace, + status: "Failed", + }), + value: 5, // Total from both batches + }) + ); + + // Check no deletion errors were recorded + const deletionErrors = await metrics.deletionErrorsTotal.get(); + expect(deletionErrors.values).toHaveLength(0); + } finally { + await handler.stop(); + } + }, 30000); }); async function createTestPods({ @@ -325,6 +421,7 @@ async function createTestPods({ namePrefix = "test-pod", command = ["/bin/sh", "-c", shouldFail ? "exit 1" : "exit 0"], randomizeName = true, + exitCode, }: { k8sApi: K8sApi; namespace: string; @@ -334,9 +431,15 @@ async function createTestPods({ namePrefix?: string; command?: string[]; randomizeName?: boolean; + exitCode?: number; }) { const createdPods: string[] = []; + // If exitCode is specified, override the command + if (exitCode !== undefined) { + command = ["/bin/sh", "-c", `exit ${exitCode}`]; + } + for (let i = 0; i < count; i++) { const podName = randomizeName ? `${namePrefix}-${i}-${Math.random().toString(36).substring(2, 15)}` @@ -352,7 +455,7 @@ async function createTestPods({ restartPolicy: "Never", containers: [ { - name: "test", + name: "run-controller", // Changed to match the name we check in failedPodHandler image: "busybox:1.37.0", command, }, @@ -470,7 +573,7 @@ async function deleteAllPodsInNamespace({ const podNames = pods.items.map((p) => p.metadata?.name ?? ""); // Delete all pods - await k8sApi.core.deleteCollectionNamespacedPod({ namespace }); + await k8sApi.core.deleteCollectionNamespacedPod({ namespace, gracePeriodSeconds: 0 }); // Wait for all pods to be deleted await waitForPodsDeletion({ k8sApi, namespace, podNames }); diff --git a/apps/supervisor/src/services/failedPodHandler.ts b/apps/supervisor/src/services/failedPodHandler.ts index 677eda74fd..26a589e677 100644 --- a/apps/supervisor/src/services/failedPodHandler.ts +++ b/apps/supervisor/src/services/failedPodHandler.ts @@ -6,7 +6,7 @@ import { Counter, Registry, Histogram } from "prom-client"; import { register } from "../metrics.js"; import { setTimeout } from "timers/promises"; -type PodStatus = "Pending" | "Running" | "Succeeded" | "Failed" | "Unknown"; +type PodStatus = "Pending" | "Running" | "Succeeded" | "Failed" | "Unknown" | "GracefulShutdown"; export type FailedPodHandlerOptions = { namespace: string; @@ -34,6 +34,8 @@ export class FailedPodHandler { private readonly processingDurationSeconds: Histogram; private readonly informerEventsTotal: Counter; + static readonly GRACEFUL_SHUTDOWN_EXIT_CODE = 200; + constructor(opts: FailedPodHandlerOptions) { this.id = Math.random().toString(36).substring(2, 15); this.logger = new SimpleStructuredLogger("failed-pod-handler", LogLevel.debug, { @@ -206,6 +208,21 @@ export class FailedPodHandler { private async processFailedPod(pod: V1Pod) { this.logger.info("pod-failed: processing pod", this.podSummary(pod)); + + const mainContainer = pod.status?.containerStatuses?.find((c) => c.name === "run-controller"); + + // If it's our special "graceful shutdown" exit code, don't process it further, just delete it + if ( + mainContainer?.state?.terminated?.exitCode === FailedPodHandler.GRACEFUL_SHUTDOWN_EXIT_CODE + ) { + this.logger.debug("pod-failed: graceful shutdown detected", this.podSummary(pod)); + this.processedPodsTotal.inc({ + namespace: this.namespace, + status: "GracefulShutdown", + }); + return; + } + this.processedPodsTotal.inc({ namespace: this.namespace, status: this.podStatus(pod), diff --git a/apps/supervisor/src/services/podCleaner.test.ts b/apps/supervisor/src/services/podCleaner.test.ts index 3ffb920183..36bb5de6d1 100644 --- a/apps/supervisor/src/services/podCleaner.test.ts +++ b/apps/supervisor/src/services/podCleaner.test.ts @@ -29,7 +29,7 @@ describe("PodCleaner Integration Tests", () => { register.clear(); // Delete all pods in the namespace - await k8s.core.deleteCollectionNamespacedPod({ namespace }); + await k8s.core.deleteCollectionNamespacedPod({ namespace, gracePeriodSeconds: 0 }); }); it("should clean up succeeded pods", async () => { diff --git a/apps/supervisor/src/workloadManager/docker.ts b/apps/supervisor/src/workloadManager/docker.ts index 9641e4e25a..dc658f304e 100644 --- a/apps/supervisor/src/workloadManager/docker.ts +++ b/apps/supervisor/src/workloadManager/docker.ts @@ -45,6 +45,10 @@ export class DockerWorkloadManager implements WorkloadManager { runArgs.push(`--env=TRIGGER_WARM_START_URL=${this.opts.warmStartUrl}`); } + if (this.opts.metadataUrl) { + runArgs.push(`--env=TRIGGER_METADATA_URL=${this.opts.metadataUrl}`); + } + if (this.opts.heartbeatIntervalSeconds) { runArgs.push( `--env=TRIGGER_HEARTBEAT_INTERVAL_SECONDS=${this.opts.heartbeatIntervalSeconds}` diff --git a/apps/supervisor/src/workloadManager/kubernetes.ts b/apps/supervisor/src/workloadManager/kubernetes.ts index 26e86a1809..2019316d49 100644 --- a/apps/supervisor/src/workloadManager/kubernetes.ts +++ b/apps/supervisor/src/workloadManager/kubernetes.ts @@ -134,6 +134,9 @@ export class KubernetesWorkloadManager implements WorkloadManager { ...(this.opts.warmStartUrl ? [{ name: "TRIGGER_WARM_START_URL", value: this.opts.warmStartUrl }] : []), + ...(this.opts.metadataUrl + ? [{ name: "TRIGGER_METADATA_URL", value: this.opts.metadataUrl }] + : []), ...(this.opts.heartbeatIntervalSeconds ? [ { diff --git a/apps/supervisor/src/workloadManager/types.ts b/apps/supervisor/src/workloadManager/types.ts index 6eddef22c2..6240975146 100644 --- a/apps/supervisor/src/workloadManager/types.ts +++ b/apps/supervisor/src/workloadManager/types.ts @@ -5,6 +5,7 @@ export interface WorkloadManagerOptions { workloadApiDomain?: string; // If unset, will use orchestrator-specific default workloadApiPort: number; warmStartUrl?: string; + metadataUrl?: string; imagePullSecrets?: string[]; heartbeatIntervalSeconds?: number; snapshotPollIntervalSeconds?: number; diff --git a/packages/cli-v3/src/entryPoints/managed-run-controller.ts b/packages/cli-v3/src/entryPoints/managed-run-controller.ts index 495e85b009..e558428860 100644 --- a/packages/cli-v3/src/entryPoints/managed-run-controller.ts +++ b/packages/cli-v3/src/entryPoints/managed-run-controller.ts @@ -56,6 +56,8 @@ const Env = z.object({ TRIGGER_WORKER_INSTANCE_NAME: z.string(), TRIGGER_HEARTBEAT_INTERVAL_SECONDS: z.coerce.number().default(30), TRIGGER_SNAPSHOT_POLL_INTERVAL_SECONDS: z.coerce.number().default(5), + TRIGGER_SUCCESS_EXIT_CODE: z.coerce.number().default(0), + TRIGGER_FAILURE_EXIT_CODE: z.coerce.number().default(1), }); const env = Env.parse(stdEnv); @@ -82,6 +84,8 @@ type Metadata = { TRIGGER_WORKER_INSTANCE_NAME: string | undefined; TRIGGER_HEARTBEAT_INTERVAL_SECONDS: number | undefined; TRIGGER_SNAPSHOT_POLL_INTERVAL_SECONDS: number | undefined; + TRIGGER_SUCCESS_EXIT_CODE: number | undefined; + TRIGGER_FAILURE_EXIT_CODE: number | undefined; }; class MetadataClient { @@ -122,6 +126,9 @@ class ManagedRunController { private workerApiUrl: string; private workerInstanceName: string; + private successExitCode = env.TRIGGER_SUCCESS_EXIT_CODE; + private failureExitCode = env.TRIGGER_FAILURE_EXIT_CODE; + private state: | { phase: "RUN"; @@ -220,11 +227,7 @@ class ManagedRunController { const response = await this.httpClient.heartbeatRun( this.runFriendlyId, - this.snapshotFriendlyId, - { - cpu: 0, - memory: 0, - } + this.snapshotFriendlyId ); if (!response.success) { @@ -669,6 +672,14 @@ class ManagedRunController { logger.log("Processing env overrides", { env: overrides }); + if (overrides.TRIGGER_SUCCESS_EXIT_CODE) { + this.successExitCode = overrides.TRIGGER_SUCCESS_EXIT_CODE; + } + + if (overrides.TRIGGER_FAILURE_EXIT_CODE) { + this.failureExitCode = overrides.TRIGGER_FAILURE_EXIT_CODE; + } + if (overrides.TRIGGER_HEARTBEAT_INTERVAL_SECONDS) { this.heartbeatIntervalSeconds = overrides.TRIGGER_HEARTBEAT_INTERVAL_SECONDS; this.runHeartbeat.updateInterval(this.heartbeatIntervalSeconds * 1000); @@ -821,7 +832,7 @@ class ManagedRunController { if (!this.warmStartClient) { console.error("waitForNextRun: warm starts disabled, shutting down"); - this.exitProcess(0); + this.exitProcess(this.successExitCode); } // Check the service is up and get additional warm start config @@ -832,7 +843,7 @@ class ManagedRunController { warmStartUrl: env.TRIGGER_WARM_START_URL, error: connect.error, }); - this.exitProcess(0); + this.exitProcess(this.successExitCode); } const connectionTimeoutMs = @@ -860,7 +871,7 @@ class ManagedRunController { connectionTimeoutMs, keepaliveMs, }); - this.exitProcess(0); + this.exitProcess(this.successExitCode); } const nextRun = await this.warmStartClient.warmStart({ @@ -871,7 +882,7 @@ class ManagedRunController { if (!nextRun) { console.error("waitForNextRun: warm start failed, shutting down"); - this.exitProcess(0); + this.exitProcess(this.successExitCode); } console.log("waitForNextRun: got next run", { nextRun }); @@ -884,7 +895,7 @@ class ManagedRunController { return; } catch (error) { console.error("waitForNextRun: unexpected error", { error }); - this.exitProcess(1); + this.exitProcess(this.failureExitCode); } finally { this.waitForNextRunLock = false; } @@ -1112,12 +1123,6 @@ class ManagedRunController { async start() { logger.debug("[ManagedRunController] Starting up"); - // TODO: remove this after testing - setTimeout(() => { - console.error("[ManagedRunController] Exiting after 5 minutes"); - this.exitProcess(1); - }, 60 * 5000); - // Websocket notifications are only an optimisation so we don't need to wait for a successful connection this.createSocket(); diff --git a/packages/core/src/v3/runEngineWorker/supervisor/schemas.ts b/packages/core/src/v3/runEngineWorker/supervisor/schemas.ts index 33106323fe..64ca509929 100644 --- a/packages/core/src/v3/runEngineWorker/supervisor/schemas.ts +++ b/packages/core/src/v3/runEngineWorker/supervisor/schemas.ts @@ -73,8 +73,8 @@ export const WorkerApiDequeueResponseBody = DequeuedMessage.array(); export type WorkerApiDequeueResponseBody = z.infer; export const WorkerApiRunHeartbeatRequestBody = z.object({ - cpu: z.number(), - memory: z.number(), + cpu: z.number().optional(), + memory: z.number().optional(), }); export type WorkerApiRunHeartbeatRequestBody = z.infer; diff --git a/packages/core/src/v3/runEngineWorker/workload/http.ts b/packages/core/src/v3/runEngineWorker/workload/http.ts index 1505e55f05..6fb300bdc4 100644 --- a/packages/core/src/v3/runEngineWorker/workload/http.ts +++ b/packages/core/src/v3/runEngineWorker/workload/http.ts @@ -41,7 +41,7 @@ export class WorkloadHttpClient { this.apiUrl = apiUrl.replace(/\/$/, ""); } - async heartbeatRun(runId: string, snapshotId: string, body: WorkloadHeartbeatRequestBody) { + async heartbeatRun(runId: string, snapshotId: string, body?: WorkloadHeartbeatRequestBody) { return wrapZodFetch( WorkloadHeartbeatResponseBody, `${this.apiUrl}/api/v1/workload-actions/runs/${runId}/snapshots/${snapshotId}/heartbeat`, @@ -51,7 +51,7 @@ export class WorkloadHttpClient { ...this.defaultHeaders, "Content-Type": "application/json", }, - body: JSON.stringify(body), + body: JSON.stringify(body ?? {}), } ); } diff --git a/packages/core/src/v3/runtime/managedRuntimeManager.ts b/packages/core/src/v3/runtime/managedRuntimeManager.ts index b876a87084..2a569a6773 100644 --- a/packages/core/src/v3/runtime/managedRuntimeManager.ts +++ b/packages/core/src/v3/runtime/managedRuntimeManager.ts @@ -1,8 +1,8 @@ +import { clock } from "../clock-api.js"; import { lifecycleHooks } from "../lifecycle-hooks-api.js"; import { BatchTaskRunExecutionResult, CompletedWaitpoint, - RuntimeWait, TaskRunContext, TaskRunExecutionResult, TaskRunFailedExecutionResult, @@ -178,7 +178,6 @@ export class ManagedRuntimeManager implements RuntimeManager { } if (!waitId) { - // TODO: Handle failures better this.log("No waitId found for waitpoint", waitpoint); return; } @@ -186,13 +185,15 @@ export class ManagedRuntimeManager implements RuntimeManager { const resolve = this.resolversByWaitId.get(waitId); if (!resolve) { - // TODO: Handle failures better this.log("No resolver found for waitId", waitId); return; } this.log("Resolving waitpoint", waitpoint); + // Ensure current time is accurate before resolving the waitpoint + clock.reset(); + resolve(waitpoint); this.resolversByWaitId.delete(waitId); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e4d5b2d974..4050d6f8a9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -189,6 +189,9 @@ importers: docker-api-ts: specifier: ^0.2.2 version: 0.2.2 + vitest: + specifier: ^1.4.0 + version: 1.6.0(@types/node@20.14.14) apps/webapp: dependencies: @@ -2042,7 +2045,7 @@ importers: version: 8.4.44 tailwindcss: specifier: ^3.4.1 - version: 3.4.1 + version: 3.4.1(ts-node@10.9.1) trigger.dev: specifier: workspace:^3 version: link:../../packages/cli-v3 @@ -16148,14 +16151,6 @@ packages: dependencies: web-streams-polyfill: 3.2.1 - /@rollup/rollup-android-arm-eabi@4.13.2: - resolution: {integrity: sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm-eabi@4.36.0: resolution: {integrity: sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==} cpu: [arm] @@ -16164,14 +16159,6 @@ packages: dev: true optional: true - /@rollup/rollup-android-arm64@4.13.2: - resolution: {integrity: sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm64@4.36.0: resolution: {integrity: sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==} cpu: [arm64] @@ -16180,14 +16167,6 @@ packages: dev: true optional: true - /@rollup/rollup-darwin-arm64@4.13.2: - resolution: {integrity: sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-arm64@4.36.0: resolution: {integrity: sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==} cpu: [arm64] @@ -16195,14 +16174,6 @@ packages: requiresBuild: true optional: true - /@rollup/rollup-darwin-x64@4.13.2: - resolution: {integrity: sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-x64@4.36.0: resolution: {integrity: sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==} cpu: [x64] @@ -16227,14 +16198,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.13.2: - resolution: {integrity: sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.36.0: resolution: {integrity: sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==} cpu: [arm] @@ -16251,14 +16214,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.13.2: - resolution: {integrity: sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-gnu@4.36.0: resolution: {integrity: sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==} cpu: [arm64] @@ -16267,14 +16222,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.13.2: - resolution: {integrity: sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-musl@4.36.0: resolution: {integrity: sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==} cpu: [arm64] @@ -16291,14 +16238,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.13.2: - resolution: {integrity: sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==} - cpu: [ppc64le] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.36.0: resolution: {integrity: sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==} cpu: [ppc64] @@ -16307,14 +16246,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.13.2: - resolution: {integrity: sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-riscv64-gnu@4.36.0: resolution: {integrity: sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==} cpu: [riscv64] @@ -16323,14 +16254,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.13.2: - resolution: {integrity: sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-s390x-gnu@4.36.0: resolution: {integrity: sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==} cpu: [s390x] @@ -16339,14 +16262,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.13.2: - resolution: {integrity: sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-gnu@4.36.0: resolution: {integrity: sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==} cpu: [x64] @@ -16355,14 +16270,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.13.2: - resolution: {integrity: sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-musl@4.36.0: resolution: {integrity: sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==} cpu: [x64] @@ -16371,14 +16278,6 @@ packages: dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.13.2: - resolution: {integrity: sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-arm64-msvc@4.36.0: resolution: {integrity: sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==} cpu: [arm64] @@ -16387,14 +16286,6 @@ packages: dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.13.2: - resolution: {integrity: sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-ia32-msvc@4.36.0: resolution: {integrity: sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==} cpu: [ia32] @@ -16403,14 +16294,6 @@ packages: dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.13.2: - resolution: {integrity: sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-x64-msvc@4.36.0: resolution: {integrity: sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==} cpu: [x64] @@ -18193,10 +18076,6 @@ packages: /@types/estree@1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true - /@types/estree@1.0.6: resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -19197,7 +19076,7 @@ packages: /@vitest/snapshot@1.6.0: resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} dependencies: - magic-string: 0.30.11 + magic-string: 0.30.17 pathe: 1.1.2 pretty-format: 29.7.0 dev: true @@ -24164,16 +24043,6 @@ packages: /fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - /fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -24882,17 +24751,6 @@ packages: path-scurry: 2.0.0 dev: true - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - deprecated: Glob versions prior to v9 are no longer supported - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -27786,13 +27644,6 @@ packages: - supports-color dev: false - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - /micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -29552,9 +29403,6 @@ packages: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true - /picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - /picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -29664,17 +29512,6 @@ packages: postcss-value-parser: 3.3.1 dev: false - /postcss-import@15.1.0(postcss@8.4.44): - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - postcss: 8.4.44 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.8 - /postcss-import@15.1.0(postcss@8.5.3): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -29705,15 +29542,6 @@ packages: postcss: 7.0.39 dev: false - /postcss-js@4.0.1(postcss@8.4.44): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.44 - /postcss-js@4.0.1(postcss@8.5.3): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} @@ -29741,24 +29569,7 @@ packages: yaml: 2.3.1 dev: true - /postcss-load-config@4.0.1(postcss@8.4.44)(ts-node@10.9.1): - resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 2.1.0 - postcss: 8.4.44 - ts-node: 10.9.1(@swc/core@1.3.26)(@types/node@20.14.14)(typescript@5.5.4) - yaml: 2.3.1 - - /postcss-load-config@4.0.2(postcss@8.5.3): + /postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.1): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} peerDependencies: @@ -29772,6 +29583,7 @@ packages: dependencies: lilconfig: 3.1.3 postcss: 8.5.3 + ts-node: 10.9.1(@swc/core@1.3.26)(@types/node@20.14.14)(typescript@5.5.4) yaml: 2.7.1 /postcss-load-config@6.0.1(postcss@8.5.3)(tsx@4.17.0): @@ -29924,15 +29736,6 @@ packages: postcss-selector-parser: 6.1.2 dev: false - /postcss-nested@6.0.1(postcss@8.4.44): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.44 - postcss-selector-parser: 6.1.2 - /postcss-nested@6.2.0(postcss@8.5.3): resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} @@ -29950,13 +29753,6 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-selector-parser@6.0.11: - resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - /postcss-selector-parser@6.1.2: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} @@ -30030,6 +29826,7 @@ packages: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.0 + dev: true /postcss@8.5.3: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} @@ -31857,31 +31654,6 @@ packages: fsevents: 2.3.3 dev: true - /rollup@4.13.2: - resolution: {integrity: sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.13.2 - '@rollup/rollup-android-arm64': 4.13.2 - '@rollup/rollup-darwin-arm64': 4.13.2 - '@rollup/rollup-darwin-x64': 4.13.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.13.2 - '@rollup/rollup-linux-arm64-gnu': 4.13.2 - '@rollup/rollup-linux-arm64-musl': 4.13.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.13.2 - '@rollup/rollup-linux-riscv64-gnu': 4.13.2 - '@rollup/rollup-linux-s390x-gnu': 4.13.2 - '@rollup/rollup-linux-x64-gnu': 4.13.2 - '@rollup/rollup-linux-x64-musl': 4.13.2 - '@rollup/rollup-win32-arm64-msvc': 4.13.2 - '@rollup/rollup-win32-ia32-msvc': 4.13.2 - '@rollup/rollup-win32-x64-msvc': 4.13.2 - fsevents: 2.3.3 - dev: true - /rollup@4.36.0: resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -33057,19 +32829,6 @@ packages: resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} dev: false - /sucrase@3.32.0: - resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} - engines: {node: '>=8'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.2 - commander: 4.1.1 - glob: 7.1.6 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.5 - ts-interface-checker: 0.1.13 - /sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -33293,7 +33052,7 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' dependencies: - tailwindcss: 3.4.1 + tailwindcss: 3.4.1(ts-node@10.9.1) dev: false /tailwindcss-textshadow@2.1.3: @@ -33353,7 +33112,7 @@ packages: postcss: 8.5.3 postcss-import: 15.1.0(postcss@8.5.3) postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.1) postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -33362,7 +33121,7 @@ packages: - ts-node dev: false - /tailwindcss@3.4.1: + /tailwindcss@3.4.1(ts-node@10.9.1): resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} engines: {node: '>=14.0.0'} hasBin: true @@ -33384,7 +33143,7 @@ packages: postcss: 8.5.3 postcss-import: 15.1.0(postcss@8.5.3) postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.1) postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -33392,36 +33151,6 @@ packages: transitivePeerDependencies: - ts-node - /tailwindcss@3.4.1(ts-node@10.9.1): - resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.1 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.6 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.1 - postcss: 8.4.44 - postcss-import: 15.1.0(postcss@8.4.44) - postcss-js: 4.0.1(postcss@8.4.44) - postcss-load-config: 4.0.1(postcss@8.4.44)(ts-node@10.9.1) - postcss-nested: 6.0.1(postcss@8.4.44) - postcss-selector-parser: 6.0.11 - resolve: 1.22.8 - sucrase: 3.32.0 - transitivePeerDependencies: - - ts-node - /tailwindcss@4.0.17: resolution: {integrity: sha512-OErSiGzRa6rLiOvaipsDZvLMSpsBZ4ysB4f0VKGXUrjw2jfkJRd6kjRKV2+ZmTCNvwtvgdDam5D7w6WXsdLJZw==} dev: true @@ -34850,7 +34579,7 @@ packages: '@uploadthing/shared': 7.0.3 effect: 3.7.2 next: 14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0)(react@18.3.1) - tailwindcss: 3.4.1 + tailwindcss: 3.4.1(ts-node@10.9.1) dev: false /uri-js@4.4.1: @@ -35365,7 +35094,7 @@ packages: '@types/node': 20.14.14 esbuild: 0.20.2 postcss: 8.5.3 - rollup: 4.13.2 + rollup: 4.36.0 optionalDependencies: fsevents: 2.3.3 dev: true @@ -35515,10 +35244,10 @@ packages: '@vitest/utils': 1.6.0 acorn-walk: 8.3.2 chai: 4.4.1 - debug: 4.3.7 + debug: 4.4.0 execa: 8.0.1 local-pkg: 0.5.0 - magic-string: 0.30.11 + magic-string: 0.30.17 pathe: 1.1.2 picocolors: 1.1.1 std-env: 3.8.1 @@ -36145,6 +35874,7 @@ packages: /yaml@2.3.1: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} + dev: true /yaml@2.7.1: resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==}