From 47c288322a203ca2eed799f39e697a678ac10206 Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Wed, 18 Mar 2026 16:17:25 +0900 Subject: [PATCH 01/15] feat(common): editor core types --- packages/common/src/options/index.ts | 9 ++++- .../common/src/options/types/options.type.ts | 21 ++++++++++ .../common/src/options/types/save.type.ts | 40 +++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 packages/common/src/options/types/save.type.ts diff --git a/packages/common/src/options/index.ts b/packages/common/src/options/index.ts index 32ab2502..1bd44e31 100644 --- a/packages/common/src/options/index.ts +++ b/packages/common/src/options/index.ts @@ -1 +1,8 @@ -export type { IRunClientOptions, IRunOptions, IRunServerOptions } from "./types/options.type"; +export type { + IRunClientOptions, + IRunOptions, + IRunServerOptions, + IEditorRunClientOptions, + IEditorRunOptions, + IEditorRunServerOptions, +} from "./types/options.type"; diff --git a/packages/common/src/options/types/options.type.ts b/packages/common/src/options/types/options.type.ts index 3ed47674..5cab0ac1 100644 --- a/packages/common/src/options/types/options.type.ts +++ b/packages/common/src/options/types/options.type.ts @@ -1,3 +1,5 @@ +import { type Save } from "./save.type"; + export type IRunOptions = IRunClientOptions | IRunServerOptions; export interface IRunClientOptions { @@ -10,3 +12,22 @@ export interface IRunServerOptions { files: Map; env: Record; } + +export type IEditorRunOptions = IEditorRunClientOptions | IEditorRunServerOptions; + +export interface IEditorRunClientOptions { + canvas: HTMLCanvasElement; + files: Map; + env: Record; + editor: { + save: Save; + }; +} +export interface IEditorRunServerOptions { + canvas: HTMLCanvasElement; + files: Map; + env: Record; + editor: { + save: Save; + }; +} diff --git a/packages/common/src/options/types/save.type.ts b/packages/common/src/options/types/save.type.ts new file mode 100644 index 00000000..94371ad1 --- /dev/null +++ b/packages/common/src/options/types/save.type.ts @@ -0,0 +1,40 @@ +export enum SaveLibraryTypeEnum { + COMPONENT_SYSTEM = "component-system", + GRAPHICS = "graphics", + ASSET_MANAGER = "asset-manager", + NETWORK = "network", + INPUT = "input", + SOUND = "sound", +} + +export interface SaveLibrary { + id: string; + type: SaveLibraryTypeEnum | string; + name: string; + path: string; +} + +export interface SaveComponent { + name: string; + path: string; +} + +export interface SaveSystem { + name: string; + path: string; +} + +export interface SaveEntity { + id: string; + components: { + name: string; + params: string[]; + }[]; +} + +export interface Save { + libraries: SaveLibrary[]; + components: SaveComponent[]; + systems: SaveSystem[]; + entities: SaveEntity[]; +} From fd8a64170880deacef3c890ab3c6e9b0b230b044 Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Wed, 18 Mar 2026 16:17:48 +0900 Subject: [PATCH 02/15] feat(common): editor core types --- packages/core-editor/.cliff-jumperrc.json | 7 + packages/core-editor/.gitignore | 231 ++++++++++++++++++ packages/core-editor/.idea/.name | 1 + .../.idea/[NanoForge] Engine Core.iml | 12 + .../core-editor/.idea/codeStyles/Project.xml | 57 +++++ .../.idea/codeStyles/codeStyleConfig.xml | 5 + .../core-editor/.idea/git_toolbox_blame.xml | 6 + .../core-editor/.idea/git_toolbox_prj.xml | 15 ++ .../inspectionProfiles/Project_Default.xml | 6 + .../core-editor/.idea/jsLinters/eslint.xml | 6 + packages/core-editor/.idea/modules.xml | 8 + packages/core-editor/.idea/prettier.xml | 7 + packages/core-editor/.idea/vcs.xml | 6 + packages/core-editor/.nvmrc | 1 + packages/core-editor/.prettierignore | 11 + packages/core-editor/CHANGELOG.md | 59 +++++ packages/core-editor/LICENSE | 21 ++ packages/core-editor/README.md | 68 ++++++ packages/core-editor/cliff.toml | 79 ++++++ packages/core-editor/eslint.config.js | 3 + packages/core-editor/package.json | 91 +++++++ packages/core-editor/prettier.config.js | 3 + .../src/application/application-config.ts | 89 +++++++ .../application/application-options.type.ts | 3 + .../src/application/nanoforge-application.ts | 57 +++++ .../src/application/nanoforge-client.ts | 21 ++ .../src/application/nanoforge-factory.ts | 15 ++ .../src/application/nanoforge-server.ts | 3 + .../contexts/application.editable-context.ts | 20 ++ .../executions/clear.editable-context.ts | 3 + .../executions/execution.editable-context.ts | 3 + .../executions/init.editable-context.ts | 3 + .../contexts/library.editable-context.ts | 7 + .../common/library/manager/library.manager.ts | 106 ++++++++ .../common/library/relationship-functions.ts | 122 +++++++++ .../core-editor/src/config/config-registry.ts | 19 ++ packages/core-editor/src/core/core.ts | 104 ++++++++ packages/core-editor/src/index.ts | 4 + .../core-editor/test/config-registry.spec.ts | 54 ++++ .../test/editable-library-manager.spec.ts | 182 ++++++++++++++ .../core-editor/test/relationship.spec.ts | 135 ++++++++++ packages/core-editor/tsconfig.json | 6 + packages/core-editor/tsconfig.spec.json | 10 + packages/core-editor/tsup.config.ts | 3 + packages/core-editor/typedoc.json | 5 + 45 files changed, 1677 insertions(+) create mode 100644 packages/core-editor/.cliff-jumperrc.json create mode 100644 packages/core-editor/.gitignore create mode 100644 packages/core-editor/.idea/.name create mode 100644 packages/core-editor/.idea/[NanoForge] Engine Core.iml create mode 100644 packages/core-editor/.idea/codeStyles/Project.xml create mode 100644 packages/core-editor/.idea/codeStyles/codeStyleConfig.xml create mode 100644 packages/core-editor/.idea/git_toolbox_blame.xml create mode 100644 packages/core-editor/.idea/git_toolbox_prj.xml create mode 100644 packages/core-editor/.idea/inspectionProfiles/Project_Default.xml create mode 100644 packages/core-editor/.idea/jsLinters/eslint.xml create mode 100644 packages/core-editor/.idea/modules.xml create mode 100644 packages/core-editor/.idea/prettier.xml create mode 100644 packages/core-editor/.idea/vcs.xml create mode 100644 packages/core-editor/.nvmrc create mode 100644 packages/core-editor/.prettierignore create mode 100644 packages/core-editor/CHANGELOG.md create mode 100644 packages/core-editor/LICENSE create mode 100644 packages/core-editor/README.md create mode 100644 packages/core-editor/cliff.toml create mode 100644 packages/core-editor/eslint.config.js create mode 100644 packages/core-editor/package.json create mode 100644 packages/core-editor/prettier.config.js create mode 100644 packages/core-editor/src/application/application-config.ts create mode 100644 packages/core-editor/src/application/application-options.type.ts create mode 100644 packages/core-editor/src/application/nanoforge-application.ts create mode 100644 packages/core-editor/src/application/nanoforge-client.ts create mode 100644 packages/core-editor/src/application/nanoforge-factory.ts create mode 100644 packages/core-editor/src/application/nanoforge-server.ts create mode 100644 packages/core-editor/src/common/context/contexts/application.editable-context.ts create mode 100644 packages/core-editor/src/common/context/contexts/executions/clear.editable-context.ts create mode 100644 packages/core-editor/src/common/context/contexts/executions/execution.editable-context.ts create mode 100644 packages/core-editor/src/common/context/contexts/executions/init.editable-context.ts create mode 100644 packages/core-editor/src/common/context/contexts/library.editable-context.ts create mode 100644 packages/core-editor/src/common/library/manager/library.manager.ts create mode 100644 packages/core-editor/src/common/library/relationship-functions.ts create mode 100644 packages/core-editor/src/config/config-registry.ts create mode 100644 packages/core-editor/src/core/core.ts create mode 100644 packages/core-editor/src/index.ts create mode 100644 packages/core-editor/test/config-registry.spec.ts create mode 100644 packages/core-editor/test/editable-library-manager.spec.ts create mode 100644 packages/core-editor/test/relationship.spec.ts create mode 100644 packages/core-editor/tsconfig.json create mode 100644 packages/core-editor/tsconfig.spec.json create mode 100644 packages/core-editor/tsup.config.ts create mode 100644 packages/core-editor/typedoc.json diff --git a/packages/core-editor/.cliff-jumperrc.json b/packages/core-editor/.cliff-jumperrc.json new file mode 100644 index 00000000..fe6d9d4a --- /dev/null +++ b/packages/core-editor/.cliff-jumperrc.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://raw.githubusercontent.com/favware/cliff-jumper/main/assets/cliff-jumper.schema.json", + "name": "core", + "org": "nanoforge-dev", + "packagePath": "packages/core", + "identifierBase": false +} diff --git a/packages/core-editor/.gitignore b/packages/core-editor/.gitignore new file mode 100644 index 00000000..f7652f89 --- /dev/null +++ b/packages/core-editor/.gitignore @@ -0,0 +1,231 @@ +### VisualStudioCode template +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# Turbo +.turbo/ + +# Compiled files +src/**/*.js +src/**/*.d.ts diff --git a/packages/core-editor/.idea/.name b/packages/core-editor/.idea/.name new file mode 100644 index 00000000..3d3e7caa --- /dev/null +++ b/packages/core-editor/.idea/.name @@ -0,0 +1 @@ +[NanoForge] Engine Core \ No newline at end of file diff --git a/packages/core-editor/.idea/[NanoForge] Engine Core.iml b/packages/core-editor/.idea/[NanoForge] Engine Core.iml new file mode 100644 index 00000000..24643cc3 --- /dev/null +++ b/packages/core-editor/.idea/[NanoForge] Engine Core.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/core-editor/.idea/codeStyles/Project.xml b/packages/core-editor/.idea/codeStyles/Project.xml new file mode 100644 index 00000000..b70d7533 --- /dev/null +++ b/packages/core-editor/.idea/codeStyles/Project.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/core-editor/.idea/codeStyles/codeStyleConfig.xml b/packages/core-editor/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..79ee123c --- /dev/null +++ b/packages/core-editor/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/packages/core-editor/.idea/git_toolbox_blame.xml b/packages/core-editor/.idea/git_toolbox_blame.xml new file mode 100644 index 00000000..7dc12496 --- /dev/null +++ b/packages/core-editor/.idea/git_toolbox_blame.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/packages/core-editor/.idea/git_toolbox_prj.xml b/packages/core-editor/.idea/git_toolbox_prj.xml new file mode 100644 index 00000000..02b915b8 --- /dev/null +++ b/packages/core-editor/.idea/git_toolbox_prj.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/packages/core-editor/.idea/inspectionProfiles/Project_Default.xml b/packages/core-editor/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..03d9549e --- /dev/null +++ b/packages/core-editor/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/core-editor/.idea/jsLinters/eslint.xml b/packages/core-editor/.idea/jsLinters/eslint.xml new file mode 100644 index 00000000..541945bb --- /dev/null +++ b/packages/core-editor/.idea/jsLinters/eslint.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/packages/core-editor/.idea/modules.xml b/packages/core-editor/.idea/modules.xml new file mode 100644 index 00000000..99922e22 --- /dev/null +++ b/packages/core-editor/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/core-editor/.idea/prettier.xml b/packages/core-editor/.idea/prettier.xml new file mode 100644 index 00000000..0c83ac4e --- /dev/null +++ b/packages/core-editor/.idea/prettier.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/packages/core-editor/.idea/vcs.xml b/packages/core-editor/.idea/vcs.xml new file mode 100644 index 00000000..b2bdec2d --- /dev/null +++ b/packages/core-editor/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/packages/core-editor/.nvmrc b/packages/core-editor/.nvmrc new file mode 100644 index 00000000..c519bf5b --- /dev/null +++ b/packages/core-editor/.nvmrc @@ -0,0 +1 @@ +v24.11.0 diff --git a/packages/core-editor/.prettierignore b/packages/core-editor/.prettierignore new file mode 100644 index 00000000..64b127c9 --- /dev/null +++ b/packages/core-editor/.prettierignore @@ -0,0 +1,11 @@ +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock +bun.lock + +.turbo/ +node_modules/ +dist/ +coverage/ +CHANGELOG.md diff --git a/packages/core-editor/CHANGELOG.md b/packages/core-editor/CHANGELOG.md new file mode 100644 index 00000000..1d7fb605 --- /dev/null +++ b/packages/core-editor/CHANGELOG.md @@ -0,0 +1,59 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +# [@nanoforge-dev/core@1.0.1](https://github.com/NanoForge-dev/Engine/compare/@nanoforge-dev/core@1.0.0...@nanoforge-dev/core@1.0.1) - (2026-02-16) + +## Documentation + +- Setup typedoc (#192) ([fa908e7](https://github.com/NanoForge-dev/Engine/commit/fa908e7e268fa1770be58fc62a0257f3760480b2)) by @MartinFillon +- Fix readme badges (#186) ([fd8d93d](https://github.com/NanoForge-dev/Engine/commit/fd8d93d13a0fbad95ef9952acd10faad9e112c78)) by @Exeloo + +# [@nanoforge-dev/core@1.0.0](https://github.com/NanoForge-dev/Engine/tree/@nanoforge-dev/core@1.0.0) - (2026-01-09) + +## Bug Fixes + +- **graphics:** Game loop ([53329d2](https://github.com/NanoForge-dev/Engine/commit/53329d28c47bfac9fe86259e9fc6f42b206062a8)) by @Exeloo +- **graphics:** Fix display ([d8522e5](https://github.com/NanoForge-dev/Engine/commit/d8522e56678f3bd136733f7941c1d917c18b1400)) by @Exeloo +- **ecs:** Fix tests ([d33ada5](https://github.com/NanoForge-dev/Engine/commit/d33ada5d9c37e331b8178aa1fc0daee88b07131c)) by @Exeloo +- **ecs:** Change type handling on lib ecs ([580192d](https://github.com/NanoForge-dev/Engine/commit/580192d5038f386c965434f78aacdf3d1e399ff8)) by @Exeloo + +## Documentation + +- Update README files with new structure and detailed usage examples for all packages (#157) ([63fab73](https://github.com/NanoForge-dev/Engine/commit/63fab7326bd9c7e6b00f950694ab16c9d9190c53)) by @Exeloo +- Add funding (#147) ([7301fad](https://github.com/NanoForge-dev/Engine/commit/7301fad10f59b7e1f7fa788f8a2f6fc81d0db72e)) by @Exeloo +- Add a basic introduction readme ([b240964](https://github.com/NanoForge-dev/Engine/commit/b240964a265b31769a8c5422e23e20156ba56192)) by @MartinFillon +- Add building and dependency docs to every readme ([2d4785b](https://github.com/NanoForge-dev/Engine/commit/2d4785bdcb455e83337b37540f9ab6b3394c0850)) by @MartinFillon + +## Features + +- **packages/network:** Client and server for tcp/udp and networked pong as example (#156) ([839fb95](https://github.com/NanoForge-dev/Engine/commit/839fb95449f6ae0ee66d7f7e279374268b743f65)) by @Tchips46 +- **core:** Add client/server distinction and update rendering logic (#119) ([5271432](https://github.com/NanoForge-dev/Engine/commit/5271432710031396d7e433bfdfb015e3871f69d0)) by @Exeloo +- Add schematics used types (#102) ([b992306](https://github.com/NanoForge-dev/Engine/commit/b9923064ba1da3164b1739fcdec5a819734c4ba2)) by @Exeloo +- **core:** Introduce `EditableApplicationContext` for managing sound libraries ([6c7bac2](https://github.com/NanoForge-dev/Engine/commit/6c7bac261eeb7ad79203d5695d5ad76dc9e9e9f5)) by @Exeloo +- **core:** Add Context that admit a ClientLibraryManager ([3835bc8](https://github.com/NanoForge-dev/Engine/commit/3835bc8a6e6d039f11a513b7fe54c353f90e9fe1)) by @Exeloo +- **music:** Finish music library and add an interface for mutable libraries ([8e00c5d](https://github.com/NanoForge-dev/Engine/commit/8e00c5d00f2901ada86f59667eff7e5d3446076b)) by @MartinFillon +- **core:** Add `class-transformer` and `class-validator` dependencies for validation utilities ([fd94fe7](https://github.com/NanoForge-dev/Engine/commit/fd94fe7755999c5529335666720899792a691a36)) by @Exeloo +- **common, core, config:** Introduce configuration registry and validation system ([4fafb82](https://github.com/NanoForge-dev/Engine/commit/4fafb82576fec6866fc281ad5b10321d2ac430df)) by @Exeloo +- **core:** Enhance type safety and execution context handling ([d986030](https://github.com/NanoForge-dev/Engine/commit/d986030a333bc08d2e37291d1a023cf8d7a6e1d6)) by @Exeloo +- **app:** Add the ability to mute and unmute sounds ([947bdc0](https://github.com/NanoForge-dev/Engine/commit/947bdc00784a4c3313fe08feb4f91fc91b3ac7b7)) by @MartinFillon +- **sound:** Add basic sound playing to example ([7335814](https://github.com/NanoForge-dev/Engine/commit/7335814fc532ee92a5f9d776f409c5faa4d56423)) by @MartinFillon +- **core:** Add default libraries to constructor ([7d9da69](https://github.com/NanoForge-dev/Engine/commit/7d9da69be4301875020176656276236b88b737f1)) by @Exeloo +- Add dependencies handling ([e51dd3b](https://github.com/NanoForge-dev/Engine/commit/e51dd3bdb5e2e3de21339bf6218e85f935efb9d5)) by @Exeloo +- **common:** Add dependencies handler ([edb098a](https://github.com/NanoForge-dev/Engine/commit/edb098a65fb932ba9a9532a9b1eee7d64a7a8f0d)) by @Exeloo +- **core:** Add tickrate and fix runner ([1dba5bd](https://github.com/NanoForge-dev/Engine/commit/1dba5bd89ffa20dfd29b079f93c3eb923ffbdbbc)) by @Exeloo +- **input:** Add input library ([387e97d](https://github.com/NanoForge-dev/Engine/commit/387e97d7c3015a869947af4acecf48e8e1b0e2b8)) by @Exeloo +- **game:** Create pong example game ([4b66674](https://github.com/NanoForge-dev/Engine/commit/4b66674c750f345e860d225384054423433beb07)) by @bill-h4rper +- **game:** Add width and height ([c93c985](https://github.com/NanoForge-dev/Engine/commit/c93c985665bd99c09bc410f1499d11aeaffe3c4c)) by @Exeloo +- **game:** Add graphics factory ([0f4453c](https://github.com/NanoForge-dev/Engine/commit/0f4453ced908b39e953a672324e97eba82bfeaa3)) by @Exeloo +- **asset-manager:** Add asset manager ([1774a26](https://github.com/NanoForge-dev/Engine/commit/1774a26593099b4faa0a2527d1684de35211d5d2)) by @Exeloo +- Add asset manager default in core ([26cc5a9](https://github.com/NanoForge-dev/Engine/commit/26cc5a99e014fbc8669a43cc4aa4d78ecc1dee14)) by @Exeloo +- Add core and common ([1755c79](https://github.com/NanoForge-dev/Engine/commit/1755c799c143513d72b28edaac875267d484a44f)) by @Exeloo +- Initial commit ([c9bb59e](https://github.com/NanoForge-dev/Engine/commit/c9bb59ee963e7b444e8668db55597915e9ef0e4b)) by @Exeloo + +## Refactor + +- **core:** Remove default libs in factory (#118) ([fa893c7](https://github.com/NanoForge-dev/Engine/commit/fa893c71616f151343c2f52a4723a64cca65814a)) by @Exeloo +- Migrate namespaces to `@nanoforge-dev` and update related imports ([c84c927](https://github.com/NanoForge-dev/Engine/commit/c84c927ead941d914e5a9fd752fd3a5ac969f981)) by @Exeloo +- **libraries:** Implement initialization validation and standardize nullable fields ([8b04575](https://github.com/NanoForge-dev/Engine/commit/8b04575cf7f649a440b8f40ad6114414406b0c1a)) by @Exeloo + diff --git a/packages/core-editor/LICENSE b/packages/core-editor/LICENSE new file mode 100644 index 00000000..62c6400b --- /dev/null +++ b/packages/core-editor/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright © 2025 NanoForge + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/core-editor/README.md b/packages/core-editor/README.md new file mode 100644 index 00000000..f114fe2e --- /dev/null +++ b/packages/core-editor/README.md @@ -0,0 +1,68 @@ +
+
+

+ NanoForge +

+
+

+ npm version + npm downloads + Tests status + Documentation status + Last commit + Contributors +

+
+ +## About + +`@nanoforge-dev/core` is a core package that contains game main loop. It is used to initialize the game and run it. + +## Installation + +**Node.js 24.11.0 or newer is required.** + +```sh +npm install @nanoforge-dev/core +yarn add @nanoforge-dev/core +pnpm add @nanoforge-dev/core +bun add @nanoforge-dev/core +``` + +## Example usage + +Initialize the game in your main file. + +```ts +import { type IRunOptions } from "@nanoforge-dev/common"; +import { NanoforgeFactory } from "@nanoforge-dev/core"; + +export async function main(options: IRunClientOptions) { + const app = NanoforgeFactory.createClient(); + + await app.init(options); + + await app.run(); +} +``` + +## Links + +- [GitHub][source] +- [npm][npm] + +## Contributing + +Before creating an issue, please ensure that it hasn't already been reported/suggested, and double-check the +[documentation][documentation]. +See [the contribution guide][contributing] if you'd like to submit a PR. + +## Help + +If you don't understand something in the documentation, you are experiencing problems, or you just need a gentle nudge in the right direction, please don't hesitate to ask questions in [discussions][discussions]. + +[documentation]: https://github.com/NanoForge-dev/Engine +[discussions]: https://github.com/NanoForge-dev/Engine/discussions +[source]: https://github.com/NanoForge-dev/Engine/tree/main/packages/core +[npm]: https://www.npmjs.com/package/@nanoforge-dev/core +[contributing]: https://github.com/NanoForge-dev/Engine/blob/main/.github/CONTRIBUTING.md diff --git a/packages/core-editor/cliff.toml b/packages/core-editor/cliff.toml new file mode 100644 index 00000000..59978d4c --- /dev/null +++ b/packages/core-editor/cliff.toml @@ -0,0 +1,79 @@ +[changelog] +header = """ +# Changelog + +All notable changes to this project will be documented in this file.\n +""" +body = """ +{%- macro remote_url() -%} + https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} +{%- endmacro -%} +{% if version %}\ + # [{{ version | trim_start_matches(pat="v") }}]\ + {% if previous %}\ + {% if previous.version %}\ + ({{ self::remote_url() }}/compare/{{ previous.version }}...{{ version }})\ + {% else %}\ + ({{ self::remote_url() }}/tree/{{ version }})\ + {% endif %}\ + {% endif %} \ + - ({{ timestamp | date(format="%Y-%m-%d") }}) +{% else %}\ + # [unreleased] +{% endif %}\ +{% for group, commits in commits | group_by(attribute="group") %} + ## {{ group | upper_first }} + {% for commit in commits %} + - {% if commit.scope %}\ + **{{commit.scope}}:** \ + {% endif %}\ + {{ commit.message | upper_first }} ([{{ commit.id | truncate(length=7, end="") }}]({{ self::remote_url() }}/commit/{{ commit.id }}))\ + {% if commit.github.username %} by @{{ commit.github.username }}{%- endif %}\ + {% if commit.breaking %}\ + {% for footer in commit.footers %}\ + {% if footer.breaking %}\ + \n{% raw %} {% endraw %}- **{{ footer.token }}{{ footer.separator }}** {{ footer.value }}\ + {% endif %}\ + {% endfor %}\ + {% endif %}\ + {% endfor %} +{% endfor %}\ +{% if github.contributors | filter(attribute="is_first_time", value=true) | length %}\ + \n### New Contributors\n + {% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %}\ + - @{{ contributor.username }} made their first contribution in #{{ contributor.pr_number }} + {% endfor %}\ +{% endif %}\n +""" +trim = true +footer = "" + +[git] +conventional_commits = true +filter_unconventional = true +commit_parsers = [ + { message = "^feat", group = "Features"}, + { message = "^fix", group = "Bug Fixes"}, + { message = "^docs", group = "Documentation"}, + { message = "^perf", group = "Performance"}, + { message = "^refactor", group = "Refactor"}, + { message = "^types", group = "Typings"}, + { message = ".*deprecated", body = ".*deprecated", group = "Deprecation"}, + { message = "^revert", skip = true}, + { message = "^style", group = "Styling"}, + { message = "^test", group = "Testing"}, + { message = "^chore", skip = true}, + { message = "^ci", skip = true}, + { message = "^build", skip = true}, + { body = ".*security", group = "Security"}, +] +filter_commits = true +protect_breaking_commits = true +tag_pattern = "@nanoforge-dev/core@[0-9]*" +ignore_tags = "" +topo_order = false +sort_commits = "newest" + +[remote.github] +owner = "NanoForge-dev" +repo = "Engine" diff --git a/packages/core-editor/eslint.config.js b/packages/core-editor/eslint.config.js new file mode 100644 index 00000000..62ec06dc --- /dev/null +++ b/packages/core-editor/eslint.config.js @@ -0,0 +1,3 @@ +import config from "@nanoforge-dev/utils-eslint-config"; + +export default config; diff --git a/packages/core-editor/package.json b/packages/core-editor/package.json new file mode 100644 index 00000000..90e0540a --- /dev/null +++ b/packages/core-editor/package.json @@ -0,0 +1,91 @@ +{ + "$schema": "https://json.schemastore.org/package.json", + "name": "@nanoforge-dev/core-editor", + "version": "1.0", + "description": "NanoForge Engine - Core Editor", + "keywords": [ + "nanoforge", + "game", + "engine" + ], + "homepage": "https://github.com/NanoForge-dev/Engine#readme", + "bugs": "https://github.com/NanoForge-dev/Engine/issues", + "license": "MIT", + "contributors": [ + "Bill ", + "Exelo ", + "Fexkoser ", + "Tchips " + ], + "files": [ + "dist" + ], + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "exports": { + ".": { + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + }, + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "./package.json": "./package.json" + }, + "type": "module", + "directories": { + "lib": "src" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/NanoForge-dev/Engine.git", + "directory": "packages/core-editor" + }, + "funding": "https://github.com/NanoForge-dev/Engine?sponsor", + "scripts": { + "build": "tsc --noEmit && tsup", + "lint": "prettier --check . && eslint --format=pretty src", + "format": "prettier --write . && eslint --fix --format=pretty src", + "test:unit": "vitest run --config ../../vitest.config.ts", + "prepack": "pnpm run build && pnpm run lint", + "changelog": "git cliff --prepend ./CHANGELOG.md -u -c ./cliff.toml -r ../../ --include-path 'packages/core-editor/*'", + "release": "cliff-jumper" + }, + "dependencies": { + "@nanoforge-dev/asset-manager": "workspace:*", + "@nanoforge-dev/common": "workspace:*", + "@nanoforge-dev/input": "workspace:*", + "class-transformer": "catalog:config", + "class-validator": "catalog:config" + }, + "devDependencies": { + "@favware/cliff-jumper": "catalog:ci", + "@nanoforge-dev/utils-eslint-config": "workspace:*", + "@nanoforge-dev/utils-prettier-config": "workspace:*", + "@trivago/prettier-plugin-sort-imports": "catalog:lint", + "eslint": "catalog:lint", + "prettier": "catalog:lint", + "tsup": "catalog:build", + "typescript": "catalog:core", + "vitest": "catalog:test" + }, + "packageManager": "pnpm@10.29.3", + "engines": { + "node": "25" + }, + "publishConfig": { + "access": "public" + }, + "lint-staged": { + "**": [ + "prettier --ignore-unknown --write" + ], + "src/**/*.ts": [ + "eslint --fix" + ] + } +} diff --git a/packages/core-editor/prettier.config.js b/packages/core-editor/prettier.config.js new file mode 100644 index 00000000..27d0e269 --- /dev/null +++ b/packages/core-editor/prettier.config.js @@ -0,0 +1,3 @@ +import config from "@nanoforge-dev/utils-prettier-config"; + +export default config; diff --git a/packages/core-editor/src/application/application-config.ts b/packages/core-editor/src/application/application-config.ts new file mode 100644 index 00000000..82d28bed --- /dev/null +++ b/packages/core-editor/src/application/application-config.ts @@ -0,0 +1,89 @@ +import { + type IAssetManagerLibrary, + type IComponentSystemLibrary, + type IGraphicsLibrary, + type IInputLibrary, + type ILibrary, + type IMusicLibrary, + type INetworkLibrary, + type ISoundLibrary, + type LibraryHandle, +} from "@nanoforge-dev/common"; + +import { EditableLibraryManager } from "../common/library/manager/library.manager"; + +export class ApplicationConfig { + private readonly _libraryManager: EditableLibraryManager; + + constructor() { + this._libraryManager = new EditableLibraryManager(); + } + + get libraryManager(): EditableLibraryManager { + return this._libraryManager; + } + + public getLibrary(sym: symbol): LibraryHandle { + return this._libraryManager.get(sym); + } + + public useLibrary(sym: symbol, library: ILibrary): void { + this._libraryManager.set(sym, library); + } + + public getComponentSystemLibrary() { + return this._libraryManager.getComponentSystem(); + } + + public useComponentSystemLibrary(library: IComponentSystemLibrary) { + this._libraryManager.setComponentSystem(library); + } + + public getGraphicsLibrary() { + return this._libraryManager.getGraphics(); + } + + public useGraphicsLibrary(library: IGraphicsLibrary) { + this._libraryManager.setGraphics(library); + } + + public getNetworkLibrary() { + return this._libraryManager.getNetwork(); + } + + public useNetworkLibrary(library: INetworkLibrary) { + this._libraryManager.setNetwork(library); + } + + public getAssetManagerLibrary() { + return this._libraryManager.getAssetManager(); + } + + public useAssetManagerLibrary(library: IAssetManagerLibrary) { + this._libraryManager.setAssetManager(library); + } + + public getInputLibrary() { + return this._libraryManager.getInput(); + } + + public useInputLibrary(library: IInputLibrary) { + this._libraryManager.setInput(library); + } + + public getSoundLibrary() { + return this._libraryManager.getSound(); + } + + public useSoundLibrary(library: ISoundLibrary) { + this._libraryManager.setSound(library); + } + + public getMusicLibrary() { + return this._libraryManager.getMusic(); + } + + public useMusicLibrary(library: IMusicLibrary) { + this._libraryManager.setMusic(library); + } +} diff --git a/packages/core-editor/src/application/application-options.type.ts b/packages/core-editor/src/application/application-options.type.ts new file mode 100644 index 00000000..57ecc833 --- /dev/null +++ b/packages/core-editor/src/application/application-options.type.ts @@ -0,0 +1,3 @@ +export interface IApplicationOptions { + tickRate: number; +} diff --git a/packages/core-editor/src/application/nanoforge-application.ts b/packages/core-editor/src/application/nanoforge-application.ts new file mode 100644 index 00000000..b35db5ae --- /dev/null +++ b/packages/core-editor/src/application/nanoforge-application.ts @@ -0,0 +1,57 @@ +import { + type IAssetManagerLibrary, + type IComponentSystemLibrary, + type IEditorRunOptions, + type ILibrary, + type INetworkLibrary, + NfNotInitializedException, +} from "@nanoforge-dev/common"; + +import { EditableApplicationContext } from "../common/context/contexts/application.editable-context"; +import { Core } from "../core/core"; +import { ApplicationConfig } from "./application-config"; +import type { IApplicationOptions } from "./application-options.type"; + +export abstract class NanoforgeApplication { + protected applicationConfig: ApplicationConfig; + private _core?: Core; + private readonly _options: IApplicationOptions; + + constructor(options?: Partial) { + this.applicationConfig = new ApplicationConfig(); + + this._options = { + tickRate: 60, + ...(options ?? {}), + }; + } + + public use(sym: symbol, library: ILibrary): void { + this.applicationConfig.useLibrary(sym, library); + } + + public useComponentSystem(library: IComponentSystemLibrary) { + this.applicationConfig.useComponentSystemLibrary(library); + } + + public useNetwork(library: INetworkLibrary) { + this.applicationConfig.useNetworkLibrary(library); + } + + public useAssetManager(library: IAssetManagerLibrary) { + this.applicationConfig.useAssetManagerLibrary(library); + } + + public init(options: IEditorRunOptions): Promise { + this._core = new Core( + this.applicationConfig, + new EditableApplicationContext(this.applicationConfig.libraryManager), + ); + return this._core.init(options, this._options); + } + + public run() { + if (!this._core) throw new NfNotInitializedException("Core"); + return this._core?.run(); + } +} diff --git a/packages/core-editor/src/application/nanoforge-client.ts b/packages/core-editor/src/application/nanoforge-client.ts new file mode 100644 index 00000000..1ddfe4ac --- /dev/null +++ b/packages/core-editor/src/application/nanoforge-client.ts @@ -0,0 +1,21 @@ +import { + type IGraphicsLibrary, + type IInputLibrary, + type ISoundLibrary, +} from "@nanoforge-dev/common"; + +import { NanoforgeApplication } from "./nanoforge-application"; + +export class NanoforgeClient extends NanoforgeApplication { + public useGraphics(library: IGraphicsLibrary) { + this.applicationConfig.useGraphicsLibrary(library); + } + + public useInput(library: IInputLibrary) { + this.applicationConfig.useInputLibrary(library); + } + + public useSound(library: ISoundLibrary) { + this.applicationConfig.useSoundLibrary(library); + } +} diff --git a/packages/core-editor/src/application/nanoforge-factory.ts b/packages/core-editor/src/application/nanoforge-factory.ts new file mode 100644 index 00000000..84711a6d --- /dev/null +++ b/packages/core-editor/src/application/nanoforge-factory.ts @@ -0,0 +1,15 @@ +import { type IApplicationOptions } from "./application-options.type"; +import { NanoforgeClient } from "./nanoforge-client"; +import { NanoforgeServer } from "./nanoforge-server"; + +class NanoforgeFactoryStatic { + createClient(options?: Partial): NanoforgeClient { + return new NanoforgeClient(options); + } + + createServer(options?: Partial): NanoforgeServer { + return new NanoforgeServer(options); + } +} + +export const NanoforgeFactory = new NanoforgeFactoryStatic(); diff --git a/packages/core-editor/src/application/nanoforge-server.ts b/packages/core-editor/src/application/nanoforge-server.ts new file mode 100644 index 00000000..74cca8a8 --- /dev/null +++ b/packages/core-editor/src/application/nanoforge-server.ts @@ -0,0 +1,3 @@ +import { NanoforgeApplication } from "./nanoforge-application"; + +export class NanoforgeServer extends NanoforgeApplication {} diff --git a/packages/core-editor/src/common/context/contexts/application.editable-context.ts b/packages/core-editor/src/common/context/contexts/application.editable-context.ts new file mode 100644 index 00000000..492b797e --- /dev/null +++ b/packages/core-editor/src/common/context/contexts/application.editable-context.ts @@ -0,0 +1,20 @@ +import { ApplicationContext } from "@nanoforge-dev/common"; + +import { type EditableLibraryManager } from "../../library/manager/library.manager"; + +export class EditableApplicationContext extends ApplicationContext { + private _libraryManager: EditableLibraryManager; + + constructor(libraryManager: EditableLibraryManager) { + super(); + this._libraryManager = libraryManager; + } + + setDelta(delta: number) { + this._delta = delta; + } + + muteSoundLibraries(): void { + this._libraryManager.getMutableLibraries().forEach((lib) => lib.library.mute()); + } +} diff --git a/packages/core-editor/src/common/context/contexts/executions/clear.editable-context.ts b/packages/core-editor/src/common/context/contexts/executions/clear.editable-context.ts new file mode 100644 index 00000000..1081686d --- /dev/null +++ b/packages/core-editor/src/common/context/contexts/executions/clear.editable-context.ts @@ -0,0 +1,3 @@ +import { ClearContext } from "@nanoforge-dev/common"; + +export class EditableClearContext extends ClearContext {} diff --git a/packages/core-editor/src/common/context/contexts/executions/execution.editable-context.ts b/packages/core-editor/src/common/context/contexts/executions/execution.editable-context.ts new file mode 100644 index 00000000..e9b5b3de --- /dev/null +++ b/packages/core-editor/src/common/context/contexts/executions/execution.editable-context.ts @@ -0,0 +1,3 @@ +import { ExecutionContext } from "@nanoforge-dev/common"; + +export class EditableExecutionContext extends ExecutionContext {} diff --git a/packages/core-editor/src/common/context/contexts/executions/init.editable-context.ts b/packages/core-editor/src/common/context/contexts/executions/init.editable-context.ts new file mode 100644 index 00000000..7ce44e10 --- /dev/null +++ b/packages/core-editor/src/common/context/contexts/executions/init.editable-context.ts @@ -0,0 +1,3 @@ +import { InitContext } from "@nanoforge-dev/common"; + +export class EditableInitContext extends InitContext {} diff --git a/packages/core-editor/src/common/context/contexts/library.editable-context.ts b/packages/core-editor/src/common/context/contexts/library.editable-context.ts new file mode 100644 index 00000000..48f942e8 --- /dev/null +++ b/packages/core-editor/src/common/context/contexts/library.editable-context.ts @@ -0,0 +1,7 @@ +import { LibraryContext, type LibraryStatusEnum } from "@nanoforge-dev/common"; + +export class EditableLibraryContext extends LibraryContext { + setStatus(status: LibraryStatusEnum) { + this._status = status; + } +} diff --git a/packages/core-editor/src/common/library/manager/library.manager.ts b/packages/core-editor/src/common/library/manager/library.manager.ts new file mode 100644 index 00000000..6e17b321 --- /dev/null +++ b/packages/core-editor/src/common/library/manager/library.manager.ts @@ -0,0 +1,106 @@ +import { + ASSET_MANAGER_LIBRARY, + COMPONENT_SYSTEM_LIBRARY, + DefaultLibrariesEnum, + GRAPHICS_LIBRARY, + type IAssetManagerLibrary, + type IComponentSystemLibrary, + type IGraphicsLibrary, + type IInputLibrary, + type ILibrary, + type IMusicLibrary, + type IMutableLibrary, + INPUT_LIBRARY, + type INetworkLibrary, + type IRunnerLibrary, + type ISoundLibrary, + type LibraryHandle, + LibraryManager, + MUSIC_LIBRARY, + NETWORK_LIBRARY, + SOUND_LIBRARY, +} from "@nanoforge-dev/common"; + +import { EditableLibraryContext } from "../../context/contexts/library.editable-context"; +import { Relationship } from "../relationship-functions"; + +const hasMethod = (obj: any, method: string) => { + return typeof obj[method] === "function"; +}; + +export class EditableLibraryManager extends LibraryManager { + public set(sym: symbol, library: ILibrary) { + this.setNewLibrary(sym, library, new EditableLibraryContext()); + } + + public setComponentSystem(library: IComponentSystemLibrary): void { + this._set( + DefaultLibrariesEnum.COMPONENT_SYSTEM, + COMPONENT_SYSTEM_LIBRARY, + library, + new EditableLibraryContext(), + ); + } + + public setGraphics(library: IGraphicsLibrary): void { + this._set( + DefaultLibrariesEnum.GRAPHICS, + GRAPHICS_LIBRARY, + library, + new EditableLibraryContext(), + ); + } + + public setAssetManager(library: IAssetManagerLibrary): void { + this._set( + DefaultLibrariesEnum.ASSET_MANAGER, + ASSET_MANAGER_LIBRARY, + library, + new EditableLibraryContext(), + ); + } + + public setNetwork(library: INetworkLibrary): void { + this._set(DefaultLibrariesEnum.NETWORK, NETWORK_LIBRARY, library, new EditableLibraryContext()); + } + + public setInput(library: IInputLibrary): void { + this._set(DefaultLibrariesEnum.INPUT, INPUT_LIBRARY, library, new EditableLibraryContext()); + } + + public setSound(library: ISoundLibrary): void { + this._set(DefaultLibrariesEnum.SOUND, SOUND_LIBRARY, library, new EditableLibraryContext()); + } + + public setMusic(library: IMusicLibrary): void { + this._set(DefaultLibrariesEnum.MUSIC, MUSIC_LIBRARY, library, new EditableLibraryContext()); + } + + public getLibraries(): LibraryHandle[] { + return this._libraries; + } + + public getInitLibraries(): LibraryHandle[] { + return Relationship.getLibrariesByDependencies(this._libraries); + } + + public getExecutionLibraries(): LibraryHandle[] { + return Relationship.getLibrariesByRun(this._getRunnerLibraries()); + } + + public getClearLibraries(): LibraryHandle[] { + return Relationship.getLibrariesByDependencies(this._libraries, true); + } + + public getMutableLibraries(): LibraryHandle[] { + return this._libraries.filter( + (handle) => handle && hasMethod(handle.library, "mute"), + ) as LibraryHandle[]; + } + + private _getRunnerLibraries(): LibraryHandle[] { + return this._libraries.filter( + (handle) => handle && hasMethod(handle.library, "__run"), + ) as LibraryHandle[]; + } +} diff --git a/packages/core-editor/src/common/library/relationship-functions.ts b/packages/core-editor/src/common/library/relationship-functions.ts new file mode 100644 index 00000000..d9ff0f2b --- /dev/null +++ b/packages/core-editor/src/common/library/relationship-functions.ts @@ -0,0 +1,122 @@ +import { type ILibrary, type LibraryHandle } from "@nanoforge-dev/common"; + +class RelationshipStatic { + getLibrariesByDependencies(libraries: LibraryHandle[], reverse: boolean = false) { + let response: LibraryHandle[] = []; + for (const library of libraries) { + if (!library) continue; + response = this._pushLibraryWithDependencies(library, response, [], libraries); + } + + if (reverse) return response.reverse(); + return response; + } + + getLibrariesByRun(libraries: LibraryHandle[]) { + let response: LibraryHandle[] = []; + const dependencies = new Map>( + libraries.map((library) => [library.symbol, new Set()]), + ); + + for (const handle of libraries) { + const key = handle.symbol; + + for (const before of handle.library.__relationship.runBefore) { + this._pushToDependencies(key, before, dependencies); + } + for (const after of handle.library.__relationship.runAfter) { + this._pushToDependencies(after, key, dependencies); + } + } + + for (const library of libraries) { + response = this._pushLibraryWithDependenciesRun( + library, + dependencies, + response, + [], + libraries, + ); + } + return response; + } + + private _pushToDependencies( + key: symbol, + value: symbol, + dependencies: Map>, + ): void { + let curr = dependencies.get(key); + if (!curr) curr = new Set(); + curr.add(value); + dependencies.set(key, curr); + } + + private _pushLibraryWithDependenciesRun( + handle: LibraryHandle, + dependencies: Map>, + response: LibraryHandle[], + cache: symbol[], + libraries: LibraryHandle[], + ): LibraryHandle[] { + const key = handle.symbol; + if (this._symbolIsInList(key, response)) return response; + + if (cache.includes(key)) throw new Error("Circular dependencies !"); + + cache.push(key); + + const deps = dependencies.get(key); + if (!deps) throw new Error("Dependencies not found"); + + for (const dep of deps) { + if (this._symbolIsInList(dep, response)) continue; + + const depHandle = libraries.find((lib) => lib?.symbol === dep) as LibraryHandle; + if (!depHandle) throw new Error(`Cannot find library ${dep.toString()}`); + + response = this._pushLibraryWithDependenciesRun( + depHandle, + dependencies, + response, + cache, + libraries, + ); + } + cache.pop(); + + response.push(handle); + return response; + } + + private _pushLibraryWithDependencies( + handle: LibraryHandle, + response: LibraryHandle[], + cache: symbol[], + libraries: LibraryHandle[], + ): LibraryHandle[] { + if (this._symbolIsInList(handle.symbol, response)) return response; + + if (cache.includes(handle.symbol)) throw new Error("Circular dependencies !"); + + cache.push(handle.symbol); + for (const dep of handle.library.__relationship.dependencies) { + if (this._symbolIsInList(dep, response)) continue; + + const depHandle = libraries.find((lib) => lib?.symbol === dep) as LibraryHandle; + if (!depHandle) throw new Error(`Cannot find library ${dep.toString()}`); + + response = this._pushLibraryWithDependencies(depHandle, response, cache, libraries); + } + cache.pop(); + + response.push(handle); + return response; + } + + private _symbolIsInList(sym: symbol, libraries: LibraryHandle[]): boolean { + return libraries.some((lib) => lib.symbol === sym); + } +} + +export const Relationship = new RelationshipStatic(); diff --git a/packages/core-editor/src/config/config-registry.ts b/packages/core-editor/src/config/config-registry.ts new file mode 100644 index 00000000..946ed1dc --- /dev/null +++ b/packages/core-editor/src/config/config-registry.ts @@ -0,0 +1,19 @@ +import { plainToInstance } from "class-transformer"; +import { validate } from "class-validator"; + +export class ConfigRegistry { + private readonly _env: Record; + + constructor(env: Record) { + this._env = env; + } + + async registerConfig(config: new () => T): Promise { + const data = plainToInstance(config, this._env, { excludeExtraneousValues: true }); + const errors = await validate(data); + if (errors.length > 0) { + throw new Error(errors.toString()); + } + return data; + } +} diff --git a/packages/core-editor/src/core/core.ts b/packages/core-editor/src/core/core.ts new file mode 100644 index 00000000..3d9d15d1 --- /dev/null +++ b/packages/core-editor/src/core/core.ts @@ -0,0 +1,104 @@ +import { + ClearContext, + ClientLibraryManager, + Context, + type IEditorRunOptions, + type IRunnerLibrary, + InitContext, + type LibraryHandle, + LibraryStatusEnum, + NfNotInitializedException, +} from "@nanoforge-dev/common"; + +import { type ApplicationConfig } from "../application/application-config"; +import type { IApplicationOptions } from "../application/application-options.type"; +import { type EditableApplicationContext } from "../common/context/contexts/application.editable-context"; +import { EditableExecutionContext } from "../common/context/contexts/executions/execution.editable-context"; +import { type EditableLibraryContext } from "../common/context/contexts/library.editable-context"; +import { ConfigRegistry } from "../config/config-registry"; + +export class Core { + private readonly config: ApplicationConfig; + private readonly context: EditableApplicationContext; + private options?: IApplicationOptions; + private _configRegistry?: ConfigRegistry; + + constructor(config: ApplicationConfig, context: EditableApplicationContext) { + this.config = config; + this.context = context; + } + + public async init(options: IEditorRunOptions, appOptions: IApplicationOptions): Promise { + this.options = appOptions; + this._configRegistry = new ConfigRegistry(options.env); + await this.runInit(this.getInitContext(options)); + } + + public async run(): Promise { + if (!this.options) throw new NfNotInitializedException("Core"); + + const context = this.getExecutionContext(); + const clientContext = this.getClientContext(); + const libraries = this.config.libraryManager.getExecutionLibraries(); + + const runner = async (delta: number) => { + this.context.setDelta(delta); + await this.runExecute(clientContext, libraries); + }; + + const tickLengthMs = 1000 / this.options.tickRate; + let previousTick = Date.now(); + + const render = async () => { + if (!context.application.isRunning) { + await this.runClear(this.getClearContext()); + return; + } + const tickStart = Date.now(); + await runner(tickStart - previousTick); + previousTick = tickStart; + setTimeout(render, tickLengthMs + tickStart - Date.now()); + }; + + context.application.setIsRunning(true); + setTimeout(render); + } + + private getInitContext(options: IEditorRunOptions): InitContext { + if (!this._configRegistry) throw new NfNotInitializedException("Core"); + + return new InitContext(this.context, this.config.libraryManager, this._configRegistry, options); + } + + private getExecutionContext(): EditableExecutionContext { + return new EditableExecutionContext(this.context, this.config.libraryManager); + } + + private getClearContext(): ClearContext { + return new ClearContext(this.context, this.config.libraryManager); + } + + private getClientContext(): Context { + return new Context(this.context, new ClientLibraryManager(this.config.libraryManager)); + } + + private async runInit(context: InitContext): Promise { + for (const handle of this.config.libraryManager.getInitLibraries()) { + await handle.library.__init(context); + (handle.context as EditableLibraryContext).setStatus(LibraryStatusEnum.LOADED); + } + } + + private async runExecute(context: Context, libraries: LibraryHandle[]) { + for (const handle of libraries) { + await handle.library.__run(context); + } + } + + private async runClear(context: ClearContext) { + for (const handle of this.config.libraryManager.getClearLibraries()) { + await handle.library.__clear(context); + (handle.context as EditableLibraryContext).setStatus(LibraryStatusEnum.CLEAR); + } + } +} diff --git a/packages/core-editor/src/index.ts b/packages/core-editor/src/index.ts new file mode 100644 index 00000000..4273d62e --- /dev/null +++ b/packages/core-editor/src/index.ts @@ -0,0 +1,4 @@ +export * from "./application/nanoforge-factory"; + +export type { NanoforgeClient } from "./application/nanoforge-client"; +export type { NanoforgeServer } from "./application/nanoforge-server"; diff --git a/packages/core-editor/test/config-registry.spec.ts b/packages/core-editor/test/config-registry.spec.ts new file mode 100644 index 00000000..0a1e2844 --- /dev/null +++ b/packages/core-editor/test/config-registry.spec.ts @@ -0,0 +1,54 @@ +import { Expose } from "class-transformer"; +import { IsString } from "class-validator"; +import { describe, expect, it } from "vitest"; + +import { ConfigRegistry } from "../src/config/config-registry"; + +class ValidConfig { + @Expose() + @IsString() + name!: string; +} + +class OptionalConfig { + @Expose() + @IsString() + name!: string; + + @Expose() + host?: string; +} + +describe("ConfigRegistry", () => { + describe("registerConfig", () => { + it("should return a transformed config instance when env is valid", async () => { + const registry = new ConfigRegistry({ name: "hello" }); + const config = await registry.registerConfig(ValidConfig); + expect(config).toBeInstanceOf(ValidConfig); + expect(config.name).toBe("hello"); + }); + + it("should exclude values not decorated with @Expose", async () => { + const registry = new ConfigRegistry({ name: "hello", extra: "ignored" }); + const config = await registry.registerConfig(ValidConfig); + expect((config as any)["extra"]).toBeUndefined(); + }); + + it("should throw when a required field is missing", async () => { + const registry = new ConfigRegistry({}); + await expect(registry.registerConfig(ValidConfig)).rejects.toThrow(); + }); + + it("should throw when a field has the wrong type", async () => { + const registry = new ConfigRegistry({ name: 42 }); + await expect(registry.registerConfig(ValidConfig)).rejects.toThrow(); + }); + + it("should map multiple env fields correctly", async () => { + const registry = new ConfigRegistry({ name: "world", host: "localhost" }); + const config = await registry.registerConfig(OptionalConfig); + expect(config.name).toBe("world"); + expect(config.host).toBe("localhost"); + }); + }); +}); diff --git a/packages/core-editor/test/editable-library-manager.spec.ts b/packages/core-editor/test/editable-library-manager.spec.ts new file mode 100644 index 00000000..0e808baa --- /dev/null +++ b/packages/core-editor/test/editable-library-manager.spec.ts @@ -0,0 +1,182 @@ +import { COMPONENT_SYSTEM_LIBRARY, type ILibrary, LibraryStatusEnum } from "@nanoforge-dev/common"; +import { beforeEach, describe, expect, it } from "vitest"; + +import { Library } from "../../common/src/library/libraries/library"; +import { EditableLibraryManager } from "../src/common/library/manager/library.manager"; + +class StubLibrary extends Library { + private readonly _name: string; + + constructor(name: string, options?: ConstructorParameters[0]) { + super(options); + this._name = name; + } + + get __name(): string { + return this._name; + } +} + +class StubRunnerLibrary extends StubLibrary { + async __run(): Promise {} +} + +class StubMutableLibrary extends StubLibrary { + mute(): void {} +} + +describe("EditableLibraryManager", () => { + let manager: EditableLibraryManager; + + beforeEach(() => { + manager = new EditableLibraryManager(); + }); + + describe("typed setters and getters", () => { + it("should store and retrieve a component system library", () => { + const lib = new StubLibrary("ComponentSystem"); + manager.setComponentSystem(lib as any); + expect(manager.getComponentSystem().library).toBe(lib); + }); + + it("should store and retrieve a graphics library", () => { + const lib = new StubLibrary("Graphics"); + manager.setGraphics(lib as any); + expect(manager.getGraphics().library).toBe(lib); + }); + + it("should store and retrieve an asset manager library", () => { + const lib = new StubLibrary("AssetManager"); + manager.setAssetManager(lib as any); + expect(manager.getAssetManager().library).toBe(lib); + }); + + it("should store and retrieve a network library", () => { + const lib = new StubLibrary("Network"); + manager.setNetwork(lib as any); + expect(manager.getNetwork().library).toBe(lib); + }); + + it("should store and retrieve an input library", () => { + const lib = new StubLibrary("Input"); + manager.setInput(lib as any); + expect(manager.getInput().library).toBe(lib); + }); + + it("should store and retrieve a sound library", () => { + const lib = new StubLibrary("Sound"); + manager.setSound(lib as any); + expect(manager.getSound().library).toBe(lib); + }); + + it("should store and retrieve a music library", () => { + const lib = new StubLibrary("Music"); + manager.setMusic(lib as any); + expect(manager.getMusic().library).toBe(lib); + }); + + it("should throw when getting a typed library that was not set", () => { + expect(() => manager.getComponentSystem()).toThrow(); + }); + }); + + describe("set and get (custom symbol)", () => { + it("should store and retrieve a library by Symbol.for key", () => { + const sym = Symbol.for("customLib"); + const lib = new StubLibrary("Custom"); + + manager.setAssetManager(new StubLibrary("Asset") as any); + manager.set(sym, lib as unknown as ILibrary); + + expect(manager.get(sym).library).toBe(lib); + }); + }); + + describe("getLibraries", () => { + it("should return the list of all set libraries", () => { + const lib = new StubLibrary("ComponentSystem"); + manager.setComponentSystem(lib as any); + const libs = manager.getLibraries().filter(Boolean); + expect(libs.some((h) => h.library === (lib as unknown as ILibrary))).toBe(true); + }); + }); + + describe("getInitLibraries", () => { + it("should return libraries in dependency order", () => { + const libA = new StubLibrary("A", { dependencies: [COMPONENT_SYSTEM_LIBRARY] }); + const libB = new StubLibrary("B"); + + manager.setComponentSystem(libB as any); + manager.setGraphics(libA as any); + + const order = manager.getInitLibraries().map((h) => h.library.__name); + const idxB = order.indexOf("B"); + const idxA = order.indexOf("A"); + + expect(idxB).toBeLessThan(idxA); + }); + + it("should return all set libraries", () => { + manager.setAssetManager(new StubLibrary("Asset") as any); + manager.setGraphics(new StubLibrary("Graphics") as any); + + expect(manager.getInitLibraries().length).toBe(2); + }); + }); + + describe("getClearLibraries", () => { + it("should return libraries in reverse dependency order", () => { + const libA = new StubLibrary("A", { dependencies: [COMPONENT_SYSTEM_LIBRARY] }); + const libB = new StubLibrary("B"); + + manager.setComponentSystem(libB as any); + manager.setGraphics(libA as any); + + const order = manager.getClearLibraries().map((h) => h.library.__name); + const idxA = order.indexOf("A"); + const idxB = order.indexOf("B"); + + expect(idxA).toBeLessThan(idxB); + }); + }); + + describe("getExecutionLibraries", () => { + it("should only return libraries that implement __run", () => { + manager.setComponentSystem(new StubLibrary("NotARunner") as any); + manager.setGraphics(new StubRunnerLibrary("Runner") as any); + + const runners = manager.getExecutionLibraries(); + expect(runners.every((h) => typeof (h.library as any).__run === "function")).toBe(true); + expect(runners.some((h) => h.library.__name === "Runner")).toBe(true); + expect(runners.some((h) => h.library.__name === "NotARunner")).toBe(false); + }); + + it("should return empty when no runner libraries are set", () => { + manager.setComponentSystem(new StubLibrary("Static") as any); + expect(manager.getExecutionLibraries()).toHaveLength(0); + }); + }); + + describe("getMutableLibraries", () => { + it("should only return libraries that implement mute", () => { + manager.setSound(new StubMutableLibrary("MutableSound") as any); + manager.setGraphics(new StubLibrary("NonMutableGraphics") as any); + + const mutable = manager.getMutableLibraries(); + expect(mutable.some((h) => h.library.__name === "MutableSound")).toBe(true); + expect(mutable.some((h) => h.library.__name === "NonMutableGraphics")).toBe(false); + }); + + it("should return empty when no mutable libraries are set", () => { + manager.setGraphics(new StubLibrary("Graphics") as any); + expect(manager.getMutableLibraries()).toHaveLength(0); + }); + }); + + describe("library context status", () => { + it("should start with UNLOADED status", () => { + manager.setComponentSystem(new StubLibrary("Comp") as any); + expect(manager.getComponentSystem().context.status).toBe(LibraryStatusEnum.UNLOADED); + }); + }); +}); diff --git a/packages/core-editor/test/relationship.spec.ts b/packages/core-editor/test/relationship.spec.ts new file mode 100644 index 00000000..776fa493 --- /dev/null +++ b/packages/core-editor/test/relationship.spec.ts @@ -0,0 +1,135 @@ +import { type ILibrary, LibraryContext, LibraryHandle } from "@nanoforge-dev/common"; +import { describe, expect, it } from "vitest"; + +import { Library } from "../../common/src/library/libraries/library"; +import { Relationship } from "../src/common/library/relationship-functions"; + +class StubLibrary extends Library { + private readonly _name: string; + + constructor(name: string, options?: ConstructorParameters[0]) { + super(options); + this._name = name; + } + + get __name(): string { + return this._name; + } +} + +const makeHandle = ( + sym: symbol, + name: string, + options?: ConstructorParameters[0], +): LibraryHandle => { + return new LibraryHandle( + sym, + new StubLibrary(name, options) as unknown as ILibrary, + new LibraryContext(), + ); +}; + +describe("Relationship.getLibrariesByDependencies", () => { + it("should return libraries in same order when no dependencies are declared", () => { + const symA = Symbol("A"); + const symB = Symbol("B"); + const handleA = makeHandle(symA, "A"); + const handleB = makeHandle(symB, "B"); + + const result = Relationship.getLibrariesByDependencies([handleA, handleB]); + expect(result.map((h) => h.library.__name)).toEqual(["A", "B"]); + }); + + it("should put a dependency before the library that depends on it", () => { + const symA = Symbol("A"); + const symB = Symbol("B"); + const handleB = makeHandle(symB, "B"); + const handleA = makeHandle(symA, "A", { dependencies: [symB] }); + + const result = Relationship.getLibrariesByDependencies([handleA, handleB]); + const names = result.map((h) => h.library.__name); + expect(names.indexOf("B")).toBeLessThan(names.indexOf("A")); + }); + + it("should not duplicate a shared dependency", () => { + const symDep = Symbol("Dep"); + const symA = Symbol("A"); + const symB = Symbol("B"); + const handleDep = makeHandle(symDep, "Dep"); + const handleA = makeHandle(symA, "A", { dependencies: [symDep] }); + const handleB = makeHandle(symB, "B", { dependencies: [symDep] }); + + const result = Relationship.getLibrariesByDependencies([handleA, handleB, handleDep]); + const names = result.map((h) => h.library.__name); + expect(names.filter((n) => n === "Dep")).toHaveLength(1); + }); + + it("should return libraries in reverse dependency order when reverse=true", () => { + const symA = Symbol("A"); + const symB = Symbol("B"); + const handleB = makeHandle(symB, "B"); + const handleA = makeHandle(symA, "A", { dependencies: [symB] }); + + const result = Relationship.getLibrariesByDependencies([handleA, handleB], true); + const names = result.map((h) => h.library.__name); + expect(names.indexOf("A")).toBeLessThan(names.indexOf("B")); + }); + + it("should throw on circular dependencies", () => { + const symA = Symbol("A"); + const symB = Symbol("B"); + const handleA = makeHandle(symA, "A", { dependencies: [symB] }); + const handleB = makeHandle(symB, "B", { dependencies: [symA] }); + + expect(() => Relationship.getLibrariesByDependencies([handleA, handleB])).toThrow( + /[Cc]ircular/, + ); + }); +}); + +describe("Relationship.getLibrariesByRun", () => { + it("should return all runner libraries when no ordering is specified", () => { + const symA = Symbol("A"); + const symB = Symbol("B"); + const handleA = makeHandle(symA, "A"); + const handleB = makeHandle(symB, "B"); + + const result = Relationship.getLibrariesByRun([handleA, handleB]); + expect(result).toHaveLength(2); + }); + + it("should place a library before another when runBefore is set", () => { + const symA = Symbol("A"); + const symB = Symbol("B"); + const handleA = makeHandle(symA, "A", { runBefore: [symB] }); + const handleB = makeHandle(symB, "B"); + + const result = Relationship.getLibrariesByRun([handleA, handleB]); + const names = result.map((h) => h.library.__name); + expect(names.indexOf("B")).toBeLessThan(names.indexOf("A")); + }); + + it("should place a library after another when runAfter is set", () => { + const symA = Symbol("A"); + const symB = Symbol("B"); + const handleA = makeHandle(symA, "A"); + const handleB = makeHandle(symB, "B", { runAfter: [symA] }); + + const result = Relationship.getLibrariesByRun([handleA, handleB]); + const names = result.map((h) => h.library.__name); + expect(names.indexOf("B")).toBeLessThan(names.indexOf("A")); + }); + + it("should throw on circular run dependencies", () => { + const symA = Symbol("A"); + const symB = Symbol("B"); + const handleA = makeHandle(symA, "A", { runBefore: [symB] }); + const handleB = makeHandle(symB, "B", { runBefore: [symA] }); + + expect(() => Relationship.getLibrariesByRun([handleA, handleB])).toThrow(/[Cc]ircular/); + }); + + it("should return empty array for empty input", () => { + expect(Relationship.getLibrariesByRun([])).toHaveLength(0); + }); +}); diff --git a/packages/core-editor/tsconfig.json b/packages/core-editor/tsconfig.json new file mode 100644 index 00000000..9e6d724b --- /dev/null +++ b/packages/core-editor/tsconfig.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig.json", + "extends": "../../tsconfig.json", + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/core-editor/tsconfig.spec.json b/packages/core-editor/tsconfig.spec.json new file mode 100644 index 00000000..8270caba --- /dev/null +++ b/packages/core-editor/tsconfig.spec.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig.json", + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": true, + "skipLibCheck": true + }, + "include": ["test/**/*.spec.ts"], + "exclude": ["node_modules"] +} diff --git a/packages/core-editor/tsup.config.ts b/packages/core-editor/tsup.config.ts new file mode 100644 index 00000000..f3b6e6ce --- /dev/null +++ b/packages/core-editor/tsup.config.ts @@ -0,0 +1,3 @@ +import { createTsupConfig } from "../../tsup.config.js"; + +export default [createTsupConfig()]; diff --git a/packages/core-editor/typedoc.json b/packages/core-editor/typedoc.json new file mode 100644 index 00000000..7e2ec1a3 --- /dev/null +++ b/packages/core-editor/typedoc.json @@ -0,0 +1,5 @@ +{ + "extends": ["../../typedoc.base.json"], + "entryPoints": ["src/index.ts"], + "skipErrorChecking": true +} From 55775981da5e5a5b114bb6b017079455356089e3 Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Wed, 25 Mar 2026 15:43:47 +0900 Subject: [PATCH 03/15] feat(core-editor): hot reload from save --- packages/common/src/options/index.ts | 9 +--- .../common/src/options/types/options.type.ts | 21 -------- packages/core-editor/package.json | 2 + .../src/application/application-config.ts | 4 +- .../src/application/nanoforge-application.ts | 2 +- .../src/common/context/options.type.ts | 20 +++++++ .../src/common/context}/save.type.ts | 6 +-- packages/core-editor/src/core/core.ts | 10 +++- .../core-editor/src/editor/core-editor.ts | 37 +++++++++++++ .../core-editor/test/editor-feature.spec.ts | 54 +++++++++++++++++++ pnpm-lock.yaml | 52 ++++++++++++++++++ 11 files changed, 180 insertions(+), 37 deletions(-) create mode 100644 packages/core-editor/src/common/context/options.type.ts rename packages/{common/src/options/types => core-editor/src/common/context}/save.type.ts (89%) create mode 100644 packages/core-editor/src/editor/core-editor.ts create mode 100644 packages/core-editor/test/editor-feature.spec.ts diff --git a/packages/common/src/options/index.ts b/packages/common/src/options/index.ts index 1bd44e31..32ab2502 100644 --- a/packages/common/src/options/index.ts +++ b/packages/common/src/options/index.ts @@ -1,8 +1 @@ -export type { - IRunClientOptions, - IRunOptions, - IRunServerOptions, - IEditorRunClientOptions, - IEditorRunOptions, - IEditorRunServerOptions, -} from "./types/options.type"; +export type { IRunClientOptions, IRunOptions, IRunServerOptions } from "./types/options.type"; diff --git a/packages/common/src/options/types/options.type.ts b/packages/common/src/options/types/options.type.ts index 5cab0ac1..3ed47674 100644 --- a/packages/common/src/options/types/options.type.ts +++ b/packages/common/src/options/types/options.type.ts @@ -1,5 +1,3 @@ -import { type Save } from "./save.type"; - export type IRunOptions = IRunClientOptions | IRunServerOptions; export interface IRunClientOptions { @@ -12,22 +10,3 @@ export interface IRunServerOptions { files: Map; env: Record; } - -export type IEditorRunOptions = IEditorRunClientOptions | IEditorRunServerOptions; - -export interface IEditorRunClientOptions { - canvas: HTMLCanvasElement; - files: Map; - env: Record; - editor: { - save: Save; - }; -} -export interface IEditorRunServerOptions { - canvas: HTMLCanvasElement; - files: Map; - env: Record; - editor: { - save: Save; - }; -} diff --git a/packages/core-editor/package.json b/packages/core-editor/package.json index 90e0540a..cf532b87 100644 --- a/packages/core-editor/package.json +++ b/packages/core-editor/package.json @@ -58,6 +58,8 @@ "dependencies": { "@nanoforge-dev/asset-manager": "workspace:*", "@nanoforge-dev/common": "workspace:*", + "@nanoforge-dev/ecs-client": "workspace:*", + "@nanoforge-dev/ecs-server": "workspace:*", "@nanoforge-dev/input": "workspace:*", "class-transformer": "catalog:config", "class-validator": "catalog:config" diff --git a/packages/core-editor/src/application/application-config.ts b/packages/core-editor/src/application/application-config.ts index 82d28bed..7eeede0c 100644 --- a/packages/core-editor/src/application/application-config.ts +++ b/packages/core-editor/src/application/application-config.ts @@ -31,8 +31,8 @@ export class ApplicationConfig { this._libraryManager.set(sym, library); } - public getComponentSystemLibrary() { - return this._libraryManager.getComponentSystem(); + public getComponentSystemLibrary() { + return this._libraryManager.getComponentSystem(); } public useComponentSystemLibrary(library: IComponentSystemLibrary) { diff --git a/packages/core-editor/src/application/nanoforge-application.ts b/packages/core-editor/src/application/nanoforge-application.ts index b35db5ae..81f6ea6e 100644 --- a/packages/core-editor/src/application/nanoforge-application.ts +++ b/packages/core-editor/src/application/nanoforge-application.ts @@ -1,13 +1,13 @@ import { type IAssetManagerLibrary, type IComponentSystemLibrary, - type IEditorRunOptions, type ILibrary, type INetworkLibrary, NfNotInitializedException, } from "@nanoforge-dev/common"; import { EditableApplicationContext } from "../common/context/contexts/application.editable-context"; +import { type IEditorRunOptions } from "../common/context/options.type"; import { Core } from "../core/core"; import { ApplicationConfig } from "./application-config"; import type { IApplicationOptions } from "./application-options.type"; diff --git a/packages/core-editor/src/common/context/options.type.ts b/packages/core-editor/src/common/context/options.type.ts new file mode 100644 index 00000000..4aa66560 --- /dev/null +++ b/packages/core-editor/src/common/context/options.type.ts @@ -0,0 +1,20 @@ +import { type Save } from "./save.type"; + +export type IEditorRunOptions = IEditorRunClientOptions | IEditorRunServerOptions; + +export interface IEditorRunClientOptions { + canvas: HTMLCanvasElement; + files: Map; + env: Record; + editor: { + save: Save; + }; +} +export interface IEditorRunServerOptions { + canvas: HTMLCanvasElement; + files: Map; + env: Record; + editor: { + save: Save; + }; +} diff --git a/packages/common/src/options/types/save.type.ts b/packages/core-editor/src/common/context/save.type.ts similarity index 89% rename from packages/common/src/options/types/save.type.ts rename to packages/core-editor/src/common/context/save.type.ts index 94371ad1..36372a33 100644 --- a/packages/common/src/options/types/save.type.ts +++ b/packages/core-editor/src/common/context/save.type.ts @@ -17,6 +17,7 @@ export interface SaveLibrary { export interface SaveComponent { name: string; path: string; + paramsNames: string[]; } export interface SaveSystem { @@ -26,10 +27,7 @@ export interface SaveSystem { export interface SaveEntity { id: string; - components: { - name: string; - params: string[]; - }[]; + components: Record>; } export interface Save { diff --git a/packages/core-editor/src/core/core.ts b/packages/core-editor/src/core/core.ts index 3d9d15d1..437da6b7 100644 --- a/packages/core-editor/src/core/core.ts +++ b/packages/core-editor/src/core/core.ts @@ -2,25 +2,29 @@ import { ClearContext, ClientLibraryManager, Context, - type IEditorRunOptions, type IRunnerLibrary, InitContext, type LibraryHandle, LibraryStatusEnum, NfNotInitializedException, } from "@nanoforge-dev/common"; +import { type ECSClientLibrary } from "@nanoforge-dev/ecs-client"; +import { type ECSServerLibrary } from "@nanoforge-dev/ecs-server"; import { type ApplicationConfig } from "../application/application-config"; import type { IApplicationOptions } from "../application/application-options.type"; import { type EditableApplicationContext } from "../common/context/contexts/application.editable-context"; import { EditableExecutionContext } from "../common/context/contexts/executions/execution.editable-context"; import { type EditableLibraryContext } from "../common/context/contexts/library.editable-context"; +import { type IEditorRunOptions } from "../common/context/options.type"; import { ConfigRegistry } from "../config/config-registry"; +import { CoreEditor } from "../editor/core-editor"; export class Core { private readonly config: ApplicationConfig; private readonly context: EditableApplicationContext; private options?: IApplicationOptions; + public editor?: CoreEditor; private _configRegistry?: ConfigRegistry; constructor(config: ApplicationConfig, context: EditableApplicationContext) { @@ -30,6 +34,10 @@ export class Core { public async init(options: IEditorRunOptions, appOptions: IApplicationOptions): Promise { this.options = appOptions; + this.editor = new CoreEditor( + options.editor, + this.config.getComponentSystemLibrary().library, + ); this._configRegistry = new ConfigRegistry(options.env); await this.runInit(this.getInitContext(options)); } diff --git a/packages/core-editor/src/editor/core-editor.ts b/packages/core-editor/src/editor/core-editor.ts new file mode 100644 index 00000000..23fed3b8 --- /dev/null +++ b/packages/core-editor/src/editor/core-editor.ts @@ -0,0 +1,37 @@ +import { NfNotFound } from "@nanoforge-dev/common"; +import { type ECSClientLibrary } from "@nanoforge-dev/ecs-client"; +import { type ECSServerLibrary } from "@nanoforge-dev/ecs-server"; + +import type { IEditorRunOptions } from "../common/context/options.type"; +import type { SaveComponent, SaveEntity } from "../common/context/save.type"; + +export class CoreEditor { + private editor: IEditorRunOptions["editor"]; + private ecsLibrary: ECSClientLibrary | ECSServerLibrary; + constructor( + editor: IEditorRunOptions["editor"], + ecsLibrary: ECSClientLibrary | ECSServerLibrary, + ) { + this.editor = editor; + this.ecsLibrary = ecsLibrary; + } + + public askEntityHotReload(saveComponents: SaveComponent[], entityToReload: SaveEntity[]): void { + const reg = this.ecsLibrary.registry; + entityToReload.forEach(({ id, components }) => { + Object.entries(components).forEach(([componentName, params]) => { + const ogComponent = saveComponents.find(({ name: paramName }) => { + if (!ogComponent) { + throw new NfNotFound("Component: " + componentName + " not found in saved components"); + } + return paramName == componentName; + }); + const ecsComponent = reg.getComponents({ name: componentName }).get(Number(id)); + Object.entries(params).forEach(([paramName, paramValue]) => { + ecsComponent[paramName] = paramValue; + }); + reg.getComponents({ name: componentName }).set(Number(id), ecsComponent); + }); + }); + } +} diff --git a/packages/core-editor/test/editor-feature.spec.ts b/packages/core-editor/test/editor-feature.spec.ts new file mode 100644 index 00000000..0a1e2844 --- /dev/null +++ b/packages/core-editor/test/editor-feature.spec.ts @@ -0,0 +1,54 @@ +import { Expose } from "class-transformer"; +import { IsString } from "class-validator"; +import { describe, expect, it } from "vitest"; + +import { ConfigRegistry } from "../src/config/config-registry"; + +class ValidConfig { + @Expose() + @IsString() + name!: string; +} + +class OptionalConfig { + @Expose() + @IsString() + name!: string; + + @Expose() + host?: string; +} + +describe("ConfigRegistry", () => { + describe("registerConfig", () => { + it("should return a transformed config instance when env is valid", async () => { + const registry = new ConfigRegistry({ name: "hello" }); + const config = await registry.registerConfig(ValidConfig); + expect(config).toBeInstanceOf(ValidConfig); + expect(config.name).toBe("hello"); + }); + + it("should exclude values not decorated with @Expose", async () => { + const registry = new ConfigRegistry({ name: "hello", extra: "ignored" }); + const config = await registry.registerConfig(ValidConfig); + expect((config as any)["extra"]).toBeUndefined(); + }); + + it("should throw when a required field is missing", async () => { + const registry = new ConfigRegistry({}); + await expect(registry.registerConfig(ValidConfig)).rejects.toThrow(); + }); + + it("should throw when a field has the wrong type", async () => { + const registry = new ConfigRegistry({ name: 42 }); + await expect(registry.registerConfig(ValidConfig)).rejects.toThrow(); + }); + + it("should map multiple env fields correctly", async () => { + const registry = new ConfigRegistry({ name: "world", host: "localhost" }); + const config = await registry.registerConfig(OptionalConfig); + expect(config.name).toBe("world"); + expect(config.host).toBe("localhost"); + }); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11ff0268..403cf820 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -420,6 +420,58 @@ importers: specifier: catalog:test version: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + packages/core-editor: + dependencies: + '@nanoforge-dev/asset-manager': + specifier: workspace:* + version: link:../asset-manager + '@nanoforge-dev/common': + specifier: workspace:* + version: link:../common + '@nanoforge-dev/ecs-client': + specifier: workspace:* + version: link:../ecs-client + '@nanoforge-dev/ecs-server': + specifier: workspace:* + version: link:../ecs-server + '@nanoforge-dev/input': + specifier: workspace:* + version: link:../input + class-transformer: + specifier: catalog:config + version: 0.5.1 + class-validator: + specifier: catalog:config + version: 0.14.4 + devDependencies: + '@favware/cliff-jumper': + specifier: catalog:ci + version: 6.0.0 + '@nanoforge-dev/utils-eslint-config': + specifier: workspace:* + version: link:../../utils/eslint-config + '@nanoforge-dev/utils-prettier-config': + specifier: workspace:* + version: link:../../utils/prettier-config + '@trivago/prettier-plugin-sort-imports': + specifier: catalog:lint + version: 6.0.2(prettier@3.8.1) + eslint: + specifier: catalog:lint + version: 10.0.2(jiti@2.6.1) + prettier: + specifier: catalog:lint + version: 3.8.1 + tsup: + specifier: catalog:build + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + typescript: + specifier: catalog:core + version: 5.9.3 + vitest: + specifier: catalog:test + version: 4.0.18(@types/node@25.3.5)(jiti@2.6.1)(yaml@2.8.2) + packages/ecs-client: dependencies: '@nanoforge-dev/common': From dce9293db19e7b18ac5286f1a822cd30c7832fea Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Wed, 25 Mar 2026 16:01:28 +0900 Subject: [PATCH 04/15] feat(core-editor): hot reload from save --- packages/core-editor/src/core/core.ts | 1 - packages/core-editor/src/editor/core-editor.ts | 8 +------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/core-editor/src/core/core.ts b/packages/core-editor/src/core/core.ts index 437da6b7..9ea80077 100644 --- a/packages/core-editor/src/core/core.ts +++ b/packages/core-editor/src/core/core.ts @@ -35,7 +35,6 @@ export class Core { public async init(options: IEditorRunOptions, appOptions: IApplicationOptions): Promise { this.options = appOptions; this.editor = new CoreEditor( - options.editor, this.config.getComponentSystemLibrary().library, ); this._configRegistry = new ConfigRegistry(options.env); diff --git a/packages/core-editor/src/editor/core-editor.ts b/packages/core-editor/src/editor/core-editor.ts index 23fed3b8..c739ee34 100644 --- a/packages/core-editor/src/editor/core-editor.ts +++ b/packages/core-editor/src/editor/core-editor.ts @@ -2,17 +2,11 @@ import { NfNotFound } from "@nanoforge-dev/common"; import { type ECSClientLibrary } from "@nanoforge-dev/ecs-client"; import { type ECSServerLibrary } from "@nanoforge-dev/ecs-server"; -import type { IEditorRunOptions } from "../common/context/options.type"; import type { SaveComponent, SaveEntity } from "../common/context/save.type"; export class CoreEditor { - private editor: IEditorRunOptions["editor"]; private ecsLibrary: ECSClientLibrary | ECSServerLibrary; - constructor( - editor: IEditorRunOptions["editor"], - ecsLibrary: ECSClientLibrary | ECSServerLibrary, - ) { - this.editor = editor; + constructor(ecsLibrary: ECSClientLibrary | ECSServerLibrary) { this.ecsLibrary = ecsLibrary; } From 2f88c580fe7e457887997e685b4f6a412e09f556 Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Wed, 25 Mar 2026 16:08:47 +0900 Subject: [PATCH 05/15] feat(core-editor): hot reload from save --- packages/core-editor/src/editor/core-editor.ts | 6 +++--- packages/ecs-lib/lib/libecs.d.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core-editor/src/editor/core-editor.ts b/packages/core-editor/src/editor/core-editor.ts index c739ee34..1acf374c 100644 --- a/packages/core-editor/src/editor/core-editor.ts +++ b/packages/core-editor/src/editor/core-editor.ts @@ -15,11 +15,11 @@ export class CoreEditor { entityToReload.forEach(({ id, components }) => { Object.entries(components).forEach(([componentName, params]) => { const ogComponent = saveComponents.find(({ name: paramName }) => { - if (!ogComponent) { - throw new NfNotFound("Component: " + componentName + " not found in saved components"); - } return paramName == componentName; }); + if (!ogComponent) { + throw new NfNotFound("Component: " + componentName + " not found in saved components"); + } const ecsComponent = reg.getComponents({ name: componentName }).get(Number(id)); Object.entries(params).forEach(([paramName, paramValue]) => { ecsComponent[paramName] = paramValue; diff --git a/packages/ecs-lib/lib/libecs.d.ts b/packages/ecs-lib/lib/libecs.d.ts index 6ff945f1..d4d8cf0b 100644 --- a/packages/ecs-lib/lib/libecs.d.ts +++ b/packages/ecs-lib/lib/libecs.d.ts @@ -16,7 +16,7 @@ export interface ClassHandle { [Symbol.dispose](): void; clone(): this; } -export interface container extends ClassHandle { +export interface container extends ClassHandle, Iterable { size(): number; get(_0: number): any | undefined | undefined; push_back(_0?: any): void; From 8fdfc1f2a47b854e5ec4a24f3a7c9ec78c56d9ad Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Thu, 26 Mar 2026 10:19:26 +0900 Subject: [PATCH 06/15] feat(core-editor): ask hot reload --- packages/core-editor/package.json | 1 - packages/core-editor/src/core/core.ts | 5 +- .../core-editor/src/editor/core-editor.ts | 25 ++- .../core-editor/test/editor-feature.spec.ts | 157 +++++++++++++----- packages/ecs-client/src/index.ts | 2 + packages/ecs-lib/src/index.ts | 2 +- packages/ecs-server/src/index.ts | 2 + pnpm-lock.yaml | 3 - 8 files changed, 136 insertions(+), 61 deletions(-) diff --git a/packages/core-editor/package.json b/packages/core-editor/package.json index cf532b87..8f9080bf 100644 --- a/packages/core-editor/package.json +++ b/packages/core-editor/package.json @@ -59,7 +59,6 @@ "@nanoforge-dev/asset-manager": "workspace:*", "@nanoforge-dev/common": "workspace:*", "@nanoforge-dev/ecs-client": "workspace:*", - "@nanoforge-dev/ecs-server": "workspace:*", "@nanoforge-dev/input": "workspace:*", "class-transformer": "catalog:config", "class-validator": "catalog:config" diff --git a/packages/core-editor/src/core/core.ts b/packages/core-editor/src/core/core.ts index 9ea80077..657d810d 100644 --- a/packages/core-editor/src/core/core.ts +++ b/packages/core-editor/src/core/core.ts @@ -9,7 +9,6 @@ import { NfNotInitializedException, } from "@nanoforge-dev/common"; import { type ECSClientLibrary } from "@nanoforge-dev/ecs-client"; -import { type ECSServerLibrary } from "@nanoforge-dev/ecs-server"; import { type ApplicationConfig } from "../application/application-config"; import type { IApplicationOptions } from "../application/application-options.type"; @@ -34,9 +33,7 @@ export class Core { public async init(options: IEditorRunOptions, appOptions: IApplicationOptions): Promise { this.options = appOptions; - this.editor = new CoreEditor( - this.config.getComponentSystemLibrary().library, - ); + this.editor = new CoreEditor(this.config.getComponentSystemLibrary().library); this._configRegistry = new ConfigRegistry(options.env); await this.runInit(this.getInitContext(options)); } diff --git a/packages/core-editor/src/editor/core-editor.ts b/packages/core-editor/src/editor/core-editor.ts index 1acf374c..5b0bc74c 100644 --- a/packages/core-editor/src/editor/core-editor.ts +++ b/packages/core-editor/src/editor/core-editor.ts @@ -1,16 +1,15 @@ import { NfNotFound } from "@nanoforge-dev/common"; -import { type ECSClientLibrary } from "@nanoforge-dev/ecs-client"; -import { type ECSServerLibrary } from "@nanoforge-dev/ecs-server"; +import { type ECSClientLibrary, type Entity } from "@nanoforge-dev/ecs-client"; import type { SaveComponent, SaveEntity } from "../common/context/save.type"; export class CoreEditor { - private ecsLibrary: ECSClientLibrary | ECSServerLibrary; - constructor(ecsLibrary: ECSClientLibrary | ECSServerLibrary) { + private ecsLibrary: ECSClientLibrary; + constructor(ecsLibrary: ECSClientLibrary) { this.ecsLibrary = ecsLibrary; } - public askEntityHotReload(saveComponents: SaveComponent[], entityToReload: SaveEntity[]): void { + public askEntitiesHotReload(saveComponents: SaveComponent[], entityToReload: SaveEntity[]): void { const reg = this.ecsLibrary.registry; entityToReload.forEach(({ id, components }) => { Object.entries(components).forEach(([componentName, params]) => { @@ -20,12 +19,24 @@ export class CoreEditor { if (!ogComponent) { throw new NfNotFound("Component: " + componentName + " not found in saved components"); } - const ecsComponent = reg.getComponents({ name: componentName }).get(Number(id)); + const ecsEntity: Entity = this.getEntityFromEntityId(id); + const ecsComponent = reg.getEntityComponent(ecsEntity, { + name: componentName, + }); Object.entries(params).forEach(([paramName, paramValue]) => { ecsComponent[paramName] = paramValue; }); - reg.getComponents({ name: componentName }).set(Number(id), ecsComponent); + reg.addComponent(ecsEntity, ecsComponent); }); }); } + + private getEntityFromEntityId(entityId: string): Entity { + const reg = this.ecsLibrary.registry; + return reg.entityFromIndex( + reg + .getComponentsConst({ name: "__RESERVED_ENTITY_ID" }) + .getIndex({ name: "__RESERVED_ENTITY_ID", entityId: entityId }), + ); + } } diff --git a/packages/core-editor/test/editor-feature.spec.ts b/packages/core-editor/test/editor-feature.spec.ts index 0a1e2844..b5674dcf 100644 --- a/packages/core-editor/test/editor-feature.spec.ts +++ b/packages/core-editor/test/editor-feature.spec.ts @@ -1,54 +1,121 @@ -import { Expose } from "class-transformer"; -import { IsString } from "class-validator"; -import { describe, expect, it } from "vitest"; +import { type ECSClientLibrary } from "@nanoforge-dev/ecs-client"; +import { describe, expect, it, vi } from "vitest"; -import { ConfigRegistry } from "../src/config/config-registry"; +import { type SaveComponent, type SaveEntity } from "../src/common/context/save.type"; +import { CoreEditor } from "../src/editor/core-editor"; -class ValidConfig { - @Expose() - @IsString() - name!: string; -} - -class OptionalConfig { - @Expose() - @IsString() - name!: string; - - @Expose() - host?: string; -} - -describe("ConfigRegistry", () => { - describe("registerConfig", () => { - it("should return a transformed config instance when env is valid", async () => { - const registry = new ConfigRegistry({ name: "hello" }); - const config = await registry.registerConfig(ValidConfig); - expect(config).toBeInstanceOf(ValidConfig); - expect(config.name).toBe("hello"); - }); - - it("should exclude values not decorated with @Expose", async () => { - const registry = new ConfigRegistry({ name: "hello", extra: "ignored" }); - const config = await registry.registerConfig(ValidConfig); - expect((config as any)["extra"]).toBeUndefined(); - }); +const getIndex = vi.fn((component) => { + return Number(component.entityId.slice(-1)); +}); - it("should throw when a required field is missing", async () => { - const registry = new ConfigRegistry({}); - await expect(registry.registerConfig(ValidConfig)).rejects.toThrow(); +const FakeRegistry = vi.fn( + class { + addComponent = vi.fn(); + getComponentsConst = vi.fn(() => ({ getIndex })); + getEntityComponent = vi.fn((entity: number, component) => { + return ( + { + 2: { + Position: { + name: "Position", + x: 3, + y: 4, + }, + Bullets: { + name: "Bullets", + number: 4, + bulletTypes: ["9mm"], + }, + __RESERVED_ENTITY_ID: { + entityId: "ent2", + }, + }, + 3: { + Position: { + name: "Position", + x: 7, + y: 8, + }, + __RESERVED_ENTITY_ID: { + entityId: "ent3", + }, + }, + } as Record> + )[entity]?.[component.name]; }); - - it("should throw when a field has the wrong type", async () => { - const registry = new ConfigRegistry({ name: 42 }); - await expect(registry.registerConfig(ValidConfig)).rejects.toThrow(); + entityFromIndex = vi.fn((index) => { + return index; }); + }, +); - it("should map multiple env fields correctly", async () => { - const registry = new ConfigRegistry({ name: "world", host: "localhost" }); - const config = await registry.registerConfig(OptionalConfig); - expect(config.name).toBe("world"); - expect(config.host).toBe("localhost"); +describe("EditorFeatures", () => { + describe("askEntitiesHotReload", () => { + it("should reload entities with new save variables", async () => { + const components: SaveComponent[] = [ + { + name: "Position", + path: "/tmp/pos", + paramsNames: ["x", "y"], + }, + { + name: "Bullets", + path: "/tmp/pos", + paramsNames: ["bulletTypes", "number"], + }, + ]; + const entities: SaveEntity[] = [ + { + id: "ent2", + components: { + Position: { + x: 1, + y: 2, + }, + Bullets: { + bulletTypes: ["fire", "water", "rocket"], + number: 1000, + }, + }, + }, + { + id: "ent3", + components: { + Position: { + x: 5, + y: 6, + }, + }, + }, + ]; + const fakeReg = new FakeRegistry(); + new CoreEditor({ registry: fakeReg } as any as ECSClientLibrary).askEntitiesHotReload( + components, + entities, + ); + expect(fakeReg.getComponentsConst).toHaveBeenCalledWith({ name: "__RESERVED_ENTITY_ID" }); + expect(getIndex).toHaveBeenNthCalledWith(1, { + entityId: "ent2", + name: "__RESERVED_ENTITY_ID", + }); + expect(getIndex).toHaveBeenNthCalledWith(2, { + entityId: "ent2", + name: "__RESERVED_ENTITY_ID", + }); + expect(getIndex).toHaveBeenNthCalledWith(3, { + entityId: "ent3", + name: "__RESERVED_ENTITY_ID", + }); + expect(fakeReg.getEntityComponent).toHaveBeenNthCalledWith(1, 2, { name: "Position" }); + expect(fakeReg.getEntityComponent).toHaveBeenNthCalledWith(2, 2, { name: "Bullets" }); + expect(fakeReg.getEntityComponent).toHaveBeenNthCalledWith(3, 3, { name: "Position" }); + expect(fakeReg.addComponent).toHaveBeenNthCalledWith(1, 2, { name: "Position", x: 1, y: 2 }); + expect(fakeReg.addComponent).toHaveBeenNthCalledWith(2, 2, { + name: "Bullets", + bulletTypes: ["fire", "water", "rocket"], + number: 1000, + }); + expect(fakeReg.addComponent).toHaveBeenNthCalledWith(3, 3, { name: "Position", x: 5, y: 6 }); }); }); }); diff --git a/packages/ecs-client/src/index.ts b/packages/ecs-client/src/index.ts index 5e93dd98..8759c383 100644 --- a/packages/ecs-client/src/index.ts +++ b/packages/ecs-client/src/index.ts @@ -6,6 +6,8 @@ export type { EditorSystemManifest, System, Registry, + Entity, + SparseArray, } from "@nanoforge-dev/ecs-lib"; export { ECSClientLibrary } from "./ecs-client-library"; diff --git a/packages/ecs-lib/src/index.ts b/packages/ecs-lib/src/index.ts index ab84137a..a0d20643 100644 --- a/packages/ecs-lib/src/index.ts +++ b/packages/ecs-lib/src/index.ts @@ -1,3 +1,3 @@ export { AbstractECSLibrary } from "./ecs-library.abstract"; -export type { Component, System, Registry } from "../lib/libecs"; +export type { Component, System, Registry, SparseArray, Entity } from "../lib/libecs"; export type * from "./editor-manifest.type"; diff --git a/packages/ecs-server/src/index.ts b/packages/ecs-server/src/index.ts index 0c14ef42..045ba79b 100644 --- a/packages/ecs-server/src/index.ts +++ b/packages/ecs-server/src/index.ts @@ -6,6 +6,8 @@ export type { EditorSystemManifest, System, Registry, + Entity, + SparseArray, } from "@nanoforge-dev/ecs-lib"; export { ECSServerLibrary } from "./ecs-server-library"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 403cf820..db262e37 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -431,9 +431,6 @@ importers: '@nanoforge-dev/ecs-client': specifier: workspace:* version: link:../ecs-client - '@nanoforge-dev/ecs-server': - specifier: workspace:* - version: link:../ecs-server '@nanoforge-dev/input': specifier: workspace:* version: link:../input From c2a2addf5f7c33834c72ceb47aa0d3997d6c0d7f Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Thu, 26 Mar 2026 10:23:49 +0900 Subject: [PATCH 07/15] feat: merge main --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db262e37..3d326ec2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -455,7 +455,7 @@ importers: version: 6.0.2(prettier@3.8.1) eslint: specifier: catalog:lint - version: 10.0.2(jiti@2.6.1) + version: 10.0.3(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 From 308be20596dc01696ecc66a2ddf30e7973901aae Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Thu, 26 Mar 2026 11:26:35 +0900 Subject: [PATCH 08/15] feat(core-editor): event executor --- .../src/common/context/event-emitter.type.ts | 8 ++ .../src/common/context/options.type.ts | 3 + packages/core-editor/src/core/core.ts | 6 +- .../core-editor/src/editor/core-editor.ts | 28 +++- .../core-editor/test/editor-feature.spec.ts | 123 +++++++++++------- 5 files changed, 112 insertions(+), 56 deletions(-) create mode 100644 packages/core-editor/src/common/context/event-emitter.type.ts diff --git a/packages/core-editor/src/common/context/event-emitter.type.ts b/packages/core-editor/src/common/context/event-emitter.type.ts new file mode 100644 index 00000000..c9c040d0 --- /dev/null +++ b/packages/core-editor/src/common/context/event-emitter.type.ts @@ -0,0 +1,8 @@ +export enum EventTypeEnum { + HOT_RELOAD = "hot-reload", + HARD_RELOAD = "hard-reload", +} + +export interface EventEmitter { + eventQueue: (EventTypeEnum | string)[]; +} diff --git a/packages/core-editor/src/common/context/options.type.ts b/packages/core-editor/src/common/context/options.type.ts index 4aa66560..3a06c151 100644 --- a/packages/core-editor/src/common/context/options.type.ts +++ b/packages/core-editor/src/common/context/options.type.ts @@ -1,3 +1,4 @@ +import { type EventEmitter } from "./event-emitter.type"; import { type Save } from "./save.type"; export type IEditorRunOptions = IEditorRunClientOptions | IEditorRunServerOptions; @@ -8,6 +9,7 @@ export interface IEditorRunClientOptions { env: Record; editor: { save: Save; + events: EventEmitter; }; } export interface IEditorRunServerOptions { @@ -16,5 +18,6 @@ export interface IEditorRunServerOptions { env: Record; editor: { save: Save; + events: EventEmitter; }; } diff --git a/packages/core-editor/src/core/core.ts b/packages/core-editor/src/core/core.ts index 657d810d..9857164b 100644 --- a/packages/core-editor/src/core/core.ts +++ b/packages/core-editor/src/core/core.ts @@ -33,9 +33,12 @@ export class Core { public async init(options: IEditorRunOptions, appOptions: IApplicationOptions): Promise { this.options = appOptions; - this.editor = new CoreEditor(this.config.getComponentSystemLibrary().library); this._configRegistry = new ConfigRegistry(options.env); await this.runInit(this.getInitContext(options)); + this.editor = new CoreEditor( + options.editor, + this.config.getComponentSystemLibrary().library, + ); } public async run(): Promise { @@ -47,6 +50,7 @@ export class Core { const runner = async (delta: number) => { this.context.setDelta(delta); + this.editor?.runEvents(); await this.runExecute(clientContext, libraries); }; diff --git a/packages/core-editor/src/editor/core-editor.ts b/packages/core-editor/src/editor/core-editor.ts index 5b0bc74c..2f454410 100644 --- a/packages/core-editor/src/editor/core-editor.ts +++ b/packages/core-editor/src/editor/core-editor.ts @@ -1,19 +1,37 @@ import { NfNotFound } from "@nanoforge-dev/common"; import { type ECSClientLibrary, type Entity } from "@nanoforge-dev/ecs-client"; -import type { SaveComponent, SaveEntity } from "../common/context/save.type"; +import { EventTypeEnum } from "../common/context/event-emitter.type"; +import { type IEditorRunOptions } from "../common/context/options.type"; export class CoreEditor { + private editor: IEditorRunOptions["editor"]; private ecsLibrary: ECSClientLibrary; - constructor(ecsLibrary: ECSClientLibrary) { + constructor(editor: IEditorRunOptions["editor"], ecsLibrary: ECSClientLibrary) { + this.editor = editor; this.ecsLibrary = ecsLibrary; } - public askEntitiesHotReload(saveComponents: SaveComponent[], entityToReload: SaveEntity[]): void { + public runEvents() { + const events: (EventTypeEnum | string)[] = this.editor.events.eventQueue; + while (events.length > 0) { + const event = events.shift(); + switch (event) { + case EventTypeEnum.HOT_RELOAD: + this.askEntitiesHotReload(); + break; + default: + console.warn(`Unknown event type ${event}`); + } + } + } + + public askEntitiesHotReload(): void { const reg = this.ecsLibrary.registry; - entityToReload.forEach(({ id, components }) => { + const save = this.editor.save; + save.entities.forEach(({ id, components }) => { Object.entries(components).forEach(([componentName, params]) => { - const ogComponent = saveComponents.find(({ name: paramName }) => { + const ogComponent = save.components.find(({ name: paramName }) => { return paramName == componentName; }); if (!ogComponent) { diff --git a/packages/core-editor/test/editor-feature.spec.ts b/packages/core-editor/test/editor-feature.spec.ts index b5674dcf..2c67193c 100644 --- a/packages/core-editor/test/editor-feature.spec.ts +++ b/packages/core-editor/test/editor-feature.spec.ts @@ -1,57 +1,75 @@ import { type ECSClientLibrary } from "@nanoforge-dev/ecs-client"; -import { describe, expect, it, vi } from "vitest"; +import { afterEach, describe, expect, it, vi } from "vitest"; -import { type SaveComponent, type SaveEntity } from "../src/common/context/save.type"; +import { type EventEmitter, EventTypeEnum } from "../src/common/context/event-emitter.type"; +import type { IEditorRunOptions } from "../src/common/context/options.type"; +import { type Save, type SaveComponent, type SaveEntity } from "../src/common/context/save.type"; import { CoreEditor } from "../src/editor/core-editor"; -const getIndex = vi.fn((component) => { - return Number(component.entityId.slice(-1)); -}); - -const FakeRegistry = vi.fn( - class { - addComponent = vi.fn(); - getComponentsConst = vi.fn(() => ({ getIndex })); - getEntityComponent = vi.fn((entity: number, component) => { - return ( - { - 2: { - Position: { - name: "Position", - x: 3, - y: 4, - }, - Bullets: { - name: "Bullets", - number: 4, - bulletTypes: ["9mm"], - }, - __RESERVED_ENTITY_ID: { - entityId: "ent2", - }, - }, - 3: { - Position: { - name: "Position", - x: 7, - y: 8, - }, - __RESERVED_ENTITY_ID: { - entityId: "ent3", - }, - }, - } as Record> - )[entity]?.[component.name]; - }); - entityFromIndex = vi.fn((index) => { - return index; +describe("EditorFeatures", () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + describe("eventEmitter", () => { + it("should execute eventQueue once", async () => { + const events: EventEmitter = { + eventQueue: [EventTypeEnum.HOT_RELOAD, EventTypeEnum.HOT_RELOAD], + }; + const spyHotReload = vi + .spyOn(CoreEditor.prototype, "askEntitiesHotReload") + .mockImplementation(() => {}); + new CoreEditor({ events } as IEditorRunOptions["editor"], {} as ECSClientLibrary).runEvents(); + expect(spyHotReload).toHaveBeenCalledTimes(2); }); - }, -); + }); -describe("EditorFeatures", () => { describe("askEntitiesHotReload", () => { it("should reload entities with new save variables", async () => { + const getIndex = vi.fn((component) => { + return Number(component.entityId.slice(-1)); + }); + + const FakeRegistry = vi.fn( + class { + addComponent = vi.fn(); + getComponentsConst = vi.fn(() => ({ getIndex })); + getEntityComponent = vi.fn((entity: number, component) => { + return ( + { + 2: { + Position: { + name: "Position", + x: 3, + y: 4, + }, + Bullets: { + name: "Bullets", + number: 4, + bulletTypes: ["9mm"], + }, + __RESERVED_ENTITY_ID: { + entityId: "ent2", + }, + }, + 3: { + Position: { + name: "Position", + x: 7, + y: 8, + }, + __RESERVED_ENTITY_ID: { + entityId: "ent3", + }, + }, + } as Record> + )[entity]?.[component.name]; + }); + entityFromIndex = vi.fn((index) => { + return index; + }); + }, + ); + const components: SaveComponent[] = [ { name: "Position", @@ -89,10 +107,15 @@ describe("EditorFeatures", () => { }, ]; const fakeReg = new FakeRegistry(); - new CoreEditor({ registry: fakeReg } as any as ECSClientLibrary).askEntitiesHotReload( - components, - entities, - ); + new CoreEditor( + { + save: { + components, + entities, + } as any as Save, + } as any as IEditorRunOptions["editor"], + { registry: fakeReg } as any as ECSClientLibrary, + ).askEntitiesHotReload(); expect(fakeReg.getComponentsConst).toHaveBeenCalledWith({ name: "__RESERVED_ENTITY_ID" }); expect(getIndex).toHaveBeenNthCalledWith(1, { entityId: "ent2", From 08bbe57cf3778d68d5d1b8f53bf07af05df76616 Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Tue, 31 Mar 2026 00:55:20 +0900 Subject: [PATCH 09/15] feat(core-editor): cleaner event manager --- packages/core-editor/.cliff-jumperrc.json | 2 +- packages/core-editor/.idea/.name | 2 +- ...iml => [NanoForge] Engine Core Editor.iml} | 0 packages/core-editor/.idea/modules.xml | 2 +- packages/core-editor/CHANGELOG.md | 45 ----------------- packages/core-editor/README.md | 19 ++++--- packages/core-editor/cliff.toml | 2 +- packages/core-editor/package.json | 2 +- .../src/common/context/event-emitter.type.ts | 20 +++++++- .../src/common/context/options.type.ts | 9 ++-- .../core-editor/src/editor/core-editor.ts | 13 +---- .../src/editor/event-emitter.manager.ts | 50 +++++++++++++++++++ .../core-editor/test/editor-feature.spec.ts | 15 ++++-- 13 files changed, 99 insertions(+), 82 deletions(-) rename packages/core-editor/.idea/{[NanoForge] Engine Core.iml => [NanoForge] Engine Core Editor.iml} (100%) create mode 100644 packages/core-editor/src/editor/event-emitter.manager.ts diff --git a/packages/core-editor/.cliff-jumperrc.json b/packages/core-editor/.cliff-jumperrc.json index fe6d9d4a..05f3e85e 100644 --- a/packages/core-editor/.cliff-jumperrc.json +++ b/packages/core-editor/.cliff-jumperrc.json @@ -2,6 +2,6 @@ "$schema": "https://raw.githubusercontent.com/favware/cliff-jumper/main/assets/cliff-jumper.schema.json", "name": "core", "org": "nanoforge-dev", - "packagePath": "packages/core", + "packagePath": "packages/core-editor", "identifierBase": false } diff --git a/packages/core-editor/.idea/.name b/packages/core-editor/.idea/.name index 3d3e7caa..b5da13ff 100644 --- a/packages/core-editor/.idea/.name +++ b/packages/core-editor/.idea/.name @@ -1 +1 @@ -[NanoForge] Engine Core \ No newline at end of file +[NanoForge] Engine Core Editor \ No newline at end of file diff --git a/packages/core-editor/.idea/[NanoForge] Engine Core.iml b/packages/core-editor/.idea/[NanoForge] Engine Core Editor.iml similarity index 100% rename from packages/core-editor/.idea/[NanoForge] Engine Core.iml rename to packages/core-editor/.idea/[NanoForge] Engine Core Editor.iml diff --git a/packages/core-editor/.idea/modules.xml b/packages/core-editor/.idea/modules.xml index 99922e22..529602fb 100644 --- a/packages/core-editor/.idea/modules.xml +++ b/packages/core-editor/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/packages/core-editor/CHANGELOG.md b/packages/core-editor/CHANGELOG.md index 1d7fb605..53aaa9de 100644 --- a/packages/core-editor/CHANGELOG.md +++ b/packages/core-editor/CHANGELOG.md @@ -2,58 +2,13 @@ All notable changes to this project will be documented in this file. -# [@nanoforge-dev/core@1.0.1](https://github.com/NanoForge-dev/Engine/compare/@nanoforge-dev/core@1.0.0...@nanoforge-dev/core@1.0.1) - (2026-02-16) - ## Documentation -- Setup typedoc (#192) ([fa908e7](https://github.com/NanoForge-dev/Engine/commit/fa908e7e268fa1770be58fc62a0257f3760480b2)) by @MartinFillon -- Fix readme badges (#186) ([fd8d93d](https://github.com/NanoForge-dev/Engine/commit/fd8d93d13a0fbad95ef9952acd10faad9e112c78)) by @Exeloo - -# [@nanoforge-dev/core@1.0.0](https://github.com/NanoForge-dev/Engine/tree/@nanoforge-dev/core@1.0.0) - (2026-01-09) - ## Bug Fixes -- **graphics:** Game loop ([53329d2](https://github.com/NanoForge-dev/Engine/commit/53329d28c47bfac9fe86259e9fc6f42b206062a8)) by @Exeloo -- **graphics:** Fix display ([d8522e5](https://github.com/NanoForge-dev/Engine/commit/d8522e56678f3bd136733f7941c1d917c18b1400)) by @Exeloo -- **ecs:** Fix tests ([d33ada5](https://github.com/NanoForge-dev/Engine/commit/d33ada5d9c37e331b8178aa1fc0daee88b07131c)) by @Exeloo -- **ecs:** Change type handling on lib ecs ([580192d](https://github.com/NanoForge-dev/Engine/commit/580192d5038f386c965434f78aacdf3d1e399ff8)) by @Exeloo - ## Documentation -- Update README files with new structure and detailed usage examples for all packages (#157) ([63fab73](https://github.com/NanoForge-dev/Engine/commit/63fab7326bd9c7e6b00f950694ab16c9d9190c53)) by @Exeloo -- Add funding (#147) ([7301fad](https://github.com/NanoForge-dev/Engine/commit/7301fad10f59b7e1f7fa788f8a2f6fc81d0db72e)) by @Exeloo -- Add a basic introduction readme ([b240964](https://github.com/NanoForge-dev/Engine/commit/b240964a265b31769a8c5422e23e20156ba56192)) by @MartinFillon -- Add building and dependency docs to every readme ([2d4785b](https://github.com/NanoForge-dev/Engine/commit/2d4785bdcb455e83337b37540f9ab6b3394c0850)) by @MartinFillon - ## Features -- **packages/network:** Client and server for tcp/udp and networked pong as example (#156) ([839fb95](https://github.com/NanoForge-dev/Engine/commit/839fb95449f6ae0ee66d7f7e279374268b743f65)) by @Tchips46 -- **core:** Add client/server distinction and update rendering logic (#119) ([5271432](https://github.com/NanoForge-dev/Engine/commit/5271432710031396d7e433bfdfb015e3871f69d0)) by @Exeloo -- Add schematics used types (#102) ([b992306](https://github.com/NanoForge-dev/Engine/commit/b9923064ba1da3164b1739fcdec5a819734c4ba2)) by @Exeloo -- **core:** Introduce `EditableApplicationContext` for managing sound libraries ([6c7bac2](https://github.com/NanoForge-dev/Engine/commit/6c7bac261eeb7ad79203d5695d5ad76dc9e9e9f5)) by @Exeloo -- **core:** Add Context that admit a ClientLibraryManager ([3835bc8](https://github.com/NanoForge-dev/Engine/commit/3835bc8a6e6d039f11a513b7fe54c353f90e9fe1)) by @Exeloo -- **music:** Finish music library and add an interface for mutable libraries ([8e00c5d](https://github.com/NanoForge-dev/Engine/commit/8e00c5d00f2901ada86f59667eff7e5d3446076b)) by @MartinFillon -- **core:** Add `class-transformer` and `class-validator` dependencies for validation utilities ([fd94fe7](https://github.com/NanoForge-dev/Engine/commit/fd94fe7755999c5529335666720899792a691a36)) by @Exeloo -- **common, core, config:** Introduce configuration registry and validation system ([4fafb82](https://github.com/NanoForge-dev/Engine/commit/4fafb82576fec6866fc281ad5b10321d2ac430df)) by @Exeloo -- **core:** Enhance type safety and execution context handling ([d986030](https://github.com/NanoForge-dev/Engine/commit/d986030a333bc08d2e37291d1a023cf8d7a6e1d6)) by @Exeloo -- **app:** Add the ability to mute and unmute sounds ([947bdc0](https://github.com/NanoForge-dev/Engine/commit/947bdc00784a4c3313fe08feb4f91fc91b3ac7b7)) by @MartinFillon -- **sound:** Add basic sound playing to example ([7335814](https://github.com/NanoForge-dev/Engine/commit/7335814fc532ee92a5f9d776f409c5faa4d56423)) by @MartinFillon -- **core:** Add default libraries to constructor ([7d9da69](https://github.com/NanoForge-dev/Engine/commit/7d9da69be4301875020176656276236b88b737f1)) by @Exeloo -- Add dependencies handling ([e51dd3b](https://github.com/NanoForge-dev/Engine/commit/e51dd3bdb5e2e3de21339bf6218e85f935efb9d5)) by @Exeloo -- **common:** Add dependencies handler ([edb098a](https://github.com/NanoForge-dev/Engine/commit/edb098a65fb932ba9a9532a9b1eee7d64a7a8f0d)) by @Exeloo -- **core:** Add tickrate and fix runner ([1dba5bd](https://github.com/NanoForge-dev/Engine/commit/1dba5bd89ffa20dfd29b079f93c3eb923ffbdbbc)) by @Exeloo -- **input:** Add input library ([387e97d](https://github.com/NanoForge-dev/Engine/commit/387e97d7c3015a869947af4acecf48e8e1b0e2b8)) by @Exeloo -- **game:** Create pong example game ([4b66674](https://github.com/NanoForge-dev/Engine/commit/4b66674c750f345e860d225384054423433beb07)) by @bill-h4rper -- **game:** Add width and height ([c93c985](https://github.com/NanoForge-dev/Engine/commit/c93c985665bd99c09bc410f1499d11aeaffe3c4c)) by @Exeloo -- **game:** Add graphics factory ([0f4453c](https://github.com/NanoForge-dev/Engine/commit/0f4453ced908b39e953a672324e97eba82bfeaa3)) by @Exeloo -- **asset-manager:** Add asset manager ([1774a26](https://github.com/NanoForge-dev/Engine/commit/1774a26593099b4faa0a2527d1684de35211d5d2)) by @Exeloo -- Add asset manager default in core ([26cc5a9](https://github.com/NanoForge-dev/Engine/commit/26cc5a99e014fbc8669a43cc4aa4d78ecc1dee14)) by @Exeloo -- Add core and common ([1755c79](https://github.com/NanoForge-dev/Engine/commit/1755c799c143513d72b28edaac875267d484a44f)) by @Exeloo -- Initial commit ([c9bb59e](https://github.com/NanoForge-dev/Engine/commit/c9bb59ee963e7b444e8668db55597915e9ef0e4b)) by @Exeloo - ## Refactor -- **core:** Remove default libs in factory (#118) ([fa893c7](https://github.com/NanoForge-dev/Engine/commit/fa893c71616f151343c2f52a4723a64cca65814a)) by @Exeloo -- Migrate namespaces to `@nanoforge-dev` and update related imports ([c84c927](https://github.com/NanoForge-dev/Engine/commit/c84c927ead941d914e5a9fd752fd3a5ac969f981)) by @Exeloo -- **libraries:** Implement initialization validation and standardize nullable fields ([8b04575](https://github.com/NanoForge-dev/Engine/commit/8b04575cf7f649a440b8f40ad6114414406b0c1a)) by @Exeloo - diff --git a/packages/core-editor/README.md b/packages/core-editor/README.md index f114fe2e..af648541 100644 --- a/packages/core-editor/README.md +++ b/packages/core-editor/README.md @@ -16,17 +16,17 @@ ## About -`@nanoforge-dev/core` is a core package that contains game main loop. It is used to initialize the game and run it. +`@nanoforge-dev/core-editor` is a core package that contains game main loop. It is used to initialize the game and run it. ## Installation **Node.js 24.11.0 or newer is required.** ```sh -npm install @nanoforge-dev/core -yarn add @nanoforge-dev/core -pnpm add @nanoforge-dev/core -bun add @nanoforge-dev/core +npm install @nanoforge-dev/core-editor +yarn add @nanoforge-dev/core-editor +pnpm add @nanoforge-dev/core-editor +bun add @nanoforge-dev/core-editor ``` ## Example usage @@ -34,10 +34,9 @@ bun add @nanoforge-dev/core Initialize the game in your main file. ```ts -import { type IRunOptions } from "@nanoforge-dev/common"; -import { NanoforgeFactory } from "@nanoforge-dev/core"; +import { IEditorRunOptions, NanoforgeFactory } from "@nanoforge-dev/core-editor"; -export async function main(options: IRunClientOptions) { +export async function main(options: IEditorRunOptions) { const app = NanoforgeFactory.createClient(); await app.init(options); @@ -63,6 +62,6 @@ If you don't understand something in the documentation, you are experiencing pro [documentation]: https://github.com/NanoForge-dev/Engine [discussions]: https://github.com/NanoForge-dev/Engine/discussions -[source]: https://github.com/NanoForge-dev/Engine/tree/main/packages/core -[npm]: https://www.npmjs.com/package/@nanoforge-dev/core +[source]: https://github.com/NanoForge-dev/Engine/tree/main/packages/core-editor +[npm]: https://www.npmjs.com/package/@nanoforge-dev/core-editor [contributing]: https://github.com/NanoForge-dev/Engine/blob/main/.github/CONTRIBUTING.md diff --git a/packages/core-editor/cliff.toml b/packages/core-editor/cliff.toml index 59978d4c..a9abf0b7 100644 --- a/packages/core-editor/cliff.toml +++ b/packages/core-editor/cliff.toml @@ -69,7 +69,7 @@ commit_parsers = [ ] filter_commits = true protect_breaking_commits = true -tag_pattern = "@nanoforge-dev/core@[0-9]*" +tag_pattern = "@nanoforge-dev/core-editor@[0-9]*" ignore_tags = "" topo_order = false sort_commits = "newest" diff --git a/packages/core-editor/package.json b/packages/core-editor/package.json index 8f9080bf..c2fe4a6a 100644 --- a/packages/core-editor/package.json +++ b/packages/core-editor/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@nanoforge-dev/core-editor", - "version": "1.0", + "version": "0.0", "description": "NanoForge Engine - Core Editor", "keywords": [ "nanoforge", diff --git a/packages/core-editor/src/common/context/event-emitter.type.ts b/packages/core-editor/src/common/context/event-emitter.type.ts index c9c040d0..c90caba3 100644 --- a/packages/core-editor/src/common/context/event-emitter.type.ts +++ b/packages/core-editor/src/common/context/event-emitter.type.ts @@ -3,6 +3,22 @@ export enum EventTypeEnum { HARD_RELOAD = "hard-reload", } -export interface EventEmitter { - eventQueue: (EventTypeEnum | string)[]; +export type ListenerType = (...args: any[]) => void; + +export interface IEventEmitter { + listeners: Record; + eventQueue: { event: EventTypeEnum | string; args: any[] }[]; + + runEvents: () => void; + + emitEvent: (event: EventTypeEnum, ...args: any) => void; + + addListener: (event: EventTypeEnum | string, listener: ListenerType) => void; + on: (event: EventTypeEnum | string, listener: ListenerType) => void; + + removeListener: (event: EventTypeEnum | string, listener: ListenerType) => void; + off: (event: EventTypeEnum | string, listener: ListenerType) => void; + + removeListenersForEvent: (event: EventTypeEnum | string) => void; + removeAllListeners: () => void; } diff --git a/packages/core-editor/src/common/context/options.type.ts b/packages/core-editor/src/common/context/options.type.ts index 3a06c151..1fc49839 100644 --- a/packages/core-editor/src/common/context/options.type.ts +++ b/packages/core-editor/src/common/context/options.type.ts @@ -1,4 +1,4 @@ -import { type EventEmitter } from "./event-emitter.type"; +import { type EventEmitter } from "../../editor/event-emitter.manager"; import { type Save } from "./save.type"; export type IEditorRunOptions = IEditorRunClientOptions | IEditorRunServerOptions; @@ -9,15 +9,16 @@ export interface IEditorRunClientOptions { env: Record; editor: { save: Save; - events: EventEmitter; + coreEvents: EventEmitter; + editorEvents: EventEmitter; }; } export interface IEditorRunServerOptions { - canvas: HTMLCanvasElement; files: Map; env: Record; editor: { save: Save; - events: EventEmitter; + coreEvents: EventEmitter; + editorEvents: EventEmitter; }; } diff --git a/packages/core-editor/src/editor/core-editor.ts b/packages/core-editor/src/editor/core-editor.ts index 2f454410..553638d5 100644 --- a/packages/core-editor/src/editor/core-editor.ts +++ b/packages/core-editor/src/editor/core-editor.ts @@ -10,20 +10,11 @@ export class CoreEditor { constructor(editor: IEditorRunOptions["editor"], ecsLibrary: ECSClientLibrary) { this.editor = editor; this.ecsLibrary = ecsLibrary; + this.editor.coreEvents?.addListener(EventTypeEnum.HOT_RELOAD, this.askEntitiesHotReload); } public runEvents() { - const events: (EventTypeEnum | string)[] = this.editor.events.eventQueue; - while (events.length > 0) { - const event = events.shift(); - switch (event) { - case EventTypeEnum.HOT_RELOAD: - this.askEntitiesHotReload(); - break; - default: - console.warn(`Unknown event type ${event}`); - } - } + this.editor.coreEvents?.runEvents(); } public askEntitiesHotReload(): void { diff --git a/packages/core-editor/src/editor/event-emitter.manager.ts b/packages/core-editor/src/editor/event-emitter.manager.ts new file mode 100644 index 00000000..3498d826 --- /dev/null +++ b/packages/core-editor/src/editor/event-emitter.manager.ts @@ -0,0 +1,50 @@ +import { + type EventTypeEnum, + type IEventEmitter, + type ListenerType, +} from "../common/context/event-emitter.type"; + +export class EventEmitter implements IEventEmitter { + public listeners: Record = {}; + public eventQueue: { event: EventTypeEnum | string; args: any[] }[] = []; + + public runEvents = () => { + this.eventQueue.forEach(({ event, args }) => { + this.listeners[event]?.forEach((listener) => { + listener(...args); + }); + }); + this.eventQueue = []; + }; + + public emitEvent(event: EventTypeEnum | string, ...args: any[]) { + this.eventQueue.push({ event, args }); + } + + public addListener(event: EventTypeEnum | string, listener: ListenerType): void { + if (!this.listeners[event]) this.listeners[event] = []; + this.listeners[event].push(listener); + } + public on(event: EventTypeEnum | string, listener: ListenerType): void { + this.addListener(event, listener); + } + + public removeListener(event: EventTypeEnum | string, listener: ListenerType): void { + if (!this.listeners[event]) return; + const index = this.listeners[event].indexOf(listener); + if (index >= 0) { + this.listeners[event].splice(index, 1); + } + } + public off(event: EventTypeEnum | string, listener: ListenerType): void { + this.removeListener(event, listener); + } + + public removeListenersForEvent(event: EventTypeEnum | string): void { + if (!this.listeners[event]) return; + this.listeners[event] = []; + } + public removeAllListeners(): void { + this.listeners = {}; + } +} diff --git a/packages/core-editor/test/editor-feature.spec.ts b/packages/core-editor/test/editor-feature.spec.ts index 2c67193c..bd442f78 100644 --- a/packages/core-editor/test/editor-feature.spec.ts +++ b/packages/core-editor/test/editor-feature.spec.ts @@ -1,24 +1,29 @@ import { type ECSClientLibrary } from "@nanoforge-dev/ecs-client"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { type EventEmitter, EventTypeEnum } from "../src/common/context/event-emitter.type"; +import { EventTypeEnum } from "../src/common/context/event-emitter.type"; import type { IEditorRunOptions } from "../src/common/context/options.type"; import { type Save, type SaveComponent, type SaveEntity } from "../src/common/context/save.type"; import { CoreEditor } from "../src/editor/core-editor"; +import { EventEmitter } from "../src/editor/event-emitter.manager"; describe("EditorFeatures", () => { afterEach(() => { vi.restoreAllMocks(); }); + describe("eventEmitter", () => { it("should execute eventQueue once", async () => { - const events: EventEmitter = { - eventQueue: [EventTypeEnum.HOT_RELOAD, EventTypeEnum.HOT_RELOAD], - }; + const events = new EventEmitter(); + events.emitEvent(EventTypeEnum.HOT_RELOAD); + events.emitEvent(EventTypeEnum.HOT_RELOAD); const spyHotReload = vi .spyOn(CoreEditor.prototype, "askEntitiesHotReload") .mockImplementation(() => {}); - new CoreEditor({ events } as IEditorRunOptions["editor"], {} as ECSClientLibrary).runEvents(); + new CoreEditor( + { coreEvents: events } as IEditorRunOptions["editor"], + {} as ECSClientLibrary, + ).runEvents(); expect(spyHotReload).toHaveBeenCalledTimes(2); }); }); From 78d9d43f6679926aa2cea324dda23b5951282dd6 Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Tue, 31 Mar 2026 00:55:58 +0900 Subject: [PATCH 10/15] fix(core-editor): cliffer name --- packages/core-editor/.cliff-jumperrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-editor/.cliff-jumperrc.json b/packages/core-editor/.cliff-jumperrc.json index 05f3e85e..c760745b 100644 --- a/packages/core-editor/.cliff-jumperrc.json +++ b/packages/core-editor/.cliff-jumperrc.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/favware/cliff-jumper/main/assets/cliff-jumper.schema.json", - "name": "core", + "name": "core-editor", "org": "nanoforge-dev", "packagePath": "packages/core-editor", "identifierBase": false From 462d859dc96b4a549ac591df571855791ad7e2b8 Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Tue, 31 Mar 2026 10:47:47 +0900 Subject: [PATCH 11/15] feat(core-editor): use core fonctions --- .../src/application/application-config.ts | 89 --------- .../application/application-options.type.ts | 3 - .../src/application/nanoforge-application.ts | 6 +- .../src/application/nanoforge-factory.ts | 2 +- .../contexts/application.editable-context.ts | 20 -- .../executions/clear.editable-context.ts | 3 - .../executions/execution.editable-context.ts | 3 - .../executions/init.editable-context.ts | 3 - .../contexts/library.editable-context.ts | 7 - .../common/library/manager/library.manager.ts | 106 ---------- .../common/library/relationship-functions.ts | 122 ------------ .../core-editor/src/config/config-registry.ts | 19 -- packages/core-editor/src/core/core.ts | 12 +- .../core-editor/test/config-registry.spec.ts | 54 ------ .../test/editable-library-manager.spec.ts | 182 ------------------ .../core-editor/test/relationship.spec.ts | 135 ------------- packages/core-editor/tsconfig.json | 7 +- .../src/application/application-config.ts | 4 +- 18 files changed, 18 insertions(+), 759 deletions(-) delete mode 100644 packages/core-editor/src/application/application-config.ts delete mode 100644 packages/core-editor/src/application/application-options.type.ts delete mode 100644 packages/core-editor/src/common/context/contexts/application.editable-context.ts delete mode 100644 packages/core-editor/src/common/context/contexts/executions/clear.editable-context.ts delete mode 100644 packages/core-editor/src/common/context/contexts/executions/execution.editable-context.ts delete mode 100644 packages/core-editor/src/common/context/contexts/executions/init.editable-context.ts delete mode 100644 packages/core-editor/src/common/context/contexts/library.editable-context.ts delete mode 100644 packages/core-editor/src/common/library/manager/library.manager.ts delete mode 100644 packages/core-editor/src/common/library/relationship-functions.ts delete mode 100644 packages/core-editor/src/config/config-registry.ts delete mode 100644 packages/core-editor/test/config-registry.spec.ts delete mode 100644 packages/core-editor/test/editable-library-manager.spec.ts delete mode 100644 packages/core-editor/test/relationship.spec.ts diff --git a/packages/core-editor/src/application/application-config.ts b/packages/core-editor/src/application/application-config.ts deleted file mode 100644 index 7eeede0c..00000000 --- a/packages/core-editor/src/application/application-config.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { - type IAssetManagerLibrary, - type IComponentSystemLibrary, - type IGraphicsLibrary, - type IInputLibrary, - type ILibrary, - type IMusicLibrary, - type INetworkLibrary, - type ISoundLibrary, - type LibraryHandle, -} from "@nanoforge-dev/common"; - -import { EditableLibraryManager } from "../common/library/manager/library.manager"; - -export class ApplicationConfig { - private readonly _libraryManager: EditableLibraryManager; - - constructor() { - this._libraryManager = new EditableLibraryManager(); - } - - get libraryManager(): EditableLibraryManager { - return this._libraryManager; - } - - public getLibrary(sym: symbol): LibraryHandle { - return this._libraryManager.get(sym); - } - - public useLibrary(sym: symbol, library: ILibrary): void { - this._libraryManager.set(sym, library); - } - - public getComponentSystemLibrary() { - return this._libraryManager.getComponentSystem(); - } - - public useComponentSystemLibrary(library: IComponentSystemLibrary) { - this._libraryManager.setComponentSystem(library); - } - - public getGraphicsLibrary() { - return this._libraryManager.getGraphics(); - } - - public useGraphicsLibrary(library: IGraphicsLibrary) { - this._libraryManager.setGraphics(library); - } - - public getNetworkLibrary() { - return this._libraryManager.getNetwork(); - } - - public useNetworkLibrary(library: INetworkLibrary) { - this._libraryManager.setNetwork(library); - } - - public getAssetManagerLibrary() { - return this._libraryManager.getAssetManager(); - } - - public useAssetManagerLibrary(library: IAssetManagerLibrary) { - this._libraryManager.setAssetManager(library); - } - - public getInputLibrary() { - return this._libraryManager.getInput(); - } - - public useInputLibrary(library: IInputLibrary) { - this._libraryManager.setInput(library); - } - - public getSoundLibrary() { - return this._libraryManager.getSound(); - } - - public useSoundLibrary(library: ISoundLibrary) { - this._libraryManager.setSound(library); - } - - public getMusicLibrary() { - return this._libraryManager.getMusic(); - } - - public useMusicLibrary(library: IMusicLibrary) { - this._libraryManager.setMusic(library); - } -} diff --git a/packages/core-editor/src/application/application-options.type.ts b/packages/core-editor/src/application/application-options.type.ts deleted file mode 100644 index 57ecc833..00000000 --- a/packages/core-editor/src/application/application-options.type.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface IApplicationOptions { - tickRate: number; -} diff --git a/packages/core-editor/src/application/nanoforge-application.ts b/packages/core-editor/src/application/nanoforge-application.ts index 81f6ea6e..66bb18eb 100644 --- a/packages/core-editor/src/application/nanoforge-application.ts +++ b/packages/core-editor/src/application/nanoforge-application.ts @@ -6,11 +6,11 @@ import { NfNotInitializedException, } from "@nanoforge-dev/common"; -import { EditableApplicationContext } from "../common/context/contexts/application.editable-context"; +import { ApplicationConfig } from "../../../core/src/application/application-config"; +import type { IApplicationOptions } from "../../../core/src/application/application-options.type"; +import { EditableApplicationContext } from "../../../core/src/common/context/contexts/application.editable-context"; import { type IEditorRunOptions } from "../common/context/options.type"; import { Core } from "../core/core"; -import { ApplicationConfig } from "./application-config"; -import type { IApplicationOptions } from "./application-options.type"; export abstract class NanoforgeApplication { protected applicationConfig: ApplicationConfig; diff --git a/packages/core-editor/src/application/nanoforge-factory.ts b/packages/core-editor/src/application/nanoforge-factory.ts index 84711a6d..98ec685e 100644 --- a/packages/core-editor/src/application/nanoforge-factory.ts +++ b/packages/core-editor/src/application/nanoforge-factory.ts @@ -1,4 +1,4 @@ -import { type IApplicationOptions } from "./application-options.type"; +import { type IApplicationOptions } from "../../../core/src/application/application-options.type"; import { NanoforgeClient } from "./nanoforge-client"; import { NanoforgeServer } from "./nanoforge-server"; diff --git a/packages/core-editor/src/common/context/contexts/application.editable-context.ts b/packages/core-editor/src/common/context/contexts/application.editable-context.ts deleted file mode 100644 index 492b797e..00000000 --- a/packages/core-editor/src/common/context/contexts/application.editable-context.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { ApplicationContext } from "@nanoforge-dev/common"; - -import { type EditableLibraryManager } from "../../library/manager/library.manager"; - -export class EditableApplicationContext extends ApplicationContext { - private _libraryManager: EditableLibraryManager; - - constructor(libraryManager: EditableLibraryManager) { - super(); - this._libraryManager = libraryManager; - } - - setDelta(delta: number) { - this._delta = delta; - } - - muteSoundLibraries(): void { - this._libraryManager.getMutableLibraries().forEach((lib) => lib.library.mute()); - } -} diff --git a/packages/core-editor/src/common/context/contexts/executions/clear.editable-context.ts b/packages/core-editor/src/common/context/contexts/executions/clear.editable-context.ts deleted file mode 100644 index 1081686d..00000000 --- a/packages/core-editor/src/common/context/contexts/executions/clear.editable-context.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { ClearContext } from "@nanoforge-dev/common"; - -export class EditableClearContext extends ClearContext {} diff --git a/packages/core-editor/src/common/context/contexts/executions/execution.editable-context.ts b/packages/core-editor/src/common/context/contexts/executions/execution.editable-context.ts deleted file mode 100644 index e9b5b3de..00000000 --- a/packages/core-editor/src/common/context/contexts/executions/execution.editable-context.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { ExecutionContext } from "@nanoforge-dev/common"; - -export class EditableExecutionContext extends ExecutionContext {} diff --git a/packages/core-editor/src/common/context/contexts/executions/init.editable-context.ts b/packages/core-editor/src/common/context/contexts/executions/init.editable-context.ts deleted file mode 100644 index 7ce44e10..00000000 --- a/packages/core-editor/src/common/context/contexts/executions/init.editable-context.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { InitContext } from "@nanoforge-dev/common"; - -export class EditableInitContext extends InitContext {} diff --git a/packages/core-editor/src/common/context/contexts/library.editable-context.ts b/packages/core-editor/src/common/context/contexts/library.editable-context.ts deleted file mode 100644 index 48f942e8..00000000 --- a/packages/core-editor/src/common/context/contexts/library.editable-context.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { LibraryContext, type LibraryStatusEnum } from "@nanoforge-dev/common"; - -export class EditableLibraryContext extends LibraryContext { - setStatus(status: LibraryStatusEnum) { - this._status = status; - } -} diff --git a/packages/core-editor/src/common/library/manager/library.manager.ts b/packages/core-editor/src/common/library/manager/library.manager.ts deleted file mode 100644 index 6e17b321..00000000 --- a/packages/core-editor/src/common/library/manager/library.manager.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { - ASSET_MANAGER_LIBRARY, - COMPONENT_SYSTEM_LIBRARY, - DefaultLibrariesEnum, - GRAPHICS_LIBRARY, - type IAssetManagerLibrary, - type IComponentSystemLibrary, - type IGraphicsLibrary, - type IInputLibrary, - type ILibrary, - type IMusicLibrary, - type IMutableLibrary, - INPUT_LIBRARY, - type INetworkLibrary, - type IRunnerLibrary, - type ISoundLibrary, - type LibraryHandle, - LibraryManager, - MUSIC_LIBRARY, - NETWORK_LIBRARY, - SOUND_LIBRARY, -} from "@nanoforge-dev/common"; - -import { EditableLibraryContext } from "../../context/contexts/library.editable-context"; -import { Relationship } from "../relationship-functions"; - -const hasMethod = (obj: any, method: string) => { - return typeof obj[method] === "function"; -}; - -export class EditableLibraryManager extends LibraryManager { - public set(sym: symbol, library: ILibrary) { - this.setNewLibrary(sym, library, new EditableLibraryContext()); - } - - public setComponentSystem(library: IComponentSystemLibrary): void { - this._set( - DefaultLibrariesEnum.COMPONENT_SYSTEM, - COMPONENT_SYSTEM_LIBRARY, - library, - new EditableLibraryContext(), - ); - } - - public setGraphics(library: IGraphicsLibrary): void { - this._set( - DefaultLibrariesEnum.GRAPHICS, - GRAPHICS_LIBRARY, - library, - new EditableLibraryContext(), - ); - } - - public setAssetManager(library: IAssetManagerLibrary): void { - this._set( - DefaultLibrariesEnum.ASSET_MANAGER, - ASSET_MANAGER_LIBRARY, - library, - new EditableLibraryContext(), - ); - } - - public setNetwork(library: INetworkLibrary): void { - this._set(DefaultLibrariesEnum.NETWORK, NETWORK_LIBRARY, library, new EditableLibraryContext()); - } - - public setInput(library: IInputLibrary): void { - this._set(DefaultLibrariesEnum.INPUT, INPUT_LIBRARY, library, new EditableLibraryContext()); - } - - public setSound(library: ISoundLibrary): void { - this._set(DefaultLibrariesEnum.SOUND, SOUND_LIBRARY, library, new EditableLibraryContext()); - } - - public setMusic(library: IMusicLibrary): void { - this._set(DefaultLibrariesEnum.MUSIC, MUSIC_LIBRARY, library, new EditableLibraryContext()); - } - - public getLibraries(): LibraryHandle[] { - return this._libraries; - } - - public getInitLibraries(): LibraryHandle[] { - return Relationship.getLibrariesByDependencies(this._libraries); - } - - public getExecutionLibraries(): LibraryHandle[] { - return Relationship.getLibrariesByRun(this._getRunnerLibraries()); - } - - public getClearLibraries(): LibraryHandle[] { - return Relationship.getLibrariesByDependencies(this._libraries, true); - } - - public getMutableLibraries(): LibraryHandle[] { - return this._libraries.filter( - (handle) => handle && hasMethod(handle.library, "mute"), - ) as LibraryHandle[]; - } - - private _getRunnerLibraries(): LibraryHandle[] { - return this._libraries.filter( - (handle) => handle && hasMethod(handle.library, "__run"), - ) as LibraryHandle[]; - } -} diff --git a/packages/core-editor/src/common/library/relationship-functions.ts b/packages/core-editor/src/common/library/relationship-functions.ts deleted file mode 100644 index d9ff0f2b..00000000 --- a/packages/core-editor/src/common/library/relationship-functions.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { type ILibrary, type LibraryHandle } from "@nanoforge-dev/common"; - -class RelationshipStatic { - getLibrariesByDependencies(libraries: LibraryHandle[], reverse: boolean = false) { - let response: LibraryHandle[] = []; - for (const library of libraries) { - if (!library) continue; - response = this._pushLibraryWithDependencies(library, response, [], libraries); - } - - if (reverse) return response.reverse(); - return response; - } - - getLibrariesByRun(libraries: LibraryHandle[]) { - let response: LibraryHandle[] = []; - const dependencies = new Map>( - libraries.map((library) => [library.symbol, new Set()]), - ); - - for (const handle of libraries) { - const key = handle.symbol; - - for (const before of handle.library.__relationship.runBefore) { - this._pushToDependencies(key, before, dependencies); - } - for (const after of handle.library.__relationship.runAfter) { - this._pushToDependencies(after, key, dependencies); - } - } - - for (const library of libraries) { - response = this._pushLibraryWithDependenciesRun( - library, - dependencies, - response, - [], - libraries, - ); - } - return response; - } - - private _pushToDependencies( - key: symbol, - value: symbol, - dependencies: Map>, - ): void { - let curr = dependencies.get(key); - if (!curr) curr = new Set(); - curr.add(value); - dependencies.set(key, curr); - } - - private _pushLibraryWithDependenciesRun( - handle: LibraryHandle, - dependencies: Map>, - response: LibraryHandle[], - cache: symbol[], - libraries: LibraryHandle[], - ): LibraryHandle[] { - const key = handle.symbol; - if (this._symbolIsInList(key, response)) return response; - - if (cache.includes(key)) throw new Error("Circular dependencies !"); - - cache.push(key); - - const deps = dependencies.get(key); - if (!deps) throw new Error("Dependencies not found"); - - for (const dep of deps) { - if (this._symbolIsInList(dep, response)) continue; - - const depHandle = libraries.find((lib) => lib?.symbol === dep) as LibraryHandle; - if (!depHandle) throw new Error(`Cannot find library ${dep.toString()}`); - - response = this._pushLibraryWithDependenciesRun( - depHandle, - dependencies, - response, - cache, - libraries, - ); - } - cache.pop(); - - response.push(handle); - return response; - } - - private _pushLibraryWithDependencies( - handle: LibraryHandle, - response: LibraryHandle[], - cache: symbol[], - libraries: LibraryHandle[], - ): LibraryHandle[] { - if (this._symbolIsInList(handle.symbol, response)) return response; - - if (cache.includes(handle.symbol)) throw new Error("Circular dependencies !"); - - cache.push(handle.symbol); - for (const dep of handle.library.__relationship.dependencies) { - if (this._symbolIsInList(dep, response)) continue; - - const depHandle = libraries.find((lib) => lib?.symbol === dep) as LibraryHandle; - if (!depHandle) throw new Error(`Cannot find library ${dep.toString()}`); - - response = this._pushLibraryWithDependencies(depHandle, response, cache, libraries); - } - cache.pop(); - - response.push(handle); - return response; - } - - private _symbolIsInList(sym: symbol, libraries: LibraryHandle[]): boolean { - return libraries.some((lib) => lib.symbol === sym); - } -} - -export const Relationship = new RelationshipStatic(); diff --git a/packages/core-editor/src/config/config-registry.ts b/packages/core-editor/src/config/config-registry.ts deleted file mode 100644 index 946ed1dc..00000000 --- a/packages/core-editor/src/config/config-registry.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { plainToInstance } from "class-transformer"; -import { validate } from "class-validator"; - -export class ConfigRegistry { - private readonly _env: Record; - - constructor(env: Record) { - this._env = env; - } - - async registerConfig(config: new () => T): Promise { - const data = plainToInstance(config, this._env, { excludeExtraneousValues: true }); - const errors = await validate(data); - if (errors.length > 0) { - throw new Error(errors.toString()); - } - return data; - } -} diff --git a/packages/core-editor/src/core/core.ts b/packages/core-editor/src/core/core.ts index 9857164b..b917ce2e 100644 --- a/packages/core-editor/src/core/core.ts +++ b/packages/core-editor/src/core/core.ts @@ -10,13 +10,13 @@ import { } from "@nanoforge-dev/common"; import { type ECSClientLibrary } from "@nanoforge-dev/ecs-client"; -import { type ApplicationConfig } from "../application/application-config"; -import type { IApplicationOptions } from "../application/application-options.type"; -import { type EditableApplicationContext } from "../common/context/contexts/application.editable-context"; -import { EditableExecutionContext } from "../common/context/contexts/executions/execution.editable-context"; -import { type EditableLibraryContext } from "../common/context/contexts/library.editable-context"; +import { type ApplicationConfig } from "../../../core/src/application/application-config"; +import type { IApplicationOptions } from "../../../core/src/application/application-options.type"; +import { type EditableApplicationContext } from "../../../core/src/common/context/contexts/application.editable-context"; +import { EditableExecutionContext } from "../../../core/src/common/context/contexts/executions/execution.editable-context"; +import { type EditableLibraryContext } from "../../../core/src/common/context/contexts/library.editable-context"; +import { ConfigRegistry } from "../../../core/src/config/config-registry"; import { type IEditorRunOptions } from "../common/context/options.type"; -import { ConfigRegistry } from "../config/config-registry"; import { CoreEditor } from "../editor/core-editor"; export class Core { diff --git a/packages/core-editor/test/config-registry.spec.ts b/packages/core-editor/test/config-registry.spec.ts deleted file mode 100644 index 0a1e2844..00000000 --- a/packages/core-editor/test/config-registry.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Expose } from "class-transformer"; -import { IsString } from "class-validator"; -import { describe, expect, it } from "vitest"; - -import { ConfigRegistry } from "../src/config/config-registry"; - -class ValidConfig { - @Expose() - @IsString() - name!: string; -} - -class OptionalConfig { - @Expose() - @IsString() - name!: string; - - @Expose() - host?: string; -} - -describe("ConfigRegistry", () => { - describe("registerConfig", () => { - it("should return a transformed config instance when env is valid", async () => { - const registry = new ConfigRegistry({ name: "hello" }); - const config = await registry.registerConfig(ValidConfig); - expect(config).toBeInstanceOf(ValidConfig); - expect(config.name).toBe("hello"); - }); - - it("should exclude values not decorated with @Expose", async () => { - const registry = new ConfigRegistry({ name: "hello", extra: "ignored" }); - const config = await registry.registerConfig(ValidConfig); - expect((config as any)["extra"]).toBeUndefined(); - }); - - it("should throw when a required field is missing", async () => { - const registry = new ConfigRegistry({}); - await expect(registry.registerConfig(ValidConfig)).rejects.toThrow(); - }); - - it("should throw when a field has the wrong type", async () => { - const registry = new ConfigRegistry({ name: 42 }); - await expect(registry.registerConfig(ValidConfig)).rejects.toThrow(); - }); - - it("should map multiple env fields correctly", async () => { - const registry = new ConfigRegistry({ name: "world", host: "localhost" }); - const config = await registry.registerConfig(OptionalConfig); - expect(config.name).toBe("world"); - expect(config.host).toBe("localhost"); - }); - }); -}); diff --git a/packages/core-editor/test/editable-library-manager.spec.ts b/packages/core-editor/test/editable-library-manager.spec.ts deleted file mode 100644 index 0e808baa..00000000 --- a/packages/core-editor/test/editable-library-manager.spec.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { COMPONENT_SYSTEM_LIBRARY, type ILibrary, LibraryStatusEnum } from "@nanoforge-dev/common"; -import { beforeEach, describe, expect, it } from "vitest"; - -import { Library } from "../../common/src/library/libraries/library"; -import { EditableLibraryManager } from "../src/common/library/manager/library.manager"; - -class StubLibrary extends Library { - private readonly _name: string; - - constructor(name: string, options?: ConstructorParameters[0]) { - super(options); - this._name = name; - } - - get __name(): string { - return this._name; - } -} - -class StubRunnerLibrary extends StubLibrary { - async __run(): Promise {} -} - -class StubMutableLibrary extends StubLibrary { - mute(): void {} -} - -describe("EditableLibraryManager", () => { - let manager: EditableLibraryManager; - - beforeEach(() => { - manager = new EditableLibraryManager(); - }); - - describe("typed setters and getters", () => { - it("should store and retrieve a component system library", () => { - const lib = new StubLibrary("ComponentSystem"); - manager.setComponentSystem(lib as any); - expect(manager.getComponentSystem().library).toBe(lib); - }); - - it("should store and retrieve a graphics library", () => { - const lib = new StubLibrary("Graphics"); - manager.setGraphics(lib as any); - expect(manager.getGraphics().library).toBe(lib); - }); - - it("should store and retrieve an asset manager library", () => { - const lib = new StubLibrary("AssetManager"); - manager.setAssetManager(lib as any); - expect(manager.getAssetManager().library).toBe(lib); - }); - - it("should store and retrieve a network library", () => { - const lib = new StubLibrary("Network"); - manager.setNetwork(lib as any); - expect(manager.getNetwork().library).toBe(lib); - }); - - it("should store and retrieve an input library", () => { - const lib = new StubLibrary("Input"); - manager.setInput(lib as any); - expect(manager.getInput().library).toBe(lib); - }); - - it("should store and retrieve a sound library", () => { - const lib = new StubLibrary("Sound"); - manager.setSound(lib as any); - expect(manager.getSound().library).toBe(lib); - }); - - it("should store and retrieve a music library", () => { - const lib = new StubLibrary("Music"); - manager.setMusic(lib as any); - expect(manager.getMusic().library).toBe(lib); - }); - - it("should throw when getting a typed library that was not set", () => { - expect(() => manager.getComponentSystem()).toThrow(); - }); - }); - - describe("set and get (custom symbol)", () => { - it("should store and retrieve a library by Symbol.for key", () => { - const sym = Symbol.for("customLib"); - const lib = new StubLibrary("Custom"); - - manager.setAssetManager(new StubLibrary("Asset") as any); - manager.set(sym, lib as unknown as ILibrary); - - expect(manager.get(sym).library).toBe(lib); - }); - }); - - describe("getLibraries", () => { - it("should return the list of all set libraries", () => { - const lib = new StubLibrary("ComponentSystem"); - manager.setComponentSystem(lib as any); - const libs = manager.getLibraries().filter(Boolean); - expect(libs.some((h) => h.library === (lib as unknown as ILibrary))).toBe(true); - }); - }); - - describe("getInitLibraries", () => { - it("should return libraries in dependency order", () => { - const libA = new StubLibrary("A", { dependencies: [COMPONENT_SYSTEM_LIBRARY] }); - const libB = new StubLibrary("B"); - - manager.setComponentSystem(libB as any); - manager.setGraphics(libA as any); - - const order = manager.getInitLibraries().map((h) => h.library.__name); - const idxB = order.indexOf("B"); - const idxA = order.indexOf("A"); - - expect(idxB).toBeLessThan(idxA); - }); - - it("should return all set libraries", () => { - manager.setAssetManager(new StubLibrary("Asset") as any); - manager.setGraphics(new StubLibrary("Graphics") as any); - - expect(manager.getInitLibraries().length).toBe(2); - }); - }); - - describe("getClearLibraries", () => { - it("should return libraries in reverse dependency order", () => { - const libA = new StubLibrary("A", { dependencies: [COMPONENT_SYSTEM_LIBRARY] }); - const libB = new StubLibrary("B"); - - manager.setComponentSystem(libB as any); - manager.setGraphics(libA as any); - - const order = manager.getClearLibraries().map((h) => h.library.__name); - const idxA = order.indexOf("A"); - const idxB = order.indexOf("B"); - - expect(idxA).toBeLessThan(idxB); - }); - }); - - describe("getExecutionLibraries", () => { - it("should only return libraries that implement __run", () => { - manager.setComponentSystem(new StubLibrary("NotARunner") as any); - manager.setGraphics(new StubRunnerLibrary("Runner") as any); - - const runners = manager.getExecutionLibraries(); - expect(runners.every((h) => typeof (h.library as any).__run === "function")).toBe(true); - expect(runners.some((h) => h.library.__name === "Runner")).toBe(true); - expect(runners.some((h) => h.library.__name === "NotARunner")).toBe(false); - }); - - it("should return empty when no runner libraries are set", () => { - manager.setComponentSystem(new StubLibrary("Static") as any); - expect(manager.getExecutionLibraries()).toHaveLength(0); - }); - }); - - describe("getMutableLibraries", () => { - it("should only return libraries that implement mute", () => { - manager.setSound(new StubMutableLibrary("MutableSound") as any); - manager.setGraphics(new StubLibrary("NonMutableGraphics") as any); - - const mutable = manager.getMutableLibraries(); - expect(mutable.some((h) => h.library.__name === "MutableSound")).toBe(true); - expect(mutable.some((h) => h.library.__name === "NonMutableGraphics")).toBe(false); - }); - - it("should return empty when no mutable libraries are set", () => { - manager.setGraphics(new StubLibrary("Graphics") as any); - expect(manager.getMutableLibraries()).toHaveLength(0); - }); - }); - - describe("library context status", () => { - it("should start with UNLOADED status", () => { - manager.setComponentSystem(new StubLibrary("Comp") as any); - expect(manager.getComponentSystem().context.status).toBe(LibraryStatusEnum.UNLOADED); - }); - }); -}); diff --git a/packages/core-editor/test/relationship.spec.ts b/packages/core-editor/test/relationship.spec.ts deleted file mode 100644 index 776fa493..00000000 --- a/packages/core-editor/test/relationship.spec.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { type ILibrary, LibraryContext, LibraryHandle } from "@nanoforge-dev/common"; -import { describe, expect, it } from "vitest"; - -import { Library } from "../../common/src/library/libraries/library"; -import { Relationship } from "../src/common/library/relationship-functions"; - -class StubLibrary extends Library { - private readonly _name: string; - - constructor(name: string, options?: ConstructorParameters[0]) { - super(options); - this._name = name; - } - - get __name(): string { - return this._name; - } -} - -const makeHandle = ( - sym: symbol, - name: string, - options?: ConstructorParameters[0], -): LibraryHandle => { - return new LibraryHandle( - sym, - new StubLibrary(name, options) as unknown as ILibrary, - new LibraryContext(), - ); -}; - -describe("Relationship.getLibrariesByDependencies", () => { - it("should return libraries in same order when no dependencies are declared", () => { - const symA = Symbol("A"); - const symB = Symbol("B"); - const handleA = makeHandle(symA, "A"); - const handleB = makeHandle(symB, "B"); - - const result = Relationship.getLibrariesByDependencies([handleA, handleB]); - expect(result.map((h) => h.library.__name)).toEqual(["A", "B"]); - }); - - it("should put a dependency before the library that depends on it", () => { - const symA = Symbol("A"); - const symB = Symbol("B"); - const handleB = makeHandle(symB, "B"); - const handleA = makeHandle(symA, "A", { dependencies: [symB] }); - - const result = Relationship.getLibrariesByDependencies([handleA, handleB]); - const names = result.map((h) => h.library.__name); - expect(names.indexOf("B")).toBeLessThan(names.indexOf("A")); - }); - - it("should not duplicate a shared dependency", () => { - const symDep = Symbol("Dep"); - const symA = Symbol("A"); - const symB = Symbol("B"); - const handleDep = makeHandle(symDep, "Dep"); - const handleA = makeHandle(symA, "A", { dependencies: [symDep] }); - const handleB = makeHandle(symB, "B", { dependencies: [symDep] }); - - const result = Relationship.getLibrariesByDependencies([handleA, handleB, handleDep]); - const names = result.map((h) => h.library.__name); - expect(names.filter((n) => n === "Dep")).toHaveLength(1); - }); - - it("should return libraries in reverse dependency order when reverse=true", () => { - const symA = Symbol("A"); - const symB = Symbol("B"); - const handleB = makeHandle(symB, "B"); - const handleA = makeHandle(symA, "A", { dependencies: [symB] }); - - const result = Relationship.getLibrariesByDependencies([handleA, handleB], true); - const names = result.map((h) => h.library.__name); - expect(names.indexOf("A")).toBeLessThan(names.indexOf("B")); - }); - - it("should throw on circular dependencies", () => { - const symA = Symbol("A"); - const symB = Symbol("B"); - const handleA = makeHandle(symA, "A", { dependencies: [symB] }); - const handleB = makeHandle(symB, "B", { dependencies: [symA] }); - - expect(() => Relationship.getLibrariesByDependencies([handleA, handleB])).toThrow( - /[Cc]ircular/, - ); - }); -}); - -describe("Relationship.getLibrariesByRun", () => { - it("should return all runner libraries when no ordering is specified", () => { - const symA = Symbol("A"); - const symB = Symbol("B"); - const handleA = makeHandle(symA, "A"); - const handleB = makeHandle(symB, "B"); - - const result = Relationship.getLibrariesByRun([handleA, handleB]); - expect(result).toHaveLength(2); - }); - - it("should place a library before another when runBefore is set", () => { - const symA = Symbol("A"); - const symB = Symbol("B"); - const handleA = makeHandle(symA, "A", { runBefore: [symB] }); - const handleB = makeHandle(symB, "B"); - - const result = Relationship.getLibrariesByRun([handleA, handleB]); - const names = result.map((h) => h.library.__name); - expect(names.indexOf("B")).toBeLessThan(names.indexOf("A")); - }); - - it("should place a library after another when runAfter is set", () => { - const symA = Symbol("A"); - const symB = Symbol("B"); - const handleA = makeHandle(symA, "A"); - const handleB = makeHandle(symB, "B", { runAfter: [symA] }); - - const result = Relationship.getLibrariesByRun([handleA, handleB]); - const names = result.map((h) => h.library.__name); - expect(names.indexOf("B")).toBeLessThan(names.indexOf("A")); - }); - - it("should throw on circular run dependencies", () => { - const symA = Symbol("A"); - const symB = Symbol("B"); - const handleA = makeHandle(symA, "A", { runBefore: [symB] }); - const handleB = makeHandle(symB, "B", { runBefore: [symA] }); - - expect(() => Relationship.getLibrariesByRun([handleA, handleB])).toThrow(/[Cc]ircular/); - }); - - it("should return empty array for empty input", () => { - expect(Relationship.getLibrariesByRun([])).toHaveLength(0); - }); -}); diff --git a/packages/core-editor/tsconfig.json b/packages/core-editor/tsconfig.json index 9e6d724b..2a9635c8 100644 --- a/packages/core-editor/tsconfig.json +++ b/packages/core-editor/tsconfig.json @@ -2,5 +2,10 @@ "$schema": "https://json.schemastore.org/tsconfig.json", "extends": "../../tsconfig.json", "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist"], + "compilerOptions": { + "paths": { + "@core/*": ["../core/src"] + } + } } diff --git a/packages/core/src/application/application-config.ts b/packages/core/src/application/application-config.ts index 82d28bed..7eeede0c 100644 --- a/packages/core/src/application/application-config.ts +++ b/packages/core/src/application/application-config.ts @@ -31,8 +31,8 @@ export class ApplicationConfig { this._libraryManager.set(sym, library); } - public getComponentSystemLibrary() { - return this._libraryManager.getComponentSystem(); + public getComponentSystemLibrary() { + return this._libraryManager.getComponentSystem(); } public useComponentSystemLibrary(library: IComponentSystemLibrary) { From 1d44aecc8cd7213cabc1b858b0b5a5b4e0ac77be Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Tue, 31 Mar 2026 11:47:43 +0900 Subject: [PATCH 12/15] fix(core-editor): version as str --- packages/core-editor/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-editor/package.json b/packages/core-editor/package.json index c2fe4a6a..74bd0ece 100644 --- a/packages/core-editor/package.json +++ b/packages/core-editor/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@nanoforge-dev/core-editor", - "version": "0.0", + "version": "0.0.0", "description": "NanoForge Engine - Core Editor", "keywords": [ "nanoforge", From 3bafec1ffa7127aa017db6417a58186f3e32f2e1 Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Tue, 31 Mar 2026 15:04:26 +0900 Subject: [PATCH 13/15] fix(core-editor): review --- packages/core-editor/CHANGELOG.md | 14 -------------- packages/core-editor/README.md | 26 ++++++-------------------- packages/core-editor/tsconfig.json | 7 +------ 3 files changed, 7 insertions(+), 40 deletions(-) diff --git a/packages/core-editor/CHANGELOG.md b/packages/core-editor/CHANGELOG.md index 53aaa9de..e69de29b 100644 --- a/packages/core-editor/CHANGELOG.md +++ b/packages/core-editor/CHANGELOG.md @@ -1,14 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -## Documentation - -## Bug Fixes - -## Documentation - -## Features - -## Refactor - diff --git a/packages/core-editor/README.md b/packages/core-editor/README.md index af648541..7daa7a82 100644 --- a/packages/core-editor/README.md +++ b/packages/core-editor/README.md @@ -5,18 +5,20 @@


- npm version - npm downloads + npm version + npm downloads Tests status Documentation status - Last commit + Last commit Contributors

## About -`@nanoforge-dev/core-editor` is a core package that contains game main loop. It is used to initialize the game and run it. +`@nanoforge-dev/core-editor` is a package made to allow the editor to make change to a game even if it's already compiled and running. + +If you want a core to run your game use the `@nanoforge-dev/core`. ## Installation @@ -29,22 +31,6 @@ pnpm add @nanoforge-dev/core-editor bun add @nanoforge-dev/core-editor ``` -## Example usage - -Initialize the game in your main file. - -```ts -import { IEditorRunOptions, NanoforgeFactory } from "@nanoforge-dev/core-editor"; - -export async function main(options: IEditorRunOptions) { - const app = NanoforgeFactory.createClient(); - - await app.init(options); - - await app.run(); -} -``` - ## Links - [GitHub][source] diff --git a/packages/core-editor/tsconfig.json b/packages/core-editor/tsconfig.json index 2a9635c8..9e6d724b 100644 --- a/packages/core-editor/tsconfig.json +++ b/packages/core-editor/tsconfig.json @@ -2,10 +2,5 @@ "$schema": "https://json.schemastore.org/tsconfig.json", "extends": "../../tsconfig.json", "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist"], - "compilerOptions": { - "paths": { - "@core/*": ["../core/src"] - } - } + "exclude": ["node_modules", "dist"] } From 5ade84d9d670d3e860c8f6f35238ff11d05b7f83 Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Tue, 31 Mar 2026 16:14:00 +0900 Subject: [PATCH 14/15] fix(core-editor): review --- .../core-editor/src/common/context/options.type.ts | 10 +++++----- packages/core-editor/test/editor-feature.spec.ts | 2 +- .../helpers/event-emitter.ts} | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) rename packages/core-editor/{src/editor/event-emitter.manager.ts => test/helpers/event-emitter.ts} (96%) diff --git a/packages/core-editor/src/common/context/options.type.ts b/packages/core-editor/src/common/context/options.type.ts index 1fc49839..eabf7e62 100644 --- a/packages/core-editor/src/common/context/options.type.ts +++ b/packages/core-editor/src/common/context/options.type.ts @@ -1,4 +1,4 @@ -import { type EventEmitter } from "../../editor/event-emitter.manager"; +import { type IEventEmitter } from "./event-emitter.type"; import { type Save } from "./save.type"; export type IEditorRunOptions = IEditorRunClientOptions | IEditorRunServerOptions; @@ -9,8 +9,8 @@ export interface IEditorRunClientOptions { env: Record; editor: { save: Save; - coreEvents: EventEmitter; - editorEvents: EventEmitter; + coreEvents: IEventEmitter; + editorEvents: IEventEmitter; }; } export interface IEditorRunServerOptions { @@ -18,7 +18,7 @@ export interface IEditorRunServerOptions { env: Record; editor: { save: Save; - coreEvents: EventEmitter; - editorEvents: EventEmitter; + coreEvents: IEventEmitter; + editorEvents: IEventEmitter; }; } diff --git a/packages/core-editor/test/editor-feature.spec.ts b/packages/core-editor/test/editor-feature.spec.ts index bd442f78..c02f1a03 100644 --- a/packages/core-editor/test/editor-feature.spec.ts +++ b/packages/core-editor/test/editor-feature.spec.ts @@ -5,7 +5,7 @@ import { EventTypeEnum } from "../src/common/context/event-emitter.type"; import type { IEditorRunOptions } from "../src/common/context/options.type"; import { type Save, type SaveComponent, type SaveEntity } from "../src/common/context/save.type"; import { CoreEditor } from "../src/editor/core-editor"; -import { EventEmitter } from "../src/editor/event-emitter.manager"; +import { EventEmitter } from "./helpers/event-emitter"; describe("EditorFeatures", () => { afterEach(() => { diff --git a/packages/core-editor/src/editor/event-emitter.manager.ts b/packages/core-editor/test/helpers/event-emitter.ts similarity index 96% rename from packages/core-editor/src/editor/event-emitter.manager.ts rename to packages/core-editor/test/helpers/event-emitter.ts index 3498d826..95c6eb62 100644 --- a/packages/core-editor/src/editor/event-emitter.manager.ts +++ b/packages/core-editor/test/helpers/event-emitter.ts @@ -2,7 +2,7 @@ import { type EventTypeEnum, type IEventEmitter, type ListenerType, -} from "../common/context/event-emitter.type"; +} from "../../src/common/context/event-emitter.type"; export class EventEmitter implements IEventEmitter { public listeners: Record = {}; From 206f5b7cfaec086f2b2b0cb91d6c44d57939cd76 Mon Sep 17 00:00:00 2001 From: Tchips46 Date: Thu, 2 Apr 2026 09:06:59 +0900 Subject: [PATCH 15/15] fix(core-editor): regen pnpm lock --- pnpm-lock.yaml | 2382 +++++++++++++++++++++++++++--------------------- 1 file changed, 1324 insertions(+), 1058 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3d326ec2..30ece6fb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,19 +15,19 @@ catalogs: version: 20.5.0 '@commitlint/config-conventional': specifier: ^20.4.3 - version: 20.4.3 + version: 20.5.0 '@favware/cliff-jumper': specifier: ^6.0.0 version: 6.0.0 '@nanoforge-dev/actions': specifier: ^1.1.0 - version: 1.1.0 + version: 1.2.3 husky: specifier: ^9.1.7 version: 9.1.7 lint-staged: specifier: ^16.3.3 - version: 16.3.3 + version: 16.4.0 config: class-transformer: specifier: ^0.5.1 @@ -41,17 +41,17 @@ catalogs: version: 25.5.0 turbo: specifier: ^2.8.16 - version: 2.8.16 + version: 2.9.3 typescript: specifier: ^5.9.3 version: 5.9.3 docs: typedoc: specifier: ^0.28.17 - version: 0.28.17 + version: 0.28.18 typedoc-plugin-markdown: specifier: ^4.10.0 - version: 4.10.0 + version: 4.11.0 graphics: konva: specifier: ^10.2.3 @@ -65,7 +65,7 @@ catalogs: version: 6.0.2 eslint: specifier: ^10.0.3 - version: 10.0.3 + version: 10.1.0 eslint-config-prettier: specifier: ^10.1.8 version: 10.1.8 @@ -86,7 +86,7 @@ catalogs: version: 3.8.1 typescript-eslint: specifier: ^8.57.1 - version: 8.57.1 + version: 8.58.0 network: '@mapbox/node-pre-gyp': specifier: ^2.0.3 @@ -99,14 +99,14 @@ catalogs: version: 0.4.7 ws: specifier: ^8.19.0 - version: 8.19.0 + version: 8.20.0 test: '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18 + version: 4.1.2 vitest: specifier: ^4.0.18 - version: 4.0.18 + version: 4.1.2 importers: @@ -118,13 +118,13 @@ importers: devDependencies: '@commitlint/cli': specifier: catalog:ci - version: 20.5.0(@types/node@25.5.0)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0)(typescript@5.9.3) + version: 20.5.0(@types/node@25.5.0)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(typescript@5.9.3) '@commitlint/config-conventional': specifier: catalog:ci - version: 20.4.3 + version: 20.5.0 '@nanoforge-dev/actions': specifier: catalog:ci - version: 1.1.0 + version: 1.2.3 '@nanoforge-dev/utils-eslint-config': specifier: workspace:* version: link:utils/eslint-config @@ -139,37 +139,37 @@ importers: version: 25.5.0 '@vitest/coverage-v8': specifier: catalog:test - version: 4.0.18(vitest@4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2)) + version: 4.1.2(vitest@4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3))) eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) husky: specifier: catalog:ci version: 9.1.7 lint-staged: specifier: catalog:ci - version: 16.3.3 + version: 16.4.0 prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) turbo: specifier: catalog:core - version: 2.8.16 + version: 2.9.3 typedoc: specifier: catalog:docs - version: 0.28.17(typescript@5.9.3) + version: 0.28.18(typescript@5.9.3) typedoc-plugin-markdown: specifier: catalog:docs - version: 4.10.0(typedoc@0.28.17(typescript@5.9.3)) + version: 4.11.0(typedoc@0.28.18(typescript@5.9.3)) typescript: specifier: catalog:core version: 5.9.3 vitest: specifier: catalog:test - version: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) e2e/game: devDependencies: @@ -265,10 +265,10 @@ importers: version: 6.0.2(prettier@3.8.1) eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) lint-staged: specifier: catalog:ci - version: 16.3.3 + version: 16.4.0 prettier: specifier: catalog:lint version: 3.8.1 @@ -296,19 +296,19 @@ importers: version: 6.0.2(prettier@3.8.1) eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: catalog:core version: 5.9.3 vitest: specifier: catalog:test - version: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) packages/common: devDependencies: @@ -326,19 +326,19 @@ importers: version: 6.0.2(prettier@3.8.1) eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: catalog:core version: 5.9.3 vitest: specifier: catalog:test - version: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) packages/config: dependencies: @@ -363,13 +363,13 @@ importers: version: 6.0.2(prettier@3.8.1) eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: catalog:core version: 5.9.3 @@ -406,19 +406,19 @@ importers: version: 6.0.2(prettier@3.8.1) eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: catalog:core version: 5.9.3 vitest: specifier: catalog:test - version: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) packages/core-editor: dependencies: @@ -455,19 +455,19 @@ importers: version: 6.0.2(prettier@3.8.1) eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: catalog:core version: 5.9.3 vitest: specifier: catalog:test - version: 4.0.18(@types/node@25.3.5)(jiti@2.6.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) packages/ecs-client: dependencies: @@ -501,19 +501,19 @@ importers: version: 25.5.0 eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: catalog:core version: 5.9.3 vitest: specifier: catalog:test - version: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) packages/ecs-lib: dependencies: @@ -538,19 +538,19 @@ importers: version: 25.5.0 eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: catalog:core version: 5.9.3 vitest: specifier: catalog:test - version: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) packages/ecs-server: dependencies: @@ -584,19 +584,19 @@ importers: version: 25.5.0 eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: catalog:core version: 5.9.3 vitest: specifier: catalog:test - version: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) packages/graphics-2d: dependencies: @@ -621,19 +621,19 @@ importers: version: 6.0.2(prettier@3.8.1) eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: catalog:core version: 5.9.3 vitest: specifier: catalog:test - version: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) packages/input: dependencies: @@ -655,19 +655,19 @@ importers: version: 6.0.2(prettier@3.8.1) eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: catalog:core version: 5.9.3 vitest: specifier: catalog:test - version: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) packages/music: dependencies: @@ -689,19 +689,19 @@ importers: version: 6.0.2(prettier@3.8.1) eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: catalog:core version: 5.9.3 vitest: specifier: catalog:test - version: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) packages/network-client: dependencies: @@ -726,19 +726,19 @@ importers: version: 6.0.2(prettier@3.8.1) eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: catalog:core version: 5.9.3 vitest: specifier: catalog:test - version: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) packages/network-server: dependencies: @@ -756,7 +756,7 @@ importers: version: 0.4.7 ws: specifier: catalog:network - version: 8.19.0 + version: 8.20.0 devDependencies: '@favware/cliff-jumper': specifier: catalog:ci @@ -775,19 +775,19 @@ importers: version: 8.18.1 eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: catalog:core version: 5.9.3 vitest: specifier: catalog:test - version: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) packages/sound: dependencies: @@ -809,46 +809,46 @@ importers: version: 6.0.2(prettier@3.8.1) eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: catalog:core version: 5.9.3 vitest: specifier: catalog:test - version: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) utils/eslint-config: dependencies: '@eslint/js': specifier: catalog:lint - version: 10.0.1(eslint@10.0.3(jiti@2.6.1)) + version: 10.0.1(eslint@10.1.0(jiti@2.6.1)) '@favware/cliff-jumper': specifier: catalog:ci version: 6.0.0 eslint-config-prettier: specifier: catalog:lint - version: 10.1.8(eslint@10.0.3(jiti@2.6.1)) + version: 10.1.8(eslint@10.1.0(jiti@2.6.1)) eslint-formatter-pretty: specifier: catalog:lint version: 7.0.0 eslint-plugin-format: specifier: catalog:lint - version: 2.0.1(eslint@10.0.3(jiti@2.6.1)) + version: 2.0.1(eslint@10.1.0(jiti@2.6.1)) eslint-plugin-prettier: specifier: catalog:lint - version: 5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.0.3(jiti@2.6.1)))(eslint@10.0.3(jiti@2.6.1))(prettier@3.8.1) + version: 5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.1.0(jiti@2.6.1)))(eslint@10.1.0(jiti@2.6.1))(prettier@3.8.1) globals: specifier: catalog:lint version: 17.4.0 typescript-eslint: specifier: catalog:lint - version: 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + version: 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) devDependencies: '@nanoforge-dev/utils-prettier-config': specifier: workspace:* @@ -858,7 +858,7 @@ importers: version: 6.0.2(prettier@3.8.1) eslint: specifier: catalog:lint - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.8.1 @@ -877,23 +877,26 @@ importers: packages: - '@actions/core@2.0.3': - resolution: {integrity: sha512-Od9Thc3T1mQJYddvVPM4QGiLUewdh+3txmDYHHxoNdkqysR1MbCT+rFOtNUxYAz+7+6RIsqipVahY2GJqGPyxA==} + '@actions/core@3.0.0': + resolution: {integrity: sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg==} - '@actions/exec@2.0.0': - resolution: {integrity: sha512-k8ngrX2voJ/RIN6r9xB82NVqKpnMRtxDoiO+g3olkIUpQNqjArXrCQceduQZCQj3P3xm32pChRLqRrtXTlqhIw==} + '@actions/exec@3.0.0': + resolution: {integrity: sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==} - '@actions/github@7.0.0': - resolution: {integrity: sha512-PyGODO938aoBTZd/IfN/+e+Pd5hUcVpyf+thm4CPESLeqhdSkq5QwMTGX9v84XHE1ifmHWBQ60KB8kIgm96opw==} + '@actions/github@9.0.0': + resolution: {integrity: sha512-yJ0RoswsAaKcvkmpCE4XxBRiy/whH2SdTBHWzs0gi4wkqTDhXMChjSdqBz/F4AeiDlP28rQqL33iHb+kjAMX6w==} '@actions/http-client@3.0.2': resolution: {integrity: sha512-JP38FYYpyqvUsz+Igqlc/JG6YO9PaKuvqjM3iGvaLqFnJ7TFmcLyy2IDrY0bI0qCQug8E9K+elv5ZNfw62ZJzA==} - '@actions/io@2.0.0': - resolution: {integrity: sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg==} + '@actions/http-client@4.0.0': + resolution: {integrity: sha512-QuwPsgVMsD6qaPD57GLZi9sqzAZCtiJT8kVBCDpLtxhL5MydQ4gS+DrejtZZPdIYyB1e95uCK9Luyds7ybHI3g==} + + '@actions/io@3.0.2': + resolution: {integrity: sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==} - '@angular-devkit/core@21.2.3': - resolution: {integrity: sha512-i++JVHOijyFckjdYqKbSXUpKnvmO2a0Utt/wQVwiLAT0O9H1hR/2NGPzubB4hnLMNSyVWY8diminaF23mZ0xjA==} + '@angular-devkit/core@21.2.6': + resolution: {integrity: sha512-u5gPTAY7MC02uACQE39xxiFcm1hslF+ih/f2borMWnhER0JNTpHjLiLRXFkq7or7+VVHU30zfhK4XNAuO4WTIg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^5.0.0 @@ -901,13 +904,13 @@ packages: chokidar: optional: true - '@angular-devkit/schematics-cli@21.2.3': - resolution: {integrity: sha512-Xq2kGRgnOoTcE3STO/fZ0h4mayvXs0EKFefMlEsJdM/6mmVF1UfeiDlIwpyMzo9X//AJQfqcS0rd5FDPmT9LNg==} + '@angular-devkit/schematics-cli@21.2.6': + resolution: {integrity: sha512-sJeDQSgWn1tXqmC7mM3cEaAdUI53T1FmIScd7fHr2uRCIgUvXzsV0MdGf38cGhLlQeMZEfIplS+1nRXziCzC1g==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular-devkit/schematics@21.2.3': - resolution: {integrity: sha512-tc/bBloRTVIBWGRiMPln1QbW+2QPj+YnWL/nG79abLKWkdrL9dJLcCRXY7dsPNrxOc/QF+8tVpnr8JofhWL9cQ==} + '@angular-devkit/schematics@21.2.6': + resolution: {integrity: sha512-hk2duJlPJyiMaI9MVWA5XpmlpD9C4n8qgquV/MJ7/n+ZRSwW3w1ndL5qUmA1ki+4Da54v/Rc8Wt5tUS955+93w==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} '@babel/code-frame@7.29.0': @@ -930,8 +933,8 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.0': - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} hasBin: true @@ -956,8 +959,8 @@ packages: engines: {node: '>=v18'} hasBin: true - '@commitlint/config-conventional@20.4.3': - resolution: {integrity: sha512-9RtLySbYQAs8yEqWEqhSZo9nYhbm57jx7qHXtgRmv/nmeQIjjMcwf6Dl+y5UZcGWgWx435TAYBURONaJIuCjWg==} + '@commitlint/config-conventional@20.5.0': + resolution: {integrity: sha512-t3Ni88rFw1XMa4nZHgOKJ8fIAT9M2j5TnKyTqJzsxea7FUetlNdYFus9dz+MhIRZmc16P0PPyEfh6X2d/qw8SA==} engines: {node: '>=v18'} '@commitlint/config-validator@20.5.0': @@ -1016,10 +1019,6 @@ packages: resolution: {integrity: sha512-qD9xfP6dFg5jQ3NMrOhG0/w5y3bBUsVGyJvXxdWEwBm8hyx4WOk3kKXw28T5czBYvyeCVJgJJ6aoJZUWDpaacQ==} engines: {node: '>=v18'} - '@commitlint/types@20.4.3': - resolution: {integrity: sha512-51OWa1Gi6ODOasPmfJPq6js4pZoomima4XLZZCrkldaH2V5Nb3bVhNXPeT6XV0gubbainSpTw4zi68NqAeCNCg==} - engines: {node: '>=v18'} - '@commitlint/types@20.5.0': resolution: {integrity: sha512-ZJoS8oSq2CAZEpc/YI9SulLrdiIyXeHb/OGqGrkUP6Q7YV+0ouNAa7GjqRdXeQPncHQIDz/jbCTlHScvYvO/gA==} engines: {node: '>=v18'} @@ -1057,158 +1056,167 @@ packages: '@dprint/toml@0.7.0': resolution: {integrity: sha512-eFaQTcfxKHB+YyTh83x7GEv+gDPuj9q5NFOTaoj5rZmQTbj6OgjjMxUicmS1R8zYcx8YAq5oA9J3YFa5U6x2gA==} - '@esbuild/aix-ppc64@0.27.3': - resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + '@emnapi/core@1.9.1': + resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} + + '@emnapi/runtime@1.9.1': + resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + + '@emnapi/wasi-threads@1.2.0': + resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + + '@esbuild/aix-ppc64@0.27.4': + resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.3': - resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + '@esbuild/android-arm64@0.27.4': + resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.3': - resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + '@esbuild/android-arm@0.27.4': + resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.3': - resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + '@esbuild/android-x64@0.27.4': + resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.3': - resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + '@esbuild/darwin-arm64@0.27.4': + resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.3': - resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + '@esbuild/darwin-x64@0.27.4': + resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.3': - resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + '@esbuild/freebsd-arm64@0.27.4': + resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.3': - resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + '@esbuild/freebsd-x64@0.27.4': + resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.3': - resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + '@esbuild/linux-arm64@0.27.4': + resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.3': - resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + '@esbuild/linux-arm@0.27.4': + resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.3': - resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + '@esbuild/linux-ia32@0.27.4': + resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.3': - resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + '@esbuild/linux-loong64@0.27.4': + resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.3': - resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + '@esbuild/linux-mips64el@0.27.4': + resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.3': - resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + '@esbuild/linux-ppc64@0.27.4': + resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.3': - resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + '@esbuild/linux-riscv64@0.27.4': + resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.3': - resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + '@esbuild/linux-s390x@0.27.4': + resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.3': - resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + '@esbuild/linux-x64@0.27.4': + resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.3': - resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + '@esbuild/netbsd-arm64@0.27.4': + resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.3': - resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + '@esbuild/netbsd-x64@0.27.4': + resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.3': - resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + '@esbuild/openbsd-arm64@0.27.4': + resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.3': - resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + '@esbuild/openbsd-x64@0.27.4': + resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.3': - resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + '@esbuild/openharmony-arm64@0.27.4': + resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.3': - resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + '@esbuild/sunos-x64@0.27.4': + resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.3': - resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + '@esbuild/win32-arm64@0.27.4': + resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.3': - resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + '@esbuild/win32-ia32@0.27.4': + resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.3': - resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + '@esbuild/win32-x64@0.27.4': + resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1227,8 +1235,8 @@ packages: resolution: {integrity: sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.5.2': - resolution: {integrity: sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ==} + '@eslint/config-helpers@0.5.3': + resolution: {integrity: sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@1.1.1': @@ -1252,10 +1260,6 @@ packages: resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - '@favware/cliff-jumper@6.0.0': resolution: {integrity: sha512-9uXg/fGHFLh4AnG3HCtlrrrmDvUnmr5vrbs7H9pet3WlUCsGGGqeNT0bFb8LG0M0GatYUi9RM/F60p1yn2ndEA==} engines: {node: '>=v18'} @@ -1288,8 +1292,8 @@ packages: resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} engines: {node: '>=18'} - '@inquirer/ansi@2.0.3': - resolution: {integrity: sha512-g44zhR3NIKVs0zUesa4iMzExmZpLUdTLRMCStqX3GE5NT6VkPcxQGJ+uC8tDgBUC/vB1rUhUd55cOf++4NZcmw==} + '@inquirer/ansi@2.0.4': + resolution: {integrity: sha512-DpcZrQObd7S0R/U3bFdkcT5ebRwbTTC4D3tCc1vsJizmgPLxNJBo+AAFmrZwe8zk30P2QzgzGWZ3Q9uJwWuhIg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} '@inquirer/checkbox@4.3.2': @@ -1301,8 +1305,8 @@ packages: '@types/node': optional: true - '@inquirer/checkbox@5.1.0': - resolution: {integrity: sha512-/HjF1LN0a1h4/OFsbGKHNDtWICFU/dqXCdym719HFTyJo9IG7Otr+ziGWc9S0iQuohRZllh+WprSgd5UW5Fw0g==} + '@inquirer/checkbox@5.1.2': + resolution: {integrity: sha512-PubpMPO2nJgMufkoB3P2wwxNXEMUXnBIKi/ACzDUYfaoPuM7gSTmuxJeMscoLVEsR4qqrCMf5p0SiYGWnVJ8kw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1319,8 +1323,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@6.0.8': - resolution: {integrity: sha512-Di6dgmiZ9xCSUxWUReWTqDtbhXCuG2MQm2xmgSAIruzQzBqNf49b8E07/vbCYY506kDe8BiwJbegXweG8M1klw==} + '@inquirer/confirm@6.0.10': + resolution: {integrity: sha512-tiNyA73pgpQ0FQ7axqtoLUe4GDYjNCDcVsbgcA5anvwg2z6i+suEngLKKJrWKJolT//GFPZHwN30binDIHgSgQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1337,8 +1341,8 @@ packages: '@types/node': optional: true - '@inquirer/core@11.1.5': - resolution: {integrity: sha512-QQPAX+lka8GyLcZ7u7Nb1h6q72iZ/oy0blilC3IB2nSt1Qqxp7akt94Jqhi/DzARuN3Eo9QwJRvtl4tmVe4T5A==} + '@inquirer/core@11.1.7': + resolution: {integrity: sha512-1BiBNDk9btIwYIzNZpkikIHXWeNzNncJePPqwDyVMhXhD1ebqbpn1mKGctpoqAbzywZfdG0O4tvmsGIcOevAPQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1355,8 +1359,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@5.0.8': - resolution: {integrity: sha512-sLcpbb9B3XqUEGrj1N66KwhDhEckzZ4nI/W6SvLXyBX8Wic3LDLENlWRvkOGpCPoserabe+MxQkpiMoI8irvyA==} + '@inquirer/editor@5.0.10': + resolution: {integrity: sha512-VJx4XyaKea7t8hEApTw5dxeIyMtWXre2OiyJcICCRZI4hkoHsMoCnl/KbUnJJExLbH9csLLHMVR144ZhFE1CwA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1373,8 +1377,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@5.0.8': - resolution: {integrity: sha512-QieW3F1prNw3j+hxO7/NKkG1pk3oz7pOB6+5Upwu3OIwADfPX0oZVppsqlL+Vl/uBHHDSOBY0BirLctLnXwGGg==} + '@inquirer/expand@5.0.10': + resolution: {integrity: sha512-fC0UHJPXsTRvY2fObiwuQYaAnHrp3aDqfwKUJSdfpgv18QUG054ezGbaRNStk/BKD5IPijeMKWej8VV8O5Q/eQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1391,8 +1395,8 @@ packages: '@types/node': optional: true - '@inquirer/external-editor@2.0.3': - resolution: {integrity: sha512-LgyI7Agbda74/cL5MvA88iDpvdXI2KuMBCGRkbCl2Dg1vzHeOgs+s0SDcXV7b+WZJrv2+ERpWSM65Fpi9VfY3w==} + '@inquirer/external-editor@2.0.4': + resolution: {integrity: sha512-Prenuv9C1PHj2Itx0BcAOVBTonz02Hc2Nd2DbU67PdGUaqn0nPCnV34oDyyoaZHnmfRxkpuhh/u51ThkrO+RdA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1404,8 +1408,8 @@ packages: resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} engines: {node: '>=18'} - '@inquirer/figures@2.0.3': - resolution: {integrity: sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g==} + '@inquirer/figures@2.0.4': + resolution: {integrity: sha512-eLBsjlS7rPS3WEhmOmh1znQ5IsQrxWzxWDxO51e4urv+iVrSnIHbq4zqJIOiyNdYLa+BVjwOtdetcQx1lWPpiQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} '@inquirer/input@4.3.1': @@ -1417,8 +1421,8 @@ packages: '@types/node': optional: true - '@inquirer/input@5.0.8': - resolution: {integrity: sha512-p0IJslw0AmedLEkOU+yrEX3Aj2RTpQq7ZOf8nc1DIhjzaxRWrrgeuE5Kyh39fVRgtcACaMXx/9WNo8+GjgBOfw==} + '@inquirer/input@5.0.10': + resolution: {integrity: sha512-nvZ6qEVeX/zVtZ1dY2hTGDQpVGD3R7MYPLODPgKO8Y+RAqxkrP3i/3NwF3fZpLdaMiNuK0z2NaYIx9tPwiSegQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1435,8 +1439,8 @@ packages: '@types/node': optional: true - '@inquirer/number@4.0.8': - resolution: {integrity: sha512-uGLiQah9A0F9UIvJBX52m0CnqtLaym0WpT9V4YZrjZ+YRDKZdwwoEPz06N6w8ChE2lrnsdyhY9sL+Y690Kh9gQ==} + '@inquirer/number@4.0.10': + resolution: {integrity: sha512-Ht8OQstxiS3APMGjHV0aYAjRAysidWdwurWEo2i8yI5xbhOBWqizT0+MU1S2GCcuhIBg+3SgWVjEoXgfhY+XaA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1453,8 +1457,8 @@ packages: '@types/node': optional: true - '@inquirer/password@5.0.8': - resolution: {integrity: sha512-zt1sF4lYLdvPqvmvHdmjOzuUUjuCQ897pdUCO8RbXMUDKXJTTyOQgtn23le+jwcb+MpHl3VAFvzIdxRAf6aPlA==} + '@inquirer/password@5.0.10': + resolution: {integrity: sha512-QbNyvIE8q2GTqKLYSsA8ATG+eETo+m31DSR0+AU7x3d2FhaTWzqQek80dj3JGTo743kQc6mhBR0erMjYw5jQ0A==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1471,8 +1475,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@8.3.0': - resolution: {integrity: sha512-JAj66kjdH/F1+B7LCigjARbwstt3SNUOSzMdjpsvwJmzunK88gJeXmcm95L9nw1KynvFVuY4SzXh/3Y0lvtgSg==} + '@inquirer/prompts@8.3.2': + resolution: {integrity: sha512-yFroiSj2iiBFlm59amdTvAcQFvWS6ph5oKESls/uqPBect7rTU2GbjyZO2DqxMGuIwVA8z0P4K6ViPcd/cp+0w==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1489,8 +1493,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@5.2.4': - resolution: {integrity: sha512-fTuJ5Cq9W286isLxwj6GGyfTjx1Zdk4qppVEPexFuA6yioCCXS4V1zfKroQqw7QdbDPN73xs2DiIAlo55+kBqg==} + '@inquirer/rawlist@5.2.6': + resolution: {integrity: sha512-jfw0MLJ5TilNsa9zlJ6nmRM0ZFVZhhTICt4/6CU2Dv1ndY7l3sqqo1gIYZyMMDw0LvE1u1nzJNisfHEhJIxq5w==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1507,8 +1511,8 @@ packages: '@types/node': optional: true - '@inquirer/search@4.1.4': - resolution: {integrity: sha512-9yPTxq7LPmYjrGn3DRuaPuPbmC6u3fiWcsE9ggfLcdgO/ICHYgxq7mEy1yJ39brVvgXhtOtvDVjDh9slJxE4LQ==} + '@inquirer/search@4.1.6': + resolution: {integrity: sha512-3/6kTRae98hhDevENScy7cdFEuURnSpM3JbBNg8yfXLw88HgTOl+neUuy/l9W0No5NzGsLVydhBzTIxZP7yChQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1525,8 +1529,8 @@ packages: '@types/node': optional: true - '@inquirer/select@5.1.0': - resolution: {integrity: sha512-OyYbKnchS1u+zRe14LpYrN8S0wH1vD0p2yKISvSsJdH2TpI87fh4eZdWnpdbrGauCRWDph3NwxRmM4Pcm/hx1Q==} + '@inquirer/select@5.1.2': + resolution: {integrity: sha512-kTK8YIkHV+f02y7bWCh7E0u2/11lul5WepVTclr3UMBtBr05PgcZNWfMa7FY57ihpQFQH/spLMHTcr0rXy50tA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1543,8 +1547,8 @@ packages: '@types/node': optional: true - '@inquirer/type@4.0.3': - resolution: {integrity: sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw==} + '@inquirer/type@4.0.4': + resolution: {integrity: sha512-PamArxO3cFJZoOzspzo6cxVlLeIftyBsZw/S9bKY5DzxqJVZgjoj1oP8d0rskKtp7sZxBycsoer1g6UeJV1BBA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1574,8 +1578,8 @@ packages: engines: {node: '>=18'} hasBin: true - '@nanoforge-dev/actions@1.1.0': - resolution: {integrity: sha512-BTZyJ69Ax5nvMYqFRzj4WGvFTUW4W9JSDSaln4DwJmDtS3davkwphuXS85WEghQ1lpbp+gHuOUXu6Xj56gwW2w==} + '@nanoforge-dev/actions@1.2.3': + resolution: {integrity: sha512-YVQ1e3H5MVHGBku2bA+lMLb+mkDXvJvYN228V6L0R+HXxo82X3Y1oVDKzlsnz+GRvYejJXEsY6jzPrV3pzbGwA==} engines: {node: '25'} '@nanoforge-dev/cli@1.3.0': @@ -1599,58 +1603,61 @@ packages: resolution: {integrity: sha512-OMw6k8eh5TlwPIwlbem/SozPCb+lkmHtSIcxI8LqDG0CLwC0YzJ3WIZ0uLuEhATbVSHZXy7tstS92XZV4ZlEFg==} engines: {node: '25'} - '@octokit/auth-token@4.0.0': - resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} - engines: {node: '>= 18'} + '@napi-rs/wasm-runtime@1.1.2': + resolution: {integrity: sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 '@octokit/auth-token@5.1.2': resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} engines: {node: '>= 18'} - '@octokit/core@5.2.2': - resolution: {integrity: sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==} - engines: {node: '>= 18'} + '@octokit/auth-token@6.0.0': + resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} + engines: {node: '>= 20'} '@octokit/core@6.1.6': resolution: {integrity: sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA==} engines: {node: '>= 18'} + '@octokit/core@7.0.6': + resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==} + engines: {node: '>= 20'} + '@octokit/endpoint@10.1.4': resolution: {integrity: sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==} engines: {node: '>= 18'} - '@octokit/endpoint@9.0.6': - resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} - engines: {node: '>= 18'} - - '@octokit/graphql@7.1.1': - resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} - engines: {node: '>= 18'} + '@octokit/endpoint@11.0.3': + resolution: {integrity: sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==} + engines: {node: '>= 20'} '@octokit/graphql@8.2.2': resolution: {integrity: sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==} engines: {node: '>= 18'} - '@octokit/openapi-types@20.0.0': - resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} - - '@octokit/openapi-types@24.2.0': - resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} + '@octokit/graphql@9.0.3': + resolution: {integrity: sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==} + engines: {node: '>= 20'} '@octokit/openapi-types@25.1.0': resolution: {integrity: sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==} - '@octokit/plugin-paginate-rest@9.2.2': - resolution: {integrity: sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==} - engines: {node: '>= 18'} + '@octokit/openapi-types@27.0.0': + resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==} + + '@octokit/plugin-paginate-rest@14.0.0': + resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==} + engines: {node: '>= 20'} peerDependencies: - '@octokit/core': '5' + '@octokit/core': '>=6' - '@octokit/plugin-rest-endpoint-methods@10.4.1': - resolution: {integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==} - engines: {node: '>= 18'} + '@octokit/plugin-rest-endpoint-methods@17.0.0': + resolution: {integrity: sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==} + engines: {node: '>= 20'} peerDependencies: - '@octokit/core': '5' + '@octokit/core': '>=6' '@octokit/plugin-retry@7.2.1': resolution: {integrity: sha512-wUc3gv0D6vNHpGxSaR3FlqJpTXGWgqmk607N9L3LvPL4QjaxDgX/1nY2mGpT37Khn+nlIXdljczkRnNdTTV3/A==} @@ -1658,91 +1665,91 @@ packages: peerDependencies: '@octokit/core': '>=6' - '@octokit/request-error@5.1.1': - resolution: {integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==} - engines: {node: '>= 18'} - '@octokit/request-error@6.1.8': resolution: {integrity: sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==} engines: {node: '>= 18'} - '@octokit/request@8.4.1': - resolution: {integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==} - engines: {node: '>= 18'} + '@octokit/request-error@7.1.0': + resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==} + engines: {node: '>= 20'} + + '@octokit/request@10.0.8': + resolution: {integrity: sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==} + engines: {node: '>= 20'} '@octokit/request@9.2.4': resolution: {integrity: sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==} engines: {node: '>= 18'} - '@octokit/types@12.6.0': - resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} - - '@octokit/types@13.10.0': - resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} - '@octokit/types@14.1.0': resolution: {integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==} - '@oven/bun-darwin-aarch64@1.3.10': - resolution: {integrity: sha512-PXgg5gqcS/rHwa1hF0JdM1y5TiyejVrMHoBmWY/DjtfYZoFTXie1RCFOkoG0b5diOOmUcuYarMpH7CSNTqwj+w==} + '@octokit/types@16.0.0': + resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} + + '@oven/bun-darwin-aarch64@1.3.11': + resolution: {integrity: sha512-/8IzqSu4/OWGRs7Fs2ROzGVwJMFTBQkgAp6sAthkBYoN7OiM4rY/CpPVs2X9w9N1W61CHSkEdNKi8HrLZKfK3g==} cpu: [arm64] os: [darwin] - '@oven/bun-darwin-x64-baseline@1.3.10': - resolution: {integrity: sha512-w1gaTlqU0IJCmJ1X+PGHkdNU1n8Gemx5YKkjhkJIguvFINXEBB5U1KG82QsT65Tk4KyNMfbLTlmy4giAvUoKfA==} + '@oven/bun-darwin-x64-baseline@1.3.11': + resolution: {integrity: sha512-CYjIHWaQG7T4phfjErHr6BiXRs0K/9DqMeiohJmuYSBF+H2m56vFslOenLCguGYQL9jeiiCZBeoVCpwjxZrMgQ==} cpu: [x64] os: [darwin] - '@oven/bun-darwin-x64@1.3.10': - resolution: {integrity: sha512-Nhssuh7GBpP5PiDSOl3+qnoIG7PJo+ec2oomDevnl9pRY6x6aD2gRt0JE+uf+A8Om2D6gjeHCxjEdrw5ZHE8mA==} + '@oven/bun-darwin-x64@1.3.11': + resolution: {integrity: sha512-TT7eUihnAzxM2tlZesusuC75PAOYKvUBgVU/Nm/lakZ/DpyuqhNkzUfcxSgmmK9IjVWzMmezLIGZl16XGCGJng==} cpu: [x64] os: [darwin] - '@oven/bun-linux-aarch64-musl@1.3.10': - resolution: {integrity: sha512-Ui5pAgM7JE9MzHokF0VglRMkbak3lTisY4Mf1AZutPACXWgKJC5aGrgnHBfkl7QS6fEeYb0juy1q4eRznRHOsw==} + '@oven/bun-linux-aarch64-musl@1.3.11': + resolution: {integrity: sha512-jBwYCLG5Eb+PqtFrc3Wp2WMYlw1Id75gUcsdP+ApCOpf5oQhHxkFWCjZmcDoioDmEhMWAiM3wtwSrTlPg+sI6Q==} cpu: [arm64] os: [linux] - '@oven/bun-linux-aarch64@1.3.10': - resolution: {integrity: sha512-OUgPHfL6+PM2Q+tFZjcaycN3D7gdQdYlWnwMI31DXZKY1r4HINWk9aEz9t/rNaHg65edwNrt7dsv9TF7xK8xIA==} + '@oven/bun-linux-aarch64@1.3.11': + resolution: {integrity: sha512-8XMLyRNxHF4jfLajkWt+F8UDxsWbzysyxQVMZKUXwoeGvaxB0rVd07r3YbgDtG8U6khhRFM3oaGp+CQ0whwmdA==} cpu: [arm64] os: [linux] - '@oven/bun-linux-x64-baseline@1.3.10': - resolution: {integrity: sha512-oqvMDYpX6dGJO03HgO5bXuccEsH3qbdO3MaAiAlO4CfkBPLUXz3N0DDElg5hz0L6ktdDVKbQVE5lfe+LAUISQg==} + '@oven/bun-linux-x64-baseline@1.3.11': + resolution: {integrity: sha512-KZlf1jKtf4jai8xiQv/0XRjxVVhHnw/HtUKtLdOeQpTOQ1fQFhLoz2FGGtVRd0LVa/yiRbSz9HlWIzWlmJClng==} cpu: [x64] os: [linux] - '@oven/bun-linux-x64-musl-baseline@1.3.10': - resolution: {integrity: sha512-/hOZ6S1VsTX6vtbhWVL9aAnOrdpuO54mAGUWpTdMz7dFG5UBZ/VUEiK0pBkq9A1rlBk0GeD/6Y4NBFl8Ha7cRA==} + '@oven/bun-linux-x64-musl-baseline@1.3.11': + resolution: {integrity: sha512-J+qz4Al05PrNIOdj7xsWVTyx0c/gjUauG5nKV3Rrx0Q+5JO+1pPVlnfNmWbOF9pKG4f3IGad8KXJUfGMORld+Q==} cpu: [x64] os: [linux] - '@oven/bun-linux-x64-musl@1.3.10': - resolution: {integrity: sha512-poVXvOShekbexHq45b4MH/mRjQKwACAC8lHp3Tz/hEDuz0/20oncqScnmKwzhBPEpqJvydXficXfBYuSim8opw==} + '@oven/bun-linux-x64-musl@1.3.11': + resolution: {integrity: sha512-ADImD4yCHNpqZu718E2chWcCaAHvua90yhmpzzV6fF4zOhwkGGbPCgUWmKyJ83uz+DXaPdYxX0ttDvtolrzx3Q==} cpu: [x64] os: [linux] - '@oven/bun-linux-x64@1.3.10': - resolution: {integrity: sha512-bzUgYj/PIZziB/ZesIP9HUyfvh6Vlf3od+TrbTTyVEuCSMKzDPQVW/yEbRp0tcHO3alwiEXwJDrWrHAguXlgiQ==} + '@oven/bun-linux-x64@1.3.11': + resolution: {integrity: sha512-z3GFCk1UBzDOOiEBHL32lVP7Edi26BhOjKb6bIc0nRyabbRiyON4++GR0zmd/H5zM5S0+UcXFgCGnD+b8avTLw==} cpu: [x64] os: [linux] - '@oven/bun-windows-aarch64@1.3.10': - resolution: {integrity: sha512-GXbz2swvN2DLw2dXZFeedMxSJtI64xQ9xp9Eg7Hjejg6mS2E4dP1xoQ2yAo2aZPi/2OBPAVaGzppI2q20XumHA==} + '@oven/bun-windows-aarch64@1.3.11': + resolution: {integrity: sha512-UOdkwScHRkGPz+n9ZJU7sTkTvqV7rD1SLCLaru1xH8WRsV7tDorPqNCzEN1msOIiPRK825nvAtEm9UsomO1GsA==} cpu: [arm64] os: [win32] - '@oven/bun-windows-x64-baseline@1.3.10': - resolution: {integrity: sha512-gh3UAHbUdDUG6fhLc1Csa4IGdtghue6U8oAIXWnUqawp6lwb3gOCRvp25IUnLF5vUHtgfMxuEUYV7YA2WxVutw==} + '@oven/bun-windows-x64-baseline@1.3.11': + resolution: {integrity: sha512-cCsXK9AQ9Zf18QlVnbrFu2IKfr4sf2sfbErkF2jfCzyCO9Bnhl0KRx63zlN+Ni1xU7gcBLAssgcui5R400N2eA==} cpu: [x64] os: [win32] - '@oven/bun-windows-x64@1.3.10': - resolution: {integrity: sha512-qaS1In3yfC/Z/IGQriVmF8GWwKuNqiw7feTSJWaQhH5IbL6ENR+4wGNPniZSJFaM/SKUO0e/YCRdoVBvgU4C1g==} + '@oven/bun-windows-x64@1.3.11': + resolution: {integrity: sha512-E51tyWDP1l0CbjZYhiUxhDGPaY8Hf5YBREx0PHBff1LM1/q3qsJ6ZvRUa8YbbOO0Ax9QP6GHjD9vf3n6bXZ7QA==} cpu: [x64] os: [win32] + '@oxc-project/types@0.122.0': + resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} + '@oxfmt/binding-android-arm-eabi@0.35.0': resolution: {integrity: sha512-BaRKlM3DyG81y/xWTsE6gZiv89F/3pHe2BqX2H4JbiB8HNVlWWtplzgATAE5IDSdwChdeuWLDTQzJ92Lglw3ZA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1869,141 +1876,239 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@rollup/rollup-android-arm-eabi@4.59.0': - resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} + '@rolldown/binding-android-arm64@1.0.0-rc.12': + resolution: {integrity: sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.12': + resolution: {integrity: sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.12': + resolution: {integrity: sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.12': + resolution: {integrity: sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': + resolution: {integrity: sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': + resolution: {integrity: sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': + resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': + resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': + resolution: {integrity: sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': + resolution: {integrity: sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': + resolution: {integrity: sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-rc.12': + resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} + + '@rollup/rollup-android-arm-eabi@4.60.1': + resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.59.0': - resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} + '@rollup/rollup-android-arm64@4.60.1': + resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.59.0': - resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} + '@rollup/rollup-darwin-arm64@4.60.1': + resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.59.0': - resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} + '@rollup/rollup-darwin-x64@4.60.1': + resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.59.0': - resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} + '@rollup/rollup-freebsd-arm64@4.60.1': + resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.59.0': - resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} + '@rollup/rollup-freebsd-x64@4.60.1': + resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} + '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} + '@rollup/rollup-linux-arm-musleabihf@4.60.1': + resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.59.0': - resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} + '@rollup/rollup-linux-arm64-gnu@4.60.1': + resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.59.0': - resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} + '@rollup/rollup-linux-arm64-musl@4.60.1': + resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.59.0': - resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} + '@rollup/rollup-linux-loong64-gnu@4.60.1': + resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.59.0': - resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} + '@rollup/rollup-linux-loong64-musl@4.60.1': + resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} + '@rollup/rollup-linux-ppc64-gnu@4.60.1': + resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.59.0': - resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} + '@rollup/rollup-linux-ppc64-musl@4.60.1': + resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.59.0': - resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} + '@rollup/rollup-linux-riscv64-gnu@4.60.1': + resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.59.0': - resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} + '@rollup/rollup-linux-riscv64-musl@4.60.1': + resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.59.0': - resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} + '@rollup/rollup-linux-s390x-gnu@4.60.1': + resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.59.0': - resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} + '@rollup/rollup-linux-x64-gnu@4.60.1': + resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.59.0': - resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} + '@rollup/rollup-linux-x64-musl@4.60.1': + resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.59.0': - resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} + '@rollup/rollup-openbsd-x64@4.60.1': + resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.59.0': - resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} + '@rollup/rollup-openharmony-arm64@4.60.1': + resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.59.0': - resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} + '@rollup/rollup-win32-arm64-msvc@4.60.1': + resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.59.0': - resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} + '@rollup/rollup-win32-ia32-msvc@4.60.1': + resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.59.0': - resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} + '@rollup/rollup-win32-x64-gnu@4.60.1': + resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.59.0': - resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} + '@rollup/rollup-win32-x64-msvc@4.60.1': + resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==} cpu: [x64] os: [win32] @@ -2071,6 +2176,39 @@ packages: svelte: optional: true + '@turbo/darwin-64@2.9.3': + resolution: {integrity: sha512-P8foouaP+y/p+hhEGBoZpzMbpVvUMwPjDpcy6wN7EYfvvyISD1USuV27qWkczecihwuPJzQ1lDBuL8ERcavTyg==} + cpu: [x64] + os: [darwin] + + '@turbo/darwin-arm64@2.9.3': + resolution: {integrity: sha512-SIzEkvtNdzdI50FJDaIQ6kQGqgSSdFPcdn0wqmmONN6iGKjy6hsT+EH99GP65FsfV7DLZTh2NmtTIRl2kdoz5Q==} + cpu: [arm64] + os: [darwin] + + '@turbo/linux-64@2.9.3': + resolution: {integrity: sha512-pLRwFmcHHNBvsCySLS6OFabr/07kDT2pxEt/k6eBf/3asiVQZKJ7Rk88AafQx2aYA641qek4RsXvYO3JYpiBug==} + cpu: [x64] + os: [linux] + + '@turbo/linux-arm64@2.9.3': + resolution: {integrity: sha512-gy6ApUroC2Nzv+qjGtE/uPNkhHAFU4c8God+zd5Aiv9L9uBgHlxVJpHT3XWl5xwlJZ2KWuMrlHTaS5kmNB+q1Q==} + cpu: [arm64] + os: [linux] + + '@turbo/windows-64@2.9.3': + resolution: {integrity: sha512-d0YelTX6hAsB7kIEtGB3PzIzSfAg3yDoUlHwuwJc3adBXUsyUIs0YLG+1NNtuhcDOUGnWQeKUoJ2pGWvbpRj7w==} + cpu: [x64] + os: [win32] + + '@turbo/windows-arm64@2.9.3': + resolution: {integrity: sha512-/08CwpKJl3oRY8nOlh2YgilZVJDHsr60XTNxRhuDeuFXONpUZ5X+Nv65izbG/xBew9qxcJFbDX9/sAmAX+ITcQ==} + cpu: [arm64] + os: [win32] + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -2092,9 +2230,6 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.3.5': - resolution: {integrity: sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==} - '@types/node@25.5.0': resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} @@ -2110,102 +2245,102 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.57.1': - resolution: {integrity: sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==} + '@typescript-eslint/eslint-plugin@8.58.0': + resolution: {integrity: sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.57.1 + '@typescript-eslint/parser': ^8.58.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.57.1': - resolution: {integrity: sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==} + '@typescript-eslint/parser@8.58.0': + resolution: {integrity: sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.57.1': - resolution: {integrity: sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==} + '@typescript-eslint/project-service@8.58.0': + resolution: {integrity: sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.57.1': - resolution: {integrity: sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==} + '@typescript-eslint/scope-manager@8.58.0': + resolution: {integrity: sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.57.1': - resolution: {integrity: sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==} + '@typescript-eslint/tsconfig-utils@8.58.0': + resolution: {integrity: sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.57.1': - resolution: {integrity: sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==} + '@typescript-eslint/type-utils@8.58.0': + resolution: {integrity: sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.57.1': - resolution: {integrity: sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==} + '@typescript-eslint/types@8.58.0': + resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.57.1': - resolution: {integrity: sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==} + '@typescript-eslint/typescript-estree@8.58.0': + resolution: {integrity: sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.57.1': - resolution: {integrity: sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==} + '@typescript-eslint/utils@8.58.0': + resolution: {integrity: sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.57.1': - resolution: {integrity: sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==} + '@typescript-eslint/visitor-keys@8.58.0': + resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/coverage-v8@4.0.18': - resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} + '@vitest/coverage-v8@4.1.2': + resolution: {integrity: sha512-sPK//PHO+kAkScb8XITeB1bf7fsk85Km7+rt4eeuRR3VS1/crD47cmV5wicisJmjNdfeokTZwjMk4Mj2d58Mgg==} peerDependencies: - '@vitest/browser': 4.0.18 - vitest: 4.0.18 + '@vitest/browser': 4.1.2 + vitest: 4.1.2 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.0.18': - resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + '@vitest/expect@4.1.2': + resolution: {integrity: sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==} - '@vitest/mocker@4.0.18': - resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + '@vitest/mocker@4.1.2': + resolution: {integrity: sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==} peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@4.0.18': - resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + '@vitest/pretty-format@4.1.2': + resolution: {integrity: sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==} - '@vitest/runner@4.0.18': - resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + '@vitest/runner@4.1.2': + resolution: {integrity: sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==} - '@vitest/snapshot@4.0.18': - resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + '@vitest/snapshot@4.1.2': + resolution: {integrity: sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==} - '@vitest/spy@4.0.18': - resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + '@vitest/spy@4.1.2': + resolution: {integrity: sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==} - '@vitest/utils@4.0.18': - resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + '@vitest/utils@4.1.2': + resolution: {integrity: sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==} abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} @@ -2276,8 +2411,8 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-v8-to-istanbul@0.3.12: - resolution: {integrity: sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==} + ast-v8-to-istanbul@1.0.0: + resolution: {integrity: sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2286,28 +2421,24 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - before-after-hook@3.0.2: resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + before-after-hook@4.0.0: + resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} + bottleneck@2.19.5: resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@2.0.3: + resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==} - brace-expansion@5.0.4: - resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - bun@1.3.10: - resolution: {integrity: sha512-S/CXaXXIyA4CMjdMkYQ4T2YMqnAn4s0ysD3mlsY4bUiOCqGlv28zck4Wd4H4kpvbekx15S9mUeLQ7Uxd0tYTLA==} + bun@1.3.11: + resolution: {integrity: sha512-AvXWYFO6j/ZQ7bhGm4X6eilq2JHsDVC90ZM32k2B7/srhC2gs3Sdki1QTbwrdRCo8o7eT+167vcB1yzOvPdbjA==} cpu: [arm64, x64] os: [darwin, linux, win32] hasBin: true @@ -2414,12 +2545,12 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - conventional-changelog-angular@8.3.0: - resolution: {integrity: sha512-DOuBwYSqWzfwuRByY9O4oOIvDlkUCTDzfbOgcSbkY+imXXj+4tmrEFao3K+FxemClYfYnZzsvudbwrhje9VHDA==} + conventional-changelog-angular@8.3.1: + resolution: {integrity: sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==} engines: {node: '>=18'} - conventional-changelog-conventionalcommits@9.3.0: - resolution: {integrity: sha512-kYFx6gAyjSIMwNtASkI3ZE99U1fuVDJr0yTYgVy+I2QG46zNZfl2her+0+eoviG82c5WQvW1jMt1eOQTeJLodA==} + conventional-changelog-conventionalcommits@9.3.1: + resolution: {integrity: sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw==} engines: {node: '>=18'} conventional-changelog-preset-loader@5.0.0: @@ -2430,8 +2561,8 @@ packages: resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} engines: {node: '>=18'} - conventional-commits-parser@6.3.0: - resolution: {integrity: sha512-RfOq/Cqy9xV9bOA8N+ZH6DlrDR+5S3Mi0B5kACEjESpE+AviIpAptx9a9cFpWCCvgRtWT+0BbUw+e1BZfts9jg==} + conventional-commits-parser@6.4.0: + resolution: {integrity: sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==} engines: {node: '>=18'} hasBin: true @@ -2440,6 +2571,9 @@ packages: engines: {node: '>=18'} hasBin: true + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cosmiconfig-typescript-loader@6.2.0: resolution: {integrity: sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==} engines: {node: '>=v18'} @@ -2473,11 +2607,8 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - - deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + defu@6.1.6: + resolution: {integrity: sha512-f8mefEW4WIVg4LckePx3mALjQSPQgFlg9U8yaPdlsbdYcHQyj9n2zL2LJEA52smeYxOvmd/nB7TpMtHGMTHcug==} destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} @@ -2494,8 +2625,8 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} - dotenv@17.3.1: - resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} + dotenv@17.4.0: + resolution: {integrity: sha512-kCKF62fwtzwYm0IGBNjRUjtJgMfGapII+FslMHIjMR5KTnwEmBmWLDRSnc3XSNP8bNy34tekgQyDT0hr7pERRQ==} engines: {node: '>=12'} emoji-regex@10.6.0: @@ -2522,11 +2653,11 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} - esbuild@0.27.3: - resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + esbuild@0.27.4: + resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} engines: {node: '>=18'} hasBin: true @@ -2590,8 +2721,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.0.3: - resolution: {integrity: sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==} + eslint@10.1.0: + resolution: {integrity: sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -2600,8 +2731,8 @@ packages: jiti: optional: true - espree@11.1.1: - resolution: {integrity: sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ==} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} esquery@1.7.0: @@ -2637,6 +2768,9 @@ packages: fast-content-type-parse@2.0.1: resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} + fast-content-type-parse@3.0.0: + resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2678,10 +2812,6 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -2693,8 +2823,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.4: - resolution: {integrity: sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -2843,10 +2973,6 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} @@ -2919,6 +3045,9 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-with-bigint@3.5.8: + resolution: {integrity: sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==} + jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} @@ -2932,8 +3061,82 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libphonenumber-js@1.12.38: - resolution: {integrity: sha512-vwzxmasAy9hZigxtqTbFEwp8ZdZ975TiqVDwj5bKx5sR+zi5ucUQy9mbVTkKM9GzqdLdxux/hTw2nmN5J7POMA==} + libphonenumber-js@1.12.41: + resolution: {integrity: sha512-lsmMmGXBxXIK/VMLEj0kL6MtUs1kBGj1nTCzi6zgQoG1DEwqwt2DQyHxcLykceIxAnfE3hya7NuIh6PpC6S3fA==} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} @@ -2945,8 +3148,8 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lint-staged@16.3.3: - resolution: {integrity: sha512-RLq2koZ5fGWrx7tcqx2tSTMQj4lRkfNJaebO/li/uunhCJbtZqwTuwPHpgIimAHHi/2nZIiGrkCHDCOeR1onxA==} + lint-staged@16.4.0: + resolution: {integrity: sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==} engines: {node: '>=20.17'} hasBin: true @@ -2962,8 +3165,8 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash-es@4.17.23: - resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} @@ -3015,16 +3218,12 @@ packages: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - minimatch@10.2.4: - resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} minimatch@9.0.9: @@ -3042,8 +3241,8 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} - mlly@1.8.1: - resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -3099,9 +3298,6 @@ packages: ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} @@ -3163,12 +3359,8 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} pirates@4.0.7: @@ -3229,8 +3421,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - rc9@3.0.0: - resolution: {integrity: sha512-MGOue0VqscKWQ104udASX/3GYDcKyPI4j4F8gu/jHHzglpmy9a/anZK3PNe8ug6aZFl+9GxLtdhe3kVZuMaQbA==} + rc9@3.0.1: + resolution: {integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==} readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} @@ -3266,8 +3458,13 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.59.0: - resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} + rolldown@1.0.0-rc.12: + resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup@4.60.1: + resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3309,8 +3506,8 @@ packages: resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} engines: {node: '>=20'} - smol-toml@1.6.0: - resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} + smol-toml@1.6.1: + resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} engines: {node: '>= 18'} source-map-js@1.2.1: @@ -3324,8 +3521,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@4.0.0: + resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} stdin-discarder@0.3.1: resolution: {integrity: sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==} @@ -3380,8 +3577,8 @@ packages: resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} - tar@7.5.10: - resolution: {integrity: sha512-8mOPs1//5q/rlkNSPcCegA6hiHJYDmSLEI8aMH/CdSQJNWztHC9WHNam5zdQlfpTwB9Xp7IBEsHfV5LKMJGVAw==} + tar@7.5.13: + resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} engines: {node: '>=18'} thenify-all@1.6.0: @@ -3397,8 +3594,8 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.0.2: - resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + tinyexec@1.0.4: + resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} engines: {node: '>=18'} tinyglobby@0.2.15: @@ -3409,14 +3606,10 @@ packages: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} - tinyrainbow@3.0.3: - resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -3424,8 +3617,8 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - ts-api-utils@2.4.0: - resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -3459,63 +3652,33 @@ packages: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - turbo-darwin-64@2.8.16: - resolution: {integrity: sha512-KWa4hUMWrpADC6Q/wIHRkBLw6X6MV9nx6X7hSXbTrrMz0KdaKhmfudUZ3sS76bJFmgArBU25cSc0AUyyrswYxg==} - cpu: [x64] - os: [darwin] - - turbo-darwin-arm64@2.8.16: - resolution: {integrity: sha512-NBgaqBDLQSZlJR4D5XCkQq6noaO0RvIgwm5eYFJYL3bH5dNu8o0UBpq7C5DYnQI8+ybyoHFjT5/icN4LeUYLow==} - cpu: [arm64] - os: [darwin] - - turbo-linux-64@2.8.16: - resolution: {integrity: sha512-VYPdcCRevI9kR/hr1H1xwXy7QQt/jNKiim1e1mjANBXD2E9VZWMkIL74J1Huad5MbU3/jw7voHOqDPLJPC2p6w==} - cpu: [x64] - os: [linux] - - turbo-linux-arm64@2.8.16: - resolution: {integrity: sha512-beq8tgUVI3uwkQkXJMiOr/hfxQRw54M3elpBwqgYFfemiK5LhCjjcwO0DkE8GZZfElBIlk+saMAQOZy3885wNQ==} - cpu: [arm64] - os: [linux] - - turbo-windows-64@2.8.16: - resolution: {integrity: sha512-Ig7b46iUgiOIkea/D3Z7H+zNzvzSnIJcLYFpZLA0RxbUTrbLhv9qIPwv3pT9p/abmu0LXVKHxaOo+p26SuDhzw==} - cpu: [x64] - os: [win32] - - turbo-windows-arm64@2.8.16: - resolution: {integrity: sha512-fOWjbEA2PiE2HEnFQrwNZKYEdjewyPc2no9GmrXklZnTCuMsxeCN39aVlKpKpim03Zq/ykIuvApGwq8ZbfS2Yw==} - cpu: [arm64] - os: [win32] - - turbo@2.8.16: - resolution: {integrity: sha512-u6e9e3cTTpE2adQ1DYm3A3r8y3LAONEx1jYvJx6eIgSY4bMLxIxs0riWzI0Z/IK903ikiUzRPZ2c1Ph5lVLkhA==} + turbo@2.9.3: + resolution: {integrity: sha512-J/VUvsGRykPb9R8Kh8dHVBOqioDexLk9BhLCU/ZybRR+HN9UR3cURdazFvNgMDt9zPP8TF6K73Z+tplfmi0PqQ==} hasBin: true type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typedoc-plugin-markdown@4.10.0: - resolution: {integrity: sha512-psrg8Rtnv4HPWCsoxId+MzEN8TVK5jeKCnTbnGAbTBqcDapR9hM41bJT/9eAyKn9C2MDG9Qjh3MkltAYuLDoXg==} + typedoc-plugin-markdown@4.11.0: + resolution: {integrity: sha512-2iunh2ALyfyh204OF7h2u0kuQ84xB3jFZtFyUr01nThJkLvR8oGGSSDlyt2gyO4kXhvUxDcVbO0y43+qX+wFbw==} engines: {node: '>= 18'} peerDependencies: typedoc: 0.28.x - typedoc@0.28.17: - resolution: {integrity: sha512-ZkJ2G7mZrbxrKxinTQMjFqsCoYY6a5Luwv2GKbTnBCEgV2ihYm5CflA9JnJAwH0pZWavqfYxmDkFHPt4yx2oDQ==} + typedoc@0.28.18: + resolution: {integrity: sha512-NTWTUOFRQ9+SGKKTuWKUioUkjxNwtS3JDRPVKZAXGHZy2wCA8bdv2iJiyeePn0xkmK+TCCqZFT0X7+2+FLjngA==} engines: {node: '>= 18', pnpm: '>= 10'} hasBin: true peerDependencies: - typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x || 6.0.x - typescript-eslint@8.57.1: - resolution: {integrity: sha512-fLvZWf+cAGw3tqMCYzGIU6yR8K+Y9NT2z23RwOjlNFF2HwSB3KhdEFI5lSBv8tNmFkkBShSjsCjzx1vahZfISA==} + typescript-eslint@8.58.0: + resolution: {integrity: sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} @@ -3531,12 +3694,8 @@ packages: undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici@5.29.0: - resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} - engines: {node: '>=14.0'} - - undici@6.23.0: - resolution: {integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==} + undici@6.24.1: + resolution: {integrity: sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==} engines: {node: '>=18.17'} unicode-emoji-modifier-base@1.0.0: @@ -3547,9 +3706,6 @@ packages: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} - universal-user-agent@6.0.1: - resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} - universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} @@ -3560,15 +3716,16 @@ packages: resolution: {integrity: sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==} engines: {node: '>= 0.10'} - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + vite@8.0.3: + resolution: {integrity: sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 jiti: '>=1.21.0' less: ^4.0.0 - lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 stylus: '>=0.54.8' @@ -3579,12 +3736,14 @@ packages: peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -3600,20 +3759,21 @@ packages: yaml: optional: true - vitest@4.0.18: - resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + vitest@4.1.2: + resolution: {integrity: sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.18 - '@vitest/browser-preview': 4.0.18 - '@vitest/browser-webdriverio': 4.0.18 - '@vitest/ui': 4.0.18 + '@vitest/browser-playwright': 4.1.2 + '@vitest/browser-preview': 4.1.2 + '@vitest/browser-webdriverio': 4.1.2 + '@vitest/ui': 4.1.2 happy-dom: '*' jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -3669,17 +3829,14 @@ packages: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - wrtc@0.4.7: resolution: {integrity: sha512-P6Hn7VT4lfSH49HxLHcHhDq+aFf/jd9dPY7lDHeFhZ22N3858EKuwm2jmnlPzpsRGEPaoF6XwkcxY5SYnt4f/g==} engines: {node: ^8.11.2 || >=10.0.0} bundledDependencies: - node-pre-gyp - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -3698,8 +3855,8 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + yaml@2.8.3: + resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} engines: {node: '>= 14.6'} hasBin: true @@ -3725,55 +3882,60 @@ packages: snapshots: - '@actions/core@2.0.3': + '@actions/core@3.0.0': dependencies: - '@actions/exec': 2.0.0 - '@actions/http-client': 3.0.2 + '@actions/exec': 3.0.0 + '@actions/http-client': 4.0.0 - '@actions/exec@2.0.0': + '@actions/exec@3.0.0': dependencies: - '@actions/io': 2.0.0 + '@actions/io': 3.0.2 - '@actions/github@7.0.0': + '@actions/github@9.0.0': dependencies: '@actions/http-client': 3.0.2 - '@octokit/core': 5.2.2 - '@octokit/plugin-paginate-rest': 9.2.2(@octokit/core@5.2.2) - '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.2) - '@octokit/request': 8.4.1 - '@octokit/request-error': 5.1.1 - undici: 5.29.0 + '@octokit/core': 7.0.6 + '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6) + '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6) + '@octokit/request': 10.0.8 + '@octokit/request-error': 7.1.0 + undici: 6.24.1 '@actions/http-client@3.0.2': dependencies: tunnel: 0.0.6 - undici: 6.23.0 + undici: 6.24.1 - '@actions/io@2.0.0': {} + '@actions/http-client@4.0.0': + dependencies: + tunnel: 0.0.6 + undici: 6.24.1 + + '@actions/io@3.0.2': {} - '@angular-devkit/core@21.2.3(chokidar@5.0.0)': + '@angular-devkit/core@21.2.6(chokidar@5.0.0)': dependencies: ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) jsonc-parser: 3.3.1 - picomatch: 4.0.3 + picomatch: 4.0.4 rxjs: 7.8.2 source-map: 0.7.6 optionalDependencies: chokidar: 5.0.0 - '@angular-devkit/schematics-cli@21.2.3(@types/node@25.5.0)(chokidar@5.0.0)': + '@angular-devkit/schematics-cli@21.2.6(@types/node@25.5.0)(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 21.2.3(chokidar@5.0.0) - '@angular-devkit/schematics': 21.2.3(chokidar@5.0.0) + '@angular-devkit/core': 21.2.6(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.6(chokidar@5.0.0) '@inquirer/prompts': 7.10.1(@types/node@25.5.0) transitivePeerDependencies: - '@types/node' - chokidar - '@angular-devkit/schematics@21.2.3(chokidar@5.0.0)': + '@angular-devkit/schematics@21.2.6(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 21.2.3(chokidar@5.0.0) + '@angular-devkit/core': 21.2.6(chokidar@5.0.0) jsonc-parser: 3.3.1 magic-string: 0.30.21 ora: 9.3.0 @@ -3789,7 +3951,7 @@ snapshots: '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -3801,14 +3963,14 @@ snapshots: '@babel/helper-validator-identifier@7.28.5': {} - '@babel/parser@7.29.0': + '@babel/parser@7.29.2': dependencies: '@babel/types': 7.29.0 '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@babel/traverse@7.29.0': @@ -3816,7 +3978,7 @@ snapshots: '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/types': 7.29.0 debug: 4.4.3 @@ -3830,14 +3992,14 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@commitlint/cli@20.5.0(@types/node@25.5.0)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0)(typescript@5.9.3)': + '@commitlint/cli@20.5.0(@types/node@25.5.0)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(typescript@5.9.3)': dependencies: '@commitlint/format': 20.5.0 '@commitlint/lint': 20.5.0 '@commitlint/load': 20.5.0(@types/node@25.5.0)(typescript@5.9.3) - '@commitlint/read': 20.5.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0) + '@commitlint/read': 20.5.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) '@commitlint/types': 20.5.0 - tinyexec: 1.0.2 + tinyexec: 1.0.4 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -3845,10 +4007,10 @@ snapshots: - conventional-commits-parser - typescript - '@commitlint/config-conventional@20.4.3': + '@commitlint/config-conventional@20.5.0': dependencies: - '@commitlint/types': 20.4.3 - conventional-changelog-conventionalcommits: 9.3.0 + '@commitlint/types': 20.5.0 + conventional-changelog-conventionalcommits: 9.3.1 '@commitlint/config-validator@20.5.0': dependencies: @@ -3903,16 +4065,16 @@ snapshots: '@commitlint/parse@20.5.0': dependencies: '@commitlint/types': 20.5.0 - conventional-changelog-angular: 8.3.0 - conventional-commits-parser: 6.3.0 + conventional-changelog-angular: 8.3.1 + conventional-commits-parser: 6.4.0 - '@commitlint/read@20.5.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0)': + '@commitlint/read@20.5.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)': dependencies: '@commitlint/top-level': 20.4.3 '@commitlint/types': 20.5.0 - git-raw-commits: 5.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0) + git-raw-commits: 5.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) minimist: 1.2.8 - tinyexec: 1.0.2 + tinyexec: 1.0.4 transitivePeerDependencies: - conventional-commits-filter - conventional-commits-parser @@ -3939,32 +4101,27 @@ snapshots: dependencies: escalade: 3.2.0 - '@commitlint/types@20.4.3': - dependencies: - conventional-commits-parser: 6.3.0 - picocolors: 1.1.1 - '@commitlint/types@20.5.0': dependencies: - conventional-commits-parser: 6.3.0 + conventional-commits-parser: 6.4.0 picocolors: 1.1.1 - '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0)': + '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)': dependencies: '@types/semver': 7.7.1 semver: 7.7.4 optionalDependencies: conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.3.0 + conventional-commits-parser: 6.4.0 - '@conventional-changelog/git-client@2.6.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0)': + '@conventional-changelog/git-client@2.6.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)': dependencies: '@simple-libs/child-process-utils': 1.0.2 '@simple-libs/stream-utils': 1.2.0 semver: 7.7.4 optionalDependencies: conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.3.0 + conventional-commits-parser: 6.4.0 '@dprint/formatter@0.5.1': {} @@ -3972,87 +4129,103 @@ snapshots: '@dprint/toml@0.7.0': {} - '@esbuild/aix-ppc64@0.27.3': + '@emnapi/core@1.9.1': + dependencies: + '@emnapi/wasi-threads': 1.2.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.9.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.0': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/android-arm64@0.27.3': + '@esbuild/aix-ppc64@0.27.4': optional: true - '@esbuild/android-arm@0.27.3': + '@esbuild/android-arm64@0.27.4': optional: true - '@esbuild/android-x64@0.27.3': + '@esbuild/android-arm@0.27.4': optional: true - '@esbuild/darwin-arm64@0.27.3': + '@esbuild/android-x64@0.27.4': optional: true - '@esbuild/darwin-x64@0.27.3': + '@esbuild/darwin-arm64@0.27.4': optional: true - '@esbuild/freebsd-arm64@0.27.3': + '@esbuild/darwin-x64@0.27.4': optional: true - '@esbuild/freebsd-x64@0.27.3': + '@esbuild/freebsd-arm64@0.27.4': optional: true - '@esbuild/linux-arm64@0.27.3': + '@esbuild/freebsd-x64@0.27.4': optional: true - '@esbuild/linux-arm@0.27.3': + '@esbuild/linux-arm64@0.27.4': optional: true - '@esbuild/linux-ia32@0.27.3': + '@esbuild/linux-arm@0.27.4': optional: true - '@esbuild/linux-loong64@0.27.3': + '@esbuild/linux-ia32@0.27.4': optional: true - '@esbuild/linux-mips64el@0.27.3': + '@esbuild/linux-loong64@0.27.4': optional: true - '@esbuild/linux-ppc64@0.27.3': + '@esbuild/linux-mips64el@0.27.4': optional: true - '@esbuild/linux-riscv64@0.27.3': + '@esbuild/linux-ppc64@0.27.4': optional: true - '@esbuild/linux-s390x@0.27.3': + '@esbuild/linux-riscv64@0.27.4': optional: true - '@esbuild/linux-x64@0.27.3': + '@esbuild/linux-s390x@0.27.4': optional: true - '@esbuild/netbsd-arm64@0.27.3': + '@esbuild/linux-x64@0.27.4': optional: true - '@esbuild/netbsd-x64@0.27.3': + '@esbuild/netbsd-arm64@0.27.4': optional: true - '@esbuild/openbsd-arm64@0.27.3': + '@esbuild/netbsd-x64@0.27.4': optional: true - '@esbuild/openbsd-x64@0.27.3': + '@esbuild/openbsd-arm64@0.27.4': optional: true - '@esbuild/openharmony-arm64@0.27.3': + '@esbuild/openbsd-x64@0.27.4': optional: true - '@esbuild/sunos-x64@0.27.3': + '@esbuild/openharmony-arm64@0.27.4': optional: true - '@esbuild/win32-arm64@0.27.3': + '@esbuild/sunos-x64@0.27.4': optional: true - '@esbuild/win32-ia32@0.27.3': + '@esbuild/win32-arm64@0.27.4': optional: true - '@esbuild/win32-x64@0.27.3': + '@esbuild/win32-ia32@0.27.4': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.0.3(jiti@2.6.1))': + '@esbuild/win32-x64@0.27.4': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@10.1.0(jiti@2.6.1))': dependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -4061,11 +4234,11 @@ snapshots: dependencies: '@eslint/object-schema': 3.0.3 debug: 4.4.3 - minimatch: 10.2.4 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.5.2': + '@eslint/config-helpers@0.5.3': dependencies: '@eslint/core': 1.1.1 @@ -4073,9 +4246,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.0.3(jiti@2.6.1))': + '@eslint/js@10.0.1(eslint@10.1.0(jiti@2.6.1))': optionalDependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) '@eslint/object-schema@3.0.3': {} @@ -4084,8 +4257,6 @@ snapshots: '@eslint/core': 1.1.1 levn: 0.4.1 - '@fastify/busboy@2.1.1': {} - '@favware/cliff-jumper@6.0.0': dependencies: '@favware/colorette-spinner': 1.0.1 @@ -4101,7 +4272,7 @@ snapshots: git-cliff: 2.12.0 js-yaml: 4.1.1 semver: 7.7.4 - smol-toml: 1.6.0 + smol-toml: 1.6.1 '@favware/colorette-spinner@1.0.1': dependencies: @@ -4128,7 +4299,7 @@ snapshots: '@inquirer/ansi@1.0.2': {} - '@inquirer/ansi@2.0.3': {} + '@inquirer/ansi@2.0.4': {} '@inquirer/checkbox@4.3.2(@types/node@25.5.0)': dependencies: @@ -4140,12 +4311,12 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/checkbox@5.1.0(@types/node@25.5.0)': + '@inquirer/checkbox@5.1.2(@types/node@25.5.0)': dependencies: - '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.5(@types/node@25.5.0) - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.5.0) + '@inquirer/ansi': 2.0.4 + '@inquirer/core': 11.1.7(@types/node@25.5.0) + '@inquirer/figures': 2.0.4 + '@inquirer/type': 4.0.4(@types/node@25.5.0) optionalDependencies: '@types/node': 25.5.0 @@ -4156,10 +4327,10 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/confirm@6.0.8(@types/node@25.5.0)': + '@inquirer/confirm@6.0.10(@types/node@25.5.0)': dependencies: - '@inquirer/core': 11.1.5(@types/node@25.5.0) - '@inquirer/type': 4.0.3(@types/node@25.5.0) + '@inquirer/core': 11.1.7(@types/node@25.5.0) + '@inquirer/type': 4.0.4(@types/node@25.5.0) optionalDependencies: '@types/node': 25.5.0 @@ -4176,11 +4347,11 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/core@11.1.5(@types/node@25.5.0)': + '@inquirer/core@11.1.7(@types/node@25.5.0)': dependencies: - '@inquirer/ansi': 2.0.3 - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.5.0) + '@inquirer/ansi': 2.0.4 + '@inquirer/figures': 2.0.4 + '@inquirer/type': 4.0.4(@types/node@25.5.0) cli-width: 4.1.0 fast-wrap-ansi: 0.2.0 mute-stream: 3.0.0 @@ -4196,11 +4367,11 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/editor@5.0.8(@types/node@25.5.0)': + '@inquirer/editor@5.0.10(@types/node@25.5.0)': dependencies: - '@inquirer/core': 11.1.5(@types/node@25.5.0) - '@inquirer/external-editor': 2.0.3(@types/node@25.5.0) - '@inquirer/type': 4.0.3(@types/node@25.5.0) + '@inquirer/core': 11.1.7(@types/node@25.5.0) + '@inquirer/external-editor': 2.0.4(@types/node@25.5.0) + '@inquirer/type': 4.0.4(@types/node@25.5.0) optionalDependencies: '@types/node': 25.5.0 @@ -4212,10 +4383,10 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/expand@5.0.8(@types/node@25.5.0)': + '@inquirer/expand@5.0.10(@types/node@25.5.0)': dependencies: - '@inquirer/core': 11.1.5(@types/node@25.5.0) - '@inquirer/type': 4.0.3(@types/node@25.5.0) + '@inquirer/core': 11.1.7(@types/node@25.5.0) + '@inquirer/type': 4.0.4(@types/node@25.5.0) optionalDependencies: '@types/node': 25.5.0 @@ -4226,7 +4397,7 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/external-editor@2.0.3(@types/node@25.5.0)': + '@inquirer/external-editor@2.0.4(@types/node@25.5.0)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 @@ -4235,7 +4406,7 @@ snapshots: '@inquirer/figures@1.0.15': {} - '@inquirer/figures@2.0.3': {} + '@inquirer/figures@2.0.4': {} '@inquirer/input@4.3.1(@types/node@25.5.0)': dependencies: @@ -4244,10 +4415,10 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/input@5.0.8(@types/node@25.5.0)': + '@inquirer/input@5.0.10(@types/node@25.5.0)': dependencies: - '@inquirer/core': 11.1.5(@types/node@25.5.0) - '@inquirer/type': 4.0.3(@types/node@25.5.0) + '@inquirer/core': 11.1.7(@types/node@25.5.0) + '@inquirer/type': 4.0.4(@types/node@25.5.0) optionalDependencies: '@types/node': 25.5.0 @@ -4258,10 +4429,10 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/number@4.0.8(@types/node@25.5.0)': + '@inquirer/number@4.0.10(@types/node@25.5.0)': dependencies: - '@inquirer/core': 11.1.5(@types/node@25.5.0) - '@inquirer/type': 4.0.3(@types/node@25.5.0) + '@inquirer/core': 11.1.7(@types/node@25.5.0) + '@inquirer/type': 4.0.4(@types/node@25.5.0) optionalDependencies: '@types/node': 25.5.0 @@ -4273,11 +4444,11 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/password@5.0.8(@types/node@25.5.0)': + '@inquirer/password@5.0.10(@types/node@25.5.0)': dependencies: - '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.5(@types/node@25.5.0) - '@inquirer/type': 4.0.3(@types/node@25.5.0) + '@inquirer/ansi': 2.0.4 + '@inquirer/core': 11.1.7(@types/node@25.5.0) + '@inquirer/type': 4.0.4(@types/node@25.5.0) optionalDependencies: '@types/node': 25.5.0 @@ -4296,18 +4467,18 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/prompts@8.3.0(@types/node@25.5.0)': - dependencies: - '@inquirer/checkbox': 5.1.0(@types/node@25.5.0) - '@inquirer/confirm': 6.0.8(@types/node@25.5.0) - '@inquirer/editor': 5.0.8(@types/node@25.5.0) - '@inquirer/expand': 5.0.8(@types/node@25.5.0) - '@inquirer/input': 5.0.8(@types/node@25.5.0) - '@inquirer/number': 4.0.8(@types/node@25.5.0) - '@inquirer/password': 5.0.8(@types/node@25.5.0) - '@inquirer/rawlist': 5.2.4(@types/node@25.5.0) - '@inquirer/search': 4.1.4(@types/node@25.5.0) - '@inquirer/select': 5.1.0(@types/node@25.5.0) + '@inquirer/prompts@8.3.2(@types/node@25.5.0)': + dependencies: + '@inquirer/checkbox': 5.1.2(@types/node@25.5.0) + '@inquirer/confirm': 6.0.10(@types/node@25.5.0) + '@inquirer/editor': 5.0.10(@types/node@25.5.0) + '@inquirer/expand': 5.0.10(@types/node@25.5.0) + '@inquirer/input': 5.0.10(@types/node@25.5.0) + '@inquirer/number': 4.0.10(@types/node@25.5.0) + '@inquirer/password': 5.0.10(@types/node@25.5.0) + '@inquirer/rawlist': 5.2.6(@types/node@25.5.0) + '@inquirer/search': 4.1.6(@types/node@25.5.0) + '@inquirer/select': 5.1.2(@types/node@25.5.0) optionalDependencies: '@types/node': 25.5.0 @@ -4319,10 +4490,10 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/rawlist@5.2.4(@types/node@25.5.0)': + '@inquirer/rawlist@5.2.6(@types/node@25.5.0)': dependencies: - '@inquirer/core': 11.1.5(@types/node@25.5.0) - '@inquirer/type': 4.0.3(@types/node@25.5.0) + '@inquirer/core': 11.1.7(@types/node@25.5.0) + '@inquirer/type': 4.0.4(@types/node@25.5.0) optionalDependencies: '@types/node': 25.5.0 @@ -4335,11 +4506,11 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/search@4.1.4(@types/node@25.5.0)': + '@inquirer/search@4.1.6(@types/node@25.5.0)': dependencies: - '@inquirer/core': 11.1.5(@types/node@25.5.0) - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.5.0) + '@inquirer/core': 11.1.7(@types/node@25.5.0) + '@inquirer/figures': 2.0.4 + '@inquirer/type': 4.0.4(@types/node@25.5.0) optionalDependencies: '@types/node': 25.5.0 @@ -4353,12 +4524,12 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/select@5.1.0(@types/node@25.5.0)': + '@inquirer/select@5.1.2(@types/node@25.5.0)': dependencies: - '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.5(@types/node@25.5.0) - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.5.0) + '@inquirer/ansi': 2.0.4 + '@inquirer/core': 11.1.7(@types/node@25.5.0) + '@inquirer/figures': 2.0.4 + '@inquirer/type': 4.0.4(@types/node@25.5.0) optionalDependencies: '@types/node': 25.5.0 @@ -4366,7 +4537,7 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/type@4.0.3(@types/node@25.5.0)': + '@inquirer/type@4.0.4(@types/node@25.5.0)': optionalDependencies: '@types/node': 25.5.0 @@ -4396,35 +4567,35 @@ snapshots: node-fetch: 2.7.0 nopt: 8.1.0 semver: 7.7.4 - tar: 7.5.10 + tar: 7.5.13 transitivePeerDependencies: - encoding - supports-color - '@nanoforge-dev/actions@1.1.0': + '@nanoforge-dev/actions@1.2.3': dependencies: - '@actions/core': 2.0.3 - '@actions/github': 7.0.0 + '@actions/core': 3.0.0 + '@actions/github': 9.0.0 commander: 14.0.3 '@nanoforge-dev/cli@1.3.0(@types/node@25.5.0)': dependencies: - '@angular-devkit/schematics': 21.2.3(chokidar@5.0.0) - '@angular-devkit/schematics-cli': 21.2.3(@types/node@25.5.0)(chokidar@5.0.0) - '@inquirer/prompts': 8.3.0(@types/node@25.5.0) + '@angular-devkit/schematics': 21.2.6(chokidar@5.0.0) + '@angular-devkit/schematics-cli': 21.2.6(@types/node@25.5.0)(chokidar@5.0.0) + '@inquirer/prompts': 8.3.2(@types/node@25.5.0) '@nanoforge-dev/loader-client': 1.3.0 '@nanoforge-dev/loader-server': 1.2.0 '@nanoforge-dev/schematics': 1.2.2(chokidar@5.0.0) ansis: 4.2.0 - bun: 1.3.10 + bun: 1.3.11 chokidar: 5.0.0 class-transformer: 0.5.1 class-validator: 0.15.1 commander: 14.0.3 - dotenv: 17.3.1 + dotenv: 17.4.0 node-emoji: 2.2.0 ora: 9.3.0 - rc9: 3.0.0 + rc9: 3.0.1 reflect-metadata: 0.2.2 transitivePeerDependencies: - '@types/node' @@ -4432,7 +4603,7 @@ snapshots: '@nanoforge-dev/loader-client@1.3.0': dependencies: '@nanoforge-dev/loader-website': 1.2.0 - bun: 1.3.10 + bun: 1.3.11 commander: 14.0.3 '@nanoforge-dev/loader-server@1.2.0': @@ -4443,25 +4614,22 @@ snapshots: '@nanoforge-dev/schematics@1.2.2(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 21.2.3(chokidar@5.0.0) - '@angular-devkit/schematics': 21.2.3(chokidar@5.0.0) + '@angular-devkit/core': 21.2.6(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.6(chokidar@5.0.0) rxjs: 7.8.2 transitivePeerDependencies: - chokidar - '@octokit/auth-token@4.0.0': {} + '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': + dependencies: + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 + '@tybys/wasm-util': 0.10.1 + optional: true '@octokit/auth-token@5.1.2': {} - '@octokit/core@5.2.2': - dependencies: - '@octokit/auth-token': 4.0.0 - '@octokit/graphql': 7.1.1 - '@octokit/request': 8.4.1 - '@octokit/request-error': 5.1.1 - '@octokit/types': 13.10.0 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.1 + '@octokit/auth-token@6.0.0': {} '@octokit/core@6.1.6': dependencies: @@ -4473,21 +4641,25 @@ snapshots: before-after-hook: 3.0.2 universal-user-agent: 7.0.3 - '@octokit/endpoint@10.1.4': + '@octokit/core@7.0.6': dependencies: - '@octokit/types': 14.1.0 + '@octokit/auth-token': 6.0.0 + '@octokit/graphql': 9.0.3 + '@octokit/request': 10.0.8 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + before-after-hook: 4.0.0 universal-user-agent: 7.0.3 - '@octokit/endpoint@9.0.6': + '@octokit/endpoint@10.1.4': dependencies: - '@octokit/types': 13.10.0 - universal-user-agent: 6.0.1 + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 - '@octokit/graphql@7.1.1': + '@octokit/endpoint@11.0.3': dependencies: - '@octokit/request': 8.4.1 - '@octokit/types': 13.10.0 - universal-user-agent: 6.0.1 + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 '@octokit/graphql@8.2.2': dependencies: @@ -4495,21 +4667,25 @@ snapshots: '@octokit/types': 14.1.0 universal-user-agent: 7.0.3 - '@octokit/openapi-types@20.0.0': {} - - '@octokit/openapi-types@24.2.0': {} + '@octokit/graphql@9.0.3': + dependencies: + '@octokit/request': 10.0.8 + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 '@octokit/openapi-types@25.1.0': {} - '@octokit/plugin-paginate-rest@9.2.2(@octokit/core@5.2.2)': + '@octokit/openapi-types@27.0.0': {} + + '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 5.2.2 - '@octokit/types': 12.6.0 + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 - '@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.2.2)': + '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 5.2.2 - '@octokit/types': 12.6.0 + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 '@octokit/plugin-retry@7.2.1(@octokit/core@6.1.6)': dependencies: @@ -4518,22 +4694,22 @@ snapshots: '@octokit/types': 14.1.0 bottleneck: 2.19.5 - '@octokit/request-error@5.1.1': - dependencies: - '@octokit/types': 13.10.0 - deprecation: 2.3.1 - once: 1.4.0 - '@octokit/request-error@6.1.8': dependencies: '@octokit/types': 14.1.0 - '@octokit/request@8.4.1': + '@octokit/request-error@7.1.0': dependencies: - '@octokit/endpoint': 9.0.6 - '@octokit/request-error': 5.1.1 - '@octokit/types': 13.10.0 - universal-user-agent: 6.0.1 + '@octokit/types': 16.0.0 + + '@octokit/request@10.0.8': + dependencies: + '@octokit/endpoint': 11.0.3 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + fast-content-type-parse: 3.0.0 + json-with-bigint: 3.5.8 + universal-user-agent: 7.0.3 '@octokit/request@9.2.4': dependencies: @@ -4543,54 +4719,52 @@ snapshots: fast-content-type-parse: 2.0.1 universal-user-agent: 7.0.3 - '@octokit/types@12.6.0': - dependencies: - '@octokit/openapi-types': 20.0.0 - - '@octokit/types@13.10.0': - dependencies: - '@octokit/openapi-types': 24.2.0 - '@octokit/types@14.1.0': dependencies: '@octokit/openapi-types': 25.1.0 - '@oven/bun-darwin-aarch64@1.3.10': + '@octokit/types@16.0.0': + dependencies: + '@octokit/openapi-types': 27.0.0 + + '@oven/bun-darwin-aarch64@1.3.11': optional: true - '@oven/bun-darwin-x64-baseline@1.3.10': + '@oven/bun-darwin-x64-baseline@1.3.11': optional: true - '@oven/bun-darwin-x64@1.3.10': + '@oven/bun-darwin-x64@1.3.11': optional: true - '@oven/bun-linux-aarch64-musl@1.3.10': + '@oven/bun-linux-aarch64-musl@1.3.11': optional: true - '@oven/bun-linux-aarch64@1.3.10': + '@oven/bun-linux-aarch64@1.3.11': optional: true - '@oven/bun-linux-x64-baseline@1.3.10': + '@oven/bun-linux-x64-baseline@1.3.11': optional: true - '@oven/bun-linux-x64-musl-baseline@1.3.10': + '@oven/bun-linux-x64-musl-baseline@1.3.11': optional: true - '@oven/bun-linux-x64-musl@1.3.10': + '@oven/bun-linux-x64-musl@1.3.11': optional: true - '@oven/bun-linux-x64@1.3.10': + '@oven/bun-linux-x64@1.3.11': optional: true - '@oven/bun-windows-aarch64@1.3.10': + '@oven/bun-windows-aarch64@1.3.11': optional: true - '@oven/bun-windows-x64-baseline@1.3.10': + '@oven/bun-windows-x64-baseline@1.3.11': optional: true - '@oven/bun-windows-x64@1.3.10': + '@oven/bun-windows-x64@1.3.11': optional: true + '@oxc-project/types@0.122.0': {} + '@oxfmt/binding-android-arm-eabi@0.35.0': optional: true @@ -4650,79 +4824,131 @@ snapshots: '@pkgr/core@0.2.9': {} - '@rollup/rollup-android-arm-eabi@4.59.0': + '@rolldown/binding-android-arm64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': optional: true - '@rollup/rollup-android-arm64@4.59.0': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': optional: true - '@rollup/rollup-darwin-arm64@4.59.0': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': optional: true - '@rollup/rollup-darwin-x64@4.59.0': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': optional: true - '@rollup/rollup-freebsd-arm64@4.59.0': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true - '@rollup/rollup-freebsd-x64@4.59.0': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.59.0': + '@rolldown/pluginutils@1.0.0-rc.12': {} + + '@rollup/rollup-android-arm-eabi@4.60.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.59.0': + '@rollup/rollup-android-arm64@4.60.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.59.0': + '@rollup/rollup-darwin-arm64@4.60.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.59.0': + '@rollup/rollup-darwin-x64@4.60.1': optional: true - '@rollup/rollup-linux-loong64-musl@4.59.0': + '@rollup/rollup-freebsd-arm64@4.60.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.59.0': + '@rollup/rollup-freebsd-x64@4.60.1': optional: true - '@rollup/rollup-linux-ppc64-musl@4.59.0': + '@rollup/rollup-linux-arm-gnueabihf@4.60.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.59.0': + '@rollup/rollup-linux-arm-musleabihf@4.60.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.59.0': + '@rollup/rollup-linux-arm64-gnu@4.60.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.59.0': + '@rollup/rollup-linux-arm64-musl@4.60.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.59.0': + '@rollup/rollup-linux-loong64-gnu@4.60.1': optional: true - '@rollup/rollup-linux-x64-musl@4.59.0': + '@rollup/rollup-linux-loong64-musl@4.60.1': optional: true - '@rollup/rollup-openbsd-x64@4.59.0': + '@rollup/rollup-linux-ppc64-gnu@4.60.1': optional: true - '@rollup/rollup-openharmony-arm64@4.59.0': + '@rollup/rollup-linux-ppc64-musl@4.60.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.59.0': + '@rollup/rollup-linux-riscv64-gnu@4.60.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.59.0': + '@rollup/rollup-linux-riscv64-musl@4.60.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.59.0': + '@rollup/rollup-linux-s390x-gnu@4.60.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.59.0': + '@rollup/rollup-linux-x64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.60.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.60.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.1': optional: true '@sapphire/result@2.8.0': {} @@ -4766,17 +4992,40 @@ snapshots: '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.1)': dependencies: '@babel/generator': 7.29.1 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 javascript-natural-sort: 0.7.1 - lodash-es: 4.17.23 + lodash-es: 4.18.1 minimatch: 9.0.9 parse-imports-exports: 0.2.4 prettier: 3.8.1 transitivePeerDependencies: - supports-color + '@turbo/darwin-64@2.9.3': + optional: true + + '@turbo/darwin-arm64@2.9.3': + optional: true + + '@turbo/linux-64@2.9.3': + optional: true + + '@turbo/linux-arm64@2.9.3': + optional: true + + '@turbo/windows-64@2.9.3': + optional: true + + '@turbo/windows-arm64@2.9.3': + optional: true + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -4799,10 +5048,6 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@25.3.5': - dependencies: - undici-types: 7.18.2 - '@types/node@25.5.0': dependencies: undici-types: 7.18.2 @@ -4815,151 +5060,153 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.3.5 + '@types/node': 25.5.0 - '@typescript-eslint/eslint-plugin@8.57.1(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.57.1 - '@typescript-eslint/type-utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.57.1 - eslint: 10.0.3(jiti@2.6.1) + '@typescript-eslint/parser': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.58.0 + '@typescript-eslint/type-utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.58.0 + eslint: 10.1.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.57.1 - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.57.1 + '@typescript-eslint/scope-manager': 8.58.0 + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.58.0 debug: 4.4.3 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.57.1(typescript@5.9.3)': + '@typescript-eslint/project-service@8.58.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.57.1(typescript@5.9.3) - '@typescript-eslint/types': 8.57.1 + '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@5.9.3) + '@typescript-eslint/types': 8.58.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.57.1': + '@typescript-eslint/scope-manager@8.58.0': dependencies: - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/visitor-keys': 8.57.1 + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/visitor-keys': 8.58.0 - '@typescript-eslint/tsconfig-utils@8.57.1(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.58.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 10.0.3(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.9.3) + eslint: 10.1.0(jiti@2.6.1) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.57.1': {} + '@typescript-eslint/types@8.58.0': {} - '@typescript-eslint/typescript-estree@8.57.1(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.58.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.57.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.57.1(typescript@5.9.3) - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/visitor-keys': 8.57.1 + '@typescript-eslint/project-service': 8.58.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@5.9.3) + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/visitor-keys': 8.58.0 debug: 4.4.3 - minimatch: 10.2.4 + minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.57.1 - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.58.0 + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.9.3) + eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.57.1': + '@typescript-eslint/visitor-keys@8.58.0': dependencies: - '@typescript-eslint/types': 8.57.1 + '@typescript-eslint/types': 8.58.0 eslint-visitor-keys: 5.0.1 - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))': + '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)))': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.18 - ast-v8-to-istanbul: 0.3.12 + '@vitest/utils': 4.1.2 + ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.2.0 magicast: 0.5.2 obug: 2.1.1 - std-env: 3.10.0 - tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + std-env: 4.0.0 + tinyrainbow: 3.1.0 + vitest: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) - '@vitest/expect@4.0.18': + '@vitest/expect@4.1.2': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.18 - '@vitest/utils': 4.0.18 + '@vitest/spy': 4.1.2 + '@vitest/utils': 4.1.2 chai: 6.2.2 - tinyrainbow: 3.0.3 + tinyrainbow: 3.1.0 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))': + '@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3))': dependencies: - '@vitest/spy': 4.0.18 + '@vitest/spy': 4.1.2 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3) - '@vitest/pretty-format@4.0.18': + '@vitest/pretty-format@4.1.2': dependencies: - tinyrainbow: 3.0.3 + tinyrainbow: 3.1.0 - '@vitest/runner@4.0.18': + '@vitest/runner@4.1.2': dependencies: - '@vitest/utils': 4.0.18 + '@vitest/utils': 4.1.2 pathe: 2.0.3 - '@vitest/snapshot@4.0.18': + '@vitest/snapshot@4.1.2': dependencies: - '@vitest/pretty-format': 4.0.18 + '@vitest/pretty-format': 4.1.2 + '@vitest/utils': 4.1.2 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.18': {} + '@vitest/spy@4.1.2': {} - '@vitest/utils@4.0.18': + '@vitest/utils@4.1.2': dependencies: - '@vitest/pretty-format': 4.0.18 - tinyrainbow: 3.0.3 + '@vitest/pretty-format': 4.1.2 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 abbrev@3.0.1: {} @@ -5013,7 +5260,7 @@ snapshots: assertion-error@2.0.1: {} - ast-v8-to-istanbul@0.3.12: + ast-v8-to-istanbul@1.0.0: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -5023,42 +5270,38 @@ snapshots: balanced-match@4.0.4: {} - before-after-hook@2.2.3: {} - before-after-hook@3.0.2: {} + before-after-hook@4.0.0: {} + bottleneck@2.19.5: {} - brace-expansion@2.0.2: + brace-expansion@2.0.3: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.4: + brace-expansion@5.0.5: dependencies: balanced-match: 4.0.4 - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - bun@1.3.10: + bun@1.3.11: optionalDependencies: - '@oven/bun-darwin-aarch64': 1.3.10 - '@oven/bun-darwin-x64': 1.3.10 - '@oven/bun-darwin-x64-baseline': 1.3.10 - '@oven/bun-linux-aarch64': 1.3.10 - '@oven/bun-linux-aarch64-musl': 1.3.10 - '@oven/bun-linux-x64': 1.3.10 - '@oven/bun-linux-x64-baseline': 1.3.10 - '@oven/bun-linux-x64-musl': 1.3.10 - '@oven/bun-linux-x64-musl-baseline': 1.3.10 - '@oven/bun-windows-aarch64': 1.3.10 - '@oven/bun-windows-x64': 1.3.10 - '@oven/bun-windows-x64-baseline': 1.3.10 - - bundle-require@5.1.0(esbuild@0.27.3): - dependencies: - esbuild: 0.27.3 + '@oven/bun-darwin-aarch64': 1.3.11 + '@oven/bun-darwin-x64': 1.3.11 + '@oven/bun-darwin-x64-baseline': 1.3.11 + '@oven/bun-linux-aarch64': 1.3.11 + '@oven/bun-linux-aarch64-musl': 1.3.11 + '@oven/bun-linux-x64': 1.3.11 + '@oven/bun-linux-x64-baseline': 1.3.11 + '@oven/bun-linux-x64-musl': 1.3.11 + '@oven/bun-linux-x64-musl-baseline': 1.3.11 + '@oven/bun-windows-aarch64': 1.3.11 + '@oven/bun-windows-x64': 1.3.11 + '@oven/bun-windows-x64-baseline': 1.3.11 + + bundle-require@5.1.0(esbuild@0.27.4): + dependencies: + esbuild: 0.27.4 load-tsconfig: 0.2.5 cac@6.7.14: {} @@ -5088,13 +5331,13 @@ snapshots: class-validator@0.14.4: dependencies: '@types/validator': 13.15.10 - libphonenumber-js: 1.12.38 + libphonenumber-js: 1.12.41 validator: 13.15.26 class-validator@0.15.1: dependencies: '@types/validator': 13.15.10 - libphonenumber-js: 1.12.38 + libphonenumber-js: 1.12.41 validator: 13.15.26 cli-cursor@5.0.0: @@ -5139,11 +5382,11 @@ snapshots: consola@3.4.2: {} - conventional-changelog-angular@8.3.0: + conventional-changelog-angular@8.3.1: dependencies: compare-func: 2.0.0 - conventional-changelog-conventionalcommits@9.3.0: + conventional-changelog-conventionalcommits@9.3.1: dependencies: compare-func: 2.0.0 @@ -5151,19 +5394,21 @@ snapshots: conventional-commits-filter@5.0.0: {} - conventional-commits-parser@6.3.0: + conventional-commits-parser@6.4.0: dependencies: '@simple-libs/stream-utils': 1.2.0 meow: 13.2.0 conventional-recommended-bump@10.0.0: dependencies: - '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0) + '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) conventional-changelog-preset-loader: 5.0.0 conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.3.0 + conventional-commits-parser: 6.4.0 meow: 13.2.0 + convert-source-map@2.0.0: {} + cosmiconfig-typescript-loader@6.2.0(@types/node@25.5.0)(cosmiconfig@9.0.1(typescript@5.9.3))(typescript@5.9.3): dependencies: '@types/node': 25.5.0 @@ -5192,9 +5437,7 @@ snapshots: deep-is@0.1.4: {} - defu@6.1.4: {} - - deprecation@2.3.1: {} + defu@6.1.6: {} destr@2.0.5: {} @@ -5209,7 +5452,7 @@ snapshots: dependencies: is-obj: 2.0.0 - dotenv@17.3.1: {} + dotenv@17.4.0: {} emoji-regex@10.6.0: {} @@ -5227,44 +5470,44 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-module-lexer@1.7.0: {} + es-module-lexer@2.0.0: {} - esbuild@0.27.3: + esbuild@0.27.4: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.3 - '@esbuild/android-arm': 0.27.3 - '@esbuild/android-arm64': 0.27.3 - '@esbuild/android-x64': 0.27.3 - '@esbuild/darwin-arm64': 0.27.3 - '@esbuild/darwin-x64': 0.27.3 - '@esbuild/freebsd-arm64': 0.27.3 - '@esbuild/freebsd-x64': 0.27.3 - '@esbuild/linux-arm': 0.27.3 - '@esbuild/linux-arm64': 0.27.3 - '@esbuild/linux-ia32': 0.27.3 - '@esbuild/linux-loong64': 0.27.3 - '@esbuild/linux-mips64el': 0.27.3 - '@esbuild/linux-ppc64': 0.27.3 - '@esbuild/linux-riscv64': 0.27.3 - '@esbuild/linux-s390x': 0.27.3 - '@esbuild/linux-x64': 0.27.3 - '@esbuild/netbsd-arm64': 0.27.3 - '@esbuild/netbsd-x64': 0.27.3 - '@esbuild/openbsd-arm64': 0.27.3 - '@esbuild/openbsd-x64': 0.27.3 - '@esbuild/openharmony-arm64': 0.27.3 - '@esbuild/sunos-x64': 0.27.3 - '@esbuild/win32-arm64': 0.27.3 - '@esbuild/win32-ia32': 0.27.3 - '@esbuild/win32-x64': 0.27.3 + '@esbuild/aix-ppc64': 0.27.4 + '@esbuild/android-arm': 0.27.4 + '@esbuild/android-arm64': 0.27.4 + '@esbuild/android-x64': 0.27.4 + '@esbuild/darwin-arm64': 0.27.4 + '@esbuild/darwin-x64': 0.27.4 + '@esbuild/freebsd-arm64': 0.27.4 + '@esbuild/freebsd-x64': 0.27.4 + '@esbuild/linux-arm': 0.27.4 + '@esbuild/linux-arm64': 0.27.4 + '@esbuild/linux-ia32': 0.27.4 + '@esbuild/linux-loong64': 0.27.4 + '@esbuild/linux-mips64el': 0.27.4 + '@esbuild/linux-ppc64': 0.27.4 + '@esbuild/linux-riscv64': 0.27.4 + '@esbuild/linux-s390x': 0.27.4 + '@esbuild/linux-x64': 0.27.4 + '@esbuild/netbsd-arm64': 0.27.4 + '@esbuild/netbsd-x64': 0.27.4 + '@esbuild/openbsd-arm64': 0.27.4 + '@esbuild/openbsd-x64': 0.27.4 + '@esbuild/openharmony-arm64': 0.27.4 + '@esbuild/sunos-x64': 0.27.4 + '@esbuild/win32-arm64': 0.27.4 + '@esbuild/win32-ia32': 0.27.4 + '@esbuild/win32-x64': 0.27.4 escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.0.3(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@10.1.0(jiti@2.6.1)): dependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) eslint-formatter-pretty@7.0.0: dependencies: @@ -5277,35 +5520,35 @@ snapshots: string-width: 8.2.0 supports-hyperlinks: 4.4.0 - eslint-formatting-reporter@0.0.0(eslint@10.0.3(jiti@2.6.1)): + eslint-formatting-reporter@0.0.0(eslint@10.1.0(jiti@2.6.1)): dependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) prettier-linter-helpers: 1.0.1 eslint-parser-plain@0.1.1: {} - eslint-plugin-format@2.0.1(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-format@2.0.1(eslint@10.1.0(jiti@2.6.1)): dependencies: '@dprint/formatter': 0.5.1 '@dprint/markdown': 0.21.1 '@dprint/toml': 0.7.0 - eslint: 10.0.3(jiti@2.6.1) - eslint-formatting-reporter: 0.0.0(eslint@10.0.3(jiti@2.6.1)) + eslint: 10.1.0(jiti@2.6.1) + eslint-formatting-reporter: 0.0.0(eslint@10.1.0(jiti@2.6.1)) eslint-parser-plain: 0.1.1 ohash: 2.0.11 oxfmt: 0.35.0 prettier: 3.8.1 synckit: 0.11.12 - eslint-plugin-prettier@5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.0.3(jiti@2.6.1)))(eslint@10.0.3(jiti@2.6.1))(prettier@3.8.1): + eslint-plugin-prettier@5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.1.0(jiti@2.6.1)))(eslint@10.1.0(jiti@2.6.1))(prettier@3.8.1): dependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) prettier: 3.8.1 prettier-linter-helpers: 1.0.1 synckit: 0.11.12 optionalDependencies: '@types/eslint': 9.6.1 - eslint-config-prettier: 10.1.8(eslint@10.0.3(jiti@2.6.1)) + eslint-config-prettier: 10.1.8(eslint@10.1.0(jiti@2.6.1)) eslint-rule-docs@1.1.235: {} @@ -5320,12 +5563,12 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.0.3(jiti@2.6.1): + eslint@10.1.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.3 - '@eslint/config-helpers': 0.5.2 + '@eslint/config-helpers': 0.5.3 '@eslint/core': 1.1.1 '@eslint/plugin-kit': 0.6.1 '@humanfs/node': 0.16.7 @@ -5338,7 +5581,7 @@ snapshots: escape-string-regexp: 4.0.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 - espree: 11.1.1 + espree: 11.2.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -5349,7 +5592,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.4 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -5357,7 +5600,7 @@ snapshots: transitivePeerDependencies: - supports-color - espree@11.1.1: + espree@11.2.0: dependencies: acorn: 8.16.0 acorn-jsx: 5.3.2(acorn@8.16.0) @@ -5400,6 +5643,8 @@ snapshots: fast-content-type-parse@2.0.1: {} + fast-content-type-parse@3.0.0: {} + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -5420,9 +5665,9 @@ snapshots: dependencies: fast-string-width: 3.0.2 - fdir@6.5.0(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: - picomatch: 4.0.3 + picomatch: 4.0.4 figures@6.1.0: dependencies: @@ -5432,10 +5677,6 @@ snapshots: dependencies: flat-cache: 4.0.1 - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -5444,15 +5685,15 @@ snapshots: fix-dts-default-cjs-exports@1.0.1: dependencies: magic-string: 0.30.21 - mlly: 1.8.1 - rollup: 4.59.0 + mlly: 1.8.2 + rollup: 4.60.1 flat-cache@4.0.1: dependencies: - flatted: 3.3.4 + flatted: 3.4.2 keyv: 4.5.4 - flatted@3.3.4: {} + flatted@3.4.2: {} fsevents@2.3.3: optional: true @@ -5495,9 +5736,9 @@ snapshots: git-cliff-windows-arm64: 2.12.0 git-cliff-windows-x64: 2.12.0 - git-raw-commits@5.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0): + git-raw-commits@5.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0): dependencies: - '@conventional-changelog/git-client': 2.6.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0) + '@conventional-changelog/git-client': 2.6.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) meow: 13.2.0 transitivePeerDependencies: - conventional-commits-filter @@ -5567,8 +5808,6 @@ snapshots: is-interactive@2.0.0: {} - is-number@7.0.0: {} - is-obj@2.0.0: {} is-plain-obj@4.1.0: {} @@ -5618,6 +5857,8 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-with-bigint@3.5.8: {} + jsonc-parser@3.3.1: {} keyv@4.5.4: @@ -5631,7 +5872,56 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libphonenumber-js@1.12.38: {} + libphonenumber-js@1.12.41: {} + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 lilconfig@3.1.3: {} @@ -5641,14 +5931,14 @@ snapshots: dependencies: uc.micro: 2.1.0 - lint-staged@16.3.3: + lint-staged@16.4.0: dependencies: commander: 14.0.3 listr2: 9.0.5 - micromatch: 4.0.8 + picomatch: 4.0.4 string-argv: 0.3.2 - tinyexec: 1.0.2 - yaml: 2.8.2 + tinyexec: 1.0.4 + yaml: 2.8.3 listr2@9.0.5: dependencies: @@ -5665,7 +5955,7 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash-es@4.17.23: {} + lodash-es@4.18.1: {} lodash.camelcase@4.3.0: {} @@ -5700,7 +5990,7 @@ snapshots: magicast@0.5.2: dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 source-map-js: 1.2.1 @@ -5721,20 +6011,15 @@ snapshots: meow@13.2.0: {} - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - mimic-function@5.0.1: {} - minimatch@10.2.4: + minimatch@10.2.5: dependencies: - brace-expansion: 5.0.4 + brace-expansion: 5.0.5 minimatch@9.0.9: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.0.3 minimist@1.2.8: {} @@ -5744,7 +6029,7 @@ snapshots: dependencies: minipass: 7.1.3 - mlly@1.8.1: + mlly@1.8.2: dependencies: acorn: 8.16.0 pathe: 2.0.3 @@ -5793,10 +6078,6 @@ snapshots: ohash@2.0.11: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - onetime@7.0.0: dependencies: mimic-function: 5.0.1 @@ -5882,29 +6163,27 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.1: {} - - picomatch@4.0.3: {} + picomatch@4.0.4: {} pirates@4.0.7: {} pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.8.1 + mlly: 1.8.2 pathe: 2.0.3 plur@5.1.0: dependencies: irregular-plurals: 3.5.0 - postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.8)(yaml@2.8.2): + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.8)(yaml@2.8.3): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.6.1 postcss: 8.5.8 - yaml: 2.8.2 + yaml: 2.8.3 postcss@8.5.8: dependencies: @@ -5928,9 +6207,9 @@ snapshots: punycode@2.3.1: {} - rc9@3.0.0: + rc9@3.0.1: dependencies: - defu: 6.1.4 + defu: 6.1.6 destr: 2.0.5 readdirp@4.1.2: {} @@ -5954,35 +6233,59 @@ snapshots: rfdc@1.4.1: {} - rollup@4.59.0: + rolldown@1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1): + dependencies: + '@oxc-project/types': 0.122.0 + '@rolldown/pluginutils': 1.0.0-rc.12 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.12 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.12 + '@rolldown/binding-darwin-x64': 1.0.0-rc.12 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.12 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.12 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.12 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + rollup@4.60.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.59.0 - '@rollup/rollup-android-arm64': 4.59.0 - '@rollup/rollup-darwin-arm64': 4.59.0 - '@rollup/rollup-darwin-x64': 4.59.0 - '@rollup/rollup-freebsd-arm64': 4.59.0 - '@rollup/rollup-freebsd-x64': 4.59.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 - '@rollup/rollup-linux-arm-musleabihf': 4.59.0 - '@rollup/rollup-linux-arm64-gnu': 4.59.0 - '@rollup/rollup-linux-arm64-musl': 4.59.0 - '@rollup/rollup-linux-loong64-gnu': 4.59.0 - '@rollup/rollup-linux-loong64-musl': 4.59.0 - '@rollup/rollup-linux-ppc64-gnu': 4.59.0 - '@rollup/rollup-linux-ppc64-musl': 4.59.0 - '@rollup/rollup-linux-riscv64-gnu': 4.59.0 - '@rollup/rollup-linux-riscv64-musl': 4.59.0 - '@rollup/rollup-linux-s390x-gnu': 4.59.0 - '@rollup/rollup-linux-x64-gnu': 4.59.0 - '@rollup/rollup-linux-x64-musl': 4.59.0 - '@rollup/rollup-openbsd-x64': 4.59.0 - '@rollup/rollup-openharmony-arm64': 4.59.0 - '@rollup/rollup-win32-arm64-msvc': 4.59.0 - '@rollup/rollup-win32-ia32-msvc': 4.59.0 - '@rollup/rollup-win32-x64-gnu': 4.59.0 - '@rollup/rollup-win32-x64-msvc': 4.59.0 + '@rollup/rollup-android-arm-eabi': 4.60.1 + '@rollup/rollup-android-arm64': 4.60.1 + '@rollup/rollup-darwin-arm64': 4.60.1 + '@rollup/rollup-darwin-x64': 4.60.1 + '@rollup/rollup-freebsd-arm64': 4.60.1 + '@rollup/rollup-freebsd-x64': 4.60.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.1 + '@rollup/rollup-linux-arm-musleabihf': 4.60.1 + '@rollup/rollup-linux-arm64-gnu': 4.60.1 + '@rollup/rollup-linux-arm64-musl': 4.60.1 + '@rollup/rollup-linux-loong64-gnu': 4.60.1 + '@rollup/rollup-linux-loong64-musl': 4.60.1 + '@rollup/rollup-linux-ppc64-gnu': 4.60.1 + '@rollup/rollup-linux-ppc64-musl': 4.60.1 + '@rollup/rollup-linux-riscv64-gnu': 4.60.1 + '@rollup/rollup-linux-riscv64-musl': 4.60.1 + '@rollup/rollup-linux-s390x-gnu': 4.60.1 + '@rollup/rollup-linux-x64-gnu': 4.60.1 + '@rollup/rollup-linux-x64-musl': 4.60.1 + '@rollup/rollup-openbsd-x64': 4.60.1 + '@rollup/rollup-openharmony-arm64': 4.60.1 + '@rollup/rollup-win32-arm64-msvc': 4.60.1 + '@rollup/rollup-win32-ia32-msvc': 4.60.1 + '@rollup/rollup-win32-x64-gnu': 4.60.1 + '@rollup/rollup-win32-x64-msvc': 4.60.1 fsevents: 2.3.3 rxjs@7.8.2: @@ -6017,7 +6320,7 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 - smol-toml@1.6.0: {} + smol-toml@1.6.1: {} source-map-js@1.2.1: {} @@ -6025,7 +6328,7 @@ snapshots: stackback@0.0.2: {} - std-env@3.10.0: {} + std-env@4.0.0: {} stdin-discarder@0.3.1: {} @@ -6083,7 +6386,7 @@ snapshots: dependencies: '@pkgr/core': 0.2.9 - tar@7.5.10: + tar@7.5.13: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -6103,26 +6406,22 @@ snapshots: tinyexec@0.3.2: {} - tinyexec@1.0.2: {} + tinyexec@1.0.4: {} tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 tinypool@2.1.0: {} - tinyrainbow@3.0.3: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 + tinyrainbow@3.1.0: {} tr46@0.0.3: {} tree-kill@1.2.2: {} - ts-api-utils@2.4.0(typescript@5.9.3): + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -6130,20 +6429,20 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2): + tsup@8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.3): dependencies: - bundle-require: 5.1.0(esbuild@0.27.3) + bundle-require: 5.1.0(esbuild@0.27.4) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 debug: 4.4.3 - esbuild: 0.27.3 + esbuild: 0.27.4 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.8)(yaml@2.8.2) + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.8)(yaml@2.8.3) resolve-from: 5.0.0 - rollup: 4.59.0 + rollup: 4.60.1 source-map: 0.7.6 sucrase: 3.35.1 tinyexec: 0.3.2 @@ -6160,57 +6459,39 @@ snapshots: tunnel@0.0.6: {} - turbo-darwin-64@2.8.16: - optional: true - - turbo-darwin-arm64@2.8.16: - optional: true - - turbo-linux-64@2.8.16: - optional: true - - turbo-linux-arm64@2.8.16: - optional: true - - turbo-windows-64@2.8.16: - optional: true - - turbo-windows-arm64@2.8.16: - optional: true - - turbo@2.8.16: + turbo@2.9.3: optionalDependencies: - turbo-darwin-64: 2.8.16 - turbo-darwin-arm64: 2.8.16 - turbo-linux-64: 2.8.16 - turbo-linux-arm64: 2.8.16 - turbo-windows-64: 2.8.16 - turbo-windows-arm64: 2.8.16 + '@turbo/darwin-64': 2.9.3 + '@turbo/darwin-arm64': 2.9.3 + '@turbo/linux-64': 2.9.3 + '@turbo/linux-arm64': 2.9.3 + '@turbo/windows-64': 2.9.3 + '@turbo/windows-arm64': 2.9.3 type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - typedoc-plugin-markdown@4.10.0(typedoc@0.28.17(typescript@5.9.3)): + typedoc-plugin-markdown@4.11.0(typedoc@0.28.18(typescript@5.9.3)): dependencies: - typedoc: 0.28.17(typescript@5.9.3) + typedoc: 0.28.18(typescript@5.9.3) - typedoc@0.28.17(typescript@5.9.3): + typedoc@0.28.18(typescript@5.9.3): dependencies: '@gerrit0/mini-shiki': 3.23.0 lunr: 2.3.9 markdown-it: 14.1.1 - minimatch: 9.0.9 + minimatch: 10.2.5 typescript: 5.9.3 - yaml: 2.8.2 + yaml: 2.8.3 - typescript-eslint@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.57.1(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) + '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -6223,18 +6504,12 @@ snapshots: undici-types@7.18.2: {} - undici@5.29.0: - dependencies: - '@fastify/busboy': 2.1.1 - - undici@6.23.0: {} + undici@6.24.1: {} unicode-emoji-modifier-base@1.0.0: {} unicorn-magic@0.3.0: {} - universal-user-agent@6.0.1: {} - universal-user-agent@7.0.3: {} uri-js@4.4.1: @@ -6243,56 +6518,49 @@ snapshots: validator@13.15.26: {} - vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2): + vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3): dependencies: - esbuild: 0.27.3 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + lightningcss: 1.32.0 + picomatch: 4.0.4 postcss: 8.5.8 - rollup: 4.59.0 + rolldown: 1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) tinyglobby: 0.2.15 optionalDependencies: '@types/node': 25.5.0 + esbuild: 0.27.4 fsevents: 2.3.3 jiti: 2.6.1 - yaml: 2.8.2 - - vitest@4.0.18(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2): - dependencies: - '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2)) - '@vitest/pretty-format': 4.0.18 - '@vitest/runner': 4.0.18 - '@vitest/snapshot': 4.0.18 - '@vitest/spy': 4.0.18 - '@vitest/utils': 4.0.18 - es-module-lexer: 1.7.0 + yaml: 2.8.3 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + vitest@4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)): + dependencies: + '@vitest/expect': 4.1.2 + '@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.2 + '@vitest/runner': 4.1.2 + '@vitest/snapshot': 4.1.2 + '@vitest/spy': 4.1.2 + '@vitest/utils': 4.1.2 + es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 + picomatch: 4.0.4 + std-env: 4.0.0 tinybench: 2.9.0 - tinyexec: 1.0.2 + tinyexec: 1.0.4 tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2) + tinyrainbow: 3.1.0 + vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.5.0 transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - terser - - tsx - - yaml webidl-conversions@3.0.1: {} @@ -6333,19 +6601,17 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 - wrappy@1.0.2: {} - wrtc@0.4.7: optionalDependencies: domexception: 1.0.1 - ws@8.19.0: {} + ws@8.20.0: {} y18n@5.0.8: {} yallist@5.0.0: {} - yaml@2.8.2: {} + yaml@2.8.3: {} yargs-parser@21.1.1: {}