@grainql/analytics-web 1.7.4 → 2.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 (104) hide show
  1. package/README.md +71 -718
  2. package/dist/cjs/react/GrainProvider.d.ts +11 -0
  3. package/dist/cjs/react/GrainProvider.d.ts.map +1 -0
  4. package/dist/cjs/react/GrainProvider.js +79 -0
  5. package/dist/cjs/react/GrainProvider.js.map +1 -0
  6. package/dist/cjs/react/context.d.ts +11 -0
  7. package/dist/cjs/react/context.d.ts.map +1 -0
  8. package/dist/cjs/react/context.js +43 -0
  9. package/dist/cjs/react/context.js.map +1 -0
  10. package/dist/cjs/react/hooks/useAllConfigs.d.ts +8 -0
  11. package/dist/cjs/react/hooks/useAllConfigs.d.ts.map +1 -0
  12. package/dist/cjs/react/hooks/useAllConfigs.js +112 -0
  13. package/dist/cjs/react/hooks/useAllConfigs.js.map +1 -0
  14. package/dist/cjs/react/hooks/useConfig.d.ts +9 -0
  15. package/dist/cjs/react/hooks/useConfig.d.ts.map +1 -0
  16. package/dist/cjs/react/hooks/useConfig.js +116 -0
  17. package/dist/cjs/react/hooks/useConfig.js.map +1 -0
  18. package/dist/cjs/react/hooks/useGrainAnalytics.d.ts +6 -0
  19. package/dist/cjs/react/hooks/useGrainAnalytics.d.ts.map +1 -0
  20. package/dist/cjs/react/hooks/useGrainAnalytics.js +50 -0
  21. package/dist/cjs/react/hooks/useGrainAnalytics.js.map +1 -0
  22. package/dist/cjs/react/hooks/useTrack.d.ts +9 -0
  23. package/dist/cjs/react/hooks/useTrack.d.ts.map +1 -0
  24. package/dist/cjs/react/hooks/useTrack.js +53 -0
  25. package/dist/cjs/react/hooks/useTrack.js.map +1 -0
  26. package/dist/cjs/react/index.d.ts +36 -0
  27. package/dist/cjs/react/index.d.ts.map +1 -0
  28. package/dist/cjs/react/index.js +45 -0
  29. package/dist/cjs/react/index.js.map +1 -0
  30. package/dist/cjs/react/types.d.ts +33 -0
  31. package/dist/cjs/react/types.d.ts.map +1 -0
  32. package/dist/cjs/react/types.js +6 -0
  33. package/dist/cjs/react/types.js.map +1 -0
  34. package/dist/esm/react/GrainProvider.d.ts +11 -0
  35. package/dist/esm/react/GrainProvider.d.ts.map +1 -0
  36. package/dist/esm/react/GrainProvider.js +43 -0
  37. package/dist/esm/react/GrainProvider.js.map +1 -0
  38. package/dist/esm/react/context.d.ts +11 -0
  39. package/dist/esm/react/context.d.ts.map +1 -0
  40. package/dist/esm/react/context.js +7 -0
  41. package/dist/esm/react/context.js.map +1 -0
  42. package/dist/esm/react/hooks/useAllConfigs.d.ts +8 -0
  43. package/dist/esm/react/hooks/useAllConfigs.d.ts.map +1 -0
  44. package/dist/esm/react/hooks/useAllConfigs.js +76 -0
  45. package/dist/esm/react/hooks/useAllConfigs.js.map +1 -0
  46. package/dist/esm/react/hooks/useConfig.d.ts +9 -0
  47. package/dist/esm/react/hooks/useConfig.d.ts.map +1 -0
  48. package/dist/esm/react/hooks/useConfig.js +80 -0
  49. package/dist/esm/react/hooks/useConfig.js.map +1 -0
  50. package/dist/esm/react/hooks/useGrainAnalytics.d.ts +6 -0
  51. package/dist/esm/react/hooks/useGrainAnalytics.d.ts.map +1 -0
  52. package/dist/esm/react/hooks/useGrainAnalytics.js +14 -0
  53. package/dist/esm/react/hooks/useGrainAnalytics.js.map +1 -0
  54. package/dist/esm/react/hooks/useTrack.d.ts +9 -0
  55. package/dist/esm/react/hooks/useTrack.d.ts.map +1 -0
  56. package/dist/esm/react/hooks/useTrack.js +17 -0
  57. package/dist/esm/react/hooks/useTrack.js.map +1 -0
  58. package/dist/esm/react/index.d.ts +36 -0
  59. package/dist/esm/react/index.d.ts.map +1 -0
  60. package/dist/esm/react/index.js +37 -0
  61. package/dist/esm/react/index.js.map +1 -0
  62. package/dist/esm/react/types.d.ts +33 -0
  63. package/dist/esm/react/types.d.ts.map +1 -0
  64. package/dist/esm/react/types.js +5 -0
  65. package/dist/esm/react/types.js.map +1 -0
  66. package/dist/index.global.dev.js +1 -1
  67. package/dist/index.global.js +1 -1
  68. package/dist/react/index.d.ts +405 -0
  69. package/dist/react/index.d.ts.map +1 -0
  70. package/dist/react/index.js +1181 -0
  71. package/dist/react/index.mjs +1176 -0
  72. package/dist/react/react/GrainProvider.d.ts +11 -0
  73. package/dist/react/react/GrainProvider.d.ts.map +1 -0
  74. package/dist/react/react/GrainProvider.js +45 -0
  75. package/dist/react/react/GrainProvider.mjs +42 -0
  76. package/dist/react/react/context.d.ts +11 -0
  77. package/dist/react/react/context.d.ts.map +1 -0
  78. package/dist/react/react/context.js +9 -0
  79. package/dist/react/react/context.mjs +6 -0
  80. package/dist/react/react/hooks/useAllConfigs.d.ts +8 -0
  81. package/dist/react/react/hooks/useAllConfigs.d.ts.map +1 -0
  82. package/dist/react/react/hooks/useAllConfigs.js +78 -0
  83. package/dist/react/react/hooks/useAllConfigs.mjs +75 -0
  84. package/dist/react/react/hooks/useConfig.d.ts +9 -0
  85. package/dist/react/react/hooks/useConfig.d.ts.map +1 -0
  86. package/dist/react/react/hooks/useConfig.js +82 -0
  87. package/dist/react/react/hooks/useConfig.mjs +79 -0
  88. package/dist/react/react/hooks/useGrainAnalytics.d.ts +6 -0
  89. package/dist/react/react/hooks/useGrainAnalytics.d.ts.map +1 -0
  90. package/dist/react/react/hooks/useGrainAnalytics.js +16 -0
  91. package/dist/react/react/hooks/useGrainAnalytics.mjs +13 -0
  92. package/dist/react/react/hooks/useTrack.d.ts +9 -0
  93. package/dist/react/react/hooks/useTrack.d.ts.map +1 -0
  94. package/dist/react/react/hooks/useTrack.js +19 -0
  95. package/dist/react/react/hooks/useTrack.mjs +16 -0
  96. package/dist/react/react/index.d.ts +36 -0
  97. package/dist/react/react/index.d.ts.map +1 -0
  98. package/dist/react/react/index.js +44 -0
  99. package/dist/react/react/index.mjs +36 -0
  100. package/dist/react/react/types.d.ts +33 -0
  101. package/dist/react/react/types.d.ts.map +1 -0
  102. package/dist/react/react/types.js +5 -0
  103. package/dist/react/react/types.mjs +4 -0
  104. package/package.json +20 -2
@@ -0,0 +1,11 @@
1
+ /**
2
+ * GrainProvider - Context provider for Grain Analytics
3
+ *
4
+ * Supports two patterns:
5
+ * 1. Provider-managed: Pass `config` prop, provider creates and manages client lifecycle
6
+ * 2. External client: Pass `client` prop, user manages lifecycle
7
+ */
8
+ import * as React from 'react';
9
+ import type { GrainProviderProps } from './types';
10
+ export declare function GrainProvider({ children, client, config }: GrainProviderProps): React.JSX.Element;
11
+ //# sourceMappingURL=GrainProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrainProvider.d.ts","sourceRoot":"","sources":["../../../src/react/GrainProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,kBAAkB,qBA8C7E"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /**
3
+ * GrainProvider - Context provider for Grain Analytics
4
+ *
5
+ * Supports two patterns:
6
+ * 1. Provider-managed: Pass `config` prop, provider creates and manages client lifecycle
7
+ * 2. External client: Pass `client` prop, user manages lifecycle
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.GrainProvider = GrainProvider;
44
+ const React = __importStar(require("react"));
45
+ const index_1 = require("../index");
46
+ const context_1 = require("./context");
47
+ function GrainProvider({ children, client, config }) {
48
+ // Validate props
49
+ if (client && config) {
50
+ throw new Error('GrainProvider: Cannot provide both "client" and "config" props. ' +
51
+ 'Use "client" for external management or "config" for provider-managed client.');
52
+ }
53
+ if (!client && !config) {
54
+ throw new Error('GrainProvider: Must provide either "client" or "config" prop. ' +
55
+ 'Use "client" to pass an existing GrainAnalytics instance, or "config" to create one automatically.');
56
+ }
57
+ const isProviderManaged = Boolean(config);
58
+ const clientRef = React.useRef(null);
59
+ // Initialize client if config is provided
60
+ if (isProviderManaged && !clientRef.current && config) {
61
+ clientRef.current = new index_1.GrainAnalytics(config);
62
+ }
63
+ // Use external client if provided
64
+ const activeClient = client || clientRef.current;
65
+ if (!activeClient) {
66
+ throw new Error('GrainProvider: Failed to initialize client');
67
+ }
68
+ // Cleanup on unmount (only for provider-managed clients)
69
+ React.useEffect(() => {
70
+ return () => {
71
+ if (isProviderManaged && clientRef.current) {
72
+ clientRef.current.destroy();
73
+ clientRef.current = null;
74
+ }
75
+ };
76
+ }, [isProviderManaged]);
77
+ return (React.createElement(context_1.GrainContext.Provider, { value: { client: activeClient, isProviderManaged } }, children));
78
+ }
79
+ //# sourceMappingURL=GrainProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrainProvider.js","sourceRoot":"","sources":["../../../src/react/GrainProvider.tsx"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOH,sCA8CC;AAnDD,6CAA+B;AAC/B,oCAA0C;AAC1C,uCAAyC;AAGzC,SAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAsB;IAC5E,iBAAiB;IACjB,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,kEAAkE;YAClE,+EAA+E,CAChF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,gEAAgE;YAChE,oGAAoG,CACrG,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAwB,IAAI,CAAC,CAAC;IAE5D,0CAA0C;IAC1C,IAAI,iBAAiB,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;QACtD,SAAS,CAAC,OAAO,GAAG,IAAI,sBAAc,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,kCAAkC;IAClC,MAAM,YAAY,GAAG,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC;IAEjD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,OAAO,GAAG,EAAE;YACV,IAAI,iBAAiB,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBAC3C,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC5B,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,OAAO,CACL,oBAAC,sBAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,IACtE,QAAQ,CACa,CACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * React context for Grain Analytics
3
+ */
4
+ import * as React from 'react';
5
+ import type { GrainAnalytics } from '../index';
6
+ export interface GrainContextValue {
7
+ client: GrainAnalytics;
8
+ isProviderManaged: boolean;
9
+ }
10
+ export declare const GrainContext: React.Context<GrainContextValue | null>;
11
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/react/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,cAAc,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,YAAY,yCAAsD,CAAC"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ /**
3
+ * React context for Grain Analytics
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.GrainContext = void 0;
40
+ const React = __importStar(require("react"));
41
+ exports.GrainContext = React.createContext(null);
42
+ exports.GrainContext.displayName = 'GrainContext';
43
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/react/context.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,6CAA+B;AAQlB,QAAA,YAAY,GAAG,KAAK,CAAC,aAAa,CAA2B,IAAI,CAAC,CAAC;AAEhF,oBAAY,CAAC,WAAW,GAAG,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * useAllConfigs - Get all configurations with automatic updates
3
+ *
4
+ * Returns all configs as a reactive object with cache-first strategy.
5
+ */
6
+ import type { UseAllConfigsOptions, UseAllConfigsResult } from '../types';
7
+ export declare function useAllConfigs(options?: UseAllConfigsOptions): UseAllConfigsResult;
8
+ //# sourceMappingURL=useAllConfigs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAllConfigs.d.ts","sourceRoot":"","sources":["../../../../src/react/hooks/useAllConfigs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE1E,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,mBAAmB,CA4ErF"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ /**
3
+ * useAllConfigs - Get all configurations with automatic updates
4
+ *
5
+ * Returns all configs as a reactive object with cache-first strategy.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.useAllConfigs = useAllConfigs;
42
+ const React = __importStar(require("react"));
43
+ const useGrainAnalytics_1 = require("./useGrainAnalytics");
44
+ function useAllConfigs(options = {}) {
45
+ const client = (0, useGrainAnalytics_1.useGrainAnalytics)();
46
+ // Get initial configs from cache/defaults (synchronous, instant)
47
+ const [configs, setConfigs] = React.useState(() => client.getAllConfigs());
48
+ const [isRefreshing, setIsRefreshing] = React.useState(false);
49
+ const [error, setError] = React.useState(null);
50
+ const isMountedRef = React.useRef(true);
51
+ // Fetch fresh configs from API
52
+ const fetchConfigs = React.useCallback(async () => {
53
+ if (!isMountedRef.current)
54
+ return;
55
+ setIsRefreshing(true);
56
+ setError(null);
57
+ try {
58
+ const response = await client.fetchConfig({
59
+ immediateKeys: options.immediateKeys || [],
60
+ properties: options.properties,
61
+ forceRefresh: options.forceRefresh,
62
+ });
63
+ if (isMountedRef.current && response) {
64
+ setConfigs(response.configurations);
65
+ }
66
+ }
67
+ catch (err) {
68
+ if (isMountedRef.current) {
69
+ setError(err instanceof Error ? err : new Error(String(err)));
70
+ }
71
+ }
72
+ finally {
73
+ if (isMountedRef.current) {
74
+ setIsRefreshing(false);
75
+ }
76
+ }
77
+ }, [client, options.immediateKeys, options.properties, options.forceRefresh]);
78
+ // Manual refresh function
79
+ const refresh = React.useCallback(async () => {
80
+ await fetchConfigs();
81
+ }, [fetchConfigs]);
82
+ // Background fetch on mount and when options change
83
+ React.useEffect(() => {
84
+ fetchConfigs();
85
+ }, [fetchConfigs]);
86
+ // Subscribe to config changes
87
+ React.useEffect(() => {
88
+ const listener = (configurations) => {
89
+ if (isMountedRef.current) {
90
+ setConfigs(configurations);
91
+ }
92
+ };
93
+ client.addConfigChangeListener(listener);
94
+ return () => {
95
+ client.removeConfigChangeListener(listener);
96
+ };
97
+ }, [client]);
98
+ // Track mount state
99
+ React.useEffect(() => {
100
+ isMountedRef.current = true;
101
+ return () => {
102
+ isMountedRef.current = false;
103
+ };
104
+ }, []);
105
+ return {
106
+ configs,
107
+ isRefreshing,
108
+ error,
109
+ refresh,
110
+ };
111
+ }
112
+ //# sourceMappingURL=useAllConfigs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAllConfigs.js","sourceRoot":"","sources":["../../../../src/react/hooks/useAllConfigs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * useConfig - Cache-first config access with automatic background refresh
3
+ *
4
+ * Returns cached/default value immediately, fetches fresh data in background,
5
+ * and automatically updates when configuration changes.
6
+ */
7
+ import type { UseConfigOptions, UseConfigResult } from '../types';
8
+ export declare function useConfig(key: string, options?: UseConfigOptions): UseConfigResult;
9
+ //# sourceMappingURL=useConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useConfig.d.ts","sourceRoot":"","sources":["../../../../src/react/hooks/useConfig.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAElE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,eAAe,CA+EtF"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ /**
3
+ * useConfig - Cache-first config access with automatic background refresh
4
+ *
5
+ * Returns cached/default value immediately, fetches fresh data in background,
6
+ * and automatically updates when configuration changes.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.useConfig = useConfig;
43
+ const React = __importStar(require("react"));
44
+ const useGrainAnalytics_1 = require("./useGrainAnalytics");
45
+ function useConfig(key, options = {}) {
46
+ const client = (0, useGrainAnalytics_1.useGrainAnalytics)();
47
+ // Get initial value from cache/defaults (synchronous, instant)
48
+ const [value, setValue] = React.useState(() => client.getConfig(key));
49
+ const [isRefreshing, setIsRefreshing] = React.useState(false);
50
+ const [error, setError] = React.useState(null);
51
+ const isMountedRef = React.useRef(true);
52
+ // Fetch fresh config from API
53
+ const fetchConfig = React.useCallback(async () => {
54
+ if (!isMountedRef.current)
55
+ return;
56
+ setIsRefreshing(true);
57
+ setError(null);
58
+ try {
59
+ const response = await client.fetchConfig({
60
+ immediateKeys: options.immediateKeys || [key],
61
+ properties: options.properties,
62
+ forceRefresh: options.forceRefresh,
63
+ });
64
+ if (isMountedRef.current && response) {
65
+ const newValue = response.configurations[key];
66
+ if (newValue !== undefined) {
67
+ setValue(newValue);
68
+ }
69
+ }
70
+ }
71
+ catch (err) {
72
+ if (isMountedRef.current) {
73
+ setError(err instanceof Error ? err : new Error(String(err)));
74
+ }
75
+ }
76
+ finally {
77
+ if (isMountedRef.current) {
78
+ setIsRefreshing(false);
79
+ }
80
+ }
81
+ }, [client, key, options.immediateKeys, options.properties, options.forceRefresh]);
82
+ // Manual refresh function
83
+ const refresh = React.useCallback(async () => {
84
+ await fetchConfig();
85
+ }, [fetchConfig]);
86
+ // Background fetch on mount and when key/options change
87
+ React.useEffect(() => {
88
+ fetchConfig();
89
+ }, [fetchConfig]);
90
+ // Subscribe to config changes
91
+ React.useEffect(() => {
92
+ const listener = (configurations) => {
93
+ if (isMountedRef.current && configurations[key] !== undefined) {
94
+ setValue(configurations[key]);
95
+ }
96
+ };
97
+ client.addConfigChangeListener(listener);
98
+ return () => {
99
+ client.removeConfigChangeListener(listener);
100
+ };
101
+ }, [client, key]);
102
+ // Track mount state
103
+ React.useEffect(() => {
104
+ isMountedRef.current = true;
105
+ return () => {
106
+ isMountedRef.current = false;
107
+ };
108
+ }, []);
109
+ return {
110
+ value,
111
+ isRefreshing,
112
+ error,
113
+ refresh,
114
+ };
115
+ }
116
+ //# sourceMappingURL=useConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useConfig.js","sourceRoot":"","sources":["../../../../src/react/hooks/useConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * useGrainAnalytics - Access the GrainAnalytics client from context
3
+ */
4
+ import type { GrainAnalytics } from '../../index';
5
+ export declare function useGrainAnalytics(): GrainAnalytics;
6
+ //# sourceMappingURL=useGrainAnalytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGrainAnalytics.d.ts","sourceRoot":"","sources":["../../../../src/react/hooks/useGrainAnalytics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAgB,iBAAiB,IAAI,cAAc,CAWlD"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ /**
3
+ * useGrainAnalytics - Access the GrainAnalytics client from context
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.useGrainAnalytics = useGrainAnalytics;
40
+ const React = __importStar(require("react"));
41
+ const context_1 = require("../context");
42
+ function useGrainAnalytics() {
43
+ const context = React.useContext(context_1.GrainContext);
44
+ if (!context) {
45
+ throw new Error('useGrainAnalytics must be used within a GrainProvider. ' +
46
+ 'Wrap your component tree with <GrainProvider client={client}> or <GrainProvider config={{...}}>');
47
+ }
48
+ return context.client;
49
+ }
50
+ //# sourceMappingURL=useGrainAnalytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGrainAnalytics.js","sourceRoot":"","sources":["../../../../src/react/hooks/useGrainAnalytics.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMH,8CAWC;AAfD,6CAA+B;AAC/B,wCAA0C;AAG1C,SAAgB,iBAAiB;IAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,sBAAY,CAAC,CAAC;IAE/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,yDAAyD;YACzD,iGAAiG,CAClG,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * useTrack - Get a stable, memoized track function
3
+ *
4
+ * Returns a track function that doesn't cause re-renders when passed to child components.
5
+ * Prevents unnecessary re-renders compared to using useCallback.
6
+ */
7
+ import type { TrackFunction } from '../types';
8
+ export declare function useTrack(): TrackFunction;
9
+ //# sourceMappingURL=useTrack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTrack.d.ts","sourceRoot":"","sources":["../../../../src/react/hooks/useTrack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,wBAAgB,QAAQ,IAAI,aAAa,CAYxC"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /**
3
+ * useTrack - Get a stable, memoized track function
4
+ *
5
+ * Returns a track function that doesn't cause re-renders when passed to child components.
6
+ * Prevents unnecessary re-renders compared to using useCallback.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.useTrack = useTrack;
43
+ const React = __importStar(require("react"));
44
+ const useGrainAnalytics_1 = require("./useGrainAnalytics");
45
+ function useTrack() {
46
+ const client = (0, useGrainAnalytics_1.useGrainAnalytics)();
47
+ // Create stable track function that won't change across renders
48
+ const track = React.useCallback(async (eventName, properties, options) => {
49
+ await client.track(eventName, properties, options);
50
+ }, [client]);
51
+ return track;
52
+ }
53
+ //# sourceMappingURL=useTrack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTrack.js","sourceRoot":"","sources":["../../../../src/react/hooks/useTrack.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMH,4BAYC;AAhBD,6CAA+B;AAC/B,2DAAwD;AAGxD,SAAgB,QAAQ;IACtB,MAAM,MAAM,GAAG,IAAA,qCAAiB,GAAE,CAAC;IAEnC,gEAAgE;IAChE,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAC7B,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE;QACvC,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Grain Analytics React Hooks
3
+ *
4
+ * React integration for @grainql/analytics-web
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * import { GrainProvider, useConfig, useTrack } from '@grainql/analytics-web/react';
9
+ *
10
+ * // Pattern 1: Provider-managed client
11
+ * <GrainProvider config={{ tenantId: 'xxx' }}>
12
+ * <App />
13
+ * </GrainProvider>
14
+ *
15
+ * // Pattern 2: External client
16
+ * const grain = new GrainAnalytics({ tenantId: 'xxx' });
17
+ * <GrainProvider client={grain}>
18
+ * <App />
19
+ * </GrainProvider>
20
+ *
21
+ * // Use hooks in components
22
+ * function MyComponent() {
23
+ * const { value } = useConfig('hero_variant');
24
+ * const track = useTrack();
25
+ *
26
+ * return <button onClick={() => track('clicked')}>Click</button>;
27
+ * }
28
+ * ```
29
+ */
30
+ export { GrainProvider } from './GrainProvider';
31
+ export { useGrainAnalytics } from './hooks/useGrainAnalytics';
32
+ export { useConfig } from './hooks/useConfig';
33
+ export { useAllConfigs } from './hooks/useAllConfigs';
34
+ export { useTrack } from './hooks/useTrack';
35
+ export type { GrainProviderProps, UseConfigOptions, UseConfigResult, UseAllConfigsOptions, UseAllConfigsResult, TrackFunction, } from './types';
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,GACd,MAAM,SAAS,CAAC"}