trodo-node 1.0.0

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.
Files changed (80) hide show
  1. package/README.md +192 -0
  2. package/dist/cjs/TrodoClient.js +113 -0
  3. package/dist/cjs/TrodoClient.js.map +1 -0
  4. package/dist/cjs/UserContext.js +166 -0
  5. package/dist/cjs/UserContext.js.map +1 -0
  6. package/dist/cjs/api/ApiClient.js +144 -0
  7. package/dist/cjs/api/ApiClient.js.map +1 -0
  8. package/dist/cjs/api/endpoints.js +26 -0
  9. package/dist/cjs/api/endpoints.js.map +1 -0
  10. package/dist/cjs/auto/AutoEventManager.js +70 -0
  11. package/dist/cjs/auto/AutoEventManager.js.map +1 -0
  12. package/dist/cjs/index.js +141 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/managers/GroupManager.js +84 -0
  15. package/dist/cjs/managers/GroupManager.js.map +1 -0
  16. package/dist/cjs/managers/PeopleManager.js +75 -0
  17. package/dist/cjs/managers/PeopleManager.js.map +1 -0
  18. package/dist/cjs/queue/BatchFlusher.js +35 -0
  19. package/dist/cjs/queue/BatchFlusher.js.map +1 -0
  20. package/dist/cjs/queue/EventQueue.js +27 -0
  21. package/dist/cjs/queue/EventQueue.js.map +1 -0
  22. package/dist/cjs/session/ServerSession.js +113 -0
  23. package/dist/cjs/session/ServerSession.js.map +1 -0
  24. package/dist/cjs/session/SessionManager.js +54 -0
  25. package/dist/cjs/session/SessionManager.js.map +1 -0
  26. package/dist/cjs/types/index.js +6 -0
  27. package/dist/cjs/types/index.js.map +1 -0
  28. package/dist/esm/TrodoClient.d.ts +39 -0
  29. package/dist/esm/TrodoClient.d.ts.map +1 -0
  30. package/dist/esm/TrodoClient.js +109 -0
  31. package/dist/esm/TrodoClient.js.map +1 -0
  32. package/dist/esm/UserContext.d.ts +40 -0
  33. package/dist/esm/UserContext.d.ts.map +1 -0
  34. package/dist/esm/UserContext.js +162 -0
  35. package/dist/esm/UserContext.js.map +1 -0
  36. package/dist/esm/api/ApiClient.d.ts +40 -0
  37. package/dist/esm/api/ApiClient.d.ts.map +1 -0
  38. package/dist/esm/api/ApiClient.js +107 -0
  39. package/dist/esm/api/ApiClient.js.map +1 -0
  40. package/dist/esm/api/endpoints.d.ts +24 -0
  41. package/dist/esm/api/endpoints.d.ts.map +1 -0
  42. package/dist/esm/api/endpoints.js +23 -0
  43. package/dist/esm/api/endpoints.js.map +1 -0
  44. package/dist/esm/auto/AutoEventManager.d.ts +16 -0
  45. package/dist/esm/auto/AutoEventManager.d.ts.map +1 -0
  46. package/dist/esm/auto/AutoEventManager.js +66 -0
  47. package/dist/esm/auto/AutoEventManager.js.map +1 -0
  48. package/dist/esm/index.d.ts +81 -0
  49. package/dist/esm/index.d.ts.map +1 -0
  50. package/dist/esm/index.js +108 -0
  51. package/dist/esm/index.js.map +1 -0
  52. package/dist/esm/managers/GroupManager.d.ts +14 -0
  53. package/dist/esm/managers/GroupManager.d.ts.map +1 -0
  54. package/dist/esm/managers/GroupManager.js +80 -0
  55. package/dist/esm/managers/GroupManager.js.map +1 -0
  56. package/dist/esm/managers/PeopleManager.d.ts +20 -0
  57. package/dist/esm/managers/PeopleManager.d.ts.map +1 -0
  58. package/dist/esm/managers/PeopleManager.js +71 -0
  59. package/dist/esm/managers/PeopleManager.js.map +1 -0
  60. package/dist/esm/queue/BatchFlusher.d.ts +13 -0
  61. package/dist/esm/queue/BatchFlusher.d.ts.map +1 -0
  62. package/dist/esm/queue/BatchFlusher.js +31 -0
  63. package/dist/esm/queue/BatchFlusher.js.map +1 -0
  64. package/dist/esm/queue/EventQueue.d.ts +14 -0
  65. package/dist/esm/queue/EventQueue.d.ts.map +1 -0
  66. package/dist/esm/queue/EventQueue.js +23 -0
  67. package/dist/esm/queue/EventQueue.js.map +1 -0
  68. package/dist/esm/session/ServerSession.d.ts +6 -0
  69. package/dist/esm/session/ServerSession.d.ts.map +1 -0
  70. package/dist/esm/session/ServerSession.js +74 -0
  71. package/dist/esm/session/ServerSession.js.map +1 -0
  72. package/dist/esm/session/SessionManager.d.ts +12 -0
  73. package/dist/esm/session/SessionManager.d.ts.map +1 -0
  74. package/dist/esm/session/SessionManager.js +50 -0
  75. package/dist/esm/session/SessionManager.js.map +1 -0
  76. package/dist/esm/types/index.d.ts +110 -0
  77. package/dist/esm/types/index.d.ts.map +1 -0
  78. package/dist/esm/types/index.js +5 -0
  79. package/dist/esm/types/index.js.map +1 -0
  80. package/package.json +71 -0
