@formo/analytics 1.12.0-alpha.3 → 1.13.0-alpha.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.
Files changed (67) hide show
  1. package/.env.example +1 -0
  2. package/CONTRIBUTING.md +93 -0
  3. package/README.md +4 -163
  4. package/dist/cjs/src/FormoAnalytics.d.ts +45 -69
  5. package/dist/cjs/src/FormoAnalytics.d.ts.map +1 -1
  6. package/dist/cjs/src/FormoAnalytics.js +378 -404
  7. package/dist/cjs/src/FormoAnalytics.js.map +1 -1
  8. package/dist/cjs/src/FormoAnalyticsProvider.d.ts +2 -2
  9. package/dist/cjs/src/FormoAnalyticsProvider.d.ts.map +1 -1
  10. package/dist/cjs/src/FormoAnalyticsProvider.js +120 -29
  11. package/dist/cjs/src/FormoAnalyticsProvider.js.map +1 -1
  12. package/dist/cjs/src/constants/config.d.ts +2 -2
  13. package/dist/cjs/src/constants/config.d.ts.map +1 -1
  14. package/dist/cjs/src/constants/config.js +3 -3
  15. package/dist/cjs/src/constants/config.js.map +1 -1
  16. package/dist/cjs/src/constants/events.d.ts +3 -1
  17. package/dist/cjs/src/constants/events.d.ts.map +1 -1
  18. package/dist/cjs/src/constants/events.js +2 -0
  19. package/dist/cjs/src/constants/events.js.map +1 -1
  20. package/dist/cjs/src/types/base.d.ts +10 -2
  21. package/dist/cjs/src/types/base.d.ts.map +1 -1
  22. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  23. package/dist/esm/src/FormoAnalytics.d.ts +45 -69
  24. package/dist/esm/src/FormoAnalytics.d.ts.map +1 -1
  25. package/dist/esm/src/FormoAnalytics.js +381 -407
  26. package/dist/esm/src/FormoAnalytics.js.map +1 -1
  27. package/dist/esm/src/FormoAnalyticsProvider.d.ts +2 -2
  28. package/dist/esm/src/FormoAnalyticsProvider.d.ts.map +1 -1
  29. package/dist/esm/src/FormoAnalyticsProvider.js +120 -29
  30. package/dist/esm/src/FormoAnalyticsProvider.js.map +1 -1
  31. package/dist/esm/src/constants/config.d.ts +2 -2
  32. package/dist/esm/src/constants/config.d.ts.map +1 -1
  33. package/dist/esm/src/constants/config.js +2 -2
  34. package/dist/esm/src/constants/config.js.map +1 -1
  35. package/dist/esm/src/constants/events.d.ts +3 -1
  36. package/dist/esm/src/constants/events.d.ts.map +1 -1
  37. package/dist/esm/src/constants/events.js +2 -0
  38. package/dist/esm/src/constants/events.js.map +1 -1
  39. package/dist/esm/src/types/base.d.ts +10 -2
  40. package/dist/esm/src/types/base.d.ts.map +1 -1
  41. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  42. package/dist/index.umd.min.js +1 -1
  43. package/dist/index.umd.min.js.map +1 -1
  44. package/package.json +2 -3
  45. package/src/FormoAnalytics.ts +293 -448
  46. package/src/FormoAnalyticsProvider.tsx +60 -30
  47. package/src/constants/config.ts +2 -2
  48. package/src/constants/events.ts +2 -0
  49. package/src/types/base.ts +16 -2
  50. package/dist/cjs/src/utils/index.d.ts +0 -2
  51. package/dist/cjs/src/utils/index.d.ts.map +0 -1
  52. package/dist/cjs/src/utils/index.js +0 -18
  53. package/dist/cjs/src/utils/index.js.map +0 -1
  54. package/dist/cjs/src/utils/isNotEmptyObject.d.ts +0 -2
  55. package/dist/cjs/src/utils/isNotEmptyObject.d.ts.map +0 -1
  56. package/dist/cjs/src/utils/isNotEmptyObject.js +0 -9
  57. package/dist/cjs/src/utils/isNotEmptyObject.js.map +0 -1
  58. package/dist/esm/src/utils/index.d.ts +0 -2
  59. package/dist/esm/src/utils/index.d.ts.map +0 -1
  60. package/dist/esm/src/utils/index.js +0 -2
  61. package/dist/esm/src/utils/index.js.map +0 -1
  62. package/dist/esm/src/utils/isNotEmptyObject.d.ts +0 -2
  63. package/dist/esm/src/utils/isNotEmptyObject.d.ts.map +0 -1
  64. package/dist/esm/src/utils/isNotEmptyObject.js +0 -6
  65. package/dist/esm/src/utils/isNotEmptyObject.js.map +0 -1
  66. package/src/utils/index.ts +0 -1
  67. package/src/utils/isNotEmptyObject.ts +0 -5
