From 5e51ab76686afec408725e74879c23cca36531c7 Mon Sep 17 00:00:00 2001 From: Exelo Date: Mon, 15 Jun 2026 11:25:38 +0900 Subject: [PATCH 1/6] refactor: add event emitter to core editor init context --- .../common/context/contexts/init.context.ts | 28 ++++++++++++++ .../src/common/context/event-emitter.ts | 30 +++++++++++++++ packages/core-editor/src/core/core.ts | 23 +++++++---- .../core-editor/src/editor/core-editor.ts | 19 +++++----- packages/core-editor/src/index.ts | 38 +++++++++++++++++++ .../core-editor/test/editor-feature.spec.ts | 2 + 6 files changed, 123 insertions(+), 17 deletions(-) create mode 100644 packages/core-editor/src/common/context/contexts/init.context.ts create mode 100644 packages/core-editor/src/common/context/event-emitter.ts diff --git a/packages/core-editor/src/common/context/contexts/init.context.ts b/packages/core-editor/src/common/context/contexts/init.context.ts new file mode 100644 index 00000000..967eb03f --- /dev/null +++ b/packages/core-editor/src/common/context/contexts/init.context.ts @@ -0,0 +1,28 @@ +import { + type ApplicationContext, + type IConfigRegistry, + type IRunOptions, + InitContext, + type LibraryManager, +} from "@nanoforge-dev/common"; + +import { type EventEmitter } from "../event-emitter"; + +export class EditorInitContext extends InitContext { + private readonly _eventEmitter: EventEmitter; + + constructor( + context: ApplicationContext, + libraryManager: LibraryManager, + configRegistry: IConfigRegistry, + options: IRunOptions, + eventEmitter: EventEmitter, + ) { + super(context, libraryManager, configRegistry, options); + this._eventEmitter = eventEmitter; + } + + get eventEmitter(): EventEmitter { + return this._eventEmitter; + } +} diff --git a/packages/core-editor/src/common/context/event-emitter.ts b/packages/core-editor/src/common/context/event-emitter.ts new file mode 100644 index 00000000..ebd0d575 --- /dev/null +++ b/packages/core-editor/src/common/context/event-emitter.ts @@ -0,0 +1,30 @@ +import type { IRunOptions } from "@nanoforge-dev/common"; + +import type { IEventEmitter, ListenerType } from "./event-emitter.type"; +import type { CoreEvents, CoreEventsMap } from "./events/core-events"; +import type { EditorEvents, EditorEventsMap } from "./events/editor-events"; + +export class EventEmitter { + private coreEvents: IEventEmitter; + private editorEvents: IEventEmitter; + + constructor(opts: IRunOptions["editor"]) { + this.coreEvents = opts.coreEvents; + this.editorEvents = opts.editorEvents; + } + + runEvents(): void { + this.coreEvents.runEvents(); + } + + emit(event: K, ...args: EditorEventsMap[K]): void { + this.editorEvents.emitEvent(event, ...args); + } + + on( + event: K, + listener: ListenerType, + ): void { + this.coreEvents.on(event, listener); + } +} diff --git a/packages/core-editor/src/core/core.ts b/packages/core-editor/src/core/core.ts index fb0fa2ac..f2f8057d 100644 --- a/packages/core-editor/src/core/core.ts +++ b/packages/core-editor/src/core/core.ts @@ -3,11 +3,12 @@ import { ClientLibraryManager, Context, type IRunnerLibrary, - InitContext, + type InitContext, type LibraryHandle, LibraryStatusEnum, NfNotInitializedException, } from "@nanoforge-dev/common"; +import { type IRunOptions } from "@nanoforge-dev/common"; import { type ECSClientLibrary } from "@nanoforge-dev/ecs-client"; import { type ApplicationConfig } from "../../../core/src/application/application-config"; @@ -16,7 +17,7 @@ import { type EditableApplicationContext } from "../../../core/src/common/contex 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 { EditorInitContext } from "../common/context/contexts/init.context"; import { CoreEditor } from "../editor/core-editor"; export class Core { @@ -31,19 +32,19 @@ export class Core { this.context = context; } - public async init(options: IEditorRunOptions, appOptions: IApplicationOptions): Promise { + public async init(options: IRunOptions, appOptions: IApplicationOptions): Promise { this.options = appOptions; this._configRegistry = new ConfigRegistry(options.env); - await this.runInit(this.getInitContext(options)); this.editor = new CoreEditor( this, options.editor, this.config.getComponentSystemLibrary().library, ); + await this.runInit(this.getInitContext(options)); } public async run(): Promise { - if (!this.options) throw new NfNotInitializedException("Core"); + if (!this.options) throw new NfNotInitializedException("Core Editor"); const context = this.getExecutionContext(); const clientContext = this.getClientContext(); @@ -77,10 +78,16 @@ export class Core { return new EditableExecutionContext(this.context, this.config.libraryManager); } - private getInitContext(options: IEditorRunOptions): InitContext { - if (!this._configRegistry) throw new NfNotInitializedException("Core"); + private getInitContext(options: IRunOptions): InitContext { + if (!this._configRegistry || !this.editor) throw new NfNotInitializedException("Core Editor"); - return new InitContext(this.context, this.config.libraryManager, this._configRegistry, options); + return new EditorInitContext( + this.context, + this.config.libraryManager, + this._configRegistry, + options, + this.editor.eventEmitter, + ); } private getClearContext(): ClearContext { diff --git a/packages/core-editor/src/editor/core-editor.ts b/packages/core-editor/src/editor/core-editor.ts index 033a4884..ec62eb56 100644 --- a/packages/core-editor/src/editor/core-editor.ts +++ b/packages/core-editor/src/editor/core-editor.ts @@ -1,27 +1,28 @@ import { NfNotFound } from "@nanoforge-dev/common"; import { type ECSClientLibrary, type Entity } from "@nanoforge-dev/ecs-client"; +import { EventEmitter } from "../common/context/event-emitter"; import { CoreEvents } from "../common/context/events/core-events"; import { type IEditorRunOptions } from "../common/context/options.type"; import { type Save } from "../common/context/save.type"; import { type Core } from "../core/core"; export class CoreEditor { - private editor: IEditorRunOptions["editor"]; + public eventEmitter: EventEmitter; private ecsLibrary: ECSClientLibrary; private lastLoadedSave: Save; private core: Core; private _isPaused: boolean = false; constructor(core: Core, editor: IEditorRunOptions["editor"], ecsLibrary: ECSClientLibrary) { - this.editor = editor; - this.lastLoadedSave = JSON.parse(JSON.stringify(this.editor.save)); + this.eventEmitter = new EventEmitter(editor); + this.lastLoadedSave = JSON.parse(JSON.stringify(editor.save)); this.ecsLibrary = ecsLibrary; - this.editor.coreEvents?.addListener(CoreEvents.HOT_RELOAD, this.hotReloadEvent.bind(this)); - this.editor.coreEvents?.addListener(CoreEvents.HARD_RELOAD, this.hardReloadEvent.bind(this)); - this.editor.coreEvents?.addListener(CoreEvents.PAUSE_GAME, this.pauseGameEvent.bind(this)); - this.editor.coreEvents?.addListener(CoreEvents.STOP_GAME, this.stopGameEvent.bind(this)); - this.editor.coreEvents?.addListener(CoreEvents.UNPAUSE_GAME, this.unpauseGameEvent.bind(this)); + this.eventEmitter.on(CoreEvents.HOT_RELOAD, this.hotReloadEvent.bind(this)); + this.eventEmitter.on(CoreEvents.HARD_RELOAD, this.hardReloadEvent.bind(this)); + this.eventEmitter.on(CoreEvents.PAUSE_GAME, this.pauseGameEvent.bind(this)); + this.eventEmitter.on(CoreEvents.STOP_GAME, this.stopGameEvent.bind(this)); + this.eventEmitter.on(CoreEvents.UNPAUSE_GAME, this.unpauseGameEvent.bind(this)); this.core = core; } @@ -30,7 +31,7 @@ export class CoreEditor { } public runEvents() { - this.editor.coreEvents?.runEvents(); + this.eventEmitter.runEvents(); } public hotReloadEvent(save: Save): void { diff --git a/packages/core-editor/src/index.ts b/packages/core-editor/src/index.ts index 4273d62e..cbf1838e 100644 --- a/packages/core-editor/src/index.ts +++ b/packages/core-editor/src/index.ts @@ -1,3 +1,41 @@ +import type { EventEmitter } from "./common/context/event-emitter"; +import type { IEventEmitter } from "./common/context/event-emitter.type"; +import type { CoreEvents, CoreEventsMap } from "./common/context/events/core-events"; +import type { EditorEvents, EditorEventsMap } from "./common/context/events/editor-events"; +import type { Save } from "./common/context/save.type"; + +declare module "@nanoforge-dev/common" { + interface IRunClientOptions { + /** Editor integration hooks. */ + editor: { + /** Serialised scene state loaded or saved by the editor. */ + save: Save; + /** Event emitter for core-to-editor communication. */ + coreEvents: IEventEmitter; + /** Event emitter for editor-to-core communication. */ + editorEvents: IEventEmitter; + }; + } + + interface IRunServerOptions { + /** Editor integration hooks. */ + editor: { + /** Serialised scene state loaded or saved by the editor. */ + save: Save; + /** Event emitter for core-to-editor communication. */ + coreEvents: IEventEmitter; + /** Event emitter for editor-to-core communication. */ + editorEvents: IEventEmitter; + }; + } + + interface InitContext { + editor: { + eventEmitter: EventEmitter; + }; + } +} + export * from "./application/nanoforge-factory"; export type { NanoforgeClient } from "./application/nanoforge-client"; diff --git a/packages/core-editor/test/editor-feature.spec.ts b/packages/core-editor/test/editor-feature.spec.ts index 9dfc5a93..0ec6bfea 100644 --- a/packages/core-editor/test/editor-feature.spec.ts +++ b/packages/core-editor/test/editor-feature.spec.ts @@ -114,6 +114,7 @@ describe("EditorFeatures", () => { }, ]; const fakeReg = new FakeRegistry(); + const events = new EventEmitter(); new CoreEditor( {} as unknown as Core, { @@ -121,6 +122,7 @@ describe("EditorFeatures", () => { components, entities, } as any as Save, + coreEvents: events, } as any as IEditorRunOptions["editor"], { registry: fakeReg } as any as ECSClientLibrary, ).hotReloadEvent({ components, entities } as any as Save); From 8ff433da573ada73c3850dc2043b14dac266027c Mon Sep 17 00:00:00 2001 From: Exelo Date: Mon, 15 Jun 2026 12:38:54 +0900 Subject: [PATCH 2/6] refactor: deprecate IEditorRunOptions --- .../src/application/nanoforge-application.ts | 6 +++--- .../core-editor/src/common/context/options.type.ts | 4 ++++ packages/core-editor/src/editor/core-editor.ts | 11 +++++------ packages/core-editor/test/editor-feature.spec.ts | 6 +++--- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/packages/core-editor/src/application/nanoforge-application.ts b/packages/core-editor/src/application/nanoforge-application.ts index bef673db..c015675f 100644 --- a/packages/core-editor/src/application/nanoforge-application.ts +++ b/packages/core-editor/src/application/nanoforge-application.ts @@ -3,13 +3,13 @@ import { type IComponentSystemLibrary, type ILibrary, type INetworkLibrary, + type IRunOptions, NfNotInitializedException, } from "@nanoforge-dev/common"; 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"; /** @@ -77,9 +77,9 @@ export abstract class NanoforgeApplication { /** * Initialise all registered libraries and prepare the engine for the game loop. * - * @param options - Editor run options including save/load callbacks and canvas container. + * @param options - Editor run options including save/events callbacks and canvas container. */ - public init(options: IEditorRunOptions): Promise { + public init(options: IRunOptions): Promise { this._core = new Core( this.applicationConfig, new EditableApplicationContext(this.applicationConfig.libraryManager), diff --git a/packages/core-editor/src/common/context/options.type.ts b/packages/core-editor/src/common/context/options.type.ts index c2bd724f..5b121a5d 100644 --- a/packages/core-editor/src/common/context/options.type.ts +++ b/packages/core-editor/src/common/context/options.type.ts @@ -6,12 +6,15 @@ import { type Save } from "./save.type"; /** * Union of client and server editor run options accepted by * `NanoforgeApplication.init` in editor mode. + * + * @deprecated Use `IRunOptions` instead. */ export type IEditorRunOptions = IEditorRunClientOptions | IEditorRunServerOptions; /** * Run options for a client-side editor application. * + * @deprecated Use `IRunClientOptions` instead. * @remarks * Extends the base run options with editor-specific communication channels. */ @@ -36,6 +39,7 @@ export interface IEditorRunClientOptions { /** * Run options for a server-side editor application. * + * @deprecated Use `IRunServerOptions` instead. * @remarks * Extends the base server run options with editor-specific communication channels. */ diff --git a/packages/core-editor/src/editor/core-editor.ts b/packages/core-editor/src/editor/core-editor.ts index ec62eb56..39202dc9 100644 --- a/packages/core-editor/src/editor/core-editor.ts +++ b/packages/core-editor/src/editor/core-editor.ts @@ -1,11 +1,10 @@ -import { NfNotFound } from "@nanoforge-dev/common"; -import { type ECSClientLibrary, type Entity } from "@nanoforge-dev/ecs-client"; +import { type IRunOptions, NfNotFound } from "@nanoforge-dev/common"; +import type { ECSClientLibrary, Entity } from "@nanoforge-dev/ecs-client"; import { EventEmitter } from "../common/context/event-emitter"; import { CoreEvents } from "../common/context/events/core-events"; -import { type IEditorRunOptions } from "../common/context/options.type"; -import { type Save } from "../common/context/save.type"; -import { type Core } from "../core/core"; +import type { Save } from "../common/context/save.type"; +import type { Core } from "../core/core"; export class CoreEditor { public eventEmitter: EventEmitter; @@ -14,7 +13,7 @@ export class CoreEditor { private core: Core; private _isPaused: boolean = false; - constructor(core: Core, editor: IEditorRunOptions["editor"], ecsLibrary: ECSClientLibrary) { + constructor(core: Core, editor: IRunOptions["editor"], ecsLibrary: ECSClientLibrary) { this.eventEmitter = new EventEmitter(editor); this.lastLoadedSave = JSON.parse(JSON.stringify(editor.save)); this.ecsLibrary = ecsLibrary; diff --git a/packages/core-editor/test/editor-feature.spec.ts b/packages/core-editor/test/editor-feature.spec.ts index 0ec6bfea..9293ee12 100644 --- a/packages/core-editor/test/editor-feature.spec.ts +++ b/packages/core-editor/test/editor-feature.spec.ts @@ -1,8 +1,8 @@ +import { type IRunOptions } from "@nanoforge-dev/common"; import { type ECSClientLibrary } from "@nanoforge-dev/ecs-client"; import { afterEach, describe, expect, it, vi } from "vitest"; import { CoreEvents } from "../src/common/context/events/core-events"; -import type { IEditorRunOptions } from "../src/common/context/options.type"; import { type Save, type SaveComponent, type SaveEntity } from "../src/common/context/save.type"; import { type Core } from "../src/core/core"; import { CoreEditor } from "../src/editor/core-editor"; @@ -23,7 +23,7 @@ describe("EditorFeatures", () => { .mockImplementation(() => {}); new CoreEditor( {} as unknown as Core, - { coreEvents: events, save: { libraries: [] } } as unknown as IEditorRunOptions["editor"], + { coreEvents: events, save: { libraries: [] } } as unknown as IRunOptions["editor"], {} as ECSClientLibrary, ).runEvents(); expect(spyHotReload).toHaveBeenCalledTimes(2); @@ -123,7 +123,7 @@ describe("EditorFeatures", () => { entities, } as any as Save, coreEvents: events, - } as any as IEditorRunOptions["editor"], + } as any as IRunOptions["editor"], { registry: fakeReg } as any as ECSClientLibrary, ).hotReloadEvent({ components, entities } as any as Save); expect(fakeReg.getComponents).toHaveBeenCalledWith({ name: "__RESERVED_ENTITY_ID" }); From 863d36e558c7e4fabe0acccd4dd7cbc588db8ed1 Mon Sep 17 00:00:00 2001 From: Exelo Date: Mon, 15 Jun 2026 13:21:39 +0900 Subject: [PATCH 3/6] feat: add graphics editor --- .../ISSUE_TEMPLATE/01-packages_bug_report.yml | 1 + .github/ISSUE_TEMPLATE/03-feature_request.yml | 1 + .github/issue-labeler.yml | 4 + .github/labeler.yml | 6 + .github/labels.yml | 4 + .github/workflows/alpha-release.yml | 1 + .github/workflows/pre-release.yml | 2 +- .github/workflows/release.yml | 2 +- .../common/src/library/libraries/index.ts | 1 + .../common/context/events/editor-events.ts | 10 +- .../core-editor/src/common/context/index.ts | 3 + packages/core-editor/src/index.ts | 1 + .../graphics-2d-editor/.cliff-jumperrc.json | 8 + packages/graphics-2d-editor/.gitignore | 270 ++++++++++++++++++ packages/graphics-2d-editor/.idea/.gitignore | 8 + packages/graphics-2d-editor/.idea/.name | 1 + .../[NanoForge] Engine Graphics 2D Editor.iml | 12 + .../.idea/codeStyles/Project.xml | 172 +++++++++++ .../.idea/codeStyles/codeStyleConfig.xml | 5 + packages/graphics-2d-editor/.idea/editor.xml | 107 +++++++ .../.idea/git_toolbox_blame.xml | 6 + .../.idea/git_toolbox_prj.xml | 15 + .../inspectionProfiles/Project_Default.xml | 12 + .../.idea/jsLinters/eslint.xml | 6 + packages/graphics-2d-editor/.idea/misc.xml | 24 ++ packages/graphics-2d-editor/.idea/modules.xml | 8 + .../graphics-2d-editor/.idea/prettier.xml | 7 + packages/graphics-2d-editor/.idea/vcs.xml | 6 + packages/graphics-2d-editor/.nvmrc | 1 + packages/graphics-2d-editor/.prettierignore | 11 + packages/graphics-2d-editor/CHANGELOG.md | 3 + packages/graphics-2d-editor/LICENSE | 21 ++ packages/graphics-2d-editor/README.md | 98 +++++++ packages/graphics-2d-editor/cliff.toml | 79 +++++ packages/graphics-2d-editor/eslint.config.js | 3 + packages/graphics-2d-editor/package.json | 92 ++++++ .../graphics-2d-editor/prettier.config.js | 3 + .../src/graphics-2d-editor.library.ts | 65 +++++ packages/graphics-2d-editor/src/index.ts | 1 + packages/graphics-2d-editor/tsconfig.json | 15 + .../graphics-2d-editor/tsconfig.spec.json | 10 + packages/graphics-2d-editor/tsdoc.json | 14 + packages/graphics-2d-editor/tsdown.config.ts | 3 + 43 files changed, 1116 insertions(+), 6 deletions(-) create mode 100644 packages/core-editor/src/common/context/index.ts create mode 100644 packages/graphics-2d-editor/.cliff-jumperrc.json create mode 100644 packages/graphics-2d-editor/.gitignore create mode 100644 packages/graphics-2d-editor/.idea/.gitignore create mode 100644 packages/graphics-2d-editor/.idea/.name create mode 100644 packages/graphics-2d-editor/.idea/[NanoForge] Engine Graphics 2D Editor.iml create mode 100644 packages/graphics-2d-editor/.idea/codeStyles/Project.xml create mode 100644 packages/graphics-2d-editor/.idea/codeStyles/codeStyleConfig.xml create mode 100644 packages/graphics-2d-editor/.idea/editor.xml create mode 100644 packages/graphics-2d-editor/.idea/git_toolbox_blame.xml create mode 100644 packages/graphics-2d-editor/.idea/git_toolbox_prj.xml create mode 100644 packages/graphics-2d-editor/.idea/inspectionProfiles/Project_Default.xml create mode 100644 packages/graphics-2d-editor/.idea/jsLinters/eslint.xml create mode 100644 packages/graphics-2d-editor/.idea/misc.xml create mode 100644 packages/graphics-2d-editor/.idea/modules.xml create mode 100644 packages/graphics-2d-editor/.idea/prettier.xml create mode 100644 packages/graphics-2d-editor/.idea/vcs.xml create mode 100644 packages/graphics-2d-editor/.nvmrc create mode 100644 packages/graphics-2d-editor/.prettierignore create mode 100644 packages/graphics-2d-editor/CHANGELOG.md create mode 100644 packages/graphics-2d-editor/LICENSE create mode 100644 packages/graphics-2d-editor/README.md create mode 100644 packages/graphics-2d-editor/cliff.toml create mode 100644 packages/graphics-2d-editor/eslint.config.js create mode 100644 packages/graphics-2d-editor/package.json create mode 100644 packages/graphics-2d-editor/prettier.config.js create mode 100644 packages/graphics-2d-editor/src/graphics-2d-editor.library.ts create mode 100644 packages/graphics-2d-editor/src/index.ts create mode 100644 packages/graphics-2d-editor/tsconfig.json create mode 100644 packages/graphics-2d-editor/tsconfig.spec.json create mode 100644 packages/graphics-2d-editor/tsdoc.json create mode 100644 packages/graphics-2d-editor/tsdown.config.ts diff --git a/.github/ISSUE_TEMPLATE/01-packages_bug_report.yml b/.github/ISSUE_TEMPLATE/01-packages_bug_report.yml index 3b1fbb7e..469f0ed2 100644 --- a/.github/ISSUE_TEMPLATE/01-packages_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/01-packages_bug_report.yml @@ -22,6 +22,7 @@ body: - ecs-lib - ecs-server - graphics-2d + - graphics-2d-editor - input - music - network-client diff --git a/.github/ISSUE_TEMPLATE/03-feature_request.yml b/.github/ISSUE_TEMPLATE/03-feature_request.yml index 1112e501..19c3b871 100644 --- a/.github/ISSUE_TEMPLATE/03-feature_request.yml +++ b/.github/ISSUE_TEMPLATE/03-feature_request.yml @@ -20,6 +20,7 @@ body: - ecs-lib - ecs-server - graphics-2d + - graphics-2d-editor - input - music - network-client diff --git a/.github/issue-labeler.yml b/.github/issue-labeler.yml index 2ae7faef..450cdb9a 100644 --- a/.github/issue-labeler.yml +++ b/.github/issue-labeler.yml @@ -34,6 +34,10 @@ packages:graphics-2d: - "### Which (package|utils|package or utils) is this (bug report|feature request) for\\?\\n\\ngraphics-2d\\n" +packages:graphics-2d-editor: + - "### Which (package|utils|package or utils) is this (bug + report|feature request) for\\?\\n\\ngraphics-2d-editor\\n" + packages:input: - "### Which (package|utils|package or utils) is this (bug report|feature request) for\\?\\n\\ninput\\n" diff --git a/.github/labeler.yml b/.github/labeler.yml index 7fcf4a9d..311df846 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -52,6 +52,12 @@ packages:graphics-2d: - packages/graphics-2d/* - packages/graphics-2d/**/* +packages:graphics-2d-editor: + - changed-files: + - any-glob-to-any-file: + - packages/graphics-2d-editor/* + - packages/graphics-2d-editor/**/* + packages:input: - changed-files: - any-glob-to-any-file: diff --git a/.github/labels.yml b/.github/labels.yml index 682f019a..ac53356d 100644 --- a/.github/labels.yml +++ b/.github/labels.yml @@ -78,6 +78,10 @@ description: "Related to Graphics2D library" color: "aaa3dc" +- name: "packages:graphics-2d-editor" + description: "Related to Graphics2D Editor library" + color: "aaa3dc" + - name: "packages:input" description: "Related to Input library" color: "aaa3dc" diff --git a/.github/workflows/alpha-release.yml b/.github/workflows/alpha-release.yml index 96c6a68e..76fe91ea 100644 --- a/.github/workflows/alpha-release.yml +++ b/.github/workflows/alpha-release.yml @@ -17,6 +17,7 @@ on: - "@nanoforge-dev/ecs-lib" - "@nanoforge-dev/ecs-server" - "@nanoforge-dev/graphics-2d" + - "@nanoforge-dev/graphics-2d-editor" - "@nanoforge-dev/input" - "@nanoforge-dev/music" - "@nanoforge-dev/network-client" diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index e1886f73..bfb55188 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -34,7 +34,7 @@ jobs: - name: Create release PR uses: ./node_modules/@nanoforge-dev/actions/actions/create-packages-release-pr with: - packages: "@nanoforge-dev/asset-manager,@nanoforge-dev/common,@nanoforge-dev/config,@nanoforge-dev/core,@nanoforge-dev/core-editor,@nanoforge-dev/ecs-client,@nanoforge-dev/ecs-lib,@nanoforge-dev/ecs-server,@nanoforge-dev/graphics-2d,@nanoforge-dev/input,@nanoforge-dev/music,@nanoforge-dev/network-client,@nanoforge-dev/network-server,@nanoforge-dev/sound" + packages: "@nanoforge-dev/asset-manager,@nanoforge-dev/common,@nanoforge-dev/config,@nanoforge-dev/core,@nanoforge-dev/core-editor,@nanoforge-dev/ecs-client,@nanoforge-dev/ecs-lib,@nanoforge-dev/ecs-server,@nanoforge-dev/graphics-2d,@nanoforge-dev/graphics-2d-editor,@nanoforge-dev/input,@nanoforge-dev/music,@nanoforge-dev/network-client,@nanoforge-dev/network-server,@nanoforge-dev/sound" version: ${{ inputs.version }} branch-format: "releases/nanoforge@{version}" commit-format: "chore: release @nanoforge-dev/engine@{version}" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c12a2b59..e7d15658 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,7 +26,7 @@ jobs: - name: Release packages uses: ./node_modules/@nanoforge-dev/actions/actions/release-packages with: - packages: "@nanoforge-dev/asset-manager,@nanoforge-dev/common,@nanoforge-dev/config,@nanoforge-dev/core,@nanoforge-dev/core-editor,@nanoforge-dev/ecs-client,@nanoforge-dev/ecs-lib,@nanoforge-dev/ecs-server,@nanoforge-dev/graphics-2d,@nanoforge-dev/input,@nanoforge-dev/music,@nanoforge-dev/network-client,@nanoforge-dev/network-server,@nanoforge-dev/sound" + packages: "@nanoforge-dev/asset-manager,@nanoforge-dev/common,@nanoforge-dev/config,@nanoforge-dev/core,@nanoforge-dev/core-editor,@nanoforge-dev/ecs-client,@nanoforge-dev/ecs-lib,@nanoforge-dev/ecs-server,@nanoforge-dev/graphics-2d,@nanoforge-dev/graphics-2d-editor,@nanoforge-dev/input,@nanoforge-dev/music,@nanoforge-dev/network-client,@nanoforge-dev/network-server,@nanoforge-dev/sound" tag-format: "{version}" latest: true env: diff --git a/packages/common/src/library/libraries/index.ts b/packages/common/src/library/libraries/index.ts index 73420e55..8ce9096f 100644 --- a/packages/common/src/library/libraries/index.ts +++ b/packages/common/src/library/libraries/index.ts @@ -1,4 +1,5 @@ export type { ILibrary } from "./library.type"; +export { Library } from "./library"; export * from "./abstracts"; export * from "./consts"; diff --git a/packages/core-editor/src/common/context/events/editor-events.ts b/packages/core-editor/src/common/context/events/editor-events.ts index f340b43c..d9b72fd6 100644 --- a/packages/core-editor/src/common/context/events/editor-events.ts +++ b/packages/core-editor/src/common/context/events/editor-events.ts @@ -1,9 +1,11 @@ -// ! Please do not remove this event unless a new one replaces it, it causes types issues - export enum EditorEvents { - EMPTY = "empty", + MOVE_COMPONENT = "move-component", } export interface EditorEventsMap { - [EditorEvents.EMPTY]: []; + [EditorEvents.MOVE_COMPONENT]: [ + entityId: string, + componentId: string, + position: { x: number; y: number }, + ]; } diff --git a/packages/core-editor/src/common/context/index.ts b/packages/core-editor/src/common/context/index.ts new file mode 100644 index 00000000..8b92a342 --- /dev/null +++ b/packages/core-editor/src/common/context/index.ts @@ -0,0 +1,3 @@ +export { CoreEvents } from "./events/core-events"; +export { EditorEvents } from "./events/editor-events"; +export type { EventEmitter } from "./event-emitter"; diff --git a/packages/core-editor/src/index.ts b/packages/core-editor/src/index.ts index cbf1838e..9eda1f2f 100644 --- a/packages/core-editor/src/index.ts +++ b/packages/core-editor/src/index.ts @@ -40,3 +40,4 @@ export * from "./application/nanoforge-factory"; export type { NanoforgeClient } from "./application/nanoforge-client"; export type { NanoforgeServer } from "./application/nanoforge-server"; +export { type EventEmitter, CoreEvents, EditorEvents } from "./common/context"; diff --git a/packages/graphics-2d-editor/.cliff-jumperrc.json b/packages/graphics-2d-editor/.cliff-jumperrc.json new file mode 100644 index 00000000..b68e4434 --- /dev/null +++ b/packages/graphics-2d-editor/.cliff-jumperrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://raw.githubusercontent.com/favware/cliff-jumper/main/assets/cliff-jumper.schema.json", + "name": "graphics-2d-editor", + "org": "nanoforge-dev", + "packagePath": "packages/graphics-2d-editor", + "tagTemplate": "{{new-version}}", + "identifierBase": false +} diff --git a/packages/graphics-2d-editor/.gitignore b/packages/graphics-2d-editor/.gitignore new file mode 100644 index 00000000..e56e932b --- /dev/null +++ b/packages/graphics-2d-editor/.gitignore @@ -0,0 +1,270 @@ +### 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 + +### C++ template +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +### 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.* + +### Private + +# Turbo +.turbo/ + +# Compiled files +src/**/*.js +src/**/*.d.ts + +# mint-tsdocs cache +docs/.tsdocs/ diff --git a/packages/graphics-2d-editor/.idea/.gitignore b/packages/graphics-2d-editor/.idea/.gitignore new file mode 100644 index 00000000..13566b81 --- /dev/null +++ b/packages/graphics-2d-editor/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/packages/graphics-2d-editor/.idea/.name b/packages/graphics-2d-editor/.idea/.name new file mode 100644 index 00000000..31b37a23 --- /dev/null +++ b/packages/graphics-2d-editor/.idea/.name @@ -0,0 +1 @@ +[NanoForge] Engine Graphics 2D Editor \ No newline at end of file diff --git a/packages/graphics-2d-editor/.idea/[NanoForge] Engine Graphics 2D Editor.iml b/packages/graphics-2d-editor/.idea/[NanoForge] Engine Graphics 2D Editor.iml new file mode 100644 index 00000000..24643cc3 --- /dev/null +++ b/packages/graphics-2d-editor/.idea/[NanoForge] Engine Graphics 2D Editor.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/graphics-2d-editor/.idea/codeStyles/Project.xml b/packages/graphics-2d-editor/.idea/codeStyles/Project.xml new file mode 100644 index 00000000..a57ead77 --- /dev/null +++ b/packages/graphics-2d-editor/.idea/codeStyles/Project.xml @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/graphics-2d-editor/.idea/codeStyles/codeStyleConfig.xml b/packages/graphics-2d-editor/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..79ee123c --- /dev/null +++ b/packages/graphics-2d-editor/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/packages/graphics-2d-editor/.idea/editor.xml b/packages/graphics-2d-editor/.idea/editor.xml new file mode 100644 index 00000000..8c39ae07 --- /dev/null +++ b/packages/graphics-2d-editor/.idea/editor.xml @@ -0,0 +1,107 @@ + + + + + + \ No newline at end of file diff --git a/packages/graphics-2d-editor/.idea/git_toolbox_blame.xml b/packages/graphics-2d-editor/.idea/git_toolbox_blame.xml new file mode 100644 index 00000000..7dc12496 --- /dev/null +++ b/packages/graphics-2d-editor/.idea/git_toolbox_blame.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/packages/graphics-2d-editor/.idea/git_toolbox_prj.xml b/packages/graphics-2d-editor/.idea/git_toolbox_prj.xml new file mode 100644 index 00000000..02b915b8 --- /dev/null +++ b/packages/graphics-2d-editor/.idea/git_toolbox_prj.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/packages/graphics-2d-editor/.idea/inspectionProfiles/Project_Default.xml b/packages/graphics-2d-editor/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..41ec19c1 --- /dev/null +++ b/packages/graphics-2d-editor/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/packages/graphics-2d-editor/.idea/jsLinters/eslint.xml b/packages/graphics-2d-editor/.idea/jsLinters/eslint.xml new file mode 100644 index 00000000..541945bb --- /dev/null +++ b/packages/graphics-2d-editor/.idea/jsLinters/eslint.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/packages/graphics-2d-editor/.idea/misc.xml b/packages/graphics-2d-editor/.idea/misc.xml new file mode 100644 index 00000000..7ecbce57 --- /dev/null +++ b/packages/graphics-2d-editor/.idea/misc.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/graphics-2d-editor/.idea/modules.xml b/packages/graphics-2d-editor/.idea/modules.xml new file mode 100644 index 00000000..fa032c30 --- /dev/null +++ b/packages/graphics-2d-editor/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/graphics-2d-editor/.idea/prettier.xml b/packages/graphics-2d-editor/.idea/prettier.xml new file mode 100644 index 00000000..0c83ac4e --- /dev/null +++ b/packages/graphics-2d-editor/.idea/prettier.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/packages/graphics-2d-editor/.idea/vcs.xml b/packages/graphics-2d-editor/.idea/vcs.xml new file mode 100644 index 00000000..b2bdec2d --- /dev/null +++ b/packages/graphics-2d-editor/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/packages/graphics-2d-editor/.nvmrc b/packages/graphics-2d-editor/.nvmrc new file mode 100644 index 00000000..a682cfb9 --- /dev/null +++ b/packages/graphics-2d-editor/.nvmrc @@ -0,0 +1 @@ +v25 diff --git a/packages/graphics-2d-editor/.prettierignore b/packages/graphics-2d-editor/.prettierignore new file mode 100644 index 00000000..64b127c9 --- /dev/null +++ b/packages/graphics-2d-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/graphics-2d-editor/CHANGELOG.md b/packages/graphics-2d-editor/CHANGELOG.md new file mode 100644 index 00000000..6361e43e --- /dev/null +++ b/packages/graphics-2d-editor/CHANGELOG.md @@ -0,0 +1,3 @@ +# Changelog + +All notable changes to this project will be documented in this file. diff --git a/packages/graphics-2d-editor/LICENSE b/packages/graphics-2d-editor/LICENSE new file mode 100644 index 00000000..62c6400b --- /dev/null +++ b/packages/graphics-2d-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/graphics-2d-editor/README.md b/packages/graphics-2d-editor/README.md new file mode 100644 index 00000000..59e503c6 --- /dev/null +++ b/packages/graphics-2d-editor/README.md @@ -0,0 +1,98 @@ +
+
+

+ NanoForge +

+
+

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

+
+ +## About + +`@nanoforge-dev/graphics-2d-editor` is an addon for the [NanoForge Graphics 2D library][graphics] to handle the creation of 2D graphics games in the editor. + +## Installation + +**Node.js 25 or newer is required.** + +```sh +npm install @nanoforge-dev/graphics-2d-editor +yarn add @nanoforge-dev/graphics-2d-editor +pnpm add @nanoforge-dev/graphics-2d-editor +bun add @nanoforge-dev/graphics-2d-editor +``` + +## Example usage + +Initialize the library in your main file (for the rest of the example, please refer to the graphics 2D library [documentation][graphics]). + +```ts +import { type IRunClientOptions } from "@nanoforge-dev/common"; +import { NanoforgeFactory } from "@nanoforge-dev/core"; +import { ECSClientLibrary } from "@nanoforge-dev/ecs-client"; +import { Circle, Graphics2DLibrary, Layer } from "@nanoforge-dev/graphics-2d"; +import { Graphics2DEditorLibrary } from "@nanoforge-dev/graphics-2d-editor"; + +import { CircleComponent } from "./components/CircleComponent"; + +export async function main(options: IRunClientOptions) { + const app = NanoforgeFactory.createClient(); + + const ecs = new ECSClientLibrary(); + const graphics = new Graphics2DLibrary(); + const graphicsEditor = new Graphics2DEditorLibrary(); + + app.useComponentSystem(ecs); + app.useGraphics(graphics); + app.use(Symbol.for("GraphicsEditor"), graphicsEditor); + + await app.init(options); + + const registry = ecs.registry; + + const layer = new Layer(); + graphics.stage.add(layer); + + const entity = registry.spawnEntity(); + registry.addComponent( + entity, + new CircleComponent( + new Circle({ + radius: 70, + fill: "red", + }), + layer, + ), + ); + + 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/graphics-2d-editor +[graphics]: https://github.com/NanoForge-dev/Engine/tree/main/packages/graphics-2d +[npm]: https://www.npmjs.com/package/@nanoforge-dev/graphics-2d-editor +[contributing]: https://github.com/NanoForge-dev/Engine/blob/main/.github/CONTRIBUTING.md diff --git a/packages/graphics-2d-editor/cliff.toml b/packages/graphics-2d-editor/cliff.toml new file mode 100644 index 00000000..5163767e --- /dev/null +++ b/packages/graphics-2d-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 = "^[0-9]+" +ignore_tags = "" +topo_order = false +sort_commits = "newest" + +[remote.github] +owner = "NanoForge-dev" +repo = "Engine" diff --git a/packages/graphics-2d-editor/eslint.config.js b/packages/graphics-2d-editor/eslint.config.js new file mode 100644 index 00000000..62ec06dc --- /dev/null +++ b/packages/graphics-2d-editor/eslint.config.js @@ -0,0 +1,3 @@ +import config from "@nanoforge-dev/utils-eslint-config"; + +export default config; diff --git a/packages/graphics-2d-editor/package.json b/packages/graphics-2d-editor/package.json new file mode 100644 index 00000000..171bc914 --- /dev/null +++ b/packages/graphics-2d-editor/package.json @@ -0,0 +1,92 @@ +{ + "$schema": "https://json.schemastore.org/package.json", + "name": "@nanoforge-dev/graphics-2d-editor", + "version": "0.0.0", + "description": "NanoForge Engine - Graphics-2d 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/graphics-2d-editor" + }, + "funding": "https://github.com/NanoForge-dev/Engine?sponsor", + "scripts": { + "build": "tsc --noEmit && tsdown --config-loader unrun", + "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/graphics-2d-editor/*'", + "release": "cliff-jumper", + "docs": "mint-tsdocs generate" + }, + "dependencies": { + "@nanoforge-dev/common": "workspace:*", + "@nanoforge-dev/core-editor": "workspace:*", + "@nanoforge-dev/ecs-lib": "workspace:*", + "konva": "catalog:graphics" + }, + "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", + "tsdown": "catalog:build", + "typescript": "catalog:core", + "unrun": "catalog:build", + "vitest": "catalog:test" + }, + "packageManager": "pnpm@11.5.2", + "engines": { + "node": "25" + }, + "publishConfig": { + "access": "public" + }, + "lint-staged": { + "**": [ + "prettier --ignore-unknown --write" + ], + "src/**/*.ts": [ + "eslint --fix" + ] + } +} diff --git a/packages/graphics-2d-editor/prettier.config.js b/packages/graphics-2d-editor/prettier.config.js new file mode 100644 index 00000000..27d0e269 --- /dev/null +++ b/packages/graphics-2d-editor/prettier.config.js @@ -0,0 +1,3 @@ +import config from "@nanoforge-dev/utils-prettier-config"; + +export default config; diff --git a/packages/graphics-2d-editor/src/graphics-2d-editor.library.ts b/packages/graphics-2d-editor/src/graphics-2d-editor.library.ts new file mode 100644 index 00000000..b66e1fd6 --- /dev/null +++ b/packages/graphics-2d-editor/src/graphics-2d-editor.library.ts @@ -0,0 +1,65 @@ +import { + COMPONENT_SYSTEM_LIBRARY, + type Context, + GRAPHICS_LIBRARY, + type InitContext, + Library, +} from "@nanoforge-dev/common"; +import { EditorEvents, type EventEmitter } from "@nanoforge-dev/core-editor"; +import type { AbstractECSLibrary, Registry } from "@nanoforge-dev/ecs-lib"; + +export class Graphics2DEditorLibrary extends Library { + private _eventEmitter?: EventEmitter; + private _initComponents: Map> = new Map(); + + constructor() { + super({ + dependencies: [COMPONENT_SYSTEM_LIBRARY, GRAPHICS_LIBRARY], + }); + } + + /** @internal */ + get __name(): string { + return "Graphics2DEditorLibrary"; + } + + /** @internal */ + public override async __init(context: InitContext): Promise { + this._eventEmitter = context.editor.eventEmitter; + const reg = context.libraries.getComponentSystem().library.registry; + reg.addSystem(this._dragSystem.bind(this)); + void context; + } + + private _dragSystem(registry: Registry, ctx: Context) { + void registry; + void ctx; + if (!this._eventEmitter) return; + registry + .getZipper([ + { name: "__RESERVED_ENTITY_ID" }, + { name: "DrawableCircle2D" }, + { name: "DrawableRect2D" }, + { name: "DrawableText2D" }, + ]) + .forEach(({ __RESERVED_ENTITY_ID, DrawableCircle2D, DrawableRect2D, DrawableText2D }) => { + if (!this._initComponents.has(__RESERVED_ENTITY_ID)) + this._initComponents.set(__RESERVED_ENTITY_ID, new Set()); + const m = this._initComponents.get(__RESERVED_ENTITY_ID) as Set; + [DrawableCircle2D, DrawableRect2D, DrawableText2D].forEach((comp) => { + if (!m.has(comp.name)) { + comp.shape.draggable(true); + comp.shape.on("dragend", () => { + this._eventEmitter?.emit( + EditorEvents.MOVE_COMPONENT, + __RESERVED_ENTITY_ID, + comp.name, + comp.shape.getPosition(), + ); + }); + m.add(comp); + } + }); + }); + } +} diff --git a/packages/graphics-2d-editor/src/index.ts b/packages/graphics-2d-editor/src/index.ts new file mode 100644 index 00000000..b187dac1 --- /dev/null +++ b/packages/graphics-2d-editor/src/index.ts @@ -0,0 +1 @@ +export { Graphics2DEditorLibrary } from "./graphics-2d-editor.library"; diff --git a/packages/graphics-2d-editor/tsconfig.json b/packages/graphics-2d-editor/tsconfig.json new file mode 100644 index 00000000..1ada333c --- /dev/null +++ b/packages/graphics-2d-editor/tsconfig.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig.json", + "extends": "../../tsconfig.json", + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"], + "compilerOptions": { + "declaration": true, + "paths": { + "/snippets/*": ["./docs/snippets/*"] + } + }, + "mdx": { + "checkMdx": true + } +} diff --git a/packages/graphics-2d-editor/tsconfig.spec.json b/packages/graphics-2d-editor/tsconfig.spec.json new file mode 100644 index 00000000..8270caba --- /dev/null +++ b/packages/graphics-2d-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/graphics-2d-editor/tsdoc.json b/packages/graphics-2d-editor/tsdoc.json new file mode 100644 index 00000000..ae9ae564 --- /dev/null +++ b/packages/graphics-2d-editor/tsdoc.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["@microsoft/api-extractor/extends/tsdoc-base.json"], + "tagDefinitions": [ + { + "tagName": "@default", + "syntaxKind": "block", + "allowMultiple": false + } + ], + "supportForTags": { + "@default": true + } +} diff --git a/packages/graphics-2d-editor/tsdown.config.ts b/packages/graphics-2d-editor/tsdown.config.ts new file mode 100644 index 00000000..12f5dea6 --- /dev/null +++ b/packages/graphics-2d-editor/tsdown.config.ts @@ -0,0 +1,3 @@ +import { createTsdownConfig } from "../../tsdown.config"; + +export default [createTsdownConfig()]; From d4661c3bc8e9ec216e765575ca78ae02d981eb8e Mon Sep 17 00:00:00 2001 From: Exelo Date: Mon, 15 Jun 2026 23:32:45 +0900 Subject: [PATCH 4/6] fix: update drag system --- .../manager/managers/base-library.manager.ts | 3 +- .../common/context/contexts/init.context.ts | 2 +- .../core-editor/src/editor/core-editor.ts | 6 ++- packages/core-editor/src/index.ts | 4 +- .../core-editor/test/editor-feature.spec.ts | 16 ++++--- .../src/graphics-2d-editor.library.ts | 44 +++++++++---------- 6 files changed, 38 insertions(+), 37 deletions(-) diff --git a/packages/common/src/library/manager/managers/base-library.manager.ts b/packages/common/src/library/manager/managers/base-library.manager.ts index 1934ca4e..fe8be8cc 100644 --- a/packages/common/src/library/manager/managers/base-library.manager.ts +++ b/packages/common/src/library/manager/managers/base-library.manager.ts @@ -1,6 +1,7 @@ import { type LibraryContext } from "../../../context"; import { type ILibrary } from "../../libraries"; import { LibraryHandle } from "../handle/library.handle"; +import { DefaultLibrariesEnum } from "./library.manager"; export class BaseLibraryManager { protected _libraries: LibraryHandle[] = []; @@ -16,7 +17,7 @@ export class BaseLibraryManager { } protected setNewLibrary(sym: symbol, library: ILibrary, context: LibraryContext): void { - const index = this._libraries.length; + const index = Math.max(this._libraries.length, Object.keys(DefaultLibrariesEnum).length); this._setIndex(sym, index); this._set(index, sym, library, context); } diff --git a/packages/core-editor/src/common/context/contexts/init.context.ts b/packages/core-editor/src/common/context/contexts/init.context.ts index 967eb03f..599e89aa 100644 --- a/packages/core-editor/src/common/context/contexts/init.context.ts +++ b/packages/core-editor/src/common/context/contexts/init.context.ts @@ -22,7 +22,7 @@ export class EditorInitContext extends InitContext { this._eventEmitter = eventEmitter; } - get eventEmitter(): EventEmitter { + override get eventEmitter(): EventEmitter { return this._eventEmitter; } } diff --git a/packages/core-editor/src/editor/core-editor.ts b/packages/core-editor/src/editor/core-editor.ts index 39202dc9..a968e89e 100644 --- a/packages/core-editor/src/editor/core-editor.ts +++ b/packages/core-editor/src/editor/core-editor.ts @@ -93,8 +93,10 @@ export class CoreEditor { const reg = this.ecsLibrary.registry; return reg.entityFromIndex( reg - .getComponents({ name: "__RESERVED_ENTITY_ID" }) - .getIndex({ name: "__RESERVED_ENTITY_ID", entityId: entityId }), + .getComponents({ name: "__RESERVED_entityId" }) + // @todo There is an issue here, getIndex return index from 1 but entityFromIndex get index from 0 + // This is a temp fix + .getIndex({ name: "__RESERVED_entityId", entityId: entityId }) - 1, ); } } diff --git a/packages/core-editor/src/index.ts b/packages/core-editor/src/index.ts index 9eda1f2f..b6bd2792 100644 --- a/packages/core-editor/src/index.ts +++ b/packages/core-editor/src/index.ts @@ -30,9 +30,7 @@ declare module "@nanoforge-dev/common" { } interface InitContext { - editor: { - eventEmitter: EventEmitter; - }; + eventEmitter: EventEmitter; } } diff --git a/packages/core-editor/test/editor-feature.spec.ts b/packages/core-editor/test/editor-feature.spec.ts index 9293ee12..b12d0de3 100644 --- a/packages/core-editor/test/editor-feature.spec.ts +++ b/packages/core-editor/test/editor-feature.spec.ts @@ -54,7 +54,7 @@ describe("EditorFeatures", () => { number: 4, bulletTypes: ["9mm"], }, - __RESERVED_ENTITY_ID: { + __RESERVED_entityId: { entityId: "ent2", }, }, @@ -64,7 +64,7 @@ describe("EditorFeatures", () => { x: 7, y: 8, }, - __RESERVED_ENTITY_ID: { + __RESERVED_entityId: { entityId: "ent3", }, }, @@ -72,7 +72,9 @@ describe("EditorFeatures", () => { )[entity]?.[component.name]; }); entityFromIndex = vi.fn((index) => { - return index; + // @todo There is an issue here, see src/editor/core-editor.ts:97 + // This is a temp fix + return index + 1; }); }, ); @@ -126,18 +128,18 @@ describe("EditorFeatures", () => { } as any as IRunOptions["editor"], { registry: fakeReg } as any as ECSClientLibrary, ).hotReloadEvent({ components, entities } as any as Save); - expect(fakeReg.getComponents).toHaveBeenCalledWith({ name: "__RESERVED_ENTITY_ID" }); + expect(fakeReg.getComponents).toHaveBeenCalledWith({ name: "__RESERVED_entityId" }); expect(getIndex).toHaveBeenNthCalledWith(1, { entityId: "ent2", - name: "__RESERVED_ENTITY_ID", + name: "__RESERVED_entityId", }); expect(getIndex).toHaveBeenNthCalledWith(2, { entityId: "ent2", - name: "__RESERVED_ENTITY_ID", + name: "__RESERVED_entityId", }); expect(getIndex).toHaveBeenNthCalledWith(3, { entityId: "ent3", - name: "__RESERVED_ENTITY_ID", + name: "__RESERVED_entityId", }); expect(fakeReg.getEntityComponent).toHaveBeenNthCalledWith(1, 2, { name: "Position" }); expect(fakeReg.getEntityComponent).toHaveBeenNthCalledWith(2, 2, { name: "Bullets" }); diff --git a/packages/graphics-2d-editor/src/graphics-2d-editor.library.ts b/packages/graphics-2d-editor/src/graphics-2d-editor.library.ts index b66e1fd6..0c02202a 100644 --- a/packages/graphics-2d-editor/src/graphics-2d-editor.library.ts +++ b/packages/graphics-2d-editor/src/graphics-2d-editor.library.ts @@ -1,6 +1,5 @@ import { COMPONENT_SYSTEM_LIBRARY, - type Context, GRAPHICS_LIBRARY, type InitContext, Library, @@ -25,41 +24,40 @@ export class Graphics2DEditorLibrary extends Library { /** @internal */ public override async __init(context: InitContext): Promise { - this._eventEmitter = context.editor.eventEmitter; + this._eventEmitter = context.eventEmitter; const reg = context.libraries.getComponentSystem().library.registry; reg.addSystem(this._dragSystem.bind(this)); - void context; } - private _dragSystem(registry: Registry, ctx: Context) { - void registry; - void ctx; + private _dragSystem(registry: Registry) { if (!this._eventEmitter) return; - registry - .getZipper([ - { name: "__RESERVED_ENTITY_ID" }, - { name: "DrawableCircle2D" }, - { name: "DrawableRect2D" }, - { name: "DrawableText2D" }, - ]) - .forEach(({ __RESERVED_ENTITY_ID, DrawableCircle2D, DrawableRect2D, DrawableText2D }) => { - if (!this._initComponents.has(__RESERVED_ENTITY_ID)) - this._initComponents.set(__RESERVED_ENTITY_ID, new Set()); - const m = this._initComponents.get(__RESERVED_ENTITY_ID) as Set; + + const entities = [ + ...registry.getZipper([{ name: "__RESERVED_entityId" }, { name: "DrawableCircle2D" }]), + ...registry.getZipper([{ name: "__RESERVED_entityId" }, { name: "DrawableRect2D" }]), + ...registry.getZipper([{ name: "__RESERVED_entityId" }, { name: "DrawableText2D" }]), + ]; + entities.forEach( + ({ __RESERVED_entityId, DrawableCircle2D, DrawableRect2D, DrawableText2D }: any) => { + const entityId = __RESERVED_entityId.entityId; + if (!this._initComponents.has(entityId)) this._initComponents.set(entityId, new Set()); + const s = this._initComponents.get(entityId) as Set; [DrawableCircle2D, DrawableRect2D, DrawableText2D].forEach((comp) => { - if (!m.has(comp.name)) { + if (!comp) return; + if (!s.has(comp.name)) { comp.shape.draggable(true); - comp.shape.on("dragend", () => { + comp.shape.on("dragend", ({ target }: any) => { this._eventEmitter?.emit( EditorEvents.MOVE_COMPONENT, - __RESERVED_ENTITY_ID, + entityId, comp.name, - comp.shape.getPosition(), + target._lastPos, ); }); - m.add(comp); + s.add(comp.name); } }); - }); + }, + ); } } From 5ff8ff174f0cd20bc24e26b9473b0d16727a7d69 Mon Sep 17 00:00:00 2001 From: Exelo Date: Tue, 16 Jun 2026 10:13:52 +0900 Subject: [PATCH 5/6] chore: remove unused dependencies of graphics-2d-editor --- packages/graphics-2d-editor/package.json | 3 +- pnpm-lock.yaml | 381 +++++++++++++---------- pnpm-workspace.yaml | 27 +- 3 files changed, 225 insertions(+), 186 deletions(-) diff --git a/packages/graphics-2d-editor/package.json b/packages/graphics-2d-editor/package.json index 171bc914..ae8632af 100644 --- a/packages/graphics-2d-editor/package.json +++ b/packages/graphics-2d-editor/package.json @@ -59,8 +59,7 @@ "dependencies": { "@nanoforge-dev/common": "workspace:*", "@nanoforge-dev/core-editor": "workspace:*", - "@nanoforge-dev/ecs-lib": "workspace:*", - "konva": "catalog:graphics" + "@nanoforge-dev/ecs-lib": "workspace:*" }, "devDependencies": { "@favware/cliff-jumper": "catalog:ci", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2805152b..3f7a3f8f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,29 +7,29 @@ settings: catalogs: build: tsdown: - specifier: ^0.22.1 + specifier: ^0.22.3 version: 0.22.3 unrun: specifier: ^0.3.0 version: 0.3.1 ci: '@commitlint/cli': - specifier: ^21.0.2 + specifier: ^21.1.0 version: 21.1.0 '@commitlint/config-conventional': - specifier: ^21.0.2 + specifier: ^21.1.0 version: 21.1.0 '@favware/cliff-jumper': specifier: ^6.0.0 version: 6.1.0 '@nanoforge-dev/actions': - specifier: ^2.1.2 + specifier: ^2.1.5 version: 2.1.5 husky: specifier: ^9.1.7 version: 9.1.7 lint-staged: - specifier: ^17.0.7 + specifier: ^17.0.8 version: 17.0.8 config: class-transformer: @@ -40,17 +40,17 @@ catalogs: version: 0.14.4 core: '@types/node': - specifier: ^25.9.1 + specifier: ^26.0.1 version: 25.9.4 turbo: - specifier: ^2.9.16 + specifier: ^2.10.0 version: 2.10.0 typescript: specifier: ^6.0.3 version: 6.0.3 docs: '@microsoft/api-extractor': - specifier: ^7.58.7 + specifier: ^7.58.9 version: 7.58.9 mint-tsdocs: specifier: ^0.0.8 @@ -67,8 +67,8 @@ catalogs: specifier: ^6.0.2 version: 6.0.2 eslint: - specifier: ^10.4.1 - version: 10.5.0 + specifier: ^10.6.0 + version: 10.6.0 eslint-config-prettier: specifier: ^10.1.8 version: 10.1.8 @@ -85,8 +85,8 @@ catalogs: specifier: ^17.3.0 version: 17.7.0 prettier: - specifier: ^3.8.3 - version: 3.8.5 + specifier: ^3.9.1 + version: 3.9.1 typescript-eslint: specifier: ^8.61.0 version: 8.62.0 @@ -105,10 +105,10 @@ catalogs: version: 8.21.0 test: '@vitest/coverage-v8': - specifier: ^4.1.8 + specifier: ^4.1.9 version: 4.1.9 vitest: - specifier: ^4.1.8 + specifier: ^4.1.9 version: 4.1.9 importers: @@ -117,13 +117,13 @@ importers: devDependencies: '@commitlint/cli': specifier: catalog:ci - version: 21.1.0(@types/node@25.9.4)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(typescript@6.0.3) + version: 21.1.0(@types/node@26.0.1)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(typescript@6.0.3) '@commitlint/config-conventional': specifier: catalog:ci version: 21.1.0 '@microsoft/api-extractor': specifier: catalog:docs - version: 7.58.9(@types/node@25.9.4) + version: 7.58.9(@types/node@26.0.1) '@nanoforge-dev/actions': specifier: catalog:ci version: 2.1.5 @@ -135,16 +135,16 @@ importers: version: link:utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) '@types/node': specifier: catalog:core - version: 25.9.4 + version: 26.0.1 '@vitest/coverage-v8': specifier: catalog:test version: 4.1.9(vitest@4.1.9) eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) husky: specifier: catalog:ci version: 9.1.7 @@ -153,10 +153,10 @@ importers: version: 17.0.8 mint-tsdocs: specifier: catalog:docs - version: 0.0.8(@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@25.9.4)(@typescript-eslint/parser@8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.5.0(jiti@2.6.1))(react-dom@18.3.1(react@18.3.1))(typescript@6.0.3) + version: 0.0.8(@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@26.0.1)(@typescript-eslint/parser@8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.6.0(jiti@2.6.1))(react-dom@18.3.1(react@18.3.1))(typescript@6.0.3) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -168,7 +168,7 @@ importers: version: 6.0.3 vitest: specifier: catalog:test - version: 4.1.9(@types/node@25.9.4)(@vitest/coverage-v8@4.1.9)(vite@8.1.0(@types/node@25.9.4)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.9(@types/node@26.0.1)(@vitest/coverage-v8@4.1.9)(vite@8.1.0(@types/node@26.0.1)(jiti@2.6.1)(yaml@2.9.0)) e2e/game: devDependencies: @@ -261,16 +261,16 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) lint-staged: specifier: catalog:ci version: 17.0.8 prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 typescript: specifier: catalog:core version: 6.0.3 @@ -292,13 +292,13 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -325,13 +325,13 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -365,13 +365,13 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -411,13 +411,13 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -463,13 +463,13 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -509,16 +509,16 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) '@types/node': specifier: catalog:core version: 25.9.4 eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -549,16 +549,16 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) '@types/node': specifier: catalog:core version: 25.9.4 eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -598,16 +598,16 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) '@types/node': specifier: catalog:core version: 25.9.4 eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -641,13 +641,56 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) + eslint: + specifier: catalog:lint + version: 10.6.0(jiti@2.6.1) + prettier: + specifier: catalog:lint + version: 3.9.1 + tsdown: + specifier: catalog:build + version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) + typescript: + specifier: catalog:core + version: 6.0.3 + unrun: + specifier: catalog:build + version: 0.3.1(synckit@0.11.13) + vitest: + specifier: catalog:test + version: 4.1.9(@types/node@26.0.1)(@vitest/coverage-v8@4.1.9)(vite@8.1.0(@types/node@26.0.1)(jiti@2.6.1)(yaml@2.9.0)) + + packages/graphics-2d-editor: + dependencies: + '@nanoforge-dev/common': + specifier: workspace:* + version: link:../common + '@nanoforge-dev/core-editor': + specifier: workspace:* + version: link:../core-editor + '@nanoforge-dev/ecs-lib': + specifier: workspace:* + version: link:../ecs-lib + devDependencies: + '@favware/cliff-jumper': + specifier: catalog:ci + version: 6.1.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.9.1) eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -678,13 +721,13 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -715,13 +758,13 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -755,13 +798,13 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -804,16 +847,16 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) '@types/ws': specifier: catalog:network version: 8.18.1 eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -844,13 +887,13 @@ importers: version: link:../../utils/prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 tsdown: specifier: catalog:build version: 0.22.3(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13)) @@ -868,41 +911,41 @@ importers: dependencies: '@eslint/js': specifier: catalog:lint - version: 10.0.1(eslint@10.5.0(jiti@2.6.1)) + version: 10.0.1(eslint@10.6.0(jiti@2.6.1)) '@favware/cliff-jumper': specifier: catalog:ci version: 6.1.0 eslint-config-prettier: specifier: catalog:lint - version: 10.1.8(eslint@10.5.0(jiti@2.6.1)) + version: 10.1.8(eslint@10.6.0(jiti@2.6.1)) eslint-formatter-pretty: specifier: catalog:lint version: 7.1.0 eslint-plugin-format: specifier: catalog:lint - version: 2.0.1(eslint@10.5.0(jiti@2.6.1)) + version: 2.0.1(eslint@10.6.0(jiti@2.6.1)) eslint-plugin-prettier: specifier: catalog:lint - version: 5.5.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.5.0(jiti@2.6.1)))(eslint@10.5.0(jiti@2.6.1))(prettier@3.8.5) + version: 5.5.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.6.0(jiti@2.6.1)))(eslint@10.6.0(jiti@2.6.1))(prettier@3.9.1) globals: specifier: catalog:lint version: 17.7.0 typescript-eslint: specifier: catalog:lint - version: 8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3) + version: 8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3) devDependencies: '@nanoforge-dev/utils-prettier-config': specifier: workspace:* version: link:../prettier-config '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) eslint: specifier: catalog:lint - version: 10.5.0(jiti@2.6.1) + version: 10.6.0(jiti@2.6.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 utils/prettier-config: devDependencies: @@ -911,10 +954,10 @@ importers: version: 6.1.0 '@trivago/prettier-plugin-sort-imports': specifier: catalog:lint - version: 6.0.2(prettier@3.8.5) + version: 6.0.2(prettier@3.9.1) prettier: specifier: catalog:lint - version: 3.8.5 + version: 3.9.1 packages: @@ -2658,8 +2701,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.5.0: - resolution: {integrity: sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==} + eslint@10.6.0: + resolution: {integrity: sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -3067,8 +3110,8 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.2.0: - resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true jsesc@3.1.0: @@ -3452,8 +3495,8 @@ packages: resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} engines: {node: '>=6.0.0'} - prettier@3.8.5: - resolution: {integrity: sha512-zxcTTCedNGJM4R8sj/Cq/F0W/c4iE0afWBcBwMTRtw4WHYP9TWkYjdiH3npPRUYsXQCPR0hTU9yjovOu+E6EQA==} + prettier@3.9.1: + resolution: {integrity: sha512-ppiDo2CSwexck1eyZUwJHg/N3nf1+6IRCv7W/VJ5vaLnVCmB7+3CdRfMwoCHBBX6xTrREDTksZ4OZl5SSf4zXA==} engines: {node: '>=14'} hasBin: true @@ -3685,8 +3728,8 @@ packages: resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} - tar@7.5.17: - resolution: {integrity: sha512-wPEBwzapC+2PaTYPH6e2L+cNOEE227S47wUYFqlegcs8zlLLmeb9Fcff1HVZY4Fwku/1Eyv38n7GYwB2aaS71g==} + tar@7.5.19: + resolution: {integrity: sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==} engines: {node: '>=18'} tinybench@2.9.0: @@ -4164,12 +4207,12 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@commitlint/cli@21.1.0(@types/node@25.9.4)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(typescript@6.0.3)': + '@commitlint/cli@21.1.0(@types/node@26.0.1)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(typescript@6.0.3)': dependencies: '@commitlint/config-conventional': 21.1.0 '@commitlint/format': 21.1.0 '@commitlint/lint': 21.1.0 - '@commitlint/load': 21.1.0(@types/node@25.9.4)(typescript@6.0.3) + '@commitlint/load': 21.1.0(@types/node@26.0.1)(typescript@6.0.3) '@commitlint/read': 21.1.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) '@commitlint/types': 21.1.0 tinyexec: 1.2.4 @@ -4214,14 +4257,14 @@ snapshots: '@commitlint/rules': 21.1.0 '@commitlint/types': 21.1.0 - '@commitlint/load@21.1.0(@types/node@25.9.4)(typescript@6.0.3)': + '@commitlint/load@21.1.0(@types/node@26.0.1)(typescript@6.0.3)': dependencies: '@commitlint/config-validator': 21.1.0 '@commitlint/execute-rule': 21.0.1 '@commitlint/resolve-extends': 21.1.0 '@commitlint/types': 21.1.0 cosmiconfig: 9.0.2(typescript@6.0.3) - cosmiconfig-typescript-loader: 6.3.0(@types/node@25.9.4)(cosmiconfig@9.0.2(typescript@6.0.3))(typescript@6.0.3) + cosmiconfig-typescript-loader: 6.3.0(@types/node@26.0.1)(cosmiconfig@9.0.2(typescript@6.0.3))(typescript@6.0.3) es-toolkit: 1.49.0 is-plain-obj: 4.1.0 picocolors: 1.1.1 @@ -4304,9 +4347,9 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.5.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.6.0(jiti@2.6.1))': dependencies: - eslint: 10.5.0(jiti@2.6.1) + eslint: 10.6.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -4327,9 +4370,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.5.0(jiti@2.6.1))': + '@eslint/js@10.0.1(eslint@10.6.0(jiti@2.6.1))': optionalDependencies: - eslint: 10.5.0(jiti@2.6.1) + eslint: 10.6.0(jiti@2.6.1) '@eslint/object-schema@3.0.5': {} @@ -4351,7 +4394,7 @@ snapshots: conventional-recommended-bump: 11.2.0 execa: 9.6.1 git-cliff: 2.13.1 - js-yaml: 4.2.0 + js-yaml: 4.3.0 semver: 7.8.5 smol-toml: 1.7.0 @@ -4652,28 +4695,28 @@ snapshots: node-fetch: 2.7.0 nopt: 8.1.0 semver: 7.8.5 - tar: 7.5.17 + tar: 7.5.19 transitivePeerDependencies: - encoding - supports-color - '@microsoft/api-extractor-model@7.33.8(@types/node@25.9.4)': + '@microsoft/api-extractor-model@7.33.8(@types/node@26.0.1)': dependencies: '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.1 - '@rushstack/node-core-library': 5.23.1(@types/node@25.9.4) + '@rushstack/node-core-library': 5.23.1(@types/node@26.0.1) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.58.9(@types/node@25.9.4)': + '@microsoft/api-extractor@7.58.9(@types/node@26.0.1)': dependencies: - '@microsoft/api-extractor-model': 7.33.8(@types/node@25.9.4) + '@microsoft/api-extractor-model': 7.33.8(@types/node@26.0.1) '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.1 - '@rushstack/node-core-library': 5.23.1(@types/node@25.9.4) + '@rushstack/node-core-library': 5.23.1(@types/node@26.0.1) '@rushstack/rig-package': 0.7.3 - '@rushstack/terminal': 0.24.0(@types/node@25.9.4) - '@rushstack/ts-command-line': 5.3.10(@types/node@25.9.4) + '@rushstack/terminal': 0.24.0(@types/node@26.0.1) + '@rushstack/ts-command-line': 5.3.10(@types/node@26.0.1) diff: 8.0.4 minimatch: 10.2.3 resolve: 1.22.12 @@ -4982,7 +5025,7 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} - '@rushstack/node-core-library@5.19.1(@types/node@25.9.4)': + '@rushstack/node-core-library@5.19.1(@types/node@26.0.1)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -4993,9 +5036,9 @@ snapshots: resolve: 1.22.12 semver: 7.5.4 optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 26.0.1 - '@rushstack/node-core-library@5.23.1(@types/node@25.9.4)': + '@rushstack/node-core-library@5.23.1(@types/node@26.0.1)': dependencies: ajv: 8.18.0 ajv-draft-04: 1.0.0(ajv@8.18.0) @@ -5006,40 +5049,40 @@ snapshots: resolve: 1.22.12 semver: 7.7.4 optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 26.0.1 - '@rushstack/problem-matcher@0.1.1(@types/node@25.9.4)': + '@rushstack/problem-matcher@0.1.1(@types/node@26.0.1)': optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 26.0.1 - '@rushstack/problem-matcher@0.2.1(@types/node@25.9.4)': + '@rushstack/problem-matcher@0.2.1(@types/node@26.0.1)': optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 26.0.1 '@rushstack/rig-package@0.7.3': dependencies: jju: 1.4.0 resolve: 1.22.12 - '@rushstack/terminal@0.19.5(@types/node@25.9.4)': + '@rushstack/terminal@0.19.5(@types/node@26.0.1)': dependencies: - '@rushstack/node-core-library': 5.19.1(@types/node@25.9.4) - '@rushstack/problem-matcher': 0.1.1(@types/node@25.9.4) + '@rushstack/node-core-library': 5.19.1(@types/node@26.0.1) + '@rushstack/problem-matcher': 0.1.1(@types/node@26.0.1) supports-color: 8.1.1 optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 26.0.1 - '@rushstack/terminal@0.24.0(@types/node@25.9.4)': + '@rushstack/terminal@0.24.0(@types/node@26.0.1)': dependencies: - '@rushstack/node-core-library': 5.23.1(@types/node@25.9.4) - '@rushstack/problem-matcher': 0.2.1(@types/node@25.9.4) + '@rushstack/node-core-library': 5.23.1(@types/node@26.0.1) + '@rushstack/problem-matcher': 0.2.1(@types/node@26.0.1) supports-color: 8.1.1 optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 26.0.1 - '@rushstack/ts-command-line@5.3.10(@types/node@25.9.4)': + '@rushstack/ts-command-line@5.3.10(@types/node@26.0.1)': dependencies: - '@rushstack/terminal': 0.24.0(@types/node@25.9.4) + '@rushstack/terminal': 0.24.0(@types/node@26.0.1) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -5072,7 +5115,7 @@ snapshots: '@tanstack/virtual-core@3.17.2': {} - '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.5)': + '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.9.1)': dependencies: '@babel/generator': 7.29.7 '@babel/parser': 7.29.7 @@ -5082,7 +5125,7 @@ snapshots: lodash-es: 4.18.1 minimatch: 9.0.9 parse-imports-exports: 0.2.4 - prettier: 3.8.5 + prettier: 3.9.1 transitivePeerDependencies: - supports-color @@ -5145,15 +5188,15 @@ snapshots: dependencies: '@types/node': 26.0.1 - '@typescript-eslint/eslint-plugin@8.62.0(@typescript-eslint/parser@8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.62.0(@typescript-eslint/parser@8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/parser': 8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.62.0 - '@typescript-eslint/type-utils': 8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.62.0 - eslint: 10.5.0(jiti@2.6.1) + eslint: 10.6.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -5161,14 +5204,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/parser@8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.62.0 '@typescript-eslint/types': 8.62.0 '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.62.0 debug: 4.4.3 - eslint: 10.5.0(jiti@2.6.1) + eslint: 10.6.0(jiti@2.6.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -5191,13 +5234,13 @@ snapshots: dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.62.0 '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3) debug: 4.4.3 - eslint: 10.5.0(jiti@2.6.1) + eslint: 10.6.0(jiti@2.6.1) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -5220,13 +5263,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/utils@8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.62.0 '@typescript-eslint/types': 8.62.0 '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) - eslint: 10.5.0(jiti@2.6.1) + eslint: 10.6.0(jiti@2.6.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -5248,7 +5291,7 @@ snapshots: obug: 2.1.3 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.9(@types/node@25.9.4)(@vitest/coverage-v8@4.1.9)(vite@8.1.0(@types/node@25.9.4)(jiti@2.6.1)(yaml@2.9.0)) + vitest: 4.1.9(@types/node@26.0.1)(@vitest/coverage-v8@4.1.9)(vite@8.1.0(@types/node@26.0.1)(jiti@2.6.1)(yaml@2.9.0)) '@vitest/expect@4.1.9': dependencies: @@ -5576,9 +5619,9 @@ snapshots: convert-source-map@2.0.0: {} - cosmiconfig-typescript-loader@6.3.0(@types/node@25.9.4)(cosmiconfig@9.0.2(typescript@6.0.3))(typescript@6.0.3): + cosmiconfig-typescript-loader@6.3.0(@types/node@26.0.1)(cosmiconfig@9.0.2(typescript@6.0.3))(typescript@6.0.3): dependencies: - '@types/node': 25.9.4 + '@types/node': 26.0.1 cosmiconfig: 9.0.2(typescript@6.0.3) jiti: 2.6.1 typescript: 6.0.3 @@ -5587,7 +5630,7 @@ snapshots: dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 - js-yaml: 4.2.0 + js-yaml: 4.3.0 parse-json: 5.2.0 optionalDependencies: typescript: 6.0.3 @@ -5688,9 +5731,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.5.0(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@10.6.0(jiti@2.6.1)): dependencies: - eslint: 10.5.0(jiti@2.6.1) + eslint: 10.6.0(jiti@2.6.1) eslint-formatter-pretty@7.1.0: dependencies: @@ -5703,35 +5746,35 @@ snapshots: string-width: 8.2.1 supports-hyperlinks: 4.5.0 - eslint-formatting-reporter@0.0.0(eslint@10.5.0(jiti@2.6.1)): + eslint-formatting-reporter@0.0.0(eslint@10.6.0(jiti@2.6.1)): dependencies: - eslint: 10.5.0(jiti@2.6.1) + eslint: 10.6.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.5.0(jiti@2.6.1)): + eslint-plugin-format@2.0.1(eslint@10.6.0(jiti@2.6.1)): dependencies: '@dprint/formatter': 0.5.1 '@dprint/markdown': 0.21.1 '@dprint/toml': 0.7.0 - eslint: 10.5.0(jiti@2.6.1) - eslint-formatting-reporter: 0.0.0(eslint@10.5.0(jiti@2.6.1)) + eslint: 10.6.0(jiti@2.6.1) + eslint-formatting-reporter: 0.0.0(eslint@10.6.0(jiti@2.6.1)) eslint-parser-plain: 0.1.1 ohash: 2.0.11 oxfmt: 0.35.0 - prettier: 3.8.5 + prettier: 3.9.1 synckit: 0.11.13 - eslint-plugin-prettier@5.5.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.5.0(jiti@2.6.1)))(eslint@10.5.0(jiti@2.6.1))(prettier@3.8.5): + eslint-plugin-prettier@5.5.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.6.0(jiti@2.6.1)))(eslint@10.6.0(jiti@2.6.1))(prettier@3.9.1): dependencies: - eslint: 10.5.0(jiti@2.6.1) - prettier: 3.8.5 + eslint: 10.6.0(jiti@2.6.1) + prettier: 3.9.1 prettier-linter-helpers: 1.0.1 synckit: 0.11.13 optionalDependencies: '@types/eslint': 9.6.1 - eslint-config-prettier: 10.1.8(eslint@10.5.0(jiti@2.6.1)) + eslint-config-prettier: 10.1.8(eslint@10.6.0(jiti@2.6.1)) eslint-rule-docs@1.1.235: {} @@ -5746,9 +5789,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.5.0(jiti@2.6.1): + eslint@10.6.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.6.0 @@ -6133,7 +6176,7 @@ snapshots: js-tokens@4.0.0: {} - js-yaml@4.2.0: + js-yaml@4.3.0: dependencies: argparse: 2.0.1 @@ -6315,16 +6358,16 @@ snapshots: dependencies: minipass: 7.1.3 - mint-tsdocs@0.0.8(@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@25.9.4)(@typescript-eslint/parser@8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.5.0(jiti@2.6.1))(react-dom@18.3.1(react@18.3.1))(typescript@6.0.3): + mint-tsdocs@0.0.8(@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@26.0.1)(@typescript-eslint/parser@8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.6.0(jiti@2.6.1))(react-dom@18.3.1(react@18.3.1))(typescript@6.0.3): dependencies: '@clack/prompts': 0.11.0 - '@microsoft/api-extractor': 7.58.9(@types/node@25.9.4) - '@microsoft/api-extractor-model': 7.33.8(@types/node@25.9.4) + '@microsoft/api-extractor': 7.58.9(@types/node@26.0.1) + '@microsoft/api-extractor-model': 7.33.8(@types/node@26.0.1) '@microsoft/tsdoc': 0.16.0 '@mintlify/components': 0.3.15(@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rushstack/node-core-library': 5.23.1(@types/node@25.9.4) - '@rushstack/terminal': 0.19.5(@types/node@25.9.4) - '@rushstack/ts-command-line': 5.3.10(@types/node@25.9.4) + '@rushstack/node-core-library': 5.23.1(@types/node@26.0.1) + '@rushstack/terminal': 0.19.5(@types/node@26.0.1) + '@rushstack/ts-command-line': 5.3.10(@types/node@26.0.1) chalk: 5.6.2 cli-table3: 0.6.5 clsx: 2.1.1 @@ -6337,8 +6380,8 @@ snapshots: react: 18.3.1 resolve: 1.22.12 optionalDependencies: - '@typescript-eslint/parser': 8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3) - eslint: 10.5.0(jiti@2.6.1) + '@typescript-eslint/parser': 8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3) + eslint: 10.6.0(jiti@2.6.1) transitivePeerDependencies: - '@headlessui/react' - '@types/node' @@ -6525,7 +6568,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.8.5: {} + prettier@3.9.1: {} pretty-ms@9.3.0: dependencies: @@ -6740,7 +6783,7 @@ snapshots: dependencies: '@pkgr/core': 0.3.6 - tar@7.5.17: + tar@7.5.19: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -6812,13 +6855,13 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3): + typescript-eslint@8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.62.0(@typescript-eslint/parser@8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3) - '@typescript-eslint/parser': 8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.62.0(@typescript-eslint/parser@8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/parser': 8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3) '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.0(eslint@10.5.0(jiti@2.6.1))(typescript@6.0.3) - eslint: 10.5.0(jiti@2.6.1) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.6.1))(typescript@6.0.3) + eslint: 10.6.0(jiti@2.6.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f538565d..15944f36 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,24 +10,24 @@ allowBuilds: catalogs: build: - tsdown: ^0.22.1 + tsdown: ^0.22.3 unrun: ^0.3.0 ci: - '@commitlint/cli': ^21.0.2 - '@commitlint/config-conventional': ^21.0.2 + '@commitlint/cli': ^21.1.0 + '@commitlint/config-conventional': ^21.1.0 '@favware/cliff-jumper': ^6.0.0 - '@nanoforge-dev/actions': ^2.1.2 + '@nanoforge-dev/actions': ^2.1.5 husky: ^9.1.7 - lint-staged: ^17.0.7 + lint-staged: ^17.0.8 config: class-transformer: ^0.5.1 class-validator: ^0.14.3 core: - '@types/node': ^25.9.1 - turbo: ^2.9.16 + '@types/node': ^26.0.1 + turbo: ^2.10.0 typescript: ^6.0.3 docs: - '@microsoft/api-extractor': ^7.58.7 + '@microsoft/api-extractor': ^7.58.9 mint-tsdocs: ^0.0.8 typedoc: ^0.28.19 typedoc-plugin-markdown: ^4.11.0 @@ -36,13 +36,13 @@ catalogs: lint: '@eslint/js': ^10.0.1 '@trivago/prettier-plugin-sort-imports': ^6.0.2 - eslint: ^10.4.1 + eslint: ^10.6.0 eslint-config-prettier: ^10.1.8 eslint-formatter-pretty: ^7.1.0 eslint-plugin-format: ^2.0.1 eslint-plugin-prettier: ^5.5.5 globals: ^17.3.0 - prettier: ^3.8.3 + prettier: ^3.9.1 typescript-eslint: ^8.61.0 network: '@mapbox/node-pre-gyp': ^2.0.3 @@ -50,8 +50,5 @@ catalogs: wrtc: ^0.4.7 ws: ^8.20.1 test: - '@vitest/coverage-v8': ^4.1.8 - vitest: ^4.1.8 - -minimumReleaseAgeExclude: - - '@nanoforge-dev/actions@2.1.2' + '@vitest/coverage-v8': ^4.1.9 + vitest: ^4.1.9 From 6f350e1eeedc23c6cf38e280f8ba2a56abb1806f Mon Sep 17 00:00:00 2001 From: Exelo Date: Mon, 29 Jun 2026 23:41:34 +0900 Subject: [PATCH 6/6] style: fix due to prettier upgrade --- packages/ecs-lib/src/editor-manifest.type.ts | 6 +----- packages/network-client/src/utils.ts | 2 +- packages/network-server/src/utils.ts | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/ecs-lib/src/editor-manifest.type.ts b/packages/ecs-lib/src/editor-manifest.type.ts index 0dc7aa92..bf1af872 100644 --- a/packages/ecs-lib/src/editor-manifest.type.ts +++ b/packages/ecs-lib/src/editor-manifest.type.ts @@ -88,11 +88,7 @@ type ECSObjectElement = { * Type for component element */ type ECSElement = - | ECSStringElement - | ECSNumberElement - | ECSBooleanElement - | ECSArrayElement - | ECSObjectElement; + ECSStringElement | ECSNumberElement | ECSBooleanElement | ECSArrayElement | ECSObjectElement; /** * Manifest for a component to be used in the NanoForge Editor diff --git a/packages/network-client/src/utils.ts b/packages/network-client/src/utils.ts index 9a5cf903..68cdef1a 100644 --- a/packages/network-client/src/utils.ts +++ b/packages/network-client/src/utils.ts @@ -37,7 +37,7 @@ function uint8ArrayContains(haystack: Uint8Array, needle: Uint8Array): number { const buildKMPTable = (needle: Uint8Array): number[] => { const table = new Array(needle.length).fill(0); let len = 0; - for (let i = 1; i < needle.length; ) { + for (let i = 1; i < needle.length;) { if (needle[i] === needle[len]) { len++; table[i] = len; diff --git a/packages/network-server/src/utils.ts b/packages/network-server/src/utils.ts index 5a9af80b..20def70c 100644 --- a/packages/network-server/src/utils.ts +++ b/packages/network-server/src/utils.ts @@ -64,7 +64,7 @@ function uint8ArrayContains(haystack: Uint8Array, needle: Uint8Array): number { const buildKMPTable = (needle: Uint8Array): number[] => { const table = new Array(needle.length).fill(0); let len = 0; - for (let i = 1; i < needle.length; ) { + for (let i = 1; i < needle.length;) { if (needle[i] === needle[len]) { len++; table[i] = len;