From 0851d24f91ae0c15e7038dc7a81ea5bd84e498f4 Mon Sep 17 00:00:00 2001 From: Boris Polak <18208654+BorisTB@users.noreply.github.com> Date: Mon, 18 Aug 2025 21:43:14 +0200 Subject: [PATCH 01/12] feat(bun): introduce Nx plugin for Bun with build/run executors and app/init generators - Add new @stonx/bun package (Nx plugin) with: - Bun build executor (native Bun.build in Bun, CLI fallback in Node) and run executor (watch/restart, waitUntilTargets, SIG handling) - Application generator (optional Elysia framework integration), project setup, targets, proxy support, tsconfig updates, and files - Init generator to ensure workspace dependencies (@types/bun, plugin) and formatting - Provide shared utilities (Bun/CLI detection, spawn wrappers, dependency versions) - Configure package metadata, Jest, tsconfigs, eslint, generators/executors manifests, and project.json - Update workspace configs: root tsconfig refs, nx.json preVersionCommand, add @types/bun devDependency, lockfile entries - Minor Prettier cleanup (remove deprecated jsxBracketSameLine) Enables creating and running Bun apps within Nx with first-class build and serve workflows. --- .prettierrc | 1 - nx.json | 2 +- package.json | 1 + packages/bun/.spec.swcrc | 22 ++ packages/bun/README.md | 11 + packages/bun/eslint.config.mjs | 34 ++ packages/bun/executors.json | 9 + packages/bun/generators.json | 17 + packages/bun/jest.config.ts | 20 + packages/bun/package.json | 28 ++ packages/bun/project.json | 48 +++ .../bun/src/executors/build/build.spec.ts | 27 ++ packages/bun/src/executors/build/build.ts | 134 +++++++ .../executors/build/lib/get-bun-build-argv.ts | 48 +++ .../build/lib/get-bun-build-config.ts | 33 ++ packages/bun/src/executors/build/schema.d.ts | 30 ++ packages/bun/src/executors/build/schema.json | 163 ++++++++ .../run/lib/calculate-resolve-mappings.ts | 33 ++ .../bun/src/executors/run/lib/debounce.ts | 25 ++ .../run/lib/file-to-run-correct-path.ts | 18 + .../src/executors/run/lib/get-exec-argv.ts | 25 ++ .../src/executors/run/lib/get-file-to-run.ts | 51 +++ .../executors/run/lib/get-main-file-dir.ts | 11 + .../bun/src/executors/run/lib/kill-tree.ts | 184 +++++++++ .../run/lib/run-wait-until-targets.ts | 24 ++ packages/bun/src/executors/run/run.spec.ts | 27 ++ packages/bun/src/executors/run/run.ts | 366 ++++++++++++++++++ packages/bun/src/executors/run/schema.d.ts | 32 ++ packages/bun/src/executors/run/schema.json | 60 +++ .../application/application.spec.ts | 20 + .../src/generators/application/application.ts | 105 +++++ .../application/files/src/main.ts.template | 10 + .../application/files/tsconfig.app.json | 31 ++ .../application/files/tsconfig.json | 10 + .../application/lib/add-app-files.ts | 27 ++ .../generators/application/lib/add-project.ts | 57 +++ .../generators/application/lib/add-proxy.ts | 68 ++++ .../application/lib/create-targets.ts | 61 +++ .../src/generators/application/lib/index.ts | 6 + .../application/lib/normalize-options.ts | 76 ++++ .../lib/update-ts-config-options.ts | 32 ++ .../src/generators/application/schema.d.ts | 27 ++ .../src/generators/application/schema.json | 121 ++++++ packages/bun/src/generators/init/init.spec.ts | 20 + packages/bun/src/generators/init/init.ts | 23 ++ .../init/lib/ensure-dependencies.ts | 33 ++ packages/bun/src/generators/init/schema.d.ts | 5 + packages/bun/src/generators/init/schema.json | 28 ++ packages/bun/src/index.ts | 2 + packages/bun/src/utils/bun.ts | 15 + packages/bun/src/utils/cli.ts | 124 ++++++ packages/bun/src/utils/dependencies.ts | 17 + packages/bun/src/utils/index.ts | 3 + packages/bun/tsconfig.json | 13 + packages/bun/tsconfig.lib.json | 13 + packages/bun/tsconfig.spec.json | 18 + pnpm-lock.yaml | 43 ++ tsconfig.json | 3 + 58 files changed, 2493 insertions(+), 2 deletions(-) create mode 100644 packages/bun/.spec.swcrc create mode 100644 packages/bun/README.md create mode 100644 packages/bun/eslint.config.mjs create mode 100644 packages/bun/executors.json create mode 100644 packages/bun/generators.json create mode 100644 packages/bun/jest.config.ts create mode 100644 packages/bun/package.json create mode 100644 packages/bun/project.json create mode 100644 packages/bun/src/executors/build/build.spec.ts create mode 100644 packages/bun/src/executors/build/build.ts create mode 100644 packages/bun/src/executors/build/lib/get-bun-build-argv.ts create mode 100644 packages/bun/src/executors/build/lib/get-bun-build-config.ts create mode 100644 packages/bun/src/executors/build/schema.d.ts create mode 100644 packages/bun/src/executors/build/schema.json create mode 100644 packages/bun/src/executors/run/lib/calculate-resolve-mappings.ts create mode 100644 packages/bun/src/executors/run/lib/debounce.ts create mode 100644 packages/bun/src/executors/run/lib/file-to-run-correct-path.ts create mode 100644 packages/bun/src/executors/run/lib/get-exec-argv.ts create mode 100644 packages/bun/src/executors/run/lib/get-file-to-run.ts create mode 100644 packages/bun/src/executors/run/lib/get-main-file-dir.ts create mode 100644 packages/bun/src/executors/run/lib/kill-tree.ts create mode 100644 packages/bun/src/executors/run/lib/run-wait-until-targets.ts create mode 100644 packages/bun/src/executors/run/run.spec.ts create mode 100644 packages/bun/src/executors/run/run.ts create mode 100644 packages/bun/src/executors/run/schema.d.ts create mode 100644 packages/bun/src/executors/run/schema.json create mode 100644 packages/bun/src/generators/application/application.spec.ts create mode 100644 packages/bun/src/generators/application/application.ts create mode 100644 packages/bun/src/generators/application/files/src/main.ts.template create mode 100644 packages/bun/src/generators/application/files/tsconfig.app.json create mode 100644 packages/bun/src/generators/application/files/tsconfig.json create mode 100644 packages/bun/src/generators/application/lib/add-app-files.ts create mode 100644 packages/bun/src/generators/application/lib/add-project.ts create mode 100644 packages/bun/src/generators/application/lib/add-proxy.ts create mode 100644 packages/bun/src/generators/application/lib/create-targets.ts create mode 100644 packages/bun/src/generators/application/lib/index.ts create mode 100644 packages/bun/src/generators/application/lib/normalize-options.ts create mode 100644 packages/bun/src/generators/application/lib/update-ts-config-options.ts create mode 100644 packages/bun/src/generators/application/schema.d.ts create mode 100644 packages/bun/src/generators/application/schema.json create mode 100644 packages/bun/src/generators/init/init.spec.ts create mode 100644 packages/bun/src/generators/init/init.ts create mode 100644 packages/bun/src/generators/init/lib/ensure-dependencies.ts create mode 100644 packages/bun/src/generators/init/schema.d.ts create mode 100644 packages/bun/src/generators/init/schema.json create mode 100644 packages/bun/src/index.ts create mode 100644 packages/bun/src/utils/bun.ts create mode 100644 packages/bun/src/utils/cli.ts create mode 100644 packages/bun/src/utils/dependencies.ts create mode 100644 packages/bun/src/utils/index.ts create mode 100644 packages/bun/tsconfig.json create mode 100644 packages/bun/tsconfig.lib.json create mode 100644 packages/bun/tsconfig.spec.json 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/nx.json b/nx.json index a4ea695..480bf64 100644 --- a/nx.json +++ b/nx.json @@ -33,9 +33,9 @@ "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"] }, "changelog": { diff --git a/package.json b/package.json index 5d7c247..6fdff61 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@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", 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..a88f925 --- /dev/null +++ b/packages/bun/README.md @@ -0,0 +1,11 @@ +# bun + +This library was generated with [Nx](https://nx.dev). + +## Building + +Run `nx build bun` to build the library. + +## Running unit tests + +Run `nx test bun` to execute the unit tests via [Jest](https://jestjs.io). 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..d403b0e --- /dev/null +++ b/packages/bun/executors.json @@ -0,0 +1,9 @@ +{ + "executors": { + "run": { + "implementation": "./src/executors/run/run", + "schema": "./src/executors/run/schema.json", + "description": "Execute a Node 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..1ef94a1 --- /dev/null +++ b/packages/bun/package.json @@ -0,0 +1,28 @@ +{ + "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" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/bun/project.json b/packages/bun/project.json new file mode 100644 index 0000000..57ebd6c --- /dev/null +++ b/packages/bun/project.json @@ -0,0 +1,48 @@ +{ + "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", + "rootDir": "packages/bun/src", + "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.spec.ts b/packages/bun/src/executors/build/build.spec.ts new file mode 100644 index 0000000..b56f615 --- /dev/null +++ b/packages/bun/src/executors/build/build.spec.ts @@ -0,0 +1,27 @@ +import { ExecutorContext } from '@nx/devkit'; + +import { RunExecutorSchema } from './schema'; +import executor from './build'; + +const options: RunExecutorSchema = {}; +const context: ExecutorContext = { + root: '', + cwd: process.cwd(), + isVerbose: false, + projectGraph: { + nodes: {}, + dependencies: {} + }, + projectsConfigurations: { + projects: {}, + version: 2 + }, + nxJsonConfiguration: {} +}; + +describe('Run Executor', () => { + it('can run', async () => { + const output = await executor(options, context); + expect(output.success).toBe(true); + }); +}); diff --git a/packages/bun/src/executors/build/build.ts b/packages/bun/src/executors/build/build.ts new file mode 100644 index 0000000..aa6aba2 --- /dev/null +++ b/packages/bun/src/executors/build/build.ts @@ -0,0 +1,134 @@ +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 { getBunBuildConfig } from './lib/get-bun-build-config'; +import { getBunBuildArgv } from './lib/get-bun-build-argv'; + +async function* buildExecutor( + options: BuildExecutorOptions, + context: ExecutorContext +) { + const bunVersion = await getBunVersion(); + + if (!bunVersion) { + throw new Error(`bun command not found. Make sure the bun is available`); + } + + if (!context.projectName) { + throw new Error(`project name is undefined`); + } + + process.env['NODE_ENV'] ??= 'production'; + + if (isBun) { + const config = getBunBuildConfig(options, context); + const result = await Bun.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 { success: true }; + } else { + yield { success: false }; + } + } else { + const args = getBunBuildArgv(options, context); + yield* createAsyncIterable<{ + success: boolean; + options?: Record; + }>(async ({ next, done }) => { + const childProcess = spawnWithBun(args, { + stderr: 'inherit', + stdin: 'pipe', + stdout: '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({ success: code === 0 }); + done(); + }); + } else { + childProcess.on('exit', (code) => { + console.log(`Build completed for ${context.projectName}`); + next({ success: 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..0966526 --- /dev/null +++ b/packages/bun/src/executors/build/lib/get-bun-build-argv.ts @@ -0,0 +1,48 @@ +import { BuildExecutorOptions } from '../schema'; +import { ExecutorContext } from '@nx/devkit'; +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: BuildExecutorOptions, + context: ExecutorContext +): string[] { + const cfg = getBunBuildConfig(options, context); + 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`, + + cfg.entrypoints.join(' '), + + production && '--production', + !isNil(cfg.target) && `--target=${cfg.target}`, + !isNil(cfg.root) && `--root=${cfg.root}`, + !isNil(cfg.env) && `--env=${cfg.env}`, + !isNil(cfg.outdir) && `--outdir=${cfg.outdir}`, + !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`, + 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..eea08fc --- /dev/null +++ b/packages/bun/src/executors/build/lib/get-bun-build-config.ts @@ -0,0 +1,33 @@ +import { BuildExecutorOptions } from '../schema'; +import { ExecutorContext } from '@nx/devkit'; + +export function getBunBuildConfig( + executorOptions: BuildExecutorOptions, + context: ExecutorContext +): Bun.BuildConfig { + return { + entrypoints: [ + executorOptions.main, + ...(executorOptions.additionalEntryPoints || []) + ], + define: executorOptions.define, + outdir: executorOptions.outputPath, + target: executorOptions.target, + external: executorOptions.external, + format: executorOptions.format, + minify: executorOptions.define, + naming: executorOptions.naming, + publicPath: executorOptions.publicPath, + sourcemap: executorOptions.sourcemap, + splitting: executorOptions.splitting, + root: executorOptions.rootDir, + packages: executorOptions.packages, + loader: executorOptions.loader, + env: executorOptions.env, + banner: executorOptions.banner, + footer: executorOptions.footer, + drop: executorOptions.drop, + tsconfig: executorOptions.tsConfig, + throw: true + }; +} 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..581dda8 --- /dev/null +++ b/packages/bun/src/executors/build/schema.d.ts @@ -0,0 +1,30 @@ +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?: 'none' | 'linked' | 'external'; + minify?: boolean; + external?: string[]; + packages?: 'bundle' | 'external'; + naming?: string; + publicPath?: string; + define?: Record; + loader?: Record; + banner?: string; + footer?: string; + drop?: string[]; + generateLockfile?: boolean; + generatePackageJson?: 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..7947b29 --- /dev/null +++ b/packages/bun/src/executors/build/schema.json @@ -0,0 +1,163 @@ +{ + "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": false + }, + "env": { + "type": "string", + "description": "Controls how environment variables are handled during bundling.", + "default": "inline" + }, + "sourcemap": { + "type": "string", + "description": "Specifies the type of sourcemap to generate.", + "enum": ["none", "linked", "external"], + "default": "none" + }, + "minify": { + "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 + } + }, + "required": ["main", "outputPath", "tsConfig"] +} 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..c34090c --- /dev/null +++ b/packages/bun/src/executors/run/lib/calculate-resolve-mappings.ts @@ -0,0 +1,33 @@ +import { + ExecutorContext, + joinPathFragments, + parseTargetString +} from '@nx/devkit'; +import { NodeExecutorOptions } from '../schema'; +import { + calculateProjectBuildableDependencies, + DependentBuildableProjectNode +} from '@nx/js/src/utils/buildable-libs-utils'; + +export function calculateResolveMappings( + context: ExecutorContext, + options: NodeExecutorOptions +) { + const parsed = parseTargetString(options.buildTarget, context); + const { dependencies } = calculateProjectBuildableDependencies( + context.taskGraph, + context.projectGraph, + context.root, + parsed.project, + parsed.target, + parsed.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/debounce.ts b/packages/bun/src/executors/run/lib/debounce.ts new file mode 100644 index 0000000..07530b1 --- /dev/null +++ b/packages/bun/src/executors/run/lib/debounce.ts @@ -0,0 +1,25 @@ +export function debounce( + fn: () => Promise, + wait: number +): () => Promise { + let timeoutId: ReturnType; + let pendingPromise: Promise | null = null; + + return () => { + if (!pendingPromise) { + pendingPromise = new Promise((resolve, reject) => { + timeoutId = setTimeout(() => { + fn() + .then(resolve) + .catch(reject) + .finally(() => { + pendingPromise = null; + clearTimeout(timeoutId); + }); + }, wait); + }); + } + + return pendingPromise; + }; +} diff --git a/packages/bun/src/executors/run/lib/file-to-run-correct-path.ts b/packages/bun/src/executors/run/lib/file-to-run-correct-path.ts new file mode 100644 index 0000000..5510894 --- /dev/null +++ b/packages/bun/src/executors/run/lib/file-to-run-correct-path.ts @@ -0,0 +1,18 @@ +import { fileExists } from 'nx/src/utils/fileutils'; + +export function fileToRunCorrectPath(fileToRun: string): string { + if (fileExists(fileToRun)) { + return fileToRun; + } + + const extensionsToTry = ['.cjs', '.mjs', '.cjs.js', '.esm.js']; + + for (const ext of extensionsToTry) { + const file = fileToRun.replace(/\.js$/, ext); + if (fileExists(file)) return file; + } + + throw new Error( + `Could not find ${fileToRun}. Make sure your build succeeded.` + ); +} diff --git a/packages/bun/src/executors/run/lib/get-exec-argv.ts b/packages/bun/src/executors/run/lib/get-exec-argv.ts new file mode 100644 index 0000000..f2ffa28 --- /dev/null +++ b/packages/bun/src/executors/run/lib/get-exec-argv.ts @@ -0,0 +1,25 @@ +import { RunExecutorOptions } from '../schema'; + +export function getExecArgv(options: RunExecutorOptions): string[] { + const args: string[] = []; + + if (options.watch) { + args.push('--watch'); + } + if (options.hot) { + args.push('--hot'); + } + if (options.config) { + args.push(`-c ${options.config}`); + } + if (options.tsConfig) { + args.push(`--tsconfig-override=${options.tsConfig}`); + } + if (options.smol) { + args.push('--smol'); + } + if (options.bun) { + args.push('--bun'); + } + return args; +} 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..a227aec --- /dev/null +++ b/packages/bun/src/executors/run/lib/get-file-to-run.ts @@ -0,0 +1,51 @@ +import { ExecutorContext, logger, ProjectGraphProjectNode } from '@nx/devkit'; +import path from 'node:path'; +import { getRelativeDirectoryToProjectRoot } from '@nx/js/src/utils/get-main-file-dir'; +import { interpolate } from 'nx/src/tasks-runner/utils'; + +export function getFileToRun( + context: ExecutorContext, + project: ProjectGraphProjectNode, + buildOptions: Record, + buildTargetExecutor?: string +): string { + 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 path.join(outputFilePath, 'main.js'); + } + const fallbackFile = path.join('dist', project.data.root, 'main.js'); + + logger.warn( + `Build option outputFileName not set for ${project.name}. Using fallback value of ${fallbackFile}.` + ); + + return path.join(context.root, fallbackFile); + } + + let outputFileName = buildOptions.outputFileName; + + if (!outputFileName) { + const fileName = `${path.parse(buildOptions.main).name}.js`; + if ( + buildTargetExecutor === '@nx/js:tsc' || + buildTargetExecutor === '@nx/js:swc' + ) { + outputFileName = path.join( + getRelativeDirectoryToProjectRoot(buildOptions.main, project.data.root), + fileName + ); + } else { + outputFileName = fileName; + } + } + + return path.join(context.root, buildOptions.outputPath, outputFileName); +} diff --git a/packages/bun/src/executors/run/lib/get-main-file-dir.ts b/packages/bun/src/executors/run/lib/get-main-file-dir.ts new file mode 100644 index 0000000..490fcc8 --- /dev/null +++ b/packages/bun/src/executors/run/lib/get-main-file-dir.ts @@ -0,0 +1,11 @@ +import { dirname, relative } from 'node:path'; +import { normalizePath } from 'nx/src/utils/path'; + +export function getRelativeDirectoryToProjectRoot( + file: string, + projectRoot: string +): string { + const dir = dirname(file); + const relativeDir = normalizePath(relative(projectRoot, dir)); + return relativeDir === '' ? `./` : `./${relativeDir}/`; +} diff --git a/packages/bun/src/executors/run/lib/kill-tree.ts b/packages/bun/src/executors/run/lib/kill-tree.ts new file mode 100644 index 0000000..7c606c1 --- /dev/null +++ b/packages/bun/src/executors/run/lib/kill-tree.ts @@ -0,0 +1,184 @@ +import { platform } from 'node:os'; +import { ExecException } from 'node:child_process'; +import { + isBun, + isBunSubprocess, + runSpawn, + UniversalChildProcess +} from '../../../utils'; + +async function runExec(cmd: string) { + if (isBun) { + const { stdout, stderr, exitCode } = await Bun.$`${cmd}`.quiet(); + return { + stdout: stdout.toString(), + stderr: stderr.toString(), + exitCode: exitCode, + success: exitCode === 0 + }; + } + + const { promisify } = await import('node:util'); + const { exec } = await import('node:child_process'); + const nodeExec = promisify(exec); + + const { stdout, stderr } = await nodeExec(cmd, { windowsHide: true }); + return { + stdout, + stderr, + exitCode: 0, + success: true + }; +} + +export async function killTree(pid: number, signal: NodeJS.Signals) { + const tree: Record = {}; + const pidsToProcess: Record = {}; + tree[pid] = []; + pidsToProcess[pid] = 1; + + return new Promise(async (resolve, reject) => { + const callback = (error?: ExecException | null) => { + if (error) { + reject(error); + } else { + resolve(); + } + }; + + switch (platform()) { + case 'win32': + try { + await runExec(`taskkill /pid ${pid} /T /F`); + } catch (error: any) { + callback(error?.code !== 128 ? error : null); + } + break; + case 'darwin': + buildProcessTree( + pid, + tree, + pidsToProcess, + function (parentPid) { + return runSpawn('pgrep', ['-P', String(parentPid)], { + windowsHide: false + }); + }, + function () { + killAll(tree, signal, callback); + } + ); + break; + default: // Linux + buildProcessTree( + pid, + tree, + pidsToProcess, + function (parentPid) { + return runSpawn( + 'ps', + ['-o', 'pid', '--no-headers', '--ppid', String(parentPid)], + { + windowsHide: false + } + ); + }, + function () { + killAll(tree, signal, callback); + } + ); + break; + } + }); +} + +function killAll( + tree: Record, + signal: number | string, + callback?: (error?: any) => void +) { + const killed: Record = {}; + try { + Object.keys(tree).forEach((pid) => { + tree[pid].forEach((pidpid) => { + if (!killed[pidpid]) { + killPid(pidpid, signal); + killed[pidpid] = 1; + } + }); + if (!killed[pid]) { + killPid(pid, signal); + killed[pid] = 1; + } + }); + } catch (err) { + if (callback) { + return callback(err); + } + throw err; + } + + if (callback) { + return callback(); + } +} + +function killPid(pid: string | number, signal: string | number) { + try { + process.kill(parseInt(String(pid), 10), signal); + } catch (err: any) { + if (err.code !== 'ESRCH') throw err; + } +} + +function buildProcessTree( + parentPid: number, + tree: Record, + pidsToProcess: Record, + spawnChildProcessesList: (pid: number) => UniversalChildProcess, + cb: () => void +) { + const ps = spawnChildProcessesList(parentPid); + + let allData = ''; + if (isBunSubprocess(ps)) { + const stdoutReader = ps.stdout?.getReader(); + const handleStdout = async () => { + if (stdoutReader) { + while (true) { + const { done, value } = await stdoutReader.read(); + if (done) break; + allData += new TextDecoder().decode(value); + } + } + const code = await ps.exited; + stdoutReader.cancel(); + onClose(code); + }; + handleStdout(); + } else { + ps.stdout?.on('data', (data: Buffer) => { + allData += data.toString('ascii'); + }); + ps.on('close', onClose); + } + + function onClose(code: number) { + delete pidsToProcess[parentPid]; + + if (code !== 0) { + if (Object.keys(pidsToProcess).length === 0) { + cb(); + } + return; + } + + allData.match(/\d+/g)?.forEach((_pid) => { + const pid = parseInt(_pid, 10); + tree[parentPid].push(pid); + tree[pid] = []; + pidsToProcess[pid] = 1; + buildProcessTree(pid, tree, pidsToProcess, spawnChildProcessesList, cb); + }); + } +} diff --git a/packages/bun/src/executors/run/lib/run-wait-until-targets.ts b/packages/bun/src/executors/run/lib/run-wait-until-targets.ts new file mode 100644 index 0000000..1fae42c --- /dev/null +++ b/packages/bun/src/executors/run/lib/run-wait-until-targets.ts @@ -0,0 +1,24 @@ +import { RunExecutorOptions } from '../schema'; +import { ExecutorContext, parseTargetString, runExecutor } from '@nx/devkit'; + +export function runWaitUntilTargets( + options: RunExecutorOptions, + context: ExecutorContext +): Promise<{ success: boolean }[]> { + return Promise.all( + options.waitUntilTargets.map(async (waitUntilTarget) => { + const target = parseTargetString(waitUntilTarget, context); + const output = await runExecutor(target, {}, context); + return new Promise<{ success: boolean }>(async (resolve) => { + let event = await output.next(); + // Resolve after first event + resolve(event.value as { success: boolean }); + + // Continue iterating + while (!event.done) { + event = await output.next(); + } + }); + }) + ); +} diff --git a/packages/bun/src/executors/run/run.spec.ts b/packages/bun/src/executors/run/run.spec.ts new file mode 100644 index 0000000..85712a6 --- /dev/null +++ b/packages/bun/src/executors/run/run.spec.ts @@ -0,0 +1,27 @@ +import { ExecutorContext } from '@nx/devkit'; + +import { RunExecutorOptions } from './schema'; +import executor from './run'; + +const options: RunExecutorOptions = {}; +const context: ExecutorContext = { + root: '', + cwd: process.cwd(), + isVerbose: false, + projectGraph: { + nodes: {}, + dependencies: {} + }, + projectsConfigurations: { + projects: {}, + version: 2 + }, + nxJsonConfiguration: {} +}; + +describe('Run Executor', () => { + it('can run', async () => { + const output = await executor(options, context); + expect(output.success).toBe(true); + }); +}); diff --git a/packages/bun/src/executors/run/run.ts b/packages/bun/src/executors/run/run.ts new file mode 100644 index 0000000..189dc30 --- /dev/null +++ b/packages/bun/src/executors/run/run.ts @@ -0,0 +1,366 @@ +import { ChildProcess } from 'node:child_process'; +import { randomUUID } from 'node:crypto'; +import { createAsyncIterable } from '@nx/devkit/src/utils/async-iterable'; +import { + ExecutorContext, + parseTargetString, + readTargetOptions, + logger, + runExecutor, + isDaemonEnabled +} from '@nx/devkit'; + +import { + getBunVersion, + isBunSubprocess, + runFork, + spawnWithBun, + UniversalChildProcess +} from '../../utils'; +import { RunExecutorOptions } from './schema'; +import { debounce } from './lib/debounce'; +import { getFileToRun } from './lib/get-file-to-run'; +import { getExecArgv } from './lib/get-exec-argv'; +import { runWaitUntilTargets } from './lib/run-wait-until-targets'; +import { fileToRunCorrectPath } from './lib/file-to-run-correct-path'; +import { killTree } from './lib/kill-tree'; +import { daemonClient } from 'nx/src/daemon/client/client'; + +interface ActiveTask { + id: string; + killed: boolean; + promise: Promise | null; + childProcess: UniversalChildProcess | null; + start: () => Promise; + stop: (signal: NodeJS.Signals) => Promise; +} + +export default 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`); + } + + if (!context.projectName) { + throw new Error(`project name is undefined`); + } + + process.env.NODE_ENV ??= context?.configurationName ?? 'development'; + + const project = context.projectGraph.nodes[context.projectName]; + const buildTarget = parseTargetString(options.buildTarget, context); + const projectBuildTargetConfig = project.data.targets?.[buildTarget.target]; + + if (!projectBuildTargetConfig) { + throw new Error( + `Cannot find build target ${options.buildTarget} for project ${context.projectName}` + ); + } + + const buildTargetExecutor = projectBuildTargetConfig.executor; + + if (buildTargetExecutor === 'nx:run-commands') { + // Run commands does not emit build event, so we have to switch to run entire build through Nx CLI. + options.runBuildTargetDependencies = true; + } + + const buildOptions: Record = { + ...readTargetOptions(buildTarget, context), + ...options.buildTargetOptions, + target: buildTarget.target + }; + + if (options.waitUntilTargets && options.waitUntilTargets.length > 0) { + const results = await runWaitUntilTargets(options, context); + for (const [i, result] of results.entries()) { + if (!result.success) { + throw new Error( + `Wait until target failed: ${options.waitUntilTargets[i]}.` + ); + } + } + } + + // Re-map buildable workspace projects to their output directory. + // const mappings = calculateResolveMappings(context, options); + const fileToRun = getFileToRun( + context, + project, + buildOptions, + buildTargetExecutor + ); + + let additionalExitHandler: null | (() => void) = null; + let currentTask: ActiveTask | null = null; + const tasks: ActiveTask[] = []; + + const args = getExecArgv(options); + + yield* createAsyncIterable<{ + success: boolean; + options?: Record; + }>(async ({ done, next, error, registerCleanup }) => { + const processQueue = async () => { + if (tasks.length === 0) return; + + const previousTask = currentTask; + const task = tasks.shift(); + currentTask = task ?? null; + await previousTask?.stop('SIGTERM'); + await task?.start(); + }; + + const debouncedProcessQueue = debounce( + processQueue, + options.debounce ?? 1_000 + ); + + const addToQueue = async ( + childProcess: null | ChildProcess, + buildResult: Promise<{ success: boolean }> + ) => { + const task: ActiveTask = { + id: randomUUID(), + killed: false, + childProcess, + promise: null, + start: async () => { + // Wait for build to finish. + const result = await buildResult; + + if (result && !result.success) { + if (options.watch) { + if (!task.killed) { + logger.error(`Build failed, waiting for changes to restart...`); + } + return; + } else { + throw new Error(`Build failed. See above for errors.`); + } + } + + if (task.killed) { + return; + } + + // Run the program + task.promise = new Promise(async (resolve, reject) => { + const proc = spawnWithBun( + ['run', ...args, fileToRunCorrectPath(fileToRun)], + { + stderr: 'pipe', + stdin: 'inherit', + stdout: 'inherit' + } + ); + + task.childProcess = proc; + + if (isBunSubprocess(proc)) { + const stderrReader = proc.stderr?.getReader(); + + const handleStderr = async () => { + if (!stderrReader) { + return; + } + + try { + while (true) { + const { done, value } = await stderrReader.read(); + if (done || task.killed) break; + if (value) logger.error(new TextDecoder().decode(value)); + } + } catch (err) { + if (!task.killed) + logger.error(`Error reading stderr: ${err}`); + } + }; + + handleStderr(); + + proc.exited.then((code) => { + stderrReader?.cancel(); + handleExit(code); + }); + } else { + // Node stderr handling + const handleStdErr = (data: ArrayBuffer) => { + if (!options.watch || !task.killed) { + logger.error(data.toString()); + } + }; + proc.stderr?.on('data', handleStdErr); + proc.once('exit', (code) => { + proc?.off('data', handleStdErr); + handleExit(code ?? 0); + }); + } + + function handleExit(code: number) { + if (options.watch && !task.killed) { + logger.info( + `NX Process exited with code ${code}, waiting for changes to restart...` + ); + } + if (!options.watch) { + if (code !== 0) { + reject(new Error(`Process exited with code ${code}`)); + } else { + resolve(done()); + } + } + resolve(); + } + + next({ success: true, options: buildOptions }); + }); + }, + stop: async (signal: NodeJS.Signals = 'SIGTERM') => { + task.killed = true; + + if (task.childProcess?.pid) { + await killTree(task.childProcess.pid, signal); + } + try { + await task.promise; + } catch {} + } + }; + + tasks.push(task); + }; + + const output = await runExecutor( + buildTarget, + { + ...options.buildTargetOptions, + watch: options.watch + }, + context + ); + // eslint-disable-next-line no-constant-condition + while (true) { + const event = await output.next(); + await addToQueue(null, Promise.resolve(event.value)); + await debouncedProcessQueue(); + if (event.done || !options.watch) { + break; + } + } + + const stopAllTasks = async (signal: NodeJS.Signals = 'SIGTERM') => { + if (typeof additionalExitHandler === 'function') { + additionalExitHandler(); + } + if (typeof currentTask?.stop === 'function') { + await currentTask.stop(signal); + } + for (const task of tasks) { + await task.stop(signal); + } + }; + + process.on('SIGTERM', async () => { + await stopAllTasks('SIGTERM'); + process.exit(128 + 15); + }); + process.on('SIGINT', async () => { + await stopAllTasks('SIGINT'); + process.exit(128 + 2); + }); + process.on('SIGHUP', async () => { + await stopAllTasks('SIGHUP'); + process.exit(128 + 1); + }); + + registerCleanup?.(async () => { + await stopAllTasks('SIGTERM'); + }); + + if (options.runBuildTargetDependencies) { + const runBuild = async () => { + let childProcess: UniversalChildProcess | null = null; + const whenReady = new Promise<{ success: boolean }>(async (resolve) => { + childProcess = runFork( + require.resolve('nx'), + [ + 'run', + `${context.projectName}:${buildTarget.target}${ + buildTarget.configuration ? `:${buildTarget.configuration}` : '' + }` + ], + { + cwd: context.root, + stdio: 'inherit' + } + ); + + const handleExit = (code: number | null) => { + if (code === 0) resolve({ success: true }); + // If process is killed due to current task being killed, then resolve with success. + else resolve({ success: !!currentTask?.killed }); + }; + + if (isBunSubprocess(childProcess)) { + childProcess.exited.then(handleExit); + } else { + childProcess.once('exit', handleExit); + } + }); + await addToQueue(childProcess, whenReady); + await debouncedProcessQueue(); + }; + + if (isDaemonEnabled()) { + additionalExitHandler = await daemonClient.registerFileWatcher( + { + watchProjects: [context.projectName || ''], + includeDependentProjects: true + }, + async (err, data) => { + if (err === 'closed') { + logger.error(`Watch error: Daemon closed the connection`); + process.exit(1); + } else if (err) { + logger.error(`Watch error: ${err?.message ?? 'Unknown'}`); + } else { + if (options.watch) { + logger.info(`NX File change detected. Restarting...`); + await runBuild(); + } + } + } + ); + } else { + logger.warn( + `NX Daemon is not running. Node process will not restart automatically after file changes.` + ); + } + await runBuild(); // run first build + } else { + // Otherwise, run the build executor, which will not run task dependencies. + // This is mostly fine for bundlers like webpack that should already watch for dependency libs. + // For tsc/swc or custom build commands, consider using `runBuildTargetDependencies` instead. + const output = await runExecutor( + buildTarget, + { + ...options.buildTargetOptions, + watch: options.watch + }, + context + ); + while (true) { + const event = await output.next(); + await addToQueue(null, Promise.resolve(event.value)); + await debouncedProcessQueue(); + if (event.done || !options.watch) { + break; + } + } + } + }); +} 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..ac957f9 --- /dev/null +++ b/packages/bun/src/executors/run/schema.d.ts @@ -0,0 +1,32 @@ +export interface RunExecutorOptions { + buildTarget: string; + buildTargetOptions?: Record; + watch?: boolean; + hot?: boolean; + debounce?: number; + config?: string; + tsConfig?: string; + smol?: boolean; + bun?: boolean; + runBuildTargetDependencies?: boolean; + waitUntilTargets: string[]; +} + +export const enum InspectType { + Inspect = 'inspect', + InspectBrk = 'inspect-brk' +} + +export interface NodeExecutorOptions { + inspect: boolean | InspectType; + runtimeArgs: string[]; + args: string[]; + waitUntilTargets: string[]; + buildTarget: string; + buildTargetOptions: Record; + host: string; + port: number; + watch?: boolean; + debounce?: number; + runBuildTargetDependencies?: 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..9903328 --- /dev/null +++ b/packages/bun/src/executors/run/schema.json @@ -0,0 +1,60 @@ +{ + "$schema": "http://json-schema.org/schema", + "version": 2, + "title": "Bun Run executor", + "description": "", + "type": "object", + "properties": { + "buildTarget": { + "type": "string", + "description": "The target to run to build you the app." + }, + "buildTargetOptions": { + "type": "object", + "description": "Additional options to pass into the build target.", + "default": {} + }, + "watch": { + "type": "boolean", + "description": "To run a file in watch mode", + "default": false + }, + "hot": { + "type": "boolean", + "description": "Enable auto reload in bun's JavaScript runtime", + "default": true + }, + "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" + }, + "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": false + }, + "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" + } + } + }, + "required": [] +} diff --git a/packages/bun/src/generators/application/application.spec.ts b/packages/bun/src/generators/application/application.spec.ts new file mode 100644 index 0000000..20b464a --- /dev/null +++ b/packages/bun/src/generators/application/application.spec.ts @@ -0,0 +1,20 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, readProjectConfiguration } from '@nx/devkit'; + +import { applicationGenerator } from './application'; +import { ApplicationGeneratorSchema } from './schema'; + +describe('application generator', () => { + let tree: Tree; + const options: ApplicationGeneratorSchema = { name: 'test' }; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + }); + + it('should run successfully', async () => { + await applicationGenerator(tree, options); + const config = readProjectConfiguration(tree, 'test'); + expect(config).toBeDefined(); + }); +}); diff --git a/packages/bun/src/generators/application/application.ts b/packages/bun/src/generators/application/application.ts new file mode 100644 index 0000000..97f8020 --- /dev/null +++ b/packages/bun/src/generators/application/application.ts @@ -0,0 +1,105 @@ +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); + + if (options.framework === 'elysia') { + const { applicationGenerator } = ensurePackage( + libs.nxElysia.name, + libs.nxElysia.version + ); + const elysiaTask = await applicationGenerator(tree, { + ...options, + skipFormat: true + }); + tasks.push(elysiaTask); + + return runTasksInSerial( + ...[ + ...tasks, + () => { + logShowProjectCommand(options.name); + } + ] + ); + } + + const initTask = await initGenerator(tree, { + ...options, + skipFormat: true + }); + tasks.push(initTask); + + 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', + { + module: 'nodenext', + moduleResolution: 'nodenext' + }, + 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(() => { + logShowProjectCommand(options.name); + }); + + 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..2107478 --- /dev/null +++ b/packages/bun/src/generators/application/files/tsconfig.app.json @@ -0,0 +1,31 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "<%= offsetFromRoot %>dist/out-tsc", + // 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..40dd7e7 --- /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..f74def7 --- /dev/null +++ b/packages/bun/src/generators/application/lib/create-targets.ts @@ -0,0 +1,61 @@ +import { + joinPathFragments, + ProjectConfiguration, + TargetConfiguration, + Tree +} from '@nx/devkit'; +import { NormalizedOptions } from './normalize-options'; +import { libs } from '../../../utils'; +import { BuildExecutorOptions } from '../../../executors/build/schema'; +import { RunExecutorOptions } from '../../../executors/run/schema'; + +export function getBuildConfig( + options: NormalizedOptions +): TargetConfiguration { + return { + executor: `${libs.plugin.name}:build`, + outputs: ['{options.outputPath}'], + options: { + main: joinPathFragments(options.appProjectRoot, 'src', 'main.ts'), + outputPath: options.outputPath, + tsConfig: joinPathFragments(options.appProjectRoot, 'tsconfig.app.json'), + smol: false, + bun: true + } + }; +} + +export function getServeConfig( + options: NormalizedOptions +): TargetConfiguration { + return { + continuous: true, + executor: `${libs.plugin.name}:run`, + defaultConfiguration: 'development', + dependsOn: ['build'], + options: { + buildTarget: `${options.name}:build`, + tsConfig: joinPathFragments(options.appProjectRoot, 'tsconfig.app.json'), + watch: true, + hot: true, + bun: true, + smol: false, + runBuildTargetDependencies: false, + waitUntilTargets: [] + }, + configurations: { + development: { + buildTarget: `${options.name}:build:development` + }, + production: { + buildTarget: `${options.name}:build:production` + } + } + }; +} + +export function createTargets( + tree: Tree, + project: ProjectConfiguration, + options: NormalizedOptions +) {} 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..bae4928 --- /dev/null +++ b/packages/bun/src/generators/application/schema.json @@ -0,0 +1,121 @@ +{ + "$schema": "https://json-schema.org/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.spec.ts b/packages/bun/src/generators/init/init.spec.ts new file mode 100644 index 0000000..aaa1d80 --- /dev/null +++ b/packages/bun/src/generators/init/init.spec.ts @@ -0,0 +1,20 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, readProjectConfiguration } from '@nx/devkit'; + +import { initGenerator } from './init'; +import { InitGeneratorSchema } from './schema'; + +describe('init generator', () => { + let tree: Tree; + const options: InitGeneratorSchema = { name: 'test' }; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + }); + + it('should run successfully', async () => { + await initGenerator(tree, options); + const config = readProjectConfiguration(tree, 'test'); + expect(config).toBeDefined(); + }); +}); 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..26abe18 --- /dev/null +++ b/packages/bun/src/generators/init/schema.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://json-schema.org/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.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/cli.ts b/packages/bun/src/utils/cli.ts new file mode 100644 index 0000000..13aebb7 --- /dev/null +++ b/packages/bun/src/utils/cli.ts @@ -0,0 +1,124 @@ +import { workspaceRoot } from '@nx/devkit'; +import { workerData } from 'node:worker_threads'; +import type { ChildProcess, IOType, SpawnOptions } from 'node:child_process'; +import { spawn as nodeSpawn } from 'node:child_process'; +import { ForkOptions } from 'child_process'; + +export const isBun = typeof Bun !== 'undefined'; + +export type UniversalChildProcess = + | ChildProcess + | Bun.Subprocess; + +export function isBunSubprocess( + process: UniversalChildProcess +): process is Bun.Subprocess { + return isBun && 'exited' in process; +} + +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 nodeSpawn(cmd, args, spawnOptions); + } +} + +export interface SpawnWithBunOptions { + cwd?: string; + stdin?: IOType; + stdout?: IOType; + stderr?: IOType; + env?: Record; +} + +export function spawnWithBun( + args: string[], + options: SpawnWithBunOptions = {} +): UniversalChildProcess { + const cwd = options.cwd || workspaceRoot; + const env = { + ...process.env, + ...(workerData || {}), + ...(options.env || {}) + }; + const { stdin = 'ignore', stdout = 'pipe', stderr = 'pipe' } = options; + + if (isBun) { + return Bun.spawn({ + cmd: ['bun', ...args], + cwd, + env, + stdin, + stdout, + stderr + }); + } + + const { spawn } = await import('node:child_process'); + + return spawn('bun', args, { + cwd, + env, + windowsHide: true, + stdio: [stdin, stdout, stderr] + }); +} + +export function runFork( + modulePath: string, + args: ReadonlyArray = [], + options: ForkOptions = {} +) { + if (isBun) { + // Bun.spawn version + return Bun.spawn({ + cmd: ['bun', modulePath, ...args], + stdin: 'inherit', + stdout: 'inherit', + stderr: 'pipe' + }); + } else { + // Node.js fork version + const { fork } = await import('node:child_process'); + return fork(modulePath, args, options); + } +} 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..ac38e4d --- /dev/null +++ b/packages/bun/src/utils/index.ts @@ -0,0 +1,3 @@ +export * from './bun'; +export * from './cli'; +export * from './dependencies'; 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/pnpm-lock.yaml b/pnpm-lock.yaml index cf507dc..2186aeb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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.9) '@types/jest': specifier: ^30.0.0 version: 30.0.0 @@ -129,6 +132,15 @@ importers: specifier: 18.0.0 version: 18.0.0 + packages/bun: + dependencies: + '@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))) + tslib: + specifier: ^2.3.0 + version: 2.8.1 + packages/elysia: dependencies: '@nx/devkit': @@ -1385,6 +1397,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 +1430,9 @@ packages: '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/react@19.1.9': + resolution: {integrity: sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==} + '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -1965,6 +1983,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'} @@ -2144,6 +2167,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'} @@ -6029,6 +6055,12 @@ snapshots: dependencies: '@babel/types': 7.28.2 + '@types/bun@1.2.20(@types/react@19.1.9)': + dependencies: + bun-types: 1.2.20(@types/react@19.1.9) + transitivePeerDependencies: + - '@types/react' + '@types/estree@1.0.8': {} '@types/http-cache-semantics@4.0.4': {} @@ -6060,6 +6092,10 @@ snapshots: '@types/parse-json@4.0.2': {} + '@types/react@19.1.9': + dependencies: + csstype: 3.1.3 + '@types/stack-utils@2.0.3': {} '@types/tough-cookie@4.0.5': {} @@ -6770,6 +6806,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bun-types@1.2.20(@types/react@19.1.9): + dependencies: + '@types/node': 18.16.9 + '@types/react': 19.1.9 + bytes@3.1.2: {} cacheable-lookup@7.0.0: {} @@ -6934,6 +6975,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: {} diff --git a/tsconfig.json b/tsconfig.json index b665115..1df6406 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,6 +8,9 @@ }, { "path": "./e2e/elysia" + }, + { + "path": "./packages/bun" } ] } From ec959d2d13b15084575a19d5a9120d4833436f81 Mon Sep 17 00:00:00 2001 From: Boris Polak <18208654+BorisTB@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:00:19 +0200 Subject: [PATCH 02/12] feat(bun): add working bun run executor --- .verdaccio/config.yml | 4 +- nx.json | 8 +- package.json | 4 +- packages/bun/executors.json | 7 +- packages/bun/project.json | 1 - packages/bun/src/executors/build/build.ts | 35 +- .../build/lib/get-bun-build-config.ts | 2 +- packages/bun/src/executors/build/lib/index.ts | 3 + .../executors/build/lib/normalize-options.ts | 43 ++ packages/bun/src/executors/build/schema.d.ts | 11 +- .../src/executors/run/lib/build-bun-args.ts | 43 ++ .../run/lib/calculate-resolve-mappings.ts | 20 +- .../run/lib/change-file-path-extension.ts | 42 ++ .../src/executors/run/lib/first-value-from.ts | 12 + .../src/executors/run/lib/get-exec-argv.ts | 25 - .../src/executors/run/lib/get-file-to-run.ts | 54 +- .../executors/run/lib/get-relative-path.ts | 11 + packages/bun/src/executors/run/lib/index.ts | 15 + .../run/lib/is-relative-path-definition.ts | 3 + .../executors/run/lib/line-aware-writer.ts | 34 ++ .../executors/run/lib/normalize-options.ts | 47 ++ .../run/lib/parse-target-definition.ts | 27 + .../run/lib/run-wait-until-targets.ts | 24 - .../src/executors/run/lib/wait-for-targets.ts | 15 + .../lib/write-runtime-tsconfig-override.ts | 25 + packages/bun/src/executors/run/run.old.ts | 505 ++++++++++++++++++ packages/bun/src/executors/run/run.ts | 432 ++++----------- packages/bun/src/executors/run/schema.d.ts | 24 +- packages/bun/src/executors/run/schema.json | 47 +- .../application/lib/create-targets.ts | 7 +- packages/bun/src/utils/cli.ts | 48 +- packages/bun/src/utils/index.ts | 1 + packages/bun/src/utils/process-adapter.ts | 96 ++++ pnpm-lock.yaml | 22 +- pnpm-workspace.yaml | 1 + project.json | 19 + tools/scripts/release-local.mjs | 36 ++ tools/scripts/tsconfig.release.json | 9 + tsconfig.json | 3 + 39 files changed, 1274 insertions(+), 491 deletions(-) create mode 100644 packages/bun/src/executors/build/lib/index.ts create mode 100644 packages/bun/src/executors/build/lib/normalize-options.ts create mode 100644 packages/bun/src/executors/run/lib/build-bun-args.ts create mode 100644 packages/bun/src/executors/run/lib/change-file-path-extension.ts create mode 100644 packages/bun/src/executors/run/lib/first-value-from.ts delete mode 100644 packages/bun/src/executors/run/lib/get-exec-argv.ts create mode 100644 packages/bun/src/executors/run/lib/get-relative-path.ts create mode 100644 packages/bun/src/executors/run/lib/index.ts create mode 100644 packages/bun/src/executors/run/lib/is-relative-path-definition.ts create mode 100644 packages/bun/src/executors/run/lib/line-aware-writer.ts create mode 100644 packages/bun/src/executors/run/lib/normalize-options.ts create mode 100644 packages/bun/src/executors/run/lib/parse-target-definition.ts delete mode 100644 packages/bun/src/executors/run/lib/run-wait-until-targets.ts create mode 100644 packages/bun/src/executors/run/lib/wait-for-targets.ts create mode 100644 packages/bun/src/executors/run/lib/write-runtime-tsconfig-override.ts create mode 100644 packages/bun/src/executors/run/run.old.ts create mode 100644 packages/bun/src/utils/process-adapter.ts create mode 100644 tools/scripts/release-local.mjs create mode 100644 tools/scripts/tsconfig.release.json 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/nx.json b/nx.json index 480bf64..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" }, @@ -36,7 +42,7 @@ "preVersionCommand": "pnpm dlx nx run-many -t build", "conventionalCommits": true, "fallbackCurrentVersionResolver": "disk", - "manifestRootsToUpdate": ["{projectRoot}", "{projectRoot}/dist"] + "manifestRootsToUpdate": ["{projectRoot}/dist"] }, "changelog": { "automaticFromRef": true, diff --git a/package.json b/package.json index 6fdff61..498acfb 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@nx/node": "21.3.11", "@nx/plugin": "21.3.11", "@nx/workspace": "21.3.11", + "@stonx/bun": "0.0.0-e2e", "@swc-node/register": "~1.9.1", "@swc/cli": "~0.6.0", "@swc/core": "~1.5.7", @@ -73,5 +74,6 @@ "check-lock-files" ] }, - "packageManager": "pnpm@10.13.1" + "packageManager": "pnpm@10.13.1", + "dependencies": {} } diff --git a/packages/bun/executors.json b/packages/bun/executors.json index d403b0e..bb802be 100644 --- a/packages/bun/executors.json +++ b/packages/bun/executors.json @@ -1,9 +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 a Node application using Bun." + "description": "Execute an application using Bun." } } } diff --git a/packages/bun/project.json b/packages/bun/project.json index 57ebd6c..0367245 100644 --- a/packages/bun/project.json +++ b/packages/bun/project.json @@ -13,7 +13,6 @@ "outputPath": "packages/bun/dist", "main": "packages/bun/src/index.ts", "tsConfig": "packages/bun/tsconfig.lib.json", - "rootDir": "packages/bun/src", "assets": [ "packages/bun/*.md", { diff --git a/packages/bun/src/executors/build/build.ts b/packages/bun/src/executors/build/build.ts index aa6aba2..6a5cffa 100644 --- a/packages/bun/src/executors/build/build.ts +++ b/packages/bun/src/executors/build/build.ts @@ -8,13 +8,17 @@ import { isBunSubprocess, spawnWithBun } from '../../utils'; -import { getBunBuildConfig } from './lib/get-bun-build-config'; -import { getBunBuildArgv } from './lib/get-bun-build-argv'; +import { getBunBuildArgv, getBunBuildConfig, normalizeOptions } from './lib'; + +export interface BunBuildResult { + success: boolean; + outfile: string; +} async function* buildExecutor( - options: BuildExecutorOptions, + _options: BuildExecutorOptions, context: ExecutorContext -) { +): AsyncGenerator { const bunVersion = await getBunVersion(); if (!bunVersion) { @@ -27,6 +31,15 @@ async function* buildExecutor( process.env['NODE_ENV'] ??= 'production'; + const { sourceRoot, root } = + context.projectsConfigurations.projects[context.projectName]; + const options = normalizeOptions(_options, context.root, sourceRoot, root); + + const getResult = (success: boolean): BunBuildResult => ({ + success, + outfile: options.mainOutputPath + }); + if (isBun) { const config = getBunBuildConfig(options, context); const result = await Bun.build(config); @@ -38,17 +51,15 @@ async function* buildExecutor( const outputText = await Promise.all(outputTextAsync); outputText.forEach((out) => console.log(out)); console.log(`Build completed for ${context.projectName}`); - yield { success: true }; + yield getResult(true); } else { - yield { success: false }; + yield getResult(false); } } else { const args = getBunBuildArgv(options, context); - yield* createAsyncIterable<{ - success: boolean; - options?: Record; - }>(async ({ next, done }) => { + yield* createAsyncIterable(async ({ next, done }) => { const childProcess = spawnWithBun(args, { + stdio: 'pipe', stderr: 'inherit', stdin: 'pipe', stdout: 'inherit' @@ -117,13 +128,13 @@ async function* buildExecutor( if (isBunSubprocess(childProcess)) { childProcess.exited.then((code) => { console.log(`Build completed for ${context.projectName}`); - next({ success: code === 0 }); + next(getResult(code === 0)); done(); }); } else { childProcess.on('exit', (code) => { console.log(`Build completed for ${context.projectName}`); - next({ success: code === 0 }); + next(getResult(code === 0)); done(); }); } 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 index eea08fc..d1b2c51 100644 --- a/packages/bun/src/executors/build/lib/get-bun-build-config.ts +++ b/packages/bun/src/executors/build/lib/get-bun-build-config.ts @@ -13,7 +13,7 @@ export function getBunBuildConfig( define: executorOptions.define, outdir: executorOptions.outputPath, target: executorOptions.target, - external: executorOptions.external, + // external: executorOptions.external, format: executorOptions.format, minify: executorOptions.define, naming: executorOptions.naming, 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..b84ea4c --- /dev/null +++ b/packages/bun/src/executors/build/lib/normalize-options.ts @@ -0,0 +1,43 @@ +import { join, resolve } from 'node:path'; +import { + BuildExecutorOptions, + NormalizedBuildExecutorOptions +} from '../schema'; + +export function normalizeOptions( + options: BuildExecutorOptions, + contextRoot: string, + sourceRoot: string | undefined, + projectRoot: string +): NormalizedBuildExecutorOptions { + const outputPath = join(contextRoot, options.outputPath); + const rootDir = options.rootDir + ? join(contextRoot, options.rootDir) + : join(contextRoot, projectRoot); + + if (options.watch == null) { + options.watch = false; + } + + if (Array.isArray(options.external) && options.external.length > 0) { + const firstItem = options.external[0]; + if (firstItem === 'all' || firstItem === 'none') { + options.external = firstItem; + } + } + + return { + ...options, + root: contextRoot, + sourceRoot, + projectRoot, + outputPath, + tsConfig: join(contextRoot, options.tsConfig), + rootDir, + mainOutputPath: resolve( + outputPath, + options.main.replace(`${projectRoot}/`, '').replace('.ts', '.js') + ), + generatePackageJson: options.generatePackageJson ?? true + }; +} diff --git a/packages/bun/src/executors/build/schema.d.ts b/packages/bun/src/executors/build/schema.d.ts index 581dda8..21b83bf 100644 --- a/packages/bun/src/executors/build/schema.d.ts +++ b/packages/bun/src/executors/build/schema.d.ts @@ -16,7 +16,7 @@ export interface BuildExecutorOptions { env?: 'inline' | 'disable' | `${string}*` | undefined; sourcemap?: 'none' | 'linked' | 'external'; minify?: boolean; - external?: string[]; + external?: 'all' | 'none' | string[]; packages?: 'bundle' | 'external'; naming?: string; publicPath?: string; @@ -28,3 +28,12 @@ export interface BuildExecutorOptions { generateLockfile?: boolean; generatePackageJson?: boolean; } + +export interface NormalizedBuildExecutorOptions extends BuildExecutorOptions { + rootDir: string; + projectRoot: string; + mainOutputPath: string; + generatePackageJson: boolean; + root?: string; + sourceRoot?: string; +} 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..c40a6aa --- /dev/null +++ b/packages/bun/src/executors/run/lib/build-bun-args.ts @@ -0,0 +1,43 @@ +import { NormalizedOptions } from './normalize-options'; + +export function buildBunArgs( + options: NormalizedOptions, + 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 index c34090c..32cc6d0 100644 --- a/packages/bun/src/executors/run/lib/calculate-resolve-mappings.ts +++ b/packages/bun/src/executors/run/lib/calculate-resolve-mappings.ts @@ -1,26 +1,20 @@ -import { - ExecutorContext, - joinPathFragments, - parseTargetString -} from '@nx/devkit'; -import { NodeExecutorOptions } from '../schema'; +import { ExecutorContext, joinPathFragments, Target } from '@nx/devkit'; import { calculateProjectBuildableDependencies, DependentBuildableProjectNode } from '@nx/js/src/utils/buildable-libs-utils'; export function calculateResolveMappings( - context: ExecutorContext, - options: NodeExecutorOptions -) { - const parsed = parseTargetString(options.buildTarget, context); + target: Target, + context: ExecutorContext +): Record { const { dependencies } = calculateProjectBuildableDependencies( context.taskGraph, context.projectGraph, context.root, - parsed.project, - parsed.target, - parsed.configuration || '' + target.project, + target.target, + target.configuration || '' ); return dependencies.reduce< Record 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..f7b1219 --- /dev/null +++ b/packages/bun/src/executors/run/lib/first-value-from.ts @@ -0,0 +1,12 @@ +export function firstValueFrom(it: AsyncIterable): Promise { + return new Promise(async (resolve, reject) => { + try { + for await (const v of it) { + return resolve(v); + } + reject(new Error('Iterator completed without a value')); + } catch (e) { + reject(e); + } + }); +} diff --git a/packages/bun/src/executors/run/lib/get-exec-argv.ts b/packages/bun/src/executors/run/lib/get-exec-argv.ts deleted file mode 100644 index f2ffa28..0000000 --- a/packages/bun/src/executors/run/lib/get-exec-argv.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { RunExecutorOptions } from '../schema'; - -export function getExecArgv(options: RunExecutorOptions): string[] { - const args: string[] = []; - - if (options.watch) { - args.push('--watch'); - } - if (options.hot) { - args.push('--hot'); - } - if (options.config) { - args.push(`-c ${options.config}`); - } - if (options.tsConfig) { - args.push(`--tsconfig-override=${options.tsConfig}`); - } - if (options.smol) { - args.push('--smol'); - } - if (options.bun) { - args.push('--bun'); - } - return args; -} 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 index a227aec..978df9e 100644 --- a/packages/bun/src/executors/run/lib/get-file-to-run.ts +++ b/packages/bun/src/executors/run/lib/get-file-to-run.ts @@ -1,14 +1,37 @@ import { ExecutorContext, logger, ProjectGraphProjectNode } from '@nx/devkit'; -import path from 'node:path'; -import { getRelativeDirectoryToProjectRoot } from '@nx/js/src/utils/get-main-file-dir'; +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 + buildTargetExecutor?: string, + main?: string ): string { + const fileName = getFileName(main, buildOptions); + if (!buildOptions?.outputPath && !buildOptions?.outputFileName) { const outputPath = project.data.targets?.[buildOptions.target]?.outputs?.[0]; @@ -19,33 +42,18 @@ export function getFileToRun( projectRoot: project.data.root, workspaceRoot: context.root }); - return path.join(outputFilePath, 'main.js'); + return join(outputFilePath, fileName); } - const fallbackFile = path.join('dist', project.data.root, 'main.js'); + const fallbackFile = join('dist', project.data.root, fileName); logger.warn( `Build option outputFileName not set for ${project.name}. Using fallback value of ${fallbackFile}.` ); - return path.join(context.root, fallbackFile); + return join(context.root, fallbackFile); } - let outputFileName = buildOptions.outputFileName; - - if (!outputFileName) { - const fileName = `${path.parse(buildOptions.main).name}.js`; - if ( - buildTargetExecutor === '@nx/js:tsc' || - buildTargetExecutor === '@nx/js:swc' - ) { - outputFileName = path.join( - getRelativeDirectoryToProjectRoot(buildOptions.main, project.data.root), - fileName - ); - } else { - outputFileName = fileName; - } - } + const outputFileName = getRelativePath(project.data.root, fileName); - return path.join(context.root, buildOptions.outputPath, outputFileName); + 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..8484378 --- /dev/null +++ b/packages/bun/src/executors/run/lib/index.ts @@ -0,0 +1,15 @@ +export * from './calculate-resolve-mappings'; +export * from './debounce'; +export * from './file-to-run-correct-path'; +export * from './first-value-from'; +export * from './build-bun-args'; +export * from './get-file-to-run'; +export * from './get-main-file-dir'; +export * from './get-relative-path'; +export * from './is-relative-path-definition'; +export * from './kill-tree'; +export * from './line-aware-writer'; +export * from './normalize-options'; +export * from './parse-target-definition'; +export * from './wait-for-targets'; +export * from './write-runtime-tsconfig-override'; 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/line-aware-writer.ts b/packages/bun/src/executors/run/lib/line-aware-writer.ts new file mode 100644 index 0000000..0d278d5 --- /dev/null +++ b/packages/bun/src/executors/run/lib/line-aware-writer.ts @@ -0,0 +1,34 @@ +export class LineAwareWriter { + private buffer = ''; + private activeTaskId: string | null = null; + + get currentProcessId(): string | null { + return this.activeTaskId; + } + + write(data: Buffer | string, taskId: string): void { + if (taskId !== this.activeTaskId) return; + + const text = data.toString(); + this.buffer += text; + + const lines = this.buffer.split('\n'); + this.buffer = lines.pop() || ''; + + for (const line of lines) { + process.stdout.write(line + '\n'); + } + } + + flush(): void { + if (this.buffer) { + process.stdout.write(this.buffer + '\n'); + this.buffer = ''; + } + } + + setActiveProcess(taskId: string | null): void { + this.flush(); + this.activeTaskId = taskId; + } +} 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..e5d110a --- /dev/null +++ b/packages/bun/src/executors/run/lib/normalize-options.ts @@ -0,0 +1,47 @@ +import { InspectType, RunExecutorOptions, WatchMode } from '../schema'; +import { ExecutorContext } from '@nx/devkit'; +import { resolve } from 'node:path'; + +export interface NormalizedOptions extends Omit { + projectName: string; + root: string; + cwd: string; + watchMode: Exclude; + inspect: false | InspectType; + shouldBuildApp: boolean; + shouldBuildDependencies: boolean; +} + +export function normalizeOptions( + options: RunExecutorOptions, + context: ExecutorContext +): NormalizedOptions { + const projectName = context.projectName!; + const root = context.root; + const cwd = options.cwd ? resolve(context.root, options.cwd) : root; + + 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 +): NormalizedOptions['watchMode'] { + return watch === true ? (shouldBuildApp ? 'nx' : 'bun') : (watch ?? false); +} diff --git a/packages/bun/src/executors/run/lib/parse-target-definition.ts b/packages/bun/src/executors/run/lib/parse-target-definition.ts new file mode 100644 index 0000000..399a85e --- /dev/null +++ b/packages/bun/src/executors/run/lib/parse-target-definition.ts @@ -0,0 +1,27 @@ +import { + ExecutorContext, + parseTargetString, + readTargetOptions, + Target +} from '@nx/devkit'; + +export function parseTargetDefinition( + targetName: string | undefined, + targetOptionsDef: Record = {}, + context: ExecutorContext +): { target: Target | null; targetOptions: Record | null } { + if (!targetName) { + return { target: null, targetOptions: null }; + } + + const target = parseTargetString(targetName, context); + + return { + target, + targetOptions: { + ...readTargetOptions(target, context), + ...targetOptionsDef, + target: target.target + } + }; +} diff --git a/packages/bun/src/executors/run/lib/run-wait-until-targets.ts b/packages/bun/src/executors/run/lib/run-wait-until-targets.ts deleted file mode 100644 index 1fae42c..0000000 --- a/packages/bun/src/executors/run/lib/run-wait-until-targets.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { RunExecutorOptions } from '../schema'; -import { ExecutorContext, parseTargetString, runExecutor } from '@nx/devkit'; - -export function runWaitUntilTargets( - options: RunExecutorOptions, - context: ExecutorContext -): Promise<{ success: boolean }[]> { - return Promise.all( - options.waitUntilTargets.map(async (waitUntilTarget) => { - const target = parseTargetString(waitUntilTarget, context); - const output = await runExecutor(target, {}, context); - return new Promise<{ success: boolean }>(async (resolve) => { - let event = await output.next(); - // Resolve after first event - resolve(event.value as { success: boolean }); - - // Continue iterating - while (!event.done) { - event = await output.next(); - } - }); - }) - ); -} 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..8a910ca --- /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 await firstValueFrom(output); + }) + ); +} diff --git a/packages/bun/src/executors/run/lib/write-runtime-tsconfig-override.ts b/packages/bun/src/executors/run/lib/write-runtime-tsconfig-override.ts new file mode 100644 index 0000000..3c8e663 --- /dev/null +++ b/packages/bun/src/executors/run/lib/write-runtime-tsconfig-override.ts @@ -0,0 +1,25 @@ +import { ExecutorContext, Target } from '@nx/devkit'; +import { join } from 'node:path'; +import { existsSync, mkdirSync, writeFileSync } from 'node:fs'; +import { calculateResolveMappings } from './calculate-resolve-mappings'; + +export function writeRuntimeTsconfigOverride( + projectName: string, + buildTarget: Target, + root: string, + context: ExecutorContext +) { + const paths = calculateResolveMappings(buildTarget, context); + + const outDir = join(root, 'node_modules/.cache/@stonx/bun'); + if (!existsSync(outDir)) mkdirSync(outDir, { recursive: true }); + const file = join(outDir, `${projectName}-runtime.tsconfig.json`); + const json = { + compilerOptions: { + baseUrl: '.', + paths + } + }; + writeFileSync(file, JSON.stringify(json, null, 2)); + return file; +} diff --git a/packages/bun/src/executors/run/run.old.ts b/packages/bun/src/executors/run/run.old.ts new file mode 100644 index 0000000..2028341 --- /dev/null +++ b/packages/bun/src/executors/run/run.old.ts @@ -0,0 +1,505 @@ +// import { ChildProcess, spawn } from 'node:child_process'; +// import { join, relative } from 'node:path'; +// import { +// ExecutorContext, +// logger, +// readTargetOptions, +// runExecutor +// } from '@nx/devkit'; +// import { getBunVersion, UniversalChildProcess } from '../../utils'; +// import { RunExecutorOptions } from './schema'; +// import { +// firstValueFrom, +// buildBunArgs, +// NormalizedOptions, +// normalizeOptions, +// waitForTargets, +// writeRuntimeTsconfigOverride +// } from './lib'; +// +// interface ActiveTask { +// id: string; +// killed: boolean; +// promise: Promise | null; +// childProcess: UniversalChildProcess | null; +// start: () => Promise; +// stop: (signal: NodeJS.Signals) => Promise; +// } +// +// function resolveEntryFromSources( +// opts: NormalizedOptions, +// context: ExecutorContext +// ) { +// if (!opts.main) +// throw new Error('entry is required when buildTarget is not set'); +// return join(context.root, opts.main); +// } +// +// function resolveEntryFromBuildResult( +// res: any, +// buildOpts: any, +// context: ExecutorContext +// ) { +// // Common patterns: esbuild -> outfile; tsc -> outputPath + main; custom -> explicit "main" +// if (res.outfile) return join(context.root, res.outfile); +// if (res.outputPath && buildOpts?.main) +// return join( +// context.root, +// res.outputPath, +// relative(context.root, buildOpts.main).replace(/\.ts(x?)$/, '.js$1') +// ); +// if (res.outputPath && res.main) +// return join(context.root, res.outputPath, res.main); +// if (res.outputFile) return join(context.root, res.outputFile); +// throw new Error( +// 'Cannot resolve entry file from build result. Provide a known build executor or return outfile.' +// ); +// } +// +// export default 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`); +// } +// +// if (!context.projectName) { +// throw new Error(`project name is undefined`); +// } +// +// const options = normalizeOptions(_options, context); +// +// // 1) Gate: wait for dependent tasks if configured +// if (options.waitUntilTargets?.length) { +// await waitForTargets(options.waitUntilTargets, context); +// } +// +// // 2) Decide mode +// const { +// projectName, +// root, +// cwd, +// bunBin, +// shouldBuildApp, +// shouldBuildDependencies, +// watchMode, +// buildTarget +// } = options; +// +// // 3) Prepare path remapping for "built libs first" +// const tsconfigOverridePath = +// options.tsConfigOverride && +// buildTarget && +// (shouldBuildApp ? options.runBuildTargetDependencies !== false : false) +// ? writeRuntimeTsconfigOverride(projectName, buildTarget, root, context) +// : null; +// +// // 4) Start processes +// let child: ChildProcess | null = null; +// +// const startBun = (entryFile: string) => { +// const cliArgs = buildBunArgs(options, entryFile); +// +// child = spawn(bunBin, cliArgs, { +// cwd, +// stdio: 'inherit', +// env: { ...process.env } +// }); +// +// child.on('exit', (code, signal) => { +// if (watchMode === 'nx') { +// // exit will be managed by outer watch loop +// return; +// } +// // stop generator when not watching +// if (code != null && code !== 0) +// logger.error(`bun exited with code ${code}`); +// }); +// }; +// +// const stopBun = async () => { +// if (!child) return; +// const p = child; +// child = null; +// // Try graceful first +// p.kill('SIGTERM'); +// // Hard kill fallback after 1s +// setTimeout(() => p.kill('SIGKILL'), 1000); +// }; +// +// // Forward signals +// const onSig = async () => { +// await stopBun(); +// // end generator +// }; +// process.once('SIGINT', onSig); +// process.once('SIGTERM', onSig); +// +// if (!shouldBuildApp) { +// // Run sources directly with Bun +// startBun(resolveEntryFromSources(options, context)); +// yield { success: true }; +// // Keep alive until the child exits +// await new Promise((resolve) => child?.on('exit', () => resolve())); +// return; +// } +// +// if (buildTarget) { +// // Use the Nx build target +// const baseBuildOpts = readTargetOptions(buildTarget, context); +// +// // Watch via Nx if requested; else build once and run +// if (watchMode === 'nx') { +// for await (const res of await runExecutor( +// buildTarget, +// { ...baseBuildOpts, watch: true }, +// context +// )) { +// if (!res.success) { +// logger.warn('Build failed. Waiting for the next successful rebuild…'); +// continue; +// } +// const entry = resolveEntryFromBuildResult(res, baseBuildOpts, context); +// await stopBun(); +// startBun(entry); +// // emit success on first start; generator remains open without timers +// yield { success: true }; +// } +// await stopBun(); +// return; +// } else { +// // build once, then run with Bun’s own file watching if user asked for it +// const first = await firstValueFrom( +// await runExecutor( +// buildTarget, +// { ...baseBuildOpts, watch: false }, +// context +// ) +// ); +// if (!first.success) return yield* [{ success: false }]; +// const entry = resolveEntryFromBuildResult(first, baseBuildOpts, context); +// startBun(entry); +// yield { success: true }; +// await new Promise((resolve) => child?.on('exit', () => resolve())); +// return; +// } +// } +// // +// // process.env.NODE_ENV ??= context?.configurationName ?? 'development'; +// // +// // const project = context.projectGraph.nodes[context.projectName]; +// // const buildTarget = parseTargetString(options.buildTarget, context); +// // const projectBuildTargetConfig = project.data.targets?.[buildTarget.target]; +// // +// // if (!projectBuildTargetConfig) { +// // throw new Error( +// // `Cannot find build target ${options.buildTarget} for project ${context.projectName}` +// // ); +// // } +// // +// // const buildTargetExecutor = projectBuildTargetConfig.executor; +// // +// // if (buildTargetExecutor === 'nx:run-commands') { +// // // Run commands does not emit build event, so we have to switch to run entire build through Nx CLI. +// // options.runBuildTargetDependencies = true; +// // } +// // +// // const buildOptions: Record = { +// // ...readTargetOptions(buildTarget, context), +// // ...options.buildTargetOptions, +// // target: buildTarget.target +// // }; +// // +// // if (options.waitUntilTargets && options.waitUntilTargets.length > 0) { +// // 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]}.` +// // ); +// // } +// // } +// // } +// // +// // // Re-map buildable workspace projects to their output directory. +// // // const mappings = calculateResolveMappings(context, options); +// // const fileToRun = getFileToRun( +// // context, +// // project, +// // buildOptions, +// // buildTargetExecutor +// // ); +// // +// // let additionalExitHandler: null | (() => void) = null; +// // let currentTask: ActiveTask | null = null; +// // const tasks: ActiveTask[] = []; +// // +// // const args = getCliArgs(options); +// // +// // yield* createAsyncIterable<{ +// // success: boolean; +// // options?: Record; +// // }>(async ({ done, next, error, registerCleanup }) => { +// // const processQueue = async () => { +// // if (tasks.length === 0) return; +// // +// // const previousTask = currentTask; +// // const task = tasks.shift(); +// // currentTask = task ?? null; +// // await previousTask?.stop('SIGTERM'); +// // await task?.start(); +// // }; +// // +// // const debouncedProcessQueue = debounce( +// // processQueue, +// // options.debounce ?? 1_000 +// // ); +// // +// // const addToQueue = async ( +// // childProcess: null | ChildProcess, +// // buildResult: Promise<{ success: boolean }> +// // ) => { +// // const task: ActiveTask = { +// // id: randomUUID(), +// // killed: false, +// // childProcess, +// // promise: null, +// // start: async () => { +// // // Wait for build to finish. +// // const result = await buildResult; +// // +// // if (result && !result.success) { +// // if (options.watch) { +// // if (!task.killed) { +// // logger.error(`Build failed, waiting for changes to restart...`); +// // } +// // return; +// // } else { +// // throw new Error(`Build failed. See above for errors.`); +// // } +// // } +// // +// // if (task.killed) { +// // return; +// // } +// // +// // // Run the program +// // task.promise = new Promise(async (resolve, reject) => { +// // const proc = await spawnWithBun( +// // ['run', ...args, fileToRunCorrectPath(fileToRun)], +// // { +// // stderr: 'pipe', +// // stdin: 'inherit', +// // stdout: 'inherit' +// // } +// // ); +// // +// // task.childProcess = proc; +// // +// // if (isBunSubprocess(proc)) { +// // const stderrReader = proc.stderr?.getReader(); +// // +// // const handleStderr = async () => { +// // if (!stderrReader) { +// // return; +// // } +// // +// // try { +// // while (true) { +// // const { done, value } = await stderrReader.read(); +// // if (done || task.killed) break; +// // if (value) logger.error(new TextDecoder().decode(value)); +// // } +// // } catch (err) { +// // if (!task.killed) +// // logger.error(`Error reading stderr: ${err}`); +// // } +// // }; +// // +// // handleStderr(); +// // +// // proc.exited.then((code) => { +// // stderrReader?.cancel(); +// // handleExit(code); +// // }); +// // } else { +// // // Node stderr handling +// // const handleStdErr = (data: ArrayBuffer) => { +// // if (!options.watch || !task.killed) { +// // logger.error(data.toString()); +// // } +// // }; +// // proc.stderr?.on('data', handleStdErr); +// // proc.once('exit', (code) => { +// // proc?.off('data', handleStdErr); +// // handleExit(code ?? 0); +// // }); +// // } +// // +// // function handleExit(code: number) { +// // if (options.watch && !task.killed) { +// // logger.info( +// // `NX Process exited with code ${code}, waiting for changes to restart...` +// // ); +// // } +// // if (!options.watch) { +// // if (code !== 0) { +// // reject(new Error(`Process exited with code ${code}`)); +// // } else { +// // resolve(done()); +// // } +// // } +// // resolve(); +// // } +// // +// // next({ success: true, options: buildOptions }); +// // }); +// // }, +// // stop: async (signal: NodeJS.Signals = 'SIGTERM') => { +// // task.killed = true; +// // +// // if (task.childProcess?.pid) { +// // await killTree(task.childProcess.pid, signal); +// // } +// // try { +// // await task.promise; +// // } catch {} +// // } +// // }; +// // +// // tasks.push(task); +// // }; +// // +// // const output = await runExecutor( +// // buildTarget, +// // { +// // ...options.buildTargetOptions, +// // watch: options.watch +// // }, +// // context +// // ); +// // // eslint-disable-next-line no-constant-condition +// // while (true) { +// // const event = await output.next(); +// // await addToQueue(null, Promise.resolve(event.value)); +// // await debouncedProcessQueue(); +// // if (event.done || !options.watch) { +// // break; +// // } +// // } +// // +// // const stopAllTasks = async (signal: NodeJS.Signals = 'SIGTERM') => { +// // if (typeof additionalExitHandler === 'function') { +// // additionalExitHandler(); +// // } +// // if (typeof currentTask?.stop === 'function') { +// // await currentTask.stop(signal); +// // } +// // for (const task of tasks) { +// // await task.stop(signal); +// // } +// // }; +// // +// // process.on('SIGTERM', async () => { +// // await stopAllTasks('SIGTERM'); +// // process.exit(128 + 15); +// // }); +// // process.on('SIGINT', async () => { +// // await stopAllTasks('SIGINT'); +// // process.exit(128 + 2); +// // }); +// // process.on('SIGHUP', async () => { +// // await stopAllTasks('SIGHUP'); +// // process.exit(128 + 1); +// // }); +// // +// // registerCleanup?.(async () => { +// // await stopAllTasks('SIGTERM'); +// // }); +// // +// // if (options.runBuildTargetDependencies) { +// // const runBuild = async () => { +// // let childProcess: UniversalChildProcess | null = null; +// // const whenReady = new Promise<{ success: boolean }>(async (resolve) => { +// // childProcess = await runFork( +// // require.resolve('nx'), +// // [ +// // 'run', +// // `${context.projectName}:${buildTarget.target}${ +// // buildTarget.configuration ? `:${buildTarget.configuration}` : '' +// // }` +// // ], +// // { +// // cwd: context.root, +// // stdio: 'inherit' +// // } +// // ); +// // +// // const handleExit = (code: number | null) => { +// // if (code === 0) resolve({ success: true }); +// // // If process is killed due to current task being killed, then resolve with success. +// // else resolve({ success: !!currentTask?.killed }); +// // }; +// // +// // if (isBunSubprocess(childProcess)) { +// // childProcess.exited.then(handleExit); +// // } else { +// // childProcess.once('exit', handleExit); +// // } +// // }); +// // await addToQueue(childProcess, whenReady); +// // await debouncedProcessQueue(); +// // }; +// // +// // if (isDaemonEnabled()) { +// // additionalExitHandler = await daemonClient.registerFileWatcher( +// // { +// // watchProjects: [context.projectName || ''], +// // includeDependentProjects: true +// // }, +// // async (err, data) => { +// // if (err === 'closed') { +// // logger.error(`Watch error: Daemon closed the connection`); +// // process.exit(1); +// // } else if (err) { +// // logger.error(`Watch error: ${err?.message ?? 'Unknown'}`); +// // } else { +// // if (options.watch) { +// // logger.info(`NX File change detected. Restarting...`); +// // await runBuild(); +// // } +// // } +// // } +// // ); +// // } else { +// // logger.warn( +// // `NX Daemon is not running. Node process will not restart automatically after file changes.` +// // ); +// // } +// // await runBuild(); // run first build +// // } else { +// // // Otherwise, run the build executor, which will not run task dependencies. +// // // This is mostly fine for bundlers like webpack that should already watch for dependency libs. +// // // For tsc/swc or custom build commands, consider using `runBuildTargetDependencies` instead. +// // const output = await runExecutor( +// // buildTarget, +// // { +// // ...options.buildTargetOptions, +// // watch: options.watch +// // }, +// // context +// // ); +// // while (true) { +// // const event = await output.next(); +// // await addToQueue(null, Promise.resolve(event.value)); +// // await debouncedProcessQueue(); +// // if (event.done || !options.watch) { +// // break; +// // } +// // } +// // } +// // }); +// } diff --git a/packages/bun/src/executors/run/run.ts b/packages/bun/src/executors/run/run.ts index 189dc30..acf8ba0 100644 --- a/packages/bun/src/executors/run/run.ts +++ b/packages/bun/src/executors/run/run.ts @@ -1,41 +1,54 @@ -import { ChildProcess } from 'node:child_process'; -import { randomUUID } from 'node:crypto'; -import { createAsyncIterable } from '@nx/devkit/src/utils/async-iterable'; import { ExecutorContext, - parseTargetString, - readTargetOptions, logger, - runExecutor, - isDaemonEnabled + parseTargetString, + readTargetOptions } from '@nx/devkit'; - +import { createAsyncIterable } from '@nx/devkit/src/utils/async-iterable'; +import { resolve } from 'node:path'; import { getBunVersion, - isBunSubprocess, - runFork, - spawnWithBun, - UniversalChildProcess + killProcess, + spawnProcess, + SpawnResult, + waitForExit } from '../../utils'; import { RunExecutorOptions } from './schema'; -import { debounce } from './lib/debounce'; -import { getFileToRun } from './lib/get-file-to-run'; -import { getExecArgv } from './lib/get-exec-argv'; -import { runWaitUntilTargets } from './lib/run-wait-until-targets'; -import { fileToRunCorrectPath } from './lib/file-to-run-correct-path'; -import { killTree } from './lib/kill-tree'; -import { daemonClient } from 'nx/src/daemon/client/client'; +import { getFileToRun } from './lib'; + +export interface BunRunExecutorOptions { + main?: string; + buildTarget?: string; + args?: string[]; + runtimeArgs?: string[]; + cwd?: string; + env?: Record; +} + +function buildArgs(entry: string, opts: BunRunExecutorOptions) { + const args: string[] = []; + if (opts.runtimeArgs?.length) args.push(...opts.runtimeArgs); + args.push(entry); + if (opts.args?.length) args.push(...opts.args); + return args; +} -interface ActiveTask { - id: string; - killed: boolean; - promise: Promise | null; - childProcess: UniversalChildProcess | null; - start: () => Promise; - stop: (signal: NodeJS.Signals) => Promise; +function launch( + entry: string, + opts: BunRunExecutorOptions, + cwd: string +): SpawnResult { + const bunCmd = process.platform === 'win32' ? 'bun.exe' : 'bun'; + const args = buildArgs(entry, opts); + + return spawnProcess(bunCmd, args, { + cwd, + env: opts.env, + stdio: 'inherit' + }); } -export default async function* bunRunExecutor( +async function* bunRunExecutor( options: RunExecutorOptions, context: ExecutorContext ) { @@ -45,322 +58,73 @@ export default async function* bunRunExecutor( throw new Error(`bun command not found. Make sure the bun is available`); } - if (!context.projectName) { - throw new Error(`project name is undefined`); - } - process.env.NODE_ENV ??= context?.configurationName ?? 'development'; - const project = context.projectGraph.nodes[context.projectName]; - const buildTarget = parseTargetString(options.buildTarget, context); - const projectBuildTargetConfig = project.data.targets?.[buildTarget.target]; - - if (!projectBuildTargetConfig) { - throw new Error( - `Cannot find build target ${options.buildTarget} for project ${context.projectName}` - ); - } - - const buildTargetExecutor = projectBuildTargetConfig.executor; - - if (buildTargetExecutor === 'nx:run-commands') { - // Run commands does not emit build event, so we have to switch to run entire build through Nx CLI. - options.runBuildTargetDependencies = true; - } - - const buildOptions: Record = { - ...readTargetOptions(buildTarget, context), - ...options.buildTargetOptions, - target: buildTarget.target - }; - - if (options.waitUntilTargets && options.waitUntilTargets.length > 0) { - const results = await runWaitUntilTargets(options, context); - for (const [i, result] of results.entries()) { - if (!result.success) { - throw new Error( - `Wait until target failed: ${options.waitUntilTargets[i]}.` - ); - } + const project = context.projectGraph.nodes[context.projectName!]; + const cwd = options.cwd ? resolve(context.root, options.cwd) : context.root; + + yield* createAsyncIterable<{ success: boolean }>(async ({ next, done }) => { + // Case 1: "main" only (no buildTarget) + logger.log('Bun Run: 1'); + if (options.main && !options.buildTarget) { + logger.log('Bun Run: 1.1'); + const entry = resolve(context.root, options.main); + const proc = launch(entry, options, cwd); + const code = await waitForExit(proc); + logger.log('Bun Run: 1.2'); + next({ success: code === 0 }); + done(); + return; } - } - // Re-map buildable workspace projects to their output directory. - // const mappings = calculateResolveMappings(context, options); - const fileToRun = getFileToRun( - context, - project, - buildOptions, - buildTargetExecutor - ); - - let additionalExitHandler: null | (() => void) = null; - let currentTask: ActiveTask | null = null; - const tasks: ActiveTask[] = []; - - const args = getExecArgv(options); - - yield* createAsyncIterable<{ - success: boolean; - options?: Record; - }>(async ({ done, next, error, registerCleanup }) => { - const processQueue = async () => { - if (tasks.length === 0) return; - - const previousTask = currentTask; - const task = tasks.shift(); - currentTask = task ?? null; - await previousTask?.stop('SIGTERM'); - await task?.start(); - }; - - const debouncedProcessQueue = debounce( - processQueue, - options.debounce ?? 1_000 - ); - - const addToQueue = async ( - childProcess: null | ChildProcess, - buildResult: Promise<{ success: boolean }> - ) => { - const task: ActiveTask = { - id: randomUUID(), - killed: false, - childProcess, - promise: null, - start: async () => { - // Wait for build to finish. - const result = await buildResult; - - if (result && !result.success) { - if (options.watch) { - if (!task.killed) { - logger.error(`Build failed, waiting for changes to restart...`); - } - return; - } else { - throw new Error(`Build failed. See above for errors.`); - } - } - - if (task.killed) { - return; - } - - // Run the program - task.promise = new Promise(async (resolve, reject) => { - const proc = spawnWithBun( - ['run', ...args, fileToRunCorrectPath(fileToRun)], - { - stderr: 'pipe', - stdin: 'inherit', - stdout: 'inherit' - } - ); - - task.childProcess = proc; - - if (isBunSubprocess(proc)) { - const stderrReader = proc.stderr?.getReader(); - - const handleStderr = async () => { - if (!stderrReader) { - return; - } - - try { - while (true) { - const { done, value } = await stderrReader.read(); - if (done || task.killed) break; - if (value) logger.error(new TextDecoder().decode(value)); - } - } catch (err) { - if (!task.killed) - logger.error(`Error reading stderr: ${err}`); - } - }; - - handleStderr(); - - proc.exited.then((code) => { - stderrReader?.cancel(); - handleExit(code); - }); - } else { - // Node stderr handling - const handleStdErr = (data: ArrayBuffer) => { - if (!options.watch || !task.killed) { - logger.error(data.toString()); - } - }; - proc.stderr?.on('data', handleStdErr); - proc.once('exit', (code) => { - proc?.off('data', handleStdErr); - handleExit(code ?? 0); - }); - } - - function handleExit(code: number) { - if (options.watch && !task.killed) { - logger.info( - `NX Process exited with code ${code}, waiting for changes to restart...` - ); - } - if (!options.watch) { - if (code !== 0) { - reject(new Error(`Process exited with code ${code}`)); - } else { - resolve(done()); - } - } - resolve(); - } - - next({ success: true, options: buildOptions }); - }); - }, - stop: async (signal: NodeJS.Signals = 'SIGTERM') => { - task.killed = true; - - if (task.childProcess?.pid) { - await killTree(task.childProcess.pid, signal); - } - try { - await task.promise; - } catch {} - } + // Case 2: buildTarget defined + logger.log('Bun Run: 2'); + if (options.buildTarget) { + logger.log('Bun Run: 2.1'); + 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; - tasks.push(task); - }; + logger.log('Bun Run: 2.2'); - const output = await runExecutor( - buildTarget, - { - ...options.buildTargetOptions, - watch: options.watch - }, - context - ); - // eslint-disable-next-line no-constant-condition - while (true) { - const event = await output.next(); - await addToQueue(null, Promise.resolve(event.value)); - await debouncedProcessQueue(); - if (event.done || !options.watch) { - break; - } - } - - const stopAllTasks = async (signal: NodeJS.Signals = 'SIGTERM') => { - if (typeof additionalExitHandler === 'function') { - additionalExitHandler(); - } - if (typeof currentTask?.stop === 'function') { - await currentTask.stop(signal); - } - for (const task of tasks) { - await task.stop(signal); - } - }; - - process.on('SIGTERM', async () => { - await stopAllTasks('SIGTERM'); - process.exit(128 + 15); - }); - process.on('SIGINT', async () => { - await stopAllTasks('SIGINT'); - process.exit(128 + 2); - }); - process.on('SIGHUP', async () => { - await stopAllTasks('SIGHUP'); - process.exit(128 + 1); - }); - - registerCleanup?.(async () => { - await stopAllTasks('SIGTERM'); - }); - - if (options.runBuildTargetDependencies) { - const runBuild = async () => { - let childProcess: UniversalChildProcess | null = null; - const whenReady = new Promise<{ success: boolean }>(async (resolve) => { - childProcess = runFork( - require.resolve('nx'), - [ - 'run', - `${context.projectName}:${buildTarget.target}${ - buildTarget.configuration ? `:${buildTarget.configuration}` : '' - }` - ], - { - cwd: context.root, - stdio: 'inherit' - } - ); - - const handleExit = (code: number | null) => { - if (code === 0) resolve({ success: true }); - // If process is killed due to current task being killed, then resolve with success. - else resolve({ success: !!currentTask?.killed }); - }; + let current: SpawnResult | null = null; - if (isBunSubprocess(childProcess)) { - childProcess.exited.then(handleExit); - } else { - childProcess.once('exit', handleExit); - } - }); - await addToQueue(childProcess, whenReady); - await debouncedProcessQueue(); - }; - - if (isDaemonEnabled()) { - additionalExitHandler = await daemonClient.registerFileWatcher( - { - watchProjects: [context.projectName || ''], - includeDependentProjects: true - }, - async (err, data) => { - if (err === 'closed') { - logger.error(`Watch error: Daemon closed the connection`); - process.exit(1); - } else if (err) { - logger.error(`Watch error: ${err?.message ?? 'Unknown'}`); - } else { - if (options.watch) { - logger.info(`NX File change detected. Restarting...`); - await runBuild(); - } - } - } - ); - } else { - logger.warn( - `NX Daemon is not running. Node process will not restart automatically after file changes.` - ); - } - await runBuild(); // run first build - } else { - // Otherwise, run the build executor, which will not run task dependencies. - // This is mostly fine for bundlers like webpack that should already watch for dependency libs. - // For tsc/swc or custom build commands, consider using `runBuildTargetDependencies` instead. - const output = await runExecutor( - buildTarget, - { - ...options.buildTargetOptions, - watch: options.watch - }, - context + const entry = getFileToRun( + context, + project, + buildOptions, + buildTargetExecutor, + options.main ); - while (true) { - const event = await output.next(); - await addToQueue(null, Promise.resolve(event.value)); - await debouncedProcessQueue(); - if (event.done || !options.watch) { - break; - } - } + logger.log('Bun Run: 2.7'); + + await killProcess(current); + logger.log('Bun Run: 2.8'); + current = launch(entry, options, cwd); + logger.log('Bun Run: 2.9'); + + const code = await waitForExit(current); + logger.log('Bun Run: 2.10'); + next({ success: code === 0 }); + logger.log('Bun Run: 2.11'); + + await killProcess(current); + logger.log('Bun Run: 2.12'); + done(); + logger.log('Bun Run: 2.13'); + return; } + logger.log('Bun Run: 2.14'); + + 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 index ac957f9..7b68534 100644 --- a/packages/bun/src/executors/run/schema.d.ts +++ b/packages/bun/src/executors/run/schema.d.ts @@ -1,20 +1,28 @@ +export type WatchMode = boolean | 'nx' | 'bun'; + +export enum InspectType { + Inspect = 'inspect', + InspectBrk = 'inspect-brk' +} + export interface RunExecutorOptions { - buildTarget: string; + main?: string; + buildTarget?: string; buildTargetOptions?: Record; - watch?: boolean; + runtimeArgs: string[]; + args: string[]; + watch?: WatchMode; hot?: boolean; - debounce?: number; + inspect: boolean | InspectType; + debounce?: number; // TODO: add to schema config?: string; tsConfig?: string; + tsConfigOverride?: string; smol?: boolean; bun?: boolean; runBuildTargetDependencies?: boolean; waitUntilTargets: string[]; -} - -export const enum InspectType { - Inspect = 'inspect', - InspectBrk = 'inspect-brk' + cwd?: string; } export interface NodeExecutorOptions { diff --git a/packages/bun/src/executors/run/schema.json b/packages/bun/src/executors/run/schema.json index 9903328..1fb78ad 100644 --- a/packages/bun/src/executors/run/schema.json +++ b/packages/bun/src/executors/run/schema.json @@ -5,9 +5,13 @@ "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": "The target to run to build you the app." + "description": "Optional target that builds/rebuilds prior to (re)starting Bun, e.g. app:build" }, "buildTargetOptions": { "type": "object", @@ -15,7 +19,10 @@ "default": {} }, "watch": { - "type": "boolean", + "oneOf": [ + { "type": "boolean" }, + { "type": "string", "enum": ["nx", "bun"] } + ], "description": "To run a file in watch mode", "default": false }, @@ -24,6 +31,32 @@ "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" @@ -32,6 +65,10 @@ "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.", @@ -45,7 +82,7 @@ "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": false + "default": true }, "waitUntilTargets": { "type": "array", @@ -54,6 +91,10 @@ "items": { "type": "string" } + }, + "cwd": { + "description": "Current working directory of the command.", + "type": "string" } }, "required": [] diff --git a/packages/bun/src/generators/application/lib/create-targets.ts b/packages/bun/src/generators/application/lib/create-targets.ts index f74def7..3e0f9cb 100644 --- a/packages/bun/src/generators/application/lib/create-targets.ts +++ b/packages/bun/src/generators/application/lib/create-targets.ts @@ -7,7 +7,7 @@ import { import { NormalizedOptions } from './normalize-options'; import { libs } from '../../../utils'; import { BuildExecutorOptions } from '../../../executors/build/schema'; -import { RunExecutorOptions } from '../../../executors/run/schema'; +import { InspectType, RunExecutorOptions } from '../../../executors/run/schema'; export function getBuildConfig( options: NormalizedOptions @@ -41,7 +41,10 @@ export function getServeConfig( bun: true, smol: false, runBuildTargetDependencies: false, - waitUntilTargets: [] + waitUntilTargets: [], + runtimeArgs: [], + args: [], + inspect: InspectType.Inspect }, configurations: { development: { diff --git a/packages/bun/src/utils/cli.ts b/packages/bun/src/utils/cli.ts index 13aebb7..04bd8ea 100644 --- a/packages/bun/src/utils/cli.ts +++ b/packages/bun/src/utils/cli.ts @@ -1,8 +1,7 @@ import { workspaceRoot } from '@nx/devkit'; import { workerData } from 'node:worker_threads'; import type { ChildProcess, IOType, SpawnOptions } from 'node:child_process'; -import { spawn as nodeSpawn } from 'node:child_process'; -import { ForkOptions } from 'child_process'; +import { spawn } from 'node:child_process'; export const isBun = typeof Bun !== 'undefined'; @@ -10,12 +9,6 @@ export type UniversalChildProcess = | ChildProcess | Bun.Subprocess; -export function isBunSubprocess( - process: UniversalChildProcess -): process is Bun.Subprocess { - return isBun && 'exited' in process; -} - export async function universalSpawnSync(cmd: string): Promise { if (isBun) { const result = Bun.spawnSync({ cmd: cmd.split(' ') }); @@ -58,12 +51,13 @@ export function runSpawn( spawnOptions.stdio = [stdin, stdout, stderr]; } - return nodeSpawn(cmd, args, spawnOptions); + return spawn(cmd, args, spawnOptions); } } export interface SpawnWithBunOptions { cwd?: string; + stdio?: IOType; stdin?: IOType; stdout?: IOType; stderr?: IOType; @@ -74,17 +68,23 @@ export function spawnWithBun( 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' } = options; + const { + stdin = 'ignore', + stdout = 'pipe', + stderr = 'pipe', + stdio = 'pipe' + } = options; if (isBun) { return Bun.spawn({ - cmd: ['bun', ...args], + cmd: [bunBin, ...args], cwd, env, stdin, @@ -93,32 +93,10 @@ export function spawnWithBun( }); } - const { spawn } = await import('node:child_process'); - - return spawn('bun', args, { + return spawn(bunBin, args, { cwd, env, windowsHide: true, - stdio: [stdin, stdout, stderr] + stdio }); } - -export function runFork( - modulePath: string, - args: ReadonlyArray = [], - options: ForkOptions = {} -) { - if (isBun) { - // Bun.spawn version - return Bun.spawn({ - cmd: ['bun', modulePath, ...args], - stdin: 'inherit', - stdout: 'inherit', - stderr: 'pipe' - }); - } else { - // Node.js fork version - const { fork } = await import('node:child_process'); - return fork(modulePath, args, options); - } -} diff --git a/packages/bun/src/utils/index.ts b/packages/bun/src/utils/index.ts index ac38e4d..6bfd3cc 100644 --- a/packages/bun/src/utils/index.ts +++ b/packages/bun/src/utils/index.ts @@ -1,3 +1,4 @@ export * from './bun'; export * from './cli'; export * from './dependencies'; +export * from './process-adapter'; diff --git a/packages/bun/src/utils/process-adapter.ts b/packages/bun/src/utils/process-adapter.ts new file mode 100644 index 0000000..5d76a84 --- /dev/null +++ b/packages/bun/src/utils/process-adapter.ts @@ -0,0 +1,96 @@ +import { + spawn as nodeSpawn, + ChildProcess, + type IOType +} from 'node:child_process'; +import { StdioOptions } from 'child_process'; + +export function isBunRuntime(): boolean { + return typeof Bun !== 'undefined'; +} + +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 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: options.cwd, + env, + stdio: [stdin, stdout, stderr] + }); + } + + return nodeSpawn(command, args, { + cwd: options.cwd, + env, + stdio + }); +} + +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 {} + 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 {} + resolve(); + }, 3000); + }); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2186aeb..da5aa67 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: '@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)) + '@stonx/bun': + specifier: 0.0.0-e2e + version: 0.0.0-e2e(@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))) '@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) @@ -135,11 +138,11 @@ importers: packages/bun: dependencies: '@nx/devkit': - specifier: 21.3.11 + specifier: '>=20.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))) - tslib: - specifier: ^2.3.0 - version: 2.8.1 + '@nx/js': + specifier: '>=20.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)) packages/elysia: dependencies: @@ -1245,6 +1248,12 @@ packages: '@sinonjs/fake-timers@13.0.5': resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} + '@stonx/bun@0.0.0-e2e': + resolution: {integrity: sha512-0B6FpK596wyFILX0RjFiSNw2+YGcxMciWF+sov/6UH9DDrVUurWKQvnDwsWPMjnsBjGCTJjK0C4CVMYnOY75AA==} + peerDependencies: + '@nx/devkit': '>=20.0.0 <22.0.0' + '@nx/js': '>=20.0.0 <22.0.0' + '@swc-node/core@1.13.3': resolution: {integrity: sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA==} engines: {node: '>= 10'} @@ -5900,6 +5909,11 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@stonx/bun@0.0.0-e2e(@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)))': + 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)) + '@swc-node/core@1.13.3(@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) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 4d69131..d22b7d5 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,5 @@ packages: - 'packages/*' + - 'apps/*' 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.json b/tsconfig.json index 1df6406..4de7b46 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,6 +11,9 @@ }, { "path": "./packages/bun" + }, + { + "path": "./apps/foo-app" } ] } From 36b5982e06531b719728aed5250061e0a8379bb9 Mon Sep 17 00:00:00 2001 From: Boris Polak <18208654+BorisTB@users.noreply.github.com> Date: Wed, 20 Aug 2025 17:05:48 +0200 Subject: [PATCH 03/12] fix(bun): fixed watch --- .../src/executors/run/lib/build-bun-args.ts | 4 +- .../src/executors/run/lib/first-value-from.ts | 18 +++---- .../executors/run/lib/normalize-options.ts | 20 +++----- .../src/executors/run/lib/wait-for-targets.ts | 2 +- packages/bun/src/executors/run/run.ts | 51 +++++++++---------- packages/bun/src/executors/run/schema.d.ts | 21 ++++---- .../application/lib/create-targets.ts | 7 +-- packages/bun/src/utils/cli.ts | 2 +- packages/bun/src/utils/index.ts | 1 + .../bun/src/utils/is-bun-build-executor.ts | 5 ++ packages/bun/src/utils/process-adapter.ts | 15 +++++- 11 files changed, 75 insertions(+), 71 deletions(-) create mode 100644 packages/bun/src/utils/is-bun-build-executor.ts diff --git a/packages/bun/src/executors/run/lib/build-bun-args.ts b/packages/bun/src/executors/run/lib/build-bun-args.ts index c40a6aa..cb52701 100644 --- a/packages/bun/src/executors/run/lib/build-bun-args.ts +++ b/packages/bun/src/executors/run/lib/build-bun-args.ts @@ -1,7 +1,7 @@ -import { NormalizedOptions } from './normalize-options'; +import { NormalizedRunExecutorOptions } from '../schema'; export function buildBunArgs( - options: NormalizedOptions, + options: NormalizedRunExecutorOptions, entryFile?: string ): string[] { const args: string[] = []; diff --git a/packages/bun/src/executors/run/lib/first-value-from.ts b/packages/bun/src/executors/run/lib/first-value-from.ts index f7b1219..d352ecd 100644 --- a/packages/bun/src/executors/run/lib/first-value-from.ts +++ b/packages/bun/src/executors/run/lib/first-value-from.ts @@ -1,12 +1,12 @@ -export function firstValueFrom(it: AsyncIterable): Promise { - return new Promise(async (resolve, reject) => { - try { - for await (const v of it) { - return resolve(v); - } - reject(new Error('Iterator completed without a value')); - } catch (e) { - reject(e); +export function firstValueFrom(it: AsyncIterableIterator): Promise { + return new Promise(async (resolve) => { + let event = await it.next(); + // Resolve after first event + resolve(event.value as T); + + // Continue iterating + while (!event.done) { + event = await it.next(); } }); } diff --git a/packages/bun/src/executors/run/lib/normalize-options.ts b/packages/bun/src/executors/run/lib/normalize-options.ts index e5d110a..648ff20 100644 --- a/packages/bun/src/executors/run/lib/normalize-options.ts +++ b/packages/bun/src/executors/run/lib/normalize-options.ts @@ -1,21 +1,15 @@ -import { InspectType, RunExecutorOptions, WatchMode } from '../schema'; +import { + InspectType, + NormalizedRunExecutorOptions, + RunExecutorOptions +} from '../schema'; import { ExecutorContext } from '@nx/devkit'; import { resolve } from 'node:path'; -export interface NormalizedOptions extends Omit { - projectName: string; - root: string; - cwd: string; - watchMode: Exclude; - inspect: false | InspectType; - shouldBuildApp: boolean; - shouldBuildDependencies: boolean; -} - export function normalizeOptions( options: RunExecutorOptions, context: ExecutorContext -): NormalizedOptions { +): NormalizedRunExecutorOptions { const projectName = context.projectName!; const root = context.root; const cwd = options.cwd ? resolve(context.root, options.cwd) : root; @@ -42,6 +36,6 @@ export function normalizeOptions( function getWatchMode( watch: RunExecutorOptions['watch'], shouldBuildApp: boolean -): NormalizedOptions['watchMode'] { +): 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 index 8a910ca..23e42e9 100644 --- a/packages/bun/src/executors/run/lib/wait-for-targets.ts +++ b/packages/bun/src/executors/run/lib/wait-for-targets.ts @@ -9,7 +9,7 @@ export async function waitForTargets( targets.map(async (targetString) => { const target = parseTargetString(targetString, context); const output = await runExecutor(target, {}, context); - return await firstValueFrom(output); + return firstValueFrom(output); }) ); } diff --git a/packages/bun/src/executors/run/run.ts b/packages/bun/src/executors/run/run.ts index acf8ba0..eaee6f7 100644 --- a/packages/bun/src/executors/run/run.ts +++ b/packages/bun/src/executors/run/run.ts @@ -9,47 +9,33 @@ import { resolve } from 'node:path'; import { getBunVersion, killProcess, - spawnProcess, SpawnResult, + spawnWithBun, waitForExit } from '../../utils'; -import { RunExecutorOptions } from './schema'; -import { getFileToRun } from './lib'; - -export interface BunRunExecutorOptions { - main?: string; - buildTarget?: string; - args?: string[]; - runtimeArgs?: string[]; - cwd?: string; - env?: Record; -} - -function buildArgs(entry: string, opts: BunRunExecutorOptions) { - const args: string[] = []; - if (opts.runtimeArgs?.length) args.push(...opts.runtimeArgs); - args.push(entry); - if (opts.args?.length) args.push(...opts.args); - return args; -} +import { NormalizedRunExecutorOptions, RunExecutorOptions } from './schema'; +import { + buildBunArgs, + getFileToRun, + normalizeOptions, + waitForTargets +} from './lib'; function launch( entry: string, - opts: BunRunExecutorOptions, + opts: NormalizedRunExecutorOptions, cwd: string ): SpawnResult { - const bunCmd = process.platform === 'win32' ? 'bun.exe' : 'bun'; - const args = buildArgs(entry, opts); + const args = buildBunArgs(opts, entry); - return spawnProcess(bunCmd, args, { + return spawnWithBun(args, { cwd, - env: opts.env, stdio: 'inherit' }); } async function* bunRunExecutor( - options: RunExecutorOptions, + _options: RunExecutorOptions, context: ExecutorContext ) { const bunVersion = await getBunVersion(); @@ -60,9 +46,22 @@ async function* bunRunExecutor( 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; + 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]}.` + ); + } + } + } + yield* createAsyncIterable<{ success: boolean }>(async ({ next, done }) => { // Case 1: "main" only (no buildTarget) logger.log('Bun Run: 1'); diff --git a/packages/bun/src/executors/run/schema.d.ts b/packages/bun/src/executors/run/schema.d.ts index 7b68534..a24a43f 100644 --- a/packages/bun/src/executors/run/schema.d.ts +++ b/packages/bun/src/executors/run/schema.d.ts @@ -25,16 +25,13 @@ export interface RunExecutorOptions { cwd?: string; } -export interface NodeExecutorOptions { - inspect: boolean | InspectType; - runtimeArgs: string[]; - args: string[]; - waitUntilTargets: string[]; - buildTarget: string; - buildTargetOptions: Record; - host: string; - port: number; - watch?: boolean; - debounce?: number; - runBuildTargetDependencies?: boolean; +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/generators/application/lib/create-targets.ts b/packages/bun/src/generators/application/lib/create-targets.ts index 3e0f9cb..5f265f0 100644 --- a/packages/bun/src/generators/application/lib/create-targets.ts +++ b/packages/bun/src/generators/application/lib/create-targets.ts @@ -32,9 +32,8 @@ export function getServeConfig( continuous: true, executor: `${libs.plugin.name}:run`, defaultConfiguration: 'development', - dependsOn: ['build'], options: { - buildTarget: `${options.name}:build`, + main: joinPathFragments(options.appProjectRoot, 'src', 'main.ts'), tsConfig: joinPathFragments(options.appProjectRoot, 'tsconfig.app.json'), watch: true, hot: true, @@ -47,9 +46,7 @@ export function getServeConfig( inspect: InspectType.Inspect }, configurations: { - development: { - buildTarget: `${options.name}:build:development` - }, + development: {}, production: { buildTarget: `${options.name}:build:production` } diff --git a/packages/bun/src/utils/cli.ts b/packages/bun/src/utils/cli.ts index 04bd8ea..335414b 100644 --- a/packages/bun/src/utils/cli.ts +++ b/packages/bun/src/utils/cli.ts @@ -64,7 +64,7 @@ export interface SpawnWithBunOptions { env?: Record; } -export function spawnWithBun( +export function spawnWithBunOld( args: string[], options: SpawnWithBunOptions = {} ): UniversalChildProcess { diff --git a/packages/bun/src/utils/index.ts b/packages/bun/src/utils/index.ts index 6bfd3cc..6e5fc5c 100644 --- a/packages/bun/src/utils/index.ts +++ b/packages/bun/src/utils/index.ts @@ -1,4 +1,5 @@ export * from './bun'; export * from './cli'; export * from './dependencies'; +export * from './is-bun-build-executor'; 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/process-adapter.ts b/packages/bun/src/utils/process-adapter.ts index 5d76a84..a12f11b 100644 --- a/packages/bun/src/utils/process-adapter.ts +++ b/packages/bun/src/utils/process-adapter.ts @@ -4,11 +4,16 @@ import { type IOType } from 'node:child_process'; import { StdioOptions } from '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; @@ -31,6 +36,8 @@ export function spawnProcess( args: string[] = [], options: SpawnOptions = {} ): SpawnResult { + const cwd = options.cwd || workspaceRoot; + const env: Record = { ...process.env, ...(options.env || {}) @@ -46,19 +53,23 @@ export function spawnProcess( if (isBunRuntime()) { return Bun.spawn({ cmd: [command, ...args], - cwd: options.cwd, + cwd, env, stdio: [stdin, stdout, stderr] }); } return nodeSpawn(command, args, { - cwd: options.cwd, + 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; From e1b1ede344c155927c92a07ac7ee47c62a0e4c11 Mon Sep 17 00:00:00 2001 From: Boris Polak <18208654+BorisTB@users.noreply.github.com> Date: Wed, 20 Aug 2025 18:51:49 +0200 Subject: [PATCH 04/12] fix(bun): generate proper typescript files --- packages/bun/src/executors/run/run.ts | 50 +++++++++++-------- packages/bun/src/executors/run/schema.d.ts | 2 +- .../src/generators/application/application.ts | 25 +++++++++- .../application/files/tsconfig.app.json | 2 +- tsconfig.base.json | 1 - tsconfig.json | 3 -- 6 files changed, 55 insertions(+), 28 deletions(-) diff --git a/packages/bun/src/executors/run/run.ts b/packages/bun/src/executors/run/run.ts index eaee6f7..6395215 100644 --- a/packages/bun/src/executors/run/run.ts +++ b/packages/bun/src/executors/run/run.ts @@ -2,7 +2,8 @@ import { ExecutorContext, logger, parseTargetString, - readTargetOptions + readTargetOptions, + runExecutor } from '@nx/devkit'; import { createAsyncIterable } from '@nx/devkit/src/utils/async-iterable'; import { resolve } from 'node:path'; @@ -91,34 +92,43 @@ async function* bunRunExecutor( logger.log('Bun Run: 2.2'); + const buildIterator = await runExecutor<{ + success: boolean; + outputPath?: string; + }>(buildTarget, {}, context); + let current: SpawnResult | null = null; - const entry = getFileToRun( - context, - project, - buildOptions, - buildTargetExecutor, - options.main - ); - logger.log('Bun Run: 2.7'); + 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 + ); + logger.log('Bun Run: 2.7'); - await killProcess(current); - logger.log('Bun Run: 2.8'); - current = launch(entry, options, cwd); - logger.log('Bun Run: 2.9'); + await killProcess(current); + logger.log('Bun Run: 2.8'); + current = launch(entry, options, cwd); + logger.log('Bun Run: 2.9'); - const code = await waitForExit(current); - logger.log('Bun Run: 2.10'); - next({ success: code === 0 }); - logger.log('Bun Run: 2.11'); + const code = await waitForExit(current); + logger.log('Bun Run: 2.10'); + next({ success: code === 0 }); + } await killProcess(current); - logger.log('Bun Run: 2.12'); done(); - logger.log('Bun Run: 2.13'); return; } - logger.log('Bun Run: 2.14'); throw new Error( `Either "main" or "buildTarget" must be defined in executor options` diff --git a/packages/bun/src/executors/run/schema.d.ts b/packages/bun/src/executors/run/schema.d.ts index a24a43f..b01abf5 100644 --- a/packages/bun/src/executors/run/schema.d.ts +++ b/packages/bun/src/executors/run/schema.d.ts @@ -1,6 +1,6 @@ export type WatchMode = boolean | 'nx' | 'bun'; -export enum InspectType { +export const enum InspectType { Inspect = 'inspect', InspectBrk = 'inspect-brk' } diff --git a/packages/bun/src/generators/application/application.ts b/packages/bun/src/generators/application/application.ts index 97f8020..81c8d8a 100644 --- a/packages/bun/src/generators/application/application.ts +++ b/packages/bun/src/generators/application/application.ts @@ -80,8 +80,29 @@ export async function applicationGenerator( options.appProjectRoot, 'tsconfig.app.json', { - module: 'nodenext', - moduleResolution: 'nodenext' + // 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'] diff --git a/packages/bun/src/generators/application/files/tsconfig.app.json b/packages/bun/src/generators/application/files/tsconfig.app.json index 2107478..ea768db 100644 --- a/packages/bun/src/generators/application/files/tsconfig.app.json +++ b/packages/bun/src/generators/application/files/tsconfig.app.json @@ -1,7 +1,7 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "<%= offsetFromRoot %>dist/out-tsc", + "outDir": "dist", // Environment setup & latest features "lib": ["ESNext"], "target": "ESNext", diff --git a/tsconfig.base.json b/tsconfig.base.json index 8084832..537c031 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -4,7 +4,6 @@ "declarationMap": true, "emitDeclarationOnly": true, "importHelpers": true, - "isolatedModules": true, "lib": ["es2022"], "module": "nodenext", "moduleResolution": "nodenext", diff --git a/tsconfig.json b/tsconfig.json index 4de7b46..1df6406 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,9 +11,6 @@ }, { "path": "./packages/bun" - }, - { - "path": "./apps/foo-app" } ] } From 645528b7c76f666fe75ecc091c9eb6e28b932950 Mon Sep 17 00:00:00 2001 From: Boris Polak <18208654+BorisTB@users.noreply.github.com> Date: Wed, 20 Aug 2025 19:00:17 +0200 Subject: [PATCH 05/12] chore(bun): cleanup of run executor --- packages/bun/src/executors/run/run.ts | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/packages/bun/src/executors/run/run.ts b/packages/bun/src/executors/run/run.ts index 6395215..aa1549d 100644 --- a/packages/bun/src/executors/run/run.ts +++ b/packages/bun/src/executors/run/run.ts @@ -52,6 +52,7 @@ async function* bunRunExecutor( 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()) { @@ -63,24 +64,27 @@ async function* bunRunExecutor( } } + // // 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: "main" only (no buildTarget) - logger.log('Bun Run: 1'); + // Case 1: Run "raw" main file (without building it) if (options.main && !options.buildTarget) { - logger.log('Bun Run: 1.1'); const entry = resolve(context.root, options.main); const proc = launch(entry, options, cwd); const code = await waitForExit(proc); - logger.log('Bun Run: 1.2'); next({ success: code === 0 }); done(); return; } - // Case 2: buildTarget defined - logger.log('Bun Run: 2'); + // Case 2: Build app first and then run the built main file if (options.buildTarget) { - logger.log('Bun Run: 2.1'); const buildTarget = parseTargetString(options.buildTarget, context); const buildOptions: Record = { ...readTargetOptions(buildTarget, context), @@ -90,8 +94,6 @@ async function* bunRunExecutor( const buildTargetExecutor = project.data.targets?.[buildTarget.target]?.executor; - logger.log('Bun Run: 2.2'); - const buildIterator = await runExecutor<{ success: boolean; outputPath?: string; @@ -113,15 +115,10 @@ async function* bunRunExecutor( buildTargetExecutor, options.main ); - logger.log('Bun Run: 2.7'); await killProcess(current); - logger.log('Bun Run: 2.8'); current = launch(entry, options, cwd); - logger.log('Bun Run: 2.9'); - const code = await waitForExit(current); - logger.log('Bun Run: 2.10'); next({ success: code === 0 }); } From eb048f5a9cfe57269f0ca1db4ae351af02ff7c41 Mon Sep 17 00:00:00 2001 From: Boris Polak <18208654+BorisTB@users.noreply.github.com> Date: Wed, 20 Aug 2025 20:31:22 +0200 Subject: [PATCH 06/12] docs(bun): update README --- packages/bun/README.md | 115 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 109 insertions(+), 6 deletions(-) diff --git a/packages/bun/README.md b/packages/bun/README.md index a88f925..aa2a887 100644 --- a/packages/bun/README.md +++ b/packages/bun/README.md @@ -1,11 +1,114 @@ -# bun +# @stonx/bun — Nx plugin for Bun -This library was generated with [Nx](https://nx.dev). +[![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) -## Building +Nx plugin adding support for [Bun](https://bun.sh/). -Run `nx build bun` to build the library. +## Features -## Running unit tests +- 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 -Run `nx test bun` to execute the unit tests via [Jest](https://jestjs.io). From 8464f5d240ec7f3ec7edc7ea14ce760dffdf10a8 Mon Sep 17 00:00:00 2001 From: Boris Polak <18208654+BorisTB@users.noreply.github.com> Date: Fri, 22 Aug 2025 15:03:16 +0200 Subject: [PATCH 07/12] fix(bun): improve args parsing --- package.json | 6 +- packages/bun/src/executors/build/build.ts | 37 ++- .../executors/build/lib/get-bun-build-argv.ts | 13 +- .../build/lib/get-bun-build-config.ts | 47 ++-- .../executors/build/lib/normalize-options.ts | 44 +++- packages/bun/src/executors/build/schema.d.ts | 15 +- packages/bun/src/executors/build/schema.json | 27 +- .../executors/run/lib/normalize-options.ts | 2 +- packages/bun/src/executors/run/schema.json | 2 +- .../src/generators/application/schema.json | 2 +- packages/bun/src/generators/init/schema.json | 2 +- .../bun/src/utils/bun-cfg/bun-build-config.ts | 67 +++++ packages/bun/src/utils/bun-cfg/bun-cfg.ts | 46 ++++ .../src/utils/bun-cfg/bun-runtime-config.ts | 13 + packages/bun/src/utils/bun-cfg/cfg-to-argv.ts | 93 +++++++ packages/bun/src/utils/bun-cfg/constants.ts | 2 + packages/bun/src/utils/index.ts | 1 + packages/bun/src/utils/logic.ts | 12 + .../application/lib/update-tsconfig.ts | 2 +- pnpm-lock.yaml | 243 +++++++++--------- tsconfig.base.json | 2 +- 21 files changed, 477 insertions(+), 201 deletions(-) create mode 100644 packages/bun/src/utils/bun-cfg/bun-build-config.ts create mode 100644 packages/bun/src/utils/bun-cfg/bun-cfg.ts create mode 100644 packages/bun/src/utils/bun-cfg/bun-runtime-config.ts create mode 100644 packages/bun/src/utils/bun-cfg/cfg-to-argv.ts create mode 100644 packages/bun/src/utils/bun-cfg/constants.ts create mode 100644 packages/bun/src/utils/logic.ts diff --git a/package.json b/package.json index 498acfb..15ccfaf 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "@nx/node": "21.3.11", "@nx/plugin": "21.3.11", "@nx/workspace": "21.3.11", - "@stonx/bun": "0.0.0-e2e", "@swc-node/register": "~1.9.1", "@swc/cli": "~0.6.0", "@swc/core": "~1.5.7", @@ -55,7 +54,7 @@ "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" @@ -74,6 +73,5 @@ "check-lock-files" ] }, - "packageManager": "pnpm@10.13.1", - "dependencies": {} + "packageManager": "pnpm@10.13.1" } diff --git a/packages/bun/src/executors/build/build.ts b/packages/bun/src/executors/build/build.ts index 6a5cffa..25c50a4 100644 --- a/packages/bun/src/executors/build/build.ts +++ b/packages/bun/src/executors/build/build.ts @@ -1,14 +1,28 @@ import { ExecutorContext, logger } from '@nx/devkit'; -import { BuildExecutorOptions } from './schema'; +import { BuildExecutorOptions, NormalizedBuildExecutorOptions } from './schema'; import { createAsyncIterable } from '@nx/devkit/src/utils/async-iterable'; import { parentPort } from 'node:worker_threads'; import { getBunVersion, isBun, isBunSubprocess, + SpawnResult, spawnWithBun } from '../../utils'; import { getBunBuildArgv, getBunBuildConfig, normalizeOptions } from './lib'; +import { resolve } from 'node:path'; + +function launch( + opts: NormalizedBuildExecutorOptions, + cwd: string +): SpawnResult { + const args = getBunBuildArgv(opts); + + return spawnWithBun(args, { + cwd, + stdio: 'inherit' + }); +} export interface BunBuildResult { success: boolean; @@ -25,15 +39,13 @@ async function* buildExecutor( throw new Error(`bun command not found. Make sure the bun is available`); } - if (!context.projectName) { - throw new Error(`project name is undefined`); - } + process.env.NODE_ENV ??= context?.configurationName ?? 'development'; - process.env['NODE_ENV'] ??= 'production'; + const project = context.projectGraph.nodes[context.projectName!]; + const { sourceRoot, root } = project.data; + const options = normalizeOptions(_options, context, sourceRoot, root); - const { sourceRoot, root } = - context.projectsConfigurations.projects[context.projectName]; - const options = normalizeOptions(_options, context.root, sourceRoot, root); + const cwd = options.cwd ? resolve(context.root, options.cwd) : context.root; const getResult = (success: boolean): BunBuildResult => ({ success, @@ -41,7 +53,7 @@ async function* buildExecutor( }); if (isBun) { - const config = getBunBuildConfig(options, context); + const config = getBunBuildConfig(options); const result = await Bun.build(config); for (const log of result.logs) { console.log(log); @@ -56,13 +68,10 @@ async function* buildExecutor( yield getResult(false); } } else { - const args = getBunBuildArgv(options, context); + const args = getBunBuildArgv(options); yield* createAsyncIterable(async ({ next, done }) => { const childProcess = spawnWithBun(args, { - stdio: 'pipe', - stderr: 'inherit', - stdin: 'pipe', - stdout: 'inherit' + stdio: 'inherit' }); if (isBunSubprocess(childProcess)) { 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 index 0966526..9f7f6cb 100644 --- a/packages/bun/src/executors/build/lib/get-bun-build-argv.ts +++ b/packages/bun/src/executors/build/lib/get-bun-build-argv.ts @@ -1,15 +1,13 @@ -import { BuildExecutorOptions } from '../schema'; -import { ExecutorContext } from '@nx/devkit'; +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: BuildExecutorOptions, - context: ExecutorContext + options: NormalizedBuildExecutorOptions ): string[] { - const cfg = getBunBuildConfig(options, context); + const cfg = getBunBuildConfig(options); const production = process.env?.NODE_ENV === 'production'; const allArgs = [ @@ -19,21 +17,22 @@ export function getBunBuildArgv( !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.target) && `--target=${cfg.target}`, !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`, - cfg.minify && `--minify`, + cfg.minify ? cfg.minify === true ? `--minify` : cfg.minify.whitespace, options.watch && `--watch`, !isNil(cfg.format) && `--format=${cfg.format}`, !isNil(cfg.external) && `--external=${cfg.external}`, 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 index d1b2c51..7c2de72 100644 --- a/packages/bun/src/executors/build/lib/get-bun-build-config.ts +++ b/packages/bun/src/executors/build/lib/get-bun-build-config.ts @@ -1,33 +1,28 @@ -import { BuildExecutorOptions } from '../schema'; -import { ExecutorContext } from '@nx/devkit'; +import { NormalizedBuildExecutorOptions } from '../schema'; export function getBunBuildConfig( - executorOptions: BuildExecutorOptions, - context: ExecutorContext + opts: NormalizedBuildExecutorOptions ): Bun.BuildConfig { return { - entrypoints: [ - executorOptions.main, - ...(executorOptions.additionalEntryPoints || []) - ], - define: executorOptions.define, - outdir: executorOptions.outputPath, - target: executorOptions.target, - // external: executorOptions.external, - format: executorOptions.format, - minify: executorOptions.define, - naming: executorOptions.naming, - publicPath: executorOptions.publicPath, - sourcemap: executorOptions.sourcemap, - splitting: executorOptions.splitting, - root: executorOptions.rootDir, - packages: executorOptions.packages, - loader: executorOptions.loader, - env: executorOptions.env, - banner: executorOptions.banner, - footer: executorOptions.footer, - drop: executorOptions.drop, - tsconfig: executorOptions.tsConfig, + entrypoints: [opts.main, ...(opts.additionalEntryPoints || [])], + define: opts.define, + outdir: opts.outputPath, + target: opts.target, + // external: opts.external, // TODO + 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/normalize-options.ts b/packages/bun/src/executors/build/lib/normalize-options.ts index b84ea4c..a8f8b0e 100644 --- a/packages/bun/src/executors/build/lib/normalize-options.ts +++ b/packages/bun/src/executors/build/lib/normalize-options.ts @@ -3,21 +3,37 @@ import { BuildExecutorOptions, NormalizedBuildExecutorOptions } from '../schema'; +import { ExecutorContext } from '@nx/devkit'; export function normalizeOptions( options: BuildExecutorOptions, - contextRoot: string, + context: ExecutorContext, sourceRoot: string | undefined, projectRoot: string ): NormalizedBuildExecutorOptions { - const outputPath = join(contextRoot, options.outputPath); + const root = context.root; + const outputPath = join(root, options.outputPath); const rootDir = options.rootDir - ? join(contextRoot, options.rootDir) - : join(contextRoot, projectRoot); + ? join(root, options.rootDir) + : join(root, projectRoot); // TODO + const mainOutputPath = resolve( + outputPath, + options.main.replace(`${projectRoot}/`, '').replace('.ts', '.js') // TODO + ); - if (options.watch == null) { - options.watch = false; - } + 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]; @@ -28,16 +44,16 @@ export function normalizeOptions( return { ...options, - root: contextRoot, + splitting, + sourcemap, + root, sourceRoot, projectRoot, outputPath, - tsConfig: join(contextRoot, options.tsConfig), + tsConfig, rootDir, - mainOutputPath: resolve( - outputPath, - options.main.replace(`${projectRoot}/`, '').replace('.ts', '.js') - ), - generatePackageJson: options.generatePackageJson ?? true + watch, + mainOutputPath, + generatePackageJson }; } diff --git a/packages/bun/src/executors/build/schema.d.ts b/packages/bun/src/executors/build/schema.d.ts index 21b83bf..db0920b 100644 --- a/packages/bun/src/executors/build/schema.d.ts +++ b/packages/bun/src/executors/build/schema.d.ts @@ -1,3 +1,11 @@ +export type BuildMinifyConfig = + | boolean + | { + whitespace?: boolean; + syntax?: boolean; + identifiers?: boolean; + }; + export interface BuildExecutorOptions { main: string; outputPath: string; @@ -14,8 +22,8 @@ export interface BuildExecutorOptions { format?: 'esm' | 'cjs' | 'iife'; splitting?: boolean; env?: 'inline' | 'disable' | `${string}*` | undefined; - sourcemap?: 'none' | 'linked' | 'external'; - minify?: boolean; + sourcemap?: boolean | 'none' | 'linked' | 'inline' | 'external'; + minify?: BuildMinifyConfig; external?: 'all' | 'none' | string[]; packages?: 'bundle' | 'external'; naming?: string; @@ -27,6 +35,7 @@ export interface BuildExecutorOptions { drop?: string[]; generateLockfile?: boolean; generatePackageJson?: boolean; + cwd?: string; } export interface NormalizedBuildExecutorOptions extends BuildExecutorOptions { @@ -36,4 +45,6 @@ export interface NormalizedBuildExecutorOptions extends BuildExecutorOptions { 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 index 7947b29..7df77a1 100644 --- a/packages/bun/src/executors/build/schema.json +++ b/packages/bun/src/executors/build/schema.json @@ -1,4 +1,5 @@ { + "$schema": "http://json-schema.org/draft-07/schema", "version": 2, "title": "Bun Build Target", "description": "Builds using Bun.", @@ -81,7 +82,7 @@ "splitting": { "type": "boolean", "description": "Whether to enable code splitting.", - "default": false + "default": true }, "env": { "type": "string", @@ -89,12 +90,28 @@ "default": "inline" }, "sourcemap": { - "type": "string", + "oneOf": [ + { "type": "boolean" }, + { + "type": "string", + "enum": ["none", "linked", "external", "inline"] + } + ], "description": "Specifies the type of sourcemap to generate.", - "enum": ["none", "linked", "external"], "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 @@ -157,6 +174,10 @@ "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/normalize-options.ts b/packages/bun/src/executors/run/lib/normalize-options.ts index 648ff20..a351ee6 100644 --- a/packages/bun/src/executors/run/lib/normalize-options.ts +++ b/packages/bun/src/executors/run/lib/normalize-options.ts @@ -12,7 +12,7 @@ export function normalizeOptions( ): NormalizedRunExecutorOptions { const projectName = context.projectName!; const root = context.root; - const cwd = options.cwd ? resolve(context.root, options.cwd) : root; + const cwd = options.cwd ? resolve(context.root, options.cwd) : root; // TODO const shouldBuildApp = !!options.buildTarget; const shouldBuildDependencies = !!options.runBuildTargetDependencies; diff --git a/packages/bun/src/executors/run/schema.json b/packages/bun/src/executors/run/schema.json index 1fb78ad..f54031e 100644 --- a/packages/bun/src/executors/run/schema.json +++ b/packages/bun/src/executors/run/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "http://json-schema.org/draft-07/schema", "version": 2, "title": "Bun Run executor", "description": "", diff --git a/packages/bun/src/generators/application/schema.json b/packages/bun/src/generators/application/schema.json index bae4928..ada6536 100644 --- a/packages/bun/src/generators/application/schema.json +++ b/packages/bun/src/generators/application/schema.json @@ -1,5 +1,5 @@ { - "$schema": "https://json-schema.org/schema", + "$schema": "http://json-schema.org/draft-07/schema", "$id": "StonxBunApplicationGenerator", "title": "Bun Application Generator", "description": "Generates a Bun application in the current workspace.", diff --git a/packages/bun/src/generators/init/schema.json b/packages/bun/src/generators/init/schema.json index 26abe18..c9afb1f 100644 --- a/packages/bun/src/generators/init/schema.json +++ b/packages/bun/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "https://json-schema.org/schema", + "$schema": "http://json-schema.org/draft-07/schema", "$id": "StonxBunInit", "title": "Bun Init Generator", "description": "Initializes a Bun project in the current workspace.", 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..9c48468 --- /dev/null +++ b/packages/bun/src/utils/bun-cfg/bun-build-config.ts @@ -0,0 +1,67 @@ +import { addFlag, defineConfigArgvMap } from './cfg-to-argv'; +import { isArray, isBool, isString } from '../logic'; + +export const bunBuildConfigHandler = 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)] +}); diff --git a/packages/bun/src/utils/bun-cfg/bun-cfg.ts b/packages/bun/src/utils/bun-cfg/bun-cfg.ts new file mode 100644 index 0000000..c59bdfb --- /dev/null +++ b/packages/bun/src/utils/bun-cfg/bun-cfg.ts @@ -0,0 +1,46 @@ +// @ts-ignore +Symbol['metadata'] ??= Symbol('Symbol.metadata'); +// @ts-ignore +Symbol['dispose'] ??= Symbol('Symbol.dispose'); +// @ts-ignore +Symbol['asyncDispose'] ??= Symbol('Symbol.asyncDispose'); + +function loggedMethod(headMessage = 'LOG:') { + return function actualDecorator( + target: (this: This, ...args: Args) => Return, + context: ClassMethodDecoratorContext< + This, + (this: This, ...args: Args) => Return + > + ) { + const methodName = String(context.name); + + function replacementMethod(this: This, ...args: Args): Return { + console.log(`LOG: Entering method '${methodName}'.`); + const result = target.call(this, ...args); + console.log(`LOG: Exiting method '${methodName}'.`); + return result; + } + + return replacementMethod; + }; +} +function argv(flag = 'LOG:') { + return function actualDecorator( + target: any, + context: ClassFieldDecoratorContext + ) { + context.metadata[context.name] = flag; + }; +} + +export class Fooha { + @argv('asd') + value: boolean = true; + @loggedMethod('aaa') + hello() { + return 'hello'; + } +} + +Symbol.metadata; 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..2cf9adc --- /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 bunRuntimeConfigHandler = 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..575230c --- /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, + flagMap: ConfigArgvMap +): string[] { + const argv: string[] = []; + + for (const key in cfg) { + const value = cfg[key]; + + if (isNil(value)) continue; + + const handler: ConfigValueMapper = flagMap[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/index.ts b/packages/bun/src/utils/index.ts index 6e5fc5c..caf1f9d 100644 --- a/packages/bun/src/utils/index.ts +++ b/packages/bun/src/utils/index.ts @@ -2,4 +2,5 @@ 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/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/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 da5aa67..fb1c07e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,34 +13,31 @@ importers: version: 9.32.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))) + 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.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)) + 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.9.2))(@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.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)) + 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.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.9.2))(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.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)) + 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.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.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.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)) + 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.9.2))(@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.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)) + 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.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.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.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)) + 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.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.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.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)) - '@stonx/bun': - specifier: 0.0.0-e2e - version: 0.0.0-e2e(@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))) + 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.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)) @@ -88,7 +85,7 @@ 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.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.9.2)) jest-environment-jsdom: specifier: ^30.0.2 version: 30.0.5 @@ -103,7 +100,7 @@ importers: 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)) + 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.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)) prettier: specifier: 3.6.2 version: 3.6.2 @@ -115,19 +112,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.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.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.39.0(eslint@9.32.0)(typescript@5.9.2) verdaccio: specifier: ^6.0.5 version: 6.1.6(typanion@3.14.0) @@ -139,25 +136,25 @@ importers: dependencies: '@nx/devkit': specifier: '>=20.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.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.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))) '@nx/js': specifier: '>=20.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.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.9.2))(@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.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) 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.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.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.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.9.2))(@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.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.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.9.2))(@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.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.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.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.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.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 @@ -1248,12 +1245,6 @@ packages: '@sinonjs/fake-timers@13.0.5': resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} - '@stonx/bun@0.0.0-e2e': - resolution: {integrity: sha512-0B6FpK596wyFILX0RjFiSNw2+YGcxMciWF+sov/6UH9DDrVUurWKQvnDwsWPMjnsBjGCTJjK0C4CVMYnOY75AA==} - peerDependencies: - '@nx/devkit': '>=20.0.0 <22.0.0' - '@nx/js': '>=20.0.0 <22.0.0' - '@swc-node/core@1.13.3': resolution: {integrity: sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA==} engines: {node: '>= 10'} @@ -4198,6 +4189,11 @@ 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'} @@ -5364,7 +5360,7 @@ snapshots: 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.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.9.2))': dependencies: '@jest/console': 30.0.5 '@jest/pattern': 30.0.1 @@ -5379,7 +5375,7 @@ 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-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.9.2)) jest-haste-map: 30.0.5 jest-message-util: 30.0.5 jest-regex-util: 30.0.1 @@ -5661,26 +5657,26 @@ 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.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.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.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.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)) semver: 7.7.2 tmp: 0.2.4 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/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.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.9.2))(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.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.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.9.2))(@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.9.2))(@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.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.39.0(eslint@9.32.0)(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.39.0(eslint@9.32.0)(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.0(eslint@9.32.0)(typescript@5.9.2) chalk: 4.1.2 confusing-browser-globals: 1.0.11 globals: 15.15.0 @@ -5700,10 +5696,10 @@ 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.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.9.2))(@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.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)) + '@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.9.2))(@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.9.2))(@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.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) eslint: 9.32.0 semver: 7.7.2 tslib: 2.8.1 @@ -5719,15 +5715,15 @@ 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.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.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.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.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) + '@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.9.2))(@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.9.2))(@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.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-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.9.2)) jest-resolve: 30.0.5 jest-util: 30.0.5 minimatch: 9.0.3 @@ -5751,7 +5747,7 @@ 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))': + '@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.9.2))(@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.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.0 '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.0) @@ -5760,8 +5756,8 @@ snapshots: '@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/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.9.2))(@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.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-macros: 3.1.0 @@ -5792,12 +5788,12 @@ 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.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.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.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.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.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.9.2))(@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.9.2))(@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.9.2))(@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.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.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.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.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.9.2))(@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.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 @@ -5848,12 +5844,12 @@ snapshots: '@nx/nx-win32-x64-msvc@21.3.11': 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.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.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.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.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.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.9.2))(@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.9.2))(@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.9.2))(@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.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.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.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.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.9.2))(@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.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' @@ -5872,13 +5868,13 @@ 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.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.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.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.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.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.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)) picomatch: 4.0.2 tslib: 2.8.1 yargs-parser: 21.1.1 @@ -5887,10 +5883,10 @@ 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 @@ -5909,17 +5905,12 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@stonx/bun@0.0.0-e2e(@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)))': - 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)) - '@swc-node/core@1.13.3(@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/sourcemap-support': 0.5.1 @@ -5928,7 +5919,7 @@ snapshots: 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 @@ -6120,41 +6111,41 @@ 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.39.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.9.2))(eslint@9.32.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/parser': 8.39.0(eslint@9.32.0)(typescript@5.9.2) '@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/type-utils': 8.39.0(eslint@9.32.0)(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.0(eslint@9.32.0)(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.39.0 eslint: 9.32.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.39.0(eslint@9.32.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/typescript-estree': 8.39.0(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.39.0 debug: 4.4.1 eslint: 9.32.0 - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.39.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.39.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.9.2) '@typescript-eslint/types': 8.39.0 debug: 4.4.1 - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -6163,28 +6154,28 @@ snapshots: '@typescript-eslint/types': 8.39.0 '@typescript-eslint/visitor-keys': 8.39.0 - '@typescript-eslint/tsconfig-utils@8.39.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.39.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.39.0(eslint@9.32.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/typescript-estree': 8.39.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.0(eslint@9.32.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 + 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/typescript-estree@8.39.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.39.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/project-service': 8.39.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.9.2) '@typescript-eslint/types': 8.39.0 '@typescript-eslint/visitor-keys': 8.39.0 debug: 4.4.1 @@ -6192,19 +6183,19 @@ snapshots: 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.39.0(eslint@9.32.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) + '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) eslint: 9.32.0 - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -7805,15 +7796,15 @@ 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.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.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.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.9.2)) '@jest/test-result': 30.0.5 '@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.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.9.2)) jest-util: 30.0.5 jest-validate: 30.0.5 yargs: 17.7.2 @@ -7824,7 +7815,7 @@ 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.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.9.2)): dependencies: '@babel/core': 7.28.0 '@jest/get-type': 30.0.1 @@ -7852,7 +7843,7 @@ 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 @@ -8084,12 +8075,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.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.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.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.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.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.9.2)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -8398,7 +8389,7 @@ snapshots: nwsapi@2.2.21: {} - 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.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.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 @@ -8446,7 +8437,7 @@ snapshots: '@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) + '@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 @@ -9097,22 +9088,22 @@ 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.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.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.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.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 @@ -9121,7 +9112,7 @@ snapshots: babel-jest: 30.0.5(@babel/core@7.28.0) 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 @@ -9135,7 +9126,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: @@ -9172,19 +9163,21 @@ 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.39.0(eslint@9.32.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) + '@typescript-eslint/eslint-plugin': 8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.9.2))(eslint@9.32.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.39.0(eslint@9.32.0)(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.0(eslint@9.32.0)(typescript@5.9.2) eslint: 9.32.0 - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color typescript@5.8.3: {} + typescript@5.9.2: {} + uglify-js@3.19.3: optional: true diff --git a/tsconfig.base.json b/tsconfig.base.json index 537c031..df0bfee 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -4,7 +4,7 @@ "declarationMap": true, "emitDeclarationOnly": true, "importHelpers": true, - "lib": ["es2022"], + "lib": ["es2022", "esnext"], "module": "nodenext", "moduleResolution": "nodenext", "noEmitOnError": true, From 28d3e242ebaca6461ec46f526f80abfac2487f97 Mon Sep 17 00:00:00 2001 From: Boris Polak <18208654+BorisTB@users.noreply.github.com> Date: Mon, 1 Sep 2025 22:21:58 +0200 Subject: [PATCH 08/12] test(bun): e2e tests for bun plugin - add e2e tests for bun plugin and some other stuff --- e2e/bun/.spec.swcrc | 22 ++++ e2e/bun/eslint.config.mjs | 3 + e2e/bun/jest.config.ts | 22 ++++ e2e/bun/package.json | 5 + e2e/bun/project.json | 20 +++ e2e/bun/src/bun.spec.ts | 89 +++++++++++++ e2e/bun/tsconfig.json | 10 ++ e2e/bun/tsconfig.spec.json | 14 ++ e2e/elysia/package.json | 3 +- .../bun/src/executors/build/build.spec.ts | 27 ---- packages/bun/src/executors/build/build.ts | 18 +-- .../executors/build/lib/get-bun-build-argv.ts | 2 +- .../build/lib/get-bun-build-config.ts | 10 +- packages/bun/src/executors/run/run.spec.ts | 27 ---- .../application/application.spec.ts | 20 --- .../application/lib/create-targets.ts | 7 + packages/bun/src/generators/init/init.spec.ts | 20 --- .../bun/src/utils/bun-cfg/bun-build-config.ts | 12 +- .../src/utils/bun-cfg/bun-runtime-config.ts | 2 +- packages/bun/src/utils/bun-cfg/cfg-to-argv.ts | 4 +- .../bun/src/utils/buni/build/build.config.ts | 0 packages/bun/src/utils/buni/bun/bun.ts | 6 + packages/bun/src/utils/buni/bun/index.ts | 1 + packages/bun/src/utils/buni/index.ts | 27 ++++ packages/bun/src/utils/buni/node/index.ts | 1 + packages/bun/src/utils/buni/node/node.ts | 5 + packages/bun/src/utils/buni/run/index.ts | 1 + packages/bun/src/utils/buni/run/run.ts | 10 ++ .../src/utils/buni/spawn/__tests__/helpers.ts | 57 +++++++++ packages/bun/src/utils/buni/spawn/index.ts | 1 + .../bun/src/utils/buni/spawn/spawn.spec.ts | 121 ++++++++++++++++++ packages/bun/src/utils/buni/spawn/spawn.ts | 66 ++++++++++ packages/bun/src/utils/buni/utils.ts | 18 +++ packages/bun/src/utils/process-adapter.ts | 4 +- pnpm-lock.yaml | 2 + pnpm-workspace.yaml | 2 + tsconfig.json | 3 + 37 files changed, 536 insertions(+), 126 deletions(-) create mode 100644 e2e/bun/.spec.swcrc create mode 100644 e2e/bun/eslint.config.mjs create mode 100644 e2e/bun/jest.config.ts create mode 100644 e2e/bun/package.json create mode 100644 e2e/bun/project.json create mode 100644 e2e/bun/src/bun.spec.ts create mode 100644 e2e/bun/tsconfig.json create mode 100644 e2e/bun/tsconfig.spec.json delete mode 100644 packages/bun/src/executors/build/build.spec.ts delete mode 100644 packages/bun/src/executors/run/run.spec.ts delete mode 100644 packages/bun/src/generators/application/application.spec.ts delete mode 100644 packages/bun/src/generators/init/init.spec.ts create mode 100644 packages/bun/src/utils/buni/build/build.config.ts create mode 100644 packages/bun/src/utils/buni/bun/bun.ts create mode 100644 packages/bun/src/utils/buni/bun/index.ts create mode 100644 packages/bun/src/utils/buni/index.ts create mode 100644 packages/bun/src/utils/buni/node/index.ts create mode 100644 packages/bun/src/utils/buni/node/node.ts create mode 100644 packages/bun/src/utils/buni/run/index.ts create mode 100644 packages/bun/src/utils/buni/run/run.ts create mode 100644 packages/bun/src/utils/buni/spawn/__tests__/helpers.ts create mode 100644 packages/bun/src/utils/buni/spawn/index.ts create mode 100644 packages/bun/src/utils/buni/spawn/spawn.spec.ts create mode 100644 packages/bun/src/utils/buni/spawn/spawn.ts create mode 100644 packages/bun/src/utils/buni/utils.ts 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..58ca67a --- /dev/null +++ b/e2e/bun/jest.config.ts @@ -0,0 +1,22 @@ +/* eslint-disable */ +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-e2e', + preset: '../../jest.preset.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' +}; 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..099bec3 --- /dev/null +++ b/e2e/bun/src/bun.spec.ts @@ -0,0 +1,89 @@ +import { execSync } from 'child_process'; +import { + cleanupTestProject, + createTestProject, + installPlugin +} from '@stonx/e2e-utils'; + +describe('bun', () => { + let projectDirectory: string; + + beforeAll(() => { + projectDirectory = createTestProject(); + installPlugin(projectDirectory, 'bun'); + }); + + afterAll(() => { + cleanupTestProject(projectDirectory); + }); + + it('should be installed', () => { + // npm ls will fail if the package is not installed properly + execSync('pnpm ls --depth 100 @stonx/bun', { + cwd: projectDirectory, + stdio: 'inherit' + }); + }); + + describe('application generator', () => { + beforeAll(() => { + execSync( + 'npx nx g @stonx/bun:application my-app --linter none --unitTestRunner none --e2eTestRunner none --framework none', + { + cwd: projectDirectory, + stdio: 'inherit', + env: process.env + } + ); + }); + + it('should infer tasks', () => { + const projectDetails = JSON.parse( + execSync('nx show project my-app --json', { + cwd: projectDirectory + }).toString() + ); + + expect(projectDetails).toMatchObject({ + name: 'my-app', + root: 'my-app', + sourceRoot: 'my-app/src', + projectType: 'application', + targets: { + build: { + executor: '@stonx/bun:build', + inputs: ['production', '^production'], + outputs: ['{options.outputPath}'], + defaultConfiguration: 'production', + options: { + main: 'my-app/src/main.ts', + tsConfig: 'my-app/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: 'my-app: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/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/packages/bun/src/executors/build/build.spec.ts b/packages/bun/src/executors/build/build.spec.ts deleted file mode 100644 index b56f615..0000000 --- a/packages/bun/src/executors/build/build.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ExecutorContext } from '@nx/devkit'; - -import { RunExecutorSchema } from './schema'; -import executor from './build'; - -const options: RunExecutorSchema = {}; -const context: ExecutorContext = { - root: '', - cwd: process.cwd(), - isVerbose: false, - projectGraph: { - nodes: {}, - dependencies: {} - }, - projectsConfigurations: { - projects: {}, - version: 2 - }, - nxJsonConfiguration: {} -}; - -describe('Run Executor', () => { - it('can run', async () => { - const output = await executor(options, context); - expect(output.success).toBe(true); - }); -}); diff --git a/packages/bun/src/executors/build/build.ts b/packages/bun/src/executors/build/build.ts index 25c50a4..f30ee3e 100644 --- a/packages/bun/src/executors/build/build.ts +++ b/packages/bun/src/executors/build/build.ts @@ -1,28 +1,14 @@ import { ExecutorContext, logger } from '@nx/devkit'; -import { BuildExecutorOptions, NormalizedBuildExecutorOptions } from './schema'; +import { BuildExecutorOptions } from './schema'; import { createAsyncIterable } from '@nx/devkit/src/utils/async-iterable'; import { parentPort } from 'node:worker_threads'; import { getBunVersion, isBun, isBunSubprocess, - SpawnResult, spawnWithBun } from '../../utils'; import { getBunBuildArgv, getBunBuildConfig, normalizeOptions } from './lib'; -import { resolve } from 'node:path'; - -function launch( - opts: NormalizedBuildExecutorOptions, - cwd: string -): SpawnResult { - const args = getBunBuildArgv(opts); - - return spawnWithBun(args, { - cwd, - stdio: 'inherit' - }); -} export interface BunBuildResult { success: boolean; @@ -45,7 +31,7 @@ async function* buildExecutor( const { sourceRoot, root } = project.data; const options = normalizeOptions(_options, context, sourceRoot, root); - const cwd = options.cwd ? resolve(context.root, options.cwd) : context.root; + // const cwd = options.cwd ? resolve(context.root, options.cwd) : context.root; const getResult = (success: boolean): BunBuildResult => ({ success, 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 index 9f7f6cb..d292920 100644 --- a/packages/bun/src/executors/build/lib/get-bun-build-argv.ts +++ b/packages/bun/src/executors/build/lib/get-bun-build-argv.ts @@ -32,7 +32,7 @@ export function getBunBuildArgv( !isNil(cfg.naming) && `--chunk-naming=${cfg.naming}`, !isNil(cfg.naming) && `--asset-naming=${cfg.naming}`, cfg.splitting && `--splitting`, - cfg.minify ? cfg.minify === true ? `--minify` : cfg.minify.whitespace, + !isNil(cfg.minify) && `--minify`, options.watch && `--watch`, !isNil(cfg.format) && `--format=${cfg.format}`, !isNil(cfg.external) && `--external=${cfg.external}`, 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 index 7c2de72..531b45f 100644 --- a/packages/bun/src/executors/build/lib/get-bun-build-config.ts +++ b/packages/bun/src/executors/build/lib/get-bun-build-config.ts @@ -1,14 +1,12 @@ import { NormalizedBuildExecutorOptions } from '../schema'; +import Buni from '../../../utils/buni'; -export function getBunBuildConfig( - opts: NormalizedBuildExecutorOptions -): Bun.BuildConfig { - return { +export function getBunBuildConfig(opts: NormalizedBuildExecutorOptions) { + return Buni.createBuildConfig({ entrypoints: [opts.main, ...(opts.additionalEntryPoints || [])], define: opts.define, outdir: opts.outputPath, target: opts.target, - // external: opts.external, // TODO format: opts.format, minify: opts.minify, naming: opts.naming, @@ -24,5 +22,5 @@ export function getBunBuildConfig( drop: opts.drop, tsconfig: opts.tsConfig, throw: true - }; + }); } diff --git a/packages/bun/src/executors/run/run.spec.ts b/packages/bun/src/executors/run/run.spec.ts deleted file mode 100644 index 85712a6..0000000 --- a/packages/bun/src/executors/run/run.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ExecutorContext } from '@nx/devkit'; - -import { RunExecutorOptions } from './schema'; -import executor from './run'; - -const options: RunExecutorOptions = {}; -const context: ExecutorContext = { - root: '', - cwd: process.cwd(), - isVerbose: false, - projectGraph: { - nodes: {}, - dependencies: {} - }, - projectsConfigurations: { - projects: {}, - version: 2 - }, - nxJsonConfiguration: {} -}; - -describe('Run Executor', () => { - it('can run', async () => { - const output = await executor(options, context); - expect(output.success).toBe(true); - }); -}); diff --git a/packages/bun/src/generators/application/application.spec.ts b/packages/bun/src/generators/application/application.spec.ts deleted file mode 100644 index 20b464a..0000000 --- a/packages/bun/src/generators/application/application.spec.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import { Tree, readProjectConfiguration } from '@nx/devkit'; - -import { applicationGenerator } from './application'; -import { ApplicationGeneratorSchema } from './schema'; - -describe('application generator', () => { - let tree: Tree; - const options: ApplicationGeneratorSchema = { name: 'test' }; - - beforeEach(() => { - tree = createTreeWithEmptyWorkspace(); - }); - - it('should run successfully', async () => { - await applicationGenerator(tree, options); - const config = readProjectConfiguration(tree, 'test'); - expect(config).toBeDefined(); - }); -}); diff --git a/packages/bun/src/generators/application/lib/create-targets.ts b/packages/bun/src/generators/application/lib/create-targets.ts index 5f265f0..3489464 100644 --- a/packages/bun/src/generators/application/lib/create-targets.ts +++ b/packages/bun/src/generators/application/lib/create-targets.ts @@ -14,13 +14,20 @@ export function getBuildConfig( ): 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: {} } }; } diff --git a/packages/bun/src/generators/init/init.spec.ts b/packages/bun/src/generators/init/init.spec.ts deleted file mode 100644 index aaa1d80..0000000 --- a/packages/bun/src/generators/init/init.spec.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import { Tree, readProjectConfiguration } from '@nx/devkit'; - -import { initGenerator } from './init'; -import { InitGeneratorSchema } from './schema'; - -describe('init generator', () => { - let tree: Tree; - const options: InitGeneratorSchema = { name: 'test' }; - - beforeEach(() => { - tree = createTreeWithEmptyWorkspace(); - }); - - it('should run successfully', async () => { - await initGenerator(tree, options); - const config = readProjectConfiguration(tree, 'test'); - expect(config).toBeDefined(); - }); -}); diff --git a/packages/bun/src/utils/bun-cfg/bun-build-config.ts b/packages/bun/src/utils/bun-cfg/bun-build-config.ts index 9c48468..9ce739d 100644 --- a/packages/bun/src/utils/bun-cfg/bun-build-config.ts +++ b/packages/bun/src/utils/bun-cfg/bun-build-config.ts @@ -1,7 +1,11 @@ -import { addFlag, defineConfigArgvMap } from './cfg-to-argv'; +import { addFlag, cfgToArgv, defineConfigArgvMap } from './cfg-to-argv'; import { isArray, isBool, isString } from '../logic'; -export const bunBuildConfigHandler = defineConfigArgvMap({ +export function createBunBuildConfig(opts: Bun.BuildConfig): Bun.BuildConfig { + return opts; +} + +export const bunBuildConfigArgvMap = defineConfigArgvMap({ // Positional args entrypoints: (v) => v, @@ -65,3 +69,7 @@ export const bunBuildConfigHandler = defineConfigArgvMap({ 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 index 2cf9adc..f366014 100644 --- a/packages/bun/src/utils/bun-cfg/bun-runtime-config.ts +++ b/packages/bun/src/utils/bun-cfg/bun-runtime-config.ts @@ -6,7 +6,7 @@ export interface BunRuntimeConfig { bun?: boolean; } -export const bunRuntimeConfigHandler = defineConfigArgvMap({ +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 index 575230c..b8c4375 100644 --- a/packages/bun/src/utils/bun-cfg/cfg-to-argv.ts +++ b/packages/bun/src/utils/bun-cfg/cfg-to-argv.ts @@ -59,7 +59,7 @@ export function addFlag( export function cfgToArgv( cfg: TConfig, - flagMap: ConfigArgvMap + argvMap: ConfigArgvMap ): string[] { const argv: string[] = []; @@ -68,7 +68,7 @@ export function cfgToArgv( if (isNil(value)) continue; - const handler: ConfigValueMapper = flagMap[key]; + const handler: ConfigValueMapper = argvMap[key]; if (!isFunction(handler)) { console.error(`Handler for ${key} is not a function`); continue; 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..53c0fff --- /dev/null +++ b/packages/bun/src/utils/buni/index.ts @@ -0,0 +1,27 @@ +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() {} + +export const Buni = { + ...utils, + spawn, + bun, + 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..d505b6a --- /dev/null +++ b/packages/bun/src/utils/buni/spawn/__tests__/helpers.ts @@ -0,0 +1,57 @@ +/* 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) { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const mod = require(modulePath); + if (originalIsBunRuntime === undefined) { + originalIsBunRuntime = mod.isBunRuntime; + } + mod.isBunRuntime = () => value; +} + +export function restoreIsBunRuntime(modulePath: string) { + if (originalIsBunRuntime === undefined) return; + // eslint-disable-next-line @typescript-eslint/no-var-requires + const mod = require(modulePath); + mod.isBunRuntime = originalIsBunRuntime; + originalIsBunRuntime = undefined; +} + +export function mockBunSpawn(impl: (opts: any) => any) { + // Create global Bun if not present + // @ts-ignore + if (typeof globalThis.Bun === 'undefined') { + // @ts-ignore + globalThis.Bun = {} as any; + } + // @ts-ignore + if (originalBunSpawn === undefined) originalBunSpawn = globalThis.Bun.spawn; + // @ts-ignore + globalThis.Bun.spawn = impl as any; +} + +export function restoreBunSpawn() { + // @ts-ignore + if (originalBunSpawn !== undefined) globalThis.Bun.spawn = originalBunSpawn; + originalBunSpawn = undefined; +} + +export function mockNodeSpawn(impl: typeof childProc.spawn) { + if (originalChildSpawn === undefined) originalChildSpawn = childProc.spawn; + // @ts-ignore + childProc.spawn = impl as any; +} + +export function restoreNodeSpawn() { + if (originalChildSpawn !== undefined) { + // @ts-ignore + 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..3b40abf --- /dev/null +++ b/packages/bun/src/utils/buni/spawn/spawn.spec.ts @@ -0,0 +1,121 @@ +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' + }); + + // @ts-ignore + // 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/process-adapter.ts b/packages/bun/src/utils/process-adapter.ts index a12f11b..cc260e7 100644 --- a/packages/bun/src/utils/process-adapter.ts +++ b/packages/bun/src/utils/process-adapter.ts @@ -1,9 +1,9 @@ import { spawn as nodeSpawn, ChildProcess, - type IOType + type IOType, + StdioOptions } from 'node:child_process'; -import { StdioOptions } from 'child_process'; import { workspaceRoot } from '@nx/devkit'; export function isBunRuntime(): boolean { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb1c07e..f9d3c2b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -132,6 +132,8 @@ importers: specifier: 18.0.0 version: 18.0.0 + e2e/bun: {} + packages/bun: dependencies: '@nx/devkit': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d22b7d5..37ed1ea 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,7 @@ packages: - 'packages/*' - 'apps/*' + - 'e2e/bun-e2e' + - 'e2e/bun' onlyBuiltDependencies: - 'nx' diff --git a/tsconfig.json b/tsconfig.json index 1df6406..df28ab5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,6 +11,9 @@ }, { "path": "./packages/bun" + }, + { + "path": "./e2e/bun-e2e" } ] } From 9c0b74f5a72886996dfad4b4594d45228e1ff908 Mon Sep 17 00:00:00 2001 From: Boris Polak <18208654+BorisTB@users.noreply.github.com> Date: Sat, 6 Sep 2025 14:33:01 +0200 Subject: [PATCH 09/12] test: add e2e tests add e2e tests for bun and elysia --- .github/workflows/ci.yml | 3 + e2e/bun/jest.config.ts | 6 +- e2e/bun/src/bun.spec.ts | 54 +- e2e/elysia/jest.config.ts | 5 +- e2e/elysia/src/elysia.spec.ts | 58 +- e2e/utils/add-plugin.ts | 9 - e2e/utils/cleanup-test-project.ts | 12 - e2e/utils/create-test-project.ts | 33 - e2e/utils/index.ts | 5 +- e2e/utils/install-plugin.ts | 9 - e2e/utils/plugin.ts | 37 + package.json | 23 +- .../src/generators/application/application.ts | 42 +- .../application/lib/add-app-files.ts | 2 +- .../src/generators/application/application.ts | 21 +- pnpm-lock.yaml | 2527 +++++++++-------- 16 files changed, 1550 insertions(+), 1296 deletions(-) delete mode 100644 e2e/utils/add-plugin.ts delete mode 100644 e2e/utils/cleanup-test-project.ts delete mode 100644 e2e/utils/create-test-project.ts delete mode 100644 e2e/utils/install-plugin.ts create mode 100644 e2e/utils/plugin.ts 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/e2e/bun/jest.config.ts b/e2e/bun/jest.config.ts index 58ca67a..8c097be 100644 --- a/e2e/bun/jest.config.ts +++ b/e2e/bun/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,7 +10,8 @@ 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 = { + detectOpenHandles: false, displayName: 'bun-e2e', preset: '../../jest.preset.js', transform: { @@ -20,3 +22,5 @@ export default { globalSetup: '../../tools/scripts/start-local-registry.ts', globalTeardown: '../../tools/scripts/stop-local-registry.ts' }; + +export default config; diff --git a/e2e/bun/src/bun.spec.ts b/e2e/bun/src/bun.spec.ts index 099bec3..6b1f050 100644 --- a/e2e/bun/src/bun.spec.ts +++ b/e2e/bun/src/bun.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('bun', () => { - let projectDirectory: string; + let bunApp: string; beforeAll(() => { - projectDirectory = createTestProject(); - installPlugin(projectDirectory, 'bun'); + ensureNxProject(); + installStonxPlugin('bun'); }); 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/bun', { - cwd: projectDirectory, - stdio: 'inherit' + describe('setup', () => { + it('should be installed', () => { + assertPluginInstalled('bun'); }); }); describe('application generator', () => { beforeAll(() => { - execSync( - 'npx nx g @stonx/bun:application my-app --linter none --unitTestRunner none --e2eTestRunner none --framework none', - { - cwd: projectDirectory, - stdio: 'inherit', - env: process.env - } - ); + bunApp = generateStonxApp('bun', '--framework none'); }); - 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(bunApp); expect(projectDetails).toMatchObject({ - name: 'my-app', - root: 'my-app', - sourceRoot: 'my-app/src', + name: bunApp, + root: `apps/${bunApp}`, + sourceRoot: `apps/${bunApp}/src`, projectType: 'application', targets: { build: { @@ -56,8 +44,8 @@ describe('bun', () => { outputs: ['{options.outputPath}'], defaultConfiguration: 'production', options: { - main: 'my-app/src/main.ts', - tsConfig: 'my-app/tsconfig.app.json', + main: `apps/${bunApp}/src/main.ts`, + tsConfig: `apps/${bunApp}/tsconfig.app.json`, smol: false, bun: true }, @@ -77,7 +65,7 @@ describe('bun', () => { configurations: { development: {}, production: { - buildTarget: 'my-app:build:production' + buildTarget: `${bunApp}:build:production` } }, parallelism: true diff --git a/e2e/elysia/jest.config.ts b/e2e/elysia/jest.config.ts index aa878e6..629870f 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,7 +10,7 @@ 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', transform: { @@ -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/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/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/package.json b/package.json index 15ccfaf..63708c0 100644 --- a/package.json +++ b/package.json @@ -14,18 +14,19 @@ "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", @@ -35,8 +36,10 @@ "@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", @@ -47,7 +50,7 @@ "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", diff --git a/packages/bun/src/generators/application/application.ts b/packages/bun/src/generators/application/application.ts index 81c8d8a..7d62398 100644 --- a/packages/bun/src/generators/application/application.ts +++ b/packages/bun/src/generators/application/application.ts @@ -30,32 +30,34 @@ export async function applicationGenerator( 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 ); - const elysiaTask = await applicationGenerator(tree, { - ...options, - skipFormat: true - }); - tasks.push(elysiaTask); - - return runTasksInSerial( - ...[ - ...tasks, - () => { - logShowProjectCommand(options.name); - } - ] + + tasks.push( + await applicationGenerator(tree, { + ...options, + skipFormat: true + }) ); + + tasks.push(logShowProjectCmdTask); + + return runTasksInSerial(...tasks); } - const initTask = await initGenerator(tree, { - ...options, - skipFormat: true - }); - tasks.push(initTask); + tasks.push( + await initGenerator(tree, { + ...options, + skipFormat: true + }) + ); addAppFiles(tree, options); addProject(tree, options); @@ -116,9 +118,7 @@ export async function applicationGenerator( await formatFiles(tree); } - tasks.push(() => { - logShowProjectCommand(options.name); - }); + tasks.push(logShowProjectCmdTask); return runTasksInSerial(...tasks); } diff --git a/packages/bun/src/generators/application/lib/add-app-files.ts b/packages/bun/src/generators/application/lib/add-app-files.ts index 40dd7e7..092f408 100644 --- a/packages/bun/src/generators/application/lib/add-app-files.ts +++ b/packages/bun/src/generators/application/lib/add-app-files.ts @@ -10,7 +10,7 @@ import { getRelativePathToRootTsConfig } from '@nx/js'; export function addAppFiles(tree: Tree, options: NormalizedOptions) { generateFiles( tree, - joinPathFragments(__dirname, '..', 'files'), + joinPathFragments(__dirname, '../files'), options.appProjectRoot, { ...options, 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/pnpm-lock.yaml b/pnpm-lock.yaml index f9d3c2b..0ae05a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,31 +10,31 @@ 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.9.2))(@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.9.2))(@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.9.2))(@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.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.9.2))(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.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(typescript@5.9.2)(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.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.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.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)) + 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.9.2))(@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.9.2))(@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.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.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.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)) + 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.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.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.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)) + 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.9.2))(@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.9.2) @@ -52,7 +52,7 @@ importers: 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.9) + version: 1.2.20(@types/react@19.1.12) '@types/jest': specifier: ^30.0.0 version: 30.0.0 @@ -62,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 @@ -85,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.9.2)) + 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 @@ -99,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.9.2))(@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 @@ -112,7 +118,7 @@ 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.9.2)))(typescript@5.9.2) + 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.9.2) @@ -124,7 +130,7 @@ importers: version: 5.9.2 typescript-eslint: specifier: ^8.29.0 - version: 8.39.0(eslint@9.32.0)(typescript@5.9.2) + 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) @@ -138,35 +144,31 @@ importers: dependencies: '@nx/devkit': specifier: '>=20.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.9.2))(@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/js': specifier: '>=20.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.9.2))(@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.9.2))(@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)) 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.9.2))(@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.9.2))(@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.9.2))(@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.9.2))(@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.9.2))(@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.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.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.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)) + 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==} @@ -174,16 +176,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': @@ -194,8 +196,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 @@ -223,8 +225,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 @@ -265,16 +267,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 @@ -302,8 +304,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 @@ -453,8 +455,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 @@ -465,14 +467,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 @@ -615,8 +617,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 @@ -663,8 +665,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 @@ -681,8 +683,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 @@ -747,8 +749,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 @@ -764,31 +766,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': @@ -798,8 +803,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 @@ -819,17 +824,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] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@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] + + '@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] - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] - '@emnapi/wasi-threads@1.0.4': - resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@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.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@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 @@ -842,46 +985,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'} @@ -898,12 +1037,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 @@ -919,8 +1058,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 @@ -929,36 +1068,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 @@ -970,144 +1109,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': @@ -1128,13 +1276,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 @@ -1142,8 +1293,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 @@ -1151,75 +1302,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==} @@ -1234,8 +1385,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==} @@ -1247,11 +1398,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': @@ -1432,8 +1583,8 @@ packages: '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/react@19.1.9': - resolution: {integrity: sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==} + '@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==} @@ -1447,63 +1598,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': @@ -1786,8 +1937,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: @@ -1857,8 +2008,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 @@ -1868,8 +2019,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: @@ -1918,8 +2069,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==} @@ -1958,8 +2109,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 @@ -2022,8 +2173,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==} @@ -2076,6 +2227,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'} @@ -2141,8 +2300,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==} @@ -2234,8 +2393,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: @@ -2321,15 +2480,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==} @@ -2380,6 +2539,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'} @@ -2417,8 +2581,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: @@ -2476,8 +2640,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: @@ -2522,8 +2686,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==} @@ -2531,8 +2695,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: @@ -2653,8 +2818,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: @@ -2956,8 +3121,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: @@ -2972,12 +3137,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: @@ -2986,8 +3151,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': '*' @@ -3001,20 +3166,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 @@ -3022,24 +3187,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: @@ -3059,44 +3224,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: @@ -3171,6 +3336,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} @@ -3321,6 +3489,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'} @@ -3400,8 +3572,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 @@ -3434,8 +3606,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==} @@ -3453,11 +3625,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 @@ -4062,8 +4234,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: @@ -4077,8 +4249,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: @@ -4179,8 +4351,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 @@ -4201,8 +4373,8 @@ packages: 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: @@ -4422,15 +4594,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 @@ -4441,20 +4608,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 @@ -4463,49 +4630,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 @@ -4518,55 +4685,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 @@ -4576,663 +4743,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 @@ -5264,22 +5433,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': {} @@ -5292,9 +5530,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 @@ -5312,26 +5550,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': @@ -5353,22 +5589,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.9.2))': + '@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 @@ -5377,18 +5613,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.9.2)) - 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 @@ -5404,10 +5640,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 @@ -5415,39 +5651,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: @@ -5458,14 +5694,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 @@ -5476,10 +5712,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 @@ -5488,9 +5724,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 @@ -5499,35 +5735,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 @@ -5547,104 +5783,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': @@ -5659,26 +5904,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.9.2))(@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.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)) 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.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17))(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.9.2))(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.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/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.9.2))(@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.9.2))(@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.9.2))(@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/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.39.0(eslint@9.32.0)(typescript@5.9.2) - '@typescript-eslint/type-utils': 8.39.0(eslint@9.32.0)(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0)(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 @@ -5686,7 +5939,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' @@ -5698,11 +5951,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.9.2))(@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.9.2))(@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.9.2))(@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.9.2))(@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.9.2))(@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 @@ -5717,16 +5970,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.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.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.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/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.9.2))(@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.9.2))(@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.9.2))(@swc/core@1.5.29(@swc/helpers@0.5.17)))(verdaccio@6.1.6(typanion@3.14.0)) + '@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.9.2)) - 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 @@ -5749,21 +6002,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.9.2))(@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.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.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.9.2))(@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.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))': + 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 @@ -5790,12 +6043,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.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.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.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/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.9.2))(@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.9.2))(@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.9.2))(@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.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.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.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.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.9.2))(@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.9.2))(@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 @@ -5816,42 +6070,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.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.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.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@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.9.2))(@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.9.2))(@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.9.2))(@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.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.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.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.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.9.2))(@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.9.2))(@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' @@ -5870,14 +6124,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.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))': 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.9.2))(@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.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)) picomatch: 4.0.2 + semver: 7.7.2 tslib: 2.8.1 yargs-parser: 21.1.1 transitivePeerDependencies: @@ -5895,7 +6150,7 @@ snapshots: '@pkgr/core@0.2.9': {} - '@sinclair/typebox@0.34.38': {} + '@sinclair/typebox@0.34.41': {} '@sindresorhus/is@5.6.0': {} @@ -5907,14 +6162,14 @@ 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.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 @@ -6004,7 +6259,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: @@ -6018,7 +6273,7 @@ snapshots: dependencies: debug: 4.4.1 fflate: 0.8.2 - token-types: 6.0.4 + token-types: 6.1.1 transitivePeerDependencies: - supports-color @@ -6043,28 +6298,28 @@ 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.9)': + '@types/bun@1.2.20(@types/react@19.1.12)': dependencies: - bun-types: 1.2.20(@types/react@19.1.9) + bun-types: 1.2.20(@types/react@19.1.12) transitivePeerDependencies: - '@types/react' @@ -6084,7 +6339,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': @@ -6099,7 +6354,7 @@ snapshots: '@types/parse-json@4.0.2': {} - '@types/react@19.1.9': + '@types/react@19.1.12': dependencies: csstype: 3.1.3 @@ -6113,15 +6368,15 @@ 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.9.2))(eslint@9.32.0)(typescript@5.9.2)': + '@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.9.2) - '@typescript-eslint/scope-manager': 8.39.0 - '@typescript-eslint/type-utils': 8.39.0(eslint@9.32.0)(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0)(typescript@5.9.2) - '@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 @@ -6130,56 +6385,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.9.2)': + '@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.9.2) - '@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 + eslint: 9.35.0 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.39.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.42.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.9.2) - '@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.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.9.2)': + '@typescript-eslint/tsconfig-utils@8.42.0(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.39.0(eslint@9.32.0)(typescript@5.9.2)': + '@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.9.2) - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0)(typescript@5.9.2) + '@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 + 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.9.2)': + '@typescript-eslint/typescript-estree@8.42.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.39.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.9.2) - '@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 @@ -6190,20 +6445,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.39.0(eslint@9.32.0)(typescript@5.9.2)': + '@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.9.2) - eslint: 9.32.0 + '@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': {} @@ -6549,7 +6804,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 @@ -6561,7 +6816,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.0: {} ansi-styles@4.3.0: dependencies: @@ -6618,29 +6873,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 @@ -6653,74 +6908,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: {} @@ -6782,12 +7037,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: @@ -6813,10 +7068,10 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bun-types@1.2.20(@types/react@19.1.9): + bun-types@1.2.20(@types/react@19.1.12): dependencies: '@types/node': 18.16.9 - '@types/react': 19.1.9 + '@types/react': 19.1.12 bytes@3.1.2: {} @@ -6848,7 +7103,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001731: {} + caniuse-lite@1.0.30001741: {} caseless@0.12.0: {} @@ -6891,6 +7146,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: {} @@ -6918,7 +7177,7 @@ snapshots: compressible@2.0.18: dependencies: - mime-db: 1.52.0 + mime-db: 1.54.0 compression@1.8.1: dependencies: @@ -6948,9 +7207,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: {} @@ -7021,7 +7280,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 @@ -7092,11 +7351,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: {} @@ -7137,6 +7396,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: {} @@ -7147,9 +7432,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: @@ -7160,17 +7445,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 @@ -7246,12 +7531,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 @@ -7295,7 +7580,7 @@ snapshots: ext-list@2.2.2: dependencies: - mime-db: 1.52.0 + mime-db: 1.54.0 ext-name@5.0.0: dependencies: @@ -7324,7 +7609,7 @@ snapshots: fast-redact@3.5.0: {} - fast-uri@3.0.6: {} + fast-uri@3.1.0: {} fastq@1.19.1: dependencies: @@ -7334,7 +7619,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 @@ -7352,8 +7637,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 @@ -7446,7 +7731,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: @@ -7727,8 +8012,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 @@ -7743,13 +8028,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 @@ -7772,22 +8057,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 @@ -7798,17 +8083,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.9.2)): + 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.9.2)) - '@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.9.2)) + 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' @@ -7817,27 +8102,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.9.2)): + 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 @@ -7850,10 +8135,10 @@ snapshots: - 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 @@ -7861,18 +8146,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 @@ -7881,17 +8166,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 @@ -7900,25 +8185,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 @@ -7936,36 +8221,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 @@ -7973,28 +8258,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 @@ -8002,37 +8287,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 @@ -8049,18 +8334,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 @@ -8069,7 +8354,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 @@ -8077,12 +8362,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.9.2)): + 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.9.2)) + '@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.9.2)) + 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 @@ -8112,7 +8397,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 @@ -8159,6 +8444,8 @@ snapshots: jsonc-parser@3.2.0: {} + jsonc-parser@3.3.1: {} + jsonparse@1.3.1: {} jsonwebtoken@9.0.2: @@ -8300,6 +8587,8 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 @@ -8354,7 +8643,7 @@ snapshots: ms@2.1.3: {} - napi-postinstall@0.3.2: {} + napi-postinstall@0.3.3: {} natural-compare@1.4.0: {} @@ -8372,7 +8661,7 @@ snapshots: node-machine-id@1.1.12: {} - node-releases@2.0.19: {} + node-releases@2.0.20: {} normalize-path@3.0.0: {} @@ -8389,9 +8678,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.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)): dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 @@ -8409,7 +8698,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 @@ -8421,7 +8710,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 @@ -8429,16 +8718,16 @@ 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 + '@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: @@ -8597,7 +8886,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: @@ -8934,7 +9223,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: @@ -8955,8 +9244,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: @@ -8973,7 +9262,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.0 strip-bom@3.0.0: {} @@ -9054,7 +9343,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: {} @@ -9063,7 +9352,7 @@ snapshots: dependencies: tldts-core: 6.1.86 - tmp@0.2.4: {} + tmp@0.2.5: {} tmpl@1.0.5: {} @@ -9073,8 +9362,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 @@ -9094,12 +9384,12 @@ snapshots: dependencies: 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.9.2)))(typescript@5.9.2): + 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.9.2)) + 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 @@ -9108,10 +9398,11 @@ snapshots: 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.9.2): @@ -9165,13 +9456,13 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typescript-eslint@8.39.0(eslint@9.32.0)(typescript@5.9.2): + 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.9.2))(eslint@9.32.0)(typescript@5.9.2) - '@typescript-eslint/parser': 8.39.0(eslint@9.32.0)(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0)(typescript@5.9.2) - eslint: 9.32.0 + '@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 @@ -9183,7 +9474,7 @@ snapshots: uglify-js@3.19.3: optional: true - uint8array-extras@1.4.0: {} + uint8array-extras@1.5.0: {} unbzip2-stream@1.4.3: dependencies: @@ -9207,7 +9498,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 @@ -9229,9 +9520,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 @@ -9249,7 +9540,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 From 62dd48174c5a1a3d6ac1616a9e91936908f7aa98 Mon Sep 17 00:00:00 2001 From: Boris Polak <18208654+BorisTB@users.noreply.github.com> Date: Sat, 6 Sep 2025 15:03:54 +0200 Subject: [PATCH 10/12] ci(bun): fix lint fix lint errors --- packages/bun/package.json | 6 +- packages/bun/src/executors/build/build.ts | 3 +- .../bun/src/executors/run/lib/debounce.ts | 25 - .../run/lib/file-to-run-correct-path.ts | 18 - .../src/executors/run/lib/first-value-from.ts | 20 +- .../executors/run/lib/get-main-file-dir.ts | 11 - packages/bun/src/executors/run/lib/index.ts | 11 - .../bun/src/executors/run/lib/kill-tree.ts | 184 ------- .../executors/run/lib/line-aware-writer.ts | 34 -- .../run/lib/parse-target-definition.ts | 27 - .../lib/write-runtime-tsconfig-override.ts | 25 - packages/bun/src/executors/run/run.old.ts | 505 ------------------ .../application/lib/create-targets.ts | 13 +- packages/bun/src/utils/bun-cfg/bun-cfg.ts | 46 -- packages/bun/src/utils/buni/index.ts | 5 +- .../src/utils/buni/spawn/__tests__/helpers.ts | 12 +- .../bun/src/utils/buni/spawn/spawn.spec.ts | 1 - packages/bun/src/utils/process-adapter.ts | 9 +- 18 files changed, 34 insertions(+), 921 deletions(-) delete mode 100644 packages/bun/src/executors/run/lib/debounce.ts delete mode 100644 packages/bun/src/executors/run/lib/file-to-run-correct-path.ts delete mode 100644 packages/bun/src/executors/run/lib/get-main-file-dir.ts delete mode 100644 packages/bun/src/executors/run/lib/kill-tree.ts delete mode 100644 packages/bun/src/executors/run/lib/line-aware-writer.ts delete mode 100644 packages/bun/src/executors/run/lib/parse-target-definition.ts delete mode 100644 packages/bun/src/executors/run/lib/write-runtime-tsconfig-override.ts delete mode 100644 packages/bun/src/executors/run/run.old.ts delete mode 100644 packages/bun/src/utils/bun-cfg/bun-cfg.ts diff --git a/packages/bun/package.json b/packages/bun/package.json index 1ef94a1..29032a2 100644 --- a/packages/bun/package.json +++ b/packages/bun/package.json @@ -20,7 +20,11 @@ "generators": "./generators.json", "peerDependencies": { "@nx/devkit": ">=20.0.0 <22.0.0", - "@nx/js": ">=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/src/executors/build/build.ts b/packages/bun/src/executors/build/build.ts index f30ee3e..f7d4af3 100644 --- a/packages/bun/src/executors/build/build.ts +++ b/packages/bun/src/executors/build/build.ts @@ -9,6 +9,7 @@ import { spawnWithBun } from '../../utils'; import { getBunBuildArgv, getBunBuildConfig, normalizeOptions } from './lib'; +import Buni from '../../utils/buni'; export interface BunBuildResult { success: boolean; @@ -40,7 +41,7 @@ async function* buildExecutor( if (isBun) { const config = getBunBuildConfig(options); - const result = await Bun.build(config); + const result = await Buni.build(config); for (const log of result.logs) { console.log(log); } diff --git a/packages/bun/src/executors/run/lib/debounce.ts b/packages/bun/src/executors/run/lib/debounce.ts deleted file mode 100644 index 07530b1..0000000 --- a/packages/bun/src/executors/run/lib/debounce.ts +++ /dev/null @@ -1,25 +0,0 @@ -export function debounce( - fn: () => Promise, - wait: number -): () => Promise { - let timeoutId: ReturnType; - let pendingPromise: Promise | null = null; - - return () => { - if (!pendingPromise) { - pendingPromise = new Promise((resolve, reject) => { - timeoutId = setTimeout(() => { - fn() - .then(resolve) - .catch(reject) - .finally(() => { - pendingPromise = null; - clearTimeout(timeoutId); - }); - }, wait); - }); - } - - return pendingPromise; - }; -} diff --git a/packages/bun/src/executors/run/lib/file-to-run-correct-path.ts b/packages/bun/src/executors/run/lib/file-to-run-correct-path.ts deleted file mode 100644 index 5510894..0000000 --- a/packages/bun/src/executors/run/lib/file-to-run-correct-path.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { fileExists } from 'nx/src/utils/fileutils'; - -export function fileToRunCorrectPath(fileToRun: string): string { - if (fileExists(fileToRun)) { - return fileToRun; - } - - const extensionsToTry = ['.cjs', '.mjs', '.cjs.js', '.esm.js']; - - for (const ext of extensionsToTry) { - const file = fileToRun.replace(/\.js$/, ext); - if (fileExists(file)) return file; - } - - throw new Error( - `Could not find ${fileToRun}. Make sure your build succeeded.` - ); -} diff --git a/packages/bun/src/executors/run/lib/first-value-from.ts b/packages/bun/src/executors/run/lib/first-value-from.ts index d352ecd..4593fef 100644 --- a/packages/bun/src/executors/run/lib/first-value-from.ts +++ b/packages/bun/src/executors/run/lib/first-value-from.ts @@ -1,12 +1,16 @@ export function firstValueFrom(it: AsyncIterableIterator): Promise { - return new Promise(async (resolve) => { - let event = await it.next(); - // Resolve after first event - resolve(event.value as T); + return new Promise((resolve, reject) => { + (async () => { + try { + let event = await it.next(); + resolve(event.value as T); - // Continue iterating - while (!event.done) { - event = await it.next(); - } + while (!event.done) { + event = await it.next(); + } + } catch (err) { + reject(err); + } + })(); }); } diff --git a/packages/bun/src/executors/run/lib/get-main-file-dir.ts b/packages/bun/src/executors/run/lib/get-main-file-dir.ts deleted file mode 100644 index 490fcc8..0000000 --- a/packages/bun/src/executors/run/lib/get-main-file-dir.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { dirname, relative } from 'node:path'; -import { normalizePath } from 'nx/src/utils/path'; - -export function getRelativeDirectoryToProjectRoot( - file: string, - projectRoot: string -): string { - const dir = dirname(file); - const relativeDir = normalizePath(relative(projectRoot, dir)); - return relativeDir === '' ? `./` : `./${relativeDir}/`; -} diff --git a/packages/bun/src/executors/run/lib/index.ts b/packages/bun/src/executors/run/lib/index.ts index 8484378..e7a6751 100644 --- a/packages/bun/src/executors/run/lib/index.ts +++ b/packages/bun/src/executors/run/lib/index.ts @@ -1,15 +1,4 @@ -export * from './calculate-resolve-mappings'; -export * from './debounce'; -export * from './file-to-run-correct-path'; -export * from './first-value-from'; export * from './build-bun-args'; export * from './get-file-to-run'; -export * from './get-main-file-dir'; -export * from './get-relative-path'; -export * from './is-relative-path-definition'; -export * from './kill-tree'; -export * from './line-aware-writer'; export * from './normalize-options'; -export * from './parse-target-definition'; export * from './wait-for-targets'; -export * from './write-runtime-tsconfig-override'; diff --git a/packages/bun/src/executors/run/lib/kill-tree.ts b/packages/bun/src/executors/run/lib/kill-tree.ts deleted file mode 100644 index 7c606c1..0000000 --- a/packages/bun/src/executors/run/lib/kill-tree.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { platform } from 'node:os'; -import { ExecException } from 'node:child_process'; -import { - isBun, - isBunSubprocess, - runSpawn, - UniversalChildProcess -} from '../../../utils'; - -async function runExec(cmd: string) { - if (isBun) { - const { stdout, stderr, exitCode } = await Bun.$`${cmd}`.quiet(); - return { - stdout: stdout.toString(), - stderr: stderr.toString(), - exitCode: exitCode, - success: exitCode === 0 - }; - } - - const { promisify } = await import('node:util'); - const { exec } = await import('node:child_process'); - const nodeExec = promisify(exec); - - const { stdout, stderr } = await nodeExec(cmd, { windowsHide: true }); - return { - stdout, - stderr, - exitCode: 0, - success: true - }; -} - -export async function killTree(pid: number, signal: NodeJS.Signals) { - const tree: Record = {}; - const pidsToProcess: Record = {}; - tree[pid] = []; - pidsToProcess[pid] = 1; - - return new Promise(async (resolve, reject) => { - const callback = (error?: ExecException | null) => { - if (error) { - reject(error); - } else { - resolve(); - } - }; - - switch (platform()) { - case 'win32': - try { - await runExec(`taskkill /pid ${pid} /T /F`); - } catch (error: any) { - callback(error?.code !== 128 ? error : null); - } - break; - case 'darwin': - buildProcessTree( - pid, - tree, - pidsToProcess, - function (parentPid) { - return runSpawn('pgrep', ['-P', String(parentPid)], { - windowsHide: false - }); - }, - function () { - killAll(tree, signal, callback); - } - ); - break; - default: // Linux - buildProcessTree( - pid, - tree, - pidsToProcess, - function (parentPid) { - return runSpawn( - 'ps', - ['-o', 'pid', '--no-headers', '--ppid', String(parentPid)], - { - windowsHide: false - } - ); - }, - function () { - killAll(tree, signal, callback); - } - ); - break; - } - }); -} - -function killAll( - tree: Record, - signal: number | string, - callback?: (error?: any) => void -) { - const killed: Record = {}; - try { - Object.keys(tree).forEach((pid) => { - tree[pid].forEach((pidpid) => { - if (!killed[pidpid]) { - killPid(pidpid, signal); - killed[pidpid] = 1; - } - }); - if (!killed[pid]) { - killPid(pid, signal); - killed[pid] = 1; - } - }); - } catch (err) { - if (callback) { - return callback(err); - } - throw err; - } - - if (callback) { - return callback(); - } -} - -function killPid(pid: string | number, signal: string | number) { - try { - process.kill(parseInt(String(pid), 10), signal); - } catch (err: any) { - if (err.code !== 'ESRCH') throw err; - } -} - -function buildProcessTree( - parentPid: number, - tree: Record, - pidsToProcess: Record, - spawnChildProcessesList: (pid: number) => UniversalChildProcess, - cb: () => void -) { - const ps = spawnChildProcessesList(parentPid); - - let allData = ''; - if (isBunSubprocess(ps)) { - const stdoutReader = ps.stdout?.getReader(); - const handleStdout = async () => { - if (stdoutReader) { - while (true) { - const { done, value } = await stdoutReader.read(); - if (done) break; - allData += new TextDecoder().decode(value); - } - } - const code = await ps.exited; - stdoutReader.cancel(); - onClose(code); - }; - handleStdout(); - } else { - ps.stdout?.on('data', (data: Buffer) => { - allData += data.toString('ascii'); - }); - ps.on('close', onClose); - } - - function onClose(code: number) { - delete pidsToProcess[parentPid]; - - if (code !== 0) { - if (Object.keys(pidsToProcess).length === 0) { - cb(); - } - return; - } - - allData.match(/\d+/g)?.forEach((_pid) => { - const pid = parseInt(_pid, 10); - tree[parentPid].push(pid); - tree[pid] = []; - pidsToProcess[pid] = 1; - buildProcessTree(pid, tree, pidsToProcess, spawnChildProcessesList, cb); - }); - } -} diff --git a/packages/bun/src/executors/run/lib/line-aware-writer.ts b/packages/bun/src/executors/run/lib/line-aware-writer.ts deleted file mode 100644 index 0d278d5..0000000 --- a/packages/bun/src/executors/run/lib/line-aware-writer.ts +++ /dev/null @@ -1,34 +0,0 @@ -export class LineAwareWriter { - private buffer = ''; - private activeTaskId: string | null = null; - - get currentProcessId(): string | null { - return this.activeTaskId; - } - - write(data: Buffer | string, taskId: string): void { - if (taskId !== this.activeTaskId) return; - - const text = data.toString(); - this.buffer += text; - - const lines = this.buffer.split('\n'); - this.buffer = lines.pop() || ''; - - for (const line of lines) { - process.stdout.write(line + '\n'); - } - } - - flush(): void { - if (this.buffer) { - process.stdout.write(this.buffer + '\n'); - this.buffer = ''; - } - } - - setActiveProcess(taskId: string | null): void { - this.flush(); - this.activeTaskId = taskId; - } -} diff --git a/packages/bun/src/executors/run/lib/parse-target-definition.ts b/packages/bun/src/executors/run/lib/parse-target-definition.ts deleted file mode 100644 index 399a85e..0000000 --- a/packages/bun/src/executors/run/lib/parse-target-definition.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { - ExecutorContext, - parseTargetString, - readTargetOptions, - Target -} from '@nx/devkit'; - -export function parseTargetDefinition( - targetName: string | undefined, - targetOptionsDef: Record = {}, - context: ExecutorContext -): { target: Target | null; targetOptions: Record | null } { - if (!targetName) { - return { target: null, targetOptions: null }; - } - - const target = parseTargetString(targetName, context); - - return { - target, - targetOptions: { - ...readTargetOptions(target, context), - ...targetOptionsDef, - target: target.target - } - }; -} diff --git a/packages/bun/src/executors/run/lib/write-runtime-tsconfig-override.ts b/packages/bun/src/executors/run/lib/write-runtime-tsconfig-override.ts deleted file mode 100644 index 3c8e663..0000000 --- a/packages/bun/src/executors/run/lib/write-runtime-tsconfig-override.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ExecutorContext, Target } from '@nx/devkit'; -import { join } from 'node:path'; -import { existsSync, mkdirSync, writeFileSync } from 'node:fs'; -import { calculateResolveMappings } from './calculate-resolve-mappings'; - -export function writeRuntimeTsconfigOverride( - projectName: string, - buildTarget: Target, - root: string, - context: ExecutorContext -) { - const paths = calculateResolveMappings(buildTarget, context); - - const outDir = join(root, 'node_modules/.cache/@stonx/bun'); - if (!existsSync(outDir)) mkdirSync(outDir, { recursive: true }); - const file = join(outDir, `${projectName}-runtime.tsconfig.json`); - const json = { - compilerOptions: { - baseUrl: '.', - paths - } - }; - writeFileSync(file, JSON.stringify(json, null, 2)); - return file; -} diff --git a/packages/bun/src/executors/run/run.old.ts b/packages/bun/src/executors/run/run.old.ts deleted file mode 100644 index 2028341..0000000 --- a/packages/bun/src/executors/run/run.old.ts +++ /dev/null @@ -1,505 +0,0 @@ -// import { ChildProcess, spawn } from 'node:child_process'; -// import { join, relative } from 'node:path'; -// import { -// ExecutorContext, -// logger, -// readTargetOptions, -// runExecutor -// } from '@nx/devkit'; -// import { getBunVersion, UniversalChildProcess } from '../../utils'; -// import { RunExecutorOptions } from './schema'; -// import { -// firstValueFrom, -// buildBunArgs, -// NormalizedOptions, -// normalizeOptions, -// waitForTargets, -// writeRuntimeTsconfigOverride -// } from './lib'; -// -// interface ActiveTask { -// id: string; -// killed: boolean; -// promise: Promise | null; -// childProcess: UniversalChildProcess | null; -// start: () => Promise; -// stop: (signal: NodeJS.Signals) => Promise; -// } -// -// function resolveEntryFromSources( -// opts: NormalizedOptions, -// context: ExecutorContext -// ) { -// if (!opts.main) -// throw new Error('entry is required when buildTarget is not set'); -// return join(context.root, opts.main); -// } -// -// function resolveEntryFromBuildResult( -// res: any, -// buildOpts: any, -// context: ExecutorContext -// ) { -// // Common patterns: esbuild -> outfile; tsc -> outputPath + main; custom -> explicit "main" -// if (res.outfile) return join(context.root, res.outfile); -// if (res.outputPath && buildOpts?.main) -// return join( -// context.root, -// res.outputPath, -// relative(context.root, buildOpts.main).replace(/\.ts(x?)$/, '.js$1') -// ); -// if (res.outputPath && res.main) -// return join(context.root, res.outputPath, res.main); -// if (res.outputFile) return join(context.root, res.outputFile); -// throw new Error( -// 'Cannot resolve entry file from build result. Provide a known build executor or return outfile.' -// ); -// } -// -// export default 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`); -// } -// -// if (!context.projectName) { -// throw new Error(`project name is undefined`); -// } -// -// const options = normalizeOptions(_options, context); -// -// // 1) Gate: wait for dependent tasks if configured -// if (options.waitUntilTargets?.length) { -// await waitForTargets(options.waitUntilTargets, context); -// } -// -// // 2) Decide mode -// const { -// projectName, -// root, -// cwd, -// bunBin, -// shouldBuildApp, -// shouldBuildDependencies, -// watchMode, -// buildTarget -// } = options; -// -// // 3) Prepare path remapping for "built libs first" -// const tsconfigOverridePath = -// options.tsConfigOverride && -// buildTarget && -// (shouldBuildApp ? options.runBuildTargetDependencies !== false : false) -// ? writeRuntimeTsconfigOverride(projectName, buildTarget, root, context) -// : null; -// -// // 4) Start processes -// let child: ChildProcess | null = null; -// -// const startBun = (entryFile: string) => { -// const cliArgs = buildBunArgs(options, entryFile); -// -// child = spawn(bunBin, cliArgs, { -// cwd, -// stdio: 'inherit', -// env: { ...process.env } -// }); -// -// child.on('exit', (code, signal) => { -// if (watchMode === 'nx') { -// // exit will be managed by outer watch loop -// return; -// } -// // stop generator when not watching -// if (code != null && code !== 0) -// logger.error(`bun exited with code ${code}`); -// }); -// }; -// -// const stopBun = async () => { -// if (!child) return; -// const p = child; -// child = null; -// // Try graceful first -// p.kill('SIGTERM'); -// // Hard kill fallback after 1s -// setTimeout(() => p.kill('SIGKILL'), 1000); -// }; -// -// // Forward signals -// const onSig = async () => { -// await stopBun(); -// // end generator -// }; -// process.once('SIGINT', onSig); -// process.once('SIGTERM', onSig); -// -// if (!shouldBuildApp) { -// // Run sources directly with Bun -// startBun(resolveEntryFromSources(options, context)); -// yield { success: true }; -// // Keep alive until the child exits -// await new Promise((resolve) => child?.on('exit', () => resolve())); -// return; -// } -// -// if (buildTarget) { -// // Use the Nx build target -// const baseBuildOpts = readTargetOptions(buildTarget, context); -// -// // Watch via Nx if requested; else build once and run -// if (watchMode === 'nx') { -// for await (const res of await runExecutor( -// buildTarget, -// { ...baseBuildOpts, watch: true }, -// context -// )) { -// if (!res.success) { -// logger.warn('Build failed. Waiting for the next successful rebuild…'); -// continue; -// } -// const entry = resolveEntryFromBuildResult(res, baseBuildOpts, context); -// await stopBun(); -// startBun(entry); -// // emit success on first start; generator remains open without timers -// yield { success: true }; -// } -// await stopBun(); -// return; -// } else { -// // build once, then run with Bun’s own file watching if user asked for it -// const first = await firstValueFrom( -// await runExecutor( -// buildTarget, -// { ...baseBuildOpts, watch: false }, -// context -// ) -// ); -// if (!first.success) return yield* [{ success: false }]; -// const entry = resolveEntryFromBuildResult(first, baseBuildOpts, context); -// startBun(entry); -// yield { success: true }; -// await new Promise((resolve) => child?.on('exit', () => resolve())); -// return; -// } -// } -// // -// // process.env.NODE_ENV ??= context?.configurationName ?? 'development'; -// // -// // const project = context.projectGraph.nodes[context.projectName]; -// // const buildTarget = parseTargetString(options.buildTarget, context); -// // const projectBuildTargetConfig = project.data.targets?.[buildTarget.target]; -// // -// // if (!projectBuildTargetConfig) { -// // throw new Error( -// // `Cannot find build target ${options.buildTarget} for project ${context.projectName}` -// // ); -// // } -// // -// // const buildTargetExecutor = projectBuildTargetConfig.executor; -// // -// // if (buildTargetExecutor === 'nx:run-commands') { -// // // Run commands does not emit build event, so we have to switch to run entire build through Nx CLI. -// // options.runBuildTargetDependencies = true; -// // } -// // -// // const buildOptions: Record = { -// // ...readTargetOptions(buildTarget, context), -// // ...options.buildTargetOptions, -// // target: buildTarget.target -// // }; -// // -// // if (options.waitUntilTargets && options.waitUntilTargets.length > 0) { -// // 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]}.` -// // ); -// // } -// // } -// // } -// // -// // // Re-map buildable workspace projects to their output directory. -// // // const mappings = calculateResolveMappings(context, options); -// // const fileToRun = getFileToRun( -// // context, -// // project, -// // buildOptions, -// // buildTargetExecutor -// // ); -// // -// // let additionalExitHandler: null | (() => void) = null; -// // let currentTask: ActiveTask | null = null; -// // const tasks: ActiveTask[] = []; -// // -// // const args = getCliArgs(options); -// // -// // yield* createAsyncIterable<{ -// // success: boolean; -// // options?: Record; -// // }>(async ({ done, next, error, registerCleanup }) => { -// // const processQueue = async () => { -// // if (tasks.length === 0) return; -// // -// // const previousTask = currentTask; -// // const task = tasks.shift(); -// // currentTask = task ?? null; -// // await previousTask?.stop('SIGTERM'); -// // await task?.start(); -// // }; -// // -// // const debouncedProcessQueue = debounce( -// // processQueue, -// // options.debounce ?? 1_000 -// // ); -// // -// // const addToQueue = async ( -// // childProcess: null | ChildProcess, -// // buildResult: Promise<{ success: boolean }> -// // ) => { -// // const task: ActiveTask = { -// // id: randomUUID(), -// // killed: false, -// // childProcess, -// // promise: null, -// // start: async () => { -// // // Wait for build to finish. -// // const result = await buildResult; -// // -// // if (result && !result.success) { -// // if (options.watch) { -// // if (!task.killed) { -// // logger.error(`Build failed, waiting for changes to restart...`); -// // } -// // return; -// // } else { -// // throw new Error(`Build failed. See above for errors.`); -// // } -// // } -// // -// // if (task.killed) { -// // return; -// // } -// // -// // // Run the program -// // task.promise = new Promise(async (resolve, reject) => { -// // const proc = await spawnWithBun( -// // ['run', ...args, fileToRunCorrectPath(fileToRun)], -// // { -// // stderr: 'pipe', -// // stdin: 'inherit', -// // stdout: 'inherit' -// // } -// // ); -// // -// // task.childProcess = proc; -// // -// // if (isBunSubprocess(proc)) { -// // const stderrReader = proc.stderr?.getReader(); -// // -// // const handleStderr = async () => { -// // if (!stderrReader) { -// // return; -// // } -// // -// // try { -// // while (true) { -// // const { done, value } = await stderrReader.read(); -// // if (done || task.killed) break; -// // if (value) logger.error(new TextDecoder().decode(value)); -// // } -// // } catch (err) { -// // if (!task.killed) -// // logger.error(`Error reading stderr: ${err}`); -// // } -// // }; -// // -// // handleStderr(); -// // -// // proc.exited.then((code) => { -// // stderrReader?.cancel(); -// // handleExit(code); -// // }); -// // } else { -// // // Node stderr handling -// // const handleStdErr = (data: ArrayBuffer) => { -// // if (!options.watch || !task.killed) { -// // logger.error(data.toString()); -// // } -// // }; -// // proc.stderr?.on('data', handleStdErr); -// // proc.once('exit', (code) => { -// // proc?.off('data', handleStdErr); -// // handleExit(code ?? 0); -// // }); -// // } -// // -// // function handleExit(code: number) { -// // if (options.watch && !task.killed) { -// // logger.info( -// // `NX Process exited with code ${code}, waiting for changes to restart...` -// // ); -// // } -// // if (!options.watch) { -// // if (code !== 0) { -// // reject(new Error(`Process exited with code ${code}`)); -// // } else { -// // resolve(done()); -// // } -// // } -// // resolve(); -// // } -// // -// // next({ success: true, options: buildOptions }); -// // }); -// // }, -// // stop: async (signal: NodeJS.Signals = 'SIGTERM') => { -// // task.killed = true; -// // -// // if (task.childProcess?.pid) { -// // await killTree(task.childProcess.pid, signal); -// // } -// // try { -// // await task.promise; -// // } catch {} -// // } -// // }; -// // -// // tasks.push(task); -// // }; -// // -// // const output = await runExecutor( -// // buildTarget, -// // { -// // ...options.buildTargetOptions, -// // watch: options.watch -// // }, -// // context -// // ); -// // // eslint-disable-next-line no-constant-condition -// // while (true) { -// // const event = await output.next(); -// // await addToQueue(null, Promise.resolve(event.value)); -// // await debouncedProcessQueue(); -// // if (event.done || !options.watch) { -// // break; -// // } -// // } -// // -// // const stopAllTasks = async (signal: NodeJS.Signals = 'SIGTERM') => { -// // if (typeof additionalExitHandler === 'function') { -// // additionalExitHandler(); -// // } -// // if (typeof currentTask?.stop === 'function') { -// // await currentTask.stop(signal); -// // } -// // for (const task of tasks) { -// // await task.stop(signal); -// // } -// // }; -// // -// // process.on('SIGTERM', async () => { -// // await stopAllTasks('SIGTERM'); -// // process.exit(128 + 15); -// // }); -// // process.on('SIGINT', async () => { -// // await stopAllTasks('SIGINT'); -// // process.exit(128 + 2); -// // }); -// // process.on('SIGHUP', async () => { -// // await stopAllTasks('SIGHUP'); -// // process.exit(128 + 1); -// // }); -// // -// // registerCleanup?.(async () => { -// // await stopAllTasks('SIGTERM'); -// // }); -// // -// // if (options.runBuildTargetDependencies) { -// // const runBuild = async () => { -// // let childProcess: UniversalChildProcess | null = null; -// // const whenReady = new Promise<{ success: boolean }>(async (resolve) => { -// // childProcess = await runFork( -// // require.resolve('nx'), -// // [ -// // 'run', -// // `${context.projectName}:${buildTarget.target}${ -// // buildTarget.configuration ? `:${buildTarget.configuration}` : '' -// // }` -// // ], -// // { -// // cwd: context.root, -// // stdio: 'inherit' -// // } -// // ); -// // -// // const handleExit = (code: number | null) => { -// // if (code === 0) resolve({ success: true }); -// // // If process is killed due to current task being killed, then resolve with success. -// // else resolve({ success: !!currentTask?.killed }); -// // }; -// // -// // if (isBunSubprocess(childProcess)) { -// // childProcess.exited.then(handleExit); -// // } else { -// // childProcess.once('exit', handleExit); -// // } -// // }); -// // await addToQueue(childProcess, whenReady); -// // await debouncedProcessQueue(); -// // }; -// // -// // if (isDaemonEnabled()) { -// // additionalExitHandler = await daemonClient.registerFileWatcher( -// // { -// // watchProjects: [context.projectName || ''], -// // includeDependentProjects: true -// // }, -// // async (err, data) => { -// // if (err === 'closed') { -// // logger.error(`Watch error: Daemon closed the connection`); -// // process.exit(1); -// // } else if (err) { -// // logger.error(`Watch error: ${err?.message ?? 'Unknown'}`); -// // } else { -// // if (options.watch) { -// // logger.info(`NX File change detected. Restarting...`); -// // await runBuild(); -// // } -// // } -// // } -// // ); -// // } else { -// // logger.warn( -// // `NX Daemon is not running. Node process will not restart automatically after file changes.` -// // ); -// // } -// // await runBuild(); // run first build -// // } else { -// // // Otherwise, run the build executor, which will not run task dependencies. -// // // This is mostly fine for bundlers like webpack that should already watch for dependency libs. -// // // For tsc/swc or custom build commands, consider using `runBuildTargetDependencies` instead. -// // const output = await runExecutor( -// // buildTarget, -// // { -// // ...options.buildTargetOptions, -// // watch: options.watch -// // }, -// // context -// // ); -// // while (true) { -// // const event = await output.next(); -// // await addToQueue(null, Promise.resolve(event.value)); -// // await debouncedProcessQueue(); -// // if (event.done || !options.watch) { -// // break; -// // } -// // } -// // } -// // }); -// } diff --git a/packages/bun/src/generators/application/lib/create-targets.ts b/packages/bun/src/generators/application/lib/create-targets.ts index 3489464..5b98c95 100644 --- a/packages/bun/src/generators/application/lib/create-targets.ts +++ b/packages/bun/src/generators/application/lib/create-targets.ts @@ -1,9 +1,4 @@ -import { - joinPathFragments, - ProjectConfiguration, - TargetConfiguration, - Tree -} from '@nx/devkit'; +import { joinPathFragments, TargetConfiguration } from '@nx/devkit'; import { NormalizedOptions } from './normalize-options'; import { libs } from '../../../utils'; import { BuildExecutorOptions } from '../../../executors/build/schema'; @@ -60,9 +55,3 @@ export function getServeConfig( } }; } - -export function createTargets( - tree: Tree, - project: ProjectConfiguration, - options: NormalizedOptions -) {} diff --git a/packages/bun/src/utils/bun-cfg/bun-cfg.ts b/packages/bun/src/utils/bun-cfg/bun-cfg.ts deleted file mode 100644 index c59bdfb..0000000 --- a/packages/bun/src/utils/bun-cfg/bun-cfg.ts +++ /dev/null @@ -1,46 +0,0 @@ -// @ts-ignore -Symbol['metadata'] ??= Symbol('Symbol.metadata'); -// @ts-ignore -Symbol['dispose'] ??= Symbol('Symbol.dispose'); -// @ts-ignore -Symbol['asyncDispose'] ??= Symbol('Symbol.asyncDispose'); - -function loggedMethod(headMessage = 'LOG:') { - return function actualDecorator( - target: (this: This, ...args: Args) => Return, - context: ClassMethodDecoratorContext< - This, - (this: This, ...args: Args) => Return - > - ) { - const methodName = String(context.name); - - function replacementMethod(this: This, ...args: Args): Return { - console.log(`LOG: Entering method '${methodName}'.`); - const result = target.call(this, ...args); - console.log(`LOG: Exiting method '${methodName}'.`); - return result; - } - - return replacementMethod; - }; -} -function argv(flag = 'LOG:') { - return function actualDecorator( - target: any, - context: ClassFieldDecoratorContext - ) { - context.metadata[context.name] = flag; - }; -} - -export class Fooha { - @argv('asd') - value: boolean = true; - @loggedMethod('aaa') - hello() { - return 'hello'; - } -} - -Symbol.metadata; diff --git a/packages/bun/src/utils/buni/index.ts b/packages/bun/src/utils/buni/index.ts index 53c0fff..3799ad5 100644 --- a/packages/bun/src/utils/buni/index.ts +++ b/packages/bun/src/utils/buni/index.ts @@ -13,12 +13,15 @@ export function createBuildConfig(config: Bun.BuildConfig) { return config; } -export function build() {} +export function build(config: Bun.BuildConfig) { + return Bun.build(config); +} export const Buni = { ...utils, spawn, bun, + build, node, run, createBuildConfig diff --git a/packages/bun/src/utils/buni/spawn/__tests__/helpers.ts b/packages/bun/src/utils/buni/spawn/__tests__/helpers.ts index d505b6a..3709096 100644 --- a/packages/bun/src/utils/buni/spawn/__tests__/helpers.ts +++ b/packages/bun/src/utils/buni/spawn/__tests__/helpers.ts @@ -7,7 +7,6 @@ let originalBunSpawn: any; let originalChildSpawn: any; export function mockIsBunRuntime(modulePath: string, value: boolean) { - // eslint-disable-next-line @typescript-eslint/no-var-requires const mod = require(modulePath); if (originalIsBunRuntime === undefined) { originalIsBunRuntime = mod.isBunRuntime; @@ -17,7 +16,7 @@ export function mockIsBunRuntime(modulePath: string, value: boolean) { export function restoreIsBunRuntime(modulePath: string) { if (originalIsBunRuntime === undefined) return; - // eslint-disable-next-line @typescript-eslint/no-var-requires + const mod = require(modulePath); mod.isBunRuntime = originalIsBunRuntime; originalIsBunRuntime = undefined; @@ -25,32 +24,27 @@ export function restoreIsBunRuntime(modulePath: string) { export function mockBunSpawn(impl: (opts: any) => any) { // Create global Bun if not present - // @ts-ignore if (typeof globalThis.Bun === 'undefined') { - // @ts-ignore globalThis.Bun = {} as any; } - // @ts-ignore if (originalBunSpawn === undefined) originalBunSpawn = globalThis.Bun.spawn; - // @ts-ignore globalThis.Bun.spawn = impl as any; } export function restoreBunSpawn() { - // @ts-ignore if (originalBunSpawn !== undefined) globalThis.Bun.spawn = originalBunSpawn; originalBunSpawn = undefined; } export function mockNodeSpawn(impl: typeof childProc.spawn) { if (originalChildSpawn === undefined) originalChildSpawn = childProc.spawn; - // @ts-ignore + // @ts-expect-error spawn is read only childProc.spawn = impl as any; } export function restoreNodeSpawn() { if (originalChildSpawn !== undefined) { - // @ts-ignore + // @ts-expect-error spawn is read only childProc.spawn = originalChildSpawn; } originalChildSpawn = undefined; diff --git a/packages/bun/src/utils/buni/spawn/spawn.spec.ts b/packages/bun/src/utils/buni/spawn/spawn.spec.ts index 3b40abf..bab252c 100644 --- a/packages/bun/src/utils/buni/spawn/spawn.spec.ts +++ b/packages/bun/src/utils/buni/spawn/spawn.spec.ts @@ -55,7 +55,6 @@ describe('universal spawn', () => { stdio: 'pipe' }); - // @ts-ignore // const out = await proc.stdout.text(); proc.stdout.on('data', function (data: string) { diff --git a/packages/bun/src/utils/process-adapter.ts b/packages/bun/src/utils/process-adapter.ts index cc260e7..3e69bcf 100644 --- a/packages/bun/src/utils/process-adapter.ts +++ b/packages/bun/src/utils/process-adapter.ts @@ -88,7 +88,10 @@ export async function killProcess(proc: SpawnResult | null) { if (isBunRuntime()) { try { (proc as Bun.Subprocess).kill(); - } catch {} + } catch (err) { + console.log(err); + } + return; } @@ -100,7 +103,9 @@ export async function killProcess(proc: SpawnResult | null) { setTimeout(() => { try { if (!child.killed) child.kill('SIGKILL'); - } catch {} + } catch (err) { + console.log(err); + } resolve(); }, 3000); }); From 94861e00b9018afcf6881b54a9216fb980e4cacd Mon Sep 17 00:00:00 2001 From: Boris Polak <18208654+BorisTB@users.noreply.github.com> Date: Sat, 6 Sep 2025 15:05:41 +0200 Subject: [PATCH 11/12] chore: update lock file --- pnpm-lock.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ae05a6..2dc5ade 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -145,9 +145,21 @@ importers: '@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: From 89a7822fef2084db127efec596d3029a52429a91 Mon Sep 17 00:00:00 2001 From: Boris Polak <18208654+BorisTB@users.noreply.github.com> Date: Sat, 6 Sep 2025 15:21:51 +0200 Subject: [PATCH 12/12] ci: try fix e2e on ci --- e2e/bun/jest.config.ts | 2 +- e2e/elysia/jest.config.ts | 2 +- e2e/jest.preset.e2e.js | 9 +++++++++ jest.preset.js | 10 +++++++++- 4 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 e2e/jest.preset.e2e.js diff --git a/e2e/bun/jest.config.ts b/e2e/bun/jest.config.ts index 8c097be..a1ae4d6 100644 --- a/e2e/bun/jest.config.ts +++ b/e2e/bun/jest.config.ts @@ -13,7 +13,7 @@ swcJestConfig.swcrc = false; const config: Config = { detectOpenHandles: false, displayName: 'bun-e2e', - preset: '../../jest.preset.js', + preset: '../jest.preset.e2e.js', transform: { '^.+\\.[tj]s$': ['@swc/jest', swcJestConfig] }, diff --git a/e2e/elysia/jest.config.ts b/e2e/elysia/jest.config.ts index 629870f..5b6201b 100644 --- a/e2e/elysia/jest.config.ts +++ b/e2e/elysia/jest.config.ts @@ -12,7 +12,7 @@ swcJestConfig.swcrc = false; const config: Config = { displayName: 'elysia-e2e', - preset: '../../jest.preset.js', + preset: '../jest.preset.e2e.js', transform: { '^.+\\.[tj]s$': ['@swc/jest', swcJestConfig] }, 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/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 +};