pinia-plugin-subscription 1.0.0-beta.3 → 1.0.0-beta.4

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/CHANGELOG.md CHANGED
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ### Added
11
11
  - Added `createTracerRegistry()` to create isolated trace listeners and tracers for each application or Pinia instance
12
+ - Added `createTraceGroupsRegistry()` to group matching trace events in the console
12
13
  - Added the `Tracer` class and registry methods `addTraceListener()`, `clearTraceListeners()` and `hasTraceListeners()`
13
14
  - Added metadata-based trace filter criteria with `equals`, `contains`, `startsWith` and `endsWith` comparators, combined with `every` or `some`
14
15
  - Added `createConsoleTraceListener()` as an opt-in console sink for trace events
package/README.md CHANGED
@@ -209,7 +209,7 @@ The `Store` class (see [src/core/Store.ts](src/core/Store.ts)) is a wrapper arou
209
209
 
210
210
  ## Tracing
211
211
 
212
- Tracing is **opt-in**, scoped to an explicit registry, and **allocation free when unused**. Create one registry per application or Pinia instance, then pass its `createTracer` factory to `createPlugin()` so plugin and store events share its listeners. For SSR, create a fresh registry, Pinia instance, and plugin instance for every request; do not keep them in module-level state or clear a shared registry at request completion, since requests may overlap. See the [SSR guide](./docs/using-plugins.md#ssr--nuxt) for an example.
212
+ Tracing is **opt-in**, scoped to an explicit registry, and **allocation free when unused**. Create a trace-groups registry per application or Pinia instance, add criteria to select the events to group, then pass its `tracerHandler` to `createPlugin()` so plugin and store events share its groups. For SSR, create a fresh registry, Pinia instance, and plugin instance for every request; do not keep them in module-level state or clear a shared registry at request completion, since requests may overlap. See the [SSR guide](./docs/using-plugins.md#ssr--nuxt) for an example.
213
213
 
214
214
  ### Production safety
215
215
 
@@ -223,42 +223,35 @@ Events are **not automatically redacted** and may include sensitive action argum
223
223
 
224
224
  ```ts
225
225
  import { createPlugin } from 'pinia-plugin-subscription'
226
- import { createTracerRegistry } from 'pinia-plugin-subscription/helpers'
226
+ import { createTraceGroupsRegistry } from 'pinia-plugin-subscription/helpers'
227
227
 
228
- const traceRegistry = createTracerRegistry()
229
- const remove = traceRegistry.addTraceListener({
230
- filter: (event) => event.scope === 'cart'
231
- && event.namespace.startsWith('pluginsubscription:subscription:'),
232
- handler: (event) => console.log(event.namespace, event.scope, event.payload)
233
- })
228
+ const traceGroupsRegistry = createTraceGroupsRegistry()
229
+ const remove = traceGroupsRegistry.addListener([
230
+ { target: 'scope', value: 'cart' },
231
+ { target: 'namespace', comparator: 'startsWith', value: 'pluginsubscription:subscription:' }
232
+ ])
234
233
 
235
234
  pinia.use(createPlugin(subscribers, {
236
- createTracer: traceRegistry.createTracer
235
+ tracerHandler: traceGroupsRegistry.tracerHandler
237
236
  }))
238
237
 
239
238
  remove() // unsubscribe
240
239
  ```
241
240
 
242
- `filter` is evaluated against event metadata before the payload is resolved,
243
- so you can narrow tracing to a single store without building discarded
244
- payloads. Registries do not share listeners with one another.
245
-
246
- For simple metadata filters, provide comparison criteria instead of a
247
- callback. Supported comparators are `equals` (the default), `contains`,
248
- `startsWith` and `endsWith`; multiple criteria use `every` by default or
249
- `some` when requested:
241
+ Criteria are evaluated against event metadata, before the payload is resolved.
242
+ By default, all criteria must match and events are grouped by `scope`. Supported
243
+ comparators are `equals` (the default), `contains`, `startsWith` and `endsWith`;
244
+ set `filterMode` to `some` to match any criterion or `groupBy` to group by a
245
+ different event metadata field:
250
246
 
251
247
  ```ts
252
- traceRegistry.addTraceListener({
253
- filter: [
254
- { target: 'scope', value: 'cart' },
255
- { target: 'namespace', comparator: 'startsWith', value: 'pluginsubscription:subscription:' }
256
- ]
257
- }, 'every')
248
+ traceGroupsRegistry.addListener([
249
+ { target: 'scope', value: 'cart' },
250
+ { target: 'namespace', comparator: 'startsWith', value: 'pluginsubscription:subscription:' }
251
+ ], { filterMode: 'every', groupBy: 'scope' })
258
252
  ```
259
253
 
260
- When no `handler` is provided for criteria-based registration, the registry
261
- uses its styled console listener.
254
+ The registry uses the console's grouped output for matching events.
262
255
 
263
256
  ### Event shape
264
257
 
@@ -300,34 +293,25 @@ namespace is provided, the normalized label is used as the namespace.
300
293
  Always prefer the **function form** for `payload`: it is only invoked once a
301
294
  listener matches, so unobserved tracing costs nothing.
302
295
 
303
- ### Console listener
296
+ ### Grouped console output
304
297
 
305
- Normal trace events do not write to a console. Console output for those events is an opt-in listener:
298
+ Normal trace events do not write to a console. To opt into console output grouped
299
+ by store, configure the registry and pass its `tracerHandler` to the plugin:
306
300
 
307
301
  ```ts
308
- import {
309
- createConsoleTraceListener,
310
- createTracerRegistry
311
- } from 'pinia-plugin-subscription/helpers'
312
-
313
- const traceRegistry = createTracerRegistry()
314
- const remove = traceRegistry.addTraceListener({
315
- ...createConsoleTraceListener(),
316
- filter: () => true
317
- })
318
- ```
302
+ import { createTraceGroupsRegistry } from 'pinia-plugin-subscription/helpers'
319
303
 
320
- By default, this listener uses the styled plugin console. Pass any object exposing `log` and `error` to use another target:
304
+ const traceGroupsRegistry = createTraceGroupsRegistry()
305
+ traceGroupsRegistry.addListener([{ target: 'scope', value: 'cart' }])
321
306
 
322
- Any object exposing `log` and `error` satisfies the `Console` interface, so external logging libraries can be connected without this plugin depending on them:
323
-
324
- ```ts
325
- const remove = traceRegistry.addTraceListener({
326
- ...createConsoleTraceListener(myLogger),
327
- filter: () => true
328
- })
307
+ pinia.use(createPlugin(subscribers, {
308
+ tracerHandler: traceGroupsRegistry.tracerHandler
309
+ }))
329
310
  ```
330
311
 
312
+ Groups are selected by event metadata and default to grouping by `scope`. Use
313
+ `addListener()`'s `groupBy` option to group by another metadata field.
314
+
331
315
  ### Error reporting
332
316
 
333
317
  An error is delivered to every matching listener. If no listener matches — including when listeners exist but all filters reject the event — it is reported with `console.error`; it is not rethrown. Errors thrown by filters or handlers are also reported and isolated so they do not interrupt the traced process or remaining listeners.
@@ -4,6 +4,6 @@ export { CustomConsole } from '../system/log';
4
4
  export { isEmpty } from '../utils/validation';
5
5
  export type { Console, LogType, StyleDefinition, StyleDefinitionKeys, StyleDefinitions, ConsoleStyleDefinition, ConsoleStyleDefinitionKeys, ConsoleStyleDefinitions } from "../types";
6
6
  export type { TraceEvent, TraceEventMetadata, TraceFilter, TraceHandler, TraceLevel, TraceListener, TraceListenerRemover, TracePayload, TraceRegistry, TracerOptions } from "../types/trace";
7
- export { createTracerRegistry } from "../factories/trace-registry";
7
+ export { createTracerRegistry, createTraceGroupsRegistry } from "../factories/trace-registry";
8
8
  export { default as Tracer } from "../system/Tracer";
9
- export { createConsoleTraceListener } from "../factories/console-trace-listener";
9
+ export { createConsoleTraceListener, createConsoleGroupTraceListener } from "../factories/console-trace-listener";
package/dist/helpers.js CHANGED
@@ -1,10 +1,10 @@
1
- var b = Object.defineProperty;
2
- var y = (e, r, t) => r in e ? b(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t;
3
- var c = (e, r, t) => y(e, typeof r != "symbol" ? r + "" : r, t);
4
- import { p as _ } from "./chunks/constantes-2FeJfVVy.js";
5
- import { P, S as F, i as B } from "./chunks/constantes-2FeJfVVy.js";
6
- const m = (e, r = "white") => `background-color: ${e}; color: ${r}; padding: 1px; margin-right: 5px; font-size: 12px`;
7
- function l(e, r) {
1
+ var E = Object.defineProperty;
2
+ var $ = (e, r, o) => r in e ? E(e, r, { enumerable: !0, configurable: !0, writable: !0, value: o }) : e[r] = o;
3
+ var a = (e, r, o) => $(e, typeof r != "symbol" ? r + "" : r, o);
4
+ import { p as A } from "./chunks/constantes-2FeJfVVy.js";
5
+ import { P as M, S as R, i as B } from "./chunks/constantes-2FeJfVVy.js";
6
+ const C = (e, r = "white") => `background-color: ${e}; color: ${r}; padding: 1px; margin-right: 5px; font-size: 12px`;
7
+ function f(e, r) {
8
8
  if (Array.isArray(r) ? r.length === 0 : Object.keys(r).length === 0) {
9
9
  console.log(
10
10
  "%c%s",
@@ -18,80 +18,80 @@ function l(e, r) {
18
18
  "color: #f7f7b0; padding: 1px; margin-right: 5px; font-size: 11px",
19
19
  `[ ${e} ]`
20
20
  ), Array.isArray(r))
21
- typeof r[0] == "object" ? r.forEach((o) => {
22
- o._name ? l(o._name, o) : o._id ? l(o._id, o) : console.dir(o);
23
- }) : r.forEach((o, s) => {
21
+ typeof r[0] == "object" ? r.forEach((t) => {
22
+ t._name ? f(t._name, t) : t._id ? f(t._id, t) : console.dir(t);
23
+ }) : r.forEach((t, n) => {
24
24
  console.log(
25
25
  "%c%s",
26
26
  "color: #cae38f; padding: 1px; margin-right: 5px; font-size: 10px",
27
- `[ ${s} ]`,
28
- o
27
+ `[ ${n} ]`,
28
+ t
29
29
  );
30
30
  });
31
31
  else {
32
- let o = [];
33
- Object.keys(r).forEach((s) => {
34
- const i = r[s];
35
- typeof i == "object" ? Array.isArray(i) ? typeof i[0] == "object" ? l(s, i) : (console.groupCollapsed(s), console.log(i), console.groupEnd()) : l(s, Object.assign({}, i)) : i ? console.log(
32
+ let t = [];
33
+ Object.keys(r).forEach((n) => {
34
+ const s = r[n];
35
+ typeof s == "object" ? Array.isArray(s) ? typeof s[0] == "object" ? f(n, s) : (console.groupCollapsed(n), console.log(s), console.groupEnd()) : f(n, Object.assign({}, s)) : s ? console.log(
36
36
  "%c%s",
37
37
  "color: #b0fa05; padding: 1px; margin-right: 5px; font-size: 10px",
38
- `[ ${s} ]`,
39
- i
40
- ) : o.push(s);
41
- }), o.length && console.log(
38
+ `[ ${n} ]`,
39
+ s
40
+ ) : t.push(n);
41
+ }), t.length && console.log(
42
42
  "%c%s",
43
43
  "color: #f86f63; font-size: 9px",
44
44
  "[ Empty properties ]",
45
- o
45
+ t
46
46
  );
47
47
  }
48
48
  console.groupEnd();
49
49
  }
50
- function p(e) {
50
+ function h(e) {
51
51
  Object.keys(e).forEach((r) => {
52
52
  if (["label", "namespace", "scope", "source"].includes(r))
53
53
  return;
54
- const t = e[r];
55
- if (t)
56
- switch (typeof t) {
54
+ const o = e[r];
55
+ if (o)
56
+ switch (typeof o) {
57
57
  case "string":
58
58
  console.log(
59
59
  "%c%s",
60
60
  "color: #fafa05; padding: 1px; margin-right: 5px; font-size: 10px",
61
61
  `[ ${r} ]`,
62
- t
62
+ o
63
63
  );
64
64
  break;
65
65
  case "object":
66
66
  switch (r) {
67
67
  case "mutation":
68
- console.groupCollapsed("[mutation]"), console.dir(t), console.groupEnd();
68
+ console.groupCollapsed("[mutation]"), console.dir(o), console.groupEnd();
69
69
  break;
70
70
  case "options":
71
- l(r, t?.storeOptions ?? t);
71
+ f(r, o?.storeOptions ?? o);
72
72
  break;
73
73
  case "payload":
74
- p(t);
74
+ h(o);
75
75
  break;
76
76
  case "store":
77
- l(r, {
78
- $state: t.$state,
79
- ...Object.keys(t).reduce((n, o) => (o.startsWith("$") && !["$id", "$state"].includes(o) || o.startsWith("_") || (n[o] = t[o]), n), {})
77
+ f(r, {
78
+ $state: o.$state,
79
+ ...Object.keys(o).reduce((i, t) => (t.startsWith("$") && !["$id", "$state"].includes(t) || t.startsWith("_") || (i[t] = o[t]), i), {})
80
80
  });
81
81
  break;
82
82
  default:
83
- l(r, t);
83
+ f(r, o);
84
84
  }
85
85
  break;
86
86
  case "function":
87
- console.dir(t);
87
+ console.dir(o);
88
88
  break;
89
89
  default:
90
- console.info(t);
90
+ console.info(o);
91
91
  }
92
92
  });
93
93
  }
94
- function x(e, r) {
94
+ function T(e, r) {
95
95
  if (!e)
96
96
  throw new Error("Style instructions are required");
97
97
  console.log(
@@ -101,62 +101,62 @@ function x(e, r) {
101
101
  ...r
102
102
  );
103
103
  }
104
- function E(e, r, t) {
104
+ function L(e, r, o) {
105
105
  if (!e)
106
106
  throw new Error("Style instructions are required");
107
- const n = r.shift(), o = r[0];
108
- if (!o?.payload || Object.keys(o.payload).length === 0) {
107
+ const i = r.shift(), t = r[0];
108
+ if (!t?.payload || Object.keys(t.payload).length === 0) {
109
109
  console.log(
110
110
  "%c%s",
111
111
  e,
112
- `${o?.label ?? o?.namespace}`,
113
- o?.source
112
+ `${t?.label ?? t?.namespace}`,
113
+ t?.source
114
114
  );
115
115
  return;
116
116
  }
117
117
  console.groupCollapsed(
118
118
  "%c%s",
119
119
  e,
120
- `${n}
120
+ `${i}
121
121
  `,
122
- o?.source
123
- ), r.forEach((s) => {
124
- switch (typeof s) {
122
+ t?.source
123
+ ), r.forEach((n) => {
124
+ switch (typeof n) {
125
125
  case "string":
126
- console.info(s);
126
+ console.info(n);
127
127
  break;
128
128
  case "object":
129
- Array.isArray(s) ? console.table(s) : p(s);
129
+ Array.isArray(n) ? console.table(n) : h(n);
130
130
  break;
131
131
  case "function":
132
- console.dir(s);
132
+ console.dir(n);
133
133
  break;
134
134
  default:
135
- console.info(s);
135
+ console.info(n);
136
136
  }
137
137
  }), console.groupEnd();
138
138
  }
139
- class $ {
139
+ class w {
140
140
  constructor() {
141
- c(this, "_bgColor", "transparent");
142
- c(this, "_color", "#f2f286");
143
- c(this, "_icon", "🍍⚡");
144
- c(this, "_errorBgColor", "#d24545");
145
- c(this, "_errorColor", "white");
146
- c(this, "_errorIcon", "🍍⚠️");
147
- c(this, "_pluginName");
148
- c(this, "_styles", {
141
+ a(this, "_bgColor", "transparent");
142
+ a(this, "_color", "#f2f286");
143
+ a(this, "_icon", "🍍⚡");
144
+ a(this, "_errorBgColor", "#d24545");
145
+ a(this, "_errorColor", "white");
146
+ a(this, "_errorIcon", "🍍⚠️");
147
+ a(this, "_pluginName");
148
+ a(this, "_styles", {
149
149
  error: { bgColor: this._errorBgColor, color: this._errorColor, icon: this._errorIcon },
150
150
  info: { bgColor: this._bgColor, color: this._color, icon: this._icon }
151
151
  });
152
152
  }
153
- formatMessage(r, t) {
154
- return this._pluginName ? ` [${t} ${this._pluginName}]
153
+ formatMessage(r, o) {
154
+ return this._pluginName ? ` [${o} ${this._pluginName}]
155
155
  ${r}
156
156
  ` : r;
157
157
  }
158
158
  generateStyle(r) {
159
- return m(r.bgColor, r.color);
159
+ return C(r.bgColor, r.color);
160
160
  }
161
161
  getStyleDefinition(r) {
162
162
  return this._styles[r ?? "info"];
@@ -173,45 +173,45 @@ class $ {
173
173
  r
174
174
  );
175
175
  }
176
- rebuildArgs(r, t) {
176
+ rebuildArgs(r, o) {
177
177
  if (typeof r == "string")
178
178
  return [r];
179
179
  if (Array.isArray(r))
180
180
  return [r.shift(), ...r ?? []];
181
181
  }
182
- useLog(r, t) {
183
- x(
182
+ useLog(r, o) {
183
+ T(
184
184
  this.generateStyle(r),
185
- this.rebuildArgs(t, r.icon)
185
+ this.rebuildArgs(o, r.icon)
186
186
  );
187
187
  }
188
188
  }
189
- class A extends $ {
190
- constructor(t) {
189
+ class b extends w {
190
+ constructor(o) {
191
191
  super();
192
- c(this, "_pluginName", _);
193
- t && (this._pluginName = t);
192
+ a(this, "_pluginName", A);
193
+ o && (this._pluginName = o);
194
194
  }
195
- logGroup(t) {
196
- const o = t.shift()?.[1];
195
+ logGroup(o) {
196
+ const t = o.shift()?.[1];
197
197
  console.groupCollapsed(
198
198
  "%c%s",
199
199
  "color: #68ca59; padding: 1px; margin-right: 5px; font-size: 12px",
200
- `[ 🍍 ${o?.label ?? o?.namespace} ] - ${o?.scope}`
201
- ), o?.payload && p(o.payload), console.groupCollapsed(
200
+ `[ 🍍 ${t?.label ?? t?.namespace} ] - ${t?.scope}`
201
+ ), t?.payload && h(t.payload), console.groupCollapsed(
202
202
  "%c%s",
203
203
  "color: #f1f6b7; padding: 1px; margin-right: 5px; font-size: 11px",
204
204
  "[ TRACES ]"
205
- ), t.forEach((s) => this.log(...s)), console.groupEnd(), console.groupEnd();
205
+ ), o.forEach((n) => this.log(...n)), console.groupEnd(), console.groupEnd();
206
206
  }
207
- useLog(t, n) {
208
- E(
209
- this.generateStyle(t),
210
- this.rebuildArgs(n, t.icon)
207
+ useLog(o, i) {
208
+ L(
209
+ this.generateStyle(o),
210
+ this.rebuildArgs(i, o.icon)
211
211
  );
212
212
  }
213
213
  }
214
- function C(e) {
214
+ function j(e) {
215
215
  if (typeof e != "function")
216
216
  return e;
217
217
  try {
@@ -220,12 +220,12 @@ function C(e) {
220
220
  return { __tracePayloadError: r };
221
221
  }
222
222
  }
223
- class T {
224
- constructor(r, t, n = {}) {
225
- c(this, "_listeners", []);
226
- c(this, "_scope");
227
- c(this, "_source");
228
- this._scope = n.scope, this._source = r, this._listeners = t;
223
+ class y {
224
+ constructor(r, o, i = {}) {
225
+ a(this, "_listeners", []);
226
+ a(this, "_scope");
227
+ a(this, "_source");
228
+ this._scope = i.scope, this._source = r, this._listeners = o;
229
229
  }
230
230
  get scope() {
231
231
  return this._scope;
@@ -236,126 +236,196 @@ class T {
236
236
  get source() {
237
237
  return this._source;
238
238
  }
239
- debug(r, t, n, o) {
240
- this.emit("debug", r, t, n, o);
239
+ debug(r, o, i, t) {
240
+ this.emit("debug", r, o, i, t);
241
241
  }
242
- error(r, t, n, o, s) {
243
- this.emit("error", r, t, o, s, n);
242
+ error(r, o, i, t, n) {
243
+ this.emit("error", r, o, t, n, i);
244
244
  }
245
- emit(r, t, n, o, s, i) {
245
+ emit(r, o, i, t, n, s) {
246
246
  if (this._listeners.length === 0) {
247
- r === "error" && console.error("Unhandled error trace event:", i);
247
+ r === "error" && console.error("Unhandled error trace event:", s);
248
248
  return;
249
249
  }
250
- const a = {
251
- label: t,
250
+ const c = {
251
+ label: o,
252
252
  level: r,
253
- namespace: n,
254
- scope: s ?? this._scope,
253
+ namespace: i,
254
+ scope: n ?? this._scope,
255
255
  source: this._source
256
- }, h = this._listeners.filter((f) => {
256
+ }, l = this._listeners.filter((p) => {
257
257
  try {
258
- return f.filter(a);
259
- } catch (u) {
260
- return console.error("Error in trace listener filter:", u), !1;
258
+ return p.filter(c);
259
+ } catch (g) {
260
+ return console.error("Error in trace listener filter:", g), !1;
261
261
  }
262
262
  });
263
- if (h.length === 0) {
264
- r === "error" && console.error("Unhandled error trace event:", i);
263
+ if (l.length === 0) {
264
+ r === "error" && console.error("Unhandled error trace event:", s);
265
265
  return;
266
266
  }
267
- const d = {
268
- ...a,
269
- ...i !== void 0 && { error: i },
270
- ...o !== void 0 && { payload: C(o) },
267
+ const u = {
268
+ ...c,
269
+ ...s !== void 0 && { error: s },
270
+ ...t !== void 0 && { payload: j(t) },
271
271
  timestamp: Date.now()
272
272
  };
273
- for (const f of h)
273
+ for (const p of l)
274
274
  try {
275
- f.handler(d);
276
- } catch (u) {
277
- console.error("Error in trace listener:", u);
275
+ p.handler(u);
276
+ } catch (g) {
277
+ console.error("Error in trace listener:", g);
278
278
  }
279
279
  }
280
280
  }
281
- function j(e) {
282
- const r = Object.keys(e).reduce((t, n) => (n !== "level" && n !== "timestamp" && (t[n] = e[n]), t), {});
283
- return [w(e), r];
281
+ function _(e) {
282
+ const r = Object.keys(e).reduce((o, i) => (i !== "level" && i !== "timestamp" && (o[i] = e[i]), o), {});
283
+ return [G(e), r];
284
284
  }
285
- function w(e) {
285
+ function G(e) {
286
286
  return e.scope ? `${e.label} [${e.scope}]` : `${e.label}`;
287
287
  }
288
- function k(e, r) {
289
- const t = r.level === "error" ? "error" : "log";
290
- e[t](...j(r));
288
+ function m(e, r) {
289
+ const o = r.level === "error" ? "error" : "log";
290
+ e[o](..._(r));
291
291
  }
292
- function z(e) {
293
- return e || (e = new A()), {
292
+ function O(e) {
293
+ return e || (e = new b()), {
294
294
  handler(r) {
295
- k(e, r);
295
+ m(e, r);
296
296
  }
297
297
  };
298
298
  }
299
- function g(e, r) {
300
- return (t) => e[r](({ comparator: n = "equals", target: o, value: s }) => {
301
- const i = t[o];
302
- if (typeof i != "string") return !1;
303
- let a = !1;
304
- switch (n) {
299
+ function k(e = "scope") {
300
+ const r = new b(), o = /* @__PURE__ */ new Map();
301
+ function i(n) {
302
+ o.set(n, []);
303
+ }
304
+ function t(n) {
305
+ const s = o.get(n);
306
+ if (!s) {
307
+ r.error(`No group found for key "${n}"`);
308
+ return;
309
+ }
310
+ s.length && r.logGroup(s), o.delete(n);
311
+ }
312
+ return {
313
+ createGroup: i,
314
+ logGroup: t,
315
+ handler(n) {
316
+ const s = n[e];
317
+ if (!o.has(s)) {
318
+ m(r, n);
319
+ return;
320
+ }
321
+ o.get(s)?.push(_(n));
322
+ }
323
+ };
324
+ }
325
+ function d(e, r) {
326
+ return (o) => e[r](({ comparator: i = "equals", target: t, value: n }) => {
327
+ const s = o[t];
328
+ if (typeof s != "string") return !1;
329
+ let c = !1;
330
+ switch (i) {
305
331
  case "equals":
306
- a = i === s;
332
+ c = s === n;
307
333
  break;
308
334
  case "contains":
309
- a = i.includes(s);
335
+ c = s.includes(n);
310
336
  break;
311
337
  case "startsWith":
312
- a = i.startsWith(s);
338
+ c = s.startsWith(n);
313
339
  break;
314
340
  case "endsWith":
315
- a = i.endsWith(s);
341
+ c = s.endsWith(n);
316
342
  break;
317
343
  default:
318
- a = !1;
344
+ c = !1;
319
345
  break;
320
346
  }
321
- return a;
347
+ return c;
322
348
  });
323
349
  }
324
- function L(e, r = "every") {
350
+ function z(e, r = "every", o = "scope") {
351
+ return {
352
+ groupBy: o,
353
+ ...k(o),
354
+ ...x(e, r)
355
+ };
356
+ }
357
+ function x(e, r = "every") {
325
358
  return Array.isArray(e) && (e = {
326
- filter: g(e, r)
327
- }), e.filter && Array.isArray(e.filter) && (e.filter = g(e.filter, r)), (!e.filter || typeof e.filter != "function") && (e = { ...e, filter: () => !0 }), e;
359
+ filter: d(e, r)
360
+ }), e.filter && Array.isArray(e.filter) && (e.filter = d(e.filter, r)), (!e.filter || typeof e.filter != "function") && (e = { ...e, filter: () => !0 }), e;
328
361
  }
329
- function O(e, r = "every") {
330
- return e = L(e, r), e?.handler || (e = { ...e, ...z() }), e;
362
+ function S(e, r = "every") {
363
+ return e = x(e, r), e?.handler || (e = { ...e, ...O() }), e;
331
364
  }
332
365
  function W() {
333
366
  let e = [];
334
- function r(o, s = "every") {
335
- return (!o || !o?.handler) && (o = O(o, s)), (!("filter" in o) || typeof o.filter != "function") && (o = { ...o, filter: () => !0 }), e.push(o), () => {
336
- const i = e.indexOf(o);
337
- i !== -1 && e.splice(i, 1);
367
+ function r(t, n = "every") {
368
+ return (!t || !t?.handler) && (t = S(t, n)), (!("filter" in t) || typeof t.filter != "function") && (t = { ...t, filter: () => !0 }), e.push(t), () => {
369
+ const s = e.indexOf(t);
370
+ s !== -1 && e.splice(s, 1);
338
371
  };
339
372
  }
340
- function t() {
373
+ function o() {
341
374
  e = [];
342
375
  }
343
- function n() {
376
+ function i() {
344
377
  return e.length > 0;
345
378
  }
346
379
  return {
347
380
  addTraceListener: r,
348
- clearTraceListeners: t,
349
- createTracer: (o, s = {}) => new T(o, e, s),
350
- hasTraceListeners: n
381
+ clearTraceListeners: o,
382
+ createTracer: (t, n = {}) => new y(t, e, n),
383
+ hasTraceListeners: i
384
+ };
385
+ }
386
+ function q() {
387
+ let e = [];
388
+ function r(s, { filterMode: c = "every", groupBy: l = "scope" } = {}) {
389
+ const u = z(s, c ?? "every", l ?? "scope");
390
+ return e.push(u), () => {
391
+ const p = e.indexOf(u);
392
+ p !== -1 && e.splice(p, 1);
393
+ };
394
+ }
395
+ function o() {
396
+ e = [];
397
+ }
398
+ function i(s) {
399
+ return e.filter((c) => c.filter(s));
400
+ }
401
+ function t() {
402
+ return e.length > 0;
403
+ }
404
+ function n(s, c) {
405
+ e.length && i(c).forEach((l) => {
406
+ const u = c[l.groupBy];
407
+ typeof u == "string" && l[s](u);
408
+ });
409
+ }
410
+ return {
411
+ addListener: r,
412
+ clearTraceListeners: o,
413
+ tracerHandler: {
414
+ closeGroup: (s) => n("logGroup", s),
415
+ createTracer: (s, c = {}) => new y(s, e, c),
416
+ startGroup: (s) => n("createGroup", s)
417
+ },
418
+ hasTraceListeners: t
351
419
  };
352
420
  }
353
421
  export {
354
- $ as CustomConsole,
355
- P as PluginSubscriber,
356
- F as Store,
357
- T as Tracer,
358
- z as createConsoleTraceListener,
422
+ w as CustomConsole,
423
+ M as PluginSubscriber,
424
+ R as Store,
425
+ y as Tracer,
426
+ k as createConsoleGroupTraceListener,
427
+ O as createConsoleTraceListener,
428
+ q as createTraceGroupsRegistry,
359
429
  W as createTracerRegistry,
360
430
  B as isEmpty
361
431
  };
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../src/system/log.ts","../src/system/Tracer.ts","../src/factories/console-trace-listener.ts","../src/factories/trace-listener.ts","../src/factories/trace-registry.ts"],"sourcesContent":["import { pluginName } from '../utils/constantes'\nimport type { Console, LogType, StyleDefinition, StyleDefinitions } from '../types/log'\nimport type { ConsoleTraceEvent, ConsoleTraceEventArgs } from '../types/trace'\nimport { Store } from 'pinia'\n\n\nconst style = (bgColor: string, color: string = 'white') =>\n `background-color: ${bgColor}; color: ${color}; padding: 1px; margin-right: 5px; font-size: 12px`\n\nexport function printObject(label: string, payload: object) {\n const isArray = Array.isArray(payload)\n const isEmpty = isArray ? payload.length === 0 : Object.keys(payload).length === 0\n if (isEmpty) {\n console.log(\n '%c%s',\n 'color: #f86f63; padding: 1px; margin-right: 5px; font-size: 10px',\n `[ ${label} ] Empty`\n )\n return\n }\n\n console.groupCollapsed(\n '%c%s',\n 'color: #f7f7b0; padding: 1px; margin-right: 5px; font-size: 11px',\n `[ ${label} ]`)\n\n if (Array.isArray(payload)) {\n if (typeof payload[0] === 'object') {\n payload.forEach((item: any) => {\n if (item._name) {\n printObject(item._name, item)\n } else if (item._id) {\n printObject(item._id, item)\n } else {\n console.dir(item)\n }\n })\n } else {\n payload.forEach((item: any, index: number) => {\n console.log(\n '%c%s',\n 'color: #cae38f; padding: 1px; margin-right: 5px; font-size: 10px',\n `[ ${index} ]`, item\n )\n })\n }\n } else {\n let emptyKeys: string[] = []\n Object.keys(payload).forEach(key => {\n const value = (payload as Record<string, unknown>)[key]\n if (typeof value === 'object') {\n if (Array.isArray(value)) {\n if (typeof value[0] === 'object') {\n printObject(key, value)\n } else {\n console.groupCollapsed(key)\n console.log(value)\n console.groupEnd()\n }\n } else {\n printObject(key, Object.assign({}, value))\n }\n } else {\n if (!value) {\n emptyKeys.push(key)\n } else {\n console.log(\n '%c%s',\n 'color: #b0fa05; padding: 1px; margin-right: 5px; font-size: 10px',\n `[ ${key} ]`, value\n )\n }\n }\n })\n if (emptyKeys.length) {\n console.log(\n '%c%s',\n 'color: #f86f63; font-size: 9px',\n `[ Empty properties ]`, emptyKeys\n )\n }\n }\n console.groupEnd()\n}\n\nfunction printTracePayload(tracePayload: Record<string, unknown>) {\n Object.keys(tracePayload).forEach((key: string) => {\n if (['label', 'namespace', 'scope', 'source'].includes(key)) {\n return\n }\n const arg = tracePayload[key]\n if (!arg) {\n return\n }\n\n switch (typeof arg) {\n case 'string':\n console.log(\n '%c%s',\n 'color: #fafa05; padding: 1px; margin-right: 5px; font-size: 10px',\n `[ ${key} ]`, arg\n )\n break;\n case 'object':\n switch (key) {\n case 'mutation':\n console.groupCollapsed('[mutation]')\n console.dir(arg)\n console.groupEnd()\n break;\n case 'options':\n printObject(key, (arg as { storeOptions?: unknown })?.storeOptions ?? arg)\n break;\n case 'payload':\n printTracePayload(arg as Record<string, unknown>)\n break;\n case 'store':\n printObject(key, {\n $state: (arg as Store)['$state'],\n ...Object.keys(arg).reduce((acc, curr) => {\n if ((curr.startsWith('$') && !['$id', '$state'].includes(curr)) || curr.startsWith('_')) {\n return acc\n }\n\n acc[curr] = (arg as Record<string, unknown>)[curr]\n return acc\n }, {} as Record<string, unknown>)\n })\n break;\n default:\n printObject(key, arg)\n }\n break;\n case 'function':\n console.dir(arg)\n break;\n default:\n console.info(arg)\n }\n })\n}\nexport function log(logStyle: string, args: any) {\n if (!logStyle) {\n throw new Error('Style instructions are required')\n }\n\n console.log(\n '%c%s',\n logStyle,\n args.shift(),\n ...args\n )\n}\n\n\nexport function logTrace(logStyle: string, args: any, pluginName: string) {\n if (!logStyle) {\n throw new Error('Style instructions are required')\n }\n\n const label = args.shift()\n const event = args[0]\n\n if (!event?.payload || Object.keys(event.payload).length === 0) {\n console.log(\n '%c%s',\n logStyle,\n `${event?.label ?? event?.namespace}`,\n event?.source\n )\n return\n }\n\n console.groupCollapsed(\n '%c%s',\n logStyle,\n `${label}\n`, event?.source\n )\n\n args.forEach((arg: any) => {\n switch (typeof arg) {\n case 'string':\n console.info(arg)\n break;\n case 'object':\n if (Array.isArray(arg)) {\n console.table(arg)\n } else {\n printTracePayload(arg)\n }\n break;\n case 'function':\n console.dir(arg)\n break;\n default:\n console.info(arg)\n }\n })\n\n /**\n console.groupCollapsed(\n '%c%s',\n 'color: #fafa05; padding: 1px; margin-right: 5px; font-size: 10px',\n `[ trace ]`\n )\n console.trace()\n console.groupEnd()\n */\n\n console.groupEnd()\n}\n\nexport abstract class CustomConsole implements Console {\n protected _bgColor: string = 'transparent'\n protected _color: string = '#f2f286'\n protected _icon: string = '🍍⚡'\n protected _errorBgColor: string = '#d24545'\n protected _errorColor: string = 'white'\n protected _errorIcon: string = '🍍⚠️'\n protected _pluginName?: string\n protected _styles: StyleDefinitions = {\n error: { bgColor: this._errorBgColor, color: this._errorColor, icon: this._errorIcon },\n info: { bgColor: this._bgColor, color: this._color, icon: this._icon }\n }\n\n protected formatMessage(message: string, icon: string): string {\n return this._pluginName ? ` [${icon} ${this._pluginName}] \n ${message} \n` : message\n }\n\n protected generateStyle(styleDefinition: StyleDefinition): string {\n return style(styleDefinition.bgColor, styleDefinition.color)\n }\n\n protected getStyleDefinition(messageType?: LogType): StyleDefinition {\n return this._styles[messageType ?? 'info']\n }\n\n log(...args: any) {\n this.useLog(\n this.getStyleDefinition(),\n args\n )\n }\n\n error(...args: any) {\n const logType = 'error'\n this.useLog(\n this.getStyleDefinition(logType),\n args\n )\n }\n\n protected rebuildArgs(args: string | any[], icon: string) {\n if (typeof args === 'string') {\n return [args]\n }\n\n if (Array.isArray(args)) {\n return [args.shift(), ...(args ?? [])]\n }\n }\n\n protected useLog(styleDefinition: StyleDefinition, args: any) {\n log(\n this.generateStyle(styleDefinition),\n this.rebuildArgs(args, styleDefinition.icon)\n )\n }\n}\n\nclass PluginConsoleClass extends CustomConsole {\n protected _pluginName: string = pluginName\n}\n\nexport const PluginConsole = new PluginConsoleClass()\n\nexport class TraceConsole extends CustomConsole {\n protected _pluginName: string = pluginName\n\n constructor(pluginName?: string) {\n super()\n if (pluginName) {\n this._pluginName = pluginName\n }\n }\n\n\n logGroup(groups: ConsoleTraceEvent[]) {\n const firstEntry = groups.shift()\n const context = firstEntry?.[1] as ConsoleTraceEventArgs\n\n console.groupCollapsed(\n '%c%s',\n 'color: #68ca59; padding: 1px; margin-right: 5px; font-size: 12px',\n `[ 🍍 ${context?.label ?? context?.namespace} ] - ${context?.scope}`\n )\n if (context?.payload) {\n printTracePayload(context.payload)\n }\n console.groupCollapsed(\n '%c%s',\n 'color: #f1f6b7; padding: 1px; margin-right: 5px; font-size: 11px',\n `[ TRACES ]`\n )\n groups.forEach(group => this.log(...group))\n console.groupEnd()\n console.groupEnd()\n }\n\n protected useLog(styleDefinition: StyleDefinition, args: any) {\n logTrace(\n this.generateStyle(styleDefinition),\n this.rebuildArgs(args, styleDefinition.icon),\n this._pluginName\n )\n }\n}","import type { AnyObject } from '../types'\nimport type {\n TraceEvent,\n TraceEventMetadata,\n TraceLevel,\n TraceListener,\n TracePayload,\n TracerOptions,\n} from '../types/trace'\n\nfunction resolvePayload(payload: TracePayload): AnyObject | undefined {\n if (typeof payload !== 'function') {\n return payload\n }\n\n try {\n return payload()\n } catch (error) {\n return { __tracePayloadError: error }\n }\n}\n\n/**\n * Emits structured trace events.\n *\n * Nothing is allocated when no listener matches:\n * the payload is a factory resolved only once a consumer is known.\n */\nexport default class Tracer {\n private readonly _listeners: TraceListener[] = []\n private _scope?: string\n private readonly _source: string\n\n constructor(source: string, listeners: TraceListener[], options: TracerOptions = {}) {\n this._scope = options.scope\n this._source = source\n this._listeners = listeners\n }\n\n get scope(): string | undefined {\n return this._scope\n }\n\n set scope(scope: string | undefined) {\n this._scope = scope\n }\n\n get source(): string {\n return this._source\n }\n\n debug(label: string, namespace: string, payload?: TracePayload, scope?: string): void {\n this.emit('debug', label, namespace, payload, scope)\n }\n\n /** Relays the error to matching listeners, or reports it when none match. */\n error(label: string, namespace: string, error: unknown, payload?: TracePayload, scope?: string): void {\n this.emit('error', label, namespace, payload, scope, error)\n }\n\n private emit(\n level: TraceLevel,\n label: string,\n namespace: string,\n payload?: TracePayload,\n scope?: string,\n error?: unknown\n ): void {\n if (this._listeners.length === 0) {\n if (level === 'error') {\n console.error('Unhandled error trace event:', error)\n }\n return\n }\n\n const metadata: TraceEventMetadata = {\n label,\n level,\n namespace,\n scope: scope ?? this._scope,\n source: this._source\n }\n\n const matched = this._listeners.filter(listener => {\n try {\n return listener.filter(metadata)\n } catch (error) {\n console.error('Error in trace listener filter:', error)\n return false\n }\n })\n\n if (matched.length === 0) {\n if (level === 'error') {\n console.error('Unhandled error trace event:', error)\n }\n return\n }\n\n const event: TraceEvent = {\n ...metadata,\n ...(error !== undefined && { error }),\n ...(payload !== undefined && { payload: resolvePayload(payload) }),\n timestamp: Date.now()\n }\n\n for (const listener of matched) {\n try {\n listener.handler(event)\n } catch (error) {\n // a faulty listener must never break the traced code\n console.error('Error in trace listener:', error)\n }\n }\n }\n}\n","import { PluginConsole, TraceConsole } from '../system/log'\n\nimport type { Console } from '../types/log'\nimport type {\n ConsoleTraceEvent, ConsoleTraceEventArgs, TraceEvent, TraceListenerGroupBy, ConsoleTraceGroupListener, TraceListener\n} from '../types/trace'\n\n\n/**\n * Builds the console arguments from a trace event.\n * @param event The trace event to build console arguments from.\n * @returns An array containing the formatted trace label and the sanitized event data.\n */\nfunction buildConsoleArgsFromEvent(event: TraceEvent): ConsoleTraceEvent {\n const sanitizedEvent = Object.keys(event).reduce((acc, curr) => {\n if (curr !== 'level' && curr !== 'timestamp') {\n acc[curr] = event[curr as keyof ConsoleTraceEventArgs]\n }\n return acc\n }, {} as Record<string, unknown>)\n\n return [formatTraceLabel(event), sanitizedEvent as ConsoleTraceEventArgs]\n\n /**\n if (event.error !== undefined) {\n args.push(event.error)\n }\n\n if (event.payload !== undefined) {\n if (Array.isArray(event.payload)) {\n args.push(...event.payload)\n } else {\n args.push(event.payload)\n }\n }\n */\n}\n\nfunction formatTraceLabel(event: TraceEvent): string {\n return event.scope\n ? `${event.label} [${event.scope}]`\n : `${event.label}`\n}\n\nfunction log(target: Console, event: TraceEvent): void {\n const consoleMethod = event.level === 'error' ? 'error' : 'log'\n target[consoleMethod](...buildConsoleArgsFromEvent(event))\n}\n\n/**\n * Creates an opt-in trace listener that reproduces the former console output.\n */\nexport function createConsoleTraceListener(target?: Console): Omit<TraceListener, 'filter'> {\n if (!target) {\n target = new TraceConsole()\n }\n\n return {\n handler(event): void {\n log(target, event)\n }\n }\n}\n\n\nexport function createConsoleGroupTraceListener(groupBy: TraceListenerGroupBy = 'scope'): ConsoleTraceGroupListener {\n const target = new TraceConsole()\n const groups = new Map<string, ConsoleTraceEvent[]>()\n\n\n function createGroup(key: string) {\n groups.set(key, [])\n }\n\n function logGroup(key: string): void {\n const group = groups.get(key)\n\n if (!group) {\n target.error(`No group found for key \"${key}\"`)\n return\n }\n\n if (group.length) { target.logGroup(group) }\n\n groups.delete(key)\n }\n\n return {\n createGroup,\n logGroup,\n handler(event): void {\n const groupKey = event[groupBy] as string\n if (!groups.has(groupKey)) {\n log(target, event)\n return\n }\n\n groups.get(groupKey)?.push(buildConsoleArgsFromEvent(event))\n }\n }\n}\n\n\n","import { createConsoleTraceListener, createConsoleGroupTraceListener } from \"./console-trace-listener\"\nimport type {\n ConsoleTraceGroupListener,\n TraceEventMetadata,\n TraceFilterFactoryCriterion,\n TraceFilterFactoryParam,\n TraceGroupListener,\n TraceListener\n} from \"../types/trace\"\n\n\nfunction createFilter(criteria: TraceFilterFactoryCriterion[], mode: 'every' | 'some') {\n return (event: TraceEventMetadata) => {\n return criteria[mode](({ comparator = 'equals', target, value }) => {\n const eventValue = event[target]\n if (typeof eventValue !== 'string') return false\n let result = false\n switch (comparator) {\n case 'equals':\n result = eventValue === value\n break\n case 'contains':\n result = eventValue.includes(value)\n break\n case 'startsWith':\n result = eventValue.startsWith(value)\n break\n case 'endsWith':\n result = eventValue.endsWith(value)\n break\n default:\n result = false\n break\n }\n return result\n })\n }\n}\n\n/**\n * Creates a trace group listener with optional filtering.\n * @param filterDef The filter criteria for the trace events.\n * @param filterMode The mode to apply when evaluating multiple filter criteria: 'every' or 'some'.\n * @param groupBy The key of the trace event metadata to group by.\n * @returns A trace listener configured with group handling and filtering.\n */\nexport function createTraceGroupListener(\n filterDef: TraceFilterFactoryCriterion[],\n filterMode: 'every' | 'some' = 'every',\n groupBy: keyof TraceEventMetadata = 'scope'\n) {\n return {\n groupBy,\n ...createConsoleGroupTraceListener(groupBy),\n ...createTraceFilter(filterDef, filterMode)\n } as TraceGroupListener\n\n}\n\nfunction createTraceFilter(\n listenerDef: TraceFilterFactoryParam | TraceFilterFactoryCriterion[],\n filterMode: 'every' | 'some' = 'every'\n) {\n if (Array.isArray(listenerDef)) {\n listenerDef = {\n filter: createFilter(listenerDef, filterMode)\n }\n }\n\n if (listenerDef.filter && Array.isArray(listenerDef.filter)) {\n listenerDef.filter = createFilter(listenerDef.filter, filterMode)\n }\n\n if (!listenerDef.filter || typeof listenerDef.filter !== 'function') {\n listenerDef = { ...listenerDef, filter: () => true }\n }\n\n return listenerDef\n}\n\n/**\n * Creates a trace listener with optional filtering.\n * @param param The trace listener parameters including handler and optional filter criteria.\n * @param filterMode The mode to apply when evaluating multiple filter criteria: 'every' or 'some'.\n * @returns A trace listener configured with the specified handler and filter.\n */\nexport function createTraceListener(listenerDef: TraceFilterFactoryParam | TraceFilterFactoryCriterion[], filterMode: 'every' | 'some' = 'every'): TraceListener {\n listenerDef = createTraceFilter(listenerDef, filterMode)\n\n if (!listenerDef?.handler) {\n listenerDef = { ...listenerDef, ...createConsoleTraceListener() } as TraceFilterFactoryParam\n }\n\n return listenerDef as TraceListener\n}","import Tracer from '../system/Tracer'\nimport { createTraceGroupListener, createTraceListener } from './trace-listener'\nimport type {\n AddTraceListenerOptions,\n TraceEvent,\n TraceFilterFactoryCriterion,\n TraceFilterFactoryParam,\n TraceGroupListener,\n TraceListener,\n TraceListenerFilterMode,\n TraceListenerRemover,\n TraceRegistry,\n TracerOptions,\n} from '../types/trace'\n\n/**\n * Creates a registry for managing trace listeners and creating tracers.\n * @returns An object containing methods to add and clear trace listeners, and to create tracers.\n */\nexport function createTracerRegistry(): TraceRegistry {\n let listeners: TraceListener[] = []\n\n /**\n * Registers a trace listener and returns its remover.\n * Listeners are evaluated in registration order.\n * @param listener The trace listener to register.\n * @param filterMode The mode to use when creating a trace listener from a filter factory parameter. Defaults to 'every'.\n * @returns A function that removes the registered listener when called.\n */\n function addTraceListener(listener: TraceListener | TraceFilterFactoryParam, filterMode: TraceListenerFilterMode = 'every'): TraceListenerRemover {\n if (!listener || !listener?.handler) {\n listener = createTraceListener(listener, filterMode)\n }\n\n if (!('filter' in listener) || typeof listener.filter !== 'function') {\n listener = { ...listener, filter: () => true }\n }\n\n listeners.push(listener as TraceListener)\n\n return () => {\n const index = listeners.indexOf(listener as TraceListener)\n\n if (index !== -1) {\n listeners.splice(index, 1)\n }\n }\n }\n\n /**\n * Clears all registered trace listeners.\n */\n function clearTraceListeners(): void {\n listeners = []\n }\n\n /**\n * Checks if there are any registered trace listeners.\n * @returns True if there are registered trace listeners, otherwise false.\n */\n function hasTraceListeners(): boolean {\n return listeners.length > 0\n }\n\n return {\n addTraceListener,\n clearTraceListeners,\n createTracer: (source: string, options: TracerOptions = {}) => new Tracer(source, listeners, options),\n hasTraceListeners\n }\n}\n\nexport function createTraceGroupsRegistry() {\n let listeners: TraceGroupListener[] = []\n\n /**\n * Registers a trace listener and returns its remover.\n * Listeners are evaluated in registration order.\n * @param criteria The criteria used to create the trace group listener.\n * @param filterMode The mode to use when creating the trace group listener from the criteria. Defaults to 'every'.\n * @param groupBy The property to group traces by. Defaults to 'scope'.\n * @returns A function that removes the registered trace group listener when called.\n */\n function addListener(\n criteria: TraceFilterFactoryCriterion[],\n { filterMode = 'every', groupBy = 'scope' }: AddTraceListenerOptions = {}\n ): TraceListenerRemover {\n const listenerGroup = createTraceGroupListener(criteria, filterMode ?? 'every', groupBy ?? 'scope')\n listeners.push(listenerGroup)\n\n return () => {\n const index = listeners.indexOf(listenerGroup)\n\n if (index !== -1) {\n listeners.splice(index, 1)\n }\n }\n }\n\n /**\n * Clears all registered trace listeners.\n */\n function clearTraceListeners(): void {\n listeners = []\n }\n\n function getMatchedListener(payload: TraceEvent) {\n return listeners.filter(listener => listener.filter(payload))\n }\n\n /**\n * Checks if there are any registered trace listeners.\n * @returns True if there are registered trace listeners, otherwise false.\n */\n function hasTraceListeners(): boolean {\n return listeners.length > 0\n }\n\n function listenerGroupAction(actionName: 'createGroup' | 'logGroup', payload: TraceEvent) {\n if (!listeners.length) return\n\n getMatchedListener(payload).forEach(listener => {\n const groupLabel = payload[listener.groupBy]\n if (typeof groupLabel === 'string') { listener[actionName](groupLabel) }\n })\n }\n\n\n return {\n addListener,\n clearTraceListeners,\n tracerHandler: {\n closeGroup: (payload: TraceEvent) => listenerGroupAction('logGroup', payload),\n createTracer: (source: string, options: TracerOptions = {}) => new Tracer(source, listeners, options),\n startGroup: (payload: TraceEvent) => listenerGroupAction('createGroup', payload)\n },\n hasTraceListeners\n }\n}"],"names":["style","bgColor","color","printObject","label","payload","item","index","emptyKeys","key","value","printTracePayload","tracePayload","arg","acc","curr","log","logStyle","args","logTrace","pluginName","event","CustomConsole","__publicField","message","icon","styleDefinition","messageType","TraceConsole","groups","context","group","resolvePayload","error","Tracer","source","listeners","options","scope","namespace","level","metadata","matched","listener","buildConsoleArgsFromEvent","sanitizedEvent","formatTraceLabel","target","consoleMethod","createConsoleTraceListener","createFilter","criteria","mode","comparator","eventValue","result","createTraceFilter","listenerDef","filterMode","createTraceListener","createTracerRegistry","addTraceListener","clearTraceListeners","hasTraceListeners"],"mappings":"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"}
1
+ {"version":3,"file":"helpers.js","sources":["../src/system/log.ts","../src/system/Tracer.ts","../src/factories/console-trace-listener.ts","../src/factories/trace-listener.ts","../src/factories/trace-registry.ts"],"sourcesContent":["import { pluginName } from '../utils/constantes'\nimport type { Console, LogType, StyleDefinition, StyleDefinitions } from '../types/log'\nimport type { ConsoleTraceEvent, ConsoleTraceEventArgs } from '../types/trace'\nimport { Store } from 'pinia'\n\n\nconst style = (bgColor: string, color: string = 'white') =>\n `background-color: ${bgColor}; color: ${color}; padding: 1px; margin-right: 5px; font-size: 12px`\n\nexport function printObject(label: string, payload: object) {\n const isArray = Array.isArray(payload)\n const isEmpty = isArray ? payload.length === 0 : Object.keys(payload).length === 0\n if (isEmpty) {\n console.log(\n '%c%s',\n 'color: #f86f63; padding: 1px; margin-right: 5px; font-size: 10px',\n `[ ${label} ] Empty`\n )\n return\n }\n\n console.groupCollapsed(\n '%c%s',\n 'color: #f7f7b0; padding: 1px; margin-right: 5px; font-size: 11px',\n `[ ${label} ]`)\n\n if (Array.isArray(payload)) {\n if (typeof payload[0] === 'object') {\n payload.forEach((item: any) => {\n if (item._name) {\n printObject(item._name, item)\n } else if (item._id) {\n printObject(item._id, item)\n } else {\n console.dir(item)\n }\n })\n } else {\n payload.forEach((item: any, index: number) => {\n console.log(\n '%c%s',\n 'color: #cae38f; padding: 1px; margin-right: 5px; font-size: 10px',\n `[ ${index} ]`, item\n )\n })\n }\n } else {\n let emptyKeys: string[] = []\n Object.keys(payload).forEach(key => {\n const value = (payload as Record<string, unknown>)[key]\n if (typeof value === 'object') {\n if (Array.isArray(value)) {\n if (typeof value[0] === 'object') {\n printObject(key, value)\n } else {\n console.groupCollapsed(key)\n console.log(value)\n console.groupEnd()\n }\n } else {\n printObject(key, Object.assign({}, value))\n }\n } else {\n if (!value) {\n emptyKeys.push(key)\n } else {\n console.log(\n '%c%s',\n 'color: #b0fa05; padding: 1px; margin-right: 5px; font-size: 10px',\n `[ ${key} ]`, value\n )\n }\n }\n })\n if (emptyKeys.length) {\n console.log(\n '%c%s',\n 'color: #f86f63; font-size: 9px',\n `[ Empty properties ]`, emptyKeys\n )\n }\n }\n console.groupEnd()\n}\n\nfunction printTracePayload(tracePayload: Record<string, unknown>) {\n Object.keys(tracePayload).forEach((key: string) => {\n if (['label', 'namespace', 'scope', 'source'].includes(key)) {\n return\n }\n const arg = tracePayload[key]\n if (!arg) {\n return\n }\n\n switch (typeof arg) {\n case 'string':\n console.log(\n '%c%s',\n 'color: #fafa05; padding: 1px; margin-right: 5px; font-size: 10px',\n `[ ${key} ]`, arg\n )\n break;\n case 'object':\n switch (key) {\n case 'mutation':\n console.groupCollapsed('[mutation]')\n console.dir(arg)\n console.groupEnd()\n break;\n case 'options':\n printObject(key, (arg as { storeOptions?: unknown })?.storeOptions ?? arg)\n break;\n case 'payload':\n printTracePayload(arg as Record<string, unknown>)\n break;\n case 'store':\n printObject(key, {\n $state: (arg as Store)['$state'],\n ...Object.keys(arg).reduce((acc, curr) => {\n if ((curr.startsWith('$') && !['$id', '$state'].includes(curr)) || curr.startsWith('_')) {\n return acc\n }\n\n acc[curr] = (arg as Record<string, unknown>)[curr]\n return acc\n }, {} as Record<string, unknown>)\n })\n break;\n default:\n printObject(key, arg)\n }\n break;\n case 'function':\n console.dir(arg)\n break;\n default:\n console.info(arg)\n }\n })\n}\nexport function log(logStyle: string, args: any) {\n if (!logStyle) {\n throw new Error('Style instructions are required')\n }\n\n console.log(\n '%c%s',\n logStyle,\n args.shift(),\n ...args\n )\n}\n\n\nexport function logTrace(logStyle: string, args: any, pluginName: string) {\n if (!logStyle) {\n throw new Error('Style instructions are required')\n }\n\n const label = args.shift()\n const event = args[0]\n\n if (!event?.payload || Object.keys(event.payload).length === 0) {\n console.log(\n '%c%s',\n logStyle,\n `${event?.label ?? event?.namespace}`,\n event?.source\n )\n return\n }\n\n console.groupCollapsed(\n '%c%s',\n logStyle,\n `${label}\n`, event?.source\n )\n\n args.forEach((arg: any) => {\n switch (typeof arg) {\n case 'string':\n console.info(arg)\n break;\n case 'object':\n if (Array.isArray(arg)) {\n console.table(arg)\n } else {\n printTracePayload(arg)\n }\n break;\n case 'function':\n console.dir(arg)\n break;\n default:\n console.info(arg)\n }\n })\n\n /**\n console.groupCollapsed(\n '%c%s',\n 'color: #fafa05; padding: 1px; margin-right: 5px; font-size: 10px',\n `[ trace ]`\n )\n console.trace()\n console.groupEnd()\n */\n\n console.groupEnd()\n}\n\nexport abstract class CustomConsole implements Console {\n protected _bgColor: string = 'transparent'\n protected _color: string = '#f2f286'\n protected _icon: string = '🍍⚡'\n protected _errorBgColor: string = '#d24545'\n protected _errorColor: string = 'white'\n protected _errorIcon: string = '🍍⚠️'\n protected _pluginName?: string\n protected _styles: StyleDefinitions = {\n error: { bgColor: this._errorBgColor, color: this._errorColor, icon: this._errorIcon },\n info: { bgColor: this._bgColor, color: this._color, icon: this._icon }\n }\n\n protected formatMessage(message: string, icon: string): string {\n return this._pluginName ? ` [${icon} ${this._pluginName}] \n ${message} \n` : message\n }\n\n protected generateStyle(styleDefinition: StyleDefinition): string {\n return style(styleDefinition.bgColor, styleDefinition.color)\n }\n\n protected getStyleDefinition(messageType?: LogType): StyleDefinition {\n return this._styles[messageType ?? 'info']\n }\n\n log(...args: any) {\n this.useLog(\n this.getStyleDefinition(),\n args\n )\n }\n\n error(...args: any) {\n const logType = 'error'\n this.useLog(\n this.getStyleDefinition(logType),\n args\n )\n }\n\n protected rebuildArgs(args: string | any[], icon: string) {\n if (typeof args === 'string') {\n return [args]\n }\n\n if (Array.isArray(args)) {\n return [args.shift(), ...(args ?? [])]\n }\n }\n\n protected useLog(styleDefinition: StyleDefinition, args: any) {\n log(\n this.generateStyle(styleDefinition),\n this.rebuildArgs(args, styleDefinition.icon)\n )\n }\n}\n\nclass PluginConsoleClass extends CustomConsole {\n protected _pluginName: string = pluginName\n}\n\nexport const PluginConsole = new PluginConsoleClass()\n\nexport class TraceConsole extends CustomConsole {\n protected _pluginName: string = pluginName\n\n constructor(pluginName?: string) {\n super()\n if (pluginName) {\n this._pluginName = pluginName\n }\n }\n\n\n logGroup(groups: ConsoleTraceEvent[]) {\n const firstEntry = groups.shift()\n const context = firstEntry?.[1] as ConsoleTraceEventArgs\n\n console.groupCollapsed(\n '%c%s',\n 'color: #68ca59; padding: 1px; margin-right: 5px; font-size: 12px',\n `[ 🍍 ${context?.label ?? context?.namespace} ] - ${context?.scope}`\n )\n if (context?.payload) {\n printTracePayload(context.payload)\n }\n console.groupCollapsed(\n '%c%s',\n 'color: #f1f6b7; padding: 1px; margin-right: 5px; font-size: 11px',\n `[ TRACES ]`\n )\n groups.forEach(group => this.log(...group))\n console.groupEnd()\n console.groupEnd()\n }\n\n protected useLog(styleDefinition: StyleDefinition, args: any) {\n logTrace(\n this.generateStyle(styleDefinition),\n this.rebuildArgs(args, styleDefinition.icon),\n this._pluginName\n )\n }\n}","import type { AnyObject } from '../types'\nimport type {\n TraceEvent,\n TraceEventMetadata,\n TraceLevel,\n TraceListener,\n TracePayload,\n TracerOptions,\n} from '../types/trace'\n\nfunction resolvePayload(payload: TracePayload): AnyObject | undefined {\n if (typeof payload !== 'function') {\n return payload\n }\n\n try {\n return payload()\n } catch (error) {\n return { __tracePayloadError: error }\n }\n}\n\n/**\n * Emits structured trace events.\n *\n * Nothing is allocated when no listener matches:\n * the payload is a factory resolved only once a consumer is known.\n */\nexport default class Tracer {\n private readonly _listeners: TraceListener[] = []\n private _scope?: string\n private readonly _source: string\n\n constructor(source: string, listeners: TraceListener[], options: TracerOptions = {}) {\n this._scope = options.scope\n this._source = source\n this._listeners = listeners\n }\n\n get scope(): string | undefined {\n return this._scope\n }\n\n set scope(scope: string | undefined) {\n this._scope = scope\n }\n\n get source(): string {\n return this._source\n }\n\n debug(label: string, namespace: string, payload?: TracePayload, scope?: string): void {\n this.emit('debug', label, namespace, payload, scope)\n }\n\n /** Relays the error to matching listeners, or reports it when none match. */\n error(label: string, namespace: string, error: unknown, payload?: TracePayload, scope?: string): void {\n this.emit('error', label, namespace, payload, scope, error)\n }\n\n private emit(\n level: TraceLevel,\n label: string,\n namespace: string,\n payload?: TracePayload,\n scope?: string,\n error?: unknown\n ): void {\n if (this._listeners.length === 0) {\n if (level === 'error') {\n console.error('Unhandled error trace event:', error)\n }\n return\n }\n\n const metadata: TraceEventMetadata = {\n label,\n level,\n namespace,\n scope: scope ?? this._scope,\n source: this._source\n }\n\n const matched = this._listeners.filter(listener => {\n try {\n return listener.filter(metadata)\n } catch (error) {\n console.error('Error in trace listener filter:', error)\n return false\n }\n })\n\n if (matched.length === 0) {\n if (level === 'error') {\n console.error('Unhandled error trace event:', error)\n }\n return\n }\n\n const event: TraceEvent = {\n ...metadata,\n ...(error !== undefined && { error }),\n ...(payload !== undefined && { payload: resolvePayload(payload) }),\n timestamp: Date.now()\n }\n\n for (const listener of matched) {\n try {\n listener.handler(event)\n } catch (error) {\n // a faulty listener must never break the traced code\n console.error('Error in trace listener:', error)\n }\n }\n }\n}\n","import { PluginConsole, TraceConsole } from '../system/log'\n\nimport type { Console } from '../types/log'\nimport type {\n ConsoleTraceEvent, ConsoleTraceEventArgs, TraceEvent, TraceListenerGroupBy, ConsoleTraceGroupListener, TraceListener\n} from '../types/trace'\n\n\n/**\n * Builds the console arguments from a trace event.\n * @param event The trace event to build console arguments from.\n * @returns An array containing the formatted trace label and the sanitized event data.\n */\nfunction buildConsoleArgsFromEvent(event: TraceEvent): ConsoleTraceEvent {\n const sanitizedEvent = Object.keys(event).reduce((acc, curr) => {\n if (curr !== 'level' && curr !== 'timestamp') {\n acc[curr] = event[curr as keyof ConsoleTraceEventArgs]\n }\n return acc\n }, {} as Record<string, unknown>)\n\n return [formatTraceLabel(event), sanitizedEvent as ConsoleTraceEventArgs]\n\n /**\n if (event.error !== undefined) {\n args.push(event.error)\n }\n\n if (event.payload !== undefined) {\n if (Array.isArray(event.payload)) {\n args.push(...event.payload)\n } else {\n args.push(event.payload)\n }\n }\n */\n}\n\nfunction formatTraceLabel(event: TraceEvent): string {\n return event.scope\n ? `${event.label} [${event.scope}]`\n : `${event.label}`\n}\n\nfunction log(target: Console, event: TraceEvent): void {\n const consoleMethod = event.level === 'error' ? 'error' : 'log'\n target[consoleMethod](...buildConsoleArgsFromEvent(event))\n}\n\n/**\n * Creates an opt-in trace listener that reproduces the former console output.\n */\nexport function createConsoleTraceListener(target?: Console): Omit<TraceListener, 'filter'> {\n if (!target) {\n target = new TraceConsole()\n }\n\n return {\n handler(event): void {\n log(target, event)\n }\n }\n}\n\n\nexport function createConsoleGroupTraceListener(groupBy: TraceListenerGroupBy = 'scope'): ConsoleTraceGroupListener {\n const target = new TraceConsole()\n const groups = new Map<string, ConsoleTraceEvent[]>()\n\n\n function createGroup(key: string) {\n groups.set(key, [])\n }\n\n function logGroup(key: string): void {\n const group = groups.get(key)\n\n if (!group) {\n target.error(`No group found for key \"${key}\"`)\n return\n }\n\n if (group.length) { target.logGroup(group) }\n\n groups.delete(key)\n }\n\n return {\n createGroup,\n logGroup,\n handler(event): void {\n const groupKey = event[groupBy] as string\n if (!groups.has(groupKey)) {\n log(target, event)\n return\n }\n\n groups.get(groupKey)?.push(buildConsoleArgsFromEvent(event))\n }\n }\n}\n\n\n","import { createConsoleTraceListener, createConsoleGroupTraceListener } from \"./console-trace-listener\"\nimport type {\n ConsoleTraceGroupListener,\n TraceEventMetadata,\n TraceFilterFactoryCriterion,\n TraceFilterFactoryParam,\n TraceGroupListener,\n TraceListener\n} from \"../types/trace\"\n\n\nfunction createFilter(criteria: TraceFilterFactoryCriterion[], mode: 'every' | 'some') {\n return (event: TraceEventMetadata) => {\n return criteria[mode](({ comparator = 'equals', target, value }) => {\n const eventValue = event[target]\n if (typeof eventValue !== 'string') return false\n let result = false\n switch (comparator) {\n case 'equals':\n result = eventValue === value\n break\n case 'contains':\n result = eventValue.includes(value)\n break\n case 'startsWith':\n result = eventValue.startsWith(value)\n break\n case 'endsWith':\n result = eventValue.endsWith(value)\n break\n default:\n result = false\n break\n }\n return result\n })\n }\n}\n\n/**\n * Creates a trace group listener with optional filtering.\n * @param filterDef The filter criteria for the trace events.\n * @param filterMode The mode to apply when evaluating multiple filter criteria: 'every' or 'some'.\n * @param groupBy The key of the trace event metadata to group by.\n * @returns A trace listener configured with group handling and filtering.\n */\nexport function createTraceGroupListener(\n filterDef: TraceFilterFactoryCriterion[],\n filterMode: 'every' | 'some' = 'every',\n groupBy: keyof TraceEventMetadata = 'scope'\n) {\n return {\n groupBy,\n ...createConsoleGroupTraceListener(groupBy),\n ...createTraceFilter(filterDef, filterMode)\n } as TraceGroupListener\n\n}\n\nfunction createTraceFilter(\n listenerDef: TraceFilterFactoryParam | TraceFilterFactoryCriterion[],\n filterMode: 'every' | 'some' = 'every'\n) {\n if (Array.isArray(listenerDef)) {\n listenerDef = {\n filter: createFilter(listenerDef, filterMode)\n }\n }\n\n if (listenerDef.filter && Array.isArray(listenerDef.filter)) {\n listenerDef.filter = createFilter(listenerDef.filter, filterMode)\n }\n\n if (!listenerDef.filter || typeof listenerDef.filter !== 'function') {\n listenerDef = { ...listenerDef, filter: () => true }\n }\n\n return listenerDef\n}\n\n/**\n * Creates a trace listener with optional filtering.\n * @param param The trace listener parameters including handler and optional filter criteria.\n * @param filterMode The mode to apply when evaluating multiple filter criteria: 'every' or 'some'.\n * @returns A trace listener configured with the specified handler and filter.\n */\nexport function createTraceListener(listenerDef: TraceFilterFactoryParam | TraceFilterFactoryCriterion[], filterMode: 'every' | 'some' = 'every'): TraceListener {\n listenerDef = createTraceFilter(listenerDef, filterMode)\n\n if (!listenerDef?.handler) {\n listenerDef = { ...listenerDef, ...createConsoleTraceListener() } as TraceFilterFactoryParam\n }\n\n return listenerDef as TraceListener\n}","import Tracer from '../system/Tracer'\nimport { createTraceGroupListener, createTraceListener } from './trace-listener'\nimport type {\n AddTraceListenerOptions,\n TraceEvent,\n TraceFilterFactoryCriterion,\n TraceFilterFactoryParam,\n TraceGroupListener,\n TraceListener,\n TraceListenerFilterMode,\n TraceListenerRemover,\n TraceRegistry,\n TracerOptions,\n} from '../types/trace'\n\n/**\n * Creates a registry for managing trace listeners and creating tracers.\n * @returns An object containing methods to add and clear trace listeners, and to create tracers.\n */\nexport function createTracerRegistry(): TraceRegistry {\n let listeners: TraceListener[] = []\n\n /**\n * Registers a trace listener and returns its remover.\n * Listeners are evaluated in registration order.\n * @param listener The trace listener to register.\n * @param filterMode The mode to use when creating a trace listener from a filter factory parameter. Defaults to 'every'.\n * @returns A function that removes the registered listener when called.\n */\n function addTraceListener(listener: TraceListener | TraceFilterFactoryParam, filterMode: TraceListenerFilterMode = 'every'): TraceListenerRemover {\n if (!listener || !listener?.handler) {\n listener = createTraceListener(listener, filterMode)\n }\n\n if (!('filter' in listener) || typeof listener.filter !== 'function') {\n listener = { ...listener, filter: () => true }\n }\n\n listeners.push(listener as TraceListener)\n\n return () => {\n const index = listeners.indexOf(listener as TraceListener)\n\n if (index !== -1) {\n listeners.splice(index, 1)\n }\n }\n }\n\n /**\n * Clears all registered trace listeners.\n */\n function clearTraceListeners(): void {\n listeners = []\n }\n\n /**\n * Checks if there are any registered trace listeners.\n * @returns True if there are registered trace listeners, otherwise false.\n */\n function hasTraceListeners(): boolean {\n return listeners.length > 0\n }\n\n return {\n addTraceListener,\n clearTraceListeners,\n createTracer: (source: string, options: TracerOptions = {}) => new Tracer(source, listeners, options),\n hasTraceListeners\n }\n}\n\nexport function createTraceGroupsRegistry() {\n let listeners: TraceGroupListener[] = []\n\n /**\n * Registers a trace listener and returns its remover.\n * Listeners are evaluated in registration order.\n * @param criteria The criteria used to create the trace group listener.\n * @param filterMode The mode to use when creating the trace group listener from the criteria. Defaults to 'every'.\n * @param groupBy The property to group traces by. Defaults to 'scope'.\n * @returns A function that removes the registered trace group listener when called.\n */\n function addListener(\n criteria: TraceFilterFactoryCriterion[],\n { filterMode = 'every', groupBy = 'scope' }: AddTraceListenerOptions = {}\n ): TraceListenerRemover {\n const listenerGroup = createTraceGroupListener(criteria, filterMode ?? 'every', groupBy ?? 'scope')\n listeners.push(listenerGroup)\n\n return () => {\n const index = listeners.indexOf(listenerGroup)\n\n if (index !== -1) {\n listeners.splice(index, 1)\n }\n }\n }\n\n /**\n * Clears all registered trace listeners.\n */\n function clearTraceListeners(): void {\n listeners = []\n }\n\n function getMatchedListener(payload: TraceEvent) {\n return listeners.filter(listener => listener.filter(payload))\n }\n\n /**\n * Checks if there are any registered trace listeners.\n * @returns True if there are registered trace listeners, otherwise false.\n */\n function hasTraceListeners(): boolean {\n return listeners.length > 0\n }\n\n function listenerGroupAction(actionName: 'createGroup' | 'logGroup', payload: TraceEvent) {\n if (!listeners.length) return\n\n getMatchedListener(payload).forEach(listener => {\n const groupLabel = payload[listener.groupBy]\n if (typeof groupLabel === 'string') { listener[actionName](groupLabel) }\n })\n }\n\n\n return {\n addListener,\n clearTraceListeners,\n tracerHandler: {\n closeGroup: (payload: TraceEvent) => listenerGroupAction('logGroup', payload),\n createTracer: (source: string, options: TracerOptions = {}) => new Tracer(source, listeners, options),\n startGroup: (payload: TraceEvent) => listenerGroupAction('createGroup', payload)\n },\n hasTraceListeners\n }\n}"],"names":["style","bgColor","color","printObject","label","payload","item","index","emptyKeys","key","value","printTracePayload","tracePayload","arg","acc","curr","log","logStyle","args","logTrace","pluginName","event","CustomConsole","__publicField","message","icon","styleDefinition","messageType","TraceConsole","groups","context","group","resolvePayload","error","Tracer","source","listeners","options","scope","namespace","level","metadata","matched","listener","buildConsoleArgsFromEvent","sanitizedEvent","formatTraceLabel","target","consoleMethod","createConsoleTraceListener","createConsoleGroupTraceListener","groupBy","createGroup","logGroup","groupKey","createFilter","criteria","mode","comparator","eventValue","result","createTraceGroupListener","filterDef","filterMode","createTraceFilter","listenerDef","createTraceListener","createTracerRegistry","addTraceListener","clearTraceListeners","hasTraceListeners","createTraceGroupsRegistry","addListener","listenerGroup","getMatchedListener","listenerGroupAction","actionName","groupLabel"],"mappings":"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"}
@@ -2,7 +2,7 @@ var k = Object.defineProperty;
2
2
  var E = (s, t, e) => t in s ? k(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;
3
3
  var c = (s, t, e) => E(s, typeof t != "symbol" ? t + "" : t, e);
4
4
  import { h as O, g as b, i as _, p as g } from "./chunks/constantes-2FeJfVVy.js";
5
- import { P as T, S as K, d as M, a as F, b as W, c as I, e as z, s as q } from "./chunks/constantes-2FeJfVVy.js";
5
+ import { P as T, S as K, d as M, a as F, b as W, c as I, e as q, s as z } from "./chunks/constantes-2FeJfVVy.js";
6
6
  import { toRaw as y } from "vue";
7
7
  function h(s) {
8
8
  if (typeof structuredClone == "function")
@@ -284,7 +284,7 @@ class A {
284
284
  }
285
285
  }
286
286
  initializeTracer() {
287
- console.log("Initializing tracer", this._options?.tracerHandler, this._options), this._options?.tracerHandler && (this._tracer = this._options.tracerHandler.createTracer(g));
287
+ this._options?.tracerHandler && (this._tracer = this._options.tracerHandler.createTracer(g));
288
288
  }
289
289
  plugin({ store: t, options: e }) {
290
290
  if (this._subscribers.length) {
@@ -428,7 +428,7 @@ export {
428
428
  F as defineAStoreCtx,
429
429
  W as getDefineAStoreSetupContext,
430
430
  I as getEnhancedStore,
431
- z as getExtendingStore,
432
- q as setEnhancedStore
431
+ q as getExtendingStore,
432
+ z as setEnhancedStore
433
433
  };
434
434
  //# sourceMappingURL=pinia-plugin-subscription.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pinia-plugin-subscription.js","sources":["../src/utils/deep-clone.ts","../src/factories/state-snapshot.ts","../src/core/RollbackStateSnapshotsHandler.ts","../src/core/PluginSubscription.ts"],"sourcesContent":["/**\n * Deeply clones the provided value, handling objects, arrays, maps, and sets. Uses `structuredClone` if available, otherwise falls back to a manual deep clone.\n * @template T The type of the value to deep clone.\n * @param value The value to deep clone.\n * @returns A deep clone of the provided value.\n */\nexport function deepClone<T>(value: T): T {\n if (typeof structuredClone === 'function') {\n try {\n return structuredClone(value)\n } catch {\n // fall through to the safe manual clone below\n }\n }\n\n if (value === null || typeof value !== 'object') {\n return value\n }\n\n if (value instanceof Map) {\n return new Map(\n Array.from(value.entries(), ([key, entryValue]) => [deepClone(key), deepClone(entryValue)])\n ) as T\n }\n\n if (value instanceof Set) {\n return new Set(Array.from(value.values(), entryValue => deepClone(entryValue))) as T\n }\n\n if (Array.isArray(value)) {\n return value.map(item => deepClone(item)) as T\n }\n\n if (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null) {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, item]) => [key, deepClone(item)])\n ) as T\n }\n\n const clonedObject = Object.create(Object.getPrototypeOf(value)) as Record<string, unknown>\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n clonedObject[key] = deepClone(item)\n }\n\n return clonedObject as T\n}","import { toRaw } from 'vue'\nimport { deepClone } from '../utils/deep-clone'\n\nimport type { StateTree } from 'pinia'\nimport type { CreateStateSnapshotKeys } from '../types/plugin'\n\n\nexport function createStateSnapshot(state: StateTree, keys: CreateStateSnapshotKeys = 'all') {\n if (Array.isArray(keys)) {\n const clonedState: Partial<StateTree> = {}\n for (const key of keys) {\n if (key in state) {\n clonedState[key] = deepClone(toRaw(state[key]))\n }\n }\n return clonedState\n }\n\n if (keys !== 'all') {\n throw new Error(`Invalid keys parameter: ${keys}`)\n }\n\n return deepClone(toRaw(state))\n}","import { createStateSnapshot } from \"../factories/state-snapshot\"\nimport { getActionStoreKey, hasDeniedFirstChar } from '../utils/store'\n\nimport type { PiniaPluginContext, StateTree, Store } from 'pinia'\nimport type { AnyObject } from '../types'\nimport type { CreateStateSnapshotKeys } from '../types/plugin'\nimport type { RollbackActionParams } from '../types/store'\n\n\n/**\n * Handles rollback state snapshots for Pinia stores.\n * This class provides methods to add rollback actions to stores,\n * create rollback snapshots, and manage the state snapshots internally.\n */\nexport default class RollbackStateSnapshotsHandler {\n private _stateSnapshots: Map<symbol, StateTree> = new Map()\n private _storeHasRollbackSnapshots: Set<string> = new Set()\n private _storeRollbackSnapshotsParams: Map<string, CreateStateSnapshotKeys> = new Map()\n\n\n /**\n * Adds a rollback action to the given store.\n * This method extends the store with a $rollbackAfterFailure function that handles rollback logic for actions.\n * The action arguments are forwarded through apply(), so they must be provided as a single array.\n * @param {Store} store The store to which the rollback action will be added.\n * @returns void\n */\n addRollbackAction(store: Store): void {\n if (typeof store.$rollbackAfterFailure === 'function') {\n return\n }\n\n store.$rollbackAfterFailure = async ({ action, stateKeys }: RollbackActionParams, args: any[] = []) => {\n const actionFn = (store as AnyObject)[action]\n if (typeof actionFn !== 'function' || hasDeniedFirstChar(action)) {\n return\n }\n\n const keys: CreateStateSnapshotKeys = !stateKeys || stateKeys.length === 0 ? 'all' : stateKeys\n\n const snapshotKey = this.saveStateSnapshot(store, action, keys)\n try {\n await actionFn.apply(store, args)\n } catch (error) {\n this.patchStore(snapshotKey, store)\n throw error\n } finally {\n this.removeStateSnapshot(snapshotKey)\n }\n }\n }\n\n /**\n * Creates a rollback snapshot for the specified action and store.\n * This snapshot can be used to restore the store's state in case of an error during the action execution.\n * @param {string} actionName The name of the action for which the rollback snapshot is created.\n * @param {Store} store The Pinia store instance.\n * @returns An object containing `after` and `onError` callbacks for handling the rollback, or `undefined` if no snapshot is created.\n */\n createOnActionCallbacks(\n actionName: string,\n store: Store\n ): {\n after: () => void,\n onError: () => void\n } | undefined {\n const stateKeys = this._storeRollbackSnapshotsParams.get(\n getActionStoreKey(actionName, store)\n )\n\n if (!stateKeys) {\n return\n }\n\n const keys: CreateStateSnapshotKeys = stateKeys.length === 0 ? 'all' : stateKeys\n const snapshotKey = this.saveStateSnapshot(store, actionName, keys)\n\n return {\n after: () => { this.removeStateSnapshot(snapshotKey) },\n onError: () => {\n this.patchStore(snapshotKey, store)\n this.removeStateSnapshot(snapshotKey)\n }\n }\n }\n\n /**\n * Initializes the rollback state snapshots handler from the given Pinia plugin context.\n * This method extracts the rollback snapshot parameters from the store options and stores them internally.\n * @param {PiniaPluginContext} param0 The Pinia plugin context containing the store and its options.\n * @returns void\n */\n initFromPluginContext({ options, store }: PiniaPluginContext) {\n const rollbackSnapshotParams = options?.storeOptions?.rollbackAfterFailure as Record<string, CreateStateSnapshotKeys>\n if (rollbackSnapshotParams && !this._storeHasRollbackSnapshots.has(store.$id)) {\n Object.keys(rollbackSnapshotParams).forEach(key => {\n this._storeRollbackSnapshotsParams.set(\n getActionStoreKey(key, store),\n rollbackSnapshotParams[key]\n )\n })\n this._storeHasRollbackSnapshots.add(store.$id)\n }\n this.addRollbackAction(store)\n }\n\n /**\n * Clears all rollback tracking data for the given store.\n * Must be called when the store is disposed to avoid memory leaks with dynamically created stores.\n * @param {Store} store The disposed Pinia store instance.\n * @returns void\n */\n clearStoreTracking(store: Store): void {\n const suffix = `-${store.$id}`\n\n for (const key of Array.from(this._storeRollbackSnapshotsParams.keys())) {\n if (key.endsWith(suffix)) {\n this._storeRollbackSnapshotsParams.delete(key)\n }\n }\n\n this._storeHasRollbackSnapshots.delete(store.$id)\n\n for (const snapshotKey of Array.from(this._stateSnapshots.keys())) {\n if (snapshotKey.description?.startsWith(`${store.$id}:`)) {\n this._stateSnapshots.delete(snapshotKey)\n }\n }\n }\n\n private patchStore(snapshotKey: symbol, store: Store): void {\n const stateSnapshot = this._stateSnapshots.get(snapshotKey)\n if (!stateSnapshot) {\n return\n }\n\n try {\n store.$patch(stateSnapshot)\n } catch (error) {\n console.error(`Failed to patch store with snapshot ${String(snapshotKey)}`, error)\n }\n }\n\n /**\n * Removes a state snapshot identified by the given snapshot key from the internal state snapshot tracking.\n * @param snapshotKey The key of the state snapshot to be removed.\n * @returns void\n */\n private removeStateSnapshot(snapshotKey?: symbol): void {\n if (!snapshotKey) {\n return\n }\n\n this._stateSnapshots.delete(snapshotKey)\n }\n\n /**\n * Saves the current state snapshot for a given store and action.\n * @param store The Pinia store instance.\n * @param actionName The name of the action being executed.\n * @param stateKeys The state keys to include in the snapshot, or 'all' for the full state.\n * @returns A unique symbol key representing the saved snapshot.\n */\n private saveStateSnapshot(store: Store, actionName: string, stateKeys: CreateStateSnapshotKeys): symbol {\n const stateSnapshot = createStateSnapshot(\n store.$state,\n stateKeys\n )\n\n const snapshotKey = Symbol(`${store.$id}:${actionName}`)\n this._stateSnapshots.set(snapshotKey, stateSnapshot)\n return snapshotKey\n }\n\n /**\n * Checks if the given store has rollback snapshots.\n * @param store The Pinia store instance.\n * @returns True if the store has rollback snapshots, false otherwise.\n */\n storeHasRollbackSnapshots(store: Store): boolean {\n return this._storeHasRollbackSnapshots.has(store.$id)\n }\n}","import RollbackStateSnapshotsHandler from \"./RollbackStateSnapshotsHandler\"\nimport { deepClone } from '../utils/deep-clone'\nimport { getActionStoreKey } from '../utils/store'\nimport Tracer from \"../system/Tracer\"\nimport { isEmpty } from \"../utils/validation\"\nimport { pluginName } from \"../utils/constantes\"\n\nimport type { PiniaPluginContext, StateTree, Store, SubscriptionCallbackMutation } from \"pinia\"\nimport type { AnyObject } from \"../types\"\nimport type { TracePayload } from \"../types/trace\"\nimport type {\n PluginExecutionOptions,\n PluginHydrationScheduler,\n PluginRuntimeEnvironment,\n PluginSubscriber,\n PluginSubscription as PluginSubscriptionDefinition,\n PluginSubscriptionOptions,\n PluginSubscriptions,\n StoreMutationSubscription,\n StoreOnActionAfterCallbackParameter,\n StoreOnActionSubscriptionCallback\n} from \"../types/plugin\"\n\n\nconst className = 'PluginSubscription'\nconst defaultPluginExecution: Required<PluginExecutionOptions> = {\n environment: 'both',\n hydration: 'immediate'\n}\n\nfunction defaultHydrationScheduler(callback: () => void): void {\n if (typeof window !== 'undefined' && typeof window.requestAnimationFrame === 'function') {\n window.requestAnimationFrame(() => globalThis.setTimeout(callback, 0))\n return\n }\n\n globalThis.setTimeout(callback, 0)\n}\n\nexport default class PluginSubscription {\n protected _className: string = className\n private _hydrationScheduler: PluginHydrationScheduler\n private _onActionSubscriptions: Map<Store, Set<StoreOnActionSubscriptionCallback>> = new Map()\n private _onActionStores: Set<Store> = new Set()\n private _onActionAfterSubscriptions: Record<string, StoreOnActionAfterCallbackParameter[]> = {}\n private _onActionOnErrorSubscriptions: Record<string, Array<(error: unknown) => void>> = {}\n private _options?: PluginSubscriptionOptions\n private _resetStoreCallback: Map<Store, Set<NonNullable<PluginSubscriber['resetStoreCallback']>>> = new Map()\n private _disposedStores: WeakSet<Store> = new WeakSet()\n private _storeRollbackSnapshotsHandler: RollbackStateSnapshotsHandler = new RollbackStateSnapshotsHandler()\n private _subscribers: PluginSubscriber[] = []\n private _subscribersDelivered: Set<string> = new Set()\n private _subscribersScheduled: Set<string> = new Set()\n private _subscriptions: PluginSubscriptions[] = []\n private _subscriptionsDelivered: Set<string> = new Set()\n private _subscriptionsScheduled: Set<string> = new Set()\n private _tracer?: Tracer\n\n set subscribers(subscribers: PluginSubscriber[]) {\n this._subscribers = subscribers\n }\n\n get subscriptions(): PluginSubscriptions[] | undefined {\n if (!isEmpty(this._subscriptions)) {\n return this._subscriptions\n }\n }\n\n constructor(\n subscribers: PluginSubscriber[],\n options?: PluginSubscriptionOptions\n ) {\n this._hydrationScheduler = options?.hydrationScheduler ?? defaultHydrationScheduler\n this._options = options\n this._subscribers = subscribers\n this.initializeTracer()\n }\n\n private addOnActionAfterCallback(actionName: string, store: Store, callback: StoreOnActionAfterCallbackParameter): void {\n const key = getActionStoreKey(actionName, store)\n if (!this._onActionAfterSubscriptions[key]) {\n this._onActionAfterSubscriptions[key] = []\n }\n this._onActionAfterSubscriptions[key]?.push(callback)\n }\n\n private addOnActionOnErrorCallback(actionName: string, store: Store, callback: (error: unknown) => void): void {\n const key = getActionStoreKey(actionName, store)\n if (!this._onActionOnErrorSubscriptions[key]) {\n this._onActionOnErrorSubscriptions[key] = []\n }\n this._onActionOnErrorSubscriptions[key]?.push(callback)\n }\n\n private addResetStoreCallback(store: Store, callback: NonNullable<PluginSubscriber['resetStoreCallback']>): void {\n if (!this._resetStoreCallback.has(store)) {\n this._resetStoreCallback.set(store, new Set())\n }\n this._resetStoreCallback.get(store)!.add(callback)\n }\n\n private clearOnActionCallbacksSubscriptions(storageKey: string): void {\n delete this._onActionAfterSubscriptions[storageKey]\n delete this._onActionOnErrorSubscriptions[storageKey]\n }\n\n private clearStoreTracking(store: Store): void {\n this._onActionSubscriptions.delete(store)\n this._onActionStores.delete(store)\n this._resetStoreCallback.delete(store)\n const suffix = `-${store.$id}`\n\n for (const key of Array.from(this._subscribersDelivered)) {\n if (key.endsWith(suffix)) {\n this._subscribersDelivered.delete(key)\n }\n }\n\n for (const key of Array.from(this._subscribersScheduled)) {\n if (key.endsWith(suffix)) {\n this._subscribersScheduled.delete(key)\n }\n }\n\n for (const key of Array.from(this._subscriptionsDelivered)) {\n if (key.endsWith(suffix)) {\n this._subscriptionsDelivered.delete(key)\n }\n }\n\n for (const key of Array.from(this._subscriptionsScheduled)) {\n if (key.endsWith(suffix)) {\n this._subscriptionsScheduled.delete(key)\n }\n }\n\n for (const key of Object.keys(this._onActionAfterSubscriptions)) {\n if (key.endsWith(suffix)) {\n delete this._onActionAfterSubscriptions[key]\n }\n }\n\n for (const key of Object.keys(this._onActionOnErrorSubscriptions)) {\n if (key.endsWith(suffix)) {\n delete this._onActionOnErrorSubscriptions[key]\n }\n }\n }\n\n /**\n * Creates a callback collector for the specified action and store.\n * @param actionName The name of the action to collect callbacks for.\n * @param store The store instance associated with the action.\n * @returns A function that collects callbacks for the specified action and store.\n */\n private createOnActionAfterCallbackCollector(actionName: string, store: Store) {\n return (callback: StoreOnActionAfterCallbackParameter) => {\n this.addOnActionAfterCallback(actionName, store, callback)\n }\n }\n\n /**\n * Creates a callback collector for the specified action and store that handles errors.\n * @param actionName The name of the action to collect error callbacks for.\n * @param store The store instance associated with the action.\n * @returns A function that collects error callbacks for the specified action and store.\n */\n private createOnActionOnErrorCallbackCollector(actionName: string, store: Store) {\n return (callback: (error: unknown) => void) => {\n this.addOnActionOnErrorCallback(actionName, store, callback)\n }\n }\n\n /**\n * Rolls back the state snapshot for a given action if an error occurs, and removes the snapshot after the action completes or fails.\n * @param actionName The name of the action being executed.\n * @param store The Pinia store instance.\n * @returns void\n */\n private createRollbackSnapshot(\n actionName: string,\n store: Store\n ) {\n const {\n after,\n onError\n } = this._storeRollbackSnapshotsHandler.createOnActionCallbacks(\n actionName,\n store\n ) ?? {}\n\n if (!after || !onError) {\n return\n }\n\n this.addOnActionAfterCallback(actionName, store, after)\n this.addOnActionOnErrorCallback(actionName, store, onError)\n }\n\n private defineCurrentEnvironment(): PluginRuntimeEnvironment {\n return this._options?.runtimeEnvironment\n ?? (typeof window === 'undefined' ? 'server' : 'client')\n }\n\n private definePluginExecution(subscriber: PluginSubscriber): Required<PluginExecutionOptions> {\n return {\n ...defaultPluginExecution,\n ...(this._options?.execution ?? {}),\n ...(subscriber.execution ?? {}),\n ...(this._options?.subscriberExecution?.[subscriber.name] ?? {}),\n }\n }\n\n private defineHydrationScheduler(subscriber: PluginSubscriber | PluginSubscriptionDefinition['subscription']): PluginHydrationScheduler {\n return subscriber.hydrationScheduler ?? this._hydrationScheduler\n }\n\n private defineSubscriberKey(subscriber: PluginSubscriber, store: Store): string {\n return `${subscriber.name}-${store.$id}`\n }\n\n private defineSubscriptionKey(pluginName: string, store: Store): string {\n return `${pluginName}-${store.$id}`\n }\n\n private executeResetStoreCallbacks(store: Store): void {\n this._resetStoreCallback.get(store)?.forEach(callback => callback(store))\n }\n\n /**\n * Executes the store's onAction subscription for the given plugin subscriber.\n * @param store The Pinia store instance.\n * @param subscriber The plugin subscriber.\n * @returns void\n */\n private executeStoreOnActionSubscription(store: Store): void {\n if (this._onActionStores.has(store) || typeof store.$onAction !== 'function') {\n return\n }\n const onActionSubscriptions = this._onActionSubscriptions.get(store)\n const hasRollbackSnapshots = this._storeRollbackSnapshotsHandler.storeHasRollbackSnapshots(store)\n\n if (!onActionSubscriptions?.size && !hasRollbackSnapshots) {\n return\n }\n\n this._onActionStores.add(store)\n store.$onAction(({ after, args, name, onError }) => {\n this.traceGroupStart(() => ({ args, name }), store.$id, 'onAction')\n const storageKey = getActionStoreKey(name, store)\n\n if (this._storeRollbackSnapshotsHandler.storeHasRollbackSnapshots(store)) {\n this.createRollbackSnapshot(name, store)\n }\n\n const callbacks = this._onActionSubscriptions.get(store)\n if (callbacks?.size) {\n callbacks.forEach(callback => callback({\n after: this.createOnActionAfterCallbackCollector(name, store),\n args,\n name,\n onError: this.createOnActionOnErrorCallbackCollector(name, store)\n }))\n }\n\n const afterCallbacks = this._onActionAfterSubscriptions[storageKey]\n const onErrorCallbacks = this._onActionOnErrorSubscriptions[storageKey]\n\n this.clearOnActionCallbacksSubscriptions(storageKey)\n\n if (afterCallbacks?.length) {\n after((result) => {\n afterCallbacks.forEach(callback => callback(result))\n this.traceGroupEnd({}, store.$id)\n })\n }\n if (onErrorCallbacks?.length) {\n onError((error) => {\n onErrorCallbacks.forEach(callback => callback(error))\n })\n }\n if (!afterCallbacks?.length) {\n this.traceGroupEnd({}, store.$id)\n }\n })\n }\n\n private executeSubscriber(context: PiniaPluginContext, subscriber: PluginSubscriber): void {\n const subscriberKey = this.defineSubscriberKey(subscriber, context.store)\n\n if (this._subscribersDelivered.has(subscriberKey)) {\n return\n }\n\n if (\n !subscriber.invoke(context, this._options?.tracerHandler?.createTracer)) {\n return\n }\n\n this._subscribersDelivered.add(subscriberKey)\n\n let hydrateResult: void | Promise<void>\n\n try {\n hydrateResult = subscriber.hydrate?.(context)\n } catch (error) {\n this.traceError('subscriber:hydrate', error, context.store.$id)\n return\n }\n\n const runAfterHydration = () => {\n try {\n const afterHydration = subscriber.afterHydration?.(context)\n if (afterHydration && typeof (afterHydration as Promise<void>).then === 'function') {\n ; (afterHydration as Promise<void>).catch(\n error => this.traceError('subscriber:afterHydration', error, context.store.$id)\n )\n }\n } catch (error) {\n this.traceError('subscriber:afterHydration', error, context.store.$id)\n }\n }\n\n if (hydrateResult && typeof (hydrateResult as Promise<void>).then === 'function') {\n ; (hydrateResult as Promise<void>)\n .then(() => runAfterHydration())\n .catch(error => this.traceError('subscriber:hydrate', error, context.store.$id))\n } else {\n runAfterHydration()\n }\n\n if (subscriber.subscriptions) {\n this.subscriptionDelivery(context, subscriber.subscriptions)\n }\n\n if (subscriber.storeMutationSubscription) {\n this.storeMutationSubscription(subscriber.storeMutationSubscription)\n }\n\n this.storeOnActionSubscription(subscriber)\n\n if (subscriber.resetStoreCallback) {\n this.addResetStoreCallback(context.store, subscriber.resetStoreCallback)\n }\n }\n\n private executeSubscriberSafely(context: PiniaPluginContext, subscriber: PluginSubscriber): void {\n try {\n this.executeSubscriber(context, subscriber)\n } catch (e) {\n this.traceError('subscriber:execute', e, context.store.$id)\n }\n }\n\n private initializeTracer() {\n console.log('Initializing tracer', this._options?.tracerHandler, this._options)\n if (this._options?.tracerHandler) {\n this._tracer = this._options.tracerHandler.createTracer(pluginName)\n }\n }\n\n /**\n * Invokes the plugin with the given Pinia plugin context, executing all relevant subscribers safely.\n * @param param0 The Pinia plugin context containing the store and options.\n * @param param0.store The Pinia store instance.\n * @param param0.options The options passed to the Pinia store.\n * @returns void\n */\n plugin({ store, options }: PiniaPluginContext) {\n if (!this._subscribers.length) {\n return\n }\n\n this.traceGroupStart(() => ({\n subscribers: this._subscribers,\n store,\n options\n }), store.$id)\n\n try {\n this._subscribers.forEach(\n subscriber => {\n const subscriberKey = this.defineSubscriberKey(subscriber, store)\n const execution = this.definePluginExecution(subscriber)\n\n if (\n this._subscribersDelivered.has(subscriberKey)\n || this._subscribersScheduled.has(subscriberKey)\n ) {\n return\n }\n\n if (!this.shouldInvokePlugin(execution)) {\n return\n }\n\n if (this.shouldScheduleAfterHydration(execution)) {\n this.queueSubscriberExecution({ store, options } as PiniaPluginContext, subscriber, subscriberKey)\n return\n }\n\n this.executeSubscriber({ store, options } as PiniaPluginContext, subscriber)\n }\n )\n\n this.rewriteResetStore({ store } as PiniaPluginContext, store.$state)\n this._storeRollbackSnapshotsHandler.initFromPluginContext({ store, options } as PiniaPluginContext)\n this.executeStoreOnActionSubscription(store)\n this.registerStoreCleanup(store)\n } catch (e) {\n this.traceError('plugin:invoke', e, store.$id)\n }\n this.traceGroupEnd(() => ({}), store.$id)\n }\n\n private queueSubscriberExecution(\n context: PiniaPluginContext,\n subscriber: PluginSubscriber,\n subscriberKey: string\n ): void {\n const scheduler = this.defineHydrationScheduler(subscriber)\n\n this._subscribersScheduled.add(subscriberKey)\n scheduler(() => {\n if (this._disposedStores.has(context.store)) {\n return\n }\n this._subscribersScheduled.delete(subscriberKey)\n this.executeSubscriberSafely(context, subscriber)\n })\n }\n\n private registerStoreCleanup(store: Store): void {\n if (typeof store.$dispose !== 'function') {\n return\n }\n\n const dispose = store.$dispose.bind(store)\n const scopedStore = store as AnyObject\n\n if (scopedStore.__piniaPluginSubscriptionDisposed) {\n return\n }\n\n scopedStore.__piniaPluginSubscriptionDisposed = true\n store.$dispose = () => {\n this._disposedStores.add(store)\n this.clearStoreTracking(store)\n this._storeRollbackSnapshotsHandler.clearStoreTracking(store)\n return dispose()\n }\n }\n\n private rewriteResetStore({ store }: PiniaPluginContext, initState: StateTree): void {\n const safeState = deepClone(initState)\n\n store.$reset = () => {\n this.trace('store:reset', store.$id, () => ({ initialState: safeState }))\n this.executeResetStoreCallbacks(store)\n store.$patch(deepClone(safeState))\n }\n }\n\n private shouldInvokePlugin(execution: Required<PluginExecutionOptions>): boolean {\n const currentEnvironment = this.defineCurrentEnvironment()\n\n return execution.environment === 'both' || execution.environment === currentEnvironment\n }\n\n private shouldScheduleAfterHydration(execution: Required<PluginExecutionOptions>): boolean {\n return this.defineCurrentEnvironment() === 'client' && execution.hydration === 'defer'\n }\n\n private storeOnActionSubscription(subscriber: PluginSubscriber): void {\n const { store, callback } = subscriber?.storeOnActionSubscription?.() ?? {}\n\n if (!store || !callback) {\n return\n }\n\n if (!this._onActionSubscriptions.has(store)) {\n this._onActionSubscriptions.set(store, new Set())\n }\n this._onActionSubscriptions.get(store)!.add(callback)\n this.executeStoreOnActionSubscription(store)\n }\n\n private storeMutationSubscription(subscription: StoreMutationSubscription): void {\n const { store, callback } = subscription()\n\n store.$subscribe((mutation: SubscriptionCallbackMutation<StateTree>) => {\n this.traceGroupStart(() => ({ mutation }), store.$id, 'store:mutation')\n callback(mutation)\n this.traceGroupEnd({}, store.$id)\n })\n }\n\n private subscriptionDelivery(\n context: PiniaPluginContext,\n pluginSubscriptions: PluginSubscriptions\n ): void {\n Object.entries(pluginSubscriptions).forEach(([pluginName, pluginSubscription]) => {\n const subscriptionKey = this.defineSubscriptionKey(pluginName, context.store)\n const execution = this.definePluginExecution(pluginSubscription.subscription)\n\n if (\n this._subscriptionsDelivered.has(subscriptionKey)\n || this._subscriptionsScheduled.has(subscriptionKey)\n ) {\n return\n }\n\n if (!this.shouldInvokePlugin(execution)) {\n return\n }\n\n if (this.shouldScheduleAfterHydration(execution)) {\n const scheduler = this.defineHydrationScheduler(pluginSubscription.subscription)\n\n this._subscriptionsScheduled.add(subscriptionKey)\n scheduler(() => {\n if (this._disposedStores.has(context.store)) {\n return\n }\n this._subscriptionsScheduled.delete(subscriptionKey)\n this.subscriptionDeliverySafely(context, pluginName, pluginSubscription)\n })\n return\n }\n\n this.subscriptionDeliverySafely(context, pluginName, pluginSubscription)\n })\n }\n\n private subscriptionDeliverySafely(\n { store, options }: PiniaPluginContext,\n pluginName: string,\n pluginSubscription: PluginSubscriptionDefinition\n ): void {\n try {\n if (this._subscriptionsDelivered.has(this.defineSubscriptionKey(pluginName, store))) {\n return\n }\n\n const { subscription, subscriptionOptions, stores } = pluginSubscription\n\n this.trace('Subscription:delivery', store.$id, () => ({\n pluginName,\n subscription,\n subscriptionOptions\n }))\n\n const pluginOptions = {\n storeOptions: { ...(options?.storeOptions ?? {}), ...subscriptionOptions }\n }\n\n subscription.invoke(\n { store, options: { ...options, ...pluginOptions } } as PiniaPluginContext\n )\n this._subscriptionsDelivered.add(this.defineSubscriptionKey(pluginName, store))\n\n if (!isEmpty(stores)) {\n stores?.forEach(\n store => subscription.invoke({\n store,\n options: {\n ...options,\n ...pluginOptions,\n ...((store as AnyObject)?.storeOptions ?? {})\n }\n } as PiniaPluginContext)\n )\n }\n } catch (e) {\n this.traceError('subscription:delivery', e, store.$id)\n }\n }\n\n /**\n * Emits a structured trace event.\n * Prefer the factory form for `payload`: it is only resolved when consumed.\n */\n private trace(label: string, scope?: string, payload?: TracePayload): void {\n if (this._tracer) {\n label = this._className + ':' + label\n\n this._tracer.debug(label, label.toLowerCase(), payload, scope)\n }\n }\n\n /**\n * Emits a structured error event, or rethrows it when no listener matches.\n */\n private traceError(label: string, error: unknown, scope?: string, payload?: TracePayload): void {\n if (this._tracer) {\n label = this._className + ':' + label\n this._tracer.error(label, label.toLowerCase(), error, payload, scope)\n } else {\n console.error(error)\n }\n }\n\n private traceGroupEnd(payload: TracePayload, scope: string): void {\n if (this._options?.tracerHandler) {\n this._options.tracerHandler.closeGroup({ ...(typeof payload === 'function' ? payload() : payload), scope })\n }\n }\n\n private traceGroupStart(payload: TracePayload, scope: string, label?: string): void {\n if (this._options?.tracerHandler) {\n this._options.tracerHandler.startGroup({ ...(typeof payload === 'function' ? payload() : payload), scope })\n this.trace(label ?? 'context', scope, payload)\n }\n }\n}"],"names":["deepClone","value","key","entryValue","item","clonedObject","createStateSnapshot","state","keys","clonedState","toRaw","RollbackStateSnapshotsHandler","__publicField","store","action","stateKeys","args","actionFn","hasDeniedFirstChar","snapshotKey","error","actionName","getActionStoreKey","options","rollbackSnapshotParams","suffix","stateSnapshot","className","defaultPluginExecution","defaultHydrationScheduler","callback","PluginSubscription","subscribers","isEmpty","storageKey","after","onError","subscriber","pluginName2","onActionSubscriptions","hasRollbackSnapshots","name","callbacks","afterCallbacks","onErrorCallbacks","result","context","pluginName","subscriberKey","hydrateResult","runAfterHydration","afterHydration","e","execution","scheduler","dispose","scopedStore","initState","safeState","currentEnvironment","subscription","mutation","pluginSubscriptions","pluginSubscription","subscriptionKey","subscriptionOptions","stores","pluginOptions","store2","label","scope","payload","createPlugin","createHydrationPlugin","hydrationPlugin"],"mappings":"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"}
1
+ {"version":3,"file":"pinia-plugin-subscription.js","sources":["../src/utils/deep-clone.ts","../src/factories/state-snapshot.ts","../src/core/RollbackStateSnapshotsHandler.ts","../src/core/PluginSubscription.ts"],"sourcesContent":["/**\n * Deeply clones the provided value, handling objects, arrays, maps, and sets. Uses `structuredClone` if available, otherwise falls back to a manual deep clone.\n * @template T The type of the value to deep clone.\n * @param value The value to deep clone.\n * @returns A deep clone of the provided value.\n */\nexport function deepClone<T>(value: T): T {\n if (typeof structuredClone === 'function') {\n try {\n return structuredClone(value)\n } catch {\n // fall through to the safe manual clone below\n }\n }\n\n if (value === null || typeof value !== 'object') {\n return value\n }\n\n if (value instanceof Map) {\n return new Map(\n Array.from(value.entries(), ([key, entryValue]) => [deepClone(key), deepClone(entryValue)])\n ) as T\n }\n\n if (value instanceof Set) {\n return new Set(Array.from(value.values(), entryValue => deepClone(entryValue))) as T\n }\n\n if (Array.isArray(value)) {\n return value.map(item => deepClone(item)) as T\n }\n\n if (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null) {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, item]) => [key, deepClone(item)])\n ) as T\n }\n\n const clonedObject = Object.create(Object.getPrototypeOf(value)) as Record<string, unknown>\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n clonedObject[key] = deepClone(item)\n }\n\n return clonedObject as T\n}","import { toRaw } from 'vue'\nimport { deepClone } from '../utils/deep-clone'\n\nimport type { StateTree } from 'pinia'\nimport type { CreateStateSnapshotKeys } from '../types/plugin'\n\n\nexport function createStateSnapshot(state: StateTree, keys: CreateStateSnapshotKeys = 'all') {\n if (Array.isArray(keys)) {\n const clonedState: Partial<StateTree> = {}\n for (const key of keys) {\n if (key in state) {\n clonedState[key] = deepClone(toRaw(state[key]))\n }\n }\n return clonedState\n }\n\n if (keys !== 'all') {\n throw new Error(`Invalid keys parameter: ${keys}`)\n }\n\n return deepClone(toRaw(state))\n}","import { createStateSnapshot } from \"../factories/state-snapshot\"\nimport { getActionStoreKey, hasDeniedFirstChar } from '../utils/store'\n\nimport type { PiniaPluginContext, StateTree, Store } from 'pinia'\nimport type { AnyObject } from '../types'\nimport type { CreateStateSnapshotKeys } from '../types/plugin'\nimport type { RollbackActionParams } from '../types/store'\n\n\n/**\n * Handles rollback state snapshots for Pinia stores.\n * This class provides methods to add rollback actions to stores,\n * create rollback snapshots, and manage the state snapshots internally.\n */\nexport default class RollbackStateSnapshotsHandler {\n private _stateSnapshots: Map<symbol, StateTree> = new Map()\n private _storeHasRollbackSnapshots: Set<string> = new Set()\n private _storeRollbackSnapshotsParams: Map<string, CreateStateSnapshotKeys> = new Map()\n\n\n /**\n * Adds a rollback action to the given store.\n * This method extends the store with a $rollbackAfterFailure function that handles rollback logic for actions.\n * The action arguments are forwarded through apply(), so they must be provided as a single array.\n * @param {Store} store The store to which the rollback action will be added.\n * @returns void\n */\n addRollbackAction(store: Store): void {\n if (typeof store.$rollbackAfterFailure === 'function') {\n return\n }\n\n store.$rollbackAfterFailure = async ({ action, stateKeys }: RollbackActionParams, args: any[] = []) => {\n const actionFn = (store as AnyObject)[action]\n if (typeof actionFn !== 'function' || hasDeniedFirstChar(action)) {\n return\n }\n\n const keys: CreateStateSnapshotKeys = !stateKeys || stateKeys.length === 0 ? 'all' : stateKeys\n\n const snapshotKey = this.saveStateSnapshot(store, action, keys)\n try {\n await actionFn.apply(store, args)\n } catch (error) {\n this.patchStore(snapshotKey, store)\n throw error\n } finally {\n this.removeStateSnapshot(snapshotKey)\n }\n }\n }\n\n /**\n * Creates a rollback snapshot for the specified action and store.\n * This snapshot can be used to restore the store's state in case of an error during the action execution.\n * @param {string} actionName The name of the action for which the rollback snapshot is created.\n * @param {Store} store The Pinia store instance.\n * @returns An object containing `after` and `onError` callbacks for handling the rollback, or `undefined` if no snapshot is created.\n */\n createOnActionCallbacks(\n actionName: string,\n store: Store\n ): {\n after: () => void,\n onError: () => void\n } | undefined {\n const stateKeys = this._storeRollbackSnapshotsParams.get(\n getActionStoreKey(actionName, store)\n )\n\n if (!stateKeys) {\n return\n }\n\n const keys: CreateStateSnapshotKeys = stateKeys.length === 0 ? 'all' : stateKeys\n const snapshotKey = this.saveStateSnapshot(store, actionName, keys)\n\n return {\n after: () => { this.removeStateSnapshot(snapshotKey) },\n onError: () => {\n this.patchStore(snapshotKey, store)\n this.removeStateSnapshot(snapshotKey)\n }\n }\n }\n\n /**\n * Initializes the rollback state snapshots handler from the given Pinia plugin context.\n * This method extracts the rollback snapshot parameters from the store options and stores them internally.\n * @param {PiniaPluginContext} param0 The Pinia plugin context containing the store and its options.\n * @returns void\n */\n initFromPluginContext({ options, store }: PiniaPluginContext) {\n const rollbackSnapshotParams = options?.storeOptions?.rollbackAfterFailure as Record<string, CreateStateSnapshotKeys>\n if (rollbackSnapshotParams && !this._storeHasRollbackSnapshots.has(store.$id)) {\n Object.keys(rollbackSnapshotParams).forEach(key => {\n this._storeRollbackSnapshotsParams.set(\n getActionStoreKey(key, store),\n rollbackSnapshotParams[key]\n )\n })\n this._storeHasRollbackSnapshots.add(store.$id)\n }\n this.addRollbackAction(store)\n }\n\n /**\n * Clears all rollback tracking data for the given store.\n * Must be called when the store is disposed to avoid memory leaks with dynamically created stores.\n * @param {Store} store The disposed Pinia store instance.\n * @returns void\n */\n clearStoreTracking(store: Store): void {\n const suffix = `-${store.$id}`\n\n for (const key of Array.from(this._storeRollbackSnapshotsParams.keys())) {\n if (key.endsWith(suffix)) {\n this._storeRollbackSnapshotsParams.delete(key)\n }\n }\n\n this._storeHasRollbackSnapshots.delete(store.$id)\n\n for (const snapshotKey of Array.from(this._stateSnapshots.keys())) {\n if (snapshotKey.description?.startsWith(`${store.$id}:`)) {\n this._stateSnapshots.delete(snapshotKey)\n }\n }\n }\n\n private patchStore(snapshotKey: symbol, store: Store): void {\n const stateSnapshot = this._stateSnapshots.get(snapshotKey)\n if (!stateSnapshot) {\n return\n }\n\n try {\n store.$patch(stateSnapshot)\n } catch (error) {\n console.error(`Failed to patch store with snapshot ${String(snapshotKey)}`, error)\n }\n }\n\n /**\n * Removes a state snapshot identified by the given snapshot key from the internal state snapshot tracking.\n * @param snapshotKey The key of the state snapshot to be removed.\n * @returns void\n */\n private removeStateSnapshot(snapshotKey?: symbol): void {\n if (!snapshotKey) {\n return\n }\n\n this._stateSnapshots.delete(snapshotKey)\n }\n\n /**\n * Saves the current state snapshot for a given store and action.\n * @param store The Pinia store instance.\n * @param actionName The name of the action being executed.\n * @param stateKeys The state keys to include in the snapshot, or 'all' for the full state.\n * @returns A unique symbol key representing the saved snapshot.\n */\n private saveStateSnapshot(store: Store, actionName: string, stateKeys: CreateStateSnapshotKeys): symbol {\n const stateSnapshot = createStateSnapshot(\n store.$state,\n stateKeys\n )\n\n const snapshotKey = Symbol(`${store.$id}:${actionName}`)\n this._stateSnapshots.set(snapshotKey, stateSnapshot)\n return snapshotKey\n }\n\n /**\n * Checks if the given store has rollback snapshots.\n * @param store The Pinia store instance.\n * @returns True if the store has rollback snapshots, false otherwise.\n */\n storeHasRollbackSnapshots(store: Store): boolean {\n return this._storeHasRollbackSnapshots.has(store.$id)\n }\n}","import RollbackStateSnapshotsHandler from \"./RollbackStateSnapshotsHandler\"\nimport { deepClone } from '../utils/deep-clone'\nimport { getActionStoreKey } from '../utils/store'\nimport Tracer from \"../system/Tracer\"\nimport { isEmpty } from \"../utils/validation\"\nimport { pluginName } from \"../utils/constantes\"\n\nimport type { PiniaPluginContext, StateTree, Store, SubscriptionCallbackMutation } from \"pinia\"\nimport type { AnyObject } from \"../types\"\nimport type { TracePayload } from \"../types/trace\"\nimport type {\n PluginExecutionOptions,\n PluginHydrationScheduler,\n PluginRuntimeEnvironment,\n PluginSubscriber,\n PluginSubscription as PluginSubscriptionDefinition,\n PluginSubscriptionOptions,\n PluginSubscriptions,\n StoreMutationSubscription,\n StoreOnActionAfterCallbackParameter,\n StoreOnActionSubscriptionCallback\n} from \"../types/plugin\"\n\n\nconst className = 'PluginSubscription'\nconst defaultPluginExecution: Required<PluginExecutionOptions> = {\n environment: 'both',\n hydration: 'immediate'\n}\n\nfunction defaultHydrationScheduler(callback: () => void): void {\n if (typeof window !== 'undefined' && typeof window.requestAnimationFrame === 'function') {\n window.requestAnimationFrame(() => globalThis.setTimeout(callback, 0))\n return\n }\n\n globalThis.setTimeout(callback, 0)\n}\n\nexport default class PluginSubscription {\n protected _className: string = className\n private _hydrationScheduler: PluginHydrationScheduler\n private _onActionSubscriptions: Map<Store, Set<StoreOnActionSubscriptionCallback>> = new Map()\n private _onActionStores: Set<Store> = new Set()\n private _onActionAfterSubscriptions: Record<string, StoreOnActionAfterCallbackParameter[]> = {}\n private _onActionOnErrorSubscriptions: Record<string, Array<(error: unknown) => void>> = {}\n private _options?: PluginSubscriptionOptions\n private _resetStoreCallback: Map<Store, Set<NonNullable<PluginSubscriber['resetStoreCallback']>>> = new Map()\n private _disposedStores: WeakSet<Store> = new WeakSet()\n private _storeRollbackSnapshotsHandler: RollbackStateSnapshotsHandler = new RollbackStateSnapshotsHandler()\n private _subscribers: PluginSubscriber[] = []\n private _subscribersDelivered: Set<string> = new Set()\n private _subscribersScheduled: Set<string> = new Set()\n private _subscriptions: PluginSubscriptions[] = []\n private _subscriptionsDelivered: Set<string> = new Set()\n private _subscriptionsScheduled: Set<string> = new Set()\n private _tracer?: Tracer\n\n set subscribers(subscribers: PluginSubscriber[]) {\n this._subscribers = subscribers\n }\n\n get subscriptions(): PluginSubscriptions[] | undefined {\n if (!isEmpty(this._subscriptions)) {\n return this._subscriptions\n }\n }\n\n constructor(\n subscribers: PluginSubscriber[],\n options?: PluginSubscriptionOptions\n ) {\n this._hydrationScheduler = options?.hydrationScheduler ?? defaultHydrationScheduler\n this._options = options\n this._subscribers = subscribers\n this.initializeTracer()\n }\n\n private addOnActionAfterCallback(actionName: string, store: Store, callback: StoreOnActionAfterCallbackParameter): void {\n const key = getActionStoreKey(actionName, store)\n if (!this._onActionAfterSubscriptions[key]) {\n this._onActionAfterSubscriptions[key] = []\n }\n this._onActionAfterSubscriptions[key]?.push(callback)\n }\n\n private addOnActionOnErrorCallback(actionName: string, store: Store, callback: (error: unknown) => void): void {\n const key = getActionStoreKey(actionName, store)\n if (!this._onActionOnErrorSubscriptions[key]) {\n this._onActionOnErrorSubscriptions[key] = []\n }\n this._onActionOnErrorSubscriptions[key]?.push(callback)\n }\n\n private addResetStoreCallback(store: Store, callback: NonNullable<PluginSubscriber['resetStoreCallback']>): void {\n if (!this._resetStoreCallback.has(store)) {\n this._resetStoreCallback.set(store, new Set())\n }\n this._resetStoreCallback.get(store)!.add(callback)\n }\n\n private clearOnActionCallbacksSubscriptions(storageKey: string): void {\n delete this._onActionAfterSubscriptions[storageKey]\n delete this._onActionOnErrorSubscriptions[storageKey]\n }\n\n private clearStoreTracking(store: Store): void {\n this._onActionSubscriptions.delete(store)\n this._onActionStores.delete(store)\n this._resetStoreCallback.delete(store)\n const suffix = `-${store.$id}`\n\n for (const key of Array.from(this._subscribersDelivered)) {\n if (key.endsWith(suffix)) {\n this._subscribersDelivered.delete(key)\n }\n }\n\n for (const key of Array.from(this._subscribersScheduled)) {\n if (key.endsWith(suffix)) {\n this._subscribersScheduled.delete(key)\n }\n }\n\n for (const key of Array.from(this._subscriptionsDelivered)) {\n if (key.endsWith(suffix)) {\n this._subscriptionsDelivered.delete(key)\n }\n }\n\n for (const key of Array.from(this._subscriptionsScheduled)) {\n if (key.endsWith(suffix)) {\n this._subscriptionsScheduled.delete(key)\n }\n }\n\n for (const key of Object.keys(this._onActionAfterSubscriptions)) {\n if (key.endsWith(suffix)) {\n delete this._onActionAfterSubscriptions[key]\n }\n }\n\n for (const key of Object.keys(this._onActionOnErrorSubscriptions)) {\n if (key.endsWith(suffix)) {\n delete this._onActionOnErrorSubscriptions[key]\n }\n }\n }\n\n /**\n * Creates a callback collector for the specified action and store.\n * @param actionName The name of the action to collect callbacks for.\n * @param store The store instance associated with the action.\n * @returns A function that collects callbacks for the specified action and store.\n */\n private createOnActionAfterCallbackCollector(actionName: string, store: Store) {\n return (callback: StoreOnActionAfterCallbackParameter) => {\n this.addOnActionAfterCallback(actionName, store, callback)\n }\n }\n\n /**\n * Creates a callback collector for the specified action and store that handles errors.\n * @param actionName The name of the action to collect error callbacks for.\n * @param store The store instance associated with the action.\n * @returns A function that collects error callbacks for the specified action and store.\n */\n private createOnActionOnErrorCallbackCollector(actionName: string, store: Store) {\n return (callback: (error: unknown) => void) => {\n this.addOnActionOnErrorCallback(actionName, store, callback)\n }\n }\n\n /**\n * Rolls back the state snapshot for a given action if an error occurs, and removes the snapshot after the action completes or fails.\n * @param actionName The name of the action being executed.\n * @param store The Pinia store instance.\n * @returns void\n */\n private createRollbackSnapshot(\n actionName: string,\n store: Store\n ) {\n const {\n after,\n onError\n } = this._storeRollbackSnapshotsHandler.createOnActionCallbacks(\n actionName,\n store\n ) ?? {}\n\n if (!after || !onError) {\n return\n }\n\n this.addOnActionAfterCallback(actionName, store, after)\n this.addOnActionOnErrorCallback(actionName, store, onError)\n }\n\n private defineCurrentEnvironment(): PluginRuntimeEnvironment {\n return this._options?.runtimeEnvironment\n ?? (typeof window === 'undefined' ? 'server' : 'client')\n }\n\n private definePluginExecution(subscriber: PluginSubscriber): Required<PluginExecutionOptions> {\n return {\n ...defaultPluginExecution,\n ...(this._options?.execution ?? {}),\n ...(subscriber.execution ?? {}),\n ...(this._options?.subscriberExecution?.[subscriber.name] ?? {}),\n }\n }\n\n private defineHydrationScheduler(subscriber: PluginSubscriber | PluginSubscriptionDefinition['subscription']): PluginHydrationScheduler {\n return subscriber.hydrationScheduler ?? this._hydrationScheduler\n }\n\n private defineSubscriberKey(subscriber: PluginSubscriber, store: Store): string {\n return `${subscriber.name}-${store.$id}`\n }\n\n private defineSubscriptionKey(pluginName: string, store: Store): string {\n return `${pluginName}-${store.$id}`\n }\n\n private executeResetStoreCallbacks(store: Store): void {\n this._resetStoreCallback.get(store)?.forEach(callback => callback(store))\n }\n\n /**\n * Executes the store's onAction subscription for the given plugin subscriber.\n * @param store The Pinia store instance.\n * @param subscriber The plugin subscriber.\n * @returns void\n */\n private executeStoreOnActionSubscription(store: Store): void {\n if (this._onActionStores.has(store) || typeof store.$onAction !== 'function') {\n return\n }\n const onActionSubscriptions = this._onActionSubscriptions.get(store)\n const hasRollbackSnapshots = this._storeRollbackSnapshotsHandler.storeHasRollbackSnapshots(store)\n\n if (!onActionSubscriptions?.size && !hasRollbackSnapshots) {\n return\n }\n\n this._onActionStores.add(store)\n store.$onAction(({ after, args, name, onError }) => {\n this.traceGroupStart(() => ({ args, name }), store.$id, 'onAction')\n const storageKey = getActionStoreKey(name, store)\n\n if (this._storeRollbackSnapshotsHandler.storeHasRollbackSnapshots(store)) {\n this.createRollbackSnapshot(name, store)\n }\n\n const callbacks = this._onActionSubscriptions.get(store)\n if (callbacks?.size) {\n callbacks.forEach(callback => callback({\n after: this.createOnActionAfterCallbackCollector(name, store),\n args,\n name,\n onError: this.createOnActionOnErrorCallbackCollector(name, store)\n }))\n }\n\n const afterCallbacks = this._onActionAfterSubscriptions[storageKey]\n const onErrorCallbacks = this._onActionOnErrorSubscriptions[storageKey]\n\n this.clearOnActionCallbacksSubscriptions(storageKey)\n\n if (afterCallbacks?.length) {\n after((result) => {\n afterCallbacks.forEach(callback => callback(result))\n this.traceGroupEnd({}, store.$id)\n })\n }\n if (onErrorCallbacks?.length) {\n onError((error) => {\n onErrorCallbacks.forEach(callback => callback(error))\n })\n }\n if (!afterCallbacks?.length) {\n this.traceGroupEnd({}, store.$id)\n }\n })\n }\n\n private executeSubscriber(context: PiniaPluginContext, subscriber: PluginSubscriber): void {\n const subscriberKey = this.defineSubscriberKey(subscriber, context.store)\n\n if (this._subscribersDelivered.has(subscriberKey)) {\n return\n }\n\n if (\n !subscriber.invoke(context, this._options?.tracerHandler?.createTracer)) {\n return\n }\n\n this._subscribersDelivered.add(subscriberKey)\n\n let hydrateResult: void | Promise<void>\n\n try {\n hydrateResult = subscriber.hydrate?.(context)\n } catch (error) {\n this.traceError('subscriber:hydrate', error, context.store.$id)\n return\n }\n\n const runAfterHydration = () => {\n try {\n const afterHydration = subscriber.afterHydration?.(context)\n if (afterHydration && typeof (afterHydration as Promise<void>).then === 'function') {\n ; (afterHydration as Promise<void>).catch(\n error => this.traceError('subscriber:afterHydration', error, context.store.$id)\n )\n }\n } catch (error) {\n this.traceError('subscriber:afterHydration', error, context.store.$id)\n }\n }\n\n if (hydrateResult && typeof (hydrateResult as Promise<void>).then === 'function') {\n ; (hydrateResult as Promise<void>)\n .then(() => runAfterHydration())\n .catch(error => this.traceError('subscriber:hydrate', error, context.store.$id))\n } else {\n runAfterHydration()\n }\n\n if (subscriber.subscriptions) {\n this.subscriptionDelivery(context, subscriber.subscriptions)\n }\n\n if (subscriber.storeMutationSubscription) {\n this.storeMutationSubscription(subscriber.storeMutationSubscription)\n }\n\n this.storeOnActionSubscription(subscriber)\n\n if (subscriber.resetStoreCallback) {\n this.addResetStoreCallback(context.store, subscriber.resetStoreCallback)\n }\n }\n\n private executeSubscriberSafely(context: PiniaPluginContext, subscriber: PluginSubscriber): void {\n try {\n this.executeSubscriber(context, subscriber)\n } catch (e) {\n this.traceError('subscriber:execute', e, context.store.$id)\n }\n }\n\n private initializeTracer() {\n if (this._options?.tracerHandler) {\n this._tracer = this._options.tracerHandler.createTracer(pluginName)\n }\n }\n\n /**\n * Invokes the plugin with the given Pinia plugin context, executing all relevant subscribers safely.\n * @param param0 The Pinia plugin context containing the store and options.\n * @param param0.store The Pinia store instance.\n * @param param0.options The options passed to the Pinia store.\n * @returns void\n */\n plugin({ store, options }: PiniaPluginContext) {\n if (!this._subscribers.length) {\n return\n }\n\n this.traceGroupStart(() => ({\n subscribers: this._subscribers,\n store,\n options\n }), store.$id)\n\n try {\n this._subscribers.forEach(\n subscriber => {\n const subscriberKey = this.defineSubscriberKey(subscriber, store)\n const execution = this.definePluginExecution(subscriber)\n\n if (\n this._subscribersDelivered.has(subscriberKey)\n || this._subscribersScheduled.has(subscriberKey)\n ) {\n return\n }\n\n if (!this.shouldInvokePlugin(execution)) {\n return\n }\n\n if (this.shouldScheduleAfterHydration(execution)) {\n this.queueSubscriberExecution({ store, options } as PiniaPluginContext, subscriber, subscriberKey)\n return\n }\n\n this.executeSubscriber({ store, options } as PiniaPluginContext, subscriber)\n }\n )\n\n this.rewriteResetStore({ store } as PiniaPluginContext, store.$state)\n this._storeRollbackSnapshotsHandler.initFromPluginContext({ store, options } as PiniaPluginContext)\n this.executeStoreOnActionSubscription(store)\n this.registerStoreCleanup(store)\n } catch (e) {\n this.traceError('plugin:invoke', e, store.$id)\n }\n this.traceGroupEnd(() => ({}), store.$id)\n }\n\n private queueSubscriberExecution(\n context: PiniaPluginContext,\n subscriber: PluginSubscriber,\n subscriberKey: string\n ): void {\n const scheduler = this.defineHydrationScheduler(subscriber)\n\n this._subscribersScheduled.add(subscriberKey)\n scheduler(() => {\n if (this._disposedStores.has(context.store)) {\n return\n }\n this._subscribersScheduled.delete(subscriberKey)\n this.executeSubscriberSafely(context, subscriber)\n })\n }\n\n private registerStoreCleanup(store: Store): void {\n if (typeof store.$dispose !== 'function') {\n return\n }\n\n const dispose = store.$dispose.bind(store)\n const scopedStore = store as AnyObject\n\n if (scopedStore.__piniaPluginSubscriptionDisposed) {\n return\n }\n\n scopedStore.__piniaPluginSubscriptionDisposed = true\n store.$dispose = () => {\n this._disposedStores.add(store)\n this.clearStoreTracking(store)\n this._storeRollbackSnapshotsHandler.clearStoreTracking(store)\n return dispose()\n }\n }\n\n private rewriteResetStore({ store }: PiniaPluginContext, initState: StateTree): void {\n const safeState = deepClone(initState)\n\n store.$reset = () => {\n this.trace('store:reset', store.$id, () => ({ initialState: safeState }))\n this.executeResetStoreCallbacks(store)\n store.$patch(deepClone(safeState))\n }\n }\n\n private shouldInvokePlugin(execution: Required<PluginExecutionOptions>): boolean {\n const currentEnvironment = this.defineCurrentEnvironment()\n\n return execution.environment === 'both' || execution.environment === currentEnvironment\n }\n\n private shouldScheduleAfterHydration(execution: Required<PluginExecutionOptions>): boolean {\n return this.defineCurrentEnvironment() === 'client' && execution.hydration === 'defer'\n }\n\n private storeOnActionSubscription(subscriber: PluginSubscriber): void {\n const { store, callback } = subscriber?.storeOnActionSubscription?.() ?? {}\n\n if (!store || !callback) {\n return\n }\n\n if (!this._onActionSubscriptions.has(store)) {\n this._onActionSubscriptions.set(store, new Set())\n }\n this._onActionSubscriptions.get(store)!.add(callback)\n this.executeStoreOnActionSubscription(store)\n }\n\n private storeMutationSubscription(subscription: StoreMutationSubscription): void {\n const { store, callback } = subscription()\n\n store.$subscribe((mutation: SubscriptionCallbackMutation<StateTree>) => {\n this.traceGroupStart(() => ({ mutation }), store.$id, 'store:mutation')\n callback(mutation)\n this.traceGroupEnd({}, store.$id)\n })\n }\n\n private subscriptionDelivery(\n context: PiniaPluginContext,\n pluginSubscriptions: PluginSubscriptions\n ): void {\n Object.entries(pluginSubscriptions).forEach(([pluginName, pluginSubscription]) => {\n const subscriptionKey = this.defineSubscriptionKey(pluginName, context.store)\n const execution = this.definePluginExecution(pluginSubscription.subscription)\n\n if (\n this._subscriptionsDelivered.has(subscriptionKey)\n || this._subscriptionsScheduled.has(subscriptionKey)\n ) {\n return\n }\n\n if (!this.shouldInvokePlugin(execution)) {\n return\n }\n\n if (this.shouldScheduleAfterHydration(execution)) {\n const scheduler = this.defineHydrationScheduler(pluginSubscription.subscription)\n\n this._subscriptionsScheduled.add(subscriptionKey)\n scheduler(() => {\n if (this._disposedStores.has(context.store)) {\n return\n }\n this._subscriptionsScheduled.delete(subscriptionKey)\n this.subscriptionDeliverySafely(context, pluginName, pluginSubscription)\n })\n return\n }\n\n this.subscriptionDeliverySafely(context, pluginName, pluginSubscription)\n })\n }\n\n private subscriptionDeliverySafely(\n { store, options }: PiniaPluginContext,\n pluginName: string,\n pluginSubscription: PluginSubscriptionDefinition\n ): void {\n try {\n if (this._subscriptionsDelivered.has(this.defineSubscriptionKey(pluginName, store))) {\n return\n }\n\n const { subscription, subscriptionOptions, stores } = pluginSubscription\n\n this.trace('Subscription:delivery', store.$id, () => ({\n pluginName,\n subscription,\n subscriptionOptions\n }))\n\n const pluginOptions = {\n storeOptions: { ...(options?.storeOptions ?? {}), ...subscriptionOptions }\n }\n\n subscription.invoke(\n { store, options: { ...options, ...pluginOptions } } as PiniaPluginContext\n )\n this._subscriptionsDelivered.add(this.defineSubscriptionKey(pluginName, store))\n\n if (!isEmpty(stores)) {\n stores?.forEach(\n store => subscription.invoke({\n store,\n options: {\n ...options,\n ...pluginOptions,\n ...((store as AnyObject)?.storeOptions ?? {})\n }\n } as PiniaPluginContext)\n )\n }\n } catch (e) {\n this.traceError('subscription:delivery', e, store.$id)\n }\n }\n\n /**\n * Emits a structured trace event.\n * Prefer the factory form for `payload`: it is only resolved when consumed.\n */\n private trace(label: string, scope?: string, payload?: TracePayload): void {\n if (this._tracer) {\n label = this._className + ':' + label\n\n this._tracer.debug(label, label.toLowerCase(), payload, scope)\n }\n }\n\n /**\n * Emits a structured error event, or rethrows it when no listener matches.\n */\n private traceError(label: string, error: unknown, scope?: string, payload?: TracePayload): void {\n if (this._tracer) {\n label = this._className + ':' + label\n this._tracer.error(label, label.toLowerCase(), error, payload, scope)\n } else {\n console.error(error)\n }\n }\n\n private traceGroupEnd(payload: TracePayload, scope: string): void {\n if (this._options?.tracerHandler) {\n this._options.tracerHandler.closeGroup({ ...(typeof payload === 'function' ? payload() : payload), scope })\n }\n }\n\n private traceGroupStart(payload: TracePayload, scope: string, label?: string): void {\n if (this._options?.tracerHandler) {\n this._options.tracerHandler.startGroup({ ...(typeof payload === 'function' ? payload() : payload), scope })\n this.trace(label ?? 'context', scope, payload)\n }\n }\n}"],"names":["deepClone","value","key","entryValue","item","clonedObject","createStateSnapshot","state","keys","clonedState","toRaw","RollbackStateSnapshotsHandler","__publicField","store","action","stateKeys","args","actionFn","hasDeniedFirstChar","snapshotKey","error","actionName","getActionStoreKey","options","rollbackSnapshotParams","suffix","stateSnapshot","className","defaultPluginExecution","defaultHydrationScheduler","callback","PluginSubscription","subscribers","isEmpty","storageKey","after","onError","subscriber","pluginName2","onActionSubscriptions","hasRollbackSnapshots","name","callbacks","afterCallbacks","onErrorCallbacks","result","context","pluginName","subscriberKey","hydrateResult","runAfterHydration","afterHydration","e","execution","scheduler","dispose","scopedStore","initState","safeState","currentEnvironment","subscription","mutation","pluginSubscriptions","pluginSubscription","subscriptionKey","subscriptionOptions","stores","pluginOptions","store2","label","scope","payload","createPlugin","createHydrationPlugin","hydrationPlugin"],"mappings":"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"}
@@ -382,12 +382,12 @@ class CartStore extends Store {
382
382
  }
383
383
  ```
384
384
 
385
- `createTracerRegistry()` and `createConsoleTraceListener()` are available
386
- from `pinia-plugin-subscription/helpers`. Register listeners on a registry
387
- and pass its `createTracer` factory through `createPlugin()` options to
388
- connect them to plugin and store events. Listener filters can be callbacks
389
- over event metadata or criteria using `equals`, `contains`, `startsWith` and
390
- `endsWith` comparisons.
385
+ `createTraceGroupsRegistry()` is available from
386
+ `pinia-plugin-subscription/helpers`. Register event criteria with
387
+ `addListener()` and pass the registry's `tracerHandler` through
388
+ `createPlugin()` options to group plugin and store events in the console.
389
+ Criteria target event metadata and support `equals`, `contains`, `startsWith`
390
+ and `endsWith` comparisons.
391
391
 
392
392
  ## Typing per-store options: `StoreOptionsExtensions` (TypeScript)
393
393
 
@@ -319,39 +319,33 @@ Register listeners independently from plugin construction:
319
319
 
320
320
  ```js
321
321
  import {
322
- createConsoleTraceListener,
323
- createTracerRegistry
322
+ createTraceGroupsRegistry
324
323
  } from 'pinia-plugin-subscription/helpers'
325
324
  import {
326
325
  createPlugin
327
326
  } from 'pinia-plugin-subscription'
328
327
 
329
- const traceRegistry = createTracerRegistry()
328
+ const traceGroupsRegistry = createTraceGroupsRegistry()
330
329
 
331
- traceRegistry.addTraceListener({
332
- ...createConsoleTraceListener(),
333
- filter: event => event.scope === 'cart'
334
- })
330
+ traceGroupsRegistry.addListener([
331
+ { target: 'scope', value: 'cart' }
332
+ ])
335
333
 
336
334
  pinia.use(createPlugin([myStoreSubscriber], {
337
- createTracer: traceRegistry.createTracer
335
+ tracerHandler: traceGroupsRegistry.tracerHandler
338
336
  }))
339
337
  ```
340
338
 
341
- Filters run in real time and can target a source, namespace, store scope, or
342
- trace level without passing diagnostic options through subscribers.
343
- You can also use comparison criteria (`equals`, `contains`, `startsWith` or
344
- `endsWith`) instead of a filter callback; criteria are combined with `every`
345
- by default or `some` when requested. If criteria are provided without a
346
- handler, the registry uses its styled console listener.
339
+ The registry groups matching events by store scope by default. Criteria can
340
+ target a source, namespace, store scope, or trace level and support the
341
+ `equals`, `contains`, `startsWith` and `endsWith` comparators. Criteria use
342
+ `every` by default; pass `{ filterMode: 'some' }` to match any criterion.
347
343
 
348
344
  ```js
349
- traceRegistry.addTraceListener({
350
- filter: [
351
- { target: 'scope', value: 'cart' },
352
- { target: 'namespace', comparator: 'startsWith', value: 'pluginsubscription:subscription:' }
353
- ]
354
- }, 'every')
345
+ traceGroupsRegistry.addListener([
346
+ { target: 'scope', value: 'cart' },
347
+ { target: 'namespace', comparator: 'startsWith', value: 'pluginsubscription:subscription:' }
348
+ ], { filterMode: 'every', groupBy: 'scope' })
355
349
  ```
356
350
 
357
351
  ## SSR / Nuxt
@@ -371,18 +365,18 @@ finishes.
371
365
  import { createSSRApp } from 'vue'
372
366
  import { createPinia } from 'pinia'
373
367
  import { createPlugin } from 'pinia-plugin-subscription'
374
- import { createTracerRegistry } from 'pinia-plugin-subscription/helpers'
368
+ import { createTraceGroupsRegistry } from 'pinia-plugin-subscription/helpers'
375
369
  import App from './App.vue'
376
370
  import { subscribers } from './subscribers'
377
371
 
378
- export function createRequestApp(traceListener) {
372
+ export function createRequestApp(traceCriteria) {
379
373
  const app = createSSRApp(App)
380
374
  const pinia = createPinia()
381
- const traceRegistry = createTracerRegistry()
375
+ const traceGroupsRegistry = createTraceGroupsRegistry()
382
376
 
383
- traceRegistry.addTraceListener(traceListener)
377
+ traceGroupsRegistry.addListener(traceCriteria)
384
378
  pinia.use(createPlugin(subscribers, {
385
- createTracer: traceRegistry.createTracer
379
+ tracerHandler: traceGroupsRegistry.tracerHandler
386
380
  }))
387
381
  app.use(pinia)
388
382
 
@@ -391,7 +385,7 @@ export function createRequestApp(traceListener) {
391
385
  ```
392
386
 
393
387
  Call `createRequestApp()` once for each incoming SSR request. The request's
394
- listener is then reachable only through that request's registry and plugin.
388
+ trace criteria are then registered only in that request's registry and plugin.
395
389
 
396
390
  When a plugin needs a runtime-specific scheduler or environment override —
397
391
  without forcing every app to re-declare the plugin's execution policy —
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pinia-plugin-subscription",
3
- "version": "1.0.0-beta.3",
3
+ "version": "1.0.0-beta.4",
4
4
  "description": "Pinia plugin for Vue.js that helps building Pinia plugins by centralizing subscriber registration and providing a Store base class for store helpers.",
5
5
  "type": "module",
6
6
  "sideEffects": false,