diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 4bdaad87ee9..cf485aa8b2e 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -2,13 +2,12 @@ "extends": [ "github>tryghost/renovate-config" ], - // Cap total open Renovate PRs at 10. The shared preset extends - // :disableRateLimiting (prConcurrentLimit: 0, prHourlyLimit: 0), so - // branchConcurrentLimit alone leaks — it exempts grouped, automerge- - // eligible, and vulnerability PRs, and is enforced per-run rather than - // as a true total. Setting prConcurrentLimit overrides the preset and - // gives us a hard ceiling regardless of update type. branchConcurrentLimit - // stays as a secondary guardrail. + // Keep Renovate's own concurrency guardrails in place. The shared preset + // extends :disableRateLimiting (prConcurrentLimit: 0, prHourlyLimit: 0), + // so these override that unlimited default. The true "no more than 10 + // open Renovate PRs" cap is enforced in .github/workflows/renovate.yml + // because Renovate's vulnerability-alert path can bypass these limits and + // because we need the cap to be based on the live GitHub PR count. "prConcurrentLimit": 10, "branchConcurrentLimit": 10, // Keep manually-closed immortal/grouped PRs closed unless explicitly @@ -35,7 +34,8 @@ // Soak every dependency update for 72 hours before opening a PR. This guards // against compromised publishes (malicious version yanked within a few hours) // and against unstable releases that get hotfixed shortly after publish. - // Applies to vulnerability alerts too — see the comment on vulnerabilityAlerts. + // Vulnerability-alert PRs require dashboard approval below so they do not + // bypass the live open-PR cap enforced by the workflow. "minimumReleaseAge": "3 days", "timezone": "Etc/UTC", // Restrict Renovate runs to the automerge windows so branch updates @@ -51,8 +51,8 @@ // self-hosted workflow that means a CI-storm of force-pushes across all // open Renovate PRs during the workday. Setting `updateNotScheduled: // false` keeps existing branch maintenance inside the same windows. - // `vulnerabilityAlerts.schedule: "at any time"` overrides this for - // CVE-driven PRs so security work still flows intraday. + // Existing branches can still be maintained outside the normal creation + // schedule when the workflow switches Renovate into cap-reached mode. "updateNotScheduled": false, "schedule": [ // Run all weekend @@ -74,12 +74,9 @@ "* 22-23 * * 1-5", "* 0-4 * * 2-6" ], - // CVE-driven updates skip the weekend schedule and the dashboard- - // approval gate, and stay rebased against main so conflicts don't - // strand them. The 72h release-age soak from the top-level - // minimumReleaseAge still applies here so a malicious "fix" publish - // can't fast-track into main. Automerge is configured per update-type - // in packageRules below so security majors still wait for human review. + // Vulnerability alerts normally bypass Renovate's PR concurrency, hourly + // PR, and schedule limits. Let them keep doing that so security fixes can + // still create PRs even when normal dependency updates are capped. "vulnerabilityAlerts": { "schedule": ["at any time"], "rebaseWhen": "behind-base-branch", diff --git a/.github/scripts/i18n-review/package-lock.json b/.github/scripts/i18n-review/package-lock.json index c57878d7ee7..3cf435480ad 100644 --- a/.github/scripts/i18n-review/package-lock.json +++ b/.github/scripts/i18n-review/package-lock.json @@ -8,7 +8,7 @@ "name": "@ghost-internal/i18n-review", "version": "0.1.0", "dependencies": { - "@anthropic-ai/sdk": "^0.40.1", + "@anthropic-ai/sdk": "^0.98.0", "@octokit/rest": "^21.0.2" }, "engines": { @@ -16,18 +16,33 @@ } }, "node_modules/@anthropic-ai/sdk": { - "version": "0.40.1", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.40.1.tgz", - "integrity": "sha512-DJMWm8lTEM9Lk/MSFL+V+ugF7jKOn0M2Ujvb5fN8r2nY14aHbGPZ1k6sgjL+tpJ3VuOGJNG+4R83jEpOuYPv8w==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.98.0.tgz", + "integrity": "sha512-N7aXtCvC5g6T1Y4V29lJjceu/zTkVkIZF0jdBvagr0TRFHuKeImffalGWEfqZKrvjH+IQbzJWw6TmSmUzrlMgg==", "license": "MIT", "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" + "json-schema-to-ts": "^3.1.1", + "standardwebhooks": "^1.0.0" + }, + "bin": { + "anthropic-ai-sdk": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, "node_modules/@octokit/auth-token": { @@ -214,53 +229,10 @@ "@octokit/openapi-types": "^25.1.0" } }, - "node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.4" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "node_modules/@stablelib/base64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/base64/-/base64-1.0.1.tgz", + "integrity": "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==", "license": "MIT" }, "node_modules/before-after-hook": { @@ -269,108 +241,6 @@ "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", "license": "Apache-2.0" }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/fast-content-type-parse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", @@ -387,233 +257,39 @@ ], "license": "MIT" }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", - "license": "MIT" - }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "license": "MIT", - "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" - }, - "engines": { - "node": ">= 12.20" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { + "node_modules/fast-sha256": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } + "resolved": "https://registry.npmjs.org/fast-sha256/-/fast-sha256-1.3.0.tgz", + "integrity": "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==", + "license": "Unlicense" }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "node_modules/json-schema-to-ts": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", + "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", "license": "MIT", "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" + "@babel/runtime": "^7.18.3", + "ts-algebra": "^2.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=16" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/node-domexception": { + "node_modules/standardwebhooks": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "resolved": "https://registry.npmjs.org/standardwebhooks/-/standardwebhooks-1.0.0.tgz", + "integrity": "sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==", "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "@stablelib/base64": "^1.0.0", + "fast-sha256": "^1.3.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "node_modules/ts-algebra": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", + "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", "license": "MIT" }, "node_modules/universal-user-agent": { @@ -621,31 +297,6 @@ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", "license": "ISC" - }, - "node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } } } } diff --git a/.github/scripts/i18n-review/package.json b/.github/scripts/i18n-review/package.json index 018eb165554..f3a615cae79 100644 --- a/.github/scripts/i18n-review/package.json +++ b/.github/scripts/i18n-review/package.json @@ -10,7 +10,7 @@ "test": "node --test" }, "dependencies": { - "@anthropic-ai/sdk": "^0.40.1", + "@anthropic-ai/sdk": "^0.98.0", "@octokit/rest": "^21.0.2" }, "engines": { diff --git a/.github/workflows/renovate.yml b/.github/workflows/renovate.yml index 03566ba6865..796c53590fb 100644 --- a/.github/workflows/renovate.yml +++ b/.github/workflows/renovate.yml @@ -4,16 +4,18 @@ name: Renovate # more frequently than ~4h and clear the dependency backlog within the existing # automerge windows. See PLA-48 for the throughput rationale; # .github/renovate.json5 is still the source of truth for package rules, -# schedule, and automergeSchedule. +# schedule, and automergeSchedule. This workflow adds the live GitHub open-PR +# cap because Renovate's config-level limits are not enough to express "run +# maintenance, but create no more PRs once 10 are open." on: schedule: # Wake the runner only inside the windows where Renovate is actually # allowed to open or maintain PRs (see `schedule` in renovate.json5), - # plus a single weekday daytime tick to service `vulnerabilityAlerts. - # schedule: "at any time"` for CVE-driven PRs. Ticks outside those - # windows aren't no-ops in practice — each one is a 20-30min full - # extract — so the previous `17 * * * *` was burning ~17h/day of - # Actions compute for no merge benefit. + # plus a single weekday daytime tick to keep vulnerability-alert state + # fresh in the Dependency Dashboard. Ticks outside those windows aren't + # no-ops in practice — each one is a 20-30min full extract — so the + # previous `17 * * * *` was burning ~17h/day of Actions compute for no + # merge benefit. # # :17-past-the-hour offset avoids top-of-hour GH Actions scheduler # contention, which was dropping roughly every other tick on `0 * * * *`. @@ -64,9 +66,61 @@ jobs: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - - name: Allow manual run outside schedule - if: ${{ github.event_name == 'workflow_dispatch' && inputs.ignoreSchedule }} - run: echo 'RENOVATE_FORCE={"schedule":null,"automergeSchedule":null}' >> "$GITHUB_ENV" + # Enforce a live cap on open Renovate PRs while still letting Renovate + # maintain and automerge the PRs that already exist. + # + # Why this lives outside renovate.json5: + # - prConcurrentLimit/branchConcurrentLimit are useful guardrails, but + # Renovate computes them from the branches in the current run rather + # than by asking GitHub for every open Renovate PR. + # - vulnerability-alert PRs can bypass Renovate's normal branch, PR, + # hourly, and schedule limits. + # + # Below the cap, restrict PR creation to the number of slots left. At or + # above the cap, or when RENOVATE_MAINTENANCE_ONLY=true, force dashboard + # approval for new branches/PRs while allowing existing PR branches to + # keep updating outside the creation schedule. That gives us "rebase and + # merge the 10, but create no more." + - name: Configure Renovate PR cap + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + PR_CAP: ${{ vars.RENOVATE_OPEN_PR_CAP || '10' }} + MAINTENANCE_ONLY: ${{ vars.RENOVATE_MAINTENANCE_ONLY || 'false' }} + IGNORE_SCHEDULE: ${{ github.event_name == 'workflow_dispatch' && inputs.ignoreSchedule }} + run: | + set -euo pipefail + + if ! [[ "$PR_CAP" =~ ^[0-9]+$ ]]; then + echo "::warning::RENOVATE_OPEN_PR_CAP must be a non-negative integer; falling back to 10." + PR_CAP=10 + fi + + open_count=$(gh pr list \ + --repo "${{ github.repository }}" \ + --author "app/tryghost-renovate" \ + --state open \ + --json number --jq 'length') + + echo "Renovate has $open_count open PRs (cap: $PR_CAP)" + + if [ "$MAINTENANCE_ONLY" = "true" ]; then + force='{"dependencyDashboardApproval":true,"prCreation":"approval","updateNotScheduled":true,"vulnerabilityAlerts":{"dependencyDashboardApproval":false}}' + echo "::notice::RENOVATE_MAINTENANCE_ONLY=true. Running in maintenance-only mode: existing PRs may update/automerge, new PRs require dashboard approval." + elif [ "$open_count" -ge "$PR_CAP" ]; then + force='{"dependencyDashboardApproval":true,"prCreation":"approval","updateNotScheduled":true,"vulnerabilityAlerts":{"dependencyDashboardApproval":false}}' + echo "::notice::Renovate is at or above the open PR cap. Running in maintenance-only mode: existing PRs may update/automerge, new PRs require dashboard approval." + else + remaining=$((PR_CAP - open_count)) + force="{\"prHourlyLimit\":$remaining}" + + if [ "$IGNORE_SCHEDULE" = "true" ]; then + force="{\"schedule\":null,\"automergeSchedule\":null,\"prHourlyLimit\":$remaining}" + fi + + echo "Renovate may create up to $remaining PR(s) in this run." + fi + + echo "RENOVATE_FORCE=$force" >> "$GITHUB_ENV" - name: Self-hosted Renovate uses: renovatebot/github-action@693b9ef15eec82123529a37c782242f091365961 # v46.1.14 diff --git a/apps/activitypub/package.json b/apps/activitypub/package.json index 9aa2c101db7..1d5c1a86247 100644 --- a/apps/activitypub/package.json +++ b/apps/activitypub/package.json @@ -79,7 +79,7 @@ } }, "dependencies": { - "@hookform/resolvers": "5.2.2", + "@hookform/resolvers": "5.4.0", "@radix-ui/react-form": "0.1.8", "@tanstack/react-query": "catalog:", "@tryghost/admin-x-framework": "workspace:*", diff --git a/apps/shade/package.json b/apps/shade/package.json index a23d57c798d..fe3b604ce85 100644 --- a/apps/shade/package.json +++ b/apps/shade/package.json @@ -113,8 +113,8 @@ "vitest": "catalog:" }, "dependencies": { - "@hookform/resolvers": "5.2.2", - "@number-flow/react": "0.5.10", + "@hookform/resolvers": "5.4.0", + "@number-flow/react": "0.6.0", "@radix-ui/react-accordion": "1.2.12", "@radix-ui/react-alert-dialog": "1.1.15", "@radix-ui/react-avatar": "1.1.11", diff --git a/ghost/core/core/frontend/public/ghost.css b/ghost/core/core/frontend/public/ghost.css index d26065a34c8..9f86bbec5a0 100644 --- a/ghost/core/core/frontend/public/ghost.css +++ b/ghost/core/core/frontend/public/ghost.css @@ -716,6 +716,10 @@ h2 { margin-bottom: 20px; } +.gh-flow-content.private h1 { + text-align: center; +} + .gh-private-dialog { width: min(92vw, 440px); padding: 0; diff --git a/ghost/core/core/frontend/src/ghost-stats/ghost-stats.js b/ghost/core/core/frontend/src/ghost-stats/ghost-stats.js index 9edc143b819..8cf6d38a931 100644 --- a/ghost/core/core/frontend/src/ghost-stats/ghost-stats.js +++ b/ghost/core/core/frontend/src/ghost-stats/ghost-stats.js @@ -42,11 +42,11 @@ export class GhostStats { config.host = currentScript.getAttribute('data-host'); config.token = currentScript.getAttribute('data-token') || null; config.domain = currentScript.getAttribute('data-domain'); - + // Get optional parameters config.datasource = currentScript.getAttribute('data-datasource') || config.datasource; config.stringifyPayload = currentScript.getAttribute('data-stringify-payload') !== 'false'; - + // Get global attributes for (const attr of currentScript.attributes) { if (attr.name.startsWith('tb_')) { @@ -115,11 +115,11 @@ export class GhostStats { }); this.browser.clearTimeout(timeoutId); - + if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } - + return response; } catch (error) { // Silently fail for tracking errors @@ -141,9 +141,9 @@ export class GhostStats { // Get locale, falling back gracefully const navigator = this.browser.getNavigator(); const locale = navigator?.languages?.[0] || navigator?.language || 'en'; - return { + return { country: countryData ? countryData.id : null, // Returns country code - locale + locale }; } catch (error) { return { country: null, locale: 'en' }; @@ -234,7 +234,7 @@ export class GhostStats { // Expose global API if (this.browser.window) { - this.browser.window.Tinybird = { + this.browser.window.Tinybird = { trackEvent: (name, payload) => this.trackEvent(name, payload), _trackPageHit: () => this.trackPageHit() }; @@ -259,4 +259,4 @@ export const setupEventListeners = ghostStats.setupEventListeners.bind(ghostStat export const init = ghostStats.init.bind(ghostStats); // Also export the instance for testing -export const ghostStatsInstance = ghostStats; \ No newline at end of file +export const ghostStatsInstance = ghostStats; diff --git a/ghost/core/core/frontend/src/utils/privacy.js b/ghost/core/core/frontend/src/utils/privacy.ts similarity index 52% rename from ghost/core/core/frontend/src/utils/privacy.js rename to ghost/core/core/frontend/src/utils/privacy.ts index 91109bfc811..cbb8fdf43e6 100644 --- a/ghost/core/core/frontend/src/utils/privacy.js +++ b/ghost/core/core/frontend/src/utils/privacy.ts @@ -1,3 +1,5 @@ +import type {JsonValue} from 'type-fest'; + /** * Utility functions for data privacy and PII protection */ @@ -6,58 +8,52 @@ * Default attributes that should be masked for privacy */ export const SENSITIVE_ATTRIBUTES = [ - 'username', - 'user', - 'user_id', + 'username', + 'user', + 'user_id', 'userid', - 'password', - 'pass', - 'pin', + 'password', + 'pass', + 'pin', 'passcode', - 'token', - 'api_token', - 'email', + 'token', + 'api_token', + 'email', 'address', - 'phone', - 'sex', + 'phone', + 'sex', 'gender', - 'order', - 'order_id', + 'order', + 'order_id', 'orderid', - 'payment', + 'payment', 'credit_card' ]; /** * Mask sensitive attributes in a payload - * - * @param {Object} payload - The payload to mask - * @param {string[]} [attributesToMask] - Custom list of attributes to mask - * @returns {string} JSON string with masked values */ -export function maskSensitiveData(payload, attributesToMask = SENSITIVE_ATTRIBUTES) { +export function maskSensitiveData(payload: unknown, attributesToMask: ReadonlyArray = SENSITIVE_ATTRIBUTES): string { // Deep copy let payloadStr = JSON.stringify(payload); - - attributesToMask.forEach(attr => { + + attributesToMask.forEach((attr) => { payloadStr = payloadStr.replace( new RegExp(`("${attr}"):(".+?"|\\d+)`, 'mgi'), '$1:"********"' ); }); - + return payloadStr; } /** * Process a payload with sensitive data masked - * - * @param {Object} payload - The original payload - * @param {Object} globalAttributes - Additional attributes to add - * @param {boolean} stringify - Whether to return a string or object - * @returns {string|Object} Processed payload */ -export function processPayload(payload, globalAttributes = {}, stringify = true) { +export function processPayload(payload: unknown, globalAttributes?: Record, stringify?: true): string; +export function processPayload(payload: unknown, globalAttributes: Record, stringify: false): JsonValue; +export function processPayload(payload: unknown, globalAttributes?: Record, stringify?: boolean): string | JsonValue; +export function processPayload(payload: unknown, globalAttributes = {}, stringify = true): string | JsonValue { if (stringify) { const maskedStr = maskSensitiveData(payload); const processed = Object.assign({}, JSON.parse(maskedStr), globalAttributes); @@ -67,4 +63,4 @@ export function processPayload(payload, globalAttributes = {}, stringify = true) const maskedStr = maskSensitiveData(processed); return JSON.parse(maskedStr); } -} \ No newline at end of file +} diff --git a/ghost/core/package.json b/ghost/core/package.json index a227f48fcab..a803412a469 100644 --- a/ghost/core/package.json +++ b/ghost/core/package.json @@ -82,7 +82,7 @@ "cli": "^1.29.1" }, "dependencies": { - "@aws-sdk/client-s3": "3.1025.0", + "@aws-sdk/client-s3": "3.1053.0", "@extractus/oembed-extractor": "3.2.1", "@faker-js/faker": "7.6.0", "@isaacs/ttlcache": "1.4.1", @@ -217,7 +217,7 @@ "nconf": "0.13.0", "node-fetch": "2.7.0", "node-jose": "2.2.0", - "nodemailer": "8.0.7", + "nodemailer": "8.0.8", "on-headers": "1.1.0", "otplib": "12.0.1", "papaparse": "5.5.3", @@ -235,6 +235,7 @@ "superagent-throttle": "1.0.1", "terser": "5.46.1", "tiny-glob": "0.2.9", + "type-fest": "catalog:", "ua-parser-js": "1.0.41", "xml": "1.0.1", "zod": "4.1.12" diff --git a/ghost/core/test/unit/frontend/src/privacy.test.js b/ghost/core/test/unit/frontend/src/privacy.test.ts similarity index 84% rename from ghost/core/test/unit/frontend/src/privacy.test.js rename to ghost/core/test/unit/frontend/src/privacy.test.ts index 5487cb6f603..c752b58989e 100644 --- a/ghost/core/test/unit/frontend/src/privacy.test.js +++ b/ghost/core/test/unit/frontend/src/privacy.test.ts @@ -1,10 +1,8 @@ -const assert = require('node:assert/strict'); - -// Use path relative to test file -const { +import assert from 'node:assert/strict'; +import { processPayload, maskSensitiveData -} = require('../../../../core/frontend/src/utils/privacy'); +} from '../../../../core/frontend/src/utils/privacy'; describe('Privacy Utils', function () { describe('maskSensitiveData', function () { @@ -15,30 +13,30 @@ describe('Privacy Utils', function () { email: 'john@example.com', normal: 'data' }; - + const result = maskSensitiveData(payload); const parsed = JSON.parse(result); - + assert.equal(parsed.user, '********'); assert.equal(parsed.user_id, '********'); assert.equal(parsed.email, '********'); assert.equal(parsed.normal, 'data'); }); - + it('should mask custom sensitive attributes', function () { const payload = { custom_field: 'sensitive', normal: 'data' }; - + const customAttributes = ['custom_field']; const result = maskSensitiveData(payload, customAttributes); const parsed = JSON.parse(result); - + assert.equal(parsed.custom_field, '********'); assert.equal(parsed.normal, 'data'); }); - + it('should handle nested objects', function () { const payload = { data: { @@ -49,21 +47,21 @@ describe('Privacy Utils', function () { }, normal: 'data' }; - + const result = maskSensitiveData(payload); const parsed = JSON.parse(result); - + assert.equal(parsed.data.user, '********'); assert.equal(parsed.data.details.email, '********'); assert.equal(parsed.normal, 'data'); }); - + it('should handle empty payloads', function () { const payload = {}; - + const result = maskSensitiveData(payload); const parsed = JSON.parse(result); - + assert.deepEqual(parsed, {}); }); }); @@ -74,67 +72,70 @@ describe('Privacy Utils', function () { email: 'john@example.com', normal: 'data' }; - + const result = processPayload(payload); - + assert.equal(typeof result, 'string'); const parsed = JSON.parse(result); assert.equal(parsed.email, '********'); assert.equal(parsed.normal, 'data'); }); - + it('should add global attributes to payload', function () { const payload = { data: 'value' }; - + const globalAttributes = { global: 'attribute' }; - + const result = processPayload(payload, globalAttributes); const parsed = JSON.parse(result); - + assert.equal(parsed.data, 'value'); assert.equal(parsed.global, 'attribute'); }); - + it('should return object when stringify is false', function () { const payload = { email: 'john@example.com', normal: 'data' }; - + const result = processPayload(payload, {}, false); - - assert.equal(typeof result, 'object'); - assert.equal(result.email, '********'); - assert.equal(result.normal, 'data'); + + assert.deepEqual(result, { + email: '********', + normal: 'data' + }); }); - + it('should mask sensitive data in global attributes', function () { const payload = { normal: 'data' }; - + const globalAttributes = { email: 'john@example.com' }; - + const result = processPayload(payload, globalAttributes, false); - - assert.equal(result.email, '********'); - assert.equal(result.normal, 'data'); + + assert.deepEqual(result, { + email: '********', + normal: 'data' + }); }); - + it('should handle empty payload and attributes', function () { const payload = {}; const globalAttributes = {}; - + const result = processPayload(payload, globalAttributes); const parsed = JSON.parse(result); - + assert.deepEqual(parsed, {}); }); }); -}); \ No newline at end of file +}); diff --git a/ghost/i18n/locales/bg/comments.json b/ghost/i18n/locales/bg/comments.json index d64542c04a2..a38aa457ef0 100644 --- a/ghost/i18n/locales/bg/comments.json +++ b/ghost/i18n/locales/bg/comments.json @@ -12,7 +12,7 @@ "Already a member?": "Вече сте абонат?", "Anonymous": "Анонимен", "Are you sure?": "Убедени ли сте?", - "Back": "", + "Back": "Назад", "Become a member of {publication} to start commenting.": "Абонирайте се за {publication}, за да коментирате.", "Become a paid member of {publication} to start commenting.": "Станете плащащ абонат на {publication}, за да коментирате.", "Best": "Най-добрите", @@ -50,9 +50,9 @@ "Once deleted, this comment can’t be recovered.": "Веднъж изтрит, коментарът не може да бъде възстановен.", "One hour ago": "Преди час", "One min ago": "Преди минута", - "Pin comment": "", - "Pinned": "", - "Read more replies": "", + "Pin comment": "Залепи коментара", + "Pinned": "Залепен", + "Read more replies": "Още отговори", "Remove dislike": "", "Remove like": "", "removed": "премахнат", @@ -64,7 +64,7 @@ "Report comment": "Докладване на коментара", "Report this comment?": "Ще докладвате ли коментара?", "Save": "Запис", - "See full discussion": "", + "See full discussion": "Вижте цялата дискусия", "Sending": "Изпращане", "Sent": "Изпратен", "Show {amount} more replies": "Покажи още {amount} отговора", @@ -77,8 +77,8 @@ "The linked comment is no longer available.": "Посоченият коментар вече не е наличен.", "This comment has been hidden.": "Този коментар е скрит.", "This comment has been removed.": "Този коментар е премахнат.", - "Unpin": "", - "Unpin comment": "", + "Unpin": "Отлепи", + "Unpin comment": "Отлепи коментара", "Upgrade now": "Надградете сега", "View in admin": "Преглед в админ панела", "Yesterday": "Вчера", diff --git a/ghost/i18n/locales/bg/ghost.json b/ghost/i18n/locales/bg/ghost.json index d11020e87ad..58fbada02b4 100644 --- a/ghost/i18n/locales/bg/ghost.json +++ b/ghost/i18n/locales/bg/ghost.json @@ -1,10 +1,10 @@ { - "{count} month_one": "", - "{count} month_other": "", - "{count} year_one": "", - "{count} year_other": "", + "{count} month_one": "{count} месец", + "{count} month_other": "{count} месеца", + "{count} year_one": "{count} година", + "{count} year_other": "{count} години", "{date}": "{date}", - "{tierName} membership": "", + "{tierName} membership": "План {tierName}", "All the best!": "Сърдечни поздрави!", "Become a paid member of {site} to get access to all premium content.": "Станете плащащ абонат на {site} за да получите достъп до специалното съдържание за абонати.", "By {authors}": "от {authors}", @@ -17,18 +17,18 @@ "Confirm your email address": "Потвърдете имейл адреса си", "Confirm your email update for {siteTitle}!": "Потвърдете промяната на имейл адреса си за {siteTitle}!", "Confirm your subscription to {siteTitle}": "Потвърдете абонамента си за {siteTitle}", - "Continue subscription": "", + "Continue subscription": "Продължаване на абонамента", "Device:": "Устройство:", "Email": "Имейл", "For security verification, enter the code below to sign in to {siteTitle}:": "От съображения за сигурност въведете кода по-долу, за да влезете в сайта {siteTitle}:", "For your security, the link will expire in 24 hours time.": "За ваша сигурност линкът ще бъде валиден само 24 часа.", "free": "безплатен", "Gift subscription": "", - "Here's how to keep your {tierName} membership.": "", + "Here's how to keep your {tierName} membership.": "Ето как да запазите своя {tierName} план.", "Here's your code to login to {siteTitle}": "Ето вашия код за вход в {siteTitle}", "Hey there,": "Здравейте,", "Hey there!": "Здравейте!", - "Hi {firstName},": "", + "Hi {firstName},": "Здравейте, {firstName},", "If you did not make this request, you can safely ignore this email.": "Ако не сте направили тази заявка, може да игнорирате този имейл.", "If you did not make this request, you can simply delete this message.": "Ако не сте направили тази заявка, може просто да изтриете този имейл.", "If you didn't try to sign in recently, you can safely ignore this email to deny access.": "Ако наскоро не сте опитвали да влезете, може спокойно да игнорирате този имейл, за да откажете достъп.", @@ -41,14 +41,14 @@ "Name": "Име", "New comment on {postTitle}": "Нов коментар към {postTitle}", "New reply to your comment on {siteTitle}": "Нов отговор на вашия коментар в {siteTitle}", - "one-month": "", - "one-year": "", - "Open this link to redeem your gift.": "", + "one-month": "едномесечен", + "one-year": "едногодишен", + "Open this link to redeem your gift.": "Отворете тази връзка, за да активирате подаръка си.", "Or use this link to securely sign in": "Или използвайте този линк, за да влезете по сигурен начин", "Or, skip the code and sign in directly": "Или пропуснете кода и влезте директно", "paid": "платен", "Please confirm your email address with this link:": "Моля, потвърдете своя имейл адрес чрез този линк:", - "Redeem your gift subscription": "", + "Redeem your gift subscription": "Активирайте своя подарен абонамент", "Secure sign in link for {siteTitle}": "Линк за сигурно влизане в сайта {siteTitle}", "See you soon!": "До скоро!", "Sent to {email}": "Изпратено до {email}", @@ -66,13 +66,13 @@ "Thank you for subscribing to {siteTitle}!": "Благодарим Ви, че се абонирахте за {siteTitle}!", "Thank you for subscribing to {siteTitle}.": "Благодарим Ви, че се абонирахте за {siteTitle}.", "Thank you for subscribing to {siteTitle}. Tap the link below to be automatically signed in:": "Благодарим Ви, че се абонирахте за {siteTitle}. Използвайте бутона долу за автоматично влизане в сайта:", - "Thank you for supporting {siteTitle}.": "", - "Thank you for your support. Share the link below with whoever you'd like to gift them a {cadenceLabel} {tierName} membership to {siteTitle}.": "", - "Thanks for reading {siteTitle}.": "", - "The link expires on {expiresAt} and can only be redeemed once.": "", + "Thank you for supporting {siteTitle}.": "Благодарим ви, че подкрепяте {siteTitle}.", + "Thank you for your support. Share the link below with whoever you'd like to gift them a {cadenceLabel} {tierName} membership to {siteTitle}.": "Благодарим ви за подкрепата. Споделете връзката по-долу с комуто желаете да подарите {cadenceLabel} абонамент {tierName} за {siteTitle}.", + "Thanks for reading {siteTitle}.": "Благодарим ви, че четете {siteTitle}.", + "The link expires on {expiresAt} and can only be redeemed once.": "Връзката изтича на {expiresAt} и може да бъде активирана само веднъж.", "This email address will not be used.": "Този имейл адрес няма да бъде използван.", "This message was sent from {siteDomain} to {email}.": "Това съобщение е изпратено от {siteDomain} до {email}.", - "To keep your {tierName} membership, continue with a paid subscription today and we'll automatically add the rest of your gift period as a free trial.": "", + "To keep your {tierName} membership, continue with a paid subscription today and we'll automatically add the rest of your gift period as a free trial.": "За да запазите {tierName} плана си, преминете към платен абонамент още днес и ние автоматично ще добавим остатъка от подарения ви период като безплатен пробен период.", "trialing": "пробен", "Unsubscribe": "Отписване", "Unsubscribe from comment reply notifications": "Отписване от уведомленията за отговори на коментари", @@ -94,13 +94,13 @@ "You will not be subscribed.": "Няма да бъдете абонирани.", "You're one tap away from subscribing to {siteTitle} — please confirm your email address with this link:": "Вие сте на стъпка от абонирането си за {siteTitle} - моля, потвърдете имейла си, като ползвате този линк:", "You're one tap away from subscribing to {siteTitle}!": "Вие сте на една стъпка от това да се абонирате за {siteTitle}!", - "You've been gifted a {duration}-month {tierName} membership to {siteTitle}": "", - "You've been gifted a {duration}-year {tierName} membership to {siteTitle}": "", + "You've been gifted a {duration}-month {tierName} membership to {siteTitle}": "Подарен ви е {duration}-месечен абонамент {tierName} за {siteTitle}", + "You've been gifted a {duration}-year {tierName} membership to {siteTitle}": "Подарен ви е {duration}-годишен абонамент {tierName} за {siteTitle}", "Your free trial ends on {date}, at which time you will be charged the regular price. You can always cancel before then.": "Безплатният пробен период приключва на {date}, след което ще бъдете таксувани по редовната цена. Винаги може да се откажете преди това.", - "Your gift is ready": "", - "Your gift subscription confirmation": "", - "Your gift subscription is ending soon": "", - "Your gift subscription to {siteTitle} ends on {consumesAt}.": "", + "Your gift is ready": "Подаръкът ви е готов", + "Your gift subscription confirmation": "Потвърждение за вашия подарен абонамент", + "Your gift subscription is ending soon": "Подареният ви абонамент изтича скоро", + "Your gift subscription to {siteTitle} ends on {consumesAt}.": "Подареният ви абонамент за {siteTitle} изтича на {consumesAt}.", "Your subscription has been canceled and will expire on {date}. You can resume your subscription via your account settings.": "Вашият абонамент е прекратен и изтича на {date}. Може да възобновите абонамента си чрез настройките в профила си.", "Your subscription has expired.": "Абонаментът ви е изтекъл.", "Your subscription will expire on {date}.": "Абонаментът ви изтича на {date}.", diff --git a/ghost/i18n/locales/bg/portal.json b/ghost/i18n/locales/bg/portal.json index 48abc5d73de..1df460c4b6e 100644 --- a/ghost/i18n/locales/bg/portal.json +++ b/ghost/i18n/locales/bg/portal.json @@ -11,14 +11,14 @@ "{memberEmail} will no longer receive this newsletter.": "{memberEmail} повече няма да получава този бюлетин.", "{months} months": "{months} месеца", "{months} months free": "{months} месеца безплатно", - "{tierName} membership": "", + "{tierName} membership": "План {tierName}", "{trialDays} days free": "{trialDays} дни безплатно", "{years} years": "{years} години", "+1 (123) 456-7890": "+359 88 123-4567", "1 month": "1 месец", "1 month free": "1 месец безплатно", "1 year": "1 година", - "A gift, just for you": "", + "A gift, just for you": "Подарък, специално за теб", "Access your RSS feeds": "Достъп до вашите RSS емисии", "Account": "Профил", "Account details updated successfully": "Настройките бяха успешно обновени", @@ -48,7 +48,7 @@ "Choose a plan": "Изберете план", "Choose your newsletters": "Изберете бюлетини", "Click here to retry": "Щракнете за нов опит", - "Click the confirmation link in your inbox to finish redeeming your membership. If it doesn't arrive within 3 minutes, check your spam folder.": "", + "Click the confirmation link in your inbox to finish redeeming your membership. If it doesn't arrive within 3 minutes, check your spam folder.": "Кликнете върху линка за потвърждение в пощата си, за да завършите активирането на абонамента си. Ако не го получите до 3 минути, проверете в папката за спам.", "Close": "Затвори", "Code": "Код", "Comment preferences updated.": "Настройките за коментиране са обновени.", @@ -60,9 +60,9 @@ "Contact support": "Връзка с поддръжката", "Continue": "Продължи", "Continue subscription": "Продължете абонамента", - "Continue with a paid subscription anytime. Your remaining gift period will be added as a free trial.": "", + "Continue with a paid subscription anytime. Your remaining gift period will be added as a free trial.": "Можете да преминете към платен абонамент по всяко време. Оставащият период от подаръка ще бъде добавен като безплатен пробен период.", "Copied": "Копирано", - "Copy": "", + "Copy": "Копиране", "Copy link": "Копирай линка", "Could not create Stripe billing portal session": "Неуспешна сесия с платежната система Stripe", "Could not create Stripe checkout session": "Неуспешен опит за плащане чрез Stripe", @@ -75,7 +75,7 @@ "Don't have an account?": "Нямате свой профил?", "Edit": "Промяна", "Email": "Имейл", - "Email confirmation link expired.": "", + "Email confirmation link expired.": "Линкът за потвърждение е изтекъл.", "Email newsletter": "Имейл бюлетин", "Email newsletter settings updated": "Настройките за бюлетини са обновени", "Email preferences": "Настройки за имейл", @@ -113,17 +113,17 @@ "Get help": "Помощ", "Get in touch for help": "Свържете се за помощ", "Get notified when someone replies to your comment": "Получавайте известия, ако някой отговори на вашия коментар", - "Gift a membership": "", - "Gift could not be redeemed": "", - "Gift details": "", - "Gift redeemed! You're all set.": "", + "Gift a membership": "Подари абонамент", + "Gift could not be redeemed": "Неуспешно активиране на подаръка", + "Gift details": "Детайли за подаръка", + "Gift redeemed! You're all set.": "Подаръкът е активиран! Всичко е готово.", "Gift subscription": "Подари абонамент", - "Gift subscriptions are not available right now.": "", - "Gift value": "", + "Gift subscriptions are not available right now.": "В момента не се предлагат абонаменти за подарък.", + "Gift value": "Стойност на подаръка", "Give feedback on this post": "Дайте отзив за публикацията", "Help! I'm not receiving emails": "Помощ! Не получавам имейли", "Here are a few other sites you may enjoy.": "Други сайтове, които може да харесате.", - "Hide details": "", + "Hide details": "Скриване на детайли", "If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "Ако даден бюлетин бъде отбелязан като спам, имейлите към този адрес се деактивират автоматично, за да е сигурно, че няма да получавате нежелани съобщения.", "If the spam complaint was accidental, or you would like to begin receiving emails again, you can resubscribe to emails by clicking the button on the previous screen.": "Ако оплакването за спам е било случайно или искате отново да получавате имейли, може да се абонирате отново, като щракнете върху бутона на предишния екран.", "If you cancel your subscription now, you will continue to have access until {periodEnd}.": "Ако отмените абонамента си сега, ще продължавате да имате достъп до {periodEnd}.", @@ -144,7 +144,7 @@ "Make sure emails aren't accidentally ending up in the Spam or Promotions folders of your inbox. If they are, click on \"Mark as not spam\" and/or \"Move to inbox\".": "Уверете се, че имейлите не попадат случайно в папките ви за спам и промоции. Ако това е така, щракнете върху \"Не е спам\" и/или \"Премести във входяща поща\".", "Manage": "Управление", "Maybe later": "Може би по-късно", - "Membership details": "", + "Membership details": "Детайли за абонамента", "Memberships from this email domain are currently restricted.": "Абонаментите за този домейн са ограничени.", "Memberships unavailable, contact the owner for access.": "Няма възможност за абонамент, свържете се със собственика на сайта за достъп.", "month": "месец", @@ -156,7 +156,7 @@ "Newsletters can be disabled on your account for two reasons: A previous email was marked as spam, or attempting to send an email resulted in a permanent failure (bounce).": "Бюлетините могат да бъдат деактивирани в профила ви по две причини: предишен имейл е бил маркиран като спам или опитът за изпращане на имейл е довел до траен неуспех (отказ).", "No member exists with this e-mail address.": "Няма абонат с такъв имейл адрес.", "No thanks, I want to cancel": "Не, благодаря, искам да се откажа", - "Not ready to share? We've also emailed a copy to your inbox.": "", + "Not ready to share? We've also emailed a copy to your inbox.": "Не сте сигурни дали да споделите? Изпратено ви е копие и по имейл.", "Not receiving emails?": "Не получавате поща?", "Now check your email!": "Проверете имейла си!", "Once resubscribed, if you still don't see emails in your inbox, check your spam folder. Some inbox providers keep a record of previous spam complaints and will continue to flag emails. If this happens, mark the latest newsletter as 'Not spam' to move it back to your primary inbox.": "След като се абонирате отново, ако все още не получавате имейли, проверете папката за спам. Някои доставчици пазят история с предишни оплаквания за спам и ще продължат да маркират имейлите. Ако вашият случай е такъв, маркирайте последния бюлетин като 'Не е спам', за да го преместите обратно в основната си папка.", @@ -182,8 +182,8 @@ "Price": "Цена", "Re-enable emails": "Възобновете изпращането на писма", "Recommendations": "Препоръки", - "Redeem your membership": "", - "Redeeming...": "", + "Redeem your membership": "Активирайте абонамента си", + "Redeeming...": "Активиране...", "Renews at {price}.": "Подновяване за {price}.", "Resume subscription": "Възобнови абонамента", "Retry": "Отново", @@ -192,11 +192,11 @@ "Save {amountOff} on your next billing cycle. Then {currency}{originalPrice}/{cadence}.": "Спестете {amountOff} от следващия платежен цикъл. След това {currency}{originalPrice}/{cadence}.", "Send an email and say hi!": "Изпратете имейл за здрасти!", "Send an email to {senderEmail} and say hello. This can also help signal to your mail provider that emails to and from this address should be trusted.": "Изпратете имейл до {senderEmail} за здрасти. Това също може да сигнализира на вашия доставчик на електронна поща, че на имейлите до и от този адрес може да се има доверие.", - "Send the link below to share it with whoever you'd like.": "", + "Send the link below to share it with whoever you'd like.": "Изпратете връзката по-долу, за да я споделите с когото желаете.", "Sending login link...": "Изпращане на линк за влизане...", "Sending...": "Изпращане...", "Share": "Сподели", - "Share a full membership to {siteTitle} with a friend or colleague": "", + "Share a full membership to {siteTitle} with a friend or colleague": "Споделете пълен абонамент за {siteTitle} с приятел или колега", "Show all": "Покажи всички", "Sign in": "Вход", "Sign out": "Изход", @@ -230,16 +230,16 @@ "There was an error continuing your subscription, please try again.": "Възникна грешка при продължаването на абонамента ви, опитайте отново.", "There was an error processing your payment. Please try again.": "Възникна грешка при обработката на вашето плащане. Моля, опитайте отново.", "There was an error sending the email, please try again": "Възникна грешка при изпращане на имейл, опитайте отново", - "This gift has already been consumed.": "", - "This gift has already been redeemed.": "", - "This gift has been refunded.": "", - "This gift has expired.": "", + "This gift has already been consumed.": "Този подарък вече е използван.", + "This gift has already been redeemed.": "Този подарък вече е активиран.", + "This gift has been refunded.": "Този подарък е възстановен.", + "This gift has expired.": "Валидността на подаръка е изтекла.", "This site is invite-only, contact the owner for access.": "Сайтът е само с покани. Свържете се със собственика, за да получите достъп.", "This site is not accepting donations at the moment.": "В момента сайтът не приема дарения.", "This site is not accepting payments at the moment.": "В момента сайтът не приема плащания.", "This site only accepts paid members.": "Този сайт приема само плащащи потребители.", "Threads": "Threads", - "Tier": "", + "Tier": "План", "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "За да завършите регистрацията използвайте линка, който ще получите по имейл. Ако не пристигне до 3 минути, проверете дали не е в папката за спам.", "To continue to stay up to date, subscribe to {publication} below.": "За да останете информирани, запишете се за {publication} по-долу.", "Too many attempts try again in {number} days.": "Твърде много опити. Опитайте отново след {number} дни.", @@ -272,22 +272,22 @@ "X (Twitter)": "X (Twitter)", "year": "година", "Yearly": "Годишно", - "You already have an active subscription.": "", + "You already have an active subscription.": "Вече имате активен абонамент.", "You currently have a free membership, upgrade to a paid subscription for full access.": "В момента имате безплатен достъп, преминете към платен абонамент за пълен достъп.", "You have been successfully resubscribed": "Абонаментът беше успешно подновен", - "You now have access to {tierName} until {expiryDate}. Enjoy!": "", + "You now have access to {tierName} until {expiryDate}. Enjoy!": "Вече ползвате абонамент {tierName} до {expiryDate}. Приятно ползване!", "You're currently not receiving emails": "Понастоящем не получавате имейли", "You're not receiving emails": "Не получавате имейли", "You're not receiving emails because you either marked a recent message as spam, or because messages could not be delivered to your provided email address.": "Не получавате имейли, защото или наскоро сте маркирали някое съобщение като спам, или писмата не могат да бъдат доставени до вашия имейл адрес.", - "You've been gifted a membership": "", - "You've been gifted a membership to {siteTitle}": "", + "You've been gifted a membership": "Получихте абонамент като подарък", + "You've been gifted a membership to {siteTitle}": "Получихте подарък - абонамент за {siteTitle}", "You've successfully signed in.": "Влязохте успешно.", "You've successfully subscribed to {siteTitle}": "Успешно се абонирахте за {siteTitle}", "Your account": "Вашият профил", "Your email": "Вашият имейл", "Your email has failed to resubscribe, please try again": "Неуспешно подновяване на абонамент с този имейл, опитайте отново", - "Your gift is ready": "", - "Your gift subscription will expire on {expiryDate}": "", + "Your gift is ready": "Подаръкът ви е готов", + "Your gift subscription will expire on {expiryDate}": "Подареният ви абонамент изтича на {expiryDate}", "your inbox": "вашия имейл", "Your input helps shape what gets published.": "Вашият принос помага за създаването на съдържанието.", "Your name": "Вашето име", diff --git a/ghost/i18n/locales/fr/comments.json b/ghost/i18n/locales/fr/comments.json index 258b0d6792c..e452869a747 100644 --- a/ghost/i18n/locales/fr/comments.json +++ b/ghost/i18n/locales/fr/comments.json @@ -25,7 +25,7 @@ "Deleted member": "Abonné(e) supprimé(e)", "Deleting": "Suppression en cours", "Discussion": "Discussion", - "Dislike": "", + "Dislike": "Je n’aime pas", "Edit": "Modifier", "Edit this comment": "Modifier ce commentaire", "edited": "modifié", @@ -39,7 +39,7 @@ "Jamie Larson": "Jean Martin", "Join the discussion": "Rejoindre la discussion", "Just now": "À l'instant", - "Like": "", + "Like": "J’aime", "Load more ({amount})": "Afficher plus ({amount})", "Local resident": "Résident local", "Member discussion": "Discussion entre abonnés", @@ -50,11 +50,11 @@ "Once deleted, this comment can’t be recovered.": "Une fois supprimé, ce commentaire ne pourra pas être restauré.", "One hour ago": "Il y a une heure", "One min ago": "Il y a une minute", - "Pin comment": "Épingler", + "Pin comment": "Épingler le commentaire", "Pinned": "Épinglé", "Read more replies": "Voir plus de réponses", - "Remove dislike": "", - "Remove like": "", + "Remove dislike": "Annuler le « Je n’aime pas »", + "Remove like": "Annuler le « J’aime »", "removed": "supprimé", "Replied to": "Répondu à", "Reply": "Répondre", @@ -78,7 +78,7 @@ "This comment has been hidden.": "Ce commentaire a été masqué.", "This comment has been removed.": "Ce commentaire a été supprimé.", "Unpin": "Désépingler", - "Unpin comment": "Désépingler", + "Unpin comment": "Désépingler le commentaire", "Upgrade now": "Passer à l’abonnement payant", "View in admin": "Voir dans l’administration", "Yesterday": "Hier", diff --git a/ghost/i18n/locales/it/ghost.json b/ghost/i18n/locales/it/ghost.json index 7d6cb3903d1..b635c379239 100644 --- a/ghost/i18n/locales/it/ghost.json +++ b/ghost/i18n/locales/it/ghost.json @@ -54,7 +54,7 @@ "Secure sign in link for {siteTitle}": "Link per l'accesso sicuro a {siteTitle}", "See you soon!": "A presto!", "Sent to {email}": "Inviata a {email}", - "Share": "", + "Share": "Condividi", "Sign in": "Accedi", "Sign in now": "Accedi ora", "Sign in to {siteTitle}": "Accedi a {siteTitle}", diff --git a/ghost/i18n/locales/it/portal.json b/ghost/i18n/locales/it/portal.json index 710522950fa..4fbffc72744 100644 --- a/ghost/i18n/locales/it/portal.json +++ b/ghost/i18n/locales/it/portal.json @@ -9,17 +9,17 @@ "{memberEmail} will no longer receive {newsletterName} newsletter.": "La newsletter {newsletterName} non verrà più inviata a {memberEmail}.", "{memberEmail} will no longer receive emails when someone replies to your comments.": "Non riceverà più email a {memberEmail} quando qualcuno risponde ai tuoi commenti.", "{memberEmail} will no longer receive this newsletter.": "La newsletter non verrà più inviata a {memberEmail}.", - "{months} months": "", - "{months} months free": "", + "{months} months": "{months} mesi", + "{months} months free": "{months} mesi gratis", "{tierName} membership": "", "{trialDays} days free": "{trialDays} giorni gratis", - "{years} years": "", + "{years} years": "{years} anni", "+1 (123) 456-7890": "+1 (123) 456-7890", - "1 month": "", - "1 month free": "", - "1 year": "", + "1 month": "1 mese", + "1 month free": "1 mese gratis", + "1 year": "1 anno", "A gift, just for you": "", - "Access your RSS feeds": "", + "Access your RSS feeds": "Accedi ai tuoi feed RSS", "Account": "Account", "Account details updated successfully": "Dettagli dell'account aggiornati con successo", "Account settings": "Impostazioni account", @@ -30,13 +30,13 @@ "An unexpected error occured. Please try again or contact support if the error persists.": "Si è verificato un errore imprevisto. Contatta l'assistenza se l'errore persiste.", "Back": "Indietro", "Back to Log in": "Torna alla pagina d'accesso", - "Before you go": "", + "Before you go": "Prima che tu vada", "Billing info & receipts": "Informazioni di fatturazione & ricevute", "Black Friday": "Black friday", - "Bluesky": "", + "Bluesky": "Bluesky", "Cancel anytime.": "Cancella in qualsiasi momento.", "Cancel subscription": "Cancella l'abbonamento", - "Canceled": "", + "Canceled": "Annullato", "Cancellation reason": "Motivo della cancellazione", "Change": "Cambia", "Change plan": "Cambia piano", @@ -61,9 +61,9 @@ "Continue": "Continua", "Continue subscription": "Riabbonati", "Continue with a paid subscription anytime. Your remaining gift period will be added as a free trial.": "", - "Copied": "", + "Copied": "Copiato", "Copy": "", - "Copy link": "", + "Copy link": "Copia link", "Could not create Stripe billing portal session": "Non è stato possibile creare la sessione del portale di fatturazione di Stripe", "Could not create Stripe checkout session": "Non è stato possibile creare la sessione di checkout di Stripe", "Could not sign in. Login link expired.": "Accesso non effettuato. Il link è scaduto.", @@ -83,17 +83,17 @@ "Emails": "Email", "Emails disabled": "Email disattivate", "Ends {offerEndDate}": "Finisce il {offerEndDate}", - "Enjoy {amountOff} off forever.": "", - "Enjoy {months} free months on us.": "", - "Enjoy {months} free months on us. You won't be charged until {newBillingDate}.": "", - "Enjoy a free month on us.": "", - "Enjoy a free month on us. You won't be charged until {newBillingDate}.": "", + "Enjoy {amountOff} off forever.": "Approfitta di uno sconto di {amountOff} per sempre.", + "Enjoy {months} free months on us.": "Goditi {months} mesi gratuiti offerti da noi.", + "Enjoy {months} free months on us. You won't be charged until {newBillingDate}.": "Goditi {months} mesi gratuiti offerti da noi. Non ti verrà addebitato nulla fino al {newBillingDate}.", + "Enjoy a free month on us.": "Goditi un mese gratuito offerto da noi.", + "Enjoy a free month on us. You won't be charged until {newBillingDate}.": "Goditi un mese gratuito offerto da noi. Non ti verrà addebitato nulla fino al {newBillingDate}.", "Enter code above": "Inserisci il codice qui sopra", "Enter your email address": "Insirisci il tuo indirizzo email", "Enter your name": "Inserisci il tuo nome", "Error": "Errore", "Expires {expiryDate}": "Scade il {expiryDate}", - "Facebook": "", + "Facebook": "Facebook", "Failed to cancel subscription, please try again": "La cancellazione dell’abbonamento non è riuscita, riprova, per favore", "Failed to log in, please try again": "Accesso non riuscito, riprova, per favore", "Failed to log out, please try again": "La disconnessione non è riuscita, riprova, per favore", @@ -117,7 +117,7 @@ "Gift could not be redeemed": "", "Gift details": "", "Gift redeemed! You're all set.": "", - "Gift subscription": "", + "Gift subscription": "Regala abbonamento", "Gift subscriptions are not available right now.": "", "Gift value": "", "Give feedback on this post": "Manda un feedback per questo post", @@ -140,7 +140,7 @@ "Jamie Larson": "Jamie Larson", "jamie@example.com": "jamie@example.com", "Less like this": "Meno come questo", - "LinkedIn": "", + "LinkedIn": "LinkedIn", "Make sure emails aren't accidentally ending up in the Spam or Promotions folders of your inbox. If they are, click on \"Mark as not spam\" and/or \"Move to inbox\".": "Assicurati che le email non finiscano per sbaglio nello spam. Se ce ne sono, clicca su \"Segnala come non spam\" e/o \"Sposta nella cartella Posta in arrivo\".", "Manage": "Impostazioni", "Maybe later": "Magari più tardi", @@ -150,19 +150,19 @@ "month": "mese", "Monthly": "Mensile", "More like this": "Più come questo", - "More options": "", + "More options": "Altre opzioni", "Name": "Nome", "Need more help? Contact support": "Hai ancora bisogno di aiuto? Contatta l'assistenza", "Newsletters can be disabled on your account for two reasons: A previous email was marked as spam, or attempting to send an email resulted in a permanent failure (bounce).": "Le newsletter possono essere disabilitate nel tuo account per due ragioni: un'email precedente è stata segnalata come spam, o l'invio di un'email ha restituito un fallimento permanente (rimbalzo).", "No member exists with this e-mail address.": "Nessun membro esistente con questo indirizzo e-mail.", - "No thanks, I want to cancel": "", + "No thanks, I want to cancel": "No grazie, voglio annullare", "Not ready to share? We've also emailed a copy to your inbox.": "", "Not receiving emails?": "Non ricevi le email?", "Now check your email!": "Ora controlla la tua email!", "Once resubscribed, if you still don't see emails in your inbox, check your spam folder. Some inbox providers keep a record of previous spam complaints and will continue to flag emails. If this happens, mark the latest newsletter as 'Not spam' to move it back to your primary inbox.": "Se ancora non vedi le email una volta reiscritto, controlla nello spam. Alcuni provider tengono nota dei reclami e continuano a segnalare le email. Se questo dovesse succedere, segnala l'ultima email ricevuta come \"non spam\" e spostala nella tua posta in arrivo.", "Open AOL Mail": "Apri AOL Mail", "Open email": "Apri email", - "Open Feedbin": "", + "Open Feedbin": "Apri Feedbin", "Open Gmail": "Apri Gmail", "Open Hey": "Apri Hey", "Open iCloud Mail": "Apri iCloud Mail", @@ -178,24 +178,24 @@ "Please contact {supportAddress} to adjust your complimentary subscription.": "Si prega di contattare {supportAddress} per modificare l'abbonamento gratuito.", "Please enter {fieldName}": "Per favore inserisci {fieldName}", "Please fill in required fields": "Si prega di compilare i campi obbligatori", - "Podcasts": "", + "Podcasts": "Podcast", "Price": "Prezzo", "Re-enable emails": "Riattiva le email", "Recommendations": "Consigliati", "Redeem your membership": "", "Redeeming...": "", "Renews at {price}.": "Rinnova a {price}.", - "Resume subscription": "", + "Resume subscription": "Riprendi abbonamento", "Retry": "Riprova", "Save": "Salva", - "Save {amountOff} on your next {durationInMonths} billing cycles. Then {currency}{originalPrice}/{cadence}.": "", - "Save {amountOff} on your next billing cycle. Then {currency}{originalPrice}/{cadence}.": "", + "Save {amountOff} on your next {durationInMonths} billing cycles. Then {currency}{originalPrice}/{cadence}.": "Risparmia {amountOff} per i prossimi {durationInMonths} cicli di fatturazione. Poi {currency}{originalPrice}/{cadence}.", + "Save {amountOff} on your next billing cycle. Then {currency}{originalPrice}/{cadence}.": "Risparmia {amountOff} sul tuo prossimo ciclo di fatturazione. Poi {currency}{originalPrice}/{cadence}.", "Send an email and say hi!": "Invia un'email di saluti!", "Send an email to {senderEmail} and say hello. This can also help signal to your mail provider that emails to and from this address should be trusted.": "Invia un'email di saluti a {senderEmail}. Questo potrebbe aiutare a segnalare al tuo provider che le email da e verso questo indirizzo possono essere considerate attendibili.", "Send the link below to share it with whoever you'd like.": "", "Sending login link...": "Invio link di accesso...", "Sending...": "Invio...", - "Share": "", + "Share": "Condividi", "Share a full membership to {siteTitle} with a friend or colleague": "", "Show all": "Mostra tutti", "Sign in": "Accedi", @@ -238,7 +238,7 @@ "This site is not accepting donations at the moment.": "Questo sito non accetta donazioni al momento.", "This site is not accepting payments at the moment.": "Questo sito non accetta pagamenti al momento.", "This site only accepts paid members.": "Questo sito è accessibile solo con abbonamento.", - "Threads": "", + "Threads": "Threads", "Tier": "", "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "Per completare l'iscrizione, clicca il link di conferma inviato alla tua email. Se non lo ricevi entro 3 minuti, controlla nello spam!", "To continue to stay up to date, subscribe to {publication} below.": "Per continuare a rimanere aggiornato, iscriviti a {publication} qui sotto.", @@ -263,13 +263,13 @@ "Verifying...": "Verificando...", "View plans": "Vedi piani", "We couldn't unsubscribe you as the email address was not found. Please contact the site owner.": "Non è stato possibile disiscriverti poiché l'indirizzo email non è stato trovato. Si prega di contattare il proprietario del sito.", - "We'd hate to see you leave. How about a special offer to stay?": "", + "We'd hate to see you leave. How about a special offer to stay?": "Ci dispiacerebbe vederti andare via. Che ne dici di un’offerta speciale per restare?", "Welcome back, {name}!": "È bello rivederti, {name}!", "Welcome back!": "Bentornato!", "Welcome to {siteTitle}": "Benvenuto a {siteTitle}", "When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "Quando una casella fallisce l'accettazione di un'email, questo viene normalmente chiamato \"rimbalzo\". In molti casi questo è temporaneo. Tuttavia, in alcuni casi un'email potrebbe tornare come un fallimento permanente se l'indirizzo è sbagliato o inesistente.", "Why has my email been disabled?": "Perché la mia email è stata disattivata?", - "X (Twitter)": "", + "X (Twitter)": "X (Twitter)", "year": "Anno", "Yearly": "Annuale", "You already have an active subscription.": "", @@ -284,13 +284,13 @@ "You've successfully signed in.": "Accesso effettuato.", "You've successfully subscribed to {siteTitle}": "Iscrizione effettuata a {siteTitle}", "Your account": "Il tuo account", - "Your email": "", + "Your email": "La tua email", "Your email has failed to resubscribe, please try again": "La re-iscrizione della tua e-mail è fallita, per favore riprova", "Your gift is ready": "", "Your gift subscription will expire on {expiryDate}": "", "your inbox": "la tua casella di posta", "Your input helps shape what gets published.": "Il tuo contributo aiuta a dare forma a ciò che viene pubblicato.", - "Your name": "", + "Your name": "Il tuo nome", "Your subscription has been canceled and will expire on {expiryDate}.": "Il tuo abbonamento è stato annullato e scadrà il {expiryDate}.", "Your subscription will expire on {expiryDate}": "Il tuo abbonamento scadrà il {expiryDate}", "Your subscription will renew on {renewalDate}": "Il tuo abbonamento verrà rinnovato il {renewalDate}", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb330d874c9..9c5fcc3c0f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -94,8 +94,8 @@ catalogs: specifier: 4.7.0 version: 4.7.0 '@vitest/coverage-v8': - specifier: 4.1.5 - version: 4.1.5 + specifier: 4.1.7 + version: 4.1.7 bson-objectid: specifier: 2.0.4 version: 2.0.4 @@ -190,8 +190,8 @@ catalogs: specifier: 4.5.0 version: 4.5.0 vitest: - specifier: 4.1.5 - version: 4.1.5 + specifier: 4.1.7 + version: 4.1.7 zod: specifier: 4.1.12 version: 4.1.12 @@ -315,13 +315,13 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) apps/activitypub: dependencies: '@hookform/resolvers': - specifier: 5.2.2 - version: 5.2.2(react-hook-form@7.72.1(react@18.3.1)) + specifier: 5.4.0 + version: 5.4.0(react-hook-form@7.72.1(react@18.3.1)) '@radix-ui/react-form': specifier: 0.1.8 version: 0.1.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -406,7 +406,7 @@ importers: version: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) apps/admin: dependencies: @@ -521,7 +521,7 @@ importers: version: 5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@22.19.18)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.18)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) apps/admin-x-design-system: dependencies: @@ -693,7 +693,7 @@ importers: version: 4.5.0(rollup@4.60.4)(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) apps/admin-x-framework: dependencies: @@ -754,7 +754,7 @@ importers: version: 4.7.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.5(vitest@4.1.5) + version: 4.1.7(vitest@4.1.7) c8: specifier: 'catalog:' version: 10.1.3 @@ -796,7 +796,7 @@ importers: version: 4.5.0(rollup@4.60.4)(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) apps/admin-x-settings: dependencies: @@ -923,7 +923,7 @@ importers: version: 13.15.10 '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.5(vitest@4.1.5) + version: 4.1.7(vitest@4.1.7) eslint: specifier: 'catalog:' version: 8.57.1 @@ -947,7 +947,7 @@ importers: version: 7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@22.19.18)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.18)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) apps/announcement-bar: dependencies: @@ -963,7 +963,7 @@ importers: version: 4.7.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.5(vitest@4.1.5) + version: 4.1.7(vitest@4.1.7) concurrently: specifier: 'catalog:' version: 8.2.2 @@ -984,7 +984,7 @@ importers: version: 4.5.0(rollup@4.60.4)(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) apps/comments-ui: dependencies: @@ -1057,7 +1057,7 @@ importers: version: 4.7.0(vite@7.3.2(@types/node@25.9.1)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.5(vitest@4.1.5) + version: 4.1.7(vitest@4.1.7) autoprefixer: specifier: 10.4.21 version: 10.4.21(postcss@8.5.10) @@ -1102,7 +1102,7 @@ importers: version: 4.5.0(rollup@4.60.4)(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) apps/portal: dependencies: @@ -1139,7 +1139,7 @@ importers: version: 4.7.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.5(vitest@4.1.5) + version: 4.1.7(vitest@4.1.7) concurrently: specifier: 'catalog:' version: 8.2.2 @@ -1175,7 +1175,7 @@ importers: version: 4.5.0(rollup@4.60.4)(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) apps/posts: dependencies: @@ -1269,7 +1269,7 @@ importers: version: 13.15.10 '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.5(vitest@4.1.5) + version: 4.1.7(vitest@4.1.7) eslint: specifier: 'catalog:' version: 8.57.1 @@ -1296,16 +1296,16 @@ importers: version: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) apps/shade: dependencies: '@hookform/resolvers': - specifier: 5.2.2 - version: 5.2.2(react-hook-form@7.72.1(react@18.3.1)) + specifier: 5.4.0 + version: 5.4.0(react-hook-form@7.72.1(react@18.3.1)) '@number-flow/react': - specifier: 0.5.10 - version: 0.5.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 0.6.0 + version: 0.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-accordion': specifier: 1.2.12 version: 1.2.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1453,7 +1453,7 @@ importers: version: 4.7.0(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.5(vitest@4.1.5) + version: 4.1.7(vitest@4.1.7) c8: specifier: 'catalog:' version: 10.1.3 @@ -1510,7 +1510,7 @@ importers: version: 4.5.0(rollup@4.60.4)(typescript@5.9.3)(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@22.19.18)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.18)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) apps/signup-form: dependencies: @@ -1586,7 +1586,7 @@ importers: version: 4.5.0(rollup@4.60.4)(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) apps/sodo-search: dependencies: @@ -1617,7 +1617,7 @@ importers: version: 4.7.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.5(vitest@4.1.5) + version: 4.1.7(vitest@4.1.7) concurrently: specifier: 'catalog:' version: 8.2.2 @@ -1644,7 +1644,7 @@ importers: version: 4.5.0(rollup@4.60.4)(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) apps/stats: dependencies: @@ -1699,7 +1699,7 @@ importers: version: 2.1.4 '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.5(vitest@4.1.5) + version: 4.1.7(vitest@4.1.7) dotenv: specifier: 'catalog:' version: 17.4.2 @@ -1729,7 +1729,7 @@ importers: version: 4.5.0(rollup@4.60.4)(typescript@5.9.3)(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@22.19.18)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.18)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) e2e: devDependencies: @@ -2170,8 +2170,8 @@ importers: ghost/core: dependencies: '@aws-sdk/client-s3': - specifier: 3.1025.0 - version: 3.1025.0 + specifier: 3.1053.0 + version: 3.1053.0 '@extractus/oembed-extractor': specifier: 3.2.1 version: 3.2.1(encoding@0.1.13) @@ -2575,8 +2575,8 @@ importers: specifier: 2.2.0 version: 2.2.0 nodemailer: - specifier: 8.0.7 - version: 8.0.7 + specifier: 8.0.8 + version: 8.0.8 on-headers: specifier: 1.1.0 version: 1.1.0 @@ -2628,6 +2628,9 @@ importers: tiny-glob: specifier: 0.2.9 version: 0.2.9 + type-fest: + specifier: 'catalog:' + version: 4.41.0 ua-parser-js: specifier: 1.0.41 version: 1.0.41 @@ -2712,7 +2715,7 @@ importers: version: 8.49.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.5(vitest@4.1.5) + version: 4.1.7(vitest@4.1.7) bunyan: specifier: 1.8.15 version: 1.8.15 @@ -2742,7 +2745,7 @@ importers: version: 4.0.0 html-validate: specifier: 8.29.0 - version: 8.29.0(jest-diff@29.7.0)(jest-snapshot@29.7.0)(jest@29.7.0(@types/node@22.19.18)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1))(vitest@4.1.5) + version: 8.29.0(jest-diff@29.7.0)(jest-snapshot@29.7.0)(jest@29.7.0(@types/node@22.19.18)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1))(vitest@4.1.7) inquirer: specifier: 8.2.7 version: 8.2.7(@types/node@22.19.18) @@ -2802,7 +2805,7 @@ importers: version: 13.12.0 vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@22.19.18)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.18)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) optionalDependencies: '@tryghost/html-to-mobiledoc': specifier: 3.3.1 @@ -2935,8 +2938,8 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.1025.0': - resolution: {integrity: sha512-9Byz2fPnuGRRL8DTTD5bYPl1Iwm+ysLiCMgptffa3lNkVLCiUZc5e5TAaOjk0MvyeXieq+jn35AmQL6cgN2KHQ==} + '@aws-sdk/client-s3@3.1053.0': + resolution: {integrity: sha512-/oGxoB6p1Nqs935Blt+v1o+anSCEf2n3RjIrcLz84i4cn2Gr+Z7JpDdUkG5+74r5ctqEPG7k/phTGbJ9fNKnHg==} engines: {node: '>=20.0.0'} '@aws-sdk/client-sesv2@3.1053.0': @@ -2995,22 +2998,10 @@ packages: resolution: {integrity: sha512-alAu9heyiBK/OmRNXVxq8mmPTgeW2AQ6EYjRsI38kPZa1MZvt2Jh+BlGq7/GG9OVXOaEgD7DlGj/Lzfy5OmuEg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.972.14': - resolution: {integrity: sha512-Q1wVLhOwOiifMJt12IK/reHZpGERbeom8QirjX4JxfxYYqhSjBR50JSZAXhrheI1pSYkL5wLGXJLUMJLdyS75g==} - engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-location-constraint@3.972.11': resolution: {integrity: sha512-hkfspNUP4criAH6ton6BGKgnm5dZx+7bUOy1YqlTfejDeUPAM23D81q/IX+hdlS3KUsfwGz5ADTqZWKBEUpf4A==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.972.13': - resolution: {integrity: sha512-uvoAP8dpzA2tAYek8fKaP9iGOYmrnZzWPlWAAs74gQdF0YbixpXE1ZOSClKq4PB5VADiVIIB43Vjc5rdOrw10A==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-recursion-detection@3.972.15': - resolution: {integrity: sha512-VDMUHLeQ/yTr658HMm2eWS7e6qIFSxUeVbSA5zh4SNfSQ7ygIkJ0WeBoCnefw00Nsr5wNT8FIiAknJRTt058iw==} - engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.42': resolution: {integrity: sha512-/xNqNGXv9LaxZd25L9VV4pnSOw9OdDNO4rAHamM+h3KQBSITljIH9vk3dveGga1I2j36lQd0rdG3gjNEXvtNew==} engines: {node: '>=20.0.0'} @@ -3019,18 +3010,10 @@ packages: resolution: {integrity: sha512-7PQvGNhtveKlvVqNahqWx5yrwxP7ecwAoB1dYBf8eKwfo2tzzCbNnW+q2nO3N066ktQaB4iBQbDRWtizm+amoQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.972.43': - resolution: {integrity: sha512-zXD7MSFgaxGi2CeURo9ZWKLNyXtfBUF0ByCHu4fdWa3WMu3YI8L0Mv3JHEDYBbYrUBPWBqSYhaXotxq0ADAGJg==} - engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.997.11': resolution: {integrity: sha512-nWXXJ1r/r8N2Gw1pWolRgED38/A9A8DHR2ETWIv220zh4PZHcybbR4hUVWWktmNXTRHzDJwRluapHn0rZxuoqA==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.972.17': - resolution: {integrity: sha512-Jz0mg/eqfChGZm0G4bzm6CpyEEtu9ThG1WHY3uE/hGjIUIXPsyVyTuQOetUsrU9QiYWMknmyIKIEHpZ69BHzrA==} - engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.996.28': resolution: {integrity: sha512-qs9z5LqXO/CZC2Lg9SGKpoLU8Rhi+m2pFKZqfO9pytX1clc0katqtsDNupJxFy0xT9wsZSPzM2v1y+/H/zfp5Q==} engines: {node: '>=20.0.0'} @@ -3043,21 +3026,10 @@ packages: resolution: {integrity: sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.996.12': - resolution: {integrity: sha512-6Y8t0HT3M5GNVyLCnEwfI4maKZ5ATWJlXqemCH56/DMfsWhhSmR26FFE6LPTBYbwlifwAkNxqE0YTyvUfoUhEg==} - engines: {node: '>=20.0.0'} - '@aws-sdk/util-locate-window@3.965.5': resolution: {integrity: sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-user-agent-browser@3.972.14': - resolution: {integrity: sha512-LiMxdKWw55ZJP4iABqeIuF3RPgWMa2Uc9ZXjZRXZywStvH1IlzU6t+dKzcjS5ZQpHsl2A0G8UXxuy1zDY93YTQ==} - - '@aws-sdk/util-user-agent-node@3.973.29': - resolution: {integrity: sha512-sVUv711QtRMT8NYql9elQaAKCz8qopg+Y2Vf5ROLXeOqEWdYZp2g+9HBesTmLn48jDvI0i1khxPFKSwCjWaawA==} - engines: {node: '>=20.0.0'} - '@aws-sdk/xml-builder@3.972.25': resolution: {integrity: sha512-GH+Kjz4nPKWKHnsiQpnhP1MJdTGIcK4rAka6tzakgjjUkVgNsmPeEbbRAf09SzS1hjGu6duGHCBsxYke0BhHjQ==} engines: {node: '>=20.0.0'} @@ -4918,8 +4890,8 @@ packages: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 - '@hookform/resolvers@5.2.2': - resolution: {integrity: sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==} + '@hookform/resolvers@5.4.0': + resolution: {integrity: sha512-EIsqr/t/qbinPIhGjMdtvutIN1Kk4uwbROE9/UQ93CAVGR7GkA7Y92+fX80OzXi/OB67jVFYwKGO1WzkxmkFZw==} peerDependencies: react-hook-form: ^7.55.0 @@ -5494,8 +5466,8 @@ packages: engines: {node: '>=10'} deprecated: This functionality has been moved to @npmcli/fs - '@number-flow/react@0.5.10': - resolution: {integrity: sha512-a8Wh5eNITn7Km4xbddAH7QH8eNmnduR6k34ER1hkHSGO4H2yU1DDnuAWLQM99vciGInFODemSc0tdxrXkJEpbA==} + '@number-flow/react@0.6.0': + resolution: {integrity: sha512-77Yfc9+zkV2UDSP8phhZzxJGuwxi/Tt1TikmipL+1r3e9GFKEYDZ1XwInj67NoSt3OnOB0KLvvcl3lfPZgBHVQ==} peerDependencies: react: ^18 || ^19 react-dom: ^18 || ^19 @@ -7095,10 +7067,6 @@ packages: Deprecated: no longer maintained and no longer used by Sinon packages. See https://github.com/sinonjs/nise/issues/243 for replacement details. - '@smithy/config-resolver@4.5.4': - resolution: {integrity: sha512-jqADOFCkuSqluoEPjxWTFQ/6Xfsmt4Xi3IelA+c+4WdavqCijGGfWi873VqfIZeSFvaBpYeH+PKHC3POE98KlQ==} - engines: {node: '>=18.0.0'} - '@smithy/core@3.24.4': resolution: {integrity: sha512-3UNRKEyQyAgVgM0LGlerCLm+ChZWZ1GPfde+jBEW6bm6bSBGU1p0EbblaUV3unbhwvidjLA5Zs3sOs7mnZwvAw==} engines: {node: '>=18.0.0'} @@ -7107,146 +7075,34 @@ packages: resolution: {integrity: sha512-vKW0MEFRU4Y3MkVZUkpJm+g9qyPGLCXhc0YLggUdSdBB4g7IaSSsCE75P9rBXyWHrXY1UYSQUl8/DwsTR7QciA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.3.4': - resolution: {integrity: sha512-9szC3PfHhYSvWA98CIrD6rB8jS60tfKOPvDlzyD87gsDm8KDnsSpXnwPO1J3bPxg0tWE6Ljzk2YzZV2GBe3nUQ==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-config-resolver@4.4.4': - resolution: {integrity: sha512-Q28S5qVeHIGXY4xCO43IFglVCc11HXZlxdhUhcNgiI/ArVDi6SWOMLvWEq1woUQtThNxH3CPbz6l1Z2PT6gl8A==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-node@4.3.4': - resolution: {integrity: sha512-QxrsfEjVwpx2rzu0ZRc+F1MFSVh9pnjJayHzxjy3l3ru2zp7yt9FsYnDBHmdZV7389wqc1poK84vf5v3lArSaw==} - engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.4.4': resolution: {integrity: sha512-qM7AUKI4G6d7lNgaZD3lA1tWSolh5r6gcixfTZAPstVURfjIbvreVTPz+994M0yC3HbX4YYhDRgr31Xy3XwWOQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.3.4': - resolution: {integrity: sha512-HQw/cCLjoAatHffbVQxanPfDRYFt3NMhAENub1/Pw0iftGYGSS4+4C+G1D7CCJXW5/wR6AIhLT7xPusMqy7qjg==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-node@4.3.4': - resolution: {integrity: sha512-LfXN/tUjjmUkEaMWto96a3Xetk7u4WMruzFop7mtsIYY2njTvTQm/zsok9KpwztzOL3WSBfv+hikxkJhArv8xQ==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-stream-node@4.3.4': - resolution: {integrity: sha512-wuwVYqGNP9RwLs5hU2nTg8ajL16lA27VX7oGrsarghiqOhAtGYWQQ2VNtotKCBra5t4Od+Epi5jYktm0JwDuIQ==} - engines: {node: '>=18.0.0'} - - '@smithy/invalid-dependency@4.3.4': - resolution: {integrity: sha512-lByqayJi0EC8wAysIA93QwN4C1ofppNk5YXt8QS4Zo2AVHxGWspkwvYGP/5WLO4jsdHDsEc+KAdmqJBP9eN46g==} - 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/md5-js@4.3.4': - resolution: {integrity: sha512-drsFcLEIjFtmDF8Ta5STY7zTc89L24qL+G2f+YGo2oeoB3OW/6zjhKwW8/nCTS45AAFSyh81UgJ+Jl+Gs0ovnQ==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-content-length@4.3.4': - resolution: {integrity: sha512-dI6ysYleXIHUDVsJ8JKR8m9zUNo29y43D6/evJcfY/JREgBrXpWbBavs1EAJIPA5+d7DBlepqSCIWveWiyO1jw==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-endpoint@4.5.4': - resolution: {integrity: sha512-vfaUGI2plIGPeiYlUwtC2IccLKR5XwPLCPzMwRF/dDlvMtVuy6L7Klx2LThoU3nENR294j/48Tn9alg/3teV1Q==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-retry@4.6.4': - resolution: {integrity: sha512-KOAlkv0/6yYLLXcJNTWq116q+ezv3i0+TQNg13hExZLUBwLvBj9ipP7f1+sAfVUsfYG/BFuF2nX6BRoKHFqt1Q==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-serde@4.3.4': - resolution: {integrity: sha512-J6JfVBmp3Z8ALEnIVJOyuBYr+xl/oIEvDY4qc9vbGXdgPZRYEYOrenXGhH7NnC2SDOWtkg8pIGw/yaTZTYDzrA==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-stack@4.3.4': - resolution: {integrity: sha512-fMuimMAsXCcDjWSNXeVitzQeWYKxvFmBbWVnYf1qLC5PaFbDBF0DcWQKSnqDY+QaaSzLIh+iAU3TaEWdGEeCfA==} - engines: {node: '>=18.0.0'} - - '@smithy/node-config-provider@4.4.4': - resolution: {integrity: sha512-mD/K1A5WrTZh6I23x1ScYo3K7/+Ujvp/zvLtaZT+xkDeXksWAQ/fKp60SudeUHUHQe/3Q3rgnfedJDqnxSKdpA==} - engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.7.4': resolution: {integrity: sha512-HIeF+1vrDGzPkkv39Hj2vlHSXHY3p958jd/8ZnePIY6+ZOsQX8coyEUKO5yQu4r0bQIVsbpotVIrXXwyycMStQ==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.4.4': - resolution: {integrity: sha512-5VdJYIYsVt2GT+i0fp5gvWoJNrdFEFN16TrpNnAZHngYC/xgk5yni6O/qV3WlIpJjeLC8RfwoQiNTljCdbNXgw==} - engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.4.4': resolution: {integrity: sha512-e5UtkMvsatzBfbeBZjEOt0k0Z3BEsjTFL/n6fdO5vtBLe67tdy0dX7xw2DU7uZ3acwoHyeCqpU2Fzb7pxwHb6Q==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.13.4': - resolution: {integrity: sha512-Lg3hCVv8oVYlnQus1x+1hlNoLSrcdOhkg2+Be5YUxkI1LbCEPpcwEdYfz+0j1sQSmEixA/UUbxW41CiN/+aigA==} - engines: {node: '>=18.0.0'} - '@smithy/types@4.14.2': resolution: {integrity: sha512-P+otAxbV4CqBybp7EkcJCrig63yE2E7PuNVOmilVMRcx/O+QDzGULTrKsq4DV13gSfak9ObPrWaHl/9bL5YcWw==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.3.4': - resolution: {integrity: sha512-Acgxr0W3vdmDNZKafjpDFaG2t32zNYVd7B5D3Y9LQep264+6pP/K/4ZXiAfW+ztMYB0iBG1kZx19EmRBd9zA/g==} - engines: {node: '>=18.0.0'} - - '@smithy/util-base64@4.4.4': - resolution: {integrity: sha512-f3zLXiAzY3oYDdubxW//QLk5KEngThcNQhKvcLGGiYNEzYD7B2PXwLjUZO7joB9wfvihflzPJilMest9Q9bj4Q==} - engines: {node: '>=18.0.0'} - - '@smithy/util-body-length-browser@4.3.4': - resolution: {integrity: sha512-ddbTlVHnjDflrReo1VlhPpomb0DlgqEhk/I++OS44Y4PEE0QnzOdJemUo439vNYEFjtJvZd1p9CBe/lcxpontg==} - engines: {node: '>=18.0.0'} - - '@smithy/util-body-length-node@4.3.4': - resolution: {integrity: sha512-e3pKOHP/UjTV4/2gMdjcgelvX8DGS6Yy3jSLWh47HvsyeD0fc/V4kkSYfhOjEnV4CizPn9gQojj2q9MiZQcJDg==} - 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-defaults-mode-browser@4.4.4': - resolution: {integrity: sha512-/TWNfyCtJHHIS5taeOQ1qcMUCr5xPqdFntDL5+Sp8sjGj29ZaFUUxlCP+6V//J7MhHZZ2PIe2kMh1YdOpaEPnA==} - engines: {node: '>=18.0.0'} - - '@smithy/util-defaults-mode-node@4.3.4': - resolution: {integrity: sha512-kFGsCILX13YE8troSVPB6AdEAzjbhJ/XFCaEgFGEBz1I17+wMVMBO1WxKxU27GlxBFQy643Jy42RgT8wf8X++g==} - engines: {node: '>=18.0.0'} - - '@smithy/util-endpoints@3.5.4': - resolution: {integrity: sha512-RtzPUniH4R49dG8X2MeOi9UzcNwh8C8lEADOGItnAMifxljQgCbuUOpvciX7EnEEJ5H2T2AXvEdOuXSe0bKdaQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-middleware@4.3.4': - resolution: {integrity: sha512-jzWo5fD5FYdGlfqx+kpp5BoOSG+TYQczYY6Ue2QX4linDq+5q6t2/RtO53nABOZjD+qYSSaVd9RalyMIPbxk9Q==} - engines: {node: '>=18.0.0'} - - '@smithy/util-retry@4.4.4': - resolution: {integrity: sha512-4upfJJ+jayyqd523zopC5Ad7XxMp+rpeiqh0QtiZGBvdBB7KBBtHVEtraHNnlzkQuytvkU5yyg6Ckf3ApJ3A5Q==} - engines: {node: '>=18.0.0'} - - '@smithy/util-stream@4.6.4': - resolution: {integrity: sha512-mkc/JN/fPiaHBAhhp7LbwAQz6RFjrCkYZ4F3OK2ZAWbmkjDQmAyNUmoDcQDVGWF9U+13+fWPszCXFHLP/8NnAA==} - 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.3.4': - resolution: {integrity: sha512-s8lfXcv+5C2GjBwGUBqFLgNmhyp9/n4TSKbOzKlIqJ/x0L/zwIxjNBC6DN4xUy59NvOrsiZI1t3tWi4ADUDyNw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-waiter@4.4.4': - resolution: {integrity: sha512-Qt+W1pLeV/gmsXXUKbcolZqSGwnEdcxM7tqZjtGazkJ4feMUX0Vy+mCZGyhCwLvO8qxsrhYlmRZ7FLGUxJ4Scg==} - engines: {node: '>=18.0.0'} - '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} @@ -9500,11 +9356,11 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitest/coverage-v8@4.1.5': - resolution: {integrity: sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A==} + '@vitest/coverage-v8@4.1.7': + resolution: {integrity: sha512-qsYPeXc5Q9dFLd1i8Ap+Bx8sQgcp+rFVQo4R0dDsWNBzl26ldVF1qOO+RL24K7FDrR6pA+50XedRLSoSG24bVQ==} peerDependencies: - '@vitest/browser': 4.1.5 - vitest: 4.1.5 + '@vitest/browser': 4.1.7 + vitest: 4.1.7 peerDependenciesMeta: '@vitest/browser': optional: true @@ -9512,11 +9368,11 @@ packages: '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/expect@4.1.5': - resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} + '@vitest/expect@4.1.7': + resolution: {integrity: sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==} - '@vitest/mocker@4.1.5': - resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==} + '@vitest/mocker@4.1.7': + resolution: {integrity: sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -9529,26 +9385,26 @@ packages: '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/pretty-format@4.1.5': - resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==} + '@vitest/pretty-format@4.1.7': + resolution: {integrity: sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==} - '@vitest/runner@4.1.5': - resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==} + '@vitest/runner@4.1.7': + resolution: {integrity: sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==} - '@vitest/snapshot@4.1.5': - resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==} + '@vitest/snapshot@4.1.7': + resolution: {integrity: sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==} '@vitest/spy@3.2.4': resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/spy@4.1.5': - resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==} + '@vitest/spy@4.1.7': + resolution: {integrity: sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==} '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - '@vitest/utils@4.1.5': - resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} + '@vitest/utils@4.1.7': + resolution: {integrity: sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==} '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -17519,6 +17375,10 @@ packages: resolution: {integrity: sha512-pkjE4mkBzQjdJT4/UmlKl3pX0rC9fZmjh7c6C9o7lv66Ac6w9WCnzPzhbPNxwZAzlF4mdq4CSWB5+FbK6FWCow==} engines: {node: '>=6.0.0'} + nodemailer@8.0.8: + resolution: {integrity: sha512-p+XsnzXGdtIHXUu2ugxdfG+eX2nehsGhMjW9h0CWj1BhE30hrFz0kh0yIM0/VjUgVsRrDj+80ZO+I1nSkGE4tA==} + engines: {node: '>=6.0.0'} + nodemon@3.1.14: resolution: {integrity: sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==} engines: {node: '>=10'} @@ -17623,8 +17483,8 @@ packages: num2fraction@1.2.2: resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} - number-flow@0.5.8: - resolution: {integrity: sha512-FPr1DumWyGi5Nucoug14bC6xEz70A1TnhgSHhKyfqjgji2SOTz+iLJxKtv37N5JyJbteGYCm6NQ9p1O4KZ7iiA==} + number-flow@0.6.0: + resolution: {integrity: sha512-K8flNq2Wqus53vjp/btVo3qXFkagF8dIdYavreBfE7hlvFFG/b1HMGEH6nZL+mlrJ+4lbLP9OmPv3t2rmRkpSQ==} number-is-nan@1.0.1: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} @@ -21597,20 +21457,20 @@ packages: yaml: optional: true - vitest@4.1.5: - resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} + vitest@4.1.7: + resolution: {integrity: sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.5 - '@vitest/browser-preview': 4.1.5 - '@vitest/browser-webdriverio': 4.1.5 - '@vitest/coverage-istanbul': 4.1.5 - '@vitest/coverage-v8': 4.1.5 - '@vitest/ui': 4.1.5 + '@vitest/browser-playwright': 4.1.7 + '@vitest/browser-preview': 4.1.7 + '@vitest/browser-webdriverio': 4.1.7 + '@vitest/coverage-istanbul': 4.1.7 + '@vitest/coverage-v8': 4.1.7 + '@vitest/ui': 4.1.7 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -22172,7 +22032,7 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.1025.0': + '@aws-sdk/client-s3@3.1053.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 @@ -22182,52 +22042,15 @@ snapshots: '@aws-sdk/middleware-bucket-endpoint': 3.972.15 '@aws-sdk/middleware-expect-continue': 3.972.13 '@aws-sdk/middleware-flexible-checksums': 3.974.21 - '@aws-sdk/middleware-host-header': 3.972.14 '@aws-sdk/middleware-location-constraint': 3.972.11 - '@aws-sdk/middleware-logger': 3.972.13 - '@aws-sdk/middleware-recursion-detection': 3.972.15 '@aws-sdk/middleware-sdk-s3': 3.972.42 '@aws-sdk/middleware-ssec': 3.972.11 - '@aws-sdk/middleware-user-agent': 3.972.43 - '@aws-sdk/region-config-resolver': 3.972.17 '@aws-sdk/signature-v4-multi-region': 3.996.28 '@aws-sdk/types': 3.973.9 - '@aws-sdk/util-endpoints': 3.996.12 - '@aws-sdk/util-user-agent-browser': 3.972.14 - '@aws-sdk/util-user-agent-node': 3.973.29 - '@smithy/config-resolver': 4.5.4 '@smithy/core': 3.24.4 - '@smithy/eventstream-serde-browser': 4.3.4 - '@smithy/eventstream-serde-config-resolver': 4.4.4 - '@smithy/eventstream-serde-node': 4.3.4 '@smithy/fetch-http-handler': 5.4.4 - '@smithy/hash-blob-browser': 4.3.4 - '@smithy/hash-node': 4.3.4 - '@smithy/hash-stream-node': 4.3.4 - '@smithy/invalid-dependency': 4.3.4 - '@smithy/md5-js': 4.3.4 - '@smithy/middleware-content-length': 4.3.4 - '@smithy/middleware-endpoint': 4.5.4 - '@smithy/middleware-retry': 4.6.4 - '@smithy/middleware-serde': 4.3.4 - '@smithy/middleware-stack': 4.3.4 - '@smithy/node-config-provider': 4.4.4 '@smithy/node-http-handler': 4.7.4 - '@smithy/protocol-http': 5.4.4 - '@smithy/smithy-client': 4.13.4 '@smithy/types': 4.14.2 - '@smithy/url-parser': 4.3.4 - '@smithy/util-base64': 4.4.4 - '@smithy/util-body-length-browser': 4.3.4 - '@smithy/util-body-length-node': 4.3.4 - '@smithy/util-defaults-mode-browser': 4.4.4 - '@smithy/util-defaults-mode-node': 4.3.4 - '@smithy/util-endpoints': 3.5.4 - '@smithy/util-middleware': 4.3.4 - '@smithy/util-retry': 4.4.4 - '@smithy/util-stream': 4.6.4 - '@smithy/util-utf8': 4.3.4 - '@smithy/util-waiter': 4.4.4 tslib: 2.8.1 '@aws-sdk/client-sesv2@3.1053.0': @@ -22371,27 +22194,12 @@ snapshots: '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.972.14': - dependencies: - '@aws-sdk/core': 3.974.13 - tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.972.11': dependencies: '@aws-sdk/types': 3.973.9 '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.972.13': - dependencies: - '@aws-sdk/core': 3.974.13 - tslib: 2.8.1 - - '@aws-sdk/middleware-recursion-detection@3.972.15': - dependencies: - '@aws-sdk/core': 3.974.13 - tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.42': dependencies: '@aws-sdk/core': 3.974.13 @@ -22408,11 +22216,6 @@ snapshots: '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.43': - dependencies: - '@aws-sdk/core': 3.974.13 - tslib: 2.8.1 - '@aws-sdk/nested-clients@3.997.11': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -22426,11 +22229,6 @@ snapshots: '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/region-config-resolver@3.972.17': - dependencies: - '@aws-sdk/core': 3.974.13 - tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.996.28': dependencies: '@aws-sdk/types': 3.973.9 @@ -22453,26 +22251,10 @@ snapshots: '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.996.12': - dependencies: - '@aws-sdk/core': 3.974.13 - '@smithy/core': 3.24.4 - tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.965.5': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.972.14': - dependencies: - '@aws-sdk/core': 3.974.13 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-node@3.973.29': - dependencies: - '@aws-sdk/core': 3.974.13 - tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.25': dependencies: '@nodable/entities': 2.1.0 @@ -24704,7 +24486,7 @@ snapshots: react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - '@hookform/resolvers@5.2.2(react-hook-form@7.72.1(react@18.3.1))': + '@hookform/resolvers@5.4.0(react-hook-form@7.72.1(react@18.3.1))': dependencies: '@standard-schema/utils': 0.3.0 react-hook-form: 7.72.1(react@18.3.1) @@ -25039,7 +24821,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 jest-regex-util: 30.0.1 '@jest/pattern@30.4.0': @@ -25171,7 +24953,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -25452,10 +25234,10 @@ snapshots: rimraf: 3.0.2 optional: true - '@number-flow/react@0.5.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@number-flow/react@0.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: esm-env: 1.2.2 - number-flow: 0.5.8 + number-flow: 0.6.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -27039,11 +26821,6 @@ snapshots: '@sinonjs/text-encoding@0.7.3': {} - '@smithy/config-resolver@4.5.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - '@smithy/core@3.24.4': dependencies: '@aws-crypto/crc32': 5.2.0 @@ -27056,183 +26833,42 @@ snapshots: '@smithy/types': 4.14.2 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/eventstream-serde-config-resolver@4.4.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/eventstream-serde-node@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - '@smithy/fetch-http-handler@5.4.4': dependencies: '@smithy/core': 3.24.4 '@smithy/types': 4.14.2 tslib: 2.8.1 - '@smithy/hash-blob-browser@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/hash-node@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/hash-stream-node@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/invalid-dependency@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/md5-js@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/middleware-content-length@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/middleware-endpoint@4.5.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/middleware-retry@4.6.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/middleware-serde@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/middleware-stack@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/node-config-provider@4.4.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - '@smithy/node-http-handler@4.7.4': dependencies: '@smithy/core': 3.24.4 '@smithy/types': 4.14.2 tslib: 2.8.1 - '@smithy/protocol-http@5.4.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - '@smithy/signature-v4@5.4.4': dependencies: '@smithy/core': 3.24.4 '@smithy/types': 4.14.2 tslib: 2.8.1 - '@smithy/smithy-client@4.13.4': - dependencies: - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 - tslib: 2.8.1 - '@smithy/types@4.14.2': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/util-base64@4.4.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/util-body-length-browser@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/util-body-length-node@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - 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-defaults-mode-browser@4.4.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/util-defaults-mode-node@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/util-endpoints@3.5.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/util-middleware@4.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/util-retry@4.4.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/util-stream@4.6.4': - dependencies: - '@smithy/core': 3.24.4 - 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.3.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - - '@smithy/util-waiter@4.4.4': - dependencies: - '@smithy/core': 3.24.4 - tslib: 2.8.1 - '@socket.io/component-emitter@3.1.2': {} '@standard-schema/spec@1.1.0': {} @@ -28460,7 +28096,7 @@ snapshots: '@alloc/quick-lru': 5.2.0 '@tailwindcss/node': 4.2.2 '@tailwindcss/oxide': 4.2.2 - postcss: 8.5.10 + postcss: 8.5.15 tailwindcss: 4.2.2 '@tailwindcss/vite@4.2.2(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': @@ -29459,12 +29095,12 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.2.0 '@types/keyv': 3.1.4 - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@types/responselike': 1.0.3 '@types/chai-as-promised@7.1.8': dependencies: - '@types/chai': 4.3.20 + '@types/chai': 5.2.3 '@types/chai@4.3.20': {} @@ -29593,7 +29229,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@types/fs-extra@5.1.0': dependencies: @@ -29610,7 +29246,7 @@ snapshots: '@types/glob@9.0.0': dependencies: - glob: 7.2.3 + glob: 13.0.6 '@types/graceful-fs@4.1.9': dependencies: @@ -29644,7 +29280,7 @@ snapshots: '@types/jsdom@28.0.1': dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 undici-types: 7.26.0 @@ -29653,16 +29289,16 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 2.1.0 - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@types/keyv@3.1.4': dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@types/linkify-it@5.0.0': {} @@ -29703,16 +29339,16 @@ snapshots: '@types/mysql@2.15.27': dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@types/node-fetch@2.6.13': dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 form-data: 4.0.5 '@types/node-jose@1.1.13': dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@types/node@18.19.130': dependencies: @@ -29734,13 +29370,13 @@ snapshots: '@types/nodemailer@6.4.23': dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@types/normalize-package-data@2.4.4': {} '@types/on-headers@1.0.4': dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@types/papaparse@5.5.2': dependencies: @@ -29754,7 +29390,7 @@ snapshots: '@types/pg@8.15.6': dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 pg-protocol: 1.14.0 pg-types: 2.2.0 @@ -29795,7 +29431,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@types/rimraf@2.0.5': dependencies: @@ -29819,7 +29455,7 @@ snapshots: '@types/set-cookie-parser@2.4.10': dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@types/sinon@17.0.4': dependencies: @@ -29839,7 +29475,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 22.19.18 + '@types/node': 25.9.1 form-data: 4.0.5 '@types/supertest@6.0.3': @@ -29851,7 +29487,7 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@types/testing-library__jest-dom@5.14.9': dependencies: @@ -29882,7 +29518,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 optional: true '@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': @@ -29999,8 +29635,8 @@ snapshots: '@typescript-eslint/project-service@8.49.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3) - '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/tsconfig-utils': 8.60.0(typescript@5.9.3) + '@typescript-eslint/types': 8.60.0 debug: 4.4.3(supports-color@5.5.0) typescript: 5.9.3 transitivePeerDependencies: @@ -30008,8 +29644,8 @@ snapshots: '@typescript-eslint/project-service@8.56.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) - '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/tsconfig-utils': 8.60.0(typescript@5.9.3) + '@typescript-eslint/types': 8.60.0 debug: 4.4.3(supports-color@5.5.0) typescript: 5.9.3 transitivePeerDependencies: @@ -30017,8 +29653,8 @@ snapshots: '@typescript-eslint/project-service@8.58.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@5.9.3) - '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/tsconfig-utils': 8.60.0(typescript@5.9.3) + '@typescript-eslint/types': 8.60.0 debug: 4.4.3(supports-color@5.5.0) typescript: 5.9.3 transitivePeerDependencies: @@ -30310,10 +29946,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': + '@vitest/coverage-v8@4.1.7(vitest@4.1.7)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.5 + '@vitest/utils': 4.1.7 ast-v8-to-istanbul: 1.0.2 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -30322,7 +29958,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/expect@3.2.4': dependencies: @@ -30332,36 +29968,36 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/expect@4.1.5': + '@vitest/expect@4.1.7': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/spy': 4.1.7 + '@vitest/utils': 4.1.7 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.7(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.5 + '@vitest/spy': 4.1.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.14.6(@types/node@22.19.18)(typescript@5.9.3) vite: 7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) - '@vitest/mocker@4.1.5(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.7(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.5 + '@vitest/spy': 4.1.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.14.6(@types/node@25.9.1)(typescript@5.9.3) vite: 7.3.2(@types/node@25.9.1)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) - '@vitest/mocker@4.1.5(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.7(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.5 + '@vitest/spy': 4.1.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: @@ -30372,19 +30008,19 @@ snapshots: dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@4.1.5': + '@vitest/pretty-format@4.1.7': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.5': + '@vitest/runner@4.1.7': dependencies: - '@vitest/utils': 4.1.5 + '@vitest/utils': 4.1.7 pathe: 2.0.3 - '@vitest/snapshot@4.1.5': + '@vitest/snapshot@4.1.7': dependencies: - '@vitest/pretty-format': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/pretty-format': 4.1.7 + '@vitest/utils': 4.1.7 magic-string: 0.30.21 pathe: 2.0.3 @@ -30392,7 +30028,7 @@ snapshots: dependencies: tinyspy: 4.0.4 - '@vitest/spy@4.1.5': {} + '@vitest/spy@4.1.7': {} '@vitest/utils@3.2.4': dependencies: @@ -30400,9 +30036,9 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - '@vitest/utils@4.1.5': + '@vitest/utils@4.1.7': dependencies: - '@vitest/pretty-format': 4.1.5 + '@vitest/pretty-format': 4.1.7 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -36319,7 +35955,7 @@ snapshots: eslint-plugin-tailwindcss@3.18.2(tailwindcss@3.4.18(tsx@4.21.0)(yaml@2.9.0)): dependencies: fast-glob: 3.3.3 - postcss: 8.5.10 + postcss: 8.5.15 tailwindcss: 3.4.18(tsx@4.21.0)(yaml@2.9.0) eslint-plugin-tailwindcss@4.0.0-beta.0(tailwindcss@4.2.2): @@ -37833,7 +37469,7 @@ snapshots: lodash: 4.18.1 multer: 2.1.1 semver: 7.8.0 - validator: 13.12.0 + validator: 13.15.35 transitivePeerDependencies: - '@75lb/nature' - '@opentelemetry/exporter-trace-otlp-http' @@ -38051,7 +37687,7 @@ snapshots: minimist: 1.2.8 selderee: 0.6.0 - html-validate@8.29.0(jest-diff@29.7.0)(jest-snapshot@29.7.0)(jest@29.7.0(@types/node@22.19.18)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1))(vitest@4.1.5): + html-validate@8.29.0(jest-diff@29.7.0)(jest-snapshot@29.7.0)(jest@29.7.0(@types/node@22.19.18)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1))(vitest@4.1.7): dependencies: '@html-validate/stylish': 4.3.0 '@sidvind/better-ajv-errors': 3.0.1(ajv@8.20.0) @@ -38065,7 +37701,7 @@ snapshots: jest: 29.7.0(@types/node@22.19.18)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1) jest-diff: 29.7.0 jest-snapshot: 29.7.0 - vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@22.19.18)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.18)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) html2canvas-objectfit-fix@1.2.0: dependencies: @@ -39075,7 +38711,7 @@ snapshots: jest-haste-map@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 22.19.18 + '@types/node': 25.9.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -39159,7 +38795,7 @@ snapshots: jest-mock@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 22.19.18 + '@types/node': 25.9.1 jest-util: 30.3.0 jest-mock@30.4.1: @@ -39304,7 +38940,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.19.18 + '@types/node': 25.9.1 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -39313,7 +38949,7 @@ snapshots: jest-util@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 22.19.18 + '@types/node': 25.9.1 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -39363,7 +38999,7 @@ snapshots: jest-worker@30.3.0: dependencies: - '@types/node': 22.19.18 + '@types/node': 25.9.1 '@ungap/structured-clone': 1.3.1 jest-util: 30.3.0 merge-stream: 2.0.0 @@ -40535,7 +40171,7 @@ snapshots: md5.js@1.3.5: dependencies: - hash-base: 3.0.5 + hash-base: 3.1.2 inherits: 2.0.4 safe-buffer: 5.2.1 @@ -41683,6 +41319,8 @@ snapshots: nodemailer@8.0.7: {} + nodemailer@8.0.8: {} + nodemon@3.1.14: dependencies: chokidar: 3.6.0 @@ -41795,7 +41433,7 @@ snapshots: num2fraction@1.2.2: {} - number-flow@0.5.8: + number-flow@0.6.0: dependencies: esm-env: 1.2.2 @@ -41999,7 +41637,7 @@ snapshots: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.6.1 + cli-spinners: 2.9.2 is-interactive: 1.0.0 log-symbols: 4.1.0 strip-ansi: 6.0.1 @@ -42657,9 +42295,9 @@ snapshots: read-cache: 1.0.0 resolve: 1.22.12 - postcss-import@15.1.0(postcss@8.5.10): + postcss-import@15.1.0(postcss@8.5.15): dependencies: - postcss: 8.5.10 + postcss: 8.5.15 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.12 @@ -42675,10 +42313,10 @@ snapshots: dependencies: postcss: 8.5.15 - postcss-js@4.1.0(postcss@8.5.10): + postcss-js@4.1.0(postcss@8.5.15): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.10 + postcss: 8.5.15 postcss-lab-function@4.2.1(postcss@8.5.15): dependencies: @@ -42695,12 +42333,12 @@ snapshots: postcss: 8.5.10 tsx: 4.21.0 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.10)(tsx@4.21.0)(yaml@2.9.0): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.15)(tsx@4.21.0)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 - postcss: 8.5.10 + postcss: 8.5.15 tsx: 4.21.0 yaml: 2.9.0 @@ -42818,9 +42456,9 @@ snapshots: icss-utils: 5.1.0(postcss@8.5.15) postcss: 8.5.15 - postcss-nested@6.2.0(postcss@8.5.10): + postcss-nested@6.2.0(postcss@8.5.15): dependencies: - postcss: 8.5.10 + postcss: 8.5.15 postcss-selector-parser: 6.1.2 postcss-nesting@10.2.0(postcss@8.5.15): @@ -44375,7 +44013,7 @@ snapshots: is-plain-object: 5.0.0 launder: 1.7.1 parse-srcset: 1.0.2 - postcss: 8.5.10 + postcss: 8.5.15 sax@1.2.4: {} @@ -45458,11 +45096,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.10 - postcss-import: 15.1.0(postcss@8.5.10) - postcss-js: 4.1.0(postcss@8.5.10) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.10)(tsx@4.21.0)(yaml@2.9.0) - postcss-nested: 6.2.0(postcss@8.5.10) + postcss: 8.5.15 + postcss-import: 15.1.0(postcss@8.5.15) + postcss-js: 4.1.0(postcss@8.5.15) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.15)(tsx@4.21.0)(yaml@2.9.0) + postcss-nested: 6.2.0(postcss@8.5.15) postcss-selector-parser: 6.1.2 resolve: 1.22.12 sucrase: 3.35.1 @@ -46586,15 +46224,15 @@ snapshots: tsx: 4.21.0 yaml: 2.9.0 - vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@22.19.18)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): + vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.18)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: - '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.5 - '@vitest/runner': 4.1.5 - '@vitest/snapshot': 4.1.5 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/expect': 4.1.7 + '@vitest/mocker': 4.1.7(msw@2.14.6(@types/node@22.19.18)(typescript@5.9.3))(vite@7.3.2(@types/node@22.19.18)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.7 + '@vitest/runner': 4.1.7 + '@vitest/snapshot': 4.1.7 + '@vitest/spy': 4.1.7 + '@vitest/utils': 4.1.7 es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -46611,20 +46249,20 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.1 '@types/node': 22.19.18 - '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) + '@vitest/coverage-v8': 4.1.7(vitest@4.1.7) jsdom: 29.1.1(@noble/hashes@1.8.0) transitivePeerDependencies: - msw - vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): + vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: - '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.5 - '@vitest/runner': 4.1.5 - '@vitest/snapshot': 4.1.5 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/expect': 4.1.7 + '@vitest/mocker': 4.1.7(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.7 + '@vitest/runner': 4.1.7 + '@vitest/snapshot': 4.1.7 + '@vitest/spy': 4.1.7 + '@vitest/utils': 4.1.7 es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -46641,20 +46279,20 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.1 '@types/node': 25.9.1 - '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) + '@vitest/coverage-v8': 4.1.7(vitest@4.1.7) jsdom: 29.1.1(@noble/hashes@1.8.0) transitivePeerDependencies: - msw - vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): + vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: - '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.5 - '@vitest/runner': 4.1.5 - '@vitest/snapshot': 4.1.5 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/expect': 4.1.7 + '@vitest/mocker': 4.1.7(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.7 + '@vitest/runner': 4.1.7 + '@vitest/snapshot': 4.1.7 + '@vitest/spy': 4.1.7 + '@vitest/utils': 4.1.7 es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -46671,7 +46309,7 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.1 '@types/node': 25.9.1 - '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) + '@vitest/coverage-v8': 4.1.7(vitest@4.1.7) jsdom: 29.1.1(@noble/hashes@1.8.0) transitivePeerDependencies: - msw @@ -47003,7 +46641,7 @@ snapshots: wide-align@1.1.5: dependencies: - string-width: 1.0.2 + string-width: 4.2.3 word-wrap@1.2.5: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 71ac64de377..5ec51cfb233 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -55,7 +55,7 @@ catalog: '@types/validator': 13.15.10 '@typescript-eslint/parser': 8.49.0 '@vitejs/plugin-react': 4.7.0 - '@vitest/coverage-v8': 4.1.5 + '@vitest/coverage-v8': 4.1.7 bson-objectid: 2.0.4 c8: 10.1.3 chai: 4.5.0 @@ -87,7 +87,7 @@ catalog: validator: 13.12.0 vite: 7.3.2 vite-plugin-svgr: 4.5.0 - vitest: 4.1.5 + vitest: 4.1.7 zod: 4.1.12 catalogs: @@ -161,3 +161,14 @@ packageExtensions: '@tryghost/nql@0.12.10': dependencies: lodash: ^4.18.0 +minimumReleaseAgeExclude: + # Renovate security update: @number-flow/react@0.6.0 + - "@number-flow/react@0.6.0" + # Renovate security update: @aws-sdk/client-s3@3.1053.0 + - "@aws-sdk/client-s3@3.1053.0" + # Renovate security update: @vitest/coverage-v8@4.1.7 + - "@vitest/coverage-v8@4.1.7" + # Renovate security update: vitest@4.1.7 + - vitest@4.1.7 + # Renovate security update: @hookform/resolvers@5.4.0 + - "@hookform/resolvers@5.4.0"