diff --git a/.changeset/cuddly-shrimps-grow.md b/.changeset/cuddly-shrimps-grow.md new file mode 100644 index 00000000..27ade8ef --- /dev/null +++ b/.changeset/cuddly-shrimps-grow.md @@ -0,0 +1,5 @@ +--- +'astro-purgecss': minor +--- + +Fix files modified without updating hash diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 162b0b49..5a860270 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -9,6 +9,8 @@ on: pull_request: branches: ['main'] +concurrency: ${{ github.workflow }}-${{ github.ref }} + jobs: build: runs-on: ubuntu-latest @@ -22,6 +24,7 @@ jobs: - uses: pnpm/action-setup@v2 with: version: 8 + run_install: true - name: Setup Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 @@ -29,5 +32,6 @@ jobs: node-version: ${{ matrix.node-version }} cache: 'pnpm' - - run: pnpm install + - run: pnpm run test - run: pnpm run build + - run: pnpx pkg-pr-new publish './packages/astro-purgecss' diff --git a/LICENSE b/LICENSE index 4da98671..b112b4fe 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Codiume +Copyright (c) 2024 Codiume Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/apps/example-purgecss/astro.config.ts b/apps/example-purgecss/astro.config.ts index 4419f8fc..027fb1f7 100644 --- a/apps/example-purgecss/astro.config.ts +++ b/apps/example-purgecss/astro.config.ts @@ -1,5 +1,5 @@ -import { defineConfig } from 'astro/config'; import purgecss from 'astro-purgecss'; +import { defineConfig } from 'astro/config'; export default defineConfig({ // Add purgecss support to Astro @@ -10,5 +10,8 @@ export default defineConfig({ safelist: ['random', 'yep', 'button', /^nav-/], blocklist: ['usedClass', /^nav-/] }) - ] + ], + build: { + inlineStylesheets: 'never' + } }); diff --git a/package.json b/package.json index a85f46ff..014f9fb3 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,12 @@ "packages/*" ], "scripts": { + "test": "vitest run", "build": "turbo run build && turbo run typecheck", "build:no-cache": "turbo run build --no-cache && turbo run typecheck", "dev": "turbo run dev --no-cache --parallel --continue", - "clean": "turbo run clean && rm -rf node_modules", "format": "prettier --write \"**/*.{ts,tsx,md,astro,mjs}\"", + "clean": "turbo run clean && rm -rf node_modules", "changeset": "changeset", "changeset:version": "changeset version", "changeset:publish": "pnpm run build && changeset publish" @@ -25,12 +26,15 @@ "commander": "^12.1.0", "esbuild": "^0.23.1", "esbuild-plugin-clean": "^1.0.1", - "ora": "^8.0.1", + "ora": "^8.1.0", + "pkg-pr-new": "^0.0.20", "prettier": "^3.3.3", "prettier-plugin-astro": "^0.14.1", "tiny-glob": "^0.2.9", "tsup": "^8.2.4", - "turbo": "^2.0.14", - "typescript": "^5.5.4" + "turbo": "^2.1.0", + "typescript": "^5.5.4", + "vite-tsconfig-paths": "^5.0.1", + "vitest": "^2.0.5" } } diff --git a/packages/astro-purgecss/src/index.ts b/packages/astro-purgecss/src/index.ts index d6ed276c..ef0ad5de 100644 --- a/packages/astro-purgecss/src/index.ts +++ b/packages/astro-purgecss/src/index.ts @@ -1,27 +1,17 @@ import type { AstroIntegration } from 'astro'; -import { writeFile } from 'node:fs/promises'; import { fileURLToPath } from 'node:url'; import { PurgeCSS, type UserDefinedOptions } from 'purgecss'; -export interface PurgeCSSOptions extends Partial {} - -function handleWindowsPath(outputPath: string): string { - if (process.platform !== 'win32') return outputPath; - - if (outputPath.endsWith('\\')) { - outputPath = outputPath.substring(0, outputPath.length - 1); - } - outputPath = outputPath.replaceAll('\\', '/'); +import { resolveOutputPath, writeCssFile } from './utils'; - return outputPath; -} +export interface PurgeCSSOptions extends Partial {} function Plugin(options: PurgeCSSOptions = {}): AstroIntegration { return { name: 'astro-purgecss', hooks: { 'astro:build:done': async ({ dir }) => { - const outDir = handleWindowsPath(fileURLToPath(dir)); + const outDir = resolveOutputPath(fileURLToPath(dir)); const purged = await new PurgeCSS().purge({ css: [`${outDir}/**/*.css`], defaultExtractor: (content) => content.match(/[\w-/:]+(? file?.endsWith('.css')) - .map(async ({ css, file }) => await writeFile(file!, css)) + .map( + async ({ css, file }) => await writeCssFile({ css, file, outDir }) + ) ); } } diff --git a/packages/astro-purgecss/src/utils.test.ts b/packages/astro-purgecss/src/utils.test.ts new file mode 100644 index 00000000..aa216af6 --- /dev/null +++ b/packages/astro-purgecss/src/utils.test.ts @@ -0,0 +1,105 @@ +import { unlink, writeFile } from 'node:fs/promises'; +import { basename, dirname } from 'node:path'; +import { afterEach, describe, expect, it, vi } from 'vitest'; + +import { resolveOutputPath, writeCssFile } from './utils'; + +describe('resolveOutputPath', () => { + it('should return the same path for non-windows platforms', () => { + const originalPlatform = process.platform; + Object.defineProperty(process, 'platform', { value: 'darwin' }); + + const inputPath = '/some/unix/path'; + expect(resolveOutputPath(inputPath)).toBe(inputPath); + + Object.defineProperty(process, 'platform', { value: originalPlatform }); + }); + + it('should remove trailing backslash and replace backslashes with forward slashes on windows', () => { + const originalPlatform = process.platform; + Object.defineProperty(process, 'platform', { value: 'win32' }); + + const inputPath = 'C:\\Users\\test\\path\\'; + const expectedPath = 'C:/Users/test/path'; + expect(resolveOutputPath(inputPath)).toBe(expectedPath); + + Object.defineProperty(process, 'platform', { value: originalPlatform }); + }); + + it('should replace backslashes with forward slashes on windows without trailing backslash', () => { + const originalPlatform = process.platform; + Object.defineProperty(process, 'platform', { value: 'win32' }); + + const inputPath = 'C:\\Users\\test\\path'; + const expectedPath = 'C:/Users/test/path'; + expect(resolveOutputPath(inputPath)).toBe(expectedPath); + + Object.defineProperty(process, 'platform', { value: originalPlatform }); + }); +}); + +const mockCss = 'body { color: red; }'; +const mockFile = '/path/to/astro.csjqp06s.css'; +const mockOutDir = '/path/to/outdir'; +const mockHash = 'abcdefg1'; + +vi.mock('node:fs/promises', () => ({ + writeFile: vi.fn(() => Promise.resolve()), + unlink: vi.fn(() => Promise.resolve()), + readdir: vi.fn(() => Promise.resolve([])) +})); + +vi.mock('node:path', () => ({ + dirname: vi.fn(() => '/path/to'), + basename: vi.fn((file) => file.split('/').pop() as string), + join: vi.fn((...args) => args.join('/')) +})); + +vi.mock('node:crypto', () => ({ + createHash: vi.fn(() => ({ + update: vi.fn().mockReturnThis(), + digest: vi.fn().mockReturnValue(mockHash.repeat(5)) + })) +})); + +describe('writeCssFile', () => { + afterEach(() => { + vi.clearAllMocks(); + }); + + it('should return undefined if no file is provided', async () => { + const result = await writeCssFile({ css: mockCss, outDir: mockOutDir }); + expect(result).toBeUndefined(); + }); + + it('should write new file, delete old file, and update references', async () => { + const newFile = '/path/to/astro.abcdefg1.css'; + + await writeCssFile({ css: mockCss, file: mockFile, outDir: mockOutDir }); + + expect(writeFile).toHaveBeenCalledWith(newFile, mockCss); + expect(unlink).toHaveBeenCalledWith(mockFile); + expect(dirname).toHaveBeenCalledWith(mockOutDir); + expect(basename).toHaveBeenCalledWith(mockFile); + expect(basename).toHaveBeenCalledWith(newFile); + }); + + it('should return the new file name', async () => { + const result = await writeCssFile({ + css: mockCss, + file: mockFile, + outDir: mockOutDir + }); + expect(result).toBe('/path/to/astro.abcdefg1.css'); + }); + + it('should handle errors gracefully', async () => { + vi.mocked(writeFile).mockImplementation(() => + Promise.reject(new Error('Write error')) + ); + + await expect( + writeCssFile({ css: mockCss, file: mockFile, outDir: mockOutDir }) + ).rejects.toThrow('Write error'); + }); +}); diff --git a/packages/astro-purgecss/src/utils.ts b/packages/astro-purgecss/src/utils.ts new file mode 100644 index 00000000..c3d06e57 --- /dev/null +++ b/packages/astro-purgecss/src/utils.ts @@ -0,0 +1,84 @@ +import { createHash } from 'node:crypto'; +import { readdir, readFile, unlink, writeFile } from 'node:fs/promises'; +import { basename, dirname, join } from 'node:path'; + +async function replaceStringInFile( + filePath: string, + searchValue: string, + replaceValue: string +) { + try { + const fileContent = await readFile(filePath, 'utf8'); + if (fileContent.includes(searchValue)) { + const re = new RegExp(searchValue, 'g'); + const newContent = fileContent.replace(re, replaceValue); + await writeFile(filePath, newContent, 'utf8'); + } + } catch (err) { + console.error(`Error processing file ${filePath}: ${err}`); + } +} + +async function replaceStringInDirectory( + directory: string, + searchValue: string, + replaceValue: string +) { + try { + const files = await readdir(directory, { withFileTypes: true }); + for (const file of files) { + const fullPath = join(directory, file.name); + if (file.isDirectory()) { + await replaceStringInDirectory(fullPath, searchValue, replaceValue); + } else if (file.isFile()) { + await replaceStringInFile(fullPath, searchValue, replaceValue); + } + } + } catch (err) { + console.error(`Error processing directory ${directory}: ${err}`); + } +} + +export function resolveOutputPath(outputPath: string): string { + if (process.platform !== 'win32') return outputPath; + + // Remove trailing backslash if present + outputPath = outputPath.replace(/\\+$/, ''); + + // Replace all backslashes with forward slashes + return outputPath.replace(/\\/g, '/'); +} + +export async function writeCssFile({ + css, + file, + outDir +}: { + css: string; + file?: string; + outDir: string; +}) { + if (!file) return; + + // Get content hash before writing to file + const hash = createHash('sha256').update(css).digest('hex').substring(0, 8); + + // Generate new file name with hash + // Astro orignal hash is 8 characters long + const newFile = `${file.slice(0, -13)}.${hash}.css`; + + // Write purged CSS to new file + await writeFile(newFile, css); + + // Remove old file + await unlink(file); + + // Replace old name references with new file name + await replaceStringInDirectory( + dirname(outDir), // Search from parent directory + basename(file), + basename(newFile) + ); + + return newFile; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 109d7642..fd699b5e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,7 +22,7 @@ importers: version: 20.16.1 astro: specifier: ^4.14.5 - version: 4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4) + version: 4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4) commander: specifier: ^12.1.0 version: 12.1.0 @@ -33,8 +33,11 @@ importers: specifier: ^1.0.1 version: 1.0.1(esbuild@0.23.1) ora: - specifier: ^8.0.1 + specifier: ^8.1.0 version: 8.1.0 + pkg-pr-new: + specifier: ^0.0.20 + version: 0.0.20 prettier: specifier: ^3.3.3 version: 3.3.3 @@ -48,37 +51,43 @@ importers: specifier: ^8.2.4 version: 8.2.4(postcss@8.4.41)(typescript@5.5.4) turbo: - specifier: ^2.0.14 - version: 2.0.14 + specifier: ^2.1.0 + version: 2.1.0 typescript: specifier: ^5.5.4 version: 5.5.4 + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.5.4)(vite@5.4.2(@types/node@20.16.1)) + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@20.16.1) apps/example-purgecss: dependencies: '@astrojs/node': specifier: ^8.0.0 - version: 8.3.3(astro@4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4)) + version: 8.3.3(astro@4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4)) astro-purgecss: specifier: workspace:* version: link:../../packages/astro-purgecss devDependencies: astro: specifier: ^4.0.0 - version: 4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4) + version: 4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4) apps/example-useragent: dependencies: '@astrojs/node': specifier: ^8.0.0 - version: 8.3.3(astro@4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4)) + version: 8.3.3(astro@4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4)) astro-useragent: specifier: workspace:* version: link:../../packages/astro-useragent devDependencies: astro: specifier: ^4.0.0 - version: 4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4) + version: 4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4) apps/playground: dependencies: @@ -94,7 +103,7 @@ importers: devDependencies: astro: specifier: ^4.0.0 - version: 4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4) + version: 4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4) packages/astro-build: {} @@ -102,7 +111,7 @@ importers: dependencies: astro: specifier: ^4.0.0 - version: 4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4) + version: 4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4) purgecss: specifier: ^6.0.0 version: 6.0.0 @@ -111,7 +120,7 @@ importers: dependencies: astro: specifier: ^4.0.0 - version: 4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4) + version: 4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4) devDependencies: astro-build: specifier: workspace:* @@ -121,7 +130,7 @@ importers: dependencies: astro: specifier: ^4.0.0 - version: 4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4) + version: 4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4) schema-dts: specifier: ^1.1.0 version: 1.1.2(typescript@5.5.4) @@ -134,7 +143,7 @@ importers: dependencies: astro: specifier: ^4.0.0 - version: 4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4) + version: 4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4) devDependencies: astro-build: specifier: workspace:* @@ -144,7 +153,7 @@ importers: dependencies: astro: specifier: ^4.0.0 - version: 4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4) + version: 4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4) ua-parser-js: specifier: ^1.0.2 version: 1.0.38 @@ -166,7 +175,7 @@ importers: version: 4.0.15(@types/node@20.16.1)(vite@5.4.2(@types/node@20.16.1)) astro: specifier: ^4.0.0 - version: 4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4) + version: 4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4) devDependencies: astro-build: specifier: workspace:* @@ -793,6 +802,10 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jsdevtools/ez-spawn@3.0.4': + resolution: {integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==} + engines: {node: '>=10'} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -811,6 +824,62 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@octokit/action@6.1.0': + resolution: {integrity: sha512-lo+nHx8kAV86bxvOVOI3vFjX3gXPd/L7guAUbvs3pUvnR2KC+R7yjBkA1uACt4gYhs4LcWP3AXSGQzsbeN2XXw==} + engines: {node: '>= 18'} + + '@octokit/auth-action@4.1.0': + resolution: {integrity: sha512-m+3t7K46IYyMk7Bl6/lF4Rv09GqDZjYmNg8IWycJ2Fa3YE3DE7vQcV6G2hUPmR9NDqenefNJwVtlisMjzymPiQ==} + engines: {node: '>= 18'} + + '@octokit/auth-token@4.0.0': + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} + engines: {node: '>= 18'} + + '@octokit/core@5.2.0': + resolution: {integrity: sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==} + engines: {node: '>= 18'} + + '@octokit/endpoint@9.0.5': + resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==} + engines: {node: '>= 18'} + + '@octokit/graphql@7.1.0': + resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==} + engines: {node: '>= 18'} + + '@octokit/openapi-types@20.0.0': + resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} + + '@octokit/openapi-types@22.2.0': + resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} + + '@octokit/plugin-paginate-rest@9.2.1': + resolution: {integrity: sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + + '@octokit/plugin-rest-endpoint-methods@10.4.1': + resolution: {integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + + '@octokit/request-error@5.1.0': + resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==} + engines: {node: '>= 18'} + + '@octokit/request@8.4.0': + resolution: {integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==} + engines: {node: '>= 18'} + + '@octokit/types@12.6.0': + resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} + + '@octokit/types@13.5.0': + resolution: {integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==} + '@oslojs/encoding@0.4.1': resolution: {integrity: sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q==} @@ -832,81 +901,161 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.21.1': + resolution: {integrity: sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.21.0': resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.21.1': + resolution: {integrity: sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.21.0': resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.21.1': + resolution: {integrity: sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.21.0': resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.21.1': + resolution: {integrity: sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-linux-arm-gnueabihf@4.21.0': resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.21.1': + resolution: {integrity: sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.21.0': resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.21.1': + resolution: {integrity: sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.21.0': resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.21.1': + resolution: {integrity: sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.21.0': resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.21.1': + resolution: {integrity: sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.21.1': + resolution: {integrity: sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.21.0': resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.21.1': + resolution: {integrity: sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.21.0': resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.21.1': + resolution: {integrity: sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.21.0': resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.21.1': + resolution: {integrity: sha512-kXQVcWqDcDKw0S2E0TmhlTLlUgAmMVqPrJZR+KpH/1ZaZhLSl23GZpQVmawBQGVhyP5WXIsIQ/zqbDBBYmxm5w==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.21.0': resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.21.1': + resolution: {integrity: sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.21.0': resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.21.1': + resolution: {integrity: sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.21.0': resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.21.1': + resolution: {integrity: sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.21.0': resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.21.1': + resolution: {integrity: sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==} + cpu: [x64] + os: [win32] + '@shikijs/core@1.14.1': resolution: {integrity: sha512-KyHIIpKNaT20FtFPFjCQB5WVSTpLR/n+jQXhWHWVUMm9MaOaG9BGOG0MSyt7yA4+Lm+4c9rTc03tt3nYzeYSfw==} @@ -982,6 +1131,24 @@ packages: peerDependencies: vite: ^4.0.3 || ^5.0.0 + '@vitest/expect@2.0.5': + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + + '@vitest/pretty-format@2.0.5': + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + + '@vitest/runner@2.0.5': + resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} + + '@vitest/snapshot@2.0.5': + resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} + + '@vitest/spy@2.0.5': + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + + '@vitest/utils@2.0.5': + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + acorn@8.12.1: resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} @@ -1045,6 +1212,10 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + astro@4.14.5: resolution: {integrity: sha512-sv47kPE6FnvyxxHHcCePNwTKpOMKBq0r1m6WZYg6ag9j3yF9m72ov64NFB7c+hAMDUKgsHfVdLKjOOqDC/c+fA==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} @@ -1063,6 +1234,9 @@ packages: base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -1100,6 +1274,9 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + camelcase@7.0.1: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} @@ -1110,6 +1287,10 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1138,6 +1319,10 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1279,6 +1464,10 @@ packages: decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-uri-component@0.4.1: + resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} + engines: {node: '>=14.16'} + dedent@1.5.3: resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: @@ -1287,6 +1476,10 @@ packages: babel-plugin-macros: optional: true + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-object-diff@1.1.9: resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} @@ -1302,6 +1495,9 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -1318,6 +1514,10 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} + detect-package-manager@3.0.2: + resolution: {integrity: sha512-8JFjJHutStYrfWwzfretQoyNGoZVW1Fsrp4JO9spa7h/fBfwgTMEIy4/LBzRDGsxwVPHU0q+T9YvwLDJoOApLQ==} + engines: {node: '>=12'} + deterministic-object-hash@2.0.2: resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} engines: {node: '>=18'} @@ -1356,8 +1556,8 @@ packages: electron-to-chromium@1.5.13: resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} - emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1475,6 +1675,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + filter-obj@5.1.0: + resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} + engines: {node: '>=14.16'} + find-up-simple@1.0.0: resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} engines: {node: '>=18'} @@ -1530,6 +1734,9 @@ packages: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -1742,6 +1949,10 @@ packages: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} + isbinaryfile@5.0.2: + resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==} + engines: {node: '>= 18.0.0'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1827,6 +2038,9 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -2210,6 +2424,10 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -2229,6 +2447,10 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pkg-pr-new@0.0.20: + resolution: {integrity: sha512-nzTm/c1R5pXKwHW0mkN2FnkHrqW3D29LGAcAYkK28G9n/c8aJEIrb7TAieNV1HPrO9XEj0Z7IHAsKpcsSxO+Pw==} + hasBin: true + pkg-types@1.2.0: resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} @@ -2302,9 +2524,21 @@ packages: resolution: {integrity: sha512-s3EBxg5RSWmpqd0KGzNqPiaBbWDz1/As+2MzoYVGMqgDqRTLBhJW6sywfTBek7OwNfoS/6pS0xdtvChNhFj2cw==} hasBin: true + query-registry@3.0.1: + resolution: {integrity: sha512-M9RxRITi2mHMVPU5zysNjctUT8bAPx6ltEXo/ir9+qmiM47Y7f0Ir3+OxUO5OjYAWdicBQRew7RtHtqUXydqlg==} + engines: {node: '>=20'} + + query-string@9.1.0: + resolution: {integrity: sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw==} + engines: {node: '>=18'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-lru@7.0.0: + resolution: {integrity: sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==} + engines: {node: '>=18'} + range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -2389,6 +2623,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.21.1: + resolution: {integrity: sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -2452,6 +2691,9 @@ packages: shiki@1.14.1: resolution: {integrity: sha512-FujAN40NEejeXdzPt+3sZ3F2dx1U24BY2XTY01+MG8mbxCiA2XukXdcbyMyLAHJ/1AUUnQd1tZlvIjefWWEJeA==} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -2487,17 +2729,31 @@ packages: spawndamnit@2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + split-on-first@3.0.0: + resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} + engines: {node: '>=12'} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + stdin-discarder@0.2.2: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2571,6 +2827,21 @@ packages: tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.0: + resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} + engines: {node: '>=14.0.0'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -2641,40 +2912,44 @@ packages: typescript: optional: true - turbo-darwin-64@2.0.14: - resolution: {integrity: sha512-kwfDmjNwlNfvtrvT29+ZBg5n1Wvxl891bFHchMJyzMoR0HOE9N1NSNdSZb9wG3e7sYNIu4uDkNk+VBEqJW0HzQ==} + turbo-darwin-64@2.1.0: + resolution: {integrity: sha512-gHwpDk2gyB7qZ57gUUwDIS/IkglqEjjVtPZCTxmCRg28Tiwjui0azsLVKrnHP9UZHllozwbi28x8HXLXLEFF1w==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.0.14: - resolution: {integrity: sha512-m3LXYEshCx3wc4ZClM6gb01KYpFmtjQ9IBF3A7ofjb6ahux3xlYZJZ3uFCLAGHuvGLuJ3htfiPbwlDPTdknqqw==} + turbo-darwin-arm64@2.1.0: + resolution: {integrity: sha512-GLaqGetNC6eS4eqXgsheLOHic/OcnGCGDi5boVf+TFZTXYH6YE15L4ugZha4xHXCr1KouCLILHh+f8EHEmWylg==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.0.14: - resolution: {integrity: sha512-7vBzCPdoTtR92SNn2JMgj1FlMmyonGmpMaQdgAB1OVYtuQ6NVGoh7/lODfaILqXjpvmFSVbpBIDrKOT6EvcprQ==} + turbo-linux-64@2.1.0: + resolution: {integrity: sha512-VzBOsj7JyGoZtiNZZ6brjnY7UehRnClluw7pwznuLPzClkqOOPMd2jOcgkWxnP/xW4NBmOoFANXXrtvKBD4f2w==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.0.14: - resolution: {integrity: sha512-jwH+c0bfjpBf26K/tdEFatmnYyXwGROjbr6bZmNcL8R+IkGAc/cglL+OToqJnQZTgZvH7uDGbeSyUo7IsHyjuA==} + turbo-linux-arm64@2.1.0: + resolution: {integrity: sha512-St7svJnOO5g4F6R7Z32e10I/0M3e6qpNjEYybXwPNul9NSfnUXeky4WoKaALwqNhyJ7nYemoFpZ1d+i8hFQTHg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.0.14: - resolution: {integrity: sha512-w9/XwkHSzvLjmioo6cl3S1yRfI6swxsV1j1eJwtl66JM4/pn0H2rBa855R0n7hZnmI6H5ywLt/nLt6Ae8RTDmw==} + turbo-windows-64@2.1.0: + resolution: {integrity: sha512-iSobNud2MrJ1SZ1upVPlErT8xexsr0MQtKapdfq6z0M0rBnrDGEq5bUCSScWyGu+O4+glB4br9xkTAkGFqaxqQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.0.14: - resolution: {integrity: sha512-XaQlyYk+Rf4xS5XWCo8XCMIpssgGGy8blzLfolN6YBp4baElIWMlkLZHDbGyiFmCbNf9I9gJI64XGRG+LVyyjA==} + turbo-windows-arm64@2.1.0: + resolution: {integrity: sha512-d61jN4rjE5PnUfF66GKrKoj8S8Ql4FGXzFFzZz4kjsHpZZzCTtqlzPZBmd1byzGYhDPTorTqG3G1USohbdyohA==} cpu: [arm64] os: [win32] - turbo@2.0.14: - resolution: {integrity: sha512-00JjdCMD/cpsjP0Izkjcm8Oaor5yUCfDwODtaLb+WyblyadkaDEisGhy3Dbd5az9n+5iLSPiUgf+WjPbns6MRg==} + turbo@2.1.0: + resolution: {integrity: sha512-A969/LO/sPHKlapIarY2VVzqQ5JnnW2/1kksZlnMEpsRD6gwOELvVL+ozfMiO7av9RILt3UeN02L17efr6HUCA==} hasBin: true + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} @@ -2698,6 +2973,10 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici@6.19.8: + resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} + engines: {node: '>=18.17'} + unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} @@ -2732,6 +3011,9 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -2742,6 +3024,10 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + url-join@5.0.0: + resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -2763,6 +3049,19 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + vite-node@2.0.5: + resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-tsconfig-paths@5.0.1: + resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + vite@5.4.2: resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -2802,6 +3101,31 @@ packages: vite: optional: true + vitest@2.0.5: + resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.0.5 + '@vitest/ui': 2.0.5 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -2838,6 +3162,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + widest-line@4.0.1: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} @@ -2886,6 +3215,10 @@ packages: resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} + zod-package-json@1.0.3: + resolution: {integrity: sha512-Mb6GzuRyUEl8X+6V6xzHbd4XV0au/4gOYrYP+CAfHL32uPmGswES+v2YqonZiW1NZWVA3jkssCKSU2knonm/aQ==} + engines: {node: '>=20'} + zod-to-json-schema@3.23.2: resolution: {integrity: sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==} peerDependencies: @@ -2958,9 +3291,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/node@8.3.3(astro@4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4))': + '@astrojs/node@8.3.3(astro@4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4))': dependencies: - astro: 4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4) + astro: 4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4) send: 0.18.0 server-destroy: 1.0.1 transitivePeerDependencies: @@ -3548,6 +3881,13 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jsdevtools/ez-spawn@3.0.4': + dependencies: + call-me-maybe: 1.0.2 + cross-spawn: 7.0.3 + string-argv: 0.3.2 + type-detect: 4.1.0 + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.25.4 @@ -3576,67 +3916,187 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@octokit/action@6.1.0': + dependencies: + '@octokit/auth-action': 4.1.0 + '@octokit/core': 5.2.0 + '@octokit/plugin-paginate-rest': 9.2.1(@octokit/core@5.2.0) + '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.0) + '@octokit/types': 12.6.0 + undici: 6.19.8 + + '@octokit/auth-action@4.1.0': + dependencies: + '@octokit/auth-token': 4.0.0 + '@octokit/types': 13.5.0 + + '@octokit/auth-token@4.0.0': {} + + '@octokit/core@5.2.0': + dependencies: + '@octokit/auth-token': 4.0.0 + '@octokit/graphql': 7.1.0 + '@octokit/request': 8.4.0 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.5.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 + + '@octokit/endpoint@9.0.5': + dependencies: + '@octokit/types': 13.5.0 + universal-user-agent: 6.0.1 + + '@octokit/graphql@7.1.0': + dependencies: + '@octokit/request': 8.4.0 + '@octokit/types': 13.5.0 + universal-user-agent: 6.0.1 + + '@octokit/openapi-types@20.0.0': {} + + '@octokit/openapi-types@22.2.0': {} + + '@octokit/plugin-paginate-rest@9.2.1(@octokit/core@5.2.0)': + dependencies: + '@octokit/core': 5.2.0 + '@octokit/types': 12.6.0 + + '@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.2.0)': + dependencies: + '@octokit/core': 5.2.0 + '@octokit/types': 12.6.0 + + '@octokit/request-error@5.1.0': + dependencies: + '@octokit/types': 13.5.0 + deprecation: 2.3.1 + once: 1.4.0 + + '@octokit/request@8.4.0': + dependencies: + '@octokit/endpoint': 9.0.5 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.5.0 + universal-user-agent: 6.0.1 + + '@octokit/types@12.6.0': + dependencies: + '@octokit/openapi-types': 20.0.0 + + '@octokit/types@13.5.0': + dependencies: + '@octokit/openapi-types': 22.2.0 + '@oslojs/encoding@0.4.1': {} '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/pluginutils@5.1.0(rollup@4.21.0)': + '@rollup/pluginutils@5.1.0(rollup@4.21.1)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.21.0 + rollup: 4.21.1 '@rollup/rollup-android-arm-eabi@4.21.0': optional: true + '@rollup/rollup-android-arm-eabi@4.21.1': + optional: true + '@rollup/rollup-android-arm64@4.21.0': optional: true + '@rollup/rollup-android-arm64@4.21.1': + optional: true + '@rollup/rollup-darwin-arm64@4.21.0': optional: true + '@rollup/rollup-darwin-arm64@4.21.1': + optional: true + '@rollup/rollup-darwin-x64@4.21.0': optional: true + '@rollup/rollup-darwin-x64@4.21.1': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.21.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.21.1': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.21.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.21.1': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.21.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.21.1': + optional: true + '@rollup/rollup-linux-arm64-musl@4.21.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.21.1': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.21.1': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.21.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.21.1': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.21.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.21.1': + optional: true + '@rollup/rollup-linux-x64-gnu@4.21.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.21.1': + optional: true + '@rollup/rollup-linux-x64-musl@4.21.0': optional: true + '@rollup/rollup-linux-x64-musl@4.21.1': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.21.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.21.1': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.21.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.21.1': + optional: true + '@rollup/rollup-win32-x64-msvc@4.21.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.21.1': + optional: true + '@shikijs/core@1.14.1': dependencies: '@types/hast': 3.0.4 @@ -3767,6 +4227,39 @@ snapshots: - supports-color - terser + '@vitest/expect@2.0.5': + dependencies: + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.0.5': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.0.5': + dependencies: + '@vitest/utils': 2.0.5 + pathe: 1.1.2 + + '@vitest/snapshot@2.0.5': + dependencies: + '@vitest/pretty-format': 2.0.5 + magic-string: 0.30.11 + pathe: 1.1.2 + + '@vitest/spy@2.0.5': + dependencies: + tinyspy: 3.0.0 + + '@vitest/utils@2.0.5': + dependencies: + '@vitest/pretty-format': 2.0.5 + estree-walker: 3.0.3 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + acorn@8.12.1: {} aggregate-error@3.1.0: @@ -3819,7 +4312,9 @@ snapshots: array-union@2.1.0: {} - astro@4.14.5(@types/node@20.16.1)(rollup@4.21.0)(typescript@5.5.4): + assertion-error@2.0.1: {} + + astro@4.14.5(@types/node@20.16.1)(rollup@4.21.1)(typescript@5.5.4): dependencies: '@astrojs/compiler': 2.10.3 '@astrojs/internal-helpers': 0.4.1 @@ -3832,7 +4327,7 @@ snapshots: '@babel/traverse': 7.25.4 '@babel/types': 7.25.4 '@oslojs/encoding': 0.4.1 - '@rollup/pluginutils': 5.1.0(rollup@4.21.0) + '@rollup/pluginutils': 5.1.0(rollup@4.21.1) '@types/babel__core': 7.20.5 '@types/cookie': 0.6.0 acorn: 8.12.1 @@ -3911,6 +4406,8 @@ snapshots: base-64@1.0.0: {} + before-after-hook@2.2.3: {} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 @@ -3955,12 +4452,22 @@ snapshots: cac@6.7.14: {} + call-me-maybe@1.0.2: {} + camelcase@7.0.1: {} caniuse-lite@1.0.30001653: {} ccount@2.0.1: {} + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -3984,6 +4491,8 @@ snapshots: chardet@0.7.0: {} + check-error@2.1.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -4109,8 +4618,12 @@ snapshots: dependencies: character-entities: 2.0.2 + decode-uri-component@0.4.1: {} + dedent@1.5.3: {} + deep-eql@5.0.2: {} + deep-object-diff@1.1.9: {} deepmerge@4.3.1: {} @@ -4128,6 +4641,8 @@ snapshots: depd@2.0.0: {} + deprecation@2.3.1: {} + dequal@2.0.3: {} destroy@1.2.0: {} @@ -4137,6 +4652,10 @@ snapshots: detect-libc@2.0.3: optional: true + detect-package-manager@3.0.2: + dependencies: + execa: 5.1.1 + deterministic-object-hash@2.0.2: dependencies: base-64: 1.0.0 @@ -4165,7 +4684,7 @@ snapshots: electron-to-chromium@1.5.13: {} - emoji-regex@10.3.0: {} + emoji-regex@10.4.0: {} emoji-regex@8.0.0: {} @@ -4326,6 +4845,8 @@ snapshots: dependencies: to-regex-range: 5.0.1 + filter-obj@5.1.0: {} + find-up-simple@1.0.0: {} find-up@4.1.0: @@ -4375,6 +4896,8 @@ snapshots: get-east-asian-width@1.2.0: {} + get-func-name@2.0.2: {} + get-stream@6.0.1: {} get-stream@8.0.1: {} @@ -4609,6 +5132,8 @@ snapshots: dependencies: is-inside-container: 1.0.0 + isbinaryfile@5.0.2: {} + isexe@2.0.0: {} jackspeak@3.4.3: @@ -4678,6 +5203,10 @@ snapshots: longest-streak@3.1.0: {} + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + lru-cache@10.4.3: {} lru-cache@4.1.5: @@ -5223,6 +5752,8 @@ snapshots: pathe@1.1.2: {} + pathval@2.0.0: {} + picocolors@1.0.1: {} picomatch@2.3.1: {} @@ -5235,6 +5766,17 @@ snapshots: dependencies: find-up: 4.1.0 + pkg-pr-new@0.0.20: + dependencies: + '@jsdevtools/ez-spawn': 3.0.4 + '@octokit/action': 6.1.0 + detect-package-manager: 3.0.2 + fast-glob: 3.3.2 + ignore: 5.3.2 + isbinaryfile: 5.0.2 + pkg-types: 1.2.0 + query-registry: 3.0.1 + pkg-types@1.2.0: dependencies: confbox: 0.1.7 @@ -5301,8 +5843,25 @@ snapshots: postcss: 8.4.41 postcss-selector-parser: 6.1.2 + query-registry@3.0.1: + dependencies: + query-string: 9.1.0 + quick-lru: 7.0.0 + url-join: 5.0.0 + validate-npm-package-name: 5.0.1 + zod: 3.23.8 + zod-package-json: 1.0.3 + + query-string@9.1.0: + dependencies: + decode-uri-component: 0.4.1 + filter-obj: 5.1.0 + split-on-first: 3.0.0 + queue-microtask@1.2.3: {} + quick-lru@7.0.0: {} + range-parser@1.2.1: {} read-yaml-file@1.1.0: @@ -5448,6 +6007,28 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.21.0 fsevents: 2.3.3 + rollup@4.21.1: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.21.1 + '@rollup/rollup-android-arm64': 4.21.1 + '@rollup/rollup-darwin-arm64': 4.21.1 + '@rollup/rollup-darwin-x64': 4.21.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.1 + '@rollup/rollup-linux-arm-musleabihf': 4.21.1 + '@rollup/rollup-linux-arm64-gnu': 4.21.1 + '@rollup/rollup-linux-arm64-musl': 4.21.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.1 + '@rollup/rollup-linux-riscv64-gnu': 4.21.1 + '@rollup/rollup-linux-s390x-gnu': 4.21.1 + '@rollup/rollup-linux-x64-gnu': 4.21.1 + '@rollup/rollup-linux-x64-musl': 4.21.1 + '@rollup/rollup-win32-arm64-msvc': 4.21.1 + '@rollup/rollup-win32-ia32-msvc': 4.21.1 + '@rollup/rollup-win32-x64-msvc': 4.21.1 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -5539,6 +6120,8 @@ snapshots: '@shikijs/core': 1.14.1 '@types/hast': 3.0.4 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -5569,12 +6152,20 @@ snapshots: cross-spawn: 5.1.0 signal-exit: 3.0.7 + split-on-first@3.0.0: {} + sprintf-js@1.0.3: {} + stackback@0.0.2: {} + statuses@2.0.1: {} + std-env@3.7.0: {} + stdin-discarder@0.2.2: {} + string-argv@0.3.2: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -5589,7 +6180,7 @@ snapshots: string-width@7.2.0: dependencies: - emoji-regex: 10.3.0 + emoji-regex: 10.4.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 @@ -5656,6 +6247,14 @@ snapshots: globalyzer: 0.1.0 globrex: 0.1.2 + tinybench@2.9.0: {} + + tinypool@1.0.1: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.0: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -5705,7 +6304,7 @@ snapshots: picocolors: 1.0.1 postcss-load-config: 6.0.1(postcss@8.4.41) resolve-from: 5.0.0 - rollup: 4.21.0 + rollup: 4.21.1 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 @@ -5718,32 +6317,34 @@ snapshots: - tsx - yaml - turbo-darwin-64@2.0.14: + turbo-darwin-64@2.1.0: optional: true - turbo-darwin-arm64@2.0.14: + turbo-darwin-arm64@2.1.0: optional: true - turbo-linux-64@2.0.14: + turbo-linux-64@2.1.0: optional: true - turbo-linux-arm64@2.0.14: + turbo-linux-arm64@2.1.0: optional: true - turbo-windows-64@2.0.14: + turbo-windows-64@2.1.0: optional: true - turbo-windows-arm64@2.0.14: + turbo-windows-arm64@2.1.0: optional: true - turbo@2.0.14: + turbo@2.1.0: optionalDependencies: - turbo-darwin-64: 2.0.14 - turbo-darwin-arm64: 2.0.14 - turbo-linux-64: 2.0.14 - turbo-linux-arm64: 2.0.14 - turbo-windows-64: 2.0.14 - turbo-windows-arm64: 2.0.14 + turbo-darwin-64: 2.1.0 + turbo-darwin-arm64: 2.1.0 + turbo-linux-64: 2.1.0 + turbo-linux-arm64: 2.1.0 + turbo-windows-64: 2.1.0 + turbo-windows-arm64: 2.1.0 + + type-detect@4.1.0: {} type-fest@2.19.0: {} @@ -5757,6 +6358,8 @@ snapshots: undici-types@6.19.8: {} + undici@6.19.8: {} + unicode-emoji-modifier-base@1.0.0: {} unified@11.0.5: @@ -5811,6 +6414,8 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + universal-user-agent@6.0.1: {} + universalify@0.1.2: {} update-browserslist-db@1.1.0(browserslist@4.23.3): @@ -5819,6 +6424,8 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.1 + url-join@5.0.0: {} + util-deprecate@1.0.2: {} validate-npm-package-name@5.0.1: {} @@ -5857,6 +6464,35 @@ snapshots: - supports-color - terser + vite-node@2.0.5(@types/node@20.16.1): + dependencies: + cac: 6.7.14 + debug: 4.3.6 + pathe: 1.1.2 + tinyrainbow: 1.2.0 + vite: 5.4.2(@types/node@20.16.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-tsconfig-paths@5.0.1(typescript@5.5.4)(vite@5.4.2(@types/node@20.16.1)): + dependencies: + debug: 4.3.6 + globrex: 0.1.2 + tsconfck: 3.1.1(typescript@5.5.4) + optionalDependencies: + vite: 5.4.2(@types/node@20.16.1) + transitivePeerDependencies: + - supports-color + - typescript + vite@5.4.2(@types/node@20.16.1): dependencies: esbuild: 0.21.5 @@ -5870,6 +6506,39 @@ snapshots: optionalDependencies: vite: 5.4.2(@types/node@20.16.1) + vitest@2.0.5(@types/node@20.16.1): + dependencies: + '@ampproject/remapping': 2.3.0 + '@vitest/expect': 2.0.5 + '@vitest/pretty-format': 2.0.5 + '@vitest/runner': 2.0.5 + '@vitest/snapshot': 2.0.5 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + debug: 4.3.6 + execa: 8.0.1 + magic-string: 0.30.11 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.4.2(@types/node@20.16.1) + vite-node: 2.0.5(@types/node@20.16.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.16.1 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + web-namespaces@2.0.1: {} webidl-conversions@3.0.1: {} @@ -5906,6 +6575,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + widest-line@4.0.1: dependencies: string-width: 5.1.2 @@ -5950,6 +6624,10 @@ snapshots: yocto-queue@1.1.1: {} + zod-package-json@1.0.3: + dependencies: + zod: 3.23.8 + zod-to-json-schema@3.23.2(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/turbo.json b/turbo.json index 2fa45087..efa2b642 100644 --- a/turbo.json +++ b/turbo.json @@ -1,5 +1,11 @@ { + "$schema": "https://turbo.build/schema.json", + "tasks": { + "test": { + "outputs": [], + "cache": false + }, "build": { "dependsOn": [ "^build" @@ -18,6 +24,9 @@ }, "dev": { "cache": false + }, + "clean": { + "cache": false } } } diff --git a/vitest.config.mts b/vitest.config.mts new file mode 100644 index 00000000..01ec1953 --- /dev/null +++ b/vitest.config.mts @@ -0,0 +1,6 @@ +import tsconfigPaths from 'vite-tsconfig-paths'; +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + plugins: [tsconfigPaths()] +});