From 7e25d54847fcc96c737762b47c33ece780a4889e Mon Sep 17 00:00:00 2001 From: dswbx Date: Tue, 8 Jul 2025 09:54:56 +0200 Subject: [PATCH] mm: added diff event + plugin to write down diffs --- app/src/core/index.ts | 1 + app/src/modules/ModuleManager.ts | 15 ++++++++++++++ app/src/plugins/dev/sync-diffs.plugin.ts | 26 ++++++++++++++++++++++++ app/src/plugins/index.ts | 1 + 4 files changed, 43 insertions(+) create mode 100644 app/src/plugins/dev/sync-diffs.plugin.ts diff --git a/app/src/core/index.ts b/app/src/core/index.ts index 0e0d917b..dceb33cc 100644 --- a/app/src/core/index.ts +++ b/app/src/core/index.ts @@ -39,6 +39,7 @@ export { type ParseOptions, InvalidSchemaError, } from "./object/schema"; +export * as $diff from "./object/diff"; export * from "./drivers"; export * from "./events"; diff --git a/app/src/modules/ModuleManager.ts b/app/src/modules/ModuleManager.ts index 059caced..39871db3 100644 --- a/app/src/modules/ModuleManager.ts +++ b/app/src/modules/ModuleManager.ts @@ -128,8 +128,16 @@ export class ModuleManagerConfigUpdateEvent< }> { static override slug = "mm-config-update"; } + +export class ModuleManagerConfigDiffEvent extends ModuleManagerEvent<{ + diffs: $diff.DiffEntry[]; +}> { + static override slug = "mm-config-diff"; +} + export const ModuleManagerEvents = { ModuleManagerConfigUpdateEvent, + ModuleManagerConfigDiffEvent, }; // @todo: cleanup old diffs on upgrade @@ -349,6 +357,13 @@ export class ModuleManager { // validate diffs, it'll throw on invalid this.validateDiffs(diffs); + await this.emgr.emit( + new ModuleManagerConfigDiffEvent({ + ctx: this.ctx(), + diffs: $diff.clone(diffs), + }), + ); + const date = new Date(); // store diff await this.mutator().insertOne({ diff --git a/app/src/plugins/dev/sync-diffs.plugin.ts b/app/src/plugins/dev/sync-diffs.plugin.ts new file mode 100644 index 00000000..56131098 --- /dev/null +++ b/app/src/plugins/dev/sync-diffs.plugin.ts @@ -0,0 +1,26 @@ +import { type App, ModuleManagerEvents, type AppPlugin } from "bknd"; +import type { $diff } from "bknd/core"; + +export type SyncDiffsOptions = { + enabled?: boolean; + write: (name: string, diffs: $diff.DiffEntry[]) => Promise; +}; + +export function syncDiffs({ enabled = true, write }: SyncDiffsOptions): AppPlugin { + return (app: App) => ({ + name: "bknd-sync-diffs", + onBuilt: async () => { + if (!enabled) return; + app.emgr.onEvent( + ModuleManagerEvents.ModuleManagerConfigDiffEvent, + async (event) => { + const name = `${new Date().getTime()}.diff.json`; + await write?.(name, event.params.diffs); + }, + { + id: "sync-config", + }, + ); + }, + }); +} diff --git a/app/src/plugins/index.ts b/app/src/plugins/index.ts index ee7a31ab..3567b9f7 100644 --- a/app/src/plugins/index.ts +++ b/app/src/plugins/index.ts @@ -5,3 +5,4 @@ export { export { showRoutes, type ShowRoutesOptions } from "./dev/show-routes.plugin"; export { syncConfig, type SyncConfigOptions } from "./dev/sync-config.plugin"; export { syncTypes, type SyncTypesOptions } from "./dev/sync-types.plugin"; +export { syncDiffs, type SyncDiffsOptions } from "./dev/sync-diffs.plugin";