@hardlydifficult/workflow-engine 1.0.4 → 1.0.5

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.
@@ -1,5 +1,5 @@
1
1
  import { DataCursor } from "./DataCursor.js";
2
- import type { DataUpdater, WorkflowEngineOptions } from "./types.js";
2
+ import type { ChangeListener, DataUpdater, WorkflowEngineOptions, WorkflowSnapshot } from "./types.js";
3
3
  /**
4
4
  * General-purpose state machine with typed statuses, validated transitions,
5
5
  * and persistent state via StateTracker.
@@ -8,6 +8,7 @@ export declare class WorkflowEngine<TStatus extends string, TData> {
8
8
  private readonly tracker;
9
9
  private readonly transitions;
10
10
  private readonly onTransitionCb?;
11
+ private readonly listeners;
11
12
  private loaded;
12
13
  constructor(options: WorkflowEngineOptions<TStatus, TData>);
13
14
  /** Current status */
@@ -45,6 +46,13 @@ export declare class WorkflowEngine<TStatus extends string, TData> {
45
46
  update(updater: DataUpdater<TData>): Promise<void>;
46
47
  /** Create a cursor for safe navigation into nested data. */
47
48
  cursor<TItem>(selector: (data: TData) => TItem | undefined): DataCursor<TStatus, TData, TItem>;
49
+ /**
50
+ * Register a listener for all engine events (transition, update, load).
51
+ * Returns an unsubscribe function.
52
+ */
53
+ on(listener: ChangeListener<TStatus, TData>): () => void;
54
+ /** Return a read-only snapshot of the engine's current state. */
55
+ toSnapshot(): WorkflowSnapshot<TStatus, TData>;
48
56
  /** Check if a specific transition is allowed from current status */
49
57
  canTransition(to: TStatus): boolean;
50
58
  /** Get statuses reachable from current status */
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowEngine.d.ts","sourceRoot":"","sources":["../src/WorkflowEngine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EACV,WAAW,EAIX,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,qBAAa,cAAc,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IACvE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IACrD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAEtB;IACV,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC;IAwB1D,qBAAqB;IACrB,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,+BAA+B;IAC/B,IAAI,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,CAE1B;IAED,qCAAqC;IACrC,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,wCAAwC;IACxC,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,qDAAqD;IACrD,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,uEAAuE;IACvE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B;;;;;;OAMG;IACG,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B1E;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAexD,4DAA4D;IAC5D,MAAM,CAAC,KAAK,EACV,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,KAAK,GAAG,SAAS,GAC3C,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC;IAIpC,oEAAoE;IACpE,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO;IAInC,iDAAiD;IACjD,kBAAkB,IAAI,SAAS,OAAO,EAAE;IAIxC,uCAAuC;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,OAAO,CAAC,SAAS;CAclB"}
1
+ {"version":3,"file":"WorkflowEngine.d.ts","sourceRoot":"","sources":["../src/WorkflowEngine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EAIX,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,qBAAa,cAAc,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IACvE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IACrD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAEtB;IACV,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6C;IACvE,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC;IAwB1D,qBAAqB;IACrB,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,+BAA+B;IAC/B,IAAI,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,CAE1B;IAED,qCAAqC;IACrC,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,wCAAwC;IACxC,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,qDAAqD;IACrD,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,uEAAuE;IACvE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B;;;;;;OAMG;IACG,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B1E;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAexD,4DAA4D;IAC5D,MAAM,CAAC,KAAK,EACV,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,KAAK,GAAG,SAAS,GAC3C,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC;IAIpC;;;OAGG;IACH,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI;IAOxD,iEAAiE;IACjE,UAAU,IAAI,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC;IAS9C,oEAAoE;IACpE,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO;IAInC,iDAAiD;IACjD,kBAAkB,IAAI,SAAS,OAAO,EAAE;IAIxC,uCAAuC;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,OAAO,CAAC,SAAS;CAkBlB"}
@@ -11,6 +11,7 @@ class WorkflowEngine {
11
11
  tracker;
12
12
  transitions;
13
13
  onTransitionCb;
14
+ listeners = new Set();
14
15
  loaded = false;
15
16
  constructor(options) {
16
17
  const { transitions, initialStatus } = options;
@@ -114,6 +115,25 @@ class WorkflowEngine {
114
115
  cursor(selector) {
115
116
  return new DataCursor_js_1.DataCursor(this, selector);
116
117
  }
118
+ /**
119
+ * Register a listener for all engine events (transition, update, load).
120
+ * Returns an unsubscribe function.
121
+ */
122
+ on(listener) {
123
+ this.listeners.add(listener);
124
+ return () => {
125
+ this.listeners.delete(listener);
126
+ };
127
+ }
128
+ /** Return a read-only snapshot of the engine's current state. */
129
+ toSnapshot() {
130
+ return {
131
+ status: this.status,
132
+ data: structuredClone(this.data),
133
+ updatedAt: this.updatedAt,
134
+ isTerminal: this.isTerminal,
135
+ };
136
+ }
117
137
  /** Check if a specific transition is allowed from current status */
118
138
  canTransition(to) {
119
139
  return this.transitions[this.status].includes(to);
@@ -127,14 +147,18 @@ class WorkflowEngine {
127
147
  await this.tracker.saveAsync();
128
148
  }
129
149
  emitEvent(type, from, to) {
130
- this.onTransitionCb?.({
150
+ const event = {
131
151
  type,
132
152
  from,
133
153
  to,
134
154
  status: this.status,
135
155
  data: this.data,
136
156
  timestamp: new Date().toISOString(),
137
- });
157
+ };
158
+ this.onTransitionCb?.(event);
159
+ for (const listener of this.listeners) {
160
+ listener(event);
161
+ }
138
162
  }
139
163
  }
140
164
  exports.WorkflowEngine = WorkflowEngine;
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowEngine.js","sourceRoot":"","sources":["../src/WorkflowEngine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorkflowEngine.js","sourceRoot":"","sources":["../src/WorkflowEngine.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export { DataCursor } from "./DataCursor.js";
2
2
  export { WorkflowEngine } from "./WorkflowEngine.js";
3
- export type { WorkflowEngineOptions, TransitionEvent, TransitionMap, DataUpdater, } from "./types.js";
3
+ export type { ChangeListener, WorkflowEngineOptions, WorkflowSnapshot, TransitionEvent, TransitionMap, DataUpdater, } from "./types.js";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,YAAY,CAAC"}
package/dist/types.d.ts CHANGED
@@ -39,6 +39,21 @@ export interface WorkflowEngineOptions<TStatus extends string, TData> {
39
39
  /** Called on transitions, updates, and loads */
40
40
  onTransition?: (event: TransitionEvent<TStatus, TData>) => void;
41
41
  }
42
+ /**
43
+ * Listener callback for engine change events.
44
+ * Receives the same event as onTransition.
45
+ */
46
+ export type ChangeListener<TStatus extends string, TData> = (event: TransitionEvent<TStatus, TData>) => void;
47
+ /**
48
+ * Read-only snapshot of an engine's current state.
49
+ * Useful for serialization or external consumers.
50
+ */
51
+ export interface WorkflowSnapshot<TStatus extends string, TData> {
52
+ status: TStatus;
53
+ data: Readonly<TData>;
54
+ updatedAt: string;
55
+ isTerminal: boolean;
56
+ }
42
57
  /**
43
58
  * Internal persisted shape: status + data + updatedAt together.
44
59
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,OAAO,SAAS,MAAM,IAAI,MAAM,CACxD,OAAO,EACP,SAAS,OAAO,EAAE,CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK;IAC5D,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK;IAClE,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,aAAa,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,WAAW,EAAE,KAAK,CAAC;IACnB,kEAAkE;IAClE,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;CACjE;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK;IAC3D,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,KAAK,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,OAAO,SAAS,MAAM,IAAI,MAAM,CACxD,OAAO,EACP,SAAS,OAAO,EAAE,CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK;IAC5D,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK;IAClE,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,aAAa,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,WAAW,EAAE,KAAK,CAAC;IACnB,kEAAkE;IAClE,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;CACjE;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK,IAAI,CAC1D,KAAK,EAAE,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,KACnC,IAAI,CAAC;AAEV;;;GAGG;AACH,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK;IAC7D,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK;IAC3D,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,KAAK,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hardlydifficult/workflow-engine",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "files": [