JSPM

  • Created
  • Published
  • Downloads 41
  • Score
    100M100P100Q94127F
  • License MIT

React state router for elCRM: global Router.data, encrypted session persistence, lazy-loaded pages/features (import.meta.glob), optional URL/history sync.

Package Exports

  • @elcrm/router

Readme

@elcrm/router

React state router для elCRM: глобальное состояние (Router.data), опциональный URL поверх него, ленивая загрузка чанков (import.meta.glob / Vite), шифрованный persist в sessionStorage.

Это не полный аналог React Router: URL — опциональный слой. Есть GuardRoute, RouteLoader, RouterOutletStack, LoadRoute.


Содержание


Установка

npm install @elcrm/router @elcrm/crypto react
Peer Версия
react >=18.2.0
@types/react >=18.2.0
@elcrm/crypto ^0.0.1

react-dom подключает приложение (тот же major, что у react).


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

Минимум для Vite: glob и createRouter.

import { Router, LoadRoute } from "@elcrm/router";

const glob = import.meta.glob("./{features,pages}/**/*.{tsx,ts,jsx,js}", {
    eager: false,
});

Router.createRouter({
    defaults: {
        page: "Home",
        feature: "Dashboard",
        id: 0,
    },
    auth: "Login",
    glob,
});

export function App() {
    return (
        <LoadRoute variant="page" defaultName="Home">
            <span aria-hidden />
        </LoadRoute>
    );
}

Дальше: Router.useRouter, setRouter, mergeRouter, LoadRoute, RouterOutletStack — см. таблицы ниже.

Идея: после createRouter вызываются восстановление сессии (Load) и при необходимости разбор URL (urlTemplate). useRouter / emitRouter реагируют на обновления data.


Router.createRouter — опции

Все поля опциональны; при повторном вызове подмешиваются значения из текущего конфига.

Опция Назначение
defaults Начальный Router.data и initialData
auth, authKey, authFlagStorageKey, authFlagStorage Ветка «вход без сессии» и флаг в storage
debug Логи
dir База для путей чанков (по умолчанию ".")
importLoader / устар. importModules (path) => import(...)
glob, pages, features / устар. modules Glob или база для страниц/фич
persist, persistSession Запись в sessionStorage или своё хранилище
urlTemplate, urlBase, urlNavigateMode, onUrlMismatch Синхронизация с адресной строкой
paths Шаблоны путей к chunk по variant, напр. ./pages или ./settings/{segment}/index
loadSegmentLayouts Устар.; для миграций / label

Сегменты из URL попадают в Router.data как в строке (регистр библиотека не нормализует).


API состояния

Объект Router и одноимённые функции: setRouter, getRouter, mergeRouter, matchesRouter, hasRouter, prevRouter, getRouterData, pickRouter, useRouter, emitRouter, resetRouter, flushPersistToSession, createImportLoader, getImportLoader, requireImportLoader, importFromRouter.


Типизация

Один раз опишите RouterDataMap: ключ = имя сегмента (то же, что variant / stateKey в LoadRoute), тип значения = допустимые значения (страницы, секции, произвольное число для id и т.д.).

declare module "@elcrm/router" {
    interface RouterDataMap {
        page: "login" | "recover" | "passkey" | "main";
        modules:
            | "home"
            | "promotions"
            | "calendar"
            | "telegram"
            | "inn"
            | "requests"
            | "companies"
            | "questions"
            | "analytics"
            | "users"
            | "settings";
        settingsSection: "profile" | "notifications" | "ui" | "security";
        id: number;
    }
}

LoadRoute и paths в createRouter получают проверку variant по ключам этой схемы. Отдельный RouterLoadSegmentKinds не нужен (он только резерв, если RouterDataMap не задаёте — тогда доступны встроенные page | feature).

Кастомные папки для чанков:

Router.createRouter({
    defaults: { page: "main", modules: "home", settingsSection: "profile" },
    paths: {
        page: "./pages",
        modules: "./modules/{segment}/index",
        settingsSection: "./settings/{segment}/index",
    },
    glob,
});

createRouterApi<T>() — типизированный API без глобального augmentation. defineRouterConfig = createRouter.


Загрузка чанков и paths

  • LoadRoute: variant задаёт шаблон пути (paths в createRouter; по умолчанию pagepages/{segment}, featurefeatures/{segment}/index).
  • Либо строковый путь + importLoader, либо resolveLazyPage (см. docs/load-route-and-import.md).
  • createPageLazyResolverFromImportMeta(import.meta.url, { segmentKind: "page" }) учитывает paths.

Рекомендуется import.meta.glob и поле glob в createRouter. Для корректных относительных импортов из приложения — createImportLoaderFromImportMeta(import.meta.url).


URL-router

Непустой urlTemplate в createRouter включает синхронизацию с history. Утилиты: matchUrlTemplate, buildUrlFromTemplate, syncDataToUrl, applyPathnameToRouterData.


Опционально: guard, loader, outlet

  • GuardRoute — условия, редирект, watchKey (см. GuardRouteProps).
  • RouteLoader — асинхронные данные в Router.data.
  • RouterOutletStack — цепочка LoadRoute по массиву { stateKey, variant }.

Лицензия

MIT — файл LICENSE.

Полный список типов и экспортов — в автодополнении IDE и в dist/*.d.ts после сборки.