diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02810d0..0a7a684 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,6 +10,9 @@ permissions: actions: read contents: read +env: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + jobs: main: runs-on: ubuntu-latest diff --git a/.prettierrc b/.prettierrc index b22b113..0604159 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,7 +1,6 @@ { "arrowParens": "always", "bracketSpacing": true, - "jsxBracketSameLine": true, "jsxSingleQuote": false, "printWidth": 80, "quoteProps": "as-needed", diff --git a/.verdaccio/config.yml b/.verdaccio/config.yml index 335c2ee..1e5fcd8 100644 --- a/.verdaccio/config.yml +++ b/.verdaccio/config.yml @@ -1,5 +1,5 @@ # path to a directory with all packages -storage: ../build/local-registry/storage +storage: ../dist/local-registry/storage auth: htpasswd: @@ -41,7 +41,7 @@ packages: proxy: npmjs # log settings -logs: +log: type: stdout format: pretty level: warn diff --git a/e2e/bun/.spec.swcrc b/e2e/bun/.spec.swcrc new file mode 100644 index 0000000..3b52a53 --- /dev/null +++ b/e2e/bun/.spec.swcrc @@ -0,0 +1,22 @@ +{ + "jsc": { + "target": "es2017", + "parser": { + "syntax": "typescript", + "decorators": true, + "dynamicImport": true + }, + "transform": { + "decoratorMetadata": true, + "legacyDecorator": true + }, + "keepClassNames": true, + "externalHelpers": true, + "loose": true + }, + "module": { + "type": "es6" + }, + "sourceMaps": true, + "exclude": [] +} diff --git a/e2e/bun/eslint.config.mjs b/e2e/bun/eslint.config.mjs new file mode 100644 index 0000000..b7f6277 --- /dev/null +++ b/e2e/bun/eslint.config.mjs @@ -0,0 +1,3 @@ +import baseConfig from '../../eslint.config.mjs'; + +export default [...baseConfig]; diff --git a/e2e/bun/jest.config.ts b/e2e/bun/jest.config.ts new file mode 100644 index 0000000..a1ae4d6 --- /dev/null +++ b/e2e/bun/jest.config.ts @@ -0,0 +1,26 @@ +/* eslint-disable */ +import { readFileSync } from 'fs'; +import type { Config } from 'jest'; + +// Reading the SWC compilation config for the spec files +const swcJestConfig = JSON.parse( + readFileSync(`${__dirname}/.spec.swcrc`, 'utf-8') +); + +// Disable .swcrc look-up by SWC core because we're passing in swcJestConfig ourselves +swcJestConfig.swcrc = false; + +const config: Config = { + detectOpenHandles: false, + displayName: 'bun-e2e', + preset: '../jest.preset.e2e.js', + transform: { + '^.+\\.[tj]s$': ['@swc/jest', swcJestConfig] + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: 'test-output/jest/coverage', + globalSetup: '../../tools/scripts/start-local-registry.ts', + globalTeardown: '../../tools/scripts/stop-local-registry.ts' +}; + +export default config; diff --git a/e2e/bun/package.json b/e2e/bun/package.json new file mode 100644 index 0000000..e95cefc --- /dev/null +++ b/e2e/bun/package.json @@ -0,0 +1,5 @@ +{ + "name": "bun-e2e", + "version": "0.0.1", + "private": true +} diff --git a/e2e/bun/project.json b/e2e/bun/project.json new file mode 100644 index 0000000..09c26fe --- /dev/null +++ b/e2e/bun/project.json @@ -0,0 +1,20 @@ +{ + "name": "bun-e2e", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "tags": ["scope:bun", "type:e2e"], + "implicitDependencies": ["bun"], + "projectType": "application", + "sourceRoot": "e2e/bun/src", + "targets": { + "e2e": { + "executor": "@nx/jest:jest", + "inputs": ["e2eInputs"], + "outputs": ["{projectRoot}/test-output/jest/coverage"], + "options": { + "jestConfig": "e2e/bun/jest.config.ts", + "runInBand": true + }, + "dependsOn": ["^build"] + } + } +} diff --git a/e2e/bun/src/bun.spec.ts b/e2e/bun/src/bun.spec.ts new file mode 100644 index 0000000..6b1f050 --- /dev/null +++ b/e2e/bun/src/bun.spec.ts @@ -0,0 +1,77 @@ +import { cleanup, ensureNxProject } from '@nx/plugin/testing'; +import { + assertPluginInstalled, + generateStonxApp, + getProjectDetails, + installStonxPlugin +} from '@stonx/e2e-utils'; + +describe('bun', () => { + let bunApp: string; + + beforeAll(() => { + ensureNxProject(); + installStonxPlugin('bun'); + }); + + afterAll(() => { + cleanup(); + }); + + describe('setup', () => { + it('should be installed', () => { + assertPluginInstalled('bun'); + }); + }); + + describe('application generator', () => { + beforeAll(() => { + bunApp = generateStonxApp('bun', '--framework none'); + }); + + it('should properly set up project', () => { + const projectDetails = getProjectDetails(bunApp); + + expect(projectDetails).toMatchObject({ + name: bunApp, + root: `apps/${bunApp}`, + sourceRoot: `apps/${bunApp}/src`, + projectType: 'application', + targets: { + build: { + executor: '@stonx/bun:build', + inputs: ['production', '^production'], + outputs: ['{options.outputPath}'], + defaultConfiguration: 'production', + options: { + main: `apps/${bunApp}/src/main.ts`, + tsConfig: `apps/${bunApp}/tsconfig.app.json`, + smol: false, + bun: true + }, + configurations: { + development: {}, + production: {} + }, + dependsOn: ['^build'] + }, + serve: { + continuous: true, + executor: '@stonx/bun:run', + defaultConfiguration: 'development', + options: { + runBuildTargetDependencies: false + }, + configurations: { + development: {}, + production: { + buildTarget: `${bunApp}:build:production` + } + }, + parallelism: true + } + } + }); + }); + }); +}); diff --git a/e2e/bun/tsconfig.json b/e2e/bun/tsconfig.json new file mode 100644 index 0000000..e8c2471 --- /dev/null +++ b/e2e/bun/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.e2e.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/e2e/bun/tsconfig.spec.json b/e2e/bun/tsconfig.spec.json new file mode 100644 index 0000000..10389c2 --- /dev/null +++ b/e2e/bun/tsconfig.spec.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "./out-tsc/jest", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/e2e/elysia/jest.config.ts b/e2e/elysia/jest.config.ts index aa878e6..5b6201b 100644 --- a/e2e/elysia/jest.config.ts +++ b/e2e/elysia/jest.config.ts @@ -1,5 +1,6 @@ /* eslint-disable */ import { readFileSync } from 'fs'; +import type { Config } from 'jest'; // Reading the SWC compilation config for the spec files const swcJestConfig = JSON.parse( @@ -9,9 +10,9 @@ const swcJestConfig = JSON.parse( // Disable .swcrc look-up by SWC core because we're passing in swcJestConfig ourselves swcJestConfig.swcrc = false; -export default { +const config: Config = { displayName: 'elysia-e2e', - preset: '../../jest.preset.js', + preset: '../jest.preset.e2e.js', transform: { '^.+\\.[tj]s$': ['@swc/jest', swcJestConfig] }, @@ -20,3 +21,5 @@ export default { globalSetup: '../../tools/scripts/start-local-registry.ts', globalTeardown: '../../tools/scripts/stop-local-registry.ts' }; + +export default config; diff --git a/e2e/elysia/package.json b/e2e/elysia/package.json index 5e4ef24..e2c9de8 100644 --- a/e2e/elysia/package.json +++ b/e2e/elysia/package.json @@ -1,6 +1,5 @@ { "name": "elysia-e2e", "version": "0.0.1", - "private": true, - "nx": {} + "private": true } diff --git a/e2e/elysia/src/elysia.spec.ts b/e2e/elysia/src/elysia.spec.ts index f006310..5fa8160 100644 --- a/e2e/elysia/src/elysia.spec.ts +++ b/e2e/elysia/src/elysia.spec.ts @@ -1,53 +1,41 @@ -import { execSync } from 'child_process'; +import { cleanup, ensureNxProject } from '@nx/plugin/testing'; import { - cleanupTestProject, - createTestProject, - installPlugin + assertPluginInstalled, + generateStonxApp, + getProjectDetails, + installStonxPlugin } from '@stonx/e2e-utils'; describe('elysia', () => { - let projectDirectory: string; + let elysiaApp: string; beforeAll(() => { - projectDirectory = createTestProject(); - installPlugin(projectDirectory, 'elysia'); + ensureNxProject(); + installStonxPlugin('elysia'); }); afterAll(() => { - cleanupTestProject(projectDirectory); + cleanup(); }); - it('should be installed', () => { - // npm ls will fail if the package is not installed properly - execSync('pnpm ls --depth 100 @stonx/elysia', { - cwd: projectDirectory, - stdio: 'inherit' + describe('setup', () => { + it('should be installed', () => { + assertPluginInstalled('elysia'); }); }); describe('application generator', () => { beforeAll(() => { - execSync( - 'npx nx g @stonx/elysia:application my-app --linter none --unitTestRunner none --e2eTestRunner none', - { - cwd: projectDirectory, - stdio: 'inherit', - env: process.env - } - ); + elysiaApp = generateStonxApp('elysia'); }); - it('should infer tasks', () => { - const projectDetails = JSON.parse( - execSync('nx show project my-app --json', { - cwd: projectDirectory - }).toString() - ); + it('should properly set up project', () => { + const projectDetails = getProjectDetails(elysiaApp); expect(projectDetails).toMatchObject({ - name: 'my-app', - root: 'my-app', - sourceRoot: 'my-app/src', + name: elysiaApp, + root: `apps/${elysiaApp}`, + sourceRoot: `apps/${elysiaApp}/src`, projectType: 'application', targets: { build: { @@ -56,8 +44,8 @@ describe('elysia', () => { defaultConfiguration: 'production', options: { platform: 'node', - main: 'my-app/src/main.ts', - tsConfig: 'my-app/tsconfig.app.json' + main: `apps/${elysiaApp}/src/main.ts`, + tsConfig: `apps/${elysiaApp}/tsconfig.app.json` }, configurations: { development: {}, @@ -81,15 +69,15 @@ describe('elysia', () => { defaultConfiguration: 'development', dependsOn: ['build'], options: { - buildTarget: 'my-app:build', + buildTarget: `${elysiaApp}:build`, runBuildTargetDependencies: false }, configurations: { development: { - buildTarget: 'my-app:build:development' + buildTarget: `${elysiaApp}:build:development` }, production: { - buildTarget: 'my-app:build:production' + buildTarget: `${elysiaApp}:build:production` } }, parallelism: true diff --git a/e2e/jest.preset.e2e.js b/e2e/jest.preset.e2e.js new file mode 100644 index 0000000..cf4fbfd --- /dev/null +++ b/e2e/jest.preset.e2e.js @@ -0,0 +1,9 @@ +const preset = require('../jest.preset'); + +// The root preset sets up the environment for unit tests. +delete preset.setupFiles; +delete preset.moduleNameMapper; + +module.exports = { + ...preset +}; diff --git a/e2e/utils/add-plugin.ts b/e2e/utils/add-plugin.ts deleted file mode 100644 index 4c6015a..0000000 --- a/e2e/utils/add-plugin.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { execSync } from 'child_process'; - -export function addPlugin(projectDirectory: string, pluginName: string) { - return execSync(`npx nx add @stonx/${pluginName}@e2e`, { - cwd: projectDirectory, - stdio: 'inherit', - env: process.env - }); -} diff --git a/e2e/utils/cleanup-test-project.ts b/e2e/utils/cleanup-test-project.ts deleted file mode 100644 index 39a9632..0000000 --- a/e2e/utils/cleanup-test-project.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { rmSync } from 'fs'; - -export function cleanupTestProject(projectDirectory: string) { - if (!projectDirectory) { - return; - } - - rmSync(projectDirectory, { - recursive: true, - force: true - }); -} diff --git a/e2e/utils/create-test-project.ts b/e2e/utils/create-test-project.ts deleted file mode 100644 index daced6a..0000000 --- a/e2e/utils/create-test-project.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { join, dirname } from 'path'; -import { mkdirSync, rmSync } from 'fs'; -import { execSync } from 'child_process'; - -/** - * Creates a test project with create-nx-workspace and installs the plugin - * @returns The directory where the test project was created - */ -export function createTestProject(projectName = 'test-project') { - const projectDirectory = join(process.cwd(), 'tmp', 'nx-e2e', projectName); - - // Ensure projectDirectory is empty - rmSync(projectDirectory, { - recursive: true, - force: true - }); - mkdirSync(dirname(projectDirectory), { - recursive: true - }); - - execSync( - `pnpm dlx create-nx-workspace@latest ${projectName} --preset apps --nxCloud=skip --no-interactive`, - { - cwd: dirname(projectDirectory), - stdio: 'inherit', - env: process.env - } - ); - - console.log(`Created test project in "${projectDirectory}"`); - - return projectDirectory; -} diff --git a/e2e/utils/index.ts b/e2e/utils/index.ts index 827ff7a..1110b64 100644 --- a/e2e/utils/index.ts +++ b/e2e/utils/index.ts @@ -1,4 +1 @@ -export * from './add-plugin'; -export * from './cleanup-test-project'; -export * from './create-test-project'; -export * from './install-plugin'; +export * from './plugin'; diff --git a/e2e/utils/install-plugin.ts b/e2e/utils/install-plugin.ts deleted file mode 100644 index 201ee6d..0000000 --- a/e2e/utils/install-plugin.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { execSync } from 'child_process'; - -export function installPlugin(projectDirectory: string, pluginName: string) { - return execSync(`pnpm add -D @stonx/${pluginName}@e2e`, { - cwd: projectDirectory, - stdio: 'inherit', - env: process.env - }); -} diff --git a/e2e/utils/plugin.ts b/e2e/utils/plugin.ts new file mode 100644 index 0000000..b8f5131 --- /dev/null +++ b/e2e/utils/plugin.ts @@ -0,0 +1,37 @@ +import { + runCommand, + runNxCommand, + tmpProjPath, + uniq +} from '@nx/plugin/testing'; +import { + detectPackageManager, + getPackageManagerCommand, + PackageManagerCommands +} from 'nx/src/utils/package-manager'; + +export function installStonxPlugin(name: string, version = 'e2e') { + return runNxCommand(`add @stonx/${name}@${version}`); +} + +export function generateStonxApp(pluginName: string, args?: string): string { + const appName: string = uniq(`${pluginName}app`); + runNxCommand( + `g @stonx/${pluginName}:application apps/${appName} --linter none --unitTestRunner none --e2eTestRunner none${args ? ` ${args}` : ''}` + ); + + return appName; +} + +export function getPackageManagerCommands(): PackageManagerCommands { + return getPackageManagerCommand(detectPackageManager(tmpProjPath())); +} + +export function assertPluginInstalled(pluginName: string): string { + const pm = getPackageManagerCommands(); + return runCommand(`${pm.list} @stonx/${pluginName}`, {}); +} + +export function getProjectDetails(projectName: string) { + return JSON.parse(runNxCommand(`show project ${projectName} --json`)); +} diff --git a/jest.preset.js b/jest.preset.js index f078ddc..5885907 100644 --- a/jest.preset.js +++ b/jest.preset.js @@ -1,3 +1,11 @@ const nxPreset = require('@nx/jest/preset').default; -module.exports = { ...nxPreset }; +module.exports = { + ...nxPreset, + collectCoverage: true, + coverageReporters: ['html', 'json'], + moduleNameMapper: { + '^@actions/github$': '__mocks__/@actions/github.jest.ts' + }, + passWithNoTests: true +}; diff --git a/nx.json b/nx.json index a4ea695..747e02b 100644 --- a/nx.json +++ b/nx.json @@ -17,6 +17,12 @@ "default", "{workspaceRoot}/jest.preset.js", "{workspaceRoot}/.verdaccio/config.yml", + { + "env": "SELECTED_CLI" + }, + { + "env": "SELECTED_PM" + }, { "env": "NX_E2E_CI_CACHE_KEY" }, @@ -33,10 +39,10 @@ "projectsRelationship": "independent", "releaseTagPattern": "{projectName}@{version}", "version": { + "preVersionCommand": "pnpm dlx nx run-many -t build", "conventionalCommits": true, "fallbackCurrentVersionResolver": "disk", - "preVersionCommand": "pnpm dlx nx run-many -t build", - "manifestRootsToUpdate": ["{projectRoot}", "{projectRoot}/dist"] + "manifestRootsToUpdate": ["{projectRoot}/dist"] }, "changelog": { "automaticFromRef": true, diff --git a/package.json b/package.json index 5d7c247..63708c0 100644 --- a/package.json +++ b/package.json @@ -14,28 +14,32 @@ "prepare": "is-ci || husky", "preinstall": "node ./scripts/preinstall.js", "test": "nx run-many -t test", - "e2e": "nx run-many -t e2e --projects ./e2e/*" + "e2e": "nx run-many -t e2e --parallel 1", + "update": "nx migrate latest" }, "devDependencies": { "@eslint/js": "^9.8.0", - "@nx/devkit": "21.3.11", - "@nx/eslint": "21.3.11", - "@nx/eslint-plugin": "21.3.11", - "@nx/jest": "21.3.11", - "@nx/js": "21.3.11", - "@nx/node": "21.3.11", - "@nx/plugin": "21.3.11", - "@nx/workspace": "21.3.11", + "@nx/devkit": "21.4.1", + "@nx/eslint": "21.4.1", + "@nx/eslint-plugin": "21.4.1", + "@nx/jest": "21.4.1", + "@nx/js": "21.4.1", + "@nx/node": "21.4.1", + "@nx/plugin": "21.4.1", + "@nx/workspace": "21.4.1", "@swc-node/register": "~1.9.1", "@swc/cli": "~0.6.0", "@swc/core": "~1.5.7", "@swc/helpers": "~0.5.11", "@swc/jest": "~0.2.38", + "@types/bun": "1.2.20", "@types/jest": "^30.0.0", "@types/node": "18.16.9", "chalk": "5.5.0", + "cmrd": "0.0.1", "cz-git": "1.12.0", "czg": "1.12.0", + "esbuild": "^0.19.2", "eslint": "^9.8.0", "eslint-config-prettier": "^10.0.0", "fast-glob": "3.3.3", @@ -46,14 +50,14 @@ "jest-environment-node": "^30.0.2", "jest-util": "^30.0.2", "jsonc-eslint-parser": "^2.1.0", - "nx": "21.3.11", + "nx": "21.4.1", "prettier": "3.6.2", "pretty-quick": "4.2.2", "semver": "7.7.2", "ts-jest": "^29.4.0", "ts-node": "10.9.1", "tslib": "^2.3.0", - "typescript": "~5.8.2", + "typescript": "~5.9.2", "typescript-eslint": "^8.29.0", "verdaccio": "^6.0.5", "yargs": "18.0.0" diff --git a/packages/bun/.spec.swcrc b/packages/bun/.spec.swcrc new file mode 100644 index 0000000..3b52a53 --- /dev/null +++ b/packages/bun/.spec.swcrc @@ -0,0 +1,22 @@ +{ + "jsc": { + "target": "es2017", + "parser": { + "syntax": "typescript", + "decorators": true, + "dynamicImport": true + }, + "transform": { + "decoratorMetadata": true, + "legacyDecorator": true + }, + "keepClassNames": true, + "externalHelpers": true, + "loose": true + }, + "module": { + "type": "es6" + }, + "sourceMaps": true, + "exclude": [] +} diff --git a/packages/bun/README.md b/packages/bun/README.md new file mode 100644 index 0000000..aa2a887 --- /dev/null +++ b/packages/bun/README.md @@ -0,0 +1,114 @@ +# @stonx/bun — Nx plugin for Bun + +[![npm version](https://img.shields.io/npm/v/@stonx/bun.svg)](https://www.npmjs.com/package/@stonx/bun) +[![license: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![Nx compatibility](https://img.shields.io/badge/Nx-%E2%89%A520%20%E2%89%A4%2021-blue)](https://nx.dev) +[![CI](https://github.com/BorisTB/stonx/actions/workflows/ci.yml/badge.svg)](https://github.com/BorisTB/stonx/actions) + +Nx plugin adding support for [Bun](https://bun.sh/). + +## Features + +- Generators + - application: scaffold a Bun application (with Nx targets preconfigured) + - init: initialize the plugin in your workspace +- Executors + - build: build an application using Bun + - run: execute an application using Bun (with watch support) + +## Add the plugin to an existing Nx workspace + +### Recommended + +```bash +nx add @stonx/bun +``` + +This installs the plugin and performs any required setup in your workspace. + +### Fallback (manual) + +```bash +npm i -D @stonx/bun +``` + +Note: Manual installation may require compatible peer dependencies. + +## Generators + +### init Internal + +Initialize the `@stonx/bun` plugin. + +### application +Generate a Bun application within your Nx workspace. + +```shell +nx g @stonx/bun:app +``` + +## Executors + +### build + +Build an application using Bun. + +```json +{ + "build": { + "executor": "@stonx/bun:build", + "options": { + "outputPath": "dist/libs/ts-lib", + "main": "libs/ts-lib/src/index.ts", + "tsConfig": "libs/ts-lib/tsconfig.lib.json", + "smol": false, + "bun": true + } + } +} +``` + +### run + +Run an application using Bun. + +```json +{ + "my-app": { + "targets": { + "serve": { + "executor": "@stonx/bun:run", + "options": {}, + "configurations": { + "development": { + // Just serve the main file without building it + "main": "apps/my-app/src/main.ts" + }, + "production": { + // Build app and then run the built main file + "buildTarget": "my-app:build" + } + } + }, + "build": { + "executor": "@stonx/bun:build", + "options": { + "main": "apps/my-app/src/main.ts", + // ... + } + } + } + } +} +``` + +### Common options: +- watch: watch for file changes and restart +- target: wait for dependent targets before run +- main: entry file to execute + +See full options in: [src/executors/run/schema.json]() + +## Compatibility +- Nx: >= 20 < 22 + diff --git a/packages/bun/eslint.config.mjs b/packages/bun/eslint.config.mjs new file mode 100644 index 0000000..6427a56 --- /dev/null +++ b/packages/bun/eslint.config.mjs @@ -0,0 +1,34 @@ +import baseConfig from '../../eslint.config.mjs'; + +export default [ + ...baseConfig, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': [ + 'error', + { + ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs,ts,cts,mts}'] + } + ] + }, + languageOptions: { + parser: await import('jsonc-eslint-parser') + } + }, + { + files: [ + '**/package.json', + '**/executors.json', + '**/package.json', + '**/generators.json', + '**/executors.json' + ], + rules: { + '@nx/nx-plugin-checks': 'error' + }, + languageOptions: { + parser: await import('jsonc-eslint-parser') + } + } +]; diff --git a/packages/bun/executors.json b/packages/bun/executors.json new file mode 100644 index 0000000..bb802be --- /dev/null +++ b/packages/bun/executors.json @@ -0,0 +1,14 @@ +{ + "executors": { + "build": { + "implementation": "./src/executors/build/build", + "schema": "./src/executors/build/schema.json", + "description": "Build an application using Bun." + }, + "run": { + "implementation": "./src/executors/run/run", + "schema": "./src/executors/run/schema.json", + "description": "Execute an application using Bun." + } + } +} diff --git a/packages/bun/generators.json b/packages/bun/generators.json new file mode 100644 index 0000000..eb71105 --- /dev/null +++ b/packages/bun/generators.json @@ -0,0 +1,17 @@ +{ + "generators": { + "application": { + "factory": "./src/generators/application/application", + "schema": "./src/generators/application/schema.json", + "aliases": ["app"], + "x-type": "application", + "description": "Create a bun application." + }, + "init": { + "factory": "./src/generators/init/init", + "schema": "./src/generators/init/schema.json", + "description": "Initialize the `@stonx/bun` plugin.", + "hidden": true + } + } +} diff --git a/packages/bun/jest.config.ts b/packages/bun/jest.config.ts new file mode 100644 index 0000000..7bca9ba --- /dev/null +++ b/packages/bun/jest.config.ts @@ -0,0 +1,20 @@ +import { readFileSync } from 'fs'; + +// Reading the SWC compilation config for the spec files +const swcJestConfig = JSON.parse( + readFileSync(`${__dirname}/.spec.swcrc`, 'utf-8') +); + +// Disable .swcrc look-up by SWC core because we're passing in swcJestConfig ourselves +swcJestConfig.swcrc = false; + +export default { + displayName: 'bun', + preset: '../../jest.preset.js', + testEnvironment: 'node', + transform: { + '^.+\\.[tj]s$': ['@swc/jest', swcJestConfig] + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: 'test-output/jest/coverage' +}; diff --git a/packages/bun/package.json b/packages/bun/package.json new file mode 100644 index 0000000..29032a2 --- /dev/null +++ b/packages/bun/package.json @@ -0,0 +1,32 @@ +{ + "name": "@stonx/bun", + "version": "0.0.1", + "author": "BorisTB", + "repository": { + "type": "git", + "url": "git+https://github.com/BorisTB/stonx.git", + "directory": "packages/bun" + }, + "keywords": [ + "Nx", + "Bun" + ], + "bugs": "https://github.com/BorisTB/stonx/issues", + "license": "MIT", + "type": "commonjs", + "main": "./src/index.js", + "types": "./src/index.d.ts", + "executors": "./executors.json", + "generators": "./generators.json", + "peerDependencies": { + "@nx/devkit": ">=20.0.0 <22.0.0", + "@nx/js": ">=20.0.0 <22.0.0", + "nx": "21.4.1", + "fast-glob": "3.3.3", + "@nx/eslint": "21.4.1", + "tslib": "^2.3.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/bun/project.json b/packages/bun/project.json new file mode 100644 index 0000000..0367245 --- /dev/null +++ b/packages/bun/project.json @@ -0,0 +1,47 @@ +{ + "name": "bun", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/bun/src", + "projectType": "library", + "tags": [], + "targets": { + "build": { + "executor": "@nx/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "clean": true, + "outputPath": "packages/bun/dist", + "main": "packages/bun/src/index.ts", + "tsConfig": "packages/bun/tsconfig.lib.json", + "assets": [ + "packages/bun/*.md", + { + "input": "./packages/bun/src", + "glob": "**/!(*.ts)", + "output": "./src" + }, + { + "input": "./packages/bun/src", + "glob": "**/*.d.ts", + "output": "./src" + }, + { + "input": "./packages/bun", + "glob": "generators.json", + "output": "." + }, + { + "input": "./packages/bun", + "glob": "executors.json", + "output": "." + }, + { + "input": "./packages/bun", + "glob": "migrations.json", + "output": "." + } + ] + } + } + } +} diff --git a/packages/bun/src/executors/build/build.ts b/packages/bun/src/executors/build/build.ts new file mode 100644 index 0000000..f7d4af3 --- /dev/null +++ b/packages/bun/src/executors/build/build.ts @@ -0,0 +1,141 @@ +import { ExecutorContext, logger } from '@nx/devkit'; +import { BuildExecutorOptions } from './schema'; +import { createAsyncIterable } from '@nx/devkit/src/utils/async-iterable'; +import { parentPort } from 'node:worker_threads'; +import { + getBunVersion, + isBun, + isBunSubprocess, + spawnWithBun +} from '../../utils'; +import { getBunBuildArgv, getBunBuildConfig, normalizeOptions } from './lib'; +import Buni from '../../utils/buni'; + +export interface BunBuildResult { + success: boolean; + outfile: string; +} + +async function* buildExecutor( + _options: BuildExecutorOptions, + context: ExecutorContext +): AsyncGenerator { + const bunVersion = await getBunVersion(); + + if (!bunVersion) { + throw new Error(`bun command not found. Make sure the bun is available`); + } + + process.env.NODE_ENV ??= context?.configurationName ?? 'development'; + + const project = context.projectGraph.nodes[context.projectName!]; + const { sourceRoot, root } = project.data; + const options = normalizeOptions(_options, context, sourceRoot, root); + + // const cwd = options.cwd ? resolve(context.root, options.cwd) : context.root; + + const getResult = (success: boolean): BunBuildResult => ({ + success, + outfile: options.mainOutputPath + }); + + if (isBun) { + const config = getBunBuildConfig(options); + const result = await Buni.build(config); + for (const log of result.logs) { + console.log(log); + } + if (result.success) { + const outputTextAsync = result.outputs.flatMap((res) => res.text()); + const outputText = await Promise.all(outputTextAsync); + outputText.forEach((out) => console.log(out)); + console.log(`Build completed for ${context.projectName}`); + yield getResult(true); + } else { + yield getResult(false); + } + } else { + const args = getBunBuildArgv(options); + yield* createAsyncIterable(async ({ next, done }) => { + const childProcess = spawnWithBun(args, { + stdio: 'inherit' + }); + + if (isBunSubprocess(childProcess)) { + const stderrReader = childProcess.stderr?.getReader(); + + const handleStderr = async () => { + if (!stderrReader) { + return; + } + + try { + while (true) { + const { done, value } = await stderrReader.read(); + if (done || childProcess.killed) break; + if (value) logger.error(new TextDecoder().decode(value)); + } + } catch (err) { + if (!childProcess.killed) + logger.error(`Error reading stderr: ${err}`); + } + }; + + handleStderr(); + } else { + // Node handling + const textDecoder = new TextDecoder(); + + const getDataHandler = + (type: 'stderr' | 'stdout') => (data: ArrayBuffer) => { + const textData = textDecoder.decode(data); + if (parentPort) { + parentPort.postMessage({ type, message: textData }); + } else { + logger.log(textData); + } + }; + + childProcess.stderr?.on('data', getDataHandler('stderr')); + childProcess.stdout?.on('data', getDataHandler('stdout')); + } + + process.on('SIGTERM', async () => { + childProcess?.kill('SIGTERM'); + process.exit(128 + 15); + }); + + process.on('SIGINT', async () => { + childProcess?.kill('SIGINT'); + process.exit(128 + 2); + }); + + process.on('SIGHUP', async () => { + childProcess?.kill('SIGHUP'); + process.exit(128 + 1); + }); + + process.on('uncaughtException', async (err) => { + console.error('Caught exception:', err); + childProcess?.kill('SIGTERM'); + process.exit(1); + }); + + if (isBunSubprocess(childProcess)) { + childProcess.exited.then((code) => { + console.log(`Build completed for ${context.projectName}`); + next(getResult(code === 0)); + done(); + }); + } else { + childProcess.on('exit', (code) => { + console.log(`Build completed for ${context.projectName}`); + next(getResult(code === 0)); + done(); + }); + } + }); + } +} + +export default buildExecutor; diff --git a/packages/bun/src/executors/build/lib/get-bun-build-argv.ts b/packages/bun/src/executors/build/lib/get-bun-build-argv.ts new file mode 100644 index 0000000..d292920 --- /dev/null +++ b/packages/bun/src/executors/build/lib/get-bun-build-argv.ts @@ -0,0 +1,47 @@ +import { NormalizedBuildExecutorOptions } from '../schema'; +import { getBunBuildConfig } from './get-bun-build-config'; + +const isNil = (value: any): value is undefined | null => value == null; +const isString = (value: any): value is string => typeof value === 'string'; + +export function getBunBuildArgv( + options: NormalizedBuildExecutorOptions +): string[] { + const cfg = getBunBuildConfig(options); + const production = process.env?.NODE_ENV === 'production'; + + const allArgs = [ + 'build', + + !isNil(options.config) && `--config=${options.config}`, + !isNil(options.tsConfig) && `--tsconfig-override=${options.tsConfig}`, + !isNil(options.bun) && `--bun`, + !isNil(options.smol) && `--smol`, + !isNil(cfg.target) && `--target=${cfg.target}`, + + cfg.entrypoints.join(' '), + + production && '--production', + !isNil(cfg.root) && `--root=${cfg.root}`, + !isNil(cfg.env) && `--env=${cfg.env}`, + !isNil(cfg.outdir) && `--outdir=${cfg.outdir}`, + !isNil(options.outputFileName) && `--outfile=${options.outputFileName}`, + !isNil(cfg.sourcemap) && `--sourcemap=${cfg.sourcemap}`, + !isNil(cfg.publicPath) && `--public-path=${cfg.publicPath}`, + !isNil(cfg.naming) && `--entry-naming=${cfg.naming}`, + !isNil(cfg.naming) && `--chunk-naming=${cfg.naming}`, + !isNil(cfg.naming) && `--asset-naming=${cfg.naming}`, + cfg.splitting && `--splitting`, + !isNil(cfg.minify) && `--minify`, + options.watch && `--watch`, + !isNil(cfg.format) && `--format=${cfg.format}`, + !isNil(cfg.external) && `--external=${cfg.external}`, + !isNil(cfg.packages) && `--packages=${cfg.packages}`, + !isNil(cfg.banner) && `--banner=${cfg.banner}`, + !isNil(cfg.footer) && `--footer=${cfg.footer}` + ]; + + const args = allArgs.filter(isString); + + return args; +} diff --git a/packages/bun/src/executors/build/lib/get-bun-build-config.ts b/packages/bun/src/executors/build/lib/get-bun-build-config.ts new file mode 100644 index 0000000..531b45f --- /dev/null +++ b/packages/bun/src/executors/build/lib/get-bun-build-config.ts @@ -0,0 +1,26 @@ +import { NormalizedBuildExecutorOptions } from '../schema'; +import Buni from '../../../utils/buni'; + +export function getBunBuildConfig(opts: NormalizedBuildExecutorOptions) { + return Buni.createBuildConfig({ + entrypoints: [opts.main, ...(opts.additionalEntryPoints || [])], + define: opts.define, + outdir: opts.outputPath, + target: opts.target, + format: opts.format, + minify: opts.minify, + naming: opts.naming, + publicPath: opts.publicPath, + sourcemap: opts.sourcemap, + splitting: opts.splitting, + root: opts.rootDir, + packages: opts.packages, + loader: opts.loader, + env: opts.env, + banner: opts.banner, + footer: opts.footer, + drop: opts.drop, + tsconfig: opts.tsConfig, + throw: true + }); +} diff --git a/packages/bun/src/executors/build/lib/index.ts b/packages/bun/src/executors/build/lib/index.ts new file mode 100644 index 0000000..7528330 --- /dev/null +++ b/packages/bun/src/executors/build/lib/index.ts @@ -0,0 +1,3 @@ +export * from './get-bun-build-argv'; +export * from './get-bun-build-config'; +export * from './normalize-options'; diff --git a/packages/bun/src/executors/build/lib/normalize-options.ts b/packages/bun/src/executors/build/lib/normalize-options.ts new file mode 100644 index 0000000..a8f8b0e --- /dev/null +++ b/packages/bun/src/executors/build/lib/normalize-options.ts @@ -0,0 +1,59 @@ +import { join, resolve } from 'node:path'; +import { + BuildExecutorOptions, + NormalizedBuildExecutorOptions +} from '../schema'; +import { ExecutorContext } from '@nx/devkit'; + +export function normalizeOptions( + options: BuildExecutorOptions, + context: ExecutorContext, + sourceRoot: string | undefined, + projectRoot: string +): NormalizedBuildExecutorOptions { + const root = context.root; + const outputPath = join(root, options.outputPath); + const rootDir = options.rootDir + ? join(root, options.rootDir) + : join(root, projectRoot); // TODO + const mainOutputPath = resolve( + outputPath, + options.main.replace(`${projectRoot}/`, '').replace('.ts', '.js') // TODO + ); + + const tsConfig = join(root, options.tsConfig); + + const watch = options.watch ?? false; + const generatePackageJson = options.generatePackageJson ?? true; + + const splitting = options.splitting ?? true; + + const sourcemap = + typeof options.sourcemap === 'boolean' + ? options.sourcemap + ? 'inline' + : 'none' + : options.sourcemap; + + if (Array.isArray(options.external) && options.external.length > 0) { + const firstItem = options.external[0]; + if (firstItem === 'all' || firstItem === 'none') { + options.external = firstItem; + } + } + + return { + ...options, + splitting, + sourcemap, + root, + sourceRoot, + projectRoot, + outputPath, + tsConfig, + rootDir, + watch, + mainOutputPath, + generatePackageJson + }; +} diff --git a/packages/bun/src/executors/build/schema.d.ts b/packages/bun/src/executors/build/schema.d.ts new file mode 100644 index 0000000..db0920b --- /dev/null +++ b/packages/bun/src/executors/build/schema.d.ts @@ -0,0 +1,50 @@ +export type BuildMinifyConfig = + | boolean + | { + whitespace?: boolean; + syntax?: boolean; + identifiers?: boolean; + }; + +export interface BuildExecutorOptions { + main: string; + outputPath: string; + additionalEntryPoints?: string[]; + tsConfig: string; + rootDir?: string; + outputFileName?: string; + watch?: boolean; + config?: string; + smol?: boolean; + bun?: boolean; + clean?: boolean; + target?: 'bun' | 'node' | 'browser'; + format?: 'esm' | 'cjs' | 'iife'; + splitting?: boolean; + env?: 'inline' | 'disable' | `${string}*` | undefined; + sourcemap?: boolean | 'none' | 'linked' | 'inline' | 'external'; + minify?: BuildMinifyConfig; + external?: 'all' | 'none' | string[]; + packages?: 'bundle' | 'external'; + naming?: string; + publicPath?: string; + define?: Record; + loader?: Record; + banner?: string; + footer?: string; + drop?: string[]; + generateLockfile?: boolean; + generatePackageJson?: boolean; + cwd?: string; +} + +export interface NormalizedBuildExecutorOptions extends BuildExecutorOptions { + rootDir: string; + projectRoot: string; + mainOutputPath: string; + generatePackageJson: boolean; + root?: string; + sourceRoot?: string; + sourcemap?: Exclude; + splitting: boolean; +} diff --git a/packages/bun/src/executors/build/schema.json b/packages/bun/src/executors/build/schema.json new file mode 100644 index 0000000..7df77a1 --- /dev/null +++ b/packages/bun/src/executors/build/schema.json @@ -0,0 +1,184 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "version": 2, + "title": "Bun Build Target", + "description": "Builds using Bun.", + "cli": "nx", + "type": "object", + "properties": { + "main": { + "type": "string", + "description": "The name of the main entry-point file.", + "x-completion-type": "file", + "x-completion-glob": "main@(.js|.ts|.jsx|.tsx)", + "x-priority": "important" + }, + "additionalEntryPoints": { + "type": "array", + "description": "An array of paths corresponding to the additional entrypoints of application. One bundle will be generated for each entrypoint.", + "items": { + "type": "string" + }, + "x-priority": "important" + }, + "rootDir": { + "type": "string", + "description": "The root directory of the project." + }, + "outputPath": { + "type": "string", + "description": "The output path of the generated files.", + "x-completion-type": "directory", + "x-priority": "important" + }, + "outputFileName": { + "type": "string", + "description": "The path to the main file relative to the outputPath", + "x-completion-type": "file" + }, + "tsConfig": { + "type": "string", + "description": "The path to the Typescript configuration file.", + "x-completion-type": "file", + "x-completion-glob": "tsconfig.*.json", + "x-priority": "important" + }, + "watch": { + "type": "boolean", + "description": "Enable re-building when files change.", + "default": false + }, + "config": { + "type": "string", + "description": "Config file to load bun from (e.g. -c bunfig.toml" + }, + "smol": { + "type": "boolean", + "description": "In memory-constrained environments, use the smol flag to reduce memory usage at a cost to performance.", + "default": false + }, + "bun": { + "type": "boolean", + "description": "Force a script or package to use Bun.js instead of Node.js (via symlinking node)", + "default": false + }, + "clean": { + "type": "boolean", + "description": "Remove previous output before build.", + "default": true + }, + "target": { + "type": "string", + "description": "The intended execution environment for the bundle.", + "enum": ["bun", "node", "browser"], + "default": "browser" + }, + "format": { + "type": "string", + "description": "Specifies the module format to be used in the generated bundles.", + "enum": ["esm", "cjs", "iife"], + "default": "esm" + }, + "splitting": { + "type": "boolean", + "description": "Whether to enable code splitting.", + "default": true + }, + "env": { + "type": "string", + "description": "Controls how environment variables are handled during bundling.", + "default": "inline" + }, + "sourcemap": { + "oneOf": [ + { "type": "boolean" }, + { + "type": "string", + "enum": ["none", "linked", "external", "inline"] + } + ], + "description": "Specifies the type of sourcemap to generate.", + "default": "none" + }, + "minify": { + "oneOf": [ + { "type": "boolean" }, + { + "type": "object", + "properties": { + "whitespace": { "type": "boolean" }, + "syntax": { "type": "boolean" }, + "identifiers": { "type": "boolean" } + } + } + ], + "type": "boolean", + "description": "Whether to enable minification.", + "default": false + }, + "external": { + "type": "array", + "description": "A list of import paths to consider external.", + "item": { + "type": "string" + } + }, + "packages": { + "type": "string", + "description": "Control whatever package dependencies are included to bundle or not.", + "enum": ["bundle", "external"], + "default": "bundle" + }, + "naming": { + "type": "string", + "description": "Customizes the generated file names.", + "default": "[dir]/[name].[ext]" + }, + "publicPath": { + "type": "string", + "description": "A prefix to be appended to any import paths in bundled code.", + "default": "[dir]/[name].[ext]" + }, + "define": { + "type": "object", + "description": "A map of global identifiers to be replaced at build time. Keys of this object are identifier names, and values are JSON strings that will be inlined.", + "additionalProperties": { "type": "string" } + }, + "loader": { + "type": "object", + "description": "A map of file extensions to built-in loader names. This can be used to quickly customize how certain files are loaded.", + "additionalProperties": { "type": "string" } + }, + "banner": { + "type": "string", + "description": "A banner to be added to the final bundle, this can be a directive like \"use client\" for react or a comment block such as a license for the code." + }, + "footer": { + "type": "string", + "description": "A footer to be added to the final bundle, this can be something like a comment block for a license or just a fun easter egg." + }, + "drop": { + "type": "array", + "description": "Remove function calls from a bundle. For example, \"console\" will remove all calls to console.log.", + "items": { + "type": "string" + } + }, + "generateLockfile": { + "type": "boolean", + "description": "Generate a lockfile (e.g. package-lock.json) that matches the workspace lockfile to ensure package versions match. Ignored when `generatePackageJson` is set to `false`.", + "default": false, + "x-priority": "internal" + }, + "generatePackageJson": { + "type": "boolean", + "description": "Generate package.json file in the output folder.", + "default": true + }, + "cwd": { + "description": "Current working directory of the command.", + "type": "string" + } + }, + "required": ["main", "outputPath", "tsConfig"] +} diff --git a/packages/bun/src/executors/run/lib/build-bun-args.ts b/packages/bun/src/executors/run/lib/build-bun-args.ts new file mode 100644 index 0000000..cb52701 --- /dev/null +++ b/packages/bun/src/executors/run/lib/build-bun-args.ts @@ -0,0 +1,43 @@ +import { NormalizedRunExecutorOptions } from '../schema'; + +export function buildBunArgs( + options: NormalizedRunExecutorOptions, + entryFile?: string +): string[] { + const args: string[] = []; + + if (options.tsConfigOverride) { + args.push(`--tsconfig-override=${options.tsConfigOverride}`); + } + if (options.inspect) { + args.push(`--${options.inspect}`); + } + if (options.hot) { + args.push('--hot'); + } + if (options.watchMode === 'bun') { + args.push('--watch'); + } + if (options.config) { + args.push(`-c ${options.config}`); + } + if (options.smol) { + args.push('--smol'); + } + if (options.bun) { + args.push('--bun'); + } + if (options.runtimeArgs?.length) { + args.push(...options.runtimeArgs); + } + + // `bun -- ` + if (entryFile) { + args.push(entryFile); + + if (options.args?.length) { + args.push('--', ...options.args); + } + } + return args; +} diff --git a/packages/bun/src/executors/run/lib/calculate-resolve-mappings.ts b/packages/bun/src/executors/run/lib/calculate-resolve-mappings.ts new file mode 100644 index 0000000..32cc6d0 --- /dev/null +++ b/packages/bun/src/executors/run/lib/calculate-resolve-mappings.ts @@ -0,0 +1,27 @@ +import { ExecutorContext, joinPathFragments, Target } from '@nx/devkit'; +import { + calculateProjectBuildableDependencies, + DependentBuildableProjectNode +} from '@nx/js/src/utils/buildable-libs-utils'; + +export function calculateResolveMappings( + target: Target, + context: ExecutorContext +): Record { + const { dependencies } = calculateProjectBuildableDependencies( + context.taskGraph, + context.projectGraph, + context.root, + target.project, + target.target, + target.configuration || '' + ); + return dependencies.reduce< + Record + >((m, c) => { + if (c.node.type !== 'npm' && c.outputs[0] != null) { + m[c.name] = joinPathFragments(context.root, c.outputs[0]); + } + return m; + }, {}); +} diff --git a/packages/bun/src/executors/run/lib/change-file-path-extension.ts b/packages/bun/src/executors/run/lib/change-file-path-extension.ts new file mode 100644 index 0000000..4434a7d --- /dev/null +++ b/packages/bun/src/executors/run/lib/change-file-path-extension.ts @@ -0,0 +1,42 @@ +import { format, parse } from 'node:path'; + +const normalizeExt = (ext: string): string => + `${ext.startsWith('.') ? '' : '.'}${ext}`.toLowerCase(); + +function matchExt(extA: string): (extB: string) => boolean; +function matchExt(extA: string, extB: string): boolean; +function matchExt(extA: string, extB?: string) { + if (!extB) { + return (extB: string) => matchExt(extA, extB); + } + + return normalizeExt(extA) === normalizeExt(extB); +} + +export function changeFilePathExtension( + filePath: string, + toExt: string, + opts: { fromExt?: string | string[] } = {} +): string { + const { fromExt } = opts; + + const isExtAllowedToChange = (ext: string) => { + if (!fromExt) { + return true; + } + const matcher = matchExt(ext); + + return Array.isArray(fromExt) ? fromExt.some(matcher) : matcher(fromExt); + }; + + const { ext, base, ...parsed } = parse(filePath); + + if (!ext || !isExtAllowedToChange(ext)) { + return filePath; + } + + return format({ + ...parsed, + ext: toExt + }); +} diff --git a/packages/bun/src/executors/run/lib/first-value-from.ts b/packages/bun/src/executors/run/lib/first-value-from.ts new file mode 100644 index 0000000..4593fef --- /dev/null +++ b/packages/bun/src/executors/run/lib/first-value-from.ts @@ -0,0 +1,16 @@ +export function firstValueFrom(it: AsyncIterableIterator): Promise { + return new Promise((resolve, reject) => { + (async () => { + try { + let event = await it.next(); + resolve(event.value as T); + + while (!event.done) { + event = await it.next(); + } + } catch (err) { + reject(err); + } + })(); + }); +} diff --git a/packages/bun/src/executors/run/lib/get-file-to-run.ts b/packages/bun/src/executors/run/lib/get-file-to-run.ts new file mode 100644 index 0000000..978df9e --- /dev/null +++ b/packages/bun/src/executors/run/lib/get-file-to-run.ts @@ -0,0 +1,59 @@ +import { ExecutorContext, logger, ProjectGraphProjectNode } from '@nx/devkit'; +import { join } from 'node:path'; +import { interpolate } from 'nx/src/tasks-runner/utils'; +import { changeFilePathExtension } from './change-file-path-extension'; +import { getRelativePath } from './get-relative-path'; + +function getFileName( + main: string | undefined, + buildOptions: Record = {} +): string { + if (main) { + return changeFilePathExtension(main, 'js', { fromExt: 'ts' }); + } + + if (buildOptions.outputFileName) { + return buildOptions.outputFileName; + } + + if (buildOptions.main) { + return changeFilePathExtension(buildOptions.main, 'js', { fromExt: 'ts' }); + } + + return 'main.js'; +} + +export function getFileToRun( + context: ExecutorContext, + project: ProjectGraphProjectNode, + buildOptions: Record, + buildTargetExecutor?: string, + main?: string +): string { + const fileName = getFileName(main, buildOptions); + + if (!buildOptions?.outputPath && !buildOptions?.outputFileName) { + const outputPath = + project.data.targets?.[buildOptions.target]?.outputs?.[0]; + + if (outputPath) { + const outputFilePath = interpolate(outputPath, { + projectName: project.name, + projectRoot: project.data.root, + workspaceRoot: context.root + }); + return join(outputFilePath, fileName); + } + const fallbackFile = join('dist', project.data.root, fileName); + + logger.warn( + `Build option outputFileName not set for ${project.name}. Using fallback value of ${fallbackFile}.` + ); + + return join(context.root, fallbackFile); + } + + const outputFileName = getRelativePath(project.data.root, fileName); + + return join(context.root, buildOptions.outputPath, outputFileName); +} diff --git a/packages/bun/src/executors/run/lib/get-relative-path.ts b/packages/bun/src/executors/run/lib/get-relative-path.ts new file mode 100644 index 0000000..561da17 --- /dev/null +++ b/packages/bun/src/executors/run/lib/get-relative-path.ts @@ -0,0 +1,11 @@ +import { relative, resolve } from 'node:path'; +import { isRelativePathDefinition } from './is-relative-path-definition'; +import { isAbsolute } from 'fast-glob/out/utils/pattern'; + +export function getRelativePath(from: string, to: string): string { + const absFrom = isAbsolute(from) ? from : resolve('/', from); + const absTo = isRelativePathDefinition(to) + ? resolve(absFrom, to) + : resolve('/', to); + return relative(absFrom, absTo); +} diff --git a/packages/bun/src/executors/run/lib/index.ts b/packages/bun/src/executors/run/lib/index.ts new file mode 100644 index 0000000..e7a6751 --- /dev/null +++ b/packages/bun/src/executors/run/lib/index.ts @@ -0,0 +1,4 @@ +export * from './build-bun-args'; +export * from './get-file-to-run'; +export * from './normalize-options'; +export * from './wait-for-targets'; diff --git a/packages/bun/src/executors/run/lib/is-relative-path-definition.ts b/packages/bun/src/executors/run/lib/is-relative-path-definition.ts new file mode 100644 index 0000000..e0a219d --- /dev/null +++ b/packages/bun/src/executors/run/lib/is-relative-path-definition.ts @@ -0,0 +1,3 @@ +export function isRelativePathDefinition(pathDefinition: string) { + return pathDefinition.startsWith('./') || pathDefinition.startsWith('../'); +} diff --git a/packages/bun/src/executors/run/lib/normalize-options.ts b/packages/bun/src/executors/run/lib/normalize-options.ts new file mode 100644 index 0000000..a351ee6 --- /dev/null +++ b/packages/bun/src/executors/run/lib/normalize-options.ts @@ -0,0 +1,41 @@ +import { + InspectType, + NormalizedRunExecutorOptions, + RunExecutorOptions +} from '../schema'; +import { ExecutorContext } from '@nx/devkit'; +import { resolve } from 'node:path'; + +export function normalizeOptions( + options: RunExecutorOptions, + context: ExecutorContext +): NormalizedRunExecutorOptions { + const projectName = context.projectName!; + const root = context.root; + const cwd = options.cwd ? resolve(context.root, options.cwd) : root; // TODO + + const shouldBuildApp = !!options.buildTarget; + const shouldBuildDependencies = !!options.runBuildTargetDependencies; + const watchMode = getWatchMode(options.watch, shouldBuildApp); + + const inspect = + options.inspect === true ? InspectType.Inspect : (options.inspect ?? false); + + return { + ...options, + projectName, + root, + cwd, + watchMode, + inspect, + shouldBuildApp, + shouldBuildDependencies + }; +} + +function getWatchMode( + watch: RunExecutorOptions['watch'], + shouldBuildApp: boolean +): NormalizedRunExecutorOptions['watchMode'] { + return watch === true ? (shouldBuildApp ? 'nx' : 'bun') : (watch ?? false); +} diff --git a/packages/bun/src/executors/run/lib/wait-for-targets.ts b/packages/bun/src/executors/run/lib/wait-for-targets.ts new file mode 100644 index 0000000..23e42e9 --- /dev/null +++ b/packages/bun/src/executors/run/lib/wait-for-targets.ts @@ -0,0 +1,15 @@ +import { ExecutorContext, parseTargetString, runExecutor } from '@nx/devkit'; +import { firstValueFrom } from './first-value-from'; + +export async function waitForTargets( + targets: string[], + context: ExecutorContext +): Promise<{ success: boolean }[]> { + return Promise.all( + targets.map(async (targetString) => { + const target = parseTargetString(targetString, context); + const output = await runExecutor(target, {}, context); + return firstValueFrom(output); + }) + ); +} diff --git a/packages/bun/src/executors/run/run.ts b/packages/bun/src/executors/run/run.ts new file mode 100644 index 0000000..aa1549d --- /dev/null +++ b/packages/bun/src/executors/run/run.ts @@ -0,0 +1,136 @@ +import { + ExecutorContext, + logger, + parseTargetString, + readTargetOptions, + runExecutor +} from '@nx/devkit'; +import { createAsyncIterable } from '@nx/devkit/src/utils/async-iterable'; +import { resolve } from 'node:path'; +import { + getBunVersion, + killProcess, + SpawnResult, + spawnWithBun, + waitForExit +} from '../../utils'; +import { NormalizedRunExecutorOptions, RunExecutorOptions } from './schema'; +import { + buildBunArgs, + getFileToRun, + normalizeOptions, + waitForTargets +} from './lib'; + +function launch( + entry: string, + opts: NormalizedRunExecutorOptions, + cwd: string +): SpawnResult { + const args = buildBunArgs(opts, entry); + + return spawnWithBun(args, { + cwd, + stdio: 'inherit' + }); +} + +async function* bunRunExecutor( + _options: RunExecutorOptions, + context: ExecutorContext +) { + const bunVersion = await getBunVersion(); + + if (!bunVersion) { + throw new Error(`bun command not found. Make sure the bun is available`); + } + + process.env.NODE_ENV ??= context?.configurationName ?? 'development'; + + const options = normalizeOptions(_options, context); + + const project = context.projectGraph.nodes[context.projectName!]; + const cwd = options.cwd ? resolve(context.root, options.cwd) : context.root; + + // 1) Wait for other targets if needed + if (options.waitUntilTargets?.length) { + const results = await waitForTargets(options.waitUntilTargets, context); + for (const [i, result] of results.entries()) { + if (!result.success) { + throw new Error( + `Wait until target failed: ${options.waitUntilTargets[i]}.` + ); + } + } + } + + // // 2) Prepare path remapping for "built libs first" + // const tsconfigOverridePath = + // options.tsConfigOverride && + // buildTarget && + // (shouldBuildApp ? options.runBuildTargetDependencies !== false : false) + // ? writeRuntimeTsconfigOverride(projectName, buildTarget, root, context) + // : null; + + yield* createAsyncIterable<{ success: boolean }>(async ({ next, done }) => { + // Case 1: Run "raw" main file (without building it) + if (options.main && !options.buildTarget) { + const entry = resolve(context.root, options.main); + const proc = launch(entry, options, cwd); + const code = await waitForExit(proc); + next({ success: code === 0 }); + done(); + return; + } + + // Case 2: Build app first and then run the built main file + if (options.buildTarget) { + const buildTarget = parseTargetString(options.buildTarget, context); + const buildOptions: Record = { + ...readTargetOptions(buildTarget, context), + ...(options.buildTargetOptions || {}), + target: buildTarget.target + }; + const buildTargetExecutor = + project.data.targets?.[buildTarget.target]?.executor; + + const buildIterator = await runExecutor<{ + success: boolean; + outputPath?: string; + }>(buildTarget, {}, context); + + let current: SpawnResult | null = null; + + for await (const res of buildIterator) { + if (!res.success) { + logger.error(`Build failed for ${options.buildTarget}`); + next({ success: false }); + continue; + } + + const entry = getFileToRun( + context, + project, + buildOptions, + buildTargetExecutor, + options.main + ); + + await killProcess(current); + current = launch(entry, options, cwd); + const code = await waitForExit(current); + next({ success: code === 0 }); + } + + await killProcess(current); + done(); + return; + } + + throw new Error( + `Either "main" or "buildTarget" must be defined in executor options` + ); + }); +} + +export default bunRunExecutor; diff --git a/packages/bun/src/executors/run/schema.d.ts b/packages/bun/src/executors/run/schema.d.ts new file mode 100644 index 0000000..b01abf5 --- /dev/null +++ b/packages/bun/src/executors/run/schema.d.ts @@ -0,0 +1,37 @@ +export type WatchMode = boolean | 'nx' | 'bun'; + +export const enum InspectType { + Inspect = 'inspect', + InspectBrk = 'inspect-brk' +} + +export interface RunExecutorOptions { + main?: string; + buildTarget?: string; + buildTargetOptions?: Record; + runtimeArgs: string[]; + args: string[]; + watch?: WatchMode; + hot?: boolean; + inspect: boolean | InspectType; + debounce?: number; // TODO: add to schema + config?: string; + tsConfig?: string; + tsConfigOverride?: string; + smol?: boolean; + bun?: boolean; + runBuildTargetDependencies?: boolean; + waitUntilTargets: string[]; + cwd?: string; +} + +export interface NormalizedRunExecutorOptions + extends Omit { + projectName: string; + root: string; + cwd: string; + watchMode: Exclude; + inspect: false | InspectType; + shouldBuildApp: boolean; + shouldBuildDependencies: boolean; +} diff --git a/packages/bun/src/executors/run/schema.json b/packages/bun/src/executors/run/schema.json new file mode 100644 index 0000000..f54031e --- /dev/null +++ b/packages/bun/src/executors/run/schema.json @@ -0,0 +1,101 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "version": 2, + "title": "Bun Run executor", + "description": "", + "type": "object", + "properties": { + "main": { + "type": "string", + "description": "Entry point to run (TS or JS). Example: src/main.ts or dist/app/main.js" + }, + "buildTarget": { + "type": "string", + "description": "Optional target that builds/rebuilds prior to (re)starting Bun, e.g. app:build" + }, + "buildTargetOptions": { + "type": "object", + "description": "Additional options to pass into the build target.", + "default": {} + }, + "watch": { + "oneOf": [ + { "type": "boolean" }, + { "type": "string", "enum": ["nx", "bun"] } + ], + "description": "To run a file in watch mode", + "default": false + }, + "hot": { + "type": "boolean", + "description": "Enable auto reload in bun's JavaScript runtime", + "default": true + }, + "inspect": { + "oneOf": [ + { + "type": "string", + "enum": ["inspect", "inspect-brk"] + }, + { + "type": "boolean" + } + ], + "description": "Ensures the app is starting with debugging.", + "default": "inspect", + "x-priority": "important" + }, + "runtimeArgs": { + "type": "array", + "items": { "type": "string" }, + "description": "Arguments for the Bun runtime (before the entry). Example: --no-warnings", + "default": [] + }, + "args": { + "type": "array", + "items": { "type": "string" }, + "description": "Arguments for your program (after the entry).", + "default": [] + }, + "config": { + "type": "string", + "description": "Config file to load bun from (e.g. -c bunfig.toml" + }, + "tsConfig": { + "type": "string", + "description": "Load tsconfig from path instead of cwd/tsconfig.json" + }, + "tsConfigOverride": { + "type": "string", + "description": "Use a different tsconfig." + }, + "smol": { + "type": "boolean", + "description": "In memory-constrained environments, use the smol flag to reduce memory usage at a cost to performance.", + "default": false + }, + "bun": { + "type": "boolean", + "description": "Force a script or package to use Bun.js instead of Node.js (via symlinking node)", + "default": false + }, + "runBuildTargetDependencies": { + "type": "boolean", + "description": "Whether to run dependencies before running the build. Set this to true if the project does not build libraries from source (e.g. 'buildLibsFromSource: false').", + "default": true + }, + "waitUntilTargets": { + "type": "array", + "description": "The targets to run before starting the node app. Listed in the form :. The main target will run once all listed targets have output something to the console.", + "default": [], + "items": { + "type": "string" + } + }, + "cwd": { + "description": "Current working directory of the command.", + "type": "string" + } + }, + "required": [] +} diff --git a/packages/bun/src/generators/application/application.ts b/packages/bun/src/generators/application/application.ts new file mode 100644 index 0000000..7d62398 --- /dev/null +++ b/packages/bun/src/generators/application/application.ts @@ -0,0 +1,126 @@ +import { + ensurePackage, + formatFiles, + GeneratorCallback, + runTasksInSerial, + Tree, + updateTsConfigsToJs +} from '@nx/devkit'; +import { ApplicationGeneratorOptions } from './schema'; +import { + addAppFiles, + addProject, + addProxy, + normalizeOptions, + updateTsConfigOptions +} from './lib'; +import { libs } from '../../utils'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; +import initGenerator from '../init/init'; +import { + addProjectToTsSolutionWorkspace, + updateTsconfigFiles +} from '@nx/js/src/utils/typescript/ts-solution-setup'; +import { sortPackageJsonFields } from '@nx/js/src/utils/package-json/sort-fields'; + +export async function applicationGenerator( + tree: Tree, + _options: ApplicationGeneratorOptions +) { + const tasks: GeneratorCallback[] = []; + const options = await normalizeOptions(tree, _options); + + const logShowProjectCmdTask = () => { + logShowProjectCommand(options.name); + }; + + if (options.framework === 'elysia') { + const { applicationGenerator } = ensurePackage( + libs.nxElysia.name, + libs.nxElysia.version + ); + + tasks.push( + await applicationGenerator(tree, { + ...options, + skipFormat: true + }) + ); + + tasks.push(logShowProjectCmdTask); + + return runTasksInSerial(...tasks); + } + + tasks.push( + await initGenerator(tree, { + ...options, + skipFormat: true + }) + ); + + addAppFiles(tree, options); + addProject(tree, options); + + if (options.isUsingTsSolutionConfig) { + await addProjectToTsSolutionWorkspace(tree, options.appProjectRoot); + } + + updateTsConfigOptions(tree, options); + + if (options.js) { + updateTsConfigsToJs(tree, { projectRoot: options.appProjectRoot }); + } + + if (options.frontendProject) { + addProxy(tree, options); + } + + if (options.isUsingTsSolutionConfig) { + updateTsconfigFiles( + tree, + options.appProjectRoot, + 'tsconfig.app.json', + { + // Environment setup & latest features + lib: ['ESNext'], + target: 'ESNext', + module: 'Preserve', + moduleDetection: 'force', + + // Bundler mode + moduleResolution: 'bundler', + allowImportingTsExtensions: true, + verbatimModuleSyntax: true, + noEmit: true, + + // Best practices + strict: true, + skipLibCheck: true, + noFallthroughCasesInSwitch: true, + noUncheckedIndexedAccess: true, + noImplicitOverride: true, + + // Some stricter flags (disabled by default) + noUnusedLocals: false, + noUnusedParameters: false, + noPropertyAccessFromIndexSignature: false + }, + options.linter === 'eslint' + ? ['eslint.config.js', 'eslint.config.cjs', 'eslint.config.mjs'] + : undefined + ); + } + + sortPackageJsonFields(tree, options.appProjectRoot); + + if (!options.skipFormat) { + await formatFiles(tree); + } + + tasks.push(logShowProjectCmdTask); + + return runTasksInSerial(...tasks); +} + +export default applicationGenerator; diff --git a/packages/bun/src/generators/application/files/src/main.ts.template b/packages/bun/src/generators/application/files/src/main.ts.template new file mode 100644 index 0000000..8b47b72 --- /dev/null +++ b/packages/bun/src/generators/application/files/src/main.ts.template @@ -0,0 +1,10 @@ +const port = process.env.PORT ? Number(process.env.PORT) : <%= port %>; + +const server = Bun.serve({ + port, + fetch(req) { + return new Response("Bun!"); + }, +}); + +console.log(`Listening on ${server.url} ...`); diff --git a/packages/bun/src/generators/application/files/tsconfig.app.json b/packages/bun/src/generators/application/files/tsconfig.app.json new file mode 100644 index 0000000..ea768db --- /dev/null +++ b/packages/bun/src/generators/application/files/tsconfig.app.json @@ -0,0 +1,31 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist", + // Environment setup & latest features + "lib": ["ESNext"], + "target": "ESNext", + "module": "Preserve", + "moduleDetection": "force", + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + }, + "include": ["src/**/*.ts"], + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/packages/bun/src/generators/application/files/tsconfig.json b/packages/bun/src/generators/application/files/tsconfig.json new file mode 100644 index 0000000..595598e --- /dev/null +++ b/packages/bun/src/generators/application/files/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "<%= rootTsConfigPath %>", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/packages/bun/src/generators/application/lib/add-app-files.ts b/packages/bun/src/generators/application/lib/add-app-files.ts new file mode 100644 index 0000000..092f408 --- /dev/null +++ b/packages/bun/src/generators/application/lib/add-app-files.ts @@ -0,0 +1,27 @@ +import { NormalizedOptions } from './normalize-options'; +import { + generateFiles, + joinPathFragments, + offsetFromRoot, + Tree +} from '@nx/devkit'; +import { getRelativePathToRootTsConfig } from '@nx/js'; + +export function addAppFiles(tree: Tree, options: NormalizedOptions) { + generateFiles( + tree, + joinPathFragments(__dirname, '../files'), + options.appProjectRoot, + { + ...options, + tmpl: '', + name: options.name, + root: options.appProjectRoot, + offsetFromRoot: offsetFromRoot(options.appProjectRoot), + rootTsConfigPath: getRelativePathToRootTsConfig( + tree, + options.appProjectRoot + ) + } + ); +} diff --git a/packages/bun/src/generators/application/lib/add-project.ts b/packages/bun/src/generators/application/lib/add-project.ts new file mode 100644 index 0000000..4184535 --- /dev/null +++ b/packages/bun/src/generators/application/lib/add-project.ts @@ -0,0 +1,57 @@ +import { NormalizedOptions } from './normalize-options'; +import { + addProjectConfiguration, + joinPathFragments, + ProjectConfiguration, + Tree, + writeJson +} from '@nx/devkit'; +import { PackageJson } from 'nx/src/utils/package-json'; +import { getBuildConfig, getServeConfig } from './create-targets'; + +export function addProject( + tree: Tree, + options: NormalizedOptions, + appDependencies: Record = {} +) { + const project: ProjectConfiguration = { + root: options.appProjectRoot, + sourceRoot: joinPathFragments(options.appProjectRoot, 'src'), + projectType: 'application', + targets: { + build: getBuildConfig(options), + serve: getServeConfig(options) + }, + tags: options.parsedTags + }; + + const packageJson: PackageJson = { + name: options.importPath, + version: '0.0.1', + private: true, + dependencies: { ...appDependencies } + }; + + if (!options.useProjectJson) { + packageJson.nx = { + name: options.name !== options.importPath ? options.name : undefined, + targets: project.targets, + tags: project.tags?.length ? project.tags : undefined + }; + } else { + addProjectConfiguration( + tree, + options.name, + project, + options.standaloneConfig + ); + } + + if (!options.useProjectJson || options.isUsingTsSolutionConfig) { + writeJson( + tree, + joinPathFragments(options.appProjectRoot, 'package.json'), + packageJson + ); + } +} diff --git a/packages/bun/src/generators/application/lib/add-proxy.ts b/packages/bun/src/generators/application/lib/add-proxy.ts new file mode 100644 index 0000000..226751c --- /dev/null +++ b/packages/bun/src/generators/application/lib/add-proxy.ts @@ -0,0 +1,68 @@ +import { + logger, + readProjectConfiguration, + Tree, + updateProjectConfiguration +} from '@nx/devkit'; +import { NormalizedOptions } from './normalize-options'; + +export function addProxy(tree: Tree, options: NormalizedOptions) { + if (!options.frontendProject) { + return; + } + + const projectConfig = readProjectConfiguration(tree, options.frontendProject); + const serveTargetName = ['serve', 'dev'].find( + (t) => !!projectConfig.targets?.[t] + ); + + if (projectConfig.targets && serveTargetName) { + projectConfig.targets[serveTargetName].dependsOn = [ + ...(projectConfig.targets[serveTargetName].dependsOn ?? []), + `${options.name}:serve` + ]; + + const pathToProxyFile = `${projectConfig.root}/proxy.conf.json`; + projectConfig.targets[serveTargetName].options = { + ...projectConfig.targets[serveTargetName].options, + proxyConfig: pathToProxyFile + }; + + if (!tree.exists(pathToProxyFile)) { + tree.write( + pathToProxyFile, + JSON.stringify( + { + '/api': { + target: `http://localhost:${options.port}`, + secure: false + } + }, + null, + 2 + ) + ); + } else { + //add new entry to existing config + const proxyFileContent = tree.read(pathToProxyFile)?.toString(); + + if (proxyFileContent) { + const proxyModified = { + ...JSON.parse(proxyFileContent), + [`/${options.name}-api`]: { + target: `http://localhost:${options.port}`, + secure: false + } + }; + + tree.write(pathToProxyFile, JSON.stringify(proxyModified, null, 2)); + } + } + + updateProjectConfiguration(tree, options.frontendProject, projectConfig); + } else { + logger.warn( + `Skip updating proxy for frontend project "${options.frontendProject}" since "serve" target is not found in project.json. For more information, see: https://nx.dev/recipes/node/application-proxies.` + ); + } +} diff --git a/packages/bun/src/generators/application/lib/create-targets.ts b/packages/bun/src/generators/application/lib/create-targets.ts new file mode 100644 index 0000000..5b98c95 --- /dev/null +++ b/packages/bun/src/generators/application/lib/create-targets.ts @@ -0,0 +1,57 @@ +import { joinPathFragments, TargetConfiguration } from '@nx/devkit'; +import { NormalizedOptions } from './normalize-options'; +import { libs } from '../../../utils'; +import { BuildExecutorOptions } from '../../../executors/build/schema'; +import { InspectType, RunExecutorOptions } from '../../../executors/run/schema'; + +export function getBuildConfig( + options: NormalizedOptions +): TargetConfiguration { + return { + executor: `${libs.plugin.name}:build`, + inputs: ['production', '^production'], + outputs: ['{options.outputPath}'], + dependsOn: ['^build'], + defaultConfiguration: 'production', + options: { + main: joinPathFragments(options.appProjectRoot, 'src', 'main.ts'), + outputPath: options.outputPath, + tsConfig: joinPathFragments(options.appProjectRoot, 'tsconfig.app.json'), + smol: false, + bun: true + }, + configurations: { + development: {}, + production: {} + } + }; +} + +export function getServeConfig( + options: NormalizedOptions +): TargetConfiguration { + return { + continuous: true, + executor: `${libs.plugin.name}:run`, + defaultConfiguration: 'development', + options: { + main: joinPathFragments(options.appProjectRoot, 'src', 'main.ts'), + tsConfig: joinPathFragments(options.appProjectRoot, 'tsconfig.app.json'), + watch: true, + hot: true, + bun: true, + smol: false, + runBuildTargetDependencies: false, + waitUntilTargets: [], + runtimeArgs: [], + args: [], + inspect: InspectType.Inspect + }, + configurations: { + development: {}, + production: { + buildTarget: `${options.name}:build:production` + } + } + }; +} diff --git a/packages/bun/src/generators/application/lib/index.ts b/packages/bun/src/generators/application/lib/index.ts new file mode 100644 index 0000000..04e628e --- /dev/null +++ b/packages/bun/src/generators/application/lib/index.ts @@ -0,0 +1,6 @@ +export * from './add-app-files'; +export * from './add-project'; +export * from './add-proxy'; +export * from './create-targets'; +export * from './normalize-options'; +export * from './update-ts-config-options'; diff --git a/packages/bun/src/generators/application/lib/normalize-options.ts b/packages/bun/src/generators/application/lib/normalize-options.ts new file mode 100644 index 0000000..46e121c --- /dev/null +++ b/packages/bun/src/generators/application/lib/normalize-options.ts @@ -0,0 +1,76 @@ +import { ApplicationGeneratorOptions } from '../schema'; +import { joinPathFragments, names, readNxJson, Tree } from '@nx/devkit'; +import { + determineProjectNameAndRootOptions, + ensureRootProjectName +} from '@nx/devkit/src/generators/project-name-and-root-utils'; +import { isUsingTsSolutionSetup } from '@nx/js/src/utils/typescript/ts-solution-setup'; + +export interface NormalizedOptions + extends Omit { + name: string; + appProjectRoot: string; + port: number; + parsedTags: string[]; + outputPath: string; + importPath: string; + isUsingTsSolutionConfig: boolean; +} + +export async function normalizeOptions( + host: Tree, + options: ApplicationGeneratorOptions +): Promise { + await ensureRootProjectName(options, 'application'); + const { + projectName, + projectRoot: appProjectRoot, + importPath + } = await determineProjectNameAndRootOptions(host, { + name: options.name, + projectType: 'application', + directory: options.directory, + rootProject: options.rootProject + }); + options.rootProject = appProjectRoot === '.'; + options.e2eTestRunner = options.e2eTestRunner ?? 'jest'; + + const parsedTags = options.tags + ? options.tags.split(',').map((s) => s.trim()) + : []; + + const nxJson = readNxJson(host); + const addPlugin = + options.addPlugin ?? + (process.env.NX_ADD_PLUGINS !== 'false' && + nxJson?.useInferencePlugins !== false); + + const isUsingTsSolutionConfig = isUsingTsSolutionSetup(host); + const appProjectName = + !isUsingTsSolutionConfig || options.name ? projectName : importPath; + const useProjectJson = options.useProjectJson ?? !isUsingTsSolutionConfig; + + return { + ...options, + addPlugin, + name: appProjectName, + frontendProject: options.frontendProject + ? names(options.frontendProject).fileName + : undefined, + appProjectRoot, + importPath, + parsedTags, + linter: options.linter ?? 'eslint', + unitTestRunner: options.unitTestRunner ?? 'jest', + rootProject: options.rootProject ?? false, + port: options.port ?? 3000, + outputPath: isUsingTsSolutionConfig + ? joinPathFragments(appProjectRoot, 'dist') + : joinPathFragments( + 'dist', + options.rootProject ? appProjectName : appProjectRoot + ), + isUsingTsSolutionConfig, + useProjectJson + }; +} diff --git a/packages/bun/src/generators/application/lib/update-ts-config-options.ts b/packages/bun/src/generators/application/lib/update-ts-config-options.ts new file mode 100644 index 0000000..d7e37f7 --- /dev/null +++ b/packages/bun/src/generators/application/lib/update-ts-config-options.ts @@ -0,0 +1,32 @@ +import { Tree, updateJson } from '@nx/devkit'; +import { NormalizedOptions } from './normalize-options'; +import { tsConfigBaseOptions } from '@nx/js'; + +export function updateTsConfigOptions(tree: Tree, options: NormalizedOptions) { + if (options.isUsingTsSolutionConfig) { + return; + } + + updateJson(tree, `${options.appProjectRoot}/tsconfig.json`, (json) => { + if (options.rootProject) { + return { + compilerOptions: { + ...tsConfigBaseOptions, + ...json.compilerOptions, + esModuleInterop: true + }, + ...json, + extends: undefined, + exclude: ['node_modules', 'tmp'] + }; + } else { + return { + ...json, + compilerOptions: { + ...json.compilerOptions, + esModuleInterop: true + } + }; + } + }); +} diff --git a/packages/bun/src/generators/application/schema.d.ts b/packages/bun/src/generators/application/schema.d.ts new file mode 100644 index 0000000..b1b495d --- /dev/null +++ b/packages/bun/src/generators/application/schema.d.ts @@ -0,0 +1,27 @@ +import type { Linter, LinterType } from '@nx/eslint'; + +export interface ApplicationGeneratorOptions { + directory: string; + name?: string; + skipFormat?: boolean; + skipPackageJson?: boolean; + unitTestRunner?: 'jest' | 'none'; + e2eTestRunner?: 'jest' | 'none'; + linter?: Linter | LinterType; + formatter?: 'none' | 'prettier'; + tags?: string; + frontendProject?: string; + js?: boolean; + setParserOptionsProject?: boolean; + standaloneConfig?: boolean; + framework?: BunFrameWorks; + port?: number; + rootProject?: boolean; + docker?: boolean; + skipDockerPlugin?: boolean; + addPlugin?: boolean; + useTsSolution?: boolean; + useProjectJson?: boolean; +} + +export type BunFrameWorks = 'elysia' | 'none'; diff --git a/packages/bun/src/generators/application/schema.json b/packages/bun/src/generators/application/schema.json new file mode 100644 index 0000000..ada6536 --- /dev/null +++ b/packages/bun/src/generators/application/schema.json @@ -0,0 +1,121 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "StonxBunApplicationGenerator", + "title": "Bun Application Generator", + "description": "Generates a Bun application in the current workspace.", + "cli": "nx", + "type": "object", + "properties": { + "directory": { + "description": "The directory of the new application.", + "type": "string", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "Which directory do you want to create the application in?" + }, + "name": { + "description": "The name of the application.", + "type": "string", + "pattern": "(?:^@[a-zA-Z0-9-*~][a-zA-Z0-9-*._~]*\\/[a-zA-Z0-9-~][a-zA-Z0-9-._~]*|^[a-zA-Z][^:]*)$", + "x-priority": "important" + }, + "skipFormat": { + "description": "Skip formatting files", + "type": "boolean", + "default": false, + "x-priority": "internal" + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" + }, + "linter": { + "description": "The tool to use for running lint checks.", + "type": "string", + "enum": ["eslint", "none"], + "default": "none", + "x-prompt": "Which linter would you like to use?", + "x-priority": "important" + }, + "unitTestRunner": { + "type": "string", + "enum": ["jest", "none"], + "description": "Test runner to use for unit tests.", + "default": "none", + "x-priority": "important", + "x-prompt": "Which unit test runner would you like to use?" + }, + "e2eTestRunner": { + "type": "string", + "enum": ["jest", "none"], + "description": "Test runner to use for end-to-end tests", + "default": "none", + "x-priority": "important", + "x-prompt": "Which end-to-end test runner would you like to use?" + }, + "tags": { + "type": "string", + "description": "Add tags to the application (used for linting)." + }, + "frontendProject": { + "type": "string", + "description": "Frontend project that needs to access this application. This sets up proxy configuration.", + "x-priority": "important", + "x-dropdown": "projects" + }, + "js": { + "type": "boolean", + "description": "Generate JavaScript files rather than TypeScript files.", + "default": false + }, + "setParserOptionsProject": { + "type": "boolean", + "description": "Whether or not to configure the ESLint `parserOptions.project` option. We do not do this by default for lint performance reasons.", + "default": false + }, + "standaloneConfig": { + "description": "Split the project configuration into `/project.json` rather than including it inside `workspace.json`.", + "type": "boolean", + "default": true, + "x-deprecated": "Nx only supports standaloneConfig" + }, + "framework": { + "description": "Generate the bun application using a framework", + "type": "string", + "enum": ["elysia", "none"], + "default": "none", + "x-prompt": "Which framework do you want to use?", + "x-priority": "important" + }, + "port": { + "description": "The port which the server will be run on", + "type": "number", + "default": 3000 + }, + "rootProject": { + "description": "Create bun application at the root of the workspace", + "type": "boolean", + "default": false, + "hidden": true, + "x-priority": "internal" + }, + "docker": { + "type": "boolean", + "description": "Add a docker build target" + }, + "skipDockerPlugin": { + "type": "boolean", + "description": "Skip the @nx/docker plugin and use the legacy docker build target instead.", + "default": false + }, + "useProjectJson": { + "type": "boolean", + "description": "Use a `project.json` configuration file instead of inlining the Nx configuration in the `package.json` file." + } + }, + "required": ["directory"] +} diff --git a/packages/bun/src/generators/init/init.ts b/packages/bun/src/generators/init/init.ts new file mode 100644 index 0000000..e120d0d --- /dev/null +++ b/packages/bun/src/generators/init/init.ts @@ -0,0 +1,23 @@ +import { GeneratorCallback, runTasksInSerial, Tree } from '@nx/devkit'; +import { formatFiles } from '@nx/devkit'; +import type { InitGeneratorOptions } from './schema'; +import { ensureDependencies } from './lib/ensure-dependencies'; + +export async function initGenerator( + tree: Tree, + options: InitGeneratorOptions +): Promise { + const tasks: GeneratorCallback[] = []; + + if (!options.skipPackageJson) { + tasks.push(ensureDependencies(tree, options.keepExistingVersions)); + } + + if (!options.skipFormat) { + await formatFiles(tree); + } + + return runTasksInSerial(...tasks); +} + +export default initGenerator; diff --git a/packages/bun/src/generators/init/lib/ensure-dependencies.ts b/packages/bun/src/generators/init/lib/ensure-dependencies.ts new file mode 100644 index 0000000..e232e3b --- /dev/null +++ b/packages/bun/src/generators/init/lib/ensure-dependencies.ts @@ -0,0 +1,33 @@ +import { + GeneratorCallback, + removeDependenciesFromPackageJson, + runTasksInSerial, + Tree +} from '@nx/devkit'; +import { addDependenciesToPackageJson } from '@nx/devkit'; +import { workspaceDependencies } from '../../../utils'; + +export function ensureDependencies( + tree: Tree, + keepExistingVersions?: boolean +): GeneratorCallback { + const tasks: GeneratorCallback[] = []; + tasks.push( + removeDependenciesFromPackageJson( + tree, + Object.keys(workspaceDependencies), + [] + ) + ); + tasks.push( + addDependenciesToPackageJson( + tree, + {}, + workspaceDependencies, + undefined, + keepExistingVersions + ) + ); + + return runTasksInSerial(...tasks); +} diff --git a/packages/bun/src/generators/init/schema.d.ts b/packages/bun/src/generators/init/schema.d.ts new file mode 100644 index 0000000..6e5c4c5 --- /dev/null +++ b/packages/bun/src/generators/init/schema.d.ts @@ -0,0 +1,5 @@ +export interface InitGeneratorOptions { + skipFormat?: boolean; + skipPackageJson?: boolean; + keepExistingVersions?: boolean; +} diff --git a/packages/bun/src/generators/init/schema.json b/packages/bun/src/generators/init/schema.json new file mode 100644 index 0000000..c9afb1f --- /dev/null +++ b/packages/bun/src/generators/init/schema.json @@ -0,0 +1,28 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "StonxBunInit", + "title": "Bun Init Generator", + "description": "Initializes a Bun project in the current workspace.", + "type": "object", + "properties": { + "skipFormat": { + "description": "Skip formatting files.", + "type": "boolean", + "default": false, + "x-priority": "internal" + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" + }, + "keepExistingVersions": { + "type": "boolean", + "x-priority": "internal", + "description": "Keep existing dependencies versions", + "default": false + } + }, + "required": [] +} diff --git a/packages/bun/src/index.ts b/packages/bun/src/index.ts new file mode 100644 index 0000000..7d8f6e7 --- /dev/null +++ b/packages/bun/src/index.ts @@ -0,0 +1,2 @@ +export { applicationGenerator } from './generators/application/application'; +export { initGenerator } from './generators/init/init'; diff --git a/packages/bun/src/utils/bun-cfg/bun-build-config.ts b/packages/bun/src/utils/bun-cfg/bun-build-config.ts new file mode 100644 index 0000000..9ce739d --- /dev/null +++ b/packages/bun/src/utils/bun-cfg/bun-build-config.ts @@ -0,0 +1,75 @@ +import { addFlag, cfgToArgv, defineConfigArgvMap } from './cfg-to-argv'; +import { isArray, isBool, isString } from '../logic'; + +export function createBunBuildConfig(opts: Bun.BuildConfig): Bun.BuildConfig { + return opts; +} + +export const bunBuildConfigArgvMap = defineConfigArgvMap({ + // Positional args + entrypoints: (v) => v, + + // Simple, documented mappings + outdir: (v) => [addFlag('--outdir', v)], + target: (v) => [addFlag('--target', v)], + format: (v) => [addFlag('--format', v)], + + // naming can be string or object with chunk/entry/asset + naming: (v) => + isString(v) + ? [addFlag(`--entry-naming`, v)] + : { + entry: (x) => [addFlag(`--entry-naming`, x)], + chunk: (x) => [addFlag(`--chunk-naming`, x)], + asset: (x) => [addFlag(`--asset-naming`, x)] + }, + + root: (v) => [addFlag(`--root`, v)], + splitting: (v) => [addFlag(`--splitting`, v)], + + plugins: (_v) => [], // No clear CLI mapping for programmatic plugins + + external: (v) => v.map((e) => addFlag(`--external`, e)), + packages: (v) => [addFlag(`--packages`, v)], + publicPath: (v) => [addFlag(`--public-path`, v)], + + define: (v) => + Object.entries(v).map(([k, val]) => + addFlag(`--define`, `'${k}=${JSON.stringify(val)}'`) + ), + loader: (v) => + Object.entries(v).map(([k, val]) => addFlag(`--loader`, `${k}:${val}`)), + + sourcemap: (v) => [ + addFlag('--sourcemap', isString(v) ? v : v ? 'inline' : 'none') + ], + + conditions: (v) => + [...(isArray(v) ? v : [v])].map((c) => addFlag('--condition', c)), + + env: (v) => [addFlag('--env', v)], + + minify: (v) => + isBool(v) + ? [addFlag('--minify', v)] + : { + whitespace: (x) => [addFlag(`--minify-whitespace`, x)], + syntax: (x) => [addFlag(`--minify-syntax`, x)], + identifiers: (x) => [addFlag(`--minify-identifiers`, x)] + }, + + ignoreDCEAnnotations: (v) => [addFlag('--ignore-dce-annotations', v)], + emitDCEAnnotations: (_v) => [], // uncertain + + bytecode: (v) => [addFlag('--bytecode', v)], // only if supported; otherwise harmless to leave empty + + banner: (v) => [addFlag('--banner', v)], + footer: (v) => [addFlag('--footer', v)], + drop: (v) => v.map((d) => addFlag('--drop', d)), + throw: (_v) => [], // execution-time behavior, not a CLI flag + tsconfig: (v) => [addFlag(`--tsconfig-override`, v)] +}); + +export function bunBuildConfigToArgv(config: Bun.BuildConfig) { + return cfgToArgv(config, bunBuildConfigArgvMap); +} diff --git a/packages/bun/src/utils/bun-cfg/bun-runtime-config.ts b/packages/bun/src/utils/bun-cfg/bun-runtime-config.ts new file mode 100644 index 0000000..f366014 --- /dev/null +++ b/packages/bun/src/utils/bun-cfg/bun-runtime-config.ts @@ -0,0 +1,13 @@ +import { addFlag, defineConfigArgvMap } from './cfg-to-argv'; + +export interface BunRuntimeConfig { + config?: string; + smol?: boolean; + bun?: boolean; +} + +export const bunRuntimeConfigArgvMap = defineConfigArgvMap({ + config: (v) => [addFlag('--config', v)], + smol: (v) => [addFlag('--smol', v)], + bun: (v) => [addFlag('--bun', v)] +}); diff --git a/packages/bun/src/utils/bun-cfg/cfg-to-argv.ts b/packages/bun/src/utils/bun-cfg/cfg-to-argv.ts new file mode 100644 index 0000000..b8c4375 --- /dev/null +++ b/packages/bun/src/utils/bun-cfg/cfg-to-argv.ts @@ -0,0 +1,93 @@ +import { isArray, isFunction, isNil, isPlainObject } from '../logic'; +import { BUN_FLAG_ARG_SEPARATOR } from './constants'; + +export type Config = { + [K in keyof PropertyKey]: unknown; +}; + +export type ConfigValueMapper = ( + val: Exclude +) => T extends any[] + ? string[] + : T extends object + ? ConfigArgvMap + : string[]; + +export type ConfigArgvMap = { + [K in keyof TConfig]-?: ConfigValueMapper; +}; + +export function isConfigLike(value: unknown): value is Config { + return isPlainObject(value); +} + +export function isConfigArgvMapLike( + value: unknown +): value is ConfigArgvMap { + return typeof value === 'object' && !isArray(value) && !isNil(value); +} + +export function defineConfigArgvMap( + argvMap: ConfigArgvMap +): ConfigArgvMap { + return argvMap; +} + +export const normalizeFlag = (flag: string): string => + flag.startsWith('-') + ? flag.startsWith('--') + ? flag + : `-${flag}` + : `--${flag}`; + +export function addFlag( + flag: string, + value?: TValue +): string { + if (value === false || isNil(value)) { + return ''; + } + + const flg = normalizeFlag(flag); + + if (value === true) { + return flg; + } + + return `${flg}${BUN_FLAG_ARG_SEPARATOR}${value}`; +} + +export function cfgToArgv( + cfg: TConfig, + argvMap: ConfigArgvMap +): string[] { + const argv: string[] = []; + + for (const key in cfg) { + const value = cfg[key]; + + if (isNil(value)) continue; + + const handler: ConfigValueMapper = argvMap[key]; + if (!isFunction(handler)) { + console.error(`Handler for ${key} is not a function`); + continue; + } + + const out = handler(value); + if (!out) continue; + + if (isArray(out)) { + argv.push(...out); + continue; + } + + if (!isConfigLike(value) || !isConfigArgvMapLike(out)) { + continue; + } + + argv.push(...cfgToArgv(value, out)); + } + + return argv; +} diff --git a/packages/bun/src/utils/bun-cfg/constants.ts b/packages/bun/src/utils/bun-cfg/constants.ts new file mode 100644 index 0000000..6e9df55 --- /dev/null +++ b/packages/bun/src/utils/bun-cfg/constants.ts @@ -0,0 +1,2 @@ +export type BunFlagArgSeparator = ' ' | '='; +export const BUN_FLAG_ARG_SEPARATOR: BunFlagArgSeparator = ' '; diff --git a/packages/bun/src/utils/bun.ts b/packages/bun/src/utils/bun.ts new file mode 100644 index 0000000..85f00ec --- /dev/null +++ b/packages/bun/src/utils/bun.ts @@ -0,0 +1,15 @@ +import { universalSpawnSync } from './cli'; + +export async function getBunVersion(): Promise { + try { + return await universalSpawnSync('bun --version'); + } catch (error) { + console.error(`Failed to retrieve the version for bun.`); + return null; + } +} + +export async function isBunAvailable(): Promise { + const bunVersion = await getBunVersion(); + return !!bunVersion; +} diff --git a/packages/bun/src/utils/buni/build/build.config.ts b/packages/bun/src/utils/buni/build/build.config.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/bun/src/utils/buni/bun/bun.ts b/packages/bun/src/utils/buni/bun/bun.ts new file mode 100644 index 0000000..b1dad89 --- /dev/null +++ b/packages/bun/src/utils/buni/bun/bun.ts @@ -0,0 +1,6 @@ +import { SpawnOptions, spawn } from '../spawn'; +import { getBunCmd } from '../utils'; + +export function bun(args?: string[], options?: SpawnOptions) { + return spawn(getBunCmd(), args, options); +} diff --git a/packages/bun/src/utils/buni/bun/index.ts b/packages/bun/src/utils/buni/bun/index.ts new file mode 100644 index 0000000..1f08d86 --- /dev/null +++ b/packages/bun/src/utils/buni/bun/index.ts @@ -0,0 +1 @@ +export * from './bun'; diff --git a/packages/bun/src/utils/buni/index.ts b/packages/bun/src/utils/buni/index.ts new file mode 100644 index 0000000..3799ad5 --- /dev/null +++ b/packages/bun/src/utils/buni/index.ts @@ -0,0 +1,30 @@ +import { spawn } from './spawn'; +import { bun } from './bun'; +import { node } from './node'; +import { run } from './run'; +import * as utils from './utils'; +export * from './spawn'; +export * from './bun'; +export * from './node'; +export * from './run'; +export * from './utils'; + +export function createBuildConfig(config: Bun.BuildConfig) { + return config; +} + +export function build(config: Bun.BuildConfig) { + return Bun.build(config); +} + +export const Buni = { + ...utils, + spawn, + bun, + build, + node, + run, + createBuildConfig +}; + +export default Buni; diff --git a/packages/bun/src/utils/buni/node/index.ts b/packages/bun/src/utils/buni/node/index.ts new file mode 100644 index 0000000..d0dddb6 --- /dev/null +++ b/packages/bun/src/utils/buni/node/index.ts @@ -0,0 +1 @@ +export * from './node'; diff --git a/packages/bun/src/utils/buni/node/node.ts b/packages/bun/src/utils/buni/node/node.ts new file mode 100644 index 0000000..5463ad9 --- /dev/null +++ b/packages/bun/src/utils/buni/node/node.ts @@ -0,0 +1,5 @@ +import { SpawnOptions, spawn } from '../spawn'; + +export function node(args?: string[], options?: SpawnOptions) { + return spawn('node', args, options); +} diff --git a/packages/bun/src/utils/buni/run/index.ts b/packages/bun/src/utils/buni/run/index.ts new file mode 100644 index 0000000..2e6f967 --- /dev/null +++ b/packages/bun/src/utils/buni/run/index.ts @@ -0,0 +1 @@ +export * from './run'; diff --git a/packages/bun/src/utils/buni/run/run.ts b/packages/bun/src/utils/buni/run/run.ts new file mode 100644 index 0000000..0691de4 --- /dev/null +++ b/packages/bun/src/utils/buni/run/run.ts @@ -0,0 +1,10 @@ +import { SpawnOptions } from '../spawn'; +import { bun } from '../bun'; + +export function run( + fileOrScript: string, + args?: string[], + options?: SpawnOptions +) { + return bun(['run', fileOrScript, ...(args || [])], options); +} diff --git a/packages/bun/src/utils/buni/spawn/__tests__/helpers.ts b/packages/bun/src/utils/buni/spawn/__tests__/helpers.ts new file mode 100644 index 0000000..3709096 --- /dev/null +++ b/packages/bun/src/utils/buni/spawn/__tests__/helpers.ts @@ -0,0 +1,51 @@ +/* Test helpers to mock runtime and process APIs for universal spawn */ +import * as childProc from 'node:child_process'; + +// Allow mutable import for mocking +let originalIsBunRuntime: any; +let originalBunSpawn: any; +let originalChildSpawn: any; + +export function mockIsBunRuntime(modulePath: string, value: boolean) { + const mod = require(modulePath); + if (originalIsBunRuntime === undefined) { + originalIsBunRuntime = mod.isBunRuntime; + } + mod.isBunRuntime = () => value; +} + +export function restoreIsBunRuntime(modulePath: string) { + if (originalIsBunRuntime === undefined) return; + + const mod = require(modulePath); + mod.isBunRuntime = originalIsBunRuntime; + originalIsBunRuntime = undefined; +} + +export function mockBunSpawn(impl: (opts: any) => any) { + // Create global Bun if not present + if (typeof globalThis.Bun === 'undefined') { + globalThis.Bun = {} as any; + } + if (originalBunSpawn === undefined) originalBunSpawn = globalThis.Bun.spawn; + globalThis.Bun.spawn = impl as any; +} + +export function restoreBunSpawn() { + if (originalBunSpawn !== undefined) globalThis.Bun.spawn = originalBunSpawn; + originalBunSpawn = undefined; +} + +export function mockNodeSpawn(impl: typeof childProc.spawn) { + if (originalChildSpawn === undefined) originalChildSpawn = childProc.spawn; + // @ts-expect-error spawn is read only + childProc.spawn = impl as any; +} + +export function restoreNodeSpawn() { + if (originalChildSpawn !== undefined) { + // @ts-expect-error spawn is read only + childProc.spawn = originalChildSpawn; + } + originalChildSpawn = undefined; +} diff --git a/packages/bun/src/utils/buni/spawn/index.ts b/packages/bun/src/utils/buni/spawn/index.ts new file mode 100644 index 0000000..24e6928 --- /dev/null +++ b/packages/bun/src/utils/buni/spawn/index.ts @@ -0,0 +1 @@ +export * from './spawn'; diff --git a/packages/bun/src/utils/buni/spawn/spawn.spec.ts b/packages/bun/src/utils/buni/spawn/spawn.spec.ts new file mode 100644 index 0000000..bab252c --- /dev/null +++ b/packages/bun/src/utils/buni/spawn/spawn.spec.ts @@ -0,0 +1,120 @@ +import { spawn } from './spawn'; +import type { ChildProcess } from 'node:child_process'; +import { + mockIsBunRuntime, + mockBunSpawn, + restoreBunSpawn, + mockNodeSpawn +} from './__tests__/helpers'; + +// module path that exports isBunRuntime used by spawn.ts +const utilsModulePath = '../utils'; + +describe('universal spawn', () => { + afterEach(() => { + // restoreIsBunRuntime(utilsModulePath); + // restoreBunSpawn(); + // restoreNodeSpawn(); + }); + + it('uses Bun.spawn if available', async () => { + (globalThis as any).Bun = { + spawn: jest.fn().mockReturnValue('bun-result') + }; + + const result = spawn('echo', ['testing']); + expect((globalThis as any).Bun.spawn).toHaveBeenCalledWith({ + cmd: ['echo', 'testing'] + }); + expect(result).toEqual('bun-result'); + }); + + it.skip('routes to Bun.spawn with proper mapping when isBunRuntime()', (done) => { + // mockIsBunRuntime(utilsModulePath, true); + + // let received: any; + // const fakeSubprocess = { + // stdout: { + // async text() { + // return 'ok-bun'; + // } + // } + // } as unknown as Bun.Subprocess; + // + // mockBunSpawn((opts: any) => { + // received = opts; + // return fakeSubprocess; + // }); + + // const proc = spawn('bun', ['--version']); + + const proc = spawn('echo', ['testing'], { + stdin: 'pipe', + stdout: 'pipe', + stderr: 'pipe', + stdio: 'pipe' + }); + + // const out = await proc.stdout.text(); + + proc.stdout.on('data', function (data: string) { + expect(data.toString()).toEqual('testing'); + done(); + }); + // expect(out).toBe('ok-bun'); + + // expect(received).toBeTruthy(); + // expect(received.cmd).toEqual(['echo', 'hello']); + // expect(received.cwd).toBe('/tmp/test'); + // expect(received.env.TEST_VAR).toBe('1'); + // expect(received.stdio).toEqual(['pipe', 'pipe', 'pipe']); + }); + + it.skip('routes to node:child_process.spawn when not Bun runtime', () => { + mockIsBunRuntime(utilsModulePath, false); + + const calls: any[] = []; + mockNodeSpawn(((command: string, args: string[], options: any) => { + calls.push({ command, args, options }); + // Return a minimal ChildProcess-like object + return { pid: 1234 } as unknown as ChildProcess; + }) as any); + + const proc = spawn('node', ['-v'], { + cwd: '/work', + env: { ABC: 'xyz' }, + stdio: 'inherit' + }); + + expect(proc).toBeTruthy(); + expect(calls).toHaveLength(1); + expect(calls[0].command).toBe('node'); + expect(calls[0].args).toEqual(['-v']); + expect(calls[0].options.cwd).toBe('/work'); + expect(calls[0].options.env.ABC).toBe('xyz'); + expect(calls[0].options.stdio).toBe('inherit'); + }); + + it.skip('applies default stdio mapping: stdin/stdout/stderr inherit for Bun; stdio inherit for Node', () => { + // Bun branch + mockIsBunRuntime(utilsModulePath, true); + let bunOpts: any; + mockBunSpawn((opts: any) => { + bunOpts = opts; + return {} as any; + }); + spawn('cmd'); + expect(bunOpts.stdio).toEqual(['inherit', 'inherit', 'inherit']); + + // Node branch + restoreBunSpawn(); + mockIsBunRuntime(utilsModulePath, false); + const calls: any[] = []; + mockNodeSpawn(((c: string, a: string[], o: any) => { + calls.push(o); + return {} as any; + }) as any); + spawn('cmd'); + expect(calls[0].stdio).toEqual('inherit'); + }); +}); diff --git a/packages/bun/src/utils/buni/spawn/spawn.ts b/packages/bun/src/utils/buni/spawn/spawn.ts new file mode 100644 index 0000000..2bdd50e --- /dev/null +++ b/packages/bun/src/utils/buni/spawn/spawn.ts @@ -0,0 +1,66 @@ +import { + ChildProcess, + type IOType, + spawn as nodeSpawn, + StdioOptions +} from 'node:child_process'; +import { isBunRuntime } from '../utils'; + +export interface SpawnOptions { + cwd?: string; + stdio?: StdioOptions; + stdin?: IOType; + stdout?: IOType; + stderr?: IOType; + env?: Record; +} + +export type SpawnResult = ChildProcess | Bun.Subprocess; + +export function spawn( + command: string, + args: string[] = [], + options: SpawnOptions = {} +): SpawnResult { + const { cwd, env, stdin, stdout, stderr, stdio } = options; + + if (isBunRuntime()) { + const opts: Bun.SpawnOptions.OptionsObject = {}; + + if (cwd) { + opts.cwd = cwd; + } + + if (env) { + opts.env = env; + } + + if (stdin) { + opts.stdin = stdin; + } + + if (stdin) { + opts.stdin = stdin; + } + + if (stdout) { + opts.stdout = stdout; + } + + if (stderr) { + opts.stderr = stderr; + } + return Bun.spawn({ + cmd: [command, ...args], + ...opts + }); + } + + console.log(`Command: ${command}`); + console.log(`Args: ${args.join(' ')}`); + return nodeSpawn(command, args, { + cwd, + env, + stdio + }); +} diff --git a/packages/bun/src/utils/buni/utils.ts b/packages/bun/src/utils/buni/utils.ts new file mode 100644 index 0000000..144ee2e --- /dev/null +++ b/packages/bun/src/utils/buni/utils.ts @@ -0,0 +1,18 @@ +export function isBunRuntime(): boolean { + return typeof Bun !== 'undefined'; +} + +export function getBunCmd(): string { + return process.env.BUN_BIN || 'bun'; +} + +export function isBunSubprocess( + spawnResult: unknown +): spawnResult is Bun.Subprocess { + return ( + !!spawnResult && + isBunRuntime() && + typeof spawnResult === 'object' && + 'exited' in spawnResult + ); +} diff --git a/packages/bun/src/utils/cli.ts b/packages/bun/src/utils/cli.ts new file mode 100644 index 0000000..335414b --- /dev/null +++ b/packages/bun/src/utils/cli.ts @@ -0,0 +1,102 @@ +import { workspaceRoot } from '@nx/devkit'; +import { workerData } from 'node:worker_threads'; +import type { ChildProcess, IOType, SpawnOptions } from 'node:child_process'; +import { spawn } from 'node:child_process'; + +export const isBun = typeof Bun !== 'undefined'; + +export type UniversalChildProcess = + | ChildProcess + | Bun.Subprocess; + +export async function universalSpawnSync(cmd: string): Promise { + if (isBun) { + const result = Bun.spawnSync({ cmd: cmd.split(' ') }); + const output = result.stdout?.toString().trim() || ''; + return output; + } + + const { execSync } = await import('node:child_process'); + const output = execSync(cmd).toString().trim(); + return output; +} + +export interface RunSpawnOptions { + cwd?: string; + stdin?: IOType; + stdout?: IOType; + stderr?: IOType; + env?: Record; + windowsHide?: boolean; +} + +export function runSpawn( + cmd: string, + args: string[] = [], + options: RunSpawnOptions = {} +) { + if (isBun) { + return Bun.spawn({ + cmd: [cmd, ...args], + stdout: 'pipe', + stderr: 'pipe', + ...options + }); + } else { + const { stdin, stdout, stderr, ...restOptions } = options; + const spawnOptions: SpawnOptions = { + ...restOptions + }; + if (stdin || stdout || stderr) { + spawnOptions.stdio = [stdin, stdout, stderr]; + } + + return spawn(cmd, args, spawnOptions); + } +} + +export interface SpawnWithBunOptions { + cwd?: string; + stdio?: IOType; + stdin?: IOType; + stdout?: IOType; + stderr?: IOType; + env?: Record; +} + +export function spawnWithBunOld( + args: string[], + options: SpawnWithBunOptions = {} +): UniversalChildProcess { + const bunBin = process.env.BUN_BIN || 'bun'; + const cwd = options.cwd || workspaceRoot; + const env = { + ...process.env, + ...(workerData || {}), + ...(options.env || {}) + }; + const { + stdin = 'ignore', + stdout = 'pipe', + stderr = 'pipe', + stdio = 'pipe' + } = options; + + if (isBun) { + return Bun.spawn({ + cmd: [bunBin, ...args], + cwd, + env, + stdin, + stdout, + stderr + }); + } + + return spawn(bunBin, args, { + cwd, + env, + windowsHide: true, + stdio + }); +} diff --git a/packages/bun/src/utils/dependencies.ts b/packages/bun/src/utils/dependencies.ts new file mode 100644 index 0000000..53f0411 --- /dev/null +++ b/packages/bun/src/utils/dependencies.ts @@ -0,0 +1,17 @@ +export interface DependencyDefinition { + name: string; + version: string; +} + +const packageJson = require('../../package.json'); + +export const libs = { + plugin: { name: packageJson.name, version: packageJson.version }, + bunTypes: { name: '@types/bun', version: '^1.2.20' }, + nxElysia: { name: '@stonx/elysia', version: '^0.1.1' } +} as const satisfies Record; + +export const workspaceDependencies = { + [libs.plugin.name]: libs.plugin.version, + [libs.bunTypes.name]: libs.bunTypes.version +} as const; diff --git a/packages/bun/src/utils/index.ts b/packages/bun/src/utils/index.ts new file mode 100644 index 0000000..caf1f9d --- /dev/null +++ b/packages/bun/src/utils/index.ts @@ -0,0 +1,6 @@ +export * from './bun'; +export * from './cli'; +export * from './dependencies'; +export * from './is-bun-build-executor'; +export * from './logic'; +export * from './process-adapter'; diff --git a/packages/bun/src/utils/is-bun-build-executor.ts b/packages/bun/src/utils/is-bun-build-executor.ts new file mode 100644 index 0000000..1e32496 --- /dev/null +++ b/packages/bun/src/utils/is-bun-build-executor.ts @@ -0,0 +1,5 @@ +import { libs } from './dependencies'; + +export function isBunBuildExecutor(executor: string | undefined) { + return executor === `${libs.plugin.name}:build`; +} diff --git a/packages/bun/src/utils/logic.ts b/packages/bun/src/utils/logic.ts new file mode 100644 index 0000000..51ab2d8 --- /dev/null +++ b/packages/bun/src/utils/logic.ts @@ -0,0 +1,12 @@ +export const isNil = (value: any): value is undefined | null => value == null; +export const isString = (v: unknown): v is string => typeof v === 'string'; +export const isBool = (v: unknown): v is boolean => typeof v === 'boolean'; +export const isArray = Array.isArray; +export const isFunction = ( + v: unknown +): v is (...args: unknown[]) => unknown => { + return typeof v === 'function'; +}; +export function isPlainObject(value: unknown): value is Record { + return typeof value === 'object' && !isArray(value) && !isNil(value); +} diff --git a/packages/bun/src/utils/process-adapter.ts b/packages/bun/src/utils/process-adapter.ts new file mode 100644 index 0000000..3e69bcf --- /dev/null +++ b/packages/bun/src/utils/process-adapter.ts @@ -0,0 +1,112 @@ +import { + spawn as nodeSpawn, + ChildProcess, + type IOType, + StdioOptions +} from 'node:child_process'; +import { workspaceRoot } from '@nx/devkit'; + +export function isBunRuntime(): boolean { + return typeof Bun !== 'undefined'; +} + +export function getBunCmd(): string { + return process.env.BUN_BIN || 'bun'; +} + +export interface SpawnOptions { + cwd?: string; + stdio?: StdioOptions; + stdin?: IOType; + stdout?: IOType; + stderr?: IOType; + env?: Record; +} + +export type SpawnResult = ChildProcess | Bun.Subprocess; + +export function isBunSubprocess( + spawnResult: SpawnResult +): spawnResult is Bun.Subprocess { + return isBunRuntime() && 'exited' in spawnResult; +} + +export function spawnProcess( + command: string, + args: string[] = [], + options: SpawnOptions = {} +): SpawnResult { + const cwd = options.cwd || workspaceRoot; + + const env: Record = { + ...process.env, + ...(options.env || {}) + }; + + const { + stdin = 'inherit', + stdout = 'inherit', + stderr = 'inherit', + stdio = 'inherit' + } = options; + + if (isBunRuntime()) { + return Bun.spawn({ + cmd: [command, ...args], + cwd, + env, + stdio: [stdin, stdout, stderr] + }); + } + + return nodeSpawn(command, args, { + cwd, + env, + stdio + }); +} + +export function spawnWithBun(args?: string[], options?: SpawnOptions) { + return spawnProcess(getBunCmd(), args, options); +} + +export async function waitForExit(proc: SpawnResult): Promise { + if (isBunRuntime()) { + const sub = proc as Bun.Subprocess; + return sub.exited.then(() => sub.exitCode ?? 1); + } + const child = proc as ChildProcess; + return new Promise((resolve) => { + child.on('close', (code) => resolve(code ?? 1)); + child.on('error', () => resolve(1)); + }); +} + +export async function killProcess(proc: SpawnResult | null) { + if (!proc) return; + + if (isBunRuntime()) { + try { + (proc as Bun.Subprocess).kill(); + } catch (err) { + console.log(err); + } + + return; + } + + const child = proc as ChildProcess; + if (child.killed) return; + return new Promise((resolve) => { + child.once('exit', () => resolve()); + child.kill('SIGTERM'); + setTimeout(() => { + try { + if (!child.killed) child.kill('SIGKILL'); + } catch (err) { + console.log(err); + } + resolve(); + }, 3000); + }); +} diff --git a/packages/bun/tsconfig.json b/packages/bun/tsconfig.json new file mode 100644 index 0000000..62ebbd9 --- /dev/null +++ b/packages/bun/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/packages/bun/tsconfig.lib.json b/packages/bun/tsconfig.lib.json new file mode 100644 index 0000000..3380843 --- /dev/null +++ b/packages/bun/tsconfig.lib.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "baseUrl": ".", + "rootDir": "src", + "outDir": "dist", + "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo", + "emitDeclarationOnly": false + }, + "include": ["src/**/*.ts"], + "references": [], + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/packages/bun/tsconfig.spec.json b/packages/bun/tsconfig.spec.json new file mode 100644 index 0000000..917987c --- /dev/null +++ b/packages/bun/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./out-tsc/jest", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/packages/elysia/src/generators/application/application.ts b/packages/elysia/src/generators/application/application.ts index bbec46e..89bf84b 100644 --- a/packages/elysia/src/generators/application/application.ts +++ b/packages/elysia/src/generators/application/application.ts @@ -30,17 +30,20 @@ export async function applicationGeneratorInternal( const options = await normalizeOptions(tree, rawOptions); const tasks: GeneratorCallback[] = []; - const initTask = await initGenerator(tree, { - skipPackageJson: options.skipPackageJson, - skipFormat: true - }); - tasks.push(initTask); - const nodeApplicationTask = await nodeApplicationGenerator( - tree, - toNodeApplicationGeneratorOptions(options) + tasks.push( + await initGenerator(tree, { + skipPackageJson: options.skipPackageJson, + skipFormat: true + }) + ); + + tasks.push( + await nodeApplicationGenerator( + tree, + toNodeApplicationGeneratorOptions(options) + ) ); - tasks.push(nodeApplicationTask); createFiles(tree, options); updateTsConfig(tree, options); diff --git a/packages/elysia/src/generators/application/lib/update-tsconfig.ts b/packages/elysia/src/generators/application/lib/update-tsconfig.ts index 8b4465e..aa59e1b 100644 --- a/packages/elysia/src/generators/application/lib/update-tsconfig.ts +++ b/packages/elysia/src/generators/application/lib/update-tsconfig.ts @@ -8,7 +8,7 @@ export function updateTsConfig(tree: Tree, options: NormalizedOptions): void { tree, joinPathFragments(options.appProjectRoot, 'tsconfig.app.json'), (json) => { - json.compilerOptions.experimentalDecorators = true; + json.compilerOptions.experimentalDecorators = true; // TODO: is this needed in TypeScript v5.0 ? json.compilerOptions.emitDecoratorMetadata = true; json.compilerOptions.target = 'es2021'; if (options.strict) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cf507dc..2dc5ade 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,34 +10,34 @@ importers: devDependencies: '@eslint/js': specifier: ^9.8.0 - version: 9.32.0 + version: 9.35.0 '@nx/devkit': - specifier: 21.3.11 - version: 21.3.11(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))) + specifier: 21.4.1 + version: 21.4.1(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))) '@nx/eslint': - specifier: 21.3.11 - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.32.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) + specifier: 21.4.1 + version: 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.35.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) '@nx/eslint-plugin': - specifier: 21.3.11 - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.8.3))(eslint-config-prettier@10.1.8(eslint@9.32.0))(eslint@9.32.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(typescript@5.8.3)(verdaccio@6.1.6(typanion@3.14.0)) + specifier: 21.4.1 + version: 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@typescript-eslint/parser@8.42.0(eslint@9.35.0)(typescript@5.9.2))(eslint-config-prettier@10.1.8(eslint@9.35.0))(eslint@9.35.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(typescript@5.9.2)(verdaccio@6.1.6(typanion@3.14.0)) '@nx/jest': - specifier: 21.3.11 - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3))(typescript@5.8.3)(verdaccio@6.1.6(typanion@3.14.0)) + specifier: 21.4.1 + version: 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2))(typescript@5.9.2)(verdaccio@6.1.6(typanion@3.14.0)) '@nx/js': - specifier: 21.3.11 - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) + specifier: 21.4.1 + version: 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) '@nx/node': - specifier: 21.3.11 - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.32.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3))(typescript@5.8.3)(verdaccio@6.1.6(typanion@3.14.0)) + specifier: 21.4.1 + version: 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.35.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2))(typescript@5.9.2)(verdaccio@6.1.6(typanion@3.14.0)) '@nx/plugin': - specifier: 21.3.11 - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.32.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3))(typescript@5.8.3)(verdaccio@6.1.6(typanion@3.14.0)) + specifier: 21.4.1 + version: 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.35.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2))(typescript@5.9.2)(verdaccio@6.1.6(typanion@3.14.0)) '@nx/workspace': - specifier: 21.3.11 - version: 21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)) + specifier: 21.4.1 + version: 21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)) '@swc-node/register': specifier: ~1.9.1 - version: 1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3) + version: 1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2) '@swc/cli': specifier: ~0.6.0 version: 0.6.0(@swc/core@1.5.29(@swc/helpers@0.5.17)) @@ -50,6 +50,9 @@ importers: '@swc/jest': specifier: ~0.2.38 version: 0.2.39(@swc/core@1.5.29(@swc/helpers@0.5.17)) + '@types/bun': + specifier: 1.2.20 + version: 1.2.20(@types/react@19.1.12) '@types/jest': specifier: ^30.0.0 version: 30.0.0 @@ -59,18 +62,24 @@ importers: chalk: specifier: 5.5.0 version: 5.5.0 + cmrd: + specifier: 0.0.1 + version: 0.0.1(typescript@5.9.2) cz-git: specifier: 1.12.0 version: 1.12.0 czg: specifier: 1.12.0 version: 1.12.0 + esbuild: + specifier: ^0.19.2 + version: 0.19.12 eslint: specifier: ^9.8.0 - version: 9.32.0 + version: 9.35.0 eslint-config-prettier: specifier: ^10.0.0 - version: 10.1.8(eslint@9.32.0) + version: 10.1.8(eslint@9.35.0) fast-glob: specifier: 3.3.3 version: 3.3.3 @@ -82,13 +91,13 @@ importers: version: 4.1.0 jest: specifier: ^30.0.2 - version: 30.0.5(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3)) + version: 30.1.3(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2)) jest-environment-jsdom: specifier: ^30.0.2 - version: 30.0.5 + version: 30.1.2 jest-environment-node: specifier: ^30.0.2 - version: 30.0.5 + version: 30.1.2 jest-util: specifier: ^30.0.2 version: 30.0.5 @@ -96,8 +105,8 @@ importers: specifier: ^2.1.0 version: 2.4.0 nx: - specifier: 21.3.11 - version: 21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)) + specifier: 21.4.1 + version: 21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)) prettier: specifier: 3.6.2 version: 3.6.2 @@ -109,19 +118,19 @@ importers: version: 7.7.2 ts-jest: specifier: ^29.4.0 - version: 29.4.1(@babel/core@7.28.0)(@jest/transform@30.0.5)(@jest/types@30.0.5)(babel-jest@30.0.5(@babel/core@7.28.0))(jest-util@30.0.5)(jest@30.0.5(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.4.1(@babel/core@7.28.4)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.4))(esbuild@0.19.12)(jest-util@30.0.5)(jest@30.1.3(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2)))(typescript@5.9.2) ts-node: specifier: 10.9.1 - version: 10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3) + version: 10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2) tslib: specifier: ^2.3.0 version: 2.8.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.2 typescript-eslint: specifier: ^8.29.0 - version: 8.39.0(eslint@9.32.0)(typescript@5.8.3) + version: 8.42.0(eslint@9.35.0)(typescript@5.9.2) verdaccio: specifier: ^6.0.5 version: 6.1.6(typanion@3.14.0) @@ -129,30 +138,49 @@ importers: specifier: 18.0.0 version: 18.0.0 + e2e/bun: {} + + packages/bun: + dependencies: + '@nx/devkit': + specifier: '>=20.0.0 <22.0.0' + version: 21.4.1(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))) + '@nx/eslint': + specifier: 21.4.1 + version: 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.35.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) + '@nx/js': + specifier: '>=20.0.0 <22.0.0' + version: 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) + fast-glob: + specifier: 3.3.3 + version: 3.3.3 + nx: + specifier: 21.4.1 + version: 21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)) + tslib: + specifier: ^2.3.0 + version: 2.8.1 + packages/elysia: dependencies: '@nx/devkit': specifier: '>=18.0.0 <22.0.0' - version: 21.3.11(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))) + version: 21.4.1(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))) '@nx/eslint': specifier: '>=18.0.0 <22.0.0' - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.32.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) + version: 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.35.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) '@nx/js': specifier: '>=18.0.0 <22.0.0' - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) + version: 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) '@nx/node': specifier: '>=18.0.0 <22.0.0' - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.32.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3))(typescript@5.8.3)(verdaccio@6.1.6(typanion@3.14.0)) + version: 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.35.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2))(typescript@5.9.2)(verdaccio@6.1.6(typanion@3.14.0)) tslib: specifier: '>=2.3.0' version: 2.8.1 packages: - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} @@ -160,16 +188,16 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.0': - resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + '@babel/compat-data@7.28.4': + resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.0': - resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.0': - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': @@ -180,8 +208,8 @@ packages: resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.1': - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + '@babel/helper-create-class-features-plugin@7.28.3': + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -209,8 +237,8 @@ packages: resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -251,16 +279,16 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.27.1': - resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} + '@babel/helper-wrap-function@7.28.3': + resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.2': - resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} engines: {node: '>=6.0.0'} hasBin: true @@ -288,8 +316,8 @@ packages: peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': - resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': + resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -439,8 +467,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.28.0': - resolution: {integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==} + '@babel/plugin-transform-block-scoping@7.28.4': + resolution: {integrity: sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -451,14 +479,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.27.1': - resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} + '@babel/plugin-transform-class-static-block@7.28.3': + resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.28.0': - resolution: {integrity: sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==} + '@babel/plugin-transform-classes@7.28.4': + resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -601,8 +629,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.28.0': - resolution: {integrity: sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==} + '@babel/plugin-transform-object-rest-spread@7.28.4': + resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -649,8 +677,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.28.1': - resolution: {integrity: sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==} + '@babel/plugin-transform-regenerator@7.28.4': + resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -667,8 +695,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-runtime@7.28.0': - resolution: {integrity: sha512-dGopk9nZrtCs2+nfIem25UuHyt5moSJamArzIoh9/vezUQPmYDOzjaHDCkAzuGJibCIkPup8rMT2+wYB6S73cA==} + '@babel/plugin-transform-runtime@7.28.3': + resolution: {integrity: sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -733,8 +761,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.28.0': - resolution: {integrity: sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==} + '@babel/preset-env@7.28.3': + resolution: {integrity: sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -750,31 +778,34 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.2': - resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.0': - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.2': - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@borewit/text-codec@0.1.1': + resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==} + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@csstools/color-helpers@5.0.2': - resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} engines: {node: '>=18'} '@csstools/css-calc@2.1.4': @@ -784,8 +815,8 @@ packages: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-color-parser@3.0.10': - resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==} + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} engines: {node: '>=18'} peerDependencies: '@csstools/css-parser-algorithms': ^3.0.5 @@ -805,17 +836,155 @@ packages: resolution: {integrity: sha512-I3l7FdGRXluAS44/0NguwWlO83J18p0vlr2FYHrJkWdNYhgVoiYo61IXPqaOsL+vNxU1ZqMACzItGK3/KKDsdw==} engines: {node: '>= 6'} - '@emnapi/core@1.4.5': - resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} + + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] - '@emnapi/wasi-threads@1.0.4': - resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.8.0': + resolution: {integrity: sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -828,46 +997,42 @@ packages: resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.0': - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + '@eslint/config-helpers@0.3.1': + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.32.0': - resolution: {integrity: sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==} + '@eslint/js@9.35.0': + resolution: {integrity: sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.4': - resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -884,12 +1049,12 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/console@30.0.5': - resolution: {integrity: sha512-xY6b0XiL0Nav3ReresUarwl2oIz1gTnxGbGpho9/rbUWsLH0f1OD/VT84xs8c7VmH7MChnLb0pag6PhZhAdDiA==} + '@jest/console@30.1.2': + resolution: {integrity: sha512-BGMAxj8VRmoD0MoA/jo9alMXSRoqW8KPeqOfEo1ncxnRLatTBCpRoOwlwlEMdudp68Q6WSGwYrrLtTGOh8fLzw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/core@30.0.5': - resolution: {integrity: sha512-fKD0OulvRsXF1hmaFgHhVJzczWzA1RXMMo9LTPuFXo9q/alDbME3JIyWYqovWsUBWSoBcsHaGPSLF9rz4l9Qeg==} + '@jest/core@30.1.3': + resolution: {integrity: sha512-LIQz7NEDDO1+eyOA2ZmkiAyYvZuo6s1UxD/e2IHldR6D7UYogVq3arTmli07MkENLq6/3JEQjp0mA8rrHHJ8KQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -905,8 +1070,8 @@ packages: resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/environment-jsdom-abstract@30.0.5': - resolution: {integrity: sha512-gpWwiVxZunkoglP8DCnT3As9x5O8H6gveAOpvaJd2ATAoSh7ZSSCWbr9LQtUMvr8WD3VjG9YnDhsmkCK5WN1rQ==} + '@jest/environment-jsdom-abstract@30.1.2': + resolution: {integrity: sha512-u8kTh/ZBl97GOmnGJLYK/1GuwAruMC4hoP6xuk/kwltmVWsA9u/6fH1/CsPVGt2O+Wn2yEjs8n1B1zZJ62Cx0w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 @@ -915,36 +1080,36 @@ packages: canvas: optional: true - '@jest/environment@30.0.5': - resolution: {integrity: sha512-aRX7WoaWx1oaOkDQvCWImVQ8XNtdv5sEWgk4gxR6NXb7WBUnL5sRak4WRzIQRZ1VTWPvV4VI4mgGjNL9TeKMYA==} + '@jest/environment@30.1.2': + resolution: {integrity: sha512-N8t1Ytw4/mr9uN28OnVf0SYE2dGhaIxOVYcwsf9IInBKjvofAjbFRvedvBBlyTYk2knbJTiEjEJ2PyyDIBnd9w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect-utils@30.0.5': - resolution: {integrity: sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==} + '@jest/expect-utils@30.1.2': + resolution: {integrity: sha512-HXy1qT/bfdjCv7iC336ExbqqYtZvljrV8odNdso7dWK9bSeHtLlvwWWC3YSybSPL03Gg5rug6WLCZAZFH72m0A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect@30.0.5': - resolution: {integrity: sha512-6udac8KKrtTtC+AXZ2iUN/R7dp7Ydry+Fo6FPFnDG54wjVMnb6vW/XNlf7Xj8UDjAE3aAVAsR4KFyKk3TCXmTA==} + '@jest/expect@30.1.2': + resolution: {integrity: sha512-tyaIExOwQRCxPCGNC05lIjWJztDwk2gPDNSDGg1zitXJJ8dC3++G/CRjE5mb2wQsf89+lsgAgqxxNpDLiCViTA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/fake-timers@30.0.5': - resolution: {integrity: sha512-ZO5DHfNV+kgEAeP3gK3XlpJLL4U3Sz6ebl/n68Uwt64qFFs5bv4bfEEjyRGK5uM0C90ewooNgFuKMdkbEoMEXw==} + '@jest/fake-timers@30.1.2': + resolution: {integrity: sha512-Beljfv9AYkr9K+ETX9tvV61rJTY706BhBUtiaepQHeEGfe0DbpvUA5Z3fomwc5Xkhns6NWrcFDZn+72fLieUnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/get-type@30.0.1': - resolution: {integrity: sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==} + '@jest/get-type@30.1.0': + resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/globals@30.0.5': - resolution: {integrity: sha512-7oEJT19WW4oe6HR7oLRvHxwlJk2gev0U9px3ufs8sX9PoD1Eza68KF0/tlN7X0dq/WVsBScXQGgCldA1V9Y/jA==} + '@jest/globals@30.1.2': + resolution: {integrity: sha512-teNTPZ8yZe3ahbYnvnVRDeOjr+3pu2uiAtNtrEsiMjVPPj+cXd5E/fr8BL7v/T7F31vYdEHrI5cC/2OoO/vM9A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/pattern@30.0.1': resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/reporters@30.0.5': - resolution: {integrity: sha512-mafft7VBX4jzED1FwGC1o/9QUM2xebzavImZMeqnsklgcyxBto8mV4HzNSzUrryJ+8R9MFOM3HgYuDradWR+4g==} + '@jest/reporters@30.1.3': + resolution: {integrity: sha512-VWEQmJWfXMOrzdFEOyGjUEOuVXllgZsoPtEHZzfdNz18RmzJ5nlR6kp8hDdY8dDS1yGOXAY7DHT+AOHIPSBV0w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -956,144 +1121,153 @@ packages: resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/snapshot-utils@30.0.5': - resolution: {integrity: sha512-XcCQ5qWHLvi29UUrowgDFvV4t7ETxX91CbDczMnoqXPOIcZOxyNdSjm6kV5XMc8+HkxfRegU/MUmnTbJRzGrUQ==} + '@jest/snapshot-utils@30.1.2': + resolution: {integrity: sha512-vHoMTpimcPSR7OxS2S0V1Cpg8eKDRxucHjoWl5u4RQcnxqQrV3avETiFpl8etn4dqxEGarBeHbIBety/f8mLXw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/source-map@30.0.1': resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-result@30.0.5': - resolution: {integrity: sha512-wPyztnK0gbDMQAJZ43tdMro+qblDHH1Ru/ylzUo21TBKqt88ZqnKKK2m30LKmLLoKtR2lxdpCC/P3g1vfKcawQ==} + '@jest/test-result@30.1.3': + resolution: {integrity: sha512-P9IV8T24D43cNRANPPokn7tZh0FAFnYS2HIfi5vK18CjRkTDR9Y3e1BoEcAJnl4ghZZF4Ecda4M/k41QkvurEQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-sequencer@30.0.5': - resolution: {integrity: sha512-Aea/G1egWoIIozmDD7PBXUOxkekXl7ueGzrsGGi1SbeKgQqCYCIf+wfbflEbf2LiPxL8j2JZGLyrzZagjvW4YQ==} + '@jest/test-sequencer@30.1.3': + resolution: {integrity: sha512-82J+hzC0qeQIiiZDThh+YUadvshdBswi5nuyXlEmXzrhw5ZQSRHeQ5LpVMD/xc8B3wPePvs6VMzHnntxL+4E3w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/transform@30.0.5': - resolution: {integrity: sha512-Vk8amLQCmuZyy6GbBht1Jfo9RSdBtg7Lks+B0PecnjI8J+PCLQPGh7uI8Q/2wwpW2gLdiAfiHNsmekKlywULqg==} + '@jest/transform@30.1.2': + resolution: {integrity: sha512-UYYFGifSgfjujf1Cbd3iU/IQoSd6uwsj8XHj5DSDf5ERDcWMdJOPTkHWXj4U+Z/uMagyOQZ6Vne8C4nRIrCxqA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/types@30.0.5': resolution: {integrity: sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.4': - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@napi-rs/nice-android-arm-eabi@1.0.4': - resolution: {integrity: sha512-OZFMYUkih4g6HCKTjqJHhMUlgvPiDuSLZPbPBWHLjKmFTv74COzRlq/gwHtmEVaR39mJQ6ZyttDl2HNMUbLVoA==} + '@napi-rs/nice-android-arm-eabi@1.1.1': + resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} engines: {node: '>= 10'} cpu: [arm] os: [android] - '@napi-rs/nice-android-arm64@1.0.4': - resolution: {integrity: sha512-k8u7cjeA64vQWXZcRrPbmwjH8K09CBnNaPnI9L1D5N6iMPL3XYQzLcN6WwQonfcqCDv5OCY3IqX89goPTV4KMw==} + '@napi-rs/nice-android-arm64@1.1.1': + resolution: {integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@napi-rs/nice-darwin-arm64@1.0.4': - resolution: {integrity: sha512-GsLdQvUcuVzoyzmtjsThnpaVEizAqH5yPHgnsBmq3JdVoVZHELFo7PuJEdfOH1DOHi2mPwB9sCJEstAYf3XCJA==} + '@napi-rs/nice-darwin-arm64@1.1.1': + resolution: {integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@napi-rs/nice-darwin-x64@1.0.4': - resolution: {integrity: sha512-1y3gyT3e5zUY5SxRl3QDtJiWVsbkmhtUHIYwdWWIQ3Ia+byd/IHIEpqAxOGW1nhhnIKfTCuxBadHQb+yZASVoA==} + '@napi-rs/nice-darwin-x64@1.1.1': + resolution: {integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@napi-rs/nice-freebsd-x64@1.0.4': - resolution: {integrity: sha512-06oXzESPRdXUuzS8n2hGwhM2HACnDfl3bfUaSqLGImM8TA33pzDXgGL0e3If8CcFWT98aHows5Lk7xnqYNGFeA==} + '@napi-rs/nice-freebsd-x64@1.1.1': + resolution: {integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@napi-rs/nice-linux-arm-gnueabihf@1.0.4': - resolution: {integrity: sha512-CgklZ6g8WL4+EgVVkxkEvvsi2DSLf9QIloxWO0fvQyQBp6VguUSX3eHLeRpqwW8cRm2Hv/Q1+PduNk7VK37VZw==} + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + resolution: {integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@napi-rs/nice-linux-arm64-gnu@1.0.4': - resolution: {integrity: sha512-wdAJ7lgjhAlsANUCv0zi6msRwq+D4KDgU+GCCHssSxWmAERZa2KZXO0H2xdmoJ/0i03i6YfK/sWaZgUAyuW2oQ==} + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + resolution: {integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@napi-rs/nice-linux-arm64-musl@1.0.4': - resolution: {integrity: sha512-4b1KYG+sriufhFrpUS9uNOEYYJqSfcbnwGx6uGX7JjrH8tELG90cOpCawz5THNIwlS3DhLgnCOcn0+4p6z26QA==} + '@napi-rs/nice-linux-arm64-musl@1.1.1': + resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@napi-rs/nice-linux-ppc64-gnu@1.0.4': - resolution: {integrity: sha512-iaf3vMRgr23oe1PUaKpxaH3DS0IMN0+N9iEiWVwYPm/U15vZFYdqVegGfN2PzrZLUl5lc8ZxbmEKDfuqslhAMA==} + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} engines: {node: '>= 10'} cpu: [ppc64] os: [linux] - '@napi-rs/nice-linux-riscv64-gnu@1.0.4': - resolution: {integrity: sha512-UXoREY6Yw6rHrGuTwQgBxpfjK34t6mTjibE9/cXbefL9AuUCJ9gEgwNKZiONuR5QGswChqo9cnthjdKkYyAdDg==} + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] - '@napi-rs/nice-linux-s390x-gnu@1.0.4': - resolution: {integrity: sha512-eFbgYCRPmsqbYPAlLYU5hYTNbogmIDUvknilehHsFhCH1+0/kN87lP+XaLT0Yeq4V/rpwChSd9vlz4muzFArtw==} + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} engines: {node: '>= 10'} cpu: [s390x] os: [linux] - '@napi-rs/nice-linux-x64-gnu@1.0.4': - resolution: {integrity: sha512-4T3E6uTCwWT6IPnwuPcWVz3oHxvEp/qbrCxZhsgzwTUBEwu78EGNXGdHfKJQt3soth89MLqZJw+Zzvnhrsg1mQ==} + '@napi-rs/nice-linux-x64-gnu@1.1.1': + resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@napi-rs/nice-linux-x64-musl@1.0.4': - resolution: {integrity: sha512-NtbBkAeyBPLvCBkWtwkKXkNSn677eaT0cX3tygq+2qVv71TmHgX4gkX6o9BXjlPzdgPGwrUudavCYPT9tzkEqQ==} + '@napi-rs/nice-linux-x64-musl@1.1.1': + resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@napi-rs/nice-win32-arm64-msvc@1.0.4': - resolution: {integrity: sha512-vubOe3i+YtSJGEk/++73y+TIxbuVHi+W8ZzrRm2eETCjCRwNlgbfToQZ85dSA+4iBB/NJRGNp+O4hfdbbttZWA==} + '@napi-rs/nice-openharmony-arm64@1.1.1': + resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [openharmony] + + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + resolution: {integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@napi-rs/nice-win32-ia32-msvc@1.0.4': - resolution: {integrity: sha512-BMOVrUDZeg1RNRKVlh4eyLv5djAAVLiSddfpuuQ47EFjBcklg0NUeKMFKNrKQR4UnSn4HAiACLD7YK7koskwmg==} + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + resolution: {integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@napi-rs/nice-win32-x64-msvc@1.0.4': - resolution: {integrity: sha512-kCNk6HcRZquhw/whwh4rHsdPyOSCQCgnVDVik+Y9cuSVTDy3frpiCJTScJqPPS872h4JgZKkr/+CwcwttNEo9Q==} + '@napi-rs/nice-win32-x64-msvc@1.1.1': + resolution: {integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@napi-rs/nice@1.0.4': - resolution: {integrity: sha512-Sqih1YARrmMoHlXGgI9JrrgkzxcaaEso0AH+Y7j8NHonUs+xe4iDsgC3IBIDNdzEewbNpccNN6hip+b5vmyRLw==} + '@napi-rs/nice@1.1.1': + resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} engines: {node: '>= 10'} '@napi-rs/wasm-runtime@0.2.12': @@ -1114,13 +1288,16 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nx/devkit@21.3.11': - resolution: {integrity: sha512-JOV8TAa9K5+ZwTA/EUi0g5qcKEg5vmi0AyOUsrNUHlv3BgQnwZtPLDDTPPZ+ezq24o6YzgwueZWj3CLEdMHEDg==} + '@nx/devkit@21.4.1': + resolution: {integrity: sha512-rWgMNG2e0tSG5L3vffuMH/aRkn+i9vYHelWkgVAslGBOaqriEg1dCSL/W9I3Fd5lnucHy3DrG1f19uDjv7Dm0A==} peerDependencies: - nx: 21.3.11 + nx: '>= 20 <= 22' - '@nx/eslint-plugin@21.3.11': - resolution: {integrity: sha512-BabOp+5qZx/GgCWVALiVm4wjrUOO5sqeItsAWtpocMsvYE8YRZ4+AekS/F2knTjJdcdrh51hxqv5ua3YTNFtfA==} + '@nx/docker@21.4.1': + resolution: {integrity: sha512-1wPjsxadE1Wy5QaXRX8rSWrp9fbm8STV2MYzLSkXbwlrusvYQETP/MKGsqT5fZZTrN9NrQ+HTLa/7vW5vU8fkA==} + + '@nx/eslint-plugin@21.4.1': + resolution: {integrity: sha512-pXyu/YsJroKNL2855aKeDLG4foD+HuKUojuwv9kvuqyCdOcQaYoNQUhGuE/KhNHmW40R7rOLofoelhIhICZ45w==} peerDependencies: '@typescript-eslint/parser': ^6.13.2 || ^7.0.0 || ^8.0.0 eslint-config-prettier: ^10.0.0 @@ -1128,8 +1305,8 @@ packages: eslint-config-prettier: optional: true - '@nx/eslint@21.3.11': - resolution: {integrity: sha512-9jeD8QuU3OMcItjtw0QHl5cwohLeA9R+lajNJoOjS2tUGXTHWb8NOcEZBXWMcML+eV1iloIDW8/P4jV4BYqP2w==} + '@nx/eslint@21.4.1': + resolution: {integrity: sha512-2v9VVB63WXdN9dwAp6Sm1bpvTJ/x4220ywwTETRKn5clw/JkL4ZgGP4GGnJooiC7Psu7oNUNrT5D/bYtyCOLIA==} peerDependencies: '@zkochan/js-yaml': 0.0.7 eslint: ^8.0.0 || ^9.0.0 @@ -1137,75 +1314,75 @@ packages: '@zkochan/js-yaml': optional: true - '@nx/jest@21.3.11': - resolution: {integrity: sha512-PkdNWeoUY81zr+jtUapBdvvh26lWYIhDNyUwTjIBFajX8EAlhJpvShKHs7QObmrwOMLMXwLHKINiSCw9rueOBQ==} + '@nx/jest@21.4.1': + resolution: {integrity: sha512-kVjABt4tF1eZW3UljRhO7uj9hGP7ZHqrZp6HjloDHoWtoq4g8qhaK/pBgI+yAGZAD5d6bYstSO+IMDwLOZdTYg==} - '@nx/js@21.3.11': - resolution: {integrity: sha512-aN8g1TP3FMN6MFLvMrZNaoqSwAkBFH1PunKQV17w4nlPkimWICaCP2DhY5W3VoOpjQBbhQoqrRt4mVfgnEpyvA==} + '@nx/js@21.4.1': + resolution: {integrity: sha512-VK3rK5122iNIirLlOyKL7bIG+ziPM9VjXFbIw9mUAcKwvgf8mLOnR42NbFFlR2BsgwQ3in9TQRTNVSNdvg9utQ==} peerDependencies: verdaccio: ^6.0.5 peerDependenciesMeta: verdaccio: optional: true - '@nx/node@21.3.11': - resolution: {integrity: sha512-4B2onNmhrCaLlhwhDycMOisAuXmajAbl9gM8G6dS4Tc6z8QHXswlJG6rVP4VvR0ZZKtLeKGED2X5hpv9T1ikxw==} + '@nx/node@21.4.1': + resolution: {integrity: sha512-sVkr3g2TmqU2TvkchekLuozmM8C+h6gCRfKlxu9qOlfa17IWbkcdwG36yJ8ES2AXyGSlQWDeBXdFjs/ofiE+tQ==} - '@nx/nx-darwin-arm64@21.3.11': - resolution: {integrity: sha512-qXZrW6kfsfGG9n4cWugR2v8ys7P1SsbQuFahlbNSTd7g+ZxozaOnc7tyxW9XuY84KQ35HwP/QSu1E13fK5CXwQ==} + '@nx/nx-darwin-arm64@21.4.1': + resolution: {integrity: sha512-9BbkQnxGEDNX2ESbW4Zdrq1i09y6HOOgTuGbMJuy4e8F8rU/motMUqOpwmFgLHkLgPNZiOC2VXht3or/kQcpOg==} cpu: [arm64] os: [darwin] - '@nx/nx-darwin-x64@21.3.11': - resolution: {integrity: sha512-6NJEIGRITpFZYptJtr/wdnVuidAS/wONMMSwX5rgAqh5A9teI0vxZVOgG6n5f6NQyqEDvZ9ytcIvLsQWA4kJFg==} + '@nx/nx-darwin-x64@21.4.1': + resolution: {integrity: sha512-dnkmap1kc6aLV8CW1ihjsieZyaDDjlIB5QA2reTCLNSdTV446K6Fh0naLdaoG4ZkF27zJA/qBOuAaLzRHFJp3g==} cpu: [x64] os: [darwin] - '@nx/nx-freebsd-x64@21.3.11': - resolution: {integrity: sha512-9VZOM9mutzuZCUgijHXrIl3NgKt2CWuH/awLqDS8ijhLs6WfI5TYTa+mFwx90dfZZ4y/jy6XWXa2Ee3OShf7Hg==} + '@nx/nx-freebsd-x64@21.4.1': + resolution: {integrity: sha512-RpxDBGOPeDqJjpbV7F3lO/w1aIKfLyG/BM0OpJfTgFVpUIl50kMj5M1m4W9A8kvYkfOD9pDbUaWszom7d57yjg==} cpu: [x64] os: [freebsd] - '@nx/nx-linux-arm-gnueabihf@21.3.11': - resolution: {integrity: sha512-a05tAySKDEWt0TGoSnWp/l5+HL/CDJQkHfI9pXho85oDSkVRzhOInAn1EeZB/F+Q3PnJFsMHMhbuu2/nm3uYJA==} + '@nx/nx-linux-arm-gnueabihf@21.4.1': + resolution: {integrity: sha512-2OyBoag2738XWmWK3ZLBuhaYb7XmzT3f8HzomggLDJoDhwDekjgRoNbTxogAAj6dlXSeuPjO81BSlIfXQcth3w==} cpu: [arm] os: [linux] - '@nx/nx-linux-arm64-gnu@21.3.11': - resolution: {integrity: sha512-MPeivf0ptNpzQYvww6zHIqVbE5dTT2isl/WqzGyy7NgSeYDpFXmouDCQaeKxo5WytMVRCvCw/NnWTQuCK6TjnA==} + '@nx/nx-linux-arm64-gnu@21.4.1': + resolution: {integrity: sha512-2pg7/zjBDioUWJ3OY8Ixqy64eokKT5sh4iq1bk22bxOCf676aGrAu6khIxy4LBnPIdO0ZOK7KCJ7xOFP4phZqA==} cpu: [arm64] os: [linux] - '@nx/nx-linux-arm64-musl@21.3.11': - resolution: {integrity: sha512-/hJpc4VJsbxDEreXt5Ka9HJ3TBEHgIa9y/i+H9MmWOeapCdH1Edhx58Heuv9OaX7kK8Y8q0cSicv0dJCghiTjA==} + '@nx/nx-linux-arm64-musl@21.4.1': + resolution: {integrity: sha512-whNxh12au/inQtkZju1ZfXSqDS0hCh/anzVCXfLYWFstdwv61XiRmFCSHeN0gRDthlncXFdgKoT1bGG5aMYLtA==} cpu: [arm64] os: [linux] - '@nx/nx-linux-x64-gnu@21.3.11': - resolution: {integrity: sha512-pTBHuloqTxpTHa/fdKjHkFFsfW16mEcTp37HDtoQpjPfcd9nO8CYO8OClaewr9khNqCnSbCLfSoIg/alnb7BWw==} + '@nx/nx-linux-x64-gnu@21.4.1': + resolution: {integrity: sha512-UHw57rzLio0AUDXV3l+xcxT3LjuXil7SHj+H8aYmXTpXktctQU2eYGOs5ATqJ1avVQRSejJugHF0i8oLErC28A==} cpu: [x64] os: [linux] - '@nx/nx-linux-x64-musl@21.3.11': - resolution: {integrity: sha512-OhFjURB68rd6xld8t8fiNpopF2E7v+8/jfbpsku9c0gdV2UhzoxCeZwooe7qhQjCcjVO8JNOs4dAf7qs1VtpMw==} + '@nx/nx-linux-x64-musl@21.4.1': + resolution: {integrity: sha512-qqE2Gy/DwOLIyePjM7GLHp/nDLZJnxHmqTeCiTQCp/BdbmqjRkSUz5oL+Uua0SNXaTu5hjAfvjXAhSTgBwVO6g==} cpu: [x64] os: [linux] - '@nx/nx-win32-arm64-msvc@21.3.11': - resolution: {integrity: sha512-pGE2Td13oEj7aeogwCL+2fjmpabQVSduKfGOTlt4YoMlM0w0bXYSWqwiGBMKbMA50qkhnVapwwkuWF38PgCIxg==} + '@nx/nx-win32-arm64-msvc@21.4.1': + resolution: {integrity: sha512-NtEzMiRrSm2DdL4ntoDdjeze8DBrfZvLtx3Dq6+XmOhwnigR6umfWfZ6jbluZpuSQcxzQNVifqirdaQKYaYwDQ==} cpu: [arm64] os: [win32] - '@nx/nx-win32-x64-msvc@21.3.11': - resolution: {integrity: sha512-KJqLL/Zyx96hs+7pKbo/fsU7ZTFSLeZLnYQu05o6fvJJ5I1+p85t212/7vkbKKWJncyMospQdzLr3zLG3A/u8A==} + '@nx/nx-win32-x64-msvc@21.4.1': + resolution: {integrity: sha512-gpG+Y4G/mxGrfkUls6IZEuuBxRaKLMSEoVFLMb9JyyaLEDusn+HJ1m90XsOedjNLBHGMFigsd/KCCsXfFn4njg==} cpu: [x64] os: [win32] - '@nx/plugin@21.3.11': - resolution: {integrity: sha512-T/ZuNCX4P4mjpdeaDcxWlQgQqWYc8FVnoEQcXI1Qw1dGQ0fYgfoYs3Bu95mSqEdo0A4rqVVaGtnsa8AqqiT/5Q==} + '@nx/plugin@21.4.1': + resolution: {integrity: sha512-FC6ufCvvDjTmcBF2lD0JXSt3hduniw0RZSCUUOlIgSOqzuwgK7QyxhgjjrETuQPKNkJvxzlAqoB1Js9LZUkKpA==} - '@nx/workspace@21.3.11': - resolution: {integrity: sha512-DD2iu9Ip/faNQ5MXZk+UbbBxGofYKjzHsXKRvMNQ/OAVzP/u9z2CPXEmRKlRAEQoy1lInmyopwfEUWwK1v4x0g==} + '@nx/workspace@21.4.1': + resolution: {integrity: sha512-3e33eTb1hRx6/i416Wc0mk/TPANxjx2Kz8ecnyqFFII5CM9tX7CPCwDF4O75N9mysI6PCKJ+Hc/1q76HZR4UgA==} '@phenomnomnominal/tsquery@5.0.1': resolution: {integrity: sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==} @@ -1220,8 +1397,8 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@sinclair/typebox@0.34.38': - resolution: {integrity: sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==} + '@sinclair/typebox@0.34.41': + resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} @@ -1233,11 +1410,11 @@ packages: '@sinonjs/fake-timers@13.0.5': resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} - '@swc-node/core@1.13.3': - resolution: {integrity: sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA==} + '@swc-node/core@1.14.1': + resolution: {integrity: sha512-jrt5GUaZUU6cmMS+WTJEvGvaB6j1YNKPHPzC2PUi2BjaFbtxURHj6641Az6xN7b665hNniAIdvjxWcRml5yCnw==} engines: {node: '>= 10'} peerDependencies: - '@swc/core': '>= 1.4.13' + '@swc/core': '>= 1.13.3' '@swc/types': '>= 0.1' '@swc-node/register@1.9.2': @@ -1385,6 +1562,9 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/bun@1.2.20': + resolution: {integrity: sha512-dX3RGzQ8+KgmMw7CsW4xT5ITBSCrSbfHc36SNT31EOUg/LA9JWq0VDdEXDRSe1InVWpd2yLUM1FUF/kEOyTzYA==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1415,6 +1595,9 @@ packages: '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/react@19.1.12': + resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==} + '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -1427,63 +1610,63 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.39.0': - resolution: {integrity: sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==} + '@typescript-eslint/eslint-plugin@8.42.0': + resolution: {integrity: sha512-Aq2dPqsQkxHOLfb2OPv43RnIvfj05nw8v/6n3B2NABIPpHnjQnaLo9QGMTvml+tv4korl/Cjfrb/BYhoL8UUTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.39.0 + '@typescript-eslint/parser': ^8.42.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.39.0': - resolution: {integrity: sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==} + '@typescript-eslint/parser@8.42.0': + resolution: {integrity: sha512-r1XG74QgShUgXph1BYseJ+KZd17bKQib/yF3SR+demvytiRXrwd12Blnz5eYGm8tXaeRdd4x88MlfwldHoudGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.39.0': - resolution: {integrity: sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==} + '@typescript-eslint/project-service@8.42.0': + resolution: {integrity: sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.39.0': - resolution: {integrity: sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==} + '@typescript-eslint/scope-manager@8.42.0': + resolution: {integrity: sha512-51+x9o78NBAVgQzOPd17DkNTnIzJ8T/O2dmMBLoK9qbY0Gm52XJcdJcCl18ExBMiHo6jPMErUQWUv5RLE51zJw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.39.0': - resolution: {integrity: sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==} + '@typescript-eslint/tsconfig-utils@8.42.0': + resolution: {integrity: sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.39.0': - resolution: {integrity: sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==} + '@typescript-eslint/type-utils@8.42.0': + resolution: {integrity: sha512-9KChw92sbPTYVFw3JLRH1ockhyR3zqqn9lQXol3/YbI6jVxzWoGcT3AsAW0mu1MY0gYtsXnUGV/AKpkAj5tVlQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.39.0': - resolution: {integrity: sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==} + '@typescript-eslint/types@8.42.0': + resolution: {integrity: sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.39.0': - resolution: {integrity: sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==} + '@typescript-eslint/typescript-estree@8.42.0': + resolution: {integrity: sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.39.0': - resolution: {integrity: sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==} + '@typescript-eslint/utils@8.42.0': + resolution: {integrity: sha512-JnIzu7H3RH5BrKC4NoZqRfmjqCIS1u3hGZltDYJgkVdqAezl4L9d1ZLw+36huCujtSBSAirGINF/S4UxOcR+/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.39.0': - resolution: {integrity: sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==} + '@typescript-eslint/visitor-keys@8.42.0': + resolution: {integrity: sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -1766,8 +1949,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.2.0: + resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} engines: {node: '>=12'} ansi-styles@4.3.0: @@ -1837,8 +2020,8 @@ packages: b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} - babel-jest@30.0.5: - resolution: {integrity: sha512-mRijnKimhGDMsizTvBTWotwNpzrkHr+VvZUQBof2AufXKB8NXrL1W69TG20EvOz7aevx6FTJIaBuBkYxS8zolg==} + babel-jest@30.1.2: + resolution: {integrity: sha512-IQCus1rt9kaSh7PQxLYRY5NmkNrNlU2TpabzwV7T2jljnpdHOcmnYYv8QmE04Li4S3a2Lj8/yXyET5pBarPr6g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@babel/core': ^7.11.0 @@ -1848,8 +2031,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - babel-plugin-istanbul@7.0.0: - resolution: {integrity: sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==} + babel-plugin-istanbul@7.0.1: + resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} engines: {node: '>=12'} babel-plugin-jest-hoist@30.0.1: @@ -1898,8 +2081,8 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.6.0: - resolution: {integrity: sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==} + bare-events@2.6.1: + resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1938,8 +2121,8 @@ packages: browserify-zlib@0.1.4: resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - browserslist@4.25.1: - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + browserslist@4.25.4: + resolution: {integrity: sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1965,6 +2148,11 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bun-types@1.2.20: + resolution: {integrity: sha512-pxTnQYOrKvdOwyiyd/7sMt9yFOenN004Y6O4lCcCUoKVej48FS5cvTw9geRaEcB9TsDZaJKAxPTVvi8tFsVuXA==} + peerDependencies: + '@types/react': ^19 + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -1997,8 +2185,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001731: - resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} + caniuse-lite@1.0.30001741: + resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -2051,6 +2239,14 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + cmrd@0.0.1: + resolution: {integrity: sha512-JMLzOPbeKpvfuJ7NDwJ1WQqf1QG/91goexLWXK54QMWoUyvDPf5fAgqUGiTBWneuLc3RHO1vBiJW5UDgINBWjA==} + peerDependencies: + typescript: '>=4.5.0' + peerDependenciesMeta: + typescript: + optional: true + co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -2116,8 +2312,8 @@ packages: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} - core-js-compat@3.45.0: - resolution: {integrity: sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA==} + core-js-compat@3.45.1: + resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==} core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -2144,6 +2340,9 @@ packages: resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} engines: {node: '>=18'} + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + cz-git@1.12.0: resolution: {integrity: sha512-LaZ+8whPPUOo6Y0Zy4nIbf6JOleV3ejp41sT6N4RPKiKKA+ICWf4ueeIlxIO8b6JtdlDxRzHH/EcRji07nDxcg==} engines: {node: '>=v12.20.0'} @@ -2206,8 +2405,8 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@1.6.0: - resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} + dedent@1.7.0: + resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -2293,15 +2492,15 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.197: - resolution: {integrity: sha512-m1xWB3g7vJ6asIFz+2pBUbq3uGmfmln1M9SSvBe4QIFWYrRHylP73zL/3nMjDmwz8V+1xAXQDfBd6+HPW0WvDQ==} + electron-to-chromium@1.5.214: + resolution: {integrity: sha512-TpvUNdha+X3ybfU78NoQatKvQEm1oq3lf2QbnmCEdw+Bd9RuIAY+hJTvq1avzHM0f7EJfnH3vbCnbzKzisc/9Q==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} - emoji-regex@10.4.0: - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + emoji-regex@10.5.0: + resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2352,6 +2551,11 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -2389,8 +2593,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.32.0: - resolution: {integrity: sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==} + eslint@9.35.0: + resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2448,8 +2652,8 @@ packages: resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} - expect@30.0.5: - resolution: {integrity: sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==} + expect@30.1.2: + resolution: {integrity: sha512-xvHszRavo28ejws8FpemjhwswGj4w/BetHIL8cU49u4sGyXDw2+p3YbeDbj6xzlxi6kWTjIRSTJ+9sNXPnF0Zg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} express-rate-limit@5.5.1: @@ -2494,8 +2698,8 @@ packages: resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} engines: {node: '>=6'} - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -2503,8 +2707,9 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2625,8 +2830,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.3.0: - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + get-east-asian-width@1.3.1: + resolution: {integrity: sha512-R1QfovbPsKmosqTnPoRFiJ7CF9MLRgb53ChvMZm+r4p76/+8yKDy17qLL2PKInORy2RkZZekuK0efYgmzTkXyQ==} engines: {node: '>=18'} get-intrinsic@1.3.0: @@ -2928,8 +3133,8 @@ packages: resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} jackspeak@3.4.3: @@ -2944,12 +3149,12 @@ packages: resolution: {integrity: sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-circus@30.0.5: - resolution: {integrity: sha512-h/sjXEs4GS+NFFfqBDYT7y5Msfxh04EwWLhQi0F8kuWpe+J/7tICSlswU8qvBqumR3kFgHbfu7vU6qruWWBPug==} + jest-circus@30.1.3: + resolution: {integrity: sha512-Yf3dnhRON2GJT4RYzM89t/EXIWNxKTpWTL9BfF3+geFetWP4XSvJjiU1vrWplOiUkmq8cHLiwuhz+XuUp9DscA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-cli@30.0.5: - resolution: {integrity: sha512-Sa45PGMkBZzF94HMrlX4kUyPOwUpdZasaliKN3mifvDmkhLYqLLg8HQTzn6gq7vJGahFYMQjXgyJWfYImKZzOw==} + jest-cli@30.1.3: + resolution: {integrity: sha512-G8E2Ol3OKch1DEeIBl41NP7OiC6LBhfg25Btv+idcusmoUSpqUkbrneMqbW9lVpI/rCKb/uETidb7DNteheuAQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -2958,8 +3163,8 @@ packages: node-notifier: optional: true - jest-config@30.0.5: - resolution: {integrity: sha512-aIVh+JNOOpzUgzUnPn5FLtyVnqc3TQHVMupYtyeURSb//iLColiMIR8TxCIDKyx9ZgjKnXGucuW68hCxgbrwmA==} + jest-config@30.1.3: + resolution: {integrity: sha512-M/f7gqdQEPgZNA181Myz+GXCe8jXcJsGjCMXUzRj22FIXsZOyHNte84e0exntOvdPaeh9tA0w+B8qlP2fAezfw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@types/node': '*' @@ -2973,20 +3178,20 @@ packages: ts-node: optional: true - jest-diff@30.0.5: - resolution: {integrity: sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==} + jest-diff@30.1.2: + resolution: {integrity: sha512-4+prq+9J61mOVXCa4Qp8ZjavdxzrWQXrI80GNxP8f4tkI2syPuPrJgdRPZRrfUTRvIoUwcmNLbqEJy9W800+NQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-docblock@30.0.1: resolution: {integrity: sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-each@30.0.5: - resolution: {integrity: sha512-dKjRsx1uZ96TVyejD3/aAWcNKy6ajMaN531CwWIsrazIqIoXI9TnnpPlkrEYku/8rkS3dh2rbH+kMOyiEIv0xQ==} + jest-each@30.1.0: + resolution: {integrity: sha512-A+9FKzxPluqogNahpCv04UJvcZ9B3HamqpDNWNKDjtxVRYB8xbZLFuCr8JAJFpNp83CA0anGQFlpQna9Me+/tQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-environment-jsdom@30.0.5: - resolution: {integrity: sha512-BmnDEoAH+jEjkPrvE9DTKS2r3jYSJWlN/r46h0/DBUxKrkgt2jAZ5Nj4wXLAcV1KWkRpcFqA5zri9SWzJZ1cCg==} + jest-environment-jsdom@30.1.2: + resolution: {integrity: sha512-LXsfAh5+mDTuXDONGl1ZLYxtJEaS06GOoxJb2arcJTjIfh1adYg8zLD8f6P0df8VmjvCaMrLmc1PgHUI/YUTbg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 @@ -2994,24 +3199,24 @@ packages: canvas: optional: true - jest-environment-node@30.0.5: - resolution: {integrity: sha512-ppYizXdLMSvciGsRsMEnv/5EFpvOdXBaXRBzFUDPWrsfmog4kYrOGWXarLllz6AXan6ZAA/kYokgDWuos1IKDA==} + jest-environment-node@30.1.2: + resolution: {integrity: sha512-w8qBiXtqGWJ9xpJIA98M0EIoq079GOQRQUyse5qg1plShUCQ0Ek1VTTcczqKrn3f24TFAgFtT+4q3aOXvjbsuA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-haste-map@30.0.5: - resolution: {integrity: sha512-dkmlWNlsTSR0nH3nRfW5BKbqHefLZv0/6LCccG0xFCTWcJu8TuEwG+5Cm75iBfjVoockmO6J35o5gxtFSn5xeg==} + jest-haste-map@30.1.0: + resolution: {integrity: sha512-JLeM84kNjpRkggcGpQLsV7B8W4LNUWz7oDNVnY1Vjj22b5/fAb3kk3htiD+4Na8bmJmjJR7rBtS2Rmq/NEcADg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-leak-detector@30.0.5: - resolution: {integrity: sha512-3Uxr5uP8jmHMcsOtYMRB/zf1gXN3yUIc+iPorhNETG54gErFIiUhLvyY/OggYpSMOEYqsmRxmuU4ZOoX5jpRFg==} + jest-leak-detector@30.1.0: + resolution: {integrity: sha512-AoFvJzwxK+4KohH60vRuHaqXfWmeBATFZpzpmzNmYTtmRMiyGPVhkXpBqxUQunw+dQB48bDf4NpUs6ivVbRv1g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-matcher-utils@30.0.5: - resolution: {integrity: sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==} + jest-matcher-utils@30.1.2: + resolution: {integrity: sha512-7ai16hy4rSbDjvPTuUhuV8nyPBd6EX34HkBsBcBX2lENCuAQ0qKCPb/+lt8OSWUa9WWmGYLy41PrEzkwRwoGZQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-message-util@30.0.5: - resolution: {integrity: sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==} + jest-message-util@30.1.0: + resolution: {integrity: sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-mock@30.0.5: @@ -3031,44 +3236,44 @@ packages: resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve-dependencies@30.0.5: - resolution: {integrity: sha512-/xMvBR4MpwkrHW4ikZIWRttBBRZgWK4d6xt3xW1iRDSKt4tXzYkMkyPfBnSCgv96cpkrctfXs6gexeqMYqdEpw==} + jest-resolve-dependencies@30.1.3: + resolution: {integrity: sha512-DNfq3WGmuRyHRHfEet+Zm3QOmVFtIarUOQHHryKPc0YL9ROfgWZxl4+aZq/VAzok2SS3gZdniP+dO4zgo59hBg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve@30.0.5: - resolution: {integrity: sha512-d+DjBQ1tIhdz91B79mywH5yYu76bZuE96sSbxj8MkjWVx5WNdt1deEFRONVL4UkKLSrAbMkdhb24XN691yDRHg==} + jest-resolve@30.1.3: + resolution: {integrity: sha512-DI4PtTqzw9GwELFS41sdMK32Ajp3XZQ8iygeDMWkxlRhm7uUTOFSZFVZABFuxr0jvspn8MAYy54NxZCsuCTSOw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runner@30.0.5: - resolution: {integrity: sha512-JcCOucZmgp+YuGgLAXHNy7ualBx4wYSgJVWrYMRBnb79j9PD0Jxh0EHvR5Cx/r0Ce+ZBC4hCdz2AzFFLl9hCiw==} + jest-runner@30.1.3: + resolution: {integrity: sha512-dd1ORcxQraW44Uz029TtXj85W11yvLpDuIzNOlofrC8GN+SgDlgY4BvyxJiVeuabA1t6idjNbX59jLd2oplOGQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runtime@30.0.5: - resolution: {integrity: sha512-7oySNDkqpe4xpX5PPiJTe5vEa+Ak/NnNz2bGYZrA1ftG3RL3EFlHaUkA1Cjx+R8IhK0Vg43RML5mJedGTPNz3A==} + jest-runtime@30.1.3: + resolution: {integrity: sha512-WS8xgjuNSphdIGnleQcJ3AKE4tBKOVP+tKhCD0u+Tb2sBmsU8DxfbBpZX7//+XOz81zVs4eFpJQwBNji2Y07DA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-snapshot@30.0.5: - resolution: {integrity: sha512-T00dWU/Ek3LqTp4+DcW6PraVxjk28WY5Ua/s+3zUKSERZSNyxTqhDXCWKG5p2HAJ+crVQ3WJ2P9YVHpj1tkW+g==} + jest-snapshot@30.1.2: + resolution: {integrity: sha512-4q4+6+1c8B6Cy5pGgFvjDy/Pa6VYRiGu0yQafKkJ9u6wQx4G5PqI2QR6nxTl43yy7IWsINwz6oT4o6tD12a8Dg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-util@30.0.5: resolution: {integrity: sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-validate@30.0.5: - resolution: {integrity: sha512-ouTm6VFHaS2boyl+k4u+Qip4TSH7Uld5tyD8psQ8abGgt2uYYB8VwVfAHWHjHc0NWmGGbwO5h0sCPOGHHevefw==} + jest-validate@30.1.0: + resolution: {integrity: sha512-7P3ZlCFW/vhfQ8pE7zW6Oi4EzvuB4sgR72Q1INfW9m0FGo0GADYlPwIkf4CyPq7wq85g+kPMtPOHNAdWHeBOaA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-watcher@30.0.5: - resolution: {integrity: sha512-z9slj/0vOwBDBjN3L4z4ZYaA+pG56d6p3kTUhFRYGvXbXMWhXmb/FIxREZCD06DYUwDKKnj2T80+Pb71CQ0KEg==} + jest-watcher@30.1.3: + resolution: {integrity: sha512-6jQUZCP1BTL2gvG9E4YF06Ytq4yMb4If6YoQGRR6PpjtqOXSP3sKe2kqwB6SQ+H9DezOfZaSLnmka1NtGm3fCQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-worker@30.0.5: - resolution: {integrity: sha512-ojRXsWzEP16NdUuBw/4H/zkZdHOa7MMYCk4E430l+8fELeLg/mqmMlRhjL7UNZvQrDmnovWZV4DxX03fZF48fQ==} + jest-worker@30.1.0: + resolution: {integrity: sha512-uvWcSjlwAAgIu133Tt77A05H7RIk3Ho8tZL50bQM2AkvLdluw9NG48lRCl3Dt+MOH719n/0nnb5YxUwcuJiKRA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest@30.0.5: - resolution: {integrity: sha512-y2mfcJywuTUkvLm2Lp1/pFX8kTgMO5yyQGq/Sk/n2mN7XWYp4JsCZ/QXW34M8YScgk8bPZlREH04f6blPnoHnQ==} + jest@30.1.3: + resolution: {integrity: sha512-Ry+p2+NLk6u8Agh5yVqELfUJvRfV51hhVBRIB5yZPY7mU0DGBmOuFG5GebZbMbm86cdQNK0fhJuDX8/1YorISQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -3143,6 +3348,9 @@ packages: jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} @@ -3293,6 +3501,10 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} @@ -3372,8 +3584,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - napi-postinstall@0.3.2: - resolution: {integrity: sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==} + napi-postinstall@0.3.3: + resolution: {integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true @@ -3406,8 +3618,8 @@ packages: node-machine-id@1.1.12: resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.20: + resolution: {integrity: sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA==} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -3425,11 +3637,11 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - nwsapi@2.2.21: - resolution: {integrity: sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==} + nwsapi@2.2.22: + resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==} - nx@21.3.11: - resolution: {integrity: sha512-nj2snZ3mHZnbHcoB3NUdxbch9L1sQKV1XccLs1B79fmI/N5oOgWgctm/bWoZH2UH5b4A8ZLAMTsC6YnSJGbcaw==} + nx@21.4.1: + resolution: {integrity: sha512-nD8NjJGYk5wcqiATzlsLauvyrSHV2S2YmM2HBIKqTTwVP2sey07MF3wDB9U2BwxIjboahiITQ6pfqFgB79TF2A==} hasBin: true peerDependencies: '@swc-node/register': ^1.8.0 @@ -4034,8 +4246,8 @@ packages: resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} hasBin: true - tmp@0.2.4: - resolution: {integrity: sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==} + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} tmpl@1.0.5: @@ -4049,8 +4261,8 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - token-types@6.0.4: - resolution: {integrity: sha512-MD9MjpVNhVyH4fyd5rKphjvt/1qj+PtQUz65aFqAZA6XniWAuSFRjLk3e2VALEFlh9OwBpXUN7rfeqSnT/Fmkw==} + token-types@6.1.1: + resolution: {integrity: sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==} engines: {node: '>=14.16'} tough-cookie@5.1.2: @@ -4151,8 +4363,8 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typescript-eslint@8.39.0: - resolution: {integrity: sha512-lH8FvtdtzcHJCkMOKnN73LIn6SLTpoojgJqDAxPm1jCR14eWSGPX8ul/gggBdPMk/d5+u9V854vTYQ8T5jF/1Q==} + typescript-eslint@8.42.0: + resolution: {integrity: sha512-ozR/rQn+aQXQxh1YgbCzQWDFrsi9mcg+1PM3l/z5o1+20P7suOIaNg515bpr/OYt6FObz/NHcBstydDLHWeEKg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -4163,13 +4375,18 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true - uint8array-extras@1.4.0: - resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} engines: {node: '>=18'} unbzip2-stream@1.4.3: @@ -4389,15 +4606,10 @@ packages: snapshots: - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 - '@asamuzakjp/css-color@3.2.0': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 lru-cache: 10.4.3 @@ -4408,20 +4620,20 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.0': {} + '@babel/compat-data@7.28.4': {} - '@babel/core@7.28.0': + '@babel/core@7.28.4': dependencies: - '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 + '@babel/generator': 7.28.3 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helpers': 7.28.2 - '@babel/parser': 7.28.0 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.1 gensync: 1.0.0-beta.2 @@ -4430,49 +4642,49 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.28.0': + '@babel/generator@7.28.3': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.28.0 + '@babel/compat-data': 7.28.4 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.1 + browserslist: 4.25.4 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.0)': + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.0)': + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 debug: 4.4.1 @@ -4485,55 +4697,55 @@ snapshots: '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.0)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/helper-wrap-function': 7.28.3 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color @@ -4543,663 +4755,665 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-wrap-function@7.27.1': + '@babel/helper-wrap-function@7.28.3': dependencies: '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/helpers@7.28.2': + '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 - '@babel/parser@7.28.0': + '@babel/parser@7.28.4': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.4) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.4) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-block-scoping@7.28.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-globals': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.27.2 - '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.4) + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.0)': + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.28.1(@babel/core@7.28.0)': + '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-runtime@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-runtime@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.0) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.0) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.4) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.4) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.4) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 - '@babel/preset-env@7.28.0(@babel/core@7.28.0)': + '@babel/preset-env@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/compat-data': 7.28.0 - '@babel/core': 7.28.0 + '@babel/compat-data': 7.28.4 + '@babel/core': 7.28.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.0) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-regenerator': 7.28.1(@babel/core@7.28.0) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.0) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.0) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.0) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0) - core-js-compat: 3.45.0 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.4) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.4) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-block-scoping': 7.28.4(@babel/core@7.28.4) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.4) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.4) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.4) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.4) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.4) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.4) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.4) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.4) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.4) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.4) + core-js-compat: 3.45.1 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 esutils: 2.0.3 - '@babel/preset-typescript@7.27.1(@babel/core@7.28.0)': + '@babel/preset-typescript@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) transitivePeerDependencies: - supports-color - '@babel/runtime@7.28.2': {} + '@babel/runtime@7.28.4': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 - '@babel/traverse@7.28.0': + '@babel/traverse@7.28.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 + '@babel/generator': 7.28.3 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 debug: 4.4.1 transitivePeerDependencies: - supports-color - '@babel/types@7.28.2': + '@babel/types@7.28.4': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 '@bcoe/v8-coverage@0.2.3': {} + '@borewit/text-codec@0.1.1': {} + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@csstools/color-helpers@5.0.2': {} + '@csstools/color-helpers@5.1.0': {} '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-color-parser@3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - '@csstools/color-helpers': 5.0.2 + '@csstools/color-helpers': 5.1.0 '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 @@ -5231,22 +5445,91 @@ snapshots: tunnel-agent: 0.6.0 uuid: 8.3.2 - '@emnapi/core@1.4.5': + '@emnapi/core@1.5.0': dependencies: - '@emnapi/wasi-threads': 1.0.4 + '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 - '@emnapi/runtime@1.4.5': + '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 - '@emnapi/wasi-threads@1.0.4': + '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 - '@eslint-community/eslint-utils@4.7.0(eslint@9.32.0)': + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@eslint-community/eslint-utils@4.8.0(eslint@9.35.0)': dependencies: - eslint: 9.32.0 + eslint: 9.35.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -5259,9 +5542,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.0': {} + '@eslint/config-helpers@0.3.1': {} - '@eslint/core@0.15.1': + '@eslint/core@0.15.2': dependencies: '@types/json-schema': 7.0.15 @@ -5279,26 +5562,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.32.0': {} + '@eslint/js@9.35.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.4': + '@eslint/plugin-kit@0.3.5': dependencies: - '@eslint/core': 0.15.1 + '@eslint/core': 0.15.2 levn: 0.4.1 '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.7': dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.3': {} '@isaacs/cliui@8.0.2': @@ -5320,22 +5601,22 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/console@30.0.5': + '@jest/console@30.1.2': dependencies: '@jest/types': 30.0.5 '@types/node': 18.16.9 chalk: 4.1.2 - jest-message-util: 30.0.5 + jest-message-util: 30.1.0 jest-util: 30.0.5 slash: 3.0.0 - '@jest/core@30.0.5(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3))': + '@jest/core@30.1.3(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2))': dependencies: - '@jest/console': 30.0.5 + '@jest/console': 30.1.2 '@jest/pattern': 30.0.1 - '@jest/reporters': 30.0.5 - '@jest/test-result': 30.0.5 - '@jest/transform': 30.0.5 + '@jest/reporters': 30.1.3 + '@jest/test-result': 30.1.3 + '@jest/transform': 30.1.2 '@jest/types': 30.0.5 '@types/node': 18.16.9 ansi-escapes: 4.3.2 @@ -5344,18 +5625,18 @@ snapshots: exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.0.5 - jest-config: 30.0.5(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3)) - jest-haste-map: 30.0.5 - jest-message-util: 30.0.5 + jest-config: 30.1.3(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2)) + jest-haste-map: 30.1.0 + jest-message-util: 30.1.0 jest-regex-util: 30.0.1 - jest-resolve: 30.0.5 - jest-resolve-dependencies: 30.0.5 - jest-runner: 30.0.5 - jest-runtime: 30.0.5 - jest-snapshot: 30.0.5 + jest-resolve: 30.1.3 + jest-resolve-dependencies: 30.1.3 + jest-runner: 30.1.3 + jest-runtime: 30.1.3 + jest-snapshot: 30.1.2 jest-util: 30.0.5 - jest-validate: 30.0.5 - jest-watcher: 30.0.5 + jest-validate: 30.1.0 + jest-watcher: 30.1.3 micromatch: 4.0.8 pretty-format: 30.0.5 slash: 3.0.0 @@ -5371,10 +5652,10 @@ snapshots: '@jest/diff-sequences@30.0.1': {} - '@jest/environment-jsdom-abstract@30.0.5(jsdom@26.1.0)': + '@jest/environment-jsdom-abstract@30.1.2(jsdom@26.1.0)': dependencies: - '@jest/environment': 30.0.5 - '@jest/fake-timers': 30.0.5 + '@jest/environment': 30.1.2 + '@jest/fake-timers': 30.1.2 '@jest/types': 30.0.5 '@types/jsdom': 21.1.7 '@types/node': 18.16.9 @@ -5382,39 +5663,39 @@ snapshots: jest-util: 30.0.5 jsdom: 26.1.0 - '@jest/environment@30.0.5': + '@jest/environment@30.1.2': dependencies: - '@jest/fake-timers': 30.0.5 + '@jest/fake-timers': 30.1.2 '@jest/types': 30.0.5 '@types/node': 18.16.9 jest-mock: 30.0.5 - '@jest/expect-utils@30.0.5': + '@jest/expect-utils@30.1.2': dependencies: - '@jest/get-type': 30.0.1 + '@jest/get-type': 30.1.0 - '@jest/expect@30.0.5': + '@jest/expect@30.1.2': dependencies: - expect: 30.0.5 - jest-snapshot: 30.0.5 + expect: 30.1.2 + jest-snapshot: 30.1.2 transitivePeerDependencies: - supports-color - '@jest/fake-timers@30.0.5': + '@jest/fake-timers@30.1.2': dependencies: '@jest/types': 30.0.5 '@sinonjs/fake-timers': 13.0.5 '@types/node': 18.16.9 - jest-message-util: 30.0.5 + jest-message-util: 30.1.0 jest-mock: 30.0.5 jest-util: 30.0.5 - '@jest/get-type@30.0.1': {} + '@jest/get-type@30.1.0': {} - '@jest/globals@30.0.5': + '@jest/globals@30.1.2': dependencies: - '@jest/environment': 30.0.5 - '@jest/expect': 30.0.5 + '@jest/environment': 30.1.2 + '@jest/expect': 30.1.2 '@jest/types': 30.0.5 jest-mock: 30.0.5 transitivePeerDependencies: @@ -5425,14 +5706,14 @@ snapshots: '@types/node': 18.16.9 jest-regex-util: 30.0.1 - '@jest/reporters@30.0.5': + '@jest/reporters@30.1.3': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.0.5 - '@jest/test-result': 30.0.5 - '@jest/transform': 30.0.5 + '@jest/console': 30.1.2 + '@jest/test-result': 30.1.3 + '@jest/transform': 30.1.2 '@jest/types': 30.0.5 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.30 '@types/node': 18.16.9 chalk: 4.1.2 collect-v8-coverage: 1.0.2 @@ -5443,10 +5724,10 @@ snapshots: istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - jest-message-util: 30.0.5 + istanbul-reports: 3.2.0 + jest-message-util: 30.1.0 jest-util: 30.0.5 - jest-worker: 30.0.5 + jest-worker: 30.1.0 slash: 3.0.0 string-length: 4.0.2 v8-to-istanbul: 9.3.0 @@ -5455,9 +5736,9 @@ snapshots: '@jest/schemas@30.0.5': dependencies: - '@sinclair/typebox': 0.34.38 + '@sinclair/typebox': 0.34.41 - '@jest/snapshot-utils@30.0.5': + '@jest/snapshot-utils@30.1.2': dependencies: '@jest/types': 30.0.5 chalk: 4.1.2 @@ -5466,35 +5747,35 @@ snapshots: '@jest/source-map@30.0.1': dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.30 callsites: 3.1.0 graceful-fs: 4.2.11 - '@jest/test-result@30.0.5': + '@jest/test-result@30.1.3': dependencies: - '@jest/console': 30.0.5 + '@jest/console': 30.1.2 '@jest/types': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@30.0.5': + '@jest/test-sequencer@30.1.3': dependencies: - '@jest/test-result': 30.0.5 + '@jest/test-result': 30.1.3 graceful-fs: 4.2.11 - jest-haste-map: 30.0.5 + jest-haste-map: 30.1.0 slash: 3.0.0 - '@jest/transform@30.0.5': + '@jest/transform@30.1.2': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@jest/types': 30.0.5 - '@jridgewell/trace-mapping': 0.3.29 - babel-plugin-istanbul: 7.0.0 + '@jridgewell/trace-mapping': 0.3.30 + babel-plugin-istanbul: 7.0.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 30.0.5 + jest-haste-map: 30.1.0 jest-regex-util: 30.0.1 jest-util: 30.0.5 micromatch: 4.0.8 @@ -5514,104 +5795,113 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.12': + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 + + '@jridgewell/remapping@2.3.5': dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.4': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.29': + '@jridgewell/trace-mapping@0.3.30': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/nice-android-arm-eabi@1.1.1': + optional: true - '@napi-rs/nice-android-arm-eabi@1.0.4': + '@napi-rs/nice-android-arm64@1.1.1': optional: true - '@napi-rs/nice-android-arm64@1.0.4': + '@napi-rs/nice-darwin-arm64@1.1.1': optional: true - '@napi-rs/nice-darwin-arm64@1.0.4': + '@napi-rs/nice-darwin-x64@1.1.1': optional: true - '@napi-rs/nice-darwin-x64@1.0.4': + '@napi-rs/nice-freebsd-x64@1.1.1': optional: true - '@napi-rs/nice-freebsd-x64@1.0.4': + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': optional: true - '@napi-rs/nice-linux-arm-gnueabihf@1.0.4': + '@napi-rs/nice-linux-arm64-gnu@1.1.1': optional: true - '@napi-rs/nice-linux-arm64-gnu@1.0.4': + '@napi-rs/nice-linux-arm64-musl@1.1.1': optional: true - '@napi-rs/nice-linux-arm64-musl@1.0.4': + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': optional: true - '@napi-rs/nice-linux-ppc64-gnu@1.0.4': + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': optional: true - '@napi-rs/nice-linux-riscv64-gnu@1.0.4': + '@napi-rs/nice-linux-s390x-gnu@1.1.1': optional: true - '@napi-rs/nice-linux-s390x-gnu@1.0.4': + '@napi-rs/nice-linux-x64-gnu@1.1.1': optional: true - '@napi-rs/nice-linux-x64-gnu@1.0.4': + '@napi-rs/nice-linux-x64-musl@1.1.1': optional: true - '@napi-rs/nice-linux-x64-musl@1.0.4': + '@napi-rs/nice-openharmony-arm64@1.1.1': optional: true - '@napi-rs/nice-win32-arm64-msvc@1.0.4': + '@napi-rs/nice-win32-arm64-msvc@1.1.1': optional: true - '@napi-rs/nice-win32-ia32-msvc@1.0.4': + '@napi-rs/nice-win32-ia32-msvc@1.1.1': optional: true - '@napi-rs/nice-win32-x64-msvc@1.0.4': + '@napi-rs/nice-win32-x64-msvc@1.1.1': optional: true - '@napi-rs/nice@1.0.4': + '@napi-rs/nice@1.1.1': optionalDependencies: - '@napi-rs/nice-android-arm-eabi': 1.0.4 - '@napi-rs/nice-android-arm64': 1.0.4 - '@napi-rs/nice-darwin-arm64': 1.0.4 - '@napi-rs/nice-darwin-x64': 1.0.4 - '@napi-rs/nice-freebsd-x64': 1.0.4 - '@napi-rs/nice-linux-arm-gnueabihf': 1.0.4 - '@napi-rs/nice-linux-arm64-gnu': 1.0.4 - '@napi-rs/nice-linux-arm64-musl': 1.0.4 - '@napi-rs/nice-linux-ppc64-gnu': 1.0.4 - '@napi-rs/nice-linux-riscv64-gnu': 1.0.4 - '@napi-rs/nice-linux-s390x-gnu': 1.0.4 - '@napi-rs/nice-linux-x64-gnu': 1.0.4 - '@napi-rs/nice-linux-x64-musl': 1.0.4 - '@napi-rs/nice-win32-arm64-msvc': 1.0.4 - '@napi-rs/nice-win32-ia32-msvc': 1.0.4 - '@napi-rs/nice-win32-x64-msvc': 1.0.4 + '@napi-rs/nice-android-arm-eabi': 1.1.1 + '@napi-rs/nice-android-arm64': 1.1.1 + '@napi-rs/nice-darwin-arm64': 1.1.1 + '@napi-rs/nice-darwin-x64': 1.1.1 + '@napi-rs/nice-freebsd-x64': 1.1.1 + '@napi-rs/nice-linux-arm-gnueabihf': 1.1.1 + '@napi-rs/nice-linux-arm64-gnu': 1.1.1 + '@napi-rs/nice-linux-arm64-musl': 1.1.1 + '@napi-rs/nice-linux-ppc64-gnu': 1.1.1 + '@napi-rs/nice-linux-riscv64-gnu': 1.1.1 + '@napi-rs/nice-linux-s390x-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-musl': 1.1.1 + '@napi-rs/nice-openharmony-arm64': 1.1.1 + '@napi-rs/nice-win32-arm64-msvc': 1.1.1 + '@napi-rs/nice-win32-ia32-msvc': 1.1.1 + '@napi-rs/nice-win32-x64-msvc': 1.1.1 optional: true '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.5 + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 '@tybys/wasm-util': 0.10.0 optional: true '@napi-rs/wasm-runtime@0.2.4': dependencies: - '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.5 + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 '@tybys/wasm-util': 0.9.0 '@nodelib/fs.scandir@2.1.5': @@ -5626,26 +5916,34 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nx/devkit@21.3.11(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))': + '@nx/devkit@21.4.1(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))': dependencies: ejs: 3.1.10 enquirer: 2.3.6 ignore: 5.3.2 minimatch: 9.0.3 - nx: 21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)) + nx: 21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)) semver: 7.7.2 - tmp: 0.2.4 + tmp: 0.2.5 tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/eslint-plugin@21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.8.3))(eslint-config-prettier@10.1.8(eslint@9.32.0))(eslint@9.32.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(typescript@5.8.3)(verdaccio@6.1.6(typanion@3.14.0))': + '@nx/docker@21.4.1(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))': + dependencies: + '@nx/devkit': 21.4.1(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))) + enquirer: 2.3.6 + tslib: 2.8.1 + transitivePeerDependencies: + - nx + + '@nx/eslint-plugin@21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@typescript-eslint/parser@8.42.0(eslint@9.35.0)(typescript@5.9.2))(eslint-config-prettier@10.1.8(eslint@9.35.0))(eslint@9.35.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(typescript@5.9.2)(verdaccio@6.1.6(typanion@3.14.0))': dependencies: - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))) - '@nx/js': 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) - '@typescript-eslint/parser': 8.39.0(eslint@9.32.0)(typescript@5.8.3) - '@typescript-eslint/type-utils': 8.39.0(eslint@9.32.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0)(typescript@5.8.3) + '@nx/devkit': 21.4.1(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))) + '@nx/js': 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.9.2) + '@typescript-eslint/parser': 8.42.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.42.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/utils': 8.42.0(eslint@9.35.0)(typescript@5.9.2) chalk: 4.1.2 confusing-browser-globals: 1.0.11 globals: 15.15.0 @@ -5653,7 +5951,7 @@ snapshots: semver: 7.7.2 tslib: 2.8.1 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.32.0) + eslint-config-prettier: 10.1.8(eslint@9.35.0) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -5665,11 +5963,11 @@ snapshots: - typescript - verdaccio - '@nx/eslint@21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.32.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0))': + '@nx/eslint@21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.35.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0))': dependencies: - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))) - '@nx/js': 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) - eslint: 9.32.0 + '@nx/devkit': 21.4.1(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))) + '@nx/js': 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) + eslint: 9.35.0 semver: 7.7.2 tslib: 2.8.1 typescript: 5.8.3 @@ -5684,16 +5982,16 @@ snapshots: - supports-color - verdaccio - '@nx/jest@21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3))(typescript@5.8.3)(verdaccio@6.1.6(typanion@3.14.0))': + '@nx/jest@21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2))(typescript@5.9.2)(verdaccio@6.1.6(typanion@3.14.0))': dependencies: - '@jest/reporters': 30.0.5 - '@jest/test-result': 30.0.5 - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))) - '@nx/js': 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) + '@jest/reporters': 30.1.3 + '@jest/test-result': 30.1.3 + '@nx/devkit': 21.4.1(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))) + '@nx/js': 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.9.2) identity-obj-proxy: 3.0.0 - jest-config: 30.0.5(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3)) - jest-resolve: 30.0.5 + jest-config: 30.1.3(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2)) + jest-resolve: 30.1.3 jest-util: 30.0.5 minimatch: 9.0.3 picocolors: 1.1.1 @@ -5716,21 +6014,21 @@ snapshots: - typescript - verdaccio - '@nx/js@21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0))': - dependencies: - '@babel/core': 7.28.0 - '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-runtime': 7.28.0(@babel/core@7.28.0) - '@babel/preset-env': 7.28.0(@babel/core@7.28.0) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0) - '@babel/runtime': 7.28.2 - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))) - '@nx/workspace': 21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)) + '@nx/js@21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0))': + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-runtime': 7.28.3(@babel/core@7.28.4) + '@babel/preset-env': 7.28.3(@babel/core@7.28.4) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/runtime': 7.28.4 + '@nx/devkit': 21.4.1(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))) + '@nx/workspace': 21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)) '@zkochan/js-yaml': 0.0.7 - babel-plugin-const-enum: 1.2.0(@babel/core@7.28.0) + babel-plugin-const-enum: 1.2.0(@babel/core@7.28.4) babel-plugin-macros: 3.1.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.28.0)(@babel/traverse@7.28.0) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.28.4)(@babel/traverse@7.28.4) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.6.1 @@ -5757,12 +6055,13 @@ snapshots: - nx - supports-color - '@nx/node@21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.32.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3))(typescript@5.8.3)(verdaccio@6.1.6(typanion@3.14.0))': + '@nx/node@21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.35.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2))(typescript@5.9.2)(verdaccio@6.1.6(typanion@3.14.0))': dependencies: - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))) - '@nx/eslint': 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.32.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) - '@nx/jest': 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3))(typescript@5.8.3)(verdaccio@6.1.6(typanion@3.14.0)) - '@nx/js': 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) + '@nx/devkit': 21.4.1(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))) + '@nx/docker': 21.4.1(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))) + '@nx/eslint': 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.35.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) + '@nx/jest': 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2))(typescript@5.9.2)(verdaccio@6.1.6(typanion@3.14.0)) + '@nx/js': 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) kill-port: 1.6.1 tcp-port-used: 1.0.2 tslib: 2.8.1 @@ -5783,42 +6082,42 @@ snapshots: - typescript - verdaccio - '@nx/nx-darwin-arm64@21.3.11': + '@nx/nx-darwin-arm64@21.4.1': optional: true - '@nx/nx-darwin-x64@21.3.11': + '@nx/nx-darwin-x64@21.4.1': optional: true - '@nx/nx-freebsd-x64@21.3.11': + '@nx/nx-freebsd-x64@21.4.1': optional: true - '@nx/nx-linux-arm-gnueabihf@21.3.11': + '@nx/nx-linux-arm-gnueabihf@21.4.1': optional: true - '@nx/nx-linux-arm64-gnu@21.3.11': + '@nx/nx-linux-arm64-gnu@21.4.1': optional: true - '@nx/nx-linux-arm64-musl@21.3.11': + '@nx/nx-linux-arm64-musl@21.4.1': optional: true - '@nx/nx-linux-x64-gnu@21.3.11': + '@nx/nx-linux-x64-gnu@21.4.1': optional: true - '@nx/nx-linux-x64-musl@21.3.11': + '@nx/nx-linux-x64-musl@21.4.1': optional: true - '@nx/nx-win32-arm64-msvc@21.3.11': + '@nx/nx-win32-arm64-msvc@21.4.1': optional: true - '@nx/nx-win32-x64-msvc@21.3.11': + '@nx/nx-win32-x64-msvc@21.4.1': optional: true - '@nx/plugin@21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.32.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3))(typescript@5.8.3)(verdaccio@6.1.6(typanion@3.14.0))': + '@nx/plugin@21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.35.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2))(typescript@5.9.2)(verdaccio@6.1.6(typanion@3.14.0))': dependencies: - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))) - '@nx/eslint': 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.32.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) - '@nx/jest': 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3))(typescript@5.8.3)(verdaccio@6.1.6(typanion@3.14.0)) - '@nx/js': 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) + '@nx/devkit': 21.4.1(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))) + '@nx/eslint': 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.35.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) + '@nx/jest': 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2))(typescript@5.9.2)(verdaccio@6.1.6(typanion@3.14.0)) + '@nx/js': 21.4.1(@babel/traverse@7.28.4)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) tslib: 2.8.1 transitivePeerDependencies: - '@babel/traverse' @@ -5837,14 +6136,15 @@ snapshots: - typescript - verdaccio - '@nx/workspace@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))': + '@nx/workspace@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))': dependencies: - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17))) + '@nx/devkit': 21.4.1(nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))) '@zkochan/js-yaml': 0.0.7 chalk: 4.1.2 enquirer: 2.3.6 - nx: 21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)) + nx: 21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)) picomatch: 4.0.2 + semver: 7.7.2 tslib: 2.8.1 yargs-parser: 21.1.1 transitivePeerDependencies: @@ -5852,17 +6152,17 @@ snapshots: - '@swc/core' - debug - '@phenomnomnominal/tsquery@5.0.1(typescript@5.8.3)': + '@phenomnomnominal/tsquery@5.0.1(typescript@5.9.2)': dependencies: esquery: 1.6.0 - typescript: 5.8.3 + typescript: 5.9.2 '@pkgjs/parseargs@0.11.0': optional: true '@pkgr/core@0.2.9': {} - '@sinclair/typebox@0.34.38': {} + '@sinclair/typebox@0.34.41': {} '@sindresorhus/is@5.6.0': {} @@ -5874,21 +6174,21 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@swc-node/core@1.13.3(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)': + '@swc-node/core@1.14.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)': dependencies: '@swc/core': 1.5.29(@swc/helpers@0.5.17) '@swc/types': 0.1.24 - '@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3)': + '@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2)': dependencies: - '@swc-node/core': 1.13.3(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24) + '@swc-node/core': 1.14.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24) '@swc-node/sourcemap-support': 0.5.1 '@swc/core': 1.5.29(@swc/helpers@0.5.17) colorette: 2.0.20 debug: 4.4.1 pirates: 4.0.7 tslib: 2.8.1 - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - '@swc/types' - supports-color @@ -5971,7 +6271,7 @@ snapshots: '@jest/create-cache-key-function': 30.0.5 '@swc/core': 1.5.29(@swc/helpers@0.5.17) '@swc/counter': 0.1.3 - jsonc-parser: 3.2.0 + jsonc-parser: 3.3.1 '@swc/types@0.1.24': dependencies: @@ -5985,7 +6285,7 @@ snapshots: dependencies: debug: 4.4.1 fflate: 0.8.2 - token-types: 6.0.4 + token-types: 6.1.1 transitivePeerDependencies: - supports-color @@ -6010,24 +6310,30 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 + + '@types/bun@1.2.20(@types/react@19.1.12)': + dependencies: + bun-types: 1.2.20(@types/react@19.1.12) + transitivePeerDependencies: + - '@types/react' '@types/estree@1.0.8': {} @@ -6045,7 +6351,7 @@ snapshots: '@types/jest@30.0.0': dependencies: - expect: 30.0.5 + expect: 30.1.2 pretty-format: 30.0.5 '@types/jsdom@21.1.7': @@ -6060,6 +6366,10 @@ snapshots: '@types/parse-json@4.0.2': {} + '@types/react@19.1.12': + dependencies: + csstype: 3.1.3 + '@types/stack-utils@2.0.3': {} '@types/tough-cookie@4.0.5': {} @@ -6070,97 +6380,97 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.8.3))(eslint@9.32.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.42.0(@typescript-eslint/parser@8.42.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.39.0(eslint@9.32.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.39.0 - '@typescript-eslint/type-utils': 8.39.0(eslint@9.32.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.39.0 - eslint: 9.32.0 + '@typescript-eslint/parser': 8.42.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.42.0 + '@typescript-eslint/type-utils': 8.42.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/utils': 8.42.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.42.0 + eslint: 9.35.0 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.8.3)': + '@typescript-eslint/parser@8.42.0(eslint@9.35.0)(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.39.0 - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.39.0 + '@typescript-eslint/scope-manager': 8.42.0 + '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.42.0 debug: 4.4.1 - eslint: 9.32.0 - typescript: 5.8.3 + eslint: 9.35.0 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.39.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.42.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.8.3) - '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/tsconfig-utils': 8.42.0(typescript@5.9.2) + '@typescript-eslint/types': 8.42.0 debug: 4.4.1 - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.39.0': + '@typescript-eslint/scope-manager@8.42.0': dependencies: - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/visitor-keys': 8.39.0 + '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/visitor-keys': 8.42.0 - '@typescript-eslint/tsconfig-utils@8.39.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.42.0(typescript@5.9.2)': dependencies: - typescript: 5.8.3 + typescript: 5.9.2 - '@typescript-eslint/type-utils@8.39.0(eslint@9.32.0)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.42.0(eslint@9.35.0)(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0)(typescript@5.8.3) + '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.42.0(eslint@9.35.0)(typescript@5.9.2) debug: 4.4.1 - eslint: 9.32.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + eslint: 9.35.0 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.39.0': {} + '@typescript-eslint/types@8.42.0': {} - '@typescript-eslint/typescript-estree@8.39.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.42.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.39.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.8.3) - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/visitor-keys': 8.39.0 + '@typescript-eslint/project-service': 8.42.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.42.0(typescript@5.9.2) + '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/visitor-keys': 8.42.0 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.39.0(eslint@9.32.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.42.0(eslint@9.35.0)(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0) - '@typescript-eslint/scope-manager': 8.39.0 - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.8.3) - eslint: 9.32.0 - typescript: 5.8.3 + '@eslint-community/eslint-utils': 4.8.0(eslint@9.35.0) + '@typescript-eslint/scope-manager': 8.42.0 + '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.9.2) + eslint: 9.35.0 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.39.0': + '@typescript-eslint/visitor-keys@8.42.0': dependencies: - '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/types': 8.42.0 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} @@ -6506,7 +6816,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 + fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -6518,7 +6828,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.0: {} ansi-styles@4.3.0: dependencies: @@ -6575,29 +6885,29 @@ snapshots: b4a@1.6.7: {} - babel-jest@30.0.5(@babel/core@7.28.0): + babel-jest@30.1.2(@babel/core@7.28.4): dependencies: - '@babel/core': 7.28.0 - '@jest/transform': 30.0.5 + '@babel/core': 7.28.4 + '@jest/transform': 30.1.2 '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 7.0.0 - babel-preset-jest: 30.0.1(@babel/core@7.28.0) + babel-plugin-istanbul: 7.0.1 + babel-preset-jest: 30.0.1(@babel/core@7.28.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - babel-plugin-const-enum@1.2.0(@babel/core@7.28.0): + babel-plugin-const-enum@1.2.0(@babel/core@7.28.4): dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - babel-plugin-istanbul@7.0.0: + babel-plugin-istanbul@7.0.1: dependencies: '@babel/helper-plugin-utils': 7.27.1 '@istanbuljs/load-nyc-config': 1.1.0 @@ -6610,74 +6920,74 @@ snapshots: babel-plugin-jest-hoist@30.0.1: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 '@types/babel__core': 7.20.5 babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 cosmiconfig: 7.1.0 resolve: 1.22.10 - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.0): + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.4): dependencies: - '@babel/compat-data': 7.28.0 - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + '@babel/compat-data': 7.28.4 + '@babel/core': 7.28.4 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.0): + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.4): dependencies: - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) - core-js-compat: 3.45.0 + '@babel/core': 7.28.4 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4) + core-js-compat: 3.45.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.0): + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.4): dependencies: - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + '@babel/core': 7.28.4 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4) transitivePeerDependencies: - supports-color - babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.28.0)(@babel/traverse@7.28.0): + babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.28.4)(@babel/traverse@7.28.4): dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optionalDependencies: - '@babel/traverse': 7.28.0 - - babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) - - babel-preset-jest@30.0.1(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 + '@babel/traverse': 7.28.4 + + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.4) + + babel-preset-jest@30.0.1(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 babel-plugin-jest-hoist: 30.0.1 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) balanced-match@1.0.2: {} - bare-events@2.6.0: + bare-events@2.6.1: optional: true base64-js@1.5.1: {} @@ -6739,12 +7049,12 @@ snapshots: dependencies: pako: 0.2.9 - browserslist@4.25.1: + browserslist@4.25.4: dependencies: - caniuse-lite: 1.0.30001731 - electron-to-chromium: 1.5.197 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.1) + caniuse-lite: 1.0.30001741 + electron-to-chromium: 1.5.214 + node-releases: 2.0.20 + update-browserslist-db: 1.1.3(browserslist@4.25.4) bs-logger@0.2.6: dependencies: @@ -6770,6 +7080,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bun-types@1.2.20(@types/react@19.1.12): + dependencies: + '@types/node': 18.16.9 + '@types/react': 19.1.12 + bytes@3.1.2: {} cacheable-lookup@7.0.0: {} @@ -6800,7 +7115,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001731: {} + caniuse-lite@1.0.30001741: {} caseless@0.12.0: {} @@ -6843,6 +7158,10 @@ snapshots: clone@1.0.4: {} + cmrd@0.0.1(typescript@5.9.2): + optionalDependencies: + typescript: 5.9.2 + co@4.6.0: {} collect-v8-coverage@1.0.2: {} @@ -6870,7 +7189,7 @@ snapshots: compressible@2.0.18: dependencies: - mime-db: 1.52.0 + mime-db: 1.54.0 compression@1.8.1: dependencies: @@ -6900,9 +7219,9 @@ snapshots: cookie@0.7.1: {} - core-js-compat@3.45.0: + core-js-compat@3.45.1: dependencies: - browserslist: 4.25.1 + browserslist: 4.25.4 core-util-is@1.0.2: {} @@ -6934,6 +7253,8 @@ snapshots: '@asamuzakjp/css-color': 3.2.0 rrweb-cssom: 0.8.0 + csstype@3.1.3: {} + cz-git@1.12.0: {} czg@1.12.0: {} @@ -6971,7 +7292,7 @@ snapshots: dependencies: mimic-response: 3.1.0 - dedent@1.6.0(babel-plugin-macros@3.1.0): + dedent@1.7.0(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 @@ -7042,11 +7363,11 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.197: {} + electron-to-chromium@1.5.214: {} emittery@0.13.1: {} - emoji-regex@10.4.0: {} + emoji-regex@10.5.0: {} emoji-regex@8.0.0: {} @@ -7087,6 +7408,32 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -7097,9 +7444,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@9.32.0): + eslint-config-prettier@10.1.8(eslint@9.35.0): dependencies: - eslint: 9.32.0 + eslint: 9.35.0 eslint-scope@8.4.0: dependencies: @@ -7110,17 +7457,17 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.32.0: + eslint@9.35.0: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0) + '@eslint-community/eslint-utils': 4.8.0(eslint@9.35.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.0 - '@eslint/core': 0.15.1 + '@eslint/config-helpers': 0.3.1 + '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.32.0 - '@eslint/plugin-kit': 0.3.4 - '@humanfs/node': 0.16.6 + '@eslint/js': 9.35.0 + '@eslint/plugin-kit': 0.3.5 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 @@ -7196,12 +7543,12 @@ snapshots: exit-x@0.2.2: {} - expect@30.0.5: + expect@30.1.2: dependencies: - '@jest/expect-utils': 30.0.5 - '@jest/get-type': 30.0.1 - jest-matcher-utils: 30.0.5 - jest-message-util: 30.0.5 + '@jest/expect-utils': 30.1.2 + '@jest/get-type': 30.1.0 + jest-matcher-utils: 30.1.2 + jest-message-util: 30.1.0 jest-mock: 30.0.5 jest-util: 30.0.5 @@ -7245,7 +7592,7 @@ snapshots: ext-list@2.2.2: dependencies: - mime-db: 1.52.0 + mime-db: 1.54.0 ext-name@5.0.0: dependencies: @@ -7274,7 +7621,7 @@ snapshots: fast-redact@3.5.0: {} - fast-uri@3.0.6: {} + fast-uri@3.1.0: {} fastq@1.19.1: dependencies: @@ -7284,7 +7631,7 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.4.6(picomatch@4.0.2): + fdir@6.5.0(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -7302,8 +7649,8 @@ snapshots: dependencies: '@tokenizer/inflate': 0.2.7 strtok3: 10.3.4 - token-types: 6.0.4 - uint8array-extras: 1.4.0 + token-types: 6.1.1 + uint8array-extras: 1.5.0 transitivePeerDependencies: - supports-color @@ -7396,7 +7743,7 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.3.0: {} + get-east-asian-width@1.3.1: {} get-intrinsic@1.3.0: dependencies: @@ -7677,8 +8024,8 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.2 @@ -7693,13 +8040,13 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.30 debug: 4.4.1 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -7722,22 +8069,22 @@ snapshots: jest-util: 30.0.5 p-limit: 3.1.0 - jest-circus@30.0.5(babel-plugin-macros@3.1.0): + jest-circus@30.1.3(babel-plugin-macros@3.1.0): dependencies: - '@jest/environment': 30.0.5 - '@jest/expect': 30.0.5 - '@jest/test-result': 30.0.5 + '@jest/environment': 30.1.2 + '@jest/expect': 30.1.2 + '@jest/test-result': 30.1.3 '@jest/types': 30.0.5 '@types/node': 18.16.9 chalk: 4.1.2 co: 4.6.0 - dedent: 1.6.0(babel-plugin-macros@3.1.0) + dedent: 1.7.0(babel-plugin-macros@3.1.0) is-generator-fn: 2.1.0 - jest-each: 30.0.5 - jest-matcher-utils: 30.0.5 - jest-message-util: 30.0.5 - jest-runtime: 30.0.5 - jest-snapshot: 30.0.5 + jest-each: 30.1.0 + jest-matcher-utils: 30.1.2 + jest-message-util: 30.1.0 + jest-runtime: 30.1.3 + jest-snapshot: 30.1.2 jest-util: 30.0.5 p-limit: 3.1.0 pretty-format: 30.0.5 @@ -7748,17 +8095,17 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.0.5(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3)): + jest-cli@30.1.3(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2)): dependencies: - '@jest/core': 30.0.5(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3)) - '@jest/test-result': 30.0.5 + '@jest/core': 30.1.3(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2)) + '@jest/test-result': 30.1.3 '@jest/types': 30.0.5 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.0.5(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3)) + jest-config: 30.1.3(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2)) jest-util: 30.0.5 - jest-validate: 30.0.5 + jest-validate: 30.1.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -7767,27 +8114,27 @@ snapshots: - supports-color - ts-node - jest-config@30.0.5(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3)): + jest-config@30.1.3(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2)): dependencies: - '@babel/core': 7.28.0 - '@jest/get-type': 30.0.1 + '@babel/core': 7.28.4 + '@jest/get-type': 30.1.0 '@jest/pattern': 30.0.1 - '@jest/test-sequencer': 30.0.5 + '@jest/test-sequencer': 30.1.3 '@jest/types': 30.0.5 - babel-jest: 30.0.5(@babel/core@7.28.0) + babel-jest: 30.1.2(@babel/core@7.28.4) chalk: 4.1.2 ci-info: 4.3.0 deepmerge: 4.3.1 glob: 10.4.5 graceful-fs: 4.2.11 - jest-circus: 30.0.5(babel-plugin-macros@3.1.0) + jest-circus: 30.1.3(babel-plugin-macros@3.1.0) jest-docblock: 30.0.1 - jest-environment-node: 30.0.5 + jest-environment-node: 30.1.2 jest-regex-util: 30.0.1 - jest-resolve: 30.0.5 - jest-runner: 30.0.5 + jest-resolve: 30.1.3 + jest-runner: 30.1.3 jest-util: 30.0.5 - jest-validate: 30.0.5 + jest-validate: 30.1.0 micromatch: 4.0.8 parse-json: 5.2.0 pretty-format: 30.0.5 @@ -7795,15 +8142,15 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.16.9 - ts-node: 10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3) + ts-node: 10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-diff@30.0.5: + jest-diff@30.1.2: dependencies: '@jest/diff-sequences': 30.0.1 - '@jest/get-type': 30.0.1 + '@jest/get-type': 30.1.0 chalk: 4.1.2 pretty-format: 30.0.5 @@ -7811,18 +8158,18 @@ snapshots: dependencies: detect-newline: 3.1.0 - jest-each@30.0.5: + jest-each@30.1.0: dependencies: - '@jest/get-type': 30.0.1 + '@jest/get-type': 30.1.0 '@jest/types': 30.0.5 chalk: 4.1.2 jest-util: 30.0.5 pretty-format: 30.0.5 - jest-environment-jsdom@30.0.5: + jest-environment-jsdom@30.1.2: dependencies: - '@jest/environment': 30.0.5 - '@jest/environment-jsdom-abstract': 30.0.5(jsdom@26.1.0) + '@jest/environment': 30.1.2 + '@jest/environment-jsdom-abstract': 30.1.2(jsdom@26.1.0) '@types/jsdom': 21.1.7 '@types/node': 18.16.9 jsdom: 26.1.0 @@ -7831,17 +8178,17 @@ snapshots: - supports-color - utf-8-validate - jest-environment-node@30.0.5: + jest-environment-node@30.1.2: dependencies: - '@jest/environment': 30.0.5 - '@jest/fake-timers': 30.0.5 + '@jest/environment': 30.1.2 + '@jest/fake-timers': 30.1.2 '@jest/types': 30.0.5 '@types/node': 18.16.9 jest-mock: 30.0.5 jest-util: 30.0.5 - jest-validate: 30.0.5 + jest-validate: 30.1.0 - jest-haste-map@30.0.5: + jest-haste-map@30.1.0: dependencies: '@jest/types': 30.0.5 '@types/node': 18.16.9 @@ -7850,25 +8197,25 @@ snapshots: graceful-fs: 4.2.11 jest-regex-util: 30.0.1 jest-util: 30.0.5 - jest-worker: 30.0.5 + jest-worker: 30.1.0 micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - jest-leak-detector@30.0.5: + jest-leak-detector@30.1.0: dependencies: - '@jest/get-type': 30.0.1 + '@jest/get-type': 30.1.0 pretty-format: 30.0.5 - jest-matcher-utils@30.0.5: + jest-matcher-utils@30.1.2: dependencies: - '@jest/get-type': 30.0.1 + '@jest/get-type': 30.1.0 chalk: 4.1.2 - jest-diff: 30.0.5 + jest-diff: 30.1.2 pretty-format: 30.0.5 - jest-message-util@30.0.5: + jest-message-util@30.1.0: dependencies: '@babel/code-frame': 7.27.1 '@jest/types': 30.0.5 @@ -7886,36 +8233,36 @@ snapshots: '@types/node': 18.16.9 jest-util: 30.0.5 - jest-pnp-resolver@1.2.3(jest-resolve@30.0.5): + jest-pnp-resolver@1.2.3(jest-resolve@30.1.3): optionalDependencies: - jest-resolve: 30.0.5 + jest-resolve: 30.1.3 jest-regex-util@30.0.1: {} - jest-resolve-dependencies@30.0.5: + jest-resolve-dependencies@30.1.3: dependencies: jest-regex-util: 30.0.1 - jest-snapshot: 30.0.5 + jest-snapshot: 30.1.2 transitivePeerDependencies: - supports-color - jest-resolve@30.0.5: + jest-resolve@30.1.3: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 30.0.5 - jest-pnp-resolver: 1.2.3(jest-resolve@30.0.5) + jest-haste-map: 30.1.0 + jest-pnp-resolver: 1.2.3(jest-resolve@30.1.3) jest-util: 30.0.5 - jest-validate: 30.0.5 + jest-validate: 30.1.0 slash: 3.0.0 unrs-resolver: 1.11.1 - jest-runner@30.0.5: + jest-runner@30.1.3: dependencies: - '@jest/console': 30.0.5 - '@jest/environment': 30.0.5 - '@jest/test-result': 30.0.5 - '@jest/transform': 30.0.5 + '@jest/console': 30.1.2 + '@jest/environment': 30.1.2 + '@jest/test-result': 30.1.3 + '@jest/transform': 30.1.2 '@jest/types': 30.0.5 '@types/node': 18.16.9 chalk: 4.1.2 @@ -7923,28 +8270,28 @@ snapshots: exit-x: 0.2.2 graceful-fs: 4.2.11 jest-docblock: 30.0.1 - jest-environment-node: 30.0.5 - jest-haste-map: 30.0.5 - jest-leak-detector: 30.0.5 - jest-message-util: 30.0.5 - jest-resolve: 30.0.5 - jest-runtime: 30.0.5 + jest-environment-node: 30.1.2 + jest-haste-map: 30.1.0 + jest-leak-detector: 30.1.0 + jest-message-util: 30.1.0 + jest-resolve: 30.1.3 + jest-runtime: 30.1.3 jest-util: 30.0.5 - jest-watcher: 30.0.5 - jest-worker: 30.0.5 + jest-watcher: 30.1.3 + jest-worker: 30.1.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - jest-runtime@30.0.5: + jest-runtime@30.1.3: dependencies: - '@jest/environment': 30.0.5 - '@jest/fake-timers': 30.0.5 - '@jest/globals': 30.0.5 + '@jest/environment': 30.1.2 + '@jest/fake-timers': 30.1.2 + '@jest/globals': 30.1.2 '@jest/source-map': 30.0.1 - '@jest/test-result': 30.0.5 - '@jest/transform': 30.0.5 + '@jest/test-result': 30.1.3 + '@jest/transform': 30.1.2 '@jest/types': 30.0.5 '@types/node': 18.16.9 chalk: 4.1.2 @@ -7952,37 +8299,37 @@ snapshots: collect-v8-coverage: 1.0.2 glob: 10.4.5 graceful-fs: 4.2.11 - jest-haste-map: 30.0.5 - jest-message-util: 30.0.5 + jest-haste-map: 30.1.0 + jest-message-util: 30.1.0 jest-mock: 30.0.5 jest-regex-util: 30.0.1 - jest-resolve: 30.0.5 - jest-snapshot: 30.0.5 + jest-resolve: 30.1.3 + jest-snapshot: 30.1.2 jest-util: 30.0.5 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-snapshot@30.0.5: - dependencies: - '@babel/core': 7.28.0 - '@babel/generator': 7.28.0 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) - '@babel/types': 7.28.2 - '@jest/expect-utils': 30.0.5 - '@jest/get-type': 30.0.1 - '@jest/snapshot-utils': 30.0.5 - '@jest/transform': 30.0.5 + jest-snapshot@30.1.2: + dependencies: + '@babel/core': 7.28.4 + '@babel/generator': 7.28.3 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/types': 7.28.4 + '@jest/expect-utils': 30.1.2 + '@jest/get-type': 30.1.0 + '@jest/snapshot-utils': 30.1.2 + '@jest/transform': 30.1.2 '@jest/types': 30.0.5 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) chalk: 4.1.2 - expect: 30.0.5 + expect: 30.1.2 graceful-fs: 4.2.11 - jest-diff: 30.0.5 - jest-matcher-utils: 30.0.5 - jest-message-util: 30.0.5 + jest-diff: 30.1.2 + jest-matcher-utils: 30.1.2 + jest-message-util: 30.1.0 jest-util: 30.0.5 pretty-format: 30.0.5 semver: 7.7.2 @@ -7999,18 +8346,18 @@ snapshots: graceful-fs: 4.2.11 picomatch: 4.0.3 - jest-validate@30.0.5: + jest-validate@30.1.0: dependencies: - '@jest/get-type': 30.0.1 + '@jest/get-type': 30.1.0 '@jest/types': 30.0.5 camelcase: 6.3.0 chalk: 4.1.2 leven: 3.1.0 pretty-format: 30.0.5 - jest-watcher@30.0.5: + jest-watcher@30.1.3: dependencies: - '@jest/test-result': 30.0.5 + '@jest/test-result': 30.1.3 '@jest/types': 30.0.5 '@types/node': 18.16.9 ansi-escapes: 4.3.2 @@ -8019,7 +8366,7 @@ snapshots: jest-util: 30.0.5 string-length: 4.0.2 - jest-worker@30.0.5: + jest-worker@30.1.0: dependencies: '@types/node': 18.16.9 '@ungap/structured-clone': 1.3.0 @@ -8027,12 +8374,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.0.5(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3)): + jest@30.1.3(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2)): dependencies: - '@jest/core': 30.0.5(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3)) + '@jest/core': 30.1.3(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2)) '@jest/types': 30.0.5 import-local: 3.2.0 - jest-cli: 30.0.5(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3)) + jest-cli: 30.1.3(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -8062,7 +8409,7 @@ snapshots: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.21 + nwsapi: 2.2.22 parse5: 7.3.0 rrweb-cssom: 0.8.0 saxes: 6.0.0 @@ -8109,6 +8456,8 @@ snapshots: jsonc-parser@3.2.0: {} + jsonc-parser@3.3.1: {} + jsonparse@1.3.1: {} jsonwebtoken@9.0.2: @@ -8250,6 +8599,8 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 @@ -8304,7 +8655,7 @@ snapshots: ms@2.1.3: {} - napi-postinstall@0.3.2: {} + napi-postinstall@0.3.3: {} natural-compare@1.4.0: {} @@ -8322,7 +8673,7 @@ snapshots: node-machine-id@1.1.12: {} - node-releases@2.0.19: {} + node-releases@2.0.20: {} normalize-path@3.0.0: {} @@ -8339,9 +8690,9 @@ snapshots: dependencies: path-key: 3.1.1 - nwsapi@2.2.21: {} + nwsapi@2.2.22: {} - nx@21.3.11(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3))(@swc/core@1.5.29(@swc/helpers@0.5.17)): + nx@21.4.1(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)): dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 @@ -8359,7 +8710,7 @@ snapshots: flat: 5.0.2 front-matter: 4.0.2 ignore: 5.3.2 - jest-diff: 30.0.5 + jest-diff: 30.1.2 jsonc-parser: 3.2.0 lines-and-columns: 2.0.3 minimatch: 9.0.3 @@ -8371,7 +8722,7 @@ snapshots: semver: 7.7.2 string-width: 4.2.3 tar-stream: 2.2.0 - tmp: 0.2.4 + tmp: 0.2.5 tree-kill: 1.2.2 tsconfig-paths: 4.2.0 tslib: 2.8.1 @@ -8379,17 +8730,17 @@ snapshots: yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 21.3.11 - '@nx/nx-darwin-x64': 21.3.11 - '@nx/nx-freebsd-x64': 21.3.11 - '@nx/nx-linux-arm-gnueabihf': 21.3.11 - '@nx/nx-linux-arm64-gnu': 21.3.11 - '@nx/nx-linux-arm64-musl': 21.3.11 - '@nx/nx-linux-x64-gnu': 21.3.11 - '@nx/nx-linux-x64-musl': 21.3.11 - '@nx/nx-win32-arm64-msvc': 21.3.11 - '@nx/nx-win32-x64-msvc': 21.3.11 - '@swc-node/register': 1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.8.3) + '@nx/nx-darwin-arm64': 21.4.1 + '@nx/nx-darwin-x64': 21.4.1 + '@nx/nx-freebsd-x64': 21.4.1 + '@nx/nx-linux-arm-gnueabihf': 21.4.1 + '@nx/nx-linux-arm64-gnu': 21.4.1 + '@nx/nx-linux-arm64-musl': 21.4.1 + '@nx/nx-linux-x64-gnu': 21.4.1 + '@nx/nx-linux-x64-musl': 21.4.1 + '@nx/nx-win32-arm64-msvc': 21.4.1 + '@nx/nx-win32-x64-msvc': 21.4.1 + '@swc-node/register': 1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.2) '@swc/core': 1.5.29(@swc/helpers@0.5.17) transitivePeerDependencies: - debug @@ -8547,7 +8898,7 @@ snapshots: piscina@4.9.2: optionalDependencies: - '@napi-rs/nice': 1.0.4 + '@napi-rs/nice': 1.1.1 pkg-dir@4.2.0: dependencies: @@ -8884,7 +9235,7 @@ snapshots: fast-fifo: 1.3.2 text-decoder: 1.2.3 optionalDependencies: - bare-events: 2.6.0 + bare-events: 2.6.1 string-length@4.0.2: dependencies: @@ -8905,8 +9256,8 @@ snapshots: string-width@7.2.0: dependencies: - emoji-regex: 10.4.0 - get-east-asian-width: 1.3.0 + emoji-regex: 10.5.0 + get-east-asian-width: 1.3.1 strip-ansi: 7.1.0 string_decoder@1.1.1: @@ -8923,7 +9274,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.0 strip-bom@3.0.0: {} @@ -9004,7 +9355,7 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.6(picomatch@4.0.2) + fdir: 6.5.0(picomatch@4.0.2) picomatch: 4.0.2 tldts-core@6.1.86: {} @@ -9013,7 +9364,7 @@ snapshots: dependencies: tldts-core: 6.1.86 - tmp@0.2.4: {} + tmp@0.2.5: {} tmpl@1.0.5: {} @@ -9023,8 +9374,9 @@ snapshots: toidentifier@1.0.1: {} - token-types@6.0.4: + token-types@6.1.1: dependencies: + '@borewit/text-codec': 0.1.1 '@tokenizer/token': 0.3.0 ieee754: 1.2.1 @@ -9040,31 +9392,32 @@ snapshots: tree-kill@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.1.0(typescript@5.9.2): dependencies: - typescript: 5.8.3 + typescript: 5.9.2 - ts-jest@29.4.1(@babel/core@7.28.0)(@jest/transform@30.0.5)(@jest/types@30.0.5)(babel-jest@30.0.5(@babel/core@7.28.0))(jest-util@30.0.5)(jest@30.0.5(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.4.1(@babel/core@7.28.4)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.4))(esbuild@0.19.12)(jest-util@30.0.5)(jest@30.1.3(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2)))(typescript@5.9.2): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.8 - jest: 30.0.5(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3)) + jest: 30.1.3(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.7.2 type-fest: 4.41.0 - typescript: 5.8.3 + typescript: 5.9.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.28.0 - '@jest/transform': 30.0.5 + '@babel/core': 7.28.4 + '@jest/transform': 30.1.2 '@jest/types': 30.0.5 - babel-jest: 30.0.5(@babel/core@7.28.0) + babel-jest: 30.1.2(@babel/core@7.28.4) + esbuild: 0.19.12 jest-util: 30.0.5 - ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.8.3): + ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.17))(@types/node@18.16.9)(typescript@5.9.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -9078,7 +9431,7 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.8.3 + typescript: 5.9.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: @@ -9115,23 +9468,25 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typescript-eslint@8.39.0(eslint@9.32.0)(typescript@5.8.3): + typescript-eslint@8.42.0(eslint@9.35.0)(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.8.3))(eslint@9.32.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.39.0(eslint@9.32.0)(typescript@5.8.3) - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0)(typescript@5.8.3) - eslint: 9.32.0 - typescript: 5.8.3 + '@typescript-eslint/eslint-plugin': 8.42.0(@typescript-eslint/parser@8.42.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.42.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.42.0(eslint@9.35.0)(typescript@5.9.2) + eslint: 9.35.0 + typescript: 5.9.2 transitivePeerDependencies: - supports-color typescript@5.8.3: {} + typescript@5.9.2: {} + uglify-js@3.19.3: optional: true - uint8array-extras@1.4.0: {} + uint8array-extras@1.5.0: {} unbzip2-stream@1.4.3: dependencies: @@ -9155,7 +9510,7 @@ snapshots: unrs-resolver@1.11.1: dependencies: - napi-postinstall: 0.3.2 + napi-postinstall: 0.3.3 optionalDependencies: '@unrs/resolver-binding-android-arm-eabi': 1.11.1 '@unrs/resolver-binding-android-arm64': 1.11.1 @@ -9177,9 +9532,9 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - update-browserslist-db@1.1.3(browserslist@4.25.1): + update-browserslist-db@1.1.3(browserslist@4.25.4): dependencies: - browserslist: 4.25.1 + browserslist: 4.25.4 escalade: 3.2.0 picocolors: 1.1.1 @@ -9197,7 +9552,7 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.30 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 4d69131..37ed1ea 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,7 @@ packages: - 'packages/*' + - 'apps/*' + - 'e2e/bun-e2e' + - 'e2e/bun' onlyBuiltDependencies: - 'nx' diff --git a/project.json b/project.json index e7bfefc..ee30d1a 100644 --- a/project.json +++ b/project.json @@ -4,6 +4,7 @@ "targets": { "local-registry": { "executor": "@nx/js:verdaccio", + "continuous": true, "options": { "port": 4873, "config": ".verdaccio/config.yml", @@ -11,6 +12,24 @@ "clear": false } }, + "release-local": { + "cache": true, + "inputs": [ + { + "input": "production", + "projects": ["tag:npm:public"] + }, + "{workspaceRoot}/tools/scripts/release-local.mjs" + ], + "dependsOn": [ + { + "target": "build", + "projects": ["tag:npm:public"] + } + ], + "command": "node ./tools/scripts/release-local.mjs", + "outputs": ["{workspaceRoot}/dist/local-registry/storage"] + }, "check-format:quick": { "parallelism": false }, diff --git a/tools/scripts/release-local.mjs b/tools/scripts/release-local.mjs new file mode 100644 index 0000000..2354ec7 --- /dev/null +++ b/tools/scripts/release-local.mjs @@ -0,0 +1,36 @@ +import { rmSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { releasePublish, releaseVersion } from 'nx/release/index.js'; + +(async () => { + console.log('=======> START'); + const __filename = fileURLToPath(import.meta.url); + const __dirname = dirname(__filename); + console.log('=======> 2', __dirname); + + rmSync(join(__dirname, '../../dist/local-registry/storage'), { + recursive: true, + force: true + }); + console.log('=======> REMOVED'); + + await releaseVersion({ + specifier: '0.0.0-e2e', + stageChanges: false, + gitCommit: false, + gitTag: false, + firstRelease: true, + versionActionsOptionsOverrides: { + skipLockFileUpdate: true + } + }); + console.log('=======> VERSION'); + await releasePublish({ + tag: 'e2e', + firstRelease: true + }); + console.log('=======> PUBLISH'); + + process.exit(0); +})(); diff --git a/tools/scripts/tsconfig.release.json b/tools/scripts/tsconfig.release.json new file mode 100644 index 0000000..d2d5db5 --- /dev/null +++ b/tools/scripts/tsconfig.release.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "../scripts/tools-out", + "module": "commonjs", + "types": ["node"] + }, + "include": ["**/*.ts"] +} diff --git a/tsconfig.base.json b/tsconfig.base.json index 8084832..df0bfee 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -4,8 +4,7 @@ "declarationMap": true, "emitDeclarationOnly": true, "importHelpers": true, - "isolatedModules": true, - "lib": ["es2022"], + "lib": ["es2022", "esnext"], "module": "nodenext", "moduleResolution": "nodenext", "noEmitOnError": true, diff --git a/tsconfig.json b/tsconfig.json index b665115..df28ab5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,6 +8,12 @@ }, { "path": "./e2e/elysia" + }, + { + "path": "./packages/bun" + }, + { + "path": "./e2e/bun-e2e" } ] }