package/.env.example ADDED
@@ -0,0 +1 @@
1
+ REACT_APP_HIGHLIGHT_PROJECT_ID =
@@ -0,0 +1,93 @@
1
+ # Development Guide
2
+
3
+ If you want to contribute or run a local version of the Formo Analytics SDK, follow these steps:
4
+
5
+ ### Build the SDK Locally
6
+
7
+ Run the following command to build both CommonJS and ESM versions of the SDK:
8
+
9
+ ```jsx
10
+ yarn build-cjs && yarn build-esm && yarn webpack --mode=production
11
+ ```
12
+
13
+ or if you're using NPM:
14
+
15
+ ```jsx
16
+ npm run build
17
+ ```
18
+
19
+ ### Testing locally
20
+
21
+ 1. Link the local package to your project
22
+
23
+ > See [this guide](https://dev.to/one-beyond/different-approaches-to-testing-your-own-packages-locally-npm-link-4hoj) on how to use `npm link` or [this guide](https://classic.yarnpkg.com/lang/en/docs/cli/link/) for `yarn link` to test the package locally.
24
+
25
+ For example, if I want to test the package with a project that is in the same directory:
26
+
27
+ ```
28
+ ~/
29
+ ├── formo-analytics-example-next/
30
+ └── sdk/
31
+ ```
32
+
33
+ Run the following command:
34
+
35
+ ```bash
36
+ # ~/formo-analytics-example-next
37
+ npm link ../sdk
38
+ OR
39
+ yarn link ../sdk
40
+ ```
41
+
42
+ Any changes you make to your local package will be reflected in the project you linked it to.
43
+ However, you have to run `build` to apply the changes you made to the local package:
44
+
45
+ ```
46
+ # ~/sdk
47
+ npm run build
48
+ ```
49
+
50
+ The new change will be reflected in the project you linked it to.
51
+
52
+ To unlink the package, run the following command:
53
+
54
+ ```bash
55
+ # In ~/formo-analytics-example-next
56
+ npm unlink ../sdk
57
+ OR
58
+ yarn unlink ../sdk
59
+ ```
60
+
61
+ ## Troubleshooting
62
+
63
+ - Remove your `node_modules` and `yarn link` and run `yarn link` and `yarn install` again.
64
+ - Try running `yarn build` in the SDK directory to ensure the changes are applied.
65
+ - Try running `yarn unlink` and `yarn link` again.
66
+
67
+ # Publishing
68
+
69
+ 1. Authenticate with NPM
70
+
71
+ To publish a new version of the package, log in to your NPM account:
72
+
73
+ ```jsx
74
+ npm login
75
+ ```
76
+
77
+ or:
78
+
79
+ ```jsx
80
+ npm adduser
81
+ ```
82
+
83
+ 2. Publish the Package
84
+
85
+ Run the following command to publish the package to NPM:
86
+
87
+ ```jsx
88
+ // Increment the version number in package.json and create git tag
89
+ npm version
90
+
91
+ // Publish the package to NPM
92
+ npm publish
93
+ ```
package/README.md CHANGED
@@ -1,167 +1,8 @@
1
- # Installation Guide
1
+ # Formo Analytics SDK
2
2
 
3
- ## Option 1 - tracking code
3
+ The Formo Analytics SDK is a Javascript library that allows you to track and analyze user interactions on your dapp.
4
4
 
5
- ---
5
+ ## Installation
6
6
 
7
- Add the following to your `index.html`:
7
+ Please visit Formo's [Developer Docs](https://docs.formo.so) for detailed guides and installation instructions.
8
8
 
9
- ```html
10
- <script>
11
- const script = document.createElement('script');
12
- const apiKey = 'YOUR_API_KEY';
13
- const projectId = 'YOUR_PROJECT_ID';
14
-
15
- script.src = 'https://unpkg.com/@formo/analytics';
16
- script.onload = function () {
17
- FormoAnalytics.init(apiKey, projectId)
18
- .then((sdkInstance) => {
19
- window.formo = sdkInstance;
20
-
21
- // Call the public `page` method to track a page hit
22
- window.formo.page();
23
- })
24
- .catch((error) => {
25
- console.error('Error initializing FormoAnalytics:', error);
26
- });
27
- };
28
- document.head.appendChild(script);
29
- </script>
30
- ```
31
-
32
- ## Option 2 - using npm package
33
-
34
- ---
35
-
36
- ### 1. Install the npm package:
37
-
38
- Install @formo/analytics via yarn or npm:
39
-
40
- ```
41
- yarn add @formo/analytics
42
- ```
43
-
44
- or
45
-
46
- ```
47
- npm install @formo/analytics --save
48
- ```
49
-
50
- ### 2. Set up the `FormoAnalyticsProvider` in your application:
51
-
52
- ```jsx
53
- // AnalyticsProvider.tsx
54
-
55
- 'use client';
56
-
57
- import { FormoAnalytics, FormoAnalyticsProvider } from '@formo/analytics';
58
- import React, { FC, useEffect } from 'react';
59
-
60
- type FormoAnalyticsProviderProps = {
61
- apiKey: string,
62
- projectId: string,
63
- children: React.ReactNode,
64
- };
65
-
66
- // The provider component
67
- export const AnalyticsProvider: FC<FormoAnalyticsProviderProps> = ({
68
- apiKey,
69
- projectId,
70
- children,
71
- }) => {
72
- // Initialize the FormoAnalytics SDK inside useEffect
73
- const [isInitialized, setIsInitialized] = useState(false);
74
-
75
- useEffect(() => {
76
- const initialize = async () => {
77
- try {
78
- await FormoAnalytics.init(apiKey, projectId);
79
- console.log('FormoAnalytics SDK initialized');
80
- setIsInitialized(true);
81
- } catch (error) {
82
- console.error('Failed to initialize FormoAnalytics SDK', error);
83
- }
84
- };
85
-
86
- initialize();
87
- }, [apiKey, projectId]);
88
-
89
- // To prevent app crashes, render a loading state during initialization
90
- if (!isInitialized) {
91
- return (
92
- <FormoAnalyticsProvider apiKey={apiKey} projectId={projectId}>
93
- Loading Content
94
- </FormoAnalyticsProvider>
95
- );
96
- }
97
-
98
- return (
99
- <FormoAnalyticsProvider apiKey={apiKey} projectId={projectId}>
100
- {children}
101
- </FormoAnalyticsProvider>
102
- );
103
- };
104
-
105
- export default AnalyticsProvider;
106
- ```
107
-
108
- ### 3. Integrating the Provider in Your Root Layout
109
-
110
- Wrap your application with the newly created `AnalyticsProvider` in your main layout file:
111
-
112
- ```jsx
113
- import { AnalyticsProvider } from './AnalyticsProvider';
114
-
115
- export default function RootLayout({
116
- children,
117
- }: {
118
- children: React.ReactNode,
119
- }) {
120
- return (
121
- <html lang='en'>
122
- <body>
123
- <AnalyticsProvider apiKey='YOUR_API_KEY' projectId='YOUR_PROJECT_ID'>
124
- Your Page Content
125
- </AnalyticsProvider>
126
- </body>
127
- </html>
128
- );
129
- }
130
- ```
131
-
132
- ### 4. Using the SDK
133
-
134
- Once the SDK is initialized, you can use its methods to track events and user interactions. Here’s how to do that:
135
-
136
- ```jsx
137
- import { useFormoAnalytics } from '@formo/analytics';
138
- import React, { useEffect } from 'react';
139
-
140
- const YourComponent = () => {
141
- const analytics = useFormoAnalytics();
142
-
143
- useEffect(() => {
144
- const track = async () => {
145
- try {
146
- console.log('Tracking page hit...');
147
- analytics.page(); // Track the page view
148
- analytics.track('custom_event', { key: 'value' }); // Track a custom event
149
- } catch (error) {
150
- console.error('Failed to track page hit', error);
151
- }
152
- };
153
-
154
- track();
155
- }, [analytics]);
156
-
157
- return <div>Your Component Content</div>;
158
- };
159
- ```
160
-
161
- # Development notes
162
-
163
- To run a local version of the script:
164
-
165
- 1. Run `yarn build-cjs && yarn build-esm && yarn webpack --mode=production` or `npm run build` at the root level to build the script.
166
- 2. To authorize device, login into npmjs using `npm login` or `npm adduser`
167
- 3. Run `yarn publish` or `npm run publish` to publish new versions of the package.
@@ -1,13 +1,5 @@
1
- import { ChainID, EIP1193Provider } from './types';
1
+ import { ChainID, Address, EIP1193Provider, Options, Config } from "./types";
2
2
  interface IFormoAnalytics {
3
- /**
4
- * Initializes the FormoAnalytics instance with the provided API key and project ID.
5
- */
6
- init(apiKey: string, projectId: string): Promise<FormoAnalytics>;
7
- /**
8
- * Identifies the user with the provided user data.
9
- */
10
- identify(userData: Record<string, any>): void;
11
3
  /**
12
4
  * Tracks page visit events.
13
5
  */
@@ -16,85 +8,69 @@ interface IFormoAnalytics {
16
8
  * Connects to a wallet with the specified chain ID and address.
17
9
  */
18
10
  connect(params: {
19
- account: string;
20
11
  chainId: ChainID;
12
+ address: string;
21
13
  }): Promise<void>;
22
14
  /**
23
- * Disconnects the current wallet and clears the session information.
15
+ * Disconnects the current wallet.
24
16
  */
25
- disconnect(attributes?: {
26
- account?: string;
17
+ disconnect(params?: {
27
18
  chainId?: ChainID;
28
- }): void;
19
+ address?: string;
20
+ }): Promise<void>;
29
21
  /**
30
- * Tracks a specific event with a name and associated data.
22
+ * Switches the blockchain chain context and optionally logs additional params.
31
23
  */
32
- track(eventName: string, eventData: Record<string, any>): void;
24
+ chain(params: {
25
+ chainId: ChainID;
26
+ address?: string;
27
+ }): Promise<void>;
33
28
  /**
34
- * Switches the blockchain chain context and optionally logs additional attributes.
29
+ * Tracks a specific event with a name and associated data.
35
30
  */
36
- chain(attributes: {
37
- chainId: ChainID;
38
- account?: string;
39
- }): void;
31
+ track(eventName: string, eventData: Record<string, any>): Promise<void>;
40
32
  }
41
33
  export declare class FormoAnalytics implements IFormoAnalytics {
42
34
  readonly apiKey: string;
43
- projectId: string;
35
+ options: Options;
44
36
  private _provider?;
45
- private _registeredProviderListeners;
46
- private sessionKey;
47
- private config;
48
- private sessionIdKey;
49
- private timezoneToCountry;
50
- currentChainId?: string | null;
51
- currentConnectedAccount?: string;
37
+ private _providerListeners;
38
+ config: Config;
39
+ currentChainId?: ChainID;
40
+ currentConnectedAddress?: Address;
52
41
  private constructor();
53
- static init(apiKey: string, projectId: string): Promise<FormoAnalytics>;
54
- get provider(): EIP1193Provider | undefined;
55
- private identifyUser;
56
- private getSessionId;
57
- private setSessionCookie;
58
- private generateSessionId;
59
- private getCookieValue;
60
- private trackEvent;
61
- private maskSensitiveData;
62
- private trackPageHit;
63
- private trackProvider;
64
- private registerChainChangedListener;
65
- private handleAccountDisconnected;
66
- private onChainChanged;
67
- private onAccountsChanged;
68
- private registerAccountsChangedListener;
69
- private getCurrentChainId;
70
- private handleAccountConnected;
71
- private getCurrentWallet;
72
- /**
73
- * Stores the wallet address in session storage when connected.
74
- * @param address - The wallet address to store.
75
- */
76
- private storeWalletAddress;
77
- /**
78
- * Clears the wallet address from session storage when disconnected.
79
- */
80
- private clearWalletAddress;
81
- private buildApiUrl;
82
- connect({ account, chainId }: {
83
- account: string;
42
+ static init(apiKey: string, options?: Options): Promise<FormoAnalytics>;
43
+ connect({ chainId, address }: {
84
44
  chainId: ChainID;
45
+ address: Address;
85
46
  }): Promise<void>;
86
- disconnect(attributes?: {
87
- account?: string;
47
+ disconnect(params?: {
88
48
  chainId?: ChainID;
89
- }): Promise<void> | undefined;
90
- chain({ chainId, account }: {
49
+ address?: Address;
50
+ }): Promise<void>;
51
+ chain({ chainId, address }: {
91
52
  chainId: ChainID;
92
- account?: string;
53
+ address?: Address;
93
54
  }): Promise<void>;
94
- init(apiKey: string, projectId: string): Promise<FormoAnalytics>;
95
- identify(userData: any): void;
96
- page(): void;
97
- track(eventName: string, eventData: any): void;
55
+ page(): Promise<void>;
56
+ track(eventName: string, eventData: Record<string, any>): Promise<void>;
57
+ private trackProvider;
58
+ private registerAddressChangedListener;
59
+ private registerChainChangedListener;
60
+ private onAddressChanged;
61
+ private onAddressConnected;
62
+ private handleDisconnect;
63
+ private onAddressDisconnected;
64
+ private onChainChanged;
65
+ private trackPageHit;
66
+ private trackEvent;
67
+ get provider(): EIP1193Provider | undefined;
68
+ private getAddress;
69
+ private getAccounts;
70
+ private getCurrentChainId;
71
+ private getLocation;
72
+ private getLanguage;
73
+ private buildEventPayload;
98
74
  }
99
75
  export {};
100
76
  //# sourceMappingURL=FormoAnalytics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormoAnalytics.d.ts","sourceRoot":"","sources":["../../../src/FormoAnalytics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FormoAnalytics.d.ts","sourceRoot":"","sources":["../../../src/FormoAnalytics.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE7E,UAAU,eAAe;IACvB;;OAEG;IACH,IAAI,IAAI,IAAI,CAAC;IAEb;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtE;;OAEG;IACH,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5E;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErE;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAED,qBAAa,cAAe,YAAW,eAAe;aAYlC,MAAM,EAAE,MAAM;IACvB,OAAO,EAAE,OAAO;IAZzB,OAAO,CAAC,SAAS,CAAC,CAAkB;IACpC,OAAO,CAAC,kBAAkB,CAGnB;IAEP,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,OAAO;WAeM,IAAI,CACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,cAAc,CAAC;IAUpB,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpF,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5E,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBnF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7E,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,8BAA8B;IAYtC,OAAO,CAAC,4BAA4B;YAOtB,gBAAgB;YAQhB,kBAAkB;YAYlB,gBAAgB;YAUhB,qBAAqB;YAIrB,cAAc;IAsC5B,OAAO,CAAC,YAAY;YAcN,UAAU;IAyCxB,IAAI,QAAQ,IAAI,eAAe,GAAG,SAAS,CAE1C;YAEa,UAAU;YAsBV,WAAW;YAuBX,iBAAiB;IA0B/B,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,WAAW;YAcL,iBAAiB;CAwBhC"}