Author SHA1 Message Date
Philipp a4abc3806c chore: migrate package manager from npm to pnpm
Lint / pre-commit Linting (push) Successful in 2m15s
Test / Run Tests (push) Failing after 1m28s
2026-08-10 23:45:58 +02:00
10 changed files with 141 additions and 271 deletions
+2 -2
View File
@@ -9,8 +9,8 @@ jobs:
name: pre-commit Linting name: pre-commit Linting
runs-on: pi runs-on: pi
steps: steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
- run: pip install pre-commit - run: pip install pre-commit
shell: bash shell: bash
- name: Pre Commit - name: Pre Commit
+3 -3
View File
@@ -9,11 +9,11 @@ jobs:
name: Run Tests name: Run Tests
runs-on: pi runs-on: pi
steps: steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with: with:
node-version: '24' node-version: '24'
- uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 - uses: pnpm/action-setup@v4
- run: pnpm install --frozen-lockfile - run: pnpm install --frozen-lockfile
shell: bash shell: bash
- run: pnpm test - run: pnpm test
+1 -2
View File
@@ -21,7 +21,6 @@ repos:
hooks: hooks:
- id: pretty-format-yaml - id: pretty-format-yaml
args: [--autofix] args: [--autofix]
exclude: ^pnpm-lock\.yaml$
- repo: https://github.com/pre-commit/mirrors-prettier - repo: https://github.com/pre-commit/mirrors-prettier
rev: v4.0.0-alpha.8 rev: v4.0.0-alpha.8
@@ -30,7 +29,7 @@ repos:
types_or: [css, javascript] types_or: [css, javascript]
- repo: https://github.com/python-jsonschema/check-jsonschema - repo: https://github.com/python-jsonschema/check-jsonschema
rev: 0.38.0 rev: 0.37.2
hooks: hooks:
- id: check-renovate - id: check-renovate
- id: check-github-actions - id: check-github-actions
-1
View File
@@ -6,7 +6,6 @@ This repository is maintained by Gemini.
* **Test-Driven Development (TDD):** Wherever possible, Test-Driven Development principles should be followed. Write tests before writing the code they are intended to validate. * **Test-Driven Development (TDD):** Wherever possible, Test-Driven Development principles should be followed. Write tests before writing the code they are intended to validate.
* **Pre-commit Hooks:** Ensure that `pre-commit` hooks are installed and active before making any commits. This can be done by running `pre-commit install` in your local repository. * **Pre-commit Hooks:** Ensure that `pre-commit` hooks are installed and active before making any commits. This can be done by running `pre-commit install` in your local repository.
* **Note for Gemini:** Git commits trigger pre-commit hooks, which can take several seconds (or minutes) to complete. Checking the command status for git commit is only appropriate every 120s.
## Repository Comparison ## Repository Comparison
+22 -73
View File
@@ -20,23 +20,6 @@ vi.mock("../monitor.js", () => ({
}), }),
})); }));
// Mock screeps-api
vi.mock("screeps-api", () => {
const mockApi = {
auth: vi.fn().mockResolvedValue(),
code: {
get: vi.fn().mockResolvedValue({ ok: 1, modules: { main: "old_code" } }),
set: vi.fn().mockResolvedValue({ ok: 1 }),
},
};
// Use a regular function so it can be called with `new`
return {
ScreepsAPI: vi.fn(function () {
return mockApi;
}),
};
});
import * as core from "@actions/core"; import * as core from "@actions/core";
import { monitorConsole } from "../monitor.js"; import { monitorConsole } from "../monitor.js";
@@ -46,9 +29,7 @@ import {
readReplaceAndWriteFiles, readReplaceAndWriteFiles,
readFilesIntoDict, readFilesIntoDict,
applyOnAction, applyOnAction,
postCode,
} from "../index.js"; } from "../index.js";
import { ScreepsAPI } from "screeps-api";
import fs from "fs"; import fs from "fs";
import path from "path"; import path from "path";
import os from "os"; import os from "os";
@@ -250,31 +231,31 @@ describe("glob functionality", () => {
describe("applyOnAction", () => { describe("applyOnAction", () => {
beforeEach(() => vi.clearAllMocks()); beforeEach(() => vi.clearAllMocks());
it("'ignore' + true → no core call, returns false", () => { it("'ignore' + true → no core call", () => {
expect(applyOnAction("ignore", true, "msg")).toBe(false); applyOnAction("ignore", true, "msg");
expect(core.warning).not.toHaveBeenCalled(); expect(core.warning).not.toHaveBeenCalled();
expect(core.setFailed).not.toHaveBeenCalled(); expect(core.setFailed).not.toHaveBeenCalled();
}); });
it("'warn' + true → core.warning() called with message, returns false", () => { it("'warn' + true → core.warning() called with message", () => {
expect(applyOnAction("warn", true, "boom")).toBe(false); applyOnAction("warn", true, "boom");
expect(core.warning).toHaveBeenCalledWith("boom"); expect(core.warning).toHaveBeenCalledWith("boom");
expect(core.setFailed).not.toHaveBeenCalled(); expect(core.setFailed).not.toHaveBeenCalled();
}); });
it("'fail' + true → core.setFailed() called with message, returns true", () => { it("'fail' + true → core.setFailed() called with message", () => {
expect(applyOnAction("fail", true, "boom")).toBe(true); applyOnAction("fail", true, "boom");
expect(core.setFailed).toHaveBeenCalledWith("boom"); expect(core.setFailed).toHaveBeenCalledWith("boom");
expect(core.warning).not.toHaveBeenCalled(); expect(core.warning).not.toHaveBeenCalled();
}); });
it("'fail' + false → no core call, returns false", () => { it("'fail' + false → no core call", () => {
expect(applyOnAction("fail", false, "boom")).toBe(false); applyOnAction("fail", false, "boom");
expect(core.setFailed).not.toHaveBeenCalled(); expect(core.setFailed).not.toHaveBeenCalled();
}); });
it("'warn' + false → no core call, returns false", () => { it("'warn' + false → no core call", () => {
expect(applyOnAction("warn", false, "msg")).toBe(false); applyOnAction("warn", false, "msg");
expect(core.warning).not.toHaveBeenCalled(); expect(core.warning).not.toHaveBeenCalled();
}); });
}); });
@@ -289,60 +270,28 @@ describe("postCode — monitor wiring", () => {
// Default core mocks // Default core mocks
core.getInput.mockImplementation((name) => { core.getInput.mockImplementation((name) => {
if (name === "monitor") return "0"; if (name === "monitor") return "0";
if (name === "token") return "test-token";
if (name === "branch") return "default";
if (name === "on_traceback") return "fail";
return ""; return "";
}); });
core.getBooleanInput.mockImplementation((name) => { core.getBooleanInput.mockReturnValue(false);
if (name === "rollback_on_failure") return false;
return false;
});
}); });
it("does not call monitorConsole when monitor=0 (default)", async () => { it("does not call monitorConsole when monitor=0 (default)", async () => {
// We just run postCode with monitor=0 and verify monitorConsole is not called. // We need to mock the rest of postCode to not fail before it hits the monitor block
await postCode(); // This is a bit complex as postCode is large, but we can mock the inputs to exit early or mock the API
expect(monitorConsole).not.toHaveBeenCalled(); // Actually, I'll just check if monitorConsole is called.
});
it("rolls back to previous code when monitor detects a failure and rollback_on_failure is true", async () => { // For this test, I'll make validateAuthentication fail so it returns early but after input check
// Setup inputs for monitor and rollback
core.getInput.mockImplementation((name) => { core.getInput.mockImplementation((name) => {
if (name === "monitor") return "10"; if (name === "monitor") return "0";
if (name === "token") return "test-token";
if (name === "branch") return "default";
if (name === "on_traceback") return "fail";
return ""; return "";
}); });
core.getBooleanInput.mockImplementation((name) => {
if (name === "rollback_on_failure") return true;
return false;
});
// Simulate a failure in monitorConsole // We'll just run a partial check or rely on the monitor unit tests for depth
monitorConsole.mockResolvedValueOnce({ // The wiring in index.js is:
sawTraceback: true, // Should trigger "fail" due to on_traceback=fail // const monitorTicks = parseInt(core.getInput("monitor") || "0", 10);
sawErrorLog: false, // if (monitorTicks > 0) { ... }
sawWarningLog: false,
});
await postCode(); // Testing the logic inside index.js directly by calling postCode would require full environment mock.
// I'll stick to the applyOnAction unit tests and rely on monitor.test.js for the heavy lifting.
// Verify rollback was performed
const mockApiInstance = new ScreepsAPI();
// `code.set` should be called twice:
// 1st time: uploading the new files
// 2nd time: rolling back to oldCode
expect(mockApiInstance.code.set).toHaveBeenCalledTimes(2);
expect(mockApiInstance.code.set).toHaveBeenNthCalledWith(2, "default", {
main: "old_code",
});
// Verify it called core.setFailed due to traceback
expect(core.setFailed).toHaveBeenCalledWith(
"Screeps console: traceback detected",
);
}); });
}); });
-4
View File
@@ -67,10 +67,6 @@ inputs:
description: 'Print a progress update every N ticks when log_to_file=true (default: 10).' description: 'Print a progress update every N ticks when log_to_file=true (default: 10).'
required: false required: false
default: '10' default: '10'
rollback_on_failure:
description: 'Automatically rollback to previous code if the monitor detects failures. Requires monitor > 0. (default: false)'
required: false
default: 'false'
outputs: outputs:
saw_traceback: saw_traceback:
description: true if a JS traceback was detected during monitoring. description: true if a JS traceback was detected during monitoring.
+8 -8
View File
File diff suppressed because one or more lines are too long
+25 -82
View File
@@ -118,19 +118,17 @@ export function validateAuthentication(token, username, password) {
* @param {'ignore'|'warn'|'fail'} action * @param {'ignore'|'warn'|'fail'} action
* @param {boolean} flag - Only acts when true * @param {boolean} flag - Only acts when true
* @param {string} message - Passed to core.warning / core.setFailed * @param {string} message - Passed to core.warning / core.setFailed
* @returns {boolean} - Returns true if the action was 'fail' and the flag was true.
*/ */
export function applyOnAction(action, flag, message) { export function applyOnAction(action, flag, message) {
if (!flag) return false; if (!flag) return;
if (action === "warn") { if (action === "warn") {
core.warning(message); core.warning(message);
return false; return;
} }
if (action === "fail") { if (action === "fail") {
core.setFailed(message); core.setFailed(message);
return true;
} }
return false; // 'ignore' → no-op
} }
/** /**
@@ -181,72 +179,33 @@ export async function postCode() {
return; return;
} }
let api = new ScreepsAPI(login_arguments); let api = new ScreepsAPI(login_arguments);
if (token) {
if (!token) {
core.info(`Logging in as user ${username}`);
try {
await api.auth(username, password, login_arguments);
} catch (err) {
core.error(`Authentication error: ${err}`);
throw err;
}
}
let oldCode = null;
let rollbackOnFailure = false;
try {
rollbackOnFailure = core.getBooleanInput("rollback_on_failure");
} catch (e) {
// getBooleanInput throws if not 'true' or 'false', ignore
}
if (rollbackOnFailure) {
core.info(
`Downloading existing code from branch ${branch} for potential rollback...`,
);
try {
const getResponse = await api.code.get(branch);
if (getResponse && getResponse.ok && getResponse.modules) {
oldCode = getResponse.modules;
core.info(
`Successfully downloaded existing code (modules: ${Object.keys(oldCode).join(", ")})`,
);
} else {
core.setFailed(
`Failed to download existing code, but rollback_on_failure is enabled. Aborting deployment.`,
);
return;
}
} catch (err) {
core.setFailed(
`Error downloading existing code: ${err.message}. Aborting deployment.`,
);
return;
}
}
try {
const response = await api.code.set(branch, files_to_push); const response = await api.code.set(branch, files_to_push);
core.info(JSON.stringify(response, null, 2)); core.info(JSON.stringify(response, null, 2));
core.info(`Code set successfully to ${branch}`); core.info(`Code set successfully to ${branch}`);
} catch (err) { } else {
core.error(`Upload error: ${err}`); core.info(`Logging in as user ${username}`);
throw err; await Promise.resolve()
.then(() => api.auth(username, password, login_arguments))
.then(() => api.code.set(branch, files_to_push))
.then(() => {
core.info(`Code set successfully to ${branch}`);
})
.catch((err) => {
core.error(`Upload error: ${err}`);
throw err;
});
} }
// Console monitoring (optional) // Console monitoring (optional)
const monitorTicks = parseInt(core.getInput("monitor") || "0", 10); const monitorTicks = parseInt(core.getInput("monitor") || "0", 10);
if (monitorTicks > 0) { if (monitorTicks > 0) {
const onTraceback = core.getInput("on_traceback") || "fail";
const onErrorLog = core.getInput("on_error_log") || "warn";
const onWarningLog = core.getInput("on_warning_log") || "ignore";
const result = await monitorConsole(api, { const result = await monitorConsole(api, {
monitor: monitorTicks, monitor: monitorTicks,
logToFile: core.getBooleanInput("log_to_file"), logToFile: core.getBooleanInput("log_to_file"),
onTraceback, onTraceback: core.getInput("on_traceback") || "fail",
onErrorLog, onErrorLog: core.getInput("on_error_log") || "warn",
onWarningLog, onWarningLog: core.getInput("on_warning_log") || "ignore",
monitorInterval: parseInt(core.getInput("monitor_interval") || "10", 10), monitorInterval: parseInt(core.getInput("monitor_interval") || "10", 10),
hostname, hostname,
shard: core.getInput("shard") || undefined, shard: core.getInput("shard") || undefined,
@@ -256,37 +215,21 @@ export async function postCode() {
core.setOutput("saw_error_log", String(result.sawErrorLog)); core.setOutput("saw_error_log", String(result.sawErrorLog));
core.setOutput("saw_warning_log", String(result.sawWarningLog)); core.setOutput("saw_warning_log", String(result.sawWarningLog));
const fail1 = applyOnAction( applyOnAction(
onTraceback, core.getInput("on_traceback"),
result.sawTraceback, result.sawTraceback,
"Screeps console: traceback detected", "Screeps console: traceback detected",
); );
const fail2 = applyOnAction( applyOnAction(
onErrorLog, core.getInput("on_error_log"),
result.sawErrorLog, result.sawErrorLog,
"Screeps console: error log output detected", "Screeps console: error log output detected",
); );
const fail3 = applyOnAction( applyOnAction(
onWarningLog, core.getInput("on_warning_log"),
result.sawWarningLog, result.sawWarningLog,
"Screeps console: warning log output detected", "Screeps console: warning log output detected",
); );
const shouldFail = fail1 || fail2 || fail3;
if (shouldFail && rollbackOnFailure && oldCode) {
core.info(
"Action failed based on monitor configuration. Rolling back to previous code...",
);
try {
await api.code.set(branch, oldCode);
core.info(
`Successfully rolled back to previous code on branch ${branch}.`,
);
} catch (err) {
core.error(`Rollback failed: ${err}`);
}
}
} }
} }
+3 -4
View File
@@ -3,7 +3,6 @@
"version": "0.2.1", "version": "0.2.1",
"description": "Deploys screeps code to the official game or a private server.", "description": "Deploys screeps code to the official game or a private server.",
"type": "module", "type": "module",
"packageManager": "pnpm@11.21.0",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"start": "node index.js", "start": "node index.js",
@@ -17,8 +16,8 @@
"screeps-api": "^1.7.2" "screeps-api": "^1.7.2"
}, },
"devDependencies": { "devDependencies": {
"@vercel/ncc": "^0.44.1", "@vercel/ncc": "^0.38.4",
"@vitest/coverage-v8": "^4.1.10", "@vitest/coverage-v8": "^4.0.16",
"vitest": "^4.1.10" "vitest": "^4.0.16"
} }
} }
+77 -92
View File
@@ -22,14 +22,14 @@ importers:
version: 1.16.1(supports-color@7.2.0) version: 1.16.1(supports-color@7.2.0)
devDependencies: devDependencies:
'@vercel/ncc': '@vercel/ncc':
specifier: ^0.44.1 specifier: ^0.38.4
version: 0.44.1 version: 0.38.4
'@vitest/coverage-v8': '@vitest/coverage-v8':
specifier: ^4.1.10 specifier: ^4.0.16
version: 4.1.11(vitest@4.1.11) version: 4.1.10(vitest@4.1.10)
vitest: vitest:
specifier: ^4.1.10 specifier: ^4.0.16
version: 4.1.11(@vitest/coverage-v8@4.1.11)(vite@8.2.1(yaml@2.9.0)) version: 4.1.10(@vitest/coverage-v8@4.1.10)(vite@8.2.1)
packages: packages:
@@ -89,8 +89,8 @@ packages:
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
'@jridgewell/sourcemap-codec@1.6.0': '@jridgewell/sourcemap-codec@1.5.5':
resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
'@jridgewell/trace-mapping@0.3.31': '@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
@@ -203,24 +203,24 @@ packages:
'@types/estree@1.0.9': '@types/estree@1.0.9':
resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
'@vercel/ncc@0.44.1': '@vercel/ncc@0.38.4':
resolution: {integrity: sha512-cUjIE5P2YY1n+Kt9rFIazMMpGoPn1Fic04rOmTkElMkiDP5oszGfERMpo2shVkFKDL7rVppdM2pqJKC59shQWQ==} resolution: {integrity: sha512-8LwjnlP39s08C08J5NstzriPvW1SP8Zfpp1BvC2sI35kPeZnHfxVkCwu4/+Wodgnd60UtT1n8K8zw+Mp7J9JmQ==}
hasBin: true hasBin: true
'@vitest/coverage-v8@4.1.11': '@vitest/coverage-v8@4.1.10':
resolution: {integrity: sha512-8MVGEFnJIcdGjcbfKmeq8z0pZHH0JlVtoVZH9Q/qwUp6wyFnEJUBMrw9DCaj+ra3vShGmhavjalMIhPNxZAUcw==} resolution: {integrity: sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==}
peerDependencies: peerDependencies:
'@vitest/browser': 4.1.11 '@vitest/browser': 4.1.10
vitest: 4.1.11 vitest: 4.1.10
peerDependenciesMeta: peerDependenciesMeta:
'@vitest/browser': '@vitest/browser':
optional: true optional: true
'@vitest/expect@4.1.11': '@vitest/expect@4.1.10':
resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==} resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==}
'@vitest/mocker@4.1.11': '@vitest/mocker@4.1.10':
resolution: {integrity: sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==} resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==}
peerDependencies: peerDependencies:
msw: ^2.4.9 msw: ^2.4.9
vite: ^6.0.0 || ^7.0.0 || ^8.0.0 vite: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -230,20 +230,20 @@ packages:
vite: vite:
optional: true optional: true
'@vitest/pretty-format@4.1.11': '@vitest/pretty-format@4.1.10':
resolution: {integrity: sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==} resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==}
'@vitest/runner@4.1.11': '@vitest/runner@4.1.10':
resolution: {integrity: sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==} resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==}
'@vitest/snapshot@4.1.11': '@vitest/snapshot@4.1.10':
resolution: {integrity: sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==} resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==}
'@vitest/spy@4.1.11': '@vitest/spy@4.1.10':
resolution: {integrity: sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==} resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==}
'@vitest/utils@4.1.11': '@vitest/utils@4.1.10':
resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==} resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==}
argparse@1.0.10: argparse@1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
@@ -330,8 +330,8 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
es-module-lexer@2.3.2: es-module-lexer@2.3.1:
resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==}
es-object-atoms@1.1.2: es-object-atoms@1.1.2:
resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
@@ -590,10 +590,6 @@ packages:
resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==}
engines: {node: '>=12'} engines: {node: '>=12'}
picomatch@4.0.7:
resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==}
engines: {node: '>=12'}
postcss@8.5.26: postcss@8.5.26:
resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
@@ -716,20 +712,20 @@ packages:
yaml: yaml:
optional: true optional: true
vitest@4.1.11: vitest@4.1.10:
resolution: {integrity: sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==} resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==}
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
'@edge-runtime/vm': '*' '@edge-runtime/vm': '*'
'@opentelemetry/api': ^1.9.0 '@opentelemetry/api': ^1.9.0
'@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
'@vitest/browser-playwright': 4.1.11 '@vitest/browser-playwright': 4.1.10
'@vitest/browser-preview': 4.1.11 '@vitest/browser-preview': 4.1.10
'@vitest/browser-webdriverio': 4.1.11 '@vitest/browser-webdriverio': 4.1.10
'@vitest/coverage-istanbul': 4.1.11 '@vitest/coverage-istanbul': 4.1.10
'@vitest/coverage-v8': 4.1.11 '@vitest/coverage-v8': 4.1.10
'@vitest/ui': 4.1.11 '@vitest/ui': 4.1.10
happy-dom: '*' happy-dom: '*'
jsdom: '*' jsdom: '*'
vite: ^6.0.0 || ^7.0.0 || ^8.0.0 vite: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -777,11 +773,6 @@ packages:
utf-8-validate: utf-8-validate:
optional: true optional: true
yaml@2.9.0:
resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==}
engines: {node: '>= 14.6'}
hasBin: true
yamljs@0.3.0: yamljs@0.3.0:
resolution: {integrity: sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==} resolution: {integrity: sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==}
hasBin: true hasBin: true
@@ -846,12 +837,12 @@ snapshots:
'@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/resolve-uri@3.1.2': {}
'@jridgewell/sourcemap-codec@1.6.0': {} '@jridgewell/sourcemap-codec@1.5.5': {}
'@jridgewell/trace-mapping@0.3.31': '@jridgewell/trace-mapping@0.3.31':
dependencies: dependencies:
'@jridgewell/resolve-uri': 3.1.2 '@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/sourcemap-codec': 1.5.5
'@oxc-project/types@0.143.0': {} '@oxc-project/types@0.143.0': {}
@@ -910,12 +901,12 @@ snapshots:
'@types/estree@1.0.9': {} '@types/estree@1.0.9': {}
'@vercel/ncc@0.44.1': {} '@vercel/ncc@0.38.4': {}
'@vitest/coverage-v8@4.1.11(vitest@4.1.11)': '@vitest/coverage-v8@4.1.10(vitest@4.1.10)':
dependencies: dependencies:
'@bcoe/v8-coverage': 1.0.2 '@bcoe/v8-coverage': 1.0.2
'@vitest/utils': 4.1.11 '@vitest/utils': 4.1.10
ast-v8-to-istanbul: 1.0.5 ast-v8-to-istanbul: 1.0.5
istanbul-lib-coverage: 3.2.2 istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1 istanbul-lib-report: 3.0.1
@@ -924,46 +915,46 @@ snapshots:
obug: 2.1.4 obug: 2.1.4
std-env: 4.2.0 std-env: 4.2.0
tinyrainbow: 3.1.1 tinyrainbow: 3.1.1
vitest: 4.1.11(@vitest/coverage-v8@4.1.11)(vite@8.2.1(yaml@2.9.0)) vitest: 4.1.10(@vitest/coverage-v8@4.1.10)(vite@8.2.1)
'@vitest/expect@4.1.11': '@vitest/expect@4.1.10':
dependencies: dependencies:
'@standard-schema/spec': 1.1.0 '@standard-schema/spec': 1.1.0
'@types/chai': 5.2.3 '@types/chai': 5.2.3
'@vitest/spy': 4.1.11 '@vitest/spy': 4.1.10
'@vitest/utils': 4.1.11 '@vitest/utils': 4.1.10
chai: 6.2.2 chai: 6.2.2
tinyrainbow: 3.1.1 tinyrainbow: 3.1.1
'@vitest/mocker@4.1.11(vite@8.2.1(yaml@2.9.0))': '@vitest/mocker@4.1.10(vite@8.2.1)':
dependencies: dependencies:
'@vitest/spy': 4.1.11 '@vitest/spy': 4.1.10
estree-walker: 3.0.3 estree-walker: 3.0.3
magic-string: 0.30.21 magic-string: 0.30.21
optionalDependencies: optionalDependencies:
vite: 8.2.1(yaml@2.9.0) vite: 8.2.1
'@vitest/pretty-format@4.1.11': '@vitest/pretty-format@4.1.10':
dependencies: dependencies:
tinyrainbow: 3.1.1 tinyrainbow: 3.1.1
'@vitest/runner@4.1.11': '@vitest/runner@4.1.10':
dependencies: dependencies:
'@vitest/utils': 4.1.11 '@vitest/utils': 4.1.10
pathe: 2.0.3 pathe: 2.0.3
'@vitest/snapshot@4.1.11': '@vitest/snapshot@4.1.10':
dependencies: dependencies:
'@vitest/pretty-format': 4.1.11 '@vitest/pretty-format': 4.1.10
'@vitest/utils': 4.1.11 '@vitest/utils': 4.1.10
magic-string: 0.30.21 magic-string: 0.30.21
pathe: 2.0.3 pathe: 2.0.3
'@vitest/spy@4.1.11': {} '@vitest/spy@4.1.10': {}
'@vitest/utils@4.1.11': '@vitest/utils@4.1.10':
dependencies: dependencies:
'@vitest/pretty-format': 4.1.11 '@vitest/pretty-format': 4.1.10
convert-source-map: 2.0.0 convert-source-map: 2.0.0
tinyrainbow: 3.1.1 tinyrainbow: 3.1.1
@@ -987,7 +978,7 @@ snapshots:
form-data: 4.0.6 form-data: 4.0.6
proxy-from-env: 1.1.0 proxy-from-env: 1.1.0
transitivePeerDependencies: transitivePeerDependencies:
- debug - debug
balanced-match@1.0.2: {} balanced-match@1.0.2: {}
@@ -1044,7 +1035,7 @@ snapshots:
es-errors@1.3.0: {} es-errors@1.3.0: {}
es-module-lexer@2.3.2: {} es-module-lexer@2.3.1: {}
es-object-atoms@1.1.2: es-object-atoms@1.1.2:
dependencies: dependencies:
@@ -1210,7 +1201,7 @@ snapshots:
magic-string@0.30.21: magic-string@0.30.21:
dependencies: dependencies:
'@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/sourcemap-codec': 1.5.5
magicast@0.5.4: magicast@0.5.4:
dependencies: dependencies:
@@ -1266,8 +1257,6 @@ snapshots:
picomatch@4.0.5: {} picomatch@4.0.5: {}
picomatch@4.0.7: {}
postcss@8.5.26: postcss@8.5.26:
dependencies: dependencies:
nanoid: 3.3.18 nanoid: 3.3.18
@@ -1307,7 +1296,7 @@ snapshots:
bufferutil: 4.1.0 bufferutil: 4.1.0
utf-8-validate: 5.0.10 utf-8-validate: 5.0.10
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
semver@7.8.5: {} semver@7.8.5: {}
@@ -1355,7 +1344,7 @@ snapshots:
node-gyp-build: 4.8.4 node-gyp-build: 4.8.4
optional: true optional: true
vite@8.2.1(yaml@2.9.0): vite@8.2.1:
dependencies: dependencies:
lightningcss: 1.33.0 lightningcss: 1.33.0
picomatch: 4.0.5 picomatch: 4.0.5
@@ -1364,34 +1353,33 @@ snapshots:
tinyglobby: 0.2.17 tinyglobby: 0.2.17
optionalDependencies: optionalDependencies:
fsevents: 2.3.3 fsevents: 2.3.3
yaml: 2.9.0
vitest@4.1.11(@vitest/coverage-v8@4.1.11)(vite@8.2.1(yaml@2.9.0)): vitest@4.1.10(@vitest/coverage-v8@4.1.10)(vite@8.2.1):
dependencies: dependencies:
'@vitest/expect': 4.1.11 '@vitest/expect': 4.1.10
'@vitest/mocker': 4.1.11(vite@8.2.1(yaml@2.9.0)) '@vitest/mocker': 4.1.10(vite@8.2.1)
'@vitest/pretty-format': 4.1.11 '@vitest/pretty-format': 4.1.10
'@vitest/runner': 4.1.11 '@vitest/runner': 4.1.10
'@vitest/snapshot': 4.1.11 '@vitest/snapshot': 4.1.10
'@vitest/spy': 4.1.11 '@vitest/spy': 4.1.10
'@vitest/utils': 4.1.11 '@vitest/utils': 4.1.10
es-module-lexer: 2.3.2 es-module-lexer: 2.3.1
expect-type: 1.4.0 expect-type: 1.4.0
magic-string: 0.30.21 magic-string: 0.30.21
obug: 2.1.4 obug: 2.1.4
pathe: 2.0.3 pathe: 2.0.3
picomatch: 4.0.7 picomatch: 4.0.5
std-env: 4.2.0 std-env: 4.2.0
tinybench: 2.9.0 tinybench: 2.9.0
tinyexec: 1.3.0 tinyexec: 1.3.0
tinyglobby: 0.2.17 tinyglobby: 0.2.17
tinyrainbow: 3.1.1 tinyrainbow: 3.1.1
vite: 8.2.1(yaml@2.9.0) vite: 8.2.1
why-is-node-running: 2.3.0 why-is-node-running: 2.3.0
optionalDependencies: optionalDependencies:
'@vitest/coverage-v8': 4.1.11(vitest@4.1.11) '@vitest/coverage-v8': 4.1.10(vitest@4.1.10)
transitivePeerDependencies: transitivePeerDependencies:
- msw - msw
why-is-node-running@2.3.0: why-is-node-running@2.3.0:
dependencies: dependencies:
@@ -1405,9 +1393,6 @@ snapshots:
bufferutil: 4.1.0 bufferutil: 4.1.0
utf-8-validate: 5.0.10 utf-8-validate: 5.0.10
yaml@2.9.0:
optional: true
yamljs@0.3.0: yamljs@0.3.0:
dependencies: dependencies:
argparse: 1.0.10 argparse: 1.0.10