@figliolia/galena 4.0.2 → 4.0.3

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/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  Lightning fast, framework agnostic state, that doesn't glue your state operations to your UI components!
4
4
 
5
- [State](#the-state-model)
6
- [Galena](#the-galena-model)
7
- [For use with react](#frameworks)
5
+ 1. [State](#the-state-model)
6
+ 2. [Galena](#the-galena-model)
7
+ 3. [For use with react](#frameworks)
8
8
 
9
9
  ## Installation
10
10
 
@@ -1 +1 @@
1
- {"version":3,"file":"API.d.cts","names":[],"sources":["../src/API.ts"],"mappings":";;;uBAEsB,GAAA,WAAc,CAAA;EAAA,SAClB,UAAA,EAAY,UAAA,CAAW,CAAA;iBACxB,UAAA,EAAY,UAAA,CAAW,CAAA;EAAA,SAItB,QAAA,CAAA,GAAY,CAAA;EAAA,SACZ,SAAA,CAAU,UAAA,GAAa,OAAA,EAAS,CAAA;EAAA,SAChC,kBAAA,CAAA,GAAsB,WAAA,EAAa,UAAA,CAAW,CAAA;AAAA"}
1
+ {"version":3,"file":"API.d.cts","names":[],"sources":["../src/API.ts"],"mappings":";;;uBAEsB,GAAA,WAAc,CAAA;EAAA,SAClB,UAAA,EAAY,UAAA,CAAW,CAAA;iBACxB,UAAA,EAAY,UAAA,CAAW,CAAA;EAAA,SAItB,QAAA,IAAY,CAAA;EAAA,SACZ,SAAA,CAAU,UAAA,GAAa,OAAA,EAAS,CAAA;EAAA,SAChC,kBAAA,IAAsB,WAAA,EAAa,UAAA,CAAW,CAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"API.d.mts","names":[],"sources":["../src/API.ts"],"mappings":";;;uBAEsB,GAAA,WAAc,CAAA;EAAA,SAClB,UAAA,EAAY,UAAA,CAAW,CAAA;iBACxB,UAAA,EAAY,UAAA,CAAW,CAAA;EAAA,SAItB,QAAA,CAAA,GAAY,CAAA;EAAA,SACZ,SAAA,CAAU,UAAA,GAAa,OAAA,EAAS,CAAA;EAAA,SAChC,kBAAA,CAAA,GAAsB,WAAA,EAAa,UAAA,CAAW,CAAA;AAAA"}
1
+ {"version":3,"file":"API.d.mts","names":[],"sources":["../src/API.ts"],"mappings":";;;uBAEsB,GAAA,WAAc,CAAA;EAAA,SAClB,UAAA,EAAY,UAAA,CAAW,CAAA;iBACxB,UAAA,EAAY,UAAA,CAAW,CAAA;EAAA,SAItB,QAAA,IAAY,CAAA;EAAA,SACZ,SAAA,CAAU,UAAA,GAAa,OAAA,EAAS,CAAA;EAAA,SAChC,kBAAA,IAAsB,WAAA,EAAa,UAAA,CAAW,CAAA;AAAA"}
package/dist/API.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"API.mjs","names":[],"sources":["../src/API.ts"],"sourcesContent":["import type { Middleware } from \"./Middleware\";\n\nexport abstract class API<T, E, M = T> {\n public readonly middleware: Middleware<M>[] = [];\n constructor(...middleware: Middleware<M>[]) {\n this.registerMiddleware(...middleware);\n }\n\n public abstract getState(): T;\n public abstract subscribe(subscriber: (payload: E) => void): () => void;\n public abstract registerMiddleware(...middlewares: Middleware<M>[]): void;\n}\n"],"mappings":";AAEA,IAAsB,MAAtB,MAAuC;CACrC,aAA8C,EAAE;CAChD,YAAY,GAAG,YAA6B;AAC1C,OAAK,mBAAmB,GAAG,WAAW"}
1
+ {"version":3,"file":"API.mjs","names":[],"sources":["../src/API.ts"],"sourcesContent":["import type { Middleware } from \"./Middleware\";\n\nexport abstract class API<T, E, M = T> {\n public readonly middleware: Middleware<M>[] = [];\n constructor(...middleware: Middleware<M>[]) {\n this.registerMiddleware(...middleware);\n }\n\n public abstract getState(): T;\n public abstract subscribe(subscriber: (payload: E) => void): () => void;\n public abstract registerMiddleware(...middlewares: Middleware<M>[]): void;\n}\n"],"mappings":";AAEA,IAAsB,MAAtB,MAAuC;CACrC,aAA8C,CAAC;CAC/C,YAAY,GAAG,YAA6B;EAC1C,KAAK,mBAAmB,GAAG,UAAU;CACvC;AAKF"}
package/dist/Galena.cjs CHANGED
@@ -40,11 +40,18 @@ let _figliolia_event_emitter = require("@figliolia/event-emitter");
40
40
  * ```
41
41
  */
42
42
  var Galena = class extends require_API.API {
43
+ state;
43
44
  Emitter = new _figliolia_event_emitter.EventEmitter();
44
45
  constructor(state, ...middleware) {
45
46
  super(...middleware);
46
47
  this.state = state;
47
48
  }
49
+ /**
50
+ * Get State
51
+ *
52
+ * Returns an assembled state object containing each
53
+ * state instance's current value of state
54
+ */
48
55
  getState() {
49
56
  const result = {};
50
57
  for (const key in this.state) {
@@ -85,7 +92,7 @@ var Galena = class extends require_API.API {
85
92
  * changes. To your callback will be provided the `updated` state
86
93
  * instance, along with the entire `state` tree
87
94
  */
88
- subscribe = (subscriber) => {
95
+ subscribe(subscriber) {
89
96
  const ID = this.Emitter.on("change", subscriber);
90
97
  const unsubscribers = [];
91
98
  for (const key in this.state) {
@@ -100,7 +107,7 @@ var Galena = class extends require_API.API {
100
107
  this.Emitter.off("change", ID);
101
108
  while (unsubscribers.length) unsubscribers.pop?.()?.();
102
109
  };
103
- };
110
+ }
104
111
  /**
105
112
  * Register Middleware
106
113
  *
package/dist/Galena.d.cts CHANGED
@@ -46,6 +46,12 @@ declare class Galena<T extends Record<string, State<any>>> extends API<GalenaSta
46
46
  readonly state: T;
47
47
  private Emitter;
48
48
  constructor(state: T, ...middleware: Middleware<StateTypes<T>>[]);
49
+ /**
50
+ * Get State
51
+ *
52
+ * Returns an assembled state object containing each
53
+ * state instance's current value of state
54
+ */
49
55
  getState(): GalenaState<T>;
50
56
  /**
51
57
  * Get
@@ -73,7 +79,7 @@ declare class Galena<T extends Record<string, State<any>>> extends API<GalenaSta
73
79
  * changes. To your callback will be provided the `updated` state
74
80
  * instance, along with the entire `state` tree
75
81
  */
76
- subscribe: (subscriber: AppSubscriber<T>) => () => void;
82
+ subscribe(subscriber: AppSubscriber<T>): () => void;
77
83
  /**
78
84
  * Register Middleware
79
85
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Galena.d.cts","names":[],"sources":["../src/Galena.ts"],"mappings":";;;;;;;;AAmDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,MAAA,WAAiB,MAAA,SAAe,KAAA,gBAAqB,GAAA,CAChE,WAAA,CAAY,CAAA,GACZ,cAAA,CAAe,CAAA,GACf,UAAA,CAAW,CAAA;EAAA,SAIO,KAAA,EAAO,CAAA;EAAA,QAFjB,OAAA;cAEU,KAAA,EAAO,CAAA,KACpB,UAAA,EAAY,UAAA,CAAW,UAAA,CAAW,CAAA;EAKhC,QAAA,CAAA,GAAQ,WAAA,CAAA,CAAA;EAbiD;;;;;EA2BzD,GAAA,WAAc,OAAA,OAAc,CAAA,UAAA,CAAY,GAAA,EAAK,CAAA,GAAC,CAAA,CAAA,CAAA;EA3BW;;;;;EAoCzD,GAAA,WAAc,OAAA,OAAc,CAAA,UAAA,CACjC,GAAA,EAAK,CAAA,EACL,KAAA,EAAO,SAAA,CAAU,CAAA,CAAE,CAAA;EAnCV;;;;;EA6CJ,MAAA,WAAiB,OAAA,OAAc,CAAA,UAAA,CACpC,GAAA,EAAK,CAAA,EACL,OAAA,EAAS,MAAA,CAAO,SAAA,CAAU,CAAA,CAAE,CAAA;EA3CZ;;;;;;;;EAwDX,SAAA,GAAa,UAAA,EAAY,aAAA,CAAc,CAAA;EApCnC;;;;;;EAgEJ,kBAAA,CAAA,GAAsB,WAAA,EAAa,UAAA,CAAW,UAAA,CAAW,CAAA;EAAA,QAMxD,IAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CV;;;;;;;cAAa,YAAA,aAA0B,MAAA,SAAe,KAAA,WACjD,IAAA,EAAM,qBAAA,QAA6B,MAAA,CAAO,CAAA,OAAG,MAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"Galena.d.cts","names":[],"sources":["../src/Galena.ts"],"mappings":";;;;;;;;AAmDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,MAAA,WAAiB,MAAA,SAAe,KAAA,gBAAqB,GAAA,CAChE,WAAA,CAAY,CAAA,GACZ,cAAA,CAAe,CAAA,GACf,UAAA,CAAW,CAAA;EAAA,SAIO,KAAA,EAAO,CAAA;EAAA,QAFjB,OAAA;cAEU,KAAA,EAAO,CAAA,KACpB,UAAA,EAAY,UAAA,CAAW,UAAA,CAAW,CAAA;EAyFG;;;;;;EA9EnC,QAAA,IAAQ,WAAA,CAAA,CAAA;EAnBiD;;;;;EAiCzD,GAAA,WAAc,OAAA,OAAc,CAAA,WAAY,GAAA,EAAK,CAAA,GAAC,CAAA,CAAA,CAAA;EA9B1C;;;;;EAuCJ,GAAA,WAAc,OAAA,OAAc,CAAA,WACjC,GAAA,EAAK,CAAA,EACL,KAAA,EAAO,SAAA,CAAU,CAAA,CAAE,CAAA;EArCH;;;;;EA+CX,MAAA,WAAiB,OAAA,OAAc,CAAA,WACpC,GAAA,EAAK,CAAA,EACL,OAAA,EAAS,MAAA,CAAO,SAAA,CAAU,CAAA,CAAE,CAAA;EArCf;;;;;;;;EAkDR,SAAA,CAAU,UAAA,EAAY,aAAA,CAAc,CAAA;EApCU;;;;;;EAgE9C,kBAAA,IAAsB,WAAA,EAAa,UAAA,CAAW,UAAA,CAAW,CAAA;EAAA,QAMxD,IAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;AAAI;AA6Cd;;;;;;;;;;;;;cAAa,YAAA,aAA0B,MAAA,SAAe,KAAA,WACjD,IAAA,EAAM,qBAAA,QAA6B,MAAA,CAAO,CAAA,OAAG,MAAA,CAAA,CAAA"}
package/dist/Galena.d.mts CHANGED
@@ -46,6 +46,12 @@ declare class Galena<T extends Record<string, State<any>>> extends API<GalenaSta
46
46
  readonly state: T;
47
47
  private Emitter;
48
48
  constructor(state: T, ...middleware: Middleware<StateTypes<T>>[]);
49
+ /**
50
+ * Get State
51
+ *
52
+ * Returns an assembled state object containing each
53
+ * state instance's current value of state
54
+ */
49
55
  getState(): GalenaState<T>;
50
56
  /**
51
57
  * Get
@@ -73,7 +79,7 @@ declare class Galena<T extends Record<string, State<any>>> extends API<GalenaSta
73
79
  * changes. To your callback will be provided the `updated` state
74
80
  * instance, along with the entire `state` tree
75
81
  */
76
- subscribe: (subscriber: AppSubscriber<T>) => () => void;
82
+ subscribe(subscriber: AppSubscriber<T>): () => void;
77
83
  /**
78
84
  * Register Middleware
79
85
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Galena.d.mts","names":[],"sources":["../src/Galena.ts"],"mappings":";;;;;;;;AAmDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,MAAA,WAAiB,MAAA,SAAe,KAAA,gBAAqB,GAAA,CAChE,WAAA,CAAY,CAAA,GACZ,cAAA,CAAe,CAAA,GACf,UAAA,CAAW,CAAA;EAAA,SAIO,KAAA,EAAO,CAAA;EAAA,QAFjB,OAAA;cAEU,KAAA,EAAO,CAAA,KACpB,UAAA,EAAY,UAAA,CAAW,UAAA,CAAW,CAAA;EAKhC,QAAA,CAAA,GAAQ,WAAA,CAAA,CAAA;EAbiD;;;;;EA2BzD,GAAA,WAAc,OAAA,OAAc,CAAA,UAAA,CAAY,GAAA,EAAK,CAAA,GAAC,CAAA,CAAA,CAAA;EA3BW;;;;;EAoCzD,GAAA,WAAc,OAAA,OAAc,CAAA,UAAA,CACjC,GAAA,EAAK,CAAA,EACL,KAAA,EAAO,SAAA,CAAU,CAAA,CAAE,CAAA;EAnCV;;;;;EA6CJ,MAAA,WAAiB,OAAA,OAAc,CAAA,UAAA,CACpC,GAAA,EAAK,CAAA,EACL,OAAA,EAAS,MAAA,CAAO,SAAA,CAAU,CAAA,CAAE,CAAA;EA3CZ;;;;;;;;EAwDX,SAAA,GAAa,UAAA,EAAY,aAAA,CAAc,CAAA;EApCnC;;;;;;EAgEJ,kBAAA,CAAA,GAAsB,WAAA,EAAa,UAAA,CAAW,UAAA,CAAW,CAAA;EAAA,QAMxD,IAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CV;;;;;;;cAAa,YAAA,aAA0B,MAAA,SAAe,KAAA,WACjD,IAAA,EAAM,qBAAA,QAA6B,MAAA,CAAO,CAAA,OAAG,MAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"Galena.d.mts","names":[],"sources":["../src/Galena.ts"],"mappings":";;;;;;;;AAmDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,MAAA,WAAiB,MAAA,SAAe,KAAA,gBAAqB,GAAA,CAChE,WAAA,CAAY,CAAA,GACZ,cAAA,CAAe,CAAA,GACf,UAAA,CAAW,CAAA;EAAA,SAIO,KAAA,EAAO,CAAA;EAAA,QAFjB,OAAA;cAEU,KAAA,EAAO,CAAA,KACpB,UAAA,EAAY,UAAA,CAAW,UAAA,CAAW,CAAA;EAyFG;;;;;;EA9EnC,QAAA,IAAQ,WAAA,CAAA,CAAA;EAnBiD;;;;;EAiCzD,GAAA,WAAc,OAAA,OAAc,CAAA,WAAY,GAAA,EAAK,CAAA,GAAC,CAAA,CAAA,CAAA;EA9B1C;;;;;EAuCJ,GAAA,WAAc,OAAA,OAAc,CAAA,WACjC,GAAA,EAAK,CAAA,EACL,KAAA,EAAO,SAAA,CAAU,CAAA,CAAE,CAAA;EArCH;;;;;EA+CX,MAAA,WAAiB,OAAA,OAAc,CAAA,WACpC,GAAA,EAAK,CAAA,EACL,OAAA,EAAS,MAAA,CAAO,SAAA,CAAU,CAAA,CAAE,CAAA;EArCf;;;;;;;;EAkDR,SAAA,CAAU,UAAA,EAAY,aAAA,CAAc,CAAA;EApCU;;;;;;EAgE9C,kBAAA,IAAsB,WAAA,EAAa,UAAA,CAAW,UAAA,CAAW,CAAA;EAAA,QAMxD,IAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;AAAI;AA6Cd;;;;;;;;;;;;;cAAa,YAAA,aAA0B,MAAA,SAAe,KAAA,WACjD,IAAA,EAAM,qBAAA,QAA6B,MAAA,CAAO,CAAA,OAAG,MAAA,CAAA,CAAA"}
package/dist/Galena.mjs CHANGED
@@ -40,11 +40,18 @@ import { EventEmitter } from "@figliolia/event-emitter";
40
40
  * ```
41
41
  */
42
42
  var Galena = class extends API {
43
+ state;
43
44
  Emitter = new EventEmitter();
44
45
  constructor(state, ...middleware) {
45
46
  super(...middleware);
46
47
  this.state = state;
47
48
  }
49
+ /**
50
+ * Get State
51
+ *
52
+ * Returns an assembled state object containing each
53
+ * state instance's current value of state
54
+ */
48
55
  getState() {
49
56
  const result = {};
50
57
  for (const key in this.state) {
@@ -85,7 +92,7 @@ var Galena = class extends API {
85
92
  * changes. To your callback will be provided the `updated` state
86
93
  * instance, along with the entire `state` tree
87
94
  */
88
- subscribe = (subscriber) => {
95
+ subscribe(subscriber) {
89
96
  const ID = this.Emitter.on("change", subscriber);
90
97
  const unsubscribers = [];
91
98
  for (const key in this.state) {
@@ -100,7 +107,7 @@ var Galena = class extends API {
100
107
  this.Emitter.off("change", ID);
101
108
  while (unsubscribers.length) unsubscribers.pop?.()?.();
102
109
  };
103
- };
110
+ }
104
111
  /**
105
112
  * Register Middleware
106
113
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Galena.mjs","names":[],"sources":["../src/Galena.ts"],"sourcesContent":["import { EventEmitter } from \"@figliolia/event-emitter\";\nimport { API } from \"./API\";\nimport type { Middleware } from \"./Middleware\";\nimport type { State } from \"./State\";\nimport type {\n AppSubscriber,\n GalenaSnapshot,\n GalenaState,\n Setter,\n StateType,\n StateTypes,\n} from \"./types\";\n\n/**\n * ### Galena\n *\n * Galena instances are designed to house one or more units of `State`\n * and exist as a pseudo global application state.\n *\n * By design, each of its `State` units have isolated reactivity\n * that prevents entire state trees from updating when a single\n * unit changes.\n *\n * ```typescript\n * import { Galena } from \"@figliolia/galena\";\n *\n * const AppState = new Galena({\n * user: new State(\"<user-stuff>\"),\n * business: new State(\"<business-logic-stuff>\")\n * // your reactive instances\n * }, ...middleware);\n *\n * // to retreive and work with an individual unit\n * const userState = AppState.get(\"user\"); // Returns State<T>\n *\n * // to run a callback anytime a unit of state changes\n * const listener = AppState.subscribe(({ state, updated }) => {\n * // do something with the `State` instance that updated\n * // the entirety of your state\n * });\n *\n * // get the current application state\n * const currentState = AppState.getState();\n *\n * // operate on an instance of state\n * AppState.update(\"user\", userState => ({\n * ...userState,\n * // your updates\n * }));\n * ```\n */\nexport class Galena<T extends Record<string, State<any>>> extends API<\n GalenaState<T>,\n GalenaSnapshot<T>,\n StateTypes<T>\n> {\n private Emitter = new EventEmitter<{ change: GalenaSnapshot<T> }>();\n constructor(\n public readonly state: T,\n ...middleware: Middleware<StateTypes<T>>[]\n ) {\n super(...middleware);\n }\n\n public getState() {\n const result = {} as GalenaState<T>;\n for (const key in this.state) {\n const state = key as keyof T;\n result[state] = this.state[key].getState();\n }\n return result;\n }\n\n /**\n * Get\n *\n * Returns a connected State instance by key\n */\n public get<K extends Extract<keyof T, string>>(key: K) {\n return this.state[key];\n }\n\n /**\n * Set\n *\n * Sets a connected State instance's state by key\n */\n public set<K extends Extract<keyof T, string>>(\n key: K,\n value: StateType<T[K]>,\n ) {\n return this.get(key).set(value);\n }\n\n /**\n * Update\n *\n * Invokes a connected State instance's update method key\n */\n public update<K extends Extract<keyof T, string>>(\n key: K,\n updater: Setter<StateType<T[K]>>,\n ) {\n return this.get(key).update(updater);\n }\n\n /**\n * Subscribe\n *\n * Listen for changes on your Galena instnace. Your provided\n * callback will be invoked each time an attached state instance\n * changes. To your callback will be provided the `updated` state\n * instance, along with the entire `state` tree\n */\n public subscribe = (subscriber: AppSubscriber<T>) => {\n const ID = this.Emitter.on(\"change\", subscriber);\n const unsubscribers: (() => void)[] = [];\n for (const key in this.state) {\n const instance = this.state[key];\n if (!instance) {\n continue;\n }\n unsubscribers.push(\n instance.subscribe(() =>\n this.emit({ state: this.state, updated: instance }),\n ),\n );\n }\n return () => {\n this.Emitter.off(\"change\", ID);\n while (unsubscribers.length) {\n unsubscribers.pop?.()?.();\n }\n };\n };\n\n /**\n * Register Middleware\n *\n * Adds middleware instances to each of the connected\n * `State` instances\n */\n public registerMiddleware(...middlewares: Middleware<StateTypes<T>>[]) {\n for (const key in this.state) {\n this.state[key]?.registerMiddleware?.(...middlewares);\n }\n }\n\n private emit<K extends Extract<keyof T, string>>(\n event: GalenaSnapshot<T, K>,\n ) {\n this.Emitter.emit(\"change\", event);\n }\n}\n\n/**\n * ### createGalena\n *\n * Galena instances are designed to house one or more units of `State`\n * and exist as a pseudo global application state.\n *\n * By design, each of its `State` units have isolated reactivity\n * that prevents entire state trees from updating when a single\n * unit changes.\n *\n * ```typescript\n * import { Galena } from \"@figliolia/galena\";\n *\n * const AppState = new Galena({\n * user: new State(\"<user-stuff>\"),\n * business: new State(\"<business-logic-stuff>\")\n * // your reactive instances\n * }, ...middleware);\n *\n * // to retreive and work with an individual unit\n * const userState = AppState.get(\"user\"); // Returns State<T>\n *\n * // to run a callback anytime a unit of state changes\n * const listener = AppState.subscribe(({ state, updated }) => {\n * // do something with the `State` instance that updated\n * // the entirety of your state\n * });\n *\n * // get the current application state\n * const currentState = AppState.getState();\n *\n * // operate on an instance of state\n * AppState.update(\"user\", userState => ({\n * ...userState,\n * // your updates\n * }));\n * ```\n */\nexport const createGalena = <T extends Record<string, State<any>>>(\n ...args: ConstructorParameters<typeof Galena<T>>\n) => {\n return new Galena(...args);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,IAAa,SAAb,cAAkE,IAIhE;CACA,UAAkB,IAAI,cAA6C;CACnE,YACE,OACA,GAAG,YACH;AACA,QAAM,GAAG,WAAW;AAHJ,OAAA,QAAA;;CAMlB,WAAkB;EAChB,MAAM,SAAS,EAAE;AACjB,OAAK,MAAM,OAAO,KAAK,OAAO;GAC5B,MAAM,QAAQ;AACd,UAAO,SAAS,KAAK,MAAM,KAAK,UAAU;;AAE5C,SAAO;;;;;;;CAQT,IAA+C,KAAQ;AACrD,SAAO,KAAK,MAAM;;;;;;;CAQpB,IACE,KACA,OACA;AACA,SAAO,KAAK,IAAI,IAAI,CAAC,IAAI,MAAM;;;;;;;CAQjC,OACE,KACA,SACA;AACA,SAAO,KAAK,IAAI,IAAI,CAAC,OAAO,QAAQ;;;;;;;;;;CAWtC,aAAoB,eAAiC;EACnD,MAAM,KAAK,KAAK,QAAQ,GAAG,UAAU,WAAW;EAChD,MAAM,gBAAgC,EAAE;AACxC,OAAK,MAAM,OAAO,KAAK,OAAO;GAC5B,MAAM,WAAW,KAAK,MAAM;AAC5B,OAAI,CAAC,SACH;AAEF,iBAAc,KACZ,SAAS,gBACP,KAAK,KAAK;IAAE,OAAO,KAAK;IAAO,SAAS;IAAU,CAAC,CACpD,CACF;;AAEH,eAAa;AACX,QAAK,QAAQ,IAAI,UAAU,GAAG;AAC9B,UAAO,cAAc,OACnB,eAAc,OAAO,IAAI;;;;;;;;;CAW/B,mBAA0B,GAAG,aAA0C;AACrE,OAAK,MAAM,OAAO,KAAK,MACrB,MAAK,MAAM,MAAM,qBAAqB,GAAG,YAAY;;CAIzD,KACE,OACA;AACA,OAAK,QAAQ,KAAK,UAAU,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CtC,MAAa,gBACX,GAAG,SACA;AACH,QAAO,IAAI,OAAO,GAAG,KAAK"}
1
+ {"version":3,"file":"Galena.mjs","names":[],"sources":["../src/Galena.ts"],"sourcesContent":["import { EventEmitter } from \"@figliolia/event-emitter\";\nimport { API } from \"./API\";\nimport type { Middleware } from \"./Middleware\";\nimport type { State } from \"./State\";\nimport type {\n AppSubscriber,\n GalenaSnapshot,\n GalenaState,\n Setter,\n StateType,\n StateTypes,\n} from \"./types\";\n\n/**\n * ### Galena\n *\n * Galena instances are designed to house one or more units of `State`\n * and exist as a pseudo global application state.\n *\n * By design, each of its `State` units have isolated reactivity\n * that prevents entire state trees from updating when a single\n * unit changes.\n *\n * ```typescript\n * import { Galena } from \"@figliolia/galena\";\n *\n * const AppState = new Galena({\n * user: new State(\"<user-stuff>\"),\n * business: new State(\"<business-logic-stuff>\")\n * // your reactive instances\n * }, ...middleware);\n *\n * // to retreive and work with an individual unit\n * const userState = AppState.get(\"user\"); // Returns State<T>\n *\n * // to run a callback anytime a unit of state changes\n * const listener = AppState.subscribe(({ state, updated }) => {\n * // do something with the `State` instance that updated\n * // the entirety of your state\n * });\n *\n * // get the current application state\n * const currentState = AppState.getState();\n *\n * // operate on an instance of state\n * AppState.update(\"user\", userState => ({\n * ...userState,\n * // your updates\n * }));\n * ```\n */\nexport class Galena<T extends Record<string, State<any>>> extends API<\n GalenaState<T>,\n GalenaSnapshot<T>,\n StateTypes<T>\n> {\n private Emitter = new EventEmitter<{ change: GalenaSnapshot<T> }>();\n constructor(\n public readonly state: T,\n ...middleware: Middleware<StateTypes<T>>[]\n ) {\n super(...middleware);\n }\n\n /**\n * Get State\n *\n * Returns an assembled state object containing each\n * state instance's current value of state\n */\n public getState() {\n const result = {} as GalenaState<T>;\n for (const key in this.state) {\n const state = key as keyof T;\n result[state] = this.state[key].getState();\n }\n return result;\n }\n\n /**\n * Get\n *\n * Returns a connected State instance by key\n */\n public get<K extends Extract<keyof T, string>>(key: K) {\n return this.state[key];\n }\n\n /**\n * Set\n *\n * Sets a connected State instance's state by key\n */\n public set<K extends Extract<keyof T, string>>(\n key: K,\n value: StateType<T[K]>,\n ) {\n return this.get(key).set(value);\n }\n\n /**\n * Update\n *\n * Invokes a connected State instance's update method key\n */\n public update<K extends Extract<keyof T, string>>(\n key: K,\n updater: Setter<StateType<T[K]>>,\n ) {\n return this.get(key).update(updater);\n }\n\n /**\n * Subscribe\n *\n * Listen for changes on your Galena instnace. Your provided\n * callback will be invoked each time an attached state instance\n * changes. To your callback will be provided the `updated` state\n * instance, along with the entire `state` tree\n */\n public subscribe(subscriber: AppSubscriber<T>) {\n const ID = this.Emitter.on(\"change\", subscriber);\n const unsubscribers: (() => void)[] = [];\n for (const key in this.state) {\n const instance = this.state[key];\n if (!instance) {\n continue;\n }\n unsubscribers.push(\n instance.subscribe(() =>\n this.emit({ state: this.state, updated: instance }),\n ),\n );\n }\n return () => {\n this.Emitter.off(\"change\", ID);\n while (unsubscribers.length) {\n unsubscribers.pop?.()?.();\n }\n };\n }\n\n /**\n * Register Middleware\n *\n * Adds middleware instances to each of the connected\n * `State` instances\n */\n public registerMiddleware(...middlewares: Middleware<StateTypes<T>>[]) {\n for (const key in this.state) {\n this.state[key]?.registerMiddleware?.(...middlewares);\n }\n }\n\n private emit<K extends Extract<keyof T, string>>(\n event: GalenaSnapshot<T, K>,\n ) {\n this.Emitter.emit(\"change\", event);\n }\n}\n\n/**\n * ### createGalena\n *\n * Galena instances are designed to house one or more units of `State`\n * and exist as a pseudo global application state.\n *\n * By design, each of its `State` units have isolated reactivity\n * that prevents entire state trees from updating when a single\n * unit changes.\n *\n * ```typescript\n * import { Galena } from \"@figliolia/galena\";\n *\n * const AppState = new Galena({\n * user: new State(\"<user-stuff>\"),\n * business: new State(\"<business-logic-stuff>\")\n * // your reactive instances\n * }, ...middleware);\n *\n * // to retreive and work with an individual unit\n * const userState = AppState.get(\"user\"); // Returns State<T>\n *\n * // to run a callback anytime a unit of state changes\n * const listener = AppState.subscribe(({ state, updated }) => {\n * // do something with the `State` instance that updated\n * // the entirety of your state\n * });\n *\n * // get the current application state\n * const currentState = AppState.getState();\n *\n * // operate on an instance of state\n * AppState.update(\"user\", userState => ({\n * ...userState,\n * // your updates\n * }));\n * ```\n */\nexport const createGalena = <T extends Record<string, State<any>>>(\n ...args: ConstructorParameters<typeof Galena<T>>\n) => {\n return new Galena(...args);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,IAAa,SAAb,cAAkE,IAIhE;CAGkB;CAFlB,UAAkB,IAAI,aAA4C;CAClE,YACE,OACA,GAAG,YACH;EACA,MAAM,GAAG,UAAU;EAHH,KAAA,QAAA;CAIlB;;;;;;;CAQA,WAAkB;EAChB,MAAM,SAAS,CAAC;EAChB,KAAK,MAAM,OAAO,KAAK,OAAO;GAC5B,MAAM,QAAQ;GACd,OAAO,SAAS,KAAK,MAAM,IAAI,CAAC,SAAS;EAC3C;EACA,OAAO;CACT;;;;;;CAOA,IAA+C,KAAQ;EACrD,OAAO,KAAK,MAAM;CACpB;;;;;;CAOA,IACE,KACA,OACA;EACA,OAAO,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK;CAChC;;;;;;CAOA,OACE,KACA,SACA;EACA,OAAO,KAAK,IAAI,GAAG,CAAC,CAAC,OAAO,OAAO;CACrC;;;;;;;;;CAUA,UAAiB,YAA8B;EAC7C,MAAM,KAAK,KAAK,QAAQ,GAAG,UAAU,UAAU;EAC/C,MAAM,gBAAgC,CAAC;EACvC,KAAK,MAAM,OAAO,KAAK,OAAO;GAC5B,MAAM,WAAW,KAAK,MAAM;GAC5B,IAAI,CAAC,UACH;GAEF,cAAc,KACZ,SAAS,gBACP,KAAK,KAAK;IAAE,OAAO,KAAK;IAAO,SAAS;GAAS,CAAC,CACpD,CACF;EACF;EACA,aAAa;GACX,KAAK,QAAQ,IAAI,UAAU,EAAE;GAC7B,OAAO,cAAc,QACnB,cAAc,MAAM,CAAC,GAAG;EAE5B;CACF;;;;;;;CAQA,mBAA0B,GAAG,aAA0C;EACrE,KAAK,MAAM,OAAO,KAAK,OACrB,KAAK,MAAM,IAAI,EAAE,qBAAqB,GAAG,WAAW;CAExD;CAEA,KACE,OACA;EACA,KAAK,QAAQ,KAAK,UAAU,KAAK;CACnC;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,MAAa,gBACX,GAAG,SACA;CACH,OAAO,IAAI,OAAO,GAAG,IAAI;AAC3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.d.cts","names":[],"sources":["../src/Logger.ts"],"mappings":";;;;;;AAoBA;;;;;;;;;;;;;;;cAAa,MAAA,kBAAwB,UAAA;EAAA,QAC3B,aAAA;EAEC,cAAA,CAAe,KAAA,EAAO,KAAA,CAAM,CAAA;EAI5B,QAAA,CAAS,KAAA,EAAO,KAAA,CAAM,CAAA;EAAA;;;;;EAAA,YAwBnB,IAAA,CAAA;AAAA"}
1
+ {"version":3,"file":"Logger.d.cts","names":[],"sources":["../src/Logger.ts"],"mappings":";;;;;;AAoBA;;;;;;;;;;;;;;;cAAa,MAAA,kBAAwB,UAAA;EAAA,QAC3B,aAAA;EAEC,cAAA,CAAe,KAAA,EAAO,KAAA,CAAM,CAAA;EAI5B,QAAA,CAAS,KAAA,EAAO,KAAA,CAAM,CAAA;EAAA;;;;AAwBf;EAxBe,YAwBnB,IAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.d.mts","names":[],"sources":["../src/Logger.ts"],"mappings":";;;;;;AAoBA;;;;;;;;;;;;;;;cAAa,MAAA,kBAAwB,UAAA;EAAA,QAC3B,aAAA;EAEC,cAAA,CAAe,KAAA,EAAO,KAAA,CAAM,CAAA;EAI5B,QAAA,CAAS,KAAA,EAAO,KAAA,CAAM,CAAA;EAAA;;;;;EAAA,YAwBnB,IAAA,CAAA;AAAA"}
1
+ {"version":3,"file":"Logger.d.mts","names":[],"sources":["../src/Logger.ts"],"mappings":";;;;;;AAoBA;;;;;;;;;;;;;;;cAAa,MAAA,kBAAwB,UAAA;EAAA,QAC3B,aAAA;EAEC,cAAA,CAAe,KAAA,EAAO,KAAA,CAAM,CAAA;EAI5B,QAAA,CAAS,KAAA,EAAO,KAAA,CAAM,CAAA;EAAA;;;;AAwBf;EAxBe,YAwBnB,IAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.mjs","names":[],"sources":["../src/Logger.ts"],"sourcesContent":["import { Middleware } from \"./Middleware\";\nimport type { State } from \"./State\";\n\n/**\n * Logger\n *\n * A middleware for Redux-style logging! Each state transition\n * will log to the console the `State` instance that changed\n * along with a before and after snapshot of the current state:\n *\n * ```typescript\n * const AppState = new Galena({}, new Logger());\n * // or\n * AppState.registerMiddlerware(new Logger());\n * // or\n * const MyState = new State(4, new Logger());\n * // or\n * MyState.registerMiddleware(new Logger());\n * ```\n */\nexport class Logger<T = any> extends Middleware {\n private previousState: T | null = null;\n\n override onBeforeUpdate(state: State<T>) {\n this.previousState = state.getState();\n }\n\n override onUpdate(state: State<T>) {\n console.log(\n \"%cMutation:\",\n \"color: rgb(187, 186, 186); font-weight: bold\",\n \"@\",\n this.time,\n );\n console.log(\n \" %cPrevious State\",\n \"color: #26ad65; font-weight: bold\",\n this.previousState,\n );\n console.log(\n \" %cNext State \",\n \"color: rgb(17, 118, 249); font-weight: bold\",\n state.getState(),\n );\n }\n\n /**\n * Time\n *\n * Returns the time in which a given state transition completed\n */\n private get time() {\n const date = new Date();\n const mHours = date.getHours();\n const hours = mHours > 12 ? mHours - 12 : mHours;\n const mins = date.getMinutes();\n const minutes = mins.toString().length === 1 ? `0${mins}` : mins;\n const secs = date.getSeconds();\n const seconds = secs.toString().length === 1 ? `0${secs}` : secs;\n const milliseconds = date.getMilliseconds();\n return `${hours}:${minutes}:${seconds}:${milliseconds}`;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoBA,IAAa,SAAb,cAAqC,WAAW;CAC9C,gBAAkC;CAElC,eAAwB,OAAiB;AACvC,OAAK,gBAAgB,MAAM,UAAU;;CAGvC,SAAkB,OAAiB;AACjC,UAAQ,IACN,eACA,gDACA,KACA,KAAK,KACN;AACD,UAAQ,IACN,uBACA,qCACA,KAAK,cACN;AACD,UAAQ,IACN,uBACA,+CACA,MAAM,UAAU,CACjB;;;;;;;CAQH,IAAY,OAAO;EACjB,MAAM,uBAAO,IAAI,MAAM;EACvB,MAAM,SAAS,KAAK,UAAU;EAC9B,MAAM,QAAQ,SAAS,KAAK,SAAS,KAAK;EAC1C,MAAM,OAAO,KAAK,YAAY;EAC9B,MAAM,UAAU,KAAK,UAAU,CAAC,WAAW,IAAI,IAAI,SAAS;EAC5D,MAAM,OAAO,KAAK,YAAY;AAG9B,SAAO,GAAG,MAAM,GAAG,QAAQ,GAFX,KAAK,UAAU,CAAC,WAAW,IAAI,IAAI,SAAS,KAEtB,GADjB,KAAK,iBAAiB"}
1
+ {"version":3,"file":"Logger.mjs","names":[],"sources":["../src/Logger.ts"],"sourcesContent":["import { Middleware } from \"./Middleware\";\nimport type { State } from \"./State\";\n\n/**\n * Logger\n *\n * A middleware for Redux-style logging! Each state transition\n * will log to the console the `State` instance that changed\n * along with a before and after snapshot of the current state:\n *\n * ```typescript\n * const AppState = new Galena({}, new Logger());\n * // or\n * AppState.registerMiddlerware(new Logger());\n * // or\n * const MyState = new State(4, new Logger());\n * // or\n * MyState.registerMiddleware(new Logger());\n * ```\n */\nexport class Logger<T = any> extends Middleware {\n private previousState: T | null = null;\n\n override onBeforeUpdate(state: State<T>) {\n this.previousState = state.getState();\n }\n\n override onUpdate(state: State<T>) {\n console.log(\n \"%cMutation:\",\n \"color: rgb(187, 186, 186); font-weight: bold\",\n \"@\",\n this.time,\n );\n console.log(\n \" %cPrevious State\",\n \"color: #26ad65; font-weight: bold\",\n this.previousState,\n );\n console.log(\n \" %cNext State \",\n \"color: rgb(17, 118, 249); font-weight: bold\",\n state.getState(),\n );\n }\n\n /**\n * Time\n *\n * Returns the time in which a given state transition completed\n */\n private get time() {\n const date = new Date();\n const mHours = date.getHours();\n const hours = mHours > 12 ? mHours - 12 : mHours;\n const mins = date.getMinutes();\n const minutes = mins.toString().length === 1 ? `0${mins}` : mins;\n const secs = date.getSeconds();\n const seconds = secs.toString().length === 1 ? `0${secs}` : secs;\n const milliseconds = date.getMilliseconds();\n return `${hours}:${minutes}:${seconds}:${milliseconds}`;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoBA,IAAa,SAAb,cAAqC,WAAW;CAC9C,gBAAkC;CAElC,eAAwB,OAAiB;EACvC,KAAK,gBAAgB,MAAM,SAAS;CACtC;CAEA,SAAkB,OAAiB;EACjC,QAAQ,IACN,eACA,gDACA,KACA,KAAK,IACP;EACA,QAAQ,IACN,uBACA,qCACA,KAAK,aACP;EACA,QAAQ,IACN,uBACA,+CACA,MAAM,SAAS,CACjB;CACF;;;;;;CAOA,IAAY,OAAO;EACjB,MAAM,uBAAO,IAAI,KAAK;EACtB,MAAM,SAAS,KAAK,SAAS;EAC7B,MAAM,QAAQ,SAAS,KAAK,SAAS,KAAK;EAC1C,MAAM,OAAO,KAAK,WAAW;EAC7B,MAAM,UAAU,KAAK,SAAS,CAAC,CAAC,WAAW,IAAI,IAAI,SAAS;EAC5D,MAAM,OAAO,KAAK,WAAW;EAG7B,OAAO,GAAG,MAAM,GAAG,QAAQ,GAFX,KAAK,SAAS,CAAC,CAAC,WAAW,IAAI,IAAI,SAAS,KAEtB,GADjB,KAAK,gBAC0B;CACtD;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"Middleware.d.cts","names":[],"sources":["../src/Middleware.ts"],"mappings":";;;;;AA6CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,UAAA;;;;;;;EAOJ,cAAA,CAAe,MAAA,EAAQ,KAAA,CAAM,CAAA;;;;;;;EAQ7B,QAAA,CAAS,MAAA,EAAQ,KAAA,CAAM,CAAA;AAAA"}
1
+ {"version":3,"file":"Middleware.d.cts","names":[],"sources":["../src/Middleware.ts"],"mappings":";;;;;AA6CA;;;;;;;;;;;;;;;;;;;AAekC;;;;;;;;;;;;;;;;;;;;;;cAfrB,UAAA;;;;;;;EAOJ,cAAA,CAAe,MAAA,EAAQ,KAAA,CAAM,CAAA;;;;;;;EAQ7B,QAAA,CAAS,MAAA,EAAQ,KAAA,CAAM,CAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Middleware.d.mts","names":[],"sources":["../src/Middleware.ts"],"mappings":";;;;;AA6CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,UAAA;;;;;;;EAOJ,cAAA,CAAe,MAAA,EAAQ,KAAA,CAAM,CAAA;;;;;;;EAQ7B,QAAA,CAAS,MAAA,EAAQ,KAAA,CAAM,CAAA;AAAA"}
1
+ {"version":3,"file":"Middleware.d.mts","names":[],"sources":["../src/Middleware.ts"],"mappings":";;;;;AA6CA;;;;;;;;;;;;;;;;;;;AAekC;;;;;;;;;;;;;;;;;;;;;;cAfrB,UAAA;;;;;;;EAOJ,cAAA,CAAe,MAAA,EAAQ,KAAA,CAAM,CAAA;;;;;;;EAQ7B,QAAA,CAAS,MAAA,EAAQ,KAAA,CAAM,CAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Middleware.mjs","names":[],"sources":["../src/Middleware.ts"],"sourcesContent":["import type { State } from \"./State\";\n\n/**\n * Middleware\n *\n * Galena's middleware API is designed to provide hooks\n * for state changes that you can tap into to run your\n * own logic.\n *\n * Middleware is great for logging, analytics, and profiling:\n *\n * ```typescript\n * export class Profiler<T = any> extends Middleware<T> {\n * private previousState: T | null = null;\n * private startTime: null | number = null;\n * constructor(public readonly threshold: number = 16) {\n * super();\n * }\n *\n * public override onBeforeUpdate(state: State<T>) {\n * this.startTime = performance.now();\n * this.previousState = state.getState();\n * }\n *\n * public override onUpdate(state: T) {\n * const diff = performance.now() - this.startTime;\n * if(diff >= this.threshold) {\n * console.warn(`A slow state transition was detected when transitioning the following piece of state`);\n * console.log('Previous state', this.previousState);\n * console.log('Current state', state.getState());\n * }\n * }\n * }\n * ```\n *\n * To register your middleware, simply add it when constructing\n * a `State` or `Galena` instance.\n *\n * ```typescript\n * import { State } from \"@figliolia/galena\";\n * import { Profiler } from './myProfiler';\n *\n * const myState = new State(5, new Profiler());\n * ```\n */\nexport class Middleware<T = any> {\n /**\n * On Before Update\n *\n * Executes prior to a `State` instance being updated.\n * Receives the state prior to its update as a parameter\n */\n public onBeforeUpdate(_state: State<T>) {}\n\n /**\n * On Update\n *\n * Executes after a `State` instance has been update.\n * Receives the most recent state as a parameter\n */\n public onUpdate(_state: State<T>) {}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,IAAa,aAAb,MAAiC;;;;;;;CAO/B,eAAsB,QAAkB;;;;;;;CAQxC,SAAgB,QAAkB"}
1
+ {"version":3,"file":"Middleware.mjs","names":[],"sources":["../src/Middleware.ts"],"sourcesContent":["import type { State } from \"./State\";\n\n/**\n * Middleware\n *\n * Galena's middleware API is designed to provide hooks\n * for state changes that you can tap into to run your\n * own logic.\n *\n * Middleware is great for logging, analytics, and profiling:\n *\n * ```typescript\n * export class Profiler<T = any> extends Middleware<T> {\n * private previousState: T | null = null;\n * private startTime: null | number = null;\n * constructor(public readonly threshold: number = 16) {\n * super();\n * }\n *\n * public override onBeforeUpdate(state: State<T>) {\n * this.startTime = performance.now();\n * this.previousState = state.getState();\n * }\n *\n * public override onUpdate(state: T) {\n * const diff = performance.now() - this.startTime;\n * if(diff >= this.threshold) {\n * console.warn(`A slow state transition was detected when transitioning the following piece of state`);\n * console.log('Previous state', this.previousState);\n * console.log('Current state', state.getState());\n * }\n * }\n * }\n * ```\n *\n * To register your middleware, simply add it when constructing\n * a `State` or `Galena` instance.\n *\n * ```typescript\n * import { State } from \"@figliolia/galena\";\n * import { Profiler } from './myProfiler';\n *\n * const myState = new State(5, new Profiler());\n * ```\n */\nexport class Middleware<T = any> {\n /**\n * On Before Update\n *\n * Executes prior to a `State` instance being updated.\n * Receives the state prior to its update as a parameter\n */\n public onBeforeUpdate(_state: State<T>) {}\n\n /**\n * On Update\n *\n * Executes after a `State` instance has been update.\n * Receives the most recent state as a parameter\n */\n public onUpdate(_state: State<T>) {}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,IAAa,aAAb,MAAiC;;;;;;;CAO/B,eAAsB,QAAkB,CAAC;;;;;;;CAQzC,SAAgB,QAAkB,CAAC;AACrC"}
package/dist/Profiler.cjs CHANGED
@@ -17,6 +17,7 @@ const require_Middleware = require("./Middleware.cjs");
17
17
  * ```
18
18
  */
19
19
  var Profiler = class extends require_Middleware.Middleware {
20
+ threshold;
20
21
  previousState = null;
21
22
  startTime = null;
22
23
  constructor(threshold = 16) {
package/dist/Profiler.mjs CHANGED
@@ -17,6 +17,7 @@ import { Middleware } from "./Middleware.mjs";
17
17
  * ```
18
18
  */
19
19
  var Profiler = class extends Middleware {
20
+ threshold;
20
21
  previousState = null;
21
22
  startTime = null;
22
23
  constructor(threshold = 16) {
@@ -1 +1 @@
1
- {"version":3,"file":"Profiler.mjs","names":[],"sources":["../src/Profiler.ts"],"sourcesContent":["import { Middleware } from \"./Middleware\";\nimport type { State } from \"./State\";\n\n/**\n * Profiler\n *\n * A logger for state transitions exceeding a given\n * millisecond threshold\n *\n * ```typescript\n * const AppState = new Galena({}, new Profiler());\n * // or\n * AppState.registerMiddlerware(new Profiler());\n * // or\n * const MyState = new State(4, new Profiler());\n * // or\n * MyState.registerMiddleware(new Profiler());\n * ```\n */\nexport class Profiler<T = any> extends Middleware<T> {\n private previousState: T | null = null;\n private startTime: null | number = null;\n constructor(public readonly threshold = 16) {\n super();\n }\n\n public override onBeforeUpdate(state: State<T>) {\n this.startTime = performance.now();\n this.previousState = state.getState();\n }\n\n public override onUpdate(state: State<T>) {\n if (this.startTime === null) {\n return;\n }\n const diff = performance.now() - this.startTime;\n if (diff >= this.threshold) {\n console.warn(\n `A slow state transition of ${diff.toFixed(1)}ms was detected when transitioning the following piece of state`,\n );\n console.log(\n \" %cPrevious State\",\n \"color: #26ad65; font-weight: bold\",\n this.previousState,\n );\n console.log(\n \" %cCurrent State \",\n \"color: rgb(17, 118, 249); font-weight: bold\",\n state.getState(),\n );\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAmBA,IAAa,WAAb,cAAuC,WAAc;CACnD,gBAAkC;CAClC,YAAmC;CACnC,YAAY,YAA4B,IAAI;AAC1C,SAAO;AADmB,OAAA,YAAA;;CAI5B,eAA+B,OAAiB;AAC9C,OAAK,YAAY,YAAY,KAAK;AAClC,OAAK,gBAAgB,MAAM,UAAU;;CAGvC,SAAyB,OAAiB;AACxC,MAAI,KAAK,cAAc,KACrB;EAEF,MAAM,OAAO,YAAY,KAAK,GAAG,KAAK;AACtC,MAAI,QAAQ,KAAK,WAAW;AAC1B,WAAQ,KACN,8BAA8B,KAAK,QAAQ,EAAE,CAAC,iEAC/C;AACD,WAAQ,IACN,uBACA,qCACA,KAAK,cACN;AACD,WAAQ,IACN,0BACA,+CACA,MAAM,UAAU,CACjB"}
1
+ {"version":3,"file":"Profiler.mjs","names":[],"sources":["../src/Profiler.ts"],"sourcesContent":["import { Middleware } from \"./Middleware\";\nimport type { State } from \"./State\";\n\n/**\n * Profiler\n *\n * A logger for state transitions exceeding a given\n * millisecond threshold\n *\n * ```typescript\n * const AppState = new Galena({}, new Profiler());\n * // or\n * AppState.registerMiddlerware(new Profiler());\n * // or\n * const MyState = new State(4, new Profiler());\n * // or\n * MyState.registerMiddleware(new Profiler());\n * ```\n */\nexport class Profiler<T = any> extends Middleware<T> {\n private previousState: T | null = null;\n private startTime: null | number = null;\n constructor(public readonly threshold = 16) {\n super();\n }\n\n public override onBeforeUpdate(state: State<T>) {\n this.startTime = performance.now();\n this.previousState = state.getState();\n }\n\n public override onUpdate(state: State<T>) {\n if (this.startTime === null) {\n return;\n }\n const diff = performance.now() - this.startTime;\n if (diff >= this.threshold) {\n console.warn(\n `A slow state transition of ${diff.toFixed(1)}ms was detected when transitioning the following piece of state`,\n );\n console.log(\n \" %cPrevious State\",\n \"color: #26ad65; font-weight: bold\",\n this.previousState,\n );\n console.log(\n \" %cCurrent State \",\n \"color: rgb(17, 118, 249); font-weight: bold\",\n state.getState(),\n );\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAmBA,IAAa,WAAb,cAAuC,WAAc;CAGvB;CAF5B,gBAAkC;CAClC,YAAmC;CACnC,YAAY,YAA4B,IAAI;EAC1C,MAAM;EADoB,KAAA,YAAA;CAE5B;CAEA,eAA+B,OAAiB;EAC9C,KAAK,YAAY,YAAY,IAAI;EACjC,KAAK,gBAAgB,MAAM,SAAS;CACtC;CAEA,SAAyB,OAAiB;EACxC,IAAI,KAAK,cAAc,MACrB;EAEF,MAAM,OAAO,YAAY,IAAI,IAAI,KAAK;EACtC,IAAI,QAAQ,KAAK,WAAW;GAC1B,QAAQ,KACN,8BAA8B,KAAK,QAAQ,CAAC,EAAE,gEAChD;GACA,QAAQ,IACN,uBACA,qCACA,KAAK,aACP;GACA,QAAQ,IACN,0BACA,+CACA,MAAM,SAAS,CACjB;EACF;CACF;AACF"}
package/dist/State.cjs CHANGED
@@ -27,6 +27,7 @@ let _figliolia_event_emitter = require("@figliolia/event-emitter");
27
27
  * ```
28
28
  */
29
29
  var State = class extends require_API.API {
30
+ initialState;
30
31
  state;
31
32
  Emitter = new _figliolia_event_emitter.EventEmitter();
32
33
  constructor(initialState, ...middleware) {
@@ -1 +1 @@
1
- {"version":3,"file":"State.d.cts","names":[],"sources":["../src/State.ts"],"mappings":";;;;;;;AA8BA;;;;;;;;;;;;;;;;;;;;;;;cAAa,KAAA,YAAiB,GAAA,CAAI,CAAA,EAAG,WAAA,CAAY,CAAA;EAAA,SAI7B,YAAA,EAAc,WAAA,CAAY,CAAA;EAAA,QAHpC,KAAA;EAAA,iBACS,OAAA;cAEC,YAAA,EAAc,WAAA,CAAY,CAAA,MACvC,UAAA,EAAY,UAAA,CAAW,CAAA;EALG;;;;;;EAAA,SAiBf,GAAA,GAAG,KAAA,EAAA,WAAA,CAAA,CAAA;EAba;;;;;;;EAAA,SAsBhB,MAAA,GAAM,MAAA,EAAA,MAAA,CAAA,CAAA;EArBjB;;;;;;EAAA,SAkCW,KAAA;EAbA;;;;;EAoBT,QAAA,CAAA,GAAQ,WAAA,CAAA,CAAA;EAAA;;;;;;EAUR,SAAA,CAAU,EAAA,EAAI,UAAA,CAAW,CAAA;EAcH;;;;;;;EAAtB,kBAAA,CAAA,GAAsB,UAAA,EAAY,UAAA,CAAW,CAAA;EAAA,QAI5C,YAAA;EAAA,QAaA,IAAA;EAAA,UAOE,UAAA,CAAW,MAAA,EAAQ,MAAA,CAAO,CAAA,IAAK,MAAA,IAAU,WAAA,CAAY,CAAA;EAAA,QAIvD,gBAAA;AAAA;;;AAgCV;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,WAAA,GAAA,CAAA,GACX,IAAA,EAAM,qBAAA,QAA6B,KAAA,CAAM,CAAA,KAAG,KAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"State.d.cts","names":[],"sources":["../src/State.ts"],"mappings":";;;;;;;AA8BA;;;;;;;;;;;;;;;;;;;;;;;cAAa,KAAA,YAAiB,GAAA,CAAI,CAAA,EAAG,WAAA,CAAY,CAAA;EAAA,SAI7B,YAAA,EAAc,WAAA,CAAY,CAAA;EAAA,QAHpC,KAAA;EAAA,iBACS,OAAA;cAEC,YAAA,EAAc,WAAA,CAAY,CAAA,MACvC,UAAA,EAAY,UAAA,CAAW,CAAA;EALG;;;;;;EAAA,SAiBf,GAAA,GAAG,KAAA,EAAA,WAAA,CAAA,CAAA;EAba;;;;;;;EAAA,SAsBhB,MAAA,GAAM,MAAA,EAAA,MAAA,CAAA,CAAA;EArBjB;;;;;;EAAA,SAkCW,KAAA;EAbA;;;;;EAoBT,QAAA,IAAQ,WAAA,CAAA,CAAA;EAAA;;;;;;EAUR,SAAA,CAAU,EAAA,EAAI,UAAA,CAAW,CAAA;EAcH;;;;;;;EAAtB,kBAAA,IAAsB,UAAA,EAAY,UAAA,CAAW,CAAA;EAAA,QAI5C,YAAA;EAAA,QAaA,IAAA;EAAA,UAOE,UAAA,CAAW,MAAA,EAAQ,MAAA,CAAO,CAAA,IAAK,MAAA,IAAU,WAAA,CAAY,CAAA;EAAA,QAIvD,gBAAA;AAAA;;AAAgB;AAgC1B;;;;;;;;;;;;;;;;;;AACiD;;;;;iBADjC,WAAA,OACX,IAAA,EAAM,qBAAA,QAA6B,KAAA,CAAM,CAAA,KAAG,KAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"State.d.mts","names":[],"sources":["../src/State.ts"],"mappings":";;;;;;;AA8BA;;;;;;;;;;;;;;;;;;;;;;;cAAa,KAAA,YAAiB,GAAA,CAAI,CAAA,EAAG,WAAA,CAAY,CAAA;EAAA,SAI7B,YAAA,EAAc,WAAA,CAAY,CAAA;EAAA,QAHpC,KAAA;EAAA,iBACS,OAAA;cAEC,YAAA,EAAc,WAAA,CAAY,CAAA,MACvC,UAAA,EAAY,UAAA,CAAW,CAAA;EALG;;;;;;EAAA,SAiBf,GAAA,GAAG,KAAA,EAAA,WAAA,CAAA,CAAA;EAba;;;;;;;EAAA,SAsBhB,MAAA,GAAM,MAAA,EAAA,MAAA,CAAA,CAAA;EArBjB;;;;;;EAAA,SAkCW,KAAA;EAbA;;;;;EAoBT,QAAA,CAAA,GAAQ,WAAA,CAAA,CAAA;EAAA;;;;;;EAUR,SAAA,CAAU,EAAA,EAAI,UAAA,CAAW,CAAA;EAcH;;;;;;;EAAtB,kBAAA,CAAA,GAAsB,UAAA,EAAY,UAAA,CAAW,CAAA;EAAA,QAI5C,YAAA;EAAA,QAaA,IAAA;EAAA,UAOE,UAAA,CAAW,MAAA,EAAQ,MAAA,CAAO,CAAA,IAAK,MAAA,IAAU,WAAA,CAAY,CAAA;EAAA,QAIvD,gBAAA;AAAA;;;AAgCV;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,WAAA,GAAA,CAAA,GACX,IAAA,EAAM,qBAAA,QAA6B,KAAA,CAAM,CAAA,KAAG,KAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"State.d.mts","names":[],"sources":["../src/State.ts"],"mappings":";;;;;;;AA8BA;;;;;;;;;;;;;;;;;;;;;;;cAAa,KAAA,YAAiB,GAAA,CAAI,CAAA,EAAG,WAAA,CAAY,CAAA;EAAA,SAI7B,YAAA,EAAc,WAAA,CAAY,CAAA;EAAA,QAHpC,KAAA;EAAA,iBACS,OAAA;cAEC,YAAA,EAAc,WAAA,CAAY,CAAA,MACvC,UAAA,EAAY,UAAA,CAAW,CAAA;EALG;;;;;;EAAA,SAiBf,GAAA,GAAG,KAAA,EAAA,WAAA,CAAA,CAAA;EAba;;;;;;;EAAA,SAsBhB,MAAA,GAAM,MAAA,EAAA,MAAA,CAAA,CAAA;EArBjB;;;;;;EAAA,SAkCW,KAAA;EAbA;;;;;EAoBT,QAAA,IAAQ,WAAA,CAAA,CAAA;EAAA;;;;;;EAUR,SAAA,CAAU,EAAA,EAAI,UAAA,CAAW,CAAA;EAcH;;;;;;;EAAtB,kBAAA,IAAsB,UAAA,EAAY,UAAA,CAAW,CAAA;EAAA,QAI5C,YAAA;EAAA,QAaA,IAAA;EAAA,UAOE,UAAA,CAAW,MAAA,EAAQ,MAAA,CAAO,CAAA,IAAK,MAAA,IAAU,WAAA,CAAY,CAAA;EAAA,QAIvD,gBAAA;AAAA;;AAAgB;AAgC1B;;;;;;;;;;;;;;;;;;AACiD;;;;;iBADjC,WAAA,OACX,IAAA,EAAM,qBAAA,QAA6B,KAAA,CAAM,CAAA,KAAG,KAAA,CAAA,CAAA"}
package/dist/State.mjs CHANGED
@@ -27,6 +27,7 @@ import { EventEmitter } from "@figliolia/event-emitter";
27
27
  * ```
28
28
  */
29
29
  var State = class extends API {
30
+ initialState;
30
31
  state;
31
32
  Emitter = new EventEmitter();
32
33
  constructor(initialState, ...middleware) {
@@ -1 +1 @@
1
- {"version":3,"file":"State.mjs","names":[],"sources":["../src/State.ts"],"sourcesContent":["import { EventEmitter } from \"@figliolia/event-emitter\";\nimport { API } from \"./API\";\nimport type { Middleware } from \"./Middleware\";\nimport type { NonFunction, Setter, Subscriber } from \"./types\";\n\n/**\n * ### State\n *\n * The unit of reactivity for Galena. `State`'s can act\n * as isolated instances or be part of your global app\n * state (via `Galena` instances).\n *\n * There are two ways to create state instances\n *\n * ```typescript\n * import { State, createState, Profiler } from \"@figliolia/galena\";\n \n * const myState = new State(\"<any value>\", ...middleware);\n * // or\n * const myState = createState(\"<any value>\", ...middleware);\n *\n * myState.set(\"<new-value>\");\n * myState.update(previousValue => \"<new-value>\");\n * myState.subscribe(nextValue => {});\n * myState.registerMiddleware(new Profiler());\n * myState.reset(); // reset back to it's original value\n * // to get the current value at any point in time\n * const currentValue = myState.getState();\n * ```\n */\nexport class State<T> extends API<T, NonFunction<T>> {\n private state: NonFunction<T>;\n private readonly Emitter = new EventEmitter<{ change: NonFunction<T> }>();\n constructor(\n public readonly initialState: NonFunction<T>,\n ...middleware: Middleware<T>[]\n ) {\n super(...middleware);\n this.state = initialState;\n }\n\n /**\n * Set\n *\n * Updates the current value of state notifying\n * all interested parties\n */\n public readonly set = this.withEmission((state: NonFunction<T>) => state);\n\n /**\n * Update\n *\n * Updates the current value of state using a setter function\n * receiving the previous state as a parameter. Notifies all\n * interested parties\n */\n public readonly update = this.withEmission((setter: Setter<T>) => {\n if (this.diffSetter(setter)) {\n return setter;\n }\n return setter(this.state);\n });\n\n /**\n * Reset\n *\n * Resets the current state back to the state which the instance\n * was initialized with. Notifies all interested parties\n */\n public readonly reset = this.withEmission(() => this.initialState);\n\n /**\n * Get State\n *\n * Returns the current state\n */\n public getState() {\n return this.state;\n }\n\n /**\n * Subscribe\n *\n * Registers a callback to be executed each time state\n * changes. Returns an `unsubscribe` function\n */\n public subscribe(fn: Subscriber<T>) {\n const ID = this.Emitter.on(\"change\", fn);\n return () => {\n this.Emitter.off(\"change\", ID);\n };\n }\n\n /**\n * Register Middleware\n *\n * Registers any number of `Middleware` instances on the\n * current instance of `State`. Your middleware will begin\n * executing at the next state transition\n */\n public registerMiddleware(...middleware: Middleware<T>[]) {\n this.middleware.push(...middleware);\n }\n\n private withEmission<\n F extends (...args: any[]) => NonFunction<T> | Promise<NonFunction<T>>,\n >(fn: F) {\n return (...args: Parameters<F>) => {\n const result = fn(...args);\n if (result instanceof Promise) {\n void result.then(resolved => this.emit(resolved));\n return;\n }\n return this.emit(result);\n };\n }\n\n private emit(nextState: NonFunction<T>) {\n this.invokeMiddleware(\"onBeforeUpdate\");\n this.state = nextState;\n this.Emitter.emit(\"change\", this.state);\n this.invokeMiddleware(\"onUpdate\");\n }\n\n protected diffSetter(setter: Setter<T>): setter is NonFunction<T> {\n return typeof setter !== \"function\";\n }\n\n private invokeMiddleware<K extends keyof Middleware<T>>(fn: K) {\n for (const middleware of this.middleware) {\n middleware[fn](this);\n }\n }\n}\n\n/**\n * ### createState\n *\n * The unit of reactivity for Galena. `State`'s can act\n * as isolated instances or be part of your global app\n * state (via `Galena` instances).\n *\n * There are two ways to create state instances\n *\n * ```typescript\n * import { State, createState, Profiler } from \"@figliolia/galena\";\n \n * const myState = new State(\"<any value>\", ...middleware);\n * // or\n * const myState = createState(\"<any value>\", ...middleware);\n *\n * myState.set(\"<new-value>\");\n * myState.update(previousValue => \"<new-value>\");\n * myState.subscribe(nextValue => {});\n * myState.registerMiddleware(new Profiler());\n * myState.reset(); // reset back to it's original value\n * // to get the current value at any point in time\n * const currentValue = myState.getState();\n * ```\n */\nexport function createState<T>(\n ...args: ConstructorParameters<typeof State<T>>\n) {\n return new State<T>(...args);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAa,QAAb,cAA8B,IAAuB;CACnD;CACA,UAA2B,IAAI,cAA0C;CACzE,YACE,cACA,GAAG,YACH;AACA,QAAM,GAAG,WAAW;AAHJ,OAAA,eAAA;AAIhB,OAAK,QAAQ;;;;;;;;CASf,MAAsB,KAAK,cAAc,UAA0B,MAAM;;;;;;;;CASzE,SAAyB,KAAK,cAAc,WAAsB;AAChE,MAAI,KAAK,WAAW,OAAO,CACzB,QAAO;AAET,SAAO,OAAO,KAAK,MAAM;GACzB;;;;;;;CAQF,QAAwB,KAAK,mBAAmB,KAAK,aAAa;;;;;;CAOlE,WAAkB;AAChB,SAAO,KAAK;;;;;;;;CASd,UAAiB,IAAmB;EAClC,MAAM,KAAK,KAAK,QAAQ,GAAG,UAAU,GAAG;AACxC,eAAa;AACX,QAAK,QAAQ,IAAI,UAAU,GAAG;;;;;;;;;;CAWlC,mBAA0B,GAAG,YAA6B;AACxD,OAAK,WAAW,KAAK,GAAG,WAAW;;CAGrC,aAEE,IAAO;AACP,UAAQ,GAAG,SAAwB;GACjC,MAAM,SAAS,GAAG,GAAG,KAAK;AAC1B,OAAI,kBAAkB,SAAS;AACxB,WAAO,MAAK,aAAY,KAAK,KAAK,SAAS,CAAC;AACjD;;AAEF,UAAO,KAAK,KAAK,OAAO;;;CAI5B,KAAa,WAA2B;AACtC,OAAK,iBAAiB,iBAAiB;AACvC,OAAK,QAAQ;AACb,OAAK,QAAQ,KAAK,UAAU,KAAK,MAAM;AACvC,OAAK,iBAAiB,WAAW;;CAGnC,WAAqB,QAA6C;AAChE,SAAO,OAAO,WAAW;;CAG3B,iBAAwD,IAAO;AAC7D,OAAK,MAAM,cAAc,KAAK,WAC5B,YAAW,IAAI,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8B1B,SAAgB,YACd,GAAG,MACH;AACA,QAAO,IAAI,MAAS,GAAG,KAAK"}
1
+ {"version":3,"file":"State.mjs","names":[],"sources":["../src/State.ts"],"sourcesContent":["import { EventEmitter } from \"@figliolia/event-emitter\";\nimport { API } from \"./API\";\nimport type { Middleware } from \"./Middleware\";\nimport type { NonFunction, Setter, Subscriber } from \"./types\";\n\n/**\n * ### State\n *\n * The unit of reactivity for Galena. `State`'s can act\n * as isolated instances or be part of your global app\n * state (via `Galena` instances).\n *\n * There are two ways to create state instances\n *\n * ```typescript\n * import { State, createState, Profiler } from \"@figliolia/galena\";\n \n * const myState = new State(\"<any value>\", ...middleware);\n * // or\n * const myState = createState(\"<any value>\", ...middleware);\n *\n * myState.set(\"<new-value>\");\n * myState.update(previousValue => \"<new-value>\");\n * myState.subscribe(nextValue => {});\n * myState.registerMiddleware(new Profiler());\n * myState.reset(); // reset back to it's original value\n * // to get the current value at any point in time\n * const currentValue = myState.getState();\n * ```\n */\nexport class State<T> extends API<T, NonFunction<T>> {\n private state: NonFunction<T>;\n private readonly Emitter = new EventEmitter<{ change: NonFunction<T> }>();\n constructor(\n public readonly initialState: NonFunction<T>,\n ...middleware: Middleware<T>[]\n ) {\n super(...middleware);\n this.state = initialState;\n }\n\n /**\n * Set\n *\n * Updates the current value of state notifying\n * all interested parties\n */\n public readonly set = this.withEmission((state: NonFunction<T>) => state);\n\n /**\n * Update\n *\n * Updates the current value of state using a setter function\n * receiving the previous state as a parameter. Notifies all\n * interested parties\n */\n public readonly update = this.withEmission((setter: Setter<T>) => {\n if (this.diffSetter(setter)) {\n return setter;\n }\n return setter(this.state);\n });\n\n /**\n * Reset\n *\n * Resets the current state back to the state which the instance\n * was initialized with. Notifies all interested parties\n */\n public readonly reset = this.withEmission(() => this.initialState);\n\n /**\n * Get State\n *\n * Returns the current state\n */\n public getState() {\n return this.state;\n }\n\n /**\n * Subscribe\n *\n * Registers a callback to be executed each time state\n * changes. Returns an `unsubscribe` function\n */\n public subscribe(fn: Subscriber<T>) {\n const ID = this.Emitter.on(\"change\", fn);\n return () => {\n this.Emitter.off(\"change\", ID);\n };\n }\n\n /**\n * Register Middleware\n *\n * Registers any number of `Middleware` instances on the\n * current instance of `State`. Your middleware will begin\n * executing at the next state transition\n */\n public registerMiddleware(...middleware: Middleware<T>[]) {\n this.middleware.push(...middleware);\n }\n\n private withEmission<\n F extends (...args: any[]) => NonFunction<T> | Promise<NonFunction<T>>,\n >(fn: F) {\n return (...args: Parameters<F>) => {\n const result = fn(...args);\n if (result instanceof Promise) {\n void result.then(resolved => this.emit(resolved));\n return;\n }\n return this.emit(result);\n };\n }\n\n private emit(nextState: NonFunction<T>) {\n this.invokeMiddleware(\"onBeforeUpdate\");\n this.state = nextState;\n this.Emitter.emit(\"change\", this.state);\n this.invokeMiddleware(\"onUpdate\");\n }\n\n protected diffSetter(setter: Setter<T>): setter is NonFunction<T> {\n return typeof setter !== \"function\";\n }\n\n private invokeMiddleware<K extends keyof Middleware<T>>(fn: K) {\n for (const middleware of this.middleware) {\n middleware[fn](this);\n }\n }\n}\n\n/**\n * ### createState\n *\n * The unit of reactivity for Galena. `State`'s can act\n * as isolated instances or be part of your global app\n * state (via `Galena` instances).\n *\n * There are two ways to create state instances\n *\n * ```typescript\n * import { State, createState, Profiler } from \"@figliolia/galena\";\n \n * const myState = new State(\"<any value>\", ...middleware);\n * // or\n * const myState = createState(\"<any value>\", ...middleware);\n *\n * myState.set(\"<new-value>\");\n * myState.update(previousValue => \"<new-value>\");\n * myState.subscribe(nextValue => {});\n * myState.registerMiddleware(new Profiler());\n * myState.reset(); // reset back to it's original value\n * // to get the current value at any point in time\n * const currentValue = myState.getState();\n * ```\n */\nexport function createState<T>(\n ...args: ConstructorParameters<typeof State<T>>\n) {\n return new State<T>(...args);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAa,QAAb,cAA8B,IAAuB;CAIjC;CAHlB;CACA,UAA2B,IAAI,aAAyC;CACxE,YACE,cACA,GAAG,YACH;EACA,MAAM,GAAG,UAAU;EAHH,KAAA,eAAA;EAIhB,KAAK,QAAQ;CACf;;;;;;;CAQA,MAAsB,KAAK,cAAc,UAA0B,KAAK;;;;;;;;CASxE,SAAyB,KAAK,cAAc,WAAsB;EAChE,IAAI,KAAK,WAAW,MAAM,GACxB,OAAO;EAET,OAAO,OAAO,KAAK,KAAK;CAC1B,CAAC;;;;;;;CAQD,QAAwB,KAAK,mBAAmB,KAAK,YAAY;;;;;;CAOjE,WAAkB;EAChB,OAAO,KAAK;CACd;;;;;;;CAQA,UAAiB,IAAmB;EAClC,MAAM,KAAK,KAAK,QAAQ,GAAG,UAAU,EAAE;EACvC,aAAa;GACX,KAAK,QAAQ,IAAI,UAAU,EAAE;EAC/B;CACF;;;;;;;;CASA,mBAA0B,GAAG,YAA6B;EACxD,KAAK,WAAW,KAAK,GAAG,UAAU;CACpC;CAEA,aAEE,IAAO;EACP,QAAQ,GAAG,SAAwB;GACjC,MAAM,SAAS,GAAG,GAAG,IAAI;GACzB,IAAI,kBAAkB,SAAS;IAC7B,OAAY,MAAK,aAAY,KAAK,KAAK,QAAQ,CAAC;IAChD;GACF;GACA,OAAO,KAAK,KAAK,MAAM;EACzB;CACF;CAEA,KAAa,WAA2B;EACtC,KAAK,iBAAiB,gBAAgB;EACtC,KAAK,QAAQ;EACb,KAAK,QAAQ,KAAK,UAAU,KAAK,KAAK;EACtC,KAAK,iBAAiB,UAAU;CAClC;CAEA,WAAqB,QAA6C;EAChE,OAAO,OAAO,WAAW;CAC3B;CAEA,iBAAwD,IAAO;EAC7D,KAAK,MAAM,cAAc,KAAK,YAC5B,WAAW,GAAG,CAAC,IAAI;CAEvB;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,SAAgB,YACd,GAAG,MACH;CACA,OAAO,IAAI,MAAS,GAAG,IAAI;AAC7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.cts","names":[],"sources":["../src/types.ts"],"mappings":";;;KAEY,WAAA,MAAiB,CAAA,cAAc,IAAA,2BAA8B,CAAA;AAAA,KAE7D,cAAA,MAAoB,CAAA,SAAU,MAAA,gBAAsB,OAAA,CAAQ,CAAA,IAAK,CAAA;AAAA,KAEjE,MAAA,MACR,WAAA,CAAY,CAAA,MACV,SAAA,EAAW,WAAA,CAAY,CAAA,MAAO,WAAA,CAAY,CAAA,IAAK,OAAA,CAAQ,WAAA,CAAY,CAAA;AAAA,KAE7D,UAAA,QAAkB,KAAA,EAAO,WAAA,CAAY,CAAA;AAAA,UAEhC,cAAA,WACL,MAAA,SAAe,KAAA,kBACf,OAAA,OAAc,CAAA,YAAa,OAAA,OAAc,CAAA;EAEnD,OAAA,EAAS,CAAA,CAAE,CAAA;EACX,KAAA,EAAO,CAAA;AAAA;AAAA,KAGG,aAAA,WACA,MAAA,SAAe,KAAA,kBACf,OAAA,OAAc,CAAA,YAAa,OAAA,OAAc,CAAA,eAC/C,OAAA,EAAS,cAAA,CAAe,CAAA,EAAG,CAAA;AAAA,KAErB,UAAA,WAAqB,MAAA,SAAe,KAAA,UAAe,UAAA,CAC7D,SAAA,CAAU,CAAA,OAAQ,CAAA;AAAA,KAGR,SAAA,WAAoB,KAAA,SAAc,UAAA,CAAW,CAAA;AAAA,KAE7C,WAAA,WAAsB,MAAA,SAAe,KAAA,wBACnC,CAAA,GAAI,SAAA,CAAU,CAAA,CAAE,CAAA"}
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../src/types.ts"],"mappings":";;;KAEY,WAAA,MAAiB,CAAA,cAAc,IAAA,2BAA8B,CAAC;AAAA,KAE9D,cAAA,MAAoB,CAAA,SAAU,MAAA,gBAAsB,OAAA,CAAQ,CAAA,IAAK,CAAA;AAAA,KAEjE,MAAA,MACR,WAAA,CAAY,CAAA,MACV,SAAA,EAAW,WAAA,CAAY,CAAA,MAAO,WAAA,CAAY,CAAA,IAAK,OAAA,CAAQ,WAAA,CAAY,CAAA;AAAA,KAE7D,UAAA,QAAkB,KAAA,EAAO,WAAW,CAAC,CAAA;AAAA,UAEhC,cAAA,WACL,MAAA,SAAe,KAAA,kBACf,OAAA,OAAc,CAAA,YAAa,OAAA,OAAc,CAAA;EAEnD,OAAA,EAAS,CAAA,CAAE,CAAA;EACX,KAAA,EAAO,CAAA;AAAA;AAAA,KAGG,aAAA,WACA,MAAA,SAAe,KAAA,kBACf,OAAA,OAAc,CAAA,YAAa,OAAA,OAAc,CAAA,eAC/C,OAAA,EAAS,cAAA,CAAe,CAAA,EAAG,CAAA;AAAA,KAErB,UAAA,WAAqB,MAAA,SAAe,KAAA,UAAe,UAAA,CAC7D,SAAA,CAAU,CAAA,OAAQ,CAAA;AAAA,KAGR,SAAA,WAAoB,KAAA,SAAc,UAAA,CAAW,CAAA;AAAA,KAE7C,WAAA,WAAsB,MAAA,SAAe,KAAA,wBACnC,CAAA,GAAI,SAAA,CAAU,CAAA,CAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;;KAEY,WAAA,MAAiB,CAAA,cAAc,IAAA,2BAA8B,CAAA;AAAA,KAE7D,cAAA,MAAoB,CAAA,SAAU,MAAA,gBAAsB,OAAA,CAAQ,CAAA,IAAK,CAAA;AAAA,KAEjE,MAAA,MACR,WAAA,CAAY,CAAA,MACV,SAAA,EAAW,WAAA,CAAY,CAAA,MAAO,WAAA,CAAY,CAAA,IAAK,OAAA,CAAQ,WAAA,CAAY,CAAA;AAAA,KAE7D,UAAA,QAAkB,KAAA,EAAO,WAAA,CAAY,CAAA;AAAA,UAEhC,cAAA,WACL,MAAA,SAAe,KAAA,kBACf,OAAA,OAAc,CAAA,YAAa,OAAA,OAAc,CAAA;EAEnD,OAAA,EAAS,CAAA,CAAE,CAAA;EACX,KAAA,EAAO,CAAA;AAAA;AAAA,KAGG,aAAA,WACA,MAAA,SAAe,KAAA,kBACf,OAAA,OAAc,CAAA,YAAa,OAAA,OAAc,CAAA,eAC/C,OAAA,EAAS,cAAA,CAAe,CAAA,EAAG,CAAA;AAAA,KAErB,UAAA,WAAqB,MAAA,SAAe,KAAA,UAAe,UAAA,CAC7D,SAAA,CAAU,CAAA,OAAQ,CAAA;AAAA,KAGR,SAAA,WAAoB,KAAA,SAAc,UAAA,CAAW,CAAA;AAAA,KAE7C,WAAA,WAAsB,MAAA,SAAe,KAAA,wBACnC,CAAA,GAAI,SAAA,CAAU,CAAA,CAAE,CAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;;KAEY,WAAA,MAAiB,CAAA,cAAc,IAAA,2BAA8B,CAAC;AAAA,KAE9D,cAAA,MAAoB,CAAA,SAAU,MAAA,gBAAsB,OAAA,CAAQ,CAAA,IAAK,CAAA;AAAA,KAEjE,MAAA,MACR,WAAA,CAAY,CAAA,MACV,SAAA,EAAW,WAAA,CAAY,CAAA,MAAO,WAAA,CAAY,CAAA,IAAK,OAAA,CAAQ,WAAA,CAAY,CAAA;AAAA,KAE7D,UAAA,QAAkB,KAAA,EAAO,WAAW,CAAC,CAAA;AAAA,UAEhC,cAAA,WACL,MAAA,SAAe,KAAA,kBACf,OAAA,OAAc,CAAA,YAAa,OAAA,OAAc,CAAA;EAEnD,OAAA,EAAS,CAAA,CAAE,CAAA;EACX,KAAA,EAAO,CAAA;AAAA;AAAA,KAGG,aAAA,WACA,MAAA,SAAe,KAAA,kBACf,OAAA,OAAc,CAAA,YAAa,OAAA,OAAc,CAAA,eAC/C,OAAA,EAAS,cAAA,CAAe,CAAA,EAAG,CAAA;AAAA,KAErB,UAAA,WAAqB,MAAA,SAAe,KAAA,UAAe,UAAA,CAC7D,SAAA,CAAU,CAAA,OAAQ,CAAA;AAAA,KAGR,SAAA,WAAoB,KAAA,SAAc,UAAA,CAAW,CAAA;AAAA,KAE7C,WAAA,WAAsB,MAAA,SAAe,KAAA,wBACnC,CAAA,GAAI,SAAA,CAAU,CAAA,CAAE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@figliolia/galena",
3
- "version": "4.0.2",
3
+ "version": "4.0.3",
4
4
  "description": "A performant state management library supporting middleware and a rich developer API",
5
5
  "keywords": [
6
6
  "flux",
@@ -46,10 +46,10 @@
46
46
  "eslint-plugin-import": "^2.32.0",
47
47
  "eslint-plugin-simple-import-sort": "^12.1.1",
48
48
  "eslint-plugin-unused-imports": "^4.4.1",
49
- "oxfmt": "^0.42.0",
49
+ "oxfmt": "^0.56.0",
50
50
  "oxlint": "^1.36.0",
51
- "oxlint-tsgolint": "^0.18.1",
52
- "tsdown": "^0.21.1",
51
+ "oxlint-tsgolint": "^0.23.0",
52
+ "tsdown": "^0.22.3",
53
53
  "typescript": "^6.0.2"
54
54
  },
55
55
  "peerDependencies": {