diff --git a/packages/server/package.json b/packages/server/package.json index f3af2cc..bd17875 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -30,6 +30,7 @@ "pino": "^10.3.1", "pino-roll": "^4.0.0", "ssh2-sftp-client": "^12.1.1", + "webdav": "^5.10.0", "yaml": "^2.9.0" } } diff --git a/packages/server/script-sandbox.js b/packages/server/script-sandbox.js index faa8d98..067ad02 100644 --- a/packages/server/script-sandbox.js +++ b/packages/server/script-sandbox.js @@ -26,6 +26,7 @@ const ALLOWED_MODULES = new Set([ "nodemailer", "rss-parser", "ssh2-sftp-client", + "webdav", ]); const BUILTIN_NAMES = [ diff --git a/packages/server/scripts/list-webdav.js b/packages/server/scripts/list-webdav.js new file mode 100644 index 0000000..0a895a3 --- /dev/null +++ b/packages/server/scripts/list-webdav.js @@ -0,0 +1,230 @@ +import { createClient } from "webdav"; + +function passContext(ctx) { + if (ctx?.context != null && typeof ctx.context === "object" && !Array.isArray(ctx.context)) { + return { ...ctx.context }; + } + return {}; +} + +function isPlainObject(value) { + return value != null && typeof value === "object" && !Array.isArray(value); +} + +function resolveUrl(ctx) { + const fromConfig = ctx.config?.url; + if (typeof fromConfig === "string" && fromConfig.length > 0) { + return fromConfig; + } + const fromData = ctx.data?.url; + if (typeof fromData === "string" && fromData.length > 0) { + return fromData; + } + return null; +} + +function resolvePath(ctx) { + const raw = ctx.config?.path ?? ctx.data?.path ?? "/"; + if (typeof raw !== "string" || raw.length === 0) { + throw new Error("list-webdav: path must be a non-empty string"); + } + return raw.startsWith("/") ? raw : `/${raw}`; +} + +function normalizeHeaders(value, label) { + if (value == null) return {}; + if (!isPlainObject(value)) { + throw new Error(`list-webdav: ${label} must be an object`); + } + + /** @type {Record} */ + const headers = {}; + for (const [key, val] of Object.entries(value)) { + if (val == null) continue; + if (typeof val === "string") { + headers[key] = val; + continue; + } + if (typeof val === "number" || typeof val === "boolean") { + headers[key] = String(val); + continue; + } + throw new Error(`list-webdav: header "${key}" must be a string`); + } + return headers; +} + +function toIsoDate(value) { + if (value == null || value === "") return null; + const date = new Date(value); + if (Number.isNaN(date.getTime())) return String(value); + return date.toISOString(); +} + +/** + * @param {Record} item + */ +function normalizeEntry(item) { + const type = item.type === "directory" ? "directory" : "file"; + return { + name: typeof item.basename === "string" ? item.basename : null, + path: typeof item.filename === "string" ? item.filename : null, + type, + size: type === "directory" ? null : typeof item.size === "number" ? item.size : null, + modified: toIsoDate(item.lastmod), + contentType: typeof item.mime === "string" ? item.mime : null, + etag: item.etag == null ? null : String(item.etag), + }; +} + +async function resolvePassword(ctx) { + if (typeof ctx.config?.passwordSecret === "string" && ctx.config.passwordSecret.length > 0) { + return $secrets.reveal(await $secrets.get(ctx.config.passwordSecret)); + } + if (typeof ctx.config?.password === "string") { + return ctx.config.password; + } + if (typeof ctx.data?.password === "string") { + return ctx.data.password; + } + return undefined; +} + +async function listWebdav(ctx) { + const url = resolveUrl(ctx); + if (!url) { + throw new Error("list-webdav: url is required (ctx.config.url or ctx.data.url)"); + } + + const remotePath = resolvePath(ctx); + const includeDirectories = ctx.config?.includeDirectories !== false; + const recursive = ctx.config?.recursive === true; + const glob = typeof ctx.config?.glob === "string" && ctx.config.glob.length > 0 + ? ctx.config.glob + : undefined; + + const username = + typeof ctx.config?.username === "string" && ctx.config.username.length > 0 + ? ctx.config.username + : typeof ctx.data?.username === "string" && ctx.data.username.length > 0 + ? ctx.data.username + : undefined; + const password = await resolvePassword(ctx); + const headers = { + ...normalizeHeaders(ctx.config?.headers, "config.headers"), + ...normalizeHeaders(ctx.data?.headers, "data.headers"), + }; + + /** @type {Record} */ + const clientOptions = {}; + if (username) clientOptions.username = username; + if (password) clientOptions.password = password; + if (Object.keys(headers).length > 0) clientOptions.headers = headers; + + /** @type {Record} */ + const listOptions = { deep: recursive }; + if (glob) listOptions.glob = glob; + + log.info( + { url, path: remotePath, recursive, includeDirectories, glob: glob ?? null }, + "list-webdav: listing directory", + ); + + const client = createClient(url, clientOptions); + const rawItems = await client.getDirectoryContents(remotePath, listOptions); + const items = Array.isArray(rawItems) ? rawItems : rawItems.data; + + let entries = items.map((item) => normalizeEntry(/** @type {Record} */ (item))); + if (!includeDirectories) { + entries = entries.filter((entry) => entry.type !== "directory"); + } + + const output = { entries, count: entries.length }; + log.info({ count: output.count, path: remotePath }, "list-webdav: listing complete"); + + return { output, context: { ...passContext(ctx), ...output } }; +} + +listWebdav.meta = { + description: "List files on a WebDAV server with names and file stats", + previewConfigKey: "url", + tags: ["WebDAV"], + config: { + url: { + type: "string", + required: true, + description: "WebDAV base URL (or pass data.url)", + }, + path: { + type: "string", + default: "/", + description: "Remote directory path to list", + }, + includeDirectories: { + type: "boolean", + default: true, + description: "Include directory entries in the result", + }, + recursive: { + type: "boolean", + default: false, + description: "List subdirectories recursively (maps to webdav deep option)", + }, + glob: { + type: "string", + required: false, + description: "Optional glob filter (e.g. /**/*.pdf); implies deep listing on the client", + }, + username: { + type: "string", + required: false, + description: "Basic auth username", + }, + passwordSecret: { + type: "string", + required: false, + description: "Named secret holding the WebDAV password", + }, + password: { + type: "string", + required: false, + description: "Plain password (prefer passwordSecret in production)", + }, + headers: { + type: "object", + required: false, + description: "Extra request headers", + }, + }, + input: { + url: { type: "string", required: false, description: "Fallback WebDAV URL" }, + path: { type: "string", required: false, description: "Fallback directory path" }, + username: { type: "string", required: false }, + password: { type: "string", required: false }, + headers: { type: "object", required: false }, + }, + output: { + entries: { + type: "array", + description: "Listed files and optionally directories with stats", + }, + count: { type: "number", description: "Number of entries returned" }, + }, + context: { + entries: { type: "array", description: "Same as output.entries" }, + count: { type: "number", description: "Same as output.count" }, + }, + example: { + data: {}, + config: { + url: "https://cloud.example.com/remote.php/dav/files/me/", + path: "/Documents", + includeDirectories: true, + recursive: false, + username: "me", + passwordSecret: "cloud_password", + }, + }, +}; + +export default listWebdav; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 98adc01..0ace2fb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,10 +16,10 @@ importers: dependencies: '@aws-sdk/client-s3': specifier: ^3.1111.0 - version: 3.1111.0 + version: 3.1113.0 '@aws-sdk/s3-request-presigner': specifier: ^3.1111.0 - version: 3.1111.0 + version: 3.1113.0 '@fastify/cookie': specifier: ^11.0.2 version: 11.1.2 @@ -74,6 +74,9 @@ importers: ssh2-sftp-client: specifier: ^12.1.1 version: 12.1.1 + webdav: + specifier: ^5.10.0 + version: 5.10.0 yaml: specifier: ^2.9.0 version: 2.9.0 @@ -148,8 +151,8 @@ packages: resolution: {integrity: sha512-VCpnmyHQ1IH49ni3LXnQj7DPr7rmcJmzYeiCkYdCcfgNtkvOj38cdcL9lapBWoItZWFACJPFJlymqC7/gem3Gw==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-s3@3.1111.0': - resolution: {integrity: sha512-VnLT6aSTN8tWl/NsXUysXNZor7wQBp9CRwufo7kt8cwGXvHLZ0S/cV1K9WFcREGboVYSo3NGQ3ZvU7LRidh2aQ==} + '@aws-sdk/client-s3@3.1113.0': + resolution: {integrity: sha512-NRqdtohoMRyWkEeeznfG1KPN08dclCbl+HFuLPB2v8qPcgoNmTFlLKl9ELiR6hsGXQ4Ur3qvRnoJVEk8ND74pg==} engines: {node: '>=20.0.0'} '@aws-sdk/core@3.977.8': @@ -196,8 +199,8 @@ packages: resolution: {integrity: sha512-bit+VpqWNyi3wHxFoTsTliNXimCSL2r2OeDTm7ZrG+YsTZ2D7ofDJ6r/t9PVBn80i6/v0X2h9Tgw6QP2MAKfPw==} engines: {node: '>=20.0.0'} - '@aws-sdk/s3-request-presigner@3.1111.0': - resolution: {integrity: sha512-ACp/VtDTw6AjFW5Q3M59uAMrBbAHeQS0UBIOIgUROO98Z3uhpiy37k9RmvxbXYVugmTcdNTy4DPVQtLG8sDy6g==} + '@aws-sdk/s3-request-presigner@3.1113.0': + resolution: {integrity: sha512-FdbHboJSscXRHnqOGRLN+MvtcYNlxw1+XWMKcKi72nBPxpSTGQA+/zmxEBTlkCvTdIPtl/g383nNY0RiKYPmWQ==} engines: {node: '>=20.0.0'} '@aws-sdk/signature-v4-multi-region@3.996.45': @@ -309,6 +312,9 @@ packages: '@braintree/sanitize-url@7.1.2': resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} + '@buttercup/fetch@0.2.1': + resolution: {integrity: sha512-sCgECOx8wiqY8NN1xN22BqqKzXYIG2AicNLlakOAI4f0WgyLVUbAigMf8CZhBtJxdudTcB1gD5lciqi44jwJvg==} + '@chevrotain/types@11.1.2': resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} @@ -575,6 +581,9 @@ packages: cpu: [x64] os: [linux] + '@nodable/entities@3.0.0': + resolution: {integrity: sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==} + '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} @@ -976,6 +985,9 @@ packages: ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + anynum@1.0.1: + resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + asn1.js@5.4.1: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} @@ -995,10 +1007,16 @@ packages: axios@1.19.0: resolution: {integrity: sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + base-64@1.0.0: + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + baseline-browser-mapping@2.11.14: resolution: {integrity: sha512-JyJ954WzuIR8/FFzX0o5krdSTrBAkcCSRfWSleRsIHSWV+cZe2FI1PKggVkFke1hBldRs+LRxUczzE9iPmgZww==} engines: {node: '>=6.0.0'} @@ -1028,6 +1046,9 @@ packages: bowser@2.14.1: resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + brace-expansion@2.1.4: + resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} + brace-expansion@5.0.9: resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} engines: {node: 20 || >=22} @@ -1044,6 +1065,9 @@ packages: resolution: {integrity: sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==} engines: {node: '>=10.0.0'} + byte-length@1.0.2: + resolution: {integrity: sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1051,6 +1075,9 @@ packages: caniuse-lite@1.0.30001809: resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==} + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + colorette@2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} @@ -1107,6 +1134,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} @@ -1273,6 +1303,10 @@ packages: daisyui@5.7.16: resolution: {integrity: sha512-V9CJxvrWIXTDuP/0tpijjWaKaKJNYo2IrULJfTWs3/DjW9rPqswk1n8NCLQRLrTutmlG2Ech7nkJDpCnF+6Dzw==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + date-fns@4.4.0: resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} @@ -1356,6 +1390,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + entities@8.0.0: resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} engines: {node: '>=20.19.0'} @@ -1417,6 +1455,13 @@ packages: fast-uri@4.1.2: resolution: {integrity: sha512-TyGmBcbDTZXcb2cj5MV89DrF42DKvb3y5DDUNh95iO+IMeAzMkVSxK1PZRrRIpc9yg8U2GhGdbofNa0LS/a4Bw==} + fast-xml-builder@1.3.1: + resolution: {integrity: sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==} + + fast-xml-parser@5.11.0: + resolution: {integrity: sha512-9IGxMqvqLOnqP+Egi1nqDHKv5k8aZ7r9n558enxcucmyVGEBNPAU+MOg/8jPIS7rO7sSq4gFm1/nHtiaubMruw==} + hasBin: true + fastfall@1.5.1: resolution: {integrity: sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==} engines: {node: '>=0.10.0'} @@ -1448,6 +1493,10 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + find-my-way@9.7.0: resolution: {integrity: sha512-f2JHn75x2JlwUwLenZypgczR7YWMb/uO9BvUXtus+JMgkbIkLADd38cI4EiV+OQqrGo1Zlq6V8wnqMJ8e62wUQ==} engines: {node: '>=20'} @@ -1469,6 +1518,10 @@ packages: resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1524,6 +1577,9 @@ packages: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} + hot-patcher@2.0.1: + resolution: {integrity: sha512-ECg1JFG0YzehicQaogenlcs2qg6WsXQsxtnbr1i696u5tLUjtJdQAh0u2g0Q5YV45f263Ta1GnUJsc8WIfJf4Q==} + http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -1557,10 +1613,16 @@ packages: resolution: {integrity: sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w==} engines: {node: '>= 10'} + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + is-core-module@2.16.2: resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} + is-unsafe@2.0.0: + resolution: {integrity: sha512-2LdV822R+wmI86unXA93WCFpL6g+av8ynWk0nrHyJqGop5VoocYsSLFgN8jrfalT6iGeLNM4KXuVSsULP53kEA==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1636,6 +1698,9 @@ packages: tedious: optional: true + layerr@3.0.0: + resolution: {integrity: sha512-tv754Ki2dXpPVApOrjTyRo4/QegVb9eVFq4mjqp4+NM5NaX7syQvN5BBNfV/ZpAHCEHV24XdUVrBAoka4jt3pA==} + layout-base@1.0.2: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} @@ -1745,6 +1810,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + mermaid@11.16.1: resolution: {integrity: sha512-TQsq6u22fAn3rek5VOubrhKPo1g5hwC3FXUN9hiyupTckcYiGuuKGkNQrKYwGJkXUxZdojwRG46gsSCFZMDp4g==} @@ -1768,6 +1836,10 @@ packages: resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} @@ -1796,6 +1868,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nested-property@4.0.0: + resolution: {integrity: sha512-yFehXNWRs4cM0+dz7QxCd06hTbWbSkV0ISsqBfkntU6TOY4Qm3Q88fRRLOddkGh2Qq6dZvnKVAahfhjcUvLnyA==} + node-addon-api@8.9.2: resolution: {integrity: sha512-VijLXbi3UACN69I0JVXJsX4tjACjNoQDgv2gTF6sx2wWEi8tkSg2eX8p5gSIFi8z2+DL3oHmY6OyKce38SDolg==} engines: {node: ^18 || ^20 || >= 21} @@ -1804,6 +1879,15 @@ packages: resolution: {integrity: sha512-Si/bzYiKRHOB8/a99T2+SDGN582ONDMSTlJr5oCkT6GtnqPjZ2s10eoQRYkW9ZHwjVxONL+W8Fb+qR0AHMQsdg==} engines: {node: '>=20'} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-html-parser@9.0.1: resolution: {integrity: sha512-QrdiYYm1NnLRXsMXThUgVcF/syWfWIgHFmy8hylWMGFbHFtnRuXLBxxGQvIm3xaIJMUDJ0ayOmT/FGJYT3pZIw==} @@ -1834,6 +1918,10 @@ packages: path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-expression-matcher@1.6.2: + resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==} + engines: {node: '>=14.0.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1841,6 +1929,9 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-posix@1.0.0: + resolution: {integrity: sha512-1gJ0WpNIiYcQydgg3Ed8KzvIqTsDpNwq+cjBCssvBtuTWjEqY1AW+i+OepiEMqDCzyro9B2sLAe4RBPajMYFiA==} + path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} @@ -1888,6 +1979,9 @@ packages: resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} engines: {node: '>=10'} + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -1945,6 +2039,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -2065,6 +2162,9 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strnum@2.4.2: + resolution: {integrity: sha512-rDG3Ah4TV0k1hWvLSzkZtMmLN9+eS+h3knq4MP6A42Y3Yh5qGNnOUs1jJkoSr8FG5dsL28c7KgkIBzSEykqtuw==} + stylis@4.4.0: resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} @@ -2126,6 +2226,13 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + url-join@5.0.0: + resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -2173,11 +2280,23 @@ packages: yaml: optional: true + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webdav@5.10.0: + resolution: {integrity: sha512-fVPuRLtcduVGvSO7Tn/6TQCzIvI/g6BO/+xPRctCvi/GytYpjn4czxWbh4HsArsdom9qz9BI63k9/v2HBUui1A==} + engines: {node: '>=14'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true + xml-naming@0.3.0: + resolution: {integrity: sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==} + engines: {node: '>=16.0.0'} + xml2js@0.5.0: resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} engines: {node: '>=4.0.0'} @@ -2213,7 +2332,7 @@ snapshots: '@smithy/types': 4.17.2 tslib: 2.8.1 - '@aws-sdk/client-s3@3.1111.0': + '@aws-sdk/client-s3@3.1113.0': dependencies: '@aws-sdk/checksums': 3.1000.28 '@aws-sdk/core': 3.977.8 @@ -2342,7 +2461,7 @@ snapshots: '@smithy/types': 4.17.2 tslib: 2.8.1 - '@aws-sdk/s3-request-presigner@3.1111.0': + '@aws-sdk/s3-request-presigner@3.1113.0': dependencies: '@aws-sdk/core': 3.977.8 '@aws-sdk/signature-v4-multi-region': 3.996.45 @@ -2495,6 +2614,10 @@ snapshots: '@braintree/sanitize-url@7.1.2': {} + '@buttercup/fetch@0.2.1': + optionalDependencies: + node-fetch: 3.3.2 + '@chevrotain/types@11.1.2': {} '@dnd-kit/accessibility@3.1.1(react@19.2.8)': @@ -2709,6 +2832,8 @@ snapshots: '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true + '@nodable/entities@3.0.0': {} + '@pinojs/redact@0.4.0': {} '@rolldown/pluginutils@1.0.0-rc.3': {} @@ -3083,6 +3208,8 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + anynum@1.0.1: {} + asn1.js@5.4.1: dependencies: bn.js: 4.12.5 @@ -3113,8 +3240,12 @@ snapshots: - debug - supports-color + balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base-64@1.0.0: {} + baseline-browser-mapping@2.11.14: {} basic-ftp@6.2.0: {} @@ -3135,6 +3266,10 @@ snapshots: bowser@2.14.1: {} + brace-expansion@2.1.4: + dependencies: + balanced-match: 1.0.2 + brace-expansion@5.0.9: dependencies: balanced-match: 4.0.4 @@ -3152,6 +3287,8 @@ snapshots: buildcheck@0.0.7: optional: true + byte-length@1.0.2: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -3159,6 +3296,8 @@ snapshots: caniuse-lite@1.0.30001809: {} + charenc@0.0.2: {} + colorette@2.0.19: {} combined-stream@1.0.8: @@ -3210,6 +3349,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crypt@0.0.2: {} + css-select@5.2.2: dependencies: boolbase: 1.0.0 @@ -3406,6 +3547,8 @@ snapshots: daisyui@5.7.16: {} + data-uri-to-buffer@4.0.1: {} + date-fns@4.4.0: {} dayjs@1.11.21: {} @@ -3477,6 +3620,8 @@ snapshots: entities@4.5.0: {} + entities@6.0.1: {} + entities@8.0.0: {} es-define-property@1.0.1: {} @@ -3559,6 +3704,20 @@ snapshots: fast-uri@4.1.2: {} + fast-xml-builder@1.3.1: + dependencies: + path-expression-matcher: 1.6.2 + xml-naming: 0.3.0 + + fast-xml-parser@5.11.0: + dependencies: + '@nodable/entities': 3.0.0 + fast-xml-builder: 1.3.1 + is-unsafe: 2.0.0 + path-expression-matcher: 1.6.2 + strnum: 2.4.2 + xml-naming: 0.3.0 + fastfall@1.5.1: dependencies: reusify: 1.1.0 @@ -3603,6 +3762,11 @@ snapshots: optionalDependencies: picomatch: 4.0.5 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + find-my-way@9.7.0: dependencies: fast-deep-equal: 3.1.3 @@ -3624,6 +3788,10 @@ snapshots: hasown: 2.0.4 mime-types: 2.1.35 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + fsevents@2.3.3: optional: true @@ -3678,6 +3846,8 @@ snapshots: dependencies: function-bind: 1.1.2 + hot-patcher@2.0.1: {} + http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -3709,10 +3879,14 @@ snapshots: ipaddr.js@2.5.0: {} + is-buffer@1.1.6: {} + is-core-module@2.16.2: dependencies: hasown: 2.0.4 + is-unsafe@2.0.0: {} + isexe@2.0.0: {} jackspeak@4.2.3: @@ -3762,6 +3936,8 @@ snapshots: transitivePeerDependencies: - supports-color + layerr@3.0.0: {} + layout-base@1.0.2: {} layout-base@2.0.1: {} @@ -3841,6 +4017,12 @@ snapshots: math-intrinsics@1.1.0: {} + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + mermaid@11.16.1: dependencies: '@braintree/sanitize-url': 7.1.2 @@ -3879,6 +4061,10 @@ snapshots: dependencies: brace-expansion: 5.0.9 + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.4 + minipass@7.1.3: {} mnemonist@0.40.4: @@ -3901,10 +4087,20 @@ snapshots: nanoid@3.3.18: {} + nested-property@4.0.0: {} + node-addon-api@8.9.2: {} node-cron@4.6.0: {} + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-html-parser@9.0.1: dependencies: css-select: 5.2.2 @@ -3928,10 +4124,14 @@ snapshots: path-data-parser@0.1.0: {} + path-expression-matcher@1.6.2: {} + path-key@3.1.1: {} path-parse@1.0.7: {} + path-posix@1.0.0: {} + path-scurry@2.0.2: dependencies: lru-cache: 11.5.2 @@ -3987,6 +4187,8 @@ snapshots: proxy-from-env@2.1.0: {} + querystringify@2.2.0: {} + quick-format-unescaped@4.0.4: {} react-dom@19.2.8(react@19.2.8): @@ -4032,6 +4234,8 @@ snapshots: require-from-string@2.0.2: {} + requires-port@1.0.0: {} + resolve-from@5.0.0: {} resolve@1.22.12: @@ -4164,6 +4368,10 @@ snapshots: dependencies: safe-buffer: 5.2.1 + strnum@2.4.2: + dependencies: + anynum: 1.0.1 + stylis@4.4.0: {} supports-preserve-symlinks-flag@1.0.0: {} @@ -4205,6 +4413,13 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + url-join@5.0.0: {} + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + util-deprecate@1.0.2: {} uuid@14.0.1: {} @@ -4223,10 +4438,31 @@ snapshots: lightningcss: 1.32.0 yaml: 2.9.0 + web-streams-polyfill@3.3.3: {} + + webdav@5.10.0: + dependencies: + '@buttercup/fetch': 0.2.1 + base-64: 1.0.0 + byte-length: 1.0.2 + entities: 6.0.1 + fast-xml-parser: 5.11.0 + hot-patcher: 2.0.1 + layerr: 3.0.0 + md5: 2.3.0 + minimatch: 9.0.9 + nested-property: 4.0.0 + node-fetch: 3.3.2 + path-posix: 1.0.0 + url-join: 5.0.0 + url-parse: 1.5.10 + which@2.0.2: dependencies: isexe: 2.0.0 + xml-naming@0.3.0: {} + xml2js@0.5.0: dependencies: sax: 1.6.1