diff --git a/.changeset/pretty-cycles-show.md b/.changeset/pretty-cycles-show.md new file mode 100644 index 0000000..326b9ea --- /dev/null +++ b/.changeset/pretty-cycles-show.md @@ -0,0 +1,24 @@ +--- +'hot-hook': patch +--- + +## Global watching and file-changed events + +Add support for "global watching" and "file-changed" events + +Before this commit, Hot-hook only watched files after they were imported at runtime. Now, it directly watches all project files and sends a "file-changed" event whenever a file is modified, deleted, or added. This allows "runners" to react in various ways to file changes based on their needs. + +The option to configure which files to watch is `include`, and by default is set to `["**/*"]`, meaning all files from the `rootDirectory`. + +The behavior will be as follows: +- If the file has not yet been imported at runtime, and therefore is not part of the import graph, and it is modified, then a `hot-hook:file-changed` event will be emitted with the payload `{ path: string, action: "change" | "add" | "unlink"}` +- If the file has already been imported at runtime, and it is hot reloadable, then a `hot-hook:invalidated` event will be emitted with the payload `{ path: string }`. As before. +- If the file has already been imported at runtime and it is not hot reloadable, then `hot-hook:full-reload` will be emitted with the payload `{ path: string }`. As before. + +## Environment variables configuration + +You can now configure certain environment variables for hot-hook, which are: +- `HOT_HOOK_IGNORE`: for the `ignore` option. Example: `HOT_HOOK_IGNORE=**/node_modules/**,**/dist/**` +- `HOT_HOOK_INCLUDE`: for the `include` option. Example: `HOT_HOOK_INCLUDE=**/*` +- `HOT_HOOK_BOUNDARIES`: for the `boundaries` option. Example: `HOT_HOOK_BOUNDARIES=./controllers/**/*.ts` +- `HOT_HOOK_RESTART`: for the `restart` option. Example: `HOT_HOOK_RESTART=.env,./config/**/*.ts` diff --git a/examples/hono/package.json b/examples/hono/package.json index fde1552..a3c4c5d 100644 --- a/examples/hono/package.json +++ b/examples/hono/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "dev:tsnode": "hot-runner --node-args=--import=./tsnode.esm.js --node-args=--import=hot-hook/register src/index.tsx", - "dev:tsx": "hot-runner --node-args=--import=tsx --node-args=--import=hot-hook/register src/index.tsx" + "dev:tsx": "hot-runner --node-args=--import=tsx --node-args=--import=hot-hook/register --no-clear-screen src/index.tsx" }, "dependencies": { "@hono/node-server": "^1.14.3", diff --git a/package.json b/package.json index 4648690..b955ccd 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "keywords": [], "scripts": { "typecheck": "pnpm run -r --parallel typecheck", - "lint": "eslint . --ext=.ts", + "lint": "eslint .", "test": "pnpm run -r --parallel test", "build": "pnpm run -r build", "release": "pnpm run build && changeset publish" @@ -37,6 +37,7 @@ "prettier": "^3.5.3", "supertest": "^7.1.1", "ts-node": "^10.9.2", + "tsdown": "^0.12.5", "tsx": "^4.19.4", "typescript": "^5.8.3" }, diff --git a/packages/hot_hook/src/dependency_tree.ts b/packages/hot_hook/src/dependency_tree.ts index 8d2c15b..50a841c 100644 --- a/packages/hot_hook/src/dependency_tree.ts +++ b/packages/hot_hook/src/dependency_tree.ts @@ -61,6 +61,13 @@ export default class DependencyTree { this.#pathMap.set(this.#tree.path, this.#tree) } + /** + * Check if a path is inside the dependency tree + */ + isInside(path: string): boolean { + return this.#pathMap.has(path) + } + /** * Get the version of a file */ diff --git a/packages/hot_hook/src/hot.ts b/packages/hot_hook/src/hot.ts index 3bd94f2..de752c7 100644 --- a/packages/hot_hook/src/hot.ts +++ b/packages/hot_hook/src/hot.ts @@ -34,6 +34,7 @@ class Hot { this.#options.onFullReloadAsked?.() return } + process.send?.({ type: 'hot-hook:invalidated', paths: message.paths }) for (const url of message.paths) { @@ -41,15 +42,28 @@ class Hot { callback?.() } } + + if (message.type === 'hot-hook:file-changed') { + process.send?.(message) + } } /** * Register the hot reload hooks */ async init(options: InitOptions) { + const envIgnore = process.env.HOT_HOOK_IGNORE?.split(',').map((p) => p.trim()) + const envRestart = process.env.HOT_HOOK_RESTART?.split(',').map((p) => p.trim()) + const envBoundaries = process.env.HOT_HOOK_BOUNDARIES?.split(',').map((p) => p.trim()) + const envInclude = process.env.HOT_HOOK_INCLUDE?.split(',').map((p) => p.trim()) + this.#options = Object.assign( { - ignore: [ + include: envInclude || ['**/*'], + boundaries: envBoundaries || [], + restart: envRestart || ['.env'], + throwWhenBoundariesAreNotDynamicallyImported: false, + ignore: envIgnore || [ '**/node_modules/**', /** * Vite has a bug where it create multiple files with a @@ -59,7 +73,6 @@ class Hot { '**/vite.config.js.timestamp*', '**/vite.config.ts.timestamp*', ], - restart: ['.env'], }, options, ) @@ -79,6 +92,7 @@ class Hot { data: { root: this.#options.root, ignore: this.#options.ignore, + include: this.#options.include, restart: this.#options.restart, boundaries: this.#options.boundaries, messagePort: this.#messageChannel.port2, diff --git a/packages/hot_hook/src/loader.ts b/packages/hot_hook/src/loader.ts index 2116a33..4e8e7c8 100644 --- a/packages/hot_hook/src/loader.ts +++ b/packages/hot_hook/src/loader.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url' -import chokidar, { type FSWatcher } from 'chokidar' import { access, realpath } from 'node:fs/promises' +import chokidar, { type FSWatcher } from 'chokidar' import type { MessagePort } from 'node:worker_threads' import { resolve as pathResolve, dirname } from 'node:path' import type { InitializeHook, LoadHook, ResolveHook } from 'node:module' @@ -8,9 +8,14 @@ import type { InitializeHook, LoadHook, ResolveHook } from 'node:module' import debug from './debug.js' import { Matcher } from './matcher.js' import DependencyTree from './dependency_tree.js' -import type { InitializeHookOptions } from './types.js' import { DynamicImportChecker } from './dynamic_import_checker.js' import { FileNotImportedDynamicallyException } from './errors/file_not_imported_dynamically_exception.js' +import type { + FileChangeAction, + InitializeHookOptions, + MessageChannelMessage, + MessageChannelPerType, +} from './types.js' export class HotHookLoader { #options: InitializeHookOptions @@ -19,6 +24,7 @@ export class HotHookLoader { #messagePort?: MessagePort #watcher!: FSWatcher #pathIgnoredMatcher!: Matcher + #pathIncludedMatcher!: Matcher #dependencyTree: DependencyTree #hardcodedBoundaryMatcher!: Matcher #dynamicImportChecker!: DynamicImportChecker @@ -39,11 +45,13 @@ export class HotHookLoader { * Initialize the class with the provided root path. */ #initialize(root: string) { - this.#watcher = this.#createWatcher().add([root, ...(this.#options.restart || [])]) this.#projectRoot = this.#projectRoot ?? dirname(root) this.#reloadMatcher = new Matcher(this.#projectRoot, this.#options.restart || []) this.#pathIgnoredMatcher = new Matcher(this.#projectRoot, this.#options.ignore) + this.#pathIncludedMatcher = new Matcher(this.#projectRoot, this.#options.include || []) this.#hardcodedBoundaryMatcher = new Matcher(this.#projectRoot, this.#options.boundaries) + + this.#watcher = this.#createWatcher() } /** @@ -58,33 +66,46 @@ export class HotHookLoader { } } + #postMessage(type: T, data: MessageChannelPerType[T]) { + this.#messagePort?.postMessage({ type, ...data }) + } + /** * When a message is received from the main thread */ #onMessage(message: any) { if (message.type !== 'hot-hook:dump') return - - const dump = this.#dependencyTree.dump() - this.#messagePort?.postMessage({ type: 'hot-hook:dump', dump }) + this.#messagePort?.postMessage({ type: 'hot-hook:dump', dump: this.#dependencyTree.dump() }) } /** * When a file changes, invalidate it and its dependents. */ - async #onFileChange(relativeFilePath: string) { - debug('File change %s', relativeFilePath) - + async #onFileChange(relativeFilePath: string, action: FileChangeAction) { + debug('File change %s', { relativeFilePath, action }) const filePath = pathResolve(relativeFilePath) - const realFilePath = await realpath(filePath) /** - * First check if file still exists. If not, we must remove it from the - * dependency tree + * If the file is removed, we must remove it from the dependency tree + * and stop watching it. */ - const isFileExist = await this.#checkIfFileExists(realFilePath) - if (!isFileExist) { - debug('File does not exist anymore %s', realFilePath) - return this.#dependencyTree.remove(realFilePath) + if (action === 'unlink') { + debug('File removed %s', filePath) + this.#watcher.unwatch(filePath) + this.#postMessage('hot-hook:file-changed', { path: filePath, action: 'unlink' }) + + return this.#dependencyTree.remove(filePath) + } + + /** + * Defensive check to ensure the file still exists. + * If it doesn't, we just return and do nothing. + */ + const fileExists = await this.#checkIfFileExists(filePath) + if (!fileExists) { + debug('File does not exist anymore %s', filePath) + this.#watcher.unwatch(filePath) + return this.#dependencyTree.remove(filePath) } /** @@ -96,9 +117,19 @@ export class HotHookLoader { /** * If the file is an hardcoded reload file, we trigger a full reload. */ + const realFilePath = await realpath(filePath) if (this.#reloadMatcher.match(realFilePath)) { debug('Full reload (hardcoded `restart` file) %s', realFilePath) - return this.#messagePort?.postMessage({ type: 'hot-hook:full-reload', path: realFilePath }) + return this.#postMessage('hot-hook:full-reload', { path: realFilePath }) + } + + /** + * Check if the file exist in the dependency tree. If not, means it was still + * not loaded, so we just send a "file-changed" message + */ + if (!this.#dependencyTree.isInside(realFilePath)) { + debug('File not in dependency tree, sending file-changed message %s', realFilePath) + return this.#postMessage('hot-hook:file-changed', { path: realFilePath, action }) } /** @@ -108,11 +139,7 @@ export class HotHookLoader { const { reloadable, shouldBeReloadable } = this.#dependencyTree.isReloadable(realFilePath) if (!reloadable) { debug('Full reload (not-reloadable file) %s', realFilePath) - return this.#messagePort?.postMessage({ - type: 'hot-hook:full-reload', - path: realFilePath, - shouldBeReloadable, - }) + return this.#postMessage('hot-hook:full-reload', { path: realFilePath, shouldBeReloadable }) } /** @@ -120,17 +147,32 @@ export class HotHookLoader { */ const invalidatedFiles = this.#dependencyTree.invalidateFileAndDependents(realFilePath) debug('Invalidating %s', Array.from(invalidatedFiles).join(', ')) - this.#messagePort?.postMessage({ type: 'hot-hook:invalidated', paths: [...invalidatedFiles] }) + this.#postMessage('hot-hook:invalidated', { paths: [...invalidatedFiles] }) } /** * Create the chokidar watcher instance. */ #createWatcher() { - const watcher = chokidar.watch([]) + const watcher = chokidar.watch('.', { + ignoreInitial: true, + cwd: this.#projectRoot, + ignored: (file, stats) => { + if (file === this.#projectRoot) return false + if (!stats) return false + + if (this.#pathIgnoredMatcher.match(file)) return true + if (this.#reloadMatcher.match(file)) return false + + if (stats.isDirectory()) return false - watcher.on('change', this.#onFileChange.bind(this)) - watcher.on('unlink', this.#onFileChange.bind(this)) + return !this.#pathIncludedMatcher.match(file) + }, + }) + + watcher.on('change', (path) => this.#onFileChange(path, 'change')) + watcher.on('unlink', (path) => this.#onFileChange(path, 'unlink')) + watcher.on('add', (path) => this.#onFileChange(path, 'add')) return watcher } @@ -215,6 +257,7 @@ export class HotHookLoader { this.#initialize(resultPath) return result } + /** * Sometimes we receive a parentUrl that is just `data:`. I didn't really understand * why yet, for now we just ignore these cases. diff --git a/packages/hot_hook/src/register.ts b/packages/hot_hook/src/register.ts index ae187dd..44982e9 100644 --- a/packages/hot_hook/src/register.ts +++ b/packages/hot_hook/src/register.ts @@ -4,9 +4,7 @@ import { readPackageUp } from 'read-package-up' import { hot } from './hot.js' const pkgJson = await readPackageUp() -if (!pkgJson) { - throw new Error('Could not find package.json') -} +if (!pkgJson) throw new Error('Could not find package.json') const { packageJson, path: packageJsonPath } = pkgJson const hotHookConfig = packageJson.hotHook @@ -14,7 +12,5 @@ const hotHookConfig = packageJson.hotHook await hot.init({ ...(hotHookConfig || {}), rootDirectory: dirname(packageJsonPath), - throwWhenBoundariesAreNotDynamicallyImported: - hotHookConfig?.throwWhenBoundariesAreNotDynamicallyImported ?? false, root: hotHookConfig?.root ? resolve(packageJsonPath, hotHookConfig.root) : undefined, }) diff --git a/packages/hot_hook/src/types.ts b/packages/hot_hook/src/types.ts index 375f95e..f9692b4 100644 --- a/packages/hot_hook/src/types.ts +++ b/packages/hot_hook/src/types.ts @@ -1,8 +1,16 @@ import type { MessagePort } from 'node:worker_threads' +export type FileChangeAction = 'change' | 'add' | 'unlink' export type MessageChannelMessage = | { type: 'hot-hook:full-reload'; path: string; shouldBeReloadable?: boolean } | { type: 'hot-hook:invalidated'; paths: string[] } + | { type: 'hot-hook:file-changed'; path: string; action: FileChangeAction } + +export type MessageChannelPerType = { + [K in MessageChannelMessage['type']]: Omit, 'type'> +} + +type PathOrGlobPattern = string export interface InitOptions { /** @@ -12,12 +20,6 @@ export interface InitOptions { */ onFullReloadAsked?: () => void - /** - * Paths that will not be watched by the hook. - * @default ['/node_modules/'] - */ - ignore?: string[] - /** * Path to the root file of the application. */ @@ -29,11 +31,24 @@ export interface InitOptions { */ rootDirectory?: string + /** + * Paths/glob patterns that will be watched by the hook. + * + * @default ['**\/*'] + */ + include?: PathOrGlobPattern[] + + /** + * Paths/glob patterns that will not be watched by the hook. + * @default ['/node_modules/'] + */ + ignore?: PathOrGlobPattern[] + /** * Files that will create an HMR boundary. This is equivalent of importing * the module with `import.meta.hot.boundary` in the module. */ - boundaries?: string[] + boundaries?: PathOrGlobPattern[] /** * List of files that should trigger a full reload when change. @@ -47,7 +62,7 @@ export interface InitOptions { * * @default ['.env'] */ - restart?: string[] + restart?: PathOrGlobPattern[] /** * If true, the hook will throw an error if a boundary is not dynamically @@ -62,6 +77,7 @@ export type InitializeHookOptions = Pick< | 'root' | 'rootDirectory' | 'boundaries' + | 'include' | 'restart' | 'throwWhenBoundariesAreNotDynamicallyImported' > & { diff --git a/packages/hot_hook/tests/register.spec.ts b/packages/hot_hook/tests/register.spec.ts index 1ff4a9e..5c2a75e 100644 --- a/packages/hot_hook/tests/register.spec.ts +++ b/packages/hot_hook/tests/register.spec.ts @@ -129,20 +129,25 @@ test.group('Register', () => { await supertest('http://localhost:3333').get('/').expect(200).expect('Hello World! Updated new') }) - test('use package.json dirname as root directory', async ({ fs }) => { + test('use package.json restart files', async ({ fs }) => { await fakeInstall(fs.basePath) await fs.createJson('package.json', { type: 'module', - hotHook: { boundaries: ['./src/app.js'] }, + hotHook: { + boundaries: ['./app.js'], + restart: ['.restart-file'], + }, }) + await fs.create('.restart-file', '') + await fs.create( - 'bin/server.js', + 'server.js', `import * as http from 'http' import { join } from 'node:path' const server = http.createServer(async (request, response) => { - const app = await import('../src/app.js') + const app = await import('./app.js') await app.default(request, response) }) @@ -150,9 +155,9 @@ test.group('Register', () => { `, ) - await createHandlerFile({ path: 'src/app.js', response: 'Hello World!' }) + await createHandlerFile({ path: 'app.js', response: 'Hello World!' }) - const server = runProcess('bin/server.js', { + const server = runProcess('server.js', { cwd: fs.basePath, env: { NODE_DEBUG: 'hot-hook' }, nodeOptions: ['--import=hot-hook/register'], @@ -160,28 +165,23 @@ test.group('Register', () => { await server.waitForOutput('Server is running') - await supertest('http://localhost:3333').get('/').expect(200).expect('Hello World!') - - await setTimeout(100) - await createHandlerFile({ path: 'src/app.js', response: 'Hello World! Updated' }) - await supertest('http://localhost:3333').get('/').expect(200).expect('Hello World! Updated') - - await setTimeout(100) - await createHandlerFile({ path: 'src/app.js', response: 'Hello World! Updated new' }) - await supertest('http://localhost:3333').get('/').expect(200).expect('Hello World! Updated new') + await fs.create('.restart-file', '') + await pEvent( + server.child, + 'message', + (message: any) => + message?.type === 'hot-hook:full-reload' && message.path.includes('.restart-file'), + ) }) - test('use package.json restart files', async ({ fs }) => { + test('use default reload files when restart files are not defined', async ({ fs }) => { await fakeInstall(fs.basePath) await fs.createJson('package.json', { type: 'module', - hotHook: { - boundaries: ['./app.js'], - restart: ['.restart-file'], - }, + hotHook: { boundaries: ['./app.js'] }, }) - await fs.create('.restart-file', '') + await fs.create('.env', '') await fs.create( 'server.js', @@ -207,24 +207,18 @@ test.group('Register', () => { await server.waitForOutput('Server is running') - await fs.create('.restart-file', '') + await fs.create('.env', '') await pEvent( server.child, 'message', - (message: any) => - message?.type === 'hot-hook:full-reload' && message.path.includes('.restart-file'), + (message: any) => message?.type === 'hot-hook:full-reload' && message.path.includes('.env'), ) }) - test('use default reload files when restart files are not defined', async ({ fs }) => { + test('can use env variables to assign boundaries', async ({ fs }) => { await fakeInstall(fs.basePath) - await fs.createJson('package.json', { - type: 'module', - hotHook: { boundaries: ['./app.js'] }, - }) - await fs.create('.env', '') - + await fs.createJson('package.json', { type: 'module' }) await fs.create( 'server.js', `import * as http from 'http' @@ -235,25 +229,111 @@ test.group('Register', () => { await app.default(request, response) }) - server.listen(3333, () => console.log('Server is running')) - `, + server.listen(3333, () => console.log('Server is running'))`, ) await createHandlerFile({ path: 'app.js', response: 'Hello World!' }) const server = runProcess('server.js', { cwd: fs.basePath, - env: { NODE_DEBUG: 'hot-hook' }, + env: { NODE_DEBUG: 'hot-hook', HOT_HOOK_BOUNDARIES: './app.js' }, nodeOptions: ['--import=hot-hook/register'], }) await server.waitForOutput('Server is running') - await fs.create('.env', '') - await pEvent( + await supertest('http://localhost:3333').get('/').expect(200).expect('Hello World!') + + await createHandlerFile({ path: 'app.js', response: 'Hello World! Updated' }) + await setTimeout(100) + await supertest('http://localhost:3333').get('/').expect(200).expect('Hello World! Updated') + + await createHandlerFile({ path: 'app.js', response: 'Hello World! Updated new' }) + await setTimeout(100) + await supertest('http://localhost:3333').get('/').expect(200).expect('Hello World! Updated new') + }) + + test('can include files to watch and should sent file-changed message', async ({ + fs, + assert, + }) => { + await fakeInstall(fs.basePath) + + await fs.createJson('package.json', { type: 'module' }) + await fs.create('server.js', `console.log('Server is running')`) + await createHandlerFile({ path: 'app.js', response: 'Hello World!' }) + + const server = runProcess('server.js', { + cwd: fs.basePath, + env: { NODE_DEBUG: 'hot-hook', HOT_HOOK_INCLUDE: './app.js' }, + nodeOptions: ['--import=hot-hook/register'], + }) + + await server.waitForOutput('Server is running') + + await createHandlerFile({ path: 'app.js', response: 'Hello World! Updated' }) + const result = await pEvent( server.child, 'message', - (message: any) => message?.type === 'hot-hook:full-reload' && message.path.includes('.env'), + (message: any) => + message?.type === 'hot-hook:file-changed' && message.path === join(fs.basePath, 'app.js'), + ) + + assert.isDefined(result) + }) + + test('send action "unlink" when file is removed', async ({ fs, assert }) => { + await fakeInstall(fs.basePath) + + await fs.createJson('package.json', { type: 'module' }) + await fs.create('server.js', `console.log('Server is running')`) + await createHandlerFile({ path: 'app.js', response: 'Hello World!' }) + + const server = runProcess('server.js', { + cwd: fs.basePath, + env: { NODE_DEBUG: 'hot-hook', HOT_HOOK_INCLUDE: './app.js' }, + nodeOptions: ['--import=hot-hook/register'], + }) + + await server.waitForOutput('Server is running') + + await fs.remove('app.js') + const result = await pEvent(server.child, 'message', (message: any) => { + return ( + message?.type === 'hot-hook:file-changed' && + message.path === join(fs.basePath, 'app.js') && + message.action === 'unlink' + ) + }) + + assert.isDefined(result) + }) + + test('"include" should works with glob patterns', async ({ fs, assert }) => { + await fakeInstall(fs.basePath) + + await fs.createJson('package.json', { type: 'module' }) + await fs.create('server.js', `console.log('Server is running')`) + await createHandlerFile({ path: 'app.js', response: 'Hello World!' }) + + const server = runProcess('server.js', { + cwd: fs.basePath, + env: { NODE_DEBUG: 'hot-hook', HOT_HOOK_INCLUDE: './**/*.js' }, + nodeOptions: ['--import=hot-hook/register'], + }) + + await server.waitForOutput('Server is running') + + await createHandlerFile({ path: 'app2.js', response: 'Hello World! Updated' }) + const result = await pEvent( + server.child, + 'message', + (message: any) => + message?.type === 'hot-hook:file-changed' && + message.path === join(fs.basePath, 'app2.js') && + message.action === 'add', ) + + assert.isDefined(result) }) }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 99d90b7..ef61358 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -74,6 +74,9 @@ importers: ts-node: specifier: ^10.9.2 version: 10.9.2(@swc/core@1.11.29)(@types/node@22.15.29)(typescript@5.8.3) + tsdown: + specifier: ^0.12.5 + version: 0.12.5(typescript@5.8.3) tsx: specifier: ^4.19.4 version: 4.19.4 @@ -408,6 +411,10 @@ packages: resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} engines: {node: '>=6.9.0'} + '@babel/generator@7.27.3': + resolution: {integrity: sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.22.5': resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} @@ -454,6 +461,10 @@ packages: resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.22.20': resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} @@ -462,6 +473,10 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.23.5': resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} @@ -479,6 +494,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.27.4': + resolution: {integrity: sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-syntax-jsx@7.24.1': resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} engines: {node: '>=6.9.0'} @@ -513,6 +533,10 @@ packages: resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} + '@babel/types@7.27.3': + resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -1007,6 +1031,13 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@oxc-project/runtime@0.72.1': + resolution: {integrity: sha512-8nU/WPeJWF6QJrT8HtEEIojz26bXn677deDX8BDVpjcz97CVKORVAvFhE2/lfjnBYE0+aqmjFeD17YnJQpCyqg==} + engines: {node: '>=6.9.0'} + + '@oxc-project/types@0.72.1': + resolution: {integrity: sha512-qlvcDuCjISt4W7Izw0i5+GS3zCKJLXkoNDEc+E4ploage35SlZqxahpdKbHDX8uD70KDVNYWtupsHoNETy5kPQ==} + '@paralleldrive/cuid2@2.2.2': resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} @@ -1144,6 +1175,69 @@ packages: resolution: {integrity: sha512-G0OnZbMWEs5LhDyqy2UL17vGhSVHkQIfVojMtEWVenvj0V5S84VBgy86kJIuNsGDp2p7sTKlpSIpBUWdC35OKg==} engines: {node: '>=20.0.0'} + '@rolldown/binding-darwin-arm64@1.0.0-beta.10-commit.87188ed': + resolution: {integrity: sha512-0tuZTzzjQ1TV5gcoRrIHfRRMyBqzOHL9Yl7BZX5iR+J2hIUBJiq1P+mGAvTb/PDgkYWfEgtBde3AUMJtSj8+Hg==} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.10-commit.87188ed': + resolution: {integrity: sha512-OmtnJvjXlLsPzdDhUdukImWQBztZWhlnDFSrIaBnMXF9WrqwgIG4FfRwQXXhS/iDyCdHqUVr8473OANzVv7Ang==} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.10-commit.87188ed': + resolution: {integrity: sha512-rgtwGtvBGNc5aJROgxvD/ITwC0sY1KdGTADiG3vD1YXmkBCsZIBq1yhCUxz+qUhhIkmohmwqDcgUBCNpa7Wdjw==} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.10-commit.87188ed': + resolution: {integrity: sha512-yeR/cWwnKdv8S/mJGL7ZE+Wt+unSWhhA5FraZtWPavOX6tfelUZIQlAeKrcti2exQbjIMFS4WJ1MyuclyIvFCQ==} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.10-commit.87188ed': + resolution: {integrity: sha512-kg7yeU3XIGmaoKF1+u8OGJ/NE2XMpwgtQpCWzJh7Z8DhJDjMlszhV3DrnKjywI3NmVNCEXYwGO6mYff31xuHug==} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.10-commit.87188ed': + resolution: {integrity: sha512-gvXDfeL4C6dql3Catf8HgnBnDy/zr8ZFX3f/edQ+QY0iJVHY/JG+bitRsNPWWOFmsv/Xm+qSyR44e5VW8Pi1oQ==} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.10-commit.87188ed': + resolution: {integrity: sha512-rpzxr4TyvM3+tXGNjM3AEtgnUM9tpYe6EsIuLiU3fs+KaMKj5vOTr5k/eCACxnjDi4s78ARmqT+Z3ZS2E06U5w==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.10-commit.87188ed': + resolution: {integrity: sha512-cq+Gd1jEie1xxBNllnna21FPaWilWzQK+sI8kF1qMWRI6U909JjS/SzYR0UNLbvNa+neZh8dj37XnxCTQQ40Lw==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.10-commit.87188ed': + resolution: {integrity: sha512-xN4bJ0DQeWJiyerA46d5Lyv5Cor/FoNlbaO9jEOHZDdWz78E2xt/LE3bOND3c59gZa+/YUBEifs4lwixU/wWPg==} + engines: {node: '>=14.21.3'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.10-commit.87188ed': + resolution: {integrity: sha512-xUHManwWX+Lox4zoTY5FiEDGJOjCO9X6hTospFX4f6ELmhJQNnAO4dahZDc/Ph+3wbc3724ZMCGWQvHfTR3wWg==} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.10-commit.87188ed': + resolution: {integrity: sha512-RmO3wCz9iD+grSgLyqMido8NJh6GxkPYRmK6Raoxcs5YC9GuKftxGoanBk0gtyjCKJ6jwizWKWNYJNkZSbWnOw==} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.10-commit.87188ed': + resolution: {integrity: sha512-bWuJ5MoBd1qRCpC9uVxmFKrYjrWkn1ERElKnj0O9N2lWOi30iSTrpDeLMEvwueyiapcJh2PYUxyFE3W9pw29HQ==} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.10-commit.87188ed': + resolution: {integrity: sha512-IjVRLSxjO7EzlW4S6O8AoWbCkEi1lOpE30G8Xw5ZK/zl39K/KjzsDPc1AwhftepueQnQHJMgZZG9ITEmxcF5/A==} + '@rollup/pluginutils@4.2.1': resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} @@ -1817,6 +1911,10 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + engines: {node: '>=14'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1856,6 +1954,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-kit@2.1.0: + resolution: {integrity: sha512-ROM2LlXbZBZVk97crfw8PGDOBzzsJvN2uJCmwswvPUNyfH14eg90mSN3xNqsri1JS1G9cz0VzeDUhxJkTrr4Ew==} + engines: {node: '>=20.18.0'} + async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} @@ -1888,6 +1990,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + birpc@2.3.0: + resolution: {integrity: sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -2300,6 +2405,10 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2325,6 +2434,15 @@ packages: resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} + dts-resolver@2.1.0: + resolution: {integrity: sha512-bgBo2md8jS5V11Rfhw23piIxJDEEDAnQ8hzh+jwKjX50P424IQhiZVVwyEe/n6vPWgEIe3NKrlRUyLMK9u0kaQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2357,6 +2475,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@1.1.0: + resolution: {integrity: sha512-rsPft6CK3eHtrlp9Y5ALBb+hfK+DWnA4WFebbazxjWyx8vSm3rZeoM3z9irsjcqO3PYRzlfv27XIB4tz2DV7RA==} + engines: {node: '>=14'} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -2929,6 +3051,9 @@ packages: resolution: {integrity: sha512-QkACju9MiN59CKSY5JsGZCYmPZkA6sIW6OFCUp7qDjZu6S6KHtJHhAc9Uy9mV9F8PJ1/HQ3ybZF2yjCa/73fvQ==} engines: {node: '>=16.9.0'} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -3936,6 +4061,23 @@ packages: rfdc@1.3.1: resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + rolldown-plugin-dts@0.13.6: + resolution: {integrity: sha512-eeiRAhGWK/v3hFFSWQ1FeE+tvRIIKxGH7uA/THMC1FD3HuTtltxx79+8TqAuD4msfgApJyB9k4Gu3YSWPwkTIQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + rolldown: ^1.0.0-beta.9 + typescript: ^5.0.0 + vue-tsc: ~2.2.0 + peerDependenciesMeta: + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.0.0-beta.10-commit.87188ed: + resolution: {integrity: sha512-D+iim+DHIwK9kbZvubENmtnYFqHfFV0OKwzT8yU/W+xyUK1A71+iRFmJYBGqNUo3fJ2Ob4oIQfan63mhzh614A==} + hasBin: true + rollup@4.41.1: resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -4326,6 +4468,25 @@ packages: '@swc/wasm': optional: true + tsdown@0.12.5: + resolution: {integrity: sha512-5tzqVakJOdIVJLBB6K1e7L4pPTkyLxArkidwsY1jd4P1/4GplYxeHGRmGz8evsXaPJW6IumdbDvIVnmWMnIy2A==} + engines: {node: '>=18.0.0'} + hasBin: true + peerDependencies: + publint: ^0.3.0 + typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 + peerDependenciesMeta: + publint: + optional: true + typescript: + optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -4923,6 +5084,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 + '@babel/generator@7.27.3': + dependencies: + '@babel/parser': 7.27.4 + '@babel/types': 7.27.3 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.22.5': dependencies: '@babel/types': 7.26.0 @@ -4971,10 +5140,14 @@ snapshots: '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.22.20': {} '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-option@7.23.5': {} '@babel/helpers@7.24.4': @@ -4996,6 +5169,10 @@ snapshots: dependencies: '@babel/types': 7.26.0 + '@babel/parser@7.27.4': + dependencies: + '@babel/types': 7.27.3 + '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4)': dependencies: '@babel/core': 7.24.4 @@ -5045,6 +5222,11 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@babel/types@7.27.3': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@bcoe/v8-coverage@1.0.2': {} '@changesets/apply-release-plan@7.0.12': @@ -5651,6 +5833,10 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@oxc-project/runtime@0.72.1': {} + + '@oxc-project/types@0.72.1': {} + '@paralleldrive/cuid2@2.2.2': dependencies: '@noble/hashes': 1.4.0 @@ -5832,6 +6018,44 @@ snapshots: dependencies: quansync: 0.2.10 + '@rolldown/binding-darwin-arm64@1.0.0-beta.10-commit.87188ed': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.10-commit.87188ed': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.10-commit.87188ed': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.10-commit.87188ed': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.10-commit.87188ed': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.10-commit.87188ed': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.10-commit.87188ed': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.10-commit.87188ed': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.10-commit.87188ed': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.10-commit.87188ed': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.10-commit.87188ed': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.10-commit.87188ed': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.10-commit.87188ed': {} + '@rollup/pluginutils@4.2.1': dependencies: estree-walker: 2.0.2 @@ -6416,7 +6640,7 @@ snapshots: '@vue/compiler-core@3.5.13': dependencies: - '@babel/parser': 7.26.2 + '@babel/parser': 7.27.4 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 @@ -6429,7 +6653,7 @@ snapshots: '@vue/compiler-sfc@3.5.13': dependencies: - '@babel/parser': 7.26.2 + '@babel/parser': 7.27.4 '@vue/compiler-core': 3.5.13 '@vue/compiler-dom': 3.5.13 '@vue/compiler-ssr': 3.5.13 @@ -6527,6 +6751,8 @@ snapshots: ansi-styles@6.2.1: {} + ansis@4.1.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -6579,6 +6805,11 @@ snapshots: assertion-error@2.0.1: {} + ast-kit@2.1.0: + dependencies: + '@babel/parser': 7.27.4 + pathe: 2.0.3 + async-retry@1.3.3: dependencies: retry: 0.13.1 @@ -6606,6 +6837,8 @@ snapshots: binary-extensions@2.3.0: {} + birpc@2.3.0: {} + boolbase@1.0.0: {} brace-expansion@1.1.11: @@ -6981,6 +7214,8 @@ snapshots: diff@4.0.2: {} + diff@8.0.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -7007,6 +7242,8 @@ snapshots: dotenv@16.5.0: {} + dts-resolver@2.1.0: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -7031,6 +7268,8 @@ snapshots: emoji-regex@9.2.2: {} + empathic@1.1.0: {} + encodeurl@2.0.0: {} end-of-stream@1.4.4: @@ -7712,6 +7951,8 @@ snapshots: hono@4.7.10: {} + hookable@5.5.3: {} + hosted-git-info@2.8.9: {} hosted-git-info@7.0.1: @@ -8628,6 +8869,43 @@ snapshots: rfdc@1.3.1: {} + rolldown-plugin-dts@0.13.6(rolldown@1.0.0-beta.10-commit.87188ed)(typescript@5.8.3): + dependencies: + '@babel/generator': 7.27.3 + '@babel/parser': 7.27.4 + '@babel/types': 7.27.3 + ast-kit: 2.1.0 + birpc: 2.3.0 + debug: 4.4.1 + dts-resolver: 2.1.0 + get-tsconfig: 4.10.1 + rolldown: 1.0.0-beta.10-commit.87188ed + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - oxc-resolver + - supports-color + + rolldown@1.0.0-beta.10-commit.87188ed: + dependencies: + '@oxc-project/runtime': 0.72.1 + '@oxc-project/types': 0.72.1 + '@rolldown/pluginutils': 1.0.0-beta.10-commit.87188ed + ansis: 4.1.0 + optionalDependencies: + '@rolldown/binding-darwin-arm64': 1.0.0-beta.10-commit.87188ed + '@rolldown/binding-darwin-x64': 1.0.0-beta.10-commit.87188ed + '@rolldown/binding-freebsd-x64': 1.0.0-beta.10-commit.87188ed + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.10-commit.87188ed + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.10-commit.87188ed + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.10-commit.87188ed + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.10-commit.87188ed + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.10-commit.87188ed + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.10-commit.87188ed + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.10-commit.87188ed + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.10-commit.87188ed + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.10-commit.87188ed + rollup@4.41.1: dependencies: '@types/estree': 1.0.7 @@ -9029,6 +9307,28 @@ snapshots: optionalDependencies: '@swc/core': 1.11.29 + tsdown@0.12.5(typescript@5.8.3): + dependencies: + ansis: 4.1.0 + cac: 6.7.14 + chokidar: 4.0.3 + debug: 4.4.1 + diff: 8.0.2 + empathic: 1.1.0 + hookable: 5.5.3 + rolldown: 1.0.0-beta.10-commit.87188ed + rolldown-plugin-dts: 0.13.6(rolldown@1.0.0-beta.10-commit.87188ed)(typescript@5.8.3) + semver: 7.7.2 + tinyexec: 1.0.1 + tinyglobby: 0.2.14 + unconfig: 7.3.2 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - oxc-resolver + - supports-color + - vue-tsc + tslib@2.8.1: {} tsx@4.19.4: