@leather.io/analytics 0.0.1 → 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.
package/README.md CHANGED
@@ -13,43 +13,34 @@ pnpm install @leather/analytics
13
13
  Before making any analytics calls, you must configure the analytics client with your write key.
14
14
 
15
15
  ```ts
16
- import { configureAnalyticsClient } from '@leather.io/analytics';
16
+ import { AnalyticsClientType, configureAnalyticsClient } from '@leather.io/analytics';
17
17
 
18
- configureAnalyticsClient({
19
- writeKey: 'YOUR_WRITE_KEY',
18
+ export const analytics: AnalyticsClientType = configureAnalyticsClient({
19
+ client: segmentClient,
20
20
  defaultProperties: {
21
- platform: 'web',
21
+ platform: 'mobile',
22
22
  },
23
23
  });
24
24
  ```
25
25
 
26
- Now you can make analytics calls.
26
+ Now you can make analytics calls with your configured client.
27
27
 
28
28
  ```ts
29
- import { analyticsClient } from '@leather/analytics';
29
+ import { analytics } from 'path/to/analytics';
30
30
 
31
- analyticsClient.track('My Event', {
31
+ analytics.track('My Event', {
32
32
  property: 'value',
33
33
  });
34
34
  ```
35
35
 
36
- You can also inject your own analytics client if you are using a custom analytics service or want to use a stubbed client for testing.
37
-
38
- ````ts
39
- import { configureAnalyticsClient } from '@leather/analytics';
40
-
41
- configureAnalyticsClient({
42
- client: myAnalyticsClient,
43
- });
44
-
45
36
  ## Development
46
37
 
47
- ```bash
38
+ ```sh
48
39
  pnpm build
49
- ````
40
+ ```
50
41
 
51
42
  or
52
43
 
53
- ```bash
44
+ ```sh
54
45
  pnpm build:watch
55
46
  ```
