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 +1 -0
- package/README.md +30 -46
- package/dist/helpers/index.d.ts +2 -2
- package/dist/helpers.js +220 -150
- package/dist/helpers.js.map +1 -1
- package/dist/pinia-plugin-subscription.js +4 -4
- package/dist/pinia-plugin-subscription.js.map +1 -1
- package/docs/authoring-plugins.md +6 -6
- package/docs/using-plugins.md +20 -26
- package/package.json +1 -1
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
|
|
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 {
|
|
226
|
+
import { createTraceGroupsRegistry } from 'pinia-plugin-subscription/helpers'
|
|
227
227
|
|
|
228
|
-
const
|
|
229
|
-
const remove =
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
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
|
-
|
|
235
|
+
tracerHandler: traceGroupsRegistry.tracerHandler
|
|
237
236
|
}))
|
|
238
237
|
|
|
239
238
|
remove() // unsubscribe
|
|
240
239
|
```
|
|
241
240
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
296
|
+
### Grouped console output
|
|
304
297
|
|
|
305
|
-
Normal trace events do not write to a console.
|
|
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
|
-
|
|
304
|
+
const traceGroupsRegistry = createTraceGroupsRegistry()
|
|
305
|
+
traceGroupsRegistry.addListener([{ target: 'scope', value: 'cart' }])
|
|
321
306
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
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.
|
package/dist/helpers/index.d.ts
CHANGED
|
@@ -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
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import { p as
|
|
5
|
-
import { P, S as
|
|
6
|
-
const
|
|
7
|
-
function
|
|
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((
|
|
22
|
-
|
|
23
|
-
}) : r.forEach((
|
|
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
|
-
`[ ${
|
|
28
|
-
|
|
27
|
+
`[ ${n} ]`,
|
|
28
|
+
t
|
|
29
29
|
);
|
|
30
30
|
});
|
|
31
31
|
else {
|
|
32
|
-
let
|
|
33
|
-
Object.keys(r).forEach((
|
|
34
|
-
const
|
|
35
|
-
typeof
|
|
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
|
-
`[ ${
|
|
39
|
-
|
|
40
|
-
) :
|
|
41
|
-
}),
|
|
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
|
-
|
|
45
|
+
t
|
|
46
46
|
);
|
|
47
47
|
}
|
|
48
48
|
console.groupEnd();
|
|
49
49
|
}
|
|
50
|
-
function
|
|
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
|
|
55
|
-
if (
|
|
56
|
-
switch (typeof
|
|
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
|
-
|
|
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(
|
|
68
|
+
console.groupCollapsed("[mutation]"), console.dir(o), console.groupEnd();
|
|
69
69
|
break;
|
|
70
70
|
case "options":
|
|
71
|
-
|
|
71
|
+
f(r, o?.storeOptions ?? o);
|
|
72
72
|
break;
|
|
73
73
|
case "payload":
|
|
74
|
-
|
|
74
|
+
h(o);
|
|
75
75
|
break;
|
|
76
76
|
case "store":
|
|
77
|
-
|
|
78
|
-
$state:
|
|
79
|
-
...Object.keys(
|
|
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
|
-
|
|
83
|
+
f(r, o);
|
|
84
84
|
}
|
|
85
85
|
break;
|
|
86
86
|
case "function":
|
|
87
|
-
console.dir(
|
|
87
|
+
console.dir(o);
|
|
88
88
|
break;
|
|
89
89
|
default:
|
|
90
|
-
console.info(
|
|
90
|
+
console.info(o);
|
|
91
91
|
}
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
|
-
function
|
|
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
|
|
104
|
+
function L(e, r, o) {
|
|
105
105
|
if (!e)
|
|
106
106
|
throw new Error("Style instructions are required");
|
|
107
|
-
const
|
|
108
|
-
if (!
|
|
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
|
-
`${
|
|
113
|
-
|
|
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
|
-
`${
|
|
120
|
+
`${i}
|
|
121
121
|
`,
|
|
122
|
-
|
|
123
|
-
), r.forEach((
|
|
124
|
-
switch (typeof
|
|
122
|
+
t?.source
|
|
123
|
+
), r.forEach((n) => {
|
|
124
|
+
switch (typeof n) {
|
|
125
125
|
case "string":
|
|
126
|
-
console.info(
|
|
126
|
+
console.info(n);
|
|
127
127
|
break;
|
|
128
128
|
case "object":
|
|
129
|
-
Array.isArray(
|
|
129
|
+
Array.isArray(n) ? console.table(n) : h(n);
|
|
130
130
|
break;
|
|
131
131
|
case "function":
|
|
132
|
-
console.dir(
|
|
132
|
+
console.dir(n);
|
|
133
133
|
break;
|
|
134
134
|
default:
|
|
135
|
-
console.info(
|
|
135
|
+
console.info(n);
|
|
136
136
|
}
|
|
137
137
|
}), console.groupEnd();
|
|
138
138
|
}
|
|
139
|
-
class
|
|
139
|
+
class w {
|
|
140
140
|
constructor() {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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,
|
|
154
|
-
return 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
|
|
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,
|
|
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,
|
|
183
|
-
|
|
182
|
+
useLog(r, o) {
|
|
183
|
+
T(
|
|
184
184
|
this.generateStyle(r),
|
|
185
|
-
this.rebuildArgs(
|
|
185
|
+
this.rebuildArgs(o, r.icon)
|
|
186
186
|
);
|
|
187
187
|
}
|
|
188
188
|
}
|
|
189
|
-
class
|
|
190
|
-
constructor(
|
|
189
|
+
class b extends w {
|
|
190
|
+
constructor(o) {
|
|
191
191
|
super();
|
|
192
|
-
|
|
193
|
-
|
|
192
|
+
a(this, "_pluginName", A);
|
|
193
|
+
o && (this._pluginName = o);
|
|
194
194
|
}
|
|
195
|
-
logGroup(
|
|
196
|
-
const
|
|
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
|
-
`[ 🍍 ${
|
|
201
|
-
),
|
|
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
|
-
),
|
|
205
|
+
), o.forEach((n) => this.log(...n)), console.groupEnd(), console.groupEnd();
|
|
206
206
|
}
|
|
207
|
-
useLog(
|
|
208
|
-
|
|
209
|
-
this.generateStyle(
|
|
210
|
-
this.rebuildArgs(
|
|
207
|
+
useLog(o, i) {
|
|
208
|
+
L(
|
|
209
|
+
this.generateStyle(o),
|
|
210
|
+
this.rebuildArgs(i, o.icon)
|
|
211
211
|
);
|
|
212
212
|
}
|
|
213
213
|
}
|
|
214
|
-
function
|
|
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
|
|
224
|
-
constructor(r,
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
this._scope =
|
|
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,
|
|
240
|
-
this.emit("debug", r,
|
|
239
|
+
debug(r, o, i, t) {
|
|
240
|
+
this.emit("debug", r, o, i, t);
|
|
241
241
|
}
|
|
242
|
-
error(r,
|
|
243
|
-
this.emit("error", r,
|
|
242
|
+
error(r, o, i, t, n) {
|
|
243
|
+
this.emit("error", r, o, t, n, i);
|
|
244
244
|
}
|
|
245
|
-
emit(r,
|
|
245
|
+
emit(r, o, i, t, n, s) {
|
|
246
246
|
if (this._listeners.length === 0) {
|
|
247
|
-
r === "error" && console.error("Unhandled error trace event:",
|
|
247
|
+
r === "error" && console.error("Unhandled error trace event:", s);
|
|
248
248
|
return;
|
|
249
249
|
}
|
|
250
|
-
const
|
|
251
|
-
label:
|
|
250
|
+
const c = {
|
|
251
|
+
label: o,
|
|
252
252
|
level: r,
|
|
253
|
-
namespace:
|
|
254
|
-
scope:
|
|
253
|
+
namespace: i,
|
|
254
|
+
scope: n ?? this._scope,
|
|
255
255
|
source: this._source
|
|
256
|
-
},
|
|
256
|
+
}, l = this._listeners.filter((p) => {
|
|
257
257
|
try {
|
|
258
|
-
return
|
|
259
|
-
} catch (
|
|
260
|
-
return console.error("Error in trace listener filter:",
|
|
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 (
|
|
264
|
-
r === "error" && console.error("Unhandled error trace event:",
|
|
263
|
+
if (l.length === 0) {
|
|
264
|
+
r === "error" && console.error("Unhandled error trace event:", s);
|
|
265
265
|
return;
|
|
266
266
|
}
|
|
267
|
-
const
|
|
268
|
-
...
|
|
269
|
-
...
|
|
270
|
-
...
|
|
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
|
|
273
|
+
for (const p of l)
|
|
274
274
|
try {
|
|
275
|
-
|
|
276
|
-
} catch (
|
|
277
|
-
console.error("Error in trace listener:",
|
|
275
|
+
p.handler(u);
|
|
276
|
+
} catch (g) {
|
|
277
|
+
console.error("Error in trace listener:", g);
|
|
278
278
|
}
|
|
279
279
|
}
|
|
280
280
|
}
|
|
281
|
-
function
|
|
282
|
-
const r = Object.keys(e).reduce((
|
|
283
|
-
return [
|
|
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
|
|
285
|
+
function G(e) {
|
|
286
286
|
return e.scope ? `${e.label} [${e.scope}]` : `${e.label}`;
|
|
287
287
|
}
|
|
288
|
-
function
|
|
289
|
-
const
|
|
290
|
-
e[
|
|
288
|
+
function m(e, r) {
|
|
289
|
+
const o = r.level === "error" ? "error" : "log";
|
|
290
|
+
e[o](..._(r));
|
|
291
291
|
}
|
|
292
|
-
function
|
|
293
|
-
return e || (e = new
|
|
292
|
+
function O(e) {
|
|
293
|
+
return e || (e = new b()), {
|
|
294
294
|
handler(r) {
|
|
295
|
-
|
|
295
|
+
m(e, r);
|
|
296
296
|
}
|
|
297
297
|
};
|
|
298
298
|
}
|
|
299
|
-
function
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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
|
-
|
|
332
|
+
c = s === n;
|
|
307
333
|
break;
|
|
308
334
|
case "contains":
|
|
309
|
-
|
|
335
|
+
c = s.includes(n);
|
|
310
336
|
break;
|
|
311
337
|
case "startsWith":
|
|
312
|
-
|
|
338
|
+
c = s.startsWith(n);
|
|
313
339
|
break;
|
|
314
340
|
case "endsWith":
|
|
315
|
-
|
|
341
|
+
c = s.endsWith(n);
|
|
316
342
|
break;
|
|
317
343
|
default:
|
|
318
|
-
|
|
344
|
+
c = !1;
|
|
319
345
|
break;
|
|
320
346
|
}
|
|
321
|
-
return
|
|
347
|
+
return c;
|
|
322
348
|
});
|
|
323
349
|
}
|
|
324
|
-
function
|
|
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:
|
|
327
|
-
}), e.filter && Array.isArray(e.filter) && (e.filter =
|
|
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
|
|
330
|
-
return 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(
|
|
335
|
-
return (!
|
|
336
|
-
const
|
|
337
|
-
|
|
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
|
|
373
|
+
function o() {
|
|
341
374
|
e = [];
|
|
342
375
|
}
|
|
343
|
-
function
|
|
376
|
+
function i() {
|
|
344
377
|
return e.length > 0;
|
|
345
378
|
}
|
|
346
379
|
return {
|
|
347
380
|
addTraceListener: r,
|
|
348
|
-
clearTraceListeners:
|
|
349
|
-
createTracer: (
|
|
350
|
-
hasTraceListeners:
|
|
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
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
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
|
};
|
package/dist/helpers.js.map
CHANGED
|
@@ -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":";;;;;AAMA,MAAMA,IAAQ,CAACC,GAAiBC,IAAgB,YAC5C,qBAAqBD,CAAO,YAAYC,CAAK;AAE1C,SAASC,EAAYC,GAAeC,GAAiB;AAGxD,MAFgB,MAAM,QAAQA,CAAO,IACXA,EAAQ,WAAW,IAAI,OAAO,KAAKA,CAAO,EAAE,WAAW,GACpE;AACT,YAAQ;AAAA,MACJ;AAAA,MACA;AAAA,MACA,KAAKD,CAAK;AAAA,IAAA;AAEd;AAAA,EACJ;AAOA,MALA,QAAQ;AAAA,IACJ;AAAA,IACA;AAAA,IACA,KAAKA,CAAK;AAAA,EAAA,GAEV,MAAM,QAAQC,CAAO;AACrB,IAAI,OAAOA,EAAQ,CAAC,KAAM,WACtBA,EAAQ,QAAQ,CAACC,MAAc;AAC3B,MAAIA,EAAK,QACLH,EAAYG,EAAK,OAAOA,CAAI,IACrBA,EAAK,MACZH,EAAYG,EAAK,KAAKA,CAAI,IAE1B,QAAQ,IAAIA,CAAI;AAAA,IAExB,CAAC,IAEDD,EAAQ,QAAQ,CAACC,GAAWC,MAAkB;AAC1C,cAAQ;AAAA,QACJ;AAAA,QACA;AAAA,QACA,KAAKA,CAAK;AAAA,QAAMD;AAAA,MAAA;AAAA,IAExB,CAAC;AAAA,OAEF;AACH,QAAIE,IAAsB,CAAA;AAC1B,WAAO,KAAKH,CAAO,EAAE,QAAQ,CAAAI,MAAO;AAChC,YAAMC,IAASL,EAAoCI,CAAG;AACtD,MAAI,OAAOC,KAAU,WACb,MAAM,QAAQA,CAAK,IACf,OAAOA,EAAM,CAAC,KAAM,WACpBP,EAAYM,GAAKC,CAAK,KAEtB,QAAQ,eAAeD,CAAG,GAC1B,QAAQ,IAAIC,CAAK,GACjB,QAAQ,SAAA,KAGZP,EAAYM,GAAK,OAAO,OAAO,CAAA,GAAIC,CAAK,CAAC,IAGxCA,IAGD,QAAQ;AAAA,QACJ;AAAA,QACA;AAAA,QACA,KAAKD,CAAG;AAAA,QAAMC;AAAA,MAAA,IALlBF,EAAU,KAAKC,CAAG;AAAA,IAS9B,CAAC,GACGD,EAAU,UACV,QAAQ;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MAAwBA;AAAA,IAAA;AAAA,EAGpC;AACA,UAAQ,SAAA;AACZ;AAEA,SAASG,EAAkBC,GAAuC;AAC9D,SAAO,KAAKA,CAAY,EAAE,QAAQ,CAACH,MAAgB;AAC/C,QAAI,CAAC,SAAS,aAAa,SAAS,QAAQ,EAAE,SAASA,CAAG;AACtD;AAEJ,UAAMI,IAAMD,EAAaH,CAAG;AAC5B,QAAKI;AAIL,cAAQ,OAAOA,GAAA;AAAA,QACX,KAAK;AACD,kBAAQ;AAAA,YACJ;AAAA,YACA;AAAA,YACA,KAAKJ,CAAG;AAAA,YAAMI;AAAA,UAAA;AAElB;AAAA,QACJ,KAAK;AACD,kBAAQJ,GAAA;AAAA,YACJ,KAAK;AACD,sBAAQ,eAAe,YAAY,GACnC,QAAQ,IAAII,CAAG,GACf,QAAQ,SAAA;AACR;AAAA,YACJ,KAAK;AACD,cAAAV,EAAYM,GAAMI,GAAoC,gBAAgBA,CAAG;AACzE;AAAA,YACJ,KAAK;AACD,cAAAF,EAAkBE,CAA8B;AAChD;AAAA,YACJ,KAAK;AACD,cAAAV,EAAYM,GAAK;AAAA,gBACb,QAASI,EAAc;AAAA,gBACvB,GAAG,OAAO,KAAKA,CAAG,EAAE,OAAO,CAACC,GAAKC,OACxBA,EAAK,WAAW,GAAG,KAAK,CAAC,CAAC,OAAO,QAAQ,EAAE,SAASA,CAAI,KAAMA,EAAK,WAAW,GAAG,MAItFD,EAAIC,CAAI,IAAKF,EAAgCE,CAAI,IAC1CD,IACR,CAAA,CAA6B;AAAA,cAAA,CACnC;AACD;AAAA,YACJ;AACI,cAAAX,EAAYM,GAAKI,CAAG;AAAA,UAAA;AAE5B;AAAA,QACJ,KAAK;AACD,kBAAQ,IAAIA,CAAG;AACf;AAAA,QACJ;AACI,kBAAQ,KAAKA,CAAG;AAAA,MAAA;AAAA,EAE5B,CAAC;AACL;AACO,SAASG,EAAIC,GAAkBC,GAAW;AAC7C,MAAI,CAACD;AACD,UAAM,IAAI,MAAM,iCAAiC;AAGrD,UAAQ;AAAA,IACJ;AAAA,IACAA;AAAA,IACAC,EAAK,MAAA;AAAA,IACL,GAAGA;AAAA,EAAA;AAEX;AAGO,SAASC,EAASF,GAAkBC,GAAWE,GAAoB;AACtE,MAAI,CAACH;AACD,UAAM,IAAI,MAAM,iCAAiC;AAGrD,QAAMb,IAAQc,EAAK,MAAA,GACbG,IAAQH,EAAK,CAAC;AAEpB,MAAI,CAACG,GAAO,WAAW,OAAO,KAAKA,EAAM,OAAO,EAAE,WAAW,GAAG;AAC5D,YAAQ;AAAA,MACJ;AAAA,MACAJ;AAAA,MACA,GAAGI,GAAO,SAASA,GAAO,SAAS;AAAA,MACnCA,GAAO;AAAA,IAAA;AAEX;AAAA,EACJ;AAEA,UAAQ;AAAA,IACJ;AAAA,IACAJ;AAAA,IACA,GAAGb,CAAK;AAAA;AAAA,IACbiB,GAAO;AAAA,EAAA,GAGNH,EAAK,QAAQ,CAACL,MAAa;AACvB,YAAQ,OAAOA,GAAA;AAAA,MACX,KAAK;AACD,gBAAQ,KAAKA,CAAG;AAChB;AAAA,MACJ,KAAK;AACD,QAAI,MAAM,QAAQA,CAAG,IACjB,QAAQ,MAAMA,CAAG,IAEjBF,EAAkBE,CAAG;AAEzB;AAAA,MACJ,KAAK;AACD,gBAAQ,IAAIA,CAAG;AACf;AAAA,MACJ;AACI,gBAAQ,KAAKA,CAAG;AAAA,IAAA;AAAA,EAE5B,CAAC,GAYD,QAAQ,SAAA;AACZ;AAEO,MAAeS,EAAiC;AAAA,EAAhD;AACO,IAAAC,EAAA,kBAAmB;AACnB,IAAAA,EAAA,gBAAiB;AACjB,IAAAA,EAAA,eAAgB;AAChB,IAAAA,EAAA,uBAAwB;AACxB,IAAAA,EAAA,qBAAsB;AACtB,IAAAA,EAAA,oBAAqB;AACrB,IAAAA,EAAA;AACA,IAAAA,EAAA,iBAA4B;AAAA,MAClC,OAAO,EAAE,SAAS,KAAK,eAAe,OAAO,KAAK,aAAa,MAAM,KAAK,WAAA;AAAA,MAC1E,MAAM,EAAE,SAAS,KAAK,UAAU,OAAO,KAAK,QAAQ,MAAM,KAAK,MAAA;AAAA,IAAM;AAAA;AAAA,EAG/D,cAAcC,GAAiBC,GAAsB;AAC3D,WAAO,KAAK,cAAc,KAAKA,CAAI,IAAI,KAAK,WAAW;AAAA,GAC5DD,CAAO;AAAA,IACNA;AAAA,EACA;AAAA,EAEU,cAAcE,GAA0C;AAC9D,WAAO1B,EAAM0B,EAAgB,SAASA,EAAgB,KAAK;AAAA,EAC/D;AAAA,EAEU,mBAAmBC,GAAwC;AACjE,WAAO,KAAK,QAAQA,KAAe,MAAM;AAAA,EAC7C;AAAA,EAEA,OAAOT,GAAW;AACd,SAAK;AAAA,MACD,KAAK,mBAAA;AAAA,MACLA;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,SAASA,GAAW;AAEhB,SAAK;AAAA,MACD,KAAK,mBAFO,OAEmB;AAAA,MAC/BA;AAAA,IAAA;AAAA,EAER;AAAA,EAEU,YAAYA,GAAsBO,GAAc;AACtD,QAAI,OAAOP,KAAS;AAChB,aAAO,CAACA,CAAI;AAGhB,QAAI,MAAM,QAAQA,CAAI;AAClB,aAAO,CAACA,EAAK,MAAA,GAAS,GAAIA,KAAQ,CAAA,CAAG;AAAA,EAE7C;AAAA,EAEU,OAAOQ,GAAkCR,GAAW;AAC1DF,IAAAA;AAAAA,MACI,KAAK,cAAcU,CAAe;AAAA,MAClC,KAAK,YAAYR,GAAMQ,EAAgB,IAAI;AAAA,IAAA;AAAA,EAEnD;AACJ;AAQO,MAAME,UAAqBN,EAAc;AAAA,EAG5C,YAAYF,GAAqB;AAC7B,UAAA;AAHM,IAAAG,EAAA,qBAAsBH;AAIxBA,IAAAA,MACA,KAAK,cAAcA;AAAAA,EAE3B;AAAA,EAGA,SAASS,GAA6B;AAElC,UAAMC,IADaD,EAAO,MAAA,IACG,CAAC;AAE9B,YAAQ;AAAA,MACJ;AAAA,MACA;AAAA,MACA,QAAQC,GAAS,SAASA,GAAS,SAAS,QAAQA,GAAS,KAAK;AAAA,IAAA,GAElEA,GAAS,WACTnB,EAAkBmB,EAAQ,OAAO,GAErC,QAAQ;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IAAA,GAEJD,EAAO,QAAQ,CAAAE,MAAS,KAAK,IAAI,GAAGA,CAAK,CAAC,GAC1C,QAAQ,SAAA,GACR,QAAQ,SAAA;AAAA,EACZ;AAAA,EAEU,OAAOL,GAAkCR,GAAW;AAC1D,IAAAC;AAAA,MACI,KAAK,cAAcO,CAAe;AAAA,MAClC,KAAK,YAAYR,GAAMQ,EAAgB,IAAI;AAAA,IAE/C;AAAA,EACJ;AACJ;ACrTA,SAASM,EAAe3B,GAA8C;AAClE,MAAI,OAAOA,KAAY;AACnB,WAAOA;AAGX,MAAI;AACA,WAAOA,EAAA;AAAA,EACX,SAAS4B,GAAO;AACZ,WAAO,EAAE,qBAAqBA,EAAA;AAAA,EAClC;AACJ;AAQA,MAAqBC,EAAO;AAAA,EAKxB,YAAYC,GAAgBC,GAA4BC,IAAyB,CAAA,GAAI;AAJpE,IAAAd,EAAA,oBAA8B,CAAA;AACvC,IAAAA,EAAA;AACS,IAAAA,EAAA;AAGb,SAAK,SAASc,EAAQ,OACtB,KAAK,UAAUF,GACf,KAAK,aAAaC;AAAA,EACtB;AAAA,EAEA,IAAI,QAA4B;AAC5B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,MAAME,GAA2B;AACjC,SAAK,SAASA;AAAA,EAClB;AAAA,EAEA,IAAI,SAAiB;AACjB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAMlC,GAAemC,GAAmBlC,GAAwBiC,GAAsB;AAClF,SAAK,KAAK,SAASlC,GAAOmC,GAAWlC,GAASiC,CAAK;AAAA,EACvD;AAAA,EAGA,MAAMlC,GAAemC,GAAmBN,GAAgB5B,GAAwBiC,GAAsB;AAClG,SAAK,KAAK,SAASlC,GAAOmC,GAAWlC,GAASiC,GAAOL,CAAK;AAAA,EAC9D;AAAA,EAEQ,KACJO,GACApC,GACAmC,GACAlC,GACAiC,GACAL,GACI;AACJ,QAAI,KAAK,WAAW,WAAW,GAAG;AAC9B,MAAIO,MAAU,WACV,QAAQ,MAAM,gCAAgCP,CAAK;AAEvD;AAAA,IACJ;AAEA,UAAMQ,IAA+B;AAAA,MACjC,OAAArC;AAAA,MACA,OAAAoC;AAAA,MACA,WAAAD;AAAA,MACA,OAAOD,KAAS,KAAK;AAAA,MACrB,QAAQ,KAAK;AAAA,IAAA,GAGXI,IAAU,KAAK,WAAW,OAAO,CAAAC,MAAY;AAC/C,UAAI;AACA,eAAOA,EAAS,OAAOF,CAAQ;AAAA,MACnC,SAASR,GAAO;AACZ,uBAAQ,MAAM,mCAAmCA,CAAK,GAC/C;AAAA,MACX;AAAA,IACJ,CAAC;AAED,QAAIS,EAAQ,WAAW,GAAG;AACtB,MAAIF,MAAU,WACV,QAAQ,MAAM,gCAAgCP,CAAK;AAEvD;AAAA,IACJ;AAEA,UAAMZ,IAAoB;AAAA,MACtB,GAAGoB;AAAA,MACH,GAAIR,MAAU,UAAa,EAAE,OAAAA,EAAA;AAAA,MAC7B,GAAI5B,MAAY,UAAa,EAAE,SAAS2B,EAAe3B,CAAO,EAAA;AAAA,MAC9D,WAAW,KAAK,IAAA;AAAA,IAAI;AAGxB,eAAWsC,KAAYD;AACnB,UAAI;AACA,QAAAC,EAAS,QAAQtB,CAAK;AAAA,MAC1B,SAASY,GAAO;AAEZ,gBAAQ,MAAM,4BAA4BA,CAAK;AAAA,MACnD;AAAA,EAER;AACJ;ACtGA,SAASW,EAA0BvB,GAAsC;AACrE,QAAMwB,IAAiB,OAAO,KAAKxB,CAAK,EAAE,OAAO,CAACP,GAAKC,OAC/CA,MAAS,WAAWA,MAAS,gBAC7BD,EAAIC,CAAI,IAAIM,EAAMN,CAAmC,IAElDD,IACR,CAAA,CAA6B;AAEhC,SAAO,CAACgC,EAAiBzB,CAAK,GAAGwB,CAAuC;AAe5E;AAEA,SAASC,EAAiBzB,GAA2B;AACjD,SAAOA,EAAM,QACP,GAAGA,EAAM,KAAK,KAAKA,EAAM,KAAK,MAC9B,GAAGA,EAAM,KAAK;AACxB;AAEA,SAASL,EAAI+B,GAAiB1B,GAAyB;AACnD,QAAM2B,IAAgB3B,EAAM,UAAU,UAAU,UAAU;AAC1D,EAAA0B,EAAOC,CAAa,EAAE,GAAGJ,EAA0BvB,CAAK,CAAC;AAC7D;AAKO,SAAS4B,EAA2BF,GAAiD;AACxF,SAAKA,MACDA,IAAS,IAAInB,EAAA,IAGV;AAAA,IACH,QAAQP,GAAa;AACjB,MAAAL,EAAI+B,GAAQ1B,CAAK;AAAA,IACrB;AAAA,EAAA;AAER;ACnDA,SAAS6B,EAAaC,GAAyCC,GAAwB;AACnF,SAAO,CAAC/B,MACG8B,EAASC,CAAI,EAAE,CAAC,EAAE,YAAAC,IAAa,UAAU,QAAAN,GAAQ,OAAArC,QAAY;AAChE,UAAM4C,IAAajC,EAAM0B,CAAM;AAC/B,QAAI,OAAOO,KAAe,SAAU,QAAO;AAC3C,QAAIC,IAAS;AACb,YAAQF,GAAA;AAAA,MACJ,KAAK;AACD,QAAAE,IAASD,MAAe5C;AACxB;AAAA,MACJ,KAAK;AACD,QAAA6C,IAASD,EAAW,SAAS5C,CAAK;AAClC;AAAA,MACJ,KAAK;AACD,QAAA6C,IAASD,EAAW,WAAW5C,CAAK;AACpC;AAAA,MACJ,KAAK;AACD,QAAA6C,IAASD,EAAW,SAAS5C,CAAK;AAClC;AAAA,MACJ;AACI,QAAA6C,IAAS;AACT;AAAA,IAAA;AAER,WAAOA;AAAA,EACX,CAAC;AAET;AAsBA,SAASC,EACLC,GACAC,IAA+B,SACjC;AACE,SAAI,MAAM,QAAQD,CAAW,MACzBA,IAAc;AAAA,IACV,QAAQP,EAAaO,GAAaC,CAAU;AAAA,EAAA,IAIhDD,EAAY,UAAU,MAAM,QAAQA,EAAY,MAAM,MACtDA,EAAY,SAASP,EAAaO,EAAY,QAAQC,CAAU,KAGhE,CAACD,EAAY,UAAU,OAAOA,EAAY,UAAW,gBACrDA,IAAc,EAAE,GAAGA,GAAa,QAAQ,MAAM,GAAA,IAG3CA;AACX;AAQO,SAASE,EAAoBF,GAAsEC,IAA+B,SAAwB;AAC7J,SAAAD,IAAcD,EAAkBC,GAAaC,CAAU,GAElDD,GAAa,YACdA,IAAc,EAAE,GAAGA,GAAa,GAAGR,IAA2B,IAG3DQ;AACX;AC3EO,SAASG,IAAsC;AAClD,MAAIxB,IAA6B,CAAA;AASjC,WAASyB,EAAiBlB,GAAmDe,IAAsC,SAA+B;AAC9I,YAAI,CAACf,KAAY,CAACA,GAAU,aACxBA,IAAWgB,EAAoBhB,GAAUe,CAAU,KAGnD,EAAE,YAAYf,MAAa,OAAOA,EAAS,UAAW,gBACtDA,IAAW,EAAE,GAAGA,GAAU,QAAQ,MAAM,GAAA,IAG5CP,EAAU,KAAKO,CAAyB,GAEjC,MAAM;AACT,YAAMpC,IAAQ6B,EAAU,QAAQO,CAAyB;AAEzD,MAAIpC,MAAU,MACV6B,EAAU,OAAO7B,GAAO,CAAC;AAAA,IAEjC;AAAA,EACJ;AAKA,WAASuD,IAA4B;AACjC,IAAA1B,IAAY,CAAA;AAAA,EAChB;AAMA,WAAS2B,IAA6B;AAClC,WAAO3B,EAAU,SAAS;AAAA,EAC9B;AAEA,SAAO;AAAA,IACH,kBAAAyB;AAAA,IACA,qBAAAC;AAAA,IACA,cAAc,CAAC3B,GAAgBE,IAAyB,CAAA,MAAO,IAAIH,EAAOC,GAAQC,GAAWC,CAAO;AAAA,IACpG,mBAAA0B;AAAA,EAAA;AAER;"}
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
432
|
-
|
|
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":";;;;;;AAMO,SAASA,EAAaC,GAAa;AACtC,MAAI,OAAO,mBAAoB;AAC3B,QAAI;AACA,aAAO,gBAAgBA,CAAK;AAAA,IAChC,QAAQ;AAAA,IAER;AAGJ,MAAIA,MAAU,QAAQ,OAAOA,KAAU;AACnC,WAAOA;AAGX,MAAIA,aAAiB;AACjB,WAAO,IAAI;AAAA,MACP,MAAM,KAAKA,EAAM,QAAA,GAAW,CAAC,CAACC,GAAKC,CAAU,MAAM,CAACH,EAAUE,CAAG,GAAGF,EAAUG,CAAU,CAAC,CAAC;AAAA,IAAA;AAIlG,MAAIF,aAAiB;AACjB,WAAO,IAAI,IAAI,MAAM,KAAKA,EAAM,OAAA,GAAU,CAAAE,MAAcH,EAAUG,CAAU,CAAC,CAAC;AAGlF,MAAI,MAAM,QAAQF,CAAK;AACnB,WAAOA,EAAM,IAAI,CAAAG,MAAQJ,EAAUI,CAAI,CAAC;AAG5C,MAAI,OAAO,eAAeH,CAAK,MAAM,OAAO,aAAa,OAAO,eAAeA,CAAK,MAAM;AACtF,WAAO,OAAO;AAAA,MACV,OAAO,QAAQA,CAAgC,EAAE,IAAI,CAAC,CAACC,GAAKE,CAAI,MAAM,CAACF,GAAKF,EAAUI,CAAI,CAAC,CAAC;AAAA,IAAA;AAIpG,QAAMC,IAAe,OAAO,OAAO,OAAO,eAAeJ,CAAK,CAAC;AAC/D,aAAW,CAACC,GAAKE,CAAI,KAAK,OAAO,QAAQH,CAAgC;AACrE,IAAAI,EAAaH,CAAG,IAAIF,EAAUI,CAAI;AAGtC,SAAOC;AACX;ACtCO,SAASC,EAAoBC,GAAkBC,IAAgC,OAAO;AACzF,MAAI,MAAM,QAAQA,CAAI,GAAG;AACrB,UAAMC,IAAkC,CAAA;AACxC,eAAWP,KAAOM;AACd,MAAIN,KAAOK,MACPE,EAAYP,CAAG,IAAIF,EAAUU,EAAMH,EAAML,CAAG,CAAC,CAAC;AAGtD,WAAOO;AAAA,EACX;AAEA,MAAID,MAAS;AACT,UAAM,IAAI,MAAM,2BAA2BA,CAAI,EAAE;AAGrD,SAAOR,EAAUU,EAAMH,CAAK,CAAC;AACjC;ACTA,MAAqBI,EAA8B;AAAA,EAAnD;AACY,IAAAC,EAAA,6CAA8C,IAAA;AAC9C,IAAAA,EAAA,wDAA8C,IAAA;AAC9C,IAAAA,EAAA,2DAA0E,IAAA;AAAA;AAAA,EAAI,kBAAAC,GAAA;AAAA,IAAA,OAAAA,EAAA,yBAAA,eAAAA,EAAA,wBAAA,OAAA,EAAA,QAAAC,GAAA,WAAAC,EAAA,GAAAC,IAAA,CAAA,MAAA;AAAA,YAAAC,IAAAJ,EAAAC,CAAA;AAUtF,UAAA,OAAAG,KAAsC,cAAAC,EAAAJ,CAAA;AAC9B;AAEJ,YAAAN,IAAA,CAAAO,KAAAA,EAAA,WAAA,IAAA,QAAAA,GAEMI,IAAA,KAAA,kBAAiCN,GAAQC,GAAmCN,CAAA;AAC9E;AACA,cAAIS,EAAO,MAAAJ,GAAaG,CAAA;AAAA,MACpB,SAAAI,GAAA;AACJ,mBAAA,WAAAD,GAAAN,CAAA,GAEMO;AAAA,MAEN,UAAA;AACA,aAAI,oBAAAD,CAAA;AAAA,MACA;AAAA,IAAgC;AAAA,EAEhC;AAAA,EACM,wBACRE,GAAAR,GAAA;AACE,UAAAE,IAAK,KAAA,8BAA+B;AAAA,MACxCO,EAAAD,GAAAR,CAAA;AAAA,IACJ;AACJ,QAAA,CAAAE;AAAA;AAAA,UAAAP,IAAAO,EAAA,WAAA,IAAA,QAAAA,GAAAI,IAAA,KAAA,kBAAAN,GAAAQ,GAAAb,CAAA;AAAA,WAAA;AAAA,MAAA,OAAA,MAAA;AAAA,aAAA,oBAAAW,CAAA;AAAA,MASA;AAAA,eAOU,MAAA;AACF,aAAA,WAAkBA,GAAYN,CAAK,GACvC,KAAA,oBAAAM,CAAA;AAAA,MAEA;AAAA,IACI;AAAA,EAAA;AAAA,EAIJ,sBAAoB,EAAA,SAAAI,GAAK,OAAAV,EAAA,GAAA;AAEzB,UAAAW,IAAOD,GAAA,cAAA;AAAA,IACHC,KAAa,CAAA,KAAA,2BAAA,IAAAX,EAAA,GAAA,MAAE,OAAK,KAAAW,WAA+B,CAAAtB,MAAA;AAAE,WAAA,8BAAA;AAAA,QACrDoB,EAAepB,GAAAW,CAAA;AAAA,UACKX;MAChB;AAAA,IACJ,CAAA,GACJ,KAAA,2BAAA,IAAAW,EAAA,GAAA,IACJ,KAAA,kBAAAA,CAAA;AAAA,EAAA;AAAA,EAAA,mBAAAA,GAAA;AAAA,UAAAY,IAAA,IAAAZ,EAAA,GAAA;AAAA,eAAAX,KAAA,MAAA,KAAA,KAAA,8BAAA,KAAA,CAAA;iBAQAuB,WACU,qCAAkCvB,CAAA;AAGhC,SAAA,2BAAK,OAA8BW,EAAA,GAAA;AAAA,eAC/BM,KAAkB,WAAU,KAAA,gBAAA,KAAA,CAAA;AAAA,MAC5BA,EAAA,aAAuB,WAAG,GAAAN,EAAA,GAAA,GAAA,KAAA,KAC9B,gBAAA,OAAAM,CAAA;AAAA,EAEyC;AAAA,EAEjD,WAAKA,MAAuB;AAChC,UAAAO,IAAA,KAAA,gBAAA,IAAAP,CAAA;AAAA,QAAAO;AAAA,UAAA;AAAA,QAAAb,EAAA,OAAAa,CAAA;AAAA,MAAA,SAAAN,GAAA;AAQA,gBAAA,6CAAuC,OAAAD,CAAA,CAAA,IAAAC,CAAA;AAAA,MACnC;AAAA,EAEA;AAAA,EAEQ,oBAAKD,GAAA;AAAwC,IACjDA,KAKJ,KAAA,gBAAW,QAA0B;AAAA,EACjC;AAAA,EAC2C,kBAC3CN,GAAAQ,GAAAN,GAAA;AACJ,UAAAW,IAAApB;AAAA,MACJO,EAAA;AAAA,MAEQE;AAAA,IACJ,GACKI,IAAe,uBAAA,GAAAN,EAAA,GAAA,IAAAQ,CAAA,EAAA;AAChB,gBAAA,gBAAA,IAAAF,GAAAO,CAAA,GACJP;AAAA,EAEA;AAAA,EAC8B,0BACdN,GAAA;AACZ,WAAA,KAAQ,2BAAM,IAAAA,EAAA,GAAA;AAAA,EAAmE;AACrF;AACJ,MAAAc,IAAA,sBAAAC,IAAA;AAAA,EAAA,aAAA;AAAA,EAAA,WAAA;AAAA;AAQI,SAAKC,EAAaC,GAAA;AACd,MAAA,OAAA,SAAA,OAAA,OAAA,OAAA,yBAAA,YAAA;AACJ,WAAA,sBAAA,MAAA,WAAA,WAAAA,GAAA,CAAA,CAAA;AAEA;AAAA,EACJ;AAAA,aAAA,WAAAA,GAAA,CAAA;AAAA;AAAA,MAAAC,EAAA;AAAA,EChIA,eAAaR,GAAA;ADgIb,IAAAX,EAAA,oBAAAe;AAAA,IAAAf,EAAA;AAAA,IAAAA,EAAA,gCAAA,oBAAA,IAAA;AAAA,IAAAA,EAAA,yBAAA,oBAAA,IAAA;AASQ,IAAAA,EAAA,qCAAgC,CAAA;AACpC,IAAAA,EAAA,uCAAsB,CAAA;AAAA,IAAAA,EAAA;AACZ,IAAAA,EAAA,6BACN,oBAAA,IAAA;AAAA,IAAAA,EAAA,yBACJ,oBAAA,QAAA;AAEA,IAAAA,EAAA,8CAA2C;AAC3C,IAAAA,EAAA,sBAAK,CAAA;AACL,IAAAA,EAAA,+BAAO,oBAAA,IAAA;AACX,IAAAA,EAAA,+BAAA,oBAAA,IAAA;AAAA,IAAAA,EAAA,wBAAA,CAAA;AAAA,IAAAA,EAAA,iCAAA,oBAAA,IAAA;AAAA,IAAAA,EAAA,iCAAA,oBAAA,IAAA;AAAA,IAAAA,EAAA;+BCjJWW,GAAA,sBAAAM,GACf,KAAA,WAAAN,GAEA,KAAS,eAAAS,GACL,KAAI,iBAAkB;AAAA,EAClB;AAAA,ED4IJ,IAAA,YAAAA,GAAA;AAOA,SAAA,eAAAA;AAAA,EACI;AAAA,EACJ,IAAA,gBAAA;AACJ,QAAA,CAAAC,EAAA,KAAA,cAAA;;EC7JA;AAAA,EAQQ,yBAAAZ,GAAAR,GAAAiB,GAAA;AACJ,UAAA5B,IAAAoB,EAAAD,GAAAR,CAAA;SAEW,4BAAsBX,CAAA,MACrC,KAAA,4BAAAA,CAAA,IAAA,CAAA,IAGc,KAAA,4BAAqBA,CAAA,GAAA,KAAA4B,CAAA;AAAA,EACvB;AAAA,EACA,2BAAAT,GAAAR,GAAiFiB,GAAI;AACrF,UAAA5B,IAAAoB,EAAAD,GAAsCR,CAAA;AACtC,IAAA,KAAA,8BAAsFX,CAAA,MACtF,KAAA,8BAAkFA,CAAA,IAAA,CAAA,IAElF,KAAA,8BAAAA,IAAgG,KAAI4B,CAAA;AAAA,EACpG;AAAA,EACA,sBAAAjB,GAAAiB,GAAoE;AACpE,IAAA,yBAAoC,IAAAjB,CAAA,KACpC,KAAA,oBAAA,IAAAA,GAA6C,oBAAA,IAAA,CAAA,GAE7C,KAAA,oBAAyC,IAAAA,CAAA,EAAA,IAAAiB,CAAA;AAAA,EACzC;AAAA,EACA,oCAAAI,GAA2C;AAC3C,WAAA,KAAA,4BAAAA,CAAA,GAER,OAAI,KAAA,8BAA6CA,CAAA;AAAA,EAC7C;AAAA,EACJ,mBAAArB,GAAA;AAEA,gCAAuD,OAAAA,CAAA,GACnD,KAAK,gBAAa,OAAAA,CAAc,GAC5B,KAAA,oBAAY,OAAAA,CAAA;AAChB,UAAAY,IAAA,IAAAZ,EAAA,GAAA;AACJ,eAAAX,KAAA,MAAA,KAAA,KAAA,qBAAA;AAEA,MAAAA,EACI,SAAAuB,MAGA,KAAK,6BAA+BvB,CAAA;AAGpC,eAAKA,KAAA,MAAiB,KAAA,KAAA,qBAAA;AAC1B,MAAAA,EAAA,SAAAuB,CAAA,gCAEiC,OAAoBvB,CAAA;AAG7C,eAAKA,KAAA,MAAA,KAAA,KAAA,uBAAoC;AAC7C,MAAAA,EAAA,SAAAuB,CAAA,KACA,KAAK,wBAA4B,OAAMvB,CAAA;AAIvC,eAAMA,KAAM,MAAA,KAAA,KAAkB,uBAAiB;AAC/C,MAAKA,EAAK,oBACD,wBAAA,OAAiCA;AAG9C,eAAAA,KAAA,OAAA,KAAA,KAAA,2BAAA;AAEQ,MAAAA,EAAA,SAAAuB,MACA,OAAM,KAAA,4BAAgCvB,CAAA;AAG1C,eAAKA,KAAA,OAAoB,KAAI,KAAK,6BAAe;AACrD,MAAAA,EAAA,SAAAuB,CAAA,KAEQ,OAAA,KAAA,8BAA8DvB,CAAA;AAAA,EAGtE;AAAA,EAGI,qCAAmCmB,GAAKR,GAAA;AACxC,WAAK,CAAAiB,MAAgB;WAChB,yBAA2BT,GAAKR,GAAAiB,CAAA;AAAA,IACrC;AAAA,EAEA;AAAA,EAEQ,0CAAqCjB,GAAA;AAAA,WACzC,CAAAiB,MAAA;AACJ,WAAA,2BAAAT,GAAAR,GAAAiB,CAAA;AAAA,IAEA;AAAA,EACI;AAAA,EACyC,uBACzCT,GAAAR,GAAA;AACJ,UAAA;AAAA,MAEA,OAAAsB;AAAA,MACI,SAAAC;AAAA,IACI,IAAA,KAAK,+BAA+B;AAAA,MACxCf;AAAA,MACJR;AAAA,IAEA,KAAA,CAAA;AACI,iBAGJ,KAAA,yBAAAQ,GAAAR,GAAAsB,CAAA,GAEA,KAAA,2BAA8Bd,GAAKR,GAAAuB,CAAA;AAAA,EAC/B;AAAA,EACI,2BAAY;AAA+B,WAC/C,KAAA,UAAA,uBAAA,OAAA,SAAA,MAAA,WAAA;AAAA,EAAA;AAAA,EAGJ,sBAAkBC,GAAY;AAC1B,WAAI;AAAA,MACA;MACJ,GAAA,KAAA,UAAA,aAAA,CAAA;AAAA,MACJ,GAAAA,EAAA,aAAA,CAAA;AAAA,MACJ,GAAA,KAAA,UAAA,sBAAAA,EAAA,IAAA,KAAA,CAAA;AAAA,IAAA;AAAA,EAAA;AAAA,EAAA,yBAAAA,GAAA;AAAA,WAAAA,EAAA,sBAAA,KAAA;AAAA,EAAA;AAAA,EAAA,oBAAAA,GAAAxB,GAAA;AAQQ,WAAA,GAAAwB,EAAA,IAAA,IAAAxB,EAAqC,GAAA;AAAA,EACzC;AAAA,EACI,sBAAKyB;AACT,WAAA,GAAAA,CAAA,IAAAzB,EAAA,GAAA;AAAA,EACJ;AAAA,EAAA,2BAAAA,GAAA;AAAA,SAAA,oBAAA,IAAAA,CAAA,GAAA,QAAA,CAAAiB,MAAAA,EAAAjB,CAAA,CAAA;AAAA,EAAA;AAAA,EAAA,iCAAAA,GAAA;AAAA,QAAA,KAAA,gBAAA,IAAAA,CAAA,KAAA,OAAAA,EAAA,aAAA;AAQQ;AAEA,UAAA0B,IAAK,4BAA8C,IAAQ1B,CAAA,GAC/D2B,IAAA,KAAA,+BAAA,0BAAA3B,CAAA;AACJ,IAAA,CAAA0B,GAAA,QAAA,CAAAC,MAAA,KAAA,gBAAA,IAAA3B,CAAA,GAAAA,EAAA,UAAA,CAAA,EAAA,OAAAsB,GAAA,MAAAnB,GAAA,MAAAyB,GAAA,SAAAL,EAAA,MAAA;AAAA,WAAA,gBAAA,OAAA,EAAA,MAAApB,GAAA,MAAAyB,EAAA,IAAA5B,EAAA,KAAA,UAAA;AAAA,YAAAqB,IAAAZ,EAAAmB,GAAA5B,CAAA;AAQQ,MAAA,KAAA,+BAGN,0BAAAA,CAAA,KACE,KAAM,uBAAA4B,GAAA5B,CAAA;AAEF,YAAA6B,IAAA,KAAA,uBAAA,IAAA7B,CAAA;AACJ,MAAI6B,GAAK,QACLA,EAAA,QAAA,CAAAZ,MAAAA,EAAA;AAAA,QACA,OAAA,KAAA,qCAAAW,GAAA5B,CAAA;AAAA,QACC,MAAAG;AAAA,QAEA,MAAAyB;AAAA,QACD,SAAA,KAAA,uCAAAA,GAAA5B,CAAA;AAAA,MACJ,CAAA,CAAA;AAGA,YAAK8B,IAAA,KAAA,4BAAqDT,CAAA,GAC9DU,IAAA,KAAA,8BAAAV,CAAA;+CAE6DA,CAAA,GACzDS,GAAsB,UAE1BR,EAAA,CAAAU,MAAA;AAEQ,QAAAF,EAAsB,QAAA,CAAAb,MAAgEA,EAAAe,CAAA,CAAA,GAC1F,KAAO,cAAA,CAAA,GAAAhC,EAAA,GAAA;AAAA,OACA,GAEC+B,GAAW,UACfR,EAAS,CAAAhB,MAAU;AACvB,QAAAwB,EAAA,QAAA,CAAAd,MAAAA,EAAAV,CAAA,CAAA;AAAA,MACJ,CAAA,GAGWuB,aACX,KAAA,cAAA,CAAA,GAAA9B,EAAA,GAAA;AAAA,IAGI,CAAA;AAAA,EACJ;AAAA,EAEQ,kBAAAiC,GAAsBC;AAC1B,UAAAC,IAAoB,KAAI,oBAASX,GAAAS,EAAA,KAAA;AAKrC,QAJA,KAAA,sBAAA,IAAAE,CAAA,KAIA,CAAAX,EAAA,OAAAS,GAAA,KAAA,UAAA,eAAA,YAAA;AAAA;AAAA,SAAA,sBAAA,IAAAE,CAAA;AAAA,QAAAC;AAAA,QAAA;AAAA,MAAAA,IAAAZ,EAAA,UAAAS,CAAA;AAAA,IAQQ,SAAA1B,GAAA;WACA,WAAK,yBAAqC0B,EAAM;AAChD;AAAA,IACJ;AACA,UAAMI,IAAA,MAAwB;AAC9B,UAAM;AAEF,cAACC,IAAAd,oBAAsD;AACvD,QAAAc,KAAA,OAAAA,EAAA,QAAA,cAGCA,EAAgB;AAAA,UACf,CAAA/B,MAAa,gBAAa,6BAAoBA,GAAA0B,EAAA,MAAA,GAAA;AAAA,QAChD;AAAA,MAGA,SAAS1B,GAAA;AACL,aAAK,WAAA,6BAAkCA,GAAA0B,EAAA,MAAA,GAAA;AAAA,MAC3C;AAAA,IAEA;AACA,IAAAG,KAAe,OAAMA,EAAA,QAAA,aACjBA,EAAU,KAAA,QAA6B,CAAA,EAAA,MAAA,CAAA7B,MAAA,KAAA,WAAA,sBAAAA,GAAA0B,EAAA,MAAA,GAAA,CAAA,IACyBI,EAC5D,GACAb,EACS,iBAAuD,KAClE,qBAAAS,GAAAT,EAAA,aAAA,GAGNA,+BACA,KAAA,0BAA8BA,EAAA,4BAI9B,KAAA,0BAA4BA,CAAA,GACxBA,EAAO,sBACH,KAAA,sBAAuBS,EAAA,OAAYT,EAAS,kBAAO;AAAA,EACnB;AAAA,EACnC,wBACLS,GAAAT,GAAA;AACA,QAAA;AACI,WAAA,kBAAmBS,GAAAT,CAAA;AAAA,IACf,SAAAe,GAAA;AAAoD,WACvD,WAAA,sBAAAA,GAAAN,EAAA,MAAA,GAAA;AAAA,IAAA;AAAA,EAEL;AAAA,EACI,mBAAK;AAA2B,IACpC,KAAA,UAAA,kBACH,KAAA,UAAA,KAAA,SAAA,cAAA,aAAAC,CAAA;AAAA,EAGG;AAAA,EAGJ,mBAAS,SAAAxB,EAAA,GAAA;AACL,QAAA,KAAA,aAAA,QAKA;AAAA,WAAA,gBAAA,OAAA;AAAA,QACJ,aAAA,KAAA;AAAA;;MAMA,IAAIV,EAAA,GAAA;AACA;0BACY;AAAA,UACZ,CAAAwB,MAAgB;AAChB,kBAAAW,IAAA,KAAA,oBAAAX,GAAAxB,CAAA,GACJwC,IAAA,KAAA,sBAAAhB,CAAA;AAEM,gBAAA,OAAA,sBAA0B,IAAAW,CAAA,KAAA,KAAA,sBAAA,IAAAA,CAAA,kCAIgB;AAAA,oDACPK,CAAA,GAAA;AAC7B,qBAAA,yBAAA,EAAA,OAAAxC,GAAA,SAAAU,EAAA,GAAAc,GAAAW,CAAA;AACJ;AAAA;AAEA,mBAAK,kBAAW,EAAA,OAAAnC,GAAA,SAAAU,EAAA,GAA6Bc,CAAO;AAAA;AAAA,UACxD;AAAA,QACJ,GAEA,uBAAqB,EAAA,OAAAxB,OAAwC,MAAA,GACtD,KAAA,+BACa,sBACL,EAAA,OAAAA,GAAS,SAAAU,EAAK,CAAA,GAC7B,KAAO,iCAAAV,CAAA,GACH,0BAAkBA,CAAA;AAAA,MACtB,SAAAuC,GAAA;AAEA,aAAI,WAAW,iBAAeA,GAAAvC,EAAA,GAAA;AAAA,MAC1B;AACJ,WAAA,cAAA,OAAA,CAAA,IAAAA,EAAA,GAAA;AAAA;AAAA,EAEA;AAAA,EACI,yBAAKiC,GAAAT,GAAqCW;AAC9C,UAAAM,IAAA,KAAA,yBAAAjB,CAAA;AAEA,SAAK,sBAAA,IAA0BW,CAAU,GAEzCM,EAAI,MAAW;AACX,MAAA,KAAK,gBAAA,IAAsBR,EAAQ,KAAO,MAI1C,KAAA,8BAAyF,GAC7F,KAAI,wBAAAA,GAAAT,CAAA;AAAA,IACA,CAAA;AAAA,EAA0C;AAAA,EAE1C,qBAAgBxB,GAAA;AACpB,QAAA,OAAAA,EAAA,YAAA;AACJ;AAGI,UAAI0C,IAAK1C,gBAAyBA,CAAA,GAC9B2C,IAAe3C;AACnB,IAAA2C,EAAA,sCACJA,EAAA,oCAAA,IAAA3C,EAAA,WAAA,OAAA,KAAA,gBAAA,IAAAA,CAAA,GAAA,KAAA,mBAAAA,CAAA,GAAA,KAAA,+BAAA,mBAAAA,CAAA,GAAA0C,EAAA;AAAA,EAUI;AAAA,EACI,kBAAA,EAAA,OAAA1C,EAAA,GAAA4C,GAAA;AACJ,UAAAC,IAAA1D,EAAAyD,CAAA;AAEA,IAAA5C,EAAK,SAAA,MAAgB;AACjB,WAAA,qBAAkBA,EAAA,KAAA,OAAA,EAAA,cAAA6C,EAAA,EAAA,GAClB,KAAA,2BAAA7C,CAAA,GACAA,EAAA,OAAAb,EAAA0D,CAAA,CAAA;AAAA,IAAA;AAAA,EAGJ;AAAA,EACI,mBAAKL,GAAa;AAAA,cACA,KAAA,yBAAA;AACV,WAAAA,EAAM,gBAAqB,YAAoB,gBAAYM;AAAA,EAC3D;AAAA,EAEA,gCAC+B;AAG3B,WAAA,KAAA,yBAAA,MAAA,YAAAN,EAAA,cAAA;AAAA,EAAA;AAAA,EAGJ,6BAA6B;AACzB,UAAA,EAAA,OAAAxC,GAAA,UAAAiB,EAAA,IAAAO,GAAA,4BAAA,KAAA,CAAA;AAAA,IAAA,CAAAxB,KACJ,CAAAiB,MAII,KAAA,uBAAA,IAAAjB,CAAA,KAAA,KACJ,uBAAA,IAAAA,GAAA,oBAAA,IAAA,CAAA,GAE2E,KAC/E,uBAAA,IAAAA,CAAA,EAAA,IAAAiB,CAAA,GAAA,KACJ,iCAAAjB,CAAA;AAAA,EAEA;AAAA,EACA,0BAAK+C,GAA+B;AACpC,UAAA,EAAK,OAAA/C,GAAA,UAAAiB,EAAA,IAAA8B;AACL,IAAA/C,EAAA,WAAK,CAAAgD;2BACG,OAAA,EAAA,UAAAA,EAAA,IAAAhD,EAAA,KAAA,gBAAA,GACRiB,EAAK+B,CAAW,GACpB,KAAA,cAAA,CAAA,GAAAhD,EAAA,GAAA;AAAA,IACA,CAAA;AAAA,EACJ;AAAA,EAEQ,wBACJiD;AAIA,mBAAMA,CAAiB,EAAA,QAAA,CAAA,CAAAxB,GAAmCyB,CAAA,MAAA;YAErDC,IAAA,KAA0B,sBAAa1B,GAAAQ,EAAA,KAAA,GAC5CO,IAAgB,KAAA,sBAAAU,EAAA,YAAA;AACZ,UAAI,OAAK,wBAAoB,IAAQC,CAAQ,KAAA,KAAA,wBAAA,IAAAA,CAAA,MAGxC,KAAA,mBAAsBX,IAGnC;AAAA,YAAA,KAAA,6BAAAA,CAAA,GAAA;AAEQ,gBAAAC,IAAqB,KAAoB,yBAAAS,EAAA,YAAA;AACzC,eAAA,6BAAsC,GACtCT,EAAA,MAAA;AACJ,YAAA,KAAA,gBAAA,IAAAR,EAAA,KAAA,MAKI,KAAA,wBAAY,OAAAkB,CAAmC,GAC/C,KAAA,2BAAAlB,GAAAR,GAAAyB,CAAA;AAAA,UACJ,CAAA;AAEA;AAAA,QACA;AACI,aAAK,2BAAyBjB,GAAAR,GAAAyB,CAAA;AAAA;AAAA,IAC9B,CAAA;AAAA,EACA;AAAA,EACA,2BAAe,EAAA,OAAAlD,GAAA,SAAAU,EAAA,GAAAe,GAAAyB,GAAA;AACnB,QAAA;AACJ,UAAA,KAAA,wBAAA,IAAA,KAAA,sBAAAzB,GAAAzB,CAAA,CAAA;;AAKI,YAAM,EAAA,cAAA+C,GAAe,qBAAAK,GAAA,QAAAC,EAAA,IAAAH;AACjB,WAAK,MAAM,yBAAqBlD,OAAc,OAAA;AAAA,QAC9C,YAAKyB;AAAA,QACL,cAAAsB;AAAA,QACJ,qBAAAK;AAAA,MACJ,EAAA;AAEQ,YAAAE,IAAmB;AAAA,sBACjB,EAAA,GAAA5C,GAA0B,yBAAyB;AAAA,MAEzD;AACJ,MAAAqC,EAAA;AAAA,QAEQ,EAAA,OAAA/C,GAAA,SAAA,EAAA,GAA6BU,GAAA,GAAsD4C,EAAA,EAAA;AAAA,MACvF,GACJ,KAAA,wBAAA,IAAA,KAAA,sBAAA7B,GAAAzB,CAAA,CAAA,GAEQoB,EAAAiC,CAAA,KACJA,GAAQ;AAAA,QAEH,CAAAE,QAAoB,OAAA;AAAA,UACrB,OAAAA;AAAA,UACJ,SAAA;AAAA,YAEU,GAAA7C;AAAA,YACD,GAAA4C;AAAA,YACT,GAAAC,GAAA,gBAAA,CAAA;AAAA,UACK;AAAA,QACA,CAAA;AAAA,MACT;AAAA,IAGI,SAAQhB,GAAA;WAEF,WAAY,yBAAsDA,GAAAvC,EAAA,GAAA;AAAA,IACpE;AAAA,EACA;AAAA,EACgC,MACnCwD,GAAAC,GAAAC,GAAA;AACL,IAAA,KAAA,YAEQF,IAAA,KAAA,aAEJ,SAEA,KAAO,QAAQ,WAAmB,YAAYtB,GAAAA,GAAAA,CAAY;AAAA,EAEtD;AAAA,EAMI,WAAAsB,GAAAjD,GAAAkD,GAAAC,GAAA;AAAA,IACJ,KAAA,WAEAF,IAAK,wBAAwBA,GACzB,KAAA,QAAA,MAAAA,GAAAA,EAAA,YAAA,GAAAjD,GAAAmD,GAAAD,CAAA,KAGJ,QAAI;EAGA;AAAA,EACA,cAAAC,GAAgBD,GAAA;AACZ,IAAA,KAAA,UAAS,iBACL,KAAA,SAAA,cAAA,WAAA,EAAA,GAAA,OAAAC,KAAA,aAAAA,EAAA,IAAAA,GAAA,OAAAD,EAAA,CAAA;AAAA,EAEJ;AAAA,EACA,gBAAKC,GAAAD,GAAAD,GAAA;AAAkE,IAC3E,KAAC,UAAA,kBACD,KAAA,SAAA,cAAA,WAAA,EAAA,GAAA,OAAAE,KAAA,aAAAA,EAAA,IAAAA,GAAA,OAAAD,EAAA,CAAA,GACJ,KAAA,MAAAD,KAAA,WAAAC,GAAAC,CAAA;AAAA,EAEuE;AAC1E;AAQD,SAAIC,EAAAxC,GAAAT,GAAA;AACA,YAAS,IAAAQ,EAAiCC,GAAAT,CAAsBwB;AAC5D,SAAAgB,EAAA,OAAA,KAAAA,CAAA;AAAA;AAKJ,SAAAU,EAAWzC,GAAyBT,GAAW;AAAO,QAClDmD,IAAA3B,IAAAA,EAAAA,GAAAA;AAAAA,IAAA,WACAxB,GAAA;AAAA,IAAA,oBACAA,GAAA;AAAA,IAAA,oBACFA,GAAA;AAAA,IAEF,qBAAMA,GAAgB;AAAA,EAAA,CAAA;AACuD,SAC7EmD,EAAA,OAAA,KAAAA,CAAA;AAEA;"}
|
|
@@ -382,12 +382,12 @@ class CartStore extends Store {
|
|
|
382
382
|
}
|
|
383
383
|
```
|
|
384
384
|
|
|
385
|
-
`
|
|
386
|
-
|
|
387
|
-
and pass
|
|
388
|
-
|
|
389
|
-
|
|
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
|
|
package/docs/using-plugins.md
CHANGED
|
@@ -319,39 +319,33 @@ Register listeners independently from plugin construction:
|
|
|
319
319
|
|
|
320
320
|
```js
|
|
321
321
|
import {
|
|
322
|
-
|
|
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
|
|
328
|
+
const traceGroupsRegistry = createTraceGroupsRegistry()
|
|
330
329
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
})
|
|
330
|
+
traceGroupsRegistry.addListener([
|
|
331
|
+
{ target: 'scope', value: 'cart' }
|
|
332
|
+
])
|
|
335
333
|
|
|
336
334
|
pinia.use(createPlugin([myStoreSubscriber], {
|
|
337
|
-
|
|
335
|
+
tracerHandler: traceGroupsRegistry.tracerHandler
|
|
338
336
|
}))
|
|
339
337
|
```
|
|
340
338
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
`
|
|
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
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
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 {
|
|
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(
|
|
372
|
+
export function createRequestApp(traceCriteria) {
|
|
379
373
|
const app = createSSRApp(App)
|
|
380
374
|
const pinia = createPinia()
|
|
381
|
-
const
|
|
375
|
+
const traceGroupsRegistry = createTraceGroupsRegistry()
|
|
382
376
|
|
|
383
|
-
|
|
377
|
+
traceGroupsRegistry.addListener(traceCriteria)
|
|
384
378
|
pinia.use(createPlugin(subscribers, {
|
|
385
|
-
|
|
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
|
-
|
|
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
|
+
"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,
|