pinia-plugin-subscription 1.0.0-beta.0 → 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
10
10
  ### Added
11
11
  - Added `createTracerRegistry()` to create isolated trace listeners and tracers for each application or Pinia instance
12
12
  - Added the `Tracer` class and registry methods `addTraceListener()`, `clearTraceListeners()` and `hasTraceListeners()`
13
+ - Added metadata-based trace filter criteria with `equals`, `contains`, `startsWith` and `endsWith` comparators, combined with `every` or `some`
13
14
  - Added `createConsoleTraceListener()` as an opt-in console sink for trace events
14
15
  - Added `trace()` and `traceError()` to `Store` and `PluginSubscription`
15
16
  - Added trace types: `TraceEvent`, `TraceEventMetadata`, `TraceFilter`, `TraceHandler`, `TraceLevel`, `TraceListener`, `TraceListenerRemover`, `TracePayload`, `TracerOptions`
@@ -18,15 +19,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
18
19
  - Added unit tests covering the tracing system and the leak detection logic
19
20
 
20
21
  ### Changed
22
+ - Moved the demo application from `src/demo/` to the repository-level `demo/` directory, separating example code from the library source and tracking the demo files in version control.
21
23
  - Clarified that SSR tracing registries and plugin instances must be created per request, and added coverage for listener isolation between registries
22
24
  - Replaced the `Debug` abstract class with composition: `Store` and `PluginSubscription` no longer extend it and now own a `Tracer`
23
25
  - `createPlugin()` accepts `PluginSubscriptionOptions`, including a `createTracer` factory to connect a tracer registry to plugin and store trace events
24
26
  - Trace errors with no matching listener, and failures in listener filters or handlers, are now reported with `console.error` instead of rethrowing the original error
25
27
  - Deprecated `createHydrationPlugin()` in favor of `createPlugin()` with hydration options
26
28
  - Trace payloads are now lazily resolved, so unobserved tracing no longer builds log arguments
27
- - Internal log messages became structured namespaces (`plugin:invoke`, `store:mutation`, `subscription:delivery`, …) carrying `store.$id` as `scope`
29
+ - Internal events now derive namespaces from trace labels, with `PluginSubscription` prefixed by default; store events carry `store.$id` as `scope`
28
30
  - `Tracer` now delegates all output decisions to listeners and no longer owns a console or an enabled state
29
31
  - Error events are delivered to matching listeners and reported with `console.error` when none match
32
+ - Store trace labels can include the store class name by default, and callers can override the event namespace
30
33
  - Excluded `scripts/**` from coverage thresholds, as build tooling is not shipped to consumers
31
34
 
32
35
  ### Removed
package/README.md CHANGED
@@ -119,9 +119,9 @@ export const myStoreSubscriber: PluginSubscriberInterface = {
119
119
 
120
120
  ## API Reference
121
121
 
122
- ### `createPlugin(subscribers: PluginSubscriber[]): PiniaPlugin`
122
+ ### `createPlugin(subscribers: PluginSubscriber[], options?: PluginSubscriptionOptions): PiniaPlugin`
123
123
 
124
- Creates and returns a Pinia plugin from the provided `subscribers`. Each subscriber is invoked when a store is registered.
124
+ Creates and returns a Pinia plugin from the provided `subscribers`. Each subscriber is invoked when a store is registered. The optional `options` configure execution, hydration and tracing.
125
125
 
126
126
  ### `createHydrationPlugin(subscribers: PluginSubscriber[], options?: PluginSubscriptionOptions): PiniaPlugin`
127
127
 
@@ -203,8 +203,8 @@ The `Store` class (see [src/core/Store.ts](src/core/Store.ts)) is a wrapper arou
203
203
  - `storeSubscribe` (getter/setter) — factory for `store.$subscribe` ({ store, callback }).
204
204
  - `onAction` (getter/setter) — factory for `onAction` ({ store, callback }).
205
205
  - `static customizeStore(store, options)` — recommended factory for class instantiation.
206
- - `trace(namespace, payload?)` — emits a structured trace event scoped to the store.
207
- - `traceError(namespace, error, payload?)` — emits an error event, or reports it with `console.error` when no listener matches.
206
+ - `trace(label, payload?, scope?, namespace?)` — emits a structured trace event, scoped to the store by default.
207
+ - `traceError(label, error, payload?, scope?, namespace?)` — emits an error event, or reports it with `console.error` when no listener matches.
208
208
  - Helpers: `stateHas()`, `storeHas()`, `getValue()`.
209
209
 
210
210
  ## Tracing
@@ -222,11 +222,13 @@ Events are **not automatically redacted** and may include sensitive action argum
222
222
  ### Consuming events
223
223
 
224
224
  ```ts
225
- import { createPlugin, createTracerRegistry } from 'pinia-plugin-subscription'
225
+ import { createPlugin } from 'pinia-plugin-subscription'
226
+ import { createTracerRegistry } from 'pinia-plugin-subscription/helpers'
226
227
 
227
228
  const traceRegistry = createTracerRegistry()
228
229
  const remove = traceRegistry.addTraceListener({
229
- filter: (event) => event.scope === 'cart' && event.namespace.startsWith('subscription:'),
230
+ filter: (event) => event.scope === 'cart'
231
+ && event.namespace.startsWith('pluginsubscription:subscription:'),
230
232
  handler: (event) => console.log(event.namespace, event.scope, event.payload)
231
233
  })
232
234
 
@@ -237,21 +239,47 @@ pinia.use(createPlugin(subscribers, {
237
239
  remove() // unsubscribe
238
240
  ```
239
241
 
240
- `filter` is evaluated on every event, so you can narrow tracing to a single store without rebuilding. Registries do not share listeners with one another.
242
+ `filter` is evaluated against event metadata before the payload is resolved,
243
+ so you can narrow tracing to a single store without building discarded
244
+ payloads. Registries do not share listeners with one another.
245
+
246
+ For simple metadata filters, provide comparison criteria instead of a
247
+ callback. Supported comparators are `equals` (the default), `contains`,
248
+ `startsWith` and `endsWith`; multiple criteria use `every` by default or
249
+ `some` when requested:
250
+
251
+ ```ts
252
+ traceRegistry.addTraceListener({
253
+ filter: [
254
+ { target: 'scope', value: 'cart' },
255
+ { target: 'namespace', comparator: 'startsWith', value: 'pluginsubscription:subscription:' }
256
+ ]
257
+ }, 'every')
258
+ ```
259
+
260
+ When no `handler` is provided for criteria-based registration, the registry
261
+ uses its styled console listener.
241
262
 
242
263
  ### Event shape
243
264
 
244
265
  | Field | Description |
245
266
  | --- | --- |
246
- | `namespace` | Structured identifier, e.g. `subscription:delivery` |
247
- | `source` | Emitting class name, e.g. `PluginSubscription` |
267
+ | `namespace` | Structured identifier, derived from the label by default |
268
+ | `label` | Human-readable event label |
269
+ | `source` | Source passed to `createTracer`, usually `pinia-plugin-subscription` |
248
270
  | `scope` | Instance identifier, usually `store.$id` |
249
271
  | `payload` | Event data, resolved only when consumed |
250
272
  | `level` | `debug` or `error` |
251
273
  | `timestamp` | `Date.now()` at emission |
252
274
  | `error` | Present on `error` events |
253
275
 
254
- Namespaces emitted by the plugin: `plugin:invoke`, `store:action`, `store:mutation`, `store:reset`, `subscription:delivery`, `subscriber:execute`, `subscriber:hydrate`, `subscriber:afterHydration`.
276
+ By default, `Store` prefixes its class name to labels and derived namespaces.
277
+ Library events use `PluginSubscription` as their prefix (for example,
278
+ `pluginsubscription:store:mutation` and
279
+ `pluginsubscription:subscription:delivery`). Set
280
+ `classNameAddedToTraceNamespace = false` on a `Store` subclass to omit its
281
+ class prefix, or provide an explicit namespace as the fourth argument to
282
+ `trace()` / `traceError()`.
255
283
 
256
284
  ### Emitting your own events
257
285
 
@@ -263,7 +291,14 @@ class CartStore extends Store {
263
291
  }
264
292
  ```
265
293
 
266
- Always prefer the **function form** for `payload`: it is only invoked once a listener matches, so unobserved tracing costs nothing.
294
+ `Store.trace(label, payload?, scope?, namespace?)` and
295
+ `Store.traceError(label, error, payload?, scope?, namespace?)` emit the events.
296
+ The store class name is included in the label by default; set
297
+ `classNameAddedToTraceNamespace = false` to omit it. Unless an explicit
298
+ namespace is provided, the normalized label is used as the namespace.
299
+
300
+ Always prefer the **function form** for `payload`: it is only invoked once a
301
+ listener matches, so unobserved tracing costs nothing.
267
302
 
268
303
  ### Console listener
269
304
 
@@ -271,12 +306,15 @@ Normal trace events do not write to a console. Console output for those events i
271
306
 
272
307
  ```ts
273
308
  import {
274
- createTracerRegistry,
275
- createConsoleTraceListener
276
- } from 'pinia-plugin-subscription'
309
+ createConsoleTraceListener,
310
+ createTracerRegistry
311
+ } from 'pinia-plugin-subscription/helpers'
277
312
 
