Compare commits

...

1 Commits
main ... calver

Author SHA1 Message Date
Corentin Thomasset
32b4129e2c wip 2025-10-07 23:42:44 +02:00
19 changed files with 1059 additions and 72 deletions

View File

@@ -0,0 +1,7 @@
---
type: feature
isBreaking: false
version: 25.10.2
date: '2025-10-07'
---
Switched to calver versioning

1
.changelog/version Normal file
View File

@@ -0,0 +1 @@
25.10.2

View File

@@ -0,0 +1,81 @@
name: Changelog Release
on:
push:
branches:
- main
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
changelog-release:
name: Changelog Release
runs-on: ubuntu-latest
permissions:
contents: write
actions: write
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
fetch-depth: 0 # Need full history for git log in changelog
- name: Install pnpm
uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
- name: Check for pending changelogs
id: check_pending
run: |
if [ -d ".changelog/pending" ] && [ "$(ls -A .changelog/pending/*.md 2>/dev/null)" ]; then
echo "has_pending=true" >> $GITHUB_OUTPUT
echo "Found pending changelog entries"
else
echo "has_pending=false" >> $GITHUB_OUTPUT
echo "No pending changelog entries"
fi
- name: Get next version
if: steps.check_pending.outputs.has_pending == 'true'
id: next_version
run: |
cd packages/changelog
NEXT_VERSION=$(pnpm --silent changelog:next-version)
echo "version=$NEXT_VERSION" >> $GITHUB_OUTPUT
echo "Next version: $NEXT_VERSION"
- name: Release changelog
if: steps.check_pending.outputs.has_pending == 'true'
run: |
cd packages/changelog
pnpm changelog:release -v ${{ steps.next_version.outputs.version }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Commit changelog and version
if: steps.check_pending.outputs.has_pending == 'true'
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add .changelog
git commit -m "chore(release): ${{ steps.next_version.outputs.version }}"
git push
- name: Create git tag
if: steps.check_pending.outputs.has_pending == 'true'
run: |
git tag "v${{ steps.next_version.outputs.version }}"
git push origin "v${{ steps.next_version.outputs.version }}"
- name: Trigger Docker build
if: steps.check_pending.outputs.has_pending == 'true'
run: |
gh workflow run release-docker.yaml -f version="${{ steps.next_version.outputs.version }}"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

4
packages/changelog/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
node_modules
dist
.DS_Store
*.log

View File

@@ -0,0 +1,342 @@
# @papra/changelog
Internal tooling for managing changelog entries and versioning using calendar-based versioning (calver).
## Overview
This package provides CLI tools and utilities to manage changelog entries for Papra's continuous deployment workflow. It replaces the traditional changesets workflow with a calver-based approach that better suits a web application with continuous deployment.
## Versioning Format
Papra uses **calendar versioning** with the format `YY.MM.N`:
- `YY` - Last two digits of the year (e.g., `25` for 2025)
- `MM` - Zero-padded month (e.g., `04` for April)
- `N` - Sequential release number for that month, starting at `1`
**Examples:**
- `25.04.1` - First release in April 2025
- `25.04.2` - Second release in April 2025
- `25.05.1` - First release in May 2025
This format:
- Looks like semantic versioning (two dots)
- Clearly indicates when the release was made
- Supports multiple releases per month
- Resets the sequence counter each month
- Is sortable and human-readable
## Workflow
### During Development (PR Phase)
When working on a feature or fix that should appear in the changelog:
1. Run `pnpm changelog add` to create a new changelog entry
2. Answer the interactive prompts about your change
3. Entry is saved to `apps/docs/src/content/changelog/.pending/`
4. Commit the pending entry with your PR
**Multiple entries per PR:** A single PR can contain multiple changelog entries if it impacts multiple user-facing features or fixes.
### During Release (CD Pipeline)
When code is merged to `main` and passes CI:
1. CD pipeline runs `pnpm changelog release`
2. The tool determines the next version number (`YY.MM.N`)
3. All pending entries are moved to a versioned folder
4. Git tag is created with the version
5. Docker images are built and published with the version tag
## CLI Commands
### `pnpm changelog add`
Interactively create a new changelog entry.
**Prompts:**
- **Type** - `feature` | `fix` | `improvement` | `breaking`
- **Title** - Short, user-facing description (e.g., "Add calendar versioning support")
- **Description** - Detailed markdown explanation of the change
- **Breaking change?** - Whether this change breaks existing functionality
- **PR number** (optional) - Associated pull request number
**Output:**
Creates a markdown file in `apps/docs/src/content/changelog/.pending/` with a unique filename (e.g., `537-add-calver.md`).
**Example entry:**
```markdown
---
type: feature
title: Add calendar versioning support
breaking: false
pr: 537
---
Papra now uses calendar versioning (YY.MM.N) instead of semantic versioning. This provides better clarity about when releases were made and supports continuous deployment.
Each version indicates the year, month, and sequential release number for that month.
```
### `pnpm changelog release`
Process all pending changelog entries and determine the next version number.
**What it does:**
1. Reads all files from `.pending/` folder
2. Looks at existing git tags to find the latest version for current month
3. Determines next version (`YY.MM.N` where N increments)
4. Creates a folder for the new version: `apps/docs/src/content/changelog/{version}/`
5. Moves all pending entries to the versioned folder
6. Adds version and date to each entry's frontmatter
7. Outputs the new version number for use by CD pipeline
**Example:**
```bash
$ pnpm changelog release
📦 Found 3 pending changelog entries
🔍 Latest version for 2025-04: 25.04.1
🚀 Next version: 25.04.2
✅ Moved 3 entries to changelog/25.04.2/
📌 Version: 25.04.2
```
**Usage in CD:**
```bash
VERSION=$(pnpm changelog release --output version)
git tag $VERSION
docker build -t papra:$VERSION .
```
### `pnpm changelog validate`
Validates all pending changelog entries for correct schema and formatting.
Useful in CI to ensure PR contributors have properly formatted their changelog entries.
## File Structure
```
apps/docs/src/content/changelog/
├── .pending/ # Pending entries (pre-release)
│ ├── 537-add-calver.md
│ ├── 538-fix-docker-build.md
│ └── 539-improve-ui.md
├── 25.04.2/ # Released version
│ ├── add-calver.md
│ ├── fix-docker-build.md
│ └── improve-ui.md
├── 25.04.1/
│ ├── usage-page.md
│ └── org-invites.md
└── 25.03.1/
└── subscription-management.md
```
## Changelog Entry Schema
Each changelog entry (both pending and released) follows this schema:
```typescript
{
type: 'feature' | 'fix' | 'improvement' | 'breaking'
title: string // Short, user-facing title
breaking: boolean // Is this a breaking change?
pr?: number // Associated PR number
version?: string // Added during release (e.g., "25.04.2")
date?: string // Added during release (ISO format)
}
```
**Frontmatter example:**
```yaml
---
type: feature
title: Add calendar versioning support
breaking: false
pr: 537
version: 25.04.2
date: 2025-04-07
---
```
## Integration with Astro
The changelog entries are consumed by the Astro documentation site:
```typescript
// apps/docs/src/content/config.ts
import { defineCollection, z } from 'astro:content';
const changelog = defineCollection({
schema: z.object({
type: z.enum(['feature', 'fix', 'improvement', 'breaking']),
title: z.string(),
breaking: z.boolean(),
pr: z.number().optional(),
version: z.string().optional(),
date: z.string().optional(),
}),
});
export const collections = { changelog };
```
The changelog page can then query and display entries:
```astro
---
import { getCollection } from 'astro:content';
const entries = await getCollection('changelog');
const byVersion = entries.reduce((acc, entry) => {
const version = entry.data.version || 'pending';
if (!acc[version]) acc[version] = [];
acc[version].push(entry);
return acc;
}, {});
---
<div class="changelog">
{Object.entries(byVersion).map(([version, entries]) => (
<section class="version">
<h2>{version}</h2>
{entries.map(entry => (
<article class={entry.data.breaking ? 'breaking' : ''}>
<h3>{entry.data.title}</h3>
<div>{entry.body}</div>
</article>
))}
</section>
))}
</div>
```
## CD Pipeline Integration
Example GitHub Actions workflow:
```yaml
name: Release
on:
push:
branches: [main]
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v2
- name: Install dependencies
run: pnpm install
- name: Build packages
run: pnpm build:packages
- name: Run tests
run: pnpm test
- name: Process changelog and release
run: |
VERSION=$(pnpm changelog release --output version)
echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Create git tag
run: |
git tag ${{ env.VERSION }}
git push origin ${{ env.VERSION }}
- name: Build and push Docker image
run: |
docker build -t papra/papra:${{ env.VERSION }} .
docker tag papra/papra:${{ env.VERSION }} papra/papra:latest
docker push papra/papra:${{ env.VERSION }}
docker push papra/papra:latest
```
## Development
### Setup
```bash
cd packages/changelog
pnpm install
pnpm build
```
### Testing
```bash
pnpm test
pnpm test:watch
```
### Local development
```bash
pnpm dev # Watch mode
```
## Migration from Changesets
When migrating from changesets to this system:
1. Process any pending changesets: `pnpm changeset version`
2. Create a final semver release and tag
3. Remove `.changeset/` folder and configuration
4. Install this package
5. Update CI/CD pipeline to use `pnpm changelog release`
6. Create a migration guide changelog entry explaining the new versioning scheme to users
## Breaking Changes and Self-Hosters
Since Papra supports self-hosting and users may have custom integrations:
- **Always mark breaking changes** with `breaking: true`
- **Provide migration guides** in the changelog entry body
- **Consider creating a dedicated migration guide** for complex breaking changes
- **Link to migration documentation** from the changelog entry
**Example breaking change entry:**
```markdown
---
type: breaking
title: Change API authentication to use Bearer tokens
breaking: true
pr: 540
---
⚠️ **Breaking Change**
API authentication has been updated to use Bearer tokens instead of API key headers.
**Migration steps:**
1. Update your API client to send `Authorization: Bearer YOUR_API_KEY` header
2. Remove the legacy `X-API-Key` header from your requests
3. Test your integration before deploying
See the [API Authentication Migration Guide](/docs/migrations/bearer-tokens) for detailed examples.
```
## Why Not Semver?
Semantic versioning (major.minor.patch) is designed for libraries and packages where:
- Consumers need to know about breaking changes (major)
- New features are additive (minor)
- Bug fixes are backwards compatible (patch)
For Papra:
- The SaaS version is always on the latest release (users can't choose versions)
- Self-hosters typically want the latest stable version
- Calendar versioning makes it clear when the release was made
- Breaking changes are communicated through changelog entries, not version numbers
- A "0.x" version doesn't make sense for a stable, production-ready application
Calendar versioning provides better clarity and aligns with continuous deployment practices.

View File

@@ -0,0 +1,25 @@
import antfu from '@antfu/eslint-config';
export default antfu({
stylistic: {
semi: true,
},
ignores: ['README.md'],
rules: {
// To allow export on top of files
'ts/no-use-before-define': ['error', { allowNamedExports: true, functions: false }],
// To allow console for CLI logs
'no-console': 'off',
'curly': ['error', 'all'],
'vitest/consistent-test-it': ['error', { fn: 'test' }],
'ts/consistent-type-definitions': ['error', 'type'],
'style/brace-style': ['error', '1tbs', { allowSingleLine: false }],
'unused-imports/no-unused-vars': ['error', {
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
caughtErrorsIgnorePattern: '^_',
}],
},
});

View File

@@ -0,0 +1,36 @@
{
"name": "@papra/changelog",
"type": "module",
"version": "1.0.0",
"packageManager": "pnpm@10.12.3",
"description": "Changelog management and versioning tooling for Papra",
"author": "",
"license": "MIT",
"keywords": [],
"scripts": {
"changelog:add": "tsx src/scripts/add.ts",
"changelog:release": "tsx src/scripts/release.ts",
"changelog:next-version": "tsx src/scripts/next-version.ts",
"changelog:validate": "tsx src/scripts/validate.ts",
"test": "vitest run",
"test:watch": "vitest",
"typecheck": "tsc --noEmit",
"lint": "eslint .",
"lint:fix": "eslint --fix ."
},
"dependencies": {
"@clack/prompts": "^0.10.1",
"@corentinth/friendly-ids": "^0.0.1",
"gray-matter": "^4.0.3",
"picocolors": "^1.1.1",
"zod": "^3.25.67"
},
"devDependencies": {
"@antfu/eslint-config": "catalog:",
"@types/node": "catalog:",
"eslint": "catalog:",
"tsx": "catalog:",
"typescript": "catalog:",
"vitest": "catalog:"
}
}

View File

@@ -0,0 +1,46 @@
import type { ChangelogEntry } from '../types';
import path from 'node:path';
import process from 'node:process';
import * as p from '@clack/prompts';
import pc from 'picocolors';
import { generateFilename, PENDING_DIR, writeEntry } from '../utils';
export async function addCommand(): Promise<void> {
p.intro(pc.bold('Changelog Entry'));
const entry = await p.group(
{
type: () => p.select<ChangelogEntry['type']>({
message: 'What type of change is this?',
options: [
{ value: 'feature', label: 'Feature - New functionality' },
{ value: 'improvement', label: 'Improvement - Enhancement to existing feature' },
{ value: 'fix', label: 'Fix - Bug fix' },
{ value: 'technical', label: 'Technical - Non-user facing change' },
],
}),
content: () => p.text({
message: 'Enter a detailed description (markdown supported):',
placeholder: 'Papra now uses calver for versioning',
}),
isBreaking: () => p.confirm({
message: 'Is this a breaking change?',
initialValue: false,
}),
},
{
onCancel: () => {
p.cancel('Changelog entry creation aborted.');
process.exit(0);
},
},
);
// Generate filename and write
const filename = generateFilename();
const filePath = path.join(PENDING_DIR, filename);
writeEntry({ filePath, entry });
p.outro(pc.green(`Changelog entry created: ${pc.dim(filename)}`));
}

View File

@@ -0,0 +1,9 @@
import process from 'node:process';
import { getNextVersion } from '../utils';
export async function nextVersionCommand(): Promise<void> {
const nextVersion = getNextVersion();
console.log(nextVersion);
process.exit(0);
}

View File

@@ -0,0 +1,41 @@
import process from 'node:process';
import * as p from '@clack/prompts';
import pc from 'picocolors';
import { getPendingEntries, movePendingEntriesToVersion, setCurrentVersion } from '../utils';
export async function releaseCommand({ version }: { version?: string }): Promise<void> {
if (!version) {
p.outro(pc.red('Version is required. Use --version or -v to specify the next version.'));
process.exit(1);
}
// ensure version match YY.MM.N
if (!/^\d{2}\.\d{1,2}\.\d+$/.test(version)) {
p.outro(pc.red('Invalid version format. Use YY.MM.N format, e.g., 24.6.0'));
process.exit(1);
}
const pending = getPendingEntries();
if (pending.length === 0) {
p.outro(pc.yellow('No pending changelog entries found'));
process.exit(0);
}
const date = new Date().toISOString().split('T')[0]!;
p.intro(pc.bold('Release Changelog'));
console.log(pc.dim(`Found ${pending.length} pending changelog ${pending.length === 1 ? 'entry' : 'entries'}`));
console.log(pc.dim(`Next version: ${pc.bold(version)}`));
console.log();
const spinner = p.spinner();
spinner.start('Moving entries to releases folder');
movePendingEntriesToVersion(version, date);
setCurrentVersion(version);
spinner.stop(pc.green(`Moved ${pending.length} ${pending.length === 1 ? 'entry' : 'entries'} to .changelog/releases/${version}/`));
p.outro(pc.green(`Released version: ${pc.bold(version)}`));
}

View File

@@ -0,0 +1,8 @@
#!/usr/bin/env node
import process from 'node:process';
import { addCommand } from '../commands/add';
addCommand().catch((error) => {
console.error('Failed to add changelog entry:', error);
process.exit(1);
});

View File

@@ -0,0 +1,8 @@
#!/usr/bin/env node
import process from 'node:process';
import { nextVersionCommand } from '../commands/next-version';
nextVersionCommand().catch((error) => {
console.error('Failed to get next version:', error);
process.exit(1);
});

View File

@@ -0,0 +1,9 @@
#!/usr/bin/env node
import process from 'node:process';
import { releaseCommand } from '../commands/release';
import { getNextVersion } from '../utils';
releaseCommand({ version: getNextVersion() }).catch((error) => {
console.error('Failed to release changelog:', error);
process.exit(1);
});

View File

@@ -0,0 +1,19 @@
#!/usr/bin/env node
import process from 'node:process';
import { parseArgs } from 'node:util';
import { releaseCommand } from '../commands/release';
const { values: { version } } = parseArgs({
options: {
version: {
type: 'string',
short: 'v',
},
},
});
releaseCommand({ version }).catch((error) => {
console.error('Failed to release changelog:', error);
process.exit(1);
});

View File

@@ -0,0 +1,12 @@
export type PendingChangelogEntry = {
type: string;
content: string;
isBreaking: boolean;
};
export type ChangelogEntry = PendingChangelogEntry & {
version: string;
createdAt: string;
pr?: number;
author?: string;
};

View File

@@ -0,0 +1,234 @@
import type { ChangelogEntry, PendingChangelogEntry } from './types';
import { execSync } from 'node:child_process';
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { adjectives, animals, createIdGenerator } from '@corentinth/friendly-ids';
import matter from 'gray-matter';
const generateId = createIdGenerator({
separator: '-',
chunks: [
({ getRandomItem }) => getRandomItem(adjectives),
({ getRandomItem }) => getRandomItem(adjectives),
({ getRandomItem }) => getRandomItem(animals),
],
});
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const REPO_ROOT = path.resolve(__dirname, '../../..');
export const CHANGELOG_DIR = path.join(REPO_ROOT, '.changelog');
export const PENDING_DIR = path.join(CHANGELOG_DIR, 'pending');
export const RELEASES_DIR = path.join(CHANGELOG_DIR, 'releases');
export const VERSION_FILE = path.join(CHANGELOG_DIR, 'version');
/**
* Ensure the pending directory exists
*/
export function ensureChangelogPendingDirectoryExists(): void {
if (!fs.existsSync(PENDING_DIR)) {
fs.mkdirSync(PENDING_DIR, { recursive: true });
}
}
/**
* Generate a unique filename for a changelog entry
*/
export function generateFilename(): string {
const slug = generateId();
return `${slug}.md`;
}
/**
* Read a changelog entry from a file
*/
export function readPendingEntry(filePath: string): PendingChangelogEntry {
const { data, content } = matter(fs.readFileSync(filePath, 'utf-8'));
return {
...data as Omit<PendingChangelogEntry, 'content'>,
content,
};
}
/**
* Write a changelog entry to a file
*/
export function writeEntry({ filePath, entry: { content, ...rest } }: { filePath: string; entry: ChangelogEntry | PendingChangelogEntry }): void {
ensureChangelogPendingDirectoryExists();
const frontmatter = matter.stringify(content, rest);
fs.writeFileSync(filePath, frontmatter, 'utf-8');
}
/**
* Get all pending changelog entries
*/
export function getPendingEntries(): { path: string; entry: PendingChangelogEntry }[] {
if (!fs.existsSync(PENDING_DIR)) {
return [];
}
const files = fs.readdirSync(PENDING_DIR)
.filter(file => file.endsWith('.md'))
.map(file => path.join(PENDING_DIR, file));
return files.map(filePath => ({
path: filePath,
entry: readPendingEntry(filePath),
}));
}
/**
* Get the commit hash that last modified a file
*/
export function getFileCommitHash(filePath: string): string | null {
try {
const hash = execSync(`git log -1 --format=%H -- "${filePath}"`, {
encoding: 'utf-8',
stdio: ['pipe', 'pipe', 'ignore'],
}).trim();
return hash || null;
}
catch {
return null;
}
}
/**
* Get PR number and author from a commit hash using gh CLI
*/
export function getPRInfoFromCommit(commitHash: string): { pr: number; author: string } | null {
try {
const result = execSync(`gh pr list --search "${commitHash}" --json number,author --state merged --limit 1`, {
encoding: 'utf-8',
stdio: ['pipe', 'pipe', 'ignore'],
});
const prs = JSON.parse(result) as Array<{ number: number; author: { login: string } }>;
if (prs.length === 0) {
return null;
}
const pr = prs[0];
return {
pr: pr!.number,
author: pr!.author.login,
};
}
catch {
return null;
}
}
/**
* Move pending entries to a versioned folder
*/
export function movePendingEntriesToVersion(version: string, date: string): void {
const pending = getPendingEntries();
if (pending.length === 0) {
return;
}
const versionDir = path.join(RELEASES_DIR, version);
if (!fs.existsSync(versionDir)) {
fs.mkdirSync(versionDir, { recursive: true });
}
for (const { path: filePath, entry } of pending) {
const filename = path.basename(filePath);
const newPath = path.join(versionDir, filename);
// Get commit hash and PR info
const commitHash = getFileCommitHash(filePath);
const prInfo = commitHash ? getPRInfoFromCommit(commitHash) : null;
// Update entry with version, date, and PR info
const updatedEntry: ChangelogEntry = {
...entry,
version,
createdAt: date,
...(prInfo && {
pr: prInfo.pr,
author: prInfo.author,
}),
};
writeEntry({ filePath: newPath, entry: updatedEntry });
// Remove from pending
fs.unlinkSync(filePath);
}
}
/**
* Read the current version from the version file
*/
export function getCurrentVersion(): string | null {
try {
if (!fs.existsSync(VERSION_FILE)) {
return null;
}
return fs.readFileSync(VERSION_FILE, 'utf-8').trim();
} catch {
return null;
}
}
/**
* Write the version to the version file
*/
export function setCurrentVersion(version: string): void {
if (!fs.existsSync(CHANGELOG_DIR)) {
fs.mkdirSync(CHANGELOG_DIR, { recursive: true });
}
fs.writeFileSync(VERSION_FILE, version, 'utf-8');
}
/**
* Parse a version string (with or without 'v' prefix) into components
*/
export function parseVersion(version: string): { year: number; month: number; release: number } | null {
const match = version.match(/^v?(\d+)\.(\d+)\.(\d+)$/);
if (!match) {
return null;
}
return {
year: Number(match[1]!),
month: Number(match[2]!),
release: Number(match[3]!),
};
}
/**
* Calculate the next version based on CalVer (YY.M.N) or SemVer
*/
export function getNextVersion({ now = new Date() }: { now?: Date } = {}): string {
const currentYearMod100 = now.getFullYear() % 100;
const currentMonth = now.getMonth() + 1;
const currentVersion = getCurrentVersion();
if (!currentVersion) {
// No version found, start with CalVer format based on current date
return `${currentYearMod100}.${currentMonth}.0`;
}
const parsed = parseVersion(currentVersion);
if (!parsed) {
// Invalid version format, start fresh
return `${currentYearMod100}.${currentMonth}.0`;
}
const { year, month, release } = parsed;
if (year === currentYearMod100 && month === currentMonth) {
// Same month and year, increment release number
return `${year}.${month}.${release + 1}`;
} else {
// New month or year, reset release number
return `${currentYearMod100}.${currentMonth}.0`;
}
}

View File

@@ -0,0 +1,20 @@
{
"compilerOptions": {
"target": "ESNext",
"moduleDetection": "force",
"module": "preserve",
"resolveJsonModule": true,
"types": ["node"],
"allowJs": true,
"strict": true,
"noImplicitOverride": true,
"noUncheckedIndexedAccess": true,
"noEmit": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"isolatedModules": true,
"verbatimModuleSyntax": true,
"skipLibCheck": true
}
}

View File

@@ -0,0 +1,10 @@
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
environment: 'node',
env: {
TZ: 'UTC',
},
},
});

