@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.
- package/README.md +71 -718
- package/dist/cjs/react/GrainProvider.d.ts +11 -0
- package/dist/cjs/react/GrainProvider.d.ts.map +1 -0
- package/dist/cjs/react/GrainProvider.js +79 -0
- package/dist/cjs/react/GrainProvider.js.map +1 -0
- package/dist/cjs/react/context.d.ts +11 -0
- package/dist/cjs/react/context.d.ts.map +1 -0
- package/dist/cjs/react/context.js +43 -0
- package/dist/cjs/react/context.js.map +1 -0
- package/dist/cjs/react/hooks/useAllConfigs.d.ts +8 -0
- package/dist/cjs/react/hooks/useAllConfigs.d.ts.map +1 -0
- package/dist/cjs/react/hooks/useAllConfigs.js +112 -0
- package/dist/cjs/react/hooks/useAllConfigs.js.map +1 -0
- package/dist/cjs/react/hooks/useConfig.d.ts +9 -0
- package/dist/cjs/react/hooks/useConfig.d.ts.map +1 -0
- package/dist/cjs/react/hooks/useConfig.js +116 -0
- package/dist/cjs/react/hooks/useConfig.js.map +1 -0
- package/dist/cjs/react/hooks/useGrainAnalytics.d.ts +6 -0
- package/dist/cjs/react/hooks/useGrainAnalytics.d.ts.map +1 -0
- package/dist/cjs/react/hooks/useGrainAnalytics.js +50 -0
- package/dist/cjs/react/hooks/useGrainAnalytics.js.map +1 -0
- package/dist/cjs/react/hooks/useTrack.d.ts +9 -0
- package/dist/cjs/react/hooks/useTrack.d.ts.map +1 -0
- package/dist/cjs/react/hooks/useTrack.js +53 -0
- package/dist/cjs/react/hooks/useTrack.js.map +1 -0
- package/dist/cjs/react/index.d.ts +36 -0
- package/dist/cjs/react/index.d.ts.map +1 -0
- package/dist/cjs/react/index.js +45 -0
- package/dist/cjs/react/index.js.map +1 -0
- package/dist/cjs/react/types.d.ts +33 -0
- package/dist/cjs/react/types.d.ts.map +1 -0
- package/dist/cjs/react/types.js +6 -0
- package/dist/cjs/react/types.js.map +1 -0
- package/dist/esm/react/GrainProvider.d.ts +11 -0
- package/dist/esm/react/GrainProvider.d.ts.map +1 -0
- package/dist/esm/react/GrainProvider.js +43 -0
- package/dist/esm/react/GrainProvider.js.map +1 -0
- package/dist/esm/react/context.d.ts +11 -0
- package/dist/esm/react/context.d.ts.map +1 -0
- package/dist/esm/react/context.js +7 -0
- package/dist/esm/react/context.js.map +1 -0
- package/dist/esm/react/hooks/useAllConfigs.d.ts +8 -0
- package/dist/esm/react/hooks/useAllConfigs.d.ts.map +1 -0
- package/dist/esm/react/hooks/useAllConfigs.js +76 -0
- package/dist/esm/react/hooks/useAllConfigs.js.map +1 -0
- package/dist/esm/react/hooks/useConfig.d.ts +9 -0
- package/dist/esm/react/hooks/useConfig.d.ts.map +1 -0
- package/dist/esm/react/hooks/useConfig.js +80 -0
- package/dist/esm/react/hooks/useConfig.js.map +1 -0
- package/dist/esm/react/hooks/useGrainAnalytics.d.ts +6 -0
- package/dist/esm/react/hooks/useGrainAnalytics.d.ts.map +1 -0
- package/dist/esm/react/hooks/useGrainAnalytics.js +14 -0
- package/dist/esm/react/hooks/useGrainAnalytics.js.map +1 -0
- package/dist/esm/react/hooks/useTrack.d.ts +9 -0
- package/dist/esm/react/hooks/useTrack.d.ts.map +1 -0
- package/dist/esm/react/hooks/useTrack.js +17 -0
- package/dist/esm/react/hooks/useTrack.js.map +1 -0
- package/dist/esm/react/index.d.ts +36 -0
- package/dist/esm/react/index.d.ts.map +1 -0
- package/dist/esm/react/index.js +37 -0
- package/dist/esm/react/index.js.map +1 -0
- package/dist/esm/react/types.d.ts +33 -0
- package/dist/esm/react/types.d.ts.map +1 -0
- package/dist/esm/react/types.js +5 -0
- package/dist/esm/react/types.js.map +1 -0
- package/dist/index.global.dev.js +1 -1
- package/dist/index.global.js +1 -1
- package/dist/react/index.d.ts +405 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +1181 -0
- package/dist/react/index.mjs +1176 -0
- package/dist/react/react/GrainProvider.d.ts +11 -0
- package/dist/react/react/GrainProvider.d.ts.map +1 -0
- package/dist/react/react/GrainProvider.js +45 -0
- package/dist/react/react/GrainProvider.mjs +42 -0
- package/dist/react/react/context.d.ts +11 -0
- package/dist/react/react/context.d.ts.map +1 -0
- package/dist/react/react/context.js +9 -0
- package/dist/react/react/context.mjs +6 -0
- package/dist/react/react/hooks/useAllConfigs.d.ts +8 -0
- package/dist/react/react/hooks/useAllConfigs.d.ts.map +1 -0
- package/dist/react/react/hooks/useAllConfigs.js +78 -0
- package/dist/react/react/hooks/useAllConfigs.mjs +75 -0
- package/dist/react/react/hooks/useConfig.d.ts +9 -0
- package/dist/react/react/hooks/useConfig.d.ts.map +1 -0
- package/dist/react/react/hooks/useConfig.js +82 -0
- package/dist/react/react/hooks/useConfig.mjs +79 -0
- package/dist/react/react/hooks/useGrainAnalytics.d.ts +6 -0
- package/dist/react/react/hooks/useGrainAnalytics.d.ts.map +1 -0
- package/dist/react/react/hooks/useGrainAnalytics.js +16 -0
- package/dist/react/react/hooks/useGrainAnalytics.mjs +13 -0
- package/dist/react/react/hooks/useTrack.d.ts +9 -0
- package/dist/react/react/hooks/useTrack.d.ts.map +1 -0
- package/dist/react/react/hooks/useTrack.js +19 -0
- package/dist/react/react/hooks/useTrack.mjs +16 -0
- package/dist/react/react/index.d.ts +36 -0
- package/dist/react/react/index.d.ts.map +1 -0
- package/dist/react/react/index.js +44 -0
- package/dist/react/react/index.mjs +36 -0
- package/dist/react/react/types.d.ts +33 -0
- package/dist/react/react/types.d.ts.map +1 -0
- package/dist/react/react/types.js +5 -0
- package/dist/react/react/types.mjs +4 -0
- package/package.json +20 -2
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Grain Analytics React Hooks
|
|
4
|
+
*
|
|
5
|
+
* React integration for @grainql/analytics-web
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* import { GrainProvider, useConfig, useTrack } from '@grainql/analytics-web/react';
|
|
10
|
+
*
|
|
11
|
+
* // Pattern 1: Provider-managed client
|
|
12
|
+
* <GrainProvider config={{ tenantId: 'xxx' }}>
|
|
13
|
+
* <App />
|
|
14
|
+
* </GrainProvider>
|
|
15
|
+
*
|
|
16
|
+
* // Pattern 2: External client
|
|
17
|
+
* const grain = new GrainAnalytics({ tenantId: 'xxx' });
|
|
18
|
+
* <GrainProvider client={grain}>
|
|
19
|
+
* <App />
|
|
20
|
+
* </GrainProvider>
|
|
21
|
+
*
|
|
22
|
+
* // Use hooks in components
|
|
23
|
+
* function MyComponent() {
|
|
24
|
+
* const { value } = useConfig('hero_variant');
|
|
25
|
+
* const track = useTrack();
|
|
26
|
+
*
|
|
27
|
+
* return <button onClick={() => track('clicked')}>Click</button>;
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.useTrack = exports.useAllConfigs = exports.useConfig = exports.useGrainAnalytics = exports.GrainProvider = void 0;
|
|
33
|
+
// Provider
|
|
34
|
+
var GrainProvider_1 = require("./GrainProvider");
|
|
35
|
+
Object.defineProperty(exports, "GrainProvider", { enumerable: true, get: function () { return GrainProvider_1.GrainProvider; } });
|
|
36
|
+
// Hooks
|
|
37
|
+
var useGrainAnalytics_1 = require("./hooks/useGrainAnalytics");
|
|
38
|
+
Object.defineProperty(exports, "useGrainAnalytics", { enumerable: true, get: function () { return useGrainAnalytics_1.useGrainAnalytics; } });
|
|
39
|
+
var useConfig_1 = require("./hooks/useConfig");
|
|
40
|
+
Object.defineProperty(exports, "useConfig", { enumerable: true, get: function () { return useConfig_1.useConfig; } });
|
|
41
|
+
var useAllConfigs_1 = require("./hooks/useAllConfigs");
|
|
42
|
+
Object.defineProperty(exports, "useAllConfigs", { enumerable: true, get: function () { return useAllConfigs_1.useAllConfigs; } });
|
|
43
|
+
var useTrack_1 = require("./hooks/useTrack");
|
|
44
|
+
Object.defineProperty(exports, "useTrack", { enumerable: true, get: function () { return useTrack_1.useTrack; } });
|
|
45
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/index.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;;;AAEH,WAAW;AACX,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AAEtB,QAAQ;AACR,+DAA8D;AAArD,sHAAA,iBAAiB,OAAA;AAC1B,+CAA8C;AAArC,sGAAA,SAAS,OAAA;AAClB,uDAAsD;AAA7C,8GAAA,aAAa,OAAA;AACtB,6CAA4C;AAAnC,oGAAA,QAAQ,OAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React-specific types for Grain Analytics
|
|
3
|
+
*/
|
|
4
|
+
import type { GrainAnalytics, GrainConfig, SendEventOptions } from '../index';
|
|
5
|
+
export interface GrainProviderProps {
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
client?: GrainAnalytics;
|
|
8
|
+
config?: GrainConfig;
|
|
9
|
+
}
|
|
10
|
+
export interface UseConfigOptions {
|
|
11
|
+
forceRefresh?: boolean;
|
|
12
|
+
immediateKeys?: string[];
|
|
13
|
+
properties?: Record<string, string>;
|
|
14
|
+
}
|
|
15
|
+
export interface UseConfigResult {
|
|
16
|
+
value: string | undefined;
|
|
17
|
+
isRefreshing: boolean;
|
|
18
|
+
error: Error | null;
|
|
19
|
+
refresh: () => Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export interface UseAllConfigsOptions {
|
|
22
|
+
forceRefresh?: boolean;
|
|
23
|
+
immediateKeys?: string[];
|
|
24
|
+
properties?: Record<string, string>;
|
|
25
|
+
}
|
|
26
|
+
export interface UseAllConfigsResult {
|
|
27
|
+
configs: Record<string, string>;
|
|
28
|
+
isRefreshing: boolean;
|
|
29
|
+
error: Error | null;
|
|
30
|
+
refresh: () => Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export type TrackFunction = (eventName: string, properties?: Record<string, unknown>, options?: SendEventOptions) => Promise<void>;
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/react/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,CAAC,EAAE,gBAAgB,KACvB,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/react/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -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,43 @@
|
|
|
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 { GrainAnalytics } from '../index';
|
|
10
|
+
import { GrainContext } from './context';
|
|
11
|
+
export function GrainProvider({ children, client, config }) {
|
|
12
|
+
// Validate props
|
|
13
|
+
if (client && config) {
|
|
14
|
+
throw new Error('GrainProvider: Cannot provide both "client" and "config" props. ' +
|
|
15
|
+
'Use "client" for external management or "config" for provider-managed client.');
|
|
16
|
+
}
|
|
17
|
+
if (!client && !config) {
|
|
18
|
+
throw new Error('GrainProvider: Must provide either "client" or "config" prop. ' +
|
|
19
|
+
'Use "client" to pass an existing GrainAnalytics instance, or "config" to create one automatically.');
|
|
20
|
+
}
|
|
21
|
+
const isProviderManaged = Boolean(config);
|
|
22
|
+
const clientRef = React.useRef(null);
|
|
23
|
+
// Initialize client if config is provided
|
|
24
|
+
if (isProviderManaged && !clientRef.current && config) {
|
|
25
|
+
clientRef.current = new GrainAnalytics(config);
|
|
26
|
+
}
|
|
27
|
+
// Use external client if provided
|
|
28
|
+
const activeClient = client || clientRef.current;
|
|
29
|
+
if (!activeClient) {
|
|
30
|
+
throw new Error('GrainProvider: Failed to initialize client');
|
|
31
|
+
}
|
|
32
|
+
// Cleanup on unmount (only for provider-managed clients)
|
|
33
|
+
React.useEffect(() => {
|
|
34
|
+
return () => {
|
|
35
|
+
if (isProviderManaged && clientRef.current) {
|
|
36
|
+
clientRef.current.destroy();
|
|
37
|
+
clientRef.current = null;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}, [isProviderManaged]);
|
|
41
|
+
return (React.createElement(GrainContext.Provider, { value: { client: activeClient, isProviderManaged } }, children));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=GrainProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrainProvider.js","sourceRoot":"","sources":["../../../src/react/GrainProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,UAAU,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,cAAc,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,YAAY,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 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/react/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,CAA2B,IAAI,CAAC,CAAC;AAEhF,YAAY,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,76 @@
|
|
|
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 * as React from 'react';
|
|
7
|
+
import { useGrainAnalytics } from './useGrainAnalytics';
|
|
8
|
+
export function useAllConfigs(options = {}) {
|
|
9
|
+
const client = useGrainAnalytics();
|
|
10
|
+
// Get initial configs from cache/defaults (synchronous, instant)
|
|
11
|
+
const [configs, setConfigs] = React.useState(() => client.getAllConfigs());
|
|
12
|
+
const [isRefreshing, setIsRefreshing] = React.useState(false);
|
|
13
|
+
const [error, setError] = React.useState(null);
|
|
14
|
+
const isMountedRef = React.useRef(true);
|
|
15
|
+
// Fetch fresh configs from API
|
|
16
|
+
const fetchConfigs = React.useCallback(async () => {
|
|
17
|
+
if (!isMountedRef.current)
|
|
18
|
+
return;
|
|
19
|
+
setIsRefreshing(true);
|
|
20
|
+
setError(null);
|
|
21
|
+
try {
|
|
22
|
+
const response = await client.fetchConfig({
|
|
23
|
+
immediateKeys: options.immediateKeys || [],
|
|
24
|
+
properties: options.properties,
|
|
25
|
+
forceRefresh: options.forceRefresh,
|
|
26
|
+
});
|
|
27
|
+
if (isMountedRef.current && response) {
|
|
28
|
+
setConfigs(response.configurations);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
if (isMountedRef.current) {
|
|
33
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
if (isMountedRef.current) {
|
|
38
|
+
setIsRefreshing(false);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}, [client, options.immediateKeys, options.properties, options.forceRefresh]);
|
|
42
|
+
// Manual refresh function
|
|
43
|
+
const refresh = React.useCallback(async () => {
|
|
44
|
+
await fetchConfigs();
|
|
45
|
+
}, [fetchConfigs]);
|
|
46
|
+
// Background fetch on mount and when options change
|
|
47
|
+
React.useEffect(() => {
|
|
48
|
+
fetchConfigs();
|
|
49
|
+
}, [fetchConfigs]);
|
|
50
|
+
// Subscribe to config changes
|
|
51
|
+
React.useEffect(() => {
|
|
52
|
+
const listener = (configurations) => {
|
|
53
|
+
if (isMountedRef.current) {
|
|
54
|
+
setConfigs(configurations);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
client.addConfigChangeListener(listener);
|
|
58
|
+
return () => {
|
|
59
|
+
client.removeConfigChangeListener(listener);
|
|
60
|
+
};
|
|
61
|
+
}, [client]);
|
|
62
|
+
// Track mount state
|
|
63
|
+
React.useEffect(() => {
|
|
64
|
+
isMountedRef.current = true;
|
|
65
|
+
return () => {
|
|
66
|
+
isMountedRef.current = false;
|
|
67
|
+
};
|
|
68
|
+
}, []);
|
|
69
|
+
return {
|
|
70
|
+
configs,
|
|
71
|
+
isRefreshing,
|
|
72
|
+
error,
|
|
73
|
+
refresh,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# 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,80 @@
|
|
|
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 * as React from 'react';
|
|
8
|
+
import { useGrainAnalytics } from './useGrainAnalytics';
|
|
9
|
+
export function useConfig(key, options = {}) {
|
|
10
|
+
const client = useGrainAnalytics();
|
|
11
|
+
// Get initial value from cache/defaults (synchronous, instant)
|
|
12
|
+
const [value, setValue] = React.useState(() => client.getConfig(key));
|
|
13
|
+
const [isRefreshing, setIsRefreshing] = React.useState(false);
|
|
14
|
+
const [error, setError] = React.useState(null);
|
|
15
|
+
const isMountedRef = React.useRef(true);
|
|
16
|
+
// Fetch fresh config from API
|
|
17
|
+
const fetchConfig = React.useCallback(async () => {
|
|
18
|
+
if (!isMountedRef.current)
|
|
19
|
+
return;
|
|
20
|
+
setIsRefreshing(true);
|
|
21
|
+
setError(null);
|
|
22
|
+
try {
|
|
23
|
+
const response = await client.fetchConfig({
|
|
24
|
+
immediateKeys: options.immediateKeys || [key],
|
|
25
|
+
properties: options.properties,
|
|
26
|
+
forceRefresh: options.forceRefresh,
|
|
27
|
+
});
|
|
28
|
+
if (isMountedRef.current && response) {
|
|
29
|
+
const newValue = response.configurations[key];
|
|
30
|
+
if (newValue !== undefined) {
|
|
31
|
+
setValue(newValue);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
if (isMountedRef.current) {
|
|
37
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
if (isMountedRef.current) {
|
|
42
|
+
setIsRefreshing(false);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}, [client, key, options.immediateKeys, options.properties, options.forceRefresh]);
|
|
46
|
+
// Manual refresh function
|
|
47
|
+
const refresh = React.useCallback(async () => {
|
|
48
|
+
await fetchConfig();
|
|
49
|
+
}, [fetchConfig]);
|
|
50
|
+
// Background fetch on mount and when key/options change
|
|
51
|
+
React.useEffect(() => {
|
|
52
|
+
fetchConfig();
|
|
53
|
+
}, [fetchConfig]);
|
|
54
|
+
// Subscribe to config changes
|
|
55
|
+
React.useEffect(() => {
|
|
56
|
+
const listener = (configurations) => {
|
|
57
|
+
if (isMountedRef.current && configurations[key] !== undefined) {
|
|
58
|
+
setValue(configurations[key]);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
client.addConfigChangeListener(listener);
|
|
62
|
+
return () => {
|
|
63
|
+
client.removeConfigChangeListener(listener);
|
|
64
|
+
};
|
|
65
|
+
}, [client, key]);
|
|
66
|
+
// Track mount state
|
|
67
|
+
React.useEffect(() => {
|
|
68
|
+
isMountedRef.current = true;
|
|
69
|
+
return () => {
|
|
70
|
+
isMountedRef.current = false;
|
|
71
|
+
};
|
|
72
|
+
}, []);
|
|
73
|
+
return {
|
|
74
|
+
value,
|
|
75
|
+
isRefreshing,
|
|
76
|
+
error,
|
|
77
|
+
refresh,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# 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 @@
|
|
|
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,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useGrainAnalytics - Access the GrainAnalytics client from context
|
|
3
|
+
*/
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { GrainContext } from '../context';
|
|
6
|
+
export function useGrainAnalytics() {
|
|
7
|
+
const context = React.useContext(GrainContext);
|
|
8
|
+
if (!context) {
|
|
9
|
+
throw new Error('useGrainAnalytics must be used within a GrainProvider. ' +
|
|
10
|
+
'Wrap your component tree with <GrainProvider client={client}> or <GrainProvider config={{...}}>');
|
|
11
|
+
}
|
|
12
|
+
return context.client;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=useGrainAnalytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGrainAnalytics.js","sourceRoot":"","sources":["../../../../src/react/hooks/useGrainAnalytics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,YAAY,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,17 @@
|
|
|
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 * as React from 'react';
|
|
8
|
+
import { useGrainAnalytics } from './useGrainAnalytics';
|
|
9
|
+
export function useTrack() {
|
|
10
|
+
const client = useGrainAnalytics();
|
|
11
|
+
// Create stable track function that won't change across renders
|
|
12
|
+
const track = React.useCallback(async (eventName, properties, options) => {
|
|
13
|
+
await client.track(eventName, properties, options);
|
|
14
|
+
}, [client]);
|
|
15
|
+
return track;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=useTrack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTrack.js","sourceRoot":"","sources":["../../../../src/react/hooks/useTrack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,UAAU,QAAQ;IACtB,MAAM,MAAM,GAAG,iBAAiB,EAAE,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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
// Provider
|
|
31
|
+
export { GrainProvider } from './GrainProvider';
|
|
32
|
+
// Hooks
|
|
33
|
+
export { useGrainAnalytics } from './hooks/useGrainAnalytics';
|
|
34
|
+
export { useConfig } from './hooks/useConfig';
|
|
35
|
+
export { useAllConfigs } from './hooks/useAllConfigs';
|
|
36
|
+
export { useTrack } from './hooks/useTrack';
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,WAAW;AACX,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,QAAQ;AACR,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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React-specific types for Grain Analytics
|
|
3
|
+
*/
|
|
4
|
+
import type { GrainAnalytics, GrainConfig, SendEventOptions } from '../index';
|
|
5
|
+
export interface GrainProviderProps {
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
client?: GrainAnalytics;
|
|
8
|
+
config?: GrainConfig;
|
|
9
|
+
}
|
|
10
|
+
export interface UseConfigOptions {
|
|
11
|
+
forceRefresh?: boolean;
|
|
12
|
+
immediateKeys?: string[];
|
|
13
|
+
properties?: Record<string, string>;
|
|
14
|
+
}
|
|
15
|
+
export interface UseConfigResult {
|
|
16
|
+
value: string | undefined;
|
|
17
|
+
isRefreshing: boolean;
|
|
18
|
+
error: Error | null;
|
|
19
|
+
refresh: () => Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export interface UseAllConfigsOptions {
|
|
22
|
+
forceRefresh?: boolean;
|
|
23
|
+
immediateKeys?: string[];
|
|
24
|
+
properties?: Record<string, string>;
|
|
25
|
+
}
|
|
26
|
+
export interface UseAllConfigsResult {
|
|
27
|
+
configs: Record<string, string>;
|
|
28
|
+
isRefreshing: boolean;
|
|
29
|
+
error: Error | null;
|
|
30
|
+
refresh: () => Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export type TrackFunction = (eventName: string, properties?: Record<string, unknown>, options?: SendEventOptions) => Promise<void>;
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/react/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,CAAC,EAAE,gBAAgB,KACvB,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/react/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/index.global.dev.js
CHANGED