278
313
  const traceRegistry = createTracerRegistry()
279
- const remove = traceRegistry.addTraceListener(createConsoleTraceListener())
314
+ const remove = traceRegistry.addTraceListener({
315
+ ...createConsoleTraceListener(),
316
+ filter: () => true
317
+ })
280
318
  ```
281
319
 
282
320
  By default, this listener uses the styled plugin console. Pass any object exposing `log` and `error` to use another target:
@@ -284,7 +322,10 @@ By default, this listener uses the styled plugin console. Pass any object exposi
284
322
  Any object exposing `log` and `error` satisfies the `Console` interface, so external logging libraries can be connected without this plugin depending on them:
285
323
 
286
324
  ```ts
287
- const remove = traceRegistry.addTraceListener(createConsoleTraceListener(myLogger))
325
+ const remove = traceRegistry.addTraceListener({
326
+ ...createConsoleTraceListener(myLogger),
327
+ filter: () => true
328
+ })
288
329
  ```
289
330
 
290
331
  ### Error reporting
@@ -309,7 +350,7 @@ The `namespace` replaces the formatted message, store trace events are scoped to
309
350
 
310
351
  ## Testing
311
352
 
312
- - `npm run dev` — runs the dedicated demo app. The library build remains `npm run build` and is intentionally kept separate from the demo entry. The demo ships a complete plugin-authoring example in [`src/demo/extending-pinia-store/`](src/demo/extending-pinia-store/).
353
+ - `npm run dev` — runs the dedicated demo app in [`demo/`](demo/). The library build remains `npm run build` and is intentionally kept separate from the demo entry.
313
354
  - `npm test` — runs the Vitest suite, including typecheck tests (`*.test-d.ts`) validating type-level contracts such as `StoreOptionsExtensions` merging. Coverage reports are available in `coverage/`.
314
355
  - `npm run bundle:check` — measures the emitted bundle size.
315
356
 
@@ -1,21 +1,21 @@
1
1
  var S = Object.defineProperty;
2
2
  var f = (e, t, r) => t in e ? S(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r;
3
- var s = (e, t, r) => f(e, typeof t != "symbol" ? t + "" : t, r);
3
+ var n = (e, t, r) => f(e, typeof t != "symbol" ? t + "" : t, r);
4
4
  import { isRef as g, ref as b, toRef as l } from "vue";
5
5
  import { defineStore as p } from "pinia";
6
- class q {
6
+ class k {
7
7
  constructor(t, r) {
8
- s(this, "_createInstance");
9
- s(this, "_name");
10
- s(this, "_pluginOptions");
11
- s(this, "_storeInstance");
12
- s(this, "_resetStoreCallback");
13
- s(this, "_storeOnActionSubscription");
14
- s(this, "_storeMutationSubscription");
15
- s(this, "_subscriptions");
16
- s(this, "pluginCreated");
17
- s(this, "execution");
18
- s(this, "hydrationScheduler");
8
+ n(this, "_createInstance");
9
+ n(this, "_name");
10
+ n(this, "_pluginOptions");
11
+ n(this, "_storeInstance");
12
+ n(this, "_resetStoreCallback");
13
+ n(this, "_storeOnActionSubscription");
14
+ n(this, "_storeMutationSubscription");
15
+ n(this, "_subscriptions");
16
+ n(this, "pluginCreated");
17
+ n(this, "execution");
18
+ n(this, "hydrationScheduler");
19
19
  this._name = t, this._createInstance = r;
20
20
  }
21
21
  get name() {
@@ -25,7 +25,7 @@ class q {
25
25
  return this._storeInstance;
26
26
  }
27
27
  get pluginOptions() {
28
- return this._pluginOptions ?? {};
28
+ return this._pluginOptions;
29
29
  }
30
30
  set pluginOptions(t) {
31
31
  this._pluginOptions = t;
@@ -49,96 +49,109 @@ class q {
49
49
  }
50
50
  hydrate(t) {
51
51
  }
52
- invoke({ store: t, options: r }, n) {
53
- return this._storeInstance = this._createInstance(t, { ...r, ...this.pluginOptions, createTracer: n }), this._storeInstance ? (this._subscriptions = this._storeInstance.getSubscriptions(), this._storeMutationSubscription = this._storeInstance.storeSubscribe, this._storeOnActionSubscription = this._storeInstance.onAction, this.pluginCreated && this.pluginCreated(t), !0) : !1;
52
+ invoke({ store: t, options: r }, s) {
53
+ return this._storeInstance = this._createInstance(t, {
54
+ ...r,
55
+ ...this.pluginOptions,
56
+ createTracer: s ? () => s?.(this.name) : void 0
57
+ }), this._storeInstance ? (this._subscriptions = this._storeInstance.getSubscriptions(), this._storeMutationSubscription = this._storeInstance.storeSubscribe, this._storeOnActionSubscription = this._storeInstance.onAction, this.pluginCreated && this.pluginCreated(t), !0) : !1;
54
58
  }
55
59
  }
56
- const c = /* @__PURE__ */ new WeakMap(), i = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new WeakSet();
60
+ const u = /* @__PURE__ */ new WeakMap(), a = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new WeakSet();
57
61
  function O(e, t) {
58
62
  if (h.has(e) || typeof e.$dispose != "function")
59
63
  return;
60
64
  const r = e.$dispose;
61
- e.$dispose = (...n) => (c.delete(e), i.delete(t), r.apply(e, n)), h.add(e);
65
+ e.$dispose = (...s) => (u.delete(e), a.delete(t), r.apply(e, s)), h.add(e);
62
66
  }
63
- function K(e, t, r) {
64
- const n = r ? { storeOptions: r } : {};
65
- return typeof t == "function" ? _(
67
+ function L(e, t, r) {
68
+ const s = r ? { storeOptions: r } : {};
69
+ return typeof t == "function" ? d(
66
70
  e,
67
71
  t,
68
- n
72
+ s
69
73
  ) : y(
70
74
  e,
71
75
  t,
72
- n
76
+ s
73
77
  );
74
78
  }
75
- function M(e, t, r) {
76
- const n = r ? { storeOptions: { ...r, enhancedStore: !0 } } : { storeOptions: { enhancedStore: !0 } };
77
- return _(
79
+ function q(e, t, r) {
80
+ const s = r ? { storeOptions: { ...r, enhancedStore: !0 } } : { storeOptions: { enhancedStore: !0 } };
81
+ return d(
78
82
  e,
79
83
  t,
80
- n
84
+ s
81
85
  );
82
86
  }
83
- function _(e, t, r) {
84
- const n = {
87
+ function d(e, t, r) {
88
+ const s = {
85
89
  id: e,
86
90
  extensions: {}
87
- }, a = r?.storeOptions?.enhancedStore === !0, u = p(
91
+ }, i = r?.storeOptions?.enhancedStore === !0, o = p(
88
92
  e,
89
- () => t(n),
93
+ () => t(s),
90
94
  r
91
95
  );
92
- return Object.assign(((...d) => {
93
- a && i.set(e, n);
94
- const o = u(...d);
95
- return a && (c.set(o, n), i.delete(e), O(o, e)), o;
96
- }), u);
96
+ return Object.assign(((..._) => {
97
+ i && a.set(e, s);
98
+ const c = o(..._);
99
+ return i && (u.set(c, s), a.delete(e), O(c, e)), c;
100
+ }), o);
97
101
  }
98
102
  function y(e, t, r) {
99
103
  return r && (t = { ...t, ...r ?? {} }), p(e, t);
100
104
  }
101
105
  const A = /* @__PURE__ */ new Set(["_", "$"]);
102
- function x(e) {
106
+ function m(e) {
103
107
  return A.has(e[0]);
104
108
  }
105
109
  function C(e) {
106
110
  const t = e;
107
- return c.get(e) ?? (typeof t?.$id == "string" ? i.get(t.$id) : void 0);
111
+ return u.get(e) ?? (typeof t?.$id == "string" ? a.get(t.$id) : void 0);
108
112
  }
109
- function $(e) {
113
+ function x(e) {
110
114
  const t = e.extensions.enhancedStore ?? e.extensions.extending;
111
115
  if (!t)
112
116
  throw new Error(`${e.id}Store - getEnhancedStore - Error: enhanced store is required`);
113
117
  return t;
114
118
  }
115
- function m(e, t) {
119
+ function T(e, t) {
116
120
  e.extensions.enhancedStore = t, e.extensions.extending = t;
117
121
  }
118
- function P(e) {
119
- return console.warn(`${e.id}Store - getExtendingStore is deprecated. Use getEnhancedStore instead.`), $(e);
122
+ function F(e) {
123
+ return console.warn(`${e.id}Store - getExtendingStore is deprecated. Use getEnhancedStore instead.`), x(e);
120
124
  }
121
- function R(e, t) {
125
+ function K(e, t) {
122
126
  return `${e}-${t.$id}`;
123
127
  }
124
- function I(e) {
128
+ function $(e) {
125
129
  return e ? Array.isArray(e) ? e.length === 0 : typeof e == "object" ? Object.keys(e).length === 0 : typeof e == "string" ? e.trim() === "" : !1 : !(typeof e == "boolean" || typeof e == "number");
126
130
  }
127
- class w {
131
+ class I {
128
132
  constructor(t, r) {
129
- s(this, "_className", "Store");
130
- s(this, "_onAction");
131
- s(this, "_options");
132
- s(this, "_store");
133
- s(this, "_subscriptions", {});
134
- s(this, "_storeSubscribe");
135
- s(this, "_tracer");
136
- s(this, "_createTracer");
133
+ n(this, "_className", "Store");
134
+ n(this, "_createTracer");
135
+ n(this, "_onAction");
136
+ n(this, "_options");
137
+ n(this, "_store");
138
+ n(this, "_storeSubscribe");
139
+ n(this, "_subscriptions", {});
140
+ n(this, "_traceOptions", {
141
+ addClassNameToLabel: !0
142
+ });
143
+ n(this, "_tracer");
137
144
  if (this._options = r.storeOptions, this._store = t, this.initializeTracer(r), this._options?.enhancedStore) {
138
- const n = C(this.store);
139
- n && m(n, this.store);
145
+ const s = C(this.store);
146
+ s && T(s, this.store);
140
147
  }
141
148
  }
149
+ get classNameAddedToTraceNamespace() {
150
+ return this._traceOptions.addClassNameToLabel;
151
+ }
152
+ set classNameAddedToTraceNamespace(t) {
153
+ this._traceOptions.addClassNameToLabel = t;
154
+ }
142
155
  get onAction() {
143
156
  if (this._onAction)
144
157
  return () => ({
@@ -172,13 +185,13 @@ class w {
172
185
  this._storeSubscribe = t;
173
186
  }
174
187
  get tracer() {
175
- return !this._tracer && this._createTracer && (this._tracer = this._createTracer(this._className), this._tracer.scope = this.store.$id), this._tracer;
188
+ return !this._tracer && this._createTracer && (this._tracer = this._createTracer(), this._tracer.scope = this.store.$id), this._tracer;
176
189
  }
177
190
  addToState(t, r) {
178
191
  this.isOptionApi() || g(r) || (r = b(r)), this.state[t] = r, this.store[t] = l(this.state, t);
179
192
  }
180
- addSubscription(t, r, n) {
181
- this._subscriptions[t] = { subscription: r, ...n ?? {} };
193
+ addSubscription(t, r, s) {
194
+ this._subscriptions[t] = { subscription: r, ...s ?? {} };
182
195
  }
183
196
  afterHydration() {
184
197
  }
@@ -193,14 +206,14 @@ class w {
193
206
  return this.getValue(this.state[t]);
194
207
  }
195
208
  getSubscriptions() {
196
- if (!I(this._subscriptions))
209
+ if (!$(this._subscriptions))
197
210
  return this._subscriptions;
198
211
  }
199
212
  getValue(t) {
200
213
  return t?.__v_isRef ? t.value : t;
201
214
  }
202
215
  hasDeniedFirstChar(t) {
203
- return x(t);
216
+ return m(t);
204
217
  }
205
218
  static hasRequiredKeys(t) {
206
219
  return this._requiredKeys !== void 0 && this._requiredKeys?.every((r) => !!t[r]);
@@ -219,27 +232,30 @@ class w {
219
232
  storeHas(t) {
220
233
  return Object.prototype.hasOwnProperty.call(this.store, t);
221
234
  }
222
- trace(t, r) {
223
- this.tracer && this.tracer.debug(t, r);
235
+ trace(t, r, s, i) {
236
+ this.tracer && (t = this.traceLabelFormatter(t), this.tracer.debug(t, i ?? t.toLowerCase(), r, s));
237
+ }
238
+ traceError(t, r, s, i, o) {
239
+ this.tracer ? (t = this.traceLabelFormatter(t), this.tracer.error(t, o ?? t.toLowerCase(), r, s, i)) : console.error(r);
224
240
  }
225
- traceError(t, r, n) {
226
- this.tracer ? this.tracer.error(t, r, n) : console.error(r);
241
+ traceLabelFormatter(t) {
242
+ return this.classNameAddedToTraceNamespace && (t = `${this.constructor.name}:${t}`), t;
227
243
  }
228
244
  }
229
- s(w, "_requiredKeys");
230
- const j = "pinia-plugin-subscription";
245
+ n(I, "_requiredKeys");
246
+ const M = "pinia-plugin-subscription";
231
247
  export {
232
- q as P,
233
- w as S,
234
- M as a,
248
+ k as P,
249
+ I as S,
250
+ q as a,
235
251
  C as b,
236
- $ as c,
237
- K as d,
238
- P as e,
239
- R as g,
240
- x as h,
241
- I as i,
242
- j as p,
243
- m as s
252
+ x as c,
253
+ L as d,
254
+ F as e,
255
+ K as g,
256
+ m as h,
257
+ $ as i,
258
+ M as p,
259
+ T as s
244
260
  };
245
- //# sourceMappingURL=constantes-BsD73jkk.js.map
261
+ //# sourceMappingURL=constantes-CaTNAbzX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constantes-CaTNAbzX.js","sources":["../../src/core/PluginSubscriber.ts","../../src/utils/store.ts","../../src/utils/validation/index.ts","../../src/core/Store.ts"],"sourcesContent":["import Store from \"./Store\";\nimport type { PiniaPluginContext, Store as PiniaStore } from \"pinia\";\nimport type { AnyObject } from \"../types\";\nimport type {\n PluginExecutionOptions,\n PluginHydrationScheduler,\n PluginSubscriber as PluginSubscriberInterface,\n PluginSubscriptions,\n StoreClassConstructorParams,\n StoreMutationSubscription,\n StoreOnActionSubscription\n} from \"../types/plugin\";\nimport type Tracer from \"../system/Tracer\";\n\n\n\ntype CreateInstance<Instance = Store> = (store: PiniaStore, options: StoreClassConstructorParams) => Instance | undefined\n\n\n/**\n * Type definition for the function used to create an instance of a store.\n * @template Instance The type of the store instance, defaulting to the base Store class.\n * @param store The Pinia store for which the instance is being created.\n * @param options Additional options for creating the store instance.\n * @returns The created store instance or undefined if creation fails.\n */\nexport default abstract class PluginSubscriber<Instance extends Store> implements PluginSubscriberInterface {\n private _createInstance: CreateInstance\n private _name: string\n private _pluginOptions?: StoreClassConstructorParams\n private _storeInstance?: Instance\n /** Callback function to reset the store instance, if needed. */\n protected _resetStoreCallback?: (store?: PiniaStore) => void\n private _storeOnActionSubscription?: StoreOnActionSubscription\n private _storeMutationSubscription?: StoreMutationSubscription\n private _subscriptions?: PluginSubscriptions\n /**\n * Called when the plugin subscriber has been created for a specific store.\n * This callback can be used to perform any initialization or setup required for the plugin subscriber.\n */\n protected pluginCreated?: (store: PiniaStore) => void\n /** Options for the plugin subscriber's execution. */\n public execution?: PluginExecutionOptions\n /** Scheduler for handling the hydration process of the plugin subscriber. */\n public hydrationScheduler?: PluginHydrationScheduler\n\n\n get name(): string {\n return this._name;\n }\n\n get storeInstance(): Instance | undefined {\n return this._storeInstance\n }\n\n get pluginOptions(): StoreClassConstructorParams | undefined {\n return this._pluginOptions;\n }\n\n set pluginOptions(options: StoreClassConstructorParams | undefined) {\n this._pluginOptions = options;\n }\n\n get resetStoreCallback(): ((store?: PiniaStore) => void) | undefined {\n return this._resetStoreCallback as ((store?: PiniaStore) => void) | undefined;\n }\n\n get storeOnActionSubscription(): StoreOnActionSubscription | undefined {\n return this._storeOnActionSubscription;\n }\n\n get storeMutationSubscription(): StoreMutationSubscription | undefined {\n return this._storeMutationSubscription;\n }\n\n get subscriptions(): PluginSubscriptions | undefined {\n return this._subscriptions\n }\n\n set subscriptions(subscriptions: PluginSubscriptions) {\n this._subscriptions = subscriptions\n }\n\n\n constructor(pluginName: string, createInstanceFunction: CreateInstance) {\n this._name = pluginName\n this._createInstance = createInstanceFunction\n }\n\n /**\n * Called after the store has been hydrated.\n * @param context The Pinia plugin context containing the store and options.\n * @returns A promise that resolves when the post-hydration process is complete, or void if synchronous.\n */\n public afterHydration(context: PiniaPluginContext): void | Promise<void> {\n return\n }\n\n /**\n * Called when the plugin subscriber needs to hydrate its state.\n * @param context The Pinia plugin context containing the store and options.\n * @returns A promise that resolves when the hydration process is complete, or void if synchronous.\n */\n public hydrate(context: PiniaPluginContext): void | Promise<void> {\n return\n }\n\n /**\n * Invokes the plugin subscriber with the given context and optional tracer creation function.\n * @param context The Pinia plugin context containing the store and options.\n * @param createTracer Optional function to create a tracer for the plugin.\n * @returns True if the plugin was successfully invoked, otherwise false.\n */\n public invoke({ store, options }: PiniaPluginContext, createTracer?: (name: string) => Tracer): boolean {\n this._storeInstance = this._createInstance(store, {\n ...options,\n ...this.pluginOptions,\n createTracer: createTracer ? () => createTracer?.(this.name) : undefined\n }) as Instance\n\n if (!this._storeInstance) {\n return false\n }\n\n this._subscriptions = this._storeInstance.getSubscriptions()\n this._storeMutationSubscription = this._storeInstance.storeSubscribe\n this._storeOnActionSubscription = this._storeInstance.onAction\n\n if (this.pluginCreated) {\n this.pluginCreated(store)\n }\n\n return true\n }\n}","import { defineStore } from \"pinia\"\nimport type {\n DefineSetupStoreOptions,\n DefineStoreOptions,\n SetupStoreDefinition,\n StateTree,\n Store,\n StoreDefinition,\n _ExtractActionsFromSetupStore,\n _ExtractGettersFromSetupStore,\n _ExtractStateFromSetupStore,\n _GettersTree\n} from \"pinia\"\nimport type { AnyObject } from \"../types\"\nimport type {\n DefineAStoreDefinition,\n DefineAStoreSetupContext,\n EmptyExtensions,\n StoreOptions\n} from \"../types/store\"\nimport type { PluginStoreOptions } from \"../types/plugin\"\n\n\nexport const itemState = {\n '@id': undefined,\n id: undefined\n}\n\ntype DefineAStoreSetup<SS, TExtraExtensions extends Record<string, unknown> = EmptyExtensions> =\n (ctx: DefineAStoreSetupContext<SS, TExtraExtensions>) => SS\n\n/**\n * Options parameter of pinia's `defineStore()` for setup stores, derived from\n * the setup function return type.\n */\ntype DefineAStoreSetupOptions<Id extends string, SS> = DefineSetupStoreOptions<\n Id,\n _ExtractStateFromSetupStore<SS>,\n _ExtractGettersFromSetupStore<SS>,\n _ExtractActionsFromSetupStore<SS>\n>\n\nconst defineAStoreSetupContexts = new WeakMap<object, DefineAStoreSetupContext<AnyObject>>()\nconst defineAStoreSetupContextsById = new Map<string, DefineAStoreSetupContext<AnyObject>>()\nconst setupContextDisposeWrappedStores = new WeakSet<object>()\n\nfunction registerSetupContextCleanupOnDispose(\n store: AnyObject,\n id: string\n): void {\n if (setupContextDisposeWrappedStores.has(store) || typeof store.$dispose !== 'function') {\n return\n }\n\n const originalDispose = store.$dispose as (...args: unknown[]) => unknown\n store.$dispose = (...args: unknown[]) => {\n defineAStoreSetupContexts.delete(store)\n defineAStoreSetupContextsById.delete(id)\n return originalDispose.apply(store, args)\n }\n setupContextDisposeWrappedStores.add(store)\n}\n\n/**\n * Define a store with the setup API. State, getters and actions are inferred\n * from the setup function return, exactly like pinia's `defineStore`, so\n * store members are listed by IDEs and action prototypes are preserved.\n * @template Id The type of the store identifier.\n * @template SS The type of the setup function return.\n * @param id The unique identifier for the store.\n * @param storeDefinition The setup function defining the store.\n * @param options Optional store options.\n * @returns The defined store.\n */\nexport function defineAStore<Id extends string, SS>(\n id: Id,\n storeDefinition: (ctx?: DefineAStoreSetupContext<AnyObject>) => SS,\n options?: StoreOptions\n): SetupStoreDefinition<Id, SS>\n/**\n * Define a store with the options API, mirroring pinia's `defineStore` inference.\n * @template Id The type of the store identifier.\n * @template S The type of the store's state.\n * @template G The type of the store's getters.\n * @template A The type of the store's actions.\n * @param id The unique identifier for the store.\n * @param storeDefinition The store options definition.\n * @param options Optional store options.\n * @returns The defined store.\n */\nexport function defineAStore<Id extends string, S extends StateTree = {}, G extends _GettersTree<S> = {}, A = {}>(\n id: Id,\n storeDefinition: Omit<DefineStoreOptions<Id, S, G, A>, 'id'>,\n options?: StoreOptions\n): StoreDefinition<Id, S, G, A>\n/**\n * Define a store with explicit store/state types, e.g. when plugins augment\n * the store with members not returned by the setup function.\n * @template Sto The type of the store.\n * @template Sta The type of the store's state.\n * @param id The unique identifier for the store.\n * @param storeDefinition The store definition, either as an options object or a setup function.\n * @param options Optional store options.\n * @returns The defined store.\n */\nexport function defineAStore<Sto, Sta>(\n id: string,\n storeDefinition:\n | Omit<DefineStoreOptions<string, StateTree & Sta, AnyObject, Partial<Sto>>, 'id'>\n | ((ctx?: DefineAStoreSetupContext<Sto & Sta>) => AnyObject),\n options?: StoreOptions\n): DefineAStoreDefinition<Sto, Sta>\nexport function defineAStore(\n id: string,\n storeDefinition:\n | Omit<DefineStoreOptions<string, StateTree, AnyObject, AnyObject>, 'id'>\n | DefineAStoreSetup<AnyObject>,\n options?: StoreOptions\n): StoreDefinition {\n const storeOptions: PluginStoreOptions = options ? { storeOptions: options } : {} as PluginStoreOptions\n\n return (typeof storeDefinition === 'function'\n ? defineAStoreSetup(\n id,\n storeDefinition as DefineAStoreSetup<AnyObject>,\n storeOptions\n )\n : defineAStoreOptionApi(\n id,\n storeDefinition,\n storeOptions\n )) as StoreDefinition\n}\n\n/**\n * Define a store with a required, fully typed setup context. State, getters\n * and actions are inferred from the setup function return.\n * @template Id The type of the store identifier.\n * @template SS The type of the setup function return.\n * @template TExtraExtensions The type of the store's extra extensions.\n * @param id The unique identifier for the store.\n * @param storeDefinition The setup function defining the store.\n * @param options Optional store options.\n * @returns The defined store with setup context.\n */\nexport function defineAStoreCtx<Id extends string, SS, TExtraExtensions extends Record<string, unknown> = EmptyExtensions>(\n id: Id,\n storeDefinition: (ctx: DefineAStoreSetupContext<AnyObject, TExtraExtensions>) => SS,\n options?: StoreOptions\n): SetupStoreDefinition<Id, SS>\n/**\n * Define a store with a setup context and explicit store/state types, e.g.\n * when plugins augment the store with members not returned by the setup function.\n * @template Sto The type of the store.\n * @template Sta The type of the store's state.\n * @template TExtraExtensions The type of the store's extra extensions.\n * @param id The unique identifier for the store.\n * @param storeDefinition The setup function defining the store.\n * @param options Optional store options.\n * @returns The defined store with setup context.\n */\nexport function defineAStoreCtx<Sto, Sta, TExtraExtensions extends Record<string, unknown> = EmptyExtensions>(\n id: string,\n storeDefinition: (ctx: DefineAStoreSetupContext<Sto & Sta, TExtraExtensions>) => AnyObject,\n options?: StoreOptions\n): DefineAStoreDefinition<Sto, Sta>\nexport function defineAStoreCtx(\n id: string,\n storeDefinition: DefineAStoreSetup<AnyObject, any>,\n options?: StoreOptions\n): StoreDefinition {\n const storeOptions: PluginStoreOptions = options\n ? { storeOptions: { ...options, enhancedStore: true } }\n : { storeOptions: { enhancedStore: true } } as PluginStoreOptions\n\n return defineAStoreSetup(\n id,\n storeDefinition,\n storeOptions\n ) as StoreDefinition\n}\n\nexport function defineAStoreSetup<Id extends string, SS>(\n id: Id,\n storeDefinition: DefineAStoreSetup<SS>,\n options: PluginStoreOptions\n): SetupStoreDefinition<Id, SS> {\n const setupContext: DefineAStoreSetupContext<SS> = {\n id,\n extensions: {}\n }\n\n const shouldStoreSetupContext = options?.storeOptions?.enhancedStore === true\n\n // `storeOptions` augments pinia's DefineStoreOptionsBase (see createPlugin.ts);\n // the assertion stays valid in compilation units where the augmentation is not loaded.\n const useStore = defineStore(\n id,\n () => storeDefinition(setupContext),\n options as unknown as DefineAStoreSetupOptions<Id, SS>\n )\n\n return Object.assign(((...args: Parameters<typeof useStore>) => {\n if (shouldStoreSetupContext) {\n defineAStoreSetupContextsById.set(id, setupContext as DefineAStoreSetupContext<AnyObject>)\n }\n\n const store = useStore(...args)\n\n if (shouldStoreSetupContext) {\n defineAStoreSetupContexts.set(store, setupContext as DefineAStoreSetupContext<AnyObject>)\n defineAStoreSetupContextsById.delete(id)\n registerSetupContextCleanupOnDispose(store as AnyObject, id)\n }\n\n return store\n }) as typeof useStore, useStore)\n}\n\nexport function defineAStoreOptionApi<Id extends string, S extends StateTree = {}, G extends _GettersTree<S> = {}, A = {}>(\n id: Id,\n storeDefinition: Omit<DefineStoreOptions<Id, S, G, A>, 'id'>,\n options?: PluginStoreOptions\n): StoreDefinition<Id, S, G, A> {\n if (options) {\n storeDefinition = { ...storeDefinition, ...(options ?? {}) }\n }\n\n return defineStore(id, storeDefinition)\n}\n\nconst deniedFirstChar = new Set<string>(['_', '$'])\n\n/**\n * Check if a property has a denied first character : ['_', '$'].\n * @param property The property name to check.\n * @returns True if the property has a denied first character, false otherwise.\n */\nexport function hasDeniedFirstChar(property: string): boolean {\n return deniedFirstChar.has(property[0] as string)\n}\n\n/**\n * Get the setup context associated with a store instance (or pending store id).\n * @param store The store instance, or an object exposing the store `$id`.\n * @returns The setup context when the store was defined with `enhancedStore` enabled, undefined otherwise.\n */\nexport function getDefineAStoreSetupContext(store: object): DefineAStoreSetupContext<AnyObject> | undefined {\n const storeRecord = store as AnyObject\n\n return defineAStoreSetupContexts.get(store)\n ?? (typeof storeRecord?.$id === 'string'\n ? defineAStoreSetupContextsById.get(storeRecord.$id)\n : undefined)\n}\n\n/**\n * Get the enhanced store from the context.\n * @template TEnhancedStore The type of the enhanced store.\n * @param ctx The context containing the extensions.\n * @returns The enhanced store casted to the specified types.\n */\nexport function getEnhancedStore<TEnhancedStore>(\n ctx: DefineAStoreSetupContext<TEnhancedStore>\n): TEnhancedStore {\n const enhancedStore = ctx.extensions.enhancedStore ?? ctx.extensions.extending\n\n if (!enhancedStore) {\n throw new Error(`${ctx.id}Store - getEnhancedStore - Error: enhanced store is required`)\n }\n\n return enhancedStore\n}\n\n/**\n * Set the enhanced store in context with deprecated alias support.\n * @template TEnhancedStore The type of the enhanced store.\n * @param ctx The context containing the extensions.\n * @param store The store to expose as enhancement.\n */\nexport function setEnhancedStore<TEnhancedStore>(\n ctx: DefineAStoreSetupContext<TEnhancedStore>,\n store: TEnhancedStore\n): void {\n ctx.extensions.enhancedStore = store\n ctx.extensions.extending = store\n}\n\n/**\n * @deprecated Use getEnhancedStore instead.\n */\nexport function getExtendingStore<TEnhancedStore>(\n ctx: DefineAStoreSetupContext<TEnhancedStore>\n): TEnhancedStore {\n console.warn(`${ctx.id}Store - getExtendingStore is deprecated. Use getEnhancedStore instead.`)\n return getEnhancedStore<TEnhancedStore>(ctx)\n}\n\n/**\n * Get the storage key for a given action and store combination.\n * @param actionName The name of the action.\n * @param store The Pinia store instance.\n * @returns The storage key for the action and store combination.\n */\nexport function getActionStoreKey(actionName: string, store: Store): string {\n return `${actionName}-${store.$id}`\n}","export function isEmpty(value: any): boolean {\n if (!value) {\n return (typeof value === 'boolean' || typeof value === 'number') ? false : true\n }\n\n if (Array.isArray(value)) {\n return value.length === 0\n }\n\n if (typeof value === 'object') {\n return Object.keys(value).length === 0\n }\n\n if (typeof value === 'string') {\n return value.trim() === ''\n }\n\n return false\n}","import { isRef, ref, toRef } from \"vue\"\nimport Tracer from \"../system/Tracer\"\nimport { getDefineAStoreSetupContext, hasDeniedFirstChar, setEnhancedStore } from \"../utils/store\"\nimport { isEmpty } from \"../utils/validation\"\n\nimport type {\n PluginSubscriptionOptions,\n PluginSubscriptions,\n StoreClassConstructorParams,\n StoreMutationSubscription,\n StoreMutationSubscriptionCallback,\n StoreMutationSubscriptionReturn,\n StoreOnActionSubscription,\n StoreOnActionSubscriptionCallback,\n StoreOnActionSubscriptionReturn\n} from \"../types/plugin\"\nimport type { Store as PiniaStore, StateTree } from \"pinia\"\nimport type { TracePayload } from \"../types/trace\"\nimport type { AnyObject, PluginSubscriberInterface } from \"../types\"\nimport type { StoreOptions, StatePropertyValue } from \"../types/store\"\n\n/**\n * Base class for a Pinia store with enhanced capabilities.\n * Provides structured tracing, plugin subscriptions, and state management utilities.\n * @remarks\n * This class is intended to be extended by specific store implementations\n * that require enhanced capabilities such as structured tracing and plugin subscriptions.\n */\nexport default class Store {\n protected _className = 'Store'\n private _createTracer?: () => Tracer\n private _onAction?: StoreOnActionSubscriptionCallback\n private _options: StoreOptions\n private _store: PiniaStore\n private _storeSubscribe?: StoreMutationSubscriptionCallback\n private _subscriptions: PluginSubscriptions = {}\n private _traceOptions: Record<string, boolean> = {\n /** Indicates whether to add the class name to the namespace for tracing purposes. */\n addClassNameToLabel: true,\n }\n private _tracer?: Tracer\n\n protected static _requiredKeys?: string[]\n\n get classNameAddedToTraceNamespace(): boolean {\n return this._traceOptions.addClassNameToLabel\n }\n\n set classNameAddedToTraceNamespace(value: boolean) {\n this._traceOptions.addClassNameToLabel = value\n }\n\n get onAction(): StoreOnActionSubscription | undefined {\n if (!this._onAction) {\n return\n }\n\n return () => ({\n store: this.store as PiniaStore,\n callback: this._onAction\n }) as StoreOnActionSubscriptionReturn\n }\n\n set onAction(onAction: StoreOnActionSubscriptionCallback) {\n this._onAction = onAction\n }\n\n get options(): StoreOptions { return this._options }\n\n get state(): StateTree { return this._store.$state }\n\n set state(state: StateTree) { this._store.$state = state }\n\n get store(): AnyObject { return this._store }\n\n get storeSubscribe(): StoreMutationSubscription | undefined {\n if (!this._storeSubscribe) {\n return\n }\n\n return () => ({\n store: this.store as PiniaStore,\n callback: this._storeSubscribe\n }) as StoreMutationSubscriptionReturn\n }\n\n set storeSubscribe(storeSubscribe: StoreMutationSubscriptionCallback) {\n this._storeSubscribe = storeSubscribe\n }\n\n /**\n * Returns the structured trace emitter of this store.\n * Built lazily so that subclasses overriding `_className` are reflected.\n */\n protected get tracer(): Tracer | undefined {\n if (!this._tracer && this._createTracer) {\n this._tracer = this._createTracer()\n this._tracer.scope = this.store.$id\n }\n\n return this._tracer\n }\n\n /**\n * Constructs a new instance of the store.\n * @param store The Pinia store instance.\n * @param options The plugin store options and subscription options.\n * @remarks\n * This constructor is typically called by the `customizeStore` static method\n * to create an instance of the store with the provided Pinia store and options.\n * @see PluginStoreOptions\n * @see PluginSubscriptionOptions\n */\n constructor(store: PiniaStore, options: StoreClassConstructorParams) {\n this._options = options.storeOptions as StoreOptions\n this._store = store\n this.initializeTracer(options)\n\n if (this._options?.enhancedStore) {\n const ctx = getDefineAStoreSetupContext(this.store)\n\n if (ctx) {\n setEnhancedStore(ctx, this.store)\n }\n }\n }\n\n /**\n * Adds a property to the state of this store.\n * @param name The name of the property to add.\n * @param value The value of the property to add.\n */\n addToState(name: string, value?: StatePropertyValue): void {\n if (!this.isOptionApi()) {\n if (!isRef(value)) {\n value = ref<StatePropertyValue>(value)\n }\n }\n\n this.state[name] = value\n this.store[name] = toRef(this.state, name)\n }\n\n /**\n * Adds a subscription for a specific plugin to this store.\n * @param pluginName The name of the plugin for which the subscription is being added.\n * @param subscription The subscription callback or object to add.\n * @param options Additional options for the subscription, including subscription options and target stores.\n */\n addSubscription(\n pluginName: string,\n subscription: PluginSubscriberInterface,\n options?: { subscriptionOptions?: StoreOptions, stores?: PiniaStore[] }\n ): void {\n this._subscriptions[pluginName] = { subscription, ...(options ?? {}) }\n }\n\n /**\n * Called after the store has been hydrated.\n * @returns A promise that resolves when the post-hydration process is complete, or void if synchronous.\n */\n afterHydration(): void | Promise<void> {\n return\n }\n\n /**\n * Create and return a class instance\n * @param store \n * @param options \n * @template Instance The type of the store instance being created.\n * @returns The created store instance of type `Instance`, or undefined if the required keys are not present.\n */\n static customizeStore<Instance extends Store>(\n store: PiniaStore,\n options: StoreClassConstructorParams\n ): Instance | undefined {\n if (options.storeOptions && this.hasRequiredKeys(options.storeOptions)) {\n return new this(store, options) as Instance\n }\n }\n\n /**\n * Retrieves the value of a specific store option.\n * @param optionName The name of the store option to retrieve.\n * @returns The value of the specified store option, or undefined if not found.\n */\n getOption(optionName: keyof StoreOptions) {\n return this.options && (this.options as StoreOptions)[optionName]\n }\n\n /**\n * Retrieves the value of a specific state property.\n * @param propertyName The name of the state property to retrieve.\n * @returns The value of the specified state property, or undefined if not found.\n */\n getStatePropertyValue(propertyName: string) {\n return this.getValue(this.state[propertyName])\n }\n\n /**\n * Retrieves all plugin subscriptions for this store.\n * @returns An object containing all plugin subscriptions, or undefined if there are none.\n */\n getSubscriptions(): PluginSubscriptions | undefined {\n if (isEmpty(this._subscriptions)) {\n return\n }\n\n return this._subscriptions\n }\n\n /**\n * Retrieves the actual value from a potentially reactive reference.\n * @param value The value to unwrap.\n * @returns The unwrapped value if it is a reactive reference, otherwise the original value.\n */\n getValue(value: any) {\n return value?.__v_isRef ? value.value : value\n }\n\n /**\n * Checks if the given property name has a denied first character.\n * @param property The property name to check.\n * @returns True if the property name has a denied first character, otherwise false.\n */\n protected hasDeniedFirstChar(property: string): boolean {\n return hasDeniedFirstChar(property)\n }\n\n /**\n * Checks if the given options object has all the required keys.\n * @param options The options object to check.\n * @returns True if all required keys are present, otherwise false.\n */\n protected static hasRequiredKeys(options: AnyObject): boolean {\n return this._requiredKeys !== undefined && this._requiredKeys?.every(requiredKey => !!options[requiredKey])\n }\n\n /**\n * Hydrates the store, potentially performing asynchronous operations.\n * @returns void or a Promise that resolves when hydration is complete.\n */\n hydrate(): void | Promise<void> {\n return\n }\n\n /**\n * Initializes the tracer for plugin subscriptions if the createTracer option is provided.\n * @param options The plugin subscription options containing the createTracer function.\n */\n private initializeTracer(options: Omit<PluginSubscriptionOptions, 'createTracer'> & { createTracer?: () => Tracer }) {\n this._createTracer = options?.createTracer\n }\n\n /**\n * Checks if the store is using the Options API.\n * @returns True if the store is using the Options API, otherwise false.\n */\n isOptionApi(): boolean { return this.store._isOptionsAPI }\n\n /**\n * Checks if the state object has the specified property.\n * @param property The property name to check.\n * @returns True if the state object has the property, otherwise false.\n */\n stateHas(property: string): boolean { return Object.prototype.hasOwnProperty.call(this.state, property) }\n\n /**\n * Checks if the store object has the specified property.\n * @param property The property name to check.\n * @returns True if the store object has the property, otherwise false.\n */\n storeHas(property: string): boolean { return Object.prototype.hasOwnProperty.call(this.store, property) }\n\n /**\n * Emits a structured trace event scoped to this store.\n * Prefer the factory form for `payload`: it is only resolved when consumed.\n */\n trace(label: string, payload?: TracePayload, scope?: string, namespace?: string): void {\n if (this.tracer) {\n label = this.traceLabelFormatter(label)\n this.tracer.debug(label, namespace ?? label.toLowerCase(), payload, scope)\n }\n }\n\n /**\n * Emits a structured error event, or rethrows it when no listener matches.\n */\n traceError(label: string, error: unknown, payload?: TracePayload, scope?: string, namespace?: string): void {\n if (this.tracer) {\n label = this.traceLabelFormatter(label)\n this.tracer.error(label, namespace ?? label.toLowerCase(), error, payload, scope)\n } else {\n console.error(error)\n }\n }\n\n private traceLabelFormatter(label: string): string {\n if (this.classNameAddedToTraceNamespace) {\n label = `${this.constructor.name}:${label}`\n }\n\n return label\n }\n}"],"names":["PluginSubscriber","pluginName","createInstanceFunction","__publicField","options","subscriptions","context","store","createTracer","defineAStoreSetupContexts","defineAStoreSetupContextsById","setupContextDisposeWrappedStores","registerSetupContextCleanupOnDispose","id","originalDispose","args","storeOptions","storeDefinition","defineAStoreSetup","defineAStoreOptionApi","defineAStoreCtx","setupContext","shouldStoreSetupContext","useStore","defineStore","deniedFirstChar","property","getDefineAStoreSetupContext","storeRecord","getEnhancedStore","ctx","enhancedStore","setEnhancedStore","getExtendingStore","getActionStoreKey","actionName","isEmpty","value","Store","onAction","state","storeSubscribe","name","isRef","ref","toRef","subscription","optionName","propertyName","hasDeniedFirstChar","requiredKey","label","payload","scope","namespace","error"],"mappings":"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"}
@@ -1,9 +1,8 @@
1
1
  import Store from "./Store";
2
2
  import type { PiniaPluginContext, Store as PiniaStore } from "pinia";
3
- import type { AnyObject } from "../types";
4
- import type { PluginExecutionOptions, PluginHydrationScheduler, PluginSubscriber as PluginSubscriberInterface, PluginSubscriptions, StoreMutationSubscription, StoreOnActionSubscription } from "../types/plugin";
3
+ import type { PluginExecutionOptions, PluginHydrationScheduler, PluginSubscriber as PluginSubscriberInterface, PluginSubscriptions, StoreClassConstructorParams, StoreMutationSubscription, StoreOnActionSubscription } from "../types/plugin";
5
4
  import type Tracer from "../system/Tracer";
6
- type CreateInstance<Instance = Store> = (store: PiniaStore, options: AnyObject) => Instance | undefined;
5
+ type CreateInstance<Instance = Store> = (store: PiniaStore, options: StoreClassConstructorParams) => Instance | undefined;
7
6
  /**
8
7
  * Type definition for the function used to create an instance of a store.
9
8
  * @template Instance The type of the store instance, defaulting to the base Store class.
@@ -32,8 +31,8 @@ export default abstract class PluginSubscriber<Instance extends Store> implement
32
31
  hydrationScheduler?: PluginHydrationScheduler;
33
32
  get name(): string;
34
33
  get storeInstance(): Instance | undefined;
35
- get pluginOptions(): AnyObject;
36
- set pluginOptions(options: AnyObject | undefined);
34
+ get pluginOptions(): StoreClassConstructorParams | undefined;
35
+ set pluginOptions(options: StoreClassConstructorParams | undefined);
37
36
  get resetStoreCallback(): ((store?: PiniaStore) => void) | undefined;
38
37
  get storeOnActionSubscription(): StoreOnActionSubscription | undefined;
39
38
  get storeMutationSubscription(): StoreMutationSubscription | undefined;
@@ -1,23 +1,29 @@
1
1
  import Tracer from "../system/Tracer";
2
- import type { PluginSubscriptionOptions, PluginSubscriptions, StoreMutationSubscription, StoreMutationSubscriptionCallback, StoreOnActionSubscription, StoreOnActionSubscriptionCallback } from "../types/plugin";
2
+ import type { PluginSubscriptions, StoreClassConstructorParams, StoreMutationSubscription, StoreMutationSubscriptionCallback, StoreOnActionSubscription, StoreOnActionSubscriptionCallback } from "../types/plugin";
3
3
  import type { Store as PiniaStore, StateTree } from "pinia";
4
4
  import type { TracePayload } from "../types/trace";
5
5
  import type { AnyObject, PluginSubscriberInterface } from "../types";
6
- import type { StoreOptions, StatePropertyValue, PluginStoreOptions } from "../types/store";
6
+ import type { StoreOptions, StatePropertyValue } from "../types/store";
7
7
  /**
8
8
  * Base class for a Pinia store with enhanced capabilities.
9
9
  * Provides structured tracing, plugin subscriptions, and state management utilities.
10
+ * @remarks
11
+ * This class is intended to be extended by specific store implementations
12
+ * that require enhanced capabilities such as structured tracing and plugin subscriptions.
10
13
  */
11
14
  export default class Store {
12
15
  protected _className: string;
16
+ private _createTracer?;
13
17
  private _onAction?;
14
18
  private _options;
15
19
  private _store;
16
- private _subscriptions;
17
20
  private _storeSubscribe?;
21
+ private _subscriptions;
22
+ private _traceOptions;
18
23
  private _tracer?;
19
- private _createTracer?;
20
24
  protected static _requiredKeys?: string[];
25
+ get classNameAddedToTraceNamespace(): boolean;
26
+ set classNameAddedToTraceNamespace(value: boolean);
21
27
  get onAction(): StoreOnActionSubscription | undefined;
22
28
  set onAction(onAction: StoreOnActionSubscriptionCallback);
23
29
  get options(): StoreOptions;
@@ -31,7 +37,17 @@ export default class Store {
31
37
  * Built lazily so that subclasses overriding `_className` are reflected.
32
38
  */
33
39
  protected get tracer(): Tracer | undefined;
34
- constructor(store: PiniaStore, options: PluginStoreOptions & PluginSubscriptionOptions);
40
+ /**
41
+ * Constructs a new instance of the store.
42
+ * @param store The Pinia store instance.
43
+ * @param options The plugin store options and subscription options.
44
+ * @remarks
45
+ * This constructor is typically called by the `customizeStore` static method
46
+ * to create an instance of the store with the provided Pinia store and options.
47
+ * @see PluginStoreOptions
48
+ * @see PluginSubscriptionOptions
49
+ */
50
+ constructor(store: PiniaStore, options: StoreClassConstructorParams);
35
51
  /**
36
52
  * Adds a property to the state of this store.
37
53
  * @param name The name of the property to add.
@@ -57,9 +73,10 @@ export default class Store {
57
73
  * Create and return a class instance
58
74
  * @param store
59
75
  * @param options
60
- * @returns
76
+ * @template Instance The type of the store instance being created.
77
+ * @returns The created store instance of type `Instance`, or undefined if the required keys are not present.
61
78
  */
62
- static customizeStore<Instance extends Store>(store: PiniaStore, options: PluginStoreOptions & PluginSubscriptionOptions): Instance | undefined;
79
+ static customizeStore<Instance extends Store>(store: PiniaStore, options: StoreClassConstructorParams): Instance | undefined;
63
80
  /**
64
81
  * Retrieves the value of a specific store option.
65
82
  * @param optionName The name of the store option to retrieve.
@@ -126,9 +143,10 @@ export default class Store {
126
143
  * Emits a structured trace event scoped to this store.
127
144
  * Prefer the factory form for `payload`: it is only resolved when consumed.
128
145
  */
129
- trace(namespace: string, payload?: TracePayload): void;
146
+ trace(label: string, payload?: TracePayload, scope?: string, namespace?: string): void;
130
147
  /**
131
148
  * Emits a structured error event, or rethrows it when no listener matches.
132
149
  */
133
- traceError(namespace: string, error: unknown, payload?: TracePayload): void;
150
+ traceError(label: string, error: unknown, payload?: TracePayload, scope?: string, namespace?: string): void;
151
+ private traceLabelFormatter;
134
152
  }