@toyz/loom-analytics 0.1.0 → 0.1.1

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/dist/track.d.ts CHANGED
@@ -4,16 +4,25 @@
4
4
  * Raw TC39 Stage 3 decorator for event tracking.
5
5
  * Dispatches on `context.kind` to support class, method, and accessor targets.
6
6
  *
7
+ * - **class**: wraps connectedCallback — fires track() on mount
7
8
  * - **method**: wraps the method — fires track() after each invocation
8
9
  * - **accessor**: wraps the setter — fires track() on every set
9
10
  *
10
11
  * ```ts
11
- * @track("user.save")
12
+ * // Static metadata
13
+ * @track("user.save", { section: "profile" })
12
14
  * handleSave() { ... }
13
15
  *
16
+ * // Dynamic metadata — fn receives the element instance
17
+ * @track("page.view", el => ({ userId: el.userId, route: el.currentRoute }))
18
+ * class Dashboard extends LoomElement { ... }
19
+ *
14
20
  * @track("theme.change")
15
21
  * accessor theme = "dark";
16
22
  * ```
17
23
  */
18
- export declare function track(event: string, meta?: Record<string, any>): (value: any, context: DecoratorContext) => any;
24
+ /** Second arg: static object OR a function that receives the element and returns metadata */
25
+ type MetaArg = Record<string, any> | ((el: any) => Record<string, any>);
26
+ export declare function track(event: string, meta?: MetaArg): (value: any, context: DecoratorContext) => any;
27
+ export {};
19
28
  //# sourceMappingURL=track.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IACrD,OAAO,GAAG,EAAE,SAAS,gBAAgB,KAAG,GAAG,CA2DpD"}
