npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

myshengine-core

v0.9.8

Published

TypeScript-based ECS framework for high-performance, modular game architecture.

Downloads

14

Readme

Mysh

npm version License: MIT Build Status TypeScript

🧠 ECS-фреймворк на TypeScript для архитектурно чистых и масштабируемых игр.


📖 Оглавление


🧠 Введение

Mysh — это ECS-фреймворк (Entity Component System) на TypeScript, спроектированный для масштабируемой, модульной и легко тестируемой архитектуры. Он не содержит графических или рендеринговых решений, предоставляя разработчику полный контроль над структурой и логикой игры.


📦 Установка

npm install myshengine-core

🚀 Быстрый старт

Для запуска достаточно создать экземпляр MyshApp, инициализировать его и настроить прослушку событий:

const handlers: ISignalConfig[] = [
    {
        signal: OnUpdateSignal,
        executions: [{ group: OnUpdateGroup }],
    },
];

const mysh = new MyshApp();
mysh.init();
mysh.listen(handlers);

🧭 Когда использовать Mysh

Используйте Mysh, если вы:

  • Строите масштабируемую архитектуру с низкой связанностью
  • Используете рендерер (PixiJS, Cocos, WebGL и пр.) и хотите ECS-ядро
  • Предпочитаете event-driven или гибридный подход
  • Хотите изолировать игровую логику от рендера
  • Работаете с FSM, DI и Store
  • Разрабатываете движок или расширяемый фреймворк

🚫 Не подходит, если...

Mysh не подойдёт, если вы:

  • Ожидаете встроенный движок с графикой и UI
  • Хотите визуальную среду разработки
  • Не знакомы с ECS или DI
  • Ищете комплексное решение с ассет-менеджментом и анимацией

🧱 Основы архитектуры ECS

Entity

Entity — логическое представление игрового объекта. Оно содержит компоненты и предоставляет API для их управления.

const entity = new Entity('player');
entity.addComponent(new HealthComponent());
entity.removeComponent(HealthComponent);
entity.hasComponents([HealthComponent]);

Component

В качестве компонента может выступать любой класс. Это могут быть как простые структуры данных, так и классы с логикой (если это оправдано архитектурно).

class HealthComponent {
    public value = 100;
}

System

Системы реализуют игровую логику. Они независимы друг от друга и работают с сущностями, отфильтрованными по нужным компонентам.

class DamageSystem extends System {
    public execute(): void {
        const entities = this.filter({ includes: [HealthComponent] });

        entities.forEach((entity) => {
            const health = entity.getComponent(HealthComponent);
            health.value -= 10;
        });
    }
}

🔄 Управление потоком (Flow)

Mysh поддерживает два подхода:

  • Update-driven: классическое выполнение систем каждый кадр (в Update Loop).
  • Event-driven: системы выполняются только при необходимости, реагируя на события.

Оба подхода можно свободно комбинировать в рамках одного проекта.


📚 Группы систем (SystemGroup)

Группы систем позволяют задать точный порядок их выполнения.

class GameLoopGroup extends SystemGroup {
    public setup(): IGroupOption[] {
        return [
            { instance: this.provide(InputSystem, null) },
            { instance: this.provide(PhysicsSystem, null) },
            { instance: this.provide(RenderSystem, null) },
        ];
    }
}

🧠 Состояния (FSM)

FSM в Mysh — это мощный инструмент для управления игровым потоком. Поддерживаются вложенные состояния, переходы с проверками, глобальное хранилище (Store), события входа/выхода и многое другое.

const fsm = new FSM({
    name: 'mainFlow',
    initialState: 'boot',
    states: [
        {
            name: 'boot',
            transitions: { init: 'loading' },
            onEnter: [BootGroup],
        },
        {
            name: 'loading',
            transitions: { done: 'play' },
            onEnter: [LoadAssetsGroup],
        },
        {
            name: 'play',
            transitions: { error: 'error' },
        },
    ],
});

🛠 Дополнительные возможности

Сервисы

Сервисы — это классы с общей логикой, доступные во всех системах и группах через Dependency Injection.

class LoggerService {
    log(msg: string) {
        console.log(msg);
    }
}

const LOGGER = Symbol('LOGGER');

class MySystem extends System {
    @Inject(LOGGER) private logger!: LoggerService;

    public execute() {
        this.logger.log('System executed');
    }
}
class MyGroup extends SystemGroup {
    public setupDependencies(): Provider[] {
        return [{ provide: LOGGER, useClass: LoggerService }];
    }
}

Store

Store — глобальное иммутабельное хранилище данных, интегрируемое в FSM и Системы.

const store = new Store<{ score: number }>({ score: 0 });

store.setState((state) => ({
    score: state.score + 10,
}));

📄 Лицензия

MIT License © 2025 Daniil Stolpnik