@@ -0,0 +1,66 @@
1
+ import { nowIso } from '../session/ServerSession.js';
2
+ export class AutoEventManager {
3
+ constructor(siteId, apiClient, sessionManager) {
4
+ this.enabled = false;
5
+ this._uncaughtHandler = null;
6
+ this._rejectionHandler = null;
7
+ this.siteId = siteId;
8
+ this.apiClient = apiClient;
9
+ this.sessionManager = sessionManager;
10
+ }
11
+ enable() {
12
+ if (this.enabled)
13
+ return;
14
+ this.enabled = true;
15
+ this._uncaughtHandler = (err) => {
16
+ void this.trackError(err, 'UncaughtException', 'critical');
17
+ };
18
+ this._rejectionHandler = (reason) => {
19
+ const err = reason instanceof Error ? reason : new Error(String(reason));
20
+ void this.trackError(err, 'UnhandledRejection', 'critical');
21
+ };
22
+ process.on('uncaughtException', this._uncaughtHandler);
23
+ process.on('unhandledRejection', this._rejectionHandler);
24
+ }
25
+ disable() {
26
+ if (!this.enabled)
27
+ return;
28
+ this.enabled = false;
29
+ if (this._uncaughtHandler) {
30
+ process.removeListener('uncaughtException', this._uncaughtHandler);
31
+ this._uncaughtHandler = null;
32
+ }
33
+ if (this._rejectionHandler) {
34
+ process.removeListener('unhandledRejection', this._rejectionHandler);
35
+ this._rejectionHandler = null;
36
+ }
37
+ }
38
+ isEnabled() {
39
+ return this.enabled;
40
+ }
41
+ async trackError(err, errorType, severity, distinctId = 'server_global') {
42
+ const session = await this.sessionManager.getOrCreate(distinctId, this.siteId);
43
+ await this.sessionManager.ensureConfirmed(session, this.apiClient);
44
+ const event = {
45
+ event_type: 'auto',
46
+ event_name: 'server_error',
47
+ event_category: 'error',
48
+ session_id: session.sessionId,
49
+ user_id: session.distinctId,
50
+ custom_properties: {
51
+ error_type: errorType,
52
+ message: err.message,
53
+ stack: err.stack ?? null,
54
+ runtime: 'nodejs',
55
+ severity,
56
+ timestamp: nowIso(),
57
+ },
58
+ page_data: null,
59
+ auto_event_data: null,
60
+ element_data: null,
61
+ override_data: null,
62
+ };
63
+ await this.apiClient.postEvent(event);
64
+ }
65
+ }
66
+ //# sourceMappingURL=AutoEventManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutoEventManager.js","sourceRoot":"","sources":["../../../src/auto/AutoEventManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAErD,MAAM,OAAO,gBAAgB;IAS3B,YACE,MAAc,EACd,SAAoB,EACpB,cAA8B;QAXxB,YAAO,GAAG,KAAK,CAAC;QAKhB,qBAAgB,GAAkC,IAAI,CAAC;QACvD,sBAAiB,GAAuC,IAAI,CAAC;QAOnE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC,gBAAgB,GAAG,CAAC,GAAU,EAAE,EAAE;YACrC,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,mBAAmB,EAAE,UAAU,CAAC,CAAC;QAC7D,CAAC,CAAC;QAEF,IAAI,CAAC,iBAAiB,GAAG,CAAC,MAAe,EAAE,EAAE;YAC3C,MAAM,GAAG,GACP,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/D,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,oBAAoB,EAAE,UAAU,CAAC,CAAC;QAC9D,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvD,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACnE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,OAAO,CAAC,cAAc,CAAC,oBAAoB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACrE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,UAAU,CACd,GAAU,EACV,SAAiB,EACjB,QAA0C,EAC1C,UAAU,GAAG,eAAe;QAE5B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CACnD,UAAU,EACV,IAAI,CAAC,MAAM,CACZ,CAAC;QAEF,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEnE,MAAM,KAAK,GAAiB;YAC1B,UAAU,EAAE,MAAM;YAClB,UAAU,EAAE,cAAc;YAC1B,cAAc,EAAE,OAAO;YACvB,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,OAAO,EAAE,OAAO,CAAC,UAAU;YAC3B,iBAAiB,EAAE;gBACjB,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI;gBACxB,OAAO,EAAE,QAAQ;gBACjB,QAAQ;gBACR,SAAS,EAAE,MAAM,EAAE;aACpB;YACD,SAAS,EAAE,IAAI;YACf,eAAe,EAAE,IAAI;YACrB,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,IAAI;SACpB,CAAC;QAEF,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * trodo-node — Trodo Analytics SDK for Node.js
3
+ *
4
+ * Usage (singleton):
5
+ * import trodo from 'trodo-node';
6
+ * trodo.init({ siteId: 'your-site-id' });
7
+ * const user = trodo.forUser('user-123');
8
+ * await user.track('purchase_completed', { amount: 99.99 });
9
+ *
10
+ * Usage (class):
11
+ * import { TrodoClient } from 'trodo-node';
12
+ * const client = new TrodoClient({ siteId: 'your-site-id' });
13
+ */
14
+ export { TrodoClient } from './TrodoClient.js';
15
+ export { UserContext } from './UserContext.js';
16
+ export * from './types/index.js';
17
+ import { TrodoClient } from './TrodoClient.js';
18
+ import type { TrodoConfig, ForUserOptions, TrackOptions, IdentifyResult, WalletAddressResult, ResetResult, ApiResult, GroupProfile } from './types/index.js';
19
+ import type { UserContext } from './UserContext.js';
20
+ /** Initialise the singleton SDK instance. Returns the client for chaining. */
21
+ export declare function init(config: TrodoConfig): TrodoClient;
22
+ /** Return a UserContext bound to the given distinctId. */
23
+ export declare function forUser(distinctId: string, options?: ForUserOptions): UserContext;
24
+ /** Track an event for a user (direct-call pattern). */
25
+ export declare function track(distinctId: string, eventName: string, properties?: Record<string, unknown>, options?: TrackOptions): Promise<void>;
26
+ /** Alias a user's distinctId to an external identifier. */
27
+ export declare function identify(distinctId: string, identifyId: string): Promise<IdentifyResult>;
28
+ /** Associate a wallet address with a user. */
29
+ export declare function walletAddress(distinctId: string, walletAddr: string): Promise<WalletAddressResult>;
30
+ /** Reset a user's session. */
31
+ export declare function reset(distinctId: string): Promise<ResetResult>;
32
+ export declare const people: {
33
+ set: (d: string, p: Record<string, unknown>) => Promise<ApiResult>;
34
+ setOnce: (d: string, p: Record<string, unknown>) => Promise<ApiResult>;
35
+ unset: (d: string, k: string | string[]) => Promise<ApiResult>;
36
+ increment: (d: string, k: string, a?: number) => Promise<ApiResult>;
37
+ append: (d: string, k: string, v: unknown[]) => Promise<ApiResult>;
38
+ union: (d: string, k: string, v: unknown[]) => Promise<ApiResult>;
39
+ remove: (d: string, k: string, v: unknown[]) => Promise<ApiResult>;
40
+ trackCharge: (d: string, a: number, p?: Record<string, unknown>) => Promise<ApiResult>;
41
+ clearCharges: (d: string) => Promise<ApiResult>;
42
+ deleteUser: (d: string) => Promise<ApiResult>;
43
+ };
44
+ export declare function set_group(distinctId: string, groupKey: string, groupId: string | string[]): Promise<ApiResult>;
45
+ export declare function add_group(distinctId: string, groupKey: string, groupId: string): Promise<ApiResult>;
46
+ export declare function remove_group(distinctId: string, groupKey: string, groupId: string): Promise<ApiResult>;
47
+ export declare function get_group(distinctId: string, groupKey: string, groupId: string): GroupProfile;
48
+ export declare function enableAutoEvents(): void;
49
+ export declare function disableAutoEvents(): void;
50
+ export declare function flush(): Promise<void>;
51
+ export declare function shutdown(): Promise<void>;
52
+ declare const trodo: {
53
+ init: typeof init;
54
+ forUser: typeof forUser;
55
+ track: typeof track;
56
+ identify: typeof identify;
57
+ walletAddress: typeof walletAddress;
58
+ reset: typeof reset;
59
+ people: {
60
+ set: (d: string, p: Record<string, unknown>) => Promise<ApiResult>;
61
+ setOnce: (d: string, p: Record<string, unknown>) => Promise<ApiResult>;
62
+ unset: (d: string, k: string | string[]) => Promise<ApiResult>;
63
+ increment: (d: string, k: string, a?: number) => Promise<ApiResult>;
64
+ append: (d: string, k: string, v: unknown[]) => Promise<ApiResult>;
65
+ union: (d: string, k: string, v: unknown[]) => Promise<ApiResult>;
66
+ remove: (d: string, k: string, v: unknown[]) => Promise<ApiResult>;
67
+ trackCharge: (d: string, a: number, p?: Record<string, unknown>) => Promise<ApiResult>;
68
+ clearCharges: (d: string) => Promise<ApiResult>;
69
+ deleteUser: (d: string) => Promise<ApiResult>;
70
+ };
71
+ set_group: typeof set_group;
72
+ add_group: typeof add_group;
73
+ remove_group: typeof remove_group;
74
+ get_group: typeof get_group;
75
+ enableAutoEvents: typeof enableAutoEvents;
76
+ disableAutoEvents: typeof disableAutoEvents;
77
+ flush: typeof flush;
78
+ shutdown: typeof shutdown;
79
+ };
80
+ export default trodo;
81
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * trodo-node — Trodo Analytics SDK for Node.js
3
+ *
4
+ * Usage (singleton):
5
+ * import trodo from 'trodo-node';
6
+ * trodo.init({ siteId: 'your-site-id' });
7
+ * const user = trodo.forUser('user-123');
8
+ * await user.track('purchase_completed', { amount: 99.99 });
9
+ *
10
+ * Usage (class):
11
+ * import { TrodoClient } from 'trodo-node';
12
+ * const client = new TrodoClient({ siteId: 'your-site-id' });
13
+ */
14
+ export { TrodoClient } from './TrodoClient.js';
15
+ export { UserContext } from './UserContext.js';
16
+ export * from './types/index.js';
17
+ import { TrodoClient } from './TrodoClient.js';
18
+ // ============================================================================
19
+ // Singleton convenience API
20
+ // ============================================================================
21
+ let _client = null;
22
+ function getClient() {
23
+ if (!_client) {
24
+ throw new Error('trodo-node: Call trodo.init({ siteId }) before using the SDK.');
25
+ }
26
+ return _client;
27
+ }
28
+ /** Initialise the singleton SDK instance. Returns the client for chaining. */
29
+ export function init(config) {
30
+ _client = new TrodoClient(config);
31
+ return _client;
32
+ }
33
+ /** Return a UserContext bound to the given distinctId. */
34
+ export function forUser(distinctId, options) {
35
+ return getClient().forUser(distinctId, options);
36
+ }
37
+ /** Track an event for a user (direct-call pattern). */
38
+ export async function track(distinctId, eventName, properties, options) {
39
+ return getClient().track(distinctId, eventName, properties, options);
40
+ }
41
+ /** Alias a user's distinctId to an external identifier. */
42
+ export async function identify(distinctId, identifyId) {
43
+ return getClient().identify(distinctId, identifyId);
44
+ }
45
+ /** Associate a wallet address with a user. */
46
+ export async function walletAddress(distinctId, walletAddr) {
47
+ return getClient().walletAddress(distinctId, walletAddr);
48
+ }
49
+ /** Reset a user's session. */
50
+ export async function reset(distinctId) {
51
+ return getClient().reset(distinctId);
52
+ }
53
+ export const people = {
54
+ set: (d, p) => getClient().people.set(d, p),
55
+ setOnce: (d, p) => getClient().people.setOnce(d, p),
56
+ unset: (d, k) => getClient().people.unset(d, k),
57
+ increment: (d, k, a) => getClient().people.increment(d, k, a),
58
+ append: (d, k, v) => getClient().people.append(d, k, v),
59
+ union: (d, k, v) => getClient().people.union(d, k, v),
60
+ remove: (d, k, v) => getClient().people.remove(d, k, v),
61
+ trackCharge: (d, a, p) => getClient().people.trackCharge(d, a, p),
62
+ clearCharges: (d) => getClient().people.clearCharges(d),
63
+ deleteUser: (d) => getClient().people.deleteUser(d),
64
+ };
65
+ export function set_group(distinctId, groupKey, groupId) {
66
+ return getClient().set_group(distinctId, groupKey, groupId);
67
+ }
68
+ export function add_group(distinctId, groupKey, groupId) {
69
+ return getClient().add_group(distinctId, groupKey, groupId);
70
+ }
71
+ export function remove_group(distinctId, groupKey, groupId) {
72
+ return getClient().remove_group(distinctId, groupKey, groupId);
73
+ }
74
+ export function get_group(distinctId, groupKey, groupId) {
75
+ return getClient().get_group(distinctId, groupKey, groupId);
76
+ }
77
+ export function enableAutoEvents() {
78
+ getClient().enableAutoEvents();
79
+ }
80
+ export function disableAutoEvents() {
81
+ getClient().disableAutoEvents();
82
+ }
83
+ export async function flush() {
84
+ return getClient().flush();
85
+ }
86
+ export async function shutdown() {
87
+ return getClient().shutdown();
88
+ }
89
+ // Default export: the singleton namespace (matches frontend SDK pattern)
90
+ const trodo = {
91
+ init,
92
+ forUser,
93
+ track,
94
+ identify,
95
+ walletAddress,
96
+ reset,
97
+ people,
98
+ set_group,
99
+ add_group,
100
+ remove_group,
101
+ get_group,
102
+ enableAutoEvents,
103
+ disableAutoEvents,
104
+ flush,
105
+ shutdown,
106
+ };
107
+ export default trodo;
108
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ApiClient } from '../api/ApiClient.js';
2
+ import type { ApiResult, GroupProfile } from '../types/index.js';
3
+ export declare class GroupManager {
4
+ private readonly apiClient;
5
+ private readonly siteId;
6
+ private readonly getDistinctId;
7
+ constructor(apiClient: ApiClient, siteId: string, getDistinctId: () => string);
8
+ private base;
9
+ set_group(groupKey: string, groupId: string | string[]): Promise<ApiResult>;
10
+ add_group(groupKey: string, groupId: string): Promise<ApiResult>;
11
+ remove_group(groupKey: string, groupId: string): Promise<ApiResult>;
12
+ get_group(groupKey: string, groupId: string): GroupProfile;
13
+ }
14
+ //# sourceMappingURL=GroupManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupManager.d.ts","sourceRoot":"","sources":["../../../src/managers/GroupManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA4DjE,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAFb,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,MAAM;IAG9C,OAAO,CAAC,IAAI;IAIN,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GACzB,OAAO,CAAC,SAAS,CAAC;IAQf,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAQhE,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAQzE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY;CAS3D"}
@@ -0,0 +1,80 @@
1
+ import { ENDPOINTS } from '../api/endpoints.js';
2
+ class GroupProfileImpl {
3
+ constructor(apiClient, siteId, distinctId, groupKey, groupId) {
4
+ this.apiClient = apiClient;
5
+ this.siteId = siteId;
6
+ this.distinctId = distinctId;
7
+ this.groupKey = groupKey;
8
+ this.groupId = groupId;
9
+ }
10
+ base() {
11
+ return {
12
+ siteId: this.siteId,
13
+ userId: this.distinctId,
14
+ groupKey: this.groupKey,
15
+ groupId: this.groupId,
16
+ };
17
+ }
18
+ call(method, extra) {
19
+ return this.apiClient.postGroup(`${ENDPOINTS.GROUPS_PROFILE}/${method}`, { ...this.base(), ...extra });
20
+ }
21
+ set(properties) {
22
+ return this.call('set', { properties });
23
+ }
24
+ set_once(properties) {
25
+ return this.call('set_once', { properties });
26
+ }
27
+ union(listName, values) {
28
+ return this.call('union', { listName, values });
29
+ }
30
+ remove(listName, value) {
31
+ return this.call('remove', { listName, value });
32
+ }
33
+ unset(property) {
34
+ return this.call('unset', { property });
35
+ }
36
+ increment(property, value = 1) {
37
+ return this.call('increment', { property, value });
38
+ }
39
+ append(property, value) {
40
+ return this.call('append', { property, value });
41
+ }
42
+ delete() {
43
+ return this.call('delete');
44
+ }
45
+ }
46
+ export class GroupManager {
47
+ constructor(apiClient, siteId, getDistinctId) {
48
+ this.apiClient = apiClient;
49
+ this.siteId = siteId;
50
+ this.getDistinctId = getDistinctId;
51
+ }
52
+ base() {
53
+ return { siteId: this.siteId, userId: this.getDistinctId() };
54
+ }
55
+ async set_group(groupKey, groupId) {
56
+ return this.apiClient.postGroup(ENDPOINTS.GROUPS_SET, {
57
+ ...this.base(),
58
+ groupKey,
59
+ groupId,
60
+ });
61
+ }
62
+ async add_group(groupKey, groupId) {
63
+ return this.apiClient.postGroup(ENDPOINTS.GROUPS_ADD, {
64
+ ...this.base(),
65
+ groupKey,
66
+ groupId,
67
+ });
68
+ }
69
+ async remove_group(groupKey, groupId) {
70
+ return this.apiClient.postGroup(ENDPOINTS.GROUPS_REMOVE, {
71
+ ...this.base(),
72
+ groupKey,
73
+ groupId,
74
+ });
75
+ }
76
+ get_group(groupKey, groupId) {
77
+ return new GroupProfileImpl(this.apiClient, this.siteId, this.getDistinctId(), groupKey, groupId);
78
+ }
79
+ }
80
+ //# sourceMappingURL=GroupManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupManager.js","sourceRoot":"","sources":["../../../src/managers/GroupManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ApiClient } from '../api/ApiClient.js';
2
+ import type { ApiResult, PeopleInterface } from '../types/index.js';
3
+ export declare class PeopleManager implements PeopleInterface {
4
+ private readonly apiClient;
5
+ private readonly siteId;
6
+ private readonly getDistinctId;
7
+ constructor(apiClient: ApiClient, siteId: string, getDistinctId: () => string);
8
+ private base;
9
+ set(properties: Record<string, unknown>): Promise<ApiResult>;
10
+ setOnce(properties: Record<string, unknown>): Promise<ApiResult>;
11
+ unset(keys: string | string[]): Promise<ApiResult>;
12
+ increment(key: string, amount?: number): Promise<ApiResult>;
13
+ append(key: string, values: unknown[]): Promise<ApiResult>;
14
+ union(key: string, values: unknown[]): Promise<ApiResult>;
15
+ remove(key: string, values: unknown[]): Promise<ApiResult>;
16
+ trackCharge(amount: number, properties?: Record<string, unknown>): Promise<ApiResult>;
17
+ clearCharges(): Promise<ApiResult>;
18
+ deleteUser(): Promise<ApiResult>;
19
+ }
20
+ //# sourceMappingURL=PeopleManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeopleManager.d.ts","sourceRoot":"","sources":["../../../src/managers/PeopleManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpE,qBAAa,aAAc,YAAW,eAAe;IAEjD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAFb,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,MAAM;IAG9C,OAAO,CAAC,IAAI;IAIN,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAO5D,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAOhE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAOlD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,SAAS,CAAC;IAQtD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAQ1D,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAQzD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAQ1D,WAAW,CACf,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,OAAO,CAAC,SAAS,CAAC;IAQf,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;IAIlC,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;CAGvC"}
@@ -0,0 +1,71 @@
1
+ import { ENDPOINTS } from '../api/endpoints.js';
2
+ export class PeopleManager {
3
+ constructor(apiClient, siteId, getDistinctId) {
4
+ this.apiClient = apiClient;
5
+ this.siteId = siteId;
6
+ this.getDistinctId = getDistinctId;
7
+ }
8
+ base() {
9
+ return { siteId: this.siteId, userId: this.getDistinctId() };
10
+ }
11
+ async set(properties) {
12
+ return this.apiClient.postPeople(ENDPOINTS.PEOPLE_SET, {
13
+ ...this.base(),
14
+ properties,
15
+ });
16
+ }
17
+ async setOnce(properties) {
18
+ return this.apiClient.postPeople(ENDPOINTS.PEOPLE_SET_ONCE, {
19
+ ...this.base(),
20
+ properties,
21
+ });
22
+ }
23
+ async unset(keys) {
24
+ return this.apiClient.postPeople(ENDPOINTS.PEOPLE_UNSET, {
25
+ ...this.base(),
26
+ keys: Array.isArray(keys) ? keys : [keys],
27
+ });
28
+ }
29
+ async increment(key, amount = 1) {
30
+ return this.apiClient.postPeople(ENDPOINTS.PEOPLE_INCREMENT, {
31
+ ...this.base(),
32
+ key,
33
+ amount,
34
+ });
35
+ }
36
+ async append(key, values) {
37
+ return this.apiClient.postPeople(ENDPOINTS.PEOPLE_APPEND, {
38
+ ...this.base(),
39
+ key,
40
+ values,
41
+ });
42
+ }
43
+ async union(key, values) {
44
+ return this.apiClient.postPeople(ENDPOINTS.PEOPLE_UNION, {
45
+ ...this.base(),
46
+ key,
47
+ values,
48
+ });
49
+ }
50
+ async remove(key, values) {
51
+ return this.apiClient.postPeople(ENDPOINTS.PEOPLE_REMOVE, {
52
+ ...this.base(),
53
+ key,
54
+ values,
55
+ });
56
+ }
57
+ async trackCharge(amount, properties) {
58
+ return this.apiClient.postPeople(ENDPOINTS.PEOPLE_TRACK_CHARGE, {
59
+ ...this.base(),
60
+ amount,
61
+ properties: properties ?? {},
62
+ });
63
+ }
64
+ async clearCharges() {
65
+ return this.apiClient.postPeople(ENDPOINTS.PEOPLE_CLEAR_CHARGES, this.base());
66
+ }
67
+ async deleteUser() {
68
+ return this.apiClient.postPeople(ENDPOINTS.PEOPLE_DELETE_USER, this.base());
69
+ }
70
+ }
71
+ //# sourceMappingURL=PeopleManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeopleManager.js","sourceRoot":"","sources":["../../../src/managers/PeopleManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIhD,MAAM,OAAO,aAAa;IACxB,YACmB,SAAoB,EACpB,MAAc,EACd,aAA2B;QAF3B,cAAS,GAAT,SAAS,CAAW;QACpB,WAAM,GAAN,MAAM,CAAQ;QACd,kBAAa,GAAb,aAAa,CAAc;IAC3C,CAAC;IAEI,IAAI;QACV,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,UAAmC;QAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,EAAE;YACrD,GAAG,IAAI,CAAC,IAAI,EAAE;YACd,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAmC;QAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,eAAe,EAAE;YAC1D,GAAG,IAAI,CAAC,IAAI,EAAE;YACd,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAuB;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,YAAY,EAAE;YACvD,GAAG,IAAI,CAAC,IAAI,EAAE;YACd,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,MAAM,GAAG,CAAC;QACrC,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,gBAAgB,EAAE;YAC3D,GAAG,IAAI,CAAC,IAAI,EAAE;YACd,GAAG;YACH,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,MAAiB;QACzC,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,aAAa,EAAE;YACxD,GAAG,IAAI,CAAC,IAAI,EAAE;YACd,GAAG;YACH,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,MAAiB;QACxC,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,YAAY,EAAE;YACvD,GAAG,IAAI,CAAC,IAAI,EAAE;YACd,GAAG;YACH,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,MAAiB;QACzC,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,aAAa,EAAE;YACxD,GAAG,IAAI,CAAC,IAAI,EAAE;YACd,GAAG;YACH,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CACf,MAAc,EACd,UAAoC;QAEpC,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,mBAAmB,EAAE;YAC9D,GAAG,IAAI,CAAC,IAAI,EAAE;YACd,MAAM;YACN,UAAU,EAAE,UAAU,IAAI,EAAE;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import type { ApiClient } from '../api/ApiClient.js';
2
+ import type { EventQueue } from './EventQueue.js';
3
+ export declare class BatchFlusher {
4
+ private readonly queue;
5
+ private readonly apiClient;
6
+ private readonly flushIntervalMs;
7
+ private timer;
8
+ constructor(queue: EventQueue, apiClient: ApiClient, flushIntervalMs: number);
9
+ start(): void;
10
+ stop(): void;
11
+ flush(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=BatchFlusher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BatchFlusher.d.ts","sourceRoot":"","sources":["../../../src/queue/BatchFlusher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,qBAAa,YAAY;IAIrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IALlC,OAAO,CAAC,KAAK,CAA+C;gBAGzC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,MAAM;IAG1C,KAAK,IAAI,IAAI;IASb,IAAI,IAAI,IAAI;IAON,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
@@ -0,0 +1,31 @@
1
+ export class BatchFlusher {
2
+ constructor(queue, apiClient, flushIntervalMs) {
3
+ this.queue = queue;
4
+ this.apiClient = apiClient;
5
+ this.flushIntervalMs = flushIntervalMs;
6
+ this.timer = null;
7
+ }
8
+ start() {
9
+ if (this.timer)
10
+ return;
11
+ this.timer = setInterval(() => {
12
+ void this.flush();
13
+ }, this.flushIntervalMs);
14
+ // Allow the Node.js process to exit even if the timer is active
15
+ if (this.timer.unref)
16
+ this.timer.unref();
17
+ }
18
+ stop() {
19
+ if (this.timer) {
20
+ clearInterval(this.timer);
21
+ this.timer = null;
22
+ }
23
+ }
24
+ async flush() {
25
+ const events = this.queue.drain();
26
+ if (events.length === 0)
27
+ return;
28
+ await this.apiClient.postBulkEvents(events);
29
+ }
30
+ }
31
+ //# sourceMappingURL=BatchFlusher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BatchFlusher.js","sourceRoot":"","sources":["../../../src/queue/BatchFlusher.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,YAAY;IAGvB,YACmB,KAAiB,EACjB,SAAoB,EACpB,eAAuB;QAFvB,UAAK,GAAL,KAAK,CAAY;QACjB,cAAS,GAAT,SAAS,CAAW;QACpB,oBAAe,GAAf,eAAe,CAAQ;QALlC,UAAK,GAA0C,IAAI,CAAC;IAMzD,CAAC;IAEJ,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACzB,gEAAgE;QAChE,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC3C,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAChC,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import type { EventPayload } from '../types/index.js';
2
+ export declare class EventQueue {
3
+ private queue;
4
+ private readonly maxSize;
5
+ constructor(maxSize: number);
6
+ /**
7
+ * Enqueue an event. Returns true if the flush threshold has been reached.
8
+ */
9
+ enqueue(event: EventPayload): boolean;
10
+ /** Atomically take all queued events and reset the queue. */
11
+ drain(): EventPayload[];
12
+ size(): number;
13
+ }
14
+ //# sourceMappingURL=EventQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventQueue.d.ts","sourceRoot":"","sources":["../../../src/queue/EventQueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE,MAAM;IAI3B;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO;IAKrC,6DAA6D;IAC7D,KAAK,IAAI,YAAY,EAAE;IAMvB,IAAI,IAAI,MAAM;CAGf"}
@@ -0,0 +1,23 @@
1
+ export class EventQueue {
2
+ constructor(maxSize) {
3
+ this.queue = [];
4
+ this.maxSize = maxSize;
5
+ }
6
+ /**
7
+ * Enqueue an event. Returns true if the flush threshold has been reached.
8
+ */
9
+ enqueue(event) {
10
+ this.queue.push(event);
11
+ return this.queue.length >= this.maxSize;
12
+ }
13
+ /** Atomically take all queued events and reset the queue. */
14
+ drain() {
15
+ const events = this.queue;
16
+ this.queue = [];
17
+ return events;
18
+ }
19
+ size() {
20
+ return this.queue.length;
21
+ }
22
+ }
23
+ //# sourceMappingURL=EventQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventQueue.js","sourceRoot":"","sources":["../../../src/queue/EventQueue.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,UAAU;IAIrB,YAAY,OAAe;QAHnB,UAAK,GAAmB,EAAE,CAAC;QAIjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,KAAmB;QACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,6DAA6D;IAC7D,KAAK;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { ServerSession } from '../types/index.js';
2
+ export declare function generateUUID(): Promise<string>;
3
+ export declare function nowIso(): string;
4
+ export declare function createServerSession(siteId: string, distinctId: string, sessionId?: string): Promise<ServerSession>;
5
+ export declare function buildSessionPayload(session: ServerSession): Record<string, unknown>;
6
+ //# sourceMappingURL=ServerSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerSession.d.ts","sourceRoot":"","sources":["../../../src/session/ServerSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAevD,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAGpD;AAED,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CASxB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,GACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2CzB"}