@ngstato/angular 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/README.md +161 -394
- package/dist/devtools.component.d.ts +15 -1
- package/dist/esm2022/create-angular-store.mjs +45 -9
- package/dist/esm2022/devtools.component.mjs +255 -45
- package/dist/fesm2022/ngstato-angular.mjs +297 -51
- package/dist/fesm2022/ngstato-angular.mjs.map +1 -1
- package/package.json +62 -63
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngstato-angular.mjs","sources":["../../src/inject-store.ts","../../src/provide-ngstato.ts","../../src/create-angular-store.ts","../../src/devtools.component.ts","../../src/index.ts","../../src/ngstato-angular.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────\r\n// @ngstato/angular — injectStore()\r\n// Helper pour injecter un store dans un composant\r\n// ─────────────────────────────────────────────────────\r\n\r\nimport { inject, type Type } from '@angular/core'\r\n\r\nexport function injectStore<T>(store: Type<T>): T {\r\n return inject(store)\r\n}","import {\r\n makeEnvironmentProviders,\r\n InjectionToken,\r\n isDevMode\r\n} from '@angular/core'\r\nimport { configureHttp, devTools } from '@ngstato/core'\r\nimport type { StatoConfig } from '@ngstato/core'\r\n\r\nexport interface StatoAngularConfig {\r\n http?: StatoConfig\r\n devtools?: boolean\r\n}\r\n\r\nexport const STATO_CONFIG = new InjectionToken<StatoAngularConfig>('STATO_CONFIG')\r\n\r\nexport function provideStato(config: StatoAngularConfig = {}) {\r\n\r\n if (config.http) {\r\n configureHttp(config.http)\r\n }\r\n\r\n // DevTools — ignorés automatiquement en production\r\n // isDevMode() est géré par Angular au build\r\n // → false en prod même si devtools: true\r\n if (config.devtools && isDevMode()) {\r\n console.info(\r\n '%c[Stato] 🛠 DevTools activés',\r\n 'background:#1e40af;color:white;padding:4px 8px;border-radius:4px;font-weight:bold'\r\n )\r\n devTools.open()\r\n }\r\n\r\n return makeEnvironmentProviders([\r\n {\r\n provide: STATO_CONFIG,\r\n useValue: config\r\n }\r\n ])\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/angular — createAngularStore()\r\n// Transforme un ngstato store en store Angular avec Signals\r\n// ─────────────────────────────────────────────────────\r\n\r\nimport {\r\n signal,\r\n computed,\r\n Injectable,\r\n OnDestroy,\r\n Signal\r\n} from '@angular/core'\r\n\r\nimport { createStore } from '@ngstato/core'\r\nimport type { StatoStoreConfig } from '@ngstato/core'\r\n\r\n// ─────────────────────────────────────────────────────\r\n// FONCTION PRINCIPALE — createAngularStore()\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function createAngularStore<S extends object>(\r\n config: S & StatoStoreConfig<S>\r\n) {\r\n // 1. Créer le store core\r\n const coreStore = createStore(config)\r\n\r\n // 2. Créer un Signal pour chaque propriété du state\r\n const signals: Record<string, ReturnType<typeof signal>> = {}\r\n const initialState = coreStore.getState()\r\n\r\n for (const key of Object.keys(initialState as object)) {\r\n signals[key] = signal((initialState as any)[key])\r\n }\r\n\r\n // 3. Synchroniser les Signals avec le state core\r\n coreStore.subscribe((newState: any) => {\r\n for (const key of Object.keys(newState)) {\r\n if (signals[key]) {\r\n signals[key].set(newState[key])\r\n }\r\n }\r\n })\r\n\r\n // 4. Construire l objet public Angular\r\n const angularStore: any = {\r\n __store__: coreStore.__store__\r\n }\r\n\r\n // 5. Exposer chaque propriété comme Signal\r\n for (const key of Object.keys(initialState as object)) {\r\n Object.defineProperty(angularStore, key, {\r\n get: () => signals[key],\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n\r\n // 6. Exposer chaque computed comme Signal computed\r\n const { computed: computedConfig } = config as StatoStoreConfig<S>\r\n if (computedConfig) {\r\n for (const key of Object.keys(computedConfig)) {\r\n const computedSignal = computed(() => coreStore[key])\r\n Object.defineProperty(angularStore, key, {\r\n get: () => computedSignal,\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n }\r\n\r\n // 7. Exposer chaque action directement\r\n const { actions } = config as StatoStoreConfig<S>\r\n if (actions) {\r\n for (const name of Object.keys(actions)) {\r\n angularStore[name] = (...args: unknown[]) =>\r\n coreStore.__store__.dispatch(name, ...args)\r\n }\r\n }\r\n\r\n // 8. Unifier le lifecycle avec @ngstato/core\r\n // (init est idempotent: onInit ne sera appelé qu'une fois)\r\n coreStore.__store__.init(angularStore)\r\n\r\n // 9. Exposer destroy pour le cleanup\r\n angularStore.__destroy__ = () => {\r\n coreStore.__store__.destroy(angularStore)\r\n }\r\n\r\n return angularStore\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// OLD: StatoStoreBase (remplacée par StatoStore avec Proxy)\r\n// Gardée pour backward compatibility si besoin\r\n// ─────────────────────────────────────────────────────\r\n@Injectable()\r\nexport class StatoStoreBase implements OnDestroy {\r\n storeInstance: any\r\n\r\n initStore<S extends object>(config: S & StatoStoreConfig<S>) {\r\n this.storeInstance = createAngularStore(config)\r\n\r\n // Copier toutes les propriétés sur this\r\n for (const key of Object.keys(this.storeInstance)) {\r\n if (key !== '__store__' && key !== '__destroy__') {\r\n Object.defineProperty(this, key, {\r\n get: () => this.storeInstance[key],\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n }\r\n\r\n // Copier les actions\r\n const { actions } = config as StatoStoreConfig<S>\r\n if (actions) {\r\n for (const name of Object.keys(actions)) {\r\n Object.defineProperty(this, name, {\r\n get: () => this.storeInstance[name],\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.storeInstance?.__destroy__()\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// OLD: Config-based StatoStore (deprecated)\r\n// Gardée pour backward compatibility\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function StatoStoreOld<S extends object>(\r\n config: S & StatoStoreConfig<S>\r\n) {\r\n @Injectable({ providedIn: 'root' })\r\n class ConcreteStore extends StatoStoreBase {\r\n constructor() {\r\n super()\r\n this.initStore(config)\r\n }\r\n }\r\n\r\n return ConcreteStore\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// HELPER TYPE — Extrait automatiquement les types du store\r\n// Pour auto-inférer state + actions + computed sans boilerplate\r\n// ─────────────────────────────────────────────────────\r\n\r\ntype ExtractStoreType<T> = Omit<T, '__store__' | '__destroy__'>\r\n\r\n// ─────────────────────────────────────────────────────\r\n// FACTORY — StatoStore()\r\n// Crée un service Angular injectable avec auto-proxy\r\n//\r\n// Type-safe grâce aux génériques avancés — ZÉRO boilerplate!\r\n//\r\n// Usage :\r\n// export class UserStore extends StatoStore(() => {\r\n// const service = inject(UserService)\r\n// return createUserStore(service)\r\n// })\r\n// // ✅ store.user, store.loadUser(), etc — tous typés auto!\r\n// // ✅ Aucun \"declare readonly\" requis\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function StatoStore<S extends object>(\r\n factory: () => S\r\n): new() => ExtractStoreType<S> & OnDestroy {\r\n @Injectable({ providedIn: 'root' })\r\n class ConcreteStore implements OnDestroy {\r\n private _store: any\r\n [key: string]: any\r\n\r\n constructor() {\r\n // factory() est appelée dans le contexte d'injection Angular.\r\n // Si factory() retourne déjà un store ngstato (createStore),\r\n // on l'utilise tel quel. Sinon on le convertit via createAngularStore().\r\n const produced = factory() as any\r\n this._store = produced?.__store__ ? produced : createAngularStore(produced)\r\n\r\n // Proxy dynamique: plus besoin de déclaration manuelle des getters/actions.\r\n return new Proxy(this, {\r\n get: (target, prop, receiver) => {\r\n if (prop in target) {\r\n return Reflect.get(target, prop, receiver)\r\n }\r\n return this._store?.[prop as keyof typeof this._store]\r\n },\r\n set: (target, prop, value, receiver) => {\r\n if (prop in target) {\r\n return Reflect.set(target, prop, value, receiver)\r\n }\r\n if (this._store && prop in this._store) {\r\n this._store[prop] = value\r\n return true\r\n }\r\n ;(target as any)[prop] = value\r\n return true\r\n },\r\n has: (target, prop) => prop in target || prop in (this._store ?? {}),\r\n ownKeys: (target) => {\r\n const targetKeys = Reflect.ownKeys(target)\r\n const storeKeys = this._store ? Reflect.ownKeys(this._store) : []\r\n return Array.from(new Set([...targetKeys, ...storeKeys]))\r\n },\r\n getOwnPropertyDescriptor: (target, prop) => {\r\n const targetDesc = Reflect.getOwnPropertyDescriptor(target, prop)\r\n if (targetDesc) return targetDesc\r\n if (this._store && prop in this._store) {\r\n return {\r\n configurable: true,\r\n enumerable: true,\r\n writable: true,\r\n value: this._store[prop]\r\n }\r\n }\r\n return undefined\r\n }\r\n })\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this._store?.__destroy__) {\r\n this._store.__destroy__()\r\n return\r\n }\r\n if (this._store?.__store__?.destroy) {\r\n this._store.__store__.destroy(this._store)\r\n }\r\n }\r\n }\r\n\r\n return ConcreteStore as any\r\n}","import {\n Component,\n OnInit,\n OnDestroy,\n signal\n} from '@angular/core'\nimport { devTools } from '@ngstato/core'\nimport type { ActionLog } from '@ngstato/core'\nimport { JsonPipe } from '@angular/common'\n\n@Component({\n selector: 'ngstato-devtools',\n standalone: true,\n imports: [JsonPipe],\n template: `\n <!-- Bouton flottant -->\n @if (!isOpen()) {\n <button class=\"devtools-fab\" (click)=\"toggle()\">\n 🛠 Stato\n </button>\n }\n\n <!-- Panel -->\n @if (isOpen()) {\n <div\n class=\"devtools-panel\"\n [class.devtools-panel--minimized]=\"isMinimized()\"\n [style.left.px]=\"posX()\"\n [style.top.px]=\"posY()\"\n [style.width.px]=\"isMinimized() ? 200 : panelWidth()\"\n [style.height]=\"isMinimized() ? 'auto' : panelHeight() + 'px'\"\n >\n\n <!-- Header — draggable -->\n <div\n class=\"devtools-header\"\n (mousedown)=\"onDragStart($event)\"\n >\n <span class=\"devtools-title\">🛠 Stato</span>\n <div class=\"devtools-header-actions\">\n @if (!isMinimized()) {\n <button class=\"btn-icon\" (click)=\"clear()\" title=\"Vider\">🗑</button>\n }\n <button class=\"btn-icon\" (click)=\"toggleMinimize()\" title=\"Minimiser/Agrandir\">\n {{ isMinimized() ? '▲' : '▼' }}\n </button>\n <button class=\"btn-icon\" (click)=\"toggle()\" title=\"Fermer\">✕</button>\n </div>\n </div>\n\n <!-- Resize handle — coin bas droite -->\n @if (!isMinimized()) {\n <div\n class=\"devtools-resize\"\n (mousedown)=\"onResizeStart($event)\"\n >⊿</div>\n }\n\n @if (!isMinimized()) {\n\n <!-- Tabs -->\n <div class=\"devtools-tabs\">\n <button\n class=\"tab\"\n [class.tab--active]=\"activeTab() === 'actions'\"\n (click)=\"activeTab.set('actions')\"\n >\n Actions ({{ logs().length }})\n </button>\n <button\n class=\"tab\"\n [class.tab--active]=\"activeTab() === 'state'\"\n (click)=\"activeTab.set('state')\"\n >\n State\n </button>\n </div>\n\n <!-- Tab Actions -->\n @if (activeTab() === 'actions') {\n <div class=\"devtools-content\">\n @if (!logs().length) {\n <div class=\"devtools-empty\">Aucune action pour l'instant</div>\n }\n @for (log of logs(); track log.id) {\n <div\n class=\"log-item\"\n [class.log-item--error]=\"log.status === 'error'\"\n (click)=\"selectLog(log)\"\n >\n <div class=\"log-item__left\">\n <span class=\"log-status\">{{ log.status === 'success' ? '✓' : '✗' }}</span>\n <span class=\"log-name\">{{ log.name }}</span>\n </div>\n <div class=\"log-item__right\">\n @if (log.status === 'error') {\n <span class=\"log-error-badge\">erreur</span>\n } @else {\n <span class=\"log-duration\">{{ log.duration }}ms</span>\n }\n <span class=\"log-time\">{{ formatTime(log.at) }}</span>\n </div>\n </div>\n\n @if (selectedLog()?.id === log.id) {\n <div class=\"log-detail\">\n @if (log.error) {\n <div class=\"log-detail__error\">{{ log.error }}</div>\n }\n <div class=\"log-detail__section\">\n <span class=\"log-detail__label\">Avant</span>\n <pre>{{ log.prevState | json }}</pre>\n </div>\n <div class=\"log-detail__section\">\n <span class=\"log-detail__label\">Après</span>\n <pre>{{ log.nextState | json }}</pre>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Tab State -->\n @if (activeTab() === 'state') {\n <div class=\"devtools-content\">\n @if (logs().length) {\n <pre class=\"state-view\">{{ logs()[0].nextState | json }}</pre>\n } @else {\n <div class=\"devtools-empty\">Aucun state disponible</div>\n }\n </div>\n }\n }\n\n </div>\n }\n `,\n styles: [`\n .devtools-fab {\n position: fixed;\n bottom: 1.5rem;\n left: 1.5rem;\n background: #1e293b;\n color: white;\n border: none;\n border-radius: 999px;\n padding: 0.5rem 1rem;\n font-size: 0.85rem;\n font-weight: 600;\n cursor: pointer;\n z-index: 9999;\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\n transition: background 0.15s;\n }\n .devtools-fab:hover { background: #334155; }\n\n .devtools-panel {\n position: fixed;\n background: #0f172a;\n border-radius: 12px;\n box-shadow: 0 8px 32px rgba(0,0,0,0.4);\n z-index: 9999;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n font-family: 'Courier New', monospace;\n min-width: 200px;\n min-height: 40px;\n }\n\n .devtools-panel--minimized {\n border-radius: 8px;\n }\n\n .devtools-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.6rem 0.75rem;\n background: #1e293b;\n border-bottom: 1px solid #334155;\n cursor: grab;\n user-select: none;\n }\n .devtools-header:active { cursor: grabbing; }\n\n .devtools-title {\n color: #e2e8f0;\n font-size: 0.82rem;\n font-weight: 600;\n font-family: system-ui;\n }\n\n .devtools-header-actions { display: flex; gap: 0.25rem; }\n\n .btn-icon {\n background: transparent;\n color: #64748b;\n border: none;\n cursor: pointer;\n font-size: 0.8rem;\n padding: 0.15rem 0.35rem;\n border-radius: 4px;\n line-height: 1;\n }\n .btn-icon:hover { background: #334155; color: white; }\n\n .devtools-resize {\n position: absolute;\n bottom: 2px;\n right: 4px;\n color: #334155;\n font-size: 0.9rem;\n cursor: nwse-resize;\n user-select: none;\n line-height: 1;\n }\n .devtools-resize:hover { color: #64748b; }\n\n .devtools-tabs {\n display: flex;\n background: #1e293b;\n border-bottom: 1px solid #334155;\n }\n .tab {\n padding: 0.4rem 0.75rem;\n background: transparent;\n color: #64748b;\n border: none;\n cursor: pointer;\n font-size: 0.78rem;\n font-family: system-ui;\n }\n .tab:hover { color: #e2e8f0; }\n .tab--active { color: #3b82f6; border-bottom: 2px solid #3b82f6; }\n\n .devtools-content {\n overflow-y: auto;\n flex: 1;\n padding: 0.25rem 0;\n }\n\n .devtools-empty {\n padding: 2rem;\n text-align: center;\n color: #475569;\n font-size: 0.78rem;\n font-family: system-ui;\n }\n\n .log-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.35rem 0.75rem;\n cursor: pointer;\n border-bottom: 1px solid #1e293b;\n }\n .log-item:hover { background: #1e293b; }\n .log-item--error { background: #1a0a0a; }\n\n .log-item__left { display: flex; align-items: center; gap: 0.4rem; overflow: hidden; }\n .log-item__right { display: flex; align-items: center; gap: 0.4rem; flex-shrink: 0; }\n\n .log-status { font-size: 0.72rem; color: #22c55e; flex-shrink: 0; }\n .log-item--error .log-status { color: #ef4444; }\n .log-name { color: #e2e8f0; font-size: 0.75rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .log-duration { color: #64748b; font-size: 0.7rem; }\n .log-time { color: #475569; font-size: 0.68rem; }\n\n .log-error-badge {\n background: #7f1d1d;\n color: #fca5a5;\n font-size: 0.68rem;\n padding: 0.1rem 0.35rem;\n border-radius: 4px;\n }\n\n .log-detail {\n background: #0a0f1a;\n padding: 0.6rem 0.75rem;\n border-left: 3px solid #3b82f6;\n margin: 0 0.4rem 0.4rem;\n border-radius: 0 4px 4px 0;\n }\n .log-detail__error { color: #fca5a5; font-size: 0.72rem; margin-bottom: 0.4rem; }\n .log-detail__section { margin-bottom: 0.4rem; }\n .log-detail__label {\n color: #64748b;\n font-size: 0.68rem;\n display: block;\n margin-bottom: 0.2rem;\n font-family: system-ui;\n }\n pre {\n color: #86efac;\n font-size: 0.7rem;\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n max-height: 140px;\n overflow-y: auto;\n }\n .state-view {\n color: #86efac;\n font-size: 0.7rem;\n padding: 0.75rem;\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n }\n `]\n})\nexport class StatoDevToolsComponent implements OnInit, OnDestroy {\n\n private unsub?: () => void\n\n // State UI\n isOpen = signal(false)\n isMinimized = signal(false)\n activeTab = signal<'actions' | 'state'>('actions')\n logs = signal<ActionLog[]>([])\n selectedLog = signal<ActionLog | null>(null)\n\n // Position et taille\n posX = signal(24)\n posY = signal(window.innerHeight - 500)\n panelWidth = signal(420)\n panelHeight = signal(460)\n\n // Drag state\n private isDragging = false\n private isResizing = false\n private dragOffsetX = 0\n private dragOffsetY = 0\n private startW = 0\n private startH = 0\n private startX = 0\n private startY = 0\n\n // Bound listeners\n private boundMouseMove = this.onMouseMove.bind(this)\n private boundMouseUp = this.onMouseUp.bind(this)\n\n ngOnInit() {\n this.unsub = devTools.subscribe((state) => {\n this.logs.set(state.logs)\n this.isOpen.set(state.isOpen)\n })\n\n document.addEventListener('mousemove', this.boundMouseMove)\n document.addEventListener('mouseup', this.boundMouseUp)\n }\n\n ngOnDestroy() {\n this.unsub?.()\n document.removeEventListener('mousemove', this.boundMouseMove)\n document.removeEventListener('mouseup', this.boundMouseUp)\n }\n\n // ── Toggle ─────────────────────────────────────────\n toggle() { devTools.toggle() }\n toggleMinimize() { this.isMinimized.update(v => !v) }\n clear() { devTools.clear(); this.selectedLog.set(null) }\n selectLog(log: ActionLog) {\n this.selectedLog.set(this.selectedLog()?.id === log.id ? null : log)\n }\n formatTime(iso: string): string {\n return new Date(iso).toTimeString().slice(0, 8)\n }\n\n // ── Drag ───────────────────────────────────────────\n onDragStart(e: MouseEvent) {\n if ((e.target as HTMLElement).classList.contains('btn-icon')) return\n this.isDragging = true\n this.dragOffsetX = e.clientX - this.posX()\n this.dragOffsetY = e.clientY - this.posY()\n e.preventDefault()\n }\n\n // ── Resize ─────────────────────────────────────────\n onResizeStart(e: MouseEvent) {\n this.isResizing = true\n this.startW = this.panelWidth()\n this.startH = this.panelHeight()\n this.startX = e.clientX\n this.startY = e.clientY\n e.preventDefault()\n e.stopPropagation()\n }\n\n // ── Mouse Move ─────────────────────────────────────\n onMouseMove(e: MouseEvent) {\n if (this.isDragging) {\n this.posX.set(Math.max(0, e.clientX - this.dragOffsetX))\n this.posY.set(Math.max(0, e.clientY - this.dragOffsetY))\n }\n if (this.isResizing) {\n const newW = Math.max(300, this.startW + e.clientX - this.startX)\n const newH = Math.max(200, this.startH + e.clientY - this.startY)\n this.panelWidth.set(newW)\n this.panelHeight.set(newH)\n }\n }\n\n // ── Mouse Up ───────────────────────────────────────\n onMouseUp() {\n this.isDragging = false\n this.isResizing = false\n }\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/angular — API publique\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport { injectStore } from './inject-store'\r\nexport { provideStato } from './provide-ngstato'\r\nexport { createAngularStore, StatoStore } from './create-angular-store'\r\nexport type { StatoAngularConfig } from './provide-ngstato'\r\nexport { StatoDevToolsComponent } from './devtools.component'","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngstato-angular.mjs","sources":["../../src/inject-store.ts","../../src/provide-ngstato.ts","../../src/create-angular-store.ts","../../src/devtools.component.ts","../../src/index.ts","../../src/ngstato-angular.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────\r\n// @ngstato/angular — injectStore()\r\n// Helper pour injecter un store dans un composant\r\n// ─────────────────────────────────────────────────────\r\n\r\nimport { inject, type Type } from '@angular/core'\r\n\r\nexport function injectStore<T>(store: Type<T>): T {\r\n return inject(store)\r\n}","import {\r\n makeEnvironmentProviders,\r\n InjectionToken,\r\n isDevMode\r\n} from '@angular/core'\r\nimport { configureHttp, devTools } from '@ngstato/core'\r\nimport type { StatoConfig } from '@ngstato/core'\r\n\r\nexport interface StatoAngularConfig {\r\n http?: StatoConfig\r\n devtools?: boolean\r\n}\r\n\r\nexport const STATO_CONFIG = new InjectionToken<StatoAngularConfig>('STATO_CONFIG')\r\n\r\nexport function provideStato(config: StatoAngularConfig = {}) {\r\n\r\n if (config.http) {\r\n configureHttp(config.http)\r\n }\r\n\r\n // DevTools — ignorés automatiquement en production\r\n // isDevMode() est géré par Angular au build\r\n // → false en prod même si devtools: true\r\n if (config.devtools && isDevMode()) {\r\n console.info(\r\n '%c[Stato] 🛠 DevTools activés',\r\n 'background:#1e40af;color:white;padding:4px 8px;border-radius:4px;font-weight:bold'\r\n )\r\n devTools.open()\r\n }\r\n\r\n return makeEnvironmentProviders([\r\n {\r\n provide: STATO_CONFIG,\r\n useValue: config\r\n }\r\n ])\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/angular — createAngularStore()\r\n// Transforme un ngstato store en store Angular avec Signals\r\n// ─────────────────────────────────────────────────────\r\n\r\nimport {\r\n signal,\r\n computed,\r\n Injectable,\r\n OnDestroy,\r\n Signal\r\n} from '@angular/core'\r\n\r\nimport { createStore } from '@ngstato/core'\r\nimport type { StatoStoreConfig } from '@ngstato/core'\r\n\r\n// ─────────────────────────────────────────────────────\r\n// FONCTION PRINCIPALE — createAngularStore()\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function createAngularStore<S extends object>(\r\n config: S & StatoStoreConfig<S>\r\n) {\r\n // 1. Créer le store core — SANS l'initialiser\r\n // L'init sera fait après que l'angularStore soit prêt,\r\n // pour que les effects reçoivent la bonne référence dès le 1er run.\r\n const coreStore = createStore(config, { skipInit: true })\r\n\r\n // 2. Créer un Signal pour chaque propriété du state\r\n const signals: Record<string, ReturnType<typeof signal>> = {}\r\n const initialState = coreStore.getState()\r\n\r\n for (const key of Object.keys(initialState as object)) {\r\n signals[key] = signal((initialState as any)[key])\r\n }\r\n\r\n // 3. Synchroniser les Signals avec le state core\r\n coreStore.subscribe((newState: any) => {\r\n for (const key of Object.keys(newState)) {\r\n if (signals[key]) {\r\n signals[key].set(newState[key])\r\n }\r\n }\r\n })\r\n\r\n // 4. Construire l objet public Angular\r\n const angularStore: any = {\r\n __store__: coreStore.__store__\r\n }\r\n\r\n // 5. Exposer chaque propriété comme Signal\r\n for (const key of Object.keys(initialState as object)) {\r\n Object.defineProperty(angularStore, key, {\r\n get: () => signals[key],\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n\r\n // 6. Exposer chaque computed comme Signal computed\r\n // On force la lecture des signals Angular pour que le computed()\r\n // soit réactif via le système de change detection d'Angular.\r\n const { computed: computedConfig, selectors: selectorsConfig } = config as StatoStoreConfig<S>\r\n if (computedConfig) {\r\n for (const key of Object.keys(computedConfig)) {\r\n const fn = (computedConfig as any)[key]\r\n if (typeof fn !== 'function') continue\r\n const computedSignal = computed(() => {\r\n // Lire les signals Angular pour déclencher le tracking\r\n const snapshot: any = {}\r\n for (const stateKey of Object.keys(signals)) {\r\n snapshot[stateKey] = signals[stateKey]()\r\n }\r\n return fn(snapshot)\r\n })\r\n Object.defineProperty(angularStore, key, {\r\n get: () => computedSignal,\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n }\r\n\r\n // 6b. Exposer chaque selector memoïzé comme Signal computed\r\n if (selectorsConfig) {\r\n for (const key of Object.keys(selectorsConfig)) {\r\n const fn = (selectorsConfig as any)[key]\r\n if (typeof fn !== 'function') continue\r\n const selectorSignal = computed(() => {\r\n const snapshot: any = {}\r\n for (const stateKey of Object.keys(signals)) {\r\n snapshot[stateKey] = signals[stateKey]()\r\n }\r\n return fn(snapshot)\r\n })\r\n Object.defineProperty(angularStore, key, {\r\n get: () => selectorSignal,\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n }\r\n\r\n // 7. Exposer chaque action directement\r\n const { actions } = config as StatoStoreConfig<S>\r\n if (actions) {\r\n for (const name of Object.keys(actions)) {\r\n angularStore[name] = (...args: unknown[]) =>\r\n coreStore.__store__.dispatch(name, ...args)\r\n }\r\n }\r\n\r\n // 8. Exposer destroy pour le cleanup\r\n angularStore.__destroy__ = () => {\r\n coreStore.__store__.destroy(angularStore)\r\n }\r\n\r\n // 9. Initialiser le store UNE SEULE FOIS avec l'angularStore\r\n // C'est ici que onInit() est appelé et que les effects démarrent,\r\n // directement avec la bonne référence (angularStore avec Signals).\r\n // Aucun double _runEffects — un seul init, un seul run.\r\n coreStore.__store__.init(angularStore)\r\n\r\n return angularStore\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// OLD: StatoStoreBase (remplacée par StatoStore avec Proxy)\r\n// Gardée pour backward compatibility si besoin\r\n// ─────────────────────────────────────────────────────\r\n@Injectable()\r\nexport class StatoStoreBase implements OnDestroy {\r\n storeInstance: any\r\n\r\n initStore<S extends object>(config: S & StatoStoreConfig<S>) {\r\n this.storeInstance = createAngularStore(config)\r\n\r\n // Copier toutes les propriétés sur this\r\n for (const key of Object.keys(this.storeInstance)) {\r\n if (key !== '__store__' && key !== '__destroy__') {\r\n Object.defineProperty(this, key, {\r\n get: () => this.storeInstance[key],\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n }\r\n\r\n // Copier les actions\r\n const { actions } = config as StatoStoreConfig<S>\r\n if (actions) {\r\n for (const name of Object.keys(actions)) {\r\n Object.defineProperty(this, name, {\r\n get: () => this.storeInstance[name],\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.storeInstance?.__destroy__()\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// OLD: Config-based StatoStore (deprecated)\r\n// Gardée pour backward compatibility\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function StatoStoreOld<S extends object>(\r\n config: S & StatoStoreConfig<S>\r\n) {\r\n @Injectable({ providedIn: 'root' })\r\n class ConcreteStore extends StatoStoreBase {\r\n constructor() {\r\n super()\r\n this.initStore(config)\r\n }\r\n }\r\n\r\n return ConcreteStore\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// HELPER TYPE — Extrait automatiquement les types du store\r\n// Pour auto-inférer state + actions + computed sans boilerplate\r\n// ─────────────────────────────────────────────────────\r\n\r\ntype ExtractStoreType<T> = Omit<T, '__store__' | '__destroy__'>\r\n\r\n// ─────────────────────────────────────────────────────\r\n// FACTORY — StatoStore()\r\n// Crée un service Angular injectable avec auto-proxy\r\n//\r\n// Type-safe grâce aux génériques avancés — ZÉRO boilerplate!\r\n//\r\n// Usage :\r\n// export class UserStore extends StatoStore(() => {\r\n// const service = inject(UserService)\r\n// return createUserStore(service)\r\n// })\r\n// // ✅ store.user, store.loadUser(), etc — tous typés auto!\r\n// // ✅ Aucun \"declare readonly\" requis\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function StatoStore<S extends object>(\r\n factory: () => S\r\n): new() => ExtractStoreType<S> & OnDestroy {\r\n @Injectable({ providedIn: 'root' })\r\n class ConcreteStore implements OnDestroy {\r\n private _store: any\r\n [key: string]: any\r\n\r\n constructor() {\r\n // factory() est appelée dans le contexte d'injection Angular.\r\n // Si factory() retourne déjà un store ngstato (createStore),\r\n // on l'utilise tel quel. Sinon on le convertit via createAngularStore().\r\n const produced = factory() as any\r\n this._store = produced?.__store__ ? produced : createAngularStore(produced)\r\n\r\n // Proxy dynamique: plus besoin de déclaration manuelle des getters/actions.\r\n return new Proxy(this, {\r\n get: (target, prop, receiver) => {\r\n if (prop in target) {\r\n return Reflect.get(target, prop, receiver)\r\n }\r\n return this._store?.[prop as keyof typeof this._store]\r\n },\r\n set: (target, prop, value, receiver) => {\r\n if (prop in target) {\r\n return Reflect.set(target, prop, value, receiver)\r\n }\r\n if (this._store && prop in this._store) {\r\n this._store[prop] = value\r\n return true\r\n }\r\n ;(target as any)[prop] = value\r\n return true\r\n },\r\n has: (target, prop) => prop in target || prop in (this._store ?? {}),\r\n ownKeys: (target) => {\r\n const targetKeys = Reflect.ownKeys(target)\r\n const storeKeys = this._store ? Reflect.ownKeys(this._store) : []\r\n return Array.from(new Set([...targetKeys, ...storeKeys]))\r\n },\r\n getOwnPropertyDescriptor: (target, prop) => {\r\n const targetDesc = Reflect.getOwnPropertyDescriptor(target, prop)\r\n if (targetDesc) return targetDesc\r\n if (this._store && prop in this._store) {\r\n return {\r\n configurable: true,\r\n enumerable: true,\r\n writable: true,\r\n value: this._store[prop]\r\n }\r\n }\r\n return undefined\r\n }\r\n })\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this._store?.__destroy__) {\r\n this._store.__destroy__()\r\n return\r\n }\r\n if (this._store?.__store__?.destroy) {\r\n this._store.__store__.destroy(this._store)\r\n }\r\n }\r\n }\r\n\r\n return ConcreteStore as any\r\n}","import {\n Component,\n OnInit,\n OnDestroy,\n signal,\n computed\n} from '@angular/core'\nimport { devTools } from '@ngstato/core'\nimport type { ActionLog, DevToolsState } from '@ngstato/core'\nimport { JsonPipe, KeyValuePipe } from '@angular/common'\n\n@Component({\n selector: 'ngstato-devtools, stato-devtools',\n standalone: true,\n imports: [JsonPipe, KeyValuePipe],\n template: `\n <!-- Floating button -->\n @if (!isOpen()) {\n <button class=\"devtools-fab\" (click)=\"toggle()\">\n 🛠 Stato\n </button>\n }\n\n <!-- Panel -->\n @if (isOpen()) {\n <div\n class=\"devtools-panel\"\n [class.devtools-panel--minimized]=\"isMinimized()\"\n [style.left.px]=\"posX()\"\n [style.top.px]=\"posY()\"\n [style.width.px]=\"isMinimized() ? 220 : panelWidth()\"\n [style.height]=\"isMinimized() ? 'auto' : panelHeight() + 'px'\"\n >\n\n <!-- Header — draggable -->\n <div\n class=\"devtools-header\"\n (mousedown)=\"onDragStart($event)\"\n >\n <span class=\"devtools-title\">\n 🛠 Stato\n @if (isTimeTraveling()) {\n <span class=\"tt-badge\">TIME-TRAVEL</span>\n }\n </span>\n <div class=\"devtools-header-actions\">\n @if (!isMinimized()) {\n <button class=\"btn-icon\" (click)=\"clear()\" title=\"Clear\">🗑</button>\n }\n <button class=\"btn-icon\" (click)=\"toggleMinimize()\" title=\"Minimize\">\n {{ isMinimized() ? '▲' : '▼' }}\n </button>\n <button class=\"btn-icon\" (click)=\"toggle()\" title=\"Close\">✕</button>\n </div>\n </div>\n\n <!-- Resize handle -->\n @if (!isMinimized()) {\n <div\n class=\"devtools-resize\"\n (mousedown)=\"onResizeStart($event)\"\n >⊿</div>\n }\n\n @if (!isMinimized()) {\n\n <!-- Tabs -->\n <div class=\"devtools-tabs\">\n <button\n class=\"tab\"\n [class.tab--active]=\"activeTab() === 'actions'\"\n (click)=\"activeTab.set('actions')\"\n >\n Actions ({{ logs().length }})\n </button>\n <button\n class=\"tab\"\n [class.tab--active]=\"activeTab() === 'state'\"\n (click)=\"activeTab.set('state')\"\n >\n State\n </button>\n </div>\n\n <!-- Time-travel toolbar -->\n @if (activeTab() === 'actions' && logs().length) {\n <div class=\"tt-toolbar\">\n <button\n class=\"tt-btn\"\n (click)=\"onUndo()\"\n [disabled]=\"!canUndo()\"\n title=\"Undo (step back)\"\n >⏪</button>\n <button\n class=\"tt-btn\"\n (click)=\"onRedo()\"\n [disabled]=\"!canRedo()\"\n title=\"Redo (step forward)\"\n >⏩</button>\n @if (isTimeTraveling()) {\n <button\n class=\"tt-btn tt-btn--resume\"\n (click)=\"onResume()\"\n title=\"Resume live state\"\n >▶ Live</button>\n }\n <div class=\"tt-spacer\"></div>\n <button\n class=\"tt-btn tt-btn--export\"\n (click)=\"onExport()\"\n title=\"Export state snapshot (JSON)\"\n >📤</button>\n <button\n class=\"tt-btn tt-btn--import\"\n (click)=\"onImport()\"\n title=\"Import state snapshot\"\n >📥</button>\n </div>\n }\n\n <!-- Tab: Actions -->\n @if (activeTab() === 'actions') {\n <div class=\"devtools-content\">\n @if (!logs().length) {\n <div class=\"devtools-empty\">No actions yet</div>\n }\n @for (log of logs(); track log.id) {\n <div\n class=\"log-item\"\n [class.log-item--error]=\"log.status === 'error'\"\n [class.log-item--active]=\"activeLogId() === log.id\"\n [class.log-item--future]=\"isFutureLog(log)\"\n (click)=\"onTravelTo(log)\"\n >\n <div class=\"log-item__left\">\n <span class=\"log-status\">{{ log.status === 'success' ? '✓' : '✗' }}</span>\n <span class=\"log-name\">{{ log.name }}</span>\n </div>\n <div class=\"log-item__right\">\n @if (log.status === 'error') {\n <span class=\"log-error-badge\">error</span>\n } @else {\n <span class=\"log-duration\">{{ log.duration }}ms</span>\n }\n <span class=\"log-time\">{{ formatTime(log.at) }}</span>\n <button\n class=\"btn-icon btn-replay\"\n (click)=\"onReplay(log, $event)\"\n title=\"Replay this action\"\n >🔄</button>\n </div>\n </div>\n\n @if (selectedLog()?.id === log.id) {\n <div class=\"log-detail\">\n @if (log.error) {\n <div class=\"log-detail__error\">{{ log.error }}</div>\n }\n <div class=\"log-detail__section\">\n <span class=\"log-detail__label\">Before</span>\n <pre>{{ log.prevState | json }}</pre>\n </div>\n <div class=\"log-detail__section\">\n <span class=\"log-detail__label\">After</span>\n <pre>{{ log.nextState | json }}</pre>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Tab: State -->\n @if (activeTab() === 'state') {\n <div class=\"devtools-content\">\n @if (globalState().size) {\n @for (entry of globalState() | keyvalue; track entry.key) {\n <div class=\"state-store-block\">\n <div class=\"state-store-name\">{{ entry.key }}</div>\n <pre class=\"state-view\">{{ entry.value | json }}</pre>\n </div>\n }\n } @else {\n <div class=\"devtools-empty\">No state available</div>\n }\n </div>\n }\n }\n\n </div>\n }\n\n <!-- Hidden file input for import -->\n <input\n #fileInput\n type=\"file\"\n accept=\".json\"\n style=\"display: none\"\n (change)=\"onFileSelected($event)\"\n />\n `,\n styles: [`\n :host { font-family: system-ui, -apple-system, sans-serif; }\n\n .devtools-fab {\n position: fixed;\n bottom: 1.5rem;\n left: 1.5rem;\n background: #1e293b;\n color: white;\n border: none;\n border-radius: 999px;\n padding: 0.5rem 1rem;\n font-size: 0.85rem;\n font-weight: 600;\n cursor: pointer;\n z-index: 9999;\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\n transition: background 0.15s;\n }\n .devtools-fab:hover { background: #334155; }\n\n .devtools-panel {\n position: fixed;\n background: #0f172a;\n border-radius: 12px;\n box-shadow: 0 8px 32px rgba(0,0,0,0.5);\n z-index: 9999;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n font-family: 'Courier New', monospace;\n min-width: 200px;\n min-height: 40px;\n border: 1px solid #1e293b;\n }\n\n .devtools-panel--minimized {\n border-radius: 8px;\n }\n\n .devtools-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.6rem 0.75rem;\n background: #1e293b;\n border-bottom: 1px solid #334155;\n cursor: grab;\n user-select: none;\n }\n .devtools-header:active { cursor: grabbing; }\n\n .devtools-title {\n color: #e2e8f0;\n font-size: 0.82rem;\n font-weight: 600;\n font-family: system-ui;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n }\n\n .tt-badge {\n background: #7c3aed;\n color: #fff;\n font-size: 0.6rem;\n padding: 0.12rem 0.4rem;\n border-radius: 4px;\n font-weight: 700;\n letter-spacing: 0.05em;\n animation: tt-pulse 1.5s ease-in-out infinite;\n }\n @keyframes tt-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.6; }\n }\n\n .devtools-header-actions { display: flex; gap: 0.25rem; }\n\n .btn-icon {\n background: transparent;\n color: #64748b;\n border: none;\n cursor: pointer;\n font-size: 0.8rem;\n padding: 0.15rem 0.35rem;\n border-radius: 4px;\n line-height: 1;\n }\n .btn-icon:hover { background: #334155; color: white; }\n\n .devtools-resize {\n position: absolute;\n bottom: 2px;\n right: 4px;\n color: #334155;\n font-size: 0.9rem;\n cursor: nwse-resize;\n user-select: none;\n line-height: 1;\n }\n .devtools-resize:hover { color: #64748b; }\n\n /* ── Tabs ─────────────────────────────────────────── */\n .devtools-tabs {\n display: flex;\n background: #1e293b;\n border-bottom: 1px solid #334155;\n }\n .tab {\n padding: 0.4rem 0.75rem;\n background: transparent;\n color: #64748b;\n border: none;\n cursor: pointer;\n font-size: 0.78rem;\n font-family: system-ui;\n transition: color 0.15s;\n }\n .tab:hover { color: #e2e8f0; }\n .tab--active { color: #3b82f6; border-bottom: 2px solid #3b82f6; }\n\n /* ── Time-travel toolbar ──────────────────────────── */\n .tt-toolbar {\n display: flex;\n align-items: center;\n gap: 0.2rem;\n padding: 0.3rem 0.5rem;\n background: #0f172a;\n border-bottom: 1px solid #1e293b;\n }\n\n .tt-btn {\n background: #1e293b;\n border: 1px solid #334155;\n color: #94a3b8;\n padding: 0.2rem 0.5rem;\n border-radius: 4px;\n font-size: 0.72rem;\n cursor: pointer;\n transition: all 0.15s;\n font-family: system-ui;\n }\n .tt-btn:hover:not(:disabled) {\n background: #334155;\n color: #e2e8f0;\n border-color: #475569;\n }\n .tt-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n .tt-btn--resume {\n background: #7c3aed;\n border-color: #7c3aed;\n color: white;\n font-weight: 600;\n }\n .tt-btn--resume:hover:not(:disabled) {\n background: #6d28d9;\n }\n .tt-btn--export, .tt-btn--import {\n font-size: 0.68rem;\n }\n .tt-spacer { flex: 1; }\n\n /* ── Content ──────────────────────────────────────── */\n .devtools-content {\n overflow-y: auto;\n flex: 1;\n padding: 0.25rem 0;\n }\n\n .devtools-empty {\n padding: 2rem;\n text-align: center;\n color: #475569;\n font-size: 0.78rem;\n font-family: system-ui;\n }\n\n /* ── Log items ────────────────────────────────────── */\n .log-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.35rem 0.75rem;\n cursor: pointer;\n border-bottom: 1px solid #1e293b;\n transition: background 0.1s;\n }\n .log-item:hover { background: #1e293b; }\n .log-item--error { background: #1a0a0a; }\n .log-item--active {\n background: #1e1b4b !important;\n border-left: 3px solid #7c3aed;\n }\n .log-item--future {\n opacity: 0.35;\n }\n\n .log-item__left { display: flex; align-items: center; gap: 0.4rem; overflow: hidden; flex: 1; }\n .log-item__right { display: flex; align-items: center; gap: 0.35rem; flex-shrink: 0; }\n\n .log-status { font-size: 0.72rem; color: #22c55e; flex-shrink: 0; }\n .log-item--error .log-status { color: #ef4444; }\n .log-name { color: #e2e8f0; font-size: 0.75rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .log-duration { color: #64748b; font-size: 0.7rem; }\n .log-time { color: #475569; font-size: 0.68rem; }\n\n .log-error-badge {\n background: #7f1d1d;\n color: #fca5a5;\n font-size: 0.68rem;\n padding: 0.1rem 0.35rem;\n border-radius: 4px;\n }\n\n .btn-replay {\n font-size: 0.65rem;\n opacity: 0.5;\n }\n .btn-replay:hover { opacity: 1; }\n\n /* ── Log detail ───────────────────────────────────── */\n .log-detail {\n background: #0a0f1a;\n padding: 0.6rem 0.75rem;\n border-left: 3px solid #3b82f6;\n margin: 0 0.4rem 0.4rem;\n border-radius: 0 4px 4px 0;\n }\n .log-detail__error { color: #fca5a5; font-size: 0.72rem; margin-bottom: 0.4rem; }\n .log-detail__section { margin-bottom: 0.4rem; }\n .log-detail__label {\n color: #64748b;\n font-size: 0.68rem;\n display: block;\n margin-bottom: 0.2rem;\n font-family: system-ui;\n }\n pre {\n color: #86efac;\n font-size: 0.7rem;\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n max-height: 140px;\n overflow-y: auto;\n }\n\n /* ── State tab ────────────────────────────────────── */\n .state-store-block {\n border-bottom: 1px solid #1e293b;\n }\n .state-store-block:last-child { border-bottom: none; }\n .state-store-name {\n padding: 0.4rem 0.75rem 0.2rem;\n color: #3b82f6;\n font-size: 0.72rem;\n font-family: system-ui;\n font-weight: 600;\n letter-spacing: 0.03em;\n text-transform: uppercase;\n }\n .state-view {\n color: #86efac;\n font-size: 0.7rem;\n padding: 0.25rem 0.75rem 0.75rem;\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n }\n `]\n})\nexport class StatoDevToolsComponent implements OnInit, OnDestroy {\n\n private unsub?: () => void\n\n // State UI\n isOpen = signal(false)\n isMinimized = signal(false)\n activeTab = signal<'actions' | 'state'>('actions')\n logs = signal<ActionLog[]>([])\n selectedLog = signal<ActionLog | null>(null)\n activeLogId = signal<number | null>(null)\n isTimeTraveling = signal(false)\n\n // Snapshot global — latest known state per store\n globalState = computed(() => {\n const seen = new Map<string, unknown>()\n for (const log of this.logs()) {\n if (!seen.has(log.storeName)) {\n seen.set(log.storeName, log.nextState)\n }\n }\n return seen\n })\n\n // Time-travel computed\n canUndo = computed(() => this.logs().length > 0)\n canRedo = computed(() => {\n if (!this.isTimeTraveling()) return false\n const id = this.activeLogId()\n if (id === null) return false\n if (id === -1) return this.logs().length > 0\n const idx = this.logs().findIndex(l => l.id === id)\n return idx > 0 // can go forward (lower index = newer)\n })\n\n // Position & size\n posX = signal(24)\n posY = signal(window.innerHeight - 520)\n panelWidth = signal(440)\n panelHeight = signal(480)\n\n // Drag state\n private isDragging = false\n private isResizing = false\n private dragOffsetX = 0\n private dragOffsetY = 0\n private startW = 0\n private startH = 0\n private startX = 0\n private startY = 0\n\n // Bound listeners\n private boundMouseMove = this.onMouseMove.bind(this)\n private boundMouseUp = this.onMouseUp.bind(this)\n\n ngOnInit() {\n this.unsub = devTools.subscribe((state: DevToolsState) => {\n this.logs.set(state.logs)\n this.isOpen.set(state.isOpen)\n this.activeLogId.set(state.activeLogId)\n this.isTimeTraveling.set(state.isTimeTraveling)\n })\n\n document.addEventListener('mousemove', this.boundMouseMove)\n document.addEventListener('mouseup', this.boundMouseUp)\n }\n\n ngOnDestroy() {\n this.unsub?.()\n document.removeEventListener('mousemove', this.boundMouseMove)\n document.removeEventListener('mouseup', this.boundMouseUp)\n }\n\n // ── Toggle ─────────────────────────────────────────\n toggle() { devTools.toggle() }\n toggleMinimize() { this.isMinimized.update(v => !v) }\n clear() { devTools.clear(); this.selectedLog.set(null) }\n\n selectLog(log: ActionLog) {\n this.selectedLog.set(this.selectedLog()?.id === log.id ? null : log)\n }\n\n formatTime(iso: string): string {\n return new Date(iso).toTimeString().slice(0, 8)\n }\n\n // ── Time-travel actions ────────────────────────────\n onTravelTo(log: ActionLog) {\n // Toggle detail view\n this.selectLog(log)\n // Jump to this action's state\n devTools.travelTo(log.id)\n }\n\n onUndo() { devTools.undo() }\n onRedo() { devTools.redo() }\n onResume() { devTools.resume() }\n\n onReplay(log: ActionLog, event: Event) {\n event.stopPropagation()\n devTools.replay(log.id)\n }\n\n isFutureLog(log: ActionLog): boolean {\n if (!this.isTimeTraveling()) return false\n const activeId = this.activeLogId()\n if (activeId === null) return false\n if (activeId === -1) return true // all logs are \"future\"\n const activeIdx = this.logs().findIndex(l => l.id === activeId)\n const logIdx = this.logs().findIndex(l => l.id === log.id)\n return logIdx < activeIdx // newer logs (lower index) are \"future\"\n }\n\n // ── Export/Import ──────────────────────────────────\n onExport() {\n const snapshot = devTools.exportSnapshot()\n const json = JSON.stringify(snapshot, null, 2)\n const blob = new Blob([json], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `ngstato-snapshot-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.json`\n a.click()\n URL.revokeObjectURL(url)\n }\n\n onImport() {\n const input = document.querySelector('input[type=\"file\"]') as HTMLInputElement\n input?.click()\n }\n\n onFileSelected(event: Event) {\n const file = (event.target as HTMLInputElement).files?.[0]\n if (!file) return\n\n const reader = new FileReader()\n reader.onload = () => {\n try {\n const snapshot = JSON.parse(reader.result as string)\n devTools.importSnapshot(snapshot)\n } catch (e) {\n console.error('[ngStato DevTools] Invalid snapshot file:', e)\n }\n }\n reader.readAsText(file)\n // Reset input\n ;(event.target as HTMLInputElement).value = ''\n }\n\n // ── Drag ───────────────────────────────────────────\n onDragStart(e: MouseEvent) {\n if ((e.target as HTMLElement).classList.contains('btn-icon')) return\n this.isDragging = true\n this.dragOffsetX = e.clientX - this.posX()\n this.dragOffsetY = e.clientY - this.posY()\n e.preventDefault()\n }\n\n // ── Resize ─────────────────────────────────────────\n onResizeStart(e: MouseEvent) {\n this.isResizing = true\n this.startW = this.panelWidth()\n this.startH = this.panelHeight()\n this.startX = e.clientX\n this.startY = e.clientY\n e.preventDefault()\n e.stopPropagation()\n }\n\n // ── Mouse Move ─────────────────────────────────────\n onMouseMove(e: MouseEvent) {\n if (this.isDragging) {\n this.posX.set(Math.max(0, e.clientX - this.dragOffsetX))\n this.posY.set(Math.max(0, e.clientY - this.dragOffsetY))\n }\n if (this.isResizing) {\n const newW = Math.max(300, this.startW + e.clientX - this.startX)\n const newH = Math.max(200, this.startH + e.clientY - this.startY)\n this.panelWidth.set(newW)\n this.panelHeight.set(newH)\n }\n }\n\n // ── Mouse Up ───────────────────────────────────────\n onMouseUp() {\n this.isDragging = false\n this.isResizing = false\n }\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/angular — API publique\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport { injectStore } from './inject-store'\r\nexport { provideStato } from './provide-ngstato'\r\nexport { createAngularStore, StatoStore } from './create-angular-store'\r\nexport type { StatoAngularConfig } from './provide-ngstato'\r\nexport { StatoDevToolsComponent } from './devtools.component'","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,63 +1,62 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@ngstato/angular",
|
|
3
|
-
"version": "0.4.
|
|
4
|
-
"private": false,
|
|
5
|
-
"description": "ngStato — Angular adapter with native Signals",
|
|
6
|
-
"main": "./dist/fesm2022/ngstato-angular.mjs",
|
|
7
|
-
"module": "./dist/fesm2022/ngstato-angular.mjs",
|
|
8
|
-
"types": "./dist/index.d.ts",
|
|
9
|
-
"exports": {
|
|
10
|
-
".": {
|
|
11
|
-
"types": "./dist/index.d.ts",
|
|
12
|
-
"import": "./dist/fesm2022/ngstato-angular.mjs",
|
|
13
|
-
"default": "./dist/fesm2022/ngstato-angular.mjs"
|
|
14
|
-
},
|
|
15
|
-
"./package.json": {
|
|
16
|
-
"default": "./package.json"
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
"files": [
|
|
20
|
-
"dist",
|
|
21
|
-
"README.md"
|
|
22
|
-
],
|
|
23
|
-
"scripts": {
|
|
24
|
-
"build": "ng-packagr -p ng-package.json",
|
|
25
|
-
"test": "vitest run",
|
|
26
|
-
"dev": "ng-packagr -p ng-package.json --watch"
|
|
27
|
-
},
|
|
28
|
-
"dependencies": {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"@
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"
|
|
37
|
-
"@angular/compiler
|
|
38
|
-
"@angular/
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@ngstato/angular",
|
|
3
|
+
"version": "0.4.2",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "ngStato — Angular adapter with native Signals",
|
|
6
|
+
"main": "./dist/fesm2022/ngstato-angular.mjs",
|
|
7
|
+
"module": "./dist/fesm2022/ngstato-angular.mjs",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/fesm2022/ngstato-angular.mjs",
|
|
13
|
+
"default": "./dist/fesm2022/ngstato-angular.mjs"
|
|
14
|
+
},
|
|
15
|
+
"./package.json": {
|
|
16
|
+
"default": "./package.json"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "ng-packagr -p ng-package.json",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"dev": "ng-packagr -p ng-package.json --watch"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {},
|
|
29
|
+
"peerDependencies": {
|
|
30
|
+
"@angular/core": ">=17.0.0",
|
|
31
|
+
"@angular/common": ">=17.0.0",
|
|
32
|
+
"@ngstato/core": ">=0.4.0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"ng-packagr": "^18.0.0",
|
|
36
|
+
"@angular/compiler-cli": "^18.0.0",
|
|
37
|
+
"@angular/compiler": "^18.0.0",
|
|
38
|
+
"@angular/common": "^18.0.0",
|
|
39
|
+
"typescript": "~5.5.0",
|
|
40
|
+
"tsup": "^8.0.0",
|
|
41
|
+
"vitest": "^1.6.0"
|
|
42
|
+
},
|
|
43
|
+
"license": "MIT",
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "https://github.com/becher/ngStato.git",
|
|
47
|
+
"directory": "packages/angular"
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://github.com/becher/ngStato#readme",
|
|
50
|
+
"bugs": {
|
|
51
|
+
"url": "https://github.com/becher/ngStato/issues"
|
|
52
|
+
},
|
|
53
|
+
"author": "becher",
|
|
54
|
+
"keywords": [
|
|
55
|
+
"angular",
|
|
56
|
+
"state-management",
|
|
57
|
+
"signals",
|
|
58
|
+
"store",
|
|
59
|
+
"ngrx-alternative",
|
|
60
|
+
"ngstato"
|
|
61
|
+
]
|
|
62
|
+
}
|