219
pnpm-lock.yaml generated
View File

@@ -24,6 +24,9 @@ catalogs:
tsdown:
specifier: ^0.13.4
version: 0.13.4
tsx:
specifier: ^4.17.0
version: 4.20.3
typescript:
specifier: ^5.6.2
version: 5.8.3
@@ -457,6 +460,43 @@ importers:
specifier: 'catalog:'
version: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.10)(jsdom@26.0.0)
packages/changelog:
dependencies:
'@clack/prompts':
specifier: ^0.10.1
version: 0.10.1
'@corentinth/friendly-ids':
specifier: ^0.0.1
version: 0.0.1
gray-matter:
specifier: ^4.0.3
version: 4.0.3
picocolors:
specifier: ^1.1.1
version: 1.1.1
zod:
specifier: ^3.25.67
version: 3.25.67
devDependencies:
'@antfu/eslint-config':
specifier: 'catalog:'
version: 4.16.2(@vue/compiler-sfc@3.5.13)(astro-eslint-parser@1.1.0(typescript@5.8.3))(eslint-plugin-astro@1.3.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.16.0)(jsdom@26.0.0))
'@types/node':
specifier: 'catalog:'
version: 22.16.0
eslint:
specifier: 'catalog:'
version: 9.30.1(jiti@2.4.2)
tsx:
specifier: 'catalog:'
version: 4.20.3
typescript:
specifier: 'catalog:'
version: 5.8.3
vitest:
specifier: 'catalog:'
version: 3.2.4(@types/debug@4.1.12)(@types/node@22.16.0)(jsdom@26.0.0)
packages/cli:
dependencies:
'@clack/prompts':
@@ -2462,9 +2502,6 @@ packages:
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
'@jridgewell/sourcemap-codec@1.5.4':
resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==}
'@jridgewell/sourcemap-codec@1.5.5':
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
@@ -5347,6 +5384,10 @@ packages:
exsolve@1.0.5:
resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==}
extend-shallow@2.0.1:
resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
engines: {node: '>=0.10.0'}
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
@@ -5619,6 +5660,10 @@ packages:
graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
gray-matter@4.0.3:
resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
engines: {node: '>=6.0'}
gzip-size@6.0.0:
resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
engines: {node: '>=10'}
@@ -5871,6 +5916,10 @@ packages:
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
hasBin: true
is-extendable@0.1.1:
resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
engines: {node: '>=0.10.0'}
is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
@@ -6059,6 +6108,10 @@ packages:
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
kind-of@6.0.3:
resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
engines: {node: '>=0.10.0'}
kleur@3.0.3:
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
engines: {node: '>=6'}
@@ -6923,9 +6976,6 @@ packages:
quansync@0.2.10:
resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==}
quansync@0.2.8:
resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==}
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
@@ -7194,6 +7244,10 @@ packages:
resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==}
engines: {node: ^14.0.0 || >=16.0.0}
section-matter@1.0.0:
resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
engines: {node: '>=4'}
selderee@0.11.0:
resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==}
@@ -7450,6 +7504,10 @@ packages:
resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
engines: {node: '>=12'}
strip-bom-string@1.0.0:
resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==}
engines: {node: '>=0.10.0'}
strip-bom@3.0.0:
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
engines: {node: '>=4'}
@@ -8783,7 +8841,7 @@ snapshots:
'@astrojs/telemetry@3.3.0':
dependencies:
ci-info: 4.2.0
debug: 4.4.1
debug: 4.4.3
dlv: 1.1.3
dset: 3.1.4
is-docker: 3.0.0
@@ -9379,7 +9437,7 @@ snapshots:
'@babel/traverse': 7.26.4
'@babel/types': 7.28.0
convert-source-map: 2.0.0
debug: 4.4.1
debug: 4.4.3
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
@@ -9475,7 +9533,7 @@ snapshots:
'@babel/parser': 7.28.0
'@babel/template': 7.25.9
'@babel/types': 7.28.0
debug: 4.4.1
debug: 4.4.3
globals: 11.12.0
transitivePeerDependencies:
- supports-color
@@ -9849,7 +9907,7 @@ snapshots:
'@esbuild-kit/esm-loader@2.6.5':
dependencies:
'@esbuild-kit/core-utils': 3.3.2
get-tsconfig: 4.10.0
get-tsconfig: 4.10.1
'@esbuild/aix-ppc64@0.19.12':
optional: true
@@ -10323,7 +10381,7 @@ snapshots:
'@eslint/config-array@0.20.0':
dependencies:
'@eslint/object-schema': 2.1.6
debug: 4.4.1
debug: 4.4.3
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
@@ -10331,7 +10389,7 @@ snapshots:
'@eslint/config-array@0.21.0':
dependencies:
'@eslint/object-schema': 2.1.6
debug: 4.4.1
debug: 4.4.3
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
@@ -10355,7 +10413,7 @@ snapshots:
'@eslint/eslintrc@3.3.1':
dependencies:
ajv: 6.12.6
debug: 4.4.1
debug: 4.4.3
espree: 10.4.0
globals: 14.0.0
ignore: 5.3.2
@@ -10491,7 +10549,7 @@ snapshots:
'@antfu/install-pkg': 1.1.0
'@antfu/utils': 8.1.1
'@iconify/types': 2.0.0
debug: 4.4.1
debug: 4.4.3
globals: 15.15.0
kolorist: 1.8.0
local-pkg: 1.1.1
@@ -10595,13 +10653,13 @@ snapshots:
'@jridgewell/gen-mapping@0.3.12':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.4
'@jridgewell/sourcemap-codec': 1.5.5
'@jridgewell/trace-mapping': 0.3.29
'@jridgewell/gen-mapping@0.3.8':
dependencies:
'@jridgewell/set-array': 1.2.1
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/sourcemap-codec': 1.5.5
'@jridgewell/trace-mapping': 0.3.25
'@jridgewell/resolve-uri@3.1.2': {}
@@ -10610,19 +10668,17 @@ snapshots:
'@jridgewell/sourcemap-codec@1.5.0': {}
'@jridgewell/sourcemap-codec@1.5.4': {}
'@jridgewell/sourcemap-codec@1.5.5': {}
'@jridgewell/trace-mapping@0.3.25':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/sourcemap-codec': 1.5.5
'@jridgewell/trace-mapping@0.3.29':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.4
'@jridgewell/sourcemap-codec': 1.5.5
'@js-sdsl/ordered-map@4.4.2': {}
@@ -11925,7 +11981,7 @@ snapshots:
'@typescript-eslint/types': 8.32.1
'@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3)
'@typescript-eslint/visitor-keys': 8.32.1
debug: 4.4.1
debug: 4.4.3
eslint: 9.27.0(jiti@2.4.2)
typescript: 5.8.3
transitivePeerDependencies:
@@ -11937,7 +11993,7 @@ snapshots:
'@typescript-eslint/types': 8.35.1
'@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3)
'@typescript-eslint/visitor-keys': 8.35.1
debug: 4.4.1
debug: 4.4.3
eslint: 9.30.1(jiti@2.4.2)
typescript: 5.8.3
transitivePeerDependencies:
@@ -11947,7 +12003,7 @@ snapshots:
dependencies:
'@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3)
'@typescript-eslint/types': 8.35.1
debug: 4.4.1
debug: 4.4.3
typescript: 5.8.3
transitivePeerDependencies:
- supports-color
@@ -11980,7 +12036,7 @@ snapshots:
dependencies:
'@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3)
'@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)
debug: 4.4.1
debug: 4.4.3
eslint: 9.27.0(jiti@2.4.2)
ts-api-utils: 2.1.0(typescript@5.8.3)
typescript: 5.8.3
@@ -11991,7 +12047,7 @@ snapshots:
dependencies:
'@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3)
'@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
debug: 4.4.1
debug: 4.4.3
eslint: 9.30.1(jiti@2.4.2)
ts-api-utils: 2.1.0(typescript@5.8.3)
typescript: 5.8.3
@@ -12012,7 +12068,7 @@ snapshots:
dependencies:
'@typescript-eslint/types': 8.19.1
'@typescript-eslint/visitor-keys': 8.19.1
debug: 4.4.1
debug: 4.4.3
fast-glob: 3.3.3
is-glob: 4.0.3
minimatch: 9.0.5
@@ -12026,7 +12082,7 @@ snapshots:
dependencies:
'@typescript-eslint/types': 8.21.0
'@typescript-eslint/visitor-keys': 8.21.0
debug: 4.4.1
debug: 4.4.3
fast-glob: 3.3.3
is-glob: 4.0.3
minimatch: 9.0.5
@@ -12040,7 +12096,7 @@ snapshots:
dependencies:
'@typescript-eslint/types': 8.32.1
'@typescript-eslint/visitor-keys': 8.32.1
debug: 4.4.1
debug: 4.4.3
fast-glob: 3.3.3
is-glob: 4.0.3
minimatch: 9.0.5
@@ -12056,7 +12112,7 @@ snapshots:
'@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3)
'@typescript-eslint/types': 8.35.1
'@typescript-eslint/visitor-keys': 8.35.1
debug: 4.4.1
debug: 4.4.3
fast-glob: 3.3.3
is-glob: 4.0.3
minimatch: 9.0.5
@@ -12178,7 +12234,7 @@ snapshots:
chokidar: 3.6.0
colorette: 2.0.20
consola: 3.4.0
magic-string: 0.30.17
magic-string: 0.30.19
pathe: 1.1.2
perfect-debounce: 1.0.0
tinyglobby: 0.2.14
@@ -12272,7 +12328,7 @@ snapshots:
'@unocss/rule-utils@0.65.0-beta.2':
dependencies:
'@unocss/core': 0.65.0-beta.2
magic-string: 0.30.17
magic-string: 0.30.19
'@unocss/transformer-attributify-jsx@0.65.0-beta.2':
dependencies:
@@ -12300,7 +12356,7 @@ snapshots:
'@unocss/core': 0.65.0-beta.2
'@unocss/inspector': 0.65.0-beta.2(vue@3.5.13(typescript@5.8.3))
chokidar: 3.6.0
magic-string: 0.30.17
magic-string: 0.30.19
tinyglobby: 0.2.14
vite: 5.4.19(@types/node@22.16.0)
transitivePeerDependencies:
@@ -12316,7 +12372,7 @@ snapshots:
'@unocss/core': 0.65.0-beta.2
'@unocss/inspector': 0.65.0-beta.2(vue@3.5.13(typescript@5.8.3))
chokidar: 3.6.0
magic-string: 0.30.17
magic-string: 0.30.19
tinyglobby: 0.2.14
vite: 6.3.4(@types/node@24.0.10)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
@@ -12393,7 +12449,7 @@ snapshots:
dependencies:
'@vitest/spy': 3.2.4
estree-walker: 3.0.3
magic-string: 0.30.17
magic-string: 0.30.19
optionalDependencies:
vite: 5.4.19(@types/node@22.16.0)
@@ -12401,7 +12457,7 @@ snapshots:
dependencies:
'@vitest/spy': 3.2.4
estree-walker: 3.0.3
magic-string: 0.30.17
magic-string: 0.30.19
optionalDependencies:
vite: 5.4.19(@types/node@24.0.10)
@@ -12418,7 +12474,7 @@ snapshots:
'@vitest/snapshot@3.2.4':
dependencies:
'@vitest/pretty-format': 3.2.4
magic-string: 0.30.17
magic-string: 0.30.19
pathe: 2.0.3
'@vitest/spy@3.2.4':
@@ -12631,7 +12687,7 @@ snapshots:
'@typescript-eslint/types': 8.35.1
'@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3)
astrojs-compiler-sync: 1.0.1(@astrojs/compiler@2.11.0)
debug: 4.4.1
debug: 4.4.3
entities: 4.5.0
eslint-scope: 8.4.0
eslint-visitor-keys: 4.2.1
@@ -13255,7 +13311,6 @@ snapshots:
debug@4.4.3:
dependencies:
ms: 2.1.3
optional: true
decimal.js@10.5.0: {}
@@ -13339,7 +13394,7 @@ snapshots:
docker-modem@5.0.6:
dependencies:
debug: 4.4.1
debug: 4.4.3
readable-stream: 3.6.2
split-ca: 1.0.1
ssh2: 1.16.0
@@ -13494,7 +13549,7 @@ snapshots:
esbuild-register@3.6.0(esbuild@0.19.12):
dependencies:
debug: 4.4.1
debug: 4.4.3
esbuild: 0.19.12
transitivePeerDependencies:
- supports-color
@@ -13816,12 +13871,12 @@ snapshots:
'@types/doctrine': 0.0.9
'@typescript-eslint/scope-manager': 8.19.1
'@typescript-eslint/utils': 8.19.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)
debug: 4.4.1
debug: 4.4.3
doctrine: 3.0.0
enhanced-resolve: 5.18.0
eslint: 9.27.0(jiti@2.4.2)
eslint-import-resolver-node: 0.3.9
get-tsconfig: 4.10.0
get-tsconfig: 4.10.1
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.7.2
@@ -13836,7 +13891,7 @@ snapshots:
'@es-joy/jsdoccomment': 0.50.1
are-docs-informative: 0.0.2
comment-parser: 1.4.1
debug: 4.4.1
debug: 4.4.3
escape-string-regexp: 4.0.0
eslint: 9.27.0(jiti@2.4.2)
espree: 10.4.0
@@ -13852,7 +13907,7 @@ snapshots:
'@es-joy/jsdoccomment': 0.52.0
are-docs-informative: 0.0.2
comment-parser: 1.4.1
debug: 4.4.1
debug: 4.4.3
escape-string-regexp: 4.0.0
eslint: 9.30.1(jiti@2.4.2)
espree: 10.4.0
@@ -13897,7 +13952,7 @@ snapshots:
enhanced-resolve: 5.18.0
eslint: 9.27.0(jiti@2.4.2)
eslint-plugin-es-x: 7.8.0(eslint@9.27.0(jiti@2.4.2))
get-tsconfig: 4.10.0
get-tsconfig: 4.10.1
globals: 15.14.0
ignore: 5.3.2
minimatch: 9.0.5
@@ -13974,7 +14029,7 @@ snapshots:
eslint-plugin-toml@0.12.0(eslint@9.27.0(jiti@2.4.2)):
dependencies:
debug: 4.4.1
debug: 4.4.3
eslint: 9.27.0(jiti@2.4.2)
eslint-compat-utils: 0.6.4(eslint@9.27.0(jiti@2.4.2))
lodash: 4.17.21
@@ -13984,7 +14039,7 @@ snapshots:
eslint-plugin-toml@0.12.0(eslint@9.30.1(jiti@2.4.2)):
dependencies:
debug: 4.4.1
debug: 4.4.3
eslint: 9.30.1(jiti@2.4.2)
eslint-compat-utils: 0.6.4(eslint@9.30.1(jiti@2.4.2))
lodash: 4.17.21
@@ -14074,7 +14129,7 @@ snapshots:
eslint-plugin-yml@1.16.0(eslint@9.27.0(jiti@2.4.2)):
dependencies:
debug: 4.4.1
debug: 4.4.3
eslint: 9.27.0(jiti@2.4.2)
eslint-compat-utils: 0.6.4(eslint@9.27.0(jiti@2.4.2))
lodash: 4.17.21
@@ -14085,7 +14140,7 @@ snapshots:
eslint-plugin-yml@1.18.0(eslint@9.30.1(jiti@2.4.2)):
dependencies:
debug: 4.4.1
debug: 4.4.3
escape-string-regexp: 4.0.0
eslint: 9.30.1(jiti@2.4.2)
eslint-compat-utils: 0.6.5(eslint@9.30.1(jiti@2.4.2))
@@ -14185,7 +14240,7 @@ snapshots:
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.6
debug: 4.4.1
debug: 4.4.3
escape-string-regexp: 4.0.0
eslint-scope: 8.4.0
eslint-visitor-keys: 4.2.1
@@ -14295,6 +14350,10 @@ snapshots:
exsolve@1.0.5: {}
extend-shallow@2.0.1:
dependencies:
is-extendable: 0.1.1
extend@3.0.2: {}
extendable-error@0.1.7: {}
@@ -14481,7 +14540,7 @@ snapshots:
gel@2.0.1:
dependencies:
'@petamoriken/float16': 3.9.1
debug: 4.4.1
debug: 4.4.3
env-paths: 3.0.0
semver: 7.7.2
shell-quote: 1.8.2
@@ -14592,6 +14651,13 @@ snapshots:
graphemer@1.4.0: {}
gray-matter@4.0.3:
dependencies:
js-yaml: 3.14.1
kind-of: 6.0.3
section-matter: 1.0.0
strip-bom-string: 1.0.0
gzip-size@6.0.0:
dependencies:
duplexer: 0.1.2
@@ -14852,7 +14918,7 @@ snapshots:
http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.3
debug: 4.4.1
debug: 4.4.3
transitivePeerDependencies:
- supports-color
@@ -14867,7 +14933,7 @@ snapshots:
https-proxy-agent@7.0.6:
dependencies:
agent-base: 7.1.3
debug: 4.4.1
debug: 4.4.3
transitivePeerDependencies:
- supports-color
@@ -14907,7 +14973,7 @@ snapshots:
importx@0.4.4:
dependencies:
bundle-require: 5.1.0(esbuild@0.23.1)
debug: 4.4.1
debug: 4.4.3
esbuild: 0.23.1
jiti: 2.0.0-beta.3
jiti-v1: jiti@1.21.7
@@ -14969,6 +15035,8 @@ snapshots:
is-docker@3.0.0: {}
is-extendable@0.1.1: {}
is-extglob@2.1.1: {}
is-fullwidth-code-point@3.0.0: {}
@@ -15024,7 +15092,7 @@ snapshots:
istanbul-lib-source-maps@5.0.6:
dependencies:
'@jridgewell/trace-mapping': 0.3.29
debug: 4.4.1
debug: 4.4.3
istanbul-lib-coverage: 3.2.2
transitivePeerDependencies:
- supports-color
@@ -15159,6 +15227,8 @@ snapshots:
dependencies:
json-buffer: 3.0.1
kind-of@6.0.3: {}
kleur@3.0.3: {}
kleur@4.1.5: {}
@@ -15206,7 +15276,7 @@ snapshots:
dependencies:
mlly: 1.7.4
pkg-types: 2.1.0
quansync: 0.2.8
quansync: 0.2.10
locate-path@5.0.0:
dependencies:
@@ -15796,7 +15866,7 @@ snapshots:
micromark@4.0.1:
dependencies:
'@types/debug': 4.1.12
debug: 4.4.1
debug: 4.4.3
decode-named-character-reference: 1.0.2
devlop: 1.1.0
micromark-core-commonmark: 2.0.2
@@ -16330,8 +16400,6 @@ snapshots:
quansync@0.2.10: {}
quansync@0.2.8: {}
queue-microtask@1.2.3: {}
radix3@1.1.2: {}
@@ -16643,7 +16711,7 @@ snapshots:
'@babel/types': 7.28.2
ast-kit: 2.1.1
birpc: 2.5.0
debug: 4.4.1
debug: 4.4.3
dts-resolver: 2.1.1
get-tsconfig: 4.10.1
rolldown: 1.0.0-beta.31
@@ -16740,6 +16808,11 @@ snapshots:
refa: 0.12.1
regexp-ast-analysis: 0.7.1
section-matter@1.0.0:
dependencies:
extend-shallow: 2.0.1
kind-of: 6.0.3
selderee@0.11.0:
dependencies:
parseley: 0.12.1
@@ -17063,6 +17136,8 @@ snapshots:
dependencies:
ansi-regex: 6.1.0
strip-bom-string@1.0.0: {}
strip-bom@3.0.0: {}
strip-indent@3.0.0:
@@ -17352,7 +17427,7 @@ snapshots:
tsx@4.20.3:
dependencies:
esbuild: 0.25.2
get-tsconfig: 4.10.0
get-tsconfig: 4.10.1
optionalDependencies:
fsevents: 2.3.3
@@ -17620,7 +17695,7 @@ snapshots:
vite-node@3.2.4(@types/node@22.16.0):
dependencies:
cac: 6.7.14
debug: 4.4.1
debug: 4.4.3
es-module-lexer: 1.7.0
pathe: 2.0.3
vite: 5.4.19(@types/node@22.16.0)
@@ -17638,7 +17713,7 @@ snapshots:
vite-node@3.2.4(@types/node@24.0.10):
dependencies:
cac: 6.7.14
debug: 4.4.1
debug: 4.4.3
es-module-lexer: 1.7.0
pathe: 2.0.3
vite: 5.4.19(@types/node@24.0.10)
@@ -17750,9 +17825,9 @@ snapshots:
'@vitest/spy': 3.2.4
'@vitest/utils': 3.2.4
chai: 5.2.0
debug: 4.4.1
debug: 4.4.3
expect-type: 1.2.1
magic-string: 0.30.17
magic-string: 0.30.19
pathe: 2.0.3
picomatch: 4.0.2
std-env: 3.9.0
@@ -17783,16 +17858,16 @@ snapshots:
dependencies:
'@types/chai': 5.2.2
'@vitest/expect': 3.2.4
'@vitest/mocker': 3.2.4(vite@5.4.19(@types/node@24.0.10))
'@vitest/mocker': 3.2.4(vite@5.4.19(@types/node@22.16.0))
'@vitest/pretty-format': 3.2.4
'@vitest/runner': 3.2.4
'@vitest/snapshot': 3.2.4
'@vitest/spy': 3.2.4
'@vitest/utils': 3.2.4
chai: 5.2.0
debug: 4.4.1
debug: 4.4.3
expect-type: 1.2.1
magic-string: 0.30.17
magic-string: 0.30.19
pathe: 2.0.3
picomatch: 4.0.2
std-env: 3.9.0
@@ -17830,9 +17905,9 @@ snapshots:
'@vitest/spy': 3.2.4
'@vitest/utils': 3.2.4
chai: 5.2.0
debug: 4.4.1
debug: 4.4.3
expect-type: 1.2.1
magic-string: 0.30.17
magic-string: 0.30.19
pathe: 2.0.3
picomatch: 4.0.2
std-env: 3.9.0
@@ -17861,7 +17936,7 @@ snapshots:
vue-eslint-parser@10.2.0(eslint@9.30.1(jiti@2.4.2)):
dependencies:
debug: 4.4.1
debug: 4.4.3
eslint: 9.30.1(jiti@2.4.2)
eslint-scope: 8.4.0
eslint-visitor-keys: 4.2.1
@@ -17873,7 +17948,7 @@ snapshots:
vue-eslint-parser@9.4.3(eslint@9.27.0(jiti@2.4.2)):
dependencies:
debug: 4.4.1
debug: 4.4.3
eslint: 9.27.0(jiti@2.4.2)
eslint-scope: 7.2.2
eslint-visitor-keys: 3.4.3