diff --git a/.gitignore b/.gitignore index 5bf37c0df..a83a2110e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ test/node_modules */node_modules docker/dev/dnsrouter-config.json.tmp docker/dev/resolv.conf +.claude + diff --git a/.version b/.version index edcfe40d1..68e69e405 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.14.0 +2.15.0 diff --git a/README.md b/README.md index c22f12fad..0af3edecd 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@



- + diff --git a/SECURITY.md b/SECURITY.md index 159479835..66e4bb1f6 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -7,8 +7,8 @@ Older versions are not actively maintained. | Version | Supported | | ------- | --------- | -| 2.14.x (latest) | :white_check_mark: | -| < 2.14.0 | :x: | +| 2.15.x (latest) | :white_check_mark: | +| < 2.15.0 | :x: | Docker images: `jc21/nginx-proxy-manager:latest`, `jc21/nginx-proxy-manager:2` diff --git a/backend/app.js b/backend/app.js index 3039bbb8e..b1f047661 100644 --- a/backend/app.js +++ b/backend/app.js @@ -62,7 +62,7 @@ app.use("/", mainRoutes); app.use((err, req, res, _) => { const payload = { error: { - code: err.status, + code: err.status || 500, message: err.public ? err.message : "Internal Error", }, }; diff --git a/backend/certbot/dns-plugins.json b/backend/certbot/dns-plugins.json index 6cc7ef01c..220819404 100644 --- a/backend/certbot/dns-plugins.json +++ b/backend/certbot/dns-plugins.json @@ -335,6 +335,14 @@ "package_name": "certbot-dns-hetzner-cloud", "version": "~=1.0.4" }, + "hostinger": { + "credentials": "dns_hostinger_api_token = 0123456789abcdef0123456789abcdef", + "dependencies": "", + "full_plugin_name": "dns-hostinger", + "name": "Hostinger.com", + "package_name": "certbot-dns-hostinger", + "version": "~=0.1.3" + }, "hostingnl": { "credentials": "dns_hostingnl_api_key = 0123456789abcdef0123456789abcdef", "dependencies": "", @@ -545,7 +553,7 @@ }, "powerdns": { "credentials": "dns_powerdns_api_url = https://api.mypowerdns.example.org\ndns_powerdns_api_key = AbCbASsd!@34", - "dependencies": "PyYAML==5.3.1", + "dependencies": "acme=={{certbot-version}}", "full_plugin_name": "dns-powerdns", "name": "PowerDNS", "package_name": "certbot-dns-powerdns", diff --git a/backend/internal/certificate.js b/backend/internal/certificate.js index 59c13bf69..6498422c6 100644 --- a/backend/internal/certificate.js +++ b/backend/internal/certificate.js @@ -614,7 +614,7 @@ const internalCertificate = { const certificate = await internalCertificate.update(access, { id: data.id, expires_on: moment(validations.certificate.dates.to, "X").format("YYYY-MM-DD HH:mm:ss"), - domain_names: [validations.certificate.cn], + domain_names: validations.certificate.cn ? [validations.certificate.cn] : [], meta: _.clone(row.meta), // Prevent the update method from changing this value that we'll use later }); @@ -683,13 +683,15 @@ const internalCertificate = { try { const result = await utils.execFile("openssl", ["x509", "-in", certificateFile, "-subject", "-noout"]); + // Examples: // subject=CN = *.jc21.com // subject=CN = something.example.com - const regex = /(?:subject=)?[^=]+=\s+(\S+)/gim; + // subject=CN=*.jc21.com + const regex = /(?:subject=)?[^=]+=\s*(\S+)/gim; const match = regex.exec(result); if (match && typeof match[1] !== "undefined") { - certData.cn = match[1]; + certData.cn = match[1].trim(); } const result2 = await utils.execFile("openssl", ["x509", "-in", certificateFile, "-issuer", "-noout"]); @@ -779,6 +781,7 @@ const internalCertificate = { const args = [ "certonly", + "-n", // non-interactive "--config", letsencryptConfig, "--work-dir", @@ -834,6 +837,7 @@ const internalCertificate = { const args = [ "certonly", + "-n", // non-interactive "--config", letsencryptConfig, "--work-dir", diff --git a/backend/lib/certbot.js b/backend/lib/certbot.js index 3a2dd072e..2b9e181b0 100644 --- a/backend/lib/certbot.js +++ b/backend/lib/certbot.js @@ -4,8 +4,6 @@ import { certbot as logger } from "../logger.js"; import errs from "./error.js"; import utils from "./utils.js"; -const CERTBOT_VERSION_REPLACEMENT = "$(certbot --version | grep -Eo '[0-9](\\.[0-9]+)+')"; - /** * Installs a cerbot plugin given the key for the object from * ../certbot/dns-plugins.json @@ -15,24 +13,32 @@ const CERTBOT_VERSION_REPLACEMENT = "$(certbot --version | grep -Eo '[0-9](\\.[0 */ const installPlugin = async (pluginKey) => { if (typeof dnsPlugins[pluginKey] === "undefined") { - // throw Error(`Certbot plugin ${pluginKey} not found`); throw new errs.ItemNotFoundError(pluginKey); } const plugin = dnsPlugins[pluginKey]; logger.start(`Installing ${pluginKey}...`); - plugin.version = plugin.version.replace(/{{certbot-version}}/g, CERTBOT_VERSION_REPLACEMENT); - plugin.dependencies = plugin.dependencies.replace(/{{certbot-version}}/g, CERTBOT_VERSION_REPLACEMENT); + plugin.version = plugin.version.replace(/{{certbot-version}}/g, process.env.CERTBOT_VERSION); + plugin.dependencies = plugin.dependencies.replace(/{{certbot-version}}/g, process.env.CERTBOT_VERSION); - // SETUPTOOLS_USE_DISTUTILS is required for certbot plugins to install correctly - // in new versions of Python - let env = Object.assign({}, process.env, { SETUPTOOLS_USE_DISTUTILS: "stdlib" }); + // SETUPTOOLS_USE_DISTUTILS=local uses setuptools' own bundled distutils. + // "stdlib" breaks Python 3.13+ where distutils was removed from the standard library. + let env = Object.assign({}, process.env, { SETUPTOOLS_USE_DISTUTILS: "local" }); if (typeof plugin.env === "object") { env = Object.assign(env, plugin.env); } - const cmd = `. /opt/certbot/bin/activate && pip install --no-cache-dir ${plugin.dependencies} ${plugin.package_name}${plugin.version} && deactivate`; + const quotedDeps = plugin.dependencies.trim() + ? plugin.dependencies + .trim() + .split(/\s+/) + .filter(Boolean) + .map((d) => `'${d}'`) + .join(" ") + : ""; + + const cmd = `. /opt/certbot/bin/activate && pip install --no-cache-dir ${quotedDeps} '${plugin.package_name}${plugin.version}' && deactivate`; return utils .exec(cmd, { env }) .then((result) => { @@ -73,9 +79,7 @@ const installPlugins = async (pluginKeys) => { }) .end(() => { if (hasErrors) { - reject( - new errs.CommandError("Some plugins failed to install. Please check the logs above", 1), - ); + reject(new errs.CommandError("Some plugins failed to install. Please check the logs above", 1)); } else { resolve(); } @@ -83,4 +87,4 @@ const installPlugins = async (pluginKeys) => { }); }; -export { installPlugins, installPlugin }; +export { installPlugin, installPlugins }; diff --git a/backend/lib/express/log-request.js b/backend/lib/express/log-request.js new file mode 100644 index 000000000..a70ecc713 --- /dev/null +++ b/backend/lib/express/log-request.js @@ -0,0 +1,7 @@ +import chalk from "chalk"; +import { debug, express as logger } from "../../logger.js"; + +export default (req, _res, next) => { + debug(logger, `[${chalk.yellow(req.method.toUpperCase())}] ${chalk.green(req.path)}`); + next(); +}; diff --git a/backend/lib/utils.js b/backend/lib/utils.js index af7ad3c95..a19142af0 100644 --- a/backend/lib/utils.js +++ b/backend/lib/utils.js @@ -3,14 +3,12 @@ import { dirname } from "node:path"; import { fileURLToPath } from "node:url"; import { Liquid } from "liquidjs"; import _ from "lodash"; -import { debug, global as logger } from "../logger.js"; import errs from "./error.js"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const exec = async (cmd, options = {}) => { - debug(logger, "CMD:", cmd); const { stdout, stderr } = await new Promise((resolve, reject) => { const child = nodeExec(cmd, options, (isError, stdout, stderr) => { if (isError) { @@ -34,7 +32,6 @@ const exec = async (cmd, options = {}) => { * @returns {Promise} */ const execFile = (cmd, args, options) => { - debug(logger, `CMD: ${cmd} ${args ? args.join(" ") : ""}`); const opts = options || {}; return new Promise((resolve, reject) => { diff --git a/backend/models/certificate.js b/backend/models/certificate.js index ad6e0a65f..954255b9e 100644 --- a/backend/models/certificate.js +++ b/backend/models/certificate.js @@ -15,6 +15,16 @@ Model.knex(db()); const boolFields = ["is_deleted"]; +const cleanDomainNames = (domainNames) => { + // Sort domain_names + if (typeof domainNames !== "undefined") { + const newDomainNames = domainNames.filter((name) => name != null); + newDomainNames.sort(); + return newDomainNames; + } + return []; +}; + class Certificate extends Model { $beforeInsert() { this.created_on = now(); @@ -26,7 +36,9 @@ class Certificate extends Model { } // Default for domain_names - if (typeof this.domain_names === "undefined") { + if (typeof this.domain_names !== "undefined") { + this.domain_names = cleanDomainNames(this.domain_names); + } else { this.domain_names = []; } @@ -34,16 +46,12 @@ class Certificate extends Model { if (typeof this.meta === "undefined") { this.meta = {}; } - - this.domain_names.sort(); } $beforeUpdate() { this.modified_on = now(); - - // Sort domain_names if (typeof this.domain_names !== "undefined") { - this.domain_names.sort(); + this.domain_names = cleanDomainNames(this.domain_names); } } diff --git a/backend/package.json b/backend/package.json index 34c39217c..80ae74b45 100644 --- a/backend/package.json +++ b/backend/package.json @@ -20,13 +20,14 @@ "bcrypt": "^6.0.0", "better-sqlite3": "^12.10.0", "body-parser": "^2.2.2", + "chalk": "5.6.2", "compression": "^1.8.1", "express": "^5.2.1", "express-fileupload": "^1.5.2", "gravatar": "^1.8.2", "jsonwebtoken": "^9.0.3", "knex": "3.2.10", - "liquidjs": "10.25.7", + "liquidjs": "10.27.0", "lodash": "^4.18.1", "moment": "^2.30.1", "mysql2": "^3.22.3", @@ -34,7 +35,7 @@ "objection": "3.1.5", "otplib": "^13.4.0", "path": "^0.12.7", - "pg": "^8.20.0", + "pg": "^8.21.0", "proxy-agent": "^8.0.1", "signale": "1.4.0", "sqlite3": "^6.0.1", @@ -43,7 +44,6 @@ "devDependencies": { "@apidevtools/swagger-parser": "^12.1.0", "@biomejs/biome": "^2.4.15", - "chalk": "5.6.2", "nodemon": "^3.1.14" }, "signale": { diff --git a/backend/routes/ci.js b/backend/routes/ci.js new file mode 100644 index 000000000..a6f8be03a --- /dev/null +++ b/backend/routes/ci.js @@ -0,0 +1,59 @@ +import express from "express"; +import dnsPlugins from "../certbot/dns-plugins.json" with { type: "json" }; +import { installPlugin } from "../lib/certbot.js"; +import { debug, express as logger } from "../logger.js"; + +const router = express.Router({ + caseSensitive: true, + strict: true, + mergeParams: true, +}); + +/** + * ONLY AVAILABLE IN CI ENVIRONMENT! + */ + +/** + * /api/ci/certbot-plugins + */ +router + .route("/certbot-plugins") + .options((_, res) => { + res.sendStatus(204); + }) + + // Return all certbot plugins + .get(async (_req, res, _next) => { + res.status(200).send(dnsPlugins); + }); + +/** + * /api/ci/certbot-plugins/{plugin} + */ +router + .route("/certbot-plugins/:plugin") + .options((_, res) => { + res.sendStatus(204); + }) + + // Install a certbot plugin + .post(async (req, res, next) => { + try { + const pluginName = req.params.plugin; + // check if plugin exists + if (!dnsPlugins[pluginName]) { + return res.status(404).send({ + error: "Plugin not found", + }); + } + + await installPlugin(pluginName); + res.status(200).send(true); + } catch (err) { + debug(logger, `${req.method.toUpperCase()} ${req.path}: ${err}`); + next(err); + } + return; + }); + +export default router; diff --git a/backend/routes/main.js b/backend/routes/main.js index 94682cfba..a308ea617 100644 --- a/backend/routes/main.js +++ b/backend/routes/main.js @@ -1,8 +1,11 @@ import express from "express"; +import { isCI } from "../lib/config.js"; import errs from "../lib/error.js"; +import logRequest from "../lib/express/log-request.js"; import pjson from "../package.json" with { type: "json" }; import { isSetup } from "../setup.js"; import auditLogRoutes from "./audit-log.js"; +import ciRoutes from "./ci.js"; import accessListsRoutes from "./nginx/access_lists.js"; import certificatesHostsRoutes from "./nginx/certificates.js"; import deadHostsRoutes from "./nginx/dead_hosts.js"; @@ -22,6 +25,8 @@ const router = express.Router({ mergeParams: true, }); +router.use(logRequest); + /** * Health Check * GET /api @@ -55,6 +60,11 @@ router.use("/nginx/streams", streamsRoutes); router.use("/nginx/access-lists", accessListsRoutes); router.use("/nginx/certificates", certificatesHostsRoutes); +// Only include CI routes if we're in a CI environment +if (isCI()) { + router.use("/ci", ciRoutes); +} + /** * API 404 for all other routes * diff --git a/backend/templates/_access.conf b/backend/templates/_access.conf index 4f3885451..81983f3a3 100644 --- a/backend/templates/_access.conf +++ b/backend/templates/_access.conf @@ -10,11 +10,13 @@ {% endif %} + {% if access_list.clients.length > 0 %} # Access Rules: {{ access_list.clients | size }} total {% for client in access_list.clients %} {{client | nginxAccessRule}} {% endfor %} deny all; + {% endif %} # Access checks must... {% if access_list.satisfy_any == 1 or access_list.satisfy_any == true %} diff --git a/backend/yarn.lock b/backend/yarn.lock index c1de2bee8..427e834fa 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -1279,10 +1279,10 @@ lazystream@^1.0.0: dependencies: readable-stream "^2.0.5" -liquidjs@10.25.7: - version "10.25.7" - resolved "https://registry.yarnpkg.com/liquidjs/-/liquidjs-10.25.7.tgz#75c5765ae42e04da30fba15ae20daab57c4a7a8c" - integrity sha512-rPCjJLiD4eDhQjvv964AeXFC+HbeYBbZrd7Z82Q6hqv1lX7G+5w4SJcKLn9CAAAwHI4aS3dTdo083UB79K3pDA== +liquidjs@10.27.0: + version "10.27.0" + resolved "https://registry.yarnpkg.com/liquidjs/-/liquidjs-10.27.0.tgz#e31dc4c539e1a26aee46c847b4e60a6ede32564a" + integrity sha512-tw/OA59K7aIBlMKIrKlumr37fiZUheShVHXY8cVctWisgY1p9mc5hreOvlreoS0wTiwlWk14Ya7305c2a/Cg5w== dependencies: commander "^10.0.0" @@ -1707,35 +1707,35 @@ path@^0.12.7: process "^0.11.1" util "^0.10.3" -pg-cloudflare@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz#386035d4bfcf1a7045b026f8b21acf5353f14d65" - integrity sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ== +pg-cloudflare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.4.0.tgz#4b4c20e6d8ae531d400730f4804571a8d62f1497" + integrity sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A== pg-connection-string@2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475" integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== -pg-connection-string@^2.12.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.12.0.tgz#4084f917902bb2daae3dc1376fe24ac7b4eaccf2" - integrity sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ== +pg-connection-string@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.13.0.tgz#8678113465a5af3cc977dcb51eadc847b27aa2de" + integrity sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig== pg-int8@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@^3.13.0: - version "3.13.0" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.13.0.tgz#416482e9700e8f80c685a6ae5681697a413c13a3" - integrity sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA== +pg-pool@^3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.14.0.tgz#f35ae4eb846780cad71af24099b3edfa9781ad90" + integrity sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw== -pg-protocol@^1.13.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.13.0.tgz#fdaf6d020bca590d58bb991b4b16fc448efe0511" - integrity sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w== +pg-protocol@^1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.14.0.tgz#c1f045b74274b007078c687147141f785f59b8de" + integrity sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA== pg-types@2.2.0: version "2.2.0" @@ -1748,18 +1748,18 @@ pg-types@2.2.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@^8.20.0: - version "8.20.0" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.20.0.tgz#1a274de944cb329fd6dd77a6d371a005ba6b136d" - integrity sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA== +pg@^8.21.0: + version "8.21.0" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.21.0.tgz#d7fa2118d960cec5cc7d2b24525f9850dd5932b0" + integrity sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA== dependencies: - pg-connection-string "^2.12.0" - pg-pool "^3.13.0" - pg-protocol "^1.13.0" + pg-connection-string "^2.13.0" + pg-pool "^3.14.0" + pg-protocol "^1.14.0" pg-types "2.2.0" pgpass "1.0.5" optionalDependencies: - pg-cloudflare "^1.3.0" + pg-cloudflare "^1.4.0" pgpass@1.0.5: version "1.0.5" @@ -1887,9 +1887,9 @@ pump@^3.0.0: once "^1.3.1" qs@^6.14.0, qs@^6.14.1: - version "6.15.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.0.tgz#db8fd5d1b1d2d6b5b33adaf87429805f1909e7b3" - integrity sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ== + version "6.15.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.2.tgz#fd55426d710403ddccc45e0f9eab16db7727ece9" + integrity sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw== dependencies: side-channel "^1.1.0" diff --git a/docker/Dockerfile b/docker/Dockerfile index f0f9a27d8..01b478b0e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -39,15 +39,17 @@ EXPOSE 80 81 443 COPY backend /app COPY frontend/dist /app/frontend +COPY docker/rootfs / + +# Copy test CA cert for use in container and add to trusted certs from a self-signed CA +COPY --from=testca /home/step/certs/root_ca.crt /etc/ssl/certs/NginxProxyManager.crt +WORKDIR /etc/ssl/certs +RUN ln -s NginxProxyManager.crt 1d0e3f10.0 && update-ca-certificates WORKDIR /app RUN yarn install \ && yarn cache clean -# add late to limit cache-busting by modifications -COPY docker/rootfs / -COPY --from=testca /home/step/certs/root_ca.crt /etc/ssl/certs/NginxProxyManager.crt - # Remove frontend service not required for prod, dev nginx config as well RUN rm -rf /etc/s6-overlay/s6-rc.d/user/contents.d/frontend /etc/nginx/conf.d/dev.conf \ && chmod 644 /etc/logrotate.d/nginx-proxy-manager diff --git a/docker/dev/Dockerfile b/docker/dev/Dockerfile index f0f5ec60d..8593fd5ef 100644 --- a/docker/dev/Dockerfile +++ b/docker/dev/Dockerfile @@ -20,10 +20,10 @@ RUN echo "fs.file-max = 65535" > /etc/sysctl.conf \ # Task WORKDIR /usr -RUN curl -sL https://taskfile.dev/install.sh | sh -WORKDIR /root +RUN curl -sL 'https://taskfile.dev/install.sh' | sh COPY rootfs / + COPY scripts/install-s6 /tmp/install-s6 RUN rm -f /etc/nginx/conf.d/production.conf \ && chmod 644 /etc/logrotate.d/nginx-proxy-manager \ @@ -31,8 +31,12 @@ RUN rm -f /etc/nginx/conf.d/production.conf \ && rm -f /tmp/install-s6 \ && chmod 644 -R /root/.cache -# Certs for testing purposes +# Copy test CA cert for use in container and add to trusted certs from a self-signed CA COPY --from=testca /home/step/certs/root_ca.crt /etc/ssl/certs/NginxProxyManager.crt +WORKDIR /etc/ssl/certs +RUN ln -s NginxProxyManager.crt 1d0e3f10.0 && update-ca-certificates + +WORKDIR /root EXPOSE 80 81 443 ENTRYPOINT [ "/init" ] diff --git a/docker/docker-compose.ci.isolated.yml b/docker/docker-compose.ci.isolated.yml new file mode 100644 index 000000000..b2d88f719 --- /dev/null +++ b/docker/docker-compose.ci.isolated.yml @@ -0,0 +1,13 @@ +# WARNING: This is a CI docker-compose file used for building and testing of the entire app, it should not be used for production. +services: + cypress: + environment: + CYPRESS_stack: "sqlite" + command: cypress run --browser chrome --config-file=cypress/config/ci.mjs --expose grepTags="@isolated" + + fullstack: + environment: + DB_SQLITE_FILE: "/data/mydb.sqlite" + PUID: 1000 + PGID: 1000 + DISABLE_IPV6: "true" diff --git a/docker/docker-compose.ci.sqlite.yml b/docker/docker-compose.ci.sqlite.yml index 1c5be48e9..a8e057a86 100644 --- a/docker/docker-compose.ci.sqlite.yml +++ b/docker/docker-compose.ci.sqlite.yml @@ -1,9 +1,12 @@ # WARNING: This is a CI docker-compose file used for building and testing of the entire app, it should not be used for production. services: + cypress: + environment: + CYPRESS_stack: "sqlite" fullstack: environment: - DB_SQLITE_FILE: '/data/mydb.sqlite' + DB_SQLITE_FILE: "/data/mydb.sqlite" PUID: 1000 PGID: 1000 - DISABLE_IPV6: 'true' + DISABLE_IPV6: "true" diff --git a/docker/docker-compose.ci.yml b/docker/docker-compose.ci.yml index 1bf6dade2..6130f82e3 100644 --- a/docker/docker-compose.ci.yml +++ b/docker/docker-compose.ci.yml @@ -39,7 +39,7 @@ services: - website3.example.com stepca: - image: jc21/testca + image: nginxproxymanager/testca volumes: - "./dev/resolv.conf:/etc/resolv.conf:ro" - "/etc/localtime:/etc/localtime:ro" @@ -109,7 +109,7 @@ services: - "cypress_logs:/test/results" - "./dev/resolv.conf:/etc/resolv.conf:ro" - "/etc/localtime:/etc/localtime:ro" - command: cypress run --browser chrome --config-file=cypress/config/ci.mjs + command: cypress run --browser chrome --config-file=cypress/config/ci.mjs --expose grepTags="-@isolated" networks: - fulltest diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index 4d519f8ac..d6b07ec01 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -94,7 +94,7 @@ services: - pgdb.internal stepca: - image: jc21/testca + image: nginxproxymanager/testca container_name: npm2dev.stepca volumes: - "./dev/resolv.conf:/etc/resolv.conf:ro" diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/backend/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/backend/run index 37a95f7d1..b140257b7 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/backend/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/backend/run @@ -11,11 +11,11 @@ log_info 'Starting backend ...' if [ "${DEVELOPMENT:-}" = 'true' ]; then s6-setuidgid "$PUID:$PGID" yarn install - exec s6-setuidgid "$PUID:$PGID" bash -c "export HOME=$NPMHOME;node --max_old_space_size=250 --abort_on_uncaught_exception node_modules/nodemon/bin/nodemon.js" + exec s6-setuidgid "$PUID:$PGID" bash -c "export HOME=$NPMHOME;export CERTBOT_VERSION=$CERTBOT_VERSION;node --max_old_space_size=250 --abort_on_uncaught_exception node_modules/nodemon/bin/nodemon.js" else while : do - s6-setuidgid "$PUID:$PGID" bash -c "export HOME=$NPMHOME;node --abort_on_uncaught_exception --max_old_space_size=250 index.js" + s6-setuidgid "$PUID:$PGID" bash -c "export HOME=$NPMHOME;export CERTBOT_VERSION=$CERTBOT_VERSION;node --abort_on_uncaught_exception --max_old_space_size=250 index.js" sleep 1 done fi diff --git a/docker/rootfs/usr/bin/common.sh b/docker/rootfs/usr/bin/common.sh index 46529870a..92bf19d9c 100644 --- a/docker/rootfs/usr/bin/common.sh +++ b/docker/rootfs/usr/bin/common.sh @@ -21,6 +21,10 @@ NPMGROUP=npm NPMHOME=/tmp/npmuserhome export NPMUSER NPMGROUP NPMHOME +# Query the certbot version just once and use it elsewhere +CERTBOT_VERSION="$(certbot --version | grep -Eo '[0-9](\.[0-9]+)+')" +export CERTBOT_VERSION + if [[ "$PUID" -ne '0' ]] && [ "$PGID" = '0' ]; then # set group id to same as user id, # the user probably forgot to specify the group id and diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 52586bfc3..b6f6f3f66 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -1,4 +1,4 @@ -import { defineConfig, type DefaultTheme } from 'vitepress'; +import { defineConfig } from "vitepress"; // https://vitepress.dev/reference/site-config export default defineConfig({ @@ -6,56 +6,101 @@ export default defineConfig({ description: "Expose your services easily and securely", head: [ ["link", { rel: "icon", href: "/icon.png" }], - ["meta", { name: "description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt" }], + [ + "meta", + { + name: "description", + content: + "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt", + }, + ], ["meta", { property: "og:title", content: "Nginx Proxy Manager" }], - ["meta", { property: "og:description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt"}], + [ + "meta", + { + property: "og:description", + content: + "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt", + }, + ], ["meta", { property: "og:type", content: "website" }], ["meta", { property: "og:url", content: "https://nginxproxymanager.com/" }], - ["meta", { property: "og:image", content: "https://nginxproxymanager.com/icon.png" }], - ["meta", { name: "twitter:card", content: "summary"}], - ["meta", { name: "twitter:title", content: "Nginx Proxy Manager"}], - ["meta", { name: "twitter:description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt"}], - ["meta", { name: "twitter:image", content: "https://nginxproxymanager.com/icon.png"}], - ["meta", { name: "twitter:alt", content: "Nginx Proxy Manager"}], + [ + "meta", + { + property: "og:image", + content: "https://nginxproxymanager.com/icon.png", + }, + ], + ["meta", { name: "twitter:card", content: "summary" }], + ["meta", { name: "twitter:title", content: "Nginx Proxy Manager" }], + [ + "meta", + { + name: "twitter:description", + content: + "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt", + }, + ], + [ + "meta", + { + name: "twitter:image", + content: "https://nginxproxymanager.com/icon.png", + }, + ], + ["meta", { name: "twitter:alt", content: "Nginx Proxy Manager" }], // GA - ['script', { async: 'true', src: 'https://www.googletagmanager.com/gtag/js?id=G-TXT8F5WY5B'}], - ['script', {}, "window.dataLayer = window.dataLayer || [];\nfunction gtag(){dataLayer.push(arguments);}\ngtag('js', new Date());\ngtag('config', 'G-TXT8F5WY5B');"], + [ + "script", + { + async: "true", + src: "https://www.googletagmanager.com/gtag/js?id=G-TXT8F5WY5B", + }, + ], + [ + "script", + {}, + "window.dataLayer = window.dataLayer || [];\nfunction gtag(){dataLayer.push(arguments);}\ngtag('js', new Date());\ngtag('config', 'G-TXT8F5WY5B');", + ], ], sitemap: { - hostname: 'https://nginxproxymanager.com' + hostname: "https://nginxproxymanager.com", }, metaChunk: true, - srcDir: './src', - outDir: './dist', + srcDir: "./src", + outDir: "./dist", themeConfig: { // https://vitepress.dev/reference/default-theme-config - logo: { src: '/logo.svg', width: 24, height: 24 }, - nav: [ - { text: 'Setup', link: '/setup/' }, - ], + logo: { src: "/logo.svg", width: 24, height: 24 }, + nav: [{ text: "Setup", link: "/setup/" }], sidebar: [ { items: [ // { text: 'Home', link: '/' }, - { text: 'Guide', link: '/guide/' }, - { text: 'Screenshots', link: '/screenshots/' }, - { text: 'Setup Instructions', link: '/setup/' }, - { text: 'Advanced Configuration', link: '/advanced-config/' }, - { text: 'Upgrading', link: '/upgrading/' }, - { text: 'Frequently Asked Questions', link: '/faq/' }, - { text: 'Third Party', link: '/third-party/' }, - ] - } + { text: "Guide", link: "/guide/" }, + { text: "Screenshots", link: "/screenshots/" }, + { text: "Setup Instructions", link: "/setup/" }, + { text: "Advanced Configuration", link: "/advanced-config/" }, + { text: "Upgrading", link: "/upgrading/" }, + { text: "Frequently Asked Questions", link: "/faq/" }, + { text: "Certbot", link: "/certbot/" }, + { text: "Third Party", link: "/third-party/" }, + ], + }, ], socialLinks: [ - { icon: 'github', link: 'https://github.com/NginxProxyManager/nginx-proxy-manager' } + { + icon: "github", + link: "https://github.com/NginxProxyManager/nginx-proxy-manager", + }, ], search: { - provider: 'local' + provider: "local", }, footer: { - message: 'Released under the MIT License.', - copyright: 'Copyright © 2016-present jc21.com' - } - } + message: "Released under the MIT License.", + copyright: "Copyright © 2016-present jc21.com", + }, + }, }); diff --git a/docs/src/certbot/index.md b/docs/src/certbot/index.md new file mode 100644 index 000000000..f8845367c --- /dev/null +++ b/docs/src/certbot/index.md @@ -0,0 +1,38 @@ +--- +outline: deep +--- + +## Certbot DNS plugins in Nginx Proxy Manager + +Nginx Proxy Manager uses Certbot to issue and renew Let’s Encrypt certificates. + +When you request a certificate using a DNS challenge, Nginx Proxy Manager installs +the corresponding Certbot DNS plugin for the provider you selected. The available +providers and package versions are defined in +⁠[certbot-dns-plugins.json](https://github.com/NginxProxyManager/nginx-proxy-manager/blob/develop/backend/certbot/dns-plugins.json). + +## Important limitations + +DNS plugins are maintained independently from Certbot and from Nginx Proxy Manager. As a result: +- Some plugins may lag behind current Certbot or dependency versions. +- A plugin may install package versions that conflict with other Certbot components. +- Support quality varies between providers, and not every plugin is regularly tested in Nginx Proxy Manager. + +::: warning +Using more than one DNS provider in the same Nginx Proxy Manager instance may introduce Python +dependency conflicts between Certbot plugins. +::: + +## If a DNS plugin does not work + +1. Check the Nginx Proxy Manager container logs for Certbot or Python package installation errors. +2. Identify the plugin package and version defined for your provider in +⁠[certbot-dns-plugins.json](https://github.com/NginxProxyManager/nginx-proxy-manager/blob/develop/backend/certbot/dns-plugins.json). +3. Check [PyPI](https://pypi.org/) or the plugin project for a newer compatible release. +4. If needed, update the plugin definition, including any required dependency pins. +5. Submitting a pull request and CI will build a testable docker image for you. + +## File reference + +Use this file when reviewing or updating provider definitions: +- ⁠[certbot-dns-plugins.json](https://github.com/NginxProxyManager/nginx-proxy-manager/blob/develop/backend/certbot/dns-plugins.json) diff --git a/frontend/package.json b/frontend/package.json index 1d98b5d48..769a2a770 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,12 +18,12 @@ "dependencies": { "@tabler/core": "^1.4.0", "@tabler/icons-react": "^3.44.0", - "@tanstack/react-query": "^5.100.10", + "@tanstack/react-query": "^5.100.14", "@tanstack/react-table": "^8.21.3", "@uiw/react-textarea-code-editor": "^3.1.1", "classnames": "^2.5.1", "country-flag-icons": "^1.6.17", - "date-fns": "^4.1.0", + "date-fns": "^4.3.0", "ez-modal-react": "^1.0.5", "formik": "^2.4.9", "generate-password-browser": "^1.1.0", @@ -32,35 +32,35 @@ "react": "^19.2.6", "react-bootstrap": "^2.10.10", "react-dom": "^19.2.6", - "react-intl": "^10.1.6", + "react-intl": "^10.1.9", "react-markdown": "^10.1.0", - "react-router-dom": "^7.15.0", + "react-router-dom": "^7.15.1", "react-select": "^5.10.2", "react-toastify": "^11.1.0", "rooks": "^9.8.0" }, "devDependencies": { "@biomejs/biome": "^2.4.15", - "@formatjs/cli": "^6.15.0", - "@tanstack/react-query-devtools": "^5.100.10", + "@formatjs/cli": "^6.16.3", + "@tanstack/react-query-devtools": "^5.100.14", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@types/country-flag-icons": "^1.2.2", "@types/humps": "^2.0.6", - "@types/node": "^25.7.0", - "@types/react": "^19.2.14", + "@types/node": "^25.9.1", + "@types/react": "^19.2.15", "@types/react-dom": "^19.2.3", "@types/react-table": "^7.7.20", - "@vitejs/plugin-react": "^6.0.1", + "@vitejs/plugin-react": "^6.0.2", "happy-dom": "^20.9.0", - "postcss": "^8.5.14", + "postcss": "^8.5.15", "postcss-simple-vars": "^7.0.1", - "sass": "^1.99.0", - "tmp": "^0.2.5", + "sass": "^1.100.0", + "tmp": "^0.2.6", "typescript": "6.0.3", - "vite": "^8.0.12", - "vite-plugin-checker": "^0.13.0", - "vitest": "^4.1.6" + "vite": "^8.0.14", + "vite-plugin-checker": "^0.14.1", + "vitest": "^4.1.7" } } diff --git a/frontend/src/locale/src/fr.json b/frontend/src/locale/src/fr.json index cdceb79dd..0911eedc3 100644 --- a/frontend/src/locale/src/fr.json +++ b/frontend/src/locale/src/fr.json @@ -231,7 +231,7 @@ "defaultMessage": "Type de clé" }, "certificates.key-type-description": { - "defaultMessage": "RSA est largement compatible, ECDSA est plus rapide et plus sécurisé mais peut ne pas être pris en charge par les anciens systèmes" + "defaultMessage": "RSA est largement répandu, ECDSA est plus rapide et plus sécurisé, mais peut ne pas être supporté par les systèmes plus anciens" }, "certificates.key-type-ecdsa": { "defaultMessage": "ECDSA 256" @@ -245,18 +245,6 @@ "certificates.request.title": { "defaultMessage": "Demander un nouveau certificat" }, - "certificates.key-type": { - "defaultMessage": "Type de clé" - }, - "certificates.key-type-description": { - "defaultMessage": "RSA est largement répandu, ECDSA est plus rapide et plus sécurisé, mais peut ne pas être supporté par les systèmes plus anciens" - }, - "certificates.key-type-ecdsa": { - "defaultMessage": "ECDSA 256" - }, - "certificates.key-type-rsa": { - "defaultMessage": "RSA 2048" - }, "column.access": { "defaultMessage": "Accès" }, diff --git a/frontend/src/pages/Nginx/ProxyHosts/TableWrapper.tsx b/frontend/src/pages/Nginx/ProxyHosts/TableWrapper.tsx index 68af43e10..5d6602e2d 100644 --- a/frontend/src/pages/Nginx/ProxyHosts/TableWrapper.tsx +++ b/frontend/src/pages/Nginx/ProxyHosts/TableWrapper.tsx @@ -99,14 +99,27 @@ export default function TableWrapper() { isFiltered={!!search} isFetching={isFetching} onEdit={(id: number) => showProxyHostModal(id)} - onDelete={(id: number) => + onDelete={(id: number) => { + const host = data?.find((h) => h.id === id); showDeleteConfirmModal({ title: , onConfirm: () => handleDelete(id), invalidations: [["proxy-hosts"], ["proxy-host", id]], - children: , - }) - } + children: ( + <> + + {host?.domainNames?.length ? ( +

{host.domainNames.join(", ")}
+ ) : null} + {host?.forwardHost ? ( +
+ ({host.forwardScheme}://{host.forwardHost}:{host.forwardPort}) +
+ ) : null} + + ), + }); + }} onDisableToggle={handleDisableToggle} onNew={() => showProxyHostModal("new")} /> diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 7895399f0..d5f803762 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -7,7 +7,7 @@ resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.4.tgz#2856c55443d3d461693f32d2b96fb6ea92e1ffa9" integrity sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.27.1", "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== @@ -281,44 +281,56 @@ resolved "https://registry.yarnpkg.com/@formatjs/cli-native-darwin-arm64/-/cli-native-darwin-arm64-1.1.0.tgz#c47df2ec7c1d27643900af77c474bd224b4587dc" integrity sha512-ygEpFpmRjbAKanWaeto/eUItyuK18667mdDzpDg3CTzc15WYzjZKnwJNFUuPFvFA4hiod1tnhXT1eiXmc1wWNg== +"@formatjs/cli-native-linux-arm64@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@formatjs/cli-native-linux-arm64/-/cli-native-linux-arm64-1.2.0.tgz#3ddcafb006351417e82785b809a1ab1fbbb2c577" + integrity sha512-G6YuIVD8D6hZjnsD/aYZQ2qMHSve7IadEiXgKiDfFQBbyrkjDAlt6LDSqq4qnuv3WJ7/jAOn/An6n/bGyt0rLg== + "@formatjs/cli-native-linux-x64@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@formatjs/cli-native-linux-x64/-/cli-native-linux-x64-1.1.0.tgz#1a3f01ea47f971a0dd0d7f49b98df237375862fa" integrity sha512-AxORf5LR14HvXU4ov9gnhLrNIS2DYKqKMkRkprUhuh+ljba1riF05msK8KzslEPYQoeYKc5A0OZp57poh4xz/g== -"@formatjs/cli@^6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-6.15.0.tgz#060fc613f3121f7a90b46ca41e9f23ac9e501155" - integrity sha512-U8kd1jf7JEEZRhEranEiCv+QWdD+Spz+GUQRuaLyACCDp1q1wWIxdNAR3UETwD3Q37CAajHeMYSVfVBzfGj79g== +"@formatjs/cli-native-win32-x64@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@formatjs/cli-native-win32-x64/-/cli-native-win32-x64-1.1.1.tgz#a911b22c8f5ccfe4aff5a00276ee4274f4b81079" + integrity sha512-2vYgm7dzAb7wA9KjOOJGxZiSShwBNK4dEmgiJ1lRpEIz6RKMZ6wBY4UVn03VdAv8djJ7r6RK4Xyd2ouGcbh9Bg== + +"@formatjs/cli@^6.16.3": + version "6.16.3" + resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-6.16.3.tgz#728a17c1deaf1fec0ace554b2c72695f18253231" + integrity sha512-AN6uZR1xnl3V215HHJiKiA+DvNMrO/XfQ7hOyq3gXfHJwKSgLLQFtSFxw9A1O0SaGC2E2Kwo4mqwS1ZCLGe/qw== optionalDependencies: "@formatjs/cli-native-darwin-arm64" "1.1.0" + "@formatjs/cli-native-linux-arm64" "1.2.0" "@formatjs/cli-native-linux-x64" "1.1.0" + "@formatjs/cli-native-win32-x64" "1.1.1" "@formatjs/fast-memoize@3.1.5": version "3.1.5" resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-3.1.5.tgz#bdfe0b884cdecc25100534086f36a0b30bd15b3b" integrity sha512-KLi3fan6WnCHmigd9pmEEN8Hid0v4wiFBW576M/d07KMWYecf1CvyMI3n34vCmHT4AoVqG2n702kiHbXjzZX2A== -"@formatjs/icu-messageformat-parser@3.5.8": - version "3.5.8" - resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-3.5.8.tgz#73719113084e045ac9ce42c0bcec19016e3a8214" - integrity sha512-uZLvzLFN7iV2l8cbDdROwgKGtdELeLI4bpnsuz1DnyscHDxn8TdDE0anHzcfjtWK66XYCllGLV3Mi3CYcEPg/g== +"@formatjs/icu-messageformat-parser@3.5.10": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-3.5.10.tgz#0ced2d6e8009eed57c6f0e7b4cc51dfea63b9bff" + integrity sha512-XeJihYLy1lCe19xfK1KWKG/betBOK2rB0luL8lSkjfvJj0zP+LTJvkC+RKd0jsFI8mWxN71LrarHSrEXE8xxOQ== dependencies: - "@formatjs/icu-skeleton-parser" "2.1.8" + "@formatjs/icu-skeleton-parser" "2.1.9" -"@formatjs/icu-skeleton-parser@2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-2.1.8.tgz#a84262d173d5141d411fc41d24437b68800561ef" - integrity sha512-iX5i0O15gPf69l1WqmLFYwn7wq53lauvytvWFnHamIfX/5Ta56gpFj6fdeHRcKTV58IhrKv8QOvWfTYZYm7f+g== +"@formatjs/icu-skeleton-parser@2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-2.1.9.tgz#746edae664b2ef148df1301845d1bb40000bbebb" + integrity sha512-rsxswgHMfU1zUgB2byc08fesf83wLGjFnzLCEtuf00mx2doiqc6pYrf67raI37XqdRcGUviQepk2UKGqpng74Q== -"@formatjs/intl@4.1.10": - version "4.1.10" - resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-4.1.10.tgz#960a75306264dd017f189c81919fd62bfc587368" - integrity sha512-Zv9FqRVdEFsHLsXGkcthyuXv4hlTLvbvTr4Fi16w+VCd7MSz2RtI18mXd4B44N7nuvF5be2+JGauU3QoJ2wELw== +"@formatjs/intl@4.1.12": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-4.1.12.tgz#a29521f9bba79df1690c430f3d2cee8817778674" + integrity sha512-r288ut+p+CUQZSg+0gAT+D0i6xgrnoxE0B4HTbPY2zei/AtYmFhlu87BKjgCf1CweH4pZIbr152JFjxO8jVb1A== dependencies: "@formatjs/fast-memoize" "3.1.5" - "@formatjs/icu-messageformat-parser" "3.5.8" - intl-messageformat "11.2.5" + "@formatjs/icu-messageformat-parser" "3.5.10" + intl-messageformat "11.2.7" "@jridgewell/gen-mapping@^0.3.12": version "0.3.13" @@ -360,10 +372,10 @@ dependencies: "@tybys/wasm-util" "^0.10.1" -"@oxc-project/types@=0.129.0": - version "0.129.0" - resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.129.0.tgz#8e6362388ce6092feafd14f3a73ae6407b1285d9" - integrity sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg== +"@oxc-project/types@=0.132.0": + version "0.132.0" + resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.132.0.tgz#d77243df4fe1a0a1e60e12ac6240fa898d2363ff" + integrity sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ== "@parcel/watcher-android-arm64@2.5.6": version "2.5.6" @@ -495,94 +507,89 @@ uncontrollable "^8.0.4" warning "^4.0.3" -"@rolldown/binding-android-arm64@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0.tgz#aefa7afdcabc1269b1933d50cad31013cb697143" - integrity sha512-TWMZnRLMe63C2Lhyicviu7ZHaU4kxa6PS3rofvc9GmcvptzNN11BcfQ4Sl7MwTOsisQoa2keB/EBdNCAnUo8vA== +"@rolldown/binding-android-arm64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.2.tgz#ebe1264e43ba5bb224c58c85e0ac238f87e5ad14" + integrity sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ== -"@rolldown/binding-darwin-arm64@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0.tgz#83e708d97f9f8f3791e79ef8c24d5fcc5e8f29df" - integrity sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew== +"@rolldown/binding-darwin-arm64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.2.tgz#f972fb71bc03840629bee923babbb7048d14a5d0" + integrity sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w== -"@rolldown/binding-darwin-x64@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0.tgz#4649bb4db634850f6de2b2f1ec37fc39a18adcf8" - integrity sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ== +"@rolldown/binding-darwin-x64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.2.tgz#da1c062c135e1e50067084be5ab8055cc1e05b29" + integrity sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA== -"@rolldown/binding-freebsd-x64@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0.tgz#2b0e50fdc926fa9680dca9d6acc4c3729b7df899" - integrity sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ== +"@rolldown/binding-freebsd-x64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.2.tgz#a4c8532072705ce597c0d75418513709b75b3f1d" + integrity sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA== -"@rolldown/binding-linux-arm-gnueabihf@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0.tgz#8fd160371f4c160a2fa52de8f9ede51fbd43fc5b" - integrity sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A== +"@rolldown/binding-linux-arm-gnueabihf@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.2.tgz#78f3bd274a1bab07356017d728b70289f04011c1" + integrity sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w== -"@rolldown/binding-linux-arm64-gnu@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0.tgz#9915488c96cb0fc49a70bd27c030def3cbbc8cbb" - integrity sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ== +"@rolldown/binding-linux-arm64-gnu@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.2.tgz#4dc530aed0b554762ffc1a5e4f016b8be495eea0" + integrity sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig== -"@rolldown/binding-linux-arm64-musl@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0.tgz#74bb160f2747404eed2f917bea01b0548c783848" - integrity sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA== +"@rolldown/binding-linux-arm64-musl@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.2.tgz#56043cdf4768ea3184bb08a3f45b24f183003877" + integrity sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw== -"@rolldown/binding-linux-ppc64-gnu@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0.tgz#fdc876160b6738ff34a7d719c4ea42edb38a70bc" - integrity sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg== +"@rolldown/binding-linux-ppc64-gnu@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.2.tgz#92eba998d5cd9e4cfc8b95407b4b80f46dacadf4" + integrity sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA== -"@rolldown/binding-linux-s390x-gnu@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0.tgz#39668ce16e8c2ac16308fdb7116ebd5b44acab65" - integrity sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA== +"@rolldown/binding-linux-s390x-gnu@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.2.tgz#50b0e95dc3c22af1ecd1669ad7e6030e6860819e" + integrity sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ== -"@rolldown/binding-linux-x64-gnu@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0.tgz#02a7e4a0fa3af90bf4e937ecd1f4c0dc07ab2397" - integrity sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA== +"@rolldown/binding-linux-x64-gnu@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.2.tgz#d9fd5af004a373a2d26a09ce8fb66bd0927cbc0b" + integrity sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ== -"@rolldown/binding-linux-x64-musl@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0.tgz#610a08a3055d21f287c550e16a5541501883f2b1" - integrity sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw== +"@rolldown/binding-linux-x64-musl@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.2.tgz#c0ad80adf4d4df430d0ec309e97924db85065c3c" + integrity sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw== -"@rolldown/binding-openharmony-arm64@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0.tgz#62e5da4d623b446a57c9f472b598fedaf5289a3d" - integrity sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig== +"@rolldown/binding-openharmony-arm64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.2.tgz#341fc254ef7759f865bb219beb5cea6f5c9a44f6" + integrity sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w== -"@rolldown/binding-wasm32-wasi@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0.tgz#57191a2986e7f43a920fc618da92f29b0b8123c9" - integrity sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg== +"@rolldown/binding-wasm32-wasi@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.2.tgz#65f9389f74168fd54e67b12d0630fb90348051f0" + integrity sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ== dependencies: "@emnapi/core" "1.10.0" "@emnapi/runtime" "1.10.0" "@napi-rs/wasm-runtime" "^1.1.4" -"@rolldown/binding-win32-arm64-msvc@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0.tgz#77faf1e28521411bd0be6f4e55f3c4c5f17cd619" - integrity sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow== +"@rolldown/binding-win32-arm64-msvc@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.2.tgz#17e80f3402308f12c76ff4172768d51715b522ac" + integrity sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A== -"@rolldown/binding-win32-x64-msvc@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0.tgz#980a8f9983b0bd3d35ee867ade85cb020eca27ba" - integrity sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg== +"@rolldown/binding-win32-x64-msvc@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.2.tgz#875cfa37f26d11692dbe28b8331499c97aa99d1f" + integrity sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ== -"@rolldown/pluginutils@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0.tgz#d660b953fd500d552fc17213f279e29037f08c2d" - integrity sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ== - -"@rolldown/pluginutils@1.0.0-rc.7": - version "1.0.0-rc.7" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz#0414869467f0e471a6515d4f506c85fde867e022" - integrity sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA== +"@rolldown/pluginutils@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz#e3fcee093fbb5ce765e1ad088ff4de2889f6f9be" + integrity sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw== "@standard-schema/spec@^1.1.0": version "1.1.0" @@ -616,29 +623,29 @@ resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-3.44.0.tgz#286b203aac98591e27360de03974762568bbb272" integrity sha512-Wn0AOZG9sg0L+bjfMqq4eNhC6pQjIrk94LvvWYNYkY8KH8wC3YILRzQlrnVJc4FUeMxH/AK97QsYCX35H3LndA== -"@tanstack/query-core@5.100.10": - version "5.100.10" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.100.10.tgz#aeb34d301fd4ff9762e67dfa018adc33b7a18be4" - integrity sha512-8UR0yJR+GiQ40m3lPhUr0xbfAupe6GSQiksSBSa9SM2NjezFyxXCIA69/lz8cSoNKZLrw1/PktIyQBJcVeMi3w== +"@tanstack/query-core@5.100.14": + version "5.100.14" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.100.14.tgz#6bf11c9a6a33dbbbba21f05d880b93930d80000c" + integrity sha512-5X41dGpxgeaHISCRW2oYwcSycZeULZzAunaudXT9ov1KOTj9xwt0CH6hbwqP1/z74ZWF7rYFnDpyYH07XFcZew== -"@tanstack/query-devtools@5.100.10": - version "5.100.10" - resolved "https://registry.yarnpkg.com/@tanstack/query-devtools/-/query-devtools-5.100.10.tgz#1972789fdc7c4cb9ec2062d51f25bc4dc655a27b" - integrity sha512-3DmJf25hDPus5IpVvp6ujXv6bKV2zPzI9vpbAmpJigsL/H6DPvPjmf7/Q9yVKEke//8fgeQ45abjgnLuyYxAiw== +"@tanstack/query-devtools@5.100.14": + version "5.100.14" + resolved "https://registry.yarnpkg.com/@tanstack/query-devtools/-/query-devtools-5.100.14.tgz#1555c8e1e4ea74db85dd2faaea2b7b50e135faf1" + integrity sha512-g96SmSSQecYTYcyuAMRXr895GplJv01UGt7qttQWPOUyZ5EGz5tbRc589bMc2m5BsPFD6O0PCEAHdbDYNP6UBw== -"@tanstack/react-query-devtools@^5.100.10": - version "5.100.10" - resolved "https://registry.yarnpkg.com/@tanstack/react-query-devtools/-/react-query-devtools-5.100.10.tgz#cca3479cc2c8b434637c31f8119fe6ff93e5832c" - integrity sha512-zes0+o9ef5rAZXJ9f/SeaLs2nufJaeVkZkl/Or9NGrWVF41kL9Od9ED9nCwtQlgiF2VGtrzhEw5AU/igAO+aAg== +"@tanstack/react-query-devtools@^5.100.14": + version "5.100.14" + resolved "https://registry.yarnpkg.com/@tanstack/react-query-devtools/-/react-query-devtools-5.100.14.tgz#0774021fdc0b417a86b67b196d5ffb9820cff10c" + integrity sha512-JkP5VDgKOw3t/QSA1OABRHEqx8BuNs5MfvZRooNqdvN57SzTuGq3fKR1a2IH5rqa5HDLUm+FOXUEnB9ueHiLzg== dependencies: - "@tanstack/query-devtools" "5.100.10" + "@tanstack/query-devtools" "5.100.14" -"@tanstack/react-query@^5.100.10": - version "5.100.10" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.100.10.tgz#3bf1844efd76f5f68f9f39da2917fc4c6023e726" - integrity sha512-FLaZf2RCrA/Zgp4aiu5tG3TyasTRO7aZ99skxQpr3Hg/zXOhu6yq5FZCYQ/tRaJtM9ylnoK8tFK7PolXQadv6Q== +"@tanstack/react-query@^5.100.14": + version "5.100.14" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.100.14.tgz#799fe305421fd84bf2f6df40930c859c945b42ab" + integrity sha512-oOr6aRdSFEwWhzxEkD/9ZcItM3+LjBSkeVmadWKwUssAHTsqd/7bOjWrX4AbvEkoEhgAxzN0Xk6H/aYzXiYBAw== dependencies: - "@tanstack/query-core" "5.100.10" + "@tanstack/query-core" "5.100.14" "@tanstack/react-table@^8.21.3": version "8.21.3" @@ -772,19 +779,12 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== -"@types/node@*", "@types/node@>=20.0.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.3.0.tgz#749b1bd4058e51b72e22bd41e9eab6ebd0180470" - integrity sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A== +"@types/node@*", "@types/node@>=20.0.0", "@types/node@^25.9.1": + version "25.9.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.1.tgz#3bda556db500ae4319c08e7fc9ab94f19013ba0b" + integrity sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg== dependencies: - undici-types "~7.18.0" - -"@types/node@^25.7.0": - version "25.7.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.7.0.tgz#7498f82e90dbdce7c34b75aaaa256c498a0ebe6c" - integrity sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg== - dependencies: - undici-types "~7.21.0" + undici-types ">=7.24.0 <7.24.7" "@types/parse-json@^4.0.0": version "4.0.2" @@ -818,10 +818,10 @@ resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044" integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== -"@types/react@*", "@types/react@>=16.9.11", "@types/react@^19.2.14": - version "19.2.14" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.14.tgz#39604929b5e3957e3a6fa0001dafb17c7af70bad" - integrity sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w== +"@types/react@*", "@types/react@>=16.9.11", "@types/react@^19.2.15": + version "19.2.15" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.15.tgz#9e2c6a4251a290f5c525c3143caa872fa6e01e0d" + integrity sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q== dependencies: csstype "^3.2.2" @@ -866,70 +866,70 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== -"@vitejs/plugin-react@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz#d9113b71a0a592714913eafd9e5e63bcafd0ff15" - integrity sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ== +"@vitejs/plugin-react@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz#f70cb8ed0ce225dbc3055d78070f820d8aa35eda" + integrity sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg== dependencies: - "@rolldown/pluginutils" "1.0.0-rc.7" + "@rolldown/pluginutils" "^1.0.0" -"@vitest/expect@4.1.6": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-4.1.6.tgz#b50c9390aae6957ab4d9e20722cebb17d5bf169a" - integrity sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg== +"@vitest/expect@4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-4.1.7.tgz#dc2918d51b54fa24ac5b4e7e802ef7440a11027f" + integrity sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w== dependencies: "@standard-schema/spec" "^1.1.0" "@types/chai" "^5.2.2" - "@vitest/spy" "4.1.6" - "@vitest/utils" "4.1.6" + "@vitest/spy" "4.1.7" + "@vitest/utils" "4.1.7" chai "^6.2.2" tinyrainbow "^3.1.0" -"@vitest/mocker@4.1.6": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-4.1.6.tgz#6b624045745236b02aca879a02aef68b72d9d4cd" - integrity sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ== +"@vitest/mocker@4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-4.1.7.tgz#05c5b42968b56057c40ea3e4546f3227cf1bf6fc" + integrity sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA== dependencies: - "@vitest/spy" "4.1.6" + "@vitest/spy" "4.1.7" estree-walker "^3.0.3" magic-string "^0.30.21" -"@vitest/pretty-format@4.1.6": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-4.1.6.tgz#24a1c03a6b68a8775f8ddfec51d3636315edc3f5" - integrity sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw== +"@vitest/pretty-format@4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-4.1.7.tgz#86b37ea96d4c5bd1357be66982e60a89a343c1bb" + integrity sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw== dependencies: tinyrainbow "^3.1.0" -"@vitest/runner@4.1.6": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-4.1.6.tgz#b6d189e68bd9927c4f111ad089ff96e4757591b1" - integrity sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA== +"@vitest/runner@4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-4.1.7.tgz#a7c465a76c0edc7deb1e8927dad452b71c5797b5" + integrity sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw== dependencies: - "@vitest/utils" "4.1.6" + "@vitest/utils" "4.1.7" pathe "^2.0.3" -"@vitest/snapshot@4.1.6": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-4.1.6.tgz#14fdfc8baf6b4b3e4e35763431dbea3aaa8aa0eb" - integrity sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw== +"@vitest/snapshot@4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-4.1.7.tgz#03ca7bed0cb3f2ce37de9feee7a159ba5d4893a4" + integrity sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw== dependencies: - "@vitest/pretty-format" "4.1.6" - "@vitest/utils" "4.1.6" + "@vitest/pretty-format" "4.1.7" + "@vitest/utils" "4.1.7" magic-string "^0.30.21" pathe "^2.0.3" -"@vitest/spy@4.1.6": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-4.1.6.tgz#0a316893630f47fa545e33026cfc91575070d165" - integrity sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg== +"@vitest/spy@4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-4.1.7.tgz#459de6b5f2c80cb589e612b2fa8170a33393dee9" + integrity sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q== -"@vitest/utils@4.1.6": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-4.1.6.tgz#3f4acf1f60e135ec1ce896f10baa4cd6466d0d38" - integrity sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ== +"@vitest/utils@4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-4.1.7.tgz#8d2350588f7054246f24d0dbadffbef5d3a5caff" + integrity sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw== dependencies: - "@vitest/pretty-format" "4.1.6" + "@vitest/pretty-format" "4.1.7" convert-source-map "^2.0.0" tinyrainbow "^3.1.0" @@ -1027,12 +1027,12 @@ character-reference-invalid@^2.0.0: resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== -chokidar@^4.0.0, chokidar@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" - integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== +chokidar@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-5.0.0.tgz#949c126a9238a80792be9a0265934f098af369a5" + integrity sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw== dependencies: - readdirp "^4.0.1" + readdirp "^5.0.0" classnames@^2.3.2, classnames@^2.5.1: version "2.5.1" @@ -1090,10 +1090,10 @@ csstype@^3.0.2, csstype@^3.2.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== -date-fns@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-4.1.0.tgz#64b3d83fff5aa80438f5b1a633c2e83b8a1c2d14" - integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg== +date-fns@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-4.3.0.tgz#95663b78f2be5ce664eb6606d94582acc39c77ba" + integrity sha512-OYcL+3N/jyWbYdFGqoMAhytDgxP9pbYPUUiRCOgn4Fewaadk9l/Wam4Avciiyp2BgkpfQyBV9B+ehnVJych+eQ== debug@^4.0.0, debug@^4.3.1: version "4.4.3" @@ -1448,13 +1448,13 @@ inline-style-parser@0.2.7: resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.7.tgz#b1fc68bfc0313b8685745e4464e37f9376b9c909" integrity sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA== -intl-messageformat@11.2.5: - version "11.2.5" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-11.2.5.tgz#08934613ab77b14730cf51c9454b0792853982bd" - integrity sha512-zaROHiUsnlSFXVypU54AsQuAm3DLmmSH8KfDhiUuG1XZ9NTQ4o3xlxIJYVNmeWAklyp3CWg0lhexNUnee8PsYQ== +intl-messageformat@11.2.7: + version "11.2.7" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-11.2.7.tgz#1d922a7df8964ec496c56f62928ef2134674bdae" + integrity sha512-+q6Ktg119nULZEpZ8YTuGOst9MyEzFtjD63FTGBlN1mLz0Z/MOUYDIvnpVKwq17eezIEh+cfJIebfJoCetpiNw== dependencies: "@formatjs/fast-memoize" "3.1.5" - "@formatjs/icu-messageformat-parser" "3.5.8" + "@formatjs/icu-messageformat-parser" "3.5.10" invariant@^2.2.4: version "2.2.4" @@ -1967,10 +1967,10 @@ ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@^3.3.11: - version "3.3.11" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" - integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== +nanoid@^3.3.12: + version "3.3.12" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.12.tgz#ab3d912e217a6d0a514f00a72a16543a28982c05" + integrity sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ== node-addon-api@^7.0.0: version "7.1.1" @@ -2077,12 +2077,12 @@ postcss-simple-vars@^7.0.1: resolved "https://registry.yarnpkg.com/postcss-simple-vars/-/postcss-simple-vars-7.0.1.tgz#836b3097a54dcd13dbd3c36a5dbdd512fad2954c" integrity sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A== -postcss@^8.5.14: - version "8.5.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.14.tgz#a66c2d7808fadf69ebb5b84a03f8bafd76c4919c" - integrity sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg== +postcss@^8.5.15: + version "8.5.15" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.15.tgz#d1eaf677a324e9ec02196da2d3fecf4a0b9a735c" + integrity sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A== dependencies: - nanoid "^3.3.11" + nanoid "^3.3.12" picocolors "^1.1.1" source-map-js "^1.2.1" @@ -2185,14 +2185,14 @@ react-fast-compare@^2.0.1: resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== -react-intl@^10.1.6: - version "10.1.6" - resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-10.1.6.tgz#febefb819581be56731b9d428d496c48e1d7c367" - integrity sha512-cXXRQ+M/uot4OYIerz2q752wfYUKnRYlm++eny9d2u1LBmRo54KZviPb+modE0WcYg8ZB4mfokIOCaFZkZlD0w== +react-intl@^10.1.9: + version "10.1.9" + resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-10.1.9.tgz#e256f0c28a049d391d421bf658e49fe137fb2cdf" + integrity sha512-FOWpTmwnZnAfz8JegRzyGnjUiuzLW3xJFjp/o8VR4HZAQ+Eg++YaeMhoUULLY+LMx7gZm3czaZEqcU4hntwerw== dependencies: - "@formatjs/icu-messageformat-parser" "3.5.8" - "@formatjs/intl" "4.1.10" - intl-messageformat "11.2.5" + "@formatjs/icu-messageformat-parser" "3.5.10" + "@formatjs/intl" "4.1.12" + intl-messageformat "11.2.7" react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0: version "16.13.1" @@ -2226,17 +2226,17 @@ react-markdown@^10.1.0: unist-util-visit "^5.0.0" vfile "^6.0.0" -react-router-dom@^7.15.0: - version "7.15.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.15.0.tgz#a4b95c4402d896c2ad437014aff9076b94673063" - integrity sha512-VcrVg64Fo8nwBvDscajG8gRTLIuTC6N50nb22l2HOOV4PTOHgoGp8mUjy9wLiHYoYTSYI36tUnXZgasSRFZorQ== +react-router-dom@^7.15.1: + version "7.15.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.15.1.tgz#cf5aee65a44e407a17a2e9718d5350482b1e281f" + integrity sha512-AzF62gjY6U9rkMq4RfP/r2EVtQ7DMfNMjyOp/flLTCrtRylLiK4wT4pSq6O8rOXZ2eXdZYJPEYe+ifomiv+Igg== dependencies: - react-router "7.15.0" + react-router "7.15.1" -react-router@7.15.0: - version "7.15.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.15.0.tgz#cb438ff254ab5a1e356ef5a23d7821d8f6fbe652" - integrity sha512-HW9vYwuM8f4yx66Izy8xfrzCM+SBJluoZcCbww9A1TySax11S5Vgw6fi3ZjMONw9J4gQwngL7PzkyIpJJpJ7RQ== +react-router@7.15.1: + version "7.15.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.15.1.tgz#0a12fece05887a47c54970480745385c793bcaac" + integrity sha512-R8rl9HhgikFYoPJymnUtPXWbnDb3oget6lQnfIoupbt61aT9aOhRkDsY2XRhZRyX1Z/8a5sL74fXmFNm3NRK5A== dependencies: cookie "^1.0.1" set-cookie-parser "^2.6.0" @@ -2278,10 +2278,10 @@ react@^19.2.6: resolved "https://registry.yarnpkg.com/react/-/react-19.2.6.tgz#3dadb8e12b2a7934c1d5317973e5dce1301f9a4d" integrity sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q== -readdirp@^4.0.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" - integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== +readdirp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-5.0.0.tgz#fbf1f71a727891d685bb1786f9ba74084f6e2f91" + integrity sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ== redent@^3.0.0: version "3.0.0" @@ -2381,29 +2381,29 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== -rolldown@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rolldown/-/rolldown-1.0.0.tgz#9baf1407c4117570f19f75f697c4a0216065d12e" - integrity sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA== +rolldown@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/rolldown/-/rolldown-1.0.2.tgz#ea2c786c5f063d08fd22b49e51997f15ec532bbd" + integrity sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g== dependencies: - "@oxc-project/types" "=0.129.0" - "@rolldown/pluginutils" "1.0.0" + "@oxc-project/types" "=0.132.0" + "@rolldown/pluginutils" "^1.0.0" optionalDependencies: - "@rolldown/binding-android-arm64" "1.0.0" - "@rolldown/binding-darwin-arm64" "1.0.0" - "@rolldown/binding-darwin-x64" "1.0.0" - "@rolldown/binding-freebsd-x64" "1.0.0" - "@rolldown/binding-linux-arm-gnueabihf" "1.0.0" - "@rolldown/binding-linux-arm64-gnu" "1.0.0" - "@rolldown/binding-linux-arm64-musl" "1.0.0" - "@rolldown/binding-linux-ppc64-gnu" "1.0.0" - "@rolldown/binding-linux-s390x-gnu" "1.0.0" - "@rolldown/binding-linux-x64-gnu" "1.0.0" - "@rolldown/binding-linux-x64-musl" "1.0.0" - "@rolldown/binding-openharmony-arm64" "1.0.0" - "@rolldown/binding-wasm32-wasi" "1.0.0" - "@rolldown/binding-win32-arm64-msvc" "1.0.0" - "@rolldown/binding-win32-x64-msvc" "1.0.0" + "@rolldown/binding-android-arm64" "1.0.2" + "@rolldown/binding-darwin-arm64" "1.0.2" + "@rolldown/binding-darwin-x64" "1.0.2" + "@rolldown/binding-freebsd-x64" "1.0.2" + "@rolldown/binding-linux-arm-gnueabihf" "1.0.2" + "@rolldown/binding-linux-arm64-gnu" "1.0.2" + "@rolldown/binding-linux-arm64-musl" "1.0.2" + "@rolldown/binding-linux-ppc64-gnu" "1.0.2" + "@rolldown/binding-linux-s390x-gnu" "1.0.2" + "@rolldown/binding-linux-x64-gnu" "1.0.2" + "@rolldown/binding-linux-x64-musl" "1.0.2" + "@rolldown/binding-openharmony-arm64" "1.0.2" + "@rolldown/binding-wasm32-wasi" "1.0.2" + "@rolldown/binding-win32-arm64-msvc" "1.0.2" + "@rolldown/binding-win32-x64-msvc" "1.0.2" rooks@^9.8.0: version "9.8.0" @@ -2422,12 +2422,12 @@ safe-buffer@^5.1.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -sass@^1.99.0: - version "1.99.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.99.0.tgz#ff9d1594da4886249dfaafabbeea2dea2dc74b26" - integrity sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q== +sass@^1.100.0: + version "1.100.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.100.0.tgz#b4cab1bed286fe22ac6c879c514f71cd36aa06c8" + integrity sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ== dependencies: - chokidar "^4.0.0" + chokidar "^5.0.0" immutable "^5.1.5" source-map-js ">=0.6.2 <2.0.0" optionalDependencies: @@ -2542,15 +2542,7 @@ tinyexec@^1.0.2: resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.0.2.tgz#bdd2737fe2ba40bd6f918ae26642f264b99ca251" integrity sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg== -tinyglobby@^0.2.15: - version "0.2.15" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" - integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== - dependencies: - fdir "^6.5.0" - picomatch "^4.0.3" - -tinyglobby@^0.2.16: +tinyglobby@^0.2.15, tinyglobby@^0.2.16: version "0.2.16" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.16.tgz#1c3b7eb953fce42b226bc5a1ee06428281aff3d6" integrity sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg== @@ -2563,10 +2555,10 @@ tinyrainbow@^3.1.0: resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-3.1.0.tgz#1d8a623893f95cf0a2ddb9e5d11150e191409421" integrity sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw== -tmp@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" - integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== +tmp@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.6.tgz#0dfac10fd09a9319288eb0e8f0ed524604e183b4" + integrity sha512-5sJPdPjfI5Kx+qbrDesxkglRBxW//g7hCsqspEjwkewGvBMGIKMOTKzLt1hFVJzyadba3lDUN20O9qhvbQUSTA== trim-lines@^3.0.0: version "3.0.1" @@ -2603,15 +2595,10 @@ uncontrollable@^8.0.4: resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-8.0.4.tgz#a0a8307f638795162fafd0550f4a1efa0f8c5eb6" integrity sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ== -undici-types@~7.18.0: - version "7.18.2" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9" - integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== - -undici-types@~7.21.0: - version "7.21.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.21.0.tgz#433f7dd1b5daa9ab4dacb721a5e11a8de51eadda" - integrity sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ== +"undici-types@>=7.24.0 <7.24.7": + version "7.24.6" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.24.6.tgz#61275b485d7fd4e9d269c7cf04ec2873c9cc0f91" + integrity sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg== unicorn-magic@^0.3.0: version "0.3.0" @@ -2712,46 +2699,44 @@ vfile@^6.0.0: "@types/unist" "^3.0.0" vfile-message "^4.0.0" -vite-plugin-checker@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/vite-plugin-checker/-/vite-plugin-checker-0.13.0.tgz#5593c19281a201546c81ee66c79e0c097ba5140a" - integrity sha512-14EkOZmfinVZNxRmg2uCNDwtqGc/33lU/UEJansHgu27+ad+r6mMBf1Xtnq57jGZWiO/xzwtiEKPYsganw7ZFQ== +vite-plugin-checker@^0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/vite-plugin-checker/-/vite-plugin-checker-0.14.1.tgz#0fe694c6d90905c9da7658772fadab4823d7b881" + integrity sha512-Mv8oQc9XYBYf+XkP/riqqQCt8lBP6Iad75PZPho1lHRrpxQI0BwX2gwE10enn4f6Hgc+PvR1F7N38KARcaJtzw== dependencies: - "@babel/code-frame" "^7.27.1" - chokidar "^4.0.3" + "@babel/code-frame" "^7.29.0" + chokidar "^5.0.0" npm-run-path "^6.0.0" picocolors "^1.1.1" picomatch "^4.0.4" proper-lockfile "^4.1.2" tiny-invariant "^1.3.3" - tinyglobby "^0.2.15" - vscode-uri "^3.1.0" -"vite@^6.0.0 || ^7.0.0 || ^8.0.0", vite@^8.0.12: - version "8.0.12" - resolved "https://registry.yarnpkg.com/vite/-/vite-8.0.12.tgz#105cce7bcb60733f9159842ec2a5a10aadf2da86" - integrity sha512-w2dDofOWv2QB09ZITZBsvKTVAlYvPR4IAmrY/v0ir9KvLs0xybR7i48wxhM1/oyBWO34wPns+bPGw5ZrZqDpZg== +"vite@^6.0.0 || ^7.0.0 || ^8.0.0", vite@^8.0.14: + version "8.0.14" + resolved "https://registry.yarnpkg.com/vite/-/vite-8.0.14.tgz#da5d8d1f63dbd106385cbe9c211acbc7a7a5b192" + integrity sha512-s4BJJ+5y1pYL6Otw51FHhVJQhPnuRinKig64g/1+EUNaJsd3gCKdD31IPFvswUgW9/60QT9oFHbZHbQK5imcxw== dependencies: lightningcss "^1.32.0" picomatch "^4.0.4" - postcss "^8.5.14" - rolldown "1.0.0" + postcss "^8.5.15" + rolldown "1.0.2" tinyglobby "^0.2.16" optionalDependencies: fsevents "~2.3.3" -vitest@^4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-4.1.6.tgz#754875c9a09c5a3e8ca7d07d440659d92c19787f" - integrity sha512-6lvjbS3p9b4CrdCmguzbh2/4uoXhGE2q71R4OX5sqF9R1bo9Xd6fGrMAfvp5wnCzlBnFVdCOp6onuTQVbo8iUQ== +vitest@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-4.1.7.tgz#5ae483c0a901081bbf1428e07dafe80c36e62e6c" + integrity sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA== dependencies: - "@vitest/expect" "4.1.6" - "@vitest/mocker" "4.1.6" - "@vitest/pretty-format" "4.1.6" - "@vitest/runner" "4.1.6" - "@vitest/snapshot" "4.1.6" - "@vitest/spy" "4.1.6" - "@vitest/utils" "4.1.6" + "@vitest/expect" "4.1.7" + "@vitest/mocker" "4.1.7" + "@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.0.0" expect-type "^1.3.0" magic-string "^0.30.21" @@ -2766,11 +2751,6 @@ vitest@^4.1.6: vite "^6.0.0 || ^7.0.0 || ^8.0.0" why-is-node-running "^2.3.0" -vscode-uri@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.1.0.tgz#dd09ec5a66a38b5c3fffc774015713496d14e09c" - integrity sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ== - warning@^4.0.0, warning@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" diff --git a/scripts/ci/fulltest-cypress b/scripts/ci/fulltest-cypress index 54fa0528d..8fb896967 100755 --- a/scripts/ci/fulltest-cypress +++ b/scripts/ci/fulltest-cypress @@ -52,7 +52,7 @@ jq --arg a "$PDNS_IP" '.servers[0].upstreams[1].upstream = $a' "$LOCAL_DNSROUTER docker compose up -d dnsrouter DNSROUTER_IP=$(get_container_ip "dnsrouter") -echo -e "${BLUE}❯ ${YELLOW}DNS Router IP is ${DNSROUTER_IP}" +echo -e "${BLUE}❯ ${YELLOW}DNS Router IP is ${DNSROUTER_IP}${RESET}" if [ "${DNSROUTER_IP:-}" = "" ]; then echo -e "${RED}❯ ERROR: DNS Router IP is not set${RESET}" @@ -76,7 +76,8 @@ bash "$DIR/../wait-healthy" "$(docker compose ps --all -q fullstack)" 120 # Run tests rm -rf "$DIR/../../test/results" -docker compose up --build cypress +docker compose build cypress +docker compose up cypress # Get results docker cp -L "$(docker compose ps --all -q cypress):/test/results" "$DIR/../../test/" @@ -88,4 +89,3 @@ if [ "$2" = "cleanup" ]; then fi echo -e "${BLUE}❯ ${GREEN}Fullstack cypress testing complete${RESET}" - diff --git a/test/cypress/Dockerfile b/test/cypress/Dockerfile index bd821085a..cf071bafd 100644 --- a/test/cypress/Dockerfile +++ b/test/cypress/Dockerfile @@ -1,4 +1,4 @@ -FROM cypress/included:15.11.0 +FROM cypress/included:15.15.0 # Disable Cypress CLI colors ENV FORCE_COLOR=0 diff --git a/test/cypress/config/ci.mjs b/test/cypress/config/ci.mjs index 2597c194c..ea203a89e 100644 --- a/test/cypress/config/ci.mjs +++ b/test/cypress/config/ci.mjs @@ -2,6 +2,7 @@ import { defineConfig } from 'cypress'; import pluginSetup from '../plugins/index.mjs'; export default defineConfig({ + allowCypressEnv: false, requestTimeout: 30000, defaultCommandTimeout: 20000, reporter: "cypress-multi-reporters", diff --git a/test/cypress/config/dev.mjs b/test/cypress/config/dev.mjs index f32d973c8..636c3095c 100644 --- a/test/cypress/config/dev.mjs +++ b/test/cypress/config/dev.mjs @@ -2,6 +2,7 @@ import { defineConfig } from 'cypress'; import pluginSetup from '../plugins/index.mjs'; export default defineConfig({ + allowCypressEnv: false, requestTimeout: 30000, defaultCommandTimeout: 20000, reporter: "cypress-multi-reporters", diff --git a/test/cypress/e2e/api/CertbotPlugins.cy.js b/test/cypress/e2e/api/CertbotPlugins.cy.js new file mode 100644 index 000000000..554f97b60 --- /dev/null +++ b/test/cypress/e2e/api/CertbotPlugins.cy.js @@ -0,0 +1,28 @@ +/// + +// Only tested once in the sqlite stack + +describe('CertbotPlugins', { tags: '@isolated' }, () => { + it('Should install all certbot plugins', () => { + cy.env(['stack']).then(({ stack }) => { + cy.log(`CertbotPlugins.cy.js - Running tests for stack: ${stack}`); + if (stack === 'sqlite') { + cy.task('backendApiGet', { + path: '/api/ci/certbot-plugins', + }).then((data) => { + expect(data).to.be.an('object'); + + // Install each plugin + for (const plugin of Object.keys(data)) { + cy.log(`Installing plugin: ${plugin}`); + cy.task('backendApiPost', { + path: `/api/ci/certbot-plugins/${plugin}`, + }).then((result) => { + expect(result).to.be.true; + }); + } + }); + } + }); + }); +}); diff --git a/test/cypress/e2e/api/Certificates.cy.js b/test/cypress/e2e/api/Certificates.cy.js index 00da38b22..25d1b8c41 100644 --- a/test/cypress/e2e/api/Certificates.cy.js +++ b/test/cypress/e2e/api/Certificates.cy.js @@ -4,7 +4,16 @@ describe('Certificates endpoints', () => { let token; let certID; + const certFile = 'test.example.com.pem'; + const keyFile = 'test.example.com-key.pem'; + before(() => { + cy.createCustomCerts({ + domain: 'test.example.com', + certFile, + keyFile, + }) + cy.resetUsers(); cy.getToken().then((tok) => { token = tok; @@ -16,8 +25,8 @@ describe('Certificates endpoints', () => { token: token, path: '/api/nginx/certificates/validate', files: { - certificate: 'test.example.com.pem', - certificate_key: 'test.example.com-key.pem', + certificate: certFile, + certificate_key: keyFile, }, }).then((data) => { cy.validateSwaggerSchema('post', 200, '/nginx/certificates/validate', data); @@ -45,8 +54,8 @@ describe('Certificates endpoints', () => { token: token, path: `/api/nginx/certificates/${certID}/upload`, files: { - certificate: 'test.example.com.pem', - certificate_key: 'test.example.com-key.pem', + certificate: certFile, + certificate_key: keyFile, }, }).then((data) => { cy.validateSwaggerSchema('post', 200, '/nginx/certificates/{certID}/upload', data); diff --git a/test/cypress/e2e/api/Ldap.cy.js b/test/cypress/e2e/api/Ldap.cy.js deleted file mode 100644 index 64e177303..000000000 --- a/test/cypress/e2e/api/Ldap.cy.js +++ /dev/null @@ -1,65 +0,0 @@ -/// - -describe('LDAP with Authentik', () => { - let _token; - if (Cypress.env('skipStackCheck') === 'true' || Cypress.env('stack') === 'postgres') { - - before(() => { - cy.resetUsers(); - cy.getToken().then((tok) => { - _token = tok; - - // cy.task('backendApiPut', { - // token: token, - // path: '/api/settings/ldap-auth', - // data: { - // value: { - // host: 'authentik-ldap:3389', - // base_dn: 'ou=users,DC=ldap,DC=goauthentik,DC=io', - // user_dn: 'cn={{USERNAME}},ou=users,DC=ldap,DC=goauthentik,DC=io', - // email_property: 'mail', - // name_property: 'sn', - // self_filter: '(&(cn={{USERNAME}})(ak-active=TRUE))', - // auto_create_user: true - // } - // } - // }).then((data) => { - // cy.validateSwaggerSchema('put', 200, '/settings/{name}', data); - // expect(data.result).to.have.property('id'); - // expect(data.result.id).to.be.greaterThan(0); - // }); - - // cy.task('backendApiPut', { - // token: token, - // path: '/api/settings/auth-methods', - // data: { - // value: [ - // 'local', - // 'ldap' - // ] - // } - // }).then((data) => { - // cy.validateSwaggerSchema('put', 200, '/settings/{name}', data); - // expect(data.result).to.have.property('id'); - // expect(data.result.id).to.be.greaterThan(0); - // }); - }); - }); - - it.skip('Should log in with LDAP', () => { - // cy.task('backendApiPost', { - // token: token, - // path: '/api/auth', - // data: { - // // Authentik LDAP creds: - // type: 'ldap', - // identity: 'cypress', - // secret: 'fqXBfUYqHvYqiwBHWW7f' - // } - // }).then((data) => { - // cy.validateSwaggerSchema('post', 200, '/auth', data); - // expect(data.result).to.have.property('token'); - // }); - }); - } -}); diff --git a/test/cypress/e2e/api/OAuth.cy.js b/test/cypress/e2e/api/OAuth.cy.js deleted file mode 100644 index c5c819f9b..000000000 --- a/test/cypress/e2e/api/OAuth.cy.js +++ /dev/null @@ -1,97 +0,0 @@ -/// - -describe('OAuth with Authentik', () => { - let _token; - if (Cypress.env('skipStackCheck') === 'true' || Cypress.env('stack') === 'postgres') { - - before(() => { - cy.getToken().then((tok) => { - _token = tok; - - // cy.task('backendApiPut', { - // token: token, - // path: '/api/settings/oauth-auth', - // data: { - // value: { - // client_id: '7iO2AvuUp9JxiSVkCcjiIbQn4mHmUMBj7yU8EjqU', - // client_secret: 'VUMZzaGTrmXJ8PLksyqzyZ6lrtz04VvejFhPMBP9hGZNCMrn2LLBanySs4ta7XGrDr05xexPyZT1XThaf4ubg00WqvHRVvlu4Naa1aMootNmSRx3VAk6RSslUJmGyHzq', - // authorization_url: 'http://authentik:9000/application/o/authorize/', - // resource_url: 'http://authentik:9000/application/o/userinfo/', - // token_url: 'http://authentik:9000/application/o/token/', - // logout_url: 'http://authentik:9000/application/o/npm/end-session/', - // identifier: 'preferred_username', - // scopes: [], - // auto_create_user: true - // } - // } - // }).then((data) => { - // cy.validateSwaggerSchema('put', 200, '/settings/{name}', data); - // expect(data.result).to.have.property('id'); - // expect(data.result.id).to.be.greaterThan(0); - // }); - - // cy.task('backendApiPut', { - // token: token, - // path: '/api/settings/auth-methods', - // data: { - // value: [ - // 'local', - // 'oauth' - // ] - // } - // }).then((data) => { - // cy.validateSwaggerSchema('put', 200, '/settings/{name}', data); - // expect(data.result).to.have.property('id'); - // expect(data.result.id).to.be.greaterThan(0); - // }); - }); - }); - - it.skip('Should log in with OAuth', () => { - // cy.task('backendApiGet', { - // path: '/oauth/login?redirect_base=' + encodeURI(Cypress.config('baseUrl')), - // }).then((data) => { - // expect(data).to.have.property('result'); - - // cy.origin('http://authentik:9000', {args: data.result}, (url) => { - // cy.visit(url); - // cy.get('ak-flow-executor') - // .shadow() - // .find('ak-stage-identification') - // .shadow() - // .find('input[name="uidField"]', { visible: true }) - // .type('cypress'); - - // cy.get('ak-flow-executor') - // .shadow() - // .find('ak-stage-identification') - // .shadow() - // .find('button[type="submit"]', { visible: true }) - // .click(); - - // cy.get('ak-flow-executor') - // .shadow() - // .find('ak-stage-password') - // .shadow() - // .find('input[name="password"]', { visible: true }) - // .type('fqXBfUYqHvYqiwBHWW7f'); - - // cy.get('ak-flow-executor') - // .shadow() - // .find('ak-stage-password') - // .shadow() - // .find('button[type="submit"]', { visible: true }) - // .click(); - // }) - - // // we should be logged in - // cy.get('#root p.chakra-text') - // .first() - // .should('have.text', 'Nginx Proxy Manager'); - - // // logout: - // cy.clearLocalStorage(); - // }); - }); - } -}); diff --git a/test/cypress/e2e/api/Streams.cy.js b/test/cypress/e2e/api/Streams.cy.js index 10809f894..95c6dba13 100644 --- a/test/cypress/e2e/api/Streams.cy.js +++ b/test/cypress/e2e/api/Streams.cy.js @@ -3,7 +3,16 @@ describe('Streams', () => { let token; + const certFile = 'website1.pem'; + const keyFile = 'website1.key.pem'; + before(() => { + cy.createCustomCerts({ + domain: 'website1.example.com', + certFile, + keyFile, + }) + cy.resetUsers(); cy.getToken().then((tok) => { token = tok; @@ -22,15 +31,6 @@ describe('Streams', () => { }); }); - // Create a custom cert pair - cy.exec('mkcert -cert-file=/test/cypress/fixtures/website1.pem -key-file=/test/cypress/fixtures/website1.key.pem website1.example.com').then((result) => { - expect(result.exitCode).to.eq(0); - // Install CA - cy.exec('mkcert -install').then((result) => { - expect(result.exitCode).to.eq(0); - }); - }); - cy.exec('rm -f /test/results/testssl.json'); }); @@ -134,8 +134,8 @@ describe('Streams', () => { token: token, path: `/api/nginx/certificates/${certID}/upload`, files: { - certificate: 'website1.pem', - certificate_key: 'website1.key.pem', + certificate: certFile, + certificate_key: keyFile, }, }).then((data) => { cy.validateSwaggerSchema('post', 200, '/nginx/certificates/{certID}/upload', data); diff --git a/test/cypress/fixtures/.gitignore b/test/cypress/fixtures/.gitignore new file mode 100644 index 000000000..cfaad7611 --- /dev/null +++ b/test/cypress/fixtures/.gitignore @@ -0,0 +1 @@ +*.pem diff --git a/test/cypress/fixtures/.gitkeep b/test/cypress/fixtures/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test/cypress/fixtures/test.example.com-key.pem b/test/cypress/fixtures/test.example.com-key.pem deleted file mode 100644 index 307cdc307..000000000 --- a/test/cypress/fixtures/test.example.com-key.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC1n9j9C5Bes1nd -qACDckERauxXVNKCnUlUM1buGBx1xc+j2e2Ar23wUJJuWBY18VfT8yqfqVDktO2w -rbmvZvLuPmXePOKbIKS+XXh+2NG9L5bDG9rwGFCRXnbQj+GWCdMfzx14+CR1IHge -Yz6Cv/Si2/LJPCh/CoBfM4hUQJON3lxAWrWBpdbZnKYMrxuPBRfW9OuzTbCVXToQ -oxRAHiOR9081Xn1WeoKr7kVBIa5UphlvWXa12w1YmUwJu7YndnJGIavLWeNCVc7Z -Eo+nS8Wr/4QWicatIWZXpVaEOPhRoeplQDxNWg5b/Q26rYoVd7PrCmRs7sVcH79X -zGONeH1PAgMBAAECggEAANb3Wtwl07pCjRrMvc7WbC0xYIn82yu8/g2qtjkYUJcU -ia5lQbYN7RGCS85Oc/tkq48xQEG5JQWNH8b918jDEMTrFab0aUEyYcru1q9L8PL6 -YHaNgZSrMrDcHcS8h0QOXNRJT5jeGkiHJaTR0irvB526tqF3knbK9yW22KTfycUe -a0Z9voKn5xRk1DCbHi/nk2EpT7xnjeQeLFaTIRXbS68omkr4YGhwWm5OizoyEGZu -W0Zum5BkQyMr6kor3wdxOTG97ske2rcyvvHi+ErnwL0xBv0qY0Dhe8DpuXpDezqw -o72yY8h31Fu84i7sAj24YuE5Df8DozItFXQpkgbQ6QKBgQDPrufhvIFm2S/MzBdW -H8JxY7CJlJPyxOvc1NIl9RczQGAQR90kx52cgIcuIGEG6/wJ/xnGfMmW40F0DnQ+ -N+oLgB9SFxeLkRb7s9Z/8N3uIN8JJFYcerEOiRQeN2BXEEWJ7bUThNtsVrAcKoUh -ELsDmnHW/3V+GKwhd0vpk842+wKBgQDf4PGLG9PTE5tlAoyHFodJRd2RhTJQkwsU -MDNjLJ+KecLv+Nl+QiJhoflG1ccqtSFlBSCG067CDQ5LV0xm3mLJ7pfJoMgjcq31 -qjEmX4Ls91GuVOPtbwst3yFKjsHaSoKB5fBvWRcKFpBUezM7Qcw2JP3+dQT+bQIq -cMTkRWDSvQKBgQDOdCQFDjxg/lR7NQOZ1PaZe61aBz5P3pxNqa7ClvMaOsuEQ7w9 -vMYcdtRq8TsjA2JImbSI0TIg8gb2FQxPcYwTJKl+FICOeIwtaSg5hTtJZpnxX5LO -utTaC0DZjNkTk5RdOdWA8tihyUdGqKoxJY2TVmwGe2rUEDjFB++J4inkEwKBgB6V -g0nmtkxanFrzOzFlMXwgEEHF+Xaqb9QFNa/xs6XeNnREAapO7JV75Cr6H2hFMFe1 -mJjyqCgYUoCWX3iaHtLJRnEkBtNY4kzyQB6m46LtsnnnXO/dwKA2oDyoPfFNRoDq -YatEd3JIXNU9s2T/+x7WdOBjKhh72dTkbPFmTPDdAoGAU6rlPBevqOFdObYxdPq8 -EQWu44xqky3Mf5sBpOwtu6rqCYuziLiN7K4sjN5GD5mb1cEU+oS92ZiNcUQ7MFXk -8yTYZ7U0VcXyAcpYreWwE8thmb0BohJBr+Mp3wLTx32x0HKdO6vpUa0d35LUTUmM -RrKmPK/msHKK/sVHiL+NFqo= ------END PRIVATE KEY----- diff --git a/test/cypress/fixtures/test.example.com.pem b/test/cypress/fixtures/test.example.com.pem deleted file mode 100644 index 16340cdfd..000000000 --- a/test/cypress/fixtures/test.example.com.pem +++ /dev/null @@ -1,26 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEYDCCAsigAwIBAgIRAPoSC0hvitb26ODMlsH6YbowDQYJKoZIhvcNAQELBQAw -gZExHjAcBgNVBAoTFW1rY2VydCBkZXZlbG9wbWVudCBDQTEzMDEGA1UECwwqamN1 -cm5vd0BKYW1pZXMtTGFwdG9wLmxvY2FsIChKYW1pZSBDdXJub3cpMTowOAYDVQQD -DDFta2NlcnQgamN1cm5vd0BKYW1pZXMtTGFwdG9wLmxvY2FsIChKYW1pZSBDdXJu -b3cpMB4XDTI0MTAwOTA3MjIxN1oXDTI3MDEwOTA3MjIxN1owXjEnMCUGA1UEChMe -bWtjZXJ0IGRldmVsb3BtZW50IGNlcnRpZmljYXRlMTMwMQYDVQQLDCpqY3Vybm93 -QEphbWllcy1MYXB0b3AubG9jYWwgKEphbWllIEN1cm5vdykwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQC1n9j9C5Bes1ndqACDckERauxXVNKCnUlUM1bu -GBx1xc+j2e2Ar23wUJJuWBY18VfT8yqfqVDktO2wrbmvZvLuPmXePOKbIKS+XXh+ -2NG9L5bDG9rwGFCRXnbQj+GWCdMfzx14+CR1IHgeYz6Cv/Si2/LJPCh/CoBfM4hU -QJON3lxAWrWBpdbZnKYMrxuPBRfW9OuzTbCVXToQoxRAHiOR9081Xn1WeoKr7kVB -Ia5UphlvWXa12w1YmUwJu7YndnJGIavLWeNCVc7ZEo+nS8Wr/4QWicatIWZXpVaE -OPhRoeplQDxNWg5b/Q26rYoVd7PrCmRs7sVcH79XzGONeH1PAgMBAAGjZTBjMA4G -A1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAfBgNVHSMEGDAWgBSB -/vfmBUd4W7CvyEMl7YpMVQs8vTAbBgNVHREEFDASghB0ZXN0LmV4YW1wbGUuY29t -MA0GCSqGSIb3DQEBCwUAA4IBgQASwON/jPAHzcARSenY0ZGY1m5OVTYoQ/JWH0oy -l8SyFCQFEXt7UHDD/eTtLT0vMyc190nP57P8lTnZGf7hSinZz1B1d6V4cmzxpk0s -VXZT+irL6bJVJoMBHRpllKAhGULIo33baTrWFKA0oBuWx4AevSWKcLW5j87kEawn -ATCuMQ1I3ifR1mSlB7X8fb+vF+571q0NGuB3a42j6rdtXJ6SmH4+9B4qO0sfHDNt -IImpLCH/tycDpcYrGSCn1QrekFG1bSEh+Bb9i8rqMDSDsYrTFPZTuOQ3EtjGni9u -m+rEP3OyJg+md8c+0LVP7/UU4QWWnw3/Wolo5kSCxE8vNTFqi4GhVbdLnUtcIdTV -XxuR6cKyW87Snj1a0nG76ZLclt/akxDhtzqeV60BO0p8pmiev8frp+E94wFNYCmp -1cr3CnMEGRaficLSDFC6EBENzlZW2BQT6OMIV+g0NBgSyQe39s2zcdEl5+SzDVuw -hp8bJUp/QN7pnOVCDbjTQ+HVMXw= ------END CERTIFICATE----- diff --git a/test/cypress/plugins/index.mjs b/test/cypress/plugins/index.mjs index 1058d6338..6a2ff9ffb 100644 --- a/test/cypress/plugins/index.mjs +++ b/test/cypress/plugins/index.mjs @@ -1,3 +1,4 @@ +import { plugin as cypressGrepPlugin } from "@cypress/grep/plugin"; import { SwaggerValidation } from "@jc21/cypress-swagger-validation"; import chalk from "chalk"; import backendTask from "./backendApi/task.mjs"; @@ -11,6 +12,8 @@ export default (on, config) => { ); } + cypressGrepPlugin(config); + // Plugin Events on("task", SwaggerValidation(config)); on("task", backendTask(config)); @@ -22,6 +25,11 @@ export default (on, config) => { return null; }, }); + on("task", { + getFixturesFolder() { + return config.fixturesFolder; + }, + }); return config; }; diff --git a/test/cypress/support/commands.mjs b/test/cypress/support/commands.mjs index 7d9224d09..03c5bf224 100644 --- a/test/cypress/support/commands.mjs +++ b/test/cypress/support/commands.mjs @@ -48,14 +48,16 @@ Cypress.Commands.add("validateSwaggerFile", (url, savePath) => { * @param {*} data The API response data to check against the swagger schema */ Cypress.Commands.add('validateSwaggerSchema', (method, code, path, data) => { - cy.task('validateSwaggerSchema', { - file: Cypress.env('swaggerBase'), - endpoint: path, - method: method, - statusCode: code, - responseSchema: data, - verbose: true - }).should('equal', null); + cy.env(['swaggerBase']).then(({ swaggerBase }) => { + cy.task('validateSwaggerSchema', { + file: swaggerBase, + endpoint: path, + method: method, + statusCode: code, + responseSchema: data, + verbose: true + }).should('equal', null); + }); }); Cypress.Commands.add('createInitialUser', (defaultUser) => { @@ -151,3 +153,32 @@ Cypress.Commands.add('waitForCertificateStatus', (token, certID, expected, timeo interval: 5000 }); }); + +// Creates CA files for testing, if they already exist they will be deleted +// and recreated with the same content. This is to ensure that the files exist +// for testing and are in a known state. +Cypress.Commands.add('createCustomCerts', ({domain, certFile, keyFile}) => { + domain = domain || 'website1.example.com'; + certFile = certFile || 'website1.pem'; + keyFile = keyFile || 'website1.key.pem'; + + return cy.task('getFixturesFolder').then((fixturesFolder) => { + const fullCertFile = `${fixturesFolder}/${certFile}`; + const fullKeyFile = `${fixturesFolder}/${keyFile}`; + const cmd = `mkcert -cert-file="${fullCertFile}" -key-file="${fullKeyFile}" "${domain}"`; + cy.log(`Creating custom certs with command: ${cmd}`); + return cy.exec(cmd).then((result) => { + cy.log(`mkcert output:\n${JSON.stringify(result)}`); + expect(result.exitCode).to.eq(0); + return cy.exec('mkcert -install').then((result2) => { + cy.log(`mkcert install output:\n${JSON.stringify(result2)}`); + expect(result2.exitCode).to.eq(0); + }).then(() => { + return cy.wrap({ + certFile: fullCertFile, + keyFile: fullKeyFile, + }); + }); + }); + }); +}); diff --git a/test/cypress/support/e2e.js b/test/cypress/support/e2e.js index 2d8a13a76..f8ef2a694 100644 --- a/test/cypress/support/e2e.js +++ b/test/cypress/support/e2e.js @@ -1,6 +1,10 @@ -import './commands.mjs'; +import "./commands.mjs"; -Cypress.on('uncaught:exception', (/*err, runnable*/) => { +import { register as registerCypressGrep } from "@cypress/grep"; + +registerCypressGrep(); + +Cypress.on("uncaught:exception", (/*err, runnable*/) => { // returning false here prevents Cypress from // failing the test return false; diff --git a/test/cypress/support/task.mjs b/test/cypress/support/task.mjs new file mode 100644 index 000000000..edc5015c6 --- /dev/null +++ b/test/cypress/support/task.mjs @@ -0,0 +1,100 @@ +import fs from "node:fs"; +import FormData from "form-data"; +import Client from "./client.mjs"; +import logger from "./logger.mjs"; + +export default (config) => { + logger("Client Ready using", config.baseUrl); + + return { + /** + * @param {object} options + * @param {string} options.path API path + * @param {string} [options.token] JWT + * @param {bool} [options.returnOnError] If true, will return instead of throwing errors + * @returns {string} + */ + backendApiGet: (options) => { + const api = new Client(config); + api.setToken(options.token); + return api.request("get", options.path, options.returnOnError || false); + }, + + /** + * @param {object} options + * @param {string} options.token JWT + * @param {string} options.path API path + * @param {object} options.data + * @param {bool} [options.returnOnError] If true, will return instead of throwing errors + * @returns {string} + */ + backendApiPost: (options) => { + const api = new Client(config); + api.setToken(options.token); + return api.request( + "post", + options.path, + options.returnOnError || false, + options.data, + ); + }, + + /** + * @param {object} options + * @param {string} options.token JWT + * @param {string} options.path API path + * @param {object} options.files + * @param {bool} [options.returnOnError] If true, will return instead of throwing errors + * @returns {string} + */ + backendApiPostFiles: (options) => { + const api = new Client(config); + api.setToken(options.token); + + const form = new FormData(); + for (const [key, value] of Object.entries(options.files)) { + form.append( + key, + fs.createReadStream(`${config.fixturesFolder}/${value}`), + ); + } + return api.postForm(options.path, form, options.returnOnError || false); + }, + + /** + * @param {object} options + * @param {string} options.token JWT + * @param {string} options.path API path + * @param {object} options.data + * @param {bool} [options.returnOnError] If true, will return instead of throwing errors + * @returns {string} + */ + backendApiPut: (options) => { + const api = new Client(config); + api.setToken(options.token); + return api.request( + "put", + options.path, + options.returnOnError || false, + options.data, + ); + }, + + /** + * @param {object} options + * @param {string} options.token JWT + * @param {string} options.path API path + * @param {bool} [options.returnOnError] If true, will return instead of throwing errors + * @returns {string} + */ + backendApiDelete: (options) => { + const api = new Client(config); + api.setToken(options.token); + return api.request( + "delete", + options.path, + options.returnOnError || false, + ); + }, + }; +}; diff --git a/test/package.json b/test/package.json index 555bb6c29..c1a79d9b8 100644 --- a/test/package.json +++ b/test/package.json @@ -4,6 +4,7 @@ "description": "", "main": "index.js", "dependencies": { + "@cypress/grep": "^6.0.0", "@jc21/cypress-swagger-validation": "^0.3.2", "@quobix/vacuum": "^0.26.4", "axios": "^1.16.0", diff --git a/test/yarn.lock b/test/yarn.lock index 57e4b4732..0f41aea86 100644 --- a/test/yarn.lock +++ b/test/yarn.lock @@ -43,6 +43,52 @@ ajv-draft-04 "^1.0.0" call-me-maybe "^1.0.2" +"@babel/helper-plugin-utils@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz#c0a0766f1a13617d8a17407d7ab8f9d486225ea4" + integrity sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw== + +"@babel/helper-string-parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz#7f0871d99824d23137d60f86fcf6130fd5a1b51f" + integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== + +"@babel/helper-validator-identifier@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#bd87084ced0c796ec46bda492de6e83d29e89fc2" + integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== + +"@babel/parser@^7.27.2": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.7.tgz#837b87387cbf5ec5530cb634b3c622f68edb9334" + integrity sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg== + dependencies: + "@babel/types" "^7.29.7" + +"@babel/plugin-syntax-jsx@^7.27.1": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz#622c16f9ad63782fe6e83dadc7e40330744b7f1e" + integrity sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/types@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.7.tgz#8005e31d82712ee7adaef6e23c63b71a62770a92" + integrity sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA== + dependencies: + "@babel/helper-string-parser" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + +"@cypress/grep@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@cypress/grep/-/grep-6.0.0.tgz#fcc5f42d0086464e2752c4d84ac563c3cd21eb77" + integrity sha512-n3PCeqt8OwmLFz310igbRUm3qDE5WJgM9LW+2ejdULfMu2Sudqg3UX8koC8/JU/+ZcJ5UbaQAap1Nbi0QvzXwA== + dependencies: + debug "^4.3.4" + find-test-names "^1.28.18" + globby "^11.0.4" + "@cypress/request@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@cypress/request/-/request-4.0.0.tgz#2bc3a10a7d50f338dc644dc5fd14a60107c6f3e2" @@ -95,10 +141,10 @@ debug "^4.3.1" minimatch "^10.2.4" -"@eslint/config-helpers@^0.5.5": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.5.5.tgz#ae16134e4792ac5fbdc533548a24ac1ea9f7f3ae" - integrity sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w== +"@eslint/config-helpers@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.6.0.tgz#ef9a36881d39dfd5dbeac22b0da997fabfb08b03" + integrity sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA== dependencies: "@eslint/core" "^1.2.1" @@ -185,15 +231,36 @@ resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@quobix/vacuum@^0.26.4": - version "0.26.4" - resolved "https://registry.yarnpkg.com/@quobix/vacuum/-/vacuum-0.26.4.tgz#b3b2af1cf14edffeb9e5fcdb02db8871d92c1b7c" - integrity sha512-jSfJJtN20ypOHHvN6tWPF1j0RkgjebVfHDuF+eiLV/Nt/QwQ1wJpEb4bVVJWh25cK4FiuoW7yNLSDwegQLqETA== + version "0.26.8" + resolved "https://registry.yarnpkg.com/@quobix/vacuum/-/vacuum-0.26.8.tgz#1a912c10655ab59c5af7179ff0cbe76609fb44de" + integrity sha512-iTF9MScMs+oqoE9QXQZxo6AfyZMg5YOtAL97oLuZ6/1TBRiq/+tRK2STtaVFxs5Vd05xHeO9hRdssUurzmkIpQ== dependencies: https-proxy-agent "^7.0.6" node-fetch "^3.3.2" @@ -214,13 +281,6 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/node@*": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.3.0.tgz#749b1bd4058e51b72e22bd41e9eab6ebd0180470" - integrity sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A== - dependencies: - undici-types "~7.18.0" - "@types/sinonjs__fake-timers@8.1.1": version "8.1.1" resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" @@ -236,23 +296,30 @@ resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.6.tgz#d785ee90c52d7cc020e249c948c36f7b32d1e217" integrity sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA== -"@types/yauzl@^2.9.1": - version "2.10.3" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" - integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== - dependencies: - "@types/node" "*" - acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.16.0: +acorn-walk@^8.2.0: + version "8.3.5" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.5.tgz#8a6b8ca8fc5b34685af15dabb44118663c296496" + integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.16.0: version "8.16.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + agent-base@^7.1.2: version "7.1.4" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" @@ -329,6 +396,11 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + asn1@~0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" @@ -362,12 +434,13 @@ aws4@^1.8.0: integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== axios@^1.16.0, axios@^1.7.7: - version "1.16.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.16.0.tgz#f8e5dd931cef2a5f8c32216d5784eda2f8750eb7" - integrity sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w== + version "1.16.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.16.1.tgz#517e29291d19d6e8cf919ff264f4fe157261ba12" + integrity sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A== dependencies: follow-redirects "^1.16.0" form-data "^4.0.5" + https-proxy-agent "^5.0.1" proxy-from-env "^2.1.0" balanced-match@^1.0.0: @@ -416,6 +489,13 @@ brace-expansion@^5.0.5: dependencies: balanced-match "^4.0.2" +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + browser-stdout@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -611,9 +691,9 @@ cypress-wait-until@^3.0.2: integrity sha512-iemies796dD5CgjG5kV0MnpEmKSH+s7O83ZoJLVzuVbZmm4lheMsZqAVT73hlMx4QlkwhxbyUzhOBUOZwoOe0w== cypress@^15.15.0: - version "15.15.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-15.15.0.tgz#5f9d9e8304636f7add7cb296130c0262960648bc" - integrity sha512-N8qBv3AUYn6xfIG73O5O58kTClUBSZ7a3C08IQFkSGTUdEauJ3BqwTFb/f9KPZgadftoZjllC0XSwD7xNNolbA== + version "15.16.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-15.16.0.tgz#482f77e6f85aee98b94a5ad844d36f69dc212c28" + integrity sha512-fy0M0c9xDLEp4v9y7LLKFeAQhIdDsobxDSKpD3JcZpqQefjy9TSzEyVV3HA0zu7hUi0bGHlSYlI7ASub8wgR9A== dependencies: "@cypress/request" "^4.0.0" "@cypress/xvfb" "^1.2.4" @@ -635,7 +715,6 @@ cypress@^15.15.0: eventemitter2 "6.4.7" execa "4.1.0" executable "^4.1.1" - extract-zip "2.0.1" fs-extra "^9.1.0" hasha "5.2.2" is-installed-globally "~0.4.0" @@ -654,7 +733,7 @@ cypress@^15.15.0: tree-kill "1.2.2" tslib "1.14.1" untildify "^4.0.0" - yauzl "^2.10.0" + yauzl "^3.3.1" dashdash@^1.12.0: version "1.14.1" @@ -673,7 +752,7 @@ dayjs@^1.10.4: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.19.tgz#15dc98e854bb43917f12021806af897c58ae2938" integrity sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw== -debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0: +debug@4, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -707,6 +786,13 @@ diff@^7.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" @@ -842,14 +928,14 @@ eslint-visitor-keys@^5.0.1: integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== eslint@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.3.0.tgz#ed5b810eb8e0191bf24bddcf9cdb45b974e0a16d" - integrity sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw== + version "10.4.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.4.0.tgz#d86b6c405de0f19f3318c47139b8cb6771b3f592" + integrity sha512-loXy6bWOoP3EP6JA7jo6p5jMpBJmHmsNZM5SFRHLdh1MGOPurMnNBj4ZlAbaqUAaQWbCr7jHV4P7gzAyryZWkQ== dependencies: "@eslint-community/eslint-utils" "^4.8.0" "@eslint-community/regexpp" "^4.12.2" "@eslint/config-array" "^0.23.5" - "@eslint/config-helpers" "^0.5.5" + "@eslint/config-helpers" "^0.6.0" "@eslint/core" "^1.2.1" "@eslint/plugin-kit" "^0.7.1" "@humanfs/node" "^0.16.6" @@ -957,17 +1043,6 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -extract-zip@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -983,6 +1058,17 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-glob@^3.2.9: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -998,12 +1084,17 @@ fast-uri@^3.0.1: resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.2.tgz#8af3d4fc9d3e71b11572cc2673b514a7d1a8c8ec" integrity sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ== -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== +fastq@^1.6.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" + integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== dependencies: - pend "~1.2.0" + reusify "^1.0.4" + +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== fetch-blob@^3.1.2, fetch-blob@^3.1.4: version "3.2.0" @@ -1020,6 +1111,25 @@ file-entry-cache@^8.0.0: dependencies: flat-cache "^4.0.0" +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-test-names@^1.28.18: + version "1.29.19" + resolved "https://registry.yarnpkg.com/find-test-names/-/find-test-names-1.29.19.tgz#365a18aefbc55f88ba5c96b01145c9b616b0d0d2" + integrity sha512-fSO2GXgOU6dH+FdffmRXYN/kLdnd8zkBGIZrKsmAdfLSFUUDLpDFF7+F/h+wjmjDWQmMgD8hPfJZR+igiEUQHQ== + dependencies: + "@babel/parser" "^7.27.2" + "@babel/plugin-syntax-jsx" "^7.27.1" + acorn-walk "^8.2.0" + debug "^4.3.3" + simple-bin-help "^1.8.0" + tinyglobby "^0.2.13" + find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -1131,7 +1241,7 @@ get-proto@^1.0.1: dunder-proto "^1.0.1" es-object-atoms "^1.0.0" -get-stream@^5.0.0, get-stream@^5.1.0: +get-stream@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -1145,6 +1255,13 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" @@ -1176,6 +1293,18 @@ globals@^17.6.0: resolved "https://registry.yarnpkg.com/globals/-/globals-17.6.0.tgz#0f0be018d5cca8690e6375ead1f65c4bb96191fc" integrity sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA== +globby@^11.0.4: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + gopd@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" @@ -1232,6 +1361,14 @@ http-signature@~1.4.0: jsprim "^2.0.2" sshpk "^1.18.0" +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + https-proxy-agent@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" @@ -1287,7 +1424,7 @@ is-fullwidth-code-point@^5.0.0, is-fullwidth-code-point@^5.1.0: dependencies: get-east-asian-width "^1.3.1" -is-glob@^4.0.0, is-glob@^4.0.3: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -1302,6 +1439,11 @@ is-installed-globally@~0.4.0: global-dirs "^3.0.0" is-path-inside "^3.0.2" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" @@ -1455,12 +1597,7 @@ lodash.once@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== -lodash@^4.17.21, lodash@^4.17.23: - version "4.17.23" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" - integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== - -lodash@^4.18.1: +lodash@^4.17.21, lodash@^4.17.23, lodash@^4.18.1: version "4.18.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== @@ -1508,6 +1645,19 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -1578,9 +1728,9 @@ mocha-junit-reporter@^2.2.1: xml "^1.0.1" mocha@^11.7.5: - version "11.7.5" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.5.tgz#58f5bbfa5e0211ce7e5ee6128107cefc2515a627" - integrity sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig== + version "11.7.6" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.6.tgz#ebbe22989d04cbb9424a36307320476624c41a33" + integrity sha512-nS9xOGbw2I3cjCpxwZAEJ9xK9lmJ08vEkQvLtz4du9ZrF9UrjRpeJGiIgl2Z+Qs++pmB4ecDe48Fwsh+j+j7xA== dependencies: browser-stdout "^1.3.1" chokidar "^4.0.1" @@ -1720,6 +1870,11 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -1735,6 +1890,16 @@ picocolors@^1.1.0, picocolors@^1.1.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== +picomatch@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== + +picomatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" + integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== + pify@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -1785,6 +1950,11 @@ qs@~6.14.1: dependencies: side-channel "^1.1.0" +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -1822,11 +1992,23 @@ restore-cursor@^5.0.0: onetime "^7.0.0" signal-exit "^4.1.0" +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + rfdc@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -1911,6 +2093,16 @@ signal-exit@^4.0.1, signal-exit@^4.1.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-bin-help@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/simple-bin-help/-/simple-bin-help-1.8.0.tgz#21bb82c6bccd9fa8678f9c0fadf2956b54e2160a" + integrity sha512-0LxHn+P1lF5r2WwVB/za3hLRIsYoLaNq1CXqjbrs3ZvLuvlWnRKrUjEWzV7umZL7hpQ7xULiQMV+0iXdRa5iFg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + slice-ansi@^7.1.0: version "7.1.2" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.2.tgz#adf7be70aa6d72162d907cd0e6d5c11f507b5403" @@ -2071,6 +2263,14 @@ throttleit@^1.0.0: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== +tinyglobby@^0.2.13: + version "0.2.16" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.16.tgz#1c3b7eb953fce42b226bc5a1ee06428281aff3d6" + integrity sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.4" + tldts-core@^6.1.86: version "6.1.86" resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.86.tgz#a93e6ed9d505cb54c542ce43feb14c73913265d8" @@ -2088,6 +2288,13 @@ tmp@~0.2.4: resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + tough-cookie@^5.0.0: version "5.1.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.1.2.tgz#66d774b4a1d9e12dc75089725af3ac75ec31bed7" @@ -2134,11 +2341,6 @@ underscore@1.13.6: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== -undici-types@~7.18.0: - version "7.18.2" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9" - integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== - universalify@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" @@ -2271,13 +2473,13 @@ yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== +yauzl@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-3.3.1.tgz#b0de68ae3a862715e130849679a4236f54dba45f" + integrity sha512-RNPCUkiE/ZgO4w8i9U5yDQVHaFDdnzaFANElRvpJteCspvmv2VqrRb9lvS6odVD+jqI/zDsxAHJVsafpcheVQQ== dependencies: buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" + pend "~1.2.0" yocto-queue@^0.1.0: version "0.1.0"