diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6591aaf2..0f7eb4b9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,19 +13,19 @@ jobs: strategy: matrix: - node-version: [18, 20, 22, 24] + node-version: [18, 20, 22, 24, 26] environment: name: Production steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: Setup pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@v6 - name: Use test/build Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: ${{ matrix.node-version < 22 && 22 || matrix.node-version }} cache: 'pnpm' @@ -80,7 +80,7 @@ jobs: - name: Use runtime Node.js if: matrix.node-version < 22 - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: ${{ matrix.node-version }} @@ -96,18 +96,18 @@ jobs: - name: Test Digest over HTTP on runtime Node.js if: matrix.node-version < 22 - run: pnpm test:runtime:digest + run: node tests/digest-runtime.mjs bun-smoke-test: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: Setup pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@v6 - name: Use Node.js 22 - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: 22 cache: 'pnpm' @@ -157,13 +157,13 @@ jobs: deno-smoke-test: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: Setup pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@v6 - name: Use Node.js 22 - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: 22 cache: 'pnpm' @@ -243,9 +243,9 @@ jobs: digest-browser-test: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 with: node-version: 24 cache: 'pnpm' @@ -260,9 +260,9 @@ jobs: run: working-directory: docs steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 with: node-version: 22 cache: 'pnpm' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3c591db5..ce382246 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,16 +20,18 @@ jobs: name: Production steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: Setup pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@v6 - name: use node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: ${{ matrix.node-version }} registry-url: 'https://registry.npmjs.org' + # Publishing jobs must not restore a shared cache. + package-manager-cache: false - name: install dependencies run: pnpm i --frozen-lockfile @@ -72,10 +74,8 @@ jobs: pnpm exec playwright install --with-deps chromium pnpm test:browser:digest - # Publish to npm with provenance statements - # Requires NPM_TOKEN secret to be configured in repository secrets - # or in the Production environment secrets + # Publish through npm trusted publishing (OIDC, npm >= 11.5.1), which also + # attaches provenance. Requires a trusted publisher on npmjs.com that + # matches this repository, `release.yml`, and the Production environment. - name: publish package - run: npm publish --provenance - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: npm publish diff --git a/AGENTS.md b/AGENTS.md index 17ccca0e..c9b90772 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -85,8 +85,8 @@ Guidance for AI coding agents working in this repository. The architecture overv ## Tests And Credentials - Unit tests must not require real provider credentials. -- Integration tests load `.env` via `dotenv/config`; start from `.env.example` - when credentials are needed. +- Integration tests load `.env` via `process.loadEnvFile` in `vitest.config.ts`; + start from `.env.example` when credentials are needed. - Use existing `MOCK_FETCH` and `RECORD_NETWORK_REQUESTS` conventions when working with provider tests. Do not record or commit secrets. - If credentials are missing, state that integration verification was skipped diff --git a/CHANGELOG.md b/CHANGELOG.md index d0976768..818fde56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +## v2.5.0 + +##### bug fixes + +- treat the `filename` of `createCalendarObject` and `createVCard` as one path segment inside the collection: names such as `urn:uuid:….ics` no longer parse as URL schemes, and `?`, `#`, `\`, stray `%`, and whitespace are percent-encoded while existing percent-escapes are kept; names containing `/`, or equal to `.` or `..`, now throw instead of writing outside the collection +- resynchronize from an empty token when a server rejects an expired sync token (`DAV:valid-sync-token`) instead of failing the sync, and report local objects missing from an initial WebDAV sync as deleted +- match DAV hrefs that differ only in percent-encoding (such as `a@b.ics` and `a%40b.ics`), so object fetches no longer fail as incomplete and principal URLs with email addresses still match +- refresh OAuth access tokens a minute before they expire, and accept `expires_in` sent as a numeric string instead of refreshing on every request + +##### tooling + +- move development to pnpm 12, Vite 8 (via Vitest 5.0.4), and current patch releases of Biome, Rolldown, Knip, and Playwright; drop `dotenv` and the pinned build-tool overrides +- update GitHub Actions, add Node.js 26 to CI, and remove the unused npm token from the trusted-publishing release workflow +- type-check library sources without Node.js globals, so runtime-specific APIs cannot slip into shared code +- upgrade the documentation site to Astro 7 and Starlight 0.42 with pnpm 12 + ## v2.4.0 ##### features diff --git a/dist/package.json b/dist/package.json index b89804f1..39dceef9 100644 --- a/dist/package.json +++ b/dist/package.json @@ -1,6 +1,6 @@ { "name": "tsdav", - "version": "2.4.0", + "version": "2.5.0", "description": "WebDAV, CALDAV, and CARDDAV client for Nodejs and the Browser", "keywords": [ "dav", @@ -73,19 +73,18 @@ "xml-js": "1.6.11" }, "devDependencies": { - "@biomejs/biome": "2.5.12", + "@biomejs/biome": "2.5.15", "@types/debug": "4.1.13", - "@types/node": "26.4.1", - "@vitest/coverage-v8": "5.0.0", - "dotenv": "17.4.2", - "ical.js": "^2.2.1", - "knip": "^6.39.0", - "playwright": "1.63.0", - "rolldown": "1.2.7", + "@types/node": "26.6.5", + "@vitest/coverage-v8": "5.0.4", + "ical.js": "2.2.1", + "knip": "6.41.0", + "playwright": "1.64.0", + "rolldown": "1.2.14", "typescript": "7.0.2", - "vitest": "^5.0.0" + "vitest": "5.0.4" }, - "packageManager": "pnpm@10.34.4", + "packageManager": "pnpm@12.11.2", "engines": { "node": ">=18" } diff --git a/dist/tsdav.cjs b/dist/tsdav.cjs index 33ea3919..257870a9 100644 --- a/dist/tsdav.cjs +++ b/dist/tsdav.cjs @@ -267,6 +267,29 @@ const mergeDAVProps = (propStats) => { return props; }; //#endregion +//#region src/util/percentEncoding.ts +/** +* Encode every path segment the same way, so hrefs that differ only in +* percent-encoding (`a@b` and `a%40b`, `%2f` and `%2F`) compare equal. +* Only for comparisons: servers may expect the original form in requests. +*/ +const normalizePercentEncoding = (href) => { + let url; + try { + url = new URL(href); + } catch { + return href; + } + url.pathname = url.pathname.split("/").map((segment) => { + try { + return encodeURIComponent(decodeURIComponent(segment)); + } catch { + return segment; + } + }).join("/"); + return url.href; +}; +//#endregion //#region src/util/requestHelpers.ts var requestHelpers_exports = /* @__PURE__ */ __exportAll({ cleanupFalsy: () => cleanupFalsy, @@ -325,7 +348,7 @@ const urlContains = (urlA, urlB) => { const urlMatches = (urlA, urlB, baseUrl) => { if (!urlA || !urlB || !baseUrl) return urlEquals(urlA, urlB); try { - return urlEquals(new URL(urlA, baseUrl).href, new URL(urlB, baseUrl).href); + return urlEquals(normalizePercentEncoding(new URL(urlA, baseUrl).href), normalizePercentEncoding(new URL(urlB, baseUrl).href)); } catch { return urlEquals(urlA, urlB); } @@ -569,7 +592,7 @@ const deleteObject = async (params) => { const getDAVUrlKey = (url, baseUrl) => { let resolved; try { - resolved = new URL(url, ensureTrailingSlash(baseUrl)).href; + resolved = normalizePercentEncoding(new URL(url, ensureTrailingSlash(baseUrl)).href); } catch { resolved = url.trim(); } @@ -780,7 +803,7 @@ const smartCollectionSync = async (params) => { const syncMethod = method ?? (collection.reports?.includes("syncCollection") ? "webdav" : "basic"); debug$6(`smart collection sync with type ${account.accountType} and method ${syncMethod}`); if (syncMethod === "webdav") { - const result = await syncCollection({ + const requestSync = (syncToken) => syncCollection({ url: collection.url, props: { [`d:getetag`]: {}, @@ -788,12 +811,19 @@ const smartCollectionSync = async (params) => { [`d:displayname`]: {} }, syncLevel: 1, - syncToken: collection.syncToken, + syncToken, headers: excludeHeaders(headers, headersToExclude), headersToExclude, fetchOptions, fetch: fetchOverride }); + let syncToken = collection.syncToken; + let result = await requestSync(syncToken); + if (syncToken && result.length === 1 && result[0].status >= 400 && result[0].status < 500 && typeof result[0].raw === "string" && result[0].raw.includes("valid-sync-token")) { + debug$6("sync token rejected by server, starting a full sync"); + syncToken = void 0; + result = await requestSync(syncToken); + } const isObjectResponse = (r) => { return typeof r.href === "string" && getDAVUrlKey(r.href, collection.url) !== getDAVUrlKey(collection.url, collection.url) && !r.props?.resourcetype?.collection; }; @@ -832,7 +862,7 @@ const smartCollectionSync = async (params) => { url: resolveDAVHref(url, collection.url), etag: "" })); - const { created, updated, deleted, unchanged } = diffDAVObjects(localObjects, remoteObjects, collection.url, true, deletedObjects); + const { created, updated, deleted, unchanged } = diffDAVObjects(localObjects, remoteObjects, collection.url, Boolean(syncToken), deletedObjects); return { ...collection, objects: detailedResult ? { @@ -901,6 +931,21 @@ const smartCollectionSyncDetailed = async (params) => smartCollectionSync({ detailedResult: true }); //#endregion +//#region src/util/objectUrl.ts +/** +* Resolve a new object's URL from its collection URL and file name. +* +* The file name is one path segment, not a relative URL: `?`, `#`, `\`, a +* stray `%`, and whitespace or control characters are percent-encoded, and the +* `./` prefix keeps a name like `urn:uuid:1.ics` from parsing as a URL scheme. +* Valid percent-escapes are kept, so already-encoded names are not encoded twice. +*/ +const getObjectUrl = (collectionUrl, filename) => { + if (!filename || filename.includes("/") || /^(?:\.|%2e){1,2}$/i.test(filename)) throw new Error(`Invalid object filename "${filename}": expected a single path segment`); + const segment = filename.replace(/%(?![\da-f]{2})|[?#\\\x00-\x20\x7f]/gi, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase().padStart(2, "0")}`); + return new URL(`./${segment}`, ensureTrailingSlash(collectionUrl)).href; +}; +//#endregion //#region src/addressBook.ts var addressBook_exports = /* @__PURE__ */ __exportAll({ addressBookMultiGet: () => addressBookMultiGet, @@ -1055,7 +1100,7 @@ const fetchVCards = async (params) => { const createVCard = async (params) => { const { addressBook, vCardString, filename, headers, headersToExclude, fetchOptions = {}, fetch: fetchOverride } = params; return createObject({ - url: new URL(filename, ensureTrailingSlash(addressBook.url)).href, + url: getObjectUrl(addressBook.url, filename), data: vCardString, headers: excludeHeaders({ "content-type": "text/vcard; charset=utf-8", @@ -1375,7 +1420,7 @@ const fetchCalendarObjects = async (params) => { const createCalendarObject = async (params) => { const { calendar, iCalString, filename, headers, headersToExclude, fetchOptions = {}, fetch: fetchOverride } = params; return createObject({ - url: new URL(filename, ensureTrailingSlash(calendar.url)).href, + url: getObjectUrl(calendar.url, filename), data: iCalString, headers: excludeHeaders({ "content-type": "text/calendar; charset=utf-8", @@ -2196,6 +2241,16 @@ const createAccount = async (params) => { return newAccount; }; //#endregion +//#region src/util/tokenExpiry.ts +const EXPIRY_MARGIN_MS = 6e4; +/** Whether a token expiring at `expiration` (ms since epoch) can still be sent. */ +const isTokenUnexpired = (expiration) => Date.now() < expiration - EXPIRY_MARGIN_MS; +/** Expiration timestamp for an OAuth `expires_in`, which some providers send as a string. */ +const getTokenExpiration = (expiresIn) => { + const seconds = typeof expiresIn === "string" && expiresIn.trim() !== "" ? Number(expiresIn) : expiresIn; + return typeof seconds === "number" && Number.isFinite(seconds) && seconds > 0 ? Date.now() + seconds * 1e3 : void 0; +}; +//#endregion //#region src/util/authHelpers.ts var authHelpers_exports = /* @__PURE__ */ __exportAll({ defaultParam: () => defaultParam, @@ -2338,7 +2393,7 @@ const getOauthHeaders = async (credentials, fetchOptions, fetchOverride) => { debug$1("Fetching oauth headers"); let tokens = {}; let didRefresh = false; - if (credentials.accessToken && (credentials.expiration == null && !credentials.refreshToken || credentials.expiration != null && Date.now() < credentials.expiration)) tokens = { + if (credentials.accessToken && (credentials.expiration == null && !credentials.refreshToken || credentials.expiration != null && isTokenUnexpired(credentials.expiration))) tokens = { access_token: credentials.accessToken, refresh_token: credentials.refreshToken }; @@ -2349,7 +2404,7 @@ const getOauthHeaders = async (credentials, fetchOptions, fetchOverride) => { if (didRefresh) { if (tokens.access_token) credentials.accessToken = tokens.access_token; if (tokens.refresh_token) credentials.refreshToken = tokens.refresh_token; - if (tokens.access_token) credentials.expiration = typeof tokens.expires_in === "number" ? Date.now() + tokens.expires_in * 1e3 : void 0; + if (tokens.access_token) credentials.expiration = getTokenExpiration(tokens.expires_in); } debug$1("Oauth tokens obtained"); return { @@ -2472,7 +2527,7 @@ var DAVClient = class { } async authenticate(force = false, fetchOptions = this.fetchOptions, fetchOverride = this.fetchOverride) { if (!force && this.authMethod !== "Oauth") return; - if (!force && this.authHeaders && this.credentials.accessToken && (this.credentials.expiration == null || Date.now() < this.credentials.expiration)) { + if (!force && this.authHeaders && this.credentials.accessToken && (this.credentials.expiration == null || isTokenUnexpired(this.credentials.expiration))) { this.authHeaders = { authorization: `Bearer ${this.credentials.accessToken}` }; return; } diff --git a/dist/tsdav.cjs.js b/dist/tsdav.cjs.js index 33ea3919..257870a9 100644 --- a/dist/tsdav.cjs.js +++ b/dist/tsdav.cjs.js @@ -267,6 +267,29 @@ const mergeDAVProps = (propStats) => { return props; }; //#endregion +//#region src/util/percentEncoding.ts +/** +* Encode every path segment the same way, so hrefs that differ only in +* percent-encoding (`a@b` and `a%40b`, `%2f` and `%2F`) compare equal. +* Only for comparisons: servers may expect the original form in requests. +*/ +const normalizePercentEncoding = (href) => { + let url; + try { + url = new URL(href); + } catch { + return href; + } + url.pathname = url.pathname.split("/").map((segment) => { + try { + return encodeURIComponent(decodeURIComponent(segment)); + } catch { + return segment; + } + }).join("/"); + return url.href; +}; +//#endregion //#region src/util/requestHelpers.ts var requestHelpers_exports = /* @__PURE__ */ __exportAll({ cleanupFalsy: () => cleanupFalsy, @@ -325,7 +348,7 @@ const urlContains = (urlA, urlB) => { const urlMatches = (urlA, urlB, baseUrl) => { if (!urlA || !urlB || !baseUrl) return urlEquals(urlA, urlB); try { - return urlEquals(new URL(urlA, baseUrl).href, new URL(urlB, baseUrl).href); + return urlEquals(normalizePercentEncoding(new URL(urlA, baseUrl).href), normalizePercentEncoding(new URL(urlB, baseUrl).href)); } catch { return urlEquals(urlA, urlB); } @@ -569,7 +592,7 @@ const deleteObject = async (params) => { const getDAVUrlKey = (url, baseUrl) => { let resolved; try { - resolved = new URL(url, ensureTrailingSlash(baseUrl)).href; + resolved = normalizePercentEncoding(new URL(url, ensureTrailingSlash(baseUrl)).href); } catch { resolved = url.trim(); } @@ -780,7 +803,7 @@ const smartCollectionSync = async (params) => { const syncMethod = method ?? (collection.reports?.includes("syncCollection") ? "webdav" : "basic"); debug$6(`smart collection sync with type ${account.accountType} and method ${syncMethod}`); if (syncMethod === "webdav") { - const result = await syncCollection({ + const requestSync = (syncToken) => syncCollection({ url: collection.url, props: { [`d:getetag`]: {}, @@ -788,12 +811,19 @@ const smartCollectionSync = async (params) => { [`d:displayname`]: {} }, syncLevel: 1, - syncToken: collection.syncToken, + syncToken, headers: excludeHeaders(headers, headersToExclude), headersToExclude, fetchOptions, fetch: fetchOverride }); + let syncToken = collection.syncToken; + let result = await requestSync(syncToken); + if (syncToken && result.length === 1 && result[0].status >= 400 && result[0].status < 500 && typeof result[0].raw === "string" && result[0].raw.includes("valid-sync-token")) { + debug$6("sync token rejected by server, starting a full sync"); + syncToken = void 0; + result = await requestSync(syncToken); + } const isObjectResponse = (r) => { return typeof r.href === "string" && getDAVUrlKey(r.href, collection.url) !== getDAVUrlKey(collection.url, collection.url) && !r.props?.resourcetype?.collection; }; @@ -832,7 +862,7 @@ const smartCollectionSync = async (params) => { url: resolveDAVHref(url, collection.url), etag: "" })); - const { created, updated, deleted, unchanged } = diffDAVObjects(localObjects, remoteObjects, collection.url, true, deletedObjects); + const { created, updated, deleted, unchanged } = diffDAVObjects(localObjects, remoteObjects, collection.url, Boolean(syncToken), deletedObjects); return { ...collection, objects: detailedResult ? { @@ -901,6 +931,21 @@ const smartCollectionSyncDetailed = async (params) => smartCollectionSync({ detailedResult: true }); //#endregion +//#region src/util/objectUrl.ts +/** +* Resolve a new object's URL from its collection URL and file name. +* +* The file name is one path segment, not a relative URL: `?`, `#`, `\`, a +* stray `%`, and whitespace or control characters are percent-encoded, and the +* `./` prefix keeps a name like `urn:uuid:1.ics` from parsing as a URL scheme. +* Valid percent-escapes are kept, so already-encoded names are not encoded twice. +*/ +const getObjectUrl = (collectionUrl, filename) => { + if (!filename || filename.includes("/") || /^(?:\.|%2e){1,2}$/i.test(filename)) throw new Error(`Invalid object filename "${filename}": expected a single path segment`); + const segment = filename.replace(/%(?![\da-f]{2})|[?#\\\x00-\x20\x7f]/gi, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase().padStart(2, "0")}`); + return new URL(`./${segment}`, ensureTrailingSlash(collectionUrl)).href; +}; +//#endregion //#region src/addressBook.ts var addressBook_exports = /* @__PURE__ */ __exportAll({ addressBookMultiGet: () => addressBookMultiGet, @@ -1055,7 +1100,7 @@ const fetchVCards = async (params) => { const createVCard = async (params) => { const { addressBook, vCardString, filename, headers, headersToExclude, fetchOptions = {}, fetch: fetchOverride } = params; return createObject({ - url: new URL(filename, ensureTrailingSlash(addressBook.url)).href, + url: getObjectUrl(addressBook.url, filename), data: vCardString, headers: excludeHeaders({ "content-type": "text/vcard; charset=utf-8", @@ -1375,7 +1420,7 @@ const fetchCalendarObjects = async (params) => { const createCalendarObject = async (params) => { const { calendar, iCalString, filename, headers, headersToExclude, fetchOptions = {}, fetch: fetchOverride } = params; return createObject({ - url: new URL(filename, ensureTrailingSlash(calendar.url)).href, + url: getObjectUrl(calendar.url, filename), data: iCalString, headers: excludeHeaders({ "content-type": "text/calendar; charset=utf-8", @@ -2196,6 +2241,16 @@ const createAccount = async (params) => { return newAccount; }; //#endregion +//#region src/util/tokenExpiry.ts +const EXPIRY_MARGIN_MS = 6e4; +/** Whether a token expiring at `expiration` (ms since epoch) can still be sent. */ +const isTokenUnexpired = (expiration) => Date.now() < expiration - EXPIRY_MARGIN_MS; +/** Expiration timestamp for an OAuth `expires_in`, which some providers send as a string. */ +const getTokenExpiration = (expiresIn) => { + const seconds = typeof expiresIn === "string" && expiresIn.trim() !== "" ? Number(expiresIn) : expiresIn; + return typeof seconds === "number" && Number.isFinite(seconds) && seconds > 0 ? Date.now() + seconds * 1e3 : void 0; +}; +//#endregion //#region src/util/authHelpers.ts var authHelpers_exports = /* @__PURE__ */ __exportAll({ defaultParam: () => defaultParam, @@ -2338,7 +2393,7 @@ const getOauthHeaders = async (credentials, fetchOptions, fetchOverride) => { debug$1("Fetching oauth headers"); let tokens = {}; let didRefresh = false; - if (credentials.accessToken && (credentials.expiration == null && !credentials.refreshToken || credentials.expiration != null && Date.now() < credentials.expiration)) tokens = { + if (credentials.accessToken && (credentials.expiration == null && !credentials.refreshToken || credentials.expiration != null && isTokenUnexpired(credentials.expiration))) tokens = { access_token: credentials.accessToken, refresh_token: credentials.refreshToken }; @@ -2349,7 +2404,7 @@ const getOauthHeaders = async (credentials, fetchOptions, fetchOverride) => { if (didRefresh) { if (tokens.access_token) credentials.accessToken = tokens.access_token; if (tokens.refresh_token) credentials.refreshToken = tokens.refresh_token; - if (tokens.access_token) credentials.expiration = typeof tokens.expires_in === "number" ? Date.now() + tokens.expires_in * 1e3 : void 0; + if (tokens.access_token) credentials.expiration = getTokenExpiration(tokens.expires_in); } debug$1("Oauth tokens obtained"); return { @@ -2472,7 +2527,7 @@ var DAVClient = class { } async authenticate(force = false, fetchOptions = this.fetchOptions, fetchOverride = this.fetchOverride) { if (!force && this.authMethod !== "Oauth") return; - if (!force && this.authHeaders && this.credentials.accessToken && (this.credentials.expiration == null || Date.now() < this.credentials.expiration)) { + if (!force && this.authHeaders && this.credentials.accessToken && (this.credentials.expiration == null || isTokenUnexpired(this.credentials.expiration))) { this.authHeaders = { authorization: `Bearer ${this.credentials.accessToken}` }; return; } diff --git a/dist/tsdav.esm.js b/dist/tsdav.esm.js index 9c9558c3..a02fa51b 100644 --- a/dist/tsdav.esm.js +++ b/dist/tsdav.esm.js @@ -242,6 +242,29 @@ const mergeDAVProps = (propStats) => { return props; }; //#endregion +//#region src/util/percentEncoding.ts +/** +* Encode every path segment the same way, so hrefs that differ only in +* percent-encoding (`a@b` and `a%40b`, `%2f` and `%2F`) compare equal. +* Only for comparisons: servers may expect the original form in requests. +*/ +const normalizePercentEncoding = (href) => { + let url; + try { + url = new URL(href); + } catch { + return href; + } + url.pathname = url.pathname.split("/").map((segment) => { + try { + return encodeURIComponent(decodeURIComponent(segment)); + } catch { + return segment; + } + }).join("/"); + return url.href; +}; +//#endregion //#region src/util/requestHelpers.ts var requestHelpers_exports = /* @__PURE__ */ __exportAll({ cleanupFalsy: () => cleanupFalsy, @@ -300,7 +323,7 @@ const urlContains = (urlA, urlB) => { const urlMatches = (urlA, urlB, baseUrl) => { if (!urlA || !urlB || !baseUrl) return urlEquals(urlA, urlB); try { - return urlEquals(new URL(urlA, baseUrl).href, new URL(urlB, baseUrl).href); + return urlEquals(normalizePercentEncoding(new URL(urlA, baseUrl).href), normalizePercentEncoding(new URL(urlB, baseUrl).href)); } catch { return urlEquals(urlA, urlB); } @@ -544,7 +567,7 @@ const deleteObject = async (params) => { const getDAVUrlKey = (url, baseUrl) => { let resolved; try { - resolved = new URL(url, ensureTrailingSlash(baseUrl)).href; + resolved = normalizePercentEncoding(new URL(url, ensureTrailingSlash(baseUrl)).href); } catch { resolved = url.trim(); } @@ -755,7 +778,7 @@ const smartCollectionSync = async (params) => { const syncMethod = method ?? (collection.reports?.includes("syncCollection") ? "webdav" : "basic"); debug$5(`smart collection sync with type ${account.accountType} and method ${syncMethod}`); if (syncMethod === "webdav") { - const result = await syncCollection({ + const requestSync = (syncToken) => syncCollection({ url: collection.url, props: { [`d:getetag`]: {}, @@ -763,12 +786,19 @@ const smartCollectionSync = async (params) => { [`d:displayname`]: {} }, syncLevel: 1, - syncToken: collection.syncToken, + syncToken, headers: excludeHeaders(headers, headersToExclude), headersToExclude, fetchOptions, fetch: fetchOverride }); + let syncToken = collection.syncToken; + let result = await requestSync(syncToken); + if (syncToken && result.length === 1 && result[0].status >= 400 && result[0].status < 500 && typeof result[0].raw === "string" && result[0].raw.includes("valid-sync-token")) { + debug$5("sync token rejected by server, starting a full sync"); + syncToken = void 0; + result = await requestSync(syncToken); + } const isObjectResponse = (r) => { return typeof r.href === "string" && getDAVUrlKey(r.href, collection.url) !== getDAVUrlKey(collection.url, collection.url) && !r.props?.resourcetype?.collection; }; @@ -807,7 +837,7 @@ const smartCollectionSync = async (params) => { url: resolveDAVHref(url, collection.url), etag: "" })); - const { created, updated, deleted, unchanged } = diffDAVObjects(localObjects, remoteObjects, collection.url, true, deletedObjects); + const { created, updated, deleted, unchanged } = diffDAVObjects(localObjects, remoteObjects, collection.url, Boolean(syncToken), deletedObjects); return { ...collection, objects: detailedResult ? { @@ -876,6 +906,21 @@ const smartCollectionSyncDetailed = async (params) => smartCollectionSync({ detailedResult: true }); //#endregion +//#region src/util/objectUrl.ts +/** +* Resolve a new object's URL from its collection URL and file name. +* +* The file name is one path segment, not a relative URL: `?`, `#`, `\`, a +* stray `%`, and whitespace or control characters are percent-encoded, and the +* `./` prefix keeps a name like `urn:uuid:1.ics` from parsing as a URL scheme. +* Valid percent-escapes are kept, so already-encoded names are not encoded twice. +*/ +const getObjectUrl = (collectionUrl, filename) => { + if (!filename || filename.includes("/") || /^(?:\.|%2e){1,2}$/i.test(filename)) throw new Error(`Invalid object filename "${filename}": expected a single path segment`); + const segment = filename.replace(/%(?![\da-f]{2})|[?#\\\x00-\x20\x7f]/gi, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase().padStart(2, "0")}`); + return new URL(`./${segment}`, ensureTrailingSlash(collectionUrl)).href; +}; +//#endregion //#region src/addressBook.ts var addressBook_exports = /* @__PURE__ */ __exportAll({ addressBookMultiGet: () => addressBookMultiGet, @@ -1030,7 +1075,7 @@ const fetchVCards = async (params) => { const createVCard = async (params) => { const { addressBook, vCardString, filename, headers, headersToExclude, fetchOptions = {}, fetch: fetchOverride } = params; return createObject({ - url: new URL(filename, ensureTrailingSlash(addressBook.url)).href, + url: getObjectUrl(addressBook.url, filename), data: vCardString, headers: excludeHeaders({ "content-type": "text/vcard; charset=utf-8", @@ -1350,7 +1395,7 @@ const fetchCalendarObjects = async (params) => { const createCalendarObject = async (params) => { const { calendar, iCalString, filename, headers, headersToExclude, fetchOptions = {}, fetch: fetchOverride } = params; return createObject({ - url: new URL(filename, ensureTrailingSlash(calendar.url)).href, + url: getObjectUrl(calendar.url, filename), data: iCalString, headers: excludeHeaders({ "content-type": "text/calendar; charset=utf-8", @@ -2171,6 +2216,16 @@ const createAccount = async (params) => { return newAccount; }; //#endregion +//#region src/util/tokenExpiry.ts +const EXPIRY_MARGIN_MS = 6e4; +/** Whether a token expiring at `expiration` (ms since epoch) can still be sent. */ +const isTokenUnexpired = (expiration) => Date.now() < expiration - EXPIRY_MARGIN_MS; +/** Expiration timestamp for an OAuth `expires_in`, which some providers send as a string. */ +const getTokenExpiration = (expiresIn) => { + const seconds = typeof expiresIn === "string" && expiresIn.trim() !== "" ? Number(expiresIn) : expiresIn; + return typeof seconds === "number" && Number.isFinite(seconds) && seconds > 0 ? Date.now() + seconds * 1e3 : void 0; +}; +//#endregion //#region src/util/authHelpers.ts var authHelpers_exports = /* @__PURE__ */ __exportAll({ defaultParam: () => defaultParam, @@ -2313,7 +2368,7 @@ const getOauthHeaders = async (credentials, fetchOptions, fetchOverride) => { debug("Fetching oauth headers"); let tokens = {}; let didRefresh = false; - if (credentials.accessToken && (credentials.expiration == null && !credentials.refreshToken || credentials.expiration != null && Date.now() < credentials.expiration)) tokens = { + if (credentials.accessToken && (credentials.expiration == null && !credentials.refreshToken || credentials.expiration != null && isTokenUnexpired(credentials.expiration))) tokens = { access_token: credentials.accessToken, refresh_token: credentials.refreshToken }; @@ -2324,7 +2379,7 @@ const getOauthHeaders = async (credentials, fetchOptions, fetchOverride) => { if (didRefresh) { if (tokens.access_token) credentials.accessToken = tokens.access_token; if (tokens.refresh_token) credentials.refreshToken = tokens.refresh_token; - if (tokens.access_token) credentials.expiration = typeof tokens.expires_in === "number" ? Date.now() + tokens.expires_in * 1e3 : void 0; + if (tokens.access_token) credentials.expiration = getTokenExpiration(tokens.expires_in); } debug("Oauth tokens obtained"); return { @@ -2447,7 +2502,7 @@ var DAVClient = class { } async authenticate(force = false, fetchOptions = this.fetchOptions, fetchOverride = this.fetchOverride) { if (!force && this.authMethod !== "Oauth") return; - if (!force && this.authHeaders && this.credentials.accessToken && (this.credentials.expiration == null || Date.now() < this.credentials.expiration)) { + if (!force && this.authHeaders && this.credentials.accessToken && (this.credentials.expiration == null || isTokenUnexpired(this.credentials.expiration))) { this.authHeaders = { authorization: `Bearer ${this.credentials.accessToken}` }; return; } diff --git a/dist/tsdav.js b/dist/tsdav.js index c1fe5d2a..dcb38623 100644 --- a/dist/tsdav.js +++ b/dist/tsdav.js @@ -5,7 +5,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; -var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports); +var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod, mod.exports), cb = null), mod.exports); var __exportAll = (all, no_symbols) => { let target = {}; for (var name in all) __defProp(target, name, { @@ -584,7 +584,7 @@ let ICALObjects = /* @__PURE__ */ function(ICALObjects) { }({}); //#endregion //#region node_modules/.pnpm/sax@1.6.1/node_modules/sax/lib/sax.js -var require_sax = /* @__PURE__ */ __commonJSMin(((exports) => { +var require_sax = /* @__PURE__ */ __commonJSMin(((exports, module, this$1) => { (function(sax) { sax.parser = function(strict, opt) { return new SAXParser(strict, opt); @@ -1895,7 +1895,7 @@ var require_sax = /* @__PURE__ */ __commonJSMin(((exports) => { }); else String.fromCodePoint = fromCodePoint; })(); - })(typeof exports === "undefined" ? exports.sax = {} : exports); + })(typeof exports === "undefined" ? this$1.sax = {} : exports); })); //#endregion //#region node_modules/.pnpm/xml-js@1.6.11/node_modules/xml-js/lib/array-helper.js @@ -2668,6 +2668,29 @@ const mergeDAVProps = (propStats) => { return props; }; //#endregion +//#region src/util/percentEncoding.ts +/** +* Encode every path segment the same way, so hrefs that differ only in +* percent-encoding (`a@b` and `a%40b`, `%2f` and `%2F`) compare equal. +* Only for comparisons: servers may expect the original form in requests. +*/ +const normalizePercentEncoding = (href) => { + let url; + try { + url = new URL(href); + } catch { + return href; + } + url.pathname = url.pathname.split("/").map((segment) => { + try { + return encodeURIComponent(decodeURIComponent(segment)); + } catch { + return segment; + } + }).join("/"); + return url.href; +}; +//#endregion //#region src/util/requestHelpers.ts var requestHelpers_exports = /* @__PURE__ */ __exportAll({ cleanupFalsy: () => cleanupFalsy, @@ -2726,7 +2749,7 @@ const urlContains = (urlA, urlB) => { const urlMatches = (urlA, urlB, baseUrl) => { if (!urlA || !urlB || !baseUrl) return urlEquals(urlA, urlB); try { - return urlEquals(new URL(urlA, baseUrl).href, new URL(urlB, baseUrl).href); + return urlEquals(normalizePercentEncoding(new URL(urlA, baseUrl).href), normalizePercentEncoding(new URL(urlB, baseUrl).href)); } catch { return urlEquals(urlA, urlB); } @@ -2970,7 +2993,7 @@ const deleteObject = async (params) => { const getDAVUrlKey = (url, baseUrl) => { let resolved; try { - resolved = new URL(url, ensureTrailingSlash(baseUrl)).href; + resolved = normalizePercentEncoding(new URL(url, ensureTrailingSlash(baseUrl)).href); } catch { resolved = url.trim(); } @@ -3181,7 +3204,7 @@ const smartCollectionSync = async (params) => { const syncMethod = method ?? (collection.reports?.includes("syncCollection") ? "webdav" : "basic"); debug$5(`smart collection sync with type ${account.accountType} and method ${syncMethod}`); if (syncMethod === "webdav") { - const result = await syncCollection({ + const requestSync = (syncToken) => syncCollection({ url: collection.url, props: { [`d:getetag`]: {}, @@ -3189,12 +3212,19 @@ const smartCollectionSync = async (params) => { [`d:displayname`]: {} }, syncLevel: 1, - syncToken: collection.syncToken, + syncToken, headers: excludeHeaders(headers, headersToExclude), headersToExclude, fetchOptions, fetch: fetchOverride }); + let syncToken = collection.syncToken; + let result = await requestSync(syncToken); + if (syncToken && result.length === 1 && result[0].status >= 400 && result[0].status < 500 && typeof result[0].raw === "string" && result[0].raw.includes("valid-sync-token")) { + debug$5("sync token rejected by server, starting a full sync"); + syncToken = void 0; + result = await requestSync(syncToken); + } const isObjectResponse = (r) => { return typeof r.href === "string" && getDAVUrlKey(r.href, collection.url) !== getDAVUrlKey(collection.url, collection.url) && !r.props?.resourcetype?.collection; }; @@ -3233,7 +3263,7 @@ const smartCollectionSync = async (params) => { url: resolveDAVHref(url, collection.url), etag: "" })); - const { created, updated, deleted, unchanged } = diffDAVObjects(localObjects, remoteObjects, collection.url, true, deletedObjects); + const { created, updated, deleted, unchanged } = diffDAVObjects(localObjects, remoteObjects, collection.url, Boolean(syncToken), deletedObjects); return { ...collection, objects: detailedResult ? { @@ -3302,6 +3332,21 @@ const smartCollectionSyncDetailed = async (params) => smartCollectionSync({ detailedResult: true }); //#endregion +//#region src/util/objectUrl.ts +/** +* Resolve a new object's URL from its collection URL and file name. +* +* The file name is one path segment, not a relative URL: `?`, `#`, `\`, a +* stray `%`, and whitespace or control characters are percent-encoded, and the +* `./` prefix keeps a name like `urn:uuid:1.ics` from parsing as a URL scheme. +* Valid percent-escapes are kept, so already-encoded names are not encoded twice. +*/ +const getObjectUrl = (collectionUrl, filename) => { + if (!filename || filename.includes("/") || /^(?:\.|%2e){1,2}$/i.test(filename)) throw new Error(`Invalid object filename "${filename}": expected a single path segment`); + const segment = filename.replace(/%(?![\da-f]{2})|[?#\\\x00-\x20\x7f]/gi, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase().padStart(2, "0")}`); + return new URL(`./${segment}`, ensureTrailingSlash(collectionUrl)).href; +}; +//#endregion //#region src/addressBook.ts var addressBook_exports = /* @__PURE__ */ __exportAll({ addressBookMultiGet: () => addressBookMultiGet, @@ -3456,7 +3501,7 @@ const fetchVCards = async (params) => { const createVCard = async (params) => { const { addressBook, vCardString, filename, headers, headersToExclude, fetchOptions = {}, fetch: fetchOverride } = params; return createObject({ - url: new URL(filename, ensureTrailingSlash(addressBook.url)).href, + url: getObjectUrl(addressBook.url, filename), data: vCardString, headers: excludeHeaders({ "content-type": "text/vcard; charset=utf-8", @@ -3776,7 +3821,7 @@ const fetchCalendarObjects = async (params) => { const createCalendarObject = async (params) => { const { calendar, iCalString, filename, headers, headersToExclude, fetchOptions = {}, fetch: fetchOverride } = params; return createObject({ - url: new URL(filename, ensureTrailingSlash(calendar.url)).href, + url: getObjectUrl(calendar.url, filename), data: iCalString, headers: excludeHeaders({ "content-type": "text/calendar; charset=utf-8", @@ -4597,6 +4642,16 @@ const createAccount = async (params) => { return newAccount; }; //#endregion +//#region src/util/tokenExpiry.ts +const EXPIRY_MARGIN_MS = 6e4; +/** Whether a token expiring at `expiration` (ms since epoch) can still be sent. */ +const isTokenUnexpired = (expiration) => Date.now() < expiration - EXPIRY_MARGIN_MS; +/** Expiration timestamp for an OAuth `expires_in`, which some providers send as a string. */ +const getTokenExpiration = (expiresIn) => { + const seconds = typeof expiresIn === "string" && expiresIn.trim() !== "" ? Number(expiresIn) : expiresIn; + return typeof seconds === "number" && Number.isFinite(seconds) && seconds > 0 ? Date.now() + seconds * 1e3 : void 0; +}; +//#endregion //#region src/util/authHelpers.ts var authHelpers_exports = /* @__PURE__ */ __exportAll({ defaultParam: () => defaultParam, @@ -4739,7 +4794,7 @@ const getOauthHeaders = async (credentials, fetchOptions, fetchOverride) => { debug("Fetching oauth headers"); let tokens = {}; let didRefresh = false; - if (credentials.accessToken && (credentials.expiration == null && !credentials.refreshToken || credentials.expiration != null && Date.now() < credentials.expiration)) tokens = { + if (credentials.accessToken && (credentials.expiration == null && !credentials.refreshToken || credentials.expiration != null && isTokenUnexpired(credentials.expiration))) tokens = { access_token: credentials.accessToken, refresh_token: credentials.refreshToken }; @@ -4750,7 +4805,7 @@ const getOauthHeaders = async (credentials, fetchOptions, fetchOverride) => { if (didRefresh) { if (tokens.access_token) credentials.accessToken = tokens.access_token; if (tokens.refresh_token) credentials.refreshToken = tokens.refresh_token; - if (tokens.access_token) credentials.expiration = typeof tokens.expires_in === "number" ? Date.now() + tokens.expires_in * 1e3 : void 0; + if (tokens.access_token) credentials.expiration = getTokenExpiration(tokens.expires_in); } debug("Oauth tokens obtained"); return { @@ -4873,7 +4928,7 @@ var DAVClient = class { } async authenticate(force = false, fetchOptions = this.fetchOptions, fetchOverride = this.fetchOverride) { if (!force && this.authMethod !== "Oauth") return; - if (!force && this.authHeaders && this.credentials.accessToken && (this.credentials.expiration == null || Date.now() < this.credentials.expiration)) { + if (!force && this.authHeaders && this.credentials.accessToken && (this.credentials.expiration == null || isTokenUnexpired(this.credentials.expiration))) { this.authHeaders = { authorization: `Bearer ${this.credentials.accessToken}` }; return; } diff --git a/dist/tsdav.min.cjs b/dist/tsdav.min.cjs index c028ac19..1758a73e 100644 --- a/dist/tsdav.min.cjs +++ b/dist/tsdav.min.cjs @@ -1,7 +1,7 @@ -Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));let l=require("debug");l=c(l);let u=require("xml-js");u=c(u);let d=function(e){return e.CALENDAR_SERVER=`http://calendarserver.org/ns/`,e.CALDAV_APPLE=`http://apple.com/ns/ical/`,e.CALDAV=`urn:ietf:params:xml:ns:caldav`,e.CARDDAV=`urn:ietf:params:xml:ns:carddav`,e.DAV=`DAV:`,e}({});const f={"urn:ietf:params:xml:ns:caldav":`xmlns:c`,"urn:ietf:params:xml:ns:carddav":`xmlns:card`,"http://calendarserver.org/ns/":`xmlns:cs`,"http://apple.com/ns/ical/":`xmlns:ca`,"DAV:":`xmlns:d`};let p=function(e){return e.CALDAV=`c`,e.CARDDAV=`card`,e.CALENDAR_SERVER=`cs`,e.CALDAV_APPLE=`ca`,e.DAV=`d`,e}({}),m=function(e){return e.VEVENT=`VEVENT`,e.VTODO=`VTODO`,e.VJOURNAL=`VJOURNAL`,e.VFREEBUSY=`VFREEBUSY`,e.VTIMEZONE=`VTIMEZONE`,e.VALARM=`VALARM`,e}({});const h=typeof globalThis<`u`&&typeof globalThis.fetch==`function`?globalThis.fetch.bind(globalThis):(()=>{throw Error("tsdav: global fetch is not available in this runtime. Upgrade to Node.js >= 18, run under a browser/Bun/Deno, or install a fetch polyfill on globalThis before importing tsdav. You can also pass a custom `fetch` implementation to `createDAVClient`, `DAVClient`, or individual request helpers.")}),g=e=>e.replace(/[-_]+(\w?)/g,(e,t)=>t?t.toUpperCase():``);function _(e,t){if(!e)return!1;let n=e=>e!=null&&t.every(t=>e[t]);return Array.isArray(e)?e.length>0&&e.every(e=>n(e)):n(e)}const v=(e,t)=>!e||typeof e!=`object`?t.map(e=>e.toString()).join(`,`):t.reduce((t,n)=>e[n]?t:`${t.length?`${t},`:``}${n.toString()}`,``),y=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),b=new Set(Object.values(d)),x=new Map([...[`multistatus`,`response`,`propstat`,`prop`,`href`,`status`,`error`,`responsedescription`,`resourcetype`,`collection`,`getetag`,`displayname`,`syncToken`,`supportedReportSet`,`supportedReport`,`report`,`currentUserPrincipal`].map(e=>[e,`DAV:`]),...[`calendarData`,`calendar`,`calendarDescription`,`calendarTimezone`,`calendarHomeSet`,`calendarUserAddressSet`,`supportedCalendarComponentSet`,`comp`].map(e=>[e,`urn:ietf:params:xml:ns:caldav`]),...[`addressData`,`addressbook`,`addressbookHomeSet`].map(e=>[e,`urn:ietf:params:xml:ns:carddav`]),[`getctag`,`http://calendarserver.org/ns/`],[`calendarColor`,`http://apple.com/ns/ical/`]]),S=(e,t)=>{let n=g(e.replace(/^.*:/,``)),r=x.get(n);return t&&r&&t!==r?`{${t}}${n}`:n},ee=(e,t)=>{let n=Object.assign(Object.create(null),t),r=Object.create(null);for(let[t,i]of Object.entries(e.attributes??{}))(t===`xmlns`||t.startsWith(`xmlns:`))&&(n[t===`xmlns`?``:t.slice(6)]=String(i)),t!==`xmlns`&&(r[t]=i);let i=e.name??``,a=i.indexOf(`:`),o=n[a===-1?``:i.slice(0,a)]??``,s=e.elements??[],c=s.filter(e=>e.type===`element`),l=s.filter(e=>e.type===`text`||e.type===`cdata`).map(e=>String(e.text??e.cdata??``)).join(``),u={},d=Object.create(null);if(Object.keys(r).length&&(u._attributes=r),!c.length){let e=s.some(e=>e.type===`text`),t=s.some(e=>e.type===`cdata`);return e?{value:l,namespace:o,namespaces:d}:(t&&(u._cdata=l),{value:u,namespace:o,namespaces:d})}l.trim()&&(u._text=l);for(let e of c){let t=ee(e,n),r=g((e.name??``).replace(/^.*:/,``)),i=S(e.name??``,t.namespace),a=d[i];if(y(u,i)&&a!==t.namespace){if(b.has(t.namespace)&&!b.has(a)){let e=`{${a}}${r}`;Object.defineProperty(u,e,{value:u[i],enumerable:!0,configurable:!0,writable:!0}),d[e]=a,delete u[i]}else i=`{${t.namespace}}${r}`}y(u,i)?Array.isArray(u[i])?u[i].push(t.value):u[i]=[u[i],t.value]:Object.defineProperty(u,i,{value:t.value,enumerable:!0,configurable:!0,writable:!0}),d[i]=t.namespace,r===`prop`&&t.namespace===`DAV:`&&(u.propNamespaces=t.namespaces)}return{value:u,namespace:o,namespaces:d}},te=e=>{let t=u.default.xml2js(e,{compact:!1,ignoreDeclaration:!0}),n={};for(let e of t.elements??[]){if(e.type!==`element`)continue;let t=ee(e,{}),r=S(e.name??``,t.namespace);Object.defineProperty(n,r,{value:t.value,enumerable:!0})}return n},ne=e=>{let t=new Map;for(let n of e)if(n.ok)for(let[e,r]of Object.entries(n.props)){let i=t.get(e)??new Map;i.set(n.namespaces?.[e]??``,r),t.set(e,i)}let n={};for(let[e,r]of t){let t=[...r.keys()].find(e=>b.has(e))??r.keys().next().value;for(let[i,a]of r)Object.defineProperty(n,i===t?e:`{${i}}${e}`,{value:a,enumerable:!0,configurable:!0,writable:!0})}return n};var re=o({cleanupFalsy:()=>D,conditionalParam:()=>oe,ensureTrailingSlash:()=>C,excludeHeaders:()=>O,getDAVAttribute:()=>E,mergeHeaders:()=>k,urlContains:()=>ae,urlEquals:()=>w,urlMatches:()=>T});const ie=e=>{let t=e.trim();return t.endsWith(`/`)?t.slice(0,-1):t},C=e=>{let t=e.trim(),n=t.search(/[?#]/),r=n===-1?t:t.slice(0,n),i=n===-1?``:t.slice(n);return`${r.endsWith(`/`)?r:`${r}/`}${i}`},w=(e,t)=>!e&&!t?!0:!e||!t?!1:ie(e)===ie(t),ae=(e,t)=>{if(!e&&!t)return!0;if(!e||!t)return!1;let n=ie(e),r=ie(t);return n.includes(r)||r.includes(n)},T=(e,t,n)=>{if(!e||!t||!n)return w(e,t);try{return w(new URL(e,n).href,new URL(t,n).href)}catch{return w(e,t)}},E=e=>e.reduce((e,t)=>({...e,[f[t]]:t}),{}),D=e=>Object.entries(e).reduce((e,[t,n])=>n?{...e,[t]:n}:e,{}),oe=(e,t)=>t?{[e]:t}:{},O=(e,t)=>{if(!e)return{};if(!t||t.length===0)return e;let n=new Set(t.map(e=>e.toLowerCase()));return Object.fromEntries(Object.entries(e).filter(([e])=>!n.has(e.toLowerCase())))},k=(...e)=>{let t=new Map,n=(e,n)=>{t.set(e.toLowerCase(),[e,n])};for(let t of e)if(t){if(Array.isArray(t)){for(let[e,r]of t)n(e,r);continue}if(typeof t.forEach==`function`){t.forEach((e,t)=>{n(t,e)});continue}for(let[e,r]of Object.entries(t))n(e,r)}return Object.fromEntries(t.values())};var se=o({createObject:()=>M,davRequest:()=>A,deleteObject:()=>P,propfind:()=>j,updateObject:()=>N});const ce=(0,l.default)(`tsdav:request`),le=e=>{let t=/^\S+\s+(?\d{3})(?:\s+(?.*))?$/.exec(e?.trim()??``),n=t?.groups?.status,r=t?.groups?.statusText;return n?{status:Number.parseInt(n,10),statusText:r??``}:void 0},A=async e=>{let{url:t,init:n,convertIncoming:r=!0,parseOutgoing:i=!0,headersToExclude:a,fetchOptions:o={},fetch:s}=e,c=s??h,{headers:l={},body:d,namespace:f,method:p,attributes:m}=n,g=d;m&&typeof d==`object`&&d&&!Array.isArray(d)&&(g=Object.fromEntries(Object.entries(d).map(([e,t])=>{if(t&&typeof t==`object`&&!Array.isArray(t)){let n=t;return[e,{...n,_attributes:{...m,...n._attributes}}]}return[e,t]})));let _=r&&d!=null?u.default.js2xml({_declaration:{_attributes:{version:`1.0`,encoding:`utf-8`}},...g},{compact:!0,spaces:2,elementNameFn:e=>f&&!/^.+:.+/.test(e)?`${f}:${e}`:e}):d,v={...o};delete v.headers;let y=O(k({"Content-Type":`text/xml;charset=UTF-8`},D(l),o.headers),a),b=await c(t,{...v,headers:y,body:_,method:p}),x=await b.text();if(!b.ok||!b.headers.get(`content-type`)?.toLowerCase().includes(`xml`)||!i||!x)return[{href:b.url,ok:b.ok,status:b.status,statusText:b.statusText,raw:x}];let S;try{S=te(x)}catch(e){return ce(`Failed to parse DAV response XML: ${e.message}`),[{href:b.url,ok:!1,status:b.status,statusText:b.statusText,raw:x,parseError:e.message}]}return S?.multistatus?(Array.isArray(S.multistatus.response)?S.multistatus.response:[S.multistatus.response]).map(e=>{if(!e)return{raw:S,status:b.status,statusText:b.statusText,ok:b.ok};let t=(Array.isArray(e.propstat)?e.propstat:e.propstat?[e.propstat]:[]).map(e=>{let t=le(e.status),n=t?.status??0;return{props:e.prop??{},namespaces:e.propNamespaces,status:n,statusText:t?.statusText??`Invalid DAV property status`,ok:n>=200&&n<300,error:e.error,responsedescription:e.responsedescription}}),n=t.length>0&&t.every(e=>!e.ok)?t[0]:void 0,r=le(e.status)??n,i=r?.status??b.status;return{raw:S,href:e.href,status:i,statusText:r?.statusText??b.statusText,ok:i>=200&&i<300,error:e.error,responsedescription:e.responsedescription,propStats:t,props:ne(t)}}):[{href:b.url,ok:b.ok,status:b.status,statusText:b.statusText,raw:S}]},j=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return A({url:t,init:{method:`PROPFIND`,headers:O(D({depth:r,...i}),a),namespace:`d`,body:{propfind:{_attributes:E([`urn:ietf:params:xml:ns:caldav`,`http://apple.com/ns/ical/`,`http://calendarserver.org/ns/`,`urn:ietf:params:xml:ns:carddav`,`DAV:`]),prop:n}}},headersToExclude:a,fetchOptions:o,fetch:s})},M=async e=>{let{url:t,data:n,headers:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e,s=o??h,{headers:c,...l}=a;return s(t,{...l,method:`PUT`,body:n,headers:O(k(r,c),i)})},N=async e=>{let{url:t,data:n,etag:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e,c=s??h,{headers:l,...u}=o;return c(t,{...u,method:`PUT`,body:n,headers:O(k(D({"If-Match":r,...i}),l),a)})},P=async e=>{let{url:t,headers:n,etag:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e,s=o??h,{headers:c,...l}=a;return s(t,{...l,method:`DELETE`,headers:O(k(D({"If-Match":r,...n}),c),i)})},F=(e,t)=>{let n;try{n=new URL(e,C(t)).href}catch{n=e.trim()}return n.endsWith(`/`)?n.slice(0,-1):n},ue=(e,t,n,r=!1,i=[])=>{let a=new Map(e.map(e=>[F(e.url,n),e])),o=new Map(t.map(e=>[F(e.url,n),e])),s=r?i:e.filter(e=>!o.has(F(e.url,n))),c=new Set(s.map(e=>F(e.url,n))),l=t.filter(e=>!a.has(F(e.url,n))),u=[],d=[];for(let t of e){let e=F(t.url,n);if(c.has(e))continue;let i=o.get(e);i&&i.etag!==t.etag?u.push(i):(i||r)&&d.push(t)}return{created:l,updated:u,deleted:s,unchanged:d}},de=(e,t)=>{let n=e.find(e=>!e.ok||e.status>=400);if(n)throw Error(`${t}: ${n.status} ${n.statusText}`)},fe=(e,t)=>{de(e,t);for(let n of e)if((!n.raw?.multistatus||n.raw.multistatus.response)&&(pe(n,`resourcetype`,t),!n.props||!y(n.props,`resourcetype`)||typeof n.href!=`string`||!n.href))throw Error(`${t}: missing resourcetype or href in DAV multistatus response`)},pe=(e,t,n)=>{let r=e.propStats?.find(e=>!e.ok&&y(e.props,t));if(r&&!y(e.props??{},t))throw Error(`${n}: ${t} returned ${r.status} ${r.statusText}`)},me=(e,t,n,r,i)=>{de(e,i);let a=new Set;for(let n of e){if(pe(n,t,i),!n.href||typeof(n.props?.[t]?._cdata??n.props?.[t])!=`string`)throw Error(`${i}: missing ${t} or href`);a.add(F(n.href,r))}let o=e=>F(e.replace(/\?.*$/,``),r),s=new Map;for(let e of n){let t=o(e);s.set(t,(s.get(t)??0)+1)}if(n.some(e=>!a.has(F(e,r))&&!(s.get(o(e))===1&&a.has(o(e)))))throw Error(`${i}: incomplete response`)},I=e=>{let t=typeof e==`string`||typeof e==`number`?String(e):e?._cdata??e?._text;return typeof t==`string`?t:void 0};var he=o({collectionQuery:()=>L,isCollectionDirty:()=>ye,makeCollection:()=>ve,smartCollectionSync:()=>z,smartCollectionSyncDetailed:()=>xe,supportedReportSet:()=>R,syncCollection:()=>be});const ge=(0,l.default)(`tsdav:collection`),_e=(e,t)=>{try{return new URL(e,C(t)).href}catch{return e}},L=async e=>{let{url:t,body:n,depth:r,defaultNamespace:i=`d`,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e,l=await A({url:t,init:{method:`REPORT`,headers:O(D({depth:r,...a}),o),namespace:i,body:n},headersToExclude:o,fetchOptions:s,fetch:c}),u=l[0];if(i===`c`&&n?.[`calendar-query`]!=null&&l.length===1&&u&&u.status===404&&T(t,u.href,t)&&!u.error&&Object.keys(u.props??{}).length===0&&typeof u.raw==`object`&&u.raw!==null&&u.raw.multistatus?.response?.propstat==null)return[];let d=l.find(e=>!e.ok||e.status&&e.status>=400);if(d)throw Error(`Collection query failed: ${d.status} ${d.statusText}. ${typeof d.raw==`string`?`Raw response: ${d.raw.slice(0,4096)}`:``}`);if((n?.[`calendar-query`]||n?.[`calendar-multiget`]||n?.[`addressbook-query`]||n?.[`addressbook-multiget`])&&l.some(e=>!e.raw?.multistatus))throw Error(`Collection query failed: expected a DAV multistatus response`);if((n?.[`calendar-query`]||n?.[`calendar-multiget`]||n?.[`addressbook-query`]||n?.[`addressbook-multiget`])&&l.some(e=>e.raw?.multistatus?.response&&(typeof e.href!=`string`||!e.href)))throw Error(`Collection query failed: missing href in DAV response`);let f=l[0];return l.length===1&&f&&(!f.raw||f.raw.multistatus&&!f.raw.multistatus.response)&&f.status&&f.status<300?[]:l},ve=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return A({url:t,init:{method:`MKCOL`,headers:O(D({depth:r,...i}),a),namespace:`d`,body:n?{mkcol:{_attributes:E([`DAV:`,`urn:ietf:params:xml:ns:caldav`,`urn:ietf:params:xml:ns:carddav`,`http://calendarserver.org/ns/`,`http://apple.com/ns/ical/`]),set:{prop:n}}}:void 0},headersToExclude:a,fetchOptions:o,fetch:s})},R=async e=>{let{collection:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=(await j({url:t.url,props:{"d:supported-report-set":{}},depth:`0`,headers:O(n,r),headersToExclude:r,fetchOptions:i,fetch:a}))[0]?.props?.supportedReportSet?.supportedReport;return o?(Array.isArray(o)?o:[o]).map(e=>e?.report?Object.keys(e.report)[0]:void 0).filter(e=>typeof e==`string`&&e.length>0):[]},ye=async e=>{let{collection:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=(await j({url:t.url,props:{"cs:getctag":{}},depth:`0`,headers:O(n,r),headersToExclude:r,fetchOptions:i,fetch:a})).find(e=>T(t.url,e.href,t.url));if(!o)throw Error(`Collection does not exist on server`);let s=o.propStats?.length&&o.propStats.every(e=>e.status===404&&y(e.props,`getctag`));if(!o.ok&&!s)throw Error(`Collection status check failed: ${o.status} ${o.statusText}`);let c=I(o.props?.getctag);return{isDirty:t.ctag==null||c==null||`${t.ctag}`!=`${c}`,newCtag:c}},be=e=>{let{url:t,props:n,headers:r,syncLevel:i,syncToken:a,headersToExclude:o,fetchOptions:s,fetch:c}=e;return A({url:t,init:{method:`REPORT`,namespace:`d`,headers:O({...r},o),body:{"sync-collection":{_attributes:E([`urn:ietf:params:xml:ns:caldav`,`urn:ietf:params:xml:ns:carddav`,`DAV:`]),"sync-level":i,"sync-token":a,"d:prop":n}}},headersToExclude:o,fetchOptions:s,fetch:c})},z=async e=>{let{collection:t,method:n,headers:r,headersToExclude:i,account:a,detailedResult:o,fetchOptions:s={},fetch:c}=e,l=[`accountType`,`homeUrl`];if(!a||!_(a,l))throw Error(a?`account must have ${v(a,l)} before smartCollectionSync`:`no account for smartCollectionSync`);let u=n??(t.reports?.includes(`syncCollection`)?`webdav`:`basic`);if(ge(`smart collection sync with type ${a.accountType} and method ${u}`),u===`webdav`){let e=await be({url:t.url,props:{"d:getetag":{},[`${a.accountType===`caldav`?`c`:`card`}:${a.accountType===`caldav`?`calendar-data`:`address-data`}`]:{},"d:displayname":{}},syncLevel:1,syncToken:t.syncToken,headers:O(r,i),headersToExclude:i,fetchOptions:s,fetch:c}),n=e=>typeof e.href==`string`&&F(e.href,t.url)!==F(t.url,t.url)&&!e.props?.resourcetype?.collection,l=e.find(e=>(!e.ok||e.status>=400)&&!(e.status===404&&!e.propStats?.length&&n(e)));if(l)throw Error(`Collection sync failed: ${l.status} ${l.statusText}`);if(e.some(e=>e.raw&&!e.raw.multistatus))throw Error(`Collection sync failed: expected a DAV multistatus response`);if(e.some(e=>e.raw?.multistatus?.response&&(typeof e.href!=`string`||!e.href)))throw Error(`Collection sync failed: missing href in DAV response`);let u=e.filter(n),d=u.filter(e=>e.status!==404).map(e=>e.href),f=u.filter(e=>e.status===404).map(e=>e.href),p=t.objectMultiGet;if(d.length>0&&!p)throw Error(`collection.objectMultiGet is required for webdav sync changes`);let m=d.length?await p?.({url:t.url,props:{"d:getetag":{},[`${a.accountType===`caldav`?`c`:`card`}:${a.accountType===`caldav`?`calendar-data`:`address-data`}`]:{}},objectUrls:d,depth:`1`,headers:O(r,i),headersToExclude:i,fetchOptions:s,fetch:c})??[]:[];me(m,a.accountType===`caldav`?`calendarData`:`addressData`,d,t.url,`Collection sync multi-get failed`);let h=m.map(e=>({url:_e(e.href??``,t.url),etag:I(e.props?.getetag),data:a?.accountType===`caldav`?e.props?.calendarData?._cdata??e.props?.calendarData:e.props?.addressData?._cdata??e.props?.addressData})),g=t.objects??[],_=f.map(e=>({url:_e(e,t.url),etag:``})),{created:v,updated:y,deleted:b,unchanged:x}=ue(g,h,t.url,!0,_);return{...t,objects:o?{created:v,updated:y,deleted:b}:[...x,...v,...y],syncToken:I(e[0]?.raw?.multistatus?.syncToken)??t.syncToken}}if(u===`basic`){let{isDirty:e,newCtag:n}=await ye({collection:t,headers:O(r,i),headersToExclude:i,fetchOptions:s,fetch:c});if(!e)return o?{...t,objects:{created:[],updated:[],deleted:[]}}:t;let a=t.objects??[];if(!t.fetchObjects)throw Error(`collection.fetchObjects is required for basic sync changes`);let l=await t.fetchObjects({collection:t,headers:O(r,i),headersToExclude:i,fetchOptions:s,fetch:c})??[],{created:u,updated:d,deleted:f,unchanged:p}=ue(a,l,t.url);return{...t,objects:o?{created:u,updated:d,deleted:f}:[...p,...u,...d],ctag:n}}return o?{...t,objects:{created:[],updated:[],deleted:[]}}:t},xe=async e=>z({...e,detailedResult:!0});var Se=o({addressBookMultiGet:()=>we,addressBookQuery:()=>B,createVCard:()=>Te,deleteVCard:()=>De,fetchAddressBooks:()=>V,fetchVCards:()=>H,updateVCard:()=>Ee});const Ce=(0,l.default)(`tsdav:addressBook`),B=async e=>{let{url:t,props:n,filters:r,depth:i,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e;return L({url:t,body:{"addressbook-query":D({_attributes:E([`urn:ietf:params:xml:ns:carddav`,`DAV:`]),"d:prop":n,filter:r??{"prop-filter":{_attributes:{name:`FN`}}}})},defaultNamespace:`card`,depth:i,headers:O(a,o),headersToExclude:o,fetchOptions:s,fetch:c})},we=async e=>{let{url:t,props:n,objectUrls:r,depth:i,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e;return L({url:t,body:{"addressbook-multiget":D({_attributes:E([`DAV:`,`urn:ietf:params:xml:ns:carddav`]),"d:prop":n,"d:href":r})},defaultNamespace:`card`,depth:i,headers:O(a,o),headersToExclude:o,fetchOptions:s,fetch:c})},V=async e=>{let{account:t,headers:n,props:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e??{},s=[`homeUrl`,`rootUrl`];if(!t||!_(t,s))throw Error(t?`account must have ${v(t,s)} before fetchAddressBooks`:`no account for fetchAddressBooks`);let c=await j({url:t.homeUrl,props:{...r??{"d:displayname":{},"cs:getctag":{},"d:resourcetype":{},"d:sync-token":{}},"d:resourcetype":{}},depth:`1`,headers:O(n,i),headersToExclude:i,fetchOptions:a,fetch:o});return fe(c,`Address book discovery failed`),Promise.all(c.filter(e=>Object.keys(e.props?.resourcetype??{}).includes(`addressbook`)).map(e=>{let n=e.props?.displayname?._cdata??e.props?.displayname;return Ce(`Found address book named ${typeof n==`string`?n:``}, - props: ${JSON.stringify(e.props)}`),{url:new URL(e.href??``,C(t.rootUrl??``)).href,ctag:I(e.props?.getctag),displayName:typeof n==`string`?n:``,resourcetype:Object.keys(e.props?.resourcetype??{}),syncToken:I(e.props?.syncToken)}}).map(async e=>({...e,reports:await R({collection:e,headers:O(n,i),headersToExclude:i,fetchOptions:a,fetch:o})})))},H=async e=>{let{addressBook:t,headers:n,objectUrls:r,headersToExclude:i,urlFilter:a=e=>!!e,useMultiGet:o=!0,fetchOptions:s={},fetch:c}=e;Ce(`Fetching vcards from ${t?.url}`);let l=[`url`];if(!t||!_(t,l))throw Error(t?`addressBook must have ${v(t,l)} before fetchVCards`:`cannot fetchVCards for undefined addressBook`);let u=(r??(await B({url:t.url,props:{"d:getetag":{}},depth:`1`,headers:O(n,i),headersToExclude:i,fetchOptions:s,fetch:c})).map(e=>e.href??``)).filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.startsWith(`http`)?e:new URL(e,C(t.url)).href).filter(e=>!w(e,t.url)).filter(a).map(e=>{let t=new URL(e);return`${t.pathname}${t.search}`}),d=new Set(u.map(e=>F(e,t.url))),f=[];return u.length>0&&(o?f=await we({url:t.url,props:{"d:getetag":{},"card:address-data":{}},objectUrls:u,depth:`1`,headers:O(n,i),headersToExclude:i,fetchOptions:s,fetch:c}):(f=await B({url:t.url,props:{"d:getetag":{},"card:address-data":{}},depth:`1`,headers:O(n,i),headersToExclude:i,fetchOptions:s,fetch:c}),f=f.filter(e=>!!e.href&&d.has(F(e.href,t.url))))),me(f,`addressData`,u,t.url,`VCard fetch failed`),f.map(e=>({url:new URL(e.href??``,C(t.url)).href,etag:I(e.props?.getetag),data:e.props?.addressData?._cdata??e.props?.addressData}))},Te=async e=>{let{addressBook:t,vCardString:n,filename:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return M({url:new URL(r,C(t.url)).href,data:n,headers:O({"content-type":`text/vcard; charset=utf-8`,"If-None-Match":`*`,...i},a),headersToExclude:a,fetchOptions:o,fetch:s})},Ee=async e=>{let{vCard:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return N({url:t.url,data:t.data,etag:t.etag,headers:O({"content-type":`text/vcard; charset=utf-8`,...n},r),headersToExclude:r,fetchOptions:i,fetch:a})},De=async e=>{let{vCard:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return P({url:t.url,etag:t.etag,headers:O(n,r),headersToExclude:r,fetchOptions:i,fetch:a})};var Oe=o({calendarMultiGet:()=>W,calendarQuery:()=>U,createCalendarObject:()=>Ie,deleteCalendarObject:()=>Re,fetchCalendarObjects:()=>K,fetchCalendarUserAddresses:()=>Pe,fetchCalendars:()=>G,freeBusyQuery:()=>Ve,makeCalendar:()=>Fe,syncCalendars:()=>ze,syncCalendarsDetailed:()=>Be,updateCalendarObject:()=>Le});const ke=(0,l.default)(`tsdav:calendar`),Ae=/^\d{4}(-\d\d(-\d\d(T\d\d:\d\d(:\d\d)?(\.\d+)?(([+-]\d\d:\d\d)|Z)?)?)?)?$/i,je=/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(\.\d+)?(([+-]\d\d:\d\d)|Z)?$/i,Me=e=>{let{start:t,end:n}=e;if(!(Ae.test(t)&&Ae.test(n)||je.test(t)&&je.test(n)))throw Error(`invalid timeRange format, not in ISO8601`);if(Number.isNaN(new Date(t).getTime())||Number.isNaN(new Date(n).getTime()))throw Error(`invalid timeRange: start or end is not a valid date`);if(new Date(t).getTime()>=new Date(n).getTime())throw Error(`invalid timeRange: start must be before end`)},Ne=e=>{let t=[];return Array.isArray(e)?t=e.map(e=>e?._attributes?.name):e&&typeof e==`object`&&(t=[e._attributes?.name]),t.filter(e=>typeof e==`string`&&e.length>0)},Pe=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`principalUrl`,`rootUrl`];if(!_(t,o))throw Error(`account must have ${v(t,o)} before fetchUserAddresses`);ke(`Fetch user addresses from ${t.principalUrl}`);let s=(await j({url:t.principalUrl,props:{"c:calendar-user-address-set":{}},depth:`0`,headers:O(n,r),headersToExclude:r,fetchOptions:i,fetch:a})).find(e=>T(t.principalUrl,e.href,t.rootUrl));if(!s||!s.ok)throw Error(`cannot find calendarUserAddresses`);let c=s?.props?.calendarUserAddressSet?.href,l=[];Array.isArray(c)?l=c:c&&(l=[c]);let u=l.filter(e=>typeof e==`string`&&e.length>0);return ke(`Fetched calendar user addresses ${u}`),u},U=async e=>{let{url:t,props:n,filters:r,timezone:i,depth:a,headers:o,headersToExclude:s,fetchOptions:c={},fetch:l}=e;return L({url:t,body:{"calendar-query":D({_attributes:E([`urn:ietf:params:xml:ns:caldav`,`http://calendarserver.org/ns/`,`http://apple.com/ns/ical/`,`DAV:`]),"d:prop":n,filter:r,timezone:i})},defaultNamespace:`c`,depth:a,headers:O(o,s),headersToExclude:s,fetchOptions:c,fetch:l})},W=async e=>{let{url:t,props:n,objectUrls:r,filters:i,timezone:a,depth:o,headers:s,headersToExclude:c,fetchOptions:l={},fetch:u}=e;return L({url:t,body:{"calendar-multiget":D({_attributes:E([`DAV:`,`urn:ietf:params:xml:ns:caldav`]),"d:prop":n,"d:href":r,filter:i,timezone:a})},defaultNamespace:`c`,depth:o,headers:O(s,c),headersToExclude:c,fetchOptions:l,fetch:u})},Fe=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return A({url:t,init:{method:`MKCALENDAR`,headers:O(D({depth:r,...i}),a),namespace:`d`,body:{"c:mkcalendar":{_attributes:E([`DAV:`,`urn:ietf:params:xml:ns:caldav`,`http://apple.com/ns/ical/`]),set:{prop:n}}}},headersToExclude:a,fetchOptions:o,fetch:s})},G=async e=>{let{headers:t,account:n,props:r,projectedProps:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e??{},c=[`homeUrl`,`rootUrl`];if(!n||!_(n,c))throw Error(n?`account must have ${v(n,c)} before fetchCalendars`:`no account for fetchCalendars`);let l=await j({url:n.homeUrl,props:{...r??{"c:calendar-description":{},"c:calendar-timezone":{},"d:displayname":{},"ca:calendar-color":{},"cs:getctag":{},"d:resourcetype":{},"c:supported-calendar-component-set":{},"d:sync-token":{}},"d:resourcetype":{},"c:supported-calendar-component-set":{}},depth:`1`,headers:O(t,a),headersToExclude:a,fetchOptions:o,fetch:s});return fe(l,`Calendar discovery failed`),Promise.all(l.filter(e=>Object.keys(e.props?.resourcetype??{}).includes(`calendar`)).filter(e=>{let t=Ne(e.props?.supportedCalendarComponentSet?.comp);return t.length===0||t.some(e=>Object.values(m).includes(e))}).map(e=>{let t=e.props?.calendarDescription,r=e.props?.calendarTimezone,a=e.props?.supportedCalendarComponentSet?.comp,o=Object.entries(e.props??{}).filter(([e])=>i?.[e]);return{description:typeof t==`string`?t:``,timezone:typeof r==`string`?r:``,url:new URL(e.href??``,C(n.rootUrl??``)).href,ctag:I(e.props?.getctag),calendarColor:e.props?.calendarColor,displayName:I(e.props?.displayname),components:Ne(a),resourcetype:Object.keys(e.props?.resourcetype??{}),syncToken:I(e.props?.syncToken),...i&&o.length>0?{projectedProps:Object.fromEntries(o)}:{}}}).map(async e=>({...e,reports:await R({collection:e,headers:O(t,a),headersToExclude:a,fetchOptions:o,fetch:s})})))},K=async e=>{let{calendar:t,objectUrls:n,filters:r,timeRange:i,headers:a,expand:o,urlFilter:s=e=>!!e?.includes(`.ics`),useMultiGet:c=!0,headersToExclude:l,fetchOptions:u={},fetch:d}=e;if(o&&!i)throw Error(`timeRange is required when expand is true`);i&&Me(i),ke(`Fetching calendar objects from ${t?.url}`);let f=[`url`];if(!t||!_(t,f))throw Error(t?`calendar must have ${v(t,f)} before fetchCalendarObjects`:`cannot fetchCalendarObjects for undefined calendar`);let p=r??[{"comp-filter":{_attributes:{name:`VCALENDAR`},"comp-filter":{_attributes:{name:`VEVENT`},...i?{"time-range":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}}}],m=[];n||(m=await U({url:t.url,props:{"d:getetag":{},...o&&i?{"c:calendar-data":{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}}:{}},filters:p,depth:`1`,headers:O(a,l),headersToExclude:l,fetchOptions:u,fetch:d}));let h=(n??m.map(e=>e.href??``)).filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.startsWith(`http`)?e:new URL(e,C(t.url)).href).filter(s).map(e=>{let t=new URL(e);return`${t.pathname}${t.search}`}),g=new Set(h.map(e=>F(e,t.url))),y=[];return h.length>0&&(o&&!n?y=m.filter(e=>{let n=(e.href??``).startsWith(`http`)?e.href:new URL(e.href??``,C(t.url)).href;return s(n??``)}):c?y=await W({url:t.url,props:{"d:getetag":{},"c:calendar-data":{...o&&i?{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}},objectUrls:h,depth:`1`,headers:O(a,l),headersToExclude:l,fetchOptions:u,fetch:d}):(y=await U({url:t.url,props:{"d:getetag":{},"c:calendar-data":{...o&&i?{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}},filters:p,depth:`1`,headers:O(a,l),headersToExclude:l,fetchOptions:u,fetch:d}),y=y.filter(e=>{let n=(e.href??``).startsWith(`http`)?e.href??``:new URL(e.href??``,C(t.url)).href;return g.has(F(n,t.url))}))),me(y,`calendarData`,h,t.url,`Calendar object fetch failed`),y.map(e=>({url:new URL(e.href??``,C(t.url)).href,etag:I(e.props?.getetag),data:e.props?.calendarData?._cdata??e.props?.calendarData}))},Ie=async e=>{let{calendar:t,iCalString:n,filename:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return M({url:new URL(r,C(t.url)).href,data:n,headers:O({"content-type":`text/calendar; charset=utf-8`,"If-None-Match":`*`,...i},a),headersToExclude:a,fetchOptions:o,fetch:s})},Le=async e=>{let{calendarObject:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return N({url:t.url,data:t.data,etag:t.etag,headers:O({"content-type":`text/calendar; charset=utf-8`,...n},r),headersToExclude:r,fetchOptions:i,fetch:a})},Re=async e=>{let{calendarObject:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return P({url:t.url,etag:t.etag,headers:O(n,r),headersToExclude:r,fetchOptions:i,fetch:a})},ze=async e=>{let{oldCalendars:t,account:n,detailedResult:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;if(!n)throw Error(`Must have account before syncCalendars`);let c=t??n.calendars??[],l=await G({account:n,headers:O(i,a),headersToExclude:a,fetchOptions:o,fetch:s}),u=n.rootUrl??n.homeUrl??n.serverUrl,d=new Map(c.map(e=>[F(e.url,u),e])),f=new Map(l.map(e=>[F(e.url,u),e])),p=l.filter(e=>!d.has(F(e.url,u))),m=[],h=[],g=[];for(let e of c){let t=f.get(F(e.url,u));t?!t.syncToken&&!t.ctag||t.syncToken&&t.syncToken!==e.syncToken||t.ctag&&t.ctag!==e.ctag?m.push({local:e,remote:t}):h.push(e):g.push(e)}ke(`updated calendars: ${m.map(({remote:e})=>e.displayName)}`);let _=await Promise.all(m.map(async({local:e,remote:t})=>{let r=async e=>{if(!e)return[];let{collection:t,...n}=e;return K({...n,calendar:t,filters:{"comp-filter":{_attributes:{name:`VCALENDAR`}}},urlFilter:e=>F(e,t.url)!==F(t.url,t.url)})},c={...t,ctag:e.ctag,syncToken:e.syncToken,objects:e.objects,objectMultiGet:W,fetchObjects:r},l=await z({collection:c,detailedResult:!1,headers:O(i,a),headersToExclude:a,account:n,fetchOptions:o,fetch:s});return{...l,ctag:t.reports?.includes(`syncCollection`)?t.ctag??l.ctag:l.ctag??t.ctag,syncToken:t.reports?.includes(`syncCollection`)?l.syncToken:t.syncToken??l.syncToken}}));return r?{created:p,updated:_,deleted:g}:[...h,...p,..._]},Be=async e=>ze({...e,detailedResult:!0}),Ve=async e=>{let{url:t,timeRange:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;if(!n)throw Error(`timeRange is required`);Me(n);let c=(await L({url:t,body:{"free-busy-query":D({_attributes:E([`urn:ietf:params:xml:ns:caldav`]),"c:time-range":{_attributes:{start:`${new Date(n.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(n.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}})},defaultNamespace:`c`,depth:r,headers:O(i,a),headersToExclude:a,fetchOptions:o,fetch:s}))[0];if(!c)throw Error(`freeBusyQuery returned no response`);return c},He=[[7,12,17,22],[5,9,14,20],[4,11,16,23],[6,10,15,21]],Ue=Array.from({length:64},(e,t)=>Math.floor(Math.abs(Math.sin(t+1))*2**32)),We=e=>{let t=``;for(let n=0;n<4;n+=1)t+=(e>>>n*8&255).toString(16).padStart(2,`0`);return t},Ge=e=>{let t=new TextEncoder().encode(e),n=(t.length+8>>>6)+1<<6,r=new Uint8Array(n);r.set(t),r[t.length]=128;let i=new DataView(r.buffer),a=t.length*8;i.setUint32(n-8,a>>>0,!0),i.setUint32(n-4,Math.floor(a/2**32),!0);let o=1732584193,s=4023233417,c=2562383102,l=271733878;for(let e=0;e>>4][o%4];t=a,a=r,r=n,n=n+(l<>>32-u)|0}o=o+t|0,s=s+n|0,c=c+r|0,l=l+a|0}return We(o)+We(s)+We(c)+We(l)},Ke=(0,l.default)(`tsdav:digestAuth`),qe=/[!#$%&'*+.^_`|~0-9A-Za-z-]+/y,Je=e=>{let t=[],n,r=0,i=t=>{for(;r{let t=(e.algorithm??`MD5`).toUpperCase();if(e.realm==null||!e.nonce||!Ye.includes(t))return;let n=e.qop?.split(`,`).map(e=>e.trim().toLowerCase());if((!n||n.includes(`auth`))&&(n||!t.endsWith(`-SESS`)))return{realm:e.realm,nonce:e.nonce,opaque:e.opaque,domain:e.domain,qop:n?`auth`:void 0,algorithm:t,stale:e.stale?.toLowerCase()===`true`}},Ze=(e,{unlessBasic:t=!1,allowSHA256:n=!0}={})=>{let r=Je(e??``);if(!(t&&r.some(({scheme:e})=>e===`basic`)))return r.filter(({scheme:e})=>e===`digest`).map(({params:e})=>Xe(e)).filter(e=>e!=null).filter(e=>n||!e.algorithm.startsWith(`SHA`)).sort((e,t)=>Ye.indexOf(e.algorithm)-Ye.indexOf(t.algorithm))[0]},Qe=e=>Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);var q=class extends Error{constructor(){super(`tsdav: Digest authentication requires the WebCrypto API (globalThis.crypto), available in Node.js >= 19, browsers, Bun and Deno. On Node.js 18, assign webcrypto from node:crypto to globalThis.crypto.`),this.name=`DigestUnsupportedError`}};const $e=e=>{let{crypto:t}=globalThis;if(!t?.getRandomValues||e?.startsWith(`SHA`)&&!t.subtle)throw new q;return t},et=async(e,t)=>e.startsWith(`MD5`)?Ge(t):Qe(new Uint8Array(await $e(e).subtle.digest(`SHA-256`,new TextEncoder().encode(t)))),J=e=>`"${e.replace(/["\\]/g,`\\$&`)}"`,tt=e=>/^[\x20-\x7e]*$/.test(e)?`username=${J(e)}`:`username*=UTF-8''${encodeURIComponent(e).replace(/['()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}`,nt=async e=>{let{challenge:t,username:n,password:r,method:i,uri:a,cnonce:o}=e,{realm:s,nonce:c,qop:l,algorithm:u}=t,d=e.nc.toString(16).padStart(8,`0`),f=await et(u,`${n}:${s}:${r}`);u.endsWith(`-SESS`)&&(f=await et(u,`${f}:${c}:${o}`));let p=await et(u,`${i}:${a}`),m=await et(u,l?`${f}:${c}:${d}:${o}:${l}:${p}`:`${f}:${c}:${p}`);return`Digest ${[tt(n),`realm=${J(s)}`,`uri=${J(a)}`,`algorithm=${u.replace(`-SESS`,`-sess`)}`,`nonce=${J(c)}`,...l?[`nc=${d}`,`cnonce=${J(o)}`,`qop=${l}`]:[],`response=${J(m)}`,...t.opaque==null?[]:[`opaque=${J(t.opaque)}`]].join(`, `)}`},rt=()=>Qe($e().getRandomValues(new Uint8Array(16))),Y=e=>{if(e instanceof URL)return e;if(typeof e==`string`)try{return new URL(e)}catch{return}},it=e=>typeof e!=`object`||!e||!(typeof e.getReader==`function`||Symbol.asyncIterator in e),at=[301,302,303,307,308],ot=[`content-encoding`,`content-language`,`content-location`,`content-type`],st=(e,t)=>{let n=(t.method??`GET`).toUpperCase();if(e===303&&n!==`GET`&&n!==`HEAD`||(e===301||e===302)&&n===`POST`){let e=new Headers(t.headers);for(let t of ot)e.delete(t);return{...t,method:`GET`,body:void 0,headers:e}}return t},ct=e=>{let t=new Headers(e.headers);return t.delete(`authorization`),{...e,headers:t}},lt=(e,t)=>e.domain?.trim()?e.domain.trim().split(/\s+/).flatMap(e=>{try{if(!e.startsWith(`/`)&&!/^[a-z][a-z\d+.-]*:/i.test(e))return[];let n=new URL(e,`${t.origin}/`);return n.hash=``,n.origin===t.origin?[n.href]:[]}catch{return[]}}):[`${t.origin}/`],ut=(e=!0)=>({active:e,challenges:new Map}),dt=e=>{let{credentials:t,fetch:n}=e,r=n??h,i=e.state??ut(),a=async(e,n,r,a)=>{let o=i.challenges.get(n.origin)?.find(e=>e.scopes.some(e=>n.href.startsWith(e)));if(!o)return ct(e);o.nc+=1;let{challenge:s,nc:c}=o,l=await nt({challenge:s,username:t.username??``,password:t.password??``,method:r,uri:a,nc:c,cnonce:s.algorithm.endsWith(`-SESS`)?o.cnonce:rt()}),u=new Headers(e.headers);return u.set(`authorization`,l),{...e,headers:u}},o=(e,t)=>{let n=e.headers.get(`www-authenticate`),r={unlessBasic:!i.active},a=!globalThis.crypto?.subtle&&Ze(n,{...r,allowSHA256:!1})||Ze(n,r);if(!a)return!1;try{$e(a.algorithm)}catch(e){if(!i.active&&e instanceof q)return!1;throw e}i.active||=(Ke(`Server only offers Digest authentication, switching from Basic`),!0),Ke(`Digest challenge received for ${t.origin}${a.stale?` (stale nonce)`:``}`);let o=i.challenges.get(t.origin)??[],s=lt(a,t),c=o.find(e=>e.challenge.realm===a.realm&&e.challenge.algorithm===a.algorithm&&e.challenge.nonce===a.nonce);return i.challenges.set(t.origin,[{challenge:a,scopes:s,nc:c?.nc??0,cnonce:c?.cnonce??rt()},...o.filter(e=>e.challenge.realm!==a.realm)]),!0},s=async(e,t,n,i)=>{let s=(t.method??`GET`).toUpperCase(),c=`${n.pathname}${n.search}`,l=await r(e,await a(t,n,s,c));return l.status!==401||!i||!it(t.body)||!o(l,n)?l:(await l.body?.cancel().catch(()=>void 0),r(e,await a(t,n,s,c)))};return async(e,t={})=>{let n=Y(e);if(!n)return r(e,t);i.active&&(t={...t,credentials:t.credentials??`omit`});let a=!1;if(!i.active){let i=await r(e,t);if(i.status!==401||!it(t.body)||(Y(i.url??``)??n).origin!==n.origin||!o(i,Y(i.url)??n))return i;await i.body?.cancel().catch(()=>void 0),a=!0,t={...t,credentials:t.credentials??`omit`};let c=Y(i.url)??n;if(c.href!==n.href){let e=(t.method??`GET`).toUpperCase();if(e!==`GET`&&e!==`HEAD`)throw TypeError(`tsdav: Digest negotiation after an automatic redirect requires the final DAV URL. Set serverUrl and collection URLs to their canonical locations.`);return s(c.href,{...t,redirect:`error`},c,!1)}}if((t.redirect??`follow`)!==`follow`||!it(t.body))return s(e,t,n,!a);let c=e,l=n,u={...t,redirect:`manual`},d=!1;for(let e=0;;e+=1){let t=d?await r(c,u):await s(c,u,l,!a);if(a=!1,t.type===`opaqueredirect`){let e=(u.method??`GET`).toUpperCase();if(e!==`GET`&&e!==`HEAD`)throw TypeError(`tsdav: Digest authentication cannot safely follow an opaque browser redirect for this method. Use the final DAV URL, including its trailing slash.`);let t=await r(c,{...ct(u),redirect:`follow`}),i=Y(t.url);return!i||i.origin!==n.origin||d||t.status!==401||!o(t,i)?t:(await t.body?.cancel().catch(()=>void 0),s(i.href,{...u,redirect:`error`},i,!1))}let i=t.headers.get(`location`);if(!at.includes(t.status)||!i)return t;if(e===20)throw TypeError(`tsdav: too many redirects`);await t.body?.cancel().catch(()=>void 0),l=new URL(i,l),c=l.href,u=st(t.status,u),l.origin!==n.origin&&(d=!0,u=ct(u))}}};var ft=o({createAccount:()=>Z,fetchHomeUrl:()=>_t,fetchPrincipalUrl:()=>gt,serviceDiscovery:()=>mt});const X=(0,l.default)(`tsdav:account`),pt=(e,t)=>{let n=[t,e,new URL(`/`,e).href];return n.filter((e,t)=>n.indexOf(e)===t)},mt=async e=>{X(`Service discovery...`);let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=a??h,s=new URL(t.serverUrl),{headers:c,...l}=i,u=new URL(`/.well-known/${t.accountType}`,s);u.protocol=s.protocol??`http`;let d=e=>{if(e.status>=300&&e.status<400){let t=e.headers.get(`Location`);if(typeof t==`string`&&t.length)return X(`Service discovery redirected to ${t}`),new URL(t,u).href}};try{let e=d(await o(u.href,{...l,method:`PROPFIND`,headers:O(k({"Content-Type":`text/xml;charset=UTF-8`},n,c),r),body:` +Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));let l=require("debug");l=c(l);let u=require("xml-js");u=c(u);let d=/* @__PURE__ */ function(e){return e.CALENDAR_SERVER=`http://calendarserver.org/ns/`,e.CALDAV_APPLE=`http://apple.com/ns/ical/`,e.CALDAV=`urn:ietf:params:xml:ns:caldav`,e.CARDDAV=`urn:ietf:params:xml:ns:carddav`,e.DAV=`DAV:`,e}({});const f={"urn:ietf:params:xml:ns:caldav":`xmlns:c`,"urn:ietf:params:xml:ns:carddav":`xmlns:card`,"http://calendarserver.org/ns/":`xmlns:cs`,"http://apple.com/ns/ical/":`xmlns:ca`,"DAV:":`xmlns:d`};let p=/* @__PURE__ */ function(e){return e.CALDAV=`c`,e.CARDDAV=`card`,e.CALENDAR_SERVER=`cs`,e.CALDAV_APPLE=`ca`,e.DAV=`d`,e}({}),m=/* @__PURE__ */ function(e){return e.VEVENT=`VEVENT`,e.VTODO=`VTODO`,e.VJOURNAL=`VJOURNAL`,e.VFREEBUSY=`VFREEBUSY`,e.VTIMEZONE=`VTIMEZONE`,e.VALARM=`VALARM`,e}({});const h=typeof globalThis<`u`&&typeof globalThis.fetch==`function`?globalThis.fetch.bind(globalThis):(()=>{throw Error("tsdav: global fetch is not available in this runtime. Upgrade to Node.js >= 18, run under a browser/Bun/Deno, or install a fetch polyfill on globalThis before importing tsdav. You can also pass a custom `fetch` implementation to `createDAVClient`, `DAVClient`, or individual request helpers.")}),g=e=>e.replace(/[-_]+(\w?)/g,(e,t)=>t?t.toUpperCase():``);function _(e,t){if(!e)return!1;let n=e=>e!=null&&t.every(t=>e[t]);return Array.isArray(e)?e.length>0&&e.every(e=>n(e)):n(e)}const v=(e,t)=>!e||typeof e!=`object`?t.map(e=>e.toString()).join(`,`):t.reduce((t,n)=>e[n]?t:`${t.length?`${t},`:``}${n.toString()}`,``),y=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),b=new Set(Object.values(d)),x=new Map([...[`multistatus`,`response`,`propstat`,`prop`,`href`,`status`,`error`,`responsedescription`,`resourcetype`,`collection`,`getetag`,`displayname`,`syncToken`,`supportedReportSet`,`supportedReport`,`report`,`currentUserPrincipal`].map(e=>[e,`DAV:`]),...[`calendarData`,`calendar`,`calendarDescription`,`calendarTimezone`,`calendarHomeSet`,`calendarUserAddressSet`,`supportedCalendarComponentSet`,`comp`].map(e=>[e,`urn:ietf:params:xml:ns:caldav`]),...[`addressData`,`addressbook`,`addressbookHomeSet`].map(e=>[e,`urn:ietf:params:xml:ns:carddav`]),[`getctag`,`http://calendarserver.org/ns/`],[`calendarColor`,`http://apple.com/ns/ical/`]]),S=(e,t)=>{let n=g(e.replace(/^.*:/,``)),r=x.get(n);return t&&r&&t!==r?`{${t}}${n}`:n},ee=(e,t)=>{let n=Object.assign(Object.create(null),t),r=Object.create(null);for(let[t,i]of Object.entries(e.attributes??{}))(t===`xmlns`||t.startsWith(`xmlns:`))&&(n[t===`xmlns`?``:t.slice(6)]=String(i)),t!==`xmlns`&&(r[t]=i);let i=e.name??``,a=i.indexOf(`:`),o=n[a===-1?``:i.slice(0,a)]??``,s=e.elements??[],c=s.filter(e=>e.type===`element`),l=s.filter(e=>e.type===`text`||e.type===`cdata`).map(e=>String(e.text??e.cdata??``)).join(``),u={},d=Object.create(null);if(Object.keys(r).length&&(u._attributes=r),!c.length){let e=s.some(e=>e.type===`text`),t=s.some(e=>e.type===`cdata`);return e?{value:l,namespace:o,namespaces:d}:(t&&(u._cdata=l),{value:u,namespace:o,namespaces:d})}l.trim()&&(u._text=l);for(let e of c){let t=ee(e,n),r=g((e.name??``).replace(/^.*:/,``)),i=S(e.name??``,t.namespace),a=d[i];if(y(u,i)&&a!==t.namespace){if(b.has(t.namespace)&&!b.has(a)){let e=`{${a}}${r}`;Object.defineProperty(u,e,{value:u[i],enumerable:!0,configurable:!0,writable:!0}),d[e]=a,delete u[i]}else i=`{${t.namespace}}${r}`}y(u,i)?Array.isArray(u[i])?u[i].push(t.value):u[i]=[u[i],t.value]:Object.defineProperty(u,i,{value:t.value,enumerable:!0,configurable:!0,writable:!0}),d[i]=t.namespace,r===`prop`&&t.namespace===`DAV:`&&(u.propNamespaces=t.namespaces)}return{value:u,namespace:o,namespaces:d}},te=e=>{let t=u.default.xml2js(e,{compact:!1,ignoreDeclaration:!0}),n={};for(let e of t.elements??[]){if(e.type!==`element`)continue;let t=ee(e,{}),r=S(e.name??``,t.namespace);Object.defineProperty(n,r,{value:t.value,enumerable:!0})}return n},ne=e=>{let t=/* @__PURE__ */ new Map;for(let n of e)if(n.ok)for(let[e,r]of Object.entries(n.props)){let i=t.get(e)??/* @__PURE__ */ new Map;i.set(n.namespaces?.[e]??``,r),t.set(e,i)}let n={};for(let[e,r]of t){let t=[...r.keys()].find(e=>b.has(e))??r.keys().next().value;for(let[i,a]of r)Object.defineProperty(n,i===t?e:`{${i}}${e}`,{value:a,enumerable:!0,configurable:!0,writable:!0})}return n},re=e=>{let t;try{t=new URL(e)}catch{return e}return t.pathname=t.pathname.split(`/`).map(e=>{try{return encodeURIComponent(decodeURIComponent(e))}catch{return e}}).join(`/`),t.href};var ie=/* @__PURE__ */ o({cleanupFalsy:()=>D,conditionalParam:()=>se,ensureTrailingSlash:()=>C,excludeHeaders:()=>O,getDAVAttribute:()=>E,mergeHeaders:()=>k,urlContains:()=>oe,urlEquals:()=>w,urlMatches:()=>T});const ae=e=>{let t=e.trim();return t.endsWith(`/`)?t.slice(0,-1):t},C=e=>{let t=e.trim(),n=t.search(/[?#]/),r=n===-1?t:t.slice(0,n),i=n===-1?``:t.slice(n);return`${r.endsWith(`/`)?r:`${r}/`}${i}`},w=(e,t)=>!e&&!t?!0:!e||!t?!1:ae(e)===ae(t),oe=(e,t)=>{if(!e&&!t)return!0;if(!e||!t)return!1;let n=ae(e),r=ae(t);return n.includes(r)||r.includes(n)},T=(e,t,n)=>{if(!e||!t||!n)return w(e,t);try{return w(re(new URL(e,n).href),re(new URL(t,n).href))}catch{return w(e,t)}},E=e=>e.reduce((e,t)=>({...e,[f[t]]:t}),{}),D=e=>Object.entries(e).reduce((e,[t,n])=>n?{...e,[t]:n}:e,{}),se=(e,t)=>t?{[e]:t}:{},O=(e,t)=>{if(!e)return{};if(!t||t.length===0)return e;let n=new Set(t.map(e=>e.toLowerCase()));return Object.fromEntries(Object.entries(e).filter(([e])=>!n.has(e.toLowerCase())))},k=(...e)=>{let t=/* @__PURE__ */ new Map,n=(e,n)=>{t.set(e.toLowerCase(),[e,n])};for(let t of e)if(t){if(Array.isArray(t))for(let[e,r]of t)n(e,r);else if(typeof t.forEach==`function`)t.forEach((e,t)=>{n(t,e)});else for(let[e,r]of Object.entries(t))n(e,r)}return Object.fromEntries(t.values())};var ce=/* @__PURE__ */ o({createObject:()=>M,davRequest:()=>A,deleteObject:()=>P,propfind:()=>j,updateObject:()=>N});const le=(0,l.default)(`tsdav:request`),ue=e=>{let t=/^\S+\s+(?\d{3})(?:\s+(?.*))?$/.exec(e?.trim()??``),n=t?.groups?.status,r=t?.groups?.statusText;return n?{status:Number.parseInt(n,10),statusText:r??``}:void 0},A=async e=>{let{url:t,init:n,convertIncoming:r=!0,parseOutgoing:i=!0,headersToExclude:a,fetchOptions:o={},fetch:s}=e,c=s??h,{headers:l={},body:d,namespace:f,method:p,attributes:m}=n,g=d;m&&typeof d==`object`&&d&&!Array.isArray(d)&&(g=Object.fromEntries(Object.entries(d).map(([e,t])=>{if(t&&typeof t==`object`&&!Array.isArray(t)){let n=t;return[e,{...n,_attributes:{...m,...n._attributes}}]}return[e,t]})));let _=r&&d!=null?u.default.js2xml({_declaration:{_attributes:{version:`1.0`,encoding:`utf-8`}},...g},{compact:!0,spaces:2,elementNameFn:e=>f&&!/^.+:.+/.test(e)?`${f}:${e}`:e}):d,v={...o};delete v.headers;let y=O(k({"Content-Type":`text/xml;charset=UTF-8`},D(l),o.headers),a),b=await c(t,{...v,headers:y,body:_,method:p}),x=await b.text();if(!b.ok||!b.headers.get(`content-type`)?.toLowerCase().includes(`xml`)||!i||!x)return[{href:b.url,ok:b.ok,status:b.status,statusText:b.statusText,raw:x}];let S;try{S=te(x)}catch(e){return le(`Failed to parse DAV response XML: ${e.message}`),[{href:b.url,ok:!1,status:b.status,statusText:b.statusText,raw:x,parseError:e.message}]}return S?.multistatus?(Array.isArray(S.multistatus.response)?S.multistatus.response:[S.multistatus.response]).map(e=>{if(!e)return{raw:S,status:b.status,statusText:b.statusText,ok:b.ok};let t=(Array.isArray(e.propstat)?e.propstat:e.propstat?[e.propstat]:[]).map(e=>{let t=ue(e.status),n=t?.status??0;return{props:e.prop??{},namespaces:e.propNamespaces,status:n,statusText:t?.statusText??`Invalid DAV property status`,ok:n>=200&&n<300,error:e.error,responsedescription:e.responsedescription}}),n=t.length>0&&t.every(e=>!e.ok)?t[0]:void 0,r=ue(e.status)??n,i=r?.status??b.status;return{raw:S,href:e.href,status:i,statusText:r?.statusText??b.statusText,ok:i>=200&&i<300,error:e.error,responsedescription:e.responsedescription,propStats:t,props:ne(t)}}):[{href:b.url,ok:b.ok,status:b.status,statusText:b.statusText,raw:S}]},j=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return A({url:t,init:{method:`PROPFIND`,headers:O(D({depth:r,...i}),a),namespace:`d`,body:{propfind:{_attributes:E([`urn:ietf:params:xml:ns:caldav`,`http://apple.com/ns/ical/`,`http://calendarserver.org/ns/`,`urn:ietf:params:xml:ns:carddav`,`DAV:`]),prop:n}}},headersToExclude:a,fetchOptions:o,fetch:s})},M=async e=>{let{url:t,data:n,headers:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e,s=o??h,{headers:c,...l}=a;return s(t,{...l,method:`PUT`,body:n,headers:O(k(r,c),i)})},N=async e=>{let{url:t,data:n,etag:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e,c=s??h,{headers:l,...u}=o;return c(t,{...u,method:`PUT`,body:n,headers:O(k(D({"If-Match":r,...i}),l),a)})},P=async e=>{let{url:t,headers:n,etag:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e,s=o??h,{headers:c,...l}=a;return s(t,{...l,method:`DELETE`,headers:O(k(D({"If-Match":r,...n}),c),i)})},F=(e,t)=>{let n;try{n=re(new URL(e,C(t)).href)}catch{n=e.trim()}return n.endsWith(`/`)?n.slice(0,-1):n},de=(e,t,n,r=!1,i=[])=>{let a=new Map(e.map(e=>[F(e.url,n),e])),o=new Map(t.map(e=>[F(e.url,n),e])),s=r?i:e.filter(e=>!o.has(F(e.url,n))),c=new Set(s.map(e=>F(e.url,n))),l=t.filter(e=>!a.has(F(e.url,n))),u=[],d=[];for(let t of e){let e=F(t.url,n);if(c.has(e))continue;let i=o.get(e);i&&i.etag!==t.etag?u.push(i):(i||r)&&d.push(t)}return{created:l,updated:u,deleted:s,unchanged:d}},fe=(e,t)=>{let n=e.find(e=>!e.ok||e.status>=400);if(n)throw Error(`${t}: ${n.status} ${n.statusText}`)},pe=(e,t)=>{fe(e,t);for(let n of e)if((!n.raw?.multistatus||n.raw.multistatus.response)&&(me(n,`resourcetype`,t),!n.props||!y(n.props,`resourcetype`)||typeof n.href!=`string`||!n.href))throw Error(`${t}: missing resourcetype or href in DAV multistatus response`)},me=(e,t,n)=>{let r=e.propStats?.find(e=>!e.ok&&y(e.props,t));if(r&&!y(e.props??{},t))throw Error(`${n}: ${t} returned ${r.status} ${r.statusText}`)},he=(e,t,n,r,i)=>{fe(e,i);let a=/* @__PURE__ */ new Set;for(let n of e){if(me(n,t,i),!n.href||typeof(n.props?.[t]?._cdata??n.props?.[t])!=`string`)throw Error(`${i}: missing ${t} or href`);a.add(F(n.href,r))}let o=e=>F(e.replace(/\?.*$/,``),r),s=/* @__PURE__ */ new Map;for(let e of n){let t=o(e);s.set(t,(s.get(t)??0)+1)}if(n.some(e=>!a.has(F(e,r))&&!(s.get(o(e))===1&&a.has(o(e)))))throw Error(`${i}: incomplete response`)},I=e=>{let t=typeof e==`string`||typeof e==`number`?String(e):e?._cdata??e?._text;return typeof t==`string`?t:void 0};var ge=/* @__PURE__ */ o({collectionQuery:()=>L,isCollectionDirty:()=>be,makeCollection:()=>ye,smartCollectionSync:()=>z,smartCollectionSyncDetailed:()=>Se,supportedReportSet:()=>R,syncCollection:()=>xe});const _e=(0,l.default)(`tsdav:collection`),ve=(e,t)=>{try{return new URL(e,C(t)).href}catch{return e}},L=async e=>{let{url:t,body:n,depth:r,defaultNamespace:i=`d`,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e,l=await A({url:t,init:{method:`REPORT`,headers:O(D({depth:r,...a}),o),namespace:i,body:n},headersToExclude:o,fetchOptions:s,fetch:c}),u=l[0];if(i===`c`&&n?.[`calendar-query`]!=null&&l.length===1&&u&&u.status===404&&T(t,u.href,t)&&!u.error&&Object.keys(u.props??{}).length===0&&typeof u.raw==`object`&&u.raw!==null&&u.raw.multistatus?.response?.propstat==null)return[];let d=l.find(e=>!e.ok||e.status&&e.status>=400);if(d)throw Error(`Collection query failed: ${d.status} ${d.statusText}. ${typeof d.raw==`string`?`Raw response: ${d.raw.slice(0,4096)}`:``}`);if((n?.[`calendar-query`]||n?.[`calendar-multiget`]||n?.[`addressbook-query`]||n?.[`addressbook-multiget`])&&l.some(e=>!e.raw?.multistatus))throw Error(`Collection query failed: expected a DAV multistatus response`);if((n?.[`calendar-query`]||n?.[`calendar-multiget`]||n?.[`addressbook-query`]||n?.[`addressbook-multiget`])&&l.some(e=>e.raw?.multistatus?.response&&(typeof e.href!=`string`||!e.href)))throw Error(`Collection query failed: missing href in DAV response`);let f=l[0];return l.length===1&&f&&(!f.raw||f.raw.multistatus&&!f.raw.multistatus.response)&&f.status&&f.status<300?[]:l},ye=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return A({url:t,init:{method:`MKCOL`,headers:O(D({depth:r,...i}),a),namespace:`d`,body:n?{mkcol:{_attributes:E([`DAV:`,`urn:ietf:params:xml:ns:caldav`,`urn:ietf:params:xml:ns:carddav`,`http://calendarserver.org/ns/`,`http://apple.com/ns/ical/`]),set:{prop:n}}}:void 0},headersToExclude:a,fetchOptions:o,fetch:s})},R=async e=>{let{collection:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=(await j({url:t.url,props:{"d:supported-report-set":{}},depth:`0`,headers:O(n,r),headersToExclude:r,fetchOptions:i,fetch:a}))[0]?.props?.supportedReportSet?.supportedReport;return o?(Array.isArray(o)?o:[o]).map(e=>e?.report?Object.keys(e.report)[0]:void 0).filter(e=>typeof e==`string`&&e.length>0):[]},be=async e=>{let{collection:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=(await j({url:t.url,props:{"cs:getctag":{}},depth:`0`,headers:O(n,r),headersToExclude:r,fetchOptions:i,fetch:a})).find(e=>T(t.url,e.href,t.url));if(!o)throw Error(`Collection does not exist on server`);let s=o.propStats?.length&&o.propStats.every(e=>e.status===404&&y(e.props,`getctag`));if(!o.ok&&!s)throw Error(`Collection status check failed: ${o.status} ${o.statusText}`);let c=I(o.props?.getctag);return{isDirty:t.ctag==null||c==null||`${t.ctag}`!=`${c}`,newCtag:c}},xe=e=>{let{url:t,props:n,headers:r,syncLevel:i,syncToken:a,headersToExclude:o,fetchOptions:s,fetch:c}=e;return A({url:t,init:{method:`REPORT`,namespace:`d`,headers:O({...r},o),body:{"sync-collection":{_attributes:E([`urn:ietf:params:xml:ns:caldav`,`urn:ietf:params:xml:ns:carddav`,`DAV:`]),"sync-level":i,"sync-token":a,"d:prop":n}}},headersToExclude:o,fetchOptions:s,fetch:c})},z=async e=>{let{collection:t,method:n,headers:r,headersToExclude:i,account:a,detailedResult:o,fetchOptions:s={},fetch:c}=e,l=[`accountType`,`homeUrl`];if(!a||!_(a,l))throw Error(a?`account must have ${v(a,l)} before smartCollectionSync`:`no account for smartCollectionSync`);let u=n??(t.reports?.includes(`syncCollection`)?`webdav`:`basic`);if(_e(`smart collection sync with type ${a.accountType} and method ${u}`),u===`webdav`){let e=e=>xe({url:t.url,props:{"d:getetag":{},[`${a.accountType===`caldav`?`c`:`card`}:${a.accountType===`caldav`?`calendar-data`:`address-data`}`]:{},"d:displayname":{}},syncLevel:1,syncToken:e,headers:O(r,i),headersToExclude:i,fetchOptions:s,fetch:c}),n=t.syncToken,l=await e(n);n&&l.length===1&&l[0].status>=400&&l[0].status<500&&typeof l[0].raw==`string`&&l[0].raw.includes(`valid-sync-token`)&&(_e(`sync token rejected by server, starting a full sync`),n=void 0,l=await e(n));let u=e=>typeof e.href==`string`&&F(e.href,t.url)!==F(t.url,t.url)&&!e.props?.resourcetype?.collection,d=l.find(e=>(!e.ok||e.status>=400)&&!(e.status===404&&!e.propStats?.length&&u(e)));if(d)throw Error(`Collection sync failed: ${d.status} ${d.statusText}`);if(l.some(e=>e.raw&&!e.raw.multistatus))throw Error(`Collection sync failed: expected a DAV multistatus response`);if(l.some(e=>e.raw?.multistatus?.response&&(typeof e.href!=`string`||!e.href)))throw Error(`Collection sync failed: missing href in DAV response`);let f=l.filter(u),p=f.filter(e=>e.status!==404).map(e=>e.href),m=f.filter(e=>e.status===404).map(e=>e.href),h=t.objectMultiGet;if(p.length>0&&!h)throw Error(`collection.objectMultiGet is required for webdav sync changes`);let g=p.length?await h?.({url:t.url,props:{"d:getetag":{},[`${a.accountType===`caldav`?`c`:`card`}:${a.accountType===`caldav`?`calendar-data`:`address-data`}`]:{}},objectUrls:p,depth:`1`,headers:O(r,i),headersToExclude:i,fetchOptions:s,fetch:c})??[]:[];he(g,a.accountType===`caldav`?`calendarData`:`addressData`,p,t.url,`Collection sync multi-get failed`);let _=g.map(e=>({url:ve(e.href??``,t.url),etag:I(e.props?.getetag),data:a?.accountType===`caldav`?e.props?.calendarData?._cdata??e.props?.calendarData:e.props?.addressData?._cdata??e.props?.addressData})),v=t.objects??[],y=m.map(e=>({url:ve(e,t.url),etag:``})),{created:b,updated:x,deleted:S,unchanged:ee}=de(v,_,t.url,!!n,y);return{...t,objects:o?{created:b,updated:x,deleted:S}:[...ee,...b,...x],syncToken:I(l[0]?.raw?.multistatus?.syncToken)??t.syncToken}}if(u===`basic`){let{isDirty:e,newCtag:n}=await be({collection:t,headers:O(r,i),headersToExclude:i,fetchOptions:s,fetch:c});if(!e)return o?{...t,objects:{created:[],updated:[],deleted:[]}}:t;let a=t.objects??[];if(!t.fetchObjects)throw Error(`collection.fetchObjects is required for basic sync changes`);let l=await t.fetchObjects({collection:t,headers:O(r,i),headersToExclude:i,fetchOptions:s,fetch:c})??[],{created:u,updated:d,deleted:f,unchanged:p}=de(a,l,t.url);return{...t,objects:o?{created:u,updated:d,deleted:f}:[...p,...u,...d],ctag:n}}return o?{...t,objects:{created:[],updated:[],deleted:[]}}:t},Se=async e=>z({...e,detailedResult:!0}),Ce=(e,t)=>{if(!t||t.includes(`/`)||/^(?:\.|%2e){1,2}$/i.test(t))throw Error(`Invalid object filename "${t}": expected a single path segment`);let n=t.replace(/%(?![\da-f]{2})|[?#\\\x00-\x20\x7f]/gi,e=>`%${e.charCodeAt(0).toString(16).toUpperCase().padStart(2,`0`)}`);return new URL(`./${n}`,C(e)).href};var we=/* @__PURE__ */ o({addressBookMultiGet:()=>V,addressBookQuery:()=>B,createVCard:()=>De,deleteVCard:()=>ke,fetchAddressBooks:()=>H,fetchVCards:()=>Ee,updateVCard:()=>Oe});const Te=(0,l.default)(`tsdav:addressBook`),B=async e=>{let{url:t,props:n,filters:r,depth:i,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e;return L({url:t,body:{"addressbook-query":D({_attributes:E([`urn:ietf:params:xml:ns:carddav`,`DAV:`]),"d:prop":n,filter:r??{"prop-filter":{_attributes:{name:`FN`}}}})},defaultNamespace:`card`,depth:i,headers:O(a,o),headersToExclude:o,fetchOptions:s,fetch:c})},V=async e=>{let{url:t,props:n,objectUrls:r,depth:i,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e;return L({url:t,body:{"addressbook-multiget":D({_attributes:E([`DAV:`,`urn:ietf:params:xml:ns:carddav`]),"d:prop":n,"d:href":r})},defaultNamespace:`card`,depth:i,headers:O(a,o),headersToExclude:o,fetchOptions:s,fetch:c})},H=async e=>{let{account:t,headers:n,props:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e??{},s=[`homeUrl`,`rootUrl`];if(!t||!_(t,s))throw Error(t?`account must have ${v(t,s)} before fetchAddressBooks`:`no account for fetchAddressBooks`);let c=await j({url:t.homeUrl,props:{...r??{"d:displayname":{},"cs:getctag":{},"d:resourcetype":{},"d:sync-token":{}},"d:resourcetype":{}},depth:`1`,headers:O(n,i),headersToExclude:i,fetchOptions:a,fetch:o});return pe(c,`Address book discovery failed`),Promise.all(c.filter(e=>Object.keys(e.props?.resourcetype??{}).includes(`addressbook`)).map(e=>{let n=e.props?.displayname?._cdata??e.props?.displayname;return Te(`Found address book named ${typeof n==`string`?n:``}, + props: ${JSON.stringify(e.props)}`),{url:new URL(e.href??``,C(t.rootUrl??``)).href,ctag:I(e.props?.getctag),displayName:typeof n==`string`?n:``,resourcetype:Object.keys(e.props?.resourcetype??{}),syncToken:I(e.props?.syncToken)}}).map(async e=>({...e,reports:await R({collection:e,headers:O(n,i),headersToExclude:i,fetchOptions:a,fetch:o})})))},Ee=async e=>{let{addressBook:t,headers:n,objectUrls:r,headersToExclude:i,urlFilter:a=e=>!!e,useMultiGet:o=!0,fetchOptions:s={},fetch:c}=e;Te(`Fetching vcards from ${t?.url}`);let l=[`url`];if(!t||!_(t,l))throw Error(t?`addressBook must have ${v(t,l)} before fetchVCards`:`cannot fetchVCards for undefined addressBook`);let u=(r??(await B({url:t.url,props:{"d:getetag":{}},depth:`1`,headers:O(n,i),headersToExclude:i,fetchOptions:s,fetch:c})).map(e=>e.href??``)).filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.startsWith(`http`)?e:new URL(e,C(t.url)).href).filter(e=>!w(e,t.url)).filter(a).map(e=>{let t=new URL(e);return`${t.pathname}${t.search}`}),d=new Set(u.map(e=>F(e,t.url))),f=[];return u.length>0&&(o?f=await V({url:t.url,props:{"d:getetag":{},"card:address-data":{}},objectUrls:u,depth:`1`,headers:O(n,i),headersToExclude:i,fetchOptions:s,fetch:c}):(f=await B({url:t.url,props:{"d:getetag":{},"card:address-data":{}},depth:`1`,headers:O(n,i),headersToExclude:i,fetchOptions:s,fetch:c}),f=f.filter(e=>!!e.href&&d.has(F(e.href,t.url))))),he(f,`addressData`,u,t.url,`VCard fetch failed`),f.map(e=>({url:new URL(e.href??``,C(t.url)).href,etag:I(e.props?.getetag),data:e.props?.addressData?._cdata??e.props?.addressData}))},De=async e=>{let{addressBook:t,vCardString:n,filename:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return M({url:Ce(t.url,r),data:n,headers:O({"content-type":`text/vcard; charset=utf-8`,"If-None-Match":`*`,...i},a),headersToExclude:a,fetchOptions:o,fetch:s})},Oe=async e=>{let{vCard:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return N({url:t.url,data:t.data,etag:t.etag,headers:O({"content-type":`text/vcard; charset=utf-8`,...n},r),headersToExclude:r,fetchOptions:i,fetch:a})},ke=async e=>{let{vCard:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return P({url:t.url,etag:t.etag,headers:O(n,r),headersToExclude:r,fetchOptions:i,fetch:a})};var Ae=/* @__PURE__ */ o({calendarMultiGet:()=>W,calendarQuery:()=>U,createCalendarObject:()=>Re,deleteCalendarObject:()=>Be,fetchCalendarObjects:()=>K,fetchCalendarUserAddresses:()=>Ie,fetchCalendars:()=>G,freeBusyQuery:()=>Ue,makeCalendar:()=>Le,syncCalendars:()=>Ve,syncCalendarsDetailed:()=>He,updateCalendarObject:()=>ze});const je=(0,l.default)(`tsdav:calendar`),Me=/^\d{4}(-\d\d(-\d\d(T\d\d:\d\d(:\d\d)?(\.\d+)?(([+-]\d\d:\d\d)|Z)?)?)?)?$/i,Ne=/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(\.\d+)?(([+-]\d\d:\d\d)|Z)?$/i,Pe=e=>{let{start:t,end:n}=e;if(!(Me.test(t)&&Me.test(n)||Ne.test(t)&&Ne.test(n)))throw Error(`invalid timeRange format, not in ISO8601`);if(Number.isNaN(new Date(t).getTime())||Number.isNaN(new Date(n).getTime()))throw Error(`invalid timeRange: start or end is not a valid date`);if(new Date(t).getTime()>=new Date(n).getTime())throw Error(`invalid timeRange: start must be before end`)},Fe=e=>{let t=[];return Array.isArray(e)?t=e.map(e=>e?._attributes?.name):e&&typeof e==`object`&&(t=[e._attributes?.name]),t.filter(e=>typeof e==`string`&&e.length>0)},Ie=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`principalUrl`,`rootUrl`];if(!_(t,o))throw Error(`account must have ${v(t,o)} before fetchUserAddresses`);je(`Fetch user addresses from ${t.principalUrl}`);let s=(await j({url:t.principalUrl,props:{"c:calendar-user-address-set":{}},depth:`0`,headers:O(n,r),headersToExclude:r,fetchOptions:i,fetch:a})).find(e=>T(t.principalUrl,e.href,t.rootUrl));if(!s||!s.ok)throw Error(`cannot find calendarUserAddresses`);let c=s?.props?.calendarUserAddressSet?.href,l=[];Array.isArray(c)?l=c:c&&(l=[c]);let u=l.filter(e=>typeof e==`string`&&e.length>0);return je(`Fetched calendar user addresses ${u}`),u},U=async e=>{let{url:t,props:n,filters:r,timezone:i,depth:a,headers:o,headersToExclude:s,fetchOptions:c={},fetch:l}=e;return L({url:t,body:{"calendar-query":D({_attributes:E([`urn:ietf:params:xml:ns:caldav`,`http://calendarserver.org/ns/`,`http://apple.com/ns/ical/`,`DAV:`]),"d:prop":n,filter:r,timezone:i})},defaultNamespace:`c`,depth:a,headers:O(o,s),headersToExclude:s,fetchOptions:c,fetch:l})},W=async e=>{let{url:t,props:n,objectUrls:r,filters:i,timezone:a,depth:o,headers:s,headersToExclude:c,fetchOptions:l={},fetch:u}=e;return L({url:t,body:{"calendar-multiget":D({_attributes:E([`DAV:`,`urn:ietf:params:xml:ns:caldav`]),"d:prop":n,"d:href":r,filter:i,timezone:a})},defaultNamespace:`c`,depth:o,headers:O(s,c),headersToExclude:c,fetchOptions:l,fetch:u})},Le=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return A({url:t,init:{method:`MKCALENDAR`,headers:O(D({depth:r,...i}),a),namespace:`d`,body:{"c:mkcalendar":{_attributes:E([`DAV:`,`urn:ietf:params:xml:ns:caldav`,`http://apple.com/ns/ical/`]),set:{prop:n}}}},headersToExclude:a,fetchOptions:o,fetch:s})},G=async e=>{let{headers:t,account:n,props:r,projectedProps:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e??{},c=[`homeUrl`,`rootUrl`];if(!n||!_(n,c))throw Error(n?`account must have ${v(n,c)} before fetchCalendars`:`no account for fetchCalendars`);let l=await j({url:n.homeUrl,props:{...r??{"c:calendar-description":{},"c:calendar-timezone":{},"d:displayname":{},"ca:calendar-color":{},"cs:getctag":{},"d:resourcetype":{},"c:supported-calendar-component-set":{},"d:sync-token":{}},"d:resourcetype":{},"c:supported-calendar-component-set":{}},depth:`1`,headers:O(t,a),headersToExclude:a,fetchOptions:o,fetch:s});return pe(l,`Calendar discovery failed`),Promise.all(l.filter(e=>Object.keys(e.props?.resourcetype??{}).includes(`calendar`)).filter(e=>{let t=Fe(e.props?.supportedCalendarComponentSet?.comp);return t.length===0||t.some(e=>Object.values(m).includes(e))}).map(e=>{let t=e.props?.calendarDescription,r=e.props?.calendarTimezone,a=e.props?.supportedCalendarComponentSet?.comp,o=Object.entries(e.props??{}).filter(([e])=>i?.[e]);return{description:typeof t==`string`?t:``,timezone:typeof r==`string`?r:``,url:new URL(e.href??``,C(n.rootUrl??``)).href,ctag:I(e.props?.getctag),calendarColor:e.props?.calendarColor,displayName:I(e.props?.displayname),components:Fe(a),resourcetype:Object.keys(e.props?.resourcetype??{}),syncToken:I(e.props?.syncToken),...i&&o.length>0?{projectedProps:Object.fromEntries(o)}:{}}}).map(async e=>({...e,reports:await R({collection:e,headers:O(t,a),headersToExclude:a,fetchOptions:o,fetch:s})})))},K=async e=>{let{calendar:t,objectUrls:n,filters:r,timeRange:i,headers:a,expand:o,urlFilter:s=e=>!!e?.includes(`.ics`),useMultiGet:c=!0,headersToExclude:l,fetchOptions:u={},fetch:d}=e;if(o&&!i)throw Error(`timeRange is required when expand is true`);i&&Pe(i),je(`Fetching calendar objects from ${t?.url}`);let f=[`url`];if(!t||!_(t,f))throw Error(t?`calendar must have ${v(t,f)} before fetchCalendarObjects`:`cannot fetchCalendarObjects for undefined calendar`);let p=r??[{"comp-filter":{_attributes:{name:`VCALENDAR`},"comp-filter":{_attributes:{name:`VEVENT`},...i?{"time-range":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}}}],m=[];n||(m=await U({url:t.url,props:{"d:getetag":{},...o&&i?{"c:calendar-data":{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}}:{}},filters:p,depth:`1`,headers:O(a,l),headersToExclude:l,fetchOptions:u,fetch:d}));let h=(n??m.map(e=>e.href??``)).filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.startsWith(`http`)?e:new URL(e,C(t.url)).href).filter(s).map(e=>{let t=new URL(e);return`${t.pathname}${t.search}`}),g=new Set(h.map(e=>F(e,t.url))),y=[];return h.length>0&&(o&&!n?y=m.filter(e=>{let n=(e.href??``).startsWith(`http`)?e.href:new URL(e.href??``,C(t.url)).href;return s(n??``)}):c?y=await W({url:t.url,props:{"d:getetag":{},"c:calendar-data":{...o&&i?{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}},objectUrls:h,depth:`1`,headers:O(a,l),headersToExclude:l,fetchOptions:u,fetch:d}):(y=await U({url:t.url,props:{"d:getetag":{},"c:calendar-data":{...o&&i?{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}},filters:p,depth:`1`,headers:O(a,l),headersToExclude:l,fetchOptions:u,fetch:d}),y=y.filter(e=>{let n=(e.href??``).startsWith(`http`)?e.href??``:new URL(e.href??``,C(t.url)).href;return g.has(F(n,t.url))}))),he(y,`calendarData`,h,t.url,`Calendar object fetch failed`),y.map(e=>({url:new URL(e.href??``,C(t.url)).href,etag:I(e.props?.getetag),data:e.props?.calendarData?._cdata??e.props?.calendarData}))},Re=async e=>{let{calendar:t,iCalString:n,filename:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return M({url:Ce(t.url,r),data:n,headers:O({"content-type":`text/calendar; charset=utf-8`,"If-None-Match":`*`,...i},a),headersToExclude:a,fetchOptions:o,fetch:s})},ze=async e=>{let{calendarObject:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return N({url:t.url,data:t.data,etag:t.etag,headers:O({"content-type":`text/calendar; charset=utf-8`,...n},r),headersToExclude:r,fetchOptions:i,fetch:a})},Be=async e=>{let{calendarObject:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return P({url:t.url,etag:t.etag,headers:O(n,r),headersToExclude:r,fetchOptions:i,fetch:a})},Ve=async e=>{let{oldCalendars:t,account:n,detailedResult:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;if(!n)throw Error(`Must have account before syncCalendars`);let c=t??n.calendars??[],l=await G({account:n,headers:O(i,a),headersToExclude:a,fetchOptions:o,fetch:s}),u=n.rootUrl??n.homeUrl??n.serverUrl,d=new Map(c.map(e=>[F(e.url,u),e])),f=new Map(l.map(e=>[F(e.url,u),e])),p=l.filter(e=>!d.has(F(e.url,u))),m=[],h=[],g=[];for(let e of c){let t=f.get(F(e.url,u));t?!t.syncToken&&!t.ctag||t.syncToken&&t.syncToken!==e.syncToken||t.ctag&&t.ctag!==e.ctag?m.push({local:e,remote:t}):h.push(e):g.push(e)}je(`updated calendars: ${m.map(({remote:e})=>e.displayName)}`);let _=await Promise.all(m.map(async({local:e,remote:t})=>{let r=async e=>{if(!e)return[];let{collection:t,...n}=e;return K({...n,calendar:t,filters:{"comp-filter":{_attributes:{name:`VCALENDAR`}}},urlFilter:e=>F(e,t.url)!==F(t.url,t.url)})},c={...t,ctag:e.ctag,syncToken:e.syncToken,objects:e.objects,objectMultiGet:W,fetchObjects:r},l=await z({collection:c,detailedResult:!1,headers:O(i,a),headersToExclude:a,account:n,fetchOptions:o,fetch:s});return{...l,ctag:t.reports?.includes(`syncCollection`)?t.ctag??l.ctag:l.ctag??t.ctag,syncToken:t.reports?.includes(`syncCollection`)?l.syncToken:t.syncToken??l.syncToken}}));return r?{created:p,updated:_,deleted:g}:[...h,...p,..._]},He=async e=>Ve({...e,detailedResult:!0}),Ue=async e=>{let{url:t,timeRange:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;if(!n)throw Error(`timeRange is required`);Pe(n);let c=(await L({url:t,body:{"free-busy-query":D({_attributes:E([`urn:ietf:params:xml:ns:caldav`]),"c:time-range":{_attributes:{start:`${new Date(n.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(n.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}})},defaultNamespace:`c`,depth:r,headers:O(i,a),headersToExclude:a,fetchOptions:o,fetch:s}))[0];if(!c)throw Error(`freeBusyQuery returned no response`);return c},We=[[7,12,17,22],[5,9,14,20],[4,11,16,23],[6,10,15,21]],Ge=Array.from({length:64},(e,t)=>Math.floor(Math.abs(Math.sin(t+1))*2**32)),Ke=e=>{let t=``;for(let n=0;n<4;n+=1)t+=(e>>>n*8&255).toString(16).padStart(2,`0`);return t},qe=e=>{let t=new TextEncoder().encode(e),n=(t.length+8>>>6)+1<<6,r=new Uint8Array(n);r.set(t),r[t.length]=128;let i=new DataView(r.buffer),a=t.length*8;i.setUint32(n-8,a>>>0,!0),i.setUint32(n-4,Math.floor(a/2**32),!0);let o=1732584193,s=4023233417,c=2562383102,l=271733878;for(let e=0;e>>4][o%4];t=a,a=r,r=n,n=n+(l<>>32-u)|0}o=o+t|0,s=s+n|0,c=c+r|0,l=l+a|0}return Ke(o)+Ke(s)+Ke(c)+Ke(l)},Je=(0,l.default)(`tsdav:digestAuth`),Ye=/[!#$%&'*+.^_`|~0-9A-Za-z-]+/y,Xe=e=>{let t=[],n,r=0,i=t=>{for(;r{let t=(e.algorithm??`MD5`).toUpperCase();if(e.realm==null||!e.nonce||!Ze.includes(t))return;let n=e.qop?.split(`,`).map(e=>e.trim().toLowerCase());if((!n||n.includes(`auth`))&&(n||!t.endsWith(`-SESS`)))return{realm:e.realm,nonce:e.nonce,opaque:e.opaque,domain:e.domain,qop:n?`auth`:void 0,algorithm:t,stale:e.stale?.toLowerCase()===`true`}},$e=(e,{unlessBasic:t=!1,allowSHA256:n=!0}={})=>{let r=Xe(e??``);if(!(t&&r.some(({scheme:e})=>e===`basic`)))return r.filter(({scheme:e})=>e===`digest`).map(({params:e})=>Qe(e)).filter(e=>e!=null).filter(e=>n||!e.algorithm.startsWith(`SHA`)).sort((e,t)=>Ze.indexOf(e.algorithm)-Ze.indexOf(t.algorithm))[0]},et=e=>Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);var q=class extends Error{constructor(){super(`tsdav: Digest authentication requires the WebCrypto API (globalThis.crypto), available in Node.js >= 19, browsers, Bun and Deno. On Node.js 18, assign webcrypto from node:crypto to globalThis.crypto.`),this.name=`DigestUnsupportedError`}};const tt=e=>{let{crypto:t}=globalThis;if(!t?.getRandomValues||e?.startsWith(`SHA`)&&!t.subtle)throw new q;return t},nt=async(e,t)=>e.startsWith(`MD5`)?qe(t):et(new Uint8Array(await tt(e).subtle.digest(`SHA-256`,new TextEncoder().encode(t)))),J=e=>`"${e.replace(/["\\]/g,`\\$&`)}"`,rt=e=>/^[\x20-\x7e]*$/.test(e)?`username=${J(e)}`:`username*=UTF-8''${encodeURIComponent(e).replace(/['()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}`,it=async e=>{let{challenge:t,username:n,password:r,method:i,uri:a,cnonce:o}=e,{realm:s,nonce:c,qop:l,algorithm:u}=t,d=e.nc.toString(16).padStart(8,`0`),f=await nt(u,`${n}:${s}:${r}`);u.endsWith(`-SESS`)&&(f=await nt(u,`${f}:${c}:${o}`));let p=await nt(u,`${i}:${a}`),m=await nt(u,l?`${f}:${c}:${d}:${o}:${l}:${p}`:`${f}:${c}:${p}`);return`Digest ${[rt(n),`realm=${J(s)}`,`uri=${J(a)}`,`algorithm=${u.replace(`-SESS`,`-sess`)}`,`nonce=${J(c)}`,...l?[`nc=${d}`,`cnonce=${J(o)}`,`qop=${l}`]:[],`response=${J(m)}`,...t.opaque==null?[]:[`opaque=${J(t.opaque)}`]].join(`, `)}`},at=()=>et(tt().getRandomValues(/* @__PURE__ */ new Uint8Array(16))),Y=e=>{if(e instanceof URL)return e;if(typeof e==`string`)try{return new URL(e)}catch{return}},ot=e=>typeof e!=`object`||!e||!(typeof e.getReader==`function`||Symbol.asyncIterator in e),st=[301,302,303,307,308],ct=[`content-encoding`,`content-language`,`content-location`,`content-type`],lt=(e,t)=>{let n=(t.method??`GET`).toUpperCase();if(e===303&&n!==`GET`&&n!==`HEAD`||(e===301||e===302)&&n===`POST`){let e=new Headers(t.headers);for(let t of ct)e.delete(t);return{...t,method:`GET`,body:void 0,headers:e}}return t},ut=e=>{let t=new Headers(e.headers);return t.delete(`authorization`),{...e,headers:t}},dt=(e,t)=>e.domain?.trim()?e.domain.trim().split(/\s+/).flatMap(e=>{try{if(!e.startsWith(`/`)&&!/^[a-z][a-z\d+.-]*:/i.test(e))return[];let n=new URL(e,`${t.origin}/`);return n.hash=``,n.origin===t.origin?[n.href]:[]}catch{return[]}}):[`${t.origin}/`],ft=(e=!0)=>({active:e,challenges:/* @__PURE__ */ new Map}),pt=e=>{let{credentials:t,fetch:n}=e,r=n??h,i=e.state??ft(),a=async(e,n,r,a)=>{let o=i.challenges.get(n.origin)?.find(e=>e.scopes.some(e=>n.href.startsWith(e)));if(!o)return ut(e);o.nc+=1;let{challenge:s,nc:c}=o,l=await it({challenge:s,username:t.username??``,password:t.password??``,method:r,uri:a,nc:c,cnonce:s.algorithm.endsWith(`-SESS`)?o.cnonce:at()}),u=new Headers(e.headers);return u.set(`authorization`,l),{...e,headers:u}},o=(e,t)=>{let n=e.headers.get(`www-authenticate`),r={unlessBasic:!i.active},a=!globalThis.crypto?.subtle&&$e(n,{...r,allowSHA256:!1})||$e(n,r);if(!a)return!1;try{tt(a.algorithm)}catch(e){if(!i.active&&e instanceof q)return!1;throw e}i.active||=(Je(`Server only offers Digest authentication, switching from Basic`),!0),Je(`Digest challenge received for ${t.origin}${a.stale?` (stale nonce)`:``}`);let o=i.challenges.get(t.origin)??[],s=dt(a,t),c=o.find(e=>e.challenge.realm===a.realm&&e.challenge.algorithm===a.algorithm&&e.challenge.nonce===a.nonce);return i.challenges.set(t.origin,[{challenge:a,scopes:s,nc:c?.nc??0,cnonce:c?.cnonce??at()},...o.filter(e=>e.challenge.realm!==a.realm)]),!0},s=async(e,t,n,i)=>{let s=(t.method??`GET`).toUpperCase(),c=`${n.pathname}${n.search}`,l=await r(e,await a(t,n,s,c));return l.status!==401||!i||!ot(t.body)||!o(l,n)?l:(await l.body?.cancel().catch(()=>void 0),r(e,await a(t,n,s,c)))};return async(e,t={})=>{let n=Y(e);if(!n)return r(e,t);i.active&&(t={...t,credentials:t.credentials??`omit`});let a=!1;if(!i.active){let i=await r(e,t);if(i.status!==401||!ot(t.body)||(Y(i.url??``)??n).origin!==n.origin||!o(i,Y(i.url)??n))return i;await i.body?.cancel().catch(()=>void 0),a=!0,t={...t,credentials:t.credentials??`omit`};let c=Y(i.url)??n;if(c.href!==n.href){let e=(t.method??`GET`).toUpperCase();if(e!==`GET`&&e!==`HEAD`)throw TypeError(`tsdav: Digest negotiation after an automatic redirect requires the final DAV URL. Set serverUrl and collection URLs to their canonical locations.`);return s(c.href,{...t,redirect:`error`},c,!1)}}if((t.redirect??`follow`)!==`follow`||!ot(t.body))return s(e,t,n,!a);let c=e,l=n,u={...t,redirect:`manual`},d=!1;for(let e=0;;e+=1){let t=d?await r(c,u):await s(c,u,l,!a);if(a=!1,t.type===`opaqueredirect`){let e=(u.method??`GET`).toUpperCase();if(e!==`GET`&&e!==`HEAD`)throw TypeError(`tsdav: Digest authentication cannot safely follow an opaque browser redirect for this method. Use the final DAV URL, including its trailing slash.`);let t=await r(c,{...ut(u),redirect:`follow`}),i=Y(t.url);return!i||i.origin!==n.origin||d||t.status!==401||!o(t,i)?t:(await t.body?.cancel().catch(()=>void 0),s(i.href,{...u,redirect:`error`},i,!1))}let i=t.headers.get(`location`);if(!st.includes(t.status)||!i)return t;if(e===20)throw TypeError(`tsdav: too many redirects`);await t.body?.cancel().catch(()=>void 0),l=new URL(i,l),c=l.href,u=lt(t.status,u),l.origin!==n.origin&&(d=!0,u=ut(u))}}};var mt=/* @__PURE__ */ o({createAccount:()=>Z,fetchHomeUrl:()=>yt,fetchPrincipalUrl:()=>vt,serviceDiscovery:()=>gt});const X=(0,l.default)(`tsdav:account`),ht=(e,t)=>{let n=[t,e,new URL(`/`,e).href];return n.filter((e,t)=>n.indexOf(e)===t)},gt=async e=>{X(`Service discovery...`);let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=a??h,s=new URL(t.serverUrl),{headers:c,...l}=i,u=new URL(`/.well-known/${t.accountType}`,s);u.protocol=s.protocol??`http`;let d=e=>{if(e.status>=300&&e.status<400){let t=e.headers.get(`Location`);if(typeof t==`string`&&t.length)return X(`Service discovery redirected to ${t}`),new URL(t,u).href}};try{let e=d(await o(u.href,{...l,method:`PROPFIND`,headers:O(k({"Content-Type":`text/xml;charset=UTF-8`},n,c),r),body:` -`,redirect:`manual`}));if(e)return e}catch(e){if(e instanceof q)throw e;X(`Service discovery PROPFIND failed: ${e.stack}`)}try{let e=d(await o(u.href,{...l,method:`GET`,body:void 0,headers:O(k(n,c),r),redirect:`manual`}));if(e)return e}catch(e){if(e instanceof q)throw e;X(`Service discovery GET failed: ${e.stack}`)}return s.href},ht=e=>{if(typeof e==`string`&&e.trim().length>0)return e.trim();if(Array.isArray(e)){for(let t of e){let e=ht(t);if(e)return e}return}if(e&&typeof e==`object`){if(`_cdata`in e&&typeof e._cdata==`string`){let t=e._cdata.trim();if(t.length>0)return t}if(`_text`in e&&typeof e._text==`string`){let t=e._text.trim();if(t.length>0)return t}}},gt=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`rootUrl`];if(!_(t,o))throw Error(`account must have ${v(t,o)} before fetchPrincipalUrl`);X(`Fetching principal url from path ${t.rootUrl}`);let[s]=await j({url:t.rootUrl,props:{"d:current-user-principal":{}},depth:`0`,headers:O(n,r),headersToExclude:r,fetchOptions:i,fetch:a});if(!s?.ok)throw X(`Fetch principal url failed: ${s?.statusText??`empty response`}`),s?.status===401?Error(`Invalid credentials: PROPFIND ${t.rootUrl} returned 401 Unauthorized`):Error(`cannot find principalUrl`);let c=ht(s.props?.currentUserPrincipal?.href);if(!c)throw X(`Fetch principal url failed: missing current-user-principal href`),Error(`cannot find principalUrl`);return X(`Fetched principal url ${c}`),new URL(c,C(t.rootUrl)).href},_t=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`principalUrl`,`rootUrl`];if(!_(t,o))throw Error(`account must have ${v(t,o)} before fetchHomeUrl`);X(`Fetch home url from ${t.principalUrl}`);let s=await j({url:t.principalUrl,props:t.accountType===`caldav`?{"c:calendar-home-set":{}}:{"card:addressbook-home-set":{}},depth:`0`,headers:O(n,r),headersToExclude:r,fetchOptions:i,fetch:a}),c=s.find(e=>T(t.principalUrl,e.href,t.rootUrl));if(!c||!c.ok)throw X(`Fetch home url failed with status ${c?.statusText} and error ${JSON.stringify(s.map(e=>e.error))}`),Error(`cannot find homeUrl`);let l=ht(t.accountType===`caldav`?c.props?.calendarHomeSet?.href:c.props?.addressbookHomeSet?.href);if(!l)throw X(`Fetch home url failed: server did not return a ${t.accountType===`caldav`?`calendar-home-set`:`addressbook-home-set`} href`),Error(`cannot find homeUrl`);let u=new URL(l,C(t.rootUrl)).href;return X(`Fetched home url ${u}`),u},Z=async e=>{let{account:t,headers:n,loadCollections:r=!1,loadObjects:i=!1,headersToExclude:a,fetchOptions:o={},fetch:s}=e,c={...t},l=t.rootUrl??await mt({account:t,headers:O(n,a),headersToExclude:a,fetchOptions:o,fetch:s});if(t.rootUrl)c.rootUrl=t.rootUrl;else if(t.principalUrl)c.rootUrl=l;else{let e=async(t,r=0,i)=>{let l=t[r];if(!l)throw i??Error(`cannot find principalUrl`);try{return{rootUrl:l,principalUrl:await gt({account:{...c,rootUrl:l},headers:O(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}}catch(n){if(n instanceof q)throw n;let a=i?.message.startsWith(`Invalid credentials`);return e(t,r+1,a?i:n)}},{rootUrl:r,principalUrl:i}=await e(pt(t.serverUrl,l));c.rootUrl=r,c.principalUrl=i}return c.principalUrl=t.principalUrl??c.principalUrl??await gt({account:c,headers:O(n,a),headersToExclude:a,fetchOptions:o,fetch:s}),c.homeUrl=t.homeUrl??await _t({account:c,headers:O(n,a),headersToExclude:a,fetchOptions:o,fetch:s}),(r||i)&&(t.accountType===`caldav`?c.calendars=await G({headers:O(n,a),headersToExclude:a,account:c,fetchOptions:o,fetch:s}):t.accountType===`carddav`&&(c.addressBooks=await V({headers:O(n,a),headersToExclude:a,account:c,fetchOptions:o,fetch:s}))),i&&(t.accountType===`caldav`&&c.calendars?c.calendars=await Promise.all(c.calendars.map(async e=>({...e,objects:await K({calendar:e,filters:{"comp-filter":{_attributes:{name:`VCALENDAR`}}},urlFilter:t=>!w(t,e.url),headers:O(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}))):t.accountType===`carddav`&&c.addressBooks&&(c.addressBooks=await Promise.all(c.addressBooks.map(async e=>({...e,objects:await H({addressBook:e,headers:O(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}))))),c};var vt=o({defaultParam:()=>St,fetchOauthTokens:()=>Tt,getBasicAuthHeaders:()=>Ct,getBearerAuthHeaders:()=>wt,getOauthHeaders:()=>Dt,refreshAccessToken:()=>Et});const Q=(0,l.default)(`tsdav:authHelper`),$=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`;var yt=class extends Error{constructor(e){super(e),this.name=`InvalidCharacterError`}};const bt=e=>{if(e>255)throw new yt(`The string to be encoded contains characters outside of the Latin1 range.`)},xt=e=>{let t=``,n=0;for(;n(...n)=>{let r=n[0],i={...t,...r};return(t.headers||r?.headers)&&(i.headers=k(t.headers,r?.headers)),e(i)},Ct=e=>(Q(`Basic auth token generated for user "${e.username??``}"`),{authorization:`Basic ${xt(`${e.username}:${e.password}`)}`}),wt=e=>({authorization:`Bearer ${e.accessToken}`}),Tt=async(e,t,n)=>{let r=[`authorizationCode`,`redirectUrl`,`clientId`,`clientSecret`,`tokenUrl`];if(!_(e,r))throw Error(`Oauth credentials missing: ${v(e,r)}`);let i=new URLSearchParams({grant_type:`authorization_code`,code:e.authorizationCode,redirect_uri:e.redirectUrl,client_id:e.clientId,client_secret:e.clientSecret});Q(`Fetching oauth tokens from ${e.tokenUrl}`);let a=n??h,{headers:o,...s}=t??{},c=await a(e.tokenUrl,{...s,method:`POST`,body:i.toString(),headers:k({"content-type":`application/x-www-form-urlencoded`},o)});return c.ok?await c.json():(Q(`Fetch Oauth tokens failed with status ${c.status}`),{})},Et=async(e,t,n)=>{let r=[`refreshToken`,`clientId`,`clientSecret`,`tokenUrl`];if(!_(e,r))throw Error(`Oauth credentials missing: ${v(e,r)}`);let i=new URLSearchParams({client_id:e.clientId,client_secret:e.clientSecret,refresh_token:e.refreshToken,grant_type:`refresh_token`}),a=n??h,{headers:o,...s}=t??{},c=await a(e.tokenUrl,{...s,method:`POST`,body:i.toString(),headers:k({"Content-Type":`application/x-www-form-urlencoded`},o)});return c.ok?await c.json():(Q(`Refresh access token failed with status ${c.status}`),{})},Dt=async(e,t,n)=>{Q(`Fetching oauth headers`);let r={},i=!1;return e.accessToken&&(e.expiration==null&&!e.refreshToken||e.expiration!=null&&Date.now()Nt,createDAVClient:()=>Mt});const kt=async(e,t=e.fetchOptions,n=e.fetchOverride)=>{switch(e.authMethod){case`Basic`:return Ct(e.credentials);case`Bearer`:return wt(e.credentials);case`Oauth`:{let{headers:r}=await Dt(e.credentials,t,n);if(!r.authorization)throw Error(`OAuth authentication failed: token endpoint returned no access token`);return r}case`Digest`:return e.credentials.digestString==null?{}:{Authorization:`Digest ${e.credentials.digestString}`};case`Custom`:if(!e.authFunction)throw Error(`authMethod 'Custom' requires an authFunction to produce request headers`);return await e.authFunction(e.credentials)??{};default:throw Error(`Invalid auth method`)}},At=new WeakMap,jt=(e,t=e.fetchOverride,n,r=e.fetchOptions?.headers)=>{let i=e.authMethod===`Digest`&&e.credentials.digestString==null;if(!i&&e.authMethod!==`Basic`||new Headers(r).has(`authorization`)||n?.some(e=>e.toLowerCase()===`authorization`))return t;let a=At.get(e),{username:o,password:s}=e.credentials;return(!a||a.authMethod!==e.authMethod||a.username!==o||a.password!==s)&&(a={state:ut(i),authMethod:e.authMethod,username:o,password:s},At.set(e,a)),dt({credentials:e.credentials,fetch:t,state:a.state})},Mt=async e=>{let t=new Nt(e);return t.authHeaders=await kt(t),t.account=e.defaultAccountType?await Z({account:{serverUrl:e.serverUrl,credentials:e.credentials,accountType:e.defaultAccountType},headers:t.authHeaders,fetchOptions:t.fetchOptions,fetch:jt(t)}):void 0,{davRequest:t.davRequest.bind(t),propfind:t.propfind.bind(t),createAccount:async(...e)=>{if(!e[0].account.accountType)throw Error("createAccount requires an accountType; pass one via `account.accountType`.");return t.createAccount(...e)},createObject:t.createObject.bind(t),updateObject:t.updateObject.bind(t),deleteObject:t.deleteObject.bind(t),calendarQuery:t.calendarQuery.bind(t),addressBookQuery:t.addressBookQuery.bind(t),collectionQuery:t.collectionQuery.bind(t),makeCollection:t.makeCollection.bind(t),calendarMultiGet:t.calendarMultiGet.bind(t),makeCalendar:t.makeCalendar.bind(t),freeBusyQuery:t.freeBusyQuery.bind(t),syncCollection:t.syncCollection.bind(t),supportedReportSet:t.supportedReportSet.bind(t),isCollectionDirty:t.isCollectionDirty.bind(t),smartCollectionSync:t.smartCollectionSync.bind(t),smartCollectionSyncDetailed:t.smartCollectionSyncDetailed.bind(t),fetchCalendars:t.fetchCalendars.bind(t),fetchCalendarUserAddresses:t.fetchCalendarUserAddresses.bind(t),fetchCalendarObjects:t.fetchCalendarObjects.bind(t),createCalendarObject:t.createCalendarObject.bind(t),updateCalendarObject:t.updateCalendarObject.bind(t),deleteCalendarObject:t.deleteCalendarObject.bind(t),syncCalendars:t.syncCalendars.bind(t),syncCalendarsDetailed:t.syncCalendarsDetailed.bind(t),fetchAddressBooks:t.fetchAddressBooks.bind(t),addressBookMultiGet:t.addressBookMultiGet.bind(t),fetchVCards:t.fetchVCards.bind(t),createVCard:t.createVCard.bind(t),updateVCard:t.updateVCard.bind(t),deleteVCard:t.deleteVCard.bind(t)}};var Nt=class{constructor(e){this.serverUrl=e.serverUrl,this.credentials=e.credentials,this.authMethod=e.authMethod??`Basic`,this.accountType=e.defaultAccountType??`caldav`,this.authFunction=e.authFunction,this.fetchOptions=e.fetchOptions??{},this.fetchOverride=e.fetch,this.calendarMultiGet=this.calendarMultiGet.bind(this),this.addressBookMultiGet=this.addressBookMultiGet.bind(this)}async authenticate(e=!1,t=this.fetchOptions,n=this.fetchOverride){if(!e&&this.authMethod!==`Oauth`)return;if(!e&&this.authHeaders&&this.credentials.accessToken&&(this.credentials.expiration==null||Date.now(){this.authHeaders=await kt(this,t,n)};this.authentication=r();try{await this.authentication}finally{this.authentication=void 0}}async requestDefaults(e){return await this.authenticate(!1,e?.fetchOptions??this.fetchOptions,e?.fetch??this.fetchOverride),{url:this.serverUrl,headers:this.authHeaders,account:this.account,fetchOptions:this.fetchOptions,fetch:jt(this,e?.fetch,e?.headersToExclude,k(e?.headers,e?.init?.headers,(e?.fetchOptions??this.fetchOptions)?.headers))}}async invoke(e,t){let n=await this.requestDefaults(t),r=t&&{...t,fetch:n.fetch};return await St(e,n)(r)}async login(e){await this.authenticate(!0),this.account=this.accountType?await Z({account:{serverUrl:this.serverUrl,credentials:this.credentials,accountType:this.accountType},headers:this.authHeaders,loadCollections:e?.loadCollections,loadObjects:e?.loadObjects,fetchOptions:this.fetchOptions,fetch:jt(this)}):void 0}async davRequest(e){let{init:t,fetchOptions:n,...r}=e,{headers:i,...a}=t,o=await this.requestDefaults(e);return A({...r,init:{...a,headers:k(o.headers,i)},fetchOptions:n??this.fetchOptions,fetch:o.fetch})}async createObject(...e){return this.invoke(M,e[0])}async updateObject(...e){return this.invoke(N,e[0])}async deleteObject(...e){return this.invoke(P,e[0])}async propfind(...e){return this.invoke(j,e[0])}async createAccount(e){let{account:t,headers:n,headersToExclude:r,loadCollections:i,loadObjects:a,fetchOptions:o}=e,s=await this.requestDefaults(e),c=t.accountType??this.accountType;if(!c)throw Error("createAccount requires an accountType; pass one via `account.accountType` or configure `defaultAccountType` on the DAVClient.");return Z({account:{serverUrl:this.serverUrl,credentials:this.credentials,...t,accountType:c},headers:k(s.headers,n),headersToExclude:r,loadCollections:i,loadObjects:a,fetchOptions:o??this.fetchOptions,fetch:s.fetch})}async collectionQuery(...e){return this.invoke(L,e[0])}async makeCollection(...e){return this.invoke(ve,e[0])}async syncCollection(...e){return this.invoke(be,e[0])}async supportedReportSet(...e){return this.invoke(R,e[0])}async isCollectionDirty(...e){return this.invoke(ye,e[0])}async smartCollectionSync(...e){return this.invoke(z,e[0])}async smartCollectionSyncDetailed(e){return this.invoke(xe,e)}async calendarQuery(...e){return this.invoke(U,e[0])}async makeCalendar(...e){return this.invoke(Fe,e[0])}async freeBusyQuery(...e){return this.invoke(Ve,e[0])}async calendarMultiGet(...e){return this.invoke(W,e[0])}async fetchCalendars(...e){return this.invoke(G,e[0])}async fetchCalendarUserAddresses(...e){return this.invoke(Pe,e[0])}async fetchCalendarObjects(...e){return this.invoke(K,e[0])}async createCalendarObject(...e){return this.invoke(Ie,e[0])}async updateCalendarObject(...e){return this.invoke(Le,e[0])}async deleteCalendarObject(...e){return this.invoke(Re,e[0])}async syncCalendars(...e){return this.invoke(ze,e[0])}async syncCalendarsDetailed(...e){return this.invoke(Be,e[0])}async addressBookQuery(...e){return this.invoke(B,e[0])}async addressBookMultiGet(...e){return this.invoke(we,e[0])}async fetchAddressBooks(...e){return this.invoke(V,e[0])}async fetchVCards(...e){return this.invoke(H,e[0])}async createVCard(...e){return this.invoke(Te,e[0])}async updateVCard(...e){return this.invoke(Ee,e[0])}async deleteVCard(...e){return this.invoke(De,e[0])}},Pt={DAVNamespace:d,DAVNamespaceShort:p,DAVAttributeMap:f,ICALObjects:m,...Ot,...se,...he,...ft,...Se,...Oe,...vt,...re};exports.DAVAttributeMap=f,exports.DAVClient=Nt,exports.DAVNamespace=d,exports.DAVNamespaceShort=p,exports.DigestUnsupportedError=q,exports.ICALObjects=m,exports.addressBookMultiGet=we,exports.addressBookQuery=B,exports.calendarMultiGet=W,exports.calendarQuery=U,exports.cleanupFalsy=D,exports.collectionQuery=L,exports.createAccount=Z,exports.createCalendarObject=Ie,exports.createDAVClient=Mt,exports.createObject=M,exports.createVCard=Te,exports.davRequest=A,exports.default=Pt,exports.deleteCalendarObject=Re,exports.deleteObject=P,exports.deleteVCard=De,exports.ensureTrailingSlash=C,exports.excludeHeaders=O,exports.fetchAddressBooks=V,exports.fetchCalendarObjects=K,exports.fetchCalendarUserAddresses=Pe,exports.fetchCalendars=G,exports.fetchHomeUrl=_t,exports.fetchOauthTokens=Tt,exports.fetchPrincipalUrl=gt,exports.fetchVCards=H,exports.freeBusyQuery=Ve,exports.getBasicAuthHeaders=Ct,exports.getBearerAuthHeaders=wt,exports.getDAVAttribute=E,exports.getOauthHeaders=Dt,exports.isCollectionDirty=ye,exports.makeCalendar=Fe,exports.makeCollection=ve,exports.mergeHeaders=k,exports.propfind=j,exports.refreshAccessToken=Et,exports.serviceDiscovery=mt,exports.smartCollectionSync=z,exports.smartCollectionSyncDetailed=xe,exports.supportedReportSet=R,exports.syncCalendars=ze,exports.syncCalendarsDetailed=Be,exports.syncCollection=be,exports.updateCalendarObject=Le,exports.updateObject=N,exports.updateVCard=Ee,exports.urlContains=ae,exports.urlEquals=w,exports.urlMatches=T; \ No newline at end of file +`,redirect:`manual`}));if(e)return e}catch(e){if(e instanceof q)throw e;X(`Service discovery PROPFIND failed: ${e.stack}`)}try{let e=d(await o(u.href,{...l,method:`GET`,body:void 0,headers:O(k(n,c),r),redirect:`manual`}));if(e)return e}catch(e){if(e instanceof q)throw e;X(`Service discovery GET failed: ${e.stack}`)}return s.href},_t=e=>{if(typeof e==`string`&&e.trim().length>0)return e.trim();if(Array.isArray(e))for(let t of e){let e=_t(t);if(e)return e}else if(e&&typeof e==`object`){if(`_cdata`in e&&typeof e._cdata==`string`){let t=e._cdata.trim();if(t.length>0)return t}if(`_text`in e&&typeof e._text==`string`){let t=e._text.trim();if(t.length>0)return t}}},vt=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`rootUrl`];if(!_(t,o))throw Error(`account must have ${v(t,o)} before fetchPrincipalUrl`);X(`Fetching principal url from path ${t.rootUrl}`);let[s]=await j({url:t.rootUrl,props:{"d:current-user-principal":{}},depth:`0`,headers:O(n,r),headersToExclude:r,fetchOptions:i,fetch:a});if(!s?.ok)throw X(`Fetch principal url failed: ${s?.statusText??`empty response`}`),s?.status===401?Error(`Invalid credentials: PROPFIND ${t.rootUrl} returned 401 Unauthorized`):Error(`cannot find principalUrl`);let c=_t(s.props?.currentUserPrincipal?.href);if(!c)throw X(`Fetch principal url failed: missing current-user-principal href`),Error(`cannot find principalUrl`);return X(`Fetched principal url ${c}`),new URL(c,C(t.rootUrl)).href},yt=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`principalUrl`,`rootUrl`];if(!_(t,o))throw Error(`account must have ${v(t,o)} before fetchHomeUrl`);X(`Fetch home url from ${t.principalUrl}`);let s=await j({url:t.principalUrl,props:t.accountType===`caldav`?{"c:calendar-home-set":{}}:{"card:addressbook-home-set":{}},depth:`0`,headers:O(n,r),headersToExclude:r,fetchOptions:i,fetch:a}),c=s.find(e=>T(t.principalUrl,e.href,t.rootUrl));if(!c||!c.ok)throw X(`Fetch home url failed with status ${c?.statusText} and error ${JSON.stringify(s.map(e=>e.error))}`),Error(`cannot find homeUrl`);let l=_t(t.accountType===`caldav`?c.props?.calendarHomeSet?.href:c.props?.addressbookHomeSet?.href);if(!l)throw X(`Fetch home url failed: server did not return a ${t.accountType===`caldav`?`calendar-home-set`:`addressbook-home-set`} href`),Error(`cannot find homeUrl`);let u=new URL(l,C(t.rootUrl)).href;return X(`Fetched home url ${u}`),u},Z=async e=>{let{account:t,headers:n,loadCollections:r=!1,loadObjects:i=!1,headersToExclude:a,fetchOptions:o={},fetch:s}=e,c={...t},l=t.rootUrl??await gt({account:t,headers:O(n,a),headersToExclude:a,fetchOptions:o,fetch:s});if(t.rootUrl)c.rootUrl=t.rootUrl;else if(t.principalUrl)c.rootUrl=l;else{let e=async(t,r=0,i)=>{let l=t[r];if(!l)throw i??/* @__PURE__ */ Error(`cannot find principalUrl`);try{return{rootUrl:l,principalUrl:await vt({account:{...c,rootUrl:l},headers:O(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}}catch(n){if(n instanceof q)throw n;let a=i?.message.startsWith(`Invalid credentials`);return e(t,r+1,a?i:n)}},{rootUrl:r,principalUrl:i}=await e(ht(t.serverUrl,l));c.rootUrl=r,c.principalUrl=i}return c.principalUrl=t.principalUrl??c.principalUrl??await vt({account:c,headers:O(n,a),headersToExclude:a,fetchOptions:o,fetch:s}),c.homeUrl=t.homeUrl??await yt({account:c,headers:O(n,a),headersToExclude:a,fetchOptions:o,fetch:s}),(r||i)&&(t.accountType===`caldav`?c.calendars=await G({headers:O(n,a),headersToExclude:a,account:c,fetchOptions:o,fetch:s}):t.accountType===`carddav`&&(c.addressBooks=await H({headers:O(n,a),headersToExclude:a,account:c,fetchOptions:o,fetch:s}))),i&&(t.accountType===`caldav`&&c.calendars?c.calendars=await Promise.all(c.calendars.map(async e=>({...e,objects:await K({calendar:e,filters:{"comp-filter":{_attributes:{name:`VCALENDAR`}}},urlFilter:t=>!w(t,e.url),headers:O(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}))):t.accountType===`carddav`&&c.addressBooks&&(c.addressBooks=await Promise.all(c.addressBooks.map(async e=>({...e,objects:await Ee({addressBook:e,headers:O(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}))))),c},bt=e=>Date.now(){let t=typeof e==`string`&&e.trim()!==``?Number(e):e;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t*1e3:void 0};var St=/* @__PURE__ */ o({defaultParam:()=>Et,fetchOauthTokens:()=>kt,getBasicAuthHeaders:()=>Dt,getBearerAuthHeaders:()=>Ot,getOauthHeaders:()=>jt,refreshAccessToken:()=>At});const Q=(0,l.default)(`tsdav:authHelper`),$=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`;var Ct=class extends Error{constructor(e){super(e),this.name=`InvalidCharacterError`}};const wt=e=>{if(e>255)throw new Ct(`The string to be encoded contains characters outside of the Latin1 range.`)},Tt=e=>{let t=``,n=0;for(;n(...n)=>{let r=n[0],i={...t,...r};return(t.headers||r?.headers)&&(i.headers=k(t.headers,r?.headers)),e(i)},Dt=e=>(Q(`Basic auth token generated for user "${e.username??``}"`),{authorization:`Basic ${Tt(`${e.username}:${e.password}`)}`}),Ot=e=>({authorization:`Bearer ${e.accessToken}`}),kt=async(e,t,n)=>{let r=[`authorizationCode`,`redirectUrl`,`clientId`,`clientSecret`,`tokenUrl`];if(!_(e,r))throw Error(`Oauth credentials missing: ${v(e,r)}`);let i=new URLSearchParams({grant_type:`authorization_code`,code:e.authorizationCode,redirect_uri:e.redirectUrl,client_id:e.clientId,client_secret:e.clientSecret});Q(`Fetching oauth tokens from ${e.tokenUrl}`);let a=n??h,{headers:o,...s}=t??{},c=await a(e.tokenUrl,{...s,method:`POST`,body:i.toString(),headers:k({"content-type":`application/x-www-form-urlencoded`},o)});return c.ok?await c.json():(Q(`Fetch Oauth tokens failed with status ${c.status}`),{})},At=async(e,t,n)=>{let r=[`refreshToken`,`clientId`,`clientSecret`,`tokenUrl`];if(!_(e,r))throw Error(`Oauth credentials missing: ${v(e,r)}`);let i=new URLSearchParams({client_id:e.clientId,client_secret:e.clientSecret,refresh_token:e.refreshToken,grant_type:`refresh_token`}),a=n??h,{headers:o,...s}=t??{},c=await a(e.tokenUrl,{...s,method:`POST`,body:i.toString(),headers:k({"Content-Type":`application/x-www-form-urlencoded`},o)});return c.ok?await c.json():(Q(`Refresh access token failed with status ${c.status}`),{})},jt=async(e,t,n)=>{Q(`Fetching oauth headers`);let r={},i=!1;return e.accessToken&&(e.expiration==null&&!e.refreshToken||e.expiration!=null&&bt(e.expiration))?r={access_token:e.accessToken,refresh_token:e.refreshToken}:(r=e.refreshToken?await At(e,t,n):await kt(e,t,n),i=!0),i&&(r.access_token&&(e.accessToken=r.access_token),r.refresh_token&&(e.refreshToken=r.refresh_token),r.access_token&&(e.expiration=xt(r.expires_in))),Q(`Oauth tokens obtained`),{tokens:r,headers:r.access_token?{authorization:`Bearer ${r.access_token}`}:{}}};var Mt=/* @__PURE__ */ o({DAVClient:()=>Lt,createDAVClient:()=>It});const Nt=async(e,t=e.fetchOptions,n=e.fetchOverride)=>{switch(e.authMethod){case`Basic`:return Dt(e.credentials);case`Bearer`:return Ot(e.credentials);case`Oauth`:{let{headers:r}=await jt(e.credentials,t,n);if(!r.authorization)throw Error(`OAuth authentication failed: token endpoint returned no access token`);return r}case`Digest`:return e.credentials.digestString==null?{}:{Authorization:`Digest ${e.credentials.digestString}`};case`Custom`:if(!e.authFunction)throw Error(`authMethod 'Custom' requires an authFunction to produce request headers`);return await e.authFunction(e.credentials)??{};default:throw Error(`Invalid auth method`)}},Pt=/* @__PURE__ */ new WeakMap,Ft=(e,t=e.fetchOverride,n,r=e.fetchOptions?.headers)=>{let i=e.authMethod===`Digest`&&e.credentials.digestString==null;if(!i&&e.authMethod!==`Basic`||new Headers(r).has(`authorization`)||n?.some(e=>e.toLowerCase()===`authorization`))return t;let a=Pt.get(e),{username:o,password:s}=e.credentials;return(!a||a.authMethod!==e.authMethod||a.username!==o||a.password!==s)&&(a={state:ft(i),authMethod:e.authMethod,username:o,password:s},Pt.set(e,a)),pt({credentials:e.credentials,fetch:t,state:a.state})},It=async e=>{let t=new Lt(e);return t.authHeaders=await Nt(t),t.account=e.defaultAccountType?await Z({account:{serverUrl:e.serverUrl,credentials:e.credentials,accountType:e.defaultAccountType},headers:t.authHeaders,fetchOptions:t.fetchOptions,fetch:Ft(t)}):void 0,{davRequest:t.davRequest.bind(t),propfind:t.propfind.bind(t),createAccount:async(...e)=>{if(!e[0].account.accountType)throw Error("createAccount requires an accountType; pass one via `account.accountType`.");return t.createAccount(...e)},createObject:t.createObject.bind(t),updateObject:t.updateObject.bind(t),deleteObject:t.deleteObject.bind(t),calendarQuery:t.calendarQuery.bind(t),addressBookQuery:t.addressBookQuery.bind(t),collectionQuery:t.collectionQuery.bind(t),makeCollection:t.makeCollection.bind(t),calendarMultiGet:t.calendarMultiGet.bind(t),makeCalendar:t.makeCalendar.bind(t),freeBusyQuery:t.freeBusyQuery.bind(t),syncCollection:t.syncCollection.bind(t),supportedReportSet:t.supportedReportSet.bind(t),isCollectionDirty:t.isCollectionDirty.bind(t),smartCollectionSync:t.smartCollectionSync.bind(t),smartCollectionSyncDetailed:t.smartCollectionSyncDetailed.bind(t),fetchCalendars:t.fetchCalendars.bind(t),fetchCalendarUserAddresses:t.fetchCalendarUserAddresses.bind(t),fetchCalendarObjects:t.fetchCalendarObjects.bind(t),createCalendarObject:t.createCalendarObject.bind(t),updateCalendarObject:t.updateCalendarObject.bind(t),deleteCalendarObject:t.deleteCalendarObject.bind(t),syncCalendars:t.syncCalendars.bind(t),syncCalendarsDetailed:t.syncCalendarsDetailed.bind(t),fetchAddressBooks:t.fetchAddressBooks.bind(t),addressBookMultiGet:t.addressBookMultiGet.bind(t),fetchVCards:t.fetchVCards.bind(t),createVCard:t.createVCard.bind(t),updateVCard:t.updateVCard.bind(t),deleteVCard:t.deleteVCard.bind(t)}};var Lt=class{constructor(e){this.serverUrl=e.serverUrl,this.credentials=e.credentials,this.authMethod=e.authMethod??`Basic`,this.accountType=e.defaultAccountType??`caldav`,this.authFunction=e.authFunction,this.fetchOptions=e.fetchOptions??{},this.fetchOverride=e.fetch,this.calendarMultiGet=this.calendarMultiGet.bind(this),this.addressBookMultiGet=this.addressBookMultiGet.bind(this)}async authenticate(e=!1,t=this.fetchOptions,n=this.fetchOverride){if(!e&&this.authMethod!==`Oauth`)return;if(!e&&this.authHeaders&&this.credentials.accessToken&&(this.credentials.expiration==null||bt(this.credentials.expiration))){this.authHeaders={authorization:`Bearer ${this.credentials.accessToken}`};return}if(this.authentication)return this.authentication;let r=async()=>{this.authHeaders=await Nt(this,t,n)};this.authentication=r();try{await this.authentication}finally{this.authentication=void 0}}async requestDefaults(e){return await this.authenticate(!1,e?.fetchOptions??this.fetchOptions,e?.fetch??this.fetchOverride),{url:this.serverUrl,headers:this.authHeaders,account:this.account,fetchOptions:this.fetchOptions,fetch:Ft(this,e?.fetch,e?.headersToExclude,k(e?.headers,e?.init?.headers,(e?.fetchOptions??this.fetchOptions)?.headers))}}async invoke(e,t){let n=await this.requestDefaults(t),r=t&&{...t,fetch:n.fetch};return await Et(e,n)(r)}async login(e){await this.authenticate(!0),this.account=this.accountType?await Z({account:{serverUrl:this.serverUrl,credentials:this.credentials,accountType:this.accountType},headers:this.authHeaders,loadCollections:e?.loadCollections,loadObjects:e?.loadObjects,fetchOptions:this.fetchOptions,fetch:Ft(this)}):void 0}async davRequest(e){let{init:t,fetchOptions:n,...r}=e,{headers:i,...a}=t,o=await this.requestDefaults(e);return A({...r,init:{...a,headers:k(o.headers,i)},fetchOptions:n??this.fetchOptions,fetch:o.fetch})}async createObject(...e){return this.invoke(M,e[0])}async updateObject(...e){return this.invoke(N,e[0])}async deleteObject(...e){return this.invoke(P,e[0])}async propfind(...e){return this.invoke(j,e[0])}async createAccount(e){let{account:t,headers:n,headersToExclude:r,loadCollections:i,loadObjects:a,fetchOptions:o}=e,s=await this.requestDefaults(e),c=t.accountType??this.accountType;if(!c)throw Error("createAccount requires an accountType; pass one via `account.accountType` or configure `defaultAccountType` on the DAVClient.");return Z({account:{serverUrl:this.serverUrl,credentials:this.credentials,...t,accountType:c},headers:k(s.headers,n),headersToExclude:r,loadCollections:i,loadObjects:a,fetchOptions:o??this.fetchOptions,fetch:s.fetch})}async collectionQuery(...e){return this.invoke(L,e[0])}async makeCollection(...e){return this.invoke(ye,e[0])}async syncCollection(...e){return this.invoke(xe,e[0])}async supportedReportSet(...e){return this.invoke(R,e[0])}async isCollectionDirty(...e){return this.invoke(be,e[0])}async smartCollectionSync(...e){return this.invoke(z,e[0])}async smartCollectionSyncDetailed(e){return this.invoke(Se,e)}async calendarQuery(...e){return this.invoke(U,e[0])}async makeCalendar(...e){return this.invoke(Le,e[0])}async freeBusyQuery(...e){return this.invoke(Ue,e[0])}async calendarMultiGet(...e){return this.invoke(W,e[0])}async fetchCalendars(...e){return this.invoke(G,e[0])}async fetchCalendarUserAddresses(...e){return this.invoke(Ie,e[0])}async fetchCalendarObjects(...e){return this.invoke(K,e[0])}async createCalendarObject(...e){return this.invoke(Re,e[0])}async updateCalendarObject(...e){return this.invoke(ze,e[0])}async deleteCalendarObject(...e){return this.invoke(Be,e[0])}async syncCalendars(...e){return this.invoke(Ve,e[0])}async syncCalendarsDetailed(...e){return this.invoke(He,e[0])}async addressBookQuery(...e){return this.invoke(B,e[0])}async addressBookMultiGet(...e){return this.invoke(V,e[0])}async fetchAddressBooks(...e){return this.invoke(H,e[0])}async fetchVCards(...e){return this.invoke(Ee,e[0])}async createVCard(...e){return this.invoke(De,e[0])}async updateVCard(...e){return this.invoke(Oe,e[0])}async deleteVCard(...e){return this.invoke(ke,e[0])}},Rt={DAVNamespace:d,DAVNamespaceShort:p,DAVAttributeMap:f,ICALObjects:m,...Mt,...ce,...ge,...mt,...we,...Ae,...St,...ie};exports.DAVAttributeMap=f,exports.DAVClient=Lt,exports.DAVNamespace=d,exports.DAVNamespaceShort=p,exports.DigestUnsupportedError=q,exports.ICALObjects=m,exports.addressBookMultiGet=V,exports.addressBookQuery=B,exports.calendarMultiGet=W,exports.calendarQuery=U,exports.cleanupFalsy=D,exports.collectionQuery=L,exports.createAccount=Z,exports.createCalendarObject=Re,exports.createDAVClient=It,exports.createObject=M,exports.createVCard=De,exports.davRequest=A,exports.default=Rt,exports.deleteCalendarObject=Be,exports.deleteObject=P,exports.deleteVCard=ke,exports.ensureTrailingSlash=C,exports.excludeHeaders=O,exports.fetchAddressBooks=H,exports.fetchCalendarObjects=K,exports.fetchCalendarUserAddresses=Ie,exports.fetchCalendars=G,exports.fetchHomeUrl=yt,exports.fetchOauthTokens=kt,exports.fetchPrincipalUrl=vt,exports.fetchVCards=Ee,exports.freeBusyQuery=Ue,exports.getBasicAuthHeaders=Dt,exports.getBearerAuthHeaders=Ot,exports.getDAVAttribute=E,exports.getOauthHeaders=jt,exports.isCollectionDirty=be,exports.makeCalendar=Le,exports.makeCollection=ye,exports.mergeHeaders=k,exports.propfind=j,exports.refreshAccessToken=At,exports.serviceDiscovery=gt,exports.smartCollectionSync=z,exports.smartCollectionSyncDetailed=Se,exports.supportedReportSet=R,exports.syncCalendars=Ve,exports.syncCalendarsDetailed=He,exports.syncCollection=xe,exports.updateCalendarObject=ze,exports.updateObject=N,exports.updateVCard=Oe,exports.urlContains=oe,exports.urlEquals=w,exports.urlMatches=T; \ No newline at end of file diff --git a/dist/tsdav.min.js b/dist/tsdav.min.js index 12ffba65..de37a44d 100644 --- a/dist/tsdav.min.js +++ b/dist/tsdav.min.js @@ -1,20 +1,23 @@ -var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,o)=>(o=n==null?{}:e(i(n)),c(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n)),u=(e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.")}),d=o(((e,t)=>{var n=1e3,r=n*60,i=r*60,a=i*24,o=a*7,s=a*365.25;t.exports=function(e,t){t||={};var n=typeof e;if(n===`string`&&e.length>0)return c(e);if(n===`number`&&isFinite(e))return t.long?u(e):l(e);throw Error(`val is not a non-empty string or a valid number. val=`+JSON.stringify(e))};function c(e){if(e=String(e),!(e.length>100)){var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(t){var c=parseFloat(t[1]);switch((t[2]||`ms`).toLowerCase()){case`years`:case`year`:case`yrs`:case`yr`:case`y`:return c*s;case`weeks`:case`week`:case`w`:return c*o;case`days`:case`day`:case`d`:return c*a;case`hours`:case`hour`:case`hrs`:case`hr`:case`h`:return c*i;case`minutes`:case`minute`:case`mins`:case`min`:case`m`:return c*r;case`seconds`:case`second`:case`secs`:case`sec`:case`s`:return c*n;case`milliseconds`:case`millisecond`:case`msecs`:case`msec`:case`ms`:return c;default:return}}}}function l(e){var t=Math.abs(e);return t>=a?Math.round(e/a)+`d`:t>=i?Math.round(e/i)+`h`:t>=r?Math.round(e/r)+`m`:t>=n?Math.round(e/n)+`s`:e+`ms`}function u(e){var t=Math.abs(e);return t>=a?d(e,t,a,`day`):t>=i?d(e,t,i,`hour`):t>=r?d(e,t,r,`minute`):t>=n?d(e,t,n,`second`):e+` ms`}function d(e,t,n,r){var i=t>=n*1.5;return Math.round(e/n)+` `+r+(i?`s`:``)}})),f=o(((e,t)=>{function n(e){n.debug=n,n.default=n,n.coerce=c,n.disable=o,n.enable=i,n.enabled=s,n.humanize=d(),n.destroy=l,Object.keys(e).forEach(t=>{n[t]=e[t]}),n.names=[],n.skips=[],n.formatters={};function t(e){let t=0;for(let n=0;n{if(t===`%%`)return`%`;a++;let o=n.formatters[i];if(typeof o==`function`){let n=e[a];t=o.call(r,n),e.splice(a,1),a--}return t}),n.formatArgs.call(r,e),(r.log||n.log).apply(r,e)}return s.namespace=e,s.useColors=n.useColors(),s.color=n.selectColor(e),s.extend=r,s.destroy=n.destroy,Object.defineProperty(s,"enabled",{enumerable:!0,configurable:!1,get:()=>i===null?(a!==n.namespaces&&(a=n.namespaces,o=n.enabled(e)),o):i,set:e=>{i=e}}),typeof n.init==`function`&&n.init(s),s}function r(e,t){let r=n(this.namespace+(t===void 0?`:`:t)+e);return r.log=this.log,r}function i(e){n.save(e),n.namespaces=e,n.names=[],n.skips=[];let t=(typeof e==`string`?e:``).trim().replace(/\s+/g,`,`).split(`,`).filter(Boolean);for(let e of t)e[0]===`-`?n.skips.push(e.slice(1)):n.names.push(e)}function a(e,t){let n=0,r=0,i=-1,a=0;for(;n`-`+e)].join(`,`);return n.enable(``),e}function s(e){for(let t of n.skips)if(a(e,t))return!1;for(let t of n.names)if(a(e,t))return!0;return!1}function c(e){return e instanceof Error?e.stack||e.message:e}function l(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return n.enable(n.load()),n}t.exports=n})),p=l(o(((e,t)=>{e.formatArgs=r,e.save=i,e.load=a,e.useColors=n,e.storage=o(),e.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),e.colors=`#0000CC.#0000FF.#0033CC.#0033FF.#0066CC.#0066FF.#0099CC.#0099FF.#00CC00.#00CC33.#00CC66.#00CC99.#00CCCC.#00CCFF.#3300CC.#3300FF.#3333CC.#3333FF.#3366CC.#3366FF.#3399CC.#3399FF.#33CC00.#33CC33.#33CC66.#33CC99.#33CCCC.#33CCFF.#6600CC.#6600FF.#6633CC.#6633FF.#66CC00.#66CC33.#9900CC.#9900FF.#9933CC.#9933FF.#99CC00.#99CC33.#CC0000.#CC0033.#CC0066.#CC0099.#CC00CC.#CC00FF.#CC3300.#CC3333.#CC3366.#CC3399.#CC33CC.#CC33FF.#CC6600.#CC6633.#CC9900.#CC9933.#CCCC00.#CCCC33.#FF0000.#FF0033.#FF0066.#FF0099.#FF00CC.#FF00FF.#FF3300.#FF3333.#FF3366.#FF3399.#FF33CC.#FF33FF.#FF6600.#FF6633.#FF9900.#FF9933.#FFCC00.#FFCC33`.split(`.`);function n(){if(typeof window<`u`&&window.process&&(window.process.type===`renderer`||window.process.__nwjs))return!0;if(typeof navigator<`u`&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let e;return typeof document<`u`&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<`u`&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<`u`&&navigator.userAgent&&(e=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(e[1],10)>=31||typeof navigator<`u`&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function r(e){if(e[0]=(this.useColors?`%c`:``)+this.namespace+(this.useColors?` %c`:` `)+e[0]+(this.useColors?`%c `:` `)+`+`+t.exports.humanize(this.diff),!this.useColors)return;let n=`color: `+this.color;e.splice(1,0,n,`color: inherit`);let r=0,i=0;e[0].replace(/%[a-zA-Z%]/g,e=>{e!==`%%`&&(r++,e===`%c`&&(i=r))}),e.splice(i,0,n)}e.log=console.debug||console.log||(()=>{});function i(t){try{t?e.storage.setItem(`debug`,t):e.storage.removeItem(`debug`)}catch{}}function a(){let t;try{t=e.storage.getItem(`debug`)||e.storage.getItem(`DEBUG`)}catch{}return!t&&typeof process<`u`&&`env`in process&&(t=process.env.DEBUG),t}function o(){try{return localStorage}catch{}}t.exports=f()(e);let{formatters:s}=t.exports;s.j=function(e){try{return JSON.stringify(e)}catch(e){return`[UnexpectedJSONParseError]: `+e.message}}}))());let m=function(e){return e.CALENDAR_SERVER=`http://calendarserver.org/ns/`,e.CALDAV_APPLE=`http://apple.com/ns/ical/`,e.CALDAV=`urn:ietf:params:xml:ns:caldav`,e.CARDDAV=`urn:ietf:params:xml:ns:carddav`,e.DAV=`DAV:`,e}({});const h={"urn:ietf:params:xml:ns:caldav":`xmlns:c`,"urn:ietf:params:xml:ns:carddav":`xmlns:card`,"http://calendarserver.org/ns/":`xmlns:cs`,"http://apple.com/ns/ical/":`xmlns:ca`,"DAV:":`xmlns:d`};let g=function(e){return e.CALDAV=`c`,e.CARDDAV=`card`,e.CALENDAR_SERVER=`cs`,e.CALDAV_APPLE=`ca`,e.DAV=`d`,e}({}),_=function(e){return e.VEVENT=`VEVENT`,e.VTODO=`VTODO`,e.VJOURNAL=`VJOURNAL`,e.VFREEBUSY=`VFREEBUSY`,e.VTIMEZONE=`VTIMEZONE`,e.VALARM=`VALARM`,e}({});var v=o((e=>{(function(e){e.parser=function(e,t){return new n(e,t)},e.SAXParser=n,e.SAXStream=d,e.createStream=c,e.MAX_BUFFER_LENGTH=65536;var t=[`comment`,`sgmlDecl`,`textNode`,`tagName`,`doctype`,`procInstName`,`procInstBody`,`entity`,`attribName`,`attribValue`,`cdata`,`script`];e.EVENTS=[`text`,`processinginstruction`,`sgmldeclaration`,`doctype`,`comment`,`opentagstart`,`attribute`,`opentag`,`closetag`,`opencdata`,`cdata`,`closecdata`,`error`,`end`,`ready`,`script`,`opennamespace`,`closenamespace`];function n(t,r){if(!(this instanceof n))return new n(t,r);var a=this;i(a),a.q=a.c=``,a.bufferCheckPosition=e.MAX_BUFFER_LENGTH,a.encoding=null,a.opt=r||{},a.opt.lowercase=a.opt.lowercase||a.opt.lowercasetags,a.looseCase=a.opt.lowercase?`toLowerCase`:`toUpperCase`,a.opt.maxEntityCount=a.opt.maxEntityCount||512,a.opt.maxEntityDepth=a.opt.maxEntityDepth||4,a.entityCount=a.entityDepth=0,a.tags=[],a.closed=a.closedRoot=a.sawRoot=!1,a.tag=a.error=null,a.strict=!!t,a.noscript=!!(t||a.opt.noscript),a.state=w.BEGIN,a.strictEntities=a.opt.strictEntities,a.ENTITIES=a.strictEntities?Object.create(e.XML_ENTITIES):Object.create(e.ENTITIES),a.attribList=[],a.opt.xmlns&&(a.ns=Object.create(g)),a.opt.unquotedAttributeValues===void 0&&(a.opt.unquotedAttributeValues=!t),a.trackPosition=a.opt.position!==!1,a.trackPosition&&(a.position=a.line=a.column=0),T(a,`onready`)}Object.create||(Object.create=function(e){function t(){}return t.prototype=e,new t}),Object.keys||(Object.keys=function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t});function r(n){for(var r=Math.max(e.MAX_BUFFER_LENGTH,10),i=0,a=0,o=t.length;ar)switch(t[a]){case`textNode`:k(n);break;case`cdata`:O(n,`oncdata`,n.cdata),n.cdata=``;break;case`script`:O(n,`onscript`,n.script),n.script=``;break;default:A(n,`Max buffer length exceeded: `+t[a])}i=Math.max(i,s)}n.bufferCheckPosition=e.MAX_BUFFER_LENGTH-i+n.position}function i(e){for(var n=0,r=t.length;n=2){if(e[0]===255&&e[1]===254)return`utf-16le`;if(e[0]===254&&e[1]===255)return`utf-16be`}return e.length>=3&&e[0]===239&&e[1]===187&&e[2]===191?`utf8`:e.length>=4?e[0]===60&&e[1]===0&&e[2]===63&&e[3]===0?`utf-16le`:e[0]===0&&e[1]===60&&e[2]===0&&e[3]===63?`utf-16be`:`utf8`:t?`utf8`:null}function d(e,t){if(!(this instanceof d))return new d(e,t);o.apply(this),this._parser=new n(e,t),this.writable=!0,this.readable=!0;var r=this;this._parser.onend=function(){r.emit(`end`)},this._parser.onerror=function(e){r.emit(`error`,e),r._parser.error=null},this._decoder=null,this._decoderBuffer=null,s.forEach(function(e){Object.defineProperty(r,`on`+e,{get:function(){return r._parser[`on`+e]},set:function(t){if(!t)return r.removeAllListeners(e),r._parser[`on`+e]=t,t;r.on(e,t)},enumerable:!0,configurable:!1})})}d.prototype=Object.create(o.prototype,{constructor:{value:d}}),d.prototype._decodeBuffer=function(e,t){if(this._decoderBuffer&&=(e=Buffer.concat([this._decoderBuffer,e]),null),!this._decoder){var n=l(e,t);if(!n)return this._decoderBuffer=e,``;this._parser.encoding=n,this._decoder=new TextDecoder(n)}return this._decoder.decode(e,{stream:!t})},d.prototype.write=function(e){if(typeof Buffer==`function`&&typeof Buffer.isBuffer==`function`&&Buffer.isBuffer(e))e=this._decodeBuffer(e,!1);else if(this._decoderBuffer){var t=this._decodeBuffer(Buffer.alloc(0),!0);t&&(this._parser.write(t),this.emit(`data`,t))}return this._parser.write(e.toString()),this.emit(`data`,e),!0},d.prototype.end=function(e){if(e&&e.length&&this.write(e),this._decoderBuffer){var t=this._decodeBuffer(Buffer.alloc(0),!0);t&&(this._parser.write(t),this.emit(`data`,t))}else if(this._decoder){var n=this._decoder.decode();n&&(this._parser.write(n),this.emit(`data`,n))}return this._parser.end(),!0},d.prototype.on=function(e,t){var n=this;return!n._parser[`on`+e]&&s.indexOf(e)!==-1&&(n._parser[`on`+e]=function(){var t=arguments.length===1?[arguments[0]]:Array.apply(null,arguments);t.splice(0,0,e),n.emit.apply(n,t)}),o.prototype.on.call(n,e,t)};var f=/^\[CDATA\[$/i,p=/^DOCTYPE$/i,m=`http://www.w3.org/XML/1998/namespace`,h=`http://www.w3.org/2000/xmlns/`,g={xml:m,xmlns:h},_=/[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/,v=/[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/,y=/[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/,b=/[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/;function x(e){return e===` `||e===` -`||e===`\r`||e===` `}function S(e){return e===`"`||e===`'`}function ee(e){return e===`>`||x(e)}function C(e,t){return e.test(t)}function te(e,t){return!C(e,t)}var w=0;for(var ne in e.STATE={BEGIN:w++,BEGIN_WHITESPACE:w++,TEXT:w++,TEXT_ENTITY:w++,OPEN_WAKA:w++,SGML_DECL:w++,SGML_DECL_QUOTED:w++,DOCTYPE:w++,DOCTYPE_QUOTED:w++,DOCTYPE_DTD:w++,DOCTYPE_DTD_QUOTED:w++,COMMENT_STARTING:w++,COMMENT:w++,COMMENT_ENDING:w++,COMMENT_ENDED:w++,CDATA:w++,CDATA_ENDING:w++,CDATA_ENDING_2:w++,PROC_INST:w++,PROC_INST_BODY:w++,PROC_INST_ENDING:w++,OPEN_TAG:w++,OPEN_TAG_SLASH:w++,ATTRIB:w++,ATTRIB_NAME:w++,ATTRIB_NAME_SAW_WHITE:w++,ATTRIB_VALUE:w++,ATTRIB_VALUE_QUOTED:w++,ATTRIB_VALUE_CLOSED:w++,ATTRIB_VALUE_UNQUOTED:w++,ATTRIB_VALUE_ENTITY_Q:w++,ATTRIB_VALUE_ENTITY_U:w++,CLOSE_TAG:w++,CLOSE_TAG_SAW_WHITE:w++,SCRIPT:w++,SCRIPT_ENDING:w++},e.XML_ENTITIES=Object.assign(Object.create(null),{amp:`&`,gt:`>`,lt:`<`,quot:`"`,apos:`'`}),e.ENTITIES=Object.assign(Object.create(null),{amp:`&`,gt:`>`,lt:`<`,quot:`"`,apos:`'`,AElig:198,Aacute:193,Acirc:194,Agrave:192,Aring:197,Atilde:195,Auml:196,Ccedil:199,ETH:208,Eacute:201,Ecirc:202,Egrave:200,Euml:203,Iacute:205,Icirc:206,Igrave:204,Iuml:207,Ntilde:209,Oacute:211,Ocirc:212,Ograve:210,Oslash:216,Otilde:213,Ouml:214,THORN:222,Uacute:218,Ucirc:219,Ugrave:217,Uuml:220,Yacute:221,aacute:225,acirc:226,aelig:230,agrave:224,aring:229,atilde:227,auml:228,ccedil:231,eacute:233,ecirc:234,egrave:232,eth:240,euml:235,iacute:237,icirc:238,igrave:236,iuml:239,ntilde:241,oacute:243,ocirc:244,ograve:242,oslash:248,otilde:245,ouml:246,szlig:223,thorn:254,uacute:250,ucirc:251,ugrave:249,uuml:252,yacute:253,yuml:255,copy:169,reg:174,nbsp:160,iexcl:161,cent:162,pound:163,curren:164,yen:165,brvbar:166,sect:167,uml:168,ordf:170,laquo:171,not:172,shy:173,macr:175,deg:176,plusmn:177,sup1:185,sup2:178,sup3:179,acute:180,micro:181,para:182,middot:183,cedil:184,ordm:186,raquo:187,frac14:188,frac12:189,frac34:190,iquest:191,times:215,divide:247,OElig:338,oelig:339,Scaron:352,scaron:353,Yuml:376,fnof:402,circ:710,tilde:732,Alpha:913,Beta:914,Gamma:915,Delta:916,Epsilon:917,Zeta:918,Eta:919,Theta:920,Iota:921,Kappa:922,Lambda:923,Mu:924,Nu:925,Xi:926,Omicron:927,Pi:928,Rho:929,Sigma:931,Tau:932,Upsilon:933,Phi:934,Chi:935,Psi:936,Omega:937,alpha:945,beta:946,gamma:947,delta:948,epsilon:949,zeta:950,eta:951,theta:952,iota:953,kappa:954,lambda:955,mu:956,nu:957,xi:958,omicron:959,pi:960,rho:961,sigmaf:962,sigma:963,tau:964,upsilon:965,phi:966,chi:967,psi:968,omega:969,thetasym:977,upsih:978,piv:982,ensp:8194,emsp:8195,thinsp:8201,zwnj:8204,zwj:8205,lrm:8206,rlm:8207,ndash:8211,mdash:8212,lsquo:8216,rsquo:8217,sbquo:8218,ldquo:8220,rdquo:8221,bdquo:8222,dagger:8224,Dagger:8225,bull:8226,hellip:8230,permil:8240,prime:8242,Prime:8243,lsaquo:8249,rsaquo:8250,oline:8254,frasl:8260,euro:8364,image:8465,weierp:8472,real:8476,trade:8482,alefsym:8501,larr:8592,uarr:8593,rarr:8594,darr:8595,harr:8596,crarr:8629,lArr:8656,uArr:8657,rArr:8658,dArr:8659,hArr:8660,forall:8704,part:8706,exist:8707,empty:8709,nabla:8711,isin:8712,notin:8713,ni:8715,prod:8719,sum:8721,minus:8722,lowast:8727,radic:8730,prop:8733,infin:8734,ang:8736,and:8743,or:8744,cap:8745,cup:8746,int:8747,there4:8756,sim:8764,cong:8773,asymp:8776,ne:8800,equiv:8801,le:8804,ge:8805,sub:8834,sup:8835,nsub:8836,sube:8838,supe:8839,oplus:8853,otimes:8855,perp:8869,sdot:8901,lceil:8968,rceil:8969,lfloor:8970,rfloor:8971,lang:9001,rang:9002,loz:9674,spades:9824,clubs:9827,hearts:9829,diams:9830}),Object.keys(e.ENTITIES).forEach(function(t){var n=e.ENTITIES[t],r=typeof n==`number`?String.fromCharCode(n):n;e.ENTITIES[t]=r}),e.STATE)e.STATE[e.STATE[ne]]=ne;w=e.STATE;function T(e,t,n){e[t]&&e[t](n)}function E(e){var t=e&&e.match(/(?:^|\s)encoding\s*=\s*(['"])([^'"]+)\1/i);return t?t[2]:null}function D(e){return e?e.toLowerCase().replace(/[^a-z0-9]/g,``):null}function re(e,t){let n=D(e),r=D(t);return!n||!r?!0:r===`utf16`?n===`utf16le`||n===`utf16be`:n===r}function ie(e,t){if(e.strict&&e.encoding&&t&&t.name===`xml`){var n=E(t.body);n&&!re(e.encoding,n)&&j(e,`XML declaration encoding `+n+` does not match detected stream encoding `+e.encoding.toUpperCase())}}function O(e,t,n){e.textNode&&k(e),T(e,t,n)}function k(e){e.textNode=ae(e.opt,e.textNode),e.textNode&&T(e,`ontext`,e.textNode),e.textNode=``}function ae(e,t){return e.trim&&(t=t.trim()),e.normalize&&(t=t.replace(/\s+/g,` `)),t}function A(e,t){return k(e),e.trackPosition&&(t+=` +var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t,t.exports),e=null),t.exports),s=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,o)=>(o=n==null?{}:e(i(n)),c(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n)),u=/* @__PURE__ */ (e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.")}),d=/* @__PURE__ */ o(((e,t)=>{var n=1e3,r=n*60,i=r*60,a=i*24,o=a*7,s=a*365.25;t.exports=function(e,t){t||={};var n=typeof e;if(n===`string`&&e.length>0)return c(e);if(n===`number`&&isFinite(e))return t.long?u(e):l(e);throw Error(`val is not a non-empty string or a valid number. val=`+JSON.stringify(e))};function c(e){if(e=String(e),!(e.length>100)){var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(t){var c=parseFloat(t[1]);switch((t[2]||`ms`).toLowerCase()){case`years`:case`year`:case`yrs`:case`yr`:case`y`:return c*s;case`weeks`:case`week`:case`w`:return c*o;case`days`:case`day`:case`d`:return c*a;case`hours`:case`hour`:case`hrs`:case`hr`:case`h`:return c*i;case`minutes`:case`minute`:case`mins`:case`min`:case`m`:return c*r;case`seconds`:case`second`:case`secs`:case`sec`:case`s`:return c*n;case`milliseconds`:case`millisecond`:case`msecs`:case`msec`:case`ms`:return c;default:return}}}}function l(e){var t=Math.abs(e);return t>=a?Math.round(e/a)+`d`:t>=i?Math.round(e/i)+`h`:t>=r?Math.round(e/r)+`m`:t>=n?Math.round(e/n)+`s`:e+`ms`}function u(e){var t=Math.abs(e);return t>=a?d(e,t,a,`day`):t>=i?d(e,t,i,`hour`):t>=r?d(e,t,r,`minute`):t>=n?d(e,t,n,`second`):e+` ms`}function d(e,t,n,r){var i=t>=n*1.5;return Math.round(e/n)+` `+r+(i?`s`:``)}})),f=/* @__PURE__ */ o(((e,t)=>{function n(e){n.debug=n,n.default=n,n.coerce=c,n.disable=o,n.enable=i,n.enabled=s,n.humanize=d(),n.destroy=l,Object.keys(e).forEach(t=>{n[t]=e[t]}),n.names=[],n.skips=[],n.formatters={};function t(e){let t=0;for(let n=0;n{if(t===`%%`)return`%`;a++;let o=n.formatters[i];if(typeof o==`function`){let n=e[a];t=o.call(r,n),e.splice(a,1),a--}return t}),n.formatArgs.call(r,e),(r.log||n.log).apply(r,e)}return s.namespace=e,s.useColors=n.useColors(),s.color=n.selectColor(e),s.extend=r,s.destroy=n.destroy,Object.defineProperty(s,"enabled",{enumerable:!0,configurable:!1,get:()=>i===null?(a!==n.namespaces&&(a=n.namespaces,o=n.enabled(e)),o):i,set:e=>{i=e}}),typeof n.init==`function`&&n.init(s),s}function r(e,t){let r=n(this.namespace+(t===void 0?`:`:t)+e);return r.log=this.log,r}function i(e){n.save(e),n.namespaces=e,n.names=[],n.skips=[];let t=(typeof e==`string`?e:``).trim().replace(/\s+/g,`,`).split(`,`).filter(Boolean);for(let e of t)e[0]===`-`?n.skips.push(e.slice(1)):n.names.push(e)}function a(e,t){let n=0,r=0,i=-1,a=0;for(;n`-`+e)].join(`,`);return n.enable(``),e}function s(e){for(let t of n.skips)if(a(e,t))return!1;for(let t of n.names)if(a(e,t))return!0;return!1}function c(e){return e instanceof Error?e.stack||e.message:e}function l(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return n.enable(n.load()),n}t.exports=n})),p=/* @__PURE__ */ l((/* @__PURE__ */ o(((e,t)=>{e.formatArgs=r,e.save=i,e.load=a,e.useColors=n,e.storage=o(),e.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),e.colors=/* @__PURE__ */ `#0000CC.#0000FF.#0033CC.#0033FF.#0066CC.#0066FF.#0099CC.#0099FF.#00CC00.#00CC33.#00CC66.#00CC99.#00CCCC.#00CCFF.#3300CC.#3300FF.#3333CC.#3333FF.#3366CC.#3366FF.#3399CC.#3399FF.#33CC00.#33CC33.#33CC66.#33CC99.#33CCCC.#33CCFF.#6600CC.#6600FF.#6633CC.#6633FF.#66CC00.#66CC33.#9900CC.#9900FF.#9933CC.#9933FF.#99CC00.#99CC33.#CC0000.#CC0033.#CC0066.#CC0099.#CC00CC.#CC00FF.#CC3300.#CC3333.#CC3366.#CC3399.#CC33CC.#CC33FF.#CC6600.#CC6633.#CC9900.#CC9933.#CCCC00.#CCCC33.#FF0000.#FF0033.#FF0066.#FF0099.#FF00CC.#FF00FF.#FF3300.#FF3333.#FF3366.#FF3399.#FF33CC.#FF33FF.#FF6600.#FF6633.#FF9900.#FF9933.#FFCC00.#FFCC33`.split(`.`);function n(){if(typeof window<`u`&&window.process&&(window.process.type===`renderer`||window.process.__nwjs))return!0;if(typeof navigator<`u`&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let e;return typeof document<`u`&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<`u`&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<`u`&&navigator.userAgent&&(e=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(e[1],10)>=31||typeof navigator<`u`&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function r(e){if(e[0]=(this.useColors?`%c`:``)+this.namespace+(this.useColors?` %c`:` `)+e[0]+(this.useColors?`%c `:` `)+`+`+t.exports.humanize(this.diff),!this.useColors)return;let n=`color: `+this.color;e.splice(1,0,n,`color: inherit`);let r=0,i=0;e[0].replace(/%[a-zA-Z%]/g,e=>{e!==`%%`&&(r++,e===`%c`&&(i=r))}),e.splice(i,0,n)}e.log=console.debug||console.log||(()=>{});function i(t){try{t?e.storage.setItem(`debug`,t):e.storage.removeItem(`debug`)}catch{}}function a(){let t;try{t=e.storage.getItem(`debug`)||e.storage.getItem(`DEBUG`)}catch{}return!t&&typeof process<`u`&&`env`in process&&(t=process.env.DEBUG),t}function o(){try{return localStorage}catch{}}t.exports=f()(e);let{formatters:s}=t.exports;s.j=function(e){try{return JSON.stringify(e)}catch(e){return`[UnexpectedJSONParseError]: `+e.message}}})))());let m=/* @__PURE__ */ function(e){return e.CALENDAR_SERVER=`http://calendarserver.org/ns/`,e.CALDAV_APPLE=`http://apple.com/ns/ical/`,e.CALDAV=`urn:ietf:params:xml:ns:caldav`,e.CARDDAV=`urn:ietf:params:xml:ns:carddav`,e.DAV=`DAV:`,e}({});const h={"urn:ietf:params:xml:ns:caldav":`xmlns:c`,"urn:ietf:params:xml:ns:carddav":`xmlns:card`,"http://calendarserver.org/ns/":`xmlns:cs`,"http://apple.com/ns/ical/":`xmlns:ca`,"DAV:":`xmlns:d`};let g=/* @__PURE__ */ function(e){return e.CALDAV=`c`,e.CARDDAV=`card`,e.CALENDAR_SERVER=`cs`,e.CALDAV_APPLE=`ca`,e.DAV=`d`,e}({}),_=/* @__PURE__ */ function(e){return e.VEVENT=`VEVENT`,e.VTODO=`VTODO`,e.VJOURNAL=`VJOURNAL`,e.VFREEBUSY=`VFREEBUSY`,e.VTIMEZONE=`VTIMEZONE`,e.VALARM=`VALARM`,e}({});var v=/* @__PURE__ */ o(((e,t,n)=>{(function(e){e.parser=function(e,t){return new n(e,t)},e.SAXParser=n,e.SAXStream=d,e.createStream=c,e.MAX_BUFFER_LENGTH=65536;var t=[`comment`,`sgmlDecl`,`textNode`,`tagName`,`doctype`,`procInstName`,`procInstBody`,`entity`,`attribName`,`attribValue`,`cdata`,`script`];e.EVENTS=[`text`,`processinginstruction`,`sgmldeclaration`,`doctype`,`comment`,`opentagstart`,`attribute`,`opentag`,`closetag`,`opencdata`,`cdata`,`closecdata`,`error`,`end`,`ready`,`script`,`opennamespace`,`closenamespace`];function n(t,r){if(!(this instanceof n))return new n(t,r);var a=this;i(a),a.q=a.c=``,a.bufferCheckPosition=e.MAX_BUFFER_LENGTH,a.encoding=null,a.opt=r||{},a.opt.lowercase=a.opt.lowercase||a.opt.lowercasetags,a.looseCase=a.opt.lowercase?`toLowerCase`:`toUpperCase`,a.opt.maxEntityCount=a.opt.maxEntityCount||512,a.opt.maxEntityDepth=a.opt.maxEntityDepth||4,a.entityCount=a.entityDepth=0,a.tags=[],a.closed=a.closedRoot=a.sawRoot=!1,a.tag=a.error=null,a.strict=!!t,a.noscript=!!(t||a.opt.noscript),a.state=T.BEGIN,a.strictEntities=a.opt.strictEntities,a.ENTITIES=a.strictEntities?Object.create(e.XML_ENTITIES):Object.create(e.ENTITIES),a.attribList=[],a.opt.xmlns&&(a.ns=Object.create(g)),a.opt.unquotedAttributeValues===void 0&&(a.opt.unquotedAttributeValues=!t),a.trackPosition=a.opt.position!==!1,a.trackPosition&&(a.position=a.line=a.column=0),E(a,`onready`)}Object.create||(Object.create=function(e){function t(){}return t.prototype=e,new t}),Object.keys||(Object.keys=function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t});function r(n){for(var r=Math.max(e.MAX_BUFFER_LENGTH,10),i=0,a=0,o=t.length;ar)switch(t[a]){case`textNode`:A(n);break;case`cdata`:k(n,`oncdata`,n.cdata),n.cdata=``;break;case`script`:k(n,`onscript`,n.script),n.script=``;break;default:j(n,`Max buffer length exceeded: `+t[a])}i=Math.max(i,s)}n.bufferCheckPosition=e.MAX_BUFFER_LENGTH-i+n.position}function i(e){for(var n=0,r=t.length;n=2){if(e[0]===255&&e[1]===254)return`utf-16le`;if(e[0]===254&&e[1]===255)return`utf-16be`}return e.length>=3&&e[0]===239&&e[1]===187&&e[2]===191?`utf8`:e.length>=4?e[0]===60&&e[1]===0&&e[2]===63&&e[3]===0?`utf-16le`:e[0]===0&&e[1]===60&&e[2]===0&&e[3]===63?`utf-16be`:`utf8`:t?`utf8`:null}function d(e,t){if(!(this instanceof d))return new d(e,t);o.apply(this),this._parser=new n(e,t),this.writable=!0,this.readable=!0;var r=this;this._parser.onend=function(){r.emit(`end`)},this._parser.onerror=function(e){r.emit(`error`,e),r._parser.error=null},this._decoder=null,this._decoderBuffer=null,s.forEach(function(e){Object.defineProperty(r,`on`+e,{get:function(){return r._parser[`on`+e]},set:function(t){if(!t)return r.removeAllListeners(e),r._parser[`on`+e]=t,t;r.on(e,t)},enumerable:!0,configurable:!1})})}d.prototype=Object.create(o.prototype,{constructor:{value:d}}),d.prototype._decodeBuffer=function(e,t){if(this._decoderBuffer&&=(e=Buffer.concat([this._decoderBuffer,e]),null),!this._decoder){var n=l(e,t);if(!n)return this._decoderBuffer=e,``;this._parser.encoding=n,this._decoder=new TextDecoder(n)}return this._decoder.decode(e,{stream:!t})},d.prototype.write=function(e){if(typeof Buffer==`function`&&typeof Buffer.isBuffer==`function`&&Buffer.isBuffer(e))e=this._decodeBuffer(e,!1);else if(this._decoderBuffer){var t=this._decodeBuffer(Buffer.alloc(0),!0);t&&(this._parser.write(t),this.emit(`data`,t))}return this._parser.write(e.toString()),this.emit(`data`,e),!0},d.prototype.end=function(e){if(e&&e.length&&this.write(e),this._decoderBuffer){var t=this._decodeBuffer(Buffer.alloc(0),!0);t&&(this._parser.write(t),this.emit(`data`,t))}else if(this._decoder){var n=this._decoder.decode();n&&(this._parser.write(n),this.emit(`data`,n))}return this._parser.end(),!0},d.prototype.on=function(e,t){var n=this;return!n._parser[`on`+e]&&s.indexOf(e)!==-1&&(n._parser[`on`+e]=function(){var t=arguments.length===1?[arguments[0]]:Array.apply(null,arguments);t.splice(0,0,e),n.emit.apply(n,t)}),o.prototype.on.call(n,e,t)};var f=/^\[CDATA\[$/i,p=/^DOCTYPE$/i,m=`http://www.w3.org/XML/1998/namespace`,h=`http://www.w3.org/2000/xmlns/`,g={xml:m,xmlns:h},_=/[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/,v=/[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/,y=/[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/,b=/[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/;function x(e){return e===` `||e===` +`||e===`\r`||e===` `}function S(e){return e===`"`||e===`'`}function C(e){return e===`>`||x(e)}function w(e,t){return e.test(t)}function ee(e,t){return!w(e,t)}var T=0;for(var te in e.STATE={BEGIN:T++,BEGIN_WHITESPACE:T++,TEXT:T++,TEXT_ENTITY:T++,OPEN_WAKA:T++,SGML_DECL:T++,SGML_DECL_QUOTED:T++,DOCTYPE:T++,DOCTYPE_QUOTED:T++,DOCTYPE_DTD:T++,DOCTYPE_DTD_QUOTED:T++,COMMENT_STARTING:T++,COMMENT:T++,COMMENT_ENDING:T++,COMMENT_ENDED:T++,CDATA:T++,CDATA_ENDING:T++,CDATA_ENDING_2:T++,PROC_INST:T++,PROC_INST_BODY:T++,PROC_INST_ENDING:T++,OPEN_TAG:T++,OPEN_TAG_SLASH:T++,ATTRIB:T++,ATTRIB_NAME:T++,ATTRIB_NAME_SAW_WHITE:T++,ATTRIB_VALUE:T++,ATTRIB_VALUE_QUOTED:T++,ATTRIB_VALUE_CLOSED:T++,ATTRIB_VALUE_UNQUOTED:T++,ATTRIB_VALUE_ENTITY_Q:T++,ATTRIB_VALUE_ENTITY_U:T++,CLOSE_TAG:T++,CLOSE_TAG_SAW_WHITE:T++,SCRIPT:T++,SCRIPT_ENDING:T++},e.XML_ENTITIES=Object.assign(Object.create(null),{amp:`&`,gt:`>`,lt:`<`,quot:`"`,apos:`'`}),e.ENTITIES=Object.assign(Object.create(null),{amp:`&`,gt:`>`,lt:`<`,quot:`"`,apos:`'`,AElig:198,Aacute:193,Acirc:194,Agrave:192,Aring:197,Atilde:195,Auml:196,Ccedil:199,ETH:208,Eacute:201,Ecirc:202,Egrave:200,Euml:203,Iacute:205,Icirc:206,Igrave:204,Iuml:207,Ntilde:209,Oacute:211,Ocirc:212,Ograve:210,Oslash:216,Otilde:213,Ouml:214,THORN:222,Uacute:218,Ucirc:219,Ugrave:217,Uuml:220,Yacute:221,aacute:225,acirc:226,aelig:230,agrave:224,aring:229,atilde:227,auml:228,ccedil:231,eacute:233,ecirc:234,egrave:232,eth:240,euml:235,iacute:237,icirc:238,igrave:236,iuml:239,ntilde:241,oacute:243,ocirc:244,ograve:242,oslash:248,otilde:245,ouml:246,szlig:223,thorn:254,uacute:250,ucirc:251,ugrave:249,uuml:252,yacute:253,yuml:255,copy:169,reg:174,nbsp:160,iexcl:161,cent:162,pound:163,curren:164,yen:165,brvbar:166,sect:167,uml:168,ordf:170,laquo:171,not:172,shy:173,macr:175,deg:176,plusmn:177,sup1:185,sup2:178,sup3:179,acute:180,micro:181,para:182,middot:183,cedil:184,ordm:186,raquo:187,frac14:188,frac12:189,frac34:190,iquest:191,times:215,divide:247,OElig:338,oelig:339,Scaron:352,scaron:353,Yuml:376,fnof:402,circ:710,tilde:732,Alpha:913,Beta:914,Gamma:915,Delta:916,Epsilon:917,Zeta:918,Eta:919,Theta:920,Iota:921,Kappa:922,Lambda:923,Mu:924,Nu:925,Xi:926,Omicron:927,Pi:928,Rho:929,Sigma:931,Tau:932,Upsilon:933,Phi:934,Chi:935,Psi:936,Omega:937,alpha:945,beta:946,gamma:947,delta:948,epsilon:949,zeta:950,eta:951,theta:952,iota:953,kappa:954,lambda:955,mu:956,nu:957,xi:958,omicron:959,pi:960,rho:961,sigmaf:962,sigma:963,tau:964,upsilon:965,phi:966,chi:967,psi:968,omega:969,thetasym:977,upsih:978,piv:982,ensp:8194,emsp:8195,thinsp:8201,zwnj:8204,zwj:8205,lrm:8206,rlm:8207,ndash:8211,mdash:8212,lsquo:8216,rsquo:8217,sbquo:8218,ldquo:8220,rdquo:8221,bdquo:8222,dagger:8224,Dagger:8225,bull:8226,hellip:8230,permil:8240,prime:8242,Prime:8243,lsaquo:8249,rsaquo:8250,oline:8254,frasl:8260,euro:8364,image:8465,weierp:8472,real:8476,trade:8482,alefsym:8501,larr:8592,uarr:8593,rarr:8594,darr:8595,harr:8596,crarr:8629,lArr:8656,uArr:8657,rArr:8658,dArr:8659,hArr:8660,forall:8704,part:8706,exist:8707,empty:8709,nabla:8711,isin:8712,notin:8713,ni:8715,prod:8719,sum:8721,minus:8722,lowast:8727,radic:8730,prop:8733,infin:8734,ang:8736,and:8743,or:8744,cap:8745,cup:8746,int:8747,there4:8756,sim:8764,cong:8773,asymp:8776,ne:8800,equiv:8801,le:8804,ge:8805,sub:8834,sup:8835,nsub:8836,sube:8838,supe:8839,oplus:8853,otimes:8855,perp:8869,sdot:8901,lceil:8968,rceil:8969,lfloor:8970,rfloor:8971,lang:9001,rang:9002,loz:9674,spades:9824,clubs:9827,hearts:9829,diams:9830}),Object.keys(e.ENTITIES).forEach(function(t){var n=e.ENTITIES[t],r=typeof n==`number`?String.fromCharCode(n):n;e.ENTITIES[t]=r}),e.STATE)e.STATE[e.STATE[te]]=te;T=e.STATE;function E(e,t,n){e[t]&&e[t](n)}function D(e){var t=e&&e.match(/(?:^|\s)encoding\s*=\s*(['"])([^'"]+)\1/i);return t?t[2]:null}function O(e){return e?e.toLowerCase().replace(/[^a-z0-9]/g,``):null}function ne(e,t){let n=O(e),r=O(t);return!n||!r?!0:r===`utf16`?n===`utf16le`||n===`utf16be`:n===r}function re(e,t){if(e.strict&&e.encoding&&t&&t.name===`xml`){var n=D(t.body);n&&!ne(e.encoding,n)&&M(e,`XML declaration encoding `+n+` does not match detected stream encoding `+e.encoding.toUpperCase())}}function k(e,t,n){e.textNode&&A(e),E(e,t,n)}function A(e){e.textNode=ie(e.opt,e.textNode),e.textNode&&E(e,`ontext`,e.textNode),e.textNode=``}function ie(e,t){return e.trim&&(t=t.trim()),e.normalize&&(t=t.replace(/\s+/g,` `)),t}function j(e,t){return A(e),e.trackPosition&&(t+=` Line: `+e.line+` Column: `+e.column+` -Char: `+e.c),t=Error(t),e.error=t,T(e,`onerror`,t),e}function oe(e){return e.sawRoot&&!e.closedRoot&&j(e,`Unclosed root tag`),e.state!==w.BEGIN&&e.state!==w.BEGIN_WHITESPACE&&e.state!==w.TEXT&&A(e,`Unexpected end`),k(e),e.c=``,e.closed=!0,T(e,`onend`),n.call(e,e.strict,e.opt),e}function j(e,t){if(typeof e!=`object`||!(e instanceof n))throw Error(`bad call to strictFail`);e.strict&&A(e,t)}function M(e){e.strict||(e.tagName=e.tagName[e.looseCase]());var t=e.tags[e.tags.length-1]||e,n=e.tag={name:e.tagName,attributes:{}};e.opt.xmlns&&(n.ns=t.ns),e.attribList.length=0,O(e,`onopentagstart`,n)}function N(e,t){var n=e.indexOf(`:`)<0?[``,e]:e.split(`:`),r=n[0],i=n[1];return t&&e===`xmlns`&&(r=`xmlns`,i=``),{prefix:r,local:i}}function se(e){if(e.strict||(e.attribName=e.attribName[e.looseCase]()),e.attribList.indexOf(e.attribName)!==-1||e.tag.attributes.hasOwnProperty(e.attribName)){e.attribName=e.attribValue=``;return}if(e.opt.xmlns){var t=N(e.attribName,!0),n=t.prefix,r=t.local;if(n===`xmlns`){if(r===`xml`&&e.attribValue!==m)j(e,`xml: prefix must be bound to `+m+` -Actual: `+e.attribValue);else if(r===`xmlns`&&e.attribValue!==h)j(e,`xmlns: prefix must be bound to `+h+` -Actual: `+e.attribValue);else{var i=e.tag,a=e.tags[e.tags.length-1]||e;i.ns===a.ns&&(i.ns=Object.create(a.ns)),i.ns[r]=e.attribValue}}e.attribList.push([e.attribName,e.attribValue])}else e.tag.attributes[e.attribName]=e.attribValue,O(e,`onattribute`,{name:e.attribName,value:e.attribValue});e.attribName=e.attribValue=``}function P(e,t){if(e.opt.xmlns){var n=e.tag,r=N(e.tagName);n.prefix=r.prefix,n.local=r.local,n.uri=n.ns[r.prefix]||``,n.prefix&&!n.uri&&(j(e,`Unbound namespace prefix: `+JSON.stringify(e.tagName)),n.uri=r.prefix);var i=e.tags[e.tags.length-1]||e;n.ns&&i.ns!==n.ns&&Object.keys(n.ns).forEach(function(t){O(e,`onopennamespace`,{prefix:t,uri:n.ns[t]})});for(var a=0,o=e.attribList.length;a`,e.state=w.TEXT;return}if(e.script){if(e.tagName!==`script`){e.script+=``,e.tagName=``,e.state=w.SCRIPT;return}O(e,`onscript`,e.script),e.script=``}var t=e.tags.length,n=e.tagName;e.strict||(n=n[e.looseCase]());for(var r=n;t--&&e.tags[t].name!==r;)j(e,`Unexpected close tag`);if(t<0){j(e,`Unmatched closing tag: `+e.tagName),e.textNode+=``,e.state=w.TEXT;return}e.tagName=n;for(var i=e.tags.length;i-->t;){var a=e.tag=e.tags.pop();e.tagName=e.tag.name,O(e,`onclosetag`,e.tagName);var o={};for(var s in a.ns)o[s]=a.ns[s];var c=e.tags[e.tags.length-1]||e;e.opt.xmlns&&a.ns!==c.ns&&Object.keys(a.ns).forEach(function(t){var n=a.ns[t];O(e,`onclosenamespace`,{prefix:t,uri:n})})}t===0&&(e.closedRoot=!0),e.tagName=e.attribValue=e.attribName=``,e.attribList.length=0,e.state=w.TEXT}function I(e){var t=e.entity,n=t.toLowerCase(),r,i=``;return e.ENTITIES[t]?e.ENTITIES[t]:e.ENTITIES[n]?e.ENTITIES[n]:(t=n,t.charAt(0)===`#`&&(t.charAt(1)===`x`?(t=t.slice(2),r=parseInt(t,16),i=r.toString(16)):(t=t.slice(1),r=parseInt(t,10),i=r.toString(10))),t=t.replace(/^0+/,``),isNaN(r)||i.toLowerCase()!==t||r<0||r>1114111||!ce(r)?(j(e,`Invalid character entity`),`&`+e.entity+`;`):String.fromCodePoint(r))}function ce(e){return e===9||e===10||e===13||e>=32&&e<=55295||e>=57344&&e<=65533||e>=65536&&e<=1114111}function L(e,t){t===`<`?(e.state=w.OPEN_WAKA,e.startTagPosition=e.position):x(t)||(j(e,`Non-whitespace before first tag.`),e.textNode=t,e.state=w.TEXT)}function R(e,t){var n=``;return t`?(O(n,`onsgmldeclaration`,n.sgmlDecl),n.sgmlDecl=``,n.state=w.TEXT):(S(a)&&(n.state=w.SGML_DECL_QUOTED),n.sgmlDecl+=a);continue;case w.SGML_DECL_QUOTED:a===n.q&&(n.state=w.SGML_DECL,n.q=``),n.sgmlDecl+=a;continue;case w.DOCTYPE:a===`>`?(n.state=w.TEXT,O(n,`ondoctype`,n.doctype),n.doctype=!0):(n.doctype+=a,a===`[`?n.state=w.DOCTYPE_DTD:S(a)&&(n.state=w.DOCTYPE_QUOTED,n.q=a));continue;case w.DOCTYPE_QUOTED:n.doctype+=a,a===n.q&&(n.q=``,n.state=w.DOCTYPE);continue;case w.DOCTYPE_DTD:a===`]`?(n.doctype+=a,n.state=w.DOCTYPE):a===`<`?(n.state=w.OPEN_WAKA,n.startTagPosition=n.position):S(a)?(n.doctype+=a,n.state=w.DOCTYPE_DTD_QUOTED,n.q=a):n.doctype+=a;continue;case w.DOCTYPE_DTD_QUOTED:n.doctype+=a,a===n.q&&(n.state=w.DOCTYPE_DTD,n.q=``);continue;case w.COMMENT:a===`-`?n.state=w.COMMENT_ENDING:n.comment+=a;continue;case w.COMMENT_ENDING:a===`-`?(n.state=w.COMMENT_ENDED,n.comment=ae(n.opt,n.comment),n.comment&&O(n,`oncomment`,n.comment),n.comment=``):(n.comment+=`-`+a,n.state=w.COMMENT);continue;case w.COMMENT_ENDED:a===`>`?n.state=n.doctype&&n.doctype!==!0?w.DOCTYPE_DTD:w.TEXT:(j(n,`Malformed comment`),n.comment+=`--`+a,n.state=w.COMMENT);continue;case w.CDATA:for(var o=i-1;a&&a!==`]`;)a=R(t,i++),a&&n.trackPosition&&(n.position++,a===` -`?(n.line++,n.column=0):n.column++);n.cdata+=t.substring(o,i-1),a===`]`&&(n.state=w.CDATA_ENDING);continue;case w.CDATA_ENDING:a===`]`?n.state=w.CDATA_ENDING_2:(n.cdata+=`]`+a,n.state=w.CDATA);continue;case w.CDATA_ENDING_2:a===`>`?(n.cdata&&O(n,`oncdata`,n.cdata),O(n,`onclosecdata`),n.cdata=``,n.state=w.TEXT):a===`]`?n.cdata+=`]`:(n.cdata+=`]]`+a,n.state=w.CDATA);continue;case w.PROC_INST:a===`?`?n.state=w.PROC_INST_ENDING:x(a)?n.state=w.PROC_INST_BODY:n.procInstName+=a;continue;case w.PROC_INST_BODY:if(!n.procInstBody&&x(a))continue;a===`?`?n.state=w.PROC_INST_ENDING:n.procInstBody+=a;continue;case w.PROC_INST_ENDING:if(a===`>`){let e={name:n.procInstName,body:n.procInstBody};ie(n,e),O(n,`onprocessinginstruction`,e),n.procInstName=n.procInstBody=``,n.state=w.TEXT}else n.procInstBody+=`?`+a,n.state=w.PROC_INST_BODY;continue;case w.OPEN_TAG:C(v,a)?n.tagName+=a:(M(n),a===`>`?P(n):a===`/`?n.state=w.OPEN_TAG_SLASH:(x(a)||j(n,`Invalid character in tag name`),n.state=w.ATTRIB));continue;case w.OPEN_TAG_SLASH:a===`>`?(P(n,!0),F(n)):(j(n,`Forward-slash in opening tag not followed by >`),n.state=w.ATTRIB);continue;case w.ATTRIB:if(x(a))continue;a===`>`?P(n):a===`/`?n.state=w.OPEN_TAG_SLASH:C(_,a)?(n.attribName=a,n.attribValue=``,n.state=w.ATTRIB_NAME):j(n,`Invalid attribute name`);continue;case w.ATTRIB_NAME:a===`=`?n.state=w.ATTRIB_VALUE:a===`>`?(j(n,`Attribute without value`),n.attribValue=n.attribName,se(n),P(n)):x(a)?n.state=w.ATTRIB_NAME_SAW_WHITE:C(v,a)?n.attribName+=a:j(n,`Invalid attribute name`);continue;case w.ATTRIB_NAME_SAW_WHITE:if(a===`=`)n.state=w.ATTRIB_VALUE;else if(x(a))continue;else j(n,`Attribute without value`),n.tag.attributes[n.attribName]=``,n.attribValue=``,O(n,`onattribute`,{name:n.attribName,value:``}),n.attribName=``,a===`>`?P(n):C(_,a)?(n.attribName=a,n.state=w.ATTRIB_NAME):(j(n,`Invalid attribute name`),n.state=w.ATTRIB);continue;case w.ATTRIB_VALUE:if(x(a))continue;S(a)?(n.q=a,n.state=w.ATTRIB_VALUE_QUOTED):(n.opt.unquotedAttributeValues||A(n,`Unquoted attribute value`),n.state=w.ATTRIB_VALUE_UNQUOTED,n.attribValue=a);continue;case w.ATTRIB_VALUE_QUOTED:if(a!==n.q){a===`&`?n.state=w.ATTRIB_VALUE_ENTITY_Q:n.attribValue+=a;continue}se(n),n.q=``,n.state=w.ATTRIB_VALUE_CLOSED;continue;case w.ATTRIB_VALUE_CLOSED:x(a)?n.state=w.ATTRIB:a===`>`?P(n):a===`/`?n.state=w.OPEN_TAG_SLASH:C(_,a)?(j(n,`No whitespace between attributes`),n.attribName=a,n.attribValue=``,n.state=w.ATTRIB_NAME):j(n,`Invalid attribute name`);continue;case w.ATTRIB_VALUE_UNQUOTED:if(!ee(a)){a===`&`?n.state=w.ATTRIB_VALUE_ENTITY_U:n.attribValue+=a;continue}se(n),a===`>`?P(n):n.state=w.ATTRIB;continue;case w.CLOSE_TAG:if(n.tagName)a===`>`?F(n):C(v,a)?n.tagName+=a:n.script?(n.script+=``?F(n):j(n,`Invalid characters in closing tag`);continue;case w.TEXT_ENTITY:case w.ATTRIB_VALUE_ENTITY_Q:case w.ATTRIB_VALUE_ENTITY_U:var c,l;switch(n.state){case w.TEXT_ENTITY:c=w.TEXT,l=`textNode`;break;case w.ATTRIB_VALUE_ENTITY_Q:c=w.ATTRIB_VALUE_QUOTED,l=`attribValue`;break;case w.ATTRIB_VALUE_ENTITY_U:c=w.ATTRIB_VALUE_UNQUOTED,l=`attribValue`}if(a===`;`){var u=I(n);n.opt.unparsedEntities&&!Object.values(e.XML_ENTITIES).includes(u)?((n.entityCount+=1)>n.opt.maxEntityCount&&A(n,`Parsed entity count exceeds max entity count`),(n.entityDepth+=1)>n.opt.maxEntityDepth&&A(n,`Parsed entity depth exceeds max entity depth`),n.entity=``,n.state=c,n.write(u),--n.entityDepth):(n[l]+=u,n.entity=``,n.state=c)}else C(n.entity.length?b:y,a)?n.entity+=a:(j(n,`Invalid character in entity name`),n[l]+=`&`+n.entity+a,n.entity=``,n.state=c);continue;default:throw Error(n,`Unknown state: `+n.state)}return n.position>=n.bufferCheckPosition&&r(n),n} +Char: `+e.c),t=Error(t),e.error=t,E(e,`onerror`,t),e}function ae(e){return e.sawRoot&&!e.closedRoot&&M(e,`Unclosed root tag`),e.state!==T.BEGIN&&e.state!==T.BEGIN_WHITESPACE&&e.state!==T.TEXT&&j(e,`Unexpected end`),A(e),e.c=``,e.closed=!0,E(e,`onend`),n.call(e,e.strict,e.opt),e}function M(e,t){if(typeof e!=`object`||!(e instanceof n))throw Error(`bad call to strictFail`);e.strict&&j(e,t)}function N(e){e.strict||(e.tagName=e.tagName[e.looseCase]());var t=e.tags[e.tags.length-1]||e,n=e.tag={name:e.tagName,attributes:{}};e.opt.xmlns&&(n.ns=t.ns),e.attribList.length=0,k(e,`onopentagstart`,n)}function P(e,t){var n=e.indexOf(`:`)<0?[``,e]:e.split(`:`),r=n[0],i=n[1];return t&&e===`xmlns`&&(r=`xmlns`,i=``),{prefix:r,local:i}}function F(e){if(e.strict||(e.attribName=e.attribName[e.looseCase]()),e.attribList.indexOf(e.attribName)!==-1||e.tag.attributes.hasOwnProperty(e.attribName))e.attribName=e.attribValue=``;else{if(e.opt.xmlns){var t=P(e.attribName,!0),n=t.prefix,r=t.local;if(n===`xmlns`){if(r===`xml`&&e.attribValue!==m)M(e,`xml: prefix must be bound to `+m+` +Actual: `+e.attribValue);else if(r===`xmlns`&&e.attribValue!==h)M(e,`xmlns: prefix must be bound to `+h+` +Actual: `+e.attribValue);else{var i=e.tag,a=e.tags[e.tags.length-1]||e;i.ns===a.ns&&(i.ns=Object.create(a.ns)),i.ns[r]=e.attribValue}}e.attribList.push([e.attribName,e.attribValue])}else e.tag.attributes[e.attribName]=e.attribValue,k(e,`onattribute`,{name:e.attribName,value:e.attribValue});e.attribName=e.attribValue=``}}function I(e,t){if(e.opt.xmlns){var n=e.tag,r=P(e.tagName);n.prefix=r.prefix,n.local=r.local,n.uri=n.ns[r.prefix]||``,n.prefix&&!n.uri&&(M(e,`Unbound namespace prefix: `+JSON.stringify(e.tagName)),n.uri=r.prefix);var i=e.tags[e.tags.length-1]||e;n.ns&&i.ns!==n.ns&&Object.keys(n.ns).forEach(function(t){k(e,`onopennamespace`,{prefix:t,uri:n.ns[t]})});for(var a=0,o=e.attribList.length;a`,e.state=T.TEXT;else{if(e.script){if(e.tagName!==`script`){e.script+=``,e.tagName=``,e.state=T.SCRIPT;return}k(e,`onscript`,e.script),e.script=``}var t=e.tags.length,n=e.tagName;e.strict||(n=n[e.looseCase]());for(var r=n;t--&&e.tags[t].name!==r;)M(e,`Unexpected close tag`);if(t<0)M(e,`Unmatched closing tag: `+e.tagName),e.textNode+=``,e.state=T.TEXT;else{e.tagName=n;for(var i=e.tags.length;i-->t;){var a=e.tag=e.tags.pop();e.tagName=e.tag.name,k(e,`onclosetag`,e.tagName);var o={};for(var s in a.ns)o[s]=a.ns[s];var c=e.tags[e.tags.length-1]||e;e.opt.xmlns&&a.ns!==c.ns&&Object.keys(a.ns).forEach(function(t){var n=a.ns[t];k(e,`onclosenamespace`,{prefix:t,uri:n})})}t===0&&(e.closedRoot=!0),e.tagName=e.attribValue=e.attribName=``,e.attribList.length=0,e.state=T.TEXT}}}function R(e){var t=e.entity,n=t.toLowerCase(),r,i=``;return e.ENTITIES[t]?e.ENTITIES[t]:e.ENTITIES[n]?e.ENTITIES[n]:(t=n,t.charAt(0)===`#`&&(t.charAt(1)===`x`?(t=t.slice(2),r=parseInt(t,16),i=r.toString(16)):(t=t.slice(1),r=parseInt(t,10),i=r.toString(10))),t=t.replace(/^0+/,``),isNaN(r)||i.toLowerCase()!==t||r<0||r>1114111||!z(r)?(M(e,`Invalid character entity`),`&`+e.entity+`;`):String.fromCodePoint(r))}function z(e){return e===9||e===10||e===13||e>=32&&e<=55295||e>=57344&&e<=65533||e>=65536&&e<=1114111}function oe(e,t){t===`<`?(e.state=T.OPEN_WAKA,e.startTagPosition=e.position):x(t)||(M(e,`Non-whitespace before first tag.`),e.textNode=t,e.state=T.TEXT)}function B(e,t){var n=``;return t`?(k(n,`onsgmldeclaration`,n.sgmlDecl),n.sgmlDecl=``,n.state=T.TEXT):(S(a)&&(n.state=T.SGML_DECL_QUOTED),n.sgmlDecl+=a);continue;case T.SGML_DECL_QUOTED:a===n.q&&(n.state=T.SGML_DECL,n.q=``),n.sgmlDecl+=a;continue;case T.DOCTYPE:a===`>`?(n.state=T.TEXT,k(n,`ondoctype`,n.doctype),n.doctype=!0):(n.doctype+=a,a===`[`?n.state=T.DOCTYPE_DTD:S(a)&&(n.state=T.DOCTYPE_QUOTED,n.q=a));continue;case T.DOCTYPE_QUOTED:n.doctype+=a,a===n.q&&(n.q=``,n.state=T.DOCTYPE);continue;case T.DOCTYPE_DTD:a===`]`?(n.doctype+=a,n.state=T.DOCTYPE):a===`<`?(n.state=T.OPEN_WAKA,n.startTagPosition=n.position):S(a)?(n.doctype+=a,n.state=T.DOCTYPE_DTD_QUOTED,n.q=a):n.doctype+=a;continue;case T.DOCTYPE_DTD_QUOTED:n.doctype+=a,a===n.q&&(n.state=T.DOCTYPE_DTD,n.q=``);continue;case T.COMMENT:a===`-`?n.state=T.COMMENT_ENDING:n.comment+=a;continue;case T.COMMENT_ENDING:a===`-`?(n.state=T.COMMENT_ENDED,n.comment=ie(n.opt,n.comment),n.comment&&k(n,`oncomment`,n.comment),n.comment=``):(n.comment+=`-`+a,n.state=T.COMMENT);continue;case T.COMMENT_ENDED:a===`>`?n.state=n.doctype&&n.doctype!==!0?T.DOCTYPE_DTD:T.TEXT:(M(n,`Malformed comment`),n.comment+=`--`+a,n.state=T.COMMENT);continue;case T.CDATA:for(var o=i-1;a&&a!==`]`;)a=B(t,i++),a&&n.trackPosition&&(n.position++,a===` +`?(n.line++,n.column=0):n.column++);n.cdata+=t.substring(o,i-1),a===`]`&&(n.state=T.CDATA_ENDING);continue;case T.CDATA_ENDING:a===`]`?n.state=T.CDATA_ENDING_2:(n.cdata+=`]`+a,n.state=T.CDATA);continue;case T.CDATA_ENDING_2:a===`>`?(n.cdata&&k(n,`oncdata`,n.cdata),k(n,`onclosecdata`),n.cdata=``,n.state=T.TEXT):a===`]`?n.cdata+=`]`:(n.cdata+=`]]`+a,n.state=T.CDATA);continue;case T.PROC_INST:a===`?`?n.state=T.PROC_INST_ENDING:x(a)?n.state=T.PROC_INST_BODY:n.procInstName+=a;continue;case T.PROC_INST_BODY:if(!n.procInstBody&&x(a))continue;a===`?`?n.state=T.PROC_INST_ENDING:n.procInstBody+=a;continue;case T.PROC_INST_ENDING:if(a===`>`){let e={name:n.procInstName,body:n.procInstBody};re(n,e),k(n,`onprocessinginstruction`,e),n.procInstName=n.procInstBody=``,n.state=T.TEXT}else n.procInstBody+=`?`+a,n.state=T.PROC_INST_BODY;continue;case T.OPEN_TAG:w(v,a)?n.tagName+=a:(N(n),a===`>`?I(n):a===`/`?n.state=T.OPEN_TAG_SLASH:(x(a)||M(n,`Invalid character in tag name`),n.state=T.ATTRIB));continue;case T.OPEN_TAG_SLASH:a===`>`?(I(n,!0),L(n)):(M(n,`Forward-slash in opening tag not followed by >`),n.state=T.ATTRIB);continue;case T.ATTRIB:if(x(a))continue;a===`>`?I(n):a===`/`?n.state=T.OPEN_TAG_SLASH:w(_,a)?(n.attribName=a,n.attribValue=``,n.state=T.ATTRIB_NAME):M(n,`Invalid attribute name`);continue;case T.ATTRIB_NAME:a===`=`?n.state=T.ATTRIB_VALUE:a===`>`?(M(n,`Attribute without value`),n.attribValue=n.attribName,F(n),I(n)):x(a)?n.state=T.ATTRIB_NAME_SAW_WHITE:w(v,a)?n.attribName+=a:M(n,`Invalid attribute name`);continue;case T.ATTRIB_NAME_SAW_WHITE:if(a===`=`)n.state=T.ATTRIB_VALUE;else if(x(a))continue;else M(n,`Attribute without value`),n.tag.attributes[n.attribName]=``,n.attribValue=``,k(n,`onattribute`,{name:n.attribName,value:``}),n.attribName=``,a===`>`?I(n):w(_,a)?(n.attribName=a,n.state=T.ATTRIB_NAME):(M(n,`Invalid attribute name`),n.state=T.ATTRIB);continue;case T.ATTRIB_VALUE:if(x(a))continue;S(a)?(n.q=a,n.state=T.ATTRIB_VALUE_QUOTED):(n.opt.unquotedAttributeValues||j(n,`Unquoted attribute value`),n.state=T.ATTRIB_VALUE_UNQUOTED,n.attribValue=a);continue;case T.ATTRIB_VALUE_QUOTED:if(a!==n.q){a===`&`?n.state=T.ATTRIB_VALUE_ENTITY_Q:n.attribValue+=a;continue}F(n),n.q=``,n.state=T.ATTRIB_VALUE_CLOSED;continue;case T.ATTRIB_VALUE_CLOSED:x(a)?n.state=T.ATTRIB:a===`>`?I(n):a===`/`?n.state=T.OPEN_TAG_SLASH:w(_,a)?(M(n,`No whitespace between attributes`),n.attribName=a,n.attribValue=``,n.state=T.ATTRIB_NAME):M(n,`Invalid attribute name`);continue;case T.ATTRIB_VALUE_UNQUOTED:if(!C(a)){a===`&`?n.state=T.ATTRIB_VALUE_ENTITY_U:n.attribValue+=a;continue}F(n),a===`>`?I(n):n.state=T.ATTRIB;continue;case T.CLOSE_TAG:if(n.tagName)a===`>`?L(n):w(v,a)?n.tagName+=a:n.script?(n.script+=``?L(n):M(n,`Invalid characters in closing tag`);continue;case T.TEXT_ENTITY:case T.ATTRIB_VALUE_ENTITY_Q:case T.ATTRIB_VALUE_ENTITY_U:var c,l;switch(n.state){case T.TEXT_ENTITY:c=T.TEXT,l=`textNode`;break;case T.ATTRIB_VALUE_ENTITY_Q:c=T.ATTRIB_VALUE_QUOTED,l=`attribValue`;break;case T.ATTRIB_VALUE_ENTITY_U:c=T.ATTRIB_VALUE_UNQUOTED,l=`attribValue`}if(a===`;`){var u=R(n);n.opt.unparsedEntities&&!Object.values(e.XML_ENTITIES).includes(u)?((n.entityCount+=1)>n.opt.maxEntityCount&&j(n,`Parsed entity count exceeds max entity count`),(n.entityDepth+=1)>n.opt.maxEntityDepth&&j(n,`Parsed entity depth exceeds max entity depth`),n.entity=``,n.state=c,n.write(u),--n.entityDepth):(n[l]+=u,n.entity=``,n.state=c)}else w(n.entity.length?b:y,a)?n.entity+=a:(M(n,`Invalid character in entity name`),n[l]+=`&`+n.entity+a,n.entity=``,n.state=c);continue;default:throw Error(n,`Unknown state: `+n.state)}return n.position>=n.bufferCheckPosition&&r(n),n} /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */ -String.fromCodePoint||(function(){var e=String.fromCharCode,t=Math.floor,n=function(){var n=16384,r=[],i,a,o=-1,s=arguments.length;if(!s)return``;for(var c=``;++o1114111||t(l)!==l)throw RangeError(`Invalid code point: `+l);l<=65535?r.push(l):(l-=65536,i=(l>>10)+55296,a=l%1024+56320,r.push(i,a)),(o+1===s||r.length>n)&&(c+=e.apply(null,r),r.length=0)}return c};Object.defineProperty?Object.defineProperty(String,"fromCodePoint",{value:n,configurable:!0,writable:!0}):String.fromCodePoint=n})()})(e===void 0?e.sax={}:e)})),y=o(((e,t)=>{t.exports={isArray:function(e){return Array.isArray?Array.isArray(e):Object.prototype.toString.call(e)===`[object Array]`}}})),b=o(((e,t)=>{var n=y().isArray;t.exports={copyOptions:function(e){var t,n={};for(t in e)e.hasOwnProperty(t)&&(n[t]=e[t]);return n},ensureFlagExists:function(e,t){(!(e in t)||typeof t[e]!=`boolean`)&&(t[e]=!1)},ensureSpacesExists:function(e){(!(`spaces`in e)||typeof e.spaces!=`number`&&typeof e.spaces!=`string`)&&(e.spaces=0)},ensureAlwaysArrayExists:function(e){(!(`alwaysArray`in e)||typeof e.alwaysArray!=`boolean`&&!n(e.alwaysArray))&&(e.alwaysArray=!1)},ensureKeyExists:function(e,t){(!(e+`Key`in t)||typeof t[e+`Key`]!=`string`)&&(t[e+`Key`]=t.compact?`_`+e:e)},checkFnExists:function(e,t){return e+`Fn`in t}}})),x=o(((e,t)=>{var n=v(),r={on:function(){},parse:function(){}},i=b(),a=y().isArray,o,s=!0,c;function l(e){return o=i.copyOptions(e),i.ensureFlagExists(`ignoreDeclaration`,o),i.ensureFlagExists(`ignoreInstruction`,o),i.ensureFlagExists(`ignoreAttributes`,o),i.ensureFlagExists(`ignoreText`,o),i.ensureFlagExists(`ignoreComment`,o),i.ensureFlagExists(`ignoreCdata`,o),i.ensureFlagExists(`ignoreDoctype`,o),i.ensureFlagExists(`compact`,o),i.ensureFlagExists(`alwaysChildren`,o),i.ensureFlagExists(`addParent`,o),i.ensureFlagExists(`trim`,o),i.ensureFlagExists(`nativeType`,o),i.ensureFlagExists(`nativeTypeAttributes`,o),i.ensureFlagExists(`sanitize`,o),i.ensureFlagExists(`instructionHasAttributes`,o),i.ensureFlagExists(`captureSpacesBetweenElements`,o),i.ensureAlwaysArrayExists(o),i.ensureKeyExists(`declaration`,o),i.ensureKeyExists(`instruction`,o),i.ensureKeyExists(`attributes`,o),i.ensureKeyExists(`text`,o),i.ensureKeyExists(`comment`,o),i.ensureKeyExists(`cdata`,o),i.ensureKeyExists(`doctype`,o),i.ensureKeyExists(`type`,o),i.ensureKeyExists(`name`,o),i.ensureKeyExists(`elements`,o),i.ensureKeyExists(`parent`,o),i.checkFnExists(`doctype`,o),i.checkFnExists(`instruction`,o),i.checkFnExists(`cdata`,o),i.checkFnExists(`comment`,o),i.checkFnExists(`text`,o),i.checkFnExists(`instructionName`,o),i.checkFnExists(`elementName`,o),i.checkFnExists(`attributeName`,o),i.checkFnExists(`attributeValue`,o),i.checkFnExists(`attributes`,o),o}function u(e){var t=Number(e);if(!isNaN(t))return t;var n=e.toLowerCase();return n===`true`||n!==`false`&&e}function d(e,t){var n;if(o.compact){if(!c[o[e+`Key`]]&&(a(o.alwaysArray)?o.alwaysArray.indexOf(o[e+`Key`])!==-1:o.alwaysArray)&&(c[o[e+`Key`]]=[]),c[o[e+`Key`]]&&!a(c[o[e+`Key`]])&&(c[o[e+`Key`]]=[c[o[e+`Key`]]]),e+`Fn`in o&&typeof t==`string`&&(t=o[e+`Fn`](t,c)),e===`instruction`&&(`instructionFn`in o||`instructionNameFn`in o)){for(n in t)if(t.hasOwnProperty(n)){if(`instructionFn`in o)t[n]=o.instructionFn(t[n],n,c);else{var r=t[n];delete t[n],t[o.instructionNameFn(n,r,c)]=r}}}a(c[o[e+`Key`]])?c[o[e+`Key`]].push(t):c[o[e+`Key`]]=t}else{c[o.elementsKey]||(c[o.elementsKey]=[]);var i={};if(i[o.typeKey]=e,e===`instruction`){for(n in t)if(t.hasOwnProperty(n))break;i[o.nameKey]=`instructionNameFn`in o?o.instructionNameFn(n,t,c):n,o.instructionHasAttributes?(i[o.attributesKey]=t[n][o.attributesKey],`instructionFn`in o&&(i[o.attributesKey]=o.instructionFn(i[o.attributesKey],n,c))):(`instructionFn`in o&&(t[n]=o.instructionFn(t[n],n,c)),i[o.instructionKey]=t[n])}else e+`Fn`in o&&(t=o[e+`Fn`](t,c)),i[o[e+`Key`]]=t;o.addParent&&(i[o.parentKey]=c),c[o.elementsKey].push(i)}}function f(e){if(`attributesFn`in o&&e&&(e=o.attributesFn(e,c)),(o.trim||`attributeValueFn`in o||`attributeNameFn`in o||o.nativeTypeAttributes)&&e){for(var t in e)if(e.hasOwnProperty(t)&&(o.trim&&(e[t]=e[t].trim()),o.nativeTypeAttributes&&(e[t]=u(e[t])),`attributeValueFn`in o&&(e[t]=o.attributeValueFn(e[t],t,c)),`attributeNameFn`in o)){var n=e[t];delete e[t],e[o.attributeNameFn(t,e[t],c)]=n}}return e}function p(e){var t={};if(e.body&&(e.name.toLowerCase()===`xml`||o.instructionHasAttributes)){for(var n=/([\w:-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|(\w+))\s*/g,r;(r=n.exec(e.body))!==null;)t[r[1]]=r[2]||r[3]||r[4];t=f(t)}if(e.name.toLowerCase()===`xml`){if(o.ignoreDeclaration)return;c[o.declarationKey]={},Object.keys(t).length&&(c[o.declarationKey][o.attributesKey]=t),o.addParent&&(c[o.declarationKey][o.parentKey]=c)}else{if(o.ignoreInstruction)return;o.trim&&(e.body=e.body.trim());var i={};o.instructionHasAttributes&&Object.keys(t).length?(i[e.name]={},i[e.name][o.attributesKey]=t):i[e.name]=e.body,d(`instruction`,i)}}function m(e,t){var n;if(typeof e==`object`&&(t=e.attributes,e=e.name),t=f(t),`elementNameFn`in o&&(e=o.elementNameFn(e,c)),o.compact){if(n={},!o.ignoreAttributes&&t&&Object.keys(t).length)for(var r in n[o.attributesKey]={},t)t.hasOwnProperty(r)&&(n[o.attributesKey][r]=t[r]);!(e in c)&&(a(o.alwaysArray)?o.alwaysArray.indexOf(e)!==-1:o.alwaysArray)&&(c[e]=[]),c[e]&&!a(c[e])&&(c[e]=[c[e]]),a(c[e])?c[e].push(n):c[e]=n}else c[o.elementsKey]||(c[o.elementsKey]=[]),n={},n[o.typeKey]=`element`,n[o.nameKey]=e,!o.ignoreAttributes&&t&&Object.keys(t).length&&(n[o.attributesKey]=t),o.alwaysChildren&&(n[o.elementsKey]=[]),c[o.elementsKey].push(n);n[o.parentKey]=c,c=n}function h(e){o.ignoreText||(e.trim()||o.captureSpacesBetweenElements)&&(o.trim&&(e=e.trim()),o.nativeType&&(e=u(e)),o.sanitize&&(e=e.replace(/&/g,`&`).replace(//g,`>`)),d(`text`,e))}function g(e){o.ignoreComment||(o.trim&&(e=e.trim()),d(`comment`,e))}function _(e){var t=c[o.parentKey];o.addParent||delete c[o.parentKey],c=t}function x(e){o.ignoreCdata||(o.trim&&(e=e.trim()),d(`cdata`,e))}function S(e){o.ignoreDoctype||(e=e.replace(/^ /,``),o.trim&&(e=e.trim()),d(`doctype`,e))}function ee(e){e.note=e}t.exports=function(e,t){var i=s?n.parser(!0,{}):i=new r.Parser(`UTF-8`),a={};if(c=a,o=l(t),s?(i.opt={strictEntities:!0},i.onopentag=m,i.ontext=h,i.oncomment=g,i.onclosetag=_,i.onerror=ee,i.oncdata=x,i.ondoctype=S,i.onprocessinginstruction=p):(i.on(`startElement`,m),i.on(`text`,h),i.on(`comment`,g),i.on(`endElement`,_),i.on(`error`,ee)),s)i.write(e).close();else if(!i.parse(e))throw Error(`XML parsing error: `+i.getError());if(a[o.elementsKey]){var u=a[o.elementsKey];delete a[o.elementsKey],a[o.elementsKey]=u,delete a.text}return a}})),S=o(((e,t)=>{var n=b(),r=x();function i(e){var t=n.copyOptions(e);return n.ensureSpacesExists(t),t}t.exports=function(e,t){var n=i(t),a=r(e,n),o,s=`compact`in n&&n.compact?`_parent`:`parent`;return o=`addParent`in n&&n.addParent?JSON.stringify(a,function(e,t){return e===s?`_`:t},n.spaces):JSON.stringify(a,null,n.spaces),o.replace(/\u2028/g,`\\u2028`).replace(/\u2029/g,`\\u2029`)}})),ee=o(((e,t)=>{var n=b(),r=y().isArray,i,a;function o(e){var t=n.copyOptions(e);return n.ensureFlagExists(`ignoreDeclaration`,t),n.ensureFlagExists(`ignoreInstruction`,t),n.ensureFlagExists(`ignoreAttributes`,t),n.ensureFlagExists(`ignoreText`,t),n.ensureFlagExists(`ignoreComment`,t),n.ensureFlagExists(`ignoreCdata`,t),n.ensureFlagExists(`ignoreDoctype`,t),n.ensureFlagExists(`compact`,t),n.ensureFlagExists(`indentText`,t),n.ensureFlagExists(`indentCdata`,t),n.ensureFlagExists(`indentAttributes`,t),n.ensureFlagExists(`indentInstruction`,t),n.ensureFlagExists(`fullTagEmptyElement`,t),n.ensureFlagExists(`noQuotesForNativeAttributes`,t),n.ensureSpacesExists(t),typeof t.spaces==`number`&&(t.spaces=Array(t.spaces+1).join(` `)),n.ensureKeyExists(`declaration`,t),n.ensureKeyExists(`instruction`,t),n.ensureKeyExists(`attributes`,t),n.ensureKeyExists(`text`,t),n.ensureKeyExists(`comment`,t),n.ensureKeyExists(`cdata`,t),n.ensureKeyExists(`doctype`,t),n.ensureKeyExists(`type`,t),n.ensureKeyExists(`name`,t),n.ensureKeyExists(`elements`,t),n.checkFnExists(`doctype`,t),n.checkFnExists(`instruction`,t),n.checkFnExists(`cdata`,t),n.checkFnExists(`comment`,t),n.checkFnExists(`text`,t),n.checkFnExists(`instructionName`,t),n.checkFnExists(`elementName`,t),n.checkFnExists(`attributeName`,t),n.checkFnExists(`attributeValue`,t),n.checkFnExists(`attributes`,t),n.checkFnExists(`fullTagEmptyElement`,t),t}function s(e,t,n){return(!n&&e.spaces?` +/* istanbul ignore next */ +String.fromCodePoint||(function(){var e=String.fromCharCode,t=Math.floor,n=function(){var n=16384,r=[],i,a,o=-1,s=arguments.length;if(!s)return``;for(var c=``;++o1114111||t(l)!==l)throw RangeError(`Invalid code point: `+l);l<=65535?r.push(l):(l-=65536,i=(l>>10)+55296,a=l%1024+56320,r.push(i,a)),(o+1===s||r.length>n)&&(c+=e.apply(null,r),r.length=0)}return c}; +/* istanbul ignore next */ +Object.defineProperty?Object.defineProperty(String,"fromCodePoint",{value:n,configurable:!0,writable:!0}):String.fromCodePoint=n})()})(e===void 0?n.sax={}:e)})),y=/* @__PURE__ */ o(((e,t)=>{t.exports={isArray:function(e){return Array.isArray?Array.isArray(e):Object.prototype.toString.call(e)===`[object Array]`}}})),b=/* @__PURE__ */ o(((e,t)=>{var n=y().isArray;t.exports={copyOptions:function(e){var t,n={};for(t in e)e.hasOwnProperty(t)&&(n[t]=e[t]);return n},ensureFlagExists:function(e,t){(!(e in t)||typeof t[e]!=`boolean`)&&(t[e]=!1)},ensureSpacesExists:function(e){(!(`spaces`in e)||typeof e.spaces!=`number`&&typeof e.spaces!=`string`)&&(e.spaces=0)},ensureAlwaysArrayExists:function(e){(!(`alwaysArray`in e)||typeof e.alwaysArray!=`boolean`&&!n(e.alwaysArray))&&(e.alwaysArray=!1)},ensureKeyExists:function(e,t){(!(e+`Key`in t)||typeof t[e+`Key`]!=`string`)&&(t[e+`Key`]=t.compact?`_`+e:e)},checkFnExists:function(e,t){return e+`Fn`in t}}})),x=/* @__PURE__ */ o(((e,t)=>{var n=v(),r={on:function(){},parse:function(){}},i=b(),a=y().isArray,o,s=!0,c;function l(e){return o=i.copyOptions(e),i.ensureFlagExists(`ignoreDeclaration`,o),i.ensureFlagExists(`ignoreInstruction`,o),i.ensureFlagExists(`ignoreAttributes`,o),i.ensureFlagExists(`ignoreText`,o),i.ensureFlagExists(`ignoreComment`,o),i.ensureFlagExists(`ignoreCdata`,o),i.ensureFlagExists(`ignoreDoctype`,o),i.ensureFlagExists(`compact`,o),i.ensureFlagExists(`alwaysChildren`,o),i.ensureFlagExists(`addParent`,o),i.ensureFlagExists(`trim`,o),i.ensureFlagExists(`nativeType`,o),i.ensureFlagExists(`nativeTypeAttributes`,o),i.ensureFlagExists(`sanitize`,o),i.ensureFlagExists(`instructionHasAttributes`,o),i.ensureFlagExists(`captureSpacesBetweenElements`,o),i.ensureAlwaysArrayExists(o),i.ensureKeyExists(`declaration`,o),i.ensureKeyExists(`instruction`,o),i.ensureKeyExists(`attributes`,o),i.ensureKeyExists(`text`,o),i.ensureKeyExists(`comment`,o),i.ensureKeyExists(`cdata`,o),i.ensureKeyExists(`doctype`,o),i.ensureKeyExists(`type`,o),i.ensureKeyExists(`name`,o),i.ensureKeyExists(`elements`,o),i.ensureKeyExists(`parent`,o),i.checkFnExists(`doctype`,o),i.checkFnExists(`instruction`,o),i.checkFnExists(`cdata`,o),i.checkFnExists(`comment`,o),i.checkFnExists(`text`,o),i.checkFnExists(`instructionName`,o),i.checkFnExists(`elementName`,o),i.checkFnExists(`attributeName`,o),i.checkFnExists(`attributeValue`,o),i.checkFnExists(`attributes`,o),o}function u(e){var t=Number(e);if(!isNaN(t))return t;var n=e.toLowerCase();return n===`true`||n!==`false`&&e}function d(e,t){var n;if(o.compact){if(!c[o[e+`Key`]]&&(a(o.alwaysArray)?o.alwaysArray.indexOf(o[e+`Key`])!==-1:o.alwaysArray)&&(c[o[e+`Key`]]=[]),c[o[e+`Key`]]&&!a(c[o[e+`Key`]])&&(c[o[e+`Key`]]=[c[o[e+`Key`]]]),e+`Fn`in o&&typeof t==`string`&&(t=o[e+`Fn`](t,c)),e===`instruction`&&(`instructionFn`in o||`instructionNameFn`in o)){for(n in t)if(t.hasOwnProperty(n)){if(`instructionFn`in o)t[n]=o.instructionFn(t[n],n,c);else{var r=t[n];delete t[n],t[o.instructionNameFn(n,r,c)]=r}}}a(c[o[e+`Key`]])?c[o[e+`Key`]].push(t):c[o[e+`Key`]]=t}else{c[o.elementsKey]||(c[o.elementsKey]=[]);var i={};if(i[o.typeKey]=e,e===`instruction`){for(n in t)if(t.hasOwnProperty(n))break;i[o.nameKey]=`instructionNameFn`in o?o.instructionNameFn(n,t,c):n,o.instructionHasAttributes?(i[o.attributesKey]=t[n][o.attributesKey],`instructionFn`in o&&(i[o.attributesKey]=o.instructionFn(i[o.attributesKey],n,c))):(`instructionFn`in o&&(t[n]=o.instructionFn(t[n],n,c)),i[o.instructionKey]=t[n])}else e+`Fn`in o&&(t=o[e+`Fn`](t,c)),i[o[e+`Key`]]=t;o.addParent&&(i[o.parentKey]=c),c[o.elementsKey].push(i)}}function f(e){if(`attributesFn`in o&&e&&(e=o.attributesFn(e,c)),(o.trim||`attributeValueFn`in o||`attributeNameFn`in o||o.nativeTypeAttributes)&&e){for(var t in e)if(e.hasOwnProperty(t)&&(o.trim&&(e[t]=e[t].trim()),o.nativeTypeAttributes&&(e[t]=u(e[t])),`attributeValueFn`in o&&(e[t]=o.attributeValueFn(e[t],t,c)),`attributeNameFn`in o)){var n=e[t];delete e[t],e[o.attributeNameFn(t,e[t],c)]=n}}return e}function p(e){var t={};if(e.body&&(e.name.toLowerCase()===`xml`||o.instructionHasAttributes)){for(var n=/([\w:-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|(\w+))\s*/g,r;(r=n.exec(e.body))!==null;)t[r[1]]=r[2]||r[3]||r[4];t=f(t)}if(e.name.toLowerCase()===`xml`){if(o.ignoreDeclaration)return;c[o.declarationKey]={},Object.keys(t).length&&(c[o.declarationKey][o.attributesKey]=t),o.addParent&&(c[o.declarationKey][o.parentKey]=c)}else{if(o.ignoreInstruction)return;o.trim&&(e.body=e.body.trim());var i={};o.instructionHasAttributes&&Object.keys(t).length?(i[e.name]={},i[e.name][o.attributesKey]=t):i[e.name]=e.body,d(`instruction`,i)}}function m(e,t){var n;if(typeof e==`object`&&(t=e.attributes,e=e.name),t=f(t),`elementNameFn`in o&&(e=o.elementNameFn(e,c)),o.compact){if(n={},!o.ignoreAttributes&&t&&Object.keys(t).length)for(var r in n[o.attributesKey]={},t)t.hasOwnProperty(r)&&(n[o.attributesKey][r]=t[r]);!(e in c)&&(a(o.alwaysArray)?o.alwaysArray.indexOf(e)!==-1:o.alwaysArray)&&(c[e]=[]),c[e]&&!a(c[e])&&(c[e]=[c[e]]),a(c[e])?c[e].push(n):c[e]=n}else c[o.elementsKey]||(c[o.elementsKey]=[]),n={},n[o.typeKey]=`element`,n[o.nameKey]=e,!o.ignoreAttributes&&t&&Object.keys(t).length&&(n[o.attributesKey]=t),o.alwaysChildren&&(n[o.elementsKey]=[]),c[o.elementsKey].push(n);n[o.parentKey]=c,c=n}function h(e){o.ignoreText||(e.trim()||o.captureSpacesBetweenElements)&&(o.trim&&(e=e.trim()),o.nativeType&&(e=u(e)),o.sanitize&&(e=e.replace(/&/g,`&`).replace(//g,`>`)),d(`text`,e))}function g(e){o.ignoreComment||(o.trim&&(e=e.trim()),d(`comment`,e))}function _(e){var t=c[o.parentKey];o.addParent||delete c[o.parentKey],c=t}function x(e){o.ignoreCdata||(o.trim&&(e=e.trim()),d(`cdata`,e))}function S(e){o.ignoreDoctype||(e=e.replace(/^ /,``),o.trim&&(e=e.trim()),d(`doctype`,e))}function C(e){e.note=e}t.exports=function(e,t){var i=s?n.parser(!0,{}):i=new r.Parser(`UTF-8`),a={};if(c=a,o=l(t),s?(i.opt={strictEntities:!0},i.onopentag=m,i.ontext=h,i.oncomment=g,i.onclosetag=_,i.onerror=C,i.oncdata=x,i.ondoctype=S,i.onprocessinginstruction=p):(i.on(`startElement`,m),i.on(`text`,h),i.on(`comment`,g),i.on(`endElement`,_),i.on(`error`,C)),s)i.write(e).close();else if(!i.parse(e))throw Error(`XML parsing error: `+i.getError());if(a[o.elementsKey]){var u=a[o.elementsKey];delete a[o.elementsKey],a[o.elementsKey]=u,delete a.text}return a}})),S=/* @__PURE__ */ o(((e,t)=>{var n=b(),r=x();function i(e){var t=n.copyOptions(e);return n.ensureSpacesExists(t),t}t.exports=function(e,t){var n=i(t),a=r(e,n),o,s=`compact`in n&&n.compact?`_parent`:`parent`;return o=`addParent`in n&&n.addParent?JSON.stringify(a,function(e,t){return e===s?`_`:t},n.spaces):JSON.stringify(a,null,n.spaces),o.replace(/\u2028/g,`\\u2028`).replace(/\u2029/g,`\\u2029`)}})),C=/* @__PURE__ */ o(((e,t)=>{var n=b(),r=y().isArray,i,a;function o(e){var t=n.copyOptions(e);return n.ensureFlagExists(`ignoreDeclaration`,t),n.ensureFlagExists(`ignoreInstruction`,t),n.ensureFlagExists(`ignoreAttributes`,t),n.ensureFlagExists(`ignoreText`,t),n.ensureFlagExists(`ignoreComment`,t),n.ensureFlagExists(`ignoreCdata`,t),n.ensureFlagExists(`ignoreDoctype`,t),n.ensureFlagExists(`compact`,t),n.ensureFlagExists(`indentText`,t),n.ensureFlagExists(`indentCdata`,t),n.ensureFlagExists(`indentAttributes`,t),n.ensureFlagExists(`indentInstruction`,t),n.ensureFlagExists(`fullTagEmptyElement`,t),n.ensureFlagExists(`noQuotesForNativeAttributes`,t),n.ensureSpacesExists(t),typeof t.spaces==`number`&&(t.spaces=Array(t.spaces+1).join(` `)),n.ensureKeyExists(`declaration`,t),n.ensureKeyExists(`instruction`,t),n.ensureKeyExists(`attributes`,t),n.ensureKeyExists(`text`,t),n.ensureKeyExists(`comment`,t),n.ensureKeyExists(`cdata`,t),n.ensureKeyExists(`doctype`,t),n.ensureKeyExists(`type`,t),n.ensureKeyExists(`name`,t),n.ensureKeyExists(`elements`,t),n.checkFnExists(`doctype`,t),n.checkFnExists(`instruction`,t),n.checkFnExists(`cdata`,t),n.checkFnExists(`comment`,t),n.checkFnExists(`text`,t),n.checkFnExists(`instructionName`,t),n.checkFnExists(`elementName`,t),n.checkFnExists(`attributeName`,t),n.checkFnExists(`attributeValue`,t),n.checkFnExists(`attributes`,t),n.checkFnExists(`fullTagEmptyElement`,t),t}function s(e,t,n){return(!n&&e.spaces?` `:``)+Array(t+1).join(e.spaces)}function c(e,t,n){if(t.ignoreAttributes)return``;`attributesFn`in t&&(e=t.attributesFn(e,a,i));var r,o,c,l,u=[];for(r in e)e.hasOwnProperty(r)&&e[r]!==null&&e[r]!==void 0&&(l=t.noQuotesForNativeAttributes&&typeof e[r]!=`string`?``:`"`,o=``+e[r],o=o.replace(/"/g,`"`),c=`attributeNameFn`in t?t.attributeNameFn(r,o,a,i):r,u.push(t.spaces&&t.indentAttributes?s(t,n+1,!1):` `),u.push(c+`=`+l+(`attributeValueFn`in t?t.attributeValueFn(o,r,a,i):o)+l));return e&&Object.keys(e).length&&t.spaces&&t.indentAttributes&&u.push(s(t,n,!1)),u.join(``)}function l(e,t,n){return i=e,a=`xml`,t.ignoreDeclaration?``:``}function u(e,t,n){if(t.ignoreInstruction)return``;for(var r in e)if(e.hasOwnProperty(r))break;var o=`instructionNameFn`in t?t.instructionNameFn(r,e[r],a,i):r;if(typeof e[r]==`object`)return i=e,a=o,``;var s=e[r]?e[r]:``;return`instructionFn`in t&&(s=t.instructionFn(s,r,a,i)),``}function d(e,t){return t.ignoreComment?``:``}function f(e,t){return t.ignoreCdata?``:``,`]]]]>`))+`]]>`}function p(e,t){return t.ignoreDoctype?``:``}function m(e,t){return t.ignoreText?``:(e=``+e,e=e.replace(/&/g,`&`),e=e.replace(/&/g,`&`).replace(//g,`>`),`textFn`in t?t.textFn(e,a,i):e)}function h(e,t){var n;if(e.elements&&e.elements.length)for(n=0;n`),e[t.elementsKey]&&e[t.elementsKey].length&&(r.push(_(e[t.elementsKey],t,n+1)),i=e,a=e.name),r.push(t.spaces&&h(e,t)?` -`+Array(n+1).join(t.spaces):``),r.push(``)):r.push(`/>`),r.join(``)}function _(e,t,n,r){return e.reduce(function(e,i){var a=s(t,n,r&&!e);switch(i.type){case`element`:return e+a+g(i,t,n);case`comment`:return e+a+d(i[t.commentKey],t);case`doctype`:return e+a+p(i[t.doctypeKey],t);case`cdata`:return e+(t.indentCdata?a:``)+f(i[t.cdataKey],t);case`text`:return e+(t.indentText?a:``)+m(i[t.textKey],t);case`instruction`:var o={};return o[i[t.nameKey]]=i[t.attributesKey]?i:i[t.instructionKey],e+(t.indentInstruction?a:``)+u(o,t,n)}},``)}function v(e,t,n){for(var r in e)if(e.hasOwnProperty(r))switch(r){case t.parentKey:case t.attributesKey:break;case t.textKey:if(t.indentText||n)return!0;break;case t.cdataKey:if(t.indentCdata||n)return!0;break;case t.instructionKey:if(t.indentInstruction||n)return!0;break;case t.doctypeKey:case t.commentKey:return!0;default:return!0}return!1}function x(e,t,n,r,o){i=e,a=t;var l=`elementNameFn`in n?n.elementNameFn(t,e):t;if(e==null||e===``)return`fullTagEmptyElementFn`in n&&n.fullTagEmptyElementFn(t,e)||n.fullTagEmptyElement?`<`+l+`>`:`<`+l+`/>`;var u=[];if(t){if(u.push(`<`+l),typeof e!=`object`)return u.push(`>`+m(e,n)+``),u.join(``);e[n.attributesKey]&&u.push(c(e[n.attributesKey],n,r));var d=v(e,n,!0)||e[n.attributesKey]&&e[n.attributesKey][`xml:space`]===`preserve`;if(d||=`fullTagEmptyElementFn`in n?n.fullTagEmptyElementFn(t,e):n.fullTagEmptyElement,d)u.push(`>`);else return u.push(`/>`),u.join(``)}return u.push(S(e,n,r+1,!1)),i=e,a=t,t&&u.push((o?s(n,r,!1):``)+``),u.join(``)}function S(e,t,n,i){var a,o,c,h=[];for(o in e)if(e.hasOwnProperty(o))for(c=r(e[o])?e[o]:[e[o]],a=0;a{var n=ee();t.exports=function(e,t){e instanceof Buffer&&(e=e.toString());var r=null;if(typeof e==`string`)try{r=JSON.parse(e)}catch{throw Error(`The JSON structure is invalid`)}else r=e;return n(r,t)}})),te=l(o(((e,t)=>{t.exports={xml2js:x(),xml2json:S(),js2xml:ee(),json2xml:C()}}))());const w=typeof globalThis<`u`&&typeof globalThis.fetch==`function`?globalThis.fetch.bind(globalThis):(()=>{throw Error("tsdav: global fetch is not available in this runtime. Upgrade to Node.js >= 18, run under a browser/Bun/Deno, or install a fetch polyfill on globalThis before importing tsdav. You can also pass a custom `fetch` implementation to `createDAVClient`, `DAVClient`, or individual request helpers.")}),ne=e=>e.replace(/[-_]+(\w?)/g,(e,t)=>t?t.toUpperCase():``);function T(e,t){if(!e)return!1;let n=e=>e!=null&&t.every(t=>e[t]);return Array.isArray(e)?e.length>0&&e.every(e=>n(e)):n(e)}const E=(e,t)=>!e||typeof e!=`object`?t.map(e=>e.toString()).join(`,`):t.reduce((t,n)=>e[n]?t:`${t.length?`${t},`:``}${n.toString()}`,``),D=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),re=new Set(Object.values(m)),ie=new Map([...[`multistatus`,`response`,`propstat`,`prop`,`href`,`status`,`error`,`responsedescription`,`resourcetype`,`collection`,`getetag`,`displayname`,`syncToken`,`supportedReportSet`,`supportedReport`,`report`,`currentUserPrincipal`].map(e=>[e,`DAV:`]),...[`calendarData`,`calendar`,`calendarDescription`,`calendarTimezone`,`calendarHomeSet`,`calendarUserAddressSet`,`supportedCalendarComponentSet`,`comp`].map(e=>[e,`urn:ietf:params:xml:ns:caldav`]),...[`addressData`,`addressbook`,`addressbookHomeSet`].map(e=>[e,`urn:ietf:params:xml:ns:carddav`]),[`getctag`,`http://calendarserver.org/ns/`],[`calendarColor`,`http://apple.com/ns/ical/`]]),O=(e,t)=>{let n=ne(e.replace(/^.*:/,``)),r=ie.get(n);return t&&r&&t!==r?`{${t}}${n}`:n},k=(e,t)=>{let n=Object.assign(Object.create(null),t),r=Object.create(null);for(let[t,i]of Object.entries(e.attributes??{}))(t===`xmlns`||t.startsWith(`xmlns:`))&&(n[t===`xmlns`?``:t.slice(6)]=String(i)),t!==`xmlns`&&(r[t]=i);let i=e.name??``,a=i.indexOf(`:`),o=n[a===-1?``:i.slice(0,a)]??``,s=e.elements??[],c=s.filter(e=>e.type===`element`),l=s.filter(e=>e.type===`text`||e.type===`cdata`).map(e=>String(e.text??e.cdata??``)).join(``),u={},d=Object.create(null);if(Object.keys(r).length&&(u._attributes=r),!c.length){let e=s.some(e=>e.type===`text`),t=s.some(e=>e.type===`cdata`);return e?{value:l,namespace:o,namespaces:d}:(t&&(u._cdata=l),{value:u,namespace:o,namespaces:d})}l.trim()&&(u._text=l);for(let e of c){let t=k(e,n),r=ne((e.name??``).replace(/^.*:/,``)),i=O(e.name??``,t.namespace),a=d[i];if(D(u,i)&&a!==t.namespace){if(re.has(t.namespace)&&!re.has(a)){let e=`{${a}}${r}`;Object.defineProperty(u,e,{value:u[i],enumerable:!0,configurable:!0,writable:!0}),d[e]=a,delete u[i]}else i=`{${t.namespace}}${r}`}D(u,i)?Array.isArray(u[i])?u[i].push(t.value):u[i]=[u[i],t.value]:Object.defineProperty(u,i,{value:t.value,enumerable:!0,configurable:!0,writable:!0}),d[i]=t.namespace,r===`prop`&&t.namespace===`DAV:`&&(u.propNamespaces=t.namespaces)}return{value:u,namespace:o,namespaces:d}},ae=e=>{let t=te.default.xml2js(e,{compact:!1,ignoreDeclaration:!0}),n={};for(let e of t.elements??[]){if(e.type!==`element`)continue;let t=k(e,{}),r=O(e.name??``,t.namespace);Object.defineProperty(n,r,{value:t.value,enumerable:!0})}return n},A=e=>{let t=new Map;for(let n of e)if(n.ok)for(let[e,r]of Object.entries(n.props)){let i=t.get(e)??new Map;i.set(n.namespaces?.[e]??``,r),t.set(e,i)}let n={};for(let[e,r]of t){let t=[...r.keys()].find(e=>re.has(e))??r.keys().next().value;for(let[i,a]of r)Object.defineProperty(n,i===t?e:`{${i}}${e}`,{value:a,enumerable:!0,configurable:!0,writable:!0})}return n};var oe=s({cleanupFalsy:()=>I,conditionalParam:()=>ce,ensureTrailingSlash:()=>M,excludeHeaders:()=>L,getDAVAttribute:()=>F,mergeHeaders:()=>R,urlContains:()=>se,urlEquals:()=>N,urlMatches:()=>P});const j=e=>{let t=e.trim();return t.endsWith(`/`)?t.slice(0,-1):t},M=e=>{let t=e.trim(),n=t.search(/[?#]/),r=n===-1?t:t.slice(0,n),i=n===-1?``:t.slice(n);return`${r.endsWith(`/`)?r:`${r}/`}${i}`},N=(e,t)=>!e&&!t?!0:!e||!t?!1:j(e)===j(t),se=(e,t)=>{if(!e&&!t)return!0;if(!e||!t)return!1;let n=j(e),r=j(t);return n.includes(r)||r.includes(n)},P=(e,t,n)=>{if(!e||!t||!n)return N(e,t);try{return N(new URL(e,n).href,new URL(t,n).href)}catch{return N(e,t)}},F=e=>e.reduce((e,t)=>({...e,[h[t]]:t}),{}),I=e=>Object.entries(e).reduce((e,[t,n])=>n?{...e,[t]:n}:e,{}),ce=(e,t)=>t?{[e]:t}:{},L=(e,t)=>{if(!e)return{};if(!t||t.length===0)return e;let n=new Set(t.map(e=>e.toLowerCase()));return Object.fromEntries(Object.entries(e).filter(([e])=>!n.has(e.toLowerCase())))},R=(...e)=>{let t=new Map,n=(e,n)=>{t.set(e.toLowerCase(),[e,n])};for(let t of e)if(t){if(Array.isArray(t)){for(let[e,r]of t)n(e,r);continue}if(typeof t.forEach==`function`){t.forEach((e,t)=>{n(t,e)});continue}for(let[e,r]of Object.entries(t))n(e,r)}return Object.fromEntries(t.values())};var le=s({createObject:()=>V,davRequest:()=>z,deleteObject:()=>H,propfind:()=>B,updateObject:()=>fe});const ue=(0,p.default)(`tsdav:request`),de=e=>{let t=/^\S+\s+(?\d{3})(?:\s+(?.*))?$/.exec(e?.trim()??``),n=t?.groups?.status,r=t?.groups?.statusText;return n?{status:Number.parseInt(n,10),statusText:r??``}:void 0},z=async e=>{let{url:t,init:n,convertIncoming:r=!0,parseOutgoing:i=!0,headersToExclude:a,fetchOptions:o={},fetch:s}=e,c=s??w,{headers:l={},body:u,namespace:d,method:f,attributes:p}=n,m=u;p&&typeof u==`object`&&u&&!Array.isArray(u)&&(m=Object.fromEntries(Object.entries(u).map(([e,t])=>{if(t&&typeof t==`object`&&!Array.isArray(t)){let n=t;return[e,{...n,_attributes:{...p,...n._attributes}}]}return[e,t]})));let h=r&&u!=null?te.default.js2xml({_declaration:{_attributes:{version:`1.0`,encoding:`utf-8`}},...m},{compact:!0,spaces:2,elementNameFn:e=>d&&!/^.+:.+/.test(e)?`${d}:${e}`:e}):u,g={...o};delete g.headers;let _=L(R({"Content-Type":`text/xml;charset=UTF-8`},I(l),o.headers),a),v=await c(t,{...g,headers:_,body:h,method:f}),y=await v.text();if(!v.ok||!v.headers.get(`content-type`)?.toLowerCase().includes(`xml`)||!i||!y)return[{href:v.url,ok:v.ok,status:v.status,statusText:v.statusText,raw:y}];let b;try{b=ae(y)}catch(e){return ue(`Failed to parse DAV response XML: ${e.message}`),[{href:v.url,ok:!1,status:v.status,statusText:v.statusText,raw:y,parseError:e.message}]}return b?.multistatus?(Array.isArray(b.multistatus.response)?b.multistatus.response:[b.multistatus.response]).map(e=>{if(!e)return{raw:b,status:v.status,statusText:v.statusText,ok:v.ok};let t=(Array.isArray(e.propstat)?e.propstat:e.propstat?[e.propstat]:[]).map(e=>{let t=de(e.status),n=t?.status??0;return{props:e.prop??{},namespaces:e.propNamespaces,status:n,statusText:t?.statusText??`Invalid DAV property status`,ok:n>=200&&n<300,error:e.error,responsedescription:e.responsedescription}}),n=t.length>0&&t.every(e=>!e.ok)?t[0]:void 0,r=de(e.status)??n,i=r?.status??v.status;return{raw:b,href:e.href,status:i,statusText:r?.statusText??v.statusText,ok:i>=200&&i<300,error:e.error,responsedescription:e.responsedescription,propStats:t,props:A(t)}}):[{href:v.url,ok:v.ok,status:v.status,statusText:v.statusText,raw:b}]},B=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return z({url:t,init:{method:`PROPFIND`,headers:L(I({depth:r,...i}),a),namespace:`d`,body:{propfind:{_attributes:F([`urn:ietf:params:xml:ns:caldav`,`http://apple.com/ns/ical/`,`http://calendarserver.org/ns/`,`urn:ietf:params:xml:ns:carddav`,`DAV:`]),prop:n}}},headersToExclude:a,fetchOptions:o,fetch:s})},V=async e=>{let{url:t,data:n,headers:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e,s=o??w,{headers:c,...l}=a;return s(t,{...l,method:`PUT`,body:n,headers:L(R(r,c),i)})},fe=async e=>{let{url:t,data:n,etag:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e,c=s??w,{headers:l,...u}=o;return c(t,{...u,method:`PUT`,body:n,headers:L(R(I({"If-Match":r,...i}),l),a)})},H=async e=>{let{url:t,headers:n,etag:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e,s=o??w,{headers:c,...l}=a;return s(t,{...l,method:`DELETE`,headers:L(R(I({"If-Match":r,...n}),c),i)})},U=(e,t)=>{let n;try{n=new URL(e,M(t)).href}catch{n=e.trim()}return n.endsWith(`/`)?n.slice(0,-1):n},pe=(e,t,n,r=!1,i=[])=>{let a=new Map(e.map(e=>[U(e.url,n),e])),o=new Map(t.map(e=>[U(e.url,n),e])),s=r?i:e.filter(e=>!o.has(U(e.url,n))),c=new Set(s.map(e=>U(e.url,n))),l=t.filter(e=>!a.has(U(e.url,n))),u=[],d=[];for(let t of e){let e=U(t.url,n);if(c.has(e))continue;let i=o.get(e);i&&i.etag!==t.etag?u.push(i):(i||r)&&d.push(t)}return{created:l,updated:u,deleted:s,unchanged:d}},me=(e,t)=>{let n=e.find(e=>!e.ok||e.status>=400);if(n)throw Error(`${t}: ${n.status} ${n.statusText}`)},he=(e,t)=>{me(e,t);for(let n of e)if((!n.raw?.multistatus||n.raw.multistatus.response)&&(ge(n,`resourcetype`,t),!n.props||!D(n.props,`resourcetype`)||typeof n.href!=`string`||!n.href))throw Error(`${t}: missing resourcetype or href in DAV multistatus response`)},ge=(e,t,n)=>{let r=e.propStats?.find(e=>!e.ok&&D(e.props,t));if(r&&!D(e.props??{},t))throw Error(`${n}: ${t} returned ${r.status} ${r.statusText}`)},_e=(e,t,n,r,i)=>{me(e,i);let a=new Set;for(let n of e){if(ge(n,t,i),!n.href||typeof(n.props?.[t]?._cdata??n.props?.[t])!=`string`)throw Error(`${i}: missing ${t} or href`);a.add(U(n.href,r))}let o=e=>U(e.replace(/\?.*$/,``),r),s=new Map;for(let e of n){let t=o(e);s.set(t,(s.get(t)??0)+1)}if(n.some(e=>!a.has(U(e,r))&&!(s.get(o(e))===1&&a.has(o(e)))))throw Error(`${i}: incomplete response`)},W=e=>{let t=typeof e==`string`||typeof e==`number`?String(e):e?._cdata??e?._text;return typeof t==`string`?t:void 0};var ve=s({collectionQuery:()=>G,isCollectionDirty:()=>Ce,makeCollection:()=>xe,smartCollectionSync:()=>Te,smartCollectionSyncDetailed:()=>Ee,supportedReportSet:()=>Se,syncCollection:()=>we});const ye=(0,p.default)(`tsdav:collection`),be=(e,t)=>{try{return new URL(e,M(t)).href}catch{return e}},G=async e=>{let{url:t,body:n,depth:r,defaultNamespace:i=`d`,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e,l=await z({url:t,init:{method:`REPORT`,headers:L(I({depth:r,...a}),o),namespace:i,body:n},headersToExclude:o,fetchOptions:s,fetch:c}),u=l[0];if(i===`c`&&n?.[`calendar-query`]!=null&&l.length===1&&u&&u.status===404&&P(t,u.href,t)&&!u.error&&Object.keys(u.props??{}).length===0&&typeof u.raw==`object`&&u.raw!==null&&u.raw.multistatus?.response?.propstat==null)return[];let d=l.find(e=>!e.ok||e.status&&e.status>=400);if(d)throw Error(`Collection query failed: ${d.status} ${d.statusText}. ${typeof d.raw==`string`?`Raw response: ${d.raw.slice(0,4096)}`:``}`);if((n?.[`calendar-query`]||n?.[`calendar-multiget`]||n?.[`addressbook-query`]||n?.[`addressbook-multiget`])&&l.some(e=>!e.raw?.multistatus))throw Error(`Collection query failed: expected a DAV multistatus response`);if((n?.[`calendar-query`]||n?.[`calendar-multiget`]||n?.[`addressbook-query`]||n?.[`addressbook-multiget`])&&l.some(e=>e.raw?.multistatus?.response&&(typeof e.href!=`string`||!e.href)))throw Error(`Collection query failed: missing href in DAV response`);let f=l[0];return l.length===1&&f&&(!f.raw||f.raw.multistatus&&!f.raw.multistatus.response)&&f.status&&f.status<300?[]:l},xe=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return z({url:t,init:{method:`MKCOL`,headers:L(I({depth:r,...i}),a),namespace:`d`,body:n?{mkcol:{_attributes:F([`DAV:`,`urn:ietf:params:xml:ns:caldav`,`urn:ietf:params:xml:ns:carddav`,`http://calendarserver.org/ns/`,`http://apple.com/ns/ical/`]),set:{prop:n}}}:void 0},headersToExclude:a,fetchOptions:o,fetch:s})},Se=async e=>{let{collection:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=(await B({url:t.url,props:{"d:supported-report-set":{}},depth:`0`,headers:L(n,r),headersToExclude:r,fetchOptions:i,fetch:a}))[0]?.props?.supportedReportSet?.supportedReport;return o?(Array.isArray(o)?o:[o]).map(e=>e?.report?Object.keys(e.report)[0]:void 0).filter(e=>typeof e==`string`&&e.length>0):[]},Ce=async e=>{let{collection:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=(await B({url:t.url,props:{"cs:getctag":{}},depth:`0`,headers:L(n,r),headersToExclude:r,fetchOptions:i,fetch:a})).find(e=>P(t.url,e.href,t.url));if(!o)throw Error(`Collection does not exist on server`);let s=o.propStats?.length&&o.propStats.every(e=>e.status===404&&D(e.props,`getctag`));if(!o.ok&&!s)throw Error(`Collection status check failed: ${o.status} ${o.statusText}`);let c=W(o.props?.getctag);return{isDirty:t.ctag==null||c==null||`${t.ctag}`!=`${c}`,newCtag:c}},we=e=>{let{url:t,props:n,headers:r,syncLevel:i,syncToken:a,headersToExclude:o,fetchOptions:s,fetch:c}=e;return z({url:t,init:{method:`REPORT`,namespace:`d`,headers:L({...r},o),body:{"sync-collection":{_attributes:F([`urn:ietf:params:xml:ns:caldav`,`urn:ietf:params:xml:ns:carddav`,`DAV:`]),"sync-level":i,"sync-token":a,"d:prop":n}}},headersToExclude:o,fetchOptions:s,fetch:c})},Te=async e=>{let{collection:t,method:n,headers:r,headersToExclude:i,account:a,detailedResult:o,fetchOptions:s={},fetch:c}=e,l=[`accountType`,`homeUrl`];if(!a||!T(a,l))throw Error(a?`account must have ${E(a,l)} before smartCollectionSync`:`no account for smartCollectionSync`);let u=n??(t.reports?.includes(`syncCollection`)?`webdav`:`basic`);if(ye(`smart collection sync with type ${a.accountType} and method ${u}`),u===`webdav`){let e=await we({url:t.url,props:{"d:getetag":{},[`${a.accountType===`caldav`?`c`:`card`}:${a.accountType===`caldav`?`calendar-data`:`address-data`}`]:{},"d:displayname":{}},syncLevel:1,syncToken:t.syncToken,headers:L(r,i),headersToExclude:i,fetchOptions:s,fetch:c}),n=e=>typeof e.href==`string`&&U(e.href,t.url)!==U(t.url,t.url)&&!e.props?.resourcetype?.collection,l=e.find(e=>(!e.ok||e.status>=400)&&!(e.status===404&&!e.propStats?.length&&n(e)));if(l)throw Error(`Collection sync failed: ${l.status} ${l.statusText}`);if(e.some(e=>e.raw&&!e.raw.multistatus))throw Error(`Collection sync failed: expected a DAV multistatus response`);if(e.some(e=>e.raw?.multistatus?.response&&(typeof e.href!=`string`||!e.href)))throw Error(`Collection sync failed: missing href in DAV response`);let u=e.filter(n),d=u.filter(e=>e.status!==404).map(e=>e.href),f=u.filter(e=>e.status===404).map(e=>e.href),p=t.objectMultiGet;if(d.length>0&&!p)throw Error(`collection.objectMultiGet is required for webdav sync changes`);let m=d.length?await p?.({url:t.url,props:{"d:getetag":{},[`${a.accountType===`caldav`?`c`:`card`}:${a.accountType===`caldav`?`calendar-data`:`address-data`}`]:{}},objectUrls:d,depth:`1`,headers:L(r,i),headersToExclude:i,fetchOptions:s,fetch:c})??[]:[];_e(m,a.accountType===`caldav`?`calendarData`:`addressData`,d,t.url,`Collection sync multi-get failed`);let h=m.map(e=>({url:be(e.href??``,t.url),etag:W(e.props?.getetag),data:a?.accountType===`caldav`?e.props?.calendarData?._cdata??e.props?.calendarData:e.props?.addressData?._cdata??e.props?.addressData})),g=t.objects??[],_=f.map(e=>({url:be(e,t.url),etag:``})),{created:v,updated:y,deleted:b,unchanged:x}=pe(g,h,t.url,!0,_);return{...t,objects:o?{created:v,updated:y,deleted:b}:[...x,...v,...y],syncToken:W(e[0]?.raw?.multistatus?.syncToken)??t.syncToken}}if(u===`basic`){let{isDirty:e,newCtag:n}=await Ce({collection:t,headers:L(r,i),headersToExclude:i,fetchOptions:s,fetch:c});if(!e)return o?{...t,objects:{created:[],updated:[],deleted:[]}}:t;let a=t.objects??[];if(!t.fetchObjects)throw Error(`collection.fetchObjects is required for basic sync changes`);let l=await t.fetchObjects({collection:t,headers:L(r,i),headersToExclude:i,fetchOptions:s,fetch:c})??[],{created:u,updated:d,deleted:f,unchanged:p}=pe(a,l,t.url);return{...t,objects:o?{created:u,updated:d,deleted:f}:[...p,...u,...d],ctag:n}}return o?{...t,objects:{created:[],updated:[],deleted:[]}}:t},Ee=async e=>Te({...e,detailedResult:!0});var De=s({addressBookMultiGet:()=>ke,addressBookQuery:()=>K,createVCard:()=>Me,deleteVCard:()=>Pe,fetchAddressBooks:()=>Ae,fetchVCards:()=>je,updateVCard:()=>Ne});const Oe=(0,p.default)(`tsdav:addressBook`),K=async e=>{let{url:t,props:n,filters:r,depth:i,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e;return G({url:t,body:{"addressbook-query":I({_attributes:F([`urn:ietf:params:xml:ns:carddav`,`DAV:`]),"d:prop":n,filter:r??{"prop-filter":{_attributes:{name:`FN`}}}})},defaultNamespace:`card`,depth:i,headers:L(a,o),headersToExclude:o,fetchOptions:s,fetch:c})},ke=async e=>{let{url:t,props:n,objectUrls:r,depth:i,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e;return G({url:t,body:{"addressbook-multiget":I({_attributes:F([`DAV:`,`urn:ietf:params:xml:ns:carddav`]),"d:prop":n,"d:href":r})},defaultNamespace:`card`,depth:i,headers:L(a,o),headersToExclude:o,fetchOptions:s,fetch:c})},Ae=async e=>{let{account:t,headers:n,props:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e??{},s=[`homeUrl`,`rootUrl`];if(!t||!T(t,s))throw Error(t?`account must have ${E(t,s)} before fetchAddressBooks`:`no account for fetchAddressBooks`);let c=await B({url:t.homeUrl,props:{...r??{"d:displayname":{},"cs:getctag":{},"d:resourcetype":{},"d:sync-token":{}},"d:resourcetype":{}},depth:`1`,headers:L(n,i),headersToExclude:i,fetchOptions:a,fetch:o});return he(c,`Address book discovery failed`),Promise.all(c.filter(e=>Object.keys(e.props?.resourcetype??{}).includes(`addressbook`)).map(e=>{let n=e.props?.displayname?._cdata??e.props?.displayname;return Oe(`Found address book named ${typeof n==`string`?n:``}, - props: ${JSON.stringify(e.props)}`),{url:new URL(e.href??``,M(t.rootUrl??``)).href,ctag:W(e.props?.getctag),displayName:typeof n==`string`?n:``,resourcetype:Object.keys(e.props?.resourcetype??{}),syncToken:W(e.props?.syncToken)}}).map(async e=>({...e,reports:await Se({collection:e,headers:L(n,i),headersToExclude:i,fetchOptions:a,fetch:o})})))},je=async e=>{let{addressBook:t,headers:n,objectUrls:r,headersToExclude:i,urlFilter:a=e=>!!e,useMultiGet:o=!0,fetchOptions:s={},fetch:c}=e;Oe(`Fetching vcards from ${t?.url}`);let l=[`url`];if(!t||!T(t,l))throw Error(t?`addressBook must have ${E(t,l)} before fetchVCards`:`cannot fetchVCards for undefined addressBook`);let u=(r??(await K({url:t.url,props:{"d:getetag":{}},depth:`1`,headers:L(n,i),headersToExclude:i,fetchOptions:s,fetch:c})).map(e=>e.href??``)).filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.startsWith(`http`)?e:new URL(e,M(t.url)).href).filter(e=>!N(e,t.url)).filter(a).map(e=>{let t=new URL(e);return`${t.pathname}${t.search}`}),d=new Set(u.map(e=>U(e,t.url))),f=[];return u.length>0&&(o?f=await ke({url:t.url,props:{"d:getetag":{},"card:address-data":{}},objectUrls:u,depth:`1`,headers:L(n,i),headersToExclude:i,fetchOptions:s,fetch:c}):(f=await K({url:t.url,props:{"d:getetag":{},"card:address-data":{}},depth:`1`,headers:L(n,i),headersToExclude:i,fetchOptions:s,fetch:c}),f=f.filter(e=>!!e.href&&d.has(U(e.href,t.url))))),_e(f,`addressData`,u,t.url,`VCard fetch failed`),f.map(e=>({url:new URL(e.href??``,M(t.url)).href,etag:W(e.props?.getetag),data:e.props?.addressData?._cdata??e.props?.addressData}))},Me=async e=>{let{addressBook:t,vCardString:n,filename:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return V({url:new URL(r,M(t.url)).href,data:n,headers:L({"content-type":`text/vcard; charset=utf-8`,"If-None-Match":`*`,...i},a),headersToExclude:a,fetchOptions:o,fetch:s})},Ne=async e=>{let{vCard:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return fe({url:t.url,data:t.data,etag:t.etag,headers:L({"content-type":`text/vcard; charset=utf-8`,...n},r),headersToExclude:r,fetchOptions:i,fetch:a})},Pe=async e=>{let{vCard:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return H({url:t.url,etag:t.etag,headers:L(n,r),headersToExclude:r,fetchOptions:i,fetch:a})};var Fe=s({calendarMultiGet:()=>J,calendarQuery:()=>q,createCalendarObject:()=>Ge,deleteCalendarObject:()=>qe,fetchCalendarObjects:()=>We,fetchCalendarUserAddresses:()=>Ve,fetchCalendars:()=>Ue,freeBusyQuery:()=>Xe,makeCalendar:()=>He,syncCalendars:()=>Je,syncCalendarsDetailed:()=>Ye,updateCalendarObject:()=>Ke});const Ie=(0,p.default)(`tsdav:calendar`),Le=/^\d{4}(-\d\d(-\d\d(T\d\d:\d\d(:\d\d)?(\.\d+)?(([+-]\d\d:\d\d)|Z)?)?)?)?$/i,Re=/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(\.\d+)?(([+-]\d\d:\d\d)|Z)?$/i,ze=e=>{let{start:t,end:n}=e;if(!(Le.test(t)&&Le.test(n)||Re.test(t)&&Re.test(n)))throw Error(`invalid timeRange format, not in ISO8601`);if(Number.isNaN(new Date(t).getTime())||Number.isNaN(new Date(n).getTime()))throw Error(`invalid timeRange: start or end is not a valid date`);if(new Date(t).getTime()>=new Date(n).getTime())throw Error(`invalid timeRange: start must be before end`)},Be=e=>{let t=[];return Array.isArray(e)?t=e.map(e=>e?._attributes?.name):e&&typeof e==`object`&&(t=[e._attributes?.name]),t.filter(e=>typeof e==`string`&&e.length>0)},Ve=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`principalUrl`,`rootUrl`];if(!T(t,o))throw Error(`account must have ${E(t,o)} before fetchUserAddresses`);Ie(`Fetch user addresses from ${t.principalUrl}`);let s=(await B({url:t.principalUrl,props:{"c:calendar-user-address-set":{}},depth:`0`,headers:L(n,r),headersToExclude:r,fetchOptions:i,fetch:a})).find(e=>P(t.principalUrl,e.href,t.rootUrl));if(!s||!s.ok)throw Error(`cannot find calendarUserAddresses`);let c=s?.props?.calendarUserAddressSet?.href,l=[];Array.isArray(c)?l=c:c&&(l=[c]);let u=l.filter(e=>typeof e==`string`&&e.length>0);return Ie(`Fetched calendar user addresses ${u}`),u},q=async e=>{let{url:t,props:n,filters:r,timezone:i,depth:a,headers:o,headersToExclude:s,fetchOptions:c={},fetch:l}=e;return G({url:t,body:{"calendar-query":I({_attributes:F([`urn:ietf:params:xml:ns:caldav`,`http://calendarserver.org/ns/`,`http://apple.com/ns/ical/`,`DAV:`]),"d:prop":n,filter:r,timezone:i})},defaultNamespace:`c`,depth:a,headers:L(o,s),headersToExclude:s,fetchOptions:c,fetch:l})},J=async e=>{let{url:t,props:n,objectUrls:r,filters:i,timezone:a,depth:o,headers:s,headersToExclude:c,fetchOptions:l={},fetch:u}=e;return G({url:t,body:{"calendar-multiget":I({_attributes:F([`DAV:`,`urn:ietf:params:xml:ns:caldav`]),"d:prop":n,"d:href":r,filter:i,timezone:a})},defaultNamespace:`c`,depth:o,headers:L(s,c),headersToExclude:c,fetchOptions:l,fetch:u})},He=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return z({url:t,init:{method:`MKCALENDAR`,headers:L(I({depth:r,...i}),a),namespace:`d`,body:{"c:mkcalendar":{_attributes:F([`DAV:`,`urn:ietf:params:xml:ns:caldav`,`http://apple.com/ns/ical/`]),set:{prop:n}}}},headersToExclude:a,fetchOptions:o,fetch:s})},Ue=async e=>{let{headers:t,account:n,props:r,projectedProps:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e??{},c=[`homeUrl`,`rootUrl`];if(!n||!T(n,c))throw Error(n?`account must have ${E(n,c)} before fetchCalendars`:`no account for fetchCalendars`);let l=await B({url:n.homeUrl,props:{...r??{"c:calendar-description":{},"c:calendar-timezone":{},"d:displayname":{},"ca:calendar-color":{},"cs:getctag":{},"d:resourcetype":{},"c:supported-calendar-component-set":{},"d:sync-token":{}},"d:resourcetype":{},"c:supported-calendar-component-set":{}},depth:`1`,headers:L(t,a),headersToExclude:a,fetchOptions:o,fetch:s});return he(l,`Calendar discovery failed`),Promise.all(l.filter(e=>Object.keys(e.props?.resourcetype??{}).includes(`calendar`)).filter(e=>{let t=Be(e.props?.supportedCalendarComponentSet?.comp);return t.length===0||t.some(e=>Object.values(_).includes(e))}).map(e=>{let t=e.props?.calendarDescription,r=e.props?.calendarTimezone,a=e.props?.supportedCalendarComponentSet?.comp,o=Object.entries(e.props??{}).filter(([e])=>i?.[e]);return{description:typeof t==`string`?t:``,timezone:typeof r==`string`?r:``,url:new URL(e.href??``,M(n.rootUrl??``)).href,ctag:W(e.props?.getctag),calendarColor:e.props?.calendarColor,displayName:W(e.props?.displayname),components:Be(a),resourcetype:Object.keys(e.props?.resourcetype??{}),syncToken:W(e.props?.syncToken),...i&&o.length>0?{projectedProps:Object.fromEntries(o)}:{}}}).map(async e=>({...e,reports:await Se({collection:e,headers:L(t,a),headersToExclude:a,fetchOptions:o,fetch:s})})))},We=async e=>{let{calendar:t,objectUrls:n,filters:r,timeRange:i,headers:a,expand:o,urlFilter:s=e=>!!e?.includes(`.ics`),useMultiGet:c=!0,headersToExclude:l,fetchOptions:u={},fetch:d}=e;if(o&&!i)throw Error(`timeRange is required when expand is true`);i&&ze(i),Ie(`Fetching calendar objects from ${t?.url}`);let f=[`url`];if(!t||!T(t,f))throw Error(t?`calendar must have ${E(t,f)} before fetchCalendarObjects`:`cannot fetchCalendarObjects for undefined calendar`);let p=r??[{"comp-filter":{_attributes:{name:`VCALENDAR`},"comp-filter":{_attributes:{name:`VEVENT`},...i?{"time-range":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}}}],m=[];n||(m=await q({url:t.url,props:{"d:getetag":{},...o&&i?{"c:calendar-data":{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}}:{}},filters:p,depth:`1`,headers:L(a,l),headersToExclude:l,fetchOptions:u,fetch:d}));let h=(n??m.map(e=>e.href??``)).filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.startsWith(`http`)?e:new URL(e,M(t.url)).href).filter(s).map(e=>{let t=new URL(e);return`${t.pathname}${t.search}`}),g=new Set(h.map(e=>U(e,t.url))),_=[];return h.length>0&&(o&&!n?_=m.filter(e=>{let n=(e.href??``).startsWith(`http`)?e.href:new URL(e.href??``,M(t.url)).href;return s(n??``)}):c?_=await J({url:t.url,props:{"d:getetag":{},"c:calendar-data":{...o&&i?{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}},objectUrls:h,depth:`1`,headers:L(a,l),headersToExclude:l,fetchOptions:u,fetch:d}):(_=await q({url:t.url,props:{"d:getetag":{},"c:calendar-data":{...o&&i?{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}},filters:p,depth:`1`,headers:L(a,l),headersToExclude:l,fetchOptions:u,fetch:d}),_=_.filter(e=>{let n=(e.href??``).startsWith(`http`)?e.href??``:new URL(e.href??``,M(t.url)).href;return g.has(U(n,t.url))}))),_e(_,`calendarData`,h,t.url,`Calendar object fetch failed`),_.map(e=>({url:new URL(e.href??``,M(t.url)).href,etag:W(e.props?.getetag),data:e.props?.calendarData?._cdata??e.props?.calendarData}))},Ge=async e=>{let{calendar:t,iCalString:n,filename:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return V({url:new URL(r,M(t.url)).href,data:n,headers:L({"content-type":`text/calendar; charset=utf-8`,"If-None-Match":`*`,...i},a),headersToExclude:a,fetchOptions:o,fetch:s})},Ke=async e=>{let{calendarObject:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return fe({url:t.url,data:t.data,etag:t.etag,headers:L({"content-type":`text/calendar; charset=utf-8`,...n},r),headersToExclude:r,fetchOptions:i,fetch:a})},qe=async e=>{let{calendarObject:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return H({url:t.url,etag:t.etag,headers:L(n,r),headersToExclude:r,fetchOptions:i,fetch:a})},Je=async e=>{let{oldCalendars:t,account:n,detailedResult:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;if(!n)throw Error(`Must have account before syncCalendars`);let c=t??n.calendars??[],l=await Ue({account:n,headers:L(i,a),headersToExclude:a,fetchOptions:o,fetch:s}),u=n.rootUrl??n.homeUrl??n.serverUrl,d=new Map(c.map(e=>[U(e.url,u),e])),f=new Map(l.map(e=>[U(e.url,u),e])),p=l.filter(e=>!d.has(U(e.url,u))),m=[],h=[],g=[];for(let e of c){let t=f.get(U(e.url,u));t?!t.syncToken&&!t.ctag||t.syncToken&&t.syncToken!==e.syncToken||t.ctag&&t.ctag!==e.ctag?m.push({local:e,remote:t}):h.push(e):g.push(e)}Ie(`updated calendars: ${m.map(({remote:e})=>e.displayName)}`);let _=await Promise.all(m.map(async({local:e,remote:t})=>{let r=async e=>{if(!e)return[];let{collection:t,...n}=e;return We({...n,calendar:t,filters:{"comp-filter":{_attributes:{name:`VCALENDAR`}}},urlFilter:e=>U(e,t.url)!==U(t.url,t.url)})},c={...t,ctag:e.ctag,syncToken:e.syncToken,objects:e.objects,objectMultiGet:J,fetchObjects:r},l=await Te({collection:c,detailedResult:!1,headers:L(i,a),headersToExclude:a,account:n,fetchOptions:o,fetch:s});return{...l,ctag:t.reports?.includes(`syncCollection`)?t.ctag??l.ctag:l.ctag??t.ctag,syncToken:t.reports?.includes(`syncCollection`)?l.syncToken:t.syncToken??l.syncToken}}));return r?{created:p,updated:_,deleted:g}:[...h,...p,..._]},Ye=async e=>Je({...e,detailedResult:!0}),Xe=async e=>{let{url:t,timeRange:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;if(!n)throw Error(`timeRange is required`);ze(n);let c=(await G({url:t,body:{"free-busy-query":I({_attributes:F([`urn:ietf:params:xml:ns:caldav`]),"c:time-range":{_attributes:{start:`${new Date(n.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(n.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}})},defaultNamespace:`c`,depth:r,headers:L(i,a),headersToExclude:a,fetchOptions:o,fetch:s}))[0];if(!c)throw Error(`freeBusyQuery returned no response`);return c},Ze=[[7,12,17,22],[5,9,14,20],[4,11,16,23],[6,10,15,21]],Qe=Array.from({length:64},(e,t)=>Math.floor(Math.abs(Math.sin(t+1))*2**32)),$e=e=>{let t=``;for(let n=0;n<4;n+=1)t+=(e>>>n*8&255).toString(16).padStart(2,`0`);return t},et=e=>{let t=new TextEncoder().encode(e),n=(t.length+8>>>6)+1<<6,r=new Uint8Array(n);r.set(t),r[t.length]=128;let i=new DataView(r.buffer),a=t.length*8;i.setUint32(n-8,a>>>0,!0),i.setUint32(n-4,Math.floor(a/2**32),!0);let o=1732584193,s=4023233417,c=2562383102,l=271733878;for(let e=0;e>>4][o%4];t=a,a=r,r=n,n=n+(l<>>32-u)|0}o=o+t|0,s=s+n|0,c=c+r|0,l=l+a|0}return $e(o)+$e(s)+$e(c)+$e(l)},tt=(0,p.default)(`tsdav:digestAuth`),nt=/[!#$%&'*+.^_`|~0-9A-Za-z-]+/y,rt=e=>{let t=[],n,r=0,i=t=>{for(;r{let t=(e.algorithm??`MD5`).toUpperCase();if(e.realm==null||!e.nonce||!it.includes(t))return;let n=e.qop?.split(`,`).map(e=>e.trim().toLowerCase());if((!n||n.includes(`auth`))&&(n||!t.endsWith(`-SESS`)))return{realm:e.realm,nonce:e.nonce,opaque:e.opaque,domain:e.domain,qop:n?`auth`:void 0,algorithm:t,stale:e.stale?.toLowerCase()===`true`}},ot=(e,{unlessBasic:t=!1,allowSHA256:n=!0}={})=>{let r=rt(e??``);if(!(t&&r.some(({scheme:e})=>e===`basic`)))return r.filter(({scheme:e})=>e===`digest`).map(({params:e})=>at(e)).filter(e=>e!=null).filter(e=>n||!e.algorithm.startsWith(`SHA`)).sort((e,t)=>it.indexOf(e.algorithm)-it.indexOf(t.algorithm))[0]},st=e=>Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);var Y=class extends Error{constructor(){super(`tsdav: Digest authentication requires the WebCrypto API (globalThis.crypto), available in Node.js >= 19, browsers, Bun and Deno. On Node.js 18, assign webcrypto from node:crypto to globalThis.crypto.`),this.name=`DigestUnsupportedError`}};const ct=e=>{let{crypto:t}=globalThis;if(!t?.getRandomValues||e?.startsWith(`SHA`)&&!t.subtle)throw new Y;return t},lt=async(e,t)=>e.startsWith(`MD5`)?et(t):st(new Uint8Array(await ct(e).subtle.digest(`SHA-256`,new TextEncoder().encode(t)))),X=e=>`"${e.replace(/["\\]/g,`\\$&`)}"`,ut=e=>/^[\x20-\x7e]*$/.test(e)?`username=${X(e)}`:`username*=UTF-8''${encodeURIComponent(e).replace(/['()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}`,dt=async e=>{let{challenge:t,username:n,password:r,method:i,uri:a,cnonce:o}=e,{realm:s,nonce:c,qop:l,algorithm:u}=t,d=e.nc.toString(16).padStart(8,`0`),f=await lt(u,`${n}:${s}:${r}`);u.endsWith(`-SESS`)&&(f=await lt(u,`${f}:${c}:${o}`));let p=await lt(u,`${i}:${a}`),m=await lt(u,l?`${f}:${c}:${d}:${o}:${l}:${p}`:`${f}:${c}:${p}`);return`Digest ${[ut(n),`realm=${X(s)}`,`uri=${X(a)}`,`algorithm=${u.replace(`-SESS`,`-sess`)}`,`nonce=${X(c)}`,...l?[`nc=${d}`,`cnonce=${X(o)}`,`qop=${l}`]:[],`response=${X(m)}`,...t.opaque==null?[]:[`opaque=${X(t.opaque)}`]].join(`, `)}`},ft=()=>st(ct().getRandomValues(new Uint8Array(16))),pt=e=>{if(e instanceof URL)return e;if(typeof e==`string`)try{return new URL(e)}catch{return}},mt=e=>typeof e!=`object`||!e||!(typeof e.getReader==`function`||Symbol.asyncIterator in e),ht=[301,302,303,307,308],gt=[`content-encoding`,`content-language`,`content-location`,`content-type`],_t=(e,t)=>{let n=(t.method??`GET`).toUpperCase();if(e===303&&n!==`GET`&&n!==`HEAD`||(e===301||e===302)&&n===`POST`){let e=new Headers(t.headers);for(let t of gt)e.delete(t);return{...t,method:`GET`,body:void 0,headers:e}}return t},vt=e=>{let t=new Headers(e.headers);return t.delete(`authorization`),{...e,headers:t}},yt=(e,t)=>e.domain?.trim()?e.domain.trim().split(/\s+/).flatMap(e=>{try{if(!e.startsWith(`/`)&&!/^[a-z][a-z\d+.-]*:/i.test(e))return[];let n=new URL(e,`${t.origin}/`);return n.hash=``,n.origin===t.origin?[n.href]:[]}catch{return[]}}):[`${t.origin}/`],bt=(e=!0)=>({active:e,challenges:new Map}),xt=e=>{let{credentials:t,fetch:n}=e,r=n??w,i=e.state??bt(),a=async(e,n,r,a)=>{let o=i.challenges.get(n.origin)?.find(e=>e.scopes.some(e=>n.href.startsWith(e)));if(!o)return vt(e);o.nc+=1;let{challenge:s,nc:c}=o,l=await dt({challenge:s,username:t.username??``,password:t.password??``,method:r,uri:a,nc:c,cnonce:s.algorithm.endsWith(`-SESS`)?o.cnonce:ft()}),u=new Headers(e.headers);return u.set(`authorization`,l),{...e,headers:u}},o=(e,t)=>{let n=e.headers.get(`www-authenticate`),r={unlessBasic:!i.active},a=!globalThis.crypto?.subtle&&ot(n,{...r,allowSHA256:!1})||ot(n,r);if(!a)return!1;try{ct(a.algorithm)}catch(e){if(!i.active&&e instanceof Y)return!1;throw e}i.active||=(tt(`Server only offers Digest authentication, switching from Basic`),!0),tt(`Digest challenge received for ${t.origin}${a.stale?` (stale nonce)`:``}`);let o=i.challenges.get(t.origin)??[],s=yt(a,t),c=o.find(e=>e.challenge.realm===a.realm&&e.challenge.algorithm===a.algorithm&&e.challenge.nonce===a.nonce);return i.challenges.set(t.origin,[{challenge:a,scopes:s,nc:c?.nc??0,cnonce:c?.cnonce??ft()},...o.filter(e=>e.challenge.realm!==a.realm)]),!0},s=async(e,t,n,i)=>{let s=(t.method??`GET`).toUpperCase(),c=`${n.pathname}${n.search}`,l=await r(e,await a(t,n,s,c));return l.status!==401||!i||!mt(t.body)||!o(l,n)?l:(await l.body?.cancel().catch(()=>void 0),r(e,await a(t,n,s,c)))};return async(e,t={})=>{let n=pt(e);if(!n)return r(e,t);i.active&&(t={...t,credentials:t.credentials??`omit`});let a=!1;if(!i.active){let i=await r(e,t);if(i.status!==401||!mt(t.body)||(pt(i.url??``)??n).origin!==n.origin||!o(i,pt(i.url)??n))return i;await i.body?.cancel().catch(()=>void 0),a=!0,t={...t,credentials:t.credentials??`omit`};let c=pt(i.url)??n;if(c.href!==n.href){let e=(t.method??`GET`).toUpperCase();if(e!==`GET`&&e!==`HEAD`)throw TypeError(`tsdav: Digest negotiation after an automatic redirect requires the final DAV URL. Set serverUrl and collection URLs to their canonical locations.`);return s(c.href,{...t,redirect:`error`},c,!1)}}if((t.redirect??`follow`)!==`follow`||!mt(t.body))return s(e,t,n,!a);let c=e,l=n,u={...t,redirect:`manual`},d=!1;for(let e=0;;e+=1){let t=d?await r(c,u):await s(c,u,l,!a);if(a=!1,t.type===`opaqueredirect`){let e=(u.method??`GET`).toUpperCase();if(e!==`GET`&&e!==`HEAD`)throw TypeError(`tsdav: Digest authentication cannot safely follow an opaque browser redirect for this method. Use the final DAV URL, including its trailing slash.`);let t=await r(c,{...vt(u),redirect:`follow`}),i=pt(t.url);return!i||i.origin!==n.origin||d||t.status!==401||!o(t,i)?t:(await t.body?.cancel().catch(()=>void 0),s(i.href,{...u,redirect:`error`},i,!1))}let i=t.headers.get(`location`);if(!ht.includes(t.status)||!i)return t;if(e===20)throw TypeError(`tsdav: too many redirects`);await t.body?.cancel().catch(()=>void 0),l=new URL(i,l),c=l.href,u=_t(t.status,u),l.origin!==n.origin&&(d=!0,u=vt(u))}}};var St=s({createAccount:()=>Ot,fetchHomeUrl:()=>Dt,fetchPrincipalUrl:()=>Et,serviceDiscovery:()=>wt});const Z=(0,p.default)(`tsdav:account`),Ct=(e,t)=>{let n=[t,e,new URL(`/`,e).href];return n.filter((e,t)=>n.indexOf(e)===t)},wt=async e=>{Z(`Service discovery...`);let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=a??w,s=new URL(t.serverUrl),{headers:c,...l}=i,u=new URL(`/.well-known/${t.accountType}`,s);u.protocol=s.protocol??`http`;let d=e=>{if(e.status>=300&&e.status<400){let t=e.headers.get(`Location`);if(typeof t==`string`&&t.length)return Z(`Service discovery redirected to ${t}`),new URL(t,u).href}};try{let e=d(await o(u.href,{...l,method:`PROPFIND`,headers:L(R({"Content-Type":`text/xml;charset=UTF-8`},n,c),r),body:` +`+Array(n+1).join(t.spaces):``),r.push(``)):r.push(`/>`),r.join(``)}function _(e,t,n,r){return e.reduce(function(e,i){var a=s(t,n,r&&!e);switch(i.type){case`element`:return e+a+g(i,t,n);case`comment`:return e+a+d(i[t.commentKey],t);case`doctype`:return e+a+p(i[t.doctypeKey],t);case`cdata`:return e+(t.indentCdata?a:``)+f(i[t.cdataKey],t);case`text`:return e+(t.indentText?a:``)+m(i[t.textKey],t);case`instruction`:var o={};return o[i[t.nameKey]]=i[t.attributesKey]?i:i[t.instructionKey],e+(t.indentInstruction?a:``)+u(o,t,n)}},``)}function v(e,t,n){for(var r in e)if(e.hasOwnProperty(r))switch(r){case t.parentKey:case t.attributesKey:break;case t.textKey:if(t.indentText||n)return!0;break;case t.cdataKey:if(t.indentCdata||n)return!0;break;case t.instructionKey:if(t.indentInstruction||n)return!0;break;case t.doctypeKey:case t.commentKey:return!0;default:return!0}return!1}function x(e,t,n,r,o){i=e,a=t;var l=`elementNameFn`in n?n.elementNameFn(t,e):t;if(e==null||e===``)return`fullTagEmptyElementFn`in n&&n.fullTagEmptyElementFn(t,e)||n.fullTagEmptyElement?`<`+l+`>`:`<`+l+`/>`;var u=[];if(t){if(u.push(`<`+l),typeof e!=`object`)return u.push(`>`+m(e,n)+``),u.join(``);e[n.attributesKey]&&u.push(c(e[n.attributesKey],n,r));var d=v(e,n,!0)||e[n.attributesKey]&&e[n.attributesKey][`xml:space`]===`preserve`;if(d||=`fullTagEmptyElementFn`in n?n.fullTagEmptyElementFn(t,e):n.fullTagEmptyElement,d)u.push(`>`);else return u.push(`/>`),u.join(``)}return u.push(S(e,n,r+1,!1)),i=e,a=t,t&&u.push((o?s(n,r,!1):``)+``),u.join(``)}function S(e,t,n,i){var a,o,c,h=[];for(o in e)if(e.hasOwnProperty(o))for(c=r(e[o])?e[o]:[e[o]],a=0;a{var n=C();t.exports=function(e,t){e instanceof Buffer&&(e=e.toString());var r=null;if(typeof e==`string`)try{r=JSON.parse(e)}catch{throw Error(`The JSON structure is invalid`)}else r=e;return n(r,t)}})),ee=/* @__PURE__ */ l((/* @__PURE__ */ o(((e,t)=>{t.exports={xml2js:x(),xml2json:S(),js2xml:C(),json2xml:w()}})))());const T=typeof globalThis<`u`&&typeof globalThis.fetch==`function`?globalThis.fetch.bind(globalThis):(()=>{throw Error("tsdav: global fetch is not available in this runtime. Upgrade to Node.js >= 18, run under a browser/Bun/Deno, or install a fetch polyfill on globalThis before importing tsdav. You can also pass a custom `fetch` implementation to `createDAVClient`, `DAVClient`, or individual request helpers.")}),te=e=>e.replace(/[-_]+(\w?)/g,(e,t)=>t?t.toUpperCase():``);function E(e,t){if(!e)return!1;let n=e=>e!=null&&t.every(t=>e[t]);return Array.isArray(e)?e.length>0&&e.every(e=>n(e)):n(e)}const D=(e,t)=>!e||typeof e!=`object`?t.map(e=>e.toString()).join(`,`):t.reduce((t,n)=>e[n]?t:`${t.length?`${t},`:``}${n.toString()}`,``),O=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),ne=new Set(Object.values(m)),re=new Map([...[`multistatus`,`response`,`propstat`,`prop`,`href`,`status`,`error`,`responsedescription`,`resourcetype`,`collection`,`getetag`,`displayname`,`syncToken`,`supportedReportSet`,`supportedReport`,`report`,`currentUserPrincipal`].map(e=>[e,`DAV:`]),...[`calendarData`,`calendar`,`calendarDescription`,`calendarTimezone`,`calendarHomeSet`,`calendarUserAddressSet`,`supportedCalendarComponentSet`,`comp`].map(e=>[e,`urn:ietf:params:xml:ns:caldav`]),...[`addressData`,`addressbook`,`addressbookHomeSet`].map(e=>[e,`urn:ietf:params:xml:ns:carddav`]),[`getctag`,`http://calendarserver.org/ns/`],[`calendarColor`,`http://apple.com/ns/ical/`]]),k=(e,t)=>{let n=te(e.replace(/^.*:/,``)),r=re.get(n);return t&&r&&t!==r?`{${t}}${n}`:n},A=(e,t)=>{let n=Object.assign(Object.create(null),t),r=Object.create(null);for(let[t,i]of Object.entries(e.attributes??{}))(t===`xmlns`||t.startsWith(`xmlns:`))&&(n[t===`xmlns`?``:t.slice(6)]=String(i)),t!==`xmlns`&&(r[t]=i);let i=e.name??``,a=i.indexOf(`:`),o=n[a===-1?``:i.slice(0,a)]??``,s=e.elements??[],c=s.filter(e=>e.type===`element`),l=s.filter(e=>e.type===`text`||e.type===`cdata`).map(e=>String(e.text??e.cdata??``)).join(``),u={},d=Object.create(null);if(Object.keys(r).length&&(u._attributes=r),!c.length){let e=s.some(e=>e.type===`text`),t=s.some(e=>e.type===`cdata`);return e?{value:l,namespace:o,namespaces:d}:(t&&(u._cdata=l),{value:u,namespace:o,namespaces:d})}l.trim()&&(u._text=l);for(let e of c){let t=A(e,n),r=te((e.name??``).replace(/^.*:/,``)),i=k(e.name??``,t.namespace),a=d[i];if(O(u,i)&&a!==t.namespace){if(ne.has(t.namespace)&&!ne.has(a)){let e=`{${a}}${r}`;Object.defineProperty(u,e,{value:u[i],enumerable:!0,configurable:!0,writable:!0}),d[e]=a,delete u[i]}else i=`{${t.namespace}}${r}`}O(u,i)?Array.isArray(u[i])?u[i].push(t.value):u[i]=[u[i],t.value]:Object.defineProperty(u,i,{value:t.value,enumerable:!0,configurable:!0,writable:!0}),d[i]=t.namespace,r===`prop`&&t.namespace===`DAV:`&&(u.propNamespaces=t.namespaces)}return{value:u,namespace:o,namespaces:d}},ie=e=>{let t=ee.default.xml2js(e,{compact:!1,ignoreDeclaration:!0}),n={};for(let e of t.elements??[]){if(e.type!==`element`)continue;let t=A(e,{}),r=k(e.name??``,t.namespace);Object.defineProperty(n,r,{value:t.value,enumerable:!0})}return n},j=e=>{let t=/* @__PURE__ */ new Map;for(let n of e)if(n.ok)for(let[e,r]of Object.entries(n.props)){let i=t.get(e)??/* @__PURE__ */ new Map;i.set(n.namespaces?.[e]??``,r),t.set(e,i)}let n={};for(let[e,r]of t){let t=[...r.keys()].find(e=>ne.has(e))??r.keys().next().value;for(let[i,a]of r)Object.defineProperty(n,i===t?e:`{${i}}${e}`,{value:a,enumerable:!0,configurable:!0,writable:!0})}return n},ae=e=>{let t;try{t=new URL(e)}catch{return e}return t.pathname=t.pathname.split(`/`).map(e=>{try{return encodeURIComponent(decodeURIComponent(e))}catch{return e}}).join(`/`),t.href};var M=/* @__PURE__ */ s({cleanupFalsy:()=>z,conditionalParam:()=>oe,ensureTrailingSlash:()=>P,excludeHeaders:()=>B,getDAVAttribute:()=>R,mergeHeaders:()=>V,urlContains:()=>I,urlEquals:()=>F,urlMatches:()=>L});const N=e=>{let t=e.trim();return t.endsWith(`/`)?t.slice(0,-1):t},P=e=>{let t=e.trim(),n=t.search(/[?#]/),r=n===-1?t:t.slice(0,n),i=n===-1?``:t.slice(n);return`${r.endsWith(`/`)?r:`${r}/`}${i}`},F=(e,t)=>!e&&!t?!0:!e||!t?!1:N(e)===N(t),I=(e,t)=>{if(!e&&!t)return!0;if(!e||!t)return!1;let n=N(e),r=N(t);return n.includes(r)||r.includes(n)},L=(e,t,n)=>{if(!e||!t||!n)return F(e,t);try{return F(ae(new URL(e,n).href),ae(new URL(t,n).href))}catch{return F(e,t)}},R=e=>e.reduce((e,t)=>({...e,[h[t]]:t}),{}),z=e=>Object.entries(e).reduce((e,[t,n])=>n?{...e,[t]:n}:e,{}),oe=(e,t)=>t?{[e]:t}:{},B=(e,t)=>{if(!e)return{};if(!t||t.length===0)return e;let n=new Set(t.map(e=>e.toLowerCase()));return Object.fromEntries(Object.entries(e).filter(([e])=>!n.has(e.toLowerCase())))},V=(...e)=>{let t=/* @__PURE__ */ new Map,n=(e,n)=>{t.set(e.toLowerCase(),[e,n])};for(let t of e)if(t){if(Array.isArray(t))for(let[e,r]of t)n(e,r);else if(typeof t.forEach==`function`)t.forEach((e,t)=>{n(t,e)});else for(let[e,r]of Object.entries(t))n(e,r)}return Object.fromEntries(t.values())};var se=/* @__PURE__ */ s({createObject:()=>W,davRequest:()=>H,deleteObject:()=>ue,propfind:()=>U,updateObject:()=>G});const ce=(0,p.default)(`tsdav:request`),le=e=>{let t=/^\S+\s+(?\d{3})(?:\s+(?.*))?$/.exec(e?.trim()??``),n=t?.groups?.status,r=t?.groups?.statusText;return n?{status:Number.parseInt(n,10),statusText:r??``}:void 0},H=async e=>{let{url:t,init:n,convertIncoming:r=!0,parseOutgoing:i=!0,headersToExclude:a,fetchOptions:o={},fetch:s}=e,c=s??T,{headers:l={},body:u,namespace:d,method:f,attributes:p}=n,m=u;p&&typeof u==`object`&&u&&!Array.isArray(u)&&(m=Object.fromEntries(Object.entries(u).map(([e,t])=>{if(t&&typeof t==`object`&&!Array.isArray(t)){let n=t;return[e,{...n,_attributes:{...p,...n._attributes}}]}return[e,t]})));let h=r&&u!=null?ee.default.js2xml({_declaration:{_attributes:{version:`1.0`,encoding:`utf-8`}},...m},{compact:!0,spaces:2,elementNameFn:e=>d&&!/^.+:.+/.test(e)?`${d}:${e}`:e}):u,g={...o};delete g.headers;let _=B(V({"Content-Type":`text/xml;charset=UTF-8`},z(l),o.headers),a),v=await c(t,{...g,headers:_,body:h,method:f}),y=await v.text();if(!v.ok||!v.headers.get(`content-type`)?.toLowerCase().includes(`xml`)||!i||!y)return[{href:v.url,ok:v.ok,status:v.status,statusText:v.statusText,raw:y}];let b;try{b=ie(y)}catch(e){return ce(`Failed to parse DAV response XML: ${e.message}`),[{href:v.url,ok:!1,status:v.status,statusText:v.statusText,raw:y,parseError:e.message}]}return b?.multistatus?(Array.isArray(b.multistatus.response)?b.multistatus.response:[b.multistatus.response]).map(e=>{if(!e)return{raw:b,status:v.status,statusText:v.statusText,ok:v.ok};let t=(Array.isArray(e.propstat)?e.propstat:e.propstat?[e.propstat]:[]).map(e=>{let t=le(e.status),n=t?.status??0;return{props:e.prop??{},namespaces:e.propNamespaces,status:n,statusText:t?.statusText??`Invalid DAV property status`,ok:n>=200&&n<300,error:e.error,responsedescription:e.responsedescription}}),n=t.length>0&&t.every(e=>!e.ok)?t[0]:void 0,r=le(e.status)??n,i=r?.status??v.status;return{raw:b,href:e.href,status:i,statusText:r?.statusText??v.statusText,ok:i>=200&&i<300,error:e.error,responsedescription:e.responsedescription,propStats:t,props:j(t)}}):[{href:v.url,ok:v.ok,status:v.status,statusText:v.statusText,raw:b}]},U=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return H({url:t,init:{method:`PROPFIND`,headers:B(z({depth:r,...i}),a),namespace:`d`,body:{propfind:{_attributes:R([`urn:ietf:params:xml:ns:caldav`,`http://apple.com/ns/ical/`,`http://calendarserver.org/ns/`,`urn:ietf:params:xml:ns:carddav`,`DAV:`]),prop:n}}},headersToExclude:a,fetchOptions:o,fetch:s})},W=async e=>{let{url:t,data:n,headers:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e,s=o??T,{headers:c,...l}=a;return s(t,{...l,method:`PUT`,body:n,headers:B(V(r,c),i)})},G=async e=>{let{url:t,data:n,etag:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e,c=s??T,{headers:l,...u}=o;return c(t,{...u,method:`PUT`,body:n,headers:B(V(z({"If-Match":r,...i}),l),a)})},ue=async e=>{let{url:t,headers:n,etag:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e,s=o??T,{headers:c,...l}=a;return s(t,{...l,method:`DELETE`,headers:B(V(z({"If-Match":r,...n}),c),i)})},K=(e,t)=>{let n;try{n=ae(new URL(e,P(t)).href)}catch{n=e.trim()}return n.endsWith(`/`)?n.slice(0,-1):n},de=(e,t,n,r=!1,i=[])=>{let a=new Map(e.map(e=>[K(e.url,n),e])),o=new Map(t.map(e=>[K(e.url,n),e])),s=r?i:e.filter(e=>!o.has(K(e.url,n))),c=new Set(s.map(e=>K(e.url,n))),l=t.filter(e=>!a.has(K(e.url,n))),u=[],d=[];for(let t of e){let e=K(t.url,n);if(c.has(e))continue;let i=o.get(e);i&&i.etag!==t.etag?u.push(i):(i||r)&&d.push(t)}return{created:l,updated:u,deleted:s,unchanged:d}},fe=(e,t)=>{let n=e.find(e=>!e.ok||e.status>=400);if(n)throw Error(`${t}: ${n.status} ${n.statusText}`)},pe=(e,t)=>{fe(e,t);for(let n of e)if((!n.raw?.multistatus||n.raw.multistatus.response)&&(me(n,`resourcetype`,t),!n.props||!O(n.props,`resourcetype`)||typeof n.href!=`string`||!n.href))throw Error(`${t}: missing resourcetype or href in DAV multistatus response`)},me=(e,t,n)=>{let r=e.propStats?.find(e=>!e.ok&&O(e.props,t));if(r&&!O(e.props??{},t))throw Error(`${n}: ${t} returned ${r.status} ${r.statusText}`)},he=(e,t,n,r,i)=>{fe(e,i);let a=/* @__PURE__ */ new Set;for(let n of e){if(me(n,t,i),!n.href||typeof(n.props?.[t]?._cdata??n.props?.[t])!=`string`)throw Error(`${i}: missing ${t} or href`);a.add(K(n.href,r))}let o=e=>K(e.replace(/\?.*$/,``),r),s=/* @__PURE__ */ new Map;for(let e of n){let t=o(e);s.set(t,(s.get(t)??0)+1)}if(n.some(e=>!a.has(K(e,r))&&!(s.get(o(e))===1&&a.has(o(e)))))throw Error(`${i}: incomplete response`)},q=e=>{let t=typeof e==`string`||typeof e==`number`?String(e):e?._cdata??e?._text;return typeof t==`string`?t:void 0};var ge=/* @__PURE__ */ s({collectionQuery:()=>J,isCollectionDirty:()=>xe,makeCollection:()=>ye,smartCollectionSync:()=>Ce,smartCollectionSyncDetailed:()=>we,supportedReportSet:()=>be,syncCollection:()=>Se});const _e=(0,p.default)(`tsdav:collection`),ve=(e,t)=>{try{return new URL(e,P(t)).href}catch{return e}},J=async e=>{let{url:t,body:n,depth:r,defaultNamespace:i=`d`,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e,l=await H({url:t,init:{method:`REPORT`,headers:B(z({depth:r,...a}),o),namespace:i,body:n},headersToExclude:o,fetchOptions:s,fetch:c}),u=l[0];if(i===`c`&&n?.[`calendar-query`]!=null&&l.length===1&&u&&u.status===404&&L(t,u.href,t)&&!u.error&&Object.keys(u.props??{}).length===0&&typeof u.raw==`object`&&u.raw!==null&&u.raw.multistatus?.response?.propstat==null)return[];let d=l.find(e=>!e.ok||e.status&&e.status>=400);if(d)throw Error(`Collection query failed: ${d.status} ${d.statusText}. ${typeof d.raw==`string`?`Raw response: ${d.raw.slice(0,4096)}`:``}`);if((n?.[`calendar-query`]||n?.[`calendar-multiget`]||n?.[`addressbook-query`]||n?.[`addressbook-multiget`])&&l.some(e=>!e.raw?.multistatus))throw Error(`Collection query failed: expected a DAV multistatus response`);if((n?.[`calendar-query`]||n?.[`calendar-multiget`]||n?.[`addressbook-query`]||n?.[`addressbook-multiget`])&&l.some(e=>e.raw?.multistatus?.response&&(typeof e.href!=`string`||!e.href)))throw Error(`Collection query failed: missing href in DAV response`);let f=l[0];return l.length===1&&f&&(!f.raw||f.raw.multistatus&&!f.raw.multistatus.response)&&f.status&&f.status<300?[]:l},ye=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return H({url:t,init:{method:`MKCOL`,headers:B(z({depth:r,...i}),a),namespace:`d`,body:n?{mkcol:{_attributes:R([`DAV:`,`urn:ietf:params:xml:ns:caldav`,`urn:ietf:params:xml:ns:carddav`,`http://calendarserver.org/ns/`,`http://apple.com/ns/ical/`]),set:{prop:n}}}:void 0},headersToExclude:a,fetchOptions:o,fetch:s})},be=async e=>{let{collection:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=(await U({url:t.url,props:{"d:supported-report-set":{}},depth:`0`,headers:B(n,r),headersToExclude:r,fetchOptions:i,fetch:a}))[0]?.props?.supportedReportSet?.supportedReport;return o?(Array.isArray(o)?o:[o]).map(e=>e?.report?Object.keys(e.report)[0]:void 0).filter(e=>typeof e==`string`&&e.length>0):[]},xe=async e=>{let{collection:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=(await U({url:t.url,props:{"cs:getctag":{}},depth:`0`,headers:B(n,r),headersToExclude:r,fetchOptions:i,fetch:a})).find(e=>L(t.url,e.href,t.url));if(!o)throw Error(`Collection does not exist on server`);let s=o.propStats?.length&&o.propStats.every(e=>e.status===404&&O(e.props,`getctag`));if(!o.ok&&!s)throw Error(`Collection status check failed: ${o.status} ${o.statusText}`);let c=q(o.props?.getctag);return{isDirty:t.ctag==null||c==null||`${t.ctag}`!=`${c}`,newCtag:c}},Se=e=>{let{url:t,props:n,headers:r,syncLevel:i,syncToken:a,headersToExclude:o,fetchOptions:s,fetch:c}=e;return H({url:t,init:{method:`REPORT`,namespace:`d`,headers:B({...r},o),body:{"sync-collection":{_attributes:R([`urn:ietf:params:xml:ns:caldav`,`urn:ietf:params:xml:ns:carddav`,`DAV:`]),"sync-level":i,"sync-token":a,"d:prop":n}}},headersToExclude:o,fetchOptions:s,fetch:c})},Ce=async e=>{let{collection:t,method:n,headers:r,headersToExclude:i,account:a,detailedResult:o,fetchOptions:s={},fetch:c}=e,l=[`accountType`,`homeUrl`];if(!a||!E(a,l))throw Error(a?`account must have ${D(a,l)} before smartCollectionSync`:`no account for smartCollectionSync`);let u=n??(t.reports?.includes(`syncCollection`)?`webdav`:`basic`);if(_e(`smart collection sync with type ${a.accountType} and method ${u}`),u===`webdav`){let e=e=>Se({url:t.url,props:{"d:getetag":{},[`${a.accountType===`caldav`?`c`:`card`}:${a.accountType===`caldav`?`calendar-data`:`address-data`}`]:{},"d:displayname":{}},syncLevel:1,syncToken:e,headers:B(r,i),headersToExclude:i,fetchOptions:s,fetch:c}),n=t.syncToken,l=await e(n);n&&l.length===1&&l[0].status>=400&&l[0].status<500&&typeof l[0].raw==`string`&&l[0].raw.includes(`valid-sync-token`)&&(_e(`sync token rejected by server, starting a full sync`),n=void 0,l=await e(n));let u=e=>typeof e.href==`string`&&K(e.href,t.url)!==K(t.url,t.url)&&!e.props?.resourcetype?.collection,d=l.find(e=>(!e.ok||e.status>=400)&&!(e.status===404&&!e.propStats?.length&&u(e)));if(d)throw Error(`Collection sync failed: ${d.status} ${d.statusText}`);if(l.some(e=>e.raw&&!e.raw.multistatus))throw Error(`Collection sync failed: expected a DAV multistatus response`);if(l.some(e=>e.raw?.multistatus?.response&&(typeof e.href!=`string`||!e.href)))throw Error(`Collection sync failed: missing href in DAV response`);let f=l.filter(u),p=f.filter(e=>e.status!==404).map(e=>e.href),m=f.filter(e=>e.status===404).map(e=>e.href),h=t.objectMultiGet;if(p.length>0&&!h)throw Error(`collection.objectMultiGet is required for webdav sync changes`);let g=p.length?await h?.({url:t.url,props:{"d:getetag":{},[`${a.accountType===`caldav`?`c`:`card`}:${a.accountType===`caldav`?`calendar-data`:`address-data`}`]:{}},objectUrls:p,depth:`1`,headers:B(r,i),headersToExclude:i,fetchOptions:s,fetch:c})??[]:[];he(g,a.accountType===`caldav`?`calendarData`:`addressData`,p,t.url,`Collection sync multi-get failed`);let _=g.map(e=>({url:ve(e.href??``,t.url),etag:q(e.props?.getetag),data:a?.accountType===`caldav`?e.props?.calendarData?._cdata??e.props?.calendarData:e.props?.addressData?._cdata??e.props?.addressData})),v=t.objects??[],y=m.map(e=>({url:ve(e,t.url),etag:``})),{created:b,updated:x,deleted:S,unchanged:C}=de(v,_,t.url,!!n,y);return{...t,objects:o?{created:b,updated:x,deleted:S}:[...C,...b,...x],syncToken:q(l[0]?.raw?.multistatus?.syncToken)??t.syncToken}}if(u===`basic`){let{isDirty:e,newCtag:n}=await xe({collection:t,headers:B(r,i),headersToExclude:i,fetchOptions:s,fetch:c});if(!e)return o?{...t,objects:{created:[],updated:[],deleted:[]}}:t;let a=t.objects??[];if(!t.fetchObjects)throw Error(`collection.fetchObjects is required for basic sync changes`);let l=await t.fetchObjects({collection:t,headers:B(r,i),headersToExclude:i,fetchOptions:s,fetch:c})??[],{created:u,updated:d,deleted:f,unchanged:p}=de(a,l,t.url);return{...t,objects:o?{created:u,updated:d,deleted:f}:[...p,...u,...d],ctag:n}}return o?{...t,objects:{created:[],updated:[],deleted:[]}}:t},we=async e=>Ce({...e,detailedResult:!0}),Te=(e,t)=>{if(!t||t.includes(`/`)||/^(?:\.|%2e){1,2}$/i.test(t))throw Error(`Invalid object filename "${t}": expected a single path segment`);let n=t.replace(/%(?![\da-f]{2})|[?#\\\x00-\x20\x7f]/gi,e=>`%${e.charCodeAt(0).toString(16).toUpperCase().padStart(2,`0`)}`);return new URL(`./${n}`,P(e)).href};var Ee=/* @__PURE__ */ s({addressBookMultiGet:()=>ke,addressBookQuery:()=>Oe,createVCard:()=>Me,deleteVCard:()=>Pe,fetchAddressBooks:()=>Ae,fetchVCards:()=>je,updateVCard:()=>Ne});const De=(0,p.default)(`tsdav:addressBook`),Oe=async e=>{let{url:t,props:n,filters:r,depth:i,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e;return J({url:t,body:{"addressbook-query":z({_attributes:R([`urn:ietf:params:xml:ns:carddav`,`DAV:`]),"d:prop":n,filter:r??{"prop-filter":{_attributes:{name:`FN`}}}})},defaultNamespace:`card`,depth:i,headers:B(a,o),headersToExclude:o,fetchOptions:s,fetch:c})},ke=async e=>{let{url:t,props:n,objectUrls:r,depth:i,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e;return J({url:t,body:{"addressbook-multiget":z({_attributes:R([`DAV:`,`urn:ietf:params:xml:ns:carddav`]),"d:prop":n,"d:href":r})},defaultNamespace:`card`,depth:i,headers:B(a,o),headersToExclude:o,fetchOptions:s,fetch:c})},Ae=async e=>{let{account:t,headers:n,props:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e??{},s=[`homeUrl`,`rootUrl`];if(!t||!E(t,s))throw Error(t?`account must have ${D(t,s)} before fetchAddressBooks`:`no account for fetchAddressBooks`);let c=await U({url:t.homeUrl,props:{...r??{"d:displayname":{},"cs:getctag":{},"d:resourcetype":{},"d:sync-token":{}},"d:resourcetype":{}},depth:`1`,headers:B(n,i),headersToExclude:i,fetchOptions:a,fetch:o});return pe(c,`Address book discovery failed`),Promise.all(c.filter(e=>Object.keys(e.props?.resourcetype??{}).includes(`addressbook`)).map(e=>{let n=e.props?.displayname?._cdata??e.props?.displayname;return De(`Found address book named ${typeof n==`string`?n:``}, + props: ${JSON.stringify(e.props)}`),{url:new URL(e.href??``,P(t.rootUrl??``)).href,ctag:q(e.props?.getctag),displayName:typeof n==`string`?n:``,resourcetype:Object.keys(e.props?.resourcetype??{}),syncToken:q(e.props?.syncToken)}}).map(async e=>({...e,reports:await be({collection:e,headers:B(n,i),headersToExclude:i,fetchOptions:a,fetch:o})})))},je=async e=>{let{addressBook:t,headers:n,objectUrls:r,headersToExclude:i,urlFilter:a=e=>!!e,useMultiGet:o=!0,fetchOptions:s={},fetch:c}=e;De(`Fetching vcards from ${t?.url}`);let l=[`url`];if(!t||!E(t,l))throw Error(t?`addressBook must have ${D(t,l)} before fetchVCards`:`cannot fetchVCards for undefined addressBook`);let u=(r??(await Oe({url:t.url,props:{"d:getetag":{}},depth:`1`,headers:B(n,i),headersToExclude:i,fetchOptions:s,fetch:c})).map(e=>e.href??``)).filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.startsWith(`http`)?e:new URL(e,P(t.url)).href).filter(e=>!F(e,t.url)).filter(a).map(e=>{let t=new URL(e);return`${t.pathname}${t.search}`}),d=new Set(u.map(e=>K(e,t.url))),f=[];return u.length>0&&(o?f=await ke({url:t.url,props:{"d:getetag":{},"card:address-data":{}},objectUrls:u,depth:`1`,headers:B(n,i),headersToExclude:i,fetchOptions:s,fetch:c}):(f=await Oe({url:t.url,props:{"d:getetag":{},"card:address-data":{}},depth:`1`,headers:B(n,i),headersToExclude:i,fetchOptions:s,fetch:c}),f=f.filter(e=>!!e.href&&d.has(K(e.href,t.url))))),he(f,`addressData`,u,t.url,`VCard fetch failed`),f.map(e=>({url:new URL(e.href??``,P(t.url)).href,etag:q(e.props?.getetag),data:e.props?.addressData?._cdata??e.props?.addressData}))},Me=async e=>{let{addressBook:t,vCardString:n,filename:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return W({url:Te(t.url,r),data:n,headers:B({"content-type":`text/vcard; charset=utf-8`,"If-None-Match":`*`,...i},a),headersToExclude:a,fetchOptions:o,fetch:s})},Ne=async e=>{let{vCard:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return G({url:t.url,data:t.data,etag:t.etag,headers:B({"content-type":`text/vcard; charset=utf-8`,...n},r),headersToExclude:r,fetchOptions:i,fetch:a})},Pe=async e=>{let{vCard:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return ue({url:t.url,etag:t.etag,headers:B(n,r),headersToExclude:r,fetchOptions:i,fetch:a})};var Fe=/* @__PURE__ */ s({calendarMultiGet:()=>Ue,calendarQuery:()=>He,createCalendarObject:()=>qe,deleteCalendarObject:()=>Ye,fetchCalendarObjects:()=>Ke,fetchCalendarUserAddresses:()=>Ve,fetchCalendars:()=>Ge,freeBusyQuery:()=>Qe,makeCalendar:()=>We,syncCalendars:()=>Xe,syncCalendarsDetailed:()=>Ze,updateCalendarObject:()=>Je});const Ie=(0,p.default)(`tsdav:calendar`),Le=/^\d{4}(-\d\d(-\d\d(T\d\d:\d\d(:\d\d)?(\.\d+)?(([+-]\d\d:\d\d)|Z)?)?)?)?$/i,Re=/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(\.\d+)?(([+-]\d\d:\d\d)|Z)?$/i,ze=e=>{let{start:t,end:n}=e;if(!(Le.test(t)&&Le.test(n)||Re.test(t)&&Re.test(n)))throw Error(`invalid timeRange format, not in ISO8601`);if(Number.isNaN(new Date(t).getTime())||Number.isNaN(new Date(n).getTime()))throw Error(`invalid timeRange: start or end is not a valid date`);if(new Date(t).getTime()>=new Date(n).getTime())throw Error(`invalid timeRange: start must be before end`)},Be=e=>{let t=[];return Array.isArray(e)?t=e.map(e=>e?._attributes?.name):e&&typeof e==`object`&&(t=[e._attributes?.name]),t.filter(e=>typeof e==`string`&&e.length>0)},Ve=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`principalUrl`,`rootUrl`];if(!E(t,o))throw Error(`account must have ${D(t,o)} before fetchUserAddresses`);Ie(`Fetch user addresses from ${t.principalUrl}`);let s=(await U({url:t.principalUrl,props:{"c:calendar-user-address-set":{}},depth:`0`,headers:B(n,r),headersToExclude:r,fetchOptions:i,fetch:a})).find(e=>L(t.principalUrl,e.href,t.rootUrl));if(!s||!s.ok)throw Error(`cannot find calendarUserAddresses`);let c=s?.props?.calendarUserAddressSet?.href,l=[];Array.isArray(c)?l=c:c&&(l=[c]);let u=l.filter(e=>typeof e==`string`&&e.length>0);return Ie(`Fetched calendar user addresses ${u}`),u},He=async e=>{let{url:t,props:n,filters:r,timezone:i,depth:a,headers:o,headersToExclude:s,fetchOptions:c={},fetch:l}=e;return J({url:t,body:{"calendar-query":z({_attributes:R([`urn:ietf:params:xml:ns:caldav`,`http://calendarserver.org/ns/`,`http://apple.com/ns/ical/`,`DAV:`]),"d:prop":n,filter:r,timezone:i})},defaultNamespace:`c`,depth:a,headers:B(o,s),headersToExclude:s,fetchOptions:c,fetch:l})},Ue=async e=>{let{url:t,props:n,objectUrls:r,filters:i,timezone:a,depth:o,headers:s,headersToExclude:c,fetchOptions:l={},fetch:u}=e;return J({url:t,body:{"calendar-multiget":z({_attributes:R([`DAV:`,`urn:ietf:params:xml:ns:caldav`]),"d:prop":n,"d:href":r,filter:i,timezone:a})},defaultNamespace:`c`,depth:o,headers:B(s,c),headersToExclude:c,fetchOptions:l,fetch:u})},We=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return H({url:t,init:{method:`MKCALENDAR`,headers:B(z({depth:r,...i}),a),namespace:`d`,body:{"c:mkcalendar":{_attributes:R([`DAV:`,`urn:ietf:params:xml:ns:caldav`,`http://apple.com/ns/ical/`]),set:{prop:n}}}},headersToExclude:a,fetchOptions:o,fetch:s})},Ge=async e=>{let{headers:t,account:n,props:r,projectedProps:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e??{},c=[`homeUrl`,`rootUrl`];if(!n||!E(n,c))throw Error(n?`account must have ${D(n,c)} before fetchCalendars`:`no account for fetchCalendars`);let l=await U({url:n.homeUrl,props:{...r??{"c:calendar-description":{},"c:calendar-timezone":{},"d:displayname":{},"ca:calendar-color":{},"cs:getctag":{},"d:resourcetype":{},"c:supported-calendar-component-set":{},"d:sync-token":{}},"d:resourcetype":{},"c:supported-calendar-component-set":{}},depth:`1`,headers:B(t,a),headersToExclude:a,fetchOptions:o,fetch:s});return pe(l,`Calendar discovery failed`),Promise.all(l.filter(e=>Object.keys(e.props?.resourcetype??{}).includes(`calendar`)).filter(e=>{let t=Be(e.props?.supportedCalendarComponentSet?.comp);return t.length===0||t.some(e=>Object.values(_).includes(e))}).map(e=>{let t=e.props?.calendarDescription,r=e.props?.calendarTimezone,a=e.props?.supportedCalendarComponentSet?.comp,o=Object.entries(e.props??{}).filter(([e])=>i?.[e]);return{description:typeof t==`string`?t:``,timezone:typeof r==`string`?r:``,url:new URL(e.href??``,P(n.rootUrl??``)).href,ctag:q(e.props?.getctag),calendarColor:e.props?.calendarColor,displayName:q(e.props?.displayname),components:Be(a),resourcetype:Object.keys(e.props?.resourcetype??{}),syncToken:q(e.props?.syncToken),...i&&o.length>0?{projectedProps:Object.fromEntries(o)}:{}}}).map(async e=>({...e,reports:await be({collection:e,headers:B(t,a),headersToExclude:a,fetchOptions:o,fetch:s})})))},Ke=async e=>{let{calendar:t,objectUrls:n,filters:r,timeRange:i,headers:a,expand:o,urlFilter:s=e=>!!e?.includes(`.ics`),useMultiGet:c=!0,headersToExclude:l,fetchOptions:u={},fetch:d}=e;if(o&&!i)throw Error(`timeRange is required when expand is true`);i&&ze(i),Ie(`Fetching calendar objects from ${t?.url}`);let f=[`url`];if(!t||!E(t,f))throw Error(t?`calendar must have ${D(t,f)} before fetchCalendarObjects`:`cannot fetchCalendarObjects for undefined calendar`);let p=r??[{"comp-filter":{_attributes:{name:`VCALENDAR`},"comp-filter":{_attributes:{name:`VEVENT`},...i?{"time-range":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}}}],m=[];n||(m=await He({url:t.url,props:{"d:getetag":{},...o&&i?{"c:calendar-data":{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}}:{}},filters:p,depth:`1`,headers:B(a,l),headersToExclude:l,fetchOptions:u,fetch:d}));let h=(n??m.map(e=>e.href??``)).filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.startsWith(`http`)?e:new URL(e,P(t.url)).href).filter(s).map(e=>{let t=new URL(e);return`${t.pathname}${t.search}`}),g=new Set(h.map(e=>K(e,t.url))),_=[];return h.length>0&&(o&&!n?_=m.filter(e=>{let n=(e.href??``).startsWith(`http`)?e.href:new URL(e.href??``,P(t.url)).href;return s(n??``)}):c?_=await Ue({url:t.url,props:{"d:getetag":{},"c:calendar-data":{...o&&i?{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}},objectUrls:h,depth:`1`,headers:B(a,l),headersToExclude:l,fetchOptions:u,fetch:d}):(_=await He({url:t.url,props:{"d:getetag":{},"c:calendar-data":{...o&&i?{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}},filters:p,depth:`1`,headers:B(a,l),headersToExclude:l,fetchOptions:u,fetch:d}),_=_.filter(e=>{let n=(e.href??``).startsWith(`http`)?e.href??``:new URL(e.href??``,P(t.url)).href;return g.has(K(n,t.url))}))),he(_,`calendarData`,h,t.url,`Calendar object fetch failed`),_.map(e=>({url:new URL(e.href??``,P(t.url)).href,etag:q(e.props?.getetag),data:e.props?.calendarData?._cdata??e.props?.calendarData}))},qe=async e=>{let{calendar:t,iCalString:n,filename:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return W({url:Te(t.url,r),data:n,headers:B({"content-type":`text/calendar; charset=utf-8`,"If-None-Match":`*`,...i},a),headersToExclude:a,fetchOptions:o,fetch:s})},Je=async e=>{let{calendarObject:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return G({url:t.url,data:t.data,etag:t.etag,headers:B({"content-type":`text/calendar; charset=utf-8`,...n},r),headersToExclude:r,fetchOptions:i,fetch:a})},Ye=async e=>{let{calendarObject:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return ue({url:t.url,etag:t.etag,headers:B(n,r),headersToExclude:r,fetchOptions:i,fetch:a})},Xe=async e=>{let{oldCalendars:t,account:n,detailedResult:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;if(!n)throw Error(`Must have account before syncCalendars`);let c=t??n.calendars??[],l=await Ge({account:n,headers:B(i,a),headersToExclude:a,fetchOptions:o,fetch:s}),u=n.rootUrl??n.homeUrl??n.serverUrl,d=new Map(c.map(e=>[K(e.url,u),e])),f=new Map(l.map(e=>[K(e.url,u),e])),p=l.filter(e=>!d.has(K(e.url,u))),m=[],h=[],g=[];for(let e of c){let t=f.get(K(e.url,u));t?!t.syncToken&&!t.ctag||t.syncToken&&t.syncToken!==e.syncToken||t.ctag&&t.ctag!==e.ctag?m.push({local:e,remote:t}):h.push(e):g.push(e)}Ie(`updated calendars: ${m.map(({remote:e})=>e.displayName)}`);let _=await Promise.all(m.map(async({local:e,remote:t})=>{let r=async e=>{if(!e)return[];let{collection:t,...n}=e;return Ke({...n,calendar:t,filters:{"comp-filter":{_attributes:{name:`VCALENDAR`}}},urlFilter:e=>K(e,t.url)!==K(t.url,t.url)})},c={...t,ctag:e.ctag,syncToken:e.syncToken,objects:e.objects,objectMultiGet:Ue,fetchObjects:r},l=await Ce({collection:c,detailedResult:!1,headers:B(i,a),headersToExclude:a,account:n,fetchOptions:o,fetch:s});return{...l,ctag:t.reports?.includes(`syncCollection`)?t.ctag??l.ctag:l.ctag??t.ctag,syncToken:t.reports?.includes(`syncCollection`)?l.syncToken:t.syncToken??l.syncToken}}));return r?{created:p,updated:_,deleted:g}:[...h,...p,..._]},Ze=async e=>Xe({...e,detailedResult:!0}),Qe=async e=>{let{url:t,timeRange:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;if(!n)throw Error(`timeRange is required`);ze(n);let c=(await J({url:t,body:{"free-busy-query":z({_attributes:R([`urn:ietf:params:xml:ns:caldav`]),"c:time-range":{_attributes:{start:`${new Date(n.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(n.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}})},defaultNamespace:`c`,depth:r,headers:B(i,a),headersToExclude:a,fetchOptions:o,fetch:s}))[0];if(!c)throw Error(`freeBusyQuery returned no response`);return c},$e=[[7,12,17,22],[5,9,14,20],[4,11,16,23],[6,10,15,21]],et=Array.from({length:64},(e,t)=>Math.floor(Math.abs(Math.sin(t+1))*2**32)),tt=e=>{let t=``;for(let n=0;n<4;n+=1)t+=(e>>>n*8&255).toString(16).padStart(2,`0`);return t},nt=e=>{let t=new TextEncoder().encode(e),n=(t.length+8>>>6)+1<<6,r=new Uint8Array(n);r.set(t),r[t.length]=128;let i=new DataView(r.buffer),a=t.length*8;i.setUint32(n-8,a>>>0,!0),i.setUint32(n-4,Math.floor(a/2**32),!0);let o=1732584193,s=4023233417,c=2562383102,l=271733878;for(let e=0;e>>4][o%4];t=a,a=r,r=n,n=n+(l<>>32-u)|0}o=o+t|0,s=s+n|0,c=c+r|0,l=l+a|0}return tt(o)+tt(s)+tt(c)+tt(l)},rt=(0,p.default)(`tsdav:digestAuth`),it=/[!#$%&'*+.^_`|~0-9A-Za-z-]+/y,at=e=>{let t=[],n,r=0,i=t=>{for(;r{let t=(e.algorithm??`MD5`).toUpperCase();if(e.realm==null||!e.nonce||!ot.includes(t))return;let n=e.qop?.split(`,`).map(e=>e.trim().toLowerCase());if((!n||n.includes(`auth`))&&(n||!t.endsWith(`-SESS`)))return{realm:e.realm,nonce:e.nonce,opaque:e.opaque,domain:e.domain,qop:n?`auth`:void 0,algorithm:t,stale:e.stale?.toLowerCase()===`true`}},ct=(e,{unlessBasic:t=!1,allowSHA256:n=!0}={})=>{let r=at(e??``);if(!(t&&r.some(({scheme:e})=>e===`basic`)))return r.filter(({scheme:e})=>e===`digest`).map(({params:e})=>st(e)).filter(e=>e!=null).filter(e=>n||!e.algorithm.startsWith(`SHA`)).sort((e,t)=>ot.indexOf(e.algorithm)-ot.indexOf(t.algorithm))[0]},lt=e=>Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);var Y=class extends Error{constructor(){super(`tsdav: Digest authentication requires the WebCrypto API (globalThis.crypto), available in Node.js >= 19, browsers, Bun and Deno. On Node.js 18, assign webcrypto from node:crypto to globalThis.crypto.`),this.name=`DigestUnsupportedError`}};const ut=e=>{let{crypto:t}=globalThis;if(!t?.getRandomValues||e?.startsWith(`SHA`)&&!t.subtle)throw new Y;return t},dt=async(e,t)=>e.startsWith(`MD5`)?nt(t):lt(new Uint8Array(await ut(e).subtle.digest(`SHA-256`,new TextEncoder().encode(t)))),X=e=>`"${e.replace(/["\\]/g,`\\$&`)}"`,ft=e=>/^[\x20-\x7e]*$/.test(e)?`username=${X(e)}`:`username*=UTF-8''${encodeURIComponent(e).replace(/['()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}`,pt=async e=>{let{challenge:t,username:n,password:r,method:i,uri:a,cnonce:o}=e,{realm:s,nonce:c,qop:l,algorithm:u}=t,d=e.nc.toString(16).padStart(8,`0`),f=await dt(u,`${n}:${s}:${r}`);u.endsWith(`-SESS`)&&(f=await dt(u,`${f}:${c}:${o}`));let p=await dt(u,`${i}:${a}`),m=await dt(u,l?`${f}:${c}:${d}:${o}:${l}:${p}`:`${f}:${c}:${p}`);return`Digest ${[ft(n),`realm=${X(s)}`,`uri=${X(a)}`,`algorithm=${u.replace(`-SESS`,`-sess`)}`,`nonce=${X(c)}`,...l?[`nc=${d}`,`cnonce=${X(o)}`,`qop=${l}`]:[],`response=${X(m)}`,...t.opaque==null?[]:[`opaque=${X(t.opaque)}`]].join(`, `)}`},mt=()=>lt(ut().getRandomValues(/* @__PURE__ */ new Uint8Array(16))),ht=e=>{if(e instanceof URL)return e;if(typeof e==`string`)try{return new URL(e)}catch{return}},gt=e=>typeof e!=`object`||!e||!(typeof e.getReader==`function`||Symbol.asyncIterator in e),_t=[301,302,303,307,308],vt=[`content-encoding`,`content-language`,`content-location`,`content-type`],yt=(e,t)=>{let n=(t.method??`GET`).toUpperCase();if(e===303&&n!==`GET`&&n!==`HEAD`||(e===301||e===302)&&n===`POST`){let e=new Headers(t.headers);for(let t of vt)e.delete(t);return{...t,method:`GET`,body:void 0,headers:e}}return t},bt=e=>{let t=new Headers(e.headers);return t.delete(`authorization`),{...e,headers:t}},xt=(e,t)=>e.domain?.trim()?e.domain.trim().split(/\s+/).flatMap(e=>{try{if(!e.startsWith(`/`)&&!/^[a-z][a-z\d+.-]*:/i.test(e))return[];let n=new URL(e,`${t.origin}/`);return n.hash=``,n.origin===t.origin?[n.href]:[]}catch{return[]}}):[`${t.origin}/`],St=(e=!0)=>({active:e,challenges:/* @__PURE__ */ new Map}),Ct=e=>{let{credentials:t,fetch:n}=e,r=n??T,i=e.state??St(),a=async(e,n,r,a)=>{let o=i.challenges.get(n.origin)?.find(e=>e.scopes.some(e=>n.href.startsWith(e)));if(!o)return bt(e);o.nc+=1;let{challenge:s,nc:c}=o,l=await pt({challenge:s,username:t.username??``,password:t.password??``,method:r,uri:a,nc:c,cnonce:s.algorithm.endsWith(`-SESS`)?o.cnonce:mt()}),u=new Headers(e.headers);return u.set(`authorization`,l),{...e,headers:u}},o=(e,t)=>{let n=e.headers.get(`www-authenticate`),r={unlessBasic:!i.active},a=!globalThis.crypto?.subtle&&ct(n,{...r,allowSHA256:!1})||ct(n,r);if(!a)return!1;try{ut(a.algorithm)}catch(e){if(!i.active&&e instanceof Y)return!1;throw e}i.active||=(rt(`Server only offers Digest authentication, switching from Basic`),!0),rt(`Digest challenge received for ${t.origin}${a.stale?` (stale nonce)`:``}`);let o=i.challenges.get(t.origin)??[],s=xt(a,t),c=o.find(e=>e.challenge.realm===a.realm&&e.challenge.algorithm===a.algorithm&&e.challenge.nonce===a.nonce);return i.challenges.set(t.origin,[{challenge:a,scopes:s,nc:c?.nc??0,cnonce:c?.cnonce??mt()},...o.filter(e=>e.challenge.realm!==a.realm)]),!0},s=async(e,t,n,i)=>{let s=(t.method??`GET`).toUpperCase(),c=`${n.pathname}${n.search}`,l=await r(e,await a(t,n,s,c));return l.status!==401||!i||!gt(t.body)||!o(l,n)?l:(await l.body?.cancel().catch(()=>void 0),r(e,await a(t,n,s,c)))};return async(e,t={})=>{let n=ht(e);if(!n)return r(e,t);i.active&&(t={...t,credentials:t.credentials??`omit`});let a=!1;if(!i.active){let i=await r(e,t);if(i.status!==401||!gt(t.body)||(ht(i.url??``)??n).origin!==n.origin||!o(i,ht(i.url)??n))return i;await i.body?.cancel().catch(()=>void 0),a=!0,t={...t,credentials:t.credentials??`omit`};let c=ht(i.url)??n;if(c.href!==n.href){let e=(t.method??`GET`).toUpperCase();if(e!==`GET`&&e!==`HEAD`)throw TypeError(`tsdav: Digest negotiation after an automatic redirect requires the final DAV URL. Set serverUrl and collection URLs to their canonical locations.`);return s(c.href,{...t,redirect:`error`},c,!1)}}if((t.redirect??`follow`)!==`follow`||!gt(t.body))return s(e,t,n,!a);let c=e,l=n,u={...t,redirect:`manual`},d=!1;for(let e=0;;e+=1){let t=d?await r(c,u):await s(c,u,l,!a);if(a=!1,t.type===`opaqueredirect`){let e=(u.method??`GET`).toUpperCase();if(e!==`GET`&&e!==`HEAD`)throw TypeError(`tsdav: Digest authentication cannot safely follow an opaque browser redirect for this method. Use the final DAV URL, including its trailing slash.`);let t=await r(c,{...bt(u),redirect:`follow`}),i=ht(t.url);return!i||i.origin!==n.origin||d||t.status!==401||!o(t,i)?t:(await t.body?.cancel().catch(()=>void 0),s(i.href,{...u,redirect:`error`},i,!1))}let i=t.headers.get(`location`);if(!_t.includes(t.status)||!i)return t;if(e===20)throw TypeError(`tsdav: too many redirects`);await t.body?.cancel().catch(()=>void 0),l=new URL(i,l),c=l.href,u=yt(t.status,u),l.origin!==n.origin&&(d=!0,u=bt(u))}}};var wt=/* @__PURE__ */ s({createAccount:()=>At,fetchHomeUrl:()=>kt,fetchPrincipalUrl:()=>Ot,serviceDiscovery:()=>Et});const Z=(0,p.default)(`tsdav:account`),Tt=(e,t)=>{let n=[t,e,new URL(`/`,e).href];return n.filter((e,t)=>n.indexOf(e)===t)},Et=async e=>{Z(`Service discovery...`);let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=a??T,s=new URL(t.serverUrl),{headers:c,...l}=i,u=new URL(`/.well-known/${t.accountType}`,s);u.protocol=s.protocol??`http`;let d=e=>{if(e.status>=300&&e.status<400){let t=e.headers.get(`Location`);if(typeof t==`string`&&t.length)return Z(`Service discovery redirected to ${t}`),new URL(t,u).href}};try{let e=d(await o(u.href,{...l,method:`PROPFIND`,headers:B(V({"Content-Type":`text/xml;charset=UTF-8`},n,c),r),body:` -`,redirect:`manual`}));if(e)return e}catch(e){if(e instanceof Y)throw e;Z(`Service discovery PROPFIND failed: ${e.stack}`)}try{let e=d(await o(u.href,{...l,method:`GET`,body:void 0,headers:L(R(n,c),r),redirect:`manual`}));if(e)return e}catch(e){if(e instanceof Y)throw e;Z(`Service discovery GET failed: ${e.stack}`)}return s.href},Tt=e=>{if(typeof e==`string`&&e.trim().length>0)return e.trim();if(Array.isArray(e)){for(let t of e){let e=Tt(t);if(e)return e}return}if(e&&typeof e==`object`){if(`_cdata`in e&&typeof e._cdata==`string`){let t=e._cdata.trim();if(t.length>0)return t}if(`_text`in e&&typeof e._text==`string`){let t=e._text.trim();if(t.length>0)return t}}},Et=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`rootUrl`];if(!T(t,o))throw Error(`account must have ${E(t,o)} before fetchPrincipalUrl`);Z(`Fetching principal url from path ${t.rootUrl}`);let[s]=await B({url:t.rootUrl,props:{"d:current-user-principal":{}},depth:`0`,headers:L(n,r),headersToExclude:r,fetchOptions:i,fetch:a});if(!s?.ok)throw Z(`Fetch principal url failed: ${s?.statusText??`empty response`}`),s?.status===401?Error(`Invalid credentials: PROPFIND ${t.rootUrl} returned 401 Unauthorized`):Error(`cannot find principalUrl`);let c=Tt(s.props?.currentUserPrincipal?.href);if(!c)throw Z(`Fetch principal url failed: missing current-user-principal href`),Error(`cannot find principalUrl`);return Z(`Fetched principal url ${c}`),new URL(c,M(t.rootUrl)).href},Dt=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`principalUrl`,`rootUrl`];if(!T(t,o))throw Error(`account must have ${E(t,o)} before fetchHomeUrl`);Z(`Fetch home url from ${t.principalUrl}`);let s=await B({url:t.principalUrl,props:t.accountType===`caldav`?{"c:calendar-home-set":{}}:{"card:addressbook-home-set":{}},depth:`0`,headers:L(n,r),headersToExclude:r,fetchOptions:i,fetch:a}),c=s.find(e=>P(t.principalUrl,e.href,t.rootUrl));if(!c||!c.ok)throw Z(`Fetch home url failed with status ${c?.statusText} and error ${JSON.stringify(s.map(e=>e.error))}`),Error(`cannot find homeUrl`);let l=Tt(t.accountType===`caldav`?c.props?.calendarHomeSet?.href:c.props?.addressbookHomeSet?.href);if(!l)throw Z(`Fetch home url failed: server did not return a ${t.accountType===`caldav`?`calendar-home-set`:`addressbook-home-set`} href`),Error(`cannot find homeUrl`);let u=new URL(l,M(t.rootUrl)).href;return Z(`Fetched home url ${u}`),u},Ot=async e=>{let{account:t,headers:n,loadCollections:r=!1,loadObjects:i=!1,headersToExclude:a,fetchOptions:o={},fetch:s}=e,c={...t},l=t.rootUrl??await wt({account:t,headers:L(n,a),headersToExclude:a,fetchOptions:o,fetch:s});if(t.rootUrl)c.rootUrl=t.rootUrl;else if(t.principalUrl)c.rootUrl=l;else{let e=async(t,r=0,i)=>{let l=t[r];if(!l)throw i??Error(`cannot find principalUrl`);try{return{rootUrl:l,principalUrl:await Et({account:{...c,rootUrl:l},headers:L(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}}catch(n){if(n instanceof Y)throw n;let a=i?.message.startsWith(`Invalid credentials`);return e(t,r+1,a?i:n)}},{rootUrl:r,principalUrl:i}=await e(Ct(t.serverUrl,l));c.rootUrl=r,c.principalUrl=i}return c.principalUrl=t.principalUrl??c.principalUrl??await Et({account:c,headers:L(n,a),headersToExclude:a,fetchOptions:o,fetch:s}),c.homeUrl=t.homeUrl??await Dt({account:c,headers:L(n,a),headersToExclude:a,fetchOptions:o,fetch:s}),(r||i)&&(t.accountType===`caldav`?c.calendars=await Ue({headers:L(n,a),headersToExclude:a,account:c,fetchOptions:o,fetch:s}):t.accountType===`carddav`&&(c.addressBooks=await Ae({headers:L(n,a),headersToExclude:a,account:c,fetchOptions:o,fetch:s}))),i&&(t.accountType===`caldav`&&c.calendars?c.calendars=await Promise.all(c.calendars.map(async e=>({...e,objects:await We({calendar:e,filters:{"comp-filter":{_attributes:{name:`VCALENDAR`}}},urlFilter:t=>!N(t,e.url),headers:L(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}))):t.accountType===`carddav`&&c.addressBooks&&(c.addressBooks=await Promise.all(c.addressBooks.map(async e=>({...e,objects:await je({addressBook:e,headers:L(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}))))),c};var kt=s({defaultParam:()=>Nt,fetchOauthTokens:()=>It,getBasicAuthHeaders:()=>Pt,getBearerAuthHeaders:()=>Ft,getOauthHeaders:()=>Rt,refreshAccessToken:()=>Lt});const Q=(0,p.default)(`tsdav:authHelper`),$=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`;var At=class extends Error{constructor(e){super(e),this.name=`InvalidCharacterError`}};const jt=e=>{if(e>255)throw new At(`The string to be encoded contains characters outside of the Latin1 range.`)},Mt=e=>{let t=``,n=0;for(;n(...n)=>{let r=n[0],i={...t,...r};return(t.headers||r?.headers)&&(i.headers=R(t.headers,r?.headers)),e(i)},Pt=e=>(Q(`Basic auth token generated for user "${e.username??``}"`),{authorization:`Basic ${Mt(`${e.username}:${e.password}`)}`}),Ft=e=>({authorization:`Bearer ${e.accessToken}`}),It=async(e,t,n)=>{let r=[`authorizationCode`,`redirectUrl`,`clientId`,`clientSecret`,`tokenUrl`];if(!T(e,r))throw Error(`Oauth credentials missing: ${E(e,r)}`);let i=new URLSearchParams({grant_type:`authorization_code`,code:e.authorizationCode,redirect_uri:e.redirectUrl,client_id:e.clientId,client_secret:e.clientSecret});Q(`Fetching oauth tokens from ${e.tokenUrl}`);let a=n??w,{headers:o,...s}=t??{},c=await a(e.tokenUrl,{...s,method:`POST`,body:i.toString(),headers:R({"content-type":`application/x-www-form-urlencoded`},o)});return c.ok?await c.json():(Q(`Fetch Oauth tokens failed with status ${c.status}`),{})},Lt=async(e,t,n)=>{let r=[`refreshToken`,`clientId`,`clientSecret`,`tokenUrl`];if(!T(e,r))throw Error(`Oauth credentials missing: ${E(e,r)}`);let i=new URLSearchParams({client_id:e.clientId,client_secret:e.clientSecret,refresh_token:e.refreshToken,grant_type:`refresh_token`}),a=n??w,{headers:o,...s}=t??{},c=await a(e.tokenUrl,{...s,method:`POST`,body:i.toString(),headers:R({"Content-Type":`application/x-www-form-urlencoded`},o)});return c.ok?await c.json():(Q(`Refresh access token failed with status ${c.status}`),{})},Rt=async(e,t,n)=>{Q(`Fetching oauth headers`);let r={},i=!1;return e.accessToken&&(e.expiration==null&&!e.refreshToken||e.expiration!=null&&Date.now()Wt,createDAVClient:()=>Ut});const Bt=async(e,t=e.fetchOptions,n=e.fetchOverride)=>{switch(e.authMethod){case`Basic`:return Pt(e.credentials);case`Bearer`:return Ft(e.credentials);case`Oauth`:{let{headers:r}=await Rt(e.credentials,t,n);if(!r.authorization)throw Error(`OAuth authentication failed: token endpoint returned no access token`);return r}case`Digest`:return e.credentials.digestString==null?{}:{Authorization:`Digest ${e.credentials.digestString}`};case`Custom`:if(!e.authFunction)throw Error(`authMethod 'Custom' requires an authFunction to produce request headers`);return await e.authFunction(e.credentials)??{};default:throw Error(`Invalid auth method`)}},Vt=new WeakMap,Ht=(e,t=e.fetchOverride,n,r=e.fetchOptions?.headers)=>{let i=e.authMethod===`Digest`&&e.credentials.digestString==null;if(!i&&e.authMethod!==`Basic`||new Headers(r).has(`authorization`)||n?.some(e=>e.toLowerCase()===`authorization`))return t;let a=Vt.get(e),{username:o,password:s}=e.credentials;return(!a||a.authMethod!==e.authMethod||a.username!==o||a.password!==s)&&(a={state:bt(i),authMethod:e.authMethod,username:o,password:s},Vt.set(e,a)),xt({credentials:e.credentials,fetch:t,state:a.state})},Ut=async e=>{let t=new Wt(e);return t.authHeaders=await Bt(t),t.account=e.defaultAccountType?await Ot({account:{serverUrl:e.serverUrl,credentials:e.credentials,accountType:e.defaultAccountType},headers:t.authHeaders,fetchOptions:t.fetchOptions,fetch:Ht(t)}):void 0,{davRequest:t.davRequest.bind(t),propfind:t.propfind.bind(t),createAccount:async(...e)=>{if(!e[0].account.accountType)throw Error("createAccount requires an accountType; pass one via `account.accountType`.");return t.createAccount(...e)},createObject:t.createObject.bind(t),updateObject:t.updateObject.bind(t),deleteObject:t.deleteObject.bind(t),calendarQuery:t.calendarQuery.bind(t),addressBookQuery:t.addressBookQuery.bind(t),collectionQuery:t.collectionQuery.bind(t),makeCollection:t.makeCollection.bind(t),calendarMultiGet:t.calendarMultiGet.bind(t),makeCalendar:t.makeCalendar.bind(t),freeBusyQuery:t.freeBusyQuery.bind(t),syncCollection:t.syncCollection.bind(t),supportedReportSet:t.supportedReportSet.bind(t),isCollectionDirty:t.isCollectionDirty.bind(t),smartCollectionSync:t.smartCollectionSync.bind(t),smartCollectionSyncDetailed:t.smartCollectionSyncDetailed.bind(t),fetchCalendars:t.fetchCalendars.bind(t),fetchCalendarUserAddresses:t.fetchCalendarUserAddresses.bind(t),fetchCalendarObjects:t.fetchCalendarObjects.bind(t),createCalendarObject:t.createCalendarObject.bind(t),updateCalendarObject:t.updateCalendarObject.bind(t),deleteCalendarObject:t.deleteCalendarObject.bind(t),syncCalendars:t.syncCalendars.bind(t),syncCalendarsDetailed:t.syncCalendarsDetailed.bind(t),fetchAddressBooks:t.fetchAddressBooks.bind(t),addressBookMultiGet:t.addressBookMultiGet.bind(t),fetchVCards:t.fetchVCards.bind(t),createVCard:t.createVCard.bind(t),updateVCard:t.updateVCard.bind(t),deleteVCard:t.deleteVCard.bind(t)}};var Wt=class{constructor(e){this.serverUrl=e.serverUrl,this.credentials=e.credentials,this.authMethod=e.authMethod??`Basic`,this.accountType=e.defaultAccountType??`caldav`,this.authFunction=e.authFunction,this.fetchOptions=e.fetchOptions??{},this.fetchOverride=e.fetch,this.calendarMultiGet=this.calendarMultiGet.bind(this),this.addressBookMultiGet=this.addressBookMultiGet.bind(this)}async authenticate(e=!1,t=this.fetchOptions,n=this.fetchOverride){if(!e&&this.authMethod!==`Oauth`)return;if(!e&&this.authHeaders&&this.credentials.accessToken&&(this.credentials.expiration==null||Date.now(){this.authHeaders=await Bt(this,t,n)};this.authentication=r();try{await this.authentication}finally{this.authentication=void 0}}async requestDefaults(e){return await this.authenticate(!1,e?.fetchOptions??this.fetchOptions,e?.fetch??this.fetchOverride),{url:this.serverUrl,headers:this.authHeaders,account:this.account,fetchOptions:this.fetchOptions,fetch:Ht(this,e?.fetch,e?.headersToExclude,R(e?.headers,e?.init?.headers,(e?.fetchOptions??this.fetchOptions)?.headers))}}async invoke(e,t){let n=await this.requestDefaults(t),r=t&&{...t,fetch:n.fetch};return await Nt(e,n)(r)}async login(e){await this.authenticate(!0),this.account=this.accountType?await Ot({account:{serverUrl:this.serverUrl,credentials:this.credentials,accountType:this.accountType},headers:this.authHeaders,loadCollections:e?.loadCollections,loadObjects:e?.loadObjects,fetchOptions:this.fetchOptions,fetch:Ht(this)}):void 0}async davRequest(e){let{init:t,fetchOptions:n,...r}=e,{headers:i,...a}=t,o=await this.requestDefaults(e);return z({...r,init:{...a,headers:R(o.headers,i)},fetchOptions:n??this.fetchOptions,fetch:o.fetch})}async createObject(...e){return this.invoke(V,e[0])}async updateObject(...e){return this.invoke(fe,e[0])}async deleteObject(...e){return this.invoke(H,e[0])}async propfind(...e){return this.invoke(B,e[0])}async createAccount(e){let{account:t,headers:n,headersToExclude:r,loadCollections:i,loadObjects:a,fetchOptions:o}=e,s=await this.requestDefaults(e),c=t.accountType??this.accountType;if(!c)throw Error("createAccount requires an accountType; pass one via `account.accountType` or configure `defaultAccountType` on the DAVClient.");return Ot({account:{serverUrl:this.serverUrl,credentials:this.credentials,...t,accountType:c},headers:R(s.headers,n),headersToExclude:r,loadCollections:i,loadObjects:a,fetchOptions:o??this.fetchOptions,fetch:s.fetch})}async collectionQuery(...e){return this.invoke(G,e[0])}async makeCollection(...e){return this.invoke(xe,e[0])}async syncCollection(...e){return this.invoke(we,e[0])}async supportedReportSet(...e){return this.invoke(Se,e[0])}async isCollectionDirty(...e){return this.invoke(Ce,e[0])}async smartCollectionSync(...e){return this.invoke(Te,e[0])}async smartCollectionSyncDetailed(e){return this.invoke(Ee,e)}async calendarQuery(...e){return this.invoke(q,e[0])}async makeCalendar(...e){return this.invoke(He,e[0])}async freeBusyQuery(...e){return this.invoke(Xe,e[0])}async calendarMultiGet(...e){return this.invoke(J,e[0])}async fetchCalendars(...e){return this.invoke(Ue,e[0])}async fetchCalendarUserAddresses(...e){return this.invoke(Ve,e[0])}async fetchCalendarObjects(...e){return this.invoke(We,e[0])}async createCalendarObject(...e){return this.invoke(Ge,e[0])}async updateCalendarObject(...e){return this.invoke(Ke,e[0])}async deleteCalendarObject(...e){return this.invoke(qe,e[0])}async syncCalendars(...e){return this.invoke(Je,e[0])}async syncCalendarsDetailed(...e){return this.invoke(Ye,e[0])}async addressBookQuery(...e){return this.invoke(K,e[0])}async addressBookMultiGet(...e){return this.invoke(ke,e[0])}async fetchAddressBooks(...e){return this.invoke(Ae,e[0])}async fetchVCards(...e){return this.invoke(je,e[0])}async createVCard(...e){return this.invoke(Me,e[0])}async updateVCard(...e){return this.invoke(Ne,e[0])}async deleteVCard(...e){return this.invoke(Pe,e[0])}},Gt={DAVNamespace:m,DAVNamespaceShort:g,DAVAttributeMap:h,ICALObjects:_,...zt,...le,...ve,...St,...De,...Fe,...kt,...oe};export{h as DAVAttributeMap,Wt as DAVClient,m as DAVNamespace,g as DAVNamespaceShort,Y as DigestUnsupportedError,_ as ICALObjects,ke as addressBookMultiGet,K as addressBookQuery,J as calendarMultiGet,q as calendarQuery,I as cleanupFalsy,G as collectionQuery,Ot as createAccount,Ge as createCalendarObject,Ut as createDAVClient,V as createObject,Me as createVCard,z as davRequest,Gt as default,qe as deleteCalendarObject,H as deleteObject,Pe as deleteVCard,M as ensureTrailingSlash,L as excludeHeaders,Ae as fetchAddressBooks,We as fetchCalendarObjects,Ve as fetchCalendarUserAddresses,Ue as fetchCalendars,Dt as fetchHomeUrl,It as fetchOauthTokens,Et as fetchPrincipalUrl,je as fetchVCards,Xe as freeBusyQuery,Pt as getBasicAuthHeaders,Ft as getBearerAuthHeaders,F as getDAVAttribute,Rt as getOauthHeaders,Ce as isCollectionDirty,He as makeCalendar,xe as makeCollection,R as mergeHeaders,B as propfind,Lt as refreshAccessToken,wt as serviceDiscovery,Te as smartCollectionSync,Ee as smartCollectionSyncDetailed,Se as supportedReportSet,Je as syncCalendars,Ye as syncCalendarsDetailed,we as syncCollection,Ke as updateCalendarObject,fe as updateObject,Ne as updateVCard,se as urlContains,N as urlEquals,P as urlMatches}; \ No newline at end of file +`,redirect:`manual`}));if(e)return e}catch(e){if(e instanceof Y)throw e;Z(`Service discovery PROPFIND failed: ${e.stack}`)}try{let e=d(await o(u.href,{...l,method:`GET`,body:void 0,headers:B(V(n,c),r),redirect:`manual`}));if(e)return e}catch(e){if(e instanceof Y)throw e;Z(`Service discovery GET failed: ${e.stack}`)}return s.href},Dt=e=>{if(typeof e==`string`&&e.trim().length>0)return e.trim();if(Array.isArray(e))for(let t of e){let e=Dt(t);if(e)return e}else if(e&&typeof e==`object`){if(`_cdata`in e&&typeof e._cdata==`string`){let t=e._cdata.trim();if(t.length>0)return t}if(`_text`in e&&typeof e._text==`string`){let t=e._text.trim();if(t.length>0)return t}}},Ot=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`rootUrl`];if(!E(t,o))throw Error(`account must have ${D(t,o)} before fetchPrincipalUrl`);Z(`Fetching principal url from path ${t.rootUrl}`);let[s]=await U({url:t.rootUrl,props:{"d:current-user-principal":{}},depth:`0`,headers:B(n,r),headersToExclude:r,fetchOptions:i,fetch:a});if(!s?.ok)throw Z(`Fetch principal url failed: ${s?.statusText??`empty response`}`),s?.status===401?Error(`Invalid credentials: PROPFIND ${t.rootUrl} returned 401 Unauthorized`):Error(`cannot find principalUrl`);let c=Dt(s.props?.currentUserPrincipal?.href);if(!c)throw Z(`Fetch principal url failed: missing current-user-principal href`),Error(`cannot find principalUrl`);return Z(`Fetched principal url ${c}`),new URL(c,P(t.rootUrl)).href},kt=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`principalUrl`,`rootUrl`];if(!E(t,o))throw Error(`account must have ${D(t,o)} before fetchHomeUrl`);Z(`Fetch home url from ${t.principalUrl}`);let s=await U({url:t.principalUrl,props:t.accountType===`caldav`?{"c:calendar-home-set":{}}:{"card:addressbook-home-set":{}},depth:`0`,headers:B(n,r),headersToExclude:r,fetchOptions:i,fetch:a}),c=s.find(e=>L(t.principalUrl,e.href,t.rootUrl));if(!c||!c.ok)throw Z(`Fetch home url failed with status ${c?.statusText} and error ${JSON.stringify(s.map(e=>e.error))}`),Error(`cannot find homeUrl`);let l=Dt(t.accountType===`caldav`?c.props?.calendarHomeSet?.href:c.props?.addressbookHomeSet?.href);if(!l)throw Z(`Fetch home url failed: server did not return a ${t.accountType===`caldav`?`calendar-home-set`:`addressbook-home-set`} href`),Error(`cannot find homeUrl`);let u=new URL(l,P(t.rootUrl)).href;return Z(`Fetched home url ${u}`),u},At=async e=>{let{account:t,headers:n,loadCollections:r=!1,loadObjects:i=!1,headersToExclude:a,fetchOptions:o={},fetch:s}=e,c={...t},l=t.rootUrl??await Et({account:t,headers:B(n,a),headersToExclude:a,fetchOptions:o,fetch:s});if(t.rootUrl)c.rootUrl=t.rootUrl;else if(t.principalUrl)c.rootUrl=l;else{let e=async(t,r=0,i)=>{let l=t[r];if(!l)throw i??/* @__PURE__ */ Error(`cannot find principalUrl`);try{return{rootUrl:l,principalUrl:await Ot({account:{...c,rootUrl:l},headers:B(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}}catch(n){if(n instanceof Y)throw n;let a=i?.message.startsWith(`Invalid credentials`);return e(t,r+1,a?i:n)}},{rootUrl:r,principalUrl:i}=await e(Tt(t.serverUrl,l));c.rootUrl=r,c.principalUrl=i}return c.principalUrl=t.principalUrl??c.principalUrl??await Ot({account:c,headers:B(n,a),headersToExclude:a,fetchOptions:o,fetch:s}),c.homeUrl=t.homeUrl??await kt({account:c,headers:B(n,a),headersToExclude:a,fetchOptions:o,fetch:s}),(r||i)&&(t.accountType===`caldav`?c.calendars=await Ge({headers:B(n,a),headersToExclude:a,account:c,fetchOptions:o,fetch:s}):t.accountType===`carddav`&&(c.addressBooks=await Ae({headers:B(n,a),headersToExclude:a,account:c,fetchOptions:o,fetch:s}))),i&&(t.accountType===`caldav`&&c.calendars?c.calendars=await Promise.all(c.calendars.map(async e=>({...e,objects:await Ke({calendar:e,filters:{"comp-filter":{_attributes:{name:`VCALENDAR`}}},urlFilter:t=>!F(t,e.url),headers:B(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}))):t.accountType===`carddav`&&c.addressBooks&&(c.addressBooks=await Promise.all(c.addressBooks.map(async e=>({...e,objects:await je({addressBook:e,headers:B(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}))))),c},jt=e=>Date.now(){let t=typeof e==`string`&&e.trim()!==``?Number(e):e;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t*1e3:void 0};var Nt=/* @__PURE__ */ s({defaultParam:()=>Lt,fetchOauthTokens:()=>Bt,getBasicAuthHeaders:()=>Rt,getBearerAuthHeaders:()=>zt,getOauthHeaders:()=>Ht,refreshAccessToken:()=>Vt});const Q=(0,p.default)(`tsdav:authHelper`),$=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`;var Pt=class extends Error{constructor(e){super(e),this.name=`InvalidCharacterError`}};const Ft=e=>{if(e>255)throw new Pt(`The string to be encoded contains characters outside of the Latin1 range.`)},It=e=>{let t=``,n=0;for(;n(...n)=>{let r=n[0],i={...t,...r};return(t.headers||r?.headers)&&(i.headers=V(t.headers,r?.headers)),e(i)},Rt=e=>(Q(`Basic auth token generated for user "${e.username??``}"`),{authorization:`Basic ${It(`${e.username}:${e.password}`)}`}),zt=e=>({authorization:`Bearer ${e.accessToken}`}),Bt=async(e,t,n)=>{let r=[`authorizationCode`,`redirectUrl`,`clientId`,`clientSecret`,`tokenUrl`];if(!E(e,r))throw Error(`Oauth credentials missing: ${D(e,r)}`);let i=new URLSearchParams({grant_type:`authorization_code`,code:e.authorizationCode,redirect_uri:e.redirectUrl,client_id:e.clientId,client_secret:e.clientSecret});Q(`Fetching oauth tokens from ${e.tokenUrl}`);let a=n??T,{headers:o,...s}=t??{},c=await a(e.tokenUrl,{...s,method:`POST`,body:i.toString(),headers:V({"content-type":`application/x-www-form-urlencoded`},o)});return c.ok?await c.json():(Q(`Fetch Oauth tokens failed with status ${c.status}`),{})},Vt=async(e,t,n)=>{let r=[`refreshToken`,`clientId`,`clientSecret`,`tokenUrl`];if(!E(e,r))throw Error(`Oauth credentials missing: ${D(e,r)}`);let i=new URLSearchParams({client_id:e.clientId,client_secret:e.clientSecret,refresh_token:e.refreshToken,grant_type:`refresh_token`}),a=n??T,{headers:o,...s}=t??{},c=await a(e.tokenUrl,{...s,method:`POST`,body:i.toString(),headers:V({"Content-Type":`application/x-www-form-urlencoded`},o)});return c.ok?await c.json():(Q(`Refresh access token failed with status ${c.status}`),{})},Ht=async(e,t,n)=>{Q(`Fetching oauth headers`);let r={},i=!1;return e.accessToken&&(e.expiration==null&&!e.refreshToken||e.expiration!=null&&jt(e.expiration))?r={access_token:e.accessToken,refresh_token:e.refreshToken}:(r=e.refreshToken?await Vt(e,t,n):await Bt(e,t,n),i=!0),i&&(r.access_token&&(e.accessToken=r.access_token),r.refresh_token&&(e.refreshToken=r.refresh_token),r.access_token&&(e.expiration=Mt(r.expires_in))),Q(`Oauth tokens obtained`),{tokens:r,headers:r.access_token?{authorization:`Bearer ${r.access_token}`}:{}}};var Ut=/* @__PURE__ */ s({DAVClient:()=>Jt,createDAVClient:()=>qt});const Wt=async(e,t=e.fetchOptions,n=e.fetchOverride)=>{switch(e.authMethod){case`Basic`:return Rt(e.credentials);case`Bearer`:return zt(e.credentials);case`Oauth`:{let{headers:r}=await Ht(e.credentials,t,n);if(!r.authorization)throw Error(`OAuth authentication failed: token endpoint returned no access token`);return r}case`Digest`:return e.credentials.digestString==null?{}:{Authorization:`Digest ${e.credentials.digestString}`};case`Custom`:if(!e.authFunction)throw Error(`authMethod 'Custom' requires an authFunction to produce request headers`);return await e.authFunction(e.credentials)??{};default:throw Error(`Invalid auth method`)}},Gt=/* @__PURE__ */ new WeakMap,Kt=(e,t=e.fetchOverride,n,r=e.fetchOptions?.headers)=>{let i=e.authMethod===`Digest`&&e.credentials.digestString==null;if(!i&&e.authMethod!==`Basic`||new Headers(r).has(`authorization`)||n?.some(e=>e.toLowerCase()===`authorization`))return t;let a=Gt.get(e),{username:o,password:s}=e.credentials;return(!a||a.authMethod!==e.authMethod||a.username!==o||a.password!==s)&&(a={state:St(i),authMethod:e.authMethod,username:o,password:s},Gt.set(e,a)),Ct({credentials:e.credentials,fetch:t,state:a.state})},qt=async e=>{let t=new Jt(e);return t.authHeaders=await Wt(t),t.account=e.defaultAccountType?await At({account:{serverUrl:e.serverUrl,credentials:e.credentials,accountType:e.defaultAccountType},headers:t.authHeaders,fetchOptions:t.fetchOptions,fetch:Kt(t)}):void 0,{davRequest:t.davRequest.bind(t),propfind:t.propfind.bind(t),createAccount:async(...e)=>{if(!e[0].account.accountType)throw Error("createAccount requires an accountType; pass one via `account.accountType`.");return t.createAccount(...e)},createObject:t.createObject.bind(t),updateObject:t.updateObject.bind(t),deleteObject:t.deleteObject.bind(t),calendarQuery:t.calendarQuery.bind(t),addressBookQuery:t.addressBookQuery.bind(t),collectionQuery:t.collectionQuery.bind(t),makeCollection:t.makeCollection.bind(t),calendarMultiGet:t.calendarMultiGet.bind(t),makeCalendar:t.makeCalendar.bind(t),freeBusyQuery:t.freeBusyQuery.bind(t),syncCollection:t.syncCollection.bind(t),supportedReportSet:t.supportedReportSet.bind(t),isCollectionDirty:t.isCollectionDirty.bind(t),smartCollectionSync:t.smartCollectionSync.bind(t),smartCollectionSyncDetailed:t.smartCollectionSyncDetailed.bind(t),fetchCalendars:t.fetchCalendars.bind(t),fetchCalendarUserAddresses:t.fetchCalendarUserAddresses.bind(t),fetchCalendarObjects:t.fetchCalendarObjects.bind(t),createCalendarObject:t.createCalendarObject.bind(t),updateCalendarObject:t.updateCalendarObject.bind(t),deleteCalendarObject:t.deleteCalendarObject.bind(t),syncCalendars:t.syncCalendars.bind(t),syncCalendarsDetailed:t.syncCalendarsDetailed.bind(t),fetchAddressBooks:t.fetchAddressBooks.bind(t),addressBookMultiGet:t.addressBookMultiGet.bind(t),fetchVCards:t.fetchVCards.bind(t),createVCard:t.createVCard.bind(t),updateVCard:t.updateVCard.bind(t),deleteVCard:t.deleteVCard.bind(t)}};var Jt=class{constructor(e){this.serverUrl=e.serverUrl,this.credentials=e.credentials,this.authMethod=e.authMethod??`Basic`,this.accountType=e.defaultAccountType??`caldav`,this.authFunction=e.authFunction,this.fetchOptions=e.fetchOptions??{},this.fetchOverride=e.fetch,this.calendarMultiGet=this.calendarMultiGet.bind(this),this.addressBookMultiGet=this.addressBookMultiGet.bind(this)}async authenticate(e=!1,t=this.fetchOptions,n=this.fetchOverride){if(!e&&this.authMethod!==`Oauth`)return;if(!e&&this.authHeaders&&this.credentials.accessToken&&(this.credentials.expiration==null||jt(this.credentials.expiration))){this.authHeaders={authorization:`Bearer ${this.credentials.accessToken}`};return}if(this.authentication)return this.authentication;let r=async()=>{this.authHeaders=await Wt(this,t,n)};this.authentication=r();try{await this.authentication}finally{this.authentication=void 0}}async requestDefaults(e){return await this.authenticate(!1,e?.fetchOptions??this.fetchOptions,e?.fetch??this.fetchOverride),{url:this.serverUrl,headers:this.authHeaders,account:this.account,fetchOptions:this.fetchOptions,fetch:Kt(this,e?.fetch,e?.headersToExclude,V(e?.headers,e?.init?.headers,(e?.fetchOptions??this.fetchOptions)?.headers))}}async invoke(e,t){let n=await this.requestDefaults(t),r=t&&{...t,fetch:n.fetch};return await Lt(e,n)(r)}async login(e){await this.authenticate(!0),this.account=this.accountType?await At({account:{serverUrl:this.serverUrl,credentials:this.credentials,accountType:this.accountType},headers:this.authHeaders,loadCollections:e?.loadCollections,loadObjects:e?.loadObjects,fetchOptions:this.fetchOptions,fetch:Kt(this)}):void 0}async davRequest(e){let{init:t,fetchOptions:n,...r}=e,{headers:i,...a}=t,o=await this.requestDefaults(e);return H({...r,init:{...a,headers:V(o.headers,i)},fetchOptions:n??this.fetchOptions,fetch:o.fetch})}async createObject(...e){return this.invoke(W,e[0])}async updateObject(...e){return this.invoke(G,e[0])}async deleteObject(...e){return this.invoke(ue,e[0])}async propfind(...e){return this.invoke(U,e[0])}async createAccount(e){let{account:t,headers:n,headersToExclude:r,loadCollections:i,loadObjects:a,fetchOptions:o}=e,s=await this.requestDefaults(e),c=t.accountType??this.accountType;if(!c)throw Error("createAccount requires an accountType; pass one via `account.accountType` or configure `defaultAccountType` on the DAVClient.");return At({account:{serverUrl:this.serverUrl,credentials:this.credentials,...t,accountType:c},headers:V(s.headers,n),headersToExclude:r,loadCollections:i,loadObjects:a,fetchOptions:o??this.fetchOptions,fetch:s.fetch})}async collectionQuery(...e){return this.invoke(J,e[0])}async makeCollection(...e){return this.invoke(ye,e[0])}async syncCollection(...e){return this.invoke(Se,e[0])}async supportedReportSet(...e){return this.invoke(be,e[0])}async isCollectionDirty(...e){return this.invoke(xe,e[0])}async smartCollectionSync(...e){return this.invoke(Ce,e[0])}async smartCollectionSyncDetailed(e){return this.invoke(we,e)}async calendarQuery(...e){return this.invoke(He,e[0])}async makeCalendar(...e){return this.invoke(We,e[0])}async freeBusyQuery(...e){return this.invoke(Qe,e[0])}async calendarMultiGet(...e){return this.invoke(Ue,e[0])}async fetchCalendars(...e){return this.invoke(Ge,e[0])}async fetchCalendarUserAddresses(...e){return this.invoke(Ve,e[0])}async fetchCalendarObjects(...e){return this.invoke(Ke,e[0])}async createCalendarObject(...e){return this.invoke(qe,e[0])}async updateCalendarObject(...e){return this.invoke(Je,e[0])}async deleteCalendarObject(...e){return this.invoke(Ye,e[0])}async syncCalendars(...e){return this.invoke(Xe,e[0])}async syncCalendarsDetailed(...e){return this.invoke(Ze,e[0])}async addressBookQuery(...e){return this.invoke(Oe,e[0])}async addressBookMultiGet(...e){return this.invoke(ke,e[0])}async fetchAddressBooks(...e){return this.invoke(Ae,e[0])}async fetchVCards(...e){return this.invoke(je,e[0])}async createVCard(...e){return this.invoke(Me,e[0])}async updateVCard(...e){return this.invoke(Ne,e[0])}async deleteVCard(...e){return this.invoke(Pe,e[0])}},Yt={DAVNamespace:m,DAVNamespaceShort:g,DAVAttributeMap:h,ICALObjects:_,...Ut,...se,...ge,...wt,...Ee,...Fe,...Nt,...M};export{h as DAVAttributeMap,Jt as DAVClient,m as DAVNamespace,g as DAVNamespaceShort,Y as DigestUnsupportedError,_ as ICALObjects,ke as addressBookMultiGet,Oe as addressBookQuery,Ue as calendarMultiGet,He as calendarQuery,z as cleanupFalsy,J as collectionQuery,At as createAccount,qe as createCalendarObject,qt as createDAVClient,W as createObject,Me as createVCard,H as davRequest,Yt as default,Ye as deleteCalendarObject,ue as deleteObject,Pe as deleteVCard,P as ensureTrailingSlash,B as excludeHeaders,Ae as fetchAddressBooks,Ke as fetchCalendarObjects,Ve as fetchCalendarUserAddresses,Ge as fetchCalendars,kt as fetchHomeUrl,Bt as fetchOauthTokens,Ot as fetchPrincipalUrl,je as fetchVCards,Qe as freeBusyQuery,Rt as getBasicAuthHeaders,zt as getBearerAuthHeaders,R as getDAVAttribute,Ht as getOauthHeaders,xe as isCollectionDirty,We as makeCalendar,ye as makeCollection,V as mergeHeaders,U as propfind,Vt as refreshAccessToken,Et as serviceDiscovery,Ce as smartCollectionSync,we as smartCollectionSyncDetailed,be as supportedReportSet,Xe as syncCalendars,Ze as syncCalendarsDetailed,Se as syncCollection,Je as updateCalendarObject,G as updateObject,Ne as updateVCard,I as urlContains,F as urlEquals,L as urlMatches}; \ No newline at end of file diff --git a/dist/tsdav.min.mjs b/dist/tsdav.min.mjs index 208d9113..cdde52e2 100644 --- a/dist/tsdav.min.mjs +++ b/dist/tsdav.min.mjs @@ -1,7 +1,7 @@ -import e from"debug";import t from"xml-js";var n=Object.defineProperty,r=(e,t)=>{let r={};for(var i in e)n(r,i,{get:e[i],enumerable:!0});return t||n(r,Symbol.toStringTag,{value:`Module`}),r};let i=function(e){return e.CALENDAR_SERVER=`http://calendarserver.org/ns/`,e.CALDAV_APPLE=`http://apple.com/ns/ical/`,e.CALDAV=`urn:ietf:params:xml:ns:caldav`,e.CARDDAV=`urn:ietf:params:xml:ns:carddav`,e.DAV=`DAV:`,e}({});const a={"urn:ietf:params:xml:ns:caldav":`xmlns:c`,"urn:ietf:params:xml:ns:carddav":`xmlns:card`,"http://calendarserver.org/ns/":`xmlns:cs`,"http://apple.com/ns/ical/":`xmlns:ca`,"DAV:":`xmlns:d`};let o=function(e){return e.CALDAV=`c`,e.CARDDAV=`card`,e.CALENDAR_SERVER=`cs`,e.CALDAV_APPLE=`ca`,e.DAV=`d`,e}({}),s=function(e){return e.VEVENT=`VEVENT`,e.VTODO=`VTODO`,e.VJOURNAL=`VJOURNAL`,e.VFREEBUSY=`VFREEBUSY`,e.VTIMEZONE=`VTIMEZONE`,e.VALARM=`VALARM`,e}({});const c=typeof globalThis<`u`&&typeof globalThis.fetch==`function`?globalThis.fetch.bind(globalThis):(()=>{throw Error("tsdav: global fetch is not available in this runtime. Upgrade to Node.js >= 18, run under a browser/Bun/Deno, or install a fetch polyfill on globalThis before importing tsdav. You can also pass a custom `fetch` implementation to `createDAVClient`, `DAVClient`, or individual request helpers.")}),l=e=>e.replace(/[-_]+(\w?)/g,(e,t)=>t?t.toUpperCase():``);function u(e,t){if(!e)return!1;let n=e=>e!=null&&t.every(t=>e[t]);return Array.isArray(e)?e.length>0&&e.every(e=>n(e)):n(e)}const d=(e,t)=>!e||typeof e!=`object`?t.map(e=>e.toString()).join(`,`):t.reduce((t,n)=>e[n]?t:`${t.length?`${t},`:``}${n.toString()}`,``),f=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),p=new Set(Object.values(i)),m=new Map([...[`multistatus`,`response`,`propstat`,`prop`,`href`,`status`,`error`,`responsedescription`,`resourcetype`,`collection`,`getetag`,`displayname`,`syncToken`,`supportedReportSet`,`supportedReport`,`report`,`currentUserPrincipal`].map(e=>[e,`DAV:`]),...[`calendarData`,`calendar`,`calendarDescription`,`calendarTimezone`,`calendarHomeSet`,`calendarUserAddressSet`,`supportedCalendarComponentSet`,`comp`].map(e=>[e,`urn:ietf:params:xml:ns:caldav`]),...[`addressData`,`addressbook`,`addressbookHomeSet`].map(e=>[e,`urn:ietf:params:xml:ns:carddav`]),[`getctag`,`http://calendarserver.org/ns/`],[`calendarColor`,`http://apple.com/ns/ical/`]]),h=(e,t)=>{let n=l(e.replace(/^.*:/,``)),r=m.get(n);return t&&r&&t!==r?`{${t}}${n}`:n},g=(e,t)=>{let n=Object.assign(Object.create(null),t),r=Object.create(null);for(let[t,i]of Object.entries(e.attributes??{}))(t===`xmlns`||t.startsWith(`xmlns:`))&&(n[t===`xmlns`?``:t.slice(6)]=String(i)),t!==`xmlns`&&(r[t]=i);let i=e.name??``,a=i.indexOf(`:`),o=n[a===-1?``:i.slice(0,a)]??``,s=e.elements??[],c=s.filter(e=>e.type===`element`),u=s.filter(e=>e.type===`text`||e.type===`cdata`).map(e=>String(e.text??e.cdata??``)).join(``),d={},m=Object.create(null);if(Object.keys(r).length&&(d._attributes=r),!c.length){let e=s.some(e=>e.type===`text`),t=s.some(e=>e.type===`cdata`);return e?{value:u,namespace:o,namespaces:m}:(t&&(d._cdata=u),{value:d,namespace:o,namespaces:m})}u.trim()&&(d._text=u);for(let e of c){let t=g(e,n),r=l((e.name??``).replace(/^.*:/,``)),i=h(e.name??``,t.namespace),a=m[i];if(f(d,i)&&a!==t.namespace){if(p.has(t.namespace)&&!p.has(a)){let e=`{${a}}${r}`;Object.defineProperty(d,e,{value:d[i],enumerable:!0,configurable:!0,writable:!0}),m[e]=a,delete d[i]}else i=`{${t.namespace}}${r}`}f(d,i)?Array.isArray(d[i])?d[i].push(t.value):d[i]=[d[i],t.value]:Object.defineProperty(d,i,{value:t.value,enumerable:!0,configurable:!0,writable:!0}),m[i]=t.namespace,r===`prop`&&t.namespace===`DAV:`&&(d.propNamespaces=t.namespaces)}return{value:d,namespace:o,namespaces:m}},_=e=>{let n=t.xml2js(e,{compact:!1,ignoreDeclaration:!0}),r={};for(let e of n.elements??[]){if(e.type!==`element`)continue;let t=g(e,{}),n=h(e.name??``,t.namespace);Object.defineProperty(r,n,{value:t.value,enumerable:!0})}return r},ee=e=>{let t=new Map;for(let n of e)if(n.ok)for(let[e,r]of Object.entries(n.props)){let i=t.get(e)??new Map;i.set(n.namespaces?.[e]??``,r),t.set(e,i)}let n={};for(let[e,r]of t){let t=[...r.keys()].find(e=>p.has(e))??r.keys().next().value;for(let[i,a]of r)Object.defineProperty(n,i===t?e:`{${i}}${e}`,{value:a,enumerable:!0,configurable:!0,writable:!0})}return n};var v=r({cleanupFalsy:()=>T,conditionalParam:()=>te,ensureTrailingSlash:()=>b,excludeHeaders:()=>E,getDAVAttribute:()=>w,mergeHeaders:()=>D,urlContains:()=>S,urlEquals:()=>x,urlMatches:()=>C});const y=e=>{let t=e.trim();return t.endsWith(`/`)?t.slice(0,-1):t},b=e=>{let t=e.trim(),n=t.search(/[?#]/),r=n===-1?t:t.slice(0,n),i=n===-1?``:t.slice(n);return`${r.endsWith(`/`)?r:`${r}/`}${i}`},x=(e,t)=>!e&&!t?!0:!e||!t?!1:y(e)===y(t),S=(e,t)=>{if(!e&&!t)return!0;if(!e||!t)return!1;let n=y(e),r=y(t);return n.includes(r)||r.includes(n)},C=(e,t,n)=>{if(!e||!t||!n)return x(e,t);try{return x(new URL(e,n).href,new URL(t,n).href)}catch{return x(e,t)}},w=e=>e.reduce((e,t)=>({...e,[a[t]]:t}),{}),T=e=>Object.entries(e).reduce((e,[t,n])=>n?{...e,[t]:n}:e,{}),te=(e,t)=>t?{[e]:t}:{},E=(e,t)=>{if(!e)return{};if(!t||t.length===0)return e;let n=new Set(t.map(e=>e.toLowerCase()));return Object.fromEntries(Object.entries(e).filter(([e])=>!n.has(e.toLowerCase())))},D=(...e)=>{let t=new Map,n=(e,n)=>{t.set(e.toLowerCase(),[e,n])};for(let t of e)if(t){if(Array.isArray(t)){for(let[e,r]of t)n(e,r);continue}if(typeof t.forEach==`function`){t.forEach((e,t)=>{n(t,e)});continue}for(let[e,r]of Object.entries(t))n(e,r)}return Object.fromEntries(t.values())};var ne=r({createObject:()=>A,davRequest:()=>O,deleteObject:()=>M,propfind:()=>k,updateObject:()=>j});const re=e(`tsdav:request`),ie=e=>{let t=/^\S+\s+(?\d{3})(?:\s+(?.*))?$/.exec(e?.trim()??``),n=t?.groups?.status,r=t?.groups?.statusText;return n?{status:Number.parseInt(n,10),statusText:r??``}:void 0},O=async e=>{let{url:n,init:r,convertIncoming:i=!0,parseOutgoing:a=!0,headersToExclude:o,fetchOptions:s={},fetch:l}=e,u=l??c,{headers:d={},body:f,namespace:p,method:m,attributes:h}=r,g=f;h&&typeof f==`object`&&f&&!Array.isArray(f)&&(g=Object.fromEntries(Object.entries(f).map(([e,t])=>{if(t&&typeof t==`object`&&!Array.isArray(t)){let n=t;return[e,{...n,_attributes:{...h,...n._attributes}}]}return[e,t]})));let v=i&&f!=null?t.js2xml({_declaration:{_attributes:{version:`1.0`,encoding:`utf-8`}},...g},{compact:!0,spaces:2,elementNameFn:e=>p&&!/^.+:.+/.test(e)?`${p}:${e}`:e}):f,y={...s};delete y.headers;let b=E(D({"Content-Type":`text/xml;charset=UTF-8`},T(d),s.headers),o),x=await u(n,{...y,headers:b,body:v,method:m}),S=await x.text();if(!x.ok||!x.headers.get(`content-type`)?.toLowerCase().includes(`xml`)||!a||!S)return[{href:x.url,ok:x.ok,status:x.status,statusText:x.statusText,raw:S}];let C;try{C=_(S)}catch(e){return re(`Failed to parse DAV response XML: ${e.message}`),[{href:x.url,ok:!1,status:x.status,statusText:x.statusText,raw:S,parseError:e.message}]}return C?.multistatus?(Array.isArray(C.multistatus.response)?C.multistatus.response:[C.multistatus.response]).map(e=>{if(!e)return{raw:C,status:x.status,statusText:x.statusText,ok:x.ok};let t=(Array.isArray(e.propstat)?e.propstat:e.propstat?[e.propstat]:[]).map(e=>{let t=ie(e.status),n=t?.status??0;return{props:e.prop??{},namespaces:e.propNamespaces,status:n,statusText:t?.statusText??`Invalid DAV property status`,ok:n>=200&&n<300,error:e.error,responsedescription:e.responsedescription}}),n=t.length>0&&t.every(e=>!e.ok)?t[0]:void 0,r=ie(e.status)??n,i=r?.status??x.status;return{raw:C,href:e.href,status:i,statusText:r?.statusText??x.statusText,ok:i>=200&&i<300,error:e.error,responsedescription:e.responsedescription,propStats:t,props:ee(t)}}):[{href:x.url,ok:x.ok,status:x.status,statusText:x.statusText,raw:C}]},k=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return O({url:t,init:{method:`PROPFIND`,headers:E(T({depth:r,...i}),a),namespace:`d`,body:{propfind:{_attributes:w([`urn:ietf:params:xml:ns:caldav`,`http://apple.com/ns/ical/`,`http://calendarserver.org/ns/`,`urn:ietf:params:xml:ns:carddav`,`DAV:`]),prop:n}}},headersToExclude:a,fetchOptions:o,fetch:s})},A=async e=>{let{url:t,data:n,headers:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e,s=o??c,{headers:l,...u}=a;return s(t,{...u,method:`PUT`,body:n,headers:E(D(r,l),i)})},j=async e=>{let{url:t,data:n,etag:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e,l=s??c,{headers:u,...d}=o;return l(t,{...d,method:`PUT`,body:n,headers:E(D(T({"If-Match":r,...i}),u),a)})},M=async e=>{let{url:t,headers:n,etag:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e,s=o??c,{headers:l,...u}=a;return s(t,{...u,method:`DELETE`,headers:E(D(T({"If-Match":r,...n}),l),i)})},N=(e,t)=>{let n;try{n=new URL(e,b(t)).href}catch{n=e.trim()}return n.endsWith(`/`)?n.slice(0,-1):n},ae=(e,t,n,r=!1,i=[])=>{let a=new Map(e.map(e=>[N(e.url,n),e])),o=new Map(t.map(e=>[N(e.url,n),e])),s=r?i:e.filter(e=>!o.has(N(e.url,n))),c=new Set(s.map(e=>N(e.url,n))),l=t.filter(e=>!a.has(N(e.url,n))),u=[],d=[];for(let t of e){let e=N(t.url,n);if(c.has(e))continue;let i=o.get(e);i&&i.etag!==t.etag?u.push(i):(i||r)&&d.push(t)}return{created:l,updated:u,deleted:s,unchanged:d}},oe=(e,t)=>{let n=e.find(e=>!e.ok||e.status>=400);if(n)throw Error(`${t}: ${n.status} ${n.statusText}`)},se=(e,t)=>{oe(e,t);for(let n of e)if((!n.raw?.multistatus||n.raw.multistatus.response)&&(ce(n,`resourcetype`,t),!n.props||!f(n.props,`resourcetype`)||typeof n.href!=`string`||!n.href))throw Error(`${t}: missing resourcetype or href in DAV multistatus response`)},ce=(e,t,n)=>{let r=e.propStats?.find(e=>!e.ok&&f(e.props,t));if(r&&!f(e.props??{},t))throw Error(`${n}: ${t} returned ${r.status} ${r.statusText}`)},le=(e,t,n,r,i)=>{oe(e,i);let a=new Set;for(let n of e){if(ce(n,t,i),!n.href||typeof(n.props?.[t]?._cdata??n.props?.[t])!=`string`)throw Error(`${i}: missing ${t} or href`);a.add(N(n.href,r))}let o=e=>N(e.replace(/\?.*$/,``),r),s=new Map;for(let e of n){let t=o(e);s.set(t,(s.get(t)??0)+1)}if(n.some(e=>!a.has(N(e,r))&&!(s.get(o(e))===1&&a.has(o(e)))))throw Error(`${i}: incomplete response`)},P=e=>{let t=typeof e==`string`||typeof e==`number`?String(e):e?._cdata??e?._text;return typeof t==`string`?t:void 0};var ue=r({collectionQuery:()=>F,isCollectionDirty:()=>L,makeCollection:()=>pe,smartCollectionSync:()=>z,smartCollectionSyncDetailed:()=>me,supportedReportSet:()=>I,syncCollection:()=>R});const de=e(`tsdav:collection`),fe=(e,t)=>{try{return new URL(e,b(t)).href}catch{return e}},F=async e=>{let{url:t,body:n,depth:r,defaultNamespace:i=`d`,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e,l=await O({url:t,init:{method:`REPORT`,headers:E(T({depth:r,...a}),o),namespace:i,body:n},headersToExclude:o,fetchOptions:s,fetch:c}),u=l[0];if(i===`c`&&n?.[`calendar-query`]!=null&&l.length===1&&u&&u.status===404&&C(t,u.href,t)&&!u.error&&Object.keys(u.props??{}).length===0&&typeof u.raw==`object`&&u.raw!==null&&u.raw.multistatus?.response?.propstat==null)return[];let d=l.find(e=>!e.ok||e.status&&e.status>=400);if(d)throw Error(`Collection query failed: ${d.status} ${d.statusText}. ${typeof d.raw==`string`?`Raw response: ${d.raw.slice(0,4096)}`:``}`);if((n?.[`calendar-query`]||n?.[`calendar-multiget`]||n?.[`addressbook-query`]||n?.[`addressbook-multiget`])&&l.some(e=>!e.raw?.multistatus))throw Error(`Collection query failed: expected a DAV multistatus response`);if((n?.[`calendar-query`]||n?.[`calendar-multiget`]||n?.[`addressbook-query`]||n?.[`addressbook-multiget`])&&l.some(e=>e.raw?.multistatus?.response&&(typeof e.href!=`string`||!e.href)))throw Error(`Collection query failed: missing href in DAV response`);let f=l[0];return l.length===1&&f&&(!f.raw||f.raw.multistatus&&!f.raw.multistatus.response)&&f.status&&f.status<300?[]:l},pe=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return O({url:t,init:{method:`MKCOL`,headers:E(T({depth:r,...i}),a),namespace:`d`,body:n?{mkcol:{_attributes:w([`DAV:`,`urn:ietf:params:xml:ns:caldav`,`urn:ietf:params:xml:ns:carddav`,`http://calendarserver.org/ns/`,`http://apple.com/ns/ical/`]),set:{prop:n}}}:void 0},headersToExclude:a,fetchOptions:o,fetch:s})},I=async e=>{let{collection:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=(await k({url:t.url,props:{"d:supported-report-set":{}},depth:`0`,headers:E(n,r),headersToExclude:r,fetchOptions:i,fetch:a}))[0]?.props?.supportedReportSet?.supportedReport;return o?(Array.isArray(o)?o:[o]).map(e=>e?.report?Object.keys(e.report)[0]:void 0).filter(e=>typeof e==`string`&&e.length>0):[]},L=async e=>{let{collection:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=(await k({url:t.url,props:{"cs:getctag":{}},depth:`0`,headers:E(n,r),headersToExclude:r,fetchOptions:i,fetch:a})).find(e=>C(t.url,e.href,t.url));if(!o)throw Error(`Collection does not exist on server`);let s=o.propStats?.length&&o.propStats.every(e=>e.status===404&&f(e.props,`getctag`));if(!o.ok&&!s)throw Error(`Collection status check failed: ${o.status} ${o.statusText}`);let c=P(o.props?.getctag);return{isDirty:t.ctag==null||c==null||`${t.ctag}`!=`${c}`,newCtag:c}},R=e=>{let{url:t,props:n,headers:r,syncLevel:i,syncToken:a,headersToExclude:o,fetchOptions:s,fetch:c}=e;return O({url:t,init:{method:`REPORT`,namespace:`d`,headers:E({...r},o),body:{"sync-collection":{_attributes:w([`urn:ietf:params:xml:ns:caldav`,`urn:ietf:params:xml:ns:carddav`,`DAV:`]),"sync-level":i,"sync-token":a,"d:prop":n}}},headersToExclude:o,fetchOptions:s,fetch:c})},z=async e=>{let{collection:t,method:n,headers:r,headersToExclude:i,account:a,detailedResult:o,fetchOptions:s={},fetch:c}=e,l=[`accountType`,`homeUrl`];if(!a||!u(a,l))throw Error(a?`account must have ${d(a,l)} before smartCollectionSync`:`no account for smartCollectionSync`);let f=n??(t.reports?.includes(`syncCollection`)?`webdav`:`basic`);if(de(`smart collection sync with type ${a.accountType} and method ${f}`),f===`webdav`){let e=await R({url:t.url,props:{"d:getetag":{},[`${a.accountType===`caldav`?`c`:`card`}:${a.accountType===`caldav`?`calendar-data`:`address-data`}`]:{},"d:displayname":{}},syncLevel:1,syncToken:t.syncToken,headers:E(r,i),headersToExclude:i,fetchOptions:s,fetch:c}),n=e=>typeof e.href==`string`&&N(e.href,t.url)!==N(t.url,t.url)&&!e.props?.resourcetype?.collection,l=e.find(e=>(!e.ok||e.status>=400)&&!(e.status===404&&!e.propStats?.length&&n(e)));if(l)throw Error(`Collection sync failed: ${l.status} ${l.statusText}`);if(e.some(e=>e.raw&&!e.raw.multistatus))throw Error(`Collection sync failed: expected a DAV multistatus response`);if(e.some(e=>e.raw?.multistatus?.response&&(typeof e.href!=`string`||!e.href)))throw Error(`Collection sync failed: missing href in DAV response`);let u=e.filter(n),d=u.filter(e=>e.status!==404).map(e=>e.href),f=u.filter(e=>e.status===404).map(e=>e.href),p=t.objectMultiGet;if(d.length>0&&!p)throw Error(`collection.objectMultiGet is required for webdav sync changes`);let m=d.length?await p?.({url:t.url,props:{"d:getetag":{},[`${a.accountType===`caldav`?`c`:`card`}:${a.accountType===`caldav`?`calendar-data`:`address-data`}`]:{}},objectUrls:d,depth:`1`,headers:E(r,i),headersToExclude:i,fetchOptions:s,fetch:c})??[]:[];le(m,a.accountType===`caldav`?`calendarData`:`addressData`,d,t.url,`Collection sync multi-get failed`);let h=m.map(e=>({url:fe(e.href??``,t.url),etag:P(e.props?.getetag),data:a?.accountType===`caldav`?e.props?.calendarData?._cdata??e.props?.calendarData:e.props?.addressData?._cdata??e.props?.addressData})),g=t.objects??[],_=f.map(e=>({url:fe(e,t.url),etag:``})),{created:ee,updated:v,deleted:y,unchanged:b}=ae(g,h,t.url,!0,_);return{...t,objects:o?{created:ee,updated:v,deleted:y}:[...b,...ee,...v],syncToken:P(e[0]?.raw?.multistatus?.syncToken)??t.syncToken}}if(f===`basic`){let{isDirty:e,newCtag:n}=await L({collection:t,headers:E(r,i),headersToExclude:i,fetchOptions:s,fetch:c});if(!e)return o?{...t,objects:{created:[],updated:[],deleted:[]}}:t;let a=t.objects??[];if(!t.fetchObjects)throw Error(`collection.fetchObjects is required for basic sync changes`);let l=await t.fetchObjects({collection:t,headers:E(r,i),headersToExclude:i,fetchOptions:s,fetch:c})??[],{created:u,updated:d,deleted:f,unchanged:p}=ae(a,l,t.url);return{...t,objects:o?{created:u,updated:d,deleted:f}:[...p,...u,...d],ctag:n}}return o?{...t,objects:{created:[],updated:[],deleted:[]}}:t},me=async e=>z({...e,detailedResult:!0});var he=r({addressBookMultiGet:()=>V,addressBookQuery:()=>B,createVCard:()=>ve,deleteVCard:()=>be,fetchAddressBooks:()=>H,fetchVCards:()=>_e,updateVCard:()=>ye});const ge=e(`tsdav:addressBook`),B=async e=>{let{url:t,props:n,filters:r,depth:i,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e;return F({url:t,body:{"addressbook-query":T({_attributes:w([`urn:ietf:params:xml:ns:carddav`,`DAV:`]),"d:prop":n,filter:r??{"prop-filter":{_attributes:{name:`FN`}}}})},defaultNamespace:`card`,depth:i,headers:E(a,o),headersToExclude:o,fetchOptions:s,fetch:c})},V=async e=>{let{url:t,props:n,objectUrls:r,depth:i,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e;return F({url:t,body:{"addressbook-multiget":T({_attributes:w([`DAV:`,`urn:ietf:params:xml:ns:carddav`]),"d:prop":n,"d:href":r})},defaultNamespace:`card`,depth:i,headers:E(a,o),headersToExclude:o,fetchOptions:s,fetch:c})},H=async e=>{let{account:t,headers:n,props:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e??{},s=[`homeUrl`,`rootUrl`];if(!t||!u(t,s))throw Error(t?`account must have ${d(t,s)} before fetchAddressBooks`:`no account for fetchAddressBooks`);let c=await k({url:t.homeUrl,props:{...r??{"d:displayname":{},"cs:getctag":{},"d:resourcetype":{},"d:sync-token":{}},"d:resourcetype":{}},depth:`1`,headers:E(n,i),headersToExclude:i,fetchOptions:a,fetch:o});return se(c,`Address book discovery failed`),Promise.all(c.filter(e=>Object.keys(e.props?.resourcetype??{}).includes(`addressbook`)).map(e=>{let n=e.props?.displayname?._cdata??e.props?.displayname;return ge(`Found address book named ${typeof n==`string`?n:``}, - props: ${JSON.stringify(e.props)}`),{url:new URL(e.href??``,b(t.rootUrl??``)).href,ctag:P(e.props?.getctag),displayName:typeof n==`string`?n:``,resourcetype:Object.keys(e.props?.resourcetype??{}),syncToken:P(e.props?.syncToken)}}).map(async e=>({...e,reports:await I({collection:e,headers:E(n,i),headersToExclude:i,fetchOptions:a,fetch:o})})))},_e=async e=>{let{addressBook:t,headers:n,objectUrls:r,headersToExclude:i,urlFilter:a=e=>!!e,useMultiGet:o=!0,fetchOptions:s={},fetch:c}=e;ge(`Fetching vcards from ${t?.url}`);let l=[`url`];if(!t||!u(t,l))throw Error(t?`addressBook must have ${d(t,l)} before fetchVCards`:`cannot fetchVCards for undefined addressBook`);let f=(r??(await B({url:t.url,props:{"d:getetag":{}},depth:`1`,headers:E(n,i),headersToExclude:i,fetchOptions:s,fetch:c})).map(e=>e.href??``)).filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.startsWith(`http`)?e:new URL(e,b(t.url)).href).filter(e=>!x(e,t.url)).filter(a).map(e=>{let t=new URL(e);return`${t.pathname}${t.search}`}),p=new Set(f.map(e=>N(e,t.url))),m=[];return f.length>0&&(o?m=await V({url:t.url,props:{"d:getetag":{},"card:address-data":{}},objectUrls:f,depth:`1`,headers:E(n,i),headersToExclude:i,fetchOptions:s,fetch:c}):(m=await B({url:t.url,props:{"d:getetag":{},"card:address-data":{}},depth:`1`,headers:E(n,i),headersToExclude:i,fetchOptions:s,fetch:c}),m=m.filter(e=>!!e.href&&p.has(N(e.href,t.url))))),le(m,`addressData`,f,t.url,`VCard fetch failed`),m.map(e=>({url:new URL(e.href??``,b(t.url)).href,etag:P(e.props?.getetag),data:e.props?.addressData?._cdata??e.props?.addressData}))},ve=async e=>{let{addressBook:t,vCardString:n,filename:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return A({url:new URL(r,b(t.url)).href,data:n,headers:E({"content-type":`text/vcard; charset=utf-8`,"If-None-Match":`*`,...i},a),headersToExclude:a,fetchOptions:o,fetch:s})},ye=async e=>{let{vCard:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return j({url:t.url,data:t.data,etag:t.etag,headers:E({"content-type":`text/vcard; charset=utf-8`,...n},r),headersToExclude:r,fetchOptions:i,fetch:a})},be=async e=>{let{vCard:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return M({url:t.url,etag:t.etag,headers:E(n,r),headersToExclude:r,fetchOptions:i,fetch:a})};var xe=r({calendarMultiGet:()=>W,calendarQuery:()=>U,createCalendarObject:()=>ke,deleteCalendarObject:()=>je,fetchCalendarObjects:()=>K,fetchCalendarUserAddresses:()=>De,fetchCalendars:()=>G,freeBusyQuery:()=>Pe,makeCalendar:()=>Oe,syncCalendars:()=>Me,syncCalendarsDetailed:()=>Ne,updateCalendarObject:()=>Ae});const Se=e(`tsdav:calendar`),Ce=/^\d{4}(-\d\d(-\d\d(T\d\d:\d\d(:\d\d)?(\.\d+)?(([+-]\d\d:\d\d)|Z)?)?)?)?$/i,we=/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(\.\d+)?(([+-]\d\d:\d\d)|Z)?$/i,Te=e=>{let{start:t,end:n}=e;if(!(Ce.test(t)&&Ce.test(n)||we.test(t)&&we.test(n)))throw Error(`invalid timeRange format, not in ISO8601`);if(Number.isNaN(new Date(t).getTime())||Number.isNaN(new Date(n).getTime()))throw Error(`invalid timeRange: start or end is not a valid date`);if(new Date(t).getTime()>=new Date(n).getTime())throw Error(`invalid timeRange: start must be before end`)},Ee=e=>{let t=[];return Array.isArray(e)?t=e.map(e=>e?._attributes?.name):e&&typeof e==`object`&&(t=[e._attributes?.name]),t.filter(e=>typeof e==`string`&&e.length>0)},De=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`principalUrl`,`rootUrl`];if(!u(t,o))throw Error(`account must have ${d(t,o)} before fetchUserAddresses`);Se(`Fetch user addresses from ${t.principalUrl}`);let s=(await k({url:t.principalUrl,props:{"c:calendar-user-address-set":{}},depth:`0`,headers:E(n,r),headersToExclude:r,fetchOptions:i,fetch:a})).find(e=>C(t.principalUrl,e.href,t.rootUrl));if(!s||!s.ok)throw Error(`cannot find calendarUserAddresses`);let c=s?.props?.calendarUserAddressSet?.href,l=[];Array.isArray(c)?l=c:c&&(l=[c]);let f=l.filter(e=>typeof e==`string`&&e.length>0);return Se(`Fetched calendar user addresses ${f}`),f},U=async e=>{let{url:t,props:n,filters:r,timezone:i,depth:a,headers:o,headersToExclude:s,fetchOptions:c={},fetch:l}=e;return F({url:t,body:{"calendar-query":T({_attributes:w([`urn:ietf:params:xml:ns:caldav`,`http://calendarserver.org/ns/`,`http://apple.com/ns/ical/`,`DAV:`]),"d:prop":n,filter:r,timezone:i})},defaultNamespace:`c`,depth:a,headers:E(o,s),headersToExclude:s,fetchOptions:c,fetch:l})},W=async e=>{let{url:t,props:n,objectUrls:r,filters:i,timezone:a,depth:o,headers:s,headersToExclude:c,fetchOptions:l={},fetch:u}=e;return F({url:t,body:{"calendar-multiget":T({_attributes:w([`DAV:`,`urn:ietf:params:xml:ns:caldav`]),"d:prop":n,"d:href":r,filter:i,timezone:a})},defaultNamespace:`c`,depth:o,headers:E(s,c),headersToExclude:c,fetchOptions:l,fetch:u})},Oe=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return O({url:t,init:{method:`MKCALENDAR`,headers:E(T({depth:r,...i}),a),namespace:`d`,body:{"c:mkcalendar":{_attributes:w([`DAV:`,`urn:ietf:params:xml:ns:caldav`,`http://apple.com/ns/ical/`]),set:{prop:n}}}},headersToExclude:a,fetchOptions:o,fetch:s})},G=async e=>{let{headers:t,account:n,props:r,projectedProps:i,headersToExclude:a,fetchOptions:o={},fetch:c}=e??{},l=[`homeUrl`,`rootUrl`];if(!n||!u(n,l))throw Error(n?`account must have ${d(n,l)} before fetchCalendars`:`no account for fetchCalendars`);let f=await k({url:n.homeUrl,props:{...r??{"c:calendar-description":{},"c:calendar-timezone":{},"d:displayname":{},"ca:calendar-color":{},"cs:getctag":{},"d:resourcetype":{},"c:supported-calendar-component-set":{},"d:sync-token":{}},"d:resourcetype":{},"c:supported-calendar-component-set":{}},depth:`1`,headers:E(t,a),headersToExclude:a,fetchOptions:o,fetch:c});return se(f,`Calendar discovery failed`),Promise.all(f.filter(e=>Object.keys(e.props?.resourcetype??{}).includes(`calendar`)).filter(e=>{let t=Ee(e.props?.supportedCalendarComponentSet?.comp);return t.length===0||t.some(e=>Object.values(s).includes(e))}).map(e=>{let t=e.props?.calendarDescription,r=e.props?.calendarTimezone,a=e.props?.supportedCalendarComponentSet?.comp,o=Object.entries(e.props??{}).filter(([e])=>i?.[e]);return{description:typeof t==`string`?t:``,timezone:typeof r==`string`?r:``,url:new URL(e.href??``,b(n.rootUrl??``)).href,ctag:P(e.props?.getctag),calendarColor:e.props?.calendarColor,displayName:P(e.props?.displayname),components:Ee(a),resourcetype:Object.keys(e.props?.resourcetype??{}),syncToken:P(e.props?.syncToken),...i&&o.length>0?{projectedProps:Object.fromEntries(o)}:{}}}).map(async e=>({...e,reports:await I({collection:e,headers:E(t,a),headersToExclude:a,fetchOptions:o,fetch:c})})))},K=async e=>{let{calendar:t,objectUrls:n,filters:r,timeRange:i,headers:a,expand:o,urlFilter:s=e=>!!e?.includes(`.ics`),useMultiGet:c=!0,headersToExclude:l,fetchOptions:f={},fetch:p}=e;if(o&&!i)throw Error(`timeRange is required when expand is true`);i&&Te(i),Se(`Fetching calendar objects from ${t?.url}`);let m=[`url`];if(!t||!u(t,m))throw Error(t?`calendar must have ${d(t,m)} before fetchCalendarObjects`:`cannot fetchCalendarObjects for undefined calendar`);let h=r??[{"comp-filter":{_attributes:{name:`VCALENDAR`},"comp-filter":{_attributes:{name:`VEVENT`},...i?{"time-range":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}}}],g=[];n||(g=await U({url:t.url,props:{"d:getetag":{},...o&&i?{"c:calendar-data":{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}}:{}},filters:h,depth:`1`,headers:E(a,l),headersToExclude:l,fetchOptions:f,fetch:p}));let _=(n??g.map(e=>e.href??``)).filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.startsWith(`http`)?e:new URL(e,b(t.url)).href).filter(s).map(e=>{let t=new URL(e);return`${t.pathname}${t.search}`}),ee=new Set(_.map(e=>N(e,t.url))),v=[];return _.length>0&&(o&&!n?v=g.filter(e=>{let n=(e.href??``).startsWith(`http`)?e.href:new URL(e.href??``,b(t.url)).href;return s(n??``)}):c?v=await W({url:t.url,props:{"d:getetag":{},"c:calendar-data":{...o&&i?{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}},objectUrls:_,depth:`1`,headers:E(a,l),headersToExclude:l,fetchOptions:f,fetch:p}):(v=await U({url:t.url,props:{"d:getetag":{},"c:calendar-data":{...o&&i?{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}},filters:h,depth:`1`,headers:E(a,l),headersToExclude:l,fetchOptions:f,fetch:p}),v=v.filter(e=>{let n=(e.href??``).startsWith(`http`)?e.href??``:new URL(e.href??``,b(t.url)).href;return ee.has(N(n,t.url))}))),le(v,`calendarData`,_,t.url,`Calendar object fetch failed`),v.map(e=>({url:new URL(e.href??``,b(t.url)).href,etag:P(e.props?.getetag),data:e.props?.calendarData?._cdata??e.props?.calendarData}))},ke=async e=>{let{calendar:t,iCalString:n,filename:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return A({url:new URL(r,b(t.url)).href,data:n,headers:E({"content-type":`text/calendar; charset=utf-8`,"If-None-Match":`*`,...i},a),headersToExclude:a,fetchOptions:o,fetch:s})},Ae=async e=>{let{calendarObject:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return j({url:t.url,data:t.data,etag:t.etag,headers:E({"content-type":`text/calendar; charset=utf-8`,...n},r),headersToExclude:r,fetchOptions:i,fetch:a})},je=async e=>{let{calendarObject:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return M({url:t.url,etag:t.etag,headers:E(n,r),headersToExclude:r,fetchOptions:i,fetch:a})},Me=async e=>{let{oldCalendars:t,account:n,detailedResult:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;if(!n)throw Error(`Must have account before syncCalendars`);let c=t??n.calendars??[],l=await G({account:n,headers:E(i,a),headersToExclude:a,fetchOptions:o,fetch:s}),u=n.rootUrl??n.homeUrl??n.serverUrl,d=new Map(c.map(e=>[N(e.url,u),e])),f=new Map(l.map(e=>[N(e.url,u),e])),p=l.filter(e=>!d.has(N(e.url,u))),m=[],h=[],g=[];for(let e of c){let t=f.get(N(e.url,u));t?!t.syncToken&&!t.ctag||t.syncToken&&t.syncToken!==e.syncToken||t.ctag&&t.ctag!==e.ctag?m.push({local:e,remote:t}):h.push(e):g.push(e)}Se(`updated calendars: ${m.map(({remote:e})=>e.displayName)}`);let _=await Promise.all(m.map(async({local:e,remote:t})=>{let r=async e=>{if(!e)return[];let{collection:t,...n}=e;return K({...n,calendar:t,filters:{"comp-filter":{_attributes:{name:`VCALENDAR`}}},urlFilter:e=>N(e,t.url)!==N(t.url,t.url)})},c={...t,ctag:e.ctag,syncToken:e.syncToken,objects:e.objects,objectMultiGet:W,fetchObjects:r},l=await z({collection:c,detailedResult:!1,headers:E(i,a),headersToExclude:a,account:n,fetchOptions:o,fetch:s});return{...l,ctag:t.reports?.includes(`syncCollection`)?t.ctag??l.ctag:l.ctag??t.ctag,syncToken:t.reports?.includes(`syncCollection`)?l.syncToken:t.syncToken??l.syncToken}}));return r?{created:p,updated:_,deleted:g}:[...h,...p,..._]},Ne=async e=>Me({...e,detailedResult:!0}),Pe=async e=>{let{url:t,timeRange:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;if(!n)throw Error(`timeRange is required`);Te(n);let c=(await F({url:t,body:{"free-busy-query":T({_attributes:w([`urn:ietf:params:xml:ns:caldav`]),"c:time-range":{_attributes:{start:`${new Date(n.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(n.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}})},defaultNamespace:`c`,depth:r,headers:E(i,a),headersToExclude:a,fetchOptions:o,fetch:s}))[0];if(!c)throw Error(`freeBusyQuery returned no response`);return c},Fe=[[7,12,17,22],[5,9,14,20],[4,11,16,23],[6,10,15,21]],Ie=Array.from({length:64},(e,t)=>Math.floor(Math.abs(Math.sin(t+1))*2**32)),Le=e=>{let t=``;for(let n=0;n<4;n+=1)t+=(e>>>n*8&255).toString(16).padStart(2,`0`);return t},Re=e=>{let t=new TextEncoder().encode(e),n=(t.length+8>>>6)+1<<6,r=new Uint8Array(n);r.set(t),r[t.length]=128;let i=new DataView(r.buffer),a=t.length*8;i.setUint32(n-8,a>>>0,!0),i.setUint32(n-4,Math.floor(a/2**32),!0);let o=1732584193,s=4023233417,c=2562383102,l=271733878;for(let e=0;e>>4][o%4];t=a,a=r,r=n,n=n+(l<>>32-u)|0}o=o+t|0,s=s+n|0,c=c+r|0,l=l+a|0}return Le(o)+Le(s)+Le(c)+Le(l)},ze=e(`tsdav:digestAuth`),Be=/[!#$%&'*+.^_`|~0-9A-Za-z-]+/y,Ve=e=>{let t=[],n,r=0,i=t=>{for(;r{let t=(e.algorithm??`MD5`).toUpperCase();if(e.realm==null||!e.nonce||!He.includes(t))return;let n=e.qop?.split(`,`).map(e=>e.trim().toLowerCase());if((!n||n.includes(`auth`))&&(n||!t.endsWith(`-SESS`)))return{realm:e.realm,nonce:e.nonce,opaque:e.opaque,domain:e.domain,qop:n?`auth`:void 0,algorithm:t,stale:e.stale?.toLowerCase()===`true`}},We=(e,{unlessBasic:t=!1,allowSHA256:n=!0}={})=>{let r=Ve(e??``);if(!(t&&r.some(({scheme:e})=>e===`basic`)))return r.filter(({scheme:e})=>e===`digest`).map(({params:e})=>Ue(e)).filter(e=>e!=null).filter(e=>n||!e.algorithm.startsWith(`SHA`)).sort((e,t)=>He.indexOf(e.algorithm)-He.indexOf(t.algorithm))[0]},Ge=e=>Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);var q=class extends Error{constructor(){super(`tsdav: Digest authentication requires the WebCrypto API (globalThis.crypto), available in Node.js >= 19, browsers, Bun and Deno. On Node.js 18, assign webcrypto from node:crypto to globalThis.crypto.`),this.name=`DigestUnsupportedError`}};const Ke=e=>{let{crypto:t}=globalThis;if(!t?.getRandomValues||e?.startsWith(`SHA`)&&!t.subtle)throw new q;return t},qe=async(e,t)=>e.startsWith(`MD5`)?Re(t):Ge(new Uint8Array(await Ke(e).subtle.digest(`SHA-256`,new TextEncoder().encode(t)))),J=e=>`"${e.replace(/["\\]/g,`\\$&`)}"`,Je=e=>/^[\x20-\x7e]*$/.test(e)?`username=${J(e)}`:`username*=UTF-8''${encodeURIComponent(e).replace(/['()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}`,Ye=async e=>{let{challenge:t,username:n,password:r,method:i,uri:a,cnonce:o}=e,{realm:s,nonce:c,qop:l,algorithm:u}=t,d=e.nc.toString(16).padStart(8,`0`),f=await qe(u,`${n}:${s}:${r}`);u.endsWith(`-SESS`)&&(f=await qe(u,`${f}:${c}:${o}`));let p=await qe(u,`${i}:${a}`),m=await qe(u,l?`${f}:${c}:${d}:${o}:${l}:${p}`:`${f}:${c}:${p}`);return`Digest ${[Je(n),`realm=${J(s)}`,`uri=${J(a)}`,`algorithm=${u.replace(`-SESS`,`-sess`)}`,`nonce=${J(c)}`,...l?[`nc=${d}`,`cnonce=${J(o)}`,`qop=${l}`]:[],`response=${J(m)}`,...t.opaque==null?[]:[`opaque=${J(t.opaque)}`]].join(`, `)}`},Xe=()=>Ge(Ke().getRandomValues(new Uint8Array(16))),Y=e=>{if(e instanceof URL)return e;if(typeof e==`string`)try{return new URL(e)}catch{return}},Ze=e=>typeof e!=`object`||!e||!(typeof e.getReader==`function`||Symbol.asyncIterator in e),Qe=[301,302,303,307,308],$e=[`content-encoding`,`content-language`,`content-location`,`content-type`],et=(e,t)=>{let n=(t.method??`GET`).toUpperCase();if(e===303&&n!==`GET`&&n!==`HEAD`||(e===301||e===302)&&n===`POST`){let e=new Headers(t.headers);for(let t of $e)e.delete(t);return{...t,method:`GET`,body:void 0,headers:e}}return t},tt=e=>{let t=new Headers(e.headers);return t.delete(`authorization`),{...e,headers:t}},nt=(e,t)=>e.domain?.trim()?e.domain.trim().split(/\s+/).flatMap(e=>{try{if(!e.startsWith(`/`)&&!/^[a-z][a-z\d+.-]*:/i.test(e))return[];let n=new URL(e,`${t.origin}/`);return n.hash=``,n.origin===t.origin?[n.href]:[]}catch{return[]}}):[`${t.origin}/`],rt=(e=!0)=>({active:e,challenges:new Map}),it=e=>{let{credentials:t,fetch:n}=e,r=n??c,i=e.state??rt(),a=async(e,n,r,a)=>{let o=i.challenges.get(n.origin)?.find(e=>e.scopes.some(e=>n.href.startsWith(e)));if(!o)return tt(e);o.nc+=1;let{challenge:s,nc:c}=o,l=await Ye({challenge:s,username:t.username??``,password:t.password??``,method:r,uri:a,nc:c,cnonce:s.algorithm.endsWith(`-SESS`)?o.cnonce:Xe()}),u=new Headers(e.headers);return u.set(`authorization`,l),{...e,headers:u}},o=(e,t)=>{let n=e.headers.get(`www-authenticate`),r={unlessBasic:!i.active},a=!globalThis.crypto?.subtle&&We(n,{...r,allowSHA256:!1})||We(n,r);if(!a)return!1;try{Ke(a.algorithm)}catch(e){if(!i.active&&e instanceof q)return!1;throw e}i.active||=(ze(`Server only offers Digest authentication, switching from Basic`),!0),ze(`Digest challenge received for ${t.origin}${a.stale?` (stale nonce)`:``}`);let o=i.challenges.get(t.origin)??[],s=nt(a,t),c=o.find(e=>e.challenge.realm===a.realm&&e.challenge.algorithm===a.algorithm&&e.challenge.nonce===a.nonce);return i.challenges.set(t.origin,[{challenge:a,scopes:s,nc:c?.nc??0,cnonce:c?.cnonce??Xe()},...o.filter(e=>e.challenge.realm!==a.realm)]),!0},s=async(e,t,n,i)=>{let s=(t.method??`GET`).toUpperCase(),c=`${n.pathname}${n.search}`,l=await r(e,await a(t,n,s,c));return l.status!==401||!i||!Ze(t.body)||!o(l,n)?l:(await l.body?.cancel().catch(()=>void 0),r(e,await a(t,n,s,c)))};return async(e,t={})=>{let n=Y(e);if(!n)return r(e,t);i.active&&(t={...t,credentials:t.credentials??`omit`});let a=!1;if(!i.active){let i=await r(e,t);if(i.status!==401||!Ze(t.body)||(Y(i.url??``)??n).origin!==n.origin||!o(i,Y(i.url)??n))return i;await i.body?.cancel().catch(()=>void 0),a=!0,t={...t,credentials:t.credentials??`omit`};let c=Y(i.url)??n;if(c.href!==n.href){let e=(t.method??`GET`).toUpperCase();if(e!==`GET`&&e!==`HEAD`)throw TypeError(`tsdav: Digest negotiation after an automatic redirect requires the final DAV URL. Set serverUrl and collection URLs to their canonical locations.`);return s(c.href,{...t,redirect:`error`},c,!1)}}if((t.redirect??`follow`)!==`follow`||!Ze(t.body))return s(e,t,n,!a);let c=e,l=n,u={...t,redirect:`manual`},d=!1;for(let e=0;;e+=1){let t=d?await r(c,u):await s(c,u,l,!a);if(a=!1,t.type===`opaqueredirect`){let e=(u.method??`GET`).toUpperCase();if(e!==`GET`&&e!==`HEAD`)throw TypeError(`tsdav: Digest authentication cannot safely follow an opaque browser redirect for this method. Use the final DAV URL, including its trailing slash.`);let t=await r(c,{...tt(u),redirect:`follow`}),i=Y(t.url);return!i||i.origin!==n.origin||d||t.status!==401||!o(t,i)?t:(await t.body?.cancel().catch(()=>void 0),s(i.href,{...u,redirect:`error`},i,!1))}let i=t.headers.get(`location`);if(!Qe.includes(t.status)||!i)return t;if(e===20)throw TypeError(`tsdav: too many redirects`);await t.body?.cancel().catch(()=>void 0),l=new URL(i,l),c=l.href,u=et(t.status,u),l.origin!==n.origin&&(d=!0,u=tt(u))}}};var at=r({createAccount:()=>Z,fetchHomeUrl:()=>ut,fetchPrincipalUrl:()=>lt,serviceDiscovery:()=>st});const X=e(`tsdav:account`),ot=(e,t)=>{let n=[t,e,new URL(`/`,e).href];return n.filter((e,t)=>n.indexOf(e)===t)},st=async e=>{X(`Service discovery...`);let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=a??c,s=new URL(t.serverUrl),{headers:l,...u}=i,d=new URL(`/.well-known/${t.accountType}`,s);d.protocol=s.protocol??`http`;let f=e=>{if(e.status>=300&&e.status<400){let t=e.headers.get(`Location`);if(typeof t==`string`&&t.length)return X(`Service discovery redirected to ${t}`),new URL(t,d).href}};try{let e=f(await o(d.href,{...u,method:`PROPFIND`,headers:E(D({"Content-Type":`text/xml;charset=UTF-8`},n,l),r),body:` +import e from"debug";import t from"xml-js";var n=Object.defineProperty,r=(e,t)=>{let r={};for(var i in e)n(r,i,{get:e[i],enumerable:!0});return t||n(r,Symbol.toStringTag,{value:`Module`}),r};let i=/* @__PURE__ */ function(e){return e.CALENDAR_SERVER=`http://calendarserver.org/ns/`,e.CALDAV_APPLE=`http://apple.com/ns/ical/`,e.CALDAV=`urn:ietf:params:xml:ns:caldav`,e.CARDDAV=`urn:ietf:params:xml:ns:carddav`,e.DAV=`DAV:`,e}({});const a={"urn:ietf:params:xml:ns:caldav":`xmlns:c`,"urn:ietf:params:xml:ns:carddav":`xmlns:card`,"http://calendarserver.org/ns/":`xmlns:cs`,"http://apple.com/ns/ical/":`xmlns:ca`,"DAV:":`xmlns:d`};let o=/* @__PURE__ */ function(e){return e.CALDAV=`c`,e.CARDDAV=`card`,e.CALENDAR_SERVER=`cs`,e.CALDAV_APPLE=`ca`,e.DAV=`d`,e}({}),s=/* @__PURE__ */ function(e){return e.VEVENT=`VEVENT`,e.VTODO=`VTODO`,e.VJOURNAL=`VJOURNAL`,e.VFREEBUSY=`VFREEBUSY`,e.VTIMEZONE=`VTIMEZONE`,e.VALARM=`VALARM`,e}({});const c=typeof globalThis<`u`&&typeof globalThis.fetch==`function`?globalThis.fetch.bind(globalThis):(()=>{throw Error("tsdav: global fetch is not available in this runtime. Upgrade to Node.js >= 18, run under a browser/Bun/Deno, or install a fetch polyfill on globalThis before importing tsdav. You can also pass a custom `fetch` implementation to `createDAVClient`, `DAVClient`, or individual request helpers.")}),l=e=>e.replace(/[-_]+(\w?)/g,(e,t)=>t?t.toUpperCase():``);function u(e,t){if(!e)return!1;let n=e=>e!=null&&t.every(t=>e[t]);return Array.isArray(e)?e.length>0&&e.every(e=>n(e)):n(e)}const d=(e,t)=>!e||typeof e!=`object`?t.map(e=>e.toString()).join(`,`):t.reduce((t,n)=>e[n]?t:`${t.length?`${t},`:``}${n.toString()}`,``),f=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),p=new Set(Object.values(i)),m=new Map([...[`multistatus`,`response`,`propstat`,`prop`,`href`,`status`,`error`,`responsedescription`,`resourcetype`,`collection`,`getetag`,`displayname`,`syncToken`,`supportedReportSet`,`supportedReport`,`report`,`currentUserPrincipal`].map(e=>[e,`DAV:`]),...[`calendarData`,`calendar`,`calendarDescription`,`calendarTimezone`,`calendarHomeSet`,`calendarUserAddressSet`,`supportedCalendarComponentSet`,`comp`].map(e=>[e,`urn:ietf:params:xml:ns:caldav`]),...[`addressData`,`addressbook`,`addressbookHomeSet`].map(e=>[e,`urn:ietf:params:xml:ns:carddav`]),[`getctag`,`http://calendarserver.org/ns/`],[`calendarColor`,`http://apple.com/ns/ical/`]]),h=(e,t)=>{let n=l(e.replace(/^.*:/,``)),r=m.get(n);return t&&r&&t!==r?`{${t}}${n}`:n},g=(e,t)=>{let n=Object.assign(Object.create(null),t),r=Object.create(null);for(let[t,i]of Object.entries(e.attributes??{}))(t===`xmlns`||t.startsWith(`xmlns:`))&&(n[t===`xmlns`?``:t.slice(6)]=String(i)),t!==`xmlns`&&(r[t]=i);let i=e.name??``,a=i.indexOf(`:`),o=n[a===-1?``:i.slice(0,a)]??``,s=e.elements??[],c=s.filter(e=>e.type===`element`),u=s.filter(e=>e.type===`text`||e.type===`cdata`).map(e=>String(e.text??e.cdata??``)).join(``),d={},m=Object.create(null);if(Object.keys(r).length&&(d._attributes=r),!c.length){let e=s.some(e=>e.type===`text`),t=s.some(e=>e.type===`cdata`);return e?{value:u,namespace:o,namespaces:m}:(t&&(d._cdata=u),{value:d,namespace:o,namespaces:m})}u.trim()&&(d._text=u);for(let e of c){let t=g(e,n),r=l((e.name??``).replace(/^.*:/,``)),i=h(e.name??``,t.namespace),a=m[i];if(f(d,i)&&a!==t.namespace){if(p.has(t.namespace)&&!p.has(a)){let e=`{${a}}${r}`;Object.defineProperty(d,e,{value:d[i],enumerable:!0,configurable:!0,writable:!0}),m[e]=a,delete d[i]}else i=`{${t.namespace}}${r}`}f(d,i)?Array.isArray(d[i])?d[i].push(t.value):d[i]=[d[i],t.value]:Object.defineProperty(d,i,{value:t.value,enumerable:!0,configurable:!0,writable:!0}),m[i]=t.namespace,r===`prop`&&t.namespace===`DAV:`&&(d.propNamespaces=t.namespaces)}return{value:d,namespace:o,namespaces:m}},_=e=>{let n=t.xml2js(e,{compact:!1,ignoreDeclaration:!0}),r={};for(let e of n.elements??[]){if(e.type!==`element`)continue;let t=g(e,{}),n=h(e.name??``,t.namespace);Object.defineProperty(r,n,{value:t.value,enumerable:!0})}return r},ee=e=>{let t=/* @__PURE__ */ new Map;for(let n of e)if(n.ok)for(let[e,r]of Object.entries(n.props)){let i=t.get(e)??/* @__PURE__ */ new Map;i.set(n.namespaces?.[e]??``,r),t.set(e,i)}let n={};for(let[e,r]of t){let t=[...r.keys()].find(e=>p.has(e))??r.keys().next().value;for(let[i,a]of r)Object.defineProperty(n,i===t?e:`{${i}}${e}`,{value:a,enumerable:!0,configurable:!0,writable:!0})}return n},v=e=>{let t;try{t=new URL(e)}catch{return e}return t.pathname=t.pathname.split(`/`).map(e=>{try{return encodeURIComponent(decodeURIComponent(e))}catch{return e}}).join(`/`),t.href};var y=/* @__PURE__ */ r({cleanupFalsy:()=>E,conditionalParam:()=>te,ensureTrailingSlash:()=>x,excludeHeaders:()=>D,getDAVAttribute:()=>T,mergeHeaders:()=>O,urlContains:()=>C,urlEquals:()=>S,urlMatches:()=>w});const b=e=>{let t=e.trim();return t.endsWith(`/`)?t.slice(0,-1):t},x=e=>{let t=e.trim(),n=t.search(/[?#]/),r=n===-1?t:t.slice(0,n),i=n===-1?``:t.slice(n);return`${r.endsWith(`/`)?r:`${r}/`}${i}`},S=(e,t)=>!e&&!t?!0:!e||!t?!1:b(e)===b(t),C=(e,t)=>{if(!e&&!t)return!0;if(!e||!t)return!1;let n=b(e),r=b(t);return n.includes(r)||r.includes(n)},w=(e,t,n)=>{if(!e||!t||!n)return S(e,t);try{return S(v(new URL(e,n).href),v(new URL(t,n).href))}catch{return S(e,t)}},T=e=>e.reduce((e,t)=>({...e,[a[t]]:t}),{}),E=e=>Object.entries(e).reduce((e,[t,n])=>n?{...e,[t]:n}:e,{}),te=(e,t)=>t?{[e]:t}:{},D=(e,t)=>{if(!e)return{};if(!t||t.length===0)return e;let n=new Set(t.map(e=>e.toLowerCase()));return Object.fromEntries(Object.entries(e).filter(([e])=>!n.has(e.toLowerCase())))},O=(...e)=>{let t=/* @__PURE__ */ new Map,n=(e,n)=>{t.set(e.toLowerCase(),[e,n])};for(let t of e)if(t){if(Array.isArray(t))for(let[e,r]of t)n(e,r);else if(typeof t.forEach==`function`)t.forEach((e,t)=>{n(t,e)});else for(let[e,r]of Object.entries(t))n(e,r)}return Object.fromEntries(t.values())};var ne=/* @__PURE__ */ r({createObject:()=>j,davRequest:()=>k,deleteObject:()=>N,propfind:()=>A,updateObject:()=>M});const re=e(`tsdav:request`),ie=e=>{let t=/^\S+\s+(?\d{3})(?:\s+(?.*))?$/.exec(e?.trim()??``),n=t?.groups?.status,r=t?.groups?.statusText;return n?{status:Number.parseInt(n,10),statusText:r??``}:void 0},k=async e=>{let{url:n,init:r,convertIncoming:i=!0,parseOutgoing:a=!0,headersToExclude:o,fetchOptions:s={},fetch:l}=e,u=l??c,{headers:d={},body:f,namespace:p,method:m,attributes:h}=r,g=f;h&&typeof f==`object`&&f&&!Array.isArray(f)&&(g=Object.fromEntries(Object.entries(f).map(([e,t])=>{if(t&&typeof t==`object`&&!Array.isArray(t)){let n=t;return[e,{...n,_attributes:{...h,...n._attributes}}]}return[e,t]})));let v=i&&f!=null?t.js2xml({_declaration:{_attributes:{version:`1.0`,encoding:`utf-8`}},...g},{compact:!0,spaces:2,elementNameFn:e=>p&&!/^.+:.+/.test(e)?`${p}:${e}`:e}):f,y={...s};delete y.headers;let b=D(O({"Content-Type":`text/xml;charset=UTF-8`},E(d),s.headers),o),x=await u(n,{...y,headers:b,body:v,method:m}),S=await x.text();if(!x.ok||!x.headers.get(`content-type`)?.toLowerCase().includes(`xml`)||!a||!S)return[{href:x.url,ok:x.ok,status:x.status,statusText:x.statusText,raw:S}];let C;try{C=_(S)}catch(e){return re(`Failed to parse DAV response XML: ${e.message}`),[{href:x.url,ok:!1,status:x.status,statusText:x.statusText,raw:S,parseError:e.message}]}return C?.multistatus?(Array.isArray(C.multistatus.response)?C.multistatus.response:[C.multistatus.response]).map(e=>{if(!e)return{raw:C,status:x.status,statusText:x.statusText,ok:x.ok};let t=(Array.isArray(e.propstat)?e.propstat:e.propstat?[e.propstat]:[]).map(e=>{let t=ie(e.status),n=t?.status??0;return{props:e.prop??{},namespaces:e.propNamespaces,status:n,statusText:t?.statusText??`Invalid DAV property status`,ok:n>=200&&n<300,error:e.error,responsedescription:e.responsedescription}}),n=t.length>0&&t.every(e=>!e.ok)?t[0]:void 0,r=ie(e.status)??n,i=r?.status??x.status;return{raw:C,href:e.href,status:i,statusText:r?.statusText??x.statusText,ok:i>=200&&i<300,error:e.error,responsedescription:e.responsedescription,propStats:t,props:ee(t)}}):[{href:x.url,ok:x.ok,status:x.status,statusText:x.statusText,raw:C}]},A=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return k({url:t,init:{method:`PROPFIND`,headers:D(E({depth:r,...i}),a),namespace:`d`,body:{propfind:{_attributes:T([`urn:ietf:params:xml:ns:caldav`,`http://apple.com/ns/ical/`,`http://calendarserver.org/ns/`,`urn:ietf:params:xml:ns:carddav`,`DAV:`]),prop:n}}},headersToExclude:a,fetchOptions:o,fetch:s})},j=async e=>{let{url:t,data:n,headers:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e,s=o??c,{headers:l,...u}=a;return s(t,{...u,method:`PUT`,body:n,headers:D(O(r,l),i)})},M=async e=>{let{url:t,data:n,etag:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e,l=s??c,{headers:u,...d}=o;return l(t,{...d,method:`PUT`,body:n,headers:D(O(E({"If-Match":r,...i}),u),a)})},N=async e=>{let{url:t,headers:n,etag:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e,s=o??c,{headers:l,...u}=a;return s(t,{...u,method:`DELETE`,headers:D(O(E({"If-Match":r,...n}),l),i)})},P=(e,t)=>{let n;try{n=v(new URL(e,x(t)).href)}catch{n=e.trim()}return n.endsWith(`/`)?n.slice(0,-1):n},ae=(e,t,n,r=!1,i=[])=>{let a=new Map(e.map(e=>[P(e.url,n),e])),o=new Map(t.map(e=>[P(e.url,n),e])),s=r?i:e.filter(e=>!o.has(P(e.url,n))),c=new Set(s.map(e=>P(e.url,n))),l=t.filter(e=>!a.has(P(e.url,n))),u=[],d=[];for(let t of e){let e=P(t.url,n);if(c.has(e))continue;let i=o.get(e);i&&i.etag!==t.etag?u.push(i):(i||r)&&d.push(t)}return{created:l,updated:u,deleted:s,unchanged:d}},oe=(e,t)=>{let n=e.find(e=>!e.ok||e.status>=400);if(n)throw Error(`${t}: ${n.status} ${n.statusText}`)},se=(e,t)=>{oe(e,t);for(let n of e)if((!n.raw?.multistatus||n.raw.multistatus.response)&&(ce(n,`resourcetype`,t),!n.props||!f(n.props,`resourcetype`)||typeof n.href!=`string`||!n.href))throw Error(`${t}: missing resourcetype or href in DAV multistatus response`)},ce=(e,t,n)=>{let r=e.propStats?.find(e=>!e.ok&&f(e.props,t));if(r&&!f(e.props??{},t))throw Error(`${n}: ${t} returned ${r.status} ${r.statusText}`)},le=(e,t,n,r,i)=>{oe(e,i);let a=/* @__PURE__ */ new Set;for(let n of e){if(ce(n,t,i),!n.href||typeof(n.props?.[t]?._cdata??n.props?.[t])!=`string`)throw Error(`${i}: missing ${t} or href`);a.add(P(n.href,r))}let o=e=>P(e.replace(/\?.*$/,``),r),s=/* @__PURE__ */ new Map;for(let e of n){let t=o(e);s.set(t,(s.get(t)??0)+1)}if(n.some(e=>!a.has(P(e,r))&&!(s.get(o(e))===1&&a.has(o(e)))))throw Error(`${i}: incomplete response`)},F=e=>{let t=typeof e==`string`||typeof e==`number`?String(e):e?._cdata??e?._text;return typeof t==`string`?t:void 0};var ue=/* @__PURE__ */ r({collectionQuery:()=>I,isCollectionDirty:()=>R,makeCollection:()=>pe,smartCollectionSync:()=>B,smartCollectionSyncDetailed:()=>me,supportedReportSet:()=>L,syncCollection:()=>z});const de=e(`tsdav:collection`),fe=(e,t)=>{try{return new URL(e,x(t)).href}catch{return e}},I=async e=>{let{url:t,body:n,depth:r,defaultNamespace:i=`d`,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e,l=await k({url:t,init:{method:`REPORT`,headers:D(E({depth:r,...a}),o),namespace:i,body:n},headersToExclude:o,fetchOptions:s,fetch:c}),u=l[0];if(i===`c`&&n?.[`calendar-query`]!=null&&l.length===1&&u&&u.status===404&&w(t,u.href,t)&&!u.error&&Object.keys(u.props??{}).length===0&&typeof u.raw==`object`&&u.raw!==null&&u.raw.multistatus?.response?.propstat==null)return[];let d=l.find(e=>!e.ok||e.status&&e.status>=400);if(d)throw Error(`Collection query failed: ${d.status} ${d.statusText}. ${typeof d.raw==`string`?`Raw response: ${d.raw.slice(0,4096)}`:``}`);if((n?.[`calendar-query`]||n?.[`calendar-multiget`]||n?.[`addressbook-query`]||n?.[`addressbook-multiget`])&&l.some(e=>!e.raw?.multistatus))throw Error(`Collection query failed: expected a DAV multistatus response`);if((n?.[`calendar-query`]||n?.[`calendar-multiget`]||n?.[`addressbook-query`]||n?.[`addressbook-multiget`])&&l.some(e=>e.raw?.multistatus?.response&&(typeof e.href!=`string`||!e.href)))throw Error(`Collection query failed: missing href in DAV response`);let f=l[0];return l.length===1&&f&&(!f.raw||f.raw.multistatus&&!f.raw.multistatus.response)&&f.status&&f.status<300?[]:l},pe=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return k({url:t,init:{method:`MKCOL`,headers:D(E({depth:r,...i}),a),namespace:`d`,body:n?{mkcol:{_attributes:T([`DAV:`,`urn:ietf:params:xml:ns:caldav`,`urn:ietf:params:xml:ns:carddav`,`http://calendarserver.org/ns/`,`http://apple.com/ns/ical/`]),set:{prop:n}}}:void 0},headersToExclude:a,fetchOptions:o,fetch:s})},L=async e=>{let{collection:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=(await A({url:t.url,props:{"d:supported-report-set":{}},depth:`0`,headers:D(n,r),headersToExclude:r,fetchOptions:i,fetch:a}))[0]?.props?.supportedReportSet?.supportedReport;return o?(Array.isArray(o)?o:[o]).map(e=>e?.report?Object.keys(e.report)[0]:void 0).filter(e=>typeof e==`string`&&e.length>0):[]},R=async e=>{let{collection:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=(await A({url:t.url,props:{"cs:getctag":{}},depth:`0`,headers:D(n,r),headersToExclude:r,fetchOptions:i,fetch:a})).find(e=>w(t.url,e.href,t.url));if(!o)throw Error(`Collection does not exist on server`);let s=o.propStats?.length&&o.propStats.every(e=>e.status===404&&f(e.props,`getctag`));if(!o.ok&&!s)throw Error(`Collection status check failed: ${o.status} ${o.statusText}`);let c=F(o.props?.getctag);return{isDirty:t.ctag==null||c==null||`${t.ctag}`!=`${c}`,newCtag:c}},z=e=>{let{url:t,props:n,headers:r,syncLevel:i,syncToken:a,headersToExclude:o,fetchOptions:s,fetch:c}=e;return k({url:t,init:{method:`REPORT`,namespace:`d`,headers:D({...r},o),body:{"sync-collection":{_attributes:T([`urn:ietf:params:xml:ns:caldav`,`urn:ietf:params:xml:ns:carddav`,`DAV:`]),"sync-level":i,"sync-token":a,"d:prop":n}}},headersToExclude:o,fetchOptions:s,fetch:c})},B=async e=>{let{collection:t,method:n,headers:r,headersToExclude:i,account:a,detailedResult:o,fetchOptions:s={},fetch:c}=e,l=[`accountType`,`homeUrl`];if(!a||!u(a,l))throw Error(a?`account must have ${d(a,l)} before smartCollectionSync`:`no account for smartCollectionSync`);let f=n??(t.reports?.includes(`syncCollection`)?`webdav`:`basic`);if(de(`smart collection sync with type ${a.accountType} and method ${f}`),f===`webdav`){let e=e=>z({url:t.url,props:{"d:getetag":{},[`${a.accountType===`caldav`?`c`:`card`}:${a.accountType===`caldav`?`calendar-data`:`address-data`}`]:{},"d:displayname":{}},syncLevel:1,syncToken:e,headers:D(r,i),headersToExclude:i,fetchOptions:s,fetch:c}),n=t.syncToken,l=await e(n);n&&l.length===1&&l[0].status>=400&&l[0].status<500&&typeof l[0].raw==`string`&&l[0].raw.includes(`valid-sync-token`)&&(de(`sync token rejected by server, starting a full sync`),n=void 0,l=await e(n));let u=e=>typeof e.href==`string`&&P(e.href,t.url)!==P(t.url,t.url)&&!e.props?.resourcetype?.collection,d=l.find(e=>(!e.ok||e.status>=400)&&!(e.status===404&&!e.propStats?.length&&u(e)));if(d)throw Error(`Collection sync failed: ${d.status} ${d.statusText}`);if(l.some(e=>e.raw&&!e.raw.multistatus))throw Error(`Collection sync failed: expected a DAV multistatus response`);if(l.some(e=>e.raw?.multistatus?.response&&(typeof e.href!=`string`||!e.href)))throw Error(`Collection sync failed: missing href in DAV response`);let f=l.filter(u),p=f.filter(e=>e.status!==404).map(e=>e.href),m=f.filter(e=>e.status===404).map(e=>e.href),h=t.objectMultiGet;if(p.length>0&&!h)throw Error(`collection.objectMultiGet is required for webdav sync changes`);let g=p.length?await h?.({url:t.url,props:{"d:getetag":{},[`${a.accountType===`caldav`?`c`:`card`}:${a.accountType===`caldav`?`calendar-data`:`address-data`}`]:{}},objectUrls:p,depth:`1`,headers:D(r,i),headersToExclude:i,fetchOptions:s,fetch:c})??[]:[];le(g,a.accountType===`caldav`?`calendarData`:`addressData`,p,t.url,`Collection sync multi-get failed`);let _=g.map(e=>({url:fe(e.href??``,t.url),etag:F(e.props?.getetag),data:a?.accountType===`caldav`?e.props?.calendarData?._cdata??e.props?.calendarData:e.props?.addressData?._cdata??e.props?.addressData})),ee=t.objects??[],v=m.map(e=>({url:fe(e,t.url),etag:``})),{created:y,updated:b,deleted:x,unchanged:S}=ae(ee,_,t.url,!!n,v);return{...t,objects:o?{created:y,updated:b,deleted:x}:[...S,...y,...b],syncToken:F(l[0]?.raw?.multistatus?.syncToken)??t.syncToken}}if(f===`basic`){let{isDirty:e,newCtag:n}=await R({collection:t,headers:D(r,i),headersToExclude:i,fetchOptions:s,fetch:c});if(!e)return o?{...t,objects:{created:[],updated:[],deleted:[]}}:t;let a=t.objects??[];if(!t.fetchObjects)throw Error(`collection.fetchObjects is required for basic sync changes`);let l=await t.fetchObjects({collection:t,headers:D(r,i),headersToExclude:i,fetchOptions:s,fetch:c})??[],{created:u,updated:d,deleted:f,unchanged:p}=ae(a,l,t.url);return{...t,objects:o?{created:u,updated:d,deleted:f}:[...p,...u,...d],ctag:n}}return o?{...t,objects:{created:[],updated:[],deleted:[]}}:t},me=async e=>B({...e,detailedResult:!0}),he=(e,t)=>{if(!t||t.includes(`/`)||/^(?:\.|%2e){1,2}$/i.test(t))throw Error(`Invalid object filename "${t}": expected a single path segment`);let n=t.replace(/%(?![\da-f]{2})|[?#\\\x00-\x20\x7f]/gi,e=>`%${e.charCodeAt(0).toString(16).toUpperCase().padStart(2,`0`)}`);return new URL(`./${n}`,x(e)).href};var ge=/* @__PURE__ */ r({addressBookMultiGet:()=>H,addressBookQuery:()=>V,createVCard:()=>be,deleteVCard:()=>Se,fetchAddressBooks:()=>ve,fetchVCards:()=>ye,updateVCard:()=>xe});const _e=e(`tsdav:addressBook`),V=async e=>{let{url:t,props:n,filters:r,depth:i,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e;return I({url:t,body:{"addressbook-query":E({_attributes:T([`urn:ietf:params:xml:ns:carddav`,`DAV:`]),"d:prop":n,filter:r??{"prop-filter":{_attributes:{name:`FN`}}}})},defaultNamespace:`card`,depth:i,headers:D(a,o),headersToExclude:o,fetchOptions:s,fetch:c})},H=async e=>{let{url:t,props:n,objectUrls:r,depth:i,headers:a,headersToExclude:o,fetchOptions:s={},fetch:c}=e;return I({url:t,body:{"addressbook-multiget":E({_attributes:T([`DAV:`,`urn:ietf:params:xml:ns:carddav`]),"d:prop":n,"d:href":r})},defaultNamespace:`card`,depth:i,headers:D(a,o),headersToExclude:o,fetchOptions:s,fetch:c})},ve=async e=>{let{account:t,headers:n,props:r,headersToExclude:i,fetchOptions:a={},fetch:o}=e??{},s=[`homeUrl`,`rootUrl`];if(!t||!u(t,s))throw Error(t?`account must have ${d(t,s)} before fetchAddressBooks`:`no account for fetchAddressBooks`);let c=await A({url:t.homeUrl,props:{...r??{"d:displayname":{},"cs:getctag":{},"d:resourcetype":{},"d:sync-token":{}},"d:resourcetype":{}},depth:`1`,headers:D(n,i),headersToExclude:i,fetchOptions:a,fetch:o});return se(c,`Address book discovery failed`),Promise.all(c.filter(e=>Object.keys(e.props?.resourcetype??{}).includes(`addressbook`)).map(e=>{let n=e.props?.displayname?._cdata??e.props?.displayname;return _e(`Found address book named ${typeof n==`string`?n:``}, + props: ${JSON.stringify(e.props)}`),{url:new URL(e.href??``,x(t.rootUrl??``)).href,ctag:F(e.props?.getctag),displayName:typeof n==`string`?n:``,resourcetype:Object.keys(e.props?.resourcetype??{}),syncToken:F(e.props?.syncToken)}}).map(async e=>({...e,reports:await L({collection:e,headers:D(n,i),headersToExclude:i,fetchOptions:a,fetch:o})})))},ye=async e=>{let{addressBook:t,headers:n,objectUrls:r,headersToExclude:i,urlFilter:a=e=>!!e,useMultiGet:o=!0,fetchOptions:s={},fetch:c}=e;_e(`Fetching vcards from ${t?.url}`);let l=[`url`];if(!t||!u(t,l))throw Error(t?`addressBook must have ${d(t,l)} before fetchVCards`:`cannot fetchVCards for undefined addressBook`);let f=(r??(await V({url:t.url,props:{"d:getetag":{}},depth:`1`,headers:D(n,i),headersToExclude:i,fetchOptions:s,fetch:c})).map(e=>e.href??``)).filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.startsWith(`http`)?e:new URL(e,x(t.url)).href).filter(e=>!S(e,t.url)).filter(a).map(e=>{let t=new URL(e);return`${t.pathname}${t.search}`}),p=new Set(f.map(e=>P(e,t.url))),m=[];return f.length>0&&(o?m=await H({url:t.url,props:{"d:getetag":{},"card:address-data":{}},objectUrls:f,depth:`1`,headers:D(n,i),headersToExclude:i,fetchOptions:s,fetch:c}):(m=await V({url:t.url,props:{"d:getetag":{},"card:address-data":{}},depth:`1`,headers:D(n,i),headersToExclude:i,fetchOptions:s,fetch:c}),m=m.filter(e=>!!e.href&&p.has(P(e.href,t.url))))),le(m,`addressData`,f,t.url,`VCard fetch failed`),m.map(e=>({url:new URL(e.href??``,x(t.url)).href,etag:F(e.props?.getetag),data:e.props?.addressData?._cdata??e.props?.addressData}))},be=async e=>{let{addressBook:t,vCardString:n,filename:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return j({url:he(t.url,r),data:n,headers:D({"content-type":`text/vcard; charset=utf-8`,"If-None-Match":`*`,...i},a),headersToExclude:a,fetchOptions:o,fetch:s})},xe=async e=>{let{vCard:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return M({url:t.url,data:t.data,etag:t.etag,headers:D({"content-type":`text/vcard; charset=utf-8`,...n},r),headersToExclude:r,fetchOptions:i,fetch:a})},Se=async e=>{let{vCard:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return N({url:t.url,etag:t.etag,headers:D(n,r),headersToExclude:r,fetchOptions:i,fetch:a})};var Ce=/* @__PURE__ */ r({calendarMultiGet:()=>W,calendarQuery:()=>U,createCalendarObject:()=>je,deleteCalendarObject:()=>Ne,fetchCalendarObjects:()=>K,fetchCalendarUserAddresses:()=>ke,fetchCalendars:()=>G,freeBusyQuery:()=>Ie,makeCalendar:()=>Ae,syncCalendars:()=>Pe,syncCalendarsDetailed:()=>Fe,updateCalendarObject:()=>Me});const we=e(`tsdav:calendar`),Te=/^\d{4}(-\d\d(-\d\d(T\d\d:\d\d(:\d\d)?(\.\d+)?(([+-]\d\d:\d\d)|Z)?)?)?)?$/i,Ee=/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(\.\d+)?(([+-]\d\d:\d\d)|Z)?$/i,De=e=>{let{start:t,end:n}=e;if(!(Te.test(t)&&Te.test(n)||Ee.test(t)&&Ee.test(n)))throw Error(`invalid timeRange format, not in ISO8601`);if(Number.isNaN(new Date(t).getTime())||Number.isNaN(new Date(n).getTime()))throw Error(`invalid timeRange: start or end is not a valid date`);if(new Date(t).getTime()>=new Date(n).getTime())throw Error(`invalid timeRange: start must be before end`)},Oe=e=>{let t=[];return Array.isArray(e)?t=e.map(e=>e?._attributes?.name):e&&typeof e==`object`&&(t=[e._attributes?.name]),t.filter(e=>typeof e==`string`&&e.length>0)},ke=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`principalUrl`,`rootUrl`];if(!u(t,o))throw Error(`account must have ${d(t,o)} before fetchUserAddresses`);we(`Fetch user addresses from ${t.principalUrl}`);let s=(await A({url:t.principalUrl,props:{"c:calendar-user-address-set":{}},depth:`0`,headers:D(n,r),headersToExclude:r,fetchOptions:i,fetch:a})).find(e=>w(t.principalUrl,e.href,t.rootUrl));if(!s||!s.ok)throw Error(`cannot find calendarUserAddresses`);let c=s?.props?.calendarUserAddressSet?.href,l=[];Array.isArray(c)?l=c:c&&(l=[c]);let f=l.filter(e=>typeof e==`string`&&e.length>0);return we(`Fetched calendar user addresses ${f}`),f},U=async e=>{let{url:t,props:n,filters:r,timezone:i,depth:a,headers:o,headersToExclude:s,fetchOptions:c={},fetch:l}=e;return I({url:t,body:{"calendar-query":E({_attributes:T([`urn:ietf:params:xml:ns:caldav`,`http://calendarserver.org/ns/`,`http://apple.com/ns/ical/`,`DAV:`]),"d:prop":n,filter:r,timezone:i})},defaultNamespace:`c`,depth:a,headers:D(o,s),headersToExclude:s,fetchOptions:c,fetch:l})},W=async e=>{let{url:t,props:n,objectUrls:r,filters:i,timezone:a,depth:o,headers:s,headersToExclude:c,fetchOptions:l={},fetch:u}=e;return I({url:t,body:{"calendar-multiget":E({_attributes:T([`DAV:`,`urn:ietf:params:xml:ns:caldav`]),"d:prop":n,"d:href":r,filter:i,timezone:a})},defaultNamespace:`c`,depth:o,headers:D(s,c),headersToExclude:c,fetchOptions:l,fetch:u})},Ae=async e=>{let{url:t,props:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return k({url:t,init:{method:`MKCALENDAR`,headers:D(E({depth:r,...i}),a),namespace:`d`,body:{"c:mkcalendar":{_attributes:T([`DAV:`,`urn:ietf:params:xml:ns:caldav`,`http://apple.com/ns/ical/`]),set:{prop:n}}}},headersToExclude:a,fetchOptions:o,fetch:s})},G=async e=>{let{headers:t,account:n,props:r,projectedProps:i,headersToExclude:a,fetchOptions:o={},fetch:c}=e??{},l=[`homeUrl`,`rootUrl`];if(!n||!u(n,l))throw Error(n?`account must have ${d(n,l)} before fetchCalendars`:`no account for fetchCalendars`);let f=await A({url:n.homeUrl,props:{...r??{"c:calendar-description":{},"c:calendar-timezone":{},"d:displayname":{},"ca:calendar-color":{},"cs:getctag":{},"d:resourcetype":{},"c:supported-calendar-component-set":{},"d:sync-token":{}},"d:resourcetype":{},"c:supported-calendar-component-set":{}},depth:`1`,headers:D(t,a),headersToExclude:a,fetchOptions:o,fetch:c});return se(f,`Calendar discovery failed`),Promise.all(f.filter(e=>Object.keys(e.props?.resourcetype??{}).includes(`calendar`)).filter(e=>{let t=Oe(e.props?.supportedCalendarComponentSet?.comp);return t.length===0||t.some(e=>Object.values(s).includes(e))}).map(e=>{let t=e.props?.calendarDescription,r=e.props?.calendarTimezone,a=e.props?.supportedCalendarComponentSet?.comp,o=Object.entries(e.props??{}).filter(([e])=>i?.[e]);return{description:typeof t==`string`?t:``,timezone:typeof r==`string`?r:``,url:new URL(e.href??``,x(n.rootUrl??``)).href,ctag:F(e.props?.getctag),calendarColor:e.props?.calendarColor,displayName:F(e.props?.displayname),components:Oe(a),resourcetype:Object.keys(e.props?.resourcetype??{}),syncToken:F(e.props?.syncToken),...i&&o.length>0?{projectedProps:Object.fromEntries(o)}:{}}}).map(async e=>({...e,reports:await L({collection:e,headers:D(t,a),headersToExclude:a,fetchOptions:o,fetch:c})})))},K=async e=>{let{calendar:t,objectUrls:n,filters:r,timeRange:i,headers:a,expand:o,urlFilter:s=e=>!!e?.includes(`.ics`),useMultiGet:c=!0,headersToExclude:l,fetchOptions:f={},fetch:p}=e;if(o&&!i)throw Error(`timeRange is required when expand is true`);i&&De(i),we(`Fetching calendar objects from ${t?.url}`);let m=[`url`];if(!t||!u(t,m))throw Error(t?`calendar must have ${d(t,m)} before fetchCalendarObjects`:`cannot fetchCalendarObjects for undefined calendar`);let h=r??[{"comp-filter":{_attributes:{name:`VCALENDAR`},"comp-filter":{_attributes:{name:`VEVENT`},...i?{"time-range":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}}}],g=[];n||(g=await U({url:t.url,props:{"d:getetag":{},...o&&i?{"c:calendar-data":{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}}:{}},filters:h,depth:`1`,headers:D(a,l),headersToExclude:l,fetchOptions:f,fetch:p}));let _=(n??g.map(e=>e.href??``)).filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.startsWith(`http`)?e:new URL(e,x(t.url)).href).filter(s).map(e=>{let t=new URL(e);return`${t.pathname}${t.search}`}),ee=new Set(_.map(e=>P(e,t.url))),v=[];return _.length>0&&(o&&!n?v=g.filter(e=>{let n=(e.href??``).startsWith(`http`)?e.href:new URL(e.href??``,x(t.url)).href;return s(n??``)}):c?v=await W({url:t.url,props:{"d:getetag":{},"c:calendar-data":{...o&&i?{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}},objectUrls:_,depth:`1`,headers:D(a,l),headersToExclude:l,fetchOptions:f,fetch:p}):(v=await U({url:t.url,props:{"d:getetag":{},"c:calendar-data":{...o&&i?{"c:expand":{_attributes:{start:`${new Date(i.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(i.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}}:{}}},filters:h,depth:`1`,headers:D(a,l),headersToExclude:l,fetchOptions:f,fetch:p}),v=v.filter(e=>{let n=(e.href??``).startsWith(`http`)?e.href??``:new URL(e.href??``,x(t.url)).href;return ee.has(P(n,t.url))}))),le(v,`calendarData`,_,t.url,`Calendar object fetch failed`),v.map(e=>({url:new URL(e.href??``,x(t.url)).href,etag:F(e.props?.getetag),data:e.props?.calendarData?._cdata??e.props?.calendarData}))},je=async e=>{let{calendar:t,iCalString:n,filename:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;return j({url:he(t.url,r),data:n,headers:D({"content-type":`text/calendar; charset=utf-8`,"If-None-Match":`*`,...i},a),headersToExclude:a,fetchOptions:o,fetch:s})},Me=async e=>{let{calendarObject:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return M({url:t.url,data:t.data,etag:t.etag,headers:D({"content-type":`text/calendar; charset=utf-8`,...n},r),headersToExclude:r,fetchOptions:i,fetch:a})},Ne=async e=>{let{calendarObject:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e;return N({url:t.url,etag:t.etag,headers:D(n,r),headersToExclude:r,fetchOptions:i,fetch:a})},Pe=async e=>{let{oldCalendars:t,account:n,detailedResult:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;if(!n)throw Error(`Must have account before syncCalendars`);let c=t??n.calendars??[],l=await G({account:n,headers:D(i,a),headersToExclude:a,fetchOptions:o,fetch:s}),u=n.rootUrl??n.homeUrl??n.serverUrl,d=new Map(c.map(e=>[P(e.url,u),e])),f=new Map(l.map(e=>[P(e.url,u),e])),p=l.filter(e=>!d.has(P(e.url,u))),m=[],h=[],g=[];for(let e of c){let t=f.get(P(e.url,u));t?!t.syncToken&&!t.ctag||t.syncToken&&t.syncToken!==e.syncToken||t.ctag&&t.ctag!==e.ctag?m.push({local:e,remote:t}):h.push(e):g.push(e)}we(`updated calendars: ${m.map(({remote:e})=>e.displayName)}`);let _=await Promise.all(m.map(async({local:e,remote:t})=>{let r=async e=>{if(!e)return[];let{collection:t,...n}=e;return K({...n,calendar:t,filters:{"comp-filter":{_attributes:{name:`VCALENDAR`}}},urlFilter:e=>P(e,t.url)!==P(t.url,t.url)})},c={...t,ctag:e.ctag,syncToken:e.syncToken,objects:e.objects,objectMultiGet:W,fetchObjects:r},l=await B({collection:c,detailedResult:!1,headers:D(i,a),headersToExclude:a,account:n,fetchOptions:o,fetch:s});return{...l,ctag:t.reports?.includes(`syncCollection`)?t.ctag??l.ctag:l.ctag??t.ctag,syncToken:t.reports?.includes(`syncCollection`)?l.syncToken:t.syncToken??l.syncToken}}));return r?{created:p,updated:_,deleted:g}:[...h,...p,..._]},Fe=async e=>Pe({...e,detailedResult:!0}),Ie=async e=>{let{url:t,timeRange:n,depth:r,headers:i,headersToExclude:a,fetchOptions:o={},fetch:s}=e;if(!n)throw Error(`timeRange is required`);De(n);let c=(await I({url:t,body:{"free-busy-query":E({_attributes:T([`urn:ietf:params:xml:ns:caldav`]),"c:time-range":{_attributes:{start:`${new Date(n.start).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`,end:`${new Date(n.end).toISOString().slice(0,19).replace(/[-:.]/g,``)}Z`}}})},defaultNamespace:`c`,depth:r,headers:D(i,a),headersToExclude:a,fetchOptions:o,fetch:s}))[0];if(!c)throw Error(`freeBusyQuery returned no response`);return c},Le=[[7,12,17,22],[5,9,14,20],[4,11,16,23],[6,10,15,21]],Re=Array.from({length:64},(e,t)=>Math.floor(Math.abs(Math.sin(t+1))*2**32)),ze=e=>{let t=``;for(let n=0;n<4;n+=1)t+=(e>>>n*8&255).toString(16).padStart(2,`0`);return t},Be=e=>{let t=new TextEncoder().encode(e),n=(t.length+8>>>6)+1<<6,r=new Uint8Array(n);r.set(t),r[t.length]=128;let i=new DataView(r.buffer),a=t.length*8;i.setUint32(n-8,a>>>0,!0),i.setUint32(n-4,Math.floor(a/2**32),!0);let o=1732584193,s=4023233417,c=2562383102,l=271733878;for(let e=0;e>>4][o%4];t=a,a=r,r=n,n=n+(l<>>32-u)|0}o=o+t|0,s=s+n|0,c=c+r|0,l=l+a|0}return ze(o)+ze(s)+ze(c)+ze(l)},Ve=e(`tsdav:digestAuth`),He=/[!#$%&'*+.^_`|~0-9A-Za-z-]+/y,Ue=e=>{let t=[],n,r=0,i=t=>{for(;r{let t=(e.algorithm??`MD5`).toUpperCase();if(e.realm==null||!e.nonce||!We.includes(t))return;let n=e.qop?.split(`,`).map(e=>e.trim().toLowerCase());if((!n||n.includes(`auth`))&&(n||!t.endsWith(`-SESS`)))return{realm:e.realm,nonce:e.nonce,opaque:e.opaque,domain:e.domain,qop:n?`auth`:void 0,algorithm:t,stale:e.stale?.toLowerCase()===`true`}},Ke=(e,{unlessBasic:t=!1,allowSHA256:n=!0}={})=>{let r=Ue(e??``);if(!(t&&r.some(({scheme:e})=>e===`basic`)))return r.filter(({scheme:e})=>e===`digest`).map(({params:e})=>Ge(e)).filter(e=>e!=null).filter(e=>n||!e.algorithm.startsWith(`SHA`)).sort((e,t)=>We.indexOf(e.algorithm)-We.indexOf(t.algorithm))[0]},qe=e=>Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);var q=class extends Error{constructor(){super(`tsdav: Digest authentication requires the WebCrypto API (globalThis.crypto), available in Node.js >= 19, browsers, Bun and Deno. On Node.js 18, assign webcrypto from node:crypto to globalThis.crypto.`),this.name=`DigestUnsupportedError`}};const Je=e=>{let{crypto:t}=globalThis;if(!t?.getRandomValues||e?.startsWith(`SHA`)&&!t.subtle)throw new q;return t},Ye=async(e,t)=>e.startsWith(`MD5`)?Be(t):qe(new Uint8Array(await Je(e).subtle.digest(`SHA-256`,new TextEncoder().encode(t)))),J=e=>`"${e.replace(/["\\]/g,`\\$&`)}"`,Xe=e=>/^[\x20-\x7e]*$/.test(e)?`username=${J(e)}`:`username*=UTF-8''${encodeURIComponent(e).replace(/['()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}`,Ze=async e=>{let{challenge:t,username:n,password:r,method:i,uri:a,cnonce:o}=e,{realm:s,nonce:c,qop:l,algorithm:u}=t,d=e.nc.toString(16).padStart(8,`0`),f=await Ye(u,`${n}:${s}:${r}`);u.endsWith(`-SESS`)&&(f=await Ye(u,`${f}:${c}:${o}`));let p=await Ye(u,`${i}:${a}`),m=await Ye(u,l?`${f}:${c}:${d}:${o}:${l}:${p}`:`${f}:${c}:${p}`);return`Digest ${[Xe(n),`realm=${J(s)}`,`uri=${J(a)}`,`algorithm=${u.replace(`-SESS`,`-sess`)}`,`nonce=${J(c)}`,...l?[`nc=${d}`,`cnonce=${J(o)}`,`qop=${l}`]:[],`response=${J(m)}`,...t.opaque==null?[]:[`opaque=${J(t.opaque)}`]].join(`, `)}`},Qe=()=>qe(Je().getRandomValues(/* @__PURE__ */ new Uint8Array(16))),Y=e=>{if(e instanceof URL)return e;if(typeof e==`string`)try{return new URL(e)}catch{return}},$e=e=>typeof e!=`object`||!e||!(typeof e.getReader==`function`||Symbol.asyncIterator in e),et=[301,302,303,307,308],tt=[`content-encoding`,`content-language`,`content-location`,`content-type`],nt=(e,t)=>{let n=(t.method??`GET`).toUpperCase();if(e===303&&n!==`GET`&&n!==`HEAD`||(e===301||e===302)&&n===`POST`){let e=new Headers(t.headers);for(let t of tt)e.delete(t);return{...t,method:`GET`,body:void 0,headers:e}}return t},rt=e=>{let t=new Headers(e.headers);return t.delete(`authorization`),{...e,headers:t}},it=(e,t)=>e.domain?.trim()?e.domain.trim().split(/\s+/).flatMap(e=>{try{if(!e.startsWith(`/`)&&!/^[a-z][a-z\d+.-]*:/i.test(e))return[];let n=new URL(e,`${t.origin}/`);return n.hash=``,n.origin===t.origin?[n.href]:[]}catch{return[]}}):[`${t.origin}/`],at=(e=!0)=>({active:e,challenges:/* @__PURE__ */ new Map}),ot=e=>{let{credentials:t,fetch:n}=e,r=n??c,i=e.state??at(),a=async(e,n,r,a)=>{let o=i.challenges.get(n.origin)?.find(e=>e.scopes.some(e=>n.href.startsWith(e)));if(!o)return rt(e);o.nc+=1;let{challenge:s,nc:c}=o,l=await Ze({challenge:s,username:t.username??``,password:t.password??``,method:r,uri:a,nc:c,cnonce:s.algorithm.endsWith(`-SESS`)?o.cnonce:Qe()}),u=new Headers(e.headers);return u.set(`authorization`,l),{...e,headers:u}},o=(e,t)=>{let n=e.headers.get(`www-authenticate`),r={unlessBasic:!i.active},a=!globalThis.crypto?.subtle&&Ke(n,{...r,allowSHA256:!1})||Ke(n,r);if(!a)return!1;try{Je(a.algorithm)}catch(e){if(!i.active&&e instanceof q)return!1;throw e}i.active||=(Ve(`Server only offers Digest authentication, switching from Basic`),!0),Ve(`Digest challenge received for ${t.origin}${a.stale?` (stale nonce)`:``}`);let o=i.challenges.get(t.origin)??[],s=it(a,t),c=o.find(e=>e.challenge.realm===a.realm&&e.challenge.algorithm===a.algorithm&&e.challenge.nonce===a.nonce);return i.challenges.set(t.origin,[{challenge:a,scopes:s,nc:c?.nc??0,cnonce:c?.cnonce??Qe()},...o.filter(e=>e.challenge.realm!==a.realm)]),!0},s=async(e,t,n,i)=>{let s=(t.method??`GET`).toUpperCase(),c=`${n.pathname}${n.search}`,l=await r(e,await a(t,n,s,c));return l.status!==401||!i||!$e(t.body)||!o(l,n)?l:(await l.body?.cancel().catch(()=>void 0),r(e,await a(t,n,s,c)))};return async(e,t={})=>{let n=Y(e);if(!n)return r(e,t);i.active&&(t={...t,credentials:t.credentials??`omit`});let a=!1;if(!i.active){let i=await r(e,t);if(i.status!==401||!$e(t.body)||(Y(i.url??``)??n).origin!==n.origin||!o(i,Y(i.url)??n))return i;await i.body?.cancel().catch(()=>void 0),a=!0,t={...t,credentials:t.credentials??`omit`};let c=Y(i.url)??n;if(c.href!==n.href){let e=(t.method??`GET`).toUpperCase();if(e!==`GET`&&e!==`HEAD`)throw TypeError(`tsdav: Digest negotiation after an automatic redirect requires the final DAV URL. Set serverUrl and collection URLs to their canonical locations.`);return s(c.href,{...t,redirect:`error`},c,!1)}}if((t.redirect??`follow`)!==`follow`||!$e(t.body))return s(e,t,n,!a);let c=e,l=n,u={...t,redirect:`manual`},d=!1;for(let e=0;;e+=1){let t=d?await r(c,u):await s(c,u,l,!a);if(a=!1,t.type===`opaqueredirect`){let e=(u.method??`GET`).toUpperCase();if(e!==`GET`&&e!==`HEAD`)throw TypeError(`tsdav: Digest authentication cannot safely follow an opaque browser redirect for this method. Use the final DAV URL, including its trailing slash.`);let t=await r(c,{...rt(u),redirect:`follow`}),i=Y(t.url);return!i||i.origin!==n.origin||d||t.status!==401||!o(t,i)?t:(await t.body?.cancel().catch(()=>void 0),s(i.href,{...u,redirect:`error`},i,!1))}let i=t.headers.get(`location`);if(!et.includes(t.status)||!i)return t;if(e===20)throw TypeError(`tsdav: too many redirects`);await t.body?.cancel().catch(()=>void 0),l=new URL(i,l),c=l.href,u=nt(t.status,u),l.origin!==n.origin&&(d=!0,u=rt(u))}}};var st=/* @__PURE__ */ r({createAccount:()=>Z,fetchHomeUrl:()=>ft,fetchPrincipalUrl:()=>dt,serviceDiscovery:()=>lt});const X=e(`tsdav:account`),ct=(e,t)=>{let n=[t,e,new URL(`/`,e).href];return n.filter((e,t)=>n.indexOf(e)===t)},lt=async e=>{X(`Service discovery...`);let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=a??c,s=new URL(t.serverUrl),{headers:l,...u}=i,d=new URL(`/.well-known/${t.accountType}`,s);d.protocol=s.protocol??`http`;let f=e=>{if(e.status>=300&&e.status<400){let t=e.headers.get(`Location`);if(typeof t==`string`&&t.length)return X(`Service discovery redirected to ${t}`),new URL(t,d).href}};try{let e=f(await o(d.href,{...u,method:`PROPFIND`,headers:D(O({"Content-Type":`text/xml;charset=UTF-8`},n,l),r),body:` -`,redirect:`manual`}));if(e)return e}catch(e){if(e instanceof q)throw e;X(`Service discovery PROPFIND failed: ${e.stack}`)}try{let e=f(await o(d.href,{...u,method:`GET`,body:void 0,headers:E(D(n,l),r),redirect:`manual`}));if(e)return e}catch(e){if(e instanceof q)throw e;X(`Service discovery GET failed: ${e.stack}`)}return s.href},ct=e=>{if(typeof e==`string`&&e.trim().length>0)return e.trim();if(Array.isArray(e)){for(let t of e){let e=ct(t);if(e)return e}return}if(e&&typeof e==`object`){if(`_cdata`in e&&typeof e._cdata==`string`){let t=e._cdata.trim();if(t.length>0)return t}if(`_text`in e&&typeof e._text==`string`){let t=e._text.trim();if(t.length>0)return t}}},lt=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`rootUrl`];if(!u(t,o))throw Error(`account must have ${d(t,o)} before fetchPrincipalUrl`);X(`Fetching principal url from path ${t.rootUrl}`);let[s]=await k({url:t.rootUrl,props:{"d:current-user-principal":{}},depth:`0`,headers:E(n,r),headersToExclude:r,fetchOptions:i,fetch:a});if(!s?.ok)throw X(`Fetch principal url failed: ${s?.statusText??`empty response`}`),s?.status===401?Error(`Invalid credentials: PROPFIND ${t.rootUrl} returned 401 Unauthorized`):Error(`cannot find principalUrl`);let c=ct(s.props?.currentUserPrincipal?.href);if(!c)throw X(`Fetch principal url failed: missing current-user-principal href`),Error(`cannot find principalUrl`);return X(`Fetched principal url ${c}`),new URL(c,b(t.rootUrl)).href},ut=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`principalUrl`,`rootUrl`];if(!u(t,o))throw Error(`account must have ${d(t,o)} before fetchHomeUrl`);X(`Fetch home url from ${t.principalUrl}`);let s=await k({url:t.principalUrl,props:t.accountType===`caldav`?{"c:calendar-home-set":{}}:{"card:addressbook-home-set":{}},depth:`0`,headers:E(n,r),headersToExclude:r,fetchOptions:i,fetch:a}),c=s.find(e=>C(t.principalUrl,e.href,t.rootUrl));if(!c||!c.ok)throw X(`Fetch home url failed with status ${c?.statusText} and error ${JSON.stringify(s.map(e=>e.error))}`),Error(`cannot find homeUrl`);let l=ct(t.accountType===`caldav`?c.props?.calendarHomeSet?.href:c.props?.addressbookHomeSet?.href);if(!l)throw X(`Fetch home url failed: server did not return a ${t.accountType===`caldav`?`calendar-home-set`:`addressbook-home-set`} href`),Error(`cannot find homeUrl`);let f=new URL(l,b(t.rootUrl)).href;return X(`Fetched home url ${f}`),f},Z=async e=>{let{account:t,headers:n,loadCollections:r=!1,loadObjects:i=!1,headersToExclude:a,fetchOptions:o={},fetch:s}=e,c={...t},l=t.rootUrl??await st({account:t,headers:E(n,a),headersToExclude:a,fetchOptions:o,fetch:s});if(t.rootUrl)c.rootUrl=t.rootUrl;else if(t.principalUrl)c.rootUrl=l;else{let e=async(t,r=0,i)=>{let l=t[r];if(!l)throw i??Error(`cannot find principalUrl`);try{return{rootUrl:l,principalUrl:await lt({account:{...c,rootUrl:l},headers:E(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}}catch(n){if(n instanceof q)throw n;let a=i?.message.startsWith(`Invalid credentials`);return e(t,r+1,a?i:n)}},{rootUrl:r,principalUrl:i}=await e(ot(t.serverUrl,l));c.rootUrl=r,c.principalUrl=i}return c.principalUrl=t.principalUrl??c.principalUrl??await lt({account:c,headers:E(n,a),headersToExclude:a,fetchOptions:o,fetch:s}),c.homeUrl=t.homeUrl??await ut({account:c,headers:E(n,a),headersToExclude:a,fetchOptions:o,fetch:s}),(r||i)&&(t.accountType===`caldav`?c.calendars=await G({headers:E(n,a),headersToExclude:a,account:c,fetchOptions:o,fetch:s}):t.accountType===`carddav`&&(c.addressBooks=await H({headers:E(n,a),headersToExclude:a,account:c,fetchOptions:o,fetch:s}))),i&&(t.accountType===`caldav`&&c.calendars?c.calendars=await Promise.all(c.calendars.map(async e=>({...e,objects:await K({calendar:e,filters:{"comp-filter":{_attributes:{name:`VCALENDAR`}}},urlFilter:t=>!x(t,e.url),headers:E(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}))):t.accountType===`carddav`&&c.addressBooks&&(c.addressBooks=await Promise.all(c.addressBooks.map(async e=>({...e,objects:await _e({addressBook:e,headers:E(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}))))),c};var dt=r({defaultParam:()=>ht,fetchOauthTokens:()=>vt,getBasicAuthHeaders:()=>gt,getBearerAuthHeaders:()=>_t,getOauthHeaders:()=>bt,refreshAccessToken:()=>yt});const Q=e(`tsdav:authHelper`),$=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`;var ft=class extends Error{constructor(e){super(e),this.name=`InvalidCharacterError`}};const pt=e=>{if(e>255)throw new ft(`The string to be encoded contains characters outside of the Latin1 range.`)},mt=e=>{let t=``,n=0;for(;n(...n)=>{let r=n[0],i={...t,...r};return(t.headers||r?.headers)&&(i.headers=D(t.headers,r?.headers)),e(i)},gt=e=>(Q(`Basic auth token generated for user "${e.username??``}"`),{authorization:`Basic ${mt(`${e.username}:${e.password}`)}`}),_t=e=>({authorization:`Bearer ${e.accessToken}`}),vt=async(e,t,n)=>{let r=[`authorizationCode`,`redirectUrl`,`clientId`,`clientSecret`,`tokenUrl`];if(!u(e,r))throw Error(`Oauth credentials missing: ${d(e,r)}`);let i=new URLSearchParams({grant_type:`authorization_code`,code:e.authorizationCode,redirect_uri:e.redirectUrl,client_id:e.clientId,client_secret:e.clientSecret});Q(`Fetching oauth tokens from ${e.tokenUrl}`);let a=n??c,{headers:o,...s}=t??{},l=await a(e.tokenUrl,{...s,method:`POST`,body:i.toString(),headers:D({"content-type":`application/x-www-form-urlencoded`},o)});return l.ok?await l.json():(Q(`Fetch Oauth tokens failed with status ${l.status}`),{})},yt=async(e,t,n)=>{let r=[`refreshToken`,`clientId`,`clientSecret`,`tokenUrl`];if(!u(e,r))throw Error(`Oauth credentials missing: ${d(e,r)}`);let i=new URLSearchParams({client_id:e.clientId,client_secret:e.clientSecret,refresh_token:e.refreshToken,grant_type:`refresh_token`}),a=n??c,{headers:o,...s}=t??{},l=await a(e.tokenUrl,{...s,method:`POST`,body:i.toString(),headers:D({"Content-Type":`application/x-www-form-urlencoded`},o)});return l.ok?await l.json():(Q(`Refresh access token failed with status ${l.status}`),{})},bt=async(e,t,n)=>{Q(`Fetching oauth headers`);let r={},i=!1;return e.accessToken&&(e.expiration==null&&!e.refreshToken||e.expiration!=null&&Date.now()Et,createDAVClient:()=>Tt});const St=async(e,t=e.fetchOptions,n=e.fetchOverride)=>{switch(e.authMethod){case`Basic`:return gt(e.credentials);case`Bearer`:return _t(e.credentials);case`Oauth`:{let{headers:r}=await bt(e.credentials,t,n);if(!r.authorization)throw Error(`OAuth authentication failed: token endpoint returned no access token`);return r}case`Digest`:return e.credentials.digestString==null?{}:{Authorization:`Digest ${e.credentials.digestString}`};case`Custom`:if(!e.authFunction)throw Error(`authMethod 'Custom' requires an authFunction to produce request headers`);return await e.authFunction(e.credentials)??{};default:throw Error(`Invalid auth method`)}},Ct=new WeakMap,wt=(e,t=e.fetchOverride,n,r=e.fetchOptions?.headers)=>{let i=e.authMethod===`Digest`&&e.credentials.digestString==null;if(!i&&e.authMethod!==`Basic`||new Headers(r).has(`authorization`)||n?.some(e=>e.toLowerCase()===`authorization`))return t;let a=Ct.get(e),{username:o,password:s}=e.credentials;return(!a||a.authMethod!==e.authMethod||a.username!==o||a.password!==s)&&(a={state:rt(i),authMethod:e.authMethod,username:o,password:s},Ct.set(e,a)),it({credentials:e.credentials,fetch:t,state:a.state})},Tt=async e=>{let t=new Et(e);return t.authHeaders=await St(t),t.account=e.defaultAccountType?await Z({account:{serverUrl:e.serverUrl,credentials:e.credentials,accountType:e.defaultAccountType},headers:t.authHeaders,fetchOptions:t.fetchOptions,fetch:wt(t)}):void 0,{davRequest:t.davRequest.bind(t),propfind:t.propfind.bind(t),createAccount:async(...e)=>{if(!e[0].account.accountType)throw Error("createAccount requires an accountType; pass one via `account.accountType`.");return t.createAccount(...e)},createObject:t.createObject.bind(t),updateObject:t.updateObject.bind(t),deleteObject:t.deleteObject.bind(t),calendarQuery:t.calendarQuery.bind(t),addressBookQuery:t.addressBookQuery.bind(t),collectionQuery:t.collectionQuery.bind(t),makeCollection:t.makeCollection.bind(t),calendarMultiGet:t.calendarMultiGet.bind(t),makeCalendar:t.makeCalendar.bind(t),freeBusyQuery:t.freeBusyQuery.bind(t),syncCollection:t.syncCollection.bind(t),supportedReportSet:t.supportedReportSet.bind(t),isCollectionDirty:t.isCollectionDirty.bind(t),smartCollectionSync:t.smartCollectionSync.bind(t),smartCollectionSyncDetailed:t.smartCollectionSyncDetailed.bind(t),fetchCalendars:t.fetchCalendars.bind(t),fetchCalendarUserAddresses:t.fetchCalendarUserAddresses.bind(t),fetchCalendarObjects:t.fetchCalendarObjects.bind(t),createCalendarObject:t.createCalendarObject.bind(t),updateCalendarObject:t.updateCalendarObject.bind(t),deleteCalendarObject:t.deleteCalendarObject.bind(t),syncCalendars:t.syncCalendars.bind(t),syncCalendarsDetailed:t.syncCalendarsDetailed.bind(t),fetchAddressBooks:t.fetchAddressBooks.bind(t),addressBookMultiGet:t.addressBookMultiGet.bind(t),fetchVCards:t.fetchVCards.bind(t),createVCard:t.createVCard.bind(t),updateVCard:t.updateVCard.bind(t),deleteVCard:t.deleteVCard.bind(t)}};var Et=class{constructor(e){this.serverUrl=e.serverUrl,this.credentials=e.credentials,this.authMethod=e.authMethod??`Basic`,this.accountType=e.defaultAccountType??`caldav`,this.authFunction=e.authFunction,this.fetchOptions=e.fetchOptions??{},this.fetchOverride=e.fetch,this.calendarMultiGet=this.calendarMultiGet.bind(this),this.addressBookMultiGet=this.addressBookMultiGet.bind(this)}async authenticate(e=!1,t=this.fetchOptions,n=this.fetchOverride){if(!e&&this.authMethod!==`Oauth`)return;if(!e&&this.authHeaders&&this.credentials.accessToken&&(this.credentials.expiration==null||Date.now(){this.authHeaders=await St(this,t,n)};this.authentication=r();try{await this.authentication}finally{this.authentication=void 0}}async requestDefaults(e){return await this.authenticate(!1,e?.fetchOptions??this.fetchOptions,e?.fetch??this.fetchOverride),{url:this.serverUrl,headers:this.authHeaders,account:this.account,fetchOptions:this.fetchOptions,fetch:wt(this,e?.fetch,e?.headersToExclude,D(e?.headers,e?.init?.headers,(e?.fetchOptions??this.fetchOptions)?.headers))}}async invoke(e,t){let n=await this.requestDefaults(t),r=t&&{...t,fetch:n.fetch};return await ht(e,n)(r)}async login(e){await this.authenticate(!0),this.account=this.accountType?await Z({account:{serverUrl:this.serverUrl,credentials:this.credentials,accountType:this.accountType},headers:this.authHeaders,loadCollections:e?.loadCollections,loadObjects:e?.loadObjects,fetchOptions:this.fetchOptions,fetch:wt(this)}):void 0}async davRequest(e){let{init:t,fetchOptions:n,...r}=e,{headers:i,...a}=t,o=await this.requestDefaults(e);return O({...r,init:{...a,headers:D(o.headers,i)},fetchOptions:n??this.fetchOptions,fetch:o.fetch})}async createObject(...e){return this.invoke(A,e[0])}async updateObject(...e){return this.invoke(j,e[0])}async deleteObject(...e){return this.invoke(M,e[0])}async propfind(...e){return this.invoke(k,e[0])}async createAccount(e){let{account:t,headers:n,headersToExclude:r,loadCollections:i,loadObjects:a,fetchOptions:o}=e,s=await this.requestDefaults(e),c=t.accountType??this.accountType;if(!c)throw Error("createAccount requires an accountType; pass one via `account.accountType` or configure `defaultAccountType` on the DAVClient.");return Z({account:{serverUrl:this.serverUrl,credentials:this.credentials,...t,accountType:c},headers:D(s.headers,n),headersToExclude:r,loadCollections:i,loadObjects:a,fetchOptions:o??this.fetchOptions,fetch:s.fetch})}async collectionQuery(...e){return this.invoke(F,e[0])}async makeCollection(...e){return this.invoke(pe,e[0])}async syncCollection(...e){return this.invoke(R,e[0])}async supportedReportSet(...e){return this.invoke(I,e[0])}async isCollectionDirty(...e){return this.invoke(L,e[0])}async smartCollectionSync(...e){return this.invoke(z,e[0])}async smartCollectionSyncDetailed(e){return this.invoke(me,e)}async calendarQuery(...e){return this.invoke(U,e[0])}async makeCalendar(...e){return this.invoke(Oe,e[0])}async freeBusyQuery(...e){return this.invoke(Pe,e[0])}async calendarMultiGet(...e){return this.invoke(W,e[0])}async fetchCalendars(...e){return this.invoke(G,e[0])}async fetchCalendarUserAddresses(...e){return this.invoke(De,e[0])}async fetchCalendarObjects(...e){return this.invoke(K,e[0])}async createCalendarObject(...e){return this.invoke(ke,e[0])}async updateCalendarObject(...e){return this.invoke(Ae,e[0])}async deleteCalendarObject(...e){return this.invoke(je,e[0])}async syncCalendars(...e){return this.invoke(Me,e[0])}async syncCalendarsDetailed(...e){return this.invoke(Ne,e[0])}async addressBookQuery(...e){return this.invoke(B,e[0])}async addressBookMultiGet(...e){return this.invoke(V,e[0])}async fetchAddressBooks(...e){return this.invoke(H,e[0])}async fetchVCards(...e){return this.invoke(_e,e[0])}async createVCard(...e){return this.invoke(ve,e[0])}async updateVCard(...e){return this.invoke(ye,e[0])}async deleteVCard(...e){return this.invoke(be,e[0])}},Dt={DAVNamespace:i,DAVNamespaceShort:o,DAVAttributeMap:a,ICALObjects:s,...xt,...ne,...ue,...at,...he,...xe,...dt,...v};export{a as DAVAttributeMap,Et as DAVClient,i as DAVNamespace,o as DAVNamespaceShort,q as DigestUnsupportedError,s as ICALObjects,V as addressBookMultiGet,B as addressBookQuery,W as calendarMultiGet,U as calendarQuery,T as cleanupFalsy,F as collectionQuery,Z as createAccount,ke as createCalendarObject,Tt as createDAVClient,A as createObject,ve as createVCard,O as davRequest,Dt as default,je as deleteCalendarObject,M as deleteObject,be as deleteVCard,b as ensureTrailingSlash,E as excludeHeaders,H as fetchAddressBooks,K as fetchCalendarObjects,De as fetchCalendarUserAddresses,G as fetchCalendars,ut as fetchHomeUrl,vt as fetchOauthTokens,lt as fetchPrincipalUrl,_e as fetchVCards,Pe as freeBusyQuery,gt as getBasicAuthHeaders,_t as getBearerAuthHeaders,w as getDAVAttribute,bt as getOauthHeaders,L as isCollectionDirty,Oe as makeCalendar,pe as makeCollection,D as mergeHeaders,k as propfind,yt as refreshAccessToken,st as serviceDiscovery,z as smartCollectionSync,me as smartCollectionSyncDetailed,I as supportedReportSet,Me as syncCalendars,Ne as syncCalendarsDetailed,R as syncCollection,Ae as updateCalendarObject,j as updateObject,ye as updateVCard,S as urlContains,x as urlEquals,C as urlMatches}; \ No newline at end of file +`,redirect:`manual`}));if(e)return e}catch(e){if(e instanceof q)throw e;X(`Service discovery PROPFIND failed: ${e.stack}`)}try{let e=f(await o(d.href,{...u,method:`GET`,body:void 0,headers:D(O(n,l),r),redirect:`manual`}));if(e)return e}catch(e){if(e instanceof q)throw e;X(`Service discovery GET failed: ${e.stack}`)}return s.href},ut=e=>{if(typeof e==`string`&&e.trim().length>0)return e.trim();if(Array.isArray(e))for(let t of e){let e=ut(t);if(e)return e}else if(e&&typeof e==`object`){if(`_cdata`in e&&typeof e._cdata==`string`){let t=e._cdata.trim();if(t.length>0)return t}if(`_text`in e&&typeof e._text==`string`){let t=e._text.trim();if(t.length>0)return t}}},dt=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`rootUrl`];if(!u(t,o))throw Error(`account must have ${d(t,o)} before fetchPrincipalUrl`);X(`Fetching principal url from path ${t.rootUrl}`);let[s]=await A({url:t.rootUrl,props:{"d:current-user-principal":{}},depth:`0`,headers:D(n,r),headersToExclude:r,fetchOptions:i,fetch:a});if(!s?.ok)throw X(`Fetch principal url failed: ${s?.statusText??`empty response`}`),s?.status===401?Error(`Invalid credentials: PROPFIND ${t.rootUrl} returned 401 Unauthorized`):Error(`cannot find principalUrl`);let c=ut(s.props?.currentUserPrincipal?.href);if(!c)throw X(`Fetch principal url failed: missing current-user-principal href`),Error(`cannot find principalUrl`);return X(`Fetched principal url ${c}`),new URL(c,x(t.rootUrl)).href},ft=async e=>{let{account:t,headers:n,headersToExclude:r,fetchOptions:i={},fetch:a}=e,o=[`principalUrl`,`rootUrl`];if(!u(t,o))throw Error(`account must have ${d(t,o)} before fetchHomeUrl`);X(`Fetch home url from ${t.principalUrl}`);let s=await A({url:t.principalUrl,props:t.accountType===`caldav`?{"c:calendar-home-set":{}}:{"card:addressbook-home-set":{}},depth:`0`,headers:D(n,r),headersToExclude:r,fetchOptions:i,fetch:a}),c=s.find(e=>w(t.principalUrl,e.href,t.rootUrl));if(!c||!c.ok)throw X(`Fetch home url failed with status ${c?.statusText} and error ${JSON.stringify(s.map(e=>e.error))}`),Error(`cannot find homeUrl`);let l=ut(t.accountType===`caldav`?c.props?.calendarHomeSet?.href:c.props?.addressbookHomeSet?.href);if(!l)throw X(`Fetch home url failed: server did not return a ${t.accountType===`caldav`?`calendar-home-set`:`addressbook-home-set`} href`),Error(`cannot find homeUrl`);let f=new URL(l,x(t.rootUrl)).href;return X(`Fetched home url ${f}`),f},Z=async e=>{let{account:t,headers:n,loadCollections:r=!1,loadObjects:i=!1,headersToExclude:a,fetchOptions:o={},fetch:s}=e,c={...t},l=t.rootUrl??await lt({account:t,headers:D(n,a),headersToExclude:a,fetchOptions:o,fetch:s});if(t.rootUrl)c.rootUrl=t.rootUrl;else if(t.principalUrl)c.rootUrl=l;else{let e=async(t,r=0,i)=>{let l=t[r];if(!l)throw i??/* @__PURE__ */ Error(`cannot find principalUrl`);try{return{rootUrl:l,principalUrl:await dt({account:{...c,rootUrl:l},headers:D(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}}catch(n){if(n instanceof q)throw n;let a=i?.message.startsWith(`Invalid credentials`);return e(t,r+1,a?i:n)}},{rootUrl:r,principalUrl:i}=await e(ct(t.serverUrl,l));c.rootUrl=r,c.principalUrl=i}return c.principalUrl=t.principalUrl??c.principalUrl??await dt({account:c,headers:D(n,a),headersToExclude:a,fetchOptions:o,fetch:s}),c.homeUrl=t.homeUrl??await ft({account:c,headers:D(n,a),headersToExclude:a,fetchOptions:o,fetch:s}),(r||i)&&(t.accountType===`caldav`?c.calendars=await G({headers:D(n,a),headersToExclude:a,account:c,fetchOptions:o,fetch:s}):t.accountType===`carddav`&&(c.addressBooks=await ve({headers:D(n,a),headersToExclude:a,account:c,fetchOptions:o,fetch:s}))),i&&(t.accountType===`caldav`&&c.calendars?c.calendars=await Promise.all(c.calendars.map(async e=>({...e,objects:await K({calendar:e,filters:{"comp-filter":{_attributes:{name:`VCALENDAR`}}},urlFilter:t=>!S(t,e.url),headers:D(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}))):t.accountType===`carddav`&&c.addressBooks&&(c.addressBooks=await Promise.all(c.addressBooks.map(async e=>({...e,objects:await ye({addressBook:e,headers:D(n,a),headersToExclude:a,fetchOptions:o,fetch:s})}))))),c},pt=e=>Date.now(){let t=typeof e==`string`&&e.trim()!==``?Number(e):e;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t*1e3:void 0};var ht=/* @__PURE__ */ r({defaultParam:()=>yt,fetchOauthTokens:()=>St,getBasicAuthHeaders:()=>bt,getBearerAuthHeaders:()=>xt,getOauthHeaders:()=>wt,refreshAccessToken:()=>Ct});const Q=e(`tsdav:authHelper`),$=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`;var gt=class extends Error{constructor(e){super(e),this.name=`InvalidCharacterError`}};const _t=e=>{if(e>255)throw new gt(`The string to be encoded contains characters outside of the Latin1 range.`)},vt=e=>{let t=``,n=0;for(;n(...n)=>{let r=n[0],i={...t,...r};return(t.headers||r?.headers)&&(i.headers=O(t.headers,r?.headers)),e(i)},bt=e=>(Q(`Basic auth token generated for user "${e.username??``}"`),{authorization:`Basic ${vt(`${e.username}:${e.password}`)}`}),xt=e=>({authorization:`Bearer ${e.accessToken}`}),St=async(e,t,n)=>{let r=[`authorizationCode`,`redirectUrl`,`clientId`,`clientSecret`,`tokenUrl`];if(!u(e,r))throw Error(`Oauth credentials missing: ${d(e,r)}`);let i=new URLSearchParams({grant_type:`authorization_code`,code:e.authorizationCode,redirect_uri:e.redirectUrl,client_id:e.clientId,client_secret:e.clientSecret});Q(`Fetching oauth tokens from ${e.tokenUrl}`);let a=n??c,{headers:o,...s}=t??{},l=await a(e.tokenUrl,{...s,method:`POST`,body:i.toString(),headers:O({"content-type":`application/x-www-form-urlencoded`},o)});return l.ok?await l.json():(Q(`Fetch Oauth tokens failed with status ${l.status}`),{})},Ct=async(e,t,n)=>{let r=[`refreshToken`,`clientId`,`clientSecret`,`tokenUrl`];if(!u(e,r))throw Error(`Oauth credentials missing: ${d(e,r)}`);let i=new URLSearchParams({client_id:e.clientId,client_secret:e.clientSecret,refresh_token:e.refreshToken,grant_type:`refresh_token`}),a=n??c,{headers:o,...s}=t??{},l=await a(e.tokenUrl,{...s,method:`POST`,body:i.toString(),headers:O({"Content-Type":`application/x-www-form-urlencoded`},o)});return l.ok?await l.json():(Q(`Refresh access token failed with status ${l.status}`),{})},wt=async(e,t,n)=>{Q(`Fetching oauth headers`);let r={},i=!1;return e.accessToken&&(e.expiration==null&&!e.refreshToken||e.expiration!=null&&pt(e.expiration))?r={access_token:e.accessToken,refresh_token:e.refreshToken}:(r=e.refreshToken?await Ct(e,t,n):await St(e,t,n),i=!0),i&&(r.access_token&&(e.accessToken=r.access_token),r.refresh_token&&(e.refreshToken=r.refresh_token),r.access_token&&(e.expiration=mt(r.expires_in))),Q(`Oauth tokens obtained`),{tokens:r,headers:r.access_token?{authorization:`Bearer ${r.access_token}`}:{}}};var Tt=/* @__PURE__ */ r({DAVClient:()=>At,createDAVClient:()=>kt});const Et=async(e,t=e.fetchOptions,n=e.fetchOverride)=>{switch(e.authMethod){case`Basic`:return bt(e.credentials);case`Bearer`:return xt(e.credentials);case`Oauth`:{let{headers:r}=await wt(e.credentials,t,n);if(!r.authorization)throw Error(`OAuth authentication failed: token endpoint returned no access token`);return r}case`Digest`:return e.credentials.digestString==null?{}:{Authorization:`Digest ${e.credentials.digestString}`};case`Custom`:if(!e.authFunction)throw Error(`authMethod 'Custom' requires an authFunction to produce request headers`);return await e.authFunction(e.credentials)??{};default:throw Error(`Invalid auth method`)}},Dt=/* @__PURE__ */ new WeakMap,Ot=(e,t=e.fetchOverride,n,r=e.fetchOptions?.headers)=>{let i=e.authMethod===`Digest`&&e.credentials.digestString==null;if(!i&&e.authMethod!==`Basic`||new Headers(r).has(`authorization`)||n?.some(e=>e.toLowerCase()===`authorization`))return t;let a=Dt.get(e),{username:o,password:s}=e.credentials;return(!a||a.authMethod!==e.authMethod||a.username!==o||a.password!==s)&&(a={state:at(i),authMethod:e.authMethod,username:o,password:s},Dt.set(e,a)),ot({credentials:e.credentials,fetch:t,state:a.state})},kt=async e=>{let t=new At(e);return t.authHeaders=await Et(t),t.account=e.defaultAccountType?await Z({account:{serverUrl:e.serverUrl,credentials:e.credentials,accountType:e.defaultAccountType},headers:t.authHeaders,fetchOptions:t.fetchOptions,fetch:Ot(t)}):void 0,{davRequest:t.davRequest.bind(t),propfind:t.propfind.bind(t),createAccount:async(...e)=>{if(!e[0].account.accountType)throw Error("createAccount requires an accountType; pass one via `account.accountType`.");return t.createAccount(...e)},createObject:t.createObject.bind(t),updateObject:t.updateObject.bind(t),deleteObject:t.deleteObject.bind(t),calendarQuery:t.calendarQuery.bind(t),addressBookQuery:t.addressBookQuery.bind(t),collectionQuery:t.collectionQuery.bind(t),makeCollection:t.makeCollection.bind(t),calendarMultiGet:t.calendarMultiGet.bind(t),makeCalendar:t.makeCalendar.bind(t),freeBusyQuery:t.freeBusyQuery.bind(t),syncCollection:t.syncCollection.bind(t),supportedReportSet:t.supportedReportSet.bind(t),isCollectionDirty:t.isCollectionDirty.bind(t),smartCollectionSync:t.smartCollectionSync.bind(t),smartCollectionSyncDetailed:t.smartCollectionSyncDetailed.bind(t),fetchCalendars:t.fetchCalendars.bind(t),fetchCalendarUserAddresses:t.fetchCalendarUserAddresses.bind(t),fetchCalendarObjects:t.fetchCalendarObjects.bind(t),createCalendarObject:t.createCalendarObject.bind(t),updateCalendarObject:t.updateCalendarObject.bind(t),deleteCalendarObject:t.deleteCalendarObject.bind(t),syncCalendars:t.syncCalendars.bind(t),syncCalendarsDetailed:t.syncCalendarsDetailed.bind(t),fetchAddressBooks:t.fetchAddressBooks.bind(t),addressBookMultiGet:t.addressBookMultiGet.bind(t),fetchVCards:t.fetchVCards.bind(t),createVCard:t.createVCard.bind(t),updateVCard:t.updateVCard.bind(t),deleteVCard:t.deleteVCard.bind(t)}};var At=class{constructor(e){this.serverUrl=e.serverUrl,this.credentials=e.credentials,this.authMethod=e.authMethod??`Basic`,this.accountType=e.defaultAccountType??`caldav`,this.authFunction=e.authFunction,this.fetchOptions=e.fetchOptions??{},this.fetchOverride=e.fetch,this.calendarMultiGet=this.calendarMultiGet.bind(this),this.addressBookMultiGet=this.addressBookMultiGet.bind(this)}async authenticate(e=!1,t=this.fetchOptions,n=this.fetchOverride){if(!e&&this.authMethod!==`Oauth`)return;if(!e&&this.authHeaders&&this.credentials.accessToken&&(this.credentials.expiration==null||pt(this.credentials.expiration))){this.authHeaders={authorization:`Bearer ${this.credentials.accessToken}`};return}if(this.authentication)return this.authentication;let r=async()=>{this.authHeaders=await Et(this,t,n)};this.authentication=r();try{await this.authentication}finally{this.authentication=void 0}}async requestDefaults(e){return await this.authenticate(!1,e?.fetchOptions??this.fetchOptions,e?.fetch??this.fetchOverride),{url:this.serverUrl,headers:this.authHeaders,account:this.account,fetchOptions:this.fetchOptions,fetch:Ot(this,e?.fetch,e?.headersToExclude,O(e?.headers,e?.init?.headers,(e?.fetchOptions??this.fetchOptions)?.headers))}}async invoke(e,t){let n=await this.requestDefaults(t),r=t&&{...t,fetch:n.fetch};return await yt(e,n)(r)}async login(e){await this.authenticate(!0),this.account=this.accountType?await Z({account:{serverUrl:this.serverUrl,credentials:this.credentials,accountType:this.accountType},headers:this.authHeaders,loadCollections:e?.loadCollections,loadObjects:e?.loadObjects,fetchOptions:this.fetchOptions,fetch:Ot(this)}):void 0}async davRequest(e){let{init:t,fetchOptions:n,...r}=e,{headers:i,...a}=t,o=await this.requestDefaults(e);return k({...r,init:{...a,headers:O(o.headers,i)},fetchOptions:n??this.fetchOptions,fetch:o.fetch})}async createObject(...e){return this.invoke(j,e[0])}async updateObject(...e){return this.invoke(M,e[0])}async deleteObject(...e){return this.invoke(N,e[0])}async propfind(...e){return this.invoke(A,e[0])}async createAccount(e){let{account:t,headers:n,headersToExclude:r,loadCollections:i,loadObjects:a,fetchOptions:o}=e,s=await this.requestDefaults(e),c=t.accountType??this.accountType;if(!c)throw Error("createAccount requires an accountType; pass one via `account.accountType` or configure `defaultAccountType` on the DAVClient.");return Z({account:{serverUrl:this.serverUrl,credentials:this.credentials,...t,accountType:c},headers:O(s.headers,n),headersToExclude:r,loadCollections:i,loadObjects:a,fetchOptions:o??this.fetchOptions,fetch:s.fetch})}async collectionQuery(...e){return this.invoke(I,e[0])}async makeCollection(...e){return this.invoke(pe,e[0])}async syncCollection(...e){return this.invoke(z,e[0])}async supportedReportSet(...e){return this.invoke(L,e[0])}async isCollectionDirty(...e){return this.invoke(R,e[0])}async smartCollectionSync(...e){return this.invoke(B,e[0])}async smartCollectionSyncDetailed(e){return this.invoke(me,e)}async calendarQuery(...e){return this.invoke(U,e[0])}async makeCalendar(...e){return this.invoke(Ae,e[0])}async freeBusyQuery(...e){return this.invoke(Ie,e[0])}async calendarMultiGet(...e){return this.invoke(W,e[0])}async fetchCalendars(...e){return this.invoke(G,e[0])}async fetchCalendarUserAddresses(...e){return this.invoke(ke,e[0])}async fetchCalendarObjects(...e){return this.invoke(K,e[0])}async createCalendarObject(...e){return this.invoke(je,e[0])}async updateCalendarObject(...e){return this.invoke(Me,e[0])}async deleteCalendarObject(...e){return this.invoke(Ne,e[0])}async syncCalendars(...e){return this.invoke(Pe,e[0])}async syncCalendarsDetailed(...e){return this.invoke(Fe,e[0])}async addressBookQuery(...e){return this.invoke(V,e[0])}async addressBookMultiGet(...e){return this.invoke(H,e[0])}async fetchAddressBooks(...e){return this.invoke(ve,e[0])}async fetchVCards(...e){return this.invoke(ye,e[0])}async createVCard(...e){return this.invoke(be,e[0])}async updateVCard(...e){return this.invoke(xe,e[0])}async deleteVCard(...e){return this.invoke(Se,e[0])}},jt={DAVNamespace:i,DAVNamespaceShort:o,DAVAttributeMap:a,ICALObjects:s,...Tt,...ne,...ue,...st,...ge,...Ce,...ht,...y};export{a as DAVAttributeMap,At as DAVClient,i as DAVNamespace,o as DAVNamespaceShort,q as DigestUnsupportedError,s as ICALObjects,H as addressBookMultiGet,V as addressBookQuery,W as calendarMultiGet,U as calendarQuery,E as cleanupFalsy,I as collectionQuery,Z as createAccount,je as createCalendarObject,kt as createDAVClient,j as createObject,be as createVCard,k as davRequest,jt as default,Ne as deleteCalendarObject,N as deleteObject,Se as deleteVCard,x as ensureTrailingSlash,D as excludeHeaders,ve as fetchAddressBooks,K as fetchCalendarObjects,ke as fetchCalendarUserAddresses,G as fetchCalendars,ft as fetchHomeUrl,St as fetchOauthTokens,dt as fetchPrincipalUrl,ye as fetchVCards,Ie as freeBusyQuery,bt as getBasicAuthHeaders,xt as getBearerAuthHeaders,T as getDAVAttribute,wt as getOauthHeaders,R as isCollectionDirty,Ae as makeCalendar,pe as makeCollection,O as mergeHeaders,A as propfind,Ct as refreshAccessToken,lt as serviceDiscovery,B as smartCollectionSync,me as smartCollectionSyncDetailed,L as supportedReportSet,Pe as syncCalendars,Fe as syncCalendarsDetailed,z as syncCollection,Me as updateCalendarObject,M as updateObject,xe as updateVCard,C as urlContains,S as urlEquals,w as urlMatches}; \ No newline at end of file diff --git a/dist/tsdav.mjs b/dist/tsdav.mjs index 9c9558c3..a02fa51b 100644 --- a/dist/tsdav.mjs +++ b/dist/tsdav.mjs @@ -242,6 +242,29 @@ const mergeDAVProps = (propStats) => { return props; }; //#endregion +//#region src/util/percentEncoding.ts +/** +* Encode every path segment the same way, so hrefs that differ only in +* percent-encoding (`a@b` and `a%40b`, `%2f` and `%2F`) compare equal. +* Only for comparisons: servers may expect the original form in requests. +*/ +const normalizePercentEncoding = (href) => { + let url; + try { + url = new URL(href); + } catch { + return href; + } + url.pathname = url.pathname.split("/").map((segment) => { + try { + return encodeURIComponent(decodeURIComponent(segment)); + } catch { + return segment; + } + }).join("/"); + return url.href; +}; +//#endregion //#region src/util/requestHelpers.ts var requestHelpers_exports = /* @__PURE__ */ __exportAll({ cleanupFalsy: () => cleanupFalsy, @@ -300,7 +323,7 @@ const urlContains = (urlA, urlB) => { const urlMatches = (urlA, urlB, baseUrl) => { if (!urlA || !urlB || !baseUrl) return urlEquals(urlA, urlB); try { - return urlEquals(new URL(urlA, baseUrl).href, new URL(urlB, baseUrl).href); + return urlEquals(normalizePercentEncoding(new URL(urlA, baseUrl).href), normalizePercentEncoding(new URL(urlB, baseUrl).href)); } catch { return urlEquals(urlA, urlB); } @@ -544,7 +567,7 @@ const deleteObject = async (params) => { const getDAVUrlKey = (url, baseUrl) => { let resolved; try { - resolved = new URL(url, ensureTrailingSlash(baseUrl)).href; + resolved = normalizePercentEncoding(new URL(url, ensureTrailingSlash(baseUrl)).href); } catch { resolved = url.trim(); } @@ -755,7 +778,7 @@ const smartCollectionSync = async (params) => { const syncMethod = method ?? (collection.reports?.includes("syncCollection") ? "webdav" : "basic"); debug$5(`smart collection sync with type ${account.accountType} and method ${syncMethod}`); if (syncMethod === "webdav") { - const result = await syncCollection({ + const requestSync = (syncToken) => syncCollection({ url: collection.url, props: { [`d:getetag`]: {}, @@ -763,12 +786,19 @@ const smartCollectionSync = async (params) => { [`d:displayname`]: {} }, syncLevel: 1, - syncToken: collection.syncToken, + syncToken, headers: excludeHeaders(headers, headersToExclude), headersToExclude, fetchOptions, fetch: fetchOverride }); + let syncToken = collection.syncToken; + let result = await requestSync(syncToken); + if (syncToken && result.length === 1 && result[0].status >= 400 && result[0].status < 500 && typeof result[0].raw === "string" && result[0].raw.includes("valid-sync-token")) { + debug$5("sync token rejected by server, starting a full sync"); + syncToken = void 0; + result = await requestSync(syncToken); + } const isObjectResponse = (r) => { return typeof r.href === "string" && getDAVUrlKey(r.href, collection.url) !== getDAVUrlKey(collection.url, collection.url) && !r.props?.resourcetype?.collection; }; @@ -807,7 +837,7 @@ const smartCollectionSync = async (params) => { url: resolveDAVHref(url, collection.url), etag: "" })); - const { created, updated, deleted, unchanged } = diffDAVObjects(localObjects, remoteObjects, collection.url, true, deletedObjects); + const { created, updated, deleted, unchanged } = diffDAVObjects(localObjects, remoteObjects, collection.url, Boolean(syncToken), deletedObjects); return { ...collection, objects: detailedResult ? { @@ -876,6 +906,21 @@ const smartCollectionSyncDetailed = async (params) => smartCollectionSync({ detailedResult: true }); //#endregion +//#region src/util/objectUrl.ts +/** +* Resolve a new object's URL from its collection URL and file name. +* +* The file name is one path segment, not a relative URL: `?`, `#`, `\`, a +* stray `%`, and whitespace or control characters are percent-encoded, and the +* `./` prefix keeps a name like `urn:uuid:1.ics` from parsing as a URL scheme. +* Valid percent-escapes are kept, so already-encoded names are not encoded twice. +*/ +const getObjectUrl = (collectionUrl, filename) => { + if (!filename || filename.includes("/") || /^(?:\.|%2e){1,2}$/i.test(filename)) throw new Error(`Invalid object filename "${filename}": expected a single path segment`); + const segment = filename.replace(/%(?![\da-f]{2})|[?#\\\x00-\x20\x7f]/gi, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase().padStart(2, "0")}`); + return new URL(`./${segment}`, ensureTrailingSlash(collectionUrl)).href; +}; +//#endregion //#region src/addressBook.ts var addressBook_exports = /* @__PURE__ */ __exportAll({ addressBookMultiGet: () => addressBookMultiGet, @@ -1030,7 +1075,7 @@ const fetchVCards = async (params) => { const createVCard = async (params) => { const { addressBook, vCardString, filename, headers, headersToExclude, fetchOptions = {}, fetch: fetchOverride } = params; return createObject({ - url: new URL(filename, ensureTrailingSlash(addressBook.url)).href, + url: getObjectUrl(addressBook.url, filename), data: vCardString, headers: excludeHeaders({ "content-type": "text/vcard; charset=utf-8", @@ -1350,7 +1395,7 @@ const fetchCalendarObjects = async (params) => { const createCalendarObject = async (params) => { const { calendar, iCalString, filename, headers, headersToExclude, fetchOptions = {}, fetch: fetchOverride } = params; return createObject({ - url: new URL(filename, ensureTrailingSlash(calendar.url)).href, + url: getObjectUrl(calendar.url, filename), data: iCalString, headers: excludeHeaders({ "content-type": "text/calendar; charset=utf-8", @@ -2171,6 +2216,16 @@ const createAccount = async (params) => { return newAccount; }; //#endregion +//#region src/util/tokenExpiry.ts +const EXPIRY_MARGIN_MS = 6e4; +/** Whether a token expiring at `expiration` (ms since epoch) can still be sent. */ +const isTokenUnexpired = (expiration) => Date.now() < expiration - EXPIRY_MARGIN_MS; +/** Expiration timestamp for an OAuth `expires_in`, which some providers send as a string. */ +const getTokenExpiration = (expiresIn) => { + const seconds = typeof expiresIn === "string" && expiresIn.trim() !== "" ? Number(expiresIn) : expiresIn; + return typeof seconds === "number" && Number.isFinite(seconds) && seconds > 0 ? Date.now() + seconds * 1e3 : void 0; +}; +//#endregion //#region src/util/authHelpers.ts var authHelpers_exports = /* @__PURE__ */ __exportAll({ defaultParam: () => defaultParam, @@ -2313,7 +2368,7 @@ const getOauthHeaders = async (credentials, fetchOptions, fetchOverride) => { debug("Fetching oauth headers"); let tokens = {}; let didRefresh = false; - if (credentials.accessToken && (credentials.expiration == null && !credentials.refreshToken || credentials.expiration != null && Date.now() < credentials.expiration)) tokens = { + if (credentials.accessToken && (credentials.expiration == null && !credentials.refreshToken || credentials.expiration != null && isTokenUnexpired(credentials.expiration))) tokens = { access_token: credentials.accessToken, refresh_token: credentials.refreshToken }; @@ -2324,7 +2379,7 @@ const getOauthHeaders = async (credentials, fetchOptions, fetchOverride) => { if (didRefresh) { if (tokens.access_token) credentials.accessToken = tokens.access_token; if (tokens.refresh_token) credentials.refreshToken = tokens.refresh_token; - if (tokens.access_token) credentials.expiration = typeof tokens.expires_in === "number" ? Date.now() + tokens.expires_in * 1e3 : void 0; + if (tokens.access_token) credentials.expiration = getTokenExpiration(tokens.expires_in); } debug("Oauth tokens obtained"); return { @@ -2447,7 +2502,7 @@ var DAVClient = class { } async authenticate(force = false, fetchOptions = this.fetchOptions, fetchOverride = this.fetchOverride) { if (!force && this.authMethod !== "Oauth") return; - if (!force && this.authHeaders && this.credentials.accessToken && (this.credentials.expiration == null || Date.now() < this.credentials.expiration)) { + if (!force && this.authHeaders && this.credentials.accessToken && (this.credentials.expiration == null || isTokenUnexpired(this.credentials.expiration))) { this.authHeaders = { authorization: `Bearer ${this.credentials.accessToken}` }; return; } diff --git a/dist/util/objectUrl.d.ts b/dist/util/objectUrl.d.ts new file mode 100644 index 00000000..58e71971 --- /dev/null +++ b/dist/util/objectUrl.d.ts @@ -0,0 +1,9 @@ +/** + * Resolve a new object's URL from its collection URL and file name. + * + * The file name is one path segment, not a relative URL: `?`, `#`, `\`, a + * stray `%`, and whitespace or control characters are percent-encoded, and the + * `./` prefix keeps a name like `urn:uuid:1.ics` from parsing as a URL scheme. + * Valid percent-escapes are kept, so already-encoded names are not encoded twice. + */ +export declare const getObjectUrl: (collectionUrl: string, filename: string) => string; diff --git a/dist/util/percentEncoding.d.ts b/dist/util/percentEncoding.d.ts new file mode 100644 index 00000000..a1273324 --- /dev/null +++ b/dist/util/percentEncoding.d.ts @@ -0,0 +1,6 @@ +/** + * Encode every path segment the same way, so hrefs that differ only in + * percent-encoding (`a@b` and `a%40b`, `%2f` and `%2F`) compare equal. + * Only for comparisons: servers may expect the original form in requests. + */ +export declare const normalizePercentEncoding: (href: string) => string; diff --git a/dist/util/tokenExpiry.d.ts b/dist/util/tokenExpiry.d.ts new file mode 100644 index 00000000..2059e5cc --- /dev/null +++ b/dist/util/tokenExpiry.d.ts @@ -0,0 +1,4 @@ +/** Whether a token expiring at `expiration` (ms since epoch) can still be sent. */ +export declare const isTokenUnexpired: (expiration: number) => boolean; +/** Expiration timestamp for an OAuth `expires_in`, which some providers send as a string. */ +export declare const getTokenExpiration: (expiresIn: unknown) => number | undefined; diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index c9b82af9..6d7b0172 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -101,9 +101,7 @@ export default defineConfig({ logo: { src: './src/assets/logo.svg', }, - social: { - github: 'https://github.com/natelindev/tsdav', - }, + social: [{ icon: 'github', label: 'GitHub', href: 'https://github.com/natelindev/tsdav' }], customCss: ['./src/styles/custom.css'], components: { PageTitle: './src/components/PageTitle.astro', @@ -180,7 +178,7 @@ export default defineConfig({ }, { label: 'Type Reference', - autogenerate: { directory: 'types' }, + items: [{ autogenerate: { directory: 'types' } }], }, { label: 'Helpers & Tools', diff --git a/docs/package.json b/docs/package.json index baba31e4..a338aa87 100644 --- a/docs/package.json +++ b/docs/package.json @@ -12,18 +12,17 @@ "test": "node --test tests/*.test.cjs" }, "dependencies": { - "@astrojs/mdx": "^4.3.14", - "@astrojs/react": "^4.4.1", - "@astrojs/starlight": "^0.32.0", - "astro": "^5.4.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "@astrojs/react": "^7.0.1", + "@astrojs/starlight": "^0.42.6", + "astro": "^7.3.8", + "react": "^19.3.0", + "react-dom": "^19.3.0", "xml-js": "1.6.11" }, "devDependencies": { "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", - "typescript": "^5.8.0" + "typescript": "^7.0.2" }, - "packageManager": "pnpm@10.34.4" + "packageManager": "pnpm@12.11.2" } diff --git a/docs/patches/@astrojs__starlight@0.32.6.patch b/docs/patches/@astrojs__starlight@0.32.6.patch deleted file mode 100644 index 34505729..00000000 --- a/docs/patches/@astrojs__starlight@0.32.6.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/components/Icons.ts b/components/Icons.ts -index 41316b960537d689ae86ee7c056f363d6cc39214..bca2f35dff7e75fee1dc5a0444008b25f8d35fbb 100644 ---- a/components/Icons.ts -+++ b/components/Icons.ts -@@ -57,6 +57,8 @@ export const BuiltInIcons = { - '', - 'approve-check': - '', -+ calendar: -+ '', - rocket: - '', - star: '', diff --git a/docs/patches/@astrojs__starlight@0.42.6.patch b/docs/patches/@astrojs__starlight@0.42.6.patch new file mode 100644 index 00000000..e6e85bfd --- /dev/null +++ b/docs/patches/@astrojs__starlight@0.42.6.patch @@ -0,0 +1,12 @@ +diff --git a/dist/components-internals/Icons.js b/dist/components-internals/Icons.js +index 5d7a61bc3d90e8709bee6220c355f40589805931..4d3f1b5593a2cdf4b8be861d16a6654ad56b9766 100644 +--- a/dist/components-internals/Icons.js ++++ b/dist/components-internals/Icons.js +@@ -41,6 +41,7 @@ const BuiltInIcons = { + warning: "", + "approve-check-circle": "", + "approve-check": "", ++ calendar: "", + "question-circle": "", + question: "", + rocket: "", diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 6d02747c..1e91568d 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -1,3 +1,161 @@ +--- +lockfileVersion: '9.0' + +importers: + + .: + configDependencies: {} + packageManagerDependencies: + pnpm: + specifier: 12.11.2 + version: 12.11.2 + +packages: + + '@pnpm/exe.android-arm64@12.11.2': + resolution: {integrity: sha512-owLw13OfPkEoY+hLBNeeG+dCFhywr7q2d/EHPz4mNL2RhKnv8gNwMARkjkiDQu234aItVwFNDeGnmQXm+ikkAg==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.11.2': + resolution: {integrity: sha512-GYPkVebl4iokOA/4MPSpGoUVfFlsth7uqOCe1XiaiM23LAdvUOMJBObqHJijr89ZqjwHm9pO6vO45GRwJ2U2qA==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.11.2': + resolution: {integrity: sha512-n9M4On66y8FDxUAKgMO1FXt0qihyG4e+56p3/F0uo8Bx9KplW8BwKVnXigzCJ8aNM6sVVPkOE6M9XXbeVIxnZA==} + cpu: [arm64] + os: [darwin] + + '@pnpm/exe.darwin-x64@12.11.2': + resolution: {integrity: sha512-oSW7n3sBT0c0cyk4kj10T2Y6Mpm+OFEiCAWozgX039tdoI6yqJF1uaFD3sw7ugLdu6VV3+uY0pa1TUZIPdxDWA==} + cpu: [x64] + os: [darwin] + + '@pnpm/exe.freebsd-x64@12.11.2': + resolution: {integrity: sha512-qbzc3KoDpa/Lkf8vs3jnDe6dUUbso+6eLIyssYFMiliLpYNxn8dirk11YoNnOQcdHVB50v5RFls1Yid6ttT5pg==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.11.2': + resolution: {integrity: sha512-uMEYDwKRktGwANubQ+kYCwmhNwg3Ik6qK89ahsbQ5cP30R/5FVJb/T99vr9XRUBC/A7mZI6eeT92oyVas9ACyg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-arm64@12.11.2': + resolution: {integrity: sha512-6e8ZAQUwFXAWHHHv5FesWqf/kEK04wuitBv5f/gxzkC0DiBfaixr+f+6JQede8SF4Ji5LcMwVFJbzAtffpWxEg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-ppc64@12.11.2': + resolution: {integrity: sha512-Ui8A4nepkVupx2VpuFfysEluMvWK6gTB5rgVts7Ss/+8dj0RD28x3F/seNeH/zSypgC6yKdV6qsKVQh/uffTuQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.11.2': + resolution: {integrity: sha512-i1yLdQ5bu+wjQ+srtFoJAaY2gN/+oXHFdjul4llCeoDxHE0rTIG3R41NhHfCjyFPW4+CpbBT58933CL9sMOCnA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.11.2': + resolution: {integrity: sha512-YS1/lhPjjTsN4QL50VaFZKRa3Uc/bDnhE8eKbJMFvuX06UuFS5YaiDg04APoZdfVSGqTfX27QAg7rfLMSWaqxA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.11.2': + resolution: {integrity: sha512-7eIxQR05fvJxCujUSKp5KTtehJ7QqrgqP/HD1+BcB/SaV2Be4XI1PEHiOgA1zxsiMIeMvTF6E4G4dYHrFjeXRg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-x64@12.11.2': + resolution: {integrity: sha512-FK7QKe24AYgppJwO3mpooYptduuvIGqKJPi5ac7MdnWkjUy46JBfYhCW0grnkWKC8YOf0x+vGviuQqJEj3SpQQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.win32-arm64@12.11.2': + resolution: {integrity: sha512-PCTjVDdJb6VvraZxrEeFv6EqEA0hhIsAySx28e95J2Tqpi88hLpgOXgNqV0vpxq9A+b8GLQfyk/D+1UlJPv/YQ==} + cpu: [arm64] + os: [win32] + + '@pnpm/exe.win32-x64@12.11.2': + resolution: {integrity: sha512-8sgX86OvRjJ3yZs/TvGR2L31wH9ScPZ+f+geKI3ikuB0RRiK3i4LlTRO8OXN6pdRqj8epMde4312MCjj7JsJdA==} + cpu: [x64] + os: [win32] + + pnpm@12.11.2: + resolution: {integrity: sha512-JaUWUqGWeFr18ovabf6NxYLr76SsHRgCIc4TkCMcX7dmN4IupLbkYzznSs3LCnf3Ja8RutOBd/3t2u6BipVcuQ==} + engines: {node: '>=18.*'} + hasBin: true + +snapshots: + + '@pnpm/exe.android-arm64@12.11.2': + optional: true + + '@pnpm/exe.android-x64@12.11.2': + optional: true + + '@pnpm/exe.darwin-arm64@12.11.2': + optional: true + + '@pnpm/exe.darwin-x64@12.11.2': + optional: true + + '@pnpm/exe.freebsd-x64@12.11.2': + optional: true + + '@pnpm/exe.linux-arm64-musl@12.11.2': + optional: true + + '@pnpm/exe.linux-arm64@12.11.2': + optional: true + + '@pnpm/exe.linux-ppc64@12.11.2': + optional: true + + '@pnpm/exe.linux-riscv64@12.11.2': + optional: true + + '@pnpm/exe.linux-s390x@12.11.2': + optional: true + + '@pnpm/exe.linux-x64-musl@12.11.2': + optional: true + + '@pnpm/exe.linux-x64@12.11.2': + optional: true + + '@pnpm/exe.win32-arm64@12.11.2': + optional: true + + '@pnpm/exe.win32-x64@12.11.2': + optional: true + + pnpm@12.11.2: + optionalDependencies: + '@pnpm/exe.android-arm64': 12.11.2 + '@pnpm/exe.android-x64': 12.11.2 + '@pnpm/exe.darwin-arm64': 12.11.2 + '@pnpm/exe.darwin-x64': 12.11.2 + '@pnpm/exe.freebsd-x64': 12.11.2 + '@pnpm/exe.linux-arm64': 12.11.2 + '@pnpm/exe.linux-arm64-musl': 12.11.2 + '@pnpm/exe.linux-ppc64': 12.11.2 + '@pnpm/exe.linux-riscv64': 12.11.2 + '@pnpm/exe.linux-s390x': 12.11.2 + '@pnpm/exe.linux-x64': 12.11.2 + '@pnpm/exe.linux-x64-musl': 12.11.2 + '@pnpm/exe.win32-arm64': 12.11.2 + '@pnpm/exe.win32-x64': 12.11.2 + +--- lockfileVersion: '9.0' settings: @@ -5,31 +163,26 @@ settings: excludeLinksFromLockfile: false patchedDependencies: - '@astrojs/starlight@0.32.6': - hash: 5fa08a7a659409d1609f514c2ad19f1cdbce16814a9b094dc6ee061d1740c618 - path: patches/@astrojs__starlight@0.32.6.patch + '@astrojs/starlight@0.42.6': c5e25b5264f5a0ea6f3c4ab1faac22d1ef0443de5ac51afedf7a199add05ab19 importers: .: dependencies: - '@astrojs/mdx': - specifier: ^4.3.14 - version: 4.3.14(astro@5.18.2(@types/node@24.19.0)(rollup@4.63.6)(typescript@5.9.3)) '@astrojs/react': - specifier: ^4.4.1 - version: 4.4.2(@types/node@24.19.0)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: ^7.0.1 + version: 7.0.1(@types/node@24.19.0)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(yaml@2.9.1) '@astrojs/starlight': - specifier: ^0.32.0 - version: 0.32.6(patch_hash=5fa08a7a659409d1609f514c2ad19f1cdbce16814a9b094dc6ee061d1740c618)(astro@5.18.2(@types/node@24.19.0)(rollup@4.63.6)(typescript@5.9.3)) + specifier: ^0.42.6 + version: 0.42.6(patch_hash=c5e25b5264f5a0ea6f3c4ab1faac22d1ef0443de5ac51afedf7a199add05ab19)(astro@7.3.8(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1))(typescript@7.0.2) astro: - specifier: ^5.4.0 - version: 5.18.2(@types/node@24.19.0)(rollup@4.63.6)(typescript@5.9.3) + specifier: ^7.3.8 + version: 7.3.8(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1) react: - specifier: ^19.0.0 + specifier: ^19.3.0 version: 19.3.0 react-dom: - specifier: ^19.0.0 + specifier: ^19.3.0 version: 19.3.0(react@19.3.0) xml-js: specifier: 1.6.11 @@ -42,88 +195,131 @@ importers: specifier: ^19.0.0 version: 19.3.0(@types/react@19.3.0) typescript: - specifier: ^5.8.0 - version: 5.9.3 + specifier: ^7.0.2 + version: 7.0.2 packages: - '@astrojs/compiler@2.13.1': - resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==} + '@astrojs/compiler-binding-android-arm64@0.5.2': + resolution: {integrity: sha512-kckIxon6Rm/Bxzh9mGPYpRRqUbToUQoHptCmpMmE+Yt0Xumq8CqrKUidyYhrBsrHVO7bxuRzzWUUqvpf+iYceQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] - '@astrojs/internal-helpers@0.7.6': - resolution: {integrity: sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==} + '@astrojs/compiler-binding-darwin-arm64@0.5.2': + resolution: {integrity: sha512-1ZG5Ar3dD8HtodX9XH1mRmE0qBXZlvjYXSFfpgFwocqfWnvhFuqtGUNseL8wgfImiRMztIjpQqlogQFQQtgiag==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] - '@astrojs/markdown-remark@6.3.11': - resolution: {integrity: sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ==} + '@astrojs/compiler-binding-darwin-x64@0.5.2': + resolution: {integrity: sha512-+kl35S7hiHJ2cb7eujwEsPFYYuSgE11uEE2Z20lAJ+undpgulMcW+weQqFPOSSZccEKHOiLIY+kQHkb4e4092w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] - '@astrojs/mdx@4.3.14': - resolution: {integrity: sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==} - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} - peerDependencies: - astro: ^5.0.0 + '@astrojs/compiler-binding-linux-arm64-gnu@0.5.2': + resolution: {integrity: sha512-BqlR0EHNQLPLwgL9+xogjsAc7zGf0cHho2CPdhv0P1yqbVMwGVaGAqrANP6VYAXCqSC43AF4Czcxc2n+oqdesg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] - '@astrojs/prism@3.3.0': - resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + '@astrojs/compiler-binding-linux-arm64-musl@0.5.2': + resolution: {integrity: sha512-GRGyby3AZWw5d6JQzidyxPyvGgHWsSusrpgKyFVpDTKctABF7L3Pd5V1cRJbV36/rcu+Eh292/wL7pF7MkmGkQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] - '@astrojs/react@4.4.2': - resolution: {integrity: sha512-1tl95bpGfuaDMDn8O3x/5Dxii1HPvzjvpL2YTuqOOrQehs60I2DKiDgh1jrKc7G8lv+LQT5H15V6QONQ+9waeQ==} - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} - peerDependencies: - '@types/react': ^17.0.50 || ^18.0.21 || ^19.0.0 - '@types/react-dom': ^17.0.17 || ^18.0.6 || ^19.0.0 - react: ^17.0.2 || ^18.0.0 || ^19.0.0 - react-dom: ^17.0.2 || ^18.0.0 || ^19.0.0 + '@astrojs/compiler-binding-linux-x64-gnu@0.5.2': + resolution: {integrity: sha512-9XAqGTMQAtIslMsjK3xdyY6OI9d59OZqcLBB6pvD/DcoR0daYswfrKx2azdDERDY4AqAnWPC7odVM1BmxYv3Vw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] - '@astrojs/sitemap@3.7.4': - resolution: {integrity: sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==} + '@astrojs/compiler-binding-linux-x64-musl@0.5.2': + resolution: {integrity: sha512-jOViewGeTh9bSfS8vK72ECxoy2yvmA+Pd/ZcEvBI5c7+7IcfHwZ5qA4L9fRYuOhSrAifvQ2dV4vm1XAtloaWBw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] - '@astrojs/starlight@0.32.6': - resolution: {integrity: sha512-ASWGwNzq+0TmJ+GJFFxFFxx6Yra7BqIIMQbvOy/cweTHjqejB6mcaEWtS3Mag12LM7tXCES7v/fzmdPgjz8Yxw==} - peerDependencies: - astro: ^5.1.5 + '@astrojs/compiler-binding-wasm32-wasi@0.5.2': + resolution: {integrity: sha512-Z7p64doar1uvR5C9Xs6j1CV9lGlPVQX7OQ2aAtZ/xKC5aGS6GB13nyc2UfQXTQLvZrvVwsyaflTQy6ziY5Bekw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] - '@astrojs/telemetry@3.3.0': - resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + '@astrojs/compiler-binding-win32-arm64-msvc@0.5.2': + resolution: {integrity: sha512-Tr13bh+ahTWsjXjzctK7pFpWV+dUU4FtBfETlR7gO+ueex0F+RDch7eRr0YfKysaRhk9tWm14lsCJ5uWyFPNHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] - '@babel/code-frame@7.29.7': - resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} - engines: {node: '>=6.9.0'} + '@astrojs/compiler-binding-win32-x64-msvc@0.5.2': + resolution: {integrity: sha512-SfKkI+jOQYLh6wojPvVPV0lFfQnxisweN9B+qCzRvZp7DHAuGif8Y0WcC5PUgN4jb8VKy57LggQDtggR46Du1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] - '@babel/compat-data@7.29.7': - resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} - engines: {node: '>=6.9.0'} + '@astrojs/compiler-binding@0.5.2': + resolution: {integrity: sha512-lEn76+0JcMQ5RDXU0wSMWJg2ZppiZvSULpghC29cfv4o9bhvWFDbQjsCtvjjXN9iVLFQ7fL3wTR2L2UU13mP8g==} + engines: {node: ^20.19.0 || >=22.12.0} - '@babel/core@7.29.7': - resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} - engines: {node: '>=6.9.0'} + '@astrojs/compiler-rs@0.5.2': + resolution: {integrity: sha512-IvwYLB8t1M86rKO4oPdBi9GP4gzXcgrVlNgocjwos1jeeUuEIV8d9Crn1PvYD/5IKteWOxpIHomf7e8iYlkE+Q==} + engines: {node: '>=22.12.0'} - '@babel/generator@7.29.8': - resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} - engines: {node: '>=6.9.0'} + '@astrojs/internal-helpers@0.12.0': + resolution: {integrity: sha512-pKPuwCDtO0L7zgmt1JGd9X4Aes1+0SX3IEBSqBNPHsScYdPMlfmed3Y7DTbXyF7E+8ylnb563o/0OzGQPOFehw==} - '@babel/helper-compilation-targets@7.29.7': - resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} - engines: {node: '>=6.9.0'} + '@astrojs/markdown-satteri@0.4.3': + resolution: {integrity: sha512-PFbEHPnwUlLvpXd7RXrrKM+j12akF4bG+DSuNuoN+3eiwjOwp4HaPi+QQdbkBV7QEYXmzyKca50OJsmGxhNIUA==} - '@babel/helper-globals@7.29.7': - resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} - engines: {node: '>=6.9.0'} + '@astrojs/mdx@8.0.3': + resolution: {integrity: sha512-SmwnVrGZSohDG0B9LXiAPbR6fe9TOumli9Vw/9zo815xGTeB1T3Fqt6HEClmBsVwIKFg/ccos4TgjZAedvg7zA==} + engines: {node: '>=22.12.0'} + peerDependencies: + '@astrojs/markdown-remark': ^7.3.0 + '@astrojs/markdown-satteri': ^0.4.0 + astro: ^7.2.10 + peerDependenciesMeta: + '@astrojs/markdown-remark': + optional: true - '@babel/helper-module-imports@7.29.7': - resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} - engines: {node: '>=6.9.0'} + '@astrojs/prism@4.0.2': + resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==} + engines: {node: '>=22.12.0'} - '@babel/helper-module-transforms@7.29.7': - resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} - engines: {node: '>=6.9.0'} + '@astrojs/react@7.0.1': + resolution: {integrity: sha512-ggKxfvq5KHDveZd/3TGbxvdA4O0ClwMG0eiSJh92dpHJxqfGjRudOqKW2SLFTmKfZAJD+hV+soPgT9WJArO0dQ==} + engines: {node: '>=22.12.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@types/react': ^17.0.50 || ^18.0.21 || ^19.0.0 + '@types/react-dom': ^17.0.17 || ^18.0.6 || ^19.0.0 + oxc-transform-react: ^0.145.0 + react: ^17.0.2 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.2 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + oxc-transform-react: + optional: true - '@babel/helper-plugin-utils@7.29.7': - resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} - engines: {node: '>=6.9.0'} + '@astrojs/sitemap@3.7.4': + resolution: {integrity: sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==} + + '@astrojs/starlight@0.42.6': + resolution: {integrity: sha512-Cfs7GdgzgNRCauDxQVsFUVL1thrGHK/rQdbv/SURv/xhGBXx+j5ypOHW9ENPraQxbIzUC8KAnJV7L9mvEVRuyQ==} + peerDependencies: + '@astrojs/markdown-remark': ^7.3.0 + astro: ^7.2.10 + peerDependenciesMeta: + '@astrojs/markdown-remark': + optional: true + + '@astrojs/telemetry@3.3.3': + resolution: {integrity: sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} @@ -133,63 +329,97 @@ packages: resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.29.7': - resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.29.7': - resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} - engines: {node: '>=6.9.0'} - '@babel/parser@7.29.9': resolution: {integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-transform-react-jsx-self@7.29.7': - resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.29.7': - resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@bruits/satteri-darwin-arm64@0.10.5': + resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==} + cpu: [arm64] + os: [darwin] - '@babel/runtime@7.29.7': - resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} - engines: {node: '>=6.9.0'} + '@bruits/satteri-darwin-x64@0.10.5': + resolution: {integrity: sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==} + cpu: [x64] + os: [darwin] - '@babel/template@7.29.7': - resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} - engines: {node: '>=6.9.0'} + '@bruits/satteri-linux-arm64-gnu@0.10.5': + resolution: {integrity: sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==} + cpu: [arm64] + os: [linux] + libc: [glibc] - '@babel/traverse@7.29.8': - resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} - engines: {node: '>=6.9.0'} + '@bruits/satteri-linux-arm64-musl@0.10.5': + resolution: {integrity: sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==} + cpu: [arm64] + os: [linux] + libc: [musl] - '@babel/types@7.29.8': - resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} - engines: {node: '>=6.9.0'} + '@bruits/satteri-linux-x64-gnu@0.10.5': + resolution: {integrity: sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@bruits/satteri-linux-x64-musl@0.10.5': + resolution: {integrity: sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@bruits/satteri-wasm32-wasi@0.10.5': + resolution: {integrity: sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@bruits/satteri-win32-arm64-msvc@0.10.5': + resolution: {integrity: sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==} + cpu: [arm64] + os: [win32] + + '@bruits/satteri-win32-x64-msvc@0.10.5': + resolution: {integrity: sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==} + cpu: [x64] + os: [win32] '@capsizecss/unpack@4.0.1': resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==} engines: {node: '>=18'} + '@clack/core@1.5.1': + resolution: {integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==} + engines: {node: '>= 20.12.0'} + + '@clack/prompts@1.8.1': + resolution: {integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==} + engines: {node: '>= 20.12.0'} + '@ctrl/tinycolor@4.2.1': resolution: {integrity: sha512-Vh5uy9Y1JBMId6J1f68TMXnZrTCvNdo9Fu2k0d1YnJngR+sM5kWTKl441c/3TFs+cG0NWOjRWgQ/iaWhbYx+7A==} engines: {node: '>=14'} + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + + '@emnapi/core@1.11.3': + resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} + + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/runtime@1.11.3': resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + + '@emnapi/wasi-threads@1.2.3': + resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} '@esbuild/aix-ppc64@0.27.7': resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} @@ -197,500 +427,346 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.27.7': resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.27.7': resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.27.7': resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.27.7': resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.27.7': resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.27.7': resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.27.7': resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.27.7': resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.27.7': resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.27.7': resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.27.7': resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.27.7': resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.27.7': resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.27.7': resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.27.7': resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.27.7': resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.27.7': resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.27.7': resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.27.7': resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.27.7': resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/openharmony-arm64@0.27.7': resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.27.7': resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.27.7': resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.27.7': resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.27.7': resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@expressive-code/core@0.40.2': - resolution: {integrity: sha512-gXY3v7jbgz6nWKvRpoDxK4AHUPkZRuJsM79vHX/5uhV9/qX6Qnctp/U/dMHog/LCVXcuOps+5nRmf1uxQVPb3w==} + '@expressive-code/core@0.44.2': + resolution: {integrity: sha512-Yw5KonQCD1HoOO2P89y4wifqS9qrJcGVY0LkVMUsVZjhi++bhz4WwQ37inenKFNOEVo50P7cjoVsCdaVnUbq8w==} - '@expressive-code/plugin-frames@0.40.2': - resolution: {integrity: sha512-aLw5IlDlZWb10Jo/TTDCVsmJhKfZ7FJI83Zo9VDrV0OBlmHAg7klZqw68VDz7FlftIBVAmMby53/MNXPnMjTSQ==} + '@expressive-code/plugin-frames@0.44.2': + resolution: {integrity: sha512-gVLm6TQMNIRWIaM7o+mCtxkGNjLZY5/2faSTLoXeo9wv/Pkj/0QAtZyXPVPrRsPARqiipATNFmfvQFLJudxPHQ==} - '@expressive-code/plugin-shiki@0.40.2': - resolution: {integrity: sha512-t2HMR5BO6GdDW1c1ISBTk66xO503e/Z8ecZdNcr6E4NpUfvY+MRje+LtrcvbBqMwWBBO8RpVKcam/Uy+1GxwKQ==} + '@expressive-code/plugin-shiki@0.44.2': + resolution: {integrity: sha512-ebWIvCDzXvjyD8rH6T6DfytYJw1GoArLR4nusIAE4VxXrCQf3d+owytiv010KU/dUg+SRLZskDn0N+HaFXeuSg==} - '@expressive-code/plugin-text-markers@0.40.2': - resolution: {integrity: sha512-/XoLjD67K9nfM4TgDlXAExzMJp6ewFKxNpfUw4F7q5Ecy+IU3/9zQQG/O70Zy+RxYTwKGw2MA9kd7yelsxnSmw==} + '@expressive-code/plugin-text-markers@0.44.2': + resolution: {integrity: sha512-SNI7EgUSiADqbqUzzMbj1ZeC/r2pa5eg3KyFOGAd3a7EsIA4qzjXQLp+ODWQtHVDKFCdGs4J3ovSJUqvKIK96g==} '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.34.5': - resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-darwin-arm64@0.35.5': + resolution: {integrity: sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.5': - resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-darwin-x64@0.35.5': + resolution: {integrity: sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.4': - resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + '@img/sharp-freebsd-wasm32@0.35.5': + resolution: {integrity: sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==} + engines: {node: '>=20.9.0'} + os: [freebsd] + + '@img/sharp-libvips-darwin-arm64@1.3.4': + resolution: {integrity: sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.4': - resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + '@img/sharp-libvips-darwin-x64@1.3.4': + resolution: {integrity: sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.4': - resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + '@img/sharp-libvips-linux-arm64@1.3.4': + resolution: {integrity: sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-arm@1.2.4': - resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + '@img/sharp-libvips-linux-arm@1.3.4': + resolution: {integrity: sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-ppc64@1.2.4': - resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + '@img/sharp-libvips-linux-ppc64@1.3.4': + resolution: {integrity: sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-riscv64@1.2.4': - resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + '@img/sharp-libvips-linux-riscv64@1.3.4': + resolution: {integrity: sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.2.4': - resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + '@img/sharp-libvips-linux-s390x@1.3.4': + resolution: {integrity: sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-x64@1.2.4': - resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + '@img/sharp-libvips-linux-x64@1.3.4': + resolution: {integrity: sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + '@img/sharp-libvips-linuxmusl-arm64@1.3.4': + resolution: {integrity: sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + '@img/sharp-libvips-linuxmusl-x64@1.3.4': + resolution: {integrity: sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-linux-arm64@0.34.5': - resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-arm64@0.35.5': + resolution: {integrity: sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-linux-arm@0.34.5': - resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-arm@0.35.5': + resolution: {integrity: sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==} + engines: {node: '>=20.9.0'} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-linux-ppc64@0.34.5': - resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-ppc64@0.35.5': + resolution: {integrity: sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==} + engines: {node: '>=20.9.0'} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-linux-riscv64@0.34.5': - resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-riscv64@0.35.5': + resolution: {integrity: sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==} + engines: {node: '>=20.9.0'} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-linux-s390x@0.34.5': - resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-s390x@0.35.5': + resolution: {integrity: sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==} + engines: {node: '>=20.9.0'} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-linux-x64@0.34.5': - resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-x64@0.35.5': + resolution: {integrity: sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.34.5': - resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linuxmusl-arm64@0.35.5': + resolution: {integrity: sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-linuxmusl-x64@0.34.5': - resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linuxmusl-x64@0.35.5': + resolution: {integrity: sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-wasm32@0.34.5': - resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-wasm32@0.35.5': + resolution: {integrity: sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==} + engines: {node: '>=20.9.0'} + + '@img/sharp-webcontainers-wasm32@0.35.5': + resolution: {integrity: sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==} + engines: {node: '>=20.9.0'} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.5': - resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-arm64@0.35.5': + resolution: {integrity: sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.5': - resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-ia32@0.35.5': + resolution: {integrity: sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==} + engines: {node: ^20.9.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.5': - resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-x64@0.35.5': + resolution: {integrity: sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [win32] - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.6.0': resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@mdx-js/mdx@3.1.1': - resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} - - '@napi-rs/lzma-linux-x64-gnu@1.5.1': - resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} - engines: {node: ^22.20 || ^24.12 || >=25} - cpu: [x64] - os: [linux] - libc: [glibc] + '@napi-rs/wasm-runtime@1.2.5': + resolution: {integrity: sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + '@oxc-project/types@0.154.0': + resolution: {integrity: sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA==} + '@pagefind/darwin-arm64@1.5.2': resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==} cpu: [arm64] @@ -729,206 +805,138 @@ packages: cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.27': - resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - - '@rollup/pluginutils@5.4.0': - resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/rollup-android-arm-eabi@4.63.6': - resolution: {integrity: sha512-G6xF9OVRWsbHadMfoPNUDwW/Jt70QYG+ZDUvtYCFxjf3SPhqVAO0u9ShXZ7Cf5silVoRWyN4bDjCEKnJkXkw0w==} + '@rolldown/binding-android-arm-eabi@1.2.14': + resolution: {integrity: sha512-aWR+XKH9+rW7m5fWq/5360J3mHycrx/o6xZM2DQFdJnTMdyP7/WzxPjhtLbVWdKo2y612/4U1bWqb3HQhiF7vg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.63.6': - resolution: {integrity: sha512-Us/kTH5e2anr1CQvO8MEq4eeCVcIXI3Ag7OFxDI30n2OW7Q7xWuxo8ItbYq28PG2Sm1NWmZzG9+SqVEaj25SFA==} + '@rolldown/binding-android-arm64@1.2.14': + resolution: {integrity: sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.63.6': - resolution: {integrity: sha512-fwaSNrSHp9PJuEh4bKtd0mYC+G3FeVDjSTmsSiSlIYu7TFCpxrfB6lk7Ao8cIbswFyklPB1ZDUV8LkLBM15VWw==} + '@rolldown/binding-darwin-arm64@1.2.14': + resolution: {integrity: sha512-lTQOzHuBIooh3jIr5XINQkjPGEuGy+Dsy0meXDr6Sjty0b99kYgGh4uBC/8mJX1T0kC8d6S0aPP1Y+bHkh6aBw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.63.6': - resolution: {integrity: sha512-QR2tx26gCeGh4eAGnUasfnJuRc+d7Vc0Jo1/fYtKGuiKqCuhbVpbNEvqgYGBwGDZGyS04jj+zdHi9W8uvb1Sdw==} + '@rolldown/binding-darwin-x64@1.2.14': + resolution: {integrity: sha512-hyMKEGatjmBYCs/Q4sbIcL/GqpFEqsX3wc+HYVQ/85A4rxc1o7rPm4DUI4GV4k/h0ITddwFSGpqQunI14GXjTA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.63.6': - resolution: {integrity: sha512-7E1wRJEW8r7WlqmCy58ugndWHrzoEV/pRt2x0D9el7Inra62+Cw00lYW9XhW6iUCtFjhNw49McsSCIzJ/nG8uw==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.63.6': - resolution: {integrity: sha512-13KJeF+vDswMzEHmMIouCVcEQdov3CzAA3ZhM8QFmBJV/FZ/VMZI49UHDvPXTK+wokk86kYPmQ9Qb3xGGJbZoQ==} + '@rolldown/binding-freebsd-x64@1.2.14': + resolution: {integrity: sha512-u371GbXoVXrEgP20PwzoGNOdAOqAMhzo19JzzY+V4YmmnC+DTOoqdbMu+O+54emM59Mik/UdrtWgcuEDKWRPKA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.63.6': - resolution: {integrity: sha512-hV+W1r8HM84PER4If94QuzrrD0DNk4CxobNhVUiz9ZiiWHDzJss4Jra2AYGH1a7GOTzjS1sIyZ35yYEhw/aq+g==} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm-musleabihf@4.63.6': - resolution: {integrity: sha512-5dWs/GENZufRph8PEfl0TrNH/R3DHJA+VxF/dqlfV2oUZfxRtN3qmFXg2DZj8DYM8d+Vd3dgZtuVmoBE/nb2YQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.14': + resolution: {integrity: sha512-BqwKsdZQf6EqVWr8fv2MrDYzAvOZ7+NYFSJESRGs87fkseEhs0TU9TXgRJTkZoRRkxTizyEg1LKUXfU3/78uqg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.63.6': - resolution: {integrity: sha512-inQYLPVIUvYk+s7zpxQldqwrajUNs+t4TJjPGzsdPTvsT8gsQXVcW/sQFolHZ3YSWVk0nMMwU7TtRi0Ow+QMuw==} + '@rolldown/binding-linux-arm64-gnu@1.2.14': + resolution: {integrity: sha512-SD9kY8M009x/7s57Z1dgUVlP5+uYBgKQK0Tkr1WIWngrtUJmRCW1RJFMY7QDla2khXhmg2i5Io7MUjcmZNZ/KQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.63.6': - resolution: {integrity: sha512-sH+0MV1HmDC1q7+bQnlN9ywKBmHqkA2EdD/hHYrrz654ybc+vNC1FRNyzuYKicMQVtZZ4X2jz0osJYmsOtnj4g==} + '@rolldown/binding-linux-arm64-musl@1.2.14': + resolution: {integrity: sha512-BJ2CL19M6uuWesMgnqJzgxoI+N+eV7b0A9O9vLV42y+gitC41fNa8KElau1tHVzuLWX5GzEuxMPhAO0tQXQMkg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.63.6': - resolution: {integrity: sha512-mCECvRr6HGekdBc6dvHzUWubqEti4JyOqlNePrOzl4Wimk26iW5Zy9rld2mQbC9id1NYjfF8nHLFq5fr3CuOKQ==} - cpu: [loong64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-loong64-musl@4.63.6': - resolution: {integrity: sha512-bb9rdoCPwM4DEsbOP3CJgFnvhSJ3XKCUYyUhxnlSs/XGT0DknpOYgLCPbK8VUzwl+cZGzFQm0KbBYRaSGZC2YQ==} - cpu: [loong64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-ppc64-gnu@4.63.6': - resolution: {integrity: sha512-aIJRoGCHev45JSu7JMzVrMzu1NX3nQrXx1Vb/6y4AblxW7JpCMpk4e8C6lHzvSElxi3UEcMdFJldsuWQjV1ddA==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-ppc64-musl@4.63.6': - resolution: {integrity: sha512-LvjnulezHjiaM5Ga9MPCDLTVddjvcrJhZc6vEz9fxeFRGPJsPAX9HuTuPTUQ3l8d+nYpZB/xWzUpuKJlLQm3VQ==} + '@rolldown/binding-linux-ppc64-gnu@1.2.14': + resolution: {integrity: sha512-4+Kl8daPV8NDHaD7mfCcc1pRM+Qg7ab8DyMm5FG5WoZgv4h2i3KFN1CybYBNbQqmuYm7ftJLvmMI1eHYJ22S/Q==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - libc: [musl] - - '@rollup/rollup-linux-riscv64-gnu@4.63.6': - resolution: {integrity: sha512-YmhSBeYZwJ937s8tKpYAhms48N+tj7e+oFkbkVVxfMRdAiynK2AxqRapJXB4utyXxc/iYTkMfPRQ+7ZP0IO78w==} - cpu: [riscv64] - os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.63.6': - resolution: {integrity: sha512-9+YukhzqTvJvzfDXJJzkURK9TDY01nofNH3pyHGuucGC4xPvBVtIfCAqJjkjnmBEGJYNXB8sBc2EDt7xDgGenw==} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-s390x-gnu@4.63.6': - resolution: {integrity: sha512-9G5AtEkpN/A89BILHHEL9aYRYTuFjwa8PUQqoEg8SDrwOZBKpwYqNlQCBNI5QPwGrf7qFlb6LNFilo8FCSA3Wg==} + '@rolldown/binding-linux-s390x-gnu@1.2.14': + resolution: {integrity: sha512-V/h8ePq1fKDrmtFMz6xcCN3DKvuvMRrwwD1q0PkBeeo4DpK64biaKvqWGVxqCeYKqeRk7gE7/iKPxLCn08O97A==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.63.6': - resolution: {integrity: sha512-Ezx2E5D6Siz805j41x91JiGbzuCm8i2U98U37SQ7ytY737+wsJq+P9nPL6UmqDww491zO7MTivYOTrtmTTeCSw==} + '@rolldown/binding-linux-x64-gnu@1.2.14': + resolution: {integrity: sha512-WxalXzgrLVpKC93xfpaJ3gCXUWzeCr+FRCbDVD2mUAy4L6Vo3lNVz0epUEUpxPWJkLNYUwM4OSIikv36OJ9mLg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.63.6': - resolution: {integrity: sha512-8EZ1Q3PB7yUjvR4MbFAnCBF1wF0XRe5QQqbtlJXP7ZX5C8iYlSQJugUhj9oS0gbUP4jp9qGhaIgFnV9Nvod86Q==} + '@rolldown/binding-linux-x64-musl@1.2.14': + resolution: {integrity: sha512-3G3tnAmTpdk9jO3GQtyHXqeFD2SlecfTws/Y3M2mmj9nMBwwuLT4kur8sZKeu7ENUHSpVO3cIsm5A52LEWWwlg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.63.6': - resolution: {integrity: sha512-3JI27TALItfZ/qaxXKdbRXfV6WepUoUa3IN07FE+1xxoRdl3JIyrp5PiDF0vOHsPgEiOFkF8s3B3BRymQkdwGA==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.63.6': - resolution: {integrity: sha512-BNOGeNFNRZDT7Hfc7b9JbTZFXkpAXeXl/CZWtxdd5CNfBaor/0RkJjg+q+E2gwVIvGqqp/NclThKFGrhuScVhw==} + '@rolldown/binding-openharmony-arm64@1.2.14': + resolution: {integrity: sha512-qyr5XiNGxm2ytx17vvtcJ9nXn6v1gENETi503bJx3OGwZ1tSonj7BosxbMa/xeAfSl5iS9X6KjEWYXLu6v1L7Q==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.63.6': - resolution: {integrity: sha512-D3eEyLSIim5WF5fHbwnx+ryk0delN7fJyBrDTO3wVCCNBZ/cA8aCGwLS3SiuK+vRI4E7dqikAlStGuR20dBMuw==} + '@rolldown/binding-win32-arm64-msvc@1.2.14': + resolution: {integrity: sha512-oA4o5o0S2yB199YyYXDzKUv1Z56Rc+mgOjwm7Z/vJ9Z8igiDPYvoOuDyo6g7AK/ZaF09nPhDKVnGBcYHO11GXA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.63.6': - resolution: {integrity: sha512-xwbs9g8zLbHzj1poG1uh27xtubsu27Gk2nuN6kvvGDybjiTfwMksQAnF+phlvI5oeXkJWWDc6kg1t3XpgUYvrg==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.63.6': - resolution: {integrity: sha512-Tr6rhRNnFthvXr45zWVZQ5P8jZ5UwZnXNc7Qnu80cP/VVYtSioOPmvv7wP6UMgRfkBCJr2Pm60ua0YBDSJjgnw==} + '@rolldown/binding-win32-x64-msvc@1.2.14': + resolution: {integrity: sha512-9mE94bf2GZUaR/fUSXCMpBoWkctu421Mi0ORpm4zqfbkjKep7RxzPFa5etcGs5h+2KApoWBOA/hAJa/7saGgEQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.63.6': - resolution: {integrity: sha512-0RAxO1pS/6lY1mSoD2Apm+6aPyfUlm+OWKgncIdj/eVN9I+pDY3lKgD7xsUNFei1u7MZQETGOo6m8POXMDp53A==} - cpu: [x64] - os: [win32] - - '@shikijs/core@1.29.2': - resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} - - '@shikijs/core@3.23.0': - resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@shikijs/engine-javascript@1.29.2': - resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} - - '@shikijs/engine-javascript@3.23.0': - resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} - - '@shikijs/engine-oniguruma@1.29.2': - resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} - - '@shikijs/engine-oniguruma@3.23.0': - resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + '@shikijs/core@4.5.0': + resolution: {integrity: sha512-6CIgwq+bt2JZ3OSjb/nBkkwEf/CfpHcbam+Mg5Pllco7HAGRQ2/EFhZrrJtbyNTgKwknfVS+llsXGygiDGwJWw==} + engines: {node: '>=20'} - '@shikijs/langs@1.29.2': - resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} + '@shikijs/engine-javascript@4.5.0': + resolution: {integrity: sha512-Ed6UdEj84LyYkwnxM5CvSMWAD+id9ExTYri0/+x41U9zrgNifPSS9lZm0JqBP0VfYI8yr8tY5nbNq9+p9R0kFA==} + engines: {node: '>=20'} - '@shikijs/langs@3.23.0': - resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + '@shikijs/engine-oniguruma@4.5.0': + resolution: {integrity: sha512-dKVmbJecVdB9recl8a/CU4jdpNXyjJQrIcesIkpS70s5HS02ohpnCSpMUbotPnEUzbAcLQ+S4hwZYbkBBiTcJw==} + engines: {node: '>=20'} - '@shikijs/themes@1.29.2': - resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} + '@shikijs/langs@4.5.0': + resolution: {integrity: sha512-wwBTqwduXSz0X4v9Qa2EWeFaYJEw1clCncWjoRNQRbVDu3SPRTRWucnouYapKj3b8Q+sk/41Vbc4B5c8nuYzLA==} + engines: {node: '>=20'} - '@shikijs/themes@3.23.0': - resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + '@shikijs/primitive@4.5.0': + resolution: {integrity: sha512-UM7ShlA8oz0OWxLLO8BmO9Ip6fVqdkt8yF0EH7nOCqHfrx1eEAzF0ZUVK7L+I8NEgeu1PEWSRlxaiPPeCb4iDg==} + engines: {node: '>=20'} - '@shikijs/types@1.29.2': - resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} + '@shikijs/themes@4.5.0': + resolution: {integrity: sha512-zGb87H3UBbpuI4yoh5UguB1XbU+2BDU3kflM7UfZ+Cy2hWo9lBtqjSVK20gmLY6ukYl040hAypGXMgud9vul8Q==} + engines: {node: '>=20'} - '@shikijs/types@3.23.0': - resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} + '@shikijs/types@4.5.0': + resolution: {integrity: sha512-drtPrtD8N0DENyD2cyt6Ajy+IWsiCLgMxODwLTpvH1UsN6a9jf90tNTPjqwHvA+0Lzu9e0txk8DjfqH1p9UJRw==} + engines: {node: '>=20'} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@tybys/wasm-util@0.10.4': + resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} @@ -948,9 +956,6 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/mdx@2.0.14': - resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} - '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -977,39 +982,148 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@ungap/structured-clone@1.4.0': - resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] - '@vitejs/plugin-react@4.7.0': - resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] - acorn@8.18.0: - resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} - engines: {node: '>=0.4.0'} - hasBin: true + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] - ansi-regex@6.4.0: - resolution: {integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==} - engines: {node: '>=12'} + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} + + '@vitejs/plugin-react@6.1.2': + resolution: {integrity: sha512-fhJNGUdscQa4HkI0xFxwonWyhnVReCPDbXI7FH7jmzpnVCrFQI7PRrhWecO263610vOrs9tr2Y4xcf8uAdFxbw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + oxc-transform-react: ^0.152.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + oxc-transform-react: + optional: true + + am-i-vibing@0.5.0: + resolution: {integrity: sha512-KLcsDhqf1XRrJmJr+9I/C0EX2K+sGrAGZFgkmd84c8TJO9zJBu+/kFInjazu1KfJWFhWDKdRWkpBzEs7s35DVA==} + hasBin: true anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -1025,22 +1139,20 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - array-iterate@2.0.1: - resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} - - astring@1.9.0: - resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} - hasBin: true - - astro-expressive-code@0.40.2: - resolution: {integrity: sha512-yJMQId0yXSAbW9I6yqvJ3FcjKzJ8zRL7elbJbllkv1ZJPlsI0NI83Pxn1YL1IapEM347EvOOkSW2GL+2+NO61w==} + astro-expressive-code@0.44.2: + resolution: {integrity: sha512-avop7nZcRwC7quvIxVguhwEZ9Tp6IoTzKUCLwP30Fb7+er+pWQgcysP01dcuzRIJo81kLGg30q/YAI2Yb1Sdzg==} peerDependencies: - astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0 - astro@5.18.2: - resolution: {integrity: sha512-TnFwLnAXty5MXKPDGuKXqK4AMBXG+FH6RUdK7Oyc3gyfNoFIthT+4eRbzOK43bdRlLaZuxgciDSjgtggZ3OtGQ==} - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} + astro@7.3.8: + resolution: {integrity: sha512-LHzDHSaV+YzZiR3EFndDYTLLeNeuMtP1qX1FLcCNUUHOCqTTIWPczy2UV3zpA5VqvJe5cWZolqM9Z8JFqR2i9w==} + engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true + peerDependencies: + '@astrojs/markdown-remark': ^7.3.0 + peerDependenciesMeta: + '@astrojs/markdown-remark': + optional: true axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -1049,14 +1161,6 @@ packages: bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - base-64@1.0.0: - resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} - - baseline-browser-mapping@2.11.26: - resolution: {integrity: sha512-GLQdD3y6UF8iVuMJl5fHgE4jdn/ua7n+toKfLgNlg3BqQtOZjpy68T8Tup8/wGWZCDlm7KMg7tPb4MPn7oN0TQ==} - engines: {node: '>=6.0.0'} - hasBin: true - bcp-47-match@2.0.3: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} @@ -1066,29 +1170,9 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - boxen@8.0.1: - resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} - engines: {node: '>=18'} - - browserslist@4.29.3: - resolution: {integrity: sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - camelcase@8.0.0: - resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} - engines: {node: '>=16'} - - caniuse-lite@1.0.30001814: - resolution: {integrity: sha512-/Uaf1lAzr59XcMpW0o96WoEfr+VXK2OX4U9AgFoiSHsVJ4HppnIFUjtYzsyDH2+tgANaQb2/oxYGwCPapN1FpA==} - ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -1109,17 +1193,10 @@ packages: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} - cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - collapse-white-space@2.1.0: - resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -1127,18 +1204,16 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} - common-ancestor-path@1.0.1: - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + common-ancestor-path@2.0.0: + resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} + engines: {node: '>= 18'} cookie-es@1.2.3: resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} - cookie@1.1.1: - resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} - engines: {node: '>=18'} + cookie@2.0.1: + resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==} + engines: {node: '>=22'} crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} @@ -1199,27 +1274,20 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - deterministic-object-hash@2.0.2: - resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} - engines: {node: '>=18'} - devalue@5.9.4: resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff@8.0.4: - resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} engines: {node: '>=0.3.1'} direction@2.0.1: resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} hasBin: true - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -1237,86 +1305,36 @@ packages: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} - electron-to-chromium@1.5.443: - resolution: {integrity: sha512-TDJG36L9A3CWWwZ97HKaE+Iz1sW80pNp6sAU0owzCIV3Zc9eVyRqZK8Vz6NKuMIU8WjP0pIkoqCa0VRf/yFD0Q==} - - emoji-regex-xs@1.0.0: - resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} - - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - - esast-util-from-estree@2.0.0: - resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} - - esast-util-from-js@2.0.1: - resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} - engines: {node: '>=18'} - hasBin: true + es-module-lexer@3.0.3: + resolution: {integrity: sha512-yWGe1O/j+almnV4hOYrmZo8u58JdnmXEMneRQAYkWtqSiT86yoMIEKF4rpqEDj52tbYl3xceBD3DQIBwcsC9Pw==} esbuild@0.27.7: resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} engines: {node: '>=18'} hasBin: true - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - - estree-util-attach-comments@3.0.0: - resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} - - estree-util-build-jsx@3.0.1: - resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} - - estree-util-is-identifier-name@3.0.0: - resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} - - estree-util-scope@1.0.1: - resolution: {integrity: sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA==} - - estree-util-to-js@2.0.0: - resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} - - estree-util-visit@2.0.0: - resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} - - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - expressive-code@0.40.2: - resolution: {integrity: sha512-1zIda2rB0qiDZACawzw2rbdBQiWHBT56uBctS+ezFe5XMAaFaHLnnSYND/Kd+dVzO9HfCXRDpzH3d+3fvOWRcw==} + expressive-code@0.44.2: + resolution: {integrity: sha512-MLNghkvhyFgVW4oCD5DxBuYnnTXIf0PygzGmfT6OZeOOYWh/D4sH1j931biElkA5RG/J9wY/iuSMGAPF5vzHOg==} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1326,6 +1344,10 @@ packages: picomatch: optional: true + find-proc@0.2.0: + resolution: {integrity: sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w==} + engines: {node: ^20.19.0 || >=22.12.0} + flattie@1.1.1: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} @@ -1342,13 +1364,9 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-east-asian-width@1.7.0: - resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} - engines: {node: '>=18'} + get-tsconfig@5.0.0-beta.6: + resolution: {integrity: sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==} + engines: {node: '>=20.20.0'} github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -1362,12 +1380,6 @@ packages: hast-util-format@1.1.0: resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} - hast-util-from-html@2.0.3: - resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} - - hast-util-from-parse5@8.0.3: - resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} - hast-util-has-property@3.0.0: resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} @@ -1386,24 +1398,12 @@ packages: hast-util-phrasing@3.0.1: resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} - hast-util-raw@9.1.0: - resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} - hast-util-select@6.0.4: resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} - hast-util-to-estree@3.1.3: - resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} - hast-util-to-html@9.0.5: resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - hast-util-to-jsx-runtime@2.3.6: - resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} - - hast-util-to-parse5@8.0.1: - resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} - hast-util-to-string@3.0.1: resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} @@ -1428,14 +1428,13 @@ packages: http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - i18next@23.16.8: - resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} - - import-meta-resolve@4.2.0: - resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} - - inline-style-parser@0.2.7: - resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + i18next@26.4.4: + resolution: {integrity: sha512-O+rqmQUi54OwAgnZ4SAwO6aRrbXZt36VZXWt6zvq0FpC3vJbH46oQRs6u4Uwm1vf8ZI7UqOXQiJhQVTor7vRiQ==} + peerDependencies: + typescript: ^5 || ^6 || ^7 + peerDependenciesMeta: + typescript: + optional: true iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -1449,120 +1448,121 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-docker@4.0.0: + resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==} + engines: {node: '>=20'} hasBin: true - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-wsl@3.1.1: - resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} - engines: {node: '>=16'} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.3.2: resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} hasBin: true - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - - lru-cache@11.5.3: - resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} - engines: {node: 20 || >=22} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] - magicast@0.5.5: - resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==} + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] - markdown-extensions@2.0.0: - resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} - engines: {node: '>=16'} + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] - markdown-table@3.0.4: - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] - mdast-util-definitions@6.0.0: - resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] - mdast-util-directive@3.1.0: - resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] - mdast-util-find-and-replace@3.0.2: - resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] - mdast-util-from-markdown@2.0.3: - resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] - mdast-util-gfm-autolink-literal@2.0.1: - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] - mdast-util-gfm-footnote@2.1.0: - resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] - mdast-util-gfm-strikethrough@2.0.1: - resolution: {integrity: sha512-OuJHqvr455pwu2OaOrir7dbzqs4jlWKOtlu9L6GjcIjjQwNyw02VntQsr/Ek6/A13vgnXfUhBekWRUP1OkNivw==} + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] - mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} - mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - mdast-util-gfm@3.1.0: - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} + engines: {node: 20 || >=22} - mdast-util-mdx-expression@2.0.1: - resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + magic-string@1.4.3: + resolution: {integrity: sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ==} - mdast-util-mdx-jsx@3.2.0: - resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + magicast@0.5.5: + resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==} - mdast-util-mdx@3.0.0: - resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + mdast-util-directive@3.1.0: + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} - mdast-util-mdxjs-esm@2.0.1: - resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} @@ -1585,44 +1585,8 @@ packages: micromark-core-commonmark@2.0.4: resolution: {integrity: sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==} - micromark-extension-directive@3.0.2: - resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} - - micromark-extension-gfm-autolink-literal@2.1.0: - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - - micromark-extension-gfm-footnote@2.1.0: - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - - micromark-extension-gfm-strikethrough@2.1.0: - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - - micromark-extension-gfm-table@2.1.2: - resolution: {integrity: sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA==} - - micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - - micromark-extension-gfm-task-list-item@2.1.0: - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} - - micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - - micromark-extension-mdx-expression@3.0.1: - resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} - - micromark-extension-mdx-jsx@3.0.2: - resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} - - micromark-extension-mdx-md@2.0.0: - resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} - - micromark-extension-mdxjs-esm@3.0.0: - resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} - - micromark-extension-mdxjs@3.0.0: - resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + micromark-extension-directive@4.0.0: + resolution: {integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==} micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} @@ -1630,9 +1594,6 @@ packages: micromark-factory-label@2.0.1: resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - micromark-factory-mdx-expression@2.0.3: - resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} - micromark-factory-space@2.1.0: resolution: {integrity: sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==} @@ -1666,9 +1627,6 @@ packages: micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - micromark-util-events-to-acorn@2.0.3: - resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} - micromark-util-html-tag-name@2.0.1: resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} @@ -1705,8 +1663,13 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - neotraverse@0.6.18: - resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + nanoid@3.3.20: + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neotraverse@1.0.1: + resolution: {integrity: sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==} engines: {node: '>= 10'} nlcst-to-string@4.0.0: @@ -1718,10 +1681,6 @@ packages: node-mock-http@1.0.5: resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==} - node-releases@2.0.57: - resolution: {integrity: sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==} - engines: {node: '>=18'} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -1729,6 +1688,10 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} + engines: {node: '>=12.20.0'} + ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} @@ -1738,23 +1701,20 @@ packages: oniguruma-parser@0.12.2: resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} - oniguruma-to-es@2.3.0: - resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} - oniguruma-to-es@4.3.6: resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} - p-limit@6.2.0: - resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} - engines: {node: '>=18'} + p-limit@7.3.3: + resolution: {integrity: sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==} + engines: {node: '>=20'} - p-queue@8.1.1: - resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} - engines: {node: '>=18'} + p-queue@9.3.5: + resolution: {integrity: sha512-Lki/zhXFVmDhesBUn/yHRLW9Bte7mE7xoFHzTR8sIomV7a2z+LxYAPkGvdfidNiu4fKSfjtawixxSHcZci5QcQ==} + engines: {node: '>=20'} - p-timeout@6.1.4: - resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} - engines: {node: '>=14.16'} + p-timeout@7.0.2: + resolution: {integrity: sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==} + engines: {node: '>=20'} package-manager-detector@1.8.0: resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} @@ -1766,12 +1726,6 @@ packages: parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} - parse-latin@7.0.0: - resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} - - parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - piccolore@0.1.3: resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} @@ -1800,13 +1754,17 @@ packages: resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.30: + resolution: {integrity: sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==} + engines: {node: ^10 || ^12 || >=14} + prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + process-ancestry@0.1.0: + resolution: {integrity: sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==} + engines: {node: '>=18.0.0'} property-information@7.2.0: resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} @@ -1819,10 +1777,6 @@ packages: peerDependencies: react: ^19.3.0 - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} - react@19.3.0: resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==} engines: {node: '>=0.10.0'} @@ -1831,95 +1785,35 @@ packages: resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} engines: {node: '>= 20.19.0'} - recma-build-jsx@1.0.0: - resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} - - recma-jsx@1.0.1: - resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - recma-parse@1.0.0: - resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} - - recma-stringify@1.0.0: - resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} - - regex-recursion@5.1.1: - resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} - regex-recursion@6.0.2: resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - regex@5.1.1: - resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} - regex@6.1.0: resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} - rehype-expressive-code@0.40.2: - resolution: {integrity: sha512-+kn+AMGCrGzvtH8Q5lC6Y5lnmTV/r33fdmi5QU/IH1KPHKobKr5UnLwJuqHv5jBTSN/0v2wLDS7RTM73FVzqmQ==} - - rehype-format@5.0.1: - resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} - - rehype-parse@9.0.1: - resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} - - rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - - rehype-recma@1.0.0: - resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} - - rehype-stringify@10.0.1: - resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} - - rehype@13.0.2: - resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} - - remark-directive@3.0.1: - resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==} + rehype-expressive-code@0.44.2: + resolution: {integrity: sha512-jvjQpsfWKBquDrEl5YQA3CJybRRIuDOYsui1BJTs5oKDUK8pPkJSSxY8FjxNlIFIdtgrTjC1zuahuY4Cc1j9SQ==} - remark-gfm@4.0.1: - resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + remark-directive@4.0.0: + resolution: {integrity: sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==} - remark-mdx@3.1.1: - resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} - - remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - - remark-rehype@11.1.2: - resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} - - remark-smartypants@3.0.3: - resolution: {integrity: sha512-gCaK+ndZ0hYezlqFegHFCVh2CQemsi0Npdh1qVM9bxlUFknjkbP6VmojWhddOCrbK0PbbacmYLWfTULRiT1eWA==} - engines: {node: '>=16.0.0'} - - remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - - retext-latin@4.0.0: - resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} retext-smartypants@6.2.0: resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} - retext-stringify@4.0.0: - resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} - - retext@9.0.0: - resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} - - rollup@4.63.6: - resolution: {integrity: sha512-w4+GKyTBqshj84F1GF3s2zxAPFZPEmNkCbQtqilsYS7GsksmX6VoV7UggfZg8sUHCCOkBe7UtQp6fZwbH311FQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + rolldown@1.2.14: + resolution: {integrity: sha512-eTBTTqMR6uHKLgcUqpJP8ntzDI6V4LYA8negAMBEI7gkgVvOdrx6VsvS2Ym+83KhOPdLCHWJu0w7UQFJZhHKNw==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + satteri@0.10.5: + resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==} + sax@1.6.1: resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} engines: {node: '>=11.0.0'} @@ -1927,24 +1821,23 @@ packages: scheduler@0.28.0: resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true - sharp@0.34.5: - resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - - shiki@1.29.2: - resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} + sharp@0.35.5: + resolution: {integrity: sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==} + engines: {node: '>=20.9.0'} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true - shiki@3.23.0: - resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} + shiki@4.5.0: + resolution: {integrity: sha512-OcRW72ngQvc+MSVWBRIovC/BTW589iUE/Vxav7VeM4RcY9MUjqB+IR6ILG1k9nuW6LiG/nct9uma4/MBtnZbmQ==} + engines: {node: '>=20'} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -1962,38 +1855,12 @@ packages: resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} - source-map@0.7.6: - resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} - engines: {node: '>= 12'} - space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - - style-to-js@1.1.21: - resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} - - style-to-object@1.0.14: - resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} - svgo@4.1.0: resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==} engines: {node: '>=16'} @@ -2002,6 +1869,10 @@ packages: tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tinyclip@1.0.3: + resolution: {integrity: sha512-nTv2raKFMzGG6JJp0lpNDsRPdfFE6UHlu2rVEjXo8vkx1ZS3LW2CVXqIaLu8xZlu+6tbFs9V58Qc/Jmk/Ii7wA==} + engines: {node: ^16.14.0 || >= 17.3.0} + tinyexec@1.3.1: resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} @@ -2016,27 +1887,12 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - tsconfck@3.1.6: - resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} - engines: {node: ^18 || >=20} - deprecated: unmaintained - hasBin: true - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} hasBin: true ufo@1.6.4: @@ -2067,24 +1923,12 @@ packages: unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} - unist-util-modify-children@4.0.0: - resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} - - unist-util-position-from-estree@2.0.0: - resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} - unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - unist-util-visit-children@3.0.0: - resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} - unist-util-visit-parents@6.0.2: resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} @@ -2153,17 +1997,16 @@ packages: uploadthing: optional: true - update-browserslist-db@1.3.3: - resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + url-extras@0.1.0: + resolution: {integrity: sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw==} + engines: {node: '>=20'} util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - vfile-location@5.0.3: - resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + verkit@0.5.0: + resolution: {integrity: sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==} + engines: {node: '>=18.12.0'} vfile-message@4.0.3: resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} @@ -2171,31 +2014,34 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@6.4.3: - resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@8.3.4: + resolution: {integrity: sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.7.1 + esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -2219,21 +2065,6 @@ packages: vite: optional: true - web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - - which-pm-runs@1.1.0: - resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} - engines: {node: '>=4'} - - widest-line@5.0.0: - resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} - engines: {node: '>=18'} - - wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} - engines: {node: '>=18'} - xml-js@1.6.11: resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} hasBin: true @@ -2241,39 +2072,19 @@ packages: xxhash-wasm@1.1.0: resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} yocto-queue@1.2.2: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} - yocto-spinner@0.2.3: - resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} - engines: {node: '>=18.19'} - - yoctocolors@2.2.0: - resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} - engines: {node: '>=18'} - - zod-to-json-schema@3.25.2: - resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} - peerDependencies: - zod: ^3.25.28 || ^4 - - zod-to-ts@1.2.0: - resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} - peerDependencies: - typescript: ^4.9.4 || ^5.0.2 - zod: ^3 - - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.6.5: resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} @@ -2282,78 +2093,109 @@ packages: snapshots: - '@astrojs/compiler@2.13.1': {} + '@astrojs/compiler-binding-android-arm64@0.5.2': + optional: true + + '@astrojs/compiler-binding-darwin-arm64@0.5.2': + optional: true + + '@astrojs/compiler-binding-darwin-x64@0.5.2': + optional: true + + '@astrojs/compiler-binding-linux-arm64-gnu@0.5.2': + optional: true + + '@astrojs/compiler-binding-linux-arm64-musl@0.5.2': + optional: true + + '@astrojs/compiler-binding-linux-x64-gnu@0.5.2': + optional: true - '@astrojs/internal-helpers@0.7.6': {} + '@astrojs/compiler-binding-linux-x64-musl@0.5.2': + optional: true - '@astrojs/markdown-remark@6.3.11': + '@astrojs/compiler-binding-wasm32-wasi@0.5.2': dependencies: - '@astrojs/internal-helpers': 0.7.6 - '@astrojs/prism': 3.3.0 - github-slugger: 2.0.0 - hast-util-from-html: 2.0.3 - hast-util-to-text: 4.0.2 - import-meta-resolve: 4.2.0 - js-yaml: 4.3.2 - mdast-util-definitions: 6.0.0 - rehype-raw: 7.0.0 - rehype-stringify: 10.0.1 - remark-gfm: 4.0.1 - remark-parse: 11.0.0 - remark-rehype: 11.1.2 - remark-smartypants: 3.0.3 - shiki: 3.23.0 + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + optional: true + + '@astrojs/compiler-binding-win32-arm64-msvc@0.5.2': + optional: true + + '@astrojs/compiler-binding-win32-x64-msvc@0.5.2': + optional: true + + '@astrojs/compiler-binding@0.5.2': + optionalDependencies: + '@astrojs/compiler-binding-android-arm64': 0.5.2 + '@astrojs/compiler-binding-darwin-arm64': 0.5.2 + '@astrojs/compiler-binding-darwin-x64': 0.5.2 + '@astrojs/compiler-binding-linux-arm64-gnu': 0.5.2 + '@astrojs/compiler-binding-linux-arm64-musl': 0.5.2 + '@astrojs/compiler-binding-linux-x64-gnu': 0.5.2 + '@astrojs/compiler-binding-linux-x64-musl': 0.5.2 + '@astrojs/compiler-binding-wasm32-wasi': 0.5.2 + '@astrojs/compiler-binding-win32-arm64-msvc': 0.5.2 + '@astrojs/compiler-binding-win32-x64-msvc': 0.5.2 + + '@astrojs/compiler-rs@0.5.2': + dependencies: + '@astrojs/compiler-binding': 0.5.2 + + '@astrojs/internal-helpers@0.12.0': + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + picomatch: 4.0.7 + retext-smartypants: 6.2.0 + shiki: 4.5.0 smol-toml: 1.9.0 unified: 11.0.5 - unist-util-remove-position: 5.0.0 - unist-util-visit: 5.1.0 - unist-util-visit-parents: 6.0.2 - vfile: 6.0.3 - transitivePeerDependencies: - - supports-color + yaml: 2.9.1 - '@astrojs/mdx@4.3.14(astro@5.18.2(@types/node@24.19.0)(rollup@4.63.6)(typescript@5.9.3))': + '@astrojs/markdown-satteri@0.4.3': dependencies: - '@astrojs/markdown-remark': 6.3.11 - '@mdx-js/mdx': 3.1.1 - acorn: 8.18.0 - astro: 5.18.2(@types/node@24.19.0)(rollup@4.63.6)(typescript@5.9.3) - es-module-lexer: 1.7.0 - estree-util-visit: 2.0.0 - hast-util-to-html: 9.0.5 - piccolore: 0.1.3 - rehype-raw: 7.0.0 - remark-gfm: 4.0.1 - remark-smartypants: 3.0.3 - source-map: 0.7.6 - unist-util-visit: 5.1.0 - vfile: 6.0.3 - transitivePeerDependencies: - - supports-color + '@astrojs/internal-helpers': 0.12.0 + '@astrojs/prism': 4.0.2 + github-slugger: 2.0.0 + satteri: 0.10.5 + + '@astrojs/mdx@8.0.3(@astrojs/markdown-satteri@0.4.3)(astro@7.3.8(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1))': + dependencies: + '@astrojs/internal-helpers': 0.12.0 + '@astrojs/markdown-satteri': 0.4.3 + astro: 7.3.8(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1) + es-module-lexer: 3.0.3 - '@astrojs/prism@3.3.0': + '@astrojs/prism@4.0.2': dependencies: prismjs: 1.30.0 - '@astrojs/react@4.4.2(@types/node@24.19.0)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@astrojs/react@7.0.1(@types/node@24.19.0)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(yaml@2.9.1)': dependencies: + '@astrojs/internal-helpers': 0.12.0 '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@vitejs/plugin-react': 4.7.0(vite@6.4.3(@types/node@24.19.0)) + '@vitejs/plugin-react': 6.1.2(vite@8.3.4(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1)) + devalue: 5.9.4 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) ultrahtml: 1.7.0 - vite: 6.4.3(@types/node@24.19.0) + vite: 8.3.4(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1) transitivePeerDependencies: + - '@rolldown/plugin-babel' - '@types/node' + - '@vitejs/devtools' + - babel-plugin-react-compiler + - esbuild - jiti - less - - lightningcss - sass - sass-embedded - stylus - sugarss - - supports-color - terser - tsx - yaml @@ -2363,331 +2205,221 @@ snapshots: sitemap: 9.0.1 zod: 4.6.5 - '@astrojs/starlight@0.32.6(patch_hash=5fa08a7a659409d1609f514c2ad19f1cdbce16814a9b094dc6ee061d1740c618)(astro@5.18.2(@types/node@24.19.0)(rollup@4.63.6)(typescript@5.9.3))': + '@astrojs/starlight@0.42.6(patch_hash=c5e25b5264f5a0ea6f3c4ab1faac22d1ef0443de5ac51afedf7a199add05ab19)(astro@7.3.8(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1))(typescript@7.0.2)': dependencies: - '@astrojs/mdx': 4.3.14(astro@5.18.2(@types/node@24.19.0)(rollup@4.63.6)(typescript@5.9.3)) + '@astrojs/markdown-satteri': 0.4.3 + '@astrojs/mdx': 8.0.3(@astrojs/markdown-satteri@0.4.3)(astro@7.3.8(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1)) '@astrojs/sitemap': 3.7.4 '@pagefind/default-ui': 1.5.2 '@types/hast': 3.0.5 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.18.2(@types/node@24.19.0)(rollup@4.63.6)(typescript@5.9.3) - astro-expressive-code: 0.40.2(astro@5.18.2(@types/node@24.19.0)(rollup@4.63.6)(typescript@5.9.3)) + astro: 7.3.8(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1) + astro-expressive-code: 0.44.2(astro@7.3.8(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1)) bcp-47: 2.1.1 - hast-util-from-html: 2.0.3 + hast-util-format: 1.1.0 hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 hast-util-to-string: 3.0.1 hastscript: 9.0.1 - i18next: 23.16.8 + i18next: 26.4.4(typescript@7.0.2) js-yaml: 4.3.2 klona: 2.0.6 + magic-string: 1.4.3 mdast-util-directive: 3.1.0 mdast-util-to-markdown: 2.1.3 mdast-util-to-string: 4.0.0 pagefind: 1.5.2 - rehype: 13.0.2 - rehype-format: 5.0.1 - remark-directive: 3.0.1 + remark-directive: 4.0.0 + satteri: 0.10.5 + ultrahtml: 1.7.0 unified: 11.0.5 unist-util-visit: 5.1.0 vfile: 6.0.3 transitivePeerDependencies: - supports-color + - typescript - '@astrojs/telemetry@3.3.0': + '@astrojs/telemetry@3.3.3': dependencies: ci-info: 4.4.0 - debug: 4.4.3 - dlv: 1.1.3 dset: 3.1.4 - is-docker: 3.0.0 - is-wsl: 3.1.1 - which-pm-runs: 1.1.0 - transitivePeerDependencies: - - supports-color + is-docker: 4.0.0 + package-manager-detector: 1.8.0 - '@babel/code-frame@7.29.7': - dependencies: - '@babel/helper-validator-identifier': 7.29.7 - js-tokens: 4.0.0 - picocolors: 1.1.1 + '@babel/helper-string-parser@7.29.7': {} - '@babel/compat-data@7.29.7': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/core@7.29.7': + '@babel/parser@7.29.9': dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.8 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) - '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.9 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.8 '@babel/types': 7.29.8 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/generator@7.29.8': + '@babel/types@7.29.8': dependencies: - '@babel/parser': 7.29.9 - '@babel/types': 7.29.8 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 - '@babel/helper-compilation-targets@7.29.7': - dependencies: - '@babel/compat-data': 7.29.7 - '@babel/helper-validator-option': 7.29.7 - browserslist: 4.29.3 - lru-cache: 5.1.1 - semver: 6.3.1 + '@bruits/satteri-darwin-arm64@0.10.5': + optional: true - '@babel/helper-globals@7.29.7': {} + '@bruits/satteri-darwin-x64@0.10.5': + optional: true - '@babel/helper-module-imports@7.29.7': - dependencies: - '@babel/traverse': 7.29.8 - '@babel/types': 7.29.8 - transitivePeerDependencies: - - supports-color + '@bruits/satteri-linux-arm64-gnu@0.10.5': + optional: true - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.8 - transitivePeerDependencies: - - supports-color + '@bruits/satteri-linux-arm64-musl@0.10.5': + optional: true - '@babel/helper-plugin-utils@7.29.7': {} + '@bruits/satteri-linux-x64-gnu@0.10.5': + optional: true - '@babel/helper-string-parser@7.29.7': {} + '@bruits/satteri-linux-x64-musl@0.10.5': + optional: true - '@babel/helper-validator-identifier@7.29.7': {} + '@bruits/satteri-wasm32-wasi@0.10.5': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true - '@babel/helper-validator-option@7.29.7': {} + '@bruits/satteri-win32-arm64-msvc@0.10.5': + optional: true - '@babel/helpers@7.29.7': - dependencies: - '@babel/template': 7.29.7 - '@babel/types': 7.29.8 + '@bruits/satteri-win32-x64-msvc@0.10.5': + optional: true - '@babel/parser@7.29.9': + '@capsizecss/unpack@4.0.1': dependencies: - '@babel/types': 7.29.8 + fontkitten: 1.0.3 - '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': + '@clack/core@1.5.1': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 - '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': + '@clack/prompts@1.8.1': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/runtime@7.29.7': {} + '@clack/core': 1.5.1 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 - '@babel/template@7.29.7': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.9 - '@babel/types': 7.29.8 + '@ctrl/tinycolor@4.2.1': {} - '@babel/traverse@7.29.8': + '@emnapi/core@1.11.1': dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.8 - '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.9 - '@babel/template': 7.29.7 - '@babel/types': 7.29.8 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true - '@babel/types@7.29.8': + '@emnapi/core@1.11.3': dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 + '@emnapi/wasi-threads': 1.2.3 + tslib: 2.8.1 + optional: true - '@capsizecss/unpack@4.0.1': + '@emnapi/runtime@1.11.1': dependencies: - fontkitten: 1.0.3 - - '@ctrl/tinycolor@4.2.1': {} + tslib: 2.8.1 + optional: true '@emnapi/runtime@1.11.3': dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.12': + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.27.7': + '@emnapi/wasi-threads@1.2.3': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/android-arm64@0.25.12': + '@esbuild/aix-ppc64@0.27.7': optional: true '@esbuild/android-arm64@0.27.7': optional: true - '@esbuild/android-arm@0.25.12': - optional: true - '@esbuild/android-arm@0.27.7': optional: true - '@esbuild/android-x64@0.25.12': - optional: true - '@esbuild/android-x64@0.27.7': optional: true - '@esbuild/darwin-arm64@0.25.12': - optional: true - - '@esbuild/darwin-arm64@0.27.7': - optional: true - - '@esbuild/darwin-x64@0.25.12': + '@esbuild/darwin-arm64@0.27.7': optional: true '@esbuild/darwin-x64@0.27.7': optional: true - '@esbuild/freebsd-arm64@0.25.12': - optional: true - '@esbuild/freebsd-arm64@0.27.7': optional: true - '@esbuild/freebsd-x64@0.25.12': - optional: true - '@esbuild/freebsd-x64@0.27.7': optional: true - '@esbuild/linux-arm64@0.25.12': - optional: true - '@esbuild/linux-arm64@0.27.7': optional: true - '@esbuild/linux-arm@0.25.12': - optional: true - '@esbuild/linux-arm@0.27.7': optional: true - '@esbuild/linux-ia32@0.25.12': - optional: true - '@esbuild/linux-ia32@0.27.7': optional: true - '@esbuild/linux-loong64@0.25.12': - optional: true - '@esbuild/linux-loong64@0.27.7': optional: true - '@esbuild/linux-mips64el@0.25.12': - optional: true - '@esbuild/linux-mips64el@0.27.7': optional: true - '@esbuild/linux-ppc64@0.25.12': - optional: true - '@esbuild/linux-ppc64@0.27.7': optional: true - '@esbuild/linux-riscv64@0.25.12': - optional: true - '@esbuild/linux-riscv64@0.27.7': optional: true - '@esbuild/linux-s390x@0.25.12': - optional: true - '@esbuild/linux-s390x@0.27.7': optional: true - '@esbuild/linux-x64@0.25.12': - optional: true - '@esbuild/linux-x64@0.27.7': optional: true - '@esbuild/netbsd-arm64@0.25.12': - optional: true - '@esbuild/netbsd-arm64@0.27.7': optional: true - '@esbuild/netbsd-x64@0.25.12': - optional: true - '@esbuild/netbsd-x64@0.27.7': optional: true - '@esbuild/openbsd-arm64@0.25.12': - optional: true - '@esbuild/openbsd-arm64@0.27.7': optional: true - '@esbuild/openbsd-x64@0.25.12': - optional: true - '@esbuild/openbsd-x64@0.27.7': optional: true - '@esbuild/openharmony-arm64@0.25.12': - optional: true - '@esbuild/openharmony-arm64@0.27.7': optional: true - '@esbuild/sunos-x64@0.25.12': - optional: true - '@esbuild/sunos-x64@0.27.7': optional: true - '@esbuild/win32-arm64@0.25.12': - optional: true - '@esbuild/win32-arm64@0.27.7': optional: true - '@esbuild/win32-ia32@0.25.12': - optional: true - '@esbuild/win32-ia32@0.27.7': optional: true - '@esbuild/win32-x64@0.25.12': - optional: true - '@esbuild/win32-x64@0.27.7': optional: true - '@expressive-code/core@0.40.2': + '@expressive-code/core@0.44.2': dependencies: '@ctrl/tinycolor': 4.2.1 hast-util-select: 6.0.4 @@ -2699,170 +2431,146 @@ snapshots: unist-util-visit: 5.1.0 unist-util-visit-parents: 6.0.2 - '@expressive-code/plugin-frames@0.40.2': + '@expressive-code/plugin-frames@0.44.2': dependencies: - '@expressive-code/core': 0.40.2 + '@expressive-code/core': 0.44.2 - '@expressive-code/plugin-shiki@0.40.2': + '@expressive-code/plugin-shiki@0.44.2': dependencies: - '@expressive-code/core': 0.40.2 - shiki: 1.29.2 + '@expressive-code/core': 0.44.2 + shiki: 4.5.0 - '@expressive-code/plugin-text-markers@0.40.2': + '@expressive-code/plugin-text-markers@0.44.2': dependencies: - '@expressive-code/core': 0.40.2 + '@expressive-code/core': 0.44.2 '@img/colour@1.1.0': optional: true - '@img/sharp-darwin-arm64@0.34.5': + '@img/sharp-darwin-arm64@0.35.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-arm64': 1.3.4 optional: true - '@img/sharp-darwin-x64@0.34.5': + '@img/sharp-darwin-x64@0.35.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.3.4 + optional: true + + '@img/sharp-freebsd-wasm32@0.35.5': + dependencies: + '@img/sharp-wasm32': 0.35.5 optional: true - '@img/sharp-libvips-darwin-arm64@1.2.4': + '@img/sharp-libvips-darwin-arm64@1.3.4': optional: true - '@img/sharp-libvips-darwin-x64@1.2.4': + '@img/sharp-libvips-darwin-x64@1.3.4': optional: true - '@img/sharp-libvips-linux-arm64@1.2.4': + '@img/sharp-libvips-linux-arm64@1.3.4': optional: true - '@img/sharp-libvips-linux-arm@1.2.4': + '@img/sharp-libvips-linux-arm@1.3.4': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.4': + '@img/sharp-libvips-linux-ppc64@1.3.4': optional: true - '@img/sharp-libvips-linux-riscv64@1.2.4': + '@img/sharp-libvips-linux-riscv64@1.3.4': optional: true - '@img/sharp-libvips-linux-s390x@1.2.4': + '@img/sharp-libvips-linux-s390x@1.3.4': optional: true - '@img/sharp-libvips-linux-x64@1.2.4': + '@img/sharp-libvips-linux-x64@1.3.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + '@img/sharp-libvips-linuxmusl-arm64@1.3.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.4': + '@img/sharp-libvips-linuxmusl-x64@1.3.4': optional: true - '@img/sharp-linux-arm64@0.34.5': + '@img/sharp-linux-arm64@0.35.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.3.4 optional: true - '@img/sharp-linux-arm@0.34.5': + '@img/sharp-linux-arm@0.35.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.3.4 optional: true - '@img/sharp-linux-ppc64@0.34.5': + '@img/sharp-linux-ppc64@0.35.5': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.3.4 optional: true - '@img/sharp-linux-riscv64@0.34.5': + '@img/sharp-linux-riscv64@0.35.5': optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.3.4 optional: true - '@img/sharp-linux-s390x@0.34.5': + '@img/sharp-linux-s390x@0.35.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.3.4 optional: true - '@img/sharp-linux-x64@0.34.5': + '@img/sharp-linux-x64@0.35.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.3.4 optional: true - '@img/sharp-linuxmusl-arm64@0.34.5': + '@img/sharp-linuxmusl-arm64@0.35.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.4 optional: true - '@img/sharp-linuxmusl-x64@0.34.5': + '@img/sharp-linuxmusl-x64@0.35.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.3.4 optional: true - '@img/sharp-wasm32@0.34.5': + '@img/sharp-wasm32@0.35.5': dependencies: '@emnapi/runtime': 1.11.3 optional: true - '@img/sharp-win32-arm64@0.34.5': + '@img/sharp-webcontainers-wasm32@0.35.5': + dependencies: + '@img/sharp-wasm32': 0.35.5 optional: true - '@img/sharp-win32-ia32@0.34.5': + '@img/sharp-win32-arm64@0.35.5': optional: true - '@img/sharp-win32-x64@0.34.5': + '@img/sharp-win32-ia32@0.35.5': optional: true - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.6.0 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} + '@img/sharp-win32-x64@0.35.5': + optional: true '@jridgewell/sourcemap-codec@1.6.0': {} - '@jridgewell/trace-mapping@0.3.31': + '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.6.0 + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.4 + optional: true - '@mdx-js/mdx@3.1.1': + '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': dependencies: - '@types/estree': 1.0.9 - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.5 - '@types/mdx': 2.0.14 - acorn: 8.18.0 - collapse-white-space: 2.1.0 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - estree-util-scope: 1.0.1 - estree-walker: 3.0.3 - hast-util-to-jsx-runtime: 2.3.6 - markdown-extensions: 2.0.0 - recma-build-jsx: 1.0.0 - recma-jsx: 1.0.1(acorn@8.18.0) - recma-stringify: 1.0.0 - rehype-recma: 1.0.0 - remark-mdx: 3.1.1 - remark-parse: 11.0.0 - remark-rehype: 11.1.2 - source-map: 0.7.6 - unified: 11.0.5 - unist-util-position-from-estree: 2.0.0 - unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.1.0 - vfile: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@napi-rs/lzma-linux-x64-gnu@1.5.1': + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@tybys/wasm-util': 0.10.4 optional: true '@oslojs/encoding@1.1.0': {} + '@oxc-project/types@0.154.0': {} + '@pagefind/darwin-arm64@1.5.2': optional: true @@ -2886,177 +2594,97 @@ snapshots: '@pagefind/windows-x64@1.5.2': optional: true - '@rolldown/pluginutils@1.0.0-beta.27': {} - - '@rollup/pluginutils@5.4.0(rollup@4.63.6)': - dependencies: - '@types/estree': 1.0.9 - estree-walker: 2.0.2 - picomatch: 4.0.7 - optionalDependencies: - rollup: 4.63.6 - - '@rollup/rollup-android-arm-eabi@4.63.6': - optional: true - - '@rollup/rollup-android-arm64@4.63.6': - optional: true - - '@rollup/rollup-darwin-arm64@4.63.6': - optional: true - - '@rollup/rollup-darwin-x64@4.63.6': - optional: true - - '@rollup/rollup-freebsd-arm64@4.63.6': + '@rolldown/binding-android-arm-eabi@1.2.14': optional: true - '@rollup/rollup-freebsd-x64@4.63.6': + '@rolldown/binding-android-arm64@1.2.14': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.63.6': + '@rolldown/binding-darwin-arm64@1.2.14': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.63.6': + '@rolldown/binding-darwin-x64@1.2.14': optional: true - '@rollup/rollup-linux-arm64-gnu@4.63.6': + '@rolldown/binding-freebsd-x64@1.2.14': optional: true - '@rollup/rollup-linux-arm64-musl@4.63.6': + '@rolldown/binding-linux-arm-gnueabihf@1.2.14': optional: true - '@rollup/rollup-linux-loong64-gnu@4.63.6': + '@rolldown/binding-linux-arm64-gnu@1.2.14': optional: true - '@rollup/rollup-linux-loong64-musl@4.63.6': + '@rolldown/binding-linux-arm64-musl@1.2.14': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.63.6': + '@rolldown/binding-linux-ppc64-gnu@1.2.14': optional: true - '@rollup/rollup-linux-ppc64-musl@4.63.6': + '@rolldown/binding-linux-s390x-gnu@1.2.14': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.63.6': + '@rolldown/binding-linux-x64-gnu@1.2.14': optional: true - '@rollup/rollup-linux-riscv64-musl@4.63.6': + '@rolldown/binding-linux-x64-musl@1.2.14': optional: true - '@rollup/rollup-linux-s390x-gnu@4.63.6': + '@rolldown/binding-openharmony-arm64@1.2.14': optional: true - '@rollup/rollup-linux-x64-gnu@4.63.6': + '@rolldown/binding-win32-arm64-msvc@1.2.14': optional: true - '@rollup/rollup-linux-x64-musl@4.63.6': + '@rolldown/binding-win32-x64-msvc@1.2.14': optional: true - '@rollup/rollup-openbsd-x64@4.63.6': - optional: true - - '@rollup/rollup-openharmony-arm64@4.63.6': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.63.6': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.63.6': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.63.6': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.63.6': - optional: true - - '@shikijs/core@1.29.2': - dependencies: - '@shikijs/engine-javascript': 1.29.2 - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.5 - hast-util-to-html: 9.0.5 + '@rolldown/pluginutils@1.0.1': {} - '@shikijs/core@3.23.0': + '@shikijs/core@4.5.0': dependencies: - '@shikijs/types': 3.23.0 + '@shikijs/primitive': 4.5.0 + '@shikijs/types': 4.5.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.5 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@1.29.2': + '@shikijs/engine-javascript@4.5.0': dependencies: - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 2.3.0 - - '@shikijs/engine-javascript@3.23.0': - dependencies: - '@shikijs/types': 3.23.0 + '@shikijs/types': 4.5.0 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.6 - '@shikijs/engine-oniguruma@1.29.2': - dependencies: - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 - - '@shikijs/engine-oniguruma@3.23.0': + '@shikijs/engine-oniguruma@4.5.0': dependencies: - '@shikijs/types': 3.23.0 + '@shikijs/types': 4.5.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@1.29.2': - dependencies: - '@shikijs/types': 1.29.2 - - '@shikijs/langs@3.23.0': + '@shikijs/langs@4.5.0': dependencies: - '@shikijs/types': 3.23.0 + '@shikijs/types': 4.5.0 - '@shikijs/themes@1.29.2': - dependencies: - '@shikijs/types': 1.29.2 - - '@shikijs/themes@3.23.0': - dependencies: - '@shikijs/types': 3.23.0 - - '@shikijs/types@1.29.2': + '@shikijs/primitive@4.5.0': dependencies: + '@shikijs/types': 4.5.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.5 - '@shikijs/types@3.23.0': + '@shikijs/themes@4.5.0': + dependencies: + '@shikijs/types': 4.5.0 + + '@shikijs/types@4.5.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.5 '@shikijs/vscode-textmate@10.0.2': {} - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.29.9 - '@babel/types': 7.29.8 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 - - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.29.8 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.29.9 - '@babel/types': 7.29.8 - - '@types/babel__traverse@7.28.0': + '@tybys/wasm-util@0.10.4': dependencies: - '@babel/types': 7.29.8 + tslib: 2.8.1 + optional: true '@types/debug@4.1.13': dependencies: @@ -3078,8 +2706,6 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/mdx@2.0.14': {} - '@types/ms@2.1.0': {} '@types/nlcst@2.0.3': @@ -3106,35 +2732,76 @@ snapshots: '@types/unist@3.0.3': {} - '@ungap/structured-clone@1.4.0': {} + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true - '@vitejs/plugin-react@4.7.0(vite@6.4.3(@types/node@24.19.0))': - dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) - '@rolldown/pluginutils': 1.0.0-beta.27 - '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 6.4.3(@types/node@24.19.0) - transitivePeerDependencies: - - supports-color + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true - acorn-jsx@5.3.2(acorn@8.18.0): - dependencies: - acorn: 8.18.0 + '@typescript/typescript-darwin-x64@7.0.2': + optional: true - acorn@8.18.0: {} + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true - ansi-align@3.0.1: - dependencies: - string-width: 4.2.3 + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true - ansi-regex@5.0.1: {} + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + + '@ungap/structured-clone@1.4.0': {} - ansi-regex@6.4.0: {} + '@vitejs/plugin-react@6.1.2(vite@8.3.4(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.3.4(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1) - ansi-styles@6.2.3: {} + am-i-vibing@0.5.0: + dependencies: + process-ancestry: 0.1.0 anymatch@3.1.3: dependencies: @@ -3147,82 +2814,68 @@ snapshots: aria-query@5.3.2: {} - array-iterate@2.0.1: {} - - astring@1.9.0: {} - - astro-expressive-code@0.40.2(astro@5.18.2(@types/node@24.19.0)(rollup@4.63.6)(typescript@5.9.3)): + astro-expressive-code@0.44.2(astro@7.3.8(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1)): dependencies: - astro: 5.18.2(@types/node@24.19.0)(rollup@4.63.6)(typescript@5.9.3) - rehype-expressive-code: 0.40.2 + astro: 7.3.8(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1) + rehype-expressive-code: 0.44.2 + url-extras: 0.1.0 - astro@5.18.2(@types/node@24.19.0)(rollup@4.63.6)(typescript@5.9.3): + astro@7.3.8(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1): dependencies: - '@astrojs/compiler': 2.13.1 - '@astrojs/internal-helpers': 0.7.6 - '@astrojs/markdown-remark': 6.3.11 - '@astrojs/telemetry': 3.3.0 + '@astrojs/compiler-rs': 0.5.2 + '@astrojs/internal-helpers': 0.12.0 + '@astrojs/markdown-satteri': 0.4.3 + '@astrojs/telemetry': 3.3.3 '@capsizecss/unpack': 4.0.1 + '@clack/prompts': 1.8.1 '@oslojs/encoding': 1.1.0 - '@rollup/pluginutils': 5.4.0(rollup@4.63.6) - acorn: 8.18.0 + am-i-vibing: 0.5.0 aria-query: 5.3.2 axobject-query: 4.1.0 - boxen: 8.0.1 ci-info: 4.4.0 clsx: 2.1.1 - common-ancestor-path: 1.0.1 - cookie: 1.1.1 - cssesc: 3.0.0 - debug: 4.4.3 - deterministic-object-hash: 2.0.2 + common-ancestor-path: 2.0.0 + cookie: 2.0.1 devalue: 5.9.4 - diff: 8.0.4 - dlv: 1.1.3 + diff: 9.0.0 dset: 3.1.4 - es-module-lexer: 1.7.0 - esbuild: 0.27.7 - estree-walker: 3.0.3 + es-module-lexer: 3.0.3 + find-proc: 0.2.0 flattie: 1.1.1 fontace: 0.4.1 + get-tsconfig: 5.0.0-beta.6 github-slugger: 2.0.0 html-escaper: 3.0.3 http-cache-semantics: 4.2.0 - import-meta-resolve: 4.2.0 - js-yaml: 4.3.2 - magic-string: 0.30.21 + jsonc-parser: 3.3.1 + magic-string: 1.4.3 magicast: 0.5.5 mrmime: 2.0.1 - neotraverse: 0.6.18 - p-limit: 6.2.0 - p-queue: 8.1.1 + neotraverse: 1.0.1 + obug: 3.0.0 + p-limit: 7.3.3 + p-queue: 9.3.5 package-manager-detector: 1.8.0 piccolore: 0.1.3 picomatch: 4.0.7 - prompts: 2.4.2 - rehype: 13.0.2 - semver: 7.8.5 - shiki: 3.23.0 + rolldown: 1.2.14 + shiki: 4.5.0 smol-toml: 1.9.0 svgo: 4.1.0 + tinyclip: 1.0.3 tinyexec: 1.3.1 tinyglobby: 0.2.17 - tsconfck: 3.1.6(typescript@5.9.3) ultrahtml: 1.7.0 unifont: 0.7.5 - unist-util-visit: 5.1.0 unstorage: 1.17.5 - vfile: 6.0.3 - vite: 6.4.3(@types/node@24.19.0) - vitefu: 1.1.3(vite@6.4.3(@types/node@24.19.0)) + verkit: 0.5.0 + vite: 8.3.4(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1) + vitefu: 1.1.3(vite@8.3.4(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1)) xxhash-wasm: 1.1.0 - yargs-parser: 21.1.1 - yocto-spinner: 0.2.3 - zod: 3.25.76 - zod-to-json-schema: 3.25.2(zod@3.25.76) - zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) + yargs-parser: 22.0.0 + zod: 4.6.5 optionalDependencies: - sharp: 0.34.5 + sharp: 0.35.5(@types/node@24.19.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -3239,22 +2892,20 @@ snapshots: - '@vercel/blob' - '@vercel/functions' - '@vercel/kv' + - '@vitejs/devtools' - aws4fetch - db0 + - esbuild - idb-keyval - ioredis - jiti - less - - lightningcss - - rollup - sass - sass-embedded - stylus - sugarss - - supports-color - terser - tsx - - typescript - uploadthing - yaml @@ -3262,10 +2913,6 @@ snapshots: bail@2.0.2: {} - base-64@1.0.0: {} - - baseline-browser-mapping@2.11.26: {} - bcp-47-match@2.0.3: {} bcp-47@2.1.1: @@ -3276,33 +2923,8 @@ snapshots: boolbase@1.0.0: {} - boxen@8.0.1: - dependencies: - ansi-align: 3.0.1 - camelcase: 8.0.0 - chalk: 5.6.2 - cli-boxes: 3.0.0 - string-width: 7.2.0 - type-fest: 4.41.0 - widest-line: 5.0.0 - wrap-ansi: 9.0.2 - - browserslist@4.29.3: - dependencies: - baseline-browser-mapping: 2.11.26 - caniuse-lite: 1.0.30001814 - electron-to-chromium: 1.5.443 - node-releases: 2.0.57 - update-browserslist-db: 1.3.3(browserslist@4.29.3) - - camelcase@8.0.0: {} - - caniuse-lite@1.0.30001814: {} - ccount@2.0.1: {} - chalk@5.6.2: {} - character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} @@ -3317,23 +2939,17 @@ snapshots: ci-info@4.4.0: {} - cli-boxes@3.0.0: {} - clsx@2.1.1: {} - collapse-white-space@2.1.0: {} - comma-separated-tokens@2.0.3: {} commander@11.1.0: {} - common-ancestor-path@1.0.1: {} - - convert-source-map@2.0.0: {} + common-ancestor-path@2.0.0: {} cookie-es@1.2.3: {} - cookie@1.1.1: {} + cookie@2.0.1: {} crossws@0.3.5: dependencies: @@ -3383,12 +2999,7 @@ snapshots: destr@2.0.5: {} - detect-libc@2.1.2: - optional: true - - deterministic-object-hash@2.0.2: - dependencies: - base-64: 1.0.0 + detect-libc@2.1.2: {} devalue@5.9.4: {} @@ -3396,12 +3007,10 @@ snapshots: dependencies: dequal: 2.0.3 - diff@8.0.4: {} + diff@9.0.0: {} direction@2.0.1: {} - dlv@1.1.3: {} - dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -3422,62 +3031,9 @@ snapshots: dset@3.1.4: {} - electron-to-chromium@1.5.443: {} - - emoji-regex-xs@1.0.0: {} - - emoji-regex@10.6.0: {} - - emoji-regex@8.0.0: {} - entities@4.5.0: {} - entities@6.0.1: {} - - es-module-lexer@1.7.0: {} - - esast-util-from-estree@2.0.0: - dependencies: - '@types/estree-jsx': 1.0.5 - devlop: 1.1.0 - estree-util-visit: 2.0.0 - unist-util-position-from-estree: 2.0.0 - - esast-util-from-js@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - acorn: 8.18.0 - esast-util-from-estree: 2.0.0 - vfile-message: 4.0.3 - - esbuild@0.25.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 + es-module-lexer@3.0.3: {} esbuild@0.27.7: optionalDependencies: @@ -3507,61 +3063,35 @@ snapshots: '@esbuild/win32-arm64': 0.27.7 '@esbuild/win32-ia32': 0.27.7 '@esbuild/win32-x64': 0.27.7 + optional: true - escalade@3.2.0: {} - - escape-string-regexp@5.0.0: {} - - estree-util-attach-comments@3.0.0: - dependencies: - '@types/estree': 1.0.9 - - estree-util-build-jsx@3.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - estree-walker: 3.0.3 - - estree-util-is-identifier-name@3.0.0: {} - - estree-util-scope@1.0.1: - dependencies: - '@types/estree': 1.0.9 - devlop: 1.1.0 + eventemitter3@5.0.4: {} - estree-util-to-js@2.0.0: + expressive-code@0.44.2: dependencies: - '@types/estree-jsx': 1.0.5 - astring: 1.9.0 - source-map: 0.7.6 + '@expressive-code/core': 0.44.2 + '@expressive-code/plugin-frames': 0.44.2 + '@expressive-code/plugin-shiki': 0.44.2 + '@expressive-code/plugin-text-markers': 0.44.2 - estree-util-visit@2.0.0: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/unist': 3.0.3 + extend@3.0.2: {} - estree-walker@2.0.2: {} + fast-string-truncated-width@3.0.3: {} - estree-walker@3.0.3: + fast-string-width@3.0.2: dependencies: - '@types/estree': 1.0.9 - - eventemitter3@5.0.4: {} + fast-string-truncated-width: 3.0.3 - expressive-code@0.40.2: + fast-wrap-ansi@0.2.2: dependencies: - '@expressive-code/core': 0.40.2 - '@expressive-code/plugin-frames': 0.40.2 - '@expressive-code/plugin-shiki': 0.40.2 - '@expressive-code/plugin-text-markers': 0.40.2 - - extend@3.0.2: {} + fast-string-width: 3.0.2 fdir@6.5.0(picomatch@4.0.7): optionalDependencies: picomatch: 4.0.7 + find-proc@0.2.0: {} + flattie@1.1.1: {} fontace@0.4.1: @@ -3575,9 +3105,9 @@ snapshots: fsevents@2.3.3: optional: true - gensync@1.0.0-beta.2: {} - - get-east-asian-width@1.7.0: {} + get-tsconfig@5.0.0-beta.6: + dependencies: + resolve-pkg-maps: 1.0.0 github-slugger@2.0.0: {} @@ -3606,27 +3136,7 @@ snapshots: hast-util-phrasing: 3.0.1 hast-util-whitespace: 3.0.0 html-whitespace-sensitive-tag-names: 3.0.1 - unist-util-visit-parents: 6.0.2 - - hast-util-from-html@2.0.3: - dependencies: - '@types/hast': 3.0.5 - devlop: 1.1.0 - hast-util-from-parse5: 8.0.3 - parse5: 7.3.0 - vfile: 6.0.3 - vfile-message: 4.0.3 - - hast-util-from-parse5@8.0.3: - dependencies: - '@types/hast': 3.0.5 - '@types/unist': 3.0.3 - devlop: 1.1.0 - hastscript: 9.0.1 - property-information: 7.2.0 - vfile: 6.0.3 - vfile-location: 5.0.3 - web-namespaces: 2.0.1 + unist-util-visit-parents: 6.0.2 hast-util-has-property@3.0.0: dependencies: @@ -3660,22 +3170,6 @@ snapshots: hast-util-is-body-ok-link: 3.0.1 hast-util-is-element: 3.0.0 - hast-util-raw@9.1.0: - dependencies: - '@types/hast': 3.0.5 - '@types/unist': 3.0.3 - '@ungap/structured-clone': 1.4.0 - hast-util-from-parse5: 8.0.3 - hast-util-to-parse5: 8.0.1 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.1 - parse5: 7.3.0 - unist-util-position: 5.0.0 - unist-util-visit: 5.1.0 - vfile: 6.0.3 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - hast-util-select@6.0.4: dependencies: '@types/hast': 3.0.5 @@ -3694,27 +3188,6 @@ snapshots: unist-util-visit: 5.1.0 zwitch: 2.0.4 - hast-util-to-estree@3.1.3: - dependencies: - '@types/estree': 1.0.9 - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.5 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-attach-comments: 3.0.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.2.0 - space-separated-tokens: 2.0.2 - style-to-js: 1.1.21 - unist-util-position: 5.0.0 - zwitch: 2.0.4 - transitivePeerDependencies: - - supports-color - hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.5 @@ -3729,36 +3202,6 @@ snapshots: stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-jsx-runtime@2.3.6: - dependencies: - '@types/estree': 1.0.9 - '@types/hast': 3.0.5 - '@types/unist': 3.0.3 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.2.0 - space-separated-tokens: 2.0.2 - style-to-js: 1.1.21 - unist-util-position: 5.0.0 - vfile-message: 4.0.3 - transitivePeerDependencies: - - supports-color - - hast-util-to-parse5@8.0.1: - dependencies: - '@types/hast': 3.0.5 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 7.2.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - hast-util-to-string@3.0.1: dependencies: '@types/hast': 3.0.5 @@ -3790,13 +3233,9 @@ snapshots: http-cache-semantics@4.2.0: {} - i18next@23.16.8: - dependencies: - '@babel/runtime': 7.29.7 - - import-meta-resolve@4.2.0: {} - - inline-style-parser@0.2.7: {} + i18next@26.4.4(typescript@7.0.2): + optionalDependencies: + typescript: 7.0.2 iron-webcrypto@1.2.1: {} @@ -3809,45 +3248,74 @@ snapshots: is-decimal@2.0.1: {} - is-docker@3.0.0: {} - - is-fullwidth-code-point@3.0.0: {} + is-docker@4.0.0: {} is-hexadecimal@2.0.1: {} - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - is-plain-obj@4.1.0: {} - is-wsl@3.1.1: - dependencies: - is-inside-container: 1.0.0 - - js-tokens@4.0.0: {} - js-yaml@4.3.2: dependencies: argparse: 2.0.1 - jsesc@3.1.0: {} + jsonc-parser@3.3.1: {} - json5@2.2.3: {} + klona@2.0.6: {} - kleur@3.0.3: {} + lightningcss-android-arm64@1.33.0: + optional: true - klona@2.0.6: {} + lightningcss-darwin-arm64@1.33.0: + optional: true - longest-streak@3.1.0: {} + lightningcss-darwin-x64@1.33.0: + optional: true - lru-cache@11.5.3: {} + lightningcss-freebsd-x64@1.33.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + + lightningcss-linux-arm64-musl@1.33.0: + optional: true + + lightningcss-linux-x64-gnu@1.33.0: + optional: true + + lightningcss-linux-x64-musl@1.33.0: + optional: true + + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true - lru-cache@5.1.1: + lightningcss@1.33.0: dependencies: - yallist: 3.1.1 + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + + longest-streak@3.1.0: {} - magic-string@0.30.21: + lru-cache@11.5.3: {} + + magic-string@1.4.3: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 @@ -3857,16 +3325,6 @@ snapshots: '@babel/types': 7.29.8 source-map-js: 1.2.2 - markdown-extensions@2.0.0: {} - - markdown-table@3.0.4: {} - - mdast-util-definitions@6.0.0: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - unist-util-visit: 5.1.0 - mdast-util-directive@3.1.0: dependencies: '@types/mdast': 4.0.4 @@ -3881,13 +3339,6 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-find-and-replace@3.0.2: - dependencies: - '@types/mdast': 4.0.4 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 - mdast-util-from-markdown@2.0.3: dependencies: '@types/mdast': 4.0.4 @@ -3905,112 +3356,6 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-gfm-autolink-literal@2.0.1: - dependencies: - '@types/mdast': 4.0.4 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.2 - micromark-util-character: 2.1.1 - - mdast-util-gfm-footnote@2.1.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.3 - micromark-util-normalize-identifier: 2.0.1 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-strikethrough@2.0.1: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.3 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-table@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.3 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-task-list-item@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.3 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm@3.1.0: - dependencies: - mdast-util-from-markdown: 2.0.3 - mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.1 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.3 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx-expression@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.5 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.3 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx-jsx@3.2.0: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.5 - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.3 - parse-entities: 4.0.2 - stringify-entities: 4.0.4 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.3 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx@3.0.0: - dependencies: - mdast-util-from-markdown: 2.0.3 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 - mdast-util-to-markdown: 2.1.3 - transitivePeerDependencies: - - supports-color - - mdast-util-mdxjs-esm@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.5 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.3 - transitivePeerDependencies: - - supports-color - mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 @@ -4034,160 +3379,51 @@ snapshots: '@types/unist': 3.0.3 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-character: 2.1.1 - micromark-util-classify-character: 2.0.1 - micromark-util-decode-string: 2.0.1 - micromark-util-html-tag-name: 2.0.1 - unist-util-visit: 5.1.0 - zwitch: 2.0.4 - - mdast-util-to-string@4.0.0: - dependencies: - '@types/mdast': 4.0.4 - - mdn-data@2.0.28: {} - - mdn-data@2.27.1: {} - - micromark-core-commonmark@2.0.4: - dependencies: - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - micromark-factory-destination: 2.0.1 - micromark-factory-label: 2.0.1 - micromark-factory-space: 2.1.0 - micromark-factory-title: 2.0.1 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-edit-map: 1.0.0 - micromark-util-html-tag-name: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-extension-directive@3.0.2: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.1.0 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - parse-entities: 4.0.2 - - micromark-extension-gfm-autolink-literal@2.1.0: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-extension-gfm-footnote@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.4 - micromark-factory-space: 2.1.0 - micromark-util-character: 2.1.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-extension-gfm-strikethrough@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-extension-gfm-table@2.1.2: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.1.0 + mdast-util-to-string: 4.0.0 micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 - micromark-extension-gfm-tagfilter@2.0.0: + mdast-util-to-string@4.0.0: dependencies: - micromark-util-types: 2.0.3 + '@types/mdast': 4.0.4 - micromark-extension-gfm-task-list-item@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 + mdn-data@2.0.28: {} - micromark-extension-gfm@3.0.0: - dependencies: - micromark-extension-gfm-autolink-literal: 2.1.0 - micromark-extension-gfm-footnote: 2.1.0 - micromark-extension-gfm-strikethrough: 2.1.0 - micromark-extension-gfm-table: 2.1.2 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.1.0 - micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.3 + mdn-data@2.27.1: {} - micromark-extension-mdx-expression@3.0.1: + micromark-core-commonmark@2.0.4: dependencies: - '@types/estree': 1.0.9 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 - micromark-factory-mdx-expression: 2.0.3 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 micromark-factory-space: 2.1.0 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.3 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-edit-map: 1.0.0 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.3 - micromark-extension-mdx-jsx@3.0.2: + micromark-extension-directive@4.0.0: dependencies: - '@types/estree': 1.0.9 devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.1.0 + micromark-factory-whitespace: 2.0.1 micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.3 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - vfile-message: 4.0.3 - - micromark-extension-mdx-md@2.0.0: - dependencies: - micromark-util-types: 2.0.3 - - micromark-extension-mdxjs-esm@3.0.0: - dependencies: - '@types/estree': 1.0.9 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.4 - micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.3 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.3 - unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.3 - - micromark-extension-mdxjs@3.0.0: - dependencies: - acorn: 8.18.0 - acorn-jsx: 5.3.2(acorn@8.18.0) - micromark-extension-mdx-expression: 3.0.1 - micromark-extension-mdx-jsx: 3.0.2 - micromark-extension-mdx-md: 2.0.0 - micromark-extension-mdxjs-esm: 3.0.0 - micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.3 + parse-entities: 4.0.2 micromark-factory-destination@2.0.1: dependencies: @@ -4202,18 +3438,6 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.3 - micromark-factory-mdx-expression@2.0.3: - dependencies: - '@types/estree': 1.0.9 - devlop: 1.1.0 - micromark-factory-space: 2.1.0 - micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.3 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.3 - micromark-factory-space@2.1.0: dependencies: micromark-util-character: 2.1.1 @@ -4270,16 +3494,6 @@ snapshots: micromark-util-encode@2.0.1: {} - micromark-util-events-to-acorn@2.0.3: - dependencies: - '@types/estree': 1.0.9 - '@types/unist': 3.0.3 - devlop: 1.1.0 - estree-util-visit: 2.0.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - vfile-message: 4.0.3 - micromark-util-html-tag-name@2.0.1: {} micromark-util-normalize-identifier@2.0.1: @@ -4336,7 +3550,9 @@ snapshots: nanoid@3.3.19: {} - neotraverse@0.6.18: {} + nanoid@3.3.20: {} + + neotraverse@1.0.1: {} nlcst-to-string@4.0.0: dependencies: @@ -4346,14 +3562,14 @@ snapshots: node-mock-http@1.0.5: {} - node-releases@2.0.57: {} - normalize-path@3.0.0: {} nth-check@2.1.1: dependencies: boolbase: 1.0.0 + obug@3.0.0: {} + ofetch@1.5.1: dependencies: destr: 2.0.5 @@ -4364,28 +3580,22 @@ snapshots: oniguruma-parser@0.12.2: {} - oniguruma-to-es@2.3.0: - dependencies: - emoji-regex-xs: 1.0.0 - regex: 5.1.1 - regex-recursion: 5.1.1 - oniguruma-to-es@4.3.6: dependencies: oniguruma-parser: 0.12.2 regex: 6.1.0 regex-recursion: 6.0.2 - p-limit@6.2.0: + p-limit@7.3.3: dependencies: yocto-queue: 1.2.2 - p-queue@8.1.1: + p-queue@9.3.5: dependencies: eventemitter3: 5.0.4 - p-timeout: 6.1.4 + p-timeout: 7.0.2 - p-timeout@6.1.4: {} + p-timeout@7.0.2: {} package-manager-detector@1.8.0: {} @@ -4409,19 +3619,6 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - parse-latin@7.0.0: - dependencies: - '@types/nlcst': 2.0.3 - '@types/unist': 3.0.3 - nlcst-to-string: 4.0.0 - unist-util-modify-children: 4.0.0 - unist-util-visit-children: 3.0.0 - vfile: 6.0.3 - - parse5@7.3.0: - dependencies: - entities: 6.0.1 - piccolore@0.1.3: {} picocolors@1.1.1: {} @@ -4446,12 +3643,15 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.2 + postcss@8.5.30: + dependencies: + nanoid: 3.3.20 + picocolors: 1.1.1 + source-map-js: 1.2.2 + prismjs@1.30.0: {} - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 + process-ancestry@0.1.0: {} property-information@7.2.0: {} @@ -4462,164 +3662,34 @@ snapshots: react: 19.3.0 scheduler: 0.28.0 - react-refresh@0.17.0: {} - react@19.3.0: {} readdirp@5.1.1: {} - recma-build-jsx@1.0.0: - dependencies: - '@types/estree': 1.0.9 - estree-util-build-jsx: 3.0.1 - vfile: 6.0.3 - - recma-jsx@1.0.1(acorn@8.18.0): - dependencies: - acorn: 8.18.0 - acorn-jsx: 5.3.2(acorn@8.18.0) - estree-util-to-js: 2.0.0 - recma-parse: 1.0.0 - recma-stringify: 1.0.0 - unified: 11.0.5 - - recma-parse@1.0.0: - dependencies: - '@types/estree': 1.0.9 - esast-util-from-js: 2.0.1 - unified: 11.0.5 - vfile: 6.0.3 - - recma-stringify@1.0.0: - dependencies: - '@types/estree': 1.0.9 - estree-util-to-js: 2.0.0 - unified: 11.0.5 - vfile: 6.0.3 - - regex-recursion@5.1.1: - dependencies: - regex: 5.1.1 - regex-utilities: 2.3.0 - regex-recursion@6.0.2: dependencies: regex-utilities: 2.3.0 regex-utilities@2.3.0: {} - regex@5.1.1: - dependencies: - regex-utilities: 2.3.0 - regex@6.1.0: dependencies: regex-utilities: 2.3.0 - rehype-expressive-code@0.40.2: - dependencies: - expressive-code: 0.40.2 - - rehype-format@5.0.1: - dependencies: - '@types/hast': 3.0.5 - hast-util-format: 1.1.0 - - rehype-parse@9.0.1: - dependencies: - '@types/hast': 3.0.5 - hast-util-from-html: 2.0.3 - unified: 11.0.5 - - rehype-raw@7.0.0: - dependencies: - '@types/hast': 3.0.5 - hast-util-raw: 9.1.0 - vfile: 6.0.3 - - rehype-recma@1.0.0: - dependencies: - '@types/estree': 1.0.9 - '@types/hast': 3.0.5 - hast-util-to-estree: 3.1.3 - transitivePeerDependencies: - - supports-color - - rehype-stringify@10.0.1: + rehype-expressive-code@0.44.2: dependencies: - '@types/hast': 3.0.5 - hast-util-to-html: 9.0.5 - unified: 11.0.5 - - rehype@13.0.2: - dependencies: - '@types/hast': 3.0.5 - rehype-parse: 9.0.1 - rehype-stringify: 10.0.1 - unified: 11.0.5 + expressive-code: 0.44.2 - remark-directive@3.0.1: + remark-directive@4.0.0: dependencies: '@types/mdast': 4.0.4 mdast-util-directive: 3.1.0 - micromark-extension-directive: 3.0.2 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - - remark-gfm@4.0.1: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-gfm: 3.1.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - - remark-mdx@3.1.1: - dependencies: - mdast-util-mdx: 3.0.0 - micromark-extension-mdxjs: 3.0.0 - transitivePeerDependencies: - - supports-color - - remark-parse@11.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 - micromark-util-types: 2.0.3 + micromark-extension-directive: 4.0.0 unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-rehype@11.1.2: - dependencies: - '@types/hast': 3.0.5 - '@types/mdast': 4.0.4 - mdast-util-to-hast: 13.2.1 - unified: 11.0.5 - vfile: 6.0.3 - - remark-smartypants@3.0.3: - dependencies: - retext: 9.0.0 - retext-smartypants: 6.2.0 - unified: 11.0.5 - unist-util-visit: 5.1.0 - - remark-stringify@11.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.3 - unified: 11.0.5 - - retext-latin@4.0.0: - dependencies: - '@types/nlcst': 2.0.3 - parse-latin: 7.0.0 - unified: 11.0.5 + resolve-pkg-maps@1.0.0: {} retext-smartypants@6.2.0: dependencies: @@ -4627,110 +3697,93 @@ snapshots: nlcst-to-string: 4.0.0 unist-util-visit: 5.1.0 - retext-stringify@4.0.0: - dependencies: - '@types/nlcst': 2.0.3 - nlcst-to-string: 4.0.0 - unified: 11.0.5 - - retext@9.0.0: + rolldown@1.2.14: dependencies: - '@types/nlcst': 2.0.3 - retext-latin: 4.0.0 - retext-stringify: 4.0.0 - unified: 11.0.5 - - rollup@4.63.6: + '@oxc-project/types': 0.154.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.2.14 + '@rolldown/binding-android-arm64': 1.2.14 + '@rolldown/binding-darwin-arm64': 1.2.14 + '@rolldown/binding-darwin-x64': 1.2.14 + '@rolldown/binding-freebsd-x64': 1.2.14 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.14 + '@rolldown/binding-linux-arm64-gnu': 1.2.14 + '@rolldown/binding-linux-arm64-musl': 1.2.14 + '@rolldown/binding-linux-ppc64-gnu': 1.2.14 + '@rolldown/binding-linux-s390x-gnu': 1.2.14 + '@rolldown/binding-linux-x64-gnu': 1.2.14 + '@rolldown/binding-linux-x64-musl': 1.2.14 + '@rolldown/binding-openharmony-arm64': 1.2.14 + '@rolldown/binding-win32-arm64-msvc': 1.2.14 + '@rolldown/binding-win32-x64-msvc': 1.2.14 + + satteri@0.10.5: dependencies: - '@types/estree': 1.0.9 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 optionalDependencies: - '@napi-rs/lzma-linux-x64-gnu': 1.5.1 - '@rollup/rollup-android-arm-eabi': 4.63.6 - '@rollup/rollup-android-arm64': 4.63.6 - '@rollup/rollup-darwin-arm64': 4.63.6 - '@rollup/rollup-darwin-x64': 4.63.6 - '@rollup/rollup-freebsd-arm64': 4.63.6 - '@rollup/rollup-freebsd-x64': 4.63.6 - '@rollup/rollup-linux-arm-gnueabihf': 4.63.6 - '@rollup/rollup-linux-arm-musleabihf': 4.63.6 - '@rollup/rollup-linux-arm64-gnu': 4.63.6 - '@rollup/rollup-linux-arm64-musl': 4.63.6 - '@rollup/rollup-linux-loong64-gnu': 4.63.6 - '@rollup/rollup-linux-loong64-musl': 4.63.6 - '@rollup/rollup-linux-ppc64-gnu': 4.63.6 - '@rollup/rollup-linux-ppc64-musl': 4.63.6 - '@rollup/rollup-linux-riscv64-gnu': 4.63.6 - '@rollup/rollup-linux-riscv64-musl': 4.63.6 - '@rollup/rollup-linux-s390x-gnu': 4.63.6 - '@rollup/rollup-linux-x64-gnu': 4.63.6 - '@rollup/rollup-linux-x64-musl': 4.63.6 - '@rollup/rollup-openbsd-x64': 4.63.6 - '@rollup/rollup-openharmony-arm64': 4.63.6 - '@rollup/rollup-win32-arm64-msvc': 4.63.6 - '@rollup/rollup-win32-ia32-msvc': 4.63.6 - '@rollup/rollup-win32-x64-gnu': 4.63.6 - '@rollup/rollup-win32-x64-msvc': 4.63.6 - fsevents: 2.3.3 + '@bruits/satteri-darwin-arm64': 0.10.5 + '@bruits/satteri-darwin-x64': 0.10.5 + '@bruits/satteri-linux-arm64-gnu': 0.10.5 + '@bruits/satteri-linux-arm64-musl': 0.10.5 + '@bruits/satteri-linux-x64-gnu': 0.10.5 + '@bruits/satteri-linux-x64-musl': 0.10.5 + '@bruits/satteri-wasm32-wasi': 0.10.5 + '@bruits/satteri-win32-arm64-msvc': 0.10.5 + '@bruits/satteri-win32-x64-msvc': 0.10.5 sax@1.6.1: {} scheduler@0.28.0: {} - semver@6.3.1: {} - - semver@7.8.5: {} + semver@7.8.5: + optional: true - sharp@0.34.5: + sharp@0.35.5(@types/node@24.19.0): dependencies: '@img/colour': 1.1.0 detect-libc: 2.1.2 semver: 7.8.5 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.5 - '@img/sharp-darwin-x64': 0.34.5 - '@img/sharp-libvips-darwin-arm64': 1.2.4 - '@img/sharp-libvips-darwin-x64': 1.2.4 - '@img/sharp-libvips-linux-arm': 1.2.4 - '@img/sharp-libvips-linux-arm64': 1.2.4 - '@img/sharp-libvips-linux-ppc64': 1.2.4 - '@img/sharp-libvips-linux-riscv64': 1.2.4 - '@img/sharp-libvips-linux-s390x': 1.2.4 - '@img/sharp-libvips-linux-x64': 1.2.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - '@img/sharp-linux-arm': 0.34.5 - '@img/sharp-linux-arm64': 0.34.5 - '@img/sharp-linux-ppc64': 0.34.5 - '@img/sharp-linux-riscv64': 0.34.5 - '@img/sharp-linux-s390x': 0.34.5 - '@img/sharp-linux-x64': 0.34.5 - '@img/sharp-linuxmusl-arm64': 0.34.5 - '@img/sharp-linuxmusl-x64': 0.34.5 - '@img/sharp-wasm32': 0.34.5 - '@img/sharp-win32-arm64': 0.34.5 - '@img/sharp-win32-ia32': 0.34.5 - '@img/sharp-win32-x64': 0.34.5 - optional: true - - shiki@1.29.2: - dependencies: - '@shikijs/core': 1.29.2 - '@shikijs/engine-javascript': 1.29.2 - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/langs': 1.29.2 - '@shikijs/themes': 1.29.2 - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.5 + '@img/sharp-darwin-arm64': 0.35.5 + '@img/sharp-darwin-x64': 0.35.5 + '@img/sharp-freebsd-wasm32': 0.35.5 + '@img/sharp-libvips-darwin-arm64': 1.3.4 + '@img/sharp-libvips-darwin-x64': 1.3.4 + '@img/sharp-libvips-linux-arm': 1.3.4 + '@img/sharp-libvips-linux-arm64': 1.3.4 + '@img/sharp-libvips-linux-ppc64': 1.3.4 + '@img/sharp-libvips-linux-riscv64': 1.3.4 + '@img/sharp-libvips-linux-s390x': 1.3.4 + '@img/sharp-libvips-linux-x64': 1.3.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.4 + '@img/sharp-libvips-linuxmusl-x64': 1.3.4 + '@img/sharp-linux-arm': 0.35.5 + '@img/sharp-linux-arm64': 0.35.5 + '@img/sharp-linux-ppc64': 0.35.5 + '@img/sharp-linux-riscv64': 0.35.5 + '@img/sharp-linux-s390x': 0.35.5 + '@img/sharp-linux-x64': 0.35.5 + '@img/sharp-linuxmusl-arm64': 0.35.5 + '@img/sharp-linuxmusl-x64': 0.35.5 + '@img/sharp-webcontainers-wasm32': 0.35.5 + '@img/sharp-win32-arm64': 0.35.5 + '@img/sharp-win32-ia32': 0.35.5 + '@img/sharp-win32-x64': 0.35.5 + '@types/node': 24.19.0 + optional: true - shiki@3.23.0: + shiki@4.5.0: dependencies: - '@shikijs/core': 3.23.0 - '@shikijs/engine-javascript': 3.23.0 - '@shikijs/engine-oniguruma': 3.23.0 - '@shikijs/langs': 3.23.0 - '@shikijs/themes': 3.23.0 - '@shikijs/types': 3.23.0 + '@shikijs/core': 4.5.0 + '@shikijs/engine-javascript': 4.5.0 + '@shikijs/engine-oniguruma': 4.5.0 + '@shikijs/langs': 4.5.0 + '@shikijs/themes': 4.5.0 + '@shikijs/types': 4.5.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.5 @@ -4747,43 +3800,13 @@ snapshots: source-map-js@1.2.2: {} - source-map@0.7.6: {} - space-separated-tokens@2.0.2: {} - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@7.2.0: - dependencies: - emoji-regex: 10.6.0 - get-east-asian-width: 1.7.0 - strip-ansi: 7.2.0 - stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.4.0 - - style-to-js@1.1.21: - dependencies: - style-to-object: 1.0.14 - - style-to-object@1.0.14: - dependencies: - inline-style-parser: 0.2.7 - svgo@4.1.0: dependencies: commander: 11.1.0 @@ -4796,6 +3819,8 @@ snapshots: tiny-inflate@1.0.3: {} + tinyclip@1.0.3: {} + tinyexec@1.3.1: {} tinyglobby@0.2.17: @@ -4807,16 +3832,31 @@ snapshots: trough@2.2.0: {} - tsconfck@3.1.6(typescript@5.9.3): - optionalDependencies: - typescript: 5.9.3 - tslib@2.8.1: optional: true - type-fest@4.41.0: {} - - typescript@5.9.3: {} + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 ufo@1.6.4: {} @@ -4853,32 +3893,14 @@ snapshots: dependencies: '@types/unist': 3.0.3 - unist-util-modify-children@4.0.0: - dependencies: - '@types/unist': 3.0.3 - array-iterate: 2.0.1 - - unist-util-position-from-estree@2.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-position@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-remove-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-visit: 5.1.0 - unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-visit-children@3.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-visit-parents@6.0.2: dependencies: '@types/unist': 3.0.3 @@ -4901,18 +3923,11 @@ snapshots: ofetch: 1.5.1 ufo: 1.6.4 - update-browserslist-db@1.3.3(browserslist@4.29.3): - dependencies: - browserslist: 4.29.3 - escalade: 3.2.0 - picocolors: 1.1.1 + url-extras@0.1.0: {} util-deprecate@1.0.2: {} - vfile-location@5.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile: 6.0.3 + verkit@0.5.0: {} vfile-message@4.0.3: dependencies: @@ -4924,35 +3939,22 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@6.4.3(@types/node@24.19.0): + vite@8.3.4(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1): dependencies: - esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.7) + lightningcss: 1.33.0 picomatch: 4.0.7 - postcss: 8.5.28 - rollup: 4.63.6 + postcss: 8.5.30 + rolldown: 1.2.14 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.19.0 + esbuild: 0.27.7 fsevents: 2.3.3 + yaml: 2.9.1 - vitefu@1.1.3(vite@6.4.3(@types/node@24.19.0)): + vitefu@1.1.3(vite@8.3.4(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1)): optionalDependencies: - vite: 6.4.3(@types/node@24.19.0) - - web-namespaces@2.0.1: {} - - which-pm-runs@1.1.0: {} - - widest-line@5.0.0: - dependencies: - string-width: 7.2.0 - - wrap-ansi@9.0.2: - dependencies: - ansi-styles: 6.2.3 - string-width: 7.2.0 - strip-ansi: 7.2.0 + vite: 8.3.4(@types/node@24.19.0)(esbuild@0.27.7)(yaml@2.9.1) xml-js@1.6.11: dependencies: @@ -4960,29 +3962,12 @@ snapshots: xxhash-wasm@1.1.0: {} - yallist@3.1.1: {} + yaml@2.9.1: {} - yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} yocto-queue@1.2.2: {} - yocto-spinner@0.2.3: - dependencies: - yoctocolors: 2.2.0 - - yoctocolors@2.2.0: {} - - zod-to-json-schema@3.25.2(zod@3.25.76): - dependencies: - zod: 3.25.76 - - zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76): - dependencies: - typescript: 5.9.3 - zod: 3.25.76 - - zod@3.25.76: {} - zod@4.6.5: {} zwitch@2.0.4: {} diff --git a/docs/pnpm-workspace.yaml b/docs/pnpm-workspace.yaml index 66e190b2..59f792f4 100644 --- a/docs/pnpm-workspace.yaml +++ b/docs/pnpm-workspace.yaml @@ -7,4 +7,4 @@ allowBuilds: '@pagefind/darwin-arm64': true patchedDependencies: - '@astrojs/starlight@0.32.6': patches/@astrojs__starlight@0.32.6.patch + '@astrojs/starlight@0.42.6': patches/@astrojs__starlight@0.42.6.patch diff --git a/docs/src/content/docs/caldav/createCalendarObject.md b/docs/src/content/docs/caldav/createCalendarObject.md index a7370e83..f8322e13 100644 --- a/docs/src/content/docs/caldav/createCalendarObject.md +++ b/docs/src/content/docs/caldav/createCalendarObject.md @@ -23,7 +23,7 @@ const result = await createCalendarObject({ ### Arguments - `calendar` **required**, the [DAVCalendar](../types/DAVCalendar.md) which the client wish to create object on. -- `filename` **required**, file name of the new calendar object, should end in `.ics` +- `filename` **required**, file name of the new calendar object, should end in `.ics`. It is one path segment inside the calendar: `?`, `#`, `\`, a `%` that does not start a percent-escape, and whitespace are percent-encoded, while existing percent-escapes are kept. Names containing `/`, or equal to `.` or `..`, are rejected. - `iCalString` **required**, calendar file data - `headers` request headers - `headersToExclude` array of keys of the headers you want to exclude diff --git a/docs/src/content/docs/carddav/createVCard.md b/docs/src/content/docs/carddav/createVCard.md index ebb9ce1b..38d121cd 100644 --- a/docs/src/content/docs/carddav/createVCard.md +++ b/docs/src/content/docs/carddav/createVCard.md @@ -22,7 +22,7 @@ const result = await createVCard({ ### Arguments - `addressBook` **required**, [DAVAddressBook](../types/DAVAddressBook.md) -- `filename` **required**, file name of the new vcard, should end in `.vcf` +- `filename` **required**, file name of the new vcard, should end in `.vcf`. It is one path segment inside the address book: `?`, `#`, `\`, a `%` that does not start a percent-escape, and whitespace are percent-encoded, while existing percent-escapes are kept. Names containing `/`, or equal to `.` or `..`, are rejected. - `vCardString` **required**, vcard file data - `headers` request headers - `headersToExclude` array of keys of the headers you want to exclude diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index fef1b074..5d73a2d3 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -47,7 +47,7 @@ console.log(\`Fetched \${events.length} calendar events.\`);`;
✨ - tsdav v2.4.0 is live • Zero Node-only globals • Universal Portable Client + tsdav v2.5.0 is live • Zero Node-only globals • Universal Portable Client
## Quick Start Guides diff --git a/docs/src/content/docs/webdav/collection/smartCollectionSync.md b/docs/src/content/docs/webdav/collection/smartCollectionSync.md index 89347a30..05a1563e 100644 --- a/docs/src/content/docs/webdav/collection/smartCollectionSync.md +++ b/docs/src/content/docs/webdav/collection/smartCollectionSync.md @@ -91,6 +91,11 @@ remote changes. Failed sync REPORTs and failed multi-get responses also reject r a successful sync or advancing the token. Object-level 404 responses in a sync REPORT still represent deletions. A successful response with no changed objects retains the new server sync token. +Without a `collection.syncToken`, the WebDAV sync is an initial sync that lists every object, so local +objects missing from it are reported as `deleted`. When the server rejects the stored sync token +(the `DAV:valid-sync-token` precondition, for example after the token expires), the sync is repeated once +from an empty token and returns a fresh token, as RFC 6578 requires. + When using `smartCollectionSync`, fetch the latest list of [DAVObject](../../types/DAVObject.md) from changed collection using [rfc6578 webdav sync](https://datatracker.ietf.org/doc/html/rfc6578) and `objectMultiGet` diff --git a/docs/src/styles/custom.css b/docs/src/styles/custom.css index d135388b..8f9ad06d 100644 --- a/docs/src/styles/custom.css +++ b/docs/src/styles/custom.css @@ -150,20 +150,15 @@ header.header { border: 1px solid rgba(245, 158, 11, 0.25) !important; } -/* Card Grid styling - tsdav Blue Edition */ +/* Card Grid styling - tsdav Blue Edition. Columns and gaps come from Starlight's CardGrid. */ .card-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); - gap: 1.25rem; - margin: 1.5rem 0; + margin-bottom: 1.5rem; } .card { position: relative; - background: linear-gradient(180deg, rgba(86, 152, 238, 0.04) 0%, rgba(255, 255, 255, 0.01) 100%), var(--sl-color-gray-6); - border: 1px solid rgba(255, 255, 255, 0.08); + background-image: linear-gradient(180deg, rgba(86, 152, 238, 0.04) 0%, rgba(255, 255, 255, 0.01) 100%); border-radius: 14px; - padding: 1.5rem; transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1); overflow: hidden; } @@ -330,10 +325,17 @@ starlight-tabs .tab > [role='tab'] { padding: 0.6rem 1rem !important; font-size: 0.875rem !important; font-weight: 500 !important; + line-height: var(--sl-line-height) !important; + /* The custom border is the underline; Starlight 0.37+ would add a box-shadow one. */ + box-shadow: none !important; border-radius: 0 !important; transition: all 0.15s ease !important; } +starlight-tabs .tab { + margin-bottom: -2px; +} + starlight-tabs .tab > [role='tab']:hover { color: var(--sl-color-gray-1) !important; } diff --git a/knip.json b/knip.json index ecd2dabf..60e8ea2b 100644 --- a/knip.json +++ b/knip.json @@ -28,7 +28,6 @@ "src/content/docs/**/*.{md,mdx}" ], "ignoreDependencies": [ - "@astrojs/mdx", "npm" ] } diff --git a/package.json b/package.json index b89804f1..39dceef9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tsdav", - "version": "2.4.0", + "version": "2.5.0", "description": "WebDAV, CALDAV, and CARDDAV client for Nodejs and the Browser", "keywords": [ "dav", @@ -73,19 +73,18 @@ "xml-js": "1.6.11" }, "devDependencies": { - "@biomejs/biome": "2.5.12", + "@biomejs/biome": "2.5.15", "@types/debug": "4.1.13", - "@types/node": "26.4.1", - "@vitest/coverage-v8": "5.0.0", - "dotenv": "17.4.2", - "ical.js": "^2.2.1", - "knip": "^6.39.0", - "playwright": "1.63.0", - "rolldown": "1.2.7", + "@types/node": "26.6.5", + "@vitest/coverage-v8": "5.0.4", + "ical.js": "2.2.1", + "knip": "6.41.0", + "playwright": "1.64.0", + "rolldown": "1.2.14", "typescript": "7.0.2", - "vitest": "^5.0.0" + "vitest": "5.0.4" }, - "packageManager": "pnpm@10.34.4", + "packageManager": "pnpm@12.11.2", "engines": { "node": ">=18" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ae39f65..e0be1aae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,16 +1,167 @@ +--- +lockfileVersion: '9.0' + +importers: + + .: + configDependencies: {} + packageManagerDependencies: + pnpm: + specifier: 12.11.2 + version: 12.11.2 + +packages: + + '@pnpm/exe.android-arm64@12.11.2': + resolution: {integrity: sha512-owLw13OfPkEoY+hLBNeeG+dCFhywr7q2d/EHPz4mNL2RhKnv8gNwMARkjkiDQu234aItVwFNDeGnmQXm+ikkAg==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.11.2': + resolution: {integrity: sha512-GYPkVebl4iokOA/4MPSpGoUVfFlsth7uqOCe1XiaiM23LAdvUOMJBObqHJijr89ZqjwHm9pO6vO45GRwJ2U2qA==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.11.2': + resolution: {integrity: sha512-n9M4On66y8FDxUAKgMO1FXt0qihyG4e+56p3/F0uo8Bx9KplW8BwKVnXigzCJ8aNM6sVVPkOE6M9XXbeVIxnZA==} + cpu: [arm64] + os: [darwin] + + '@pnpm/exe.darwin-x64@12.11.2': + resolution: {integrity: sha512-oSW7n3sBT0c0cyk4kj10T2Y6Mpm+OFEiCAWozgX039tdoI6yqJF1uaFD3sw7ugLdu6VV3+uY0pa1TUZIPdxDWA==} + cpu: [x64] + os: [darwin] + + '@pnpm/exe.freebsd-x64@12.11.2': + resolution: {integrity: sha512-qbzc3KoDpa/Lkf8vs3jnDe6dUUbso+6eLIyssYFMiliLpYNxn8dirk11YoNnOQcdHVB50v5RFls1Yid6ttT5pg==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.11.2': + resolution: {integrity: sha512-uMEYDwKRktGwANubQ+kYCwmhNwg3Ik6qK89ahsbQ5cP30R/5FVJb/T99vr9XRUBC/A7mZI6eeT92oyVas9ACyg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-arm64@12.11.2': + resolution: {integrity: sha512-6e8ZAQUwFXAWHHHv5FesWqf/kEK04wuitBv5f/gxzkC0DiBfaixr+f+6JQede8SF4Ji5LcMwVFJbzAtffpWxEg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-ppc64@12.11.2': + resolution: {integrity: sha512-Ui8A4nepkVupx2VpuFfysEluMvWK6gTB5rgVts7Ss/+8dj0RD28x3F/seNeH/zSypgC6yKdV6qsKVQh/uffTuQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.11.2': + resolution: {integrity: sha512-i1yLdQ5bu+wjQ+srtFoJAaY2gN/+oXHFdjul4llCeoDxHE0rTIG3R41NhHfCjyFPW4+CpbBT58933CL9sMOCnA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.11.2': + resolution: {integrity: sha512-YS1/lhPjjTsN4QL50VaFZKRa3Uc/bDnhE8eKbJMFvuX06UuFS5YaiDg04APoZdfVSGqTfX27QAg7rfLMSWaqxA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.11.2': + resolution: {integrity: sha512-7eIxQR05fvJxCujUSKp5KTtehJ7QqrgqP/HD1+BcB/SaV2Be4XI1PEHiOgA1zxsiMIeMvTF6E4G4dYHrFjeXRg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-x64@12.11.2': + resolution: {integrity: sha512-FK7QKe24AYgppJwO3mpooYptduuvIGqKJPi5ac7MdnWkjUy46JBfYhCW0grnkWKC8YOf0x+vGviuQqJEj3SpQQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.win32-arm64@12.11.2': + resolution: {integrity: sha512-PCTjVDdJb6VvraZxrEeFv6EqEA0hhIsAySx28e95J2Tqpi88hLpgOXgNqV0vpxq9A+b8GLQfyk/D+1UlJPv/YQ==} + cpu: [arm64] + os: [win32] + + '@pnpm/exe.win32-x64@12.11.2': + resolution: {integrity: sha512-8sgX86OvRjJ3yZs/TvGR2L31wH9ScPZ+f+geKI3ikuB0RRiK3i4LlTRO8OXN6pdRqj8epMde4312MCjj7JsJdA==} + cpu: [x64] + os: [win32] + + pnpm@12.11.2: + resolution: {integrity: sha512-JaUWUqGWeFr18ovabf6NxYLr76SsHRgCIc4TkCMcX7dmN4IupLbkYzznSs3LCnf3Ja8RutOBd/3t2u6BipVcuQ==} + engines: {node: '>=18.*'} + hasBin: true + +snapshots: + + '@pnpm/exe.android-arm64@12.11.2': + optional: true + + '@pnpm/exe.android-x64@12.11.2': + optional: true + + '@pnpm/exe.darwin-arm64@12.11.2': + optional: true + + '@pnpm/exe.darwin-x64@12.11.2': + optional: true + + '@pnpm/exe.freebsd-x64@12.11.2': + optional: true + + '@pnpm/exe.linux-arm64-musl@12.11.2': + optional: true + + '@pnpm/exe.linux-arm64@12.11.2': + optional: true + + '@pnpm/exe.linux-ppc64@12.11.2': + optional: true + + '@pnpm/exe.linux-riscv64@12.11.2': + optional: true + + '@pnpm/exe.linux-s390x@12.11.2': + optional: true + + '@pnpm/exe.linux-x64-musl@12.11.2': + optional: true + + '@pnpm/exe.linux-x64@12.11.2': + optional: true + + '@pnpm/exe.win32-arm64@12.11.2': + optional: true + + '@pnpm/exe.win32-x64@12.11.2': + optional: true + + pnpm@12.11.2: + optionalDependencies: + '@pnpm/exe.android-arm64': 12.11.2 + '@pnpm/exe.android-x64': 12.11.2 + '@pnpm/exe.darwin-arm64': 12.11.2 + '@pnpm/exe.darwin-x64': 12.11.2 + '@pnpm/exe.freebsd-x64': 12.11.2 + '@pnpm/exe.linux-arm64': 12.11.2 + '@pnpm/exe.linux-arm64-musl': 12.11.2 + '@pnpm/exe.linux-ppc64': 12.11.2 + '@pnpm/exe.linux-riscv64': 12.11.2 + '@pnpm/exe.linux-s390x': 12.11.2 + '@pnpm/exe.linux-x64': 12.11.2 + '@pnpm/exe.linux-x64-musl': 12.11.2 + '@pnpm/exe.win32-arm64': 12.11.2 + '@pnpm/exe.win32-x64': 12.11.2 + +--- lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - picomatch: 4.0.4 - postcss: 8.5.15 - serialize-javascript: 7.0.6 - vite: 6.4.3 - vite>postcss: 8.5.28 - importers: .: @@ -23,38 +174,35 @@ importers: version: 1.6.11 devDependencies: '@biomejs/biome': - specifier: 2.5.12 - version: 2.5.12 + specifier: 2.5.15 + version: 2.5.15 '@types/debug': specifier: 4.1.13 version: 4.1.13 '@types/node': - specifier: 26.4.1 - version: 26.4.1 + specifier: 26.6.5 + version: 26.6.5 '@vitest/coverage-v8': - specifier: 5.0.0 - version: 5.0.0(vitest@5.0.0) - dotenv: - specifier: 17.4.2 - version: 17.4.2 + specifier: 5.0.4 + version: 5.0.4(vitest@5.0.4) ical.js: - specifier: ^2.2.1 + specifier: 2.2.1 version: 2.2.1 knip: - specifier: ^6.39.0 - version: 6.39.0 + specifier: 6.41.0 + version: 6.41.0 playwright: - specifier: 1.63.0 - version: 1.63.0 + specifier: 1.64.0 + version: 1.64.0 rolldown: - specifier: 1.2.7 - version: 1.2.7 + specifier: 1.2.14 + version: 1.2.14 typescript: specifier: 7.0.2 version: 7.0.2 vitest: - specifier: ^5.0.0 - version: 5.0.0(@types/node@26.4.1)(@vitest/coverage-v8@5.0.0)(vite@6.4.3(@types/node@26.4.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.9.1)) + specifier: 5.0.4 + version: 5.0.4(@types/node@26.6.5)(@vitest/coverage-v8@5.0.4)(vite@8.3.4(@types/node@26.6.5)(jiti@2.7.0)(terser@5.46.0)(yaml@2.9.1)) packages: @@ -79,59 +227,59 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@biomejs/biome@2.5.12': - resolution: {integrity: sha512-Lw4VHZRebrReBBnlHa12JQjnIBm3JJAA55PDB9LbBVBF0q4RYphm6KfmIjqtPhf61MxZ5Q9KoK8R8x+7per5Aw==} + '@biomejs/biome@2.5.15': + resolution: {integrity: sha512-WZTW4slm/pdkh92K6t/3aEN++44JD1PQ7squ7RCMLI1flHGl43DVOIGXvCjHiZgBMO1V4uYxoFNtqrIA4qGuIQ==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.5.12': - resolution: {integrity: sha512-lCRY1rwgNeWNgTr4DI/u6ZwXTRwRLHAvbaio1YLLGS+4r1nhvB2ssyPqIpfUSmRveNfv0fn/N58C7CAdK2XVrg==} + '@biomejs/cli-darwin-arm64@2.5.15': + resolution: {integrity: sha512-BZVzFhJ/mUvTLMYbc9x6el0o2Uv5zP7bACYyhFb6fSc1giroXm7PL0a5KqMJ9F+/BnkYRjagD/ROSDVOZ6eapg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.5.12': - resolution: {integrity: sha512-vhPgwnh+6tN3ArdAXuET99xaNbFt7CG82Bqn+omHVLC5xdVx45JsYjGPmUIGNzjDek5XdNCP1HKksK7fn8+3bQ==} + '@biomejs/cli-darwin-x64@2.5.15': + resolution: {integrity: sha512-V5Kw63V+fVGNFhFrizDxMbGXAzZCh8kYzJpy3GI6gTapWDg7bZK9oYC9CbVgQSEdTnupz0U5Efz8Ev+5vdBBXw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.5.12': - resolution: {integrity: sha512-couHYjFLL5uuI8ne6zhT7KwEsXo5YP7ry/2xmEqah7qanu0YmfDi3mwJg47YXSuv/NpZj22CZzcRH/5c4gjPSQ==} + '@biomejs/cli-linux-arm64-musl@2.5.15': + resolution: {integrity: sha512-tGzZUTcJCV7tj5Adh/Gn6nR4MycqA3iohq2LEcrarAgRBkU0h0OKd2UzCRkOsOYOuUGaUJb4YmqRqyy2feGGSw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.5.12': - resolution: {integrity: sha512-2gp8aVwXYKdAtmBfRFCUuyDMcfN1ahHqUkGfLYrZlNRFmryMATLVvJgWKvyA8wu4Rwn5OSxM1UcUmOuOFNGeBQ==} + '@biomejs/cli-linux-arm64@2.5.15': + resolution: {integrity: sha512-XaG7P7eeSLYETD3K9grfB0mQmpLQZjygdbsxekWBJAg4am79fGAtRpfRyNnTvXB2fZFNnJZG3nXm7HBat0+VUw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.5.12': - resolution: {integrity: sha512-8A0oDW58/w9f/PQNYuq0sGUZtGtGrkNF4Z6n0PUoXpLCshi85vtKTv1XSznQawhdE4MXJ8ufpzHXyLFe87M/+w==} + '@biomejs/cli-linux-x64-musl@2.5.15': + resolution: {integrity: sha512-IlxUcyxilVGPsE008x13pWdkTbU3nQpP2i9b5UrbOYj6goBkKsRX1XB7yJLcV+O1H9LBchIIm4adOaVLZBX0ZQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.5.12': - resolution: {integrity: sha512-SnvOs3TSTiuia4SQOUNe1aWC9RT4+YkjcKnOhL/nsKOV0k5ycgBkDzF0lUxKn1V7Q8CLTRq6iV23ZAivHomRoA==} + '@biomejs/cli-linux-x64@2.5.15': + resolution: {integrity: sha512-xE4iEW/3LqlYj9GFgGrFsFSH51dEEpUbYWBfeOv0q87WkUDxK2o/HhreSb7qMJqck70RVM6Lg96hgedcAYcOkA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.5.12': - resolution: {integrity: sha512-b9vtoZFsuZt1pdjNwJvXl0f+BpayRzV008uS2+JpmwIKdSE2qdu4A/l04FESwLoou5g2E/Qlec0xwJydZplH+A==} + '@biomejs/cli-win32-arm64@2.5.15': + resolution: {integrity: sha512-2kPKzhNlm8C+Ru3GcO0Me2ODkCBLrVOUNuyi84RJyWDVKAA4+Kjj3jMjL938lF6BRfvltC4vB2nPY9SvN51Ovg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.5.12': - resolution: {integrity: sha512-B1R/l+CwEpKFSuqiwePzPNRk1EiJN8kc0UhdafNz6MZN9v5OFP9HYP1irptvWzHrwVI4blVNGMbxc5zt70m3IA==} + '@biomejs/cli-win32-x64@2.5.15': + resolution: {integrity: sha512-yAzh4UqEImV6Hcy0zjUqNfJAsUhoD64FBQCdTG8Md/Z2wQeVP/ZmJ3XRYAs1g8J9fjTFyl2fCtc5FB5til47+g==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -145,162 +293,6 @@ packages: '@emnapi/wasi-threads@1.2.2': resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -317,13 +309,6 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@napi-rs/lzma-linux-x64-gnu@1.5.1': - resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} - engines: {node: ^22.20 || ^24.12 || >=25} - cpu: [x64] - os: [linux] - libc: [glibc] - '@napi-rs/wasm-runtime@1.2.4': resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} @@ -331,133 +316,133 @@ packages: '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 - '@oxc-parser/binding-android-arm-eabi@0.150.0': - resolution: {integrity: sha512-oQef2Zu4Prz1KLKznz3HqZzU9uVoA5PMoDZuuLmqms7hKmKSAPzlaMnLllJq3t+rgKmfJJ2siPrpZfFrW06btw==} + '@oxc-parser/binding-android-arm-eabi@0.153.0': + resolution: {integrity: sha512-BcWu25dMwMjHpaDCEidmpAi7rGg1qZoihJeUUH9bD55pVZ0z4Wa5CQgqSTo0R41H81oozisQKW3WqvAN2m77IQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxc-parser/binding-android-arm64@0.150.0': - resolution: {integrity: sha512-B6ofpoFiAUwIZ0MJ2IgHPvZK8FAtL4qzSZRwOkAKIfxEobE1mQC8nDdiFZj7pUaJiVUVCsfkMsBJKedzO8rZvA==} + '@oxc-parser/binding-android-arm64@0.153.0': + resolution: {integrity: sha512-9l5rdp2DhRqVriBHsNpu5cEf+hizZ4B58rt93HzyQEBUgZiC6qe2oFpaAAnXGCxHGnQExI1s7S2G0QhFacUZ6w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-parser/binding-darwin-arm64@0.150.0': - resolution: {integrity: sha512-J+9IHKzx/bSz1JetOfD4zKXSK9sOm4/a7+0qomJODcTL6JsRXGeV/ZdkAPSIDydfFmWzYCraMlQEosSZEyBYkQ==} + '@oxc-parser/binding-darwin-arm64@0.153.0': + resolution: {integrity: sha512-EcpsyRXHhENDpekpG4QNaSZj2F/BAz4Gh4o89zZwNss86R8KyRSQ6sXbAj74Xyeb4z3j/yBZZ6joQZhraIWyfw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.150.0': - resolution: {integrity: sha512-v6IPfcAcSYrBWXV5Tce1DmxDMXLhEYpIIWiRFPJopgCVscZdLaV4MRQOUxvL3usQlw+yrwYOjBFB9IwBx+jUiQ==} + '@oxc-parser/binding-darwin-x64@0.153.0': + resolution: {integrity: sha512-hlj80HUQy07/2lYp6rmxH+3u+H2ik3rjLR52CUdPApxmZCNxASDUf/+ykTzAHS/fehftmVMATKvPaWmuLHuasg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxc-parser/binding-freebsd-x64@0.150.0': - resolution: {integrity: sha512-AoR/4jD02HET0KO0yNT4nbTE+XJUxiO9jB1X/ycEjUE3WrIJ3IjV/Vf+gskhWLcqqeXfvNnkDtBR7epllAm88A==} + '@oxc-parser/binding-freebsd-x64@0.153.0': + resolution: {integrity: sha512-fWRcv2pMSh1qtez46MOu8vuUJ5fiaQZPHSphbWulbL7SHBMKfRgZl2PzjXZYQJbq7NEXyXbgIuIuUm+/Rmkv8w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxc-parser/binding-linux-arm-gnueabihf@0.150.0': - resolution: {integrity: sha512-A/hycCFjLUrCmLoL5O/vBp40ohlaXO1Ta3v5hqYZxicYFs129wZmgZJggcW4mYGYbZebQLhup+N8JjeQl8qwyw==} + '@oxc-parser/binding-linux-arm-gnueabihf@0.153.0': + resolution: {integrity: sha512-paZeUK1GXShl/bOJQET1/8AQxayFeuN4SIWAkgTRxE7ZQwv9uYSB2n0648smygP22N7jcI3zxAm0Z+ALNiIKxg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.150.0': - resolution: {integrity: sha512-pbqahg1Pkz7J4RKmXm30s/iQu99hv64ayXCu8P4p75HcEH5azOdR4eGqiB6lFGkFR3mMpzaYsSKLkS8oJbjmeQ==} + '@oxc-parser/binding-linux-arm-musleabihf@0.153.0': + resolution: {integrity: sha512-qFPp5NwMf4K1C0O+DCVGmcbOaYyYAq98Rvv9p4VSfb777iUwlJCqMUxf6QG9N5f5ls4TEX6LitOZHi+6GL6rYQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm64-gnu@0.150.0': - resolution: {integrity: sha512-HV11aRbBQGwqv8bEo+K/6qr88uB4fEe1mhXncMhlVCrj+WpBSraxrUzHaPVmeQRU6x6x8v/3DuCbbo93rpp+fw==} + '@oxc-parser/binding-linux-arm64-gnu@0.153.0': + resolution: {integrity: sha512-oufEhZCX7saeo27Logra8cvBR1jQ/yw2zUI2hHmWw3qA/XYqEW31FOvLQBv7DWN32NjVdlcaP11WBBZTJo4k9g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-arm64-musl@0.150.0': - resolution: {integrity: sha512-k6pVkJqALwtEuP4zukVhGRhdIy4+ofChUIUUsAHHyqDZlNsknmel3JjbggrJiWGaes6h/dIcWmEXsKW4SmK9oQ==} + '@oxc-parser/binding-linux-arm64-musl@0.153.0': + resolution: {integrity: sha512-zXYzuAqng85h6+LI3iRm0zeMLX1/K2z41ZAMWxVRgt0D10VvZUaV5q+TEB46KDhoKBpdexoTLC6QoB/EiP2oqQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxc-parser/binding-linux-ppc64-gnu@0.150.0': - resolution: {integrity: sha512-tEFg39mw/rHO5n8GK2DR4ZMFfsPQZtnQIPbsIpjoQRomJc/2tRfsCSmCT6gNit+NZGoeJG5aH9ATDH5bf0WnoQ==} + '@oxc-parser/binding-linux-ppc64-gnu@0.153.0': + resolution: {integrity: sha512-J7+NLwLEzdkKM9cKyPHH/AjXXstWOs98KYgLrPPnO4N9MO8EZRBfPNnBcS3S67uMOBkRpUmCl2FhRnWdQ5CbBA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-gnu@0.150.0': - resolution: {integrity: sha512-0JO7IFkoek6HqV589Menx3hJySNXi6quRhO4tq2P7kpEHKEXoDATnoPVUpn5B7gDH2KLkdo751N0uIrGJFCTCw==} + '@oxc-parser/binding-linux-riscv64-gnu@0.153.0': + resolution: {integrity: sha512-sD0K11GQTLWylln54nPMMTtgmBbQrR5It/vMpZpy/fogiw8O2AvIE+9LuWUXddrWk9zvFIHGRcSgFn4IHOfoYg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-musl@0.150.0': - resolution: {integrity: sha512-7XPzREnyAS5wHU9aB+49Uaqgoo1gVCklHc3DRlc3fJy2tXD/eAJFN1QFz/crj+Ulup5P1+axNREF+/RGaB/IRA==} + '@oxc-parser/binding-linux-riscv64-musl@0.153.0': + resolution: {integrity: sha512-7L66uql2BhvSz51LwfExjOdn6et/ydTiQxl23VApdKzJhTc3TczA1Qt6VR/UcvlQrL2ZbytIJb447vh7p5wmUw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxc-parser/binding-linux-s390x-gnu@0.150.0': - resolution: {integrity: sha512-7n7ZxcbRWDFaTdyj8M8p0O9OfzoMKm8O6syBAIgcSutbOALq0Bb9G52Me+XH0anMLZV+NgXc726gqgG2q39vcQ==} + '@oxc-parser/binding-linux-s390x-gnu@0.153.0': + resolution: {integrity: sha512-hXV3T7mNyrPR19rbPYkglkQJtoM/UNo/xwbZeeqdAxEg8PXgb4LXXuxPpGgI4bzRRCWwLUxdDSS58xIyC2u1TA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-gnu@0.150.0': - resolution: {integrity: sha512-Vx0GSA9ZCRTUiczoEQnIIyXkMvtEY8uc6IiwLQtMe5ci2sXPqjrry0Ek5fsPP1k2kCzkML3ow9UOOEgnEDi7Bw==} + '@oxc-parser/binding-linux-x64-gnu@0.153.0': + resolution: {integrity: sha512-Da8Vqs1xdtoDYtEjmozD7wGgJeLBQkMbR0WUBECOSxodyX5DXy8ySlvJWbukyO2Q0+TM9EK+4LT6tbq0jCg4hQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-musl@0.150.0': - resolution: {integrity: sha512-ii4/9m3viDLssMnfXU7/Pni/3nYplApuGayceX4qsVGaqqQJCx3tHIH9M/HWIeSty5i8LjS21zPYT6lVIkwLxw==} + '@oxc-parser/binding-linux-x64-musl@0.153.0': + resolution: {integrity: sha512-zGAPxNTIIw6X5WyTRscIFE/oDjpdNtrrl32ing6NOXdGjzRucadnxBilexLdeYQ9YxixF93GujpXyQ0jw7ddSg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxc-parser/binding-openharmony-arm64@0.150.0': - resolution: {integrity: sha512-ZtoxX5rez36ZWkwtiEhjkCPnlTPoQ2I7lIL0IYZ1yjxMYohbvoOjBmUIZzrf9W/HouONq0omIfTeCWEY+R380w==} + '@oxc-parser/binding-openharmony-arm64@0.153.0': + resolution: {integrity: sha512-GoHzpqP5XyPIp9DHokoEdCp+K4UPl/h1neFj1uXnUB3pJYyOQ7NOhFVOttNUgCGcj2eywAvu5cRivTOSq4S10g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxc-parser/binding-win32-arm64-msvc@0.150.0': - resolution: {integrity: sha512-VqeRb5JX/bKYBrff7TUDvJyKY0914UzuCkuXIGxJS4FUmvMNfqkCbc7Sq90iMz9DlmAtlggwaBYQ9eg3h3ltiw==} + '@oxc-parser/binding-win32-arm64-msvc@0.153.0': + resolution: {integrity: sha512-xGcy12tO9k7zFbeyQzEuilfWfQpyRq23/fLPfN3wjSWuWv58k46fQT1hsO1KFNykZuVGW9xSJE/z592TmAoSDA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxc-parser/binding-win32-ia32-msvc@0.150.0': - resolution: {integrity: sha512-EPqJfeZ4Pgg2BJSsCV8GozxV0FDltRzpVtGVa1r2noJu1iu+opOw3gtBWXwIo9odCT/MdFfyHxdy0/CRqs3OqA==} + '@oxc-parser/binding-win32-ia32-msvc@0.153.0': + resolution: {integrity: sha512-o1ykUjWncvXX6N5a4KebgLjtD8zRui+f1llMhSGoSC9oP2KOqapRpdwmZ3NcNG0axFouwVKmhGBjd+IhA8BksA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.150.0': - resolution: {integrity: sha512-n5YMzbqwPQqozbkrexi0lNZrUz5cnPHalYpFWe6Dau7AmKIWNo+y24IwzDuZEQtEdUHuKhXmMMih/MPjOI+CMw==} + '@oxc-parser/binding-win32-x64-msvc@0.153.0': + resolution: {integrity: sha512-gxQz7G96Up136fd+2zWrP+o6FYGs9NO4Dyv55IoeJFJUDwLFHcLYY11hhA5wQKs0HoM57Q8esQ3nEVhnCdsjAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxc-project/types@0.148.0': - resolution: {integrity: sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==} + '@oxc-project/types@0.153.0': + resolution: {integrity: sha512-jSNrRIyvPVLL5E1z/tS5zLAprosGz/FuI1PWwEOz59j3E4TTTzSpqKb/RDGqJhhW0QHYISGXxq582wGx6T11Tw==} - '@oxc-project/types@0.150.0': - resolution: {integrity: sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==} + '@oxc-project/types@0.154.0': + resolution: {integrity: sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA==} '@oxc-resolver/binding-android-arm-eabi@11.24.2': resolution: {integrity: sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==} @@ -562,98 +547,98 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-android-arm-eabi@1.2.7': - resolution: {integrity: sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==} + '@rolldown/binding-android-arm-eabi@1.2.14': + resolution: {integrity: sha512-aWR+XKH9+rW7m5fWq/5360J3mHycrx/o6xZM2DQFdJnTMdyP7/WzxPjhtLbVWdKo2y612/4U1bWqb3HQhiF7vg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@rolldown/binding-android-arm64@1.2.7': - resolution: {integrity: sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==} + '@rolldown/binding-android-arm64@1.2.14': + resolution: {integrity: sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.7': - resolution: {integrity: sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==} + '@rolldown/binding-darwin-arm64@1.2.14': + resolution: {integrity: sha512-lTQOzHuBIooh3jIr5XINQkjPGEuGy+Dsy0meXDr6Sjty0b99kYgGh4uBC/8mJX1T0kC8d6S0aPP1Y+bHkh6aBw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.7': - resolution: {integrity: sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==} + '@rolldown/binding-darwin-x64@1.2.14': + resolution: {integrity: sha512-hyMKEGatjmBYCs/Q4sbIcL/GqpFEqsX3wc+HYVQ/85A4rxc1o7rPm4DUI4GV4k/h0ITddwFSGpqQunI14GXjTA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.7': - resolution: {integrity: sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==} + '@rolldown/binding-freebsd-x64@1.2.14': + resolution: {integrity: sha512-u371GbXoVXrEgP20PwzoGNOdAOqAMhzo19JzzY+V4YmmnC+DTOoqdbMu+O+54emM59Mik/UdrtWgcuEDKWRPKA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.7': - resolution: {integrity: sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.14': + resolution: {integrity: sha512-BqwKsdZQf6EqVWr8fv2MrDYzAvOZ7+NYFSJESRGs87fkseEhs0TU9TXgRJTkZoRRkxTizyEg1LKUXfU3/78uqg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.7': - resolution: {integrity: sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==} + '@rolldown/binding-linux-arm64-gnu@1.2.14': + resolution: {integrity: sha512-SD9kY8M009x/7s57Z1dgUVlP5+uYBgKQK0Tkr1WIWngrtUJmRCW1RJFMY7QDla2khXhmg2i5Io7MUjcmZNZ/KQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.7': - resolution: {integrity: sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==} + '@rolldown/binding-linux-arm64-musl@1.2.14': + resolution: {integrity: sha512-BJ2CL19M6uuWesMgnqJzgxoI+N+eV7b0A9O9vLV42y+gitC41fNa8KElau1tHVzuLWX5GzEuxMPhAO0tQXQMkg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.7': - resolution: {integrity: sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==} + '@rolldown/binding-linux-ppc64-gnu@1.2.14': + resolution: {integrity: sha512-4+Kl8daPV8NDHaD7mfCcc1pRM+Qg7ab8DyMm5FG5WoZgv4h2i3KFN1CybYBNbQqmuYm7ftJLvmMI1eHYJ22S/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.7': - resolution: {integrity: sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==} + '@rolldown/binding-linux-s390x-gnu@1.2.14': + resolution: {integrity: sha512-V/h8ePq1fKDrmtFMz6xcCN3DKvuvMRrwwD1q0PkBeeo4DpK64biaKvqWGVxqCeYKqeRk7gE7/iKPxLCn08O97A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.7': - resolution: {integrity: sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==} + '@rolldown/binding-linux-x64-gnu@1.2.14': + resolution: {integrity: sha512-WxalXzgrLVpKC93xfpaJ3gCXUWzeCr+FRCbDVD2mUAy4L6Vo3lNVz0epUEUpxPWJkLNYUwM4OSIikv36OJ9mLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.7': - resolution: {integrity: sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==} + '@rolldown/binding-linux-x64-musl@1.2.14': + resolution: {integrity: sha512-3G3tnAmTpdk9jO3GQtyHXqeFD2SlecfTws/Y3M2mmj9nMBwwuLT4kur8sZKeu7ENUHSpVO3cIsm5A52LEWWwlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.7': - resolution: {integrity: sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==} + '@rolldown/binding-openharmony-arm64@1.2.14': + resolution: {integrity: sha512-qyr5XiNGxm2ytx17vvtcJ9nXn6v1gENETi503bJx3OGwZ1tSonj7BosxbMa/xeAfSl5iS9X6KjEWYXLu6v1L7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.7': - resolution: {integrity: sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==} + '@rolldown/binding-win32-arm64-msvc@1.2.14': + resolution: {integrity: sha512-oA4o5o0S2yB199YyYXDzKUv1Z56Rc+mgOjwm7Z/vJ9Z8igiDPYvoOuDyo6g7AK/ZaF09nPhDKVnGBcYHO11GXA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.7': - resolution: {integrity: sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==} + '@rolldown/binding-win32-x64-msvc@1.2.14': + resolution: {integrity: sha512-9mE94bf2GZUaR/fUSXCMpBoWkctu421Mi0ORpm4zqfbkjKep7RxzPFa5etcGs5h+2KApoWBOA/hAJa/7saGgEQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -661,144 +646,6 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@rollup/rollup-android-arm-eabi@4.63.1': - resolution: {integrity: sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.63.1': - resolution: {integrity: sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.63.1': - resolution: {integrity: sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.63.1': - resolution: {integrity: sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.63.1': - resolution: {integrity: sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.63.1': - resolution: {integrity: sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.63.1': - resolution: {integrity: sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm-musleabihf@4.63.1': - resolution: {integrity: sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==} - cpu: [arm] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-arm64-gnu@4.63.1': - resolution: {integrity: sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm64-musl@4.63.1': - resolution: {integrity: sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-loong64-gnu@4.63.1': - resolution: {integrity: sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==} - cpu: [loong64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-loong64-musl@4.63.1': - resolution: {integrity: sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==} - cpu: [loong64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-ppc64-gnu@4.63.1': - resolution: {integrity: sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-ppc64-musl@4.63.1': - resolution: {integrity: sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==} - cpu: [ppc64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-riscv64-gnu@4.63.1': - resolution: {integrity: sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-riscv64-musl@4.63.1': - resolution: {integrity: sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-s390x-gnu@4.63.1': - resolution: {integrity: sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-x64-gnu@4.63.1': - resolution: {integrity: sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-x64-musl@4.63.1': - resolution: {integrity: sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@rollup/rollup-openbsd-x64@4.63.1': - resolution: {integrity: sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.63.1': - resolution: {integrity: sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==} - cpu: [arm64] - os: [openharmony] - - '@rollup/rollup-win32-arm64-msvc@4.63.1': - resolution: {integrity: sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.63.1': - resolution: {integrity: sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.63.1': - resolution: {integrity: sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.63.1': - resolution: {integrity: sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==} - cpu: [x64] - os: [win32] - '@tybys/wasm-util@0.10.4': resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} @@ -817,8 +664,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@26.4.1': - resolution: {integrity: sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==} + '@types/node@26.6.5': + resolution: {integrity: sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==} '@typescript/typescript-aix-ppc64@7.0.2': resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} @@ -940,36 +787,36 @@ packages: cpu: [x64] os: [win32] - '@vitest/coverage-v8@5.0.0': - resolution: {integrity: sha512-toMg6PZGCIa/lQNCDoASrfb1ly4hsUKXFtFYC9kD4t78o5Y6LyNJU7AENt8eHPr3quYdxaxK7hj2mnbFfUk9NA==} + '@vitest/coverage-v8@5.0.4': + resolution: {integrity: sha512-P5YcQY8Y6RmoE9xRXI38rT8pssbcubEzqtYTM2XQoxOXMDn04nRaTI1SM8qCl9/NfW3ag9GlzdSXu7IwO5Ft8A==} peerDependencies: - '@vitest/browser': 5.0.0 - vitest: 5.0.0 + '@vitest/browser': 5.0.4 + vitest: 5.0.4 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/istanbul-lib-coverage@1.0.1': - resolution: {integrity: sha512-k3DJZ8LhMBK9NS4SclF1ASD3OgXEWDorbIcPTRDK0/Zae6fRvu+fJRxtFdLfHsa9Y24beCdPnoNZ4LviTNstfA==} + '@vitest/istanbul-lib-coverage@1.0.2': + resolution: {integrity: sha512-9J/JMwOf9AoJhAywhrn7ScKTL38hsWQP/qPG60OtaAFcQ5OXPwKsxZFlbnuCKmZ61m8/lGgHYnFpdyQZUvG/iA==} engines: {node: '>=22'} - '@vitest/istanbul-lib-report@1.0.1': - resolution: {integrity: sha512-1EOLRfsTMnyAr3+kEAsP4o9dhaDlGPpD7H5iLBBeq//YpNB1VIahkPhB+eRp9N2Dkfw8oySROjE3yf9XDeaIkQ==} + '@vitest/istanbul-lib-report@1.0.2': + resolution: {integrity: sha512-gUsfXZJbzPamoIY5TvHFiMMoXESBrUMo+xqaj+rYrWI69+EnvRlYBlP96ZnHPY4vX8kyUpgAnFUCg5wZG/HkDQ==} engines: {node: '>=22'} - '@vitest/mocker@5.0.0': - resolution: {integrity: sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==} + '@vitest/mocker@5.0.4': + resolution: {integrity: sha512-tqAlrYWce4iUxhr3ncNohejtCTOcHeE8XWrSNZY3OhPoDn01yeGv+gnaBy64ATp7o6pb03eIbBAjzmibpc9vIQ==} peerDependencies: - msw: ^2.4.9 - vite: 6.4.3 + msw: ^2.4.9 || ^3.0.0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/spy@5.0.0': - resolution: {integrity: sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==} + '@vitest/spy@5.0.4': + resolution: {integrity: sha512-MZKk/gSkm2q+ICobMxCpH1mA+cCAWm8WV7UhxlqGjq/sJ3AGc1BqFOs5CRVXxH78wQtme9q/NAAgBquj4AcyMw==} acorn@8.18.0: resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} @@ -980,14 +827,14 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-v8-to-istanbul@1.0.5: - resolution: {integrity: sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==} + ast-v8-to-istanbul@1.0.7: + resolution: {integrity: sha512-kFL68AG6ajd8fg248zwM9GQrUWEp79gsmjum34OEXjs4yHuUMZfYKwOLW9GMmB4oNvVrj+EAGxsP7ye2UR9UlA==} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - chai@6.2.2: - resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + chai@6.3.0: + resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==} engines: {node: '>=18'} commander@2.20.3: @@ -1006,18 +853,9 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - dotenv@17.4.2: - resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} - engines: {node: '>=12'} - es-module-lexer@2.3.2: resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} - engines: {node: '>=18'} - hasBin: true - estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -1032,14 +870,14 @@ packages: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} peerDependencies: - picomatch: 4.0.4 + picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - formatly@0.7.1: - resolution: {integrity: sha512-ESuCEJE0SGgabl9q+zABI8LhJDmF+8nhpuqDzuM48HfJ9QTD5o6PqFJDFZY7w6f8xsh5lixuj5nJsQNvYOWvKQ==} - engines: {node: '>=18.3.0'} + formatly@0.11.4: + resolution: {integrity: sha512-TeCC10lP8KCgoX+Fe5lryILIT0/Dy+nP0OSVnsuB5CwXoLuOdqxCYlPFF1inR8S/zTy1ec7TjhS2TeRKWzzImA==} + engines: {node: '>=18.14.0'} hasBin: true fsevents@2.3.3: @@ -1060,105 +898,105 @@ packages: js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} - knip@6.39.0: - resolution: {integrity: sha512-Y7g6Ve1ATMox1u1v+gx3z9LTlvzVLTJISm/LVn9TgBU4qc7OoC63AWGO8qCFPVDDdaqlYdXkDDvvO1METBfTRw==} + knip@6.41.0: + resolution: {integrity: sha512-DrhQlIuV6xScd5Q+WTF1znd1w41QzxFGCtAHXCajsH/ndGMotHoNYbdXbuFtzW3mIOmniHtZ7zCtvnQkUmJtQQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} - magic-string@1.2.3: - resolution: {integrity: sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==} + magic-string@1.4.3: + resolution: {integrity: sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ==} - magicast@0.5.4: - resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==} + magicast@0.5.5: + resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.18: - resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + nanoid@3.3.20: + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - obug@2.1.4: - resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} engines: {node: '>=12.20.0'} - oxc-parser@0.150.0: - resolution: {integrity: sha512-zwajKw1GUa57IOdafIS7/yOObGF2NihwIfZfs5yJTRprMSkiwhWOc/k+n8bwnUPbHr2/XsjfBO8KyTPaW3VpWg==} + oxc-parser@0.153.0: + resolution: {integrity: sha512-cEnpyyV1OJRXv++SFNw0z8i+2o/cr88rVLaOYJafELDoHM5yHvCAbwGRLvxuany6SNLcbblSMUyZaGzH+quSYg==} engines: {node: ^20.19.0 || >=22.12.0} oxc-resolver@11.24.2: @@ -1170,50 +1008,42 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} - playwright-core@1.63.0: - resolution: {integrity: sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==} + playwright-core@1.64.0: + resolution: {integrity: sha512-T9r+MZkTECl2+oUcZ26YgZzTrYidTsIhYYkJix+6iDOymOb1FB2RLLSOxRGnZGv5DStt+aduIVbt+E8WygXYpg==} engines: {node: '>=20'} hasBin: true - playwright@1.63.0: - resolution: {integrity: sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==} + playwright@1.64.0: + resolution: {integrity: sha512-kVzTnYFYEyQ9RGzBjNCd2+yEqWmVbxl3AHPynv3qQ6JTjv4a+kwRcnqQwIpuP3NnrnIrE/Q6wWAIAvMfIE2/Yg==} engines: {node: '>=20'} hasBin: true - postcss@8.5.28: - resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} + postcss@8.5.30: + resolution: {integrity: sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==} engines: {node: ^10 || ^12 || >=14} resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - rolldown@1.2.7: - resolution: {integrity: sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==} + rolldown@1.2.14: + resolution: {integrity: sha512-eTBTTqMR6uHKLgcUqpJP8ntzDI6V4LYA8negAMBEI7gkgVvOdrx6VsvS2Ym+83KhOPdLCHWJu0w7UQFJZhHKNw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@4.63.1: - resolution: {integrity: sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - sax@1.6.1: resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} engines: {node: '>=11.0.0'} - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - smol-toml@1.9.0: resolution: {integrity: sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ==} engines: {node: '>= 18'} - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} source-map-support@0.5.21: @@ -1223,11 +1053,8 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - - std-env@4.2.0: - resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + std-env@4.3.0: + resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} strip-json-comments@5.0.3: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} @@ -1238,20 +1065,20 @@ packages: engines: {node: '>=10'} hasBin: true - tinybench@6.1.4: - resolution: {integrity: sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==} + tinybench@6.2.2: + resolution: {integrity: sha512-nIZ2N2dFpjBsg2hgitKu7mA+FvsIJuGJOwysRngmVRRmWgR/UyPjwJj8c/fT/dhm8EkHnF5EOogRf+0Z2qrimA==} engines: {node: '>=20.0.0'} - tinyexec@1.3.0: - resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinyrainbow@3.1.1: - resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} + tinyrainbow@3.2.0: + resolution: {integrity: sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==} engines: {node: '>=14.0.0'} tslib@2.8.1: @@ -1262,38 +1089,41 @@ packages: engines: {node: '>=16.20.0'} hasBin: true - unbash@4.0.12: - resolution: {integrity: sha512-PnKvRX+Fbxl/usVlTr/31tXIOVAH+8OdC9qaxUQcvurwEnoc3Vk/ipi2Ce8IjMxzK9byfSGdsUBjqqJGc1o5lw==} + unbash@5.1.0: + resolution: {integrity: sha512-YVGyy4XqoZ2AVgHjVdL9cchMSurlXFHWviORa8RiU/Bnol4ooW5Lpyur/5XmbgDdyCKxymmgsEQsLGBMIJ/Agg==} engines: {node: '>=14'} - undici-types@8.3.0: - resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + undici-types@8.9.0: + resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} - vite@6.4.3: - resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@8.3.4: + resolution: {integrity: sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.7.1 + esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -1309,23 +1139,23 @@ packages: yaml: optional: true - vitest@5.0.0: - resolution: {integrity: sha512-gpsMNoRhMjMktVxPtstOH4/PJuPyovVaMDr4oDilXaGH1EcqM2OE96SoHT2VIQ6fTGtTjqmHDrEu2X9RQiXf8Q==} + vitest@5.0.4: + resolution: {integrity: sha512-z0WxZRV2Sg48wF0FSgMq3TFG8JS38/Qr96vZVZdX6+Em9raQTvnXQvdTFJe2m3rfyJnEHeHQ/snceIdi8D1pVg==} engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 5.0.0 - '@vitest/browser-preview': 5.0.0 + '@vitest/browser-playwright': 5.0.4 + '@vitest/browser-preview': 5.0.4 '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 - '@vitest/coverage-istanbul': 5.0.0 - '@vitest/coverage-v8': 5.0.0 - '@vitest/ui': 5.0.0 + '@vitest/coverage-istanbul': 5.0.4 + '@vitest/coverage-v8': 5.0.4 + '@vitest/ui': 5.0.4 happy-dom: '*' jsdom: '*' - vite: 6.4.3 + vite: ^6.4.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -1354,9 +1184,9 @@ packages: resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} engines: {node: 20 || >=22} - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + why-is-node-running@3.2.1: + resolution: {integrity: sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==} + engines: {node: '>=20.11'} hasBin: true xml-js@1.6.11: @@ -1388,39 +1218,39 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@biomejs/biome@2.5.12': + '@biomejs/biome@2.5.15': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.5.12 - '@biomejs/cli-darwin-x64': 2.5.12 - '@biomejs/cli-linux-arm64': 2.5.12 - '@biomejs/cli-linux-arm64-musl': 2.5.12 - '@biomejs/cli-linux-x64': 2.5.12 - '@biomejs/cli-linux-x64-musl': 2.5.12 - '@biomejs/cli-win32-arm64': 2.5.12 - '@biomejs/cli-win32-x64': 2.5.12 + '@biomejs/cli-darwin-arm64': 2.5.15 + '@biomejs/cli-darwin-x64': 2.5.15 + '@biomejs/cli-linux-arm64': 2.5.15 + '@biomejs/cli-linux-arm64-musl': 2.5.15 + '@biomejs/cli-linux-x64': 2.5.15 + '@biomejs/cli-linux-x64-musl': 2.5.15 + '@biomejs/cli-win32-arm64': 2.5.15 + '@biomejs/cli-win32-x64': 2.5.15 - '@biomejs/cli-darwin-arm64@2.5.12': + '@biomejs/cli-darwin-arm64@2.5.15': optional: true - '@biomejs/cli-darwin-x64@2.5.12': + '@biomejs/cli-darwin-x64@2.5.15': optional: true - '@biomejs/cli-linux-arm64-musl@2.5.12': + '@biomejs/cli-linux-arm64-musl@2.5.15': optional: true - '@biomejs/cli-linux-arm64@2.5.12': + '@biomejs/cli-linux-arm64@2.5.15': optional: true - '@biomejs/cli-linux-x64-musl@2.5.12': + '@biomejs/cli-linux-x64-musl@2.5.15': optional: true - '@biomejs/cli-linux-x64@2.5.12': + '@biomejs/cli-linux-x64@2.5.15': optional: true - '@biomejs/cli-win32-arm64@2.5.12': + '@biomejs/cli-win32-arm64@2.5.15': optional: true - '@biomejs/cli-win32-x64@2.5.12': + '@biomejs/cli-win32-x64@2.5.15': optional: true '@emnapi/core@1.11.2': @@ -1439,84 +1269,6 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.12': - optional: true - - '@esbuild/android-arm64@0.25.12': - optional: true - - '@esbuild/android-arm@0.25.12': - optional: true - - '@esbuild/android-x64@0.25.12': - optional: true - - '@esbuild/darwin-arm64@0.25.12': - optional: true - - '@esbuild/darwin-x64@0.25.12': - optional: true - - '@esbuild/freebsd-arm64@0.25.12': - optional: true - - '@esbuild/freebsd-x64@0.25.12': - optional: true - - '@esbuild/linux-arm64@0.25.12': - optional: true - - '@esbuild/linux-arm@0.25.12': - optional: true - - '@esbuild/linux-ia32@0.25.12': - optional: true - - '@esbuild/linux-loong64@0.25.12': - optional: true - - '@esbuild/linux-mips64el@0.25.12': - optional: true - - '@esbuild/linux-ppc64@0.25.12': - optional: true - - '@esbuild/linux-riscv64@0.25.12': - optional: true - - '@esbuild/linux-s390x@0.25.12': - optional: true - - '@esbuild/linux-x64@0.25.12': - optional: true - - '@esbuild/netbsd-arm64@0.25.12': - optional: true - - '@esbuild/netbsd-x64@0.25.12': - optional: true - - '@esbuild/openbsd-arm64@0.25.12': - optional: true - - '@esbuild/openbsd-x64@0.25.12': - optional: true - - '@esbuild/openharmony-arm64@0.25.12': - optional: true - - '@esbuild/sunos-x64@0.25.12': - optional: true - - '@esbuild/win32-arm64@0.25.12': - optional: true - - '@esbuild/win32-ia32@0.25.12': - optional: true - - '@esbuild/win32-x64@0.25.12': - optional: true - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.6.0 @@ -1538,9 +1290,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.6.0 - '@napi-rs/lzma-linux-x64-gnu@1.5.1': - optional: true - '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: '@emnapi/core': 1.11.2 @@ -1548,66 +1297,66 @@ snapshots: '@tybys/wasm-util': 0.10.4 optional: true - '@oxc-parser/binding-android-arm-eabi@0.150.0': + '@oxc-parser/binding-android-arm-eabi@0.153.0': optional: true - '@oxc-parser/binding-android-arm64@0.150.0': + '@oxc-parser/binding-android-arm64@0.153.0': optional: true - '@oxc-parser/binding-darwin-arm64@0.150.0': + '@oxc-parser/binding-darwin-arm64@0.153.0': optional: true - '@oxc-parser/binding-darwin-x64@0.150.0': + '@oxc-parser/binding-darwin-x64@0.153.0': optional: true - '@oxc-parser/binding-freebsd-x64@0.150.0': + '@oxc-parser/binding-freebsd-x64@0.153.0': optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.150.0': + '@oxc-parser/binding-linux-arm-gnueabihf@0.153.0': optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.150.0': + '@oxc-parser/binding-linux-arm-musleabihf@0.153.0': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.150.0': + '@oxc-parser/binding-linux-arm64-gnu@0.153.0': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.150.0': + '@oxc-parser/binding-linux-arm64-musl@0.153.0': optional: true - '@oxc-parser/binding-linux-ppc64-gnu@0.150.0': + '@oxc-parser/binding-linux-ppc64-gnu@0.153.0': optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.150.0': + '@oxc-parser/binding-linux-riscv64-gnu@0.153.0': optional: true - '@oxc-parser/binding-linux-riscv64-musl@0.150.0': + '@oxc-parser/binding-linux-riscv64-musl@0.153.0': optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.150.0': + '@oxc-parser/binding-linux-s390x-gnu@0.153.0': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.150.0': + '@oxc-parser/binding-linux-x64-gnu@0.153.0': optional: true - '@oxc-parser/binding-linux-x64-musl@0.150.0': + '@oxc-parser/binding-linux-x64-musl@0.153.0': optional: true - '@oxc-parser/binding-openharmony-arm64@0.150.0': + '@oxc-parser/binding-openharmony-arm64@0.153.0': optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.150.0': + '@oxc-parser/binding-win32-arm64-msvc@0.153.0': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.150.0': + '@oxc-parser/binding-win32-ia32-msvc@0.153.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.150.0': + '@oxc-parser/binding-win32-x64-msvc@0.153.0': optional: true - '@oxc-project/types@0.148.0': {} + '@oxc-project/types@0.153.0': {} - '@oxc-project/types@0.150.0': {} + '@oxc-project/types@0.154.0': {} '@oxc-resolver/binding-android-arm-eabi@11.24.2': optional: true @@ -1670,128 +1419,53 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@11.24.2': optional: true - '@rolldown/binding-android-arm-eabi@1.2.7': + '@rolldown/binding-android-arm-eabi@1.2.14': optional: true - '@rolldown/binding-android-arm64@1.2.7': + '@rolldown/binding-android-arm64@1.2.14': optional: true - '@rolldown/binding-darwin-arm64@1.2.7': + '@rolldown/binding-darwin-arm64@1.2.14': optional: true - '@rolldown/binding-darwin-x64@1.2.7': + '@rolldown/binding-darwin-x64@1.2.14': optional: true - '@rolldown/binding-freebsd-x64@1.2.7': + '@rolldown/binding-freebsd-x64@1.2.14': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.7': + '@rolldown/binding-linux-arm-gnueabihf@1.2.14': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.7': + '@rolldown/binding-linux-arm64-gnu@1.2.14': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.7': + '@rolldown/binding-linux-arm64-musl@1.2.14': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.7': + '@rolldown/binding-linux-ppc64-gnu@1.2.14': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.7': + '@rolldown/binding-linux-s390x-gnu@1.2.14': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.7': + '@rolldown/binding-linux-x64-gnu@1.2.14': optional: true - '@rolldown/binding-linux-x64-musl@1.2.7': + '@rolldown/binding-linux-x64-musl@1.2.14': optional: true - '@rolldown/binding-openharmony-arm64@1.2.7': + '@rolldown/binding-openharmony-arm64@1.2.14': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.7': + '@rolldown/binding-win32-arm64-msvc@1.2.14': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.7': + '@rolldown/binding-win32-x64-msvc@1.2.14': optional: true '@rolldown/pluginutils@1.0.1': {} - '@rollup/rollup-android-arm-eabi@4.63.1': - optional: true - - '@rollup/rollup-android-arm64@4.63.1': - optional: true - - '@rollup/rollup-darwin-arm64@4.63.1': - optional: true - - '@rollup/rollup-darwin-x64@4.63.1': - optional: true - - '@rollup/rollup-freebsd-arm64@4.63.1': - optional: true - - '@rollup/rollup-freebsd-x64@4.63.1': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.63.1': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.63.1': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.63.1': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.63.1': - optional: true - - '@rollup/rollup-linux-loong64-gnu@4.63.1': - optional: true - - '@rollup/rollup-linux-loong64-musl@4.63.1': - optional: true - - '@rollup/rollup-linux-ppc64-gnu@4.63.1': - optional: true - - '@rollup/rollup-linux-ppc64-musl@4.63.1': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.63.1': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.63.1': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.63.1': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.63.1': - optional: true - - '@rollup/rollup-linux-x64-musl@4.63.1': - optional: true - - '@rollup/rollup-openbsd-x64@4.63.1': - optional: true - - '@rollup/rollup-openharmony-arm64@4.63.1': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.63.1': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.63.1': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.63.1': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.63.1': - optional: true - '@tybys/wasm-util@0.10.4': dependencies: tslib: 2.8.1 @@ -1812,9 +1486,9 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@26.4.1': + '@types/node@26.6.5': dependencies: - undici-types: 8.3.0 + undici-types: 8.9.0 '@typescript/typescript-aix-ppc64@7.0.2': optional: true @@ -1876,41 +1550,41 @@ snapshots: '@typescript/typescript-win32-x64@7.0.2': optional: true - '@vitest/coverage-v8@5.0.0(vitest@5.0.0)': + '@vitest/coverage-v8@5.0.4(vitest@5.0.4)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/istanbul-lib-coverage': 1.0.1 - '@vitest/istanbul-lib-report': 1.0.1 - ast-v8-to-istanbul: 1.0.5 - magicast: 0.5.4 - obug: 2.1.4 - std-env: 4.2.0 - tinyrainbow: 3.1.1 - vitest: 5.0.0(@types/node@26.4.1)(@vitest/coverage-v8@5.0.0)(vite@6.4.3(@types/node@26.4.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.9.1)) - - '@vitest/istanbul-lib-coverage@1.0.1': {} - - '@vitest/istanbul-lib-report@1.0.1': + '@vitest/istanbul-lib-coverage': 1.0.2 + '@vitest/istanbul-lib-report': 1.0.2 + ast-v8-to-istanbul: 1.0.7 + magicast: 0.5.5 + obug: 3.0.0 + std-env: 4.3.0 + tinyrainbow: 3.2.0 + vitest: 5.0.4(@types/node@26.6.5)(@vitest/coverage-v8@5.0.4)(vite@8.3.4(@types/node@26.6.5)(jiti@2.7.0)(terser@5.46.0)(yaml@2.9.1)) + + '@vitest/istanbul-lib-coverage@1.0.2': {} + + '@vitest/istanbul-lib-report@1.0.2': dependencies: - '@vitest/istanbul-lib-coverage': 1.0.1 + '@vitest/istanbul-lib-coverage': 1.0.2 - '@vitest/mocker@5.0.0(vite@6.4.3(@types/node@26.4.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.9.1))': + '@vitest/mocker@5.0.4(vite@8.3.4(@types/node@26.6.5)(jiti@2.7.0)(terser@5.46.0)(yaml@2.9.1))': dependencies: '@jridgewell/trace-mapping': 0.3.31 - '@vitest/spy': 5.0.0 + '@vitest/spy': 5.0.4 estree-walker: 3.0.3 - magic-string: 1.2.3 + magic-string: 1.4.3 optionalDependencies: - vite: 6.4.3(@types/node@26.4.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.9.1) + vite: 8.3.4(@types/node@26.6.5)(jiti@2.7.0)(terser@5.46.0)(yaml@2.9.1) - '@vitest/spy@5.0.0': {} + '@vitest/spy@5.0.4': {} acorn@8.18.0: optional: true assertion-error@2.0.1: {} - ast-v8-to-istanbul@1.0.5: + ast-v8-to-istanbul@1.0.7: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -1919,7 +1593,7 @@ snapshots: buffer-from@1.1.2: optional: true - chai@6.2.2: {} + chai@6.3.0: {} commander@2.20.3: optional: true @@ -1928,42 +1602,10 @@ snapshots: dependencies: ms: 2.1.3 - detect-libc@2.1.2: - optional: true - - dotenv@17.4.2: {} + detect-libc@2.1.2: {} es-module-lexer@2.3.2: {} - esbuild@0.25.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 - estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 @@ -1974,11 +1616,11 @@ snapshots: dependencies: walk-up-path: 4.0.0 - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.7 - formatly@0.7.1: + formatly@0.11.4: dependencies: fd-package-json: 2.0.0 package-manager-detector: 1.8.0 @@ -1996,111 +1638,109 @@ snapshots: js-tokens@10.0.0: {} - knip@6.39.0: + knip@6.41.0: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - formatly: 0.7.1 + formatly: 0.11.4 get-tsconfig: 4.14.3 jiti: 2.7.0 - oxc-parser: 0.150.0 + oxc-parser: 0.153.0 oxc-resolver: 11.24.2 - picomatch: 4.0.4 + picomatch: 4.0.7 smol-toml: 1.9.0 strip-json-comments: 5.0.3 tinyglobby: 0.2.17 - unbash: 4.0.12 + unbash: 5.1.0 yaml: 2.9.1 zod: 4.6.5 - lightningcss-android-arm64@1.32.0: + lightningcss-android-arm64@1.33.0: optional: true - lightningcss-darwin-arm64@1.32.0: + lightningcss-darwin-arm64@1.33.0: optional: true - lightningcss-darwin-x64@1.32.0: + lightningcss-darwin-x64@1.33.0: optional: true - lightningcss-freebsd-x64@1.32.0: + lightningcss-freebsd-x64@1.33.0: optional: true - lightningcss-linux-arm-gnueabihf@1.32.0: + lightningcss-linux-arm-gnueabihf@1.33.0: optional: true - lightningcss-linux-arm64-gnu@1.32.0: + lightningcss-linux-arm64-gnu@1.33.0: optional: true - lightningcss-linux-arm64-musl@1.32.0: + lightningcss-linux-arm64-musl@1.33.0: optional: true - lightningcss-linux-x64-gnu@1.32.0: + lightningcss-linux-x64-gnu@1.33.0: optional: true - lightningcss-linux-x64-musl@1.32.0: + lightningcss-linux-x64-musl@1.33.0: optional: true - lightningcss-win32-arm64-msvc@1.32.0: + lightningcss-win32-arm64-msvc@1.33.0: optional: true - lightningcss-win32-x64-msvc@1.32.0: + lightningcss-win32-x64-msvc@1.33.0: optional: true - lightningcss@1.32.0: + lightningcss@1.33.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 - optional: true - - magic-string@1.2.3: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + + magic-string@1.4.3: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 - magicast@0.5.4: + magicast@0.5.5: dependencies: '@babel/parser': 7.29.8 '@babel/types': 7.29.8 - source-map-js: 1.2.1 + source-map-js: 1.2.2 ms@2.1.3: {} - nanoid@3.3.18: {} + nanoid@3.3.20: {} - obug@2.1.4: {} + obug@3.0.0: {} - oxc-parser@0.150.0: + oxc-parser@0.153.0: dependencies: - '@oxc-project/types': 0.150.0 + '@oxc-project/types': 0.153.0 optionalDependencies: - '@oxc-parser/binding-android-arm-eabi': 0.150.0 - '@oxc-parser/binding-android-arm64': 0.150.0 - '@oxc-parser/binding-darwin-arm64': 0.150.0 - '@oxc-parser/binding-darwin-x64': 0.150.0 - '@oxc-parser/binding-freebsd-x64': 0.150.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.150.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.150.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.150.0 - '@oxc-parser/binding-linux-arm64-musl': 0.150.0 - '@oxc-parser/binding-linux-ppc64-gnu': 0.150.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.150.0 - '@oxc-parser/binding-linux-riscv64-musl': 0.150.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.150.0 - '@oxc-parser/binding-linux-x64-gnu': 0.150.0 - '@oxc-parser/binding-linux-x64-musl': 0.150.0 - '@oxc-parser/binding-openharmony-arm64': 0.150.0 - '@oxc-parser/binding-win32-arm64-msvc': 0.150.0 - '@oxc-parser/binding-win32-ia32-msvc': 0.150.0 - '@oxc-parser/binding-win32-x64-msvc': 0.150.0 + '@oxc-parser/binding-android-arm-eabi': 0.153.0 + '@oxc-parser/binding-android-arm64': 0.153.0 + '@oxc-parser/binding-darwin-arm64': 0.153.0 + '@oxc-parser/binding-darwin-x64': 0.153.0 + '@oxc-parser/binding-freebsd-x64': 0.153.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.153.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.153.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.153.0 + '@oxc-parser/binding-linux-arm64-musl': 0.153.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.153.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.153.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.153.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.153.0 + '@oxc-parser/binding-linux-x64-gnu': 0.153.0 + '@oxc-parser/binding-linux-x64-musl': 0.153.0 + '@oxc-parser/binding-openharmony-arm64': 0.153.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.153.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.153.0 + '@oxc-parser/binding-win32-x64-msvc': 0.153.0 oxc-resolver@11.24.2: optionalDependencies: @@ -2128,82 +1768,48 @@ snapshots: picocolors@1.1.1: {} - picomatch@4.0.4: {} + picomatch@4.0.7: {} - playwright-core@1.63.0: {} + playwright-core@1.64.0: {} - playwright@1.63.0: + playwright@1.64.0: dependencies: - playwright-core: 1.63.0 + playwright-core: 1.64.0 - postcss@8.5.28: + postcss@8.5.30: dependencies: - nanoid: 3.3.18 + nanoid: 3.3.20 picocolors: 1.1.1 - source-map-js: 1.2.1 + source-map-js: 1.2.2 resolve-pkg-maps@1.0.0: {} - rolldown@1.2.7: + rolldown@1.2.14: dependencies: - '@oxc-project/types': 0.148.0 + '@oxc-project/types': 0.154.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.7 - '@rolldown/binding-android-arm64': 1.2.7 - '@rolldown/binding-darwin-arm64': 1.2.7 - '@rolldown/binding-darwin-x64': 1.2.7 - '@rolldown/binding-freebsd-x64': 1.2.7 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.7 - '@rolldown/binding-linux-arm64-gnu': 1.2.7 - '@rolldown/binding-linux-arm64-musl': 1.2.7 - '@rolldown/binding-linux-ppc64-gnu': 1.2.7 - '@rolldown/binding-linux-s390x-gnu': 1.2.7 - '@rolldown/binding-linux-x64-gnu': 1.2.7 - '@rolldown/binding-linux-x64-musl': 1.2.7 - '@rolldown/binding-openharmony-arm64': 1.2.7 - '@rolldown/binding-win32-arm64-msvc': 1.2.7 - '@rolldown/binding-win32-x64-msvc': 1.2.7 - - rollup@4.63.1: - dependencies: - '@types/estree': 1.0.9 - optionalDependencies: - '@napi-rs/lzma-linux-x64-gnu': 1.5.1 - '@rollup/rollup-android-arm-eabi': 4.63.1 - '@rollup/rollup-android-arm64': 4.63.1 - '@rollup/rollup-darwin-arm64': 4.63.1 - '@rollup/rollup-darwin-x64': 4.63.1 - '@rollup/rollup-freebsd-arm64': 4.63.1 - '@rollup/rollup-freebsd-x64': 4.63.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.63.1 - '@rollup/rollup-linux-arm-musleabihf': 4.63.1 - '@rollup/rollup-linux-arm64-gnu': 4.63.1 - '@rollup/rollup-linux-arm64-musl': 4.63.1 - '@rollup/rollup-linux-loong64-gnu': 4.63.1 - '@rollup/rollup-linux-loong64-musl': 4.63.1 - '@rollup/rollup-linux-ppc64-gnu': 4.63.1 - '@rollup/rollup-linux-ppc64-musl': 4.63.1 - '@rollup/rollup-linux-riscv64-gnu': 4.63.1 - '@rollup/rollup-linux-riscv64-musl': 4.63.1 - '@rollup/rollup-linux-s390x-gnu': 4.63.1 - '@rollup/rollup-linux-x64-gnu': 4.63.1 - '@rollup/rollup-linux-x64-musl': 4.63.1 - '@rollup/rollup-openbsd-x64': 4.63.1 - '@rollup/rollup-openharmony-arm64': 4.63.1 - '@rollup/rollup-win32-arm64-msvc': 4.63.1 - '@rollup/rollup-win32-ia32-msvc': 4.63.1 - '@rollup/rollup-win32-x64-gnu': 4.63.1 - '@rollup/rollup-win32-x64-msvc': 4.63.1 - fsevents: 2.3.3 + '@rolldown/binding-android-arm-eabi': 1.2.14 + '@rolldown/binding-android-arm64': 1.2.14 + '@rolldown/binding-darwin-arm64': 1.2.14 + '@rolldown/binding-darwin-x64': 1.2.14 + '@rolldown/binding-freebsd-x64': 1.2.14 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.14 + '@rolldown/binding-linux-arm64-gnu': 1.2.14 + '@rolldown/binding-linux-arm64-musl': 1.2.14 + '@rolldown/binding-linux-ppc64-gnu': 1.2.14 + '@rolldown/binding-linux-s390x-gnu': 1.2.14 + '@rolldown/binding-linux-x64-gnu': 1.2.14 + '@rolldown/binding-linux-x64-musl': 1.2.14 + '@rolldown/binding-openharmony-arm64': 1.2.14 + '@rolldown/binding-win32-arm64-msvc': 1.2.14 + '@rolldown/binding-win32-x64-msvc': 1.2.14 sax@1.6.1: {} - siginfo@2.0.0: {} - smol-toml@1.9.0: {} - source-map-js@1.2.1: {} + source-map-js@1.2.2: {} source-map-support@0.5.21: dependencies: @@ -2214,9 +1820,7 @@ snapshots: source-map@0.6.1: optional: true - stackback@0.0.2: {} - - std-env@4.2.0: {} + std-env@4.3.0: {} strip-json-comments@5.0.3: {} @@ -2228,16 +1832,16 @@ snapshots: source-map-support: 0.5.21 optional: true - tinybench@6.1.4: {} + tinybench@6.2.2: {} - tinyexec@1.3.0: {} + tinyexec@1.3.1: {} tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 - tinyrainbow@3.1.1: {} + tinyrainbow@3.2.0: {} tslib@2.8.1: optional: true @@ -2265,54 +1869,49 @@ snapshots: '@typescript/typescript-win32-arm64': 7.0.2 '@typescript/typescript-win32-x64': 7.0.2 - unbash@4.0.12: {} + unbash@5.1.0: {} - undici-types@8.3.0: {} + undici-types@8.9.0: {} - vite@6.4.3(@types/node@26.4.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.9.1): + vite@8.3.4(@types/node@26.6.5)(jiti@2.7.0)(terser@5.46.0)(yaml@2.9.1): dependencies: - esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.28 - rollup: 4.63.1 + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.30 + rolldown: 1.2.14 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 26.4.1 + '@types/node': 26.6.5 fsevents: 2.3.3 jiti: 2.7.0 - lightningcss: 1.32.0 terser: 5.46.0 yaml: 2.9.1 - vitest@5.0.0(@types/node@26.4.1)(@vitest/coverage-v8@5.0.0)(vite@6.4.3(@types/node@26.4.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.9.1)): + vitest@5.0.4(@types/node@26.6.5)(@vitest/coverage-v8@5.0.4)(vite@8.3.4(@types/node@26.6.5)(jiti@2.7.0)(terser@5.46.0)(yaml@2.9.1)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.0(vite@6.4.3(@types/node@26.4.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.9.1)) - chai: 6.2.2 + '@vitest/mocker': 5.0.4(vite@8.3.4(@types/node@26.6.5)(jiti@2.7.0)(terser@5.46.0)(yaml@2.9.1)) + chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 - magic-string: 1.2.3 - obug: 2.1.4 - picomatch: 4.0.4 - std-env: 4.2.0 - tinybench: 6.1.4 - tinyexec: 1.3.0 + magic-string: 1.4.3 + obug: 3.0.0 + picomatch: 4.0.7 + std-env: 4.3.0 + tinybench: 6.2.2 + tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: 6.4.3(@types/node@26.4.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.9.1) - why-is-node-running: 2.3.0 + vite: 8.3.4(@types/node@26.6.5)(jiti@2.7.0)(terser@5.46.0)(yaml@2.9.1) + why-is-node-running: 3.2.1 optionalDependencies: - '@types/node': 26.4.1 - '@vitest/coverage-v8': 5.0.0(vitest@5.0.0) + '@types/node': 26.6.5 + '@vitest/coverage-v8': 5.0.4(vitest@5.0.4) transitivePeerDependencies: - msw walk-up-path@4.0.0: {} - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 + why-is-node-running@3.2.1: {} xml-js@1.6.11: dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0db48195..d05a7e7d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,12 +1,2 @@ packages: - . - -allowBuilds: - esbuild: set this to true or false - -overrides: - picomatch: 4.0.4 - postcss: 8.5.15 - serialize-javascript: 7.0.6 - vite: 6.4.3 - vite>postcss: "8.5.28" diff --git a/src/__tests__/unit/addressBook.test.ts b/src/__tests__/unit/addressBook.test.ts index de9b2ebe..447b9843 100644 --- a/src/__tests__/unit/addressBook.test.ts +++ b/src/__tests__/unit/addressBook.test.ts @@ -395,6 +395,27 @@ describe('createVCard', () => { expect(args.headers?.['content-type']).toBe('text/vcard; charset=utf-8'); expect(args.headers?.['If-None-Match']).toBe('*'); }); + + it('should keep a filename with URL syntax inside the address book', async () => { + mockedCreateObject.mockResolvedValue({ ok: true, status: 201 } as any); + + await createVCard({ + addressBook: { url: 'http://example.com/addr/' }, + vCardString: 'BEGIN:VCARD\nFN:Test\nEND:VCARD', + filename: 'urn:uuid:7?v=2.vcf', + }); + + expect(mockedCreateObject.mock.calls[0][0].url).toBe( + 'http://example.com/addr/urn:uuid:7%3Fv=2.vcf', + ); + await expect( + createVCard({ + addressBook: { url: 'http://example.com/addr/' }, + vCardString: 'BEGIN:VCARD\nFN:Test\nEND:VCARD', + filename: '/root.vcf', + }), + ).rejects.toThrow('Invalid object filename'); + }); }); describe('updateVCard', () => { diff --git a/src/__tests__/unit/authHelpers.test.ts b/src/__tests__/unit/authHelpers.test.ts index ce5eb0ae..23dbb327 100644 --- a/src/__tests__/unit/authHelpers.test.ts +++ b/src/__tests__/unit/authHelpers.test.ts @@ -331,4 +331,52 @@ describe('getOauthHeaders', () => { refresh_token: 'ref-token', }); }); + + it('should refresh a token that expires within the next minute', async () => { + const mockFetch = vi.fn().mockResolvedValue({ + ok: true, + json: vi.fn().mockResolvedValue({ access_token: 'refreshed-token', expires_in: 3600 }), + }); + + const result = await getOauthHeaders( + { + refreshToken: 'ref-token', + accessToken: 'expiring-token', + expiration: Date.now() + 30_000, + clientId: 'cid', + clientSecret: 'csecret', + tokenUrl: 'http://example.com/token', + }, + undefined, + mockFetch as any, + ); + + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(result.headers.authorization).toBe('Bearer refreshed-token'); + }); + + it.each([ + ['a number', 3600, 3600_000], + ['a numeric string', '3600', 3600_000], + ['an invalid string', 'soon', undefined], + ['zero', 0, undefined], + ])('should derive the expiration from expires_in given as %s', async (_, expiresIn, offset) => { + const now = 1_800_000_000_000; + vi.spyOn(Date, 'now').mockReturnValue(now); + const credentials = { + refreshToken: 'ref-token', + clientId: 'cid', + clientSecret: 'csecret', + tokenUrl: 'http://example.com/token', + } as Record; + const mockFetch = vi.fn().mockResolvedValue({ + ok: true, + json: vi.fn().mockResolvedValue({ access_token: 'new-token', expires_in: expiresIn }), + }); + + await getOauthHeaders(credentials, undefined, mockFetch as any); + + expect(credentials.expiration).toBe(offset == null ? undefined : now + offset); + vi.restoreAllMocks(); + }); }); diff --git a/src/__tests__/unit/calendar.test.ts b/src/__tests__/unit/calendar.test.ts index 5ff67ceb..2db80522 100644 --- a/src/__tests__/unit/calendar.test.ts +++ b/src/__tests__/unit/calendar.test.ts @@ -511,6 +511,28 @@ describe('createCalendarObject', () => { expect(callArgs.headers?.['content-type']).toBe('text/calendar; charset=utf-8'); expect(callArgs.headers?.['If-None-Match']).toBe('*'); }); + + it('should keep a UID-based filename inside the calendar', async () => { + mockedCreateObject.mockResolvedValue({ ok: true, status: 201 } as any); + + await createCalendarObject({ + calendar: { url: 'http://example.com/cal/' }, + iCalString: 'BEGIN:VCALENDAR\nEND:VCALENDAR', + filename: 'urn:uuid:42#1.ics', + }); + + expect(mockedCreateObject.mock.calls[0][0].url).toBe( + 'http://example.com/cal/urn:uuid:42%231.ics', + ); + await expect( + createCalendarObject({ + calendar: { url: 'http://example.com/cal/' }, + iCalString: 'BEGIN:VCALENDAR\nEND:VCALENDAR', + filename: '../other.ics', + }), + ).rejects.toThrow('Invalid object filename'); + expect(mockedCreateObject).toHaveBeenCalledTimes(1); + }); }); describe('updateCalendarObject', () => { diff --git a/src/__tests__/unit/client.test.ts b/src/__tests__/unit/client.test.ts index 8d90efa6..087c8b6e 100644 --- a/src/__tests__/unit/client.test.ts +++ b/src/__tests__/unit/client.test.ts @@ -414,6 +414,43 @@ describe('DAVClient login', () => { expect((client as any).authHeaders.authorization).toBe('Bearer oa-token'); }); + + it('should refresh a cached Oauth token that expires within the next minute', async () => { + const mockFetch = vi.fn(async (url: string) => + url === 'http://example.com/token' + ? new Response(JSON.stringify({ access_token: 'fresh-token', expires_in: 3600 }), { + headers: { 'content-type': 'application/json' }, + }) + : new Response('', { + status: 207, + headers: { 'content-type': 'application/xml' }, + }), + ); + const client = new DAVClient({ + serverUrl: 'http://example.com', + credentials: { + accessToken: 'expiring-token', + refreshToken: 'ref', + expiration: Date.now() + 30_000, + clientId: 'cid', + clientSecret: 'csecret', + tokenUrl: 'http://example.com/token', + }, + authMethod: 'Oauth', + fetch: mockFetch, + }); + (client as any).authHeaders = { authorization: 'Bearer expiring-token' }; + + await client.propfind({ url: 'http://example.com/cal/', props: { 'd:getetag': {} } }); + + expect(mockFetch.mock.calls.map(([url]) => url)).toEqual([ + 'http://example.com/token', + 'http://example.com/cal/', + ]); + expect(new Headers(mockFetch.mock.calls[1][1]?.headers).get('authorization')).toBe( + 'Bearer fresh-token', + ); + }); }); describe('DAVClient method delegation', () => { diff --git a/src/__tests__/unit/collection.test.ts b/src/__tests__/unit/collection.test.ts index d238b572..fc7ec7bd 100644 --- a/src/__tests__/unit/collection.test.ts +++ b/src/__tests__/unit/collection.test.ts @@ -860,6 +860,7 @@ describe('smartCollectionSync', () => { collection: { url: 'http://example.com/col/', reports: ['syncCollection'], + syncToken: 'token1', objects: [ { url: 'http://example.com/col/unchanged.ics', etag: '"same"' }, { url: 'http://example.com/col/changed.ics', etag: '"old"' }, @@ -888,6 +889,127 @@ describe('smartCollectionSync', () => { expect(result.objects?.[1].etag).toBe('"new"'); }); + const syncTokenOf = (call: number) => + mockedDavRequest.mock.calls[call][0].init.body['sync-collection']['sync-token']; + + it('should resync from an empty token when the server rejects the sync token', async () => { + mockedDavRequest + .mockResolvedValueOnce([ + { + href: 'http://example.com/col/', + ok: false, + status: 403, + statusText: 'Forbidden', + raw: '', + }, + ]) + .mockResolvedValueOnce([ + { + href: '/col/kept.ics', + ok: true, + status: 200, + statusText: 'OK', + raw: { multistatus: { syncToken: 'fresh-token' } }, + }, + ]); + + const result = await smartCollectionSyncDetailed({ + collection: { + url: 'http://example.com/col/', + reports: ['syncCollection'], + syncToken: 'expired-token', + objects: [ + { url: 'http://example.com/col/kept.ics', etag: '"same"' }, + { url: 'http://example.com/col/removed.ics', etag: '"gone"' }, + ], + objectMultiGet: vi.fn().mockResolvedValue([ + { + href: '/col/kept.ics', + ok: true, + status: 200, + statusText: 'OK', + props: { getetag: '"same"', calendarData: 'data' }, + }, + ]), + }, + account: { + serverUrl: 'https://example.com/', + accountType: 'caldav', + homeUrl: 'https://example.com/col/', + }, + }); + + expect(mockedDavRequest).toHaveBeenCalledTimes(2); + expect(syncTokenOf(0)).toBe('expired-token'); + expect(syncTokenOf(1)).toBeUndefined(); + expect(result.syncToken).toBe('fresh-token'); + expect(result.objects.created).toEqual([]); + expect(result.objects.updated).toEqual([]); + expect(result.objects.deleted.map((object) => object.url)).toEqual([ + 'http://example.com/col/removed.ics', + ]); + }); + + it('should not retry a sync rejected for another reason', async () => { + mockedDavRequest.mockResolvedValue([ + { + href: 'http://example.com/col/', + ok: false, + status: 403, + statusText: 'Forbidden', + raw: '', + }, + ]); + + await expect( + smartCollectionSync({ + collection: { + url: 'http://example.com/col/', + reports: ['syncCollection'], + syncToken: 'token1', + objects: [], + }, + account: { + serverUrl: 'https://example.com/', + accountType: 'caldav', + homeUrl: 'https://example.com/col/', + }, + }), + ).rejects.toThrow('Collection sync failed: 403 Forbidden'); + expect(mockedDavRequest).toHaveBeenCalledTimes(1); + }); + + it('should treat local objects missing from an initial webdav sync as deleted', async () => { + mockedDavRequest.mockResolvedValue([ + { + href: 'http://example.com/col/', + ok: true, + status: 207, + statusText: 'Multi-Status', + raw: { multistatus: { syncToken: 'first-token' } }, + }, + ]); + + const result = await smartCollectionSyncDetailed({ + collection: { + url: 'http://example.com/col/', + reports: ['syncCollection'], + objects: [{ url: 'http://example.com/col/stale.ics', etag: '"stale"' }], + }, + account: { + serverUrl: 'https://example.com/', + accountType: 'caldav', + homeUrl: 'https://example.com/col/', + }, + }); + + expect(syncTokenOf(0)).toBeUndefined(); + expect(result.syncToken).toBe('first-token'); + expect(result.objects.deleted.map((object) => object.url)).toEqual([ + 'http://example.com/col/stale.ics', + ]); + }); + it('should detect deleted objects in basic mode', async () => { mockedPropfind.mockResolvedValue([ { diff --git a/src/__tests__/unit/requestHelpers.test.ts b/src/__tests__/unit/requestHelpers.test.ts index 4e25ff6f..1f0ab3bf 100644 --- a/src/__tests__/unit/requestHelpers.test.ts +++ b/src/__tests__/unit/requestHelpers.test.ts @@ -183,3 +183,11 @@ describe('ensureTrailingSlash', () => { expect(ensureTrailingSlash(' https://example.com/cal ')).toBe('https://example.com/cal/'); }); }); + +test('urlMatches should ignore percent-encoding differences in path segments', () => { + const baseUrl = 'https://example.com/'; + + expect(urlMatches('/principals/a@b.com/', '/principals/a%40b.com/', baseUrl)).toBe(true); + expect(urlMatches('/cal/a%2fb.ics', '/cal/a%2Fb.ics', baseUrl)).toBe(true); + expect(urlMatches('/cal/a%2Fb.ics', '/cal/a/b.ics', baseUrl)).toBe(false); +}); diff --git a/src/__tests__/unit/review-regressions.test.ts b/src/__tests__/unit/review-regressions.test.ts index 4365db24..db1e2f97 100644 --- a/src/__tests__/unit/review-regressions.test.ts +++ b/src/__tests__/unit/review-regressions.test.ts @@ -338,7 +338,7 @@ describe('review regressions', () => { const credentials: DAVCredentials = { accessToken: 'old', refreshToken: 'refresh', - expiration: Date.now() + 60000, + expiration: Date.now() + 3_600_000, clientId: 'id', clientSecret: 'secret', tokenUrl: 'https://example.com/token', @@ -369,8 +369,13 @@ describe('review regressions', () => { it('reuses an access token without a refresh token and blocks DAV after refresh failure', async () => { const fetch = vi.fn(); expect( - (await getOauthHeaders({ accessToken: 'valid', expiration: Date.now() + 60000 }, {}, fetch)) - .headers.authorization, + ( + await getOauthHeaders( + { accessToken: 'valid', expiration: Date.now() + 3_600_000 }, + {}, + fetch, + ) + ).headers.authorization, ).toBe('Bearer valid'); expect(fetch).not.toHaveBeenCalled(); const failing = vi.fn().mockResolvedValue(new Response('', { status: 401 })); @@ -431,6 +436,24 @@ describe('review regressions', () => { ).rejects.toThrow('resourcetype returned 403'); }); + it('matches object hrefs that differ only in percent-encoding', async () => { + const objects = await fetchCalendarObjects({ + calendar, + objectUrls: ['https://example.com/cal/work/a@b.ics'], + fetch: transport( + xml( + member( + '/cal/work/a%40b.ics', + '"1"A', + ), + ), + ), + }); + expect(objects).toEqual([ + { url: 'https://example.com/cal/work/a%40b.ics', etag: '"1"', data: 'A' }, + ]); + }); + it('rejects incomplete calendar and contact snapshots', async () => { await expect( fetchCalendarObjects({ diff --git a/src/addressBook.ts b/src/addressBook.ts index 9a0b1dd0..08b62f28 100644 --- a/src/addressBook.ts +++ b/src/addressBook.ts @@ -14,6 +14,7 @@ import { urlEquals, ensureTrailingSlash, } from './util/requestHelpers'; +import { getObjectUrl } from './util/objectUrl'; import { getDAVUrlKey } from './util/syncHelpers'; import { assertDAVDiscovery, assertDAVObjectResponses, getDAVText } from './util/responseHelpers'; import { findMissingFieldNames, hasFields } from './util/typeHelpers'; @@ -306,7 +307,7 @@ export const createVCard = async (params: { fetch: fetchOverride, } = params; return createObject({ - url: new URL(filename, ensureTrailingSlash(addressBook.url)).href, + url: getObjectUrl(addressBook.url, filename), data: vCardString, headers: excludeHeaders( { diff --git a/src/calendar.ts b/src/calendar.ts index 3b382eb4..5ad5f631 100644 --- a/src/calendar.ts +++ b/src/calendar.ts @@ -19,6 +19,7 @@ import { urlMatches, ensureTrailingSlash, } from './util/requestHelpers'; +import { getObjectUrl } from './util/objectUrl'; import { getDAVUrlKey } from './util/syncHelpers'; import { assertDAVDiscovery, assertDAVObjectResponses, getDAVText } from './util/responseHelpers'; import { findMissingFieldNames, hasFields } from './util/typeHelpers'; @@ -580,7 +581,7 @@ export const createCalendarObject = async (params: { } = params; return createObject({ - url: new URL(filename, ensureTrailingSlash(calendar.url)).href, + url: getObjectUrl(calendar.url, filename), data: iCalString, headers: excludeHeaders( { diff --git a/src/client.ts b/src/client.ts index a990be07..2fa250b3 100644 --- a/src/client.ts +++ b/src/client.ts @@ -63,6 +63,7 @@ import { import { createDigestAuthState, createDigestFetch, DigestAuthState } from './util/digestAuth'; import { Optional } from './util/typeHelpers'; import { mergeHeaders } from './util/requestHelpers'; +import { isTokenUnexpired } from './util/tokenExpiry'; const resolveAuthHeaders = async ( client: DAVClient, @@ -255,7 +256,7 @@ export class DAVClient { !force && this.authHeaders && this.credentials.accessToken && - (this.credentials.expiration == null || Date.now() < this.credentials.expiration) + (this.credentials.expiration == null || isTokenUnexpired(this.credentials.expiration)) ) { this.authHeaders = { authorization: `Bearer ${this.credentials.accessToken}` }; return; diff --git a/src/collection.ts b/src/collection.ts index 4b3501b3..2d694643 100644 --- a/src/collection.ts +++ b/src/collection.ts @@ -349,22 +349,40 @@ export const smartCollectionSync: SmartCollectionSync = async + syncCollection({ + url: collection.url, + props: { + [`${DAVNamespaceShort.DAV}:getetag`]: {}, + [`${ + account.accountType === 'caldav' ? DAVNamespaceShort.CALDAV : DAVNamespaceShort.CARDDAV + }:${account.accountType === 'caldav' ? 'calendar-data' : 'address-data'}`]: {}, + [`${DAVNamespaceShort.DAV}:displayname`]: {}, + }, + syncLevel: 1, + syncToken, + headers: excludeHeaders(headers, headersToExclude), + headersToExclude, + fetchOptions, + fetch: fetchOverride, + }); + let syncToken = collection.syncToken; + let result = await requestSync(syncToken); + // RFC 6578 §3.2: a server that no longer accepts a sync token fails the + // DAV:valid-sync-token precondition, and the client must resynchronize + // from an empty token, which lists every member. + if ( + syncToken && + result.length === 1 && + result[0].status >= 400 && + result[0].status < 500 && + typeof result[0].raw === 'string' && + result[0].raw.includes('valid-sync-token') + ) { + debug('sync token rejected by server, starting a full sync'); + syncToken = undefined; + result = await requestSync(syncToken); + } const isObjectResponse = (r: DAVResponse): r is RequireAndNotNullSome => { return ( @@ -452,11 +470,12 @@ export const smartCollectionSync: SmartCollectionSync = async { + it.each([ + ['event.ics', 'https://example.com/cal/home/event.ics'], + ['urn:uuid:1234.ics', 'https://example.com/cal/home/urn:uuid:1234.ics'], + ['mailto:x.ics', 'https://example.com/cal/home/mailto:x.ics'], + ['evt#1.ics', 'https://example.com/cal/home/evt%231.ics'], + ['evt?1.ics', 'https://example.com/cal/home/evt%3F1.ics'], + ['100%.ics', 'https://example.com/cal/home/100%25.ics'], + ['a\\b.ics', 'https://example.com/cal/home/a%5Cb.ics'], + ['line\nbreak.ics', 'https://example.com/cal/home/line%0Abreak.ics'], + ['trailing.ics ', 'https://example.com/cal/home/trailing.ics%20'], + ['my event.ics', 'https://example.com/cal/home/my%20event.ics'], + ['café.ics', 'https://example.com/cal/home/caf%C3%A9.ics'], + ])('resolves %j as one segment of the collection', (filename, expected) => { + expect(getObjectUrl(base, filename)).toBe(expected); + }); + + it('keeps names that callers already percent-encoded', () => { + expect(getObjectUrl(base, `feed-${encodeURIComponent('a@b/c#d')}.ics`)).toBe( + 'https://example.com/cal/home/feed-a%40b%2Fc%23d.ics', + ); + }); + + it('resolves against a collection URL without a trailing slash', () => { + expect(getObjectUrl('https://example.com/cal/home', 'event.ics')).toBe( + 'https://example.com/cal/home/event.ics', + ); + }); + + it.each(['', '/evil.ics', 'sub/event.ics', '.', '..', '%2e%2E', '.%2e'])( + 'rejects %j, which is not a file name inside the collection', + (filename) => { + expect(() => getObjectUrl(base, filename)).toThrow('Invalid object filename'); + }, + ); +}); diff --git a/src/util/__tests__/percentEncoding.test.ts b/src/util/__tests__/percentEncoding.test.ts new file mode 100644 index 00000000..25a97a2e --- /dev/null +++ b/src/util/__tests__/percentEncoding.test.ts @@ -0,0 +1,31 @@ +import { describe, expect, it } from 'vitest'; + +import { normalizePercentEncoding } from '../percentEncoding'; + +describe('normalizePercentEncoding', () => { + it.each([ + ['https://h.example/p/a@b.com/', 'https://h.example/p/a%40b.com/'], + ['https://h.example/p/a%40b.com/', 'https://h.example/p/a%40b.com/'], + ['https://h.example/cal/my%20event.ics', 'https://h.example/cal/my%20event.ics'], + ['https://h.example/cal/caf%c3%a9.ics', 'https://h.example/cal/caf%C3%A9.ics'], + ['https://h.example/cal/urn:uuid:1.ics', 'https://h.example/cal/urn%3Auuid%3A1.ics'], + ])('encodes %s uniformly', (href, expected) => { + expect(normalizePercentEncoding(href)).toBe(expected); + }); + + it('keeps an encoded slash inside its segment', () => { + expect(normalizePercentEncoding('https://h.example/cal/a%2fb.ics')).toBe( + 'https://h.example/cal/a%2Fb.ics', + ); + }); + + it('leaves the query, malformed escapes, and relative hrefs alone', () => { + expect(normalizePercentEncoding('https://h.example/cal/x.ics?a=%40')).toBe( + 'https://h.example/cal/x.ics?a=%40', + ); + expect(normalizePercentEncoding('https://h.example/cal/100%.ics')).toBe( + 'https://h.example/cal/100%.ics', + ); + expect(normalizePercentEncoding('/cal/a@b.ics')).toBe('/cal/a@b.ics'); + }); +}); diff --git a/src/util/authHelpers.ts b/src/util/authHelpers.ts index 2a2bdf87..118a9f8c 100644 --- a/src/util/authHelpers.ts +++ b/src/util/authHelpers.ts @@ -5,6 +5,7 @@ import { DAVCredentials } from '../types/models'; import { fetch } from './fetch'; import { mergeHeaders } from './requestHelpers'; import { findMissingFieldNames, hasFields } from './typeHelpers'; +import { getTokenExpiration, isTokenUnexpired } from './tokenExpiry'; const debug = getLogger('tsdav:authHelper'); const BASE64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; @@ -213,7 +214,7 @@ export const getOauthHeaders = async ( if ( credentials.accessToken && ((credentials.expiration == null && !credentials.refreshToken) || - (credentials.expiration != null && Date.now() < credentials.expiration)) + (credentials.expiration != null && isTokenUnexpired(credentials.expiration))) ) { tokens = { access_token: credentials.accessToken, refresh_token: credentials.refreshToken }; } else { @@ -235,8 +236,7 @@ export const getOauthHeaders = async ( credentials.refreshToken = tokens.refresh_token; } if (tokens.access_token) { - credentials.expiration = - typeof tokens.expires_in === 'number' ? Date.now() + tokens.expires_in * 1000 : undefined; + credentials.expiration = getTokenExpiration(tokens.expires_in); } /* eslint-enable no-param-reassign */ } diff --git a/src/util/objectUrl.ts b/src/util/objectUrl.ts new file mode 100644 index 00000000..3d58841d --- /dev/null +++ b/src/util/objectUrl.ts @@ -0,0 +1,21 @@ +import { ensureTrailingSlash } from './requestHelpers'; + +/** + * Resolve a new object's URL from its collection URL and file name. + * + * The file name is one path segment, not a relative URL: `?`, `#`, `\`, a + * stray `%`, and whitespace or control characters are percent-encoded, and the + * `./` prefix keeps a name like `urn:uuid:1.ics` from parsing as a URL scheme. + * Valid percent-escapes are kept, so already-encoded names are not encoded twice. + */ +export const getObjectUrl = (collectionUrl: string, filename: string): string => { + if (!filename || filename.includes('/') || /^(?:\.|%2e){1,2}$/i.test(filename)) { + throw new Error(`Invalid object filename "${filename}": expected a single path segment`); + } + const segment = filename.replace( + // biome-ignore lint/suspicious/noControlCharactersInRegex: URL parsing strips or trims these. + /%(?![\da-f]{2})|[?#\\\x00-\x20\x7f]/gi, + (char) => `%${char.charCodeAt(0).toString(16).toUpperCase().padStart(2, '0')}`, + ); + return new URL(`./${segment}`, ensureTrailingSlash(collectionUrl)).href; +}; diff --git a/src/util/percentEncoding.ts b/src/util/percentEncoding.ts new file mode 100644 index 00000000..344561ca --- /dev/null +++ b/src/util/percentEncoding.ts @@ -0,0 +1,24 @@ +/** + * Encode every path segment the same way, so hrefs that differ only in + * percent-encoding (`a@b` and `a%40b`, `%2f` and `%2F`) compare equal. + * Only for comparisons: servers may expect the original form in requests. + */ +export const normalizePercentEncoding = (href: string): string => { + let url: URL; + try { + url = new URL(href); + } catch { + return href; + } + url.pathname = url.pathname + .split('/') + .map((segment) => { + try { + return encodeURIComponent(decodeURIComponent(segment)); + } catch { + return segment; + } + }) + .join('/'); + return url.href; +}; diff --git a/src/util/requestHelpers.ts b/src/util/requestHelpers.ts index a3c46df5..6b53e6de 100644 --- a/src/util/requestHelpers.ts +++ b/src/util/requestHelpers.ts @@ -1,5 +1,6 @@ import { DAVAttributeMap, DAVNamespace } from '../consts'; +import { normalizePercentEncoding } from './percentEncoding'; import type { NoUndefinedField } from './typeHelpers'; const normalizeUrl = (url: string): string => { @@ -64,7 +65,10 @@ export const urlMatches = (urlA?: string, urlB?: string, baseUrl?: string): bool } try { - return urlEquals(new URL(urlA, baseUrl).href, new URL(urlB, baseUrl).href); + return urlEquals( + normalizePercentEncoding(new URL(urlA, baseUrl).href), + normalizePercentEncoding(new URL(urlB, baseUrl).href), + ); } catch { return urlEquals(urlA, urlB); } diff --git a/src/util/syncHelpers.ts b/src/util/syncHelpers.ts index e1edeb54..e2a7c1e4 100644 --- a/src/util/syncHelpers.ts +++ b/src/util/syncHelpers.ts @@ -1,11 +1,12 @@ import { DAVObject } from '../types/models'; +import { normalizePercentEncoding } from './percentEncoding'; import { ensureTrailingSlash } from './requestHelpers'; /** Stable keys for linear-time DAV resource comparisons. */ export const getDAVUrlKey = (url: string, baseUrl: string): string => { let resolved: string; try { - resolved = new URL(url, ensureTrailingSlash(baseUrl)).href; + resolved = normalizePercentEncoding(new URL(url, ensureTrailingSlash(baseUrl)).href); } catch { resolved = url.trim(); } diff --git a/src/util/tokenExpiry.ts b/src/util/tokenExpiry.ts new file mode 100644 index 00000000..ab4761e8 --- /dev/null +++ b/src/util/tokenExpiry.ts @@ -0,0 +1,15 @@ +// Refresh a little early so a token cannot expire while a request is in flight. +const EXPIRY_MARGIN_MS = 60_000; + +/** Whether a token expiring at `expiration` (ms since epoch) can still be sent. */ +export const isTokenUnexpired = (expiration: number): boolean => + Date.now() < expiration - EXPIRY_MARGIN_MS; + +/** Expiration timestamp for an OAuth `expires_in`, which some providers send as a string. */ +export const getTokenExpiration = (expiresIn: unknown): number | undefined => { + const seconds = + typeof expiresIn === 'string' && expiresIn.trim() !== '' ? Number(expiresIn) : expiresIn; + return typeof seconds === 'number' && Number.isFinite(seconds) && seconds > 0 + ? Date.now() + seconds * 1000 + : undefined; +}; diff --git a/tsconfig.json b/tsconfig.json index 50857b6e..ffefbb89 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,6 +8,8 @@ "resolveJsonModule": true, "moduleResolution": "bundler", "lib": ["ES2019", "dom", "DOM.Iterable"], + // Shared source must stay runtime-neutral, so Node.js globals are not ambient. + "types": [], "module": "preserve", "target": "ES2018", "declaration": true, diff --git a/vitest.config.ts b/vitest.config.ts index 977a364f..e98712bf 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,13 +1,15 @@ -import { readFileSync } from 'node:fs'; +import { existsSync } from 'node:fs'; import { defineConfig } from 'vitest/config'; +// Integration tests read provider credentials from `.env`; variables already +// set in the environment take precedence. +if (existsSync('.env')) process.loadEnvFile('.env'); + export default defineConfig({ - esbuild: { - // Tests importing docs helpers must not require the separate docs toolchain. - tsconfigRaw: readFileSync(new URL('./tsconfig.json', import.meta.url), 'utf8'), - }, + // Tests import docs helpers; without this, Vite would resolve docs/tsconfig.json, + // which needs the separate docs toolchain installed. + tsconfig: './tsconfig.json', test: { - setupFiles: ['dotenv/config'], testTimeout: 120000, include: ['src/**/*.test.ts', 'src/util/__tests__/**/*.test.ts', 'tests/**/*.test.ts'], exclude: ['node_modules', 'dist'],