package/dist/index.d.ts CHANGED
@@ -1,77 +1,126 @@
1
- interface DefaultProperties {
2
- platform: 'web' | 'extension' | 'mobile';
3
- }
4
- interface ExternalAnalyticsClientInterface {
5
- track: (event: string, properties?: Json) => Promise<void>;
6
- screen: (name: string, properties?: Json) => Promise<void>;
7
- group: (groupId: string, traits?: Json) => Promise<void>;
8
- identify: (userId: string, traits?: Json) => Promise<void>;
9
- }
10
- interface AnalyticsClientConfig {
11
- writeKey: string;
12
- client: ExternalAnalyticsClientInterface;
13
- defaultProperties?: DefaultProperties;
14
- defaultTraits?: Record<string, Json>;
1
+ interface Events extends HistoricalEvents {
2
+ test_event_submitted: undefined;
15
3
  }
16
- type Json = Json[] | {
17
- [index: number]: Json;
18
- } | {
19
- [key: string]: Json;
20
- };
21
- interface EventProperties {
22
- background_analytics_schema_fail: undefined;
23
- schema_fail: {
24
- query: unknown;
25
- hash: string;
26
- error: string;
4
+ interface HistoricalEvents {
5
+ add_network: undefined;
6
+ bitcoin_rbf_fee_increase_error: {
7
+ outputDiff: number;
27
8
  };
28
- switch_account: {
29
- index: number;
30
- hasStxBalance: boolean;
9
+ broadcast_retrieve_taproot_to_native_segwit: undefined;
10
+ broadcast_ordinal_transaction: undefined;
11
+ broadcast_ordinal_error: {
12
+ error: any;
31
13
  };
32
- view_transaction_confirmation: {
14
+ broadcast_transaction: {
33
15
  symbol: string;
16
+ amount: number;
17
+ fee: number;
18
+ inputs: number;
19
+ outputs: number;
34
20
  };
35
- ordinals_dot_com_unavailable: {
36
- error: {
37
- errorMessage: string;
38
- errorName: string;
39
- };
21
+ broadcast_btc_error: {
22
+ error: any;
40
23
  };
41
- select_maximum_amount_for_send: {
42
- maximum: boolean;
24
+ copy_btc_address_to_clipboard: {
25
+ type: string;
43
26
  };
44
- copy_recipient_bns_address_to_clipboard: {
45
- value: 'thing' | 'other-thing';
27
+ copy_secret_key_to_clipboard: undefined;
28
+ copy_address_to_add_new_inscription: undefined;
29
+ copy_stx_address_to_clipboard: undefined;
30
+ copy_recipient_bns_address_to_clipboard: undefined;
31
+ create_new_account: undefined;
32
+ change_network: {
33
+ id: string;
34
+ };
35
+ click_open_in_new_tab_menu_item: undefined;
36
+ click_change_network_menu_item: undefined;
37
+ click_change_theme_menu_item: undefined;
38
+ click_toggle_privacy: undefined;
39
+ request_psbt_cancel: undefined;
40
+ request_sign_psbt_submit: undefined;
41
+ request_update_profile_submit: undefined;
42
+ request_update_profile_cancel: undefined;
43
+ request_signature_cancel: undefined;
44
+ requesting_origin_tab_closed_with_pending_action: {
45
+ status: 'action_pending';
46
46
  };
47
- broadcast_transaction: {
48
- symbol: string;
47
+ select_add_new_collectible: undefined;
48
+ select_buy_option: {
49
+ provider: string;
49
50
  };
50
- broadcast_btc_error: {
51
- symbol: string;
52
- error: {
53
- errorMessage: string;
54
- errorName: string;
55
- };
51
+ select_theme: {
52
+ theme: string;
56
53
  };
57
- request_signature_cancel: undefined;
58
- view_transaction_signing: undefined;
54
+ select_inscription_to_add_new_collectible: undefined;
55
+ select_maximum_amount_for_send: undefined;
56
+ submit_valid_password: undefined;
57
+ submit_invalid_password: undefined;
59
58
  submit_fee_for_transaction: {
60
59
  calculation: string;
61
60
  fee: number | string;
62
61
  type: string;
63
62
  };
64
- request_update_profile_submit: {
65
- requestType: 'update' | 'cancel';
63
+ user_approved_send_transfer: {
64
+ origin: string;
66
65
  };
67
- request_update_profile_cancel: {
68
- requestType: 'update' | 'cancel';
66
+ user_approved_sign_and_broadcast_psbt: {
67
+ origin: string;
68
+ };
69
+ user_clicked_feedback_button: undefined;
70
+ view_bitcoin_transaction: undefined;
71
+ view_transaction: undefined;
72
+ view_collectibles: {
73
+ ordinals_count?: number;
74
+ stamps_count?: number;
75
+ stacks_nfts_count?: number;
76
+ };
77
+ view_rpc_send_transfer_confirmation: {
78
+ symbol: string;
79
+ };
80
+ view_rpc_sign_and_broadcast_psbt_confirmation: {
81
+ symbol: string;
82
+ };
83
+ view_transaction_confirmation: {
84
+ symbol: string;
85
+ };
86
+ view_transaction_signing: undefined;
87
+ view_transaction_signing_error: {
88
+ reason: string;
89
+ };
90
+ start_unlock: undefined;
91
+ complete_unlock: {
92
+ durationMs: number;
93
+ };
94
+ background_analytics_schema_fail: undefined;
95
+ new_brand_reveal_name: undefined;
96
+ new_brand_accept_terms: undefined;
97
+ new_brand_reject_terms: undefined;
98
+ lock_session: undefined;
99
+ remove_network: undefined;
100
+ generate_new_secret_key: undefined;
101
+ bitcoin_contract_error: {
102
+ msg: string;
103
+ };
104
+ ordinals_dot_com_unavailable: {
105
+ error: any;
106
+ };
107
+ schema_fail: {
108
+ query: any;
109
+ hash: string;
110
+ error: string;
111
+ };
112
+ switch_account: {
113
+ index: number;
114
+ hasStxBalance: boolean;
69
115
  };
70
116
  non_compliant_entity_detected: {
71
117
  address: string;
72
118
  };
73
- requesting_origin_tab_closed_with_pending_action: {
74
- status: 'action_pending';
119
+ ledger_transaction_publish_error: {
120
+ error: {
121
+ message: string;
122
+ error: any;
123
+ };
75
124
  };
76
125
  native_segwit_tx_hex_to_ledger_tx: {
77
126
  success: boolean;
@@ -82,30 +131,59 @@ interface EventProperties {
82
131
  ledger_nativesegwit_add_nonwitnessutxo: {
83
132
  action: 'add_nonwitness_utxo' | 'skip_add_nonwitness_utxo';
84
133
  };
134
+ increase_fee_transaction: {
135
+ symbol: string;
136
+ txid: string;
137
+ };
138
+ finalize_tx_signature_error_thrown: {
139
+ data: unknown;
140
+ };
141
+ auth_response_with_illegal_redirect_uri: undefined;
85
142
  redux_persist_migration_to_no_serialization: undefined;
143
+ sign_out: undefined;
144
+ ledger_app_version_info: {
145
+ info: object;
146
+ };
147
+ ledger_transaction_signed_approved: undefined;
148
+ ledger_transaction_signed_rejected: undefined;
149
+ ledger_message_signed_approved: undefined;
150
+ ledger_message_signed_rejected: undefined;
151
+ ledger_public_keys_pulled_from_device: undefined;
86
152
  }
153
+ type EventName = keyof Events;
87
154
 
88
- type AnalyticsClientOptions = Pick<AnalyticsClientConfig, 'defaultProperties' | 'defaultTraits'>;
89
- declare function AnalyticsClient<T extends ExternalAnalyticsClientInterface>(client: T, options: AnalyticsClientOptions): {
90
- track<K extends keyof EventProperties>(event: K, properties: EventProperties[K]): Promise<void>;
91
- untypedTrack(event: string, properties?: Json): Promise<void>;
92
- screen(name: string, properties?: Json): Promise<void>;
93
- group(groupId: string, traits?: Json): Promise<void>;
94
- identify(userId: string, traits?: Json): Promise<void>;
95
- };
155
+ interface DefaultProperties {
156
+ platform: 'web' | 'extension' | 'mobile';
157
+ }
158
+ interface AnalyticsClientInterface {
159
+ screen: (name: string, ...args: any[]) => Promise<any>;
160
+ track: (event: string, ...args: any[]) => Promise<any>;
161
+ group: (groupId: string, traits?: any, ...args: any[]) => Promise<any>;
162
+ identify: (userId?: string | undefined, traits?: any, ...args: any[]) => Promise<any> | ((traits?: object) => Promise<any>);
163
+ }
164
+ interface AnalyticsClientConfig<T extends AnalyticsClientInterface> {
165
+ client: T;
166
+ defaultProperties?: DefaultProperties;
167
+ defaultTraits?: JsonMap;
168
+ }
169
+ type JsonList = JsonValue[];
170
+ type JsonValue = boolean | number | string | null | JsonList | JsonMap | undefined | unknown | Error;
171
+ interface JsonMap {
172
+ [key: string]: JsonValue;
173
+ [index: number]: JsonValue;
174
+ }
175
+ type OptionalIfUndefined<T> = T extends undefined ? undefined : T;
96
176
 
97
- declare let analyticsClient: ReturnType<typeof AnalyticsClient<ExternalAnalyticsClientInterface>>;
98
- /**
99
- * Configures the analytics client for the web environment. Must be called before any analytics functions are used.
100
- * @param {AnalyticsClientConfig} config - The configuration for the analytics client.
101
- * @returns {AnalyticsClient<AnalyticsClientInterface>} The configured analytics client.
102
- */
103
- declare function configureAnalyticsClient({ client, defaultProperties }: AnalyticsClientConfig): {
104
- track<K extends keyof EventProperties>(event: K, properties: EventProperties[K]): Promise<void>;
105
- untypedTrack(event: string, properties?: Json): Promise<void>;
106
- screen(name: string, properties?: Json): Promise<void>;
107
- group(groupId: string, traits?: Json): Promise<void>;
108
- identify(userId: string, traits?: Json): Promise<void>;
177
+ declare function configureAnalyticsClient<T extends AnalyticsClientInterface>({ client, defaultProperties, defaultTraits, }: {
178
+ client: T;
179
+ defaultProperties: DefaultProperties;
180
+ defaultTraits?: JsonMap;
181
+ }): {
182
+ track<K extends keyof Events>(event: K, ...properties: undefined extends Events[K] ? [] : [param: Events[K]]): Promise<any>;
183
+ untypedTrack(event: string, properties?: JsonMap): Promise<any>;
184
+ screen(name: string, properties?: JsonMap): Promise<any>;
185
+ group(groupId: string, traits?: JsonMap): Promise<any>;
186
+ identify(userId: string, traits?: JsonMap): Promise<any>;
109
187
  };
110
188
 
111
- export { analyticsClient, configureAnalyticsClient };
189
+ export { type AnalyticsClientConfig, type AnalyticsClientInterface, type DefaultProperties, type EventName, type Events, type JsonList, type JsonMap, type JsonValue, type OptionalIfUndefined, configureAnalyticsClient };
package/dist/index.js CHANGED
@@ -1,35 +1,36 @@
1
1
  // src/client.ts
2
- function AnalyticsClient(client, options) {
2
+ function AnalyticsClient(analyticsClient, options) {
3
3
  return {
4
- async track(event, properties) {
5
- return client.track(event, { ...properties, ...options.defaultProperties });
4
+ async track(event, ...properties) {
5
+ return analyticsClient.track(event, { ...properties, ...options.defaultProperties });
6
6
  },
7
7
  async untypedTrack(event, properties) {
8
8
  if (event.match(/^[a-zA-Z0-9\s][a-zA-Z0-9\s]*$/)) {
9
9
  throw new Error("Event must be snake_case");
10
10
  }
11
- return client.track(event, { ...properties, ...options.defaultProperties });
11
+ return analyticsClient.track(event, { ...properties, ...options.defaultProperties });
12
12
  },
13
13
  async screen(name, properties) {
14
- return client.screen(name, { ...properties, ...options.defaultProperties });
14
+ return analyticsClient.screen(name, { ...properties, ...options.defaultProperties });
15
15
  },
16
16
  async group(groupId, traits) {
17
- return client.group(groupId, { ...traits, ...options.defaultTraits });
17
+ return analyticsClient.group(groupId, { ...traits, ...options.defaultTraits });
18
18
  },
19
19
  async identify(userId, traits) {
20
- return client.identify(userId, { ...traits, ...options.defaultTraits });
20
+ return analyticsClient.identify(userId, { ...traits, ...options.defaultTraits });
21
21
  }
22
22
  };
23
23
  }
24
24
 
25
25
  // src/index.ts
26
- var analyticsClient;
27
- function configureAnalyticsClient({ client, defaultProperties }) {
28
- analyticsClient = AnalyticsClient(client, { defaultProperties });
29
- return analyticsClient;
26
+ function configureAnalyticsClient({
27
+ client,
28
+ defaultProperties,
29
+ defaultTraits
30
+ }) {
31
+ return AnalyticsClient(client, { defaultProperties, defaultTraits });
30
32
  }
31
33
  export {
32
- analyticsClient,
33
34
  configureAnalyticsClient
34
35
  };
35
36
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/index.ts"],"sourcesContent":["import {\n AnalyticsClientConfig,\n EventProperties,\n ExternalAnalyticsClientInterface,\n Json,\n} from './types';\n\nexport type AnalyticsClientOptions = Pick<\n AnalyticsClientConfig,\n 'defaultProperties' | 'defaultTraits'\n>;\n\nexport function AnalyticsClient<T extends ExternalAnalyticsClientInterface>(\n client: T,\n options: AnalyticsClientOptions\n) {\n return {\n async track<K extends keyof EventProperties>(event: K, properties: EventProperties[K]) {\n return client.track(event, { ...properties, ...options.defaultProperties });\n },\n\n async untypedTrack(event: string, properties?: Json) {\n if (event.match(/^[a-zA-Z0-9\\s][a-zA-Z0-9\\s]*$/)) {\n throw new Error('Event must be snake_case');\n }\n return client.track(event as any, { ...properties, ...options.defaultProperties });\n },\n\n async screen(name: string, properties?: Json) {\n return client.screen(name, { ...properties, ...options.defaultProperties });\n },\n\n async group(groupId: string, traits?: Json) {\n return client.group(groupId, { ...traits, ...options.defaultTraits });\n },\n\n async identify(userId: string, traits?: Json) {\n return client.identify(userId, { ...traits, ...options.defaultTraits });\n },\n };\n}\n","import { AnalyticsClientConfig, ExternalAnalyticsClientInterface } from 'types';\n\nimport { AnalyticsClient } from './client';\n\nlet analyticsClient: ReturnType<typeof AnalyticsClient<ExternalAnalyticsClientInterface>>;\n\n/**\n * Configures the analytics client for the web environment. Must be called before any analytics functions are used.\n * @param {AnalyticsClientConfig} config - The configuration for the analytics client.\n * @returns {AnalyticsClient<AnalyticsClientInterface>} The configured analytics client.\n */\nexport function configureAnalyticsClient({ client, defaultProperties }: AnalyticsClientConfig) {\n analyticsClient = AnalyticsClient(client, { defaultProperties });\n\n return analyticsClient;\n}\n\nexport { analyticsClient };\n"],"mappings":";AAYO,SAAS,gBACd,QACA,SACA;AACA,SAAO;AAAA,IACL,MAAM,MAAuC,OAAU,YAAgC;AACrF,aAAO,OAAO,MAAM,OAAO,EAAE,GAAG,YAAY,GAAG,QAAQ,kBAAkB,CAAC;AAAA,IAC5E;AAAA,IAEA,MAAM,aAAa,OAAe,YAAmB;AACnD,UAAI,MAAM,MAAM,+BAA+B,GAAG;AAChD,cAAM,IAAI,MAAM,0BAA0B;AAAA,MAC5C;AACA,aAAO,OAAO,MAAM,OAAc,EAAE,GAAG,YAAY,GAAG,QAAQ,kBAAkB,CAAC;AAAA,IACnF;AAAA,IAEA,MAAM,OAAO,MAAc,YAAmB;AAC5C,aAAO,OAAO,OAAO,MAAM,EAAE,GAAG,YAAY,GAAG,QAAQ,kBAAkB,CAAC;AAAA,IAC5E;AAAA,IAEA,MAAM,MAAM,SAAiB,QAAe;AAC1C,aAAO,OAAO,MAAM,SAAS,EAAE,GAAG,QAAQ,GAAG,QAAQ,cAAc,CAAC;AAAA,IACtE;AAAA,IAEA,MAAM,SAAS,QAAgB,QAAe;AAC5C,aAAO,OAAO,SAAS,QAAQ,EAAE,GAAG,QAAQ,GAAG,QAAQ,cAAc,CAAC;AAAA,IACxE;AAAA,EACF;AACF;;;ACpCA,IAAI;AAOG,SAAS,yBAAyB,EAAE,QAAQ,kBAAkB,GAA0B;AAC7F,oBAAkB,gBAAgB,QAAQ,EAAE,kBAAkB,CAAC;AAE/D,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/client.ts","../src/index.ts"],"sourcesContent":["import { AnalyticsClientConfig, AnalyticsClientInterface, Events, JsonMap } from './types';\n\nexport function AnalyticsClient<T extends AnalyticsClientInterface>(\n analyticsClient: T,\n options: Pick<AnalyticsClientConfig<T>, 'defaultProperties' | 'defaultTraits'>\n) {\n return {\n async track<K extends keyof Events>(\n event: K,\n ...properties: undefined extends Events[K] ? [] : [param: Events[K]]\n ) {\n return analyticsClient.track(event, { ...properties, ...options.defaultProperties });\n },\n async untypedTrack(event: string, properties?: JsonMap) {\n if (event.match(/^[a-zA-Z0-9\\s][a-zA-Z0-9\\s]*$/)) {\n throw new Error('Event must be snake_case');\n }\n return analyticsClient.track(event as any, { ...properties, ...options.defaultProperties });\n },\n\n async screen(name: string, properties?: JsonMap) {\n return analyticsClient.screen(name, { ...properties, ...options.defaultProperties });\n },\n\n async group(groupId: string, traits?: JsonMap) {\n return analyticsClient.group(groupId, { ...traits, ...options.defaultTraits });\n },\n\n async identify(userId: string, traits?: JsonMap) {\n return analyticsClient.identify(userId, { ...traits, ...options.defaultTraits });\n },\n };\n}\n","import { AnalyticsClient } from './client';\nimport { AnalyticsClientInterface, DefaultProperties, JsonMap } from './types';\n\nexport * from './types';\n\nexport function configureAnalyticsClient<T extends AnalyticsClientInterface>({\n client,\n defaultProperties,\n defaultTraits,\n}: {\n client: T;\n defaultProperties: DefaultProperties;\n defaultTraits?: JsonMap;\n}) {\n return AnalyticsClient<T>(client, { defaultProperties, defaultTraits });\n}\n"],"mappings":";AAEO,SAAS,gBACd,iBACA,SACA;AACA,SAAO;AAAA,IACL,MAAM,MACJ,UACG,YACH;AACA,aAAO,gBAAgB,MAAM,OAAO,EAAE,GAAG,YAAY,GAAG,QAAQ,kBAAkB,CAAC;AAAA,IACrF;AAAA,IACA,MAAM,aAAa,OAAe,YAAsB;AACtD,UAAI,MAAM,MAAM,+BAA+B,GAAG;AAChD,cAAM,IAAI,MAAM,0BAA0B;AAAA,MAC5C;AACA,aAAO,gBAAgB,MAAM,OAAc,EAAE,GAAG,YAAY,GAAG,QAAQ,kBAAkB,CAAC;AAAA,IAC5F;AAAA,IAEA,MAAM,OAAO,MAAc,YAAsB;AAC/C,aAAO,gBAAgB,OAAO,MAAM,EAAE,GAAG,YAAY,GAAG,QAAQ,kBAAkB,CAAC;AAAA,IACrF;AAAA,IAEA,MAAM,MAAM,SAAiB,QAAkB;AAC7C,aAAO,gBAAgB,MAAM,SAAS,EAAE,GAAG,QAAQ,GAAG,QAAQ,cAAc,CAAC;AAAA,IAC/E;AAAA,IAEA,MAAM,SAAS,QAAgB,QAAkB;AAC/C,aAAO,gBAAgB,SAAS,QAAQ,EAAE,GAAG,QAAQ,GAAG,QAAQ,cAAc,CAAC;AAAA,IACjF;AAAA,EACF;AACF;;;AC3BO,SAAS,yBAA6D;AAAA,EAC3E;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SAAO,gBAAmB,QAAQ,EAAE,mBAAmB,cAAc,CAAC;AACxE;","names":[]}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@leather.io/analytics",
3
- "author": "leather.io",
3
+ "author": "Leather.io contact@leather.io",
4
4
  "description": "Analytics package for Leather using Segment",
5
- "version": "0.0.1",
5
+ "version": "1.0.0",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/leather.io/mono/tree/dev/packages/analytics",
8
8
  "repository": {
@@ -13,9 +13,9 @@
13
13
  "type": "module",
14
14
  "exports": {
15
15
  ".": {
16
- "types": "./index.d.ts",
17
- "import": "./index.js",
18
- "require": "./index.js"
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js",
18
+ "require": "./dist/index.js"
19
19
  }
20
20
  },
21
21
  "devDependencies": {
@@ -32,6 +32,11 @@
32
32
  "files": [
33
33
  "dist"
34
34
  ],
35
+ "keywords": [
36
+ "bitcoin",
37
+ "leather",
38
+ "leather wallet"
39
+ ],
35
40
  "publishConfig": {
36
41
  "access": "public"
37
42
  },
@@ -42,6 +47,6 @@
42
47
  "format:check": "prettier . --check \"src/**/*.ts\" --ignore-path ../../.prettierignore",
43
48
  "lint": "eslint . --ignore-path ../../.eslintignore",
44
49
  "lint:fix": "eslint . --fix --ignore-path ../../.eslintignore",
45
- "typecheck": "tsc --noEmit --project ./tsconfig.json"
50
+ "typecheck": "tsc --noEmit"
46
51
  }
47
52
  }