1
+ {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,6FAA6F;AAC7F,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AASxE,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,IACzC,OAAO,GAAG,EAAE,SAAS,gBAAgB,KAAG,GAAG,CAqDpD"}
package/dist/track.js CHANGED
@@ -4,60 +4,68 @@
4
4
  * Raw TC39 Stage 3 decorator for event tracking.
5
5
  * Dispatches on `context.kind` to support class, method, and accessor targets.
6
6
  *
7
+ * - **class**: wraps connectedCallback — fires track() on mount
7
8
  * - **method**: wraps the method — fires track() after each invocation
8
9
  * - **accessor**: wraps the setter — fires track() on every set
9
10
  *
10
11
  * ```ts
11
- * @track("user.save")
12
+ * // Static metadata
13
+ * @track("user.save", { section: "profile" })
12
14
  * handleSave() { ... }
13
15
  *
16
+ * // Dynamic metadata — fn receives the element instance
17
+ * @track("page.view", el => ({ userId: el.userId, route: el.currentRoute }))
18
+ * class Dashboard extends LoomElement { ... }
19
+ *
14
20
  * @track("theme.change")
15
21
  * accessor theme = "dark";
16
22
  * ```
17
23
  */
18
24
  import { app } from "@toyz/loom";
19
25
  import { AnalyticsTransport } from "./transport";
26
+ /** Resolve meta: if it's a function, call it with the element; otherwise spread it */
27
+ function resolveMeta(meta, el) {
28
+ if (!meta)
29
+ return {};
30
+ if (typeof meta === "function")
31
+ return meta(el);
32
+ return { ...meta };
33
+ }
20
34
  export function track(event, meta) {
21
35
  return (value, context) => {
22
36
  switch (context.kind) {
23
37
  case "class": {
24
- // Class decorator: stamp an addInitializer that fires on connect
25
- // Since we can't hook connectedCallback from here, we stamp a marker
26
- // and let the test/runtime check for it. For simplicity, we fire
27
- // track at class-definition time for class-level usage (page views).
28
- // Actually — we can use addInitializer for per-instance setup, but
29
- // it doesn't have `this` for class decorators in esbuild.
30
- // Pragmatic solution: wrap the constructor via a returned subclass.
31
- // BUT esbuild drops class decorator return values.
32
- // Final approach: directly wrap connectedCallback on the prototype.
33
38
  const ctor = value;
34
39
  const originalConnected = ctor.prototype.connectedCallback;
35
40
  ctor.prototype.connectedCallback = function () {
36
41
  if (originalConnected)
37
42
  originalConnected.call(this);
38
43
  app.get(AnalyticsTransport).track(event, {
39
- ...meta,
44
+ ...resolveMeta(meta, this),
40
45
  element: this.tagName.toLowerCase(),
41
46
  });
42
47
  };
43
48
  break;
44
49
  }
45
50
  case "method": {
46
- // Method decorator: wrap to fire after invocation
47
51
  const method = value;
48
52
  const key = String(context.name);
49
53
  context.addInitializer(function () {
50
54
  const original = method;
55
+ const self = this;
51
56
  this[key] = function (...args) {
52
- const result = original.apply(this, args);
53
- app.get(AnalyticsTransport).track(event, { ...meta, method: key, args });
57
+ const result = original.apply(self, args);
58
+ app.get(AnalyticsTransport).track(event, {
59
+ ...resolveMeta(meta, self),
60
+ method: key,
61
+ args,
62
+ });
54
63
  return result;
55
64
  };
56
65
  });
57
66
  break;
58
67
  }
59
68
  case "accessor": {
60
- // Accessor decorator: wrap the setter to fire on set
61
69
  const target = value;
62
70
  const key = String(context.name);
63
71
  return {
@@ -67,7 +75,7 @@ export function track(event, meta) {
67
75
  set(v) {
68
76
  target.set.call(this, v);
69
77
  app.get(AnalyticsTransport).track(event, {
70
- ...meta,
78
+ ...resolveMeta(meta, this),
71
79
  property: key,
72
80
  value: v,
73
81
  });
package/dist/track.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"track.js","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,IAA0B;IAC7D,OAAO,CAAC,KAAU,EAAE,OAAyB,EAAO,EAAE;QACpD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,iEAAiE;gBACjE,qEAAqE;gBACrE,kEAAkE;gBAClE,qEAAqE;gBACrE,mEAAmE;gBACnE,0DAA0D;gBAC1D,oEAAoE;gBACpE,mDAAmD;gBACnD,oEAAoE;gBACpE,MAAM,IAAI,GAAG,KAAiB,CAAC;gBAC/B,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;gBAC3D,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG;oBACjC,IAAI,iBAAiB;wBAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE;wBACvC,GAAG,IAAI;wBACP,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;qBACpC,CAAC,CAAC;gBACL,CAAC,CAAC;gBACF,MAAM;YACR,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,kDAAkD;gBAClD,MAAM,MAAM,GAAG,KAAiB,CAAC;gBACjC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACjC,OAAO,CAAC,cAAc,CAAC;oBACrB,MAAM,QAAQ,GAAG,MAAM,CAAC;oBACvB,IAAY,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,IAAW;wBAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;wBAC1C,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;wBACzE,OAAO,MAAM,CAAC;oBAChB,CAAC,CAAC;gBACJ,CAAC,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;YAED,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,qDAAqD;gBACrD,MAAM,MAAM,GAAG,KAA+C,CAAC;gBAC/D,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACjC,OAAO;oBACL,GAAG;wBACD,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC/B,CAAC;oBACD,GAAG,CAAY,CAAM;wBACnB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;wBACzB,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE;4BACvC,GAAG,IAAI;4BACP,QAAQ,EAAE,GAAG;4BACb,KAAK,EAAE,CAAC;yBACT,CAAC,CAAC;oBACL,CAAC;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"track.js","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKjD,sFAAsF;AACtF,SAAS,WAAW,CAAC,IAAyB,EAAE,EAAO;IACrD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,IAAI,OAAO,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;IAChD,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,IAAc;IACjD,OAAO,CAAC,KAAU,EAAE,OAAyB,EAAO,EAAE;QACpD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,IAAI,GAAG,KAAiB,CAAC;gBAC/B,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;gBAC3D,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG;oBACjC,IAAI,iBAAiB;wBAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE;wBACvC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;wBAC1B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;qBACpC,CAAC,CAAC;gBACL,CAAC,CAAC;gBACF,MAAM;YACR,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,MAAM,GAAG,KAAiB,CAAC;gBACjC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACjC,OAAO,CAAC,cAAc,CAAC;oBACrB,MAAM,QAAQ,GAAG,MAAM,CAAC;oBACxB,MAAM,IAAI,GAAG,IAAI,CAAC;oBACjB,IAAY,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,IAAW;wBAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;wBAC1C,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE;4BACvC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;4BAC1B,MAAM,EAAE,GAAG;4BACX,IAAI;yBACL,CAAC,CAAC;wBACH,OAAO,MAAM,CAAC;oBAChB,CAAC,CAAC;gBACJ,CAAC,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;YAED,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,MAAM,GAAG,KAA+C,CAAC;gBAC/D,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACjC,OAAO;oBACL,GAAG;wBACD,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC/B,CAAC;oBACD,GAAG,CAAY,CAAM;wBACnB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;wBACzB,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE;4BACvC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;4BAC1B,QAAQ,EAAE,GAAG;4BACb,KAAK,EAAE,CAAC;yBACT,CAAC,CAAC;oBACL,CAAC;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toyz/loom-analytics",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "description": "Zero-dependency, transport-swappable analytics for Loom — decorator-driven event tracking",
6
6
  "license": "MIT",