@goatech/react 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 GoaTech AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,184 @@
1
+ # @goatech/react
2
+
3
+ React bindings for the [GoaTech](https://goatech.ai) release-intelligence platform. A typed `<GoaTechProvider>`, hooks for flags/experiments/events, and a `<TestProvider>` for tests.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @goatech/react @goatech/sdk-js
9
+ ```
10
+
11
+ ## Quickstart
12
+
13
+ ```tsx
14
+ // app/layout.tsx (Next.js) — any React root works
15
+ "use client";
16
+
17
+ import { GoaTech } from "@goatech/sdk-js";
18
+ import { GoaTechProvider } from "@goatech/react";
19
+
20
+ const gt = GoaTech.create({
21
+ apiKey: process.env.NEXT_PUBLIC_GOATECH_PUB_KEY!,
22
+ });
23
+
24
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
25
+ return (
26
+ <html lang="en">
27
+ <body>
28
+ <GoaTechProvider client={gt}>{children}</GoaTechProvider>
29
+ </body>
30
+ </html>
31
+ );
32
+ }
33
+ ```
34
+
35
+ ```tsx
36
+ // Use flags anywhere in the tree
37
+ "use client";
38
+
39
+ import { useFlag, useExperiment, useTrack } from "@goatech/react";
40
+
41
+ export function CheckoutButton() {
42
+ const track = useTrack();
43
+ const newCheckout = useFlag("new_checkout_flow", false);
44
+ const { variant } = useExperiment("checkout_copy");
45
+
46
+ return (
47
+ <button
48
+ onClick={() => track("checkout_started", { variant })}
49
+ className={newCheckout ? "new" : "classic"}
50
+ >
51
+ {variant === "bold" ? "Get It Now" : "Buy"}
52
+ </button>
53
+ );
54
+ }
55
+ ```
56
+
57
+ ## API
58
+
59
+ ### `<GoaTechProvider client={gt}>`
60
+
61
+ Pass a `GoaTech` instance (from `@goatech/sdk-js`) into your tree. Tests can substitute `<TestProvider>` from `@goatech/react/test`.
62
+
63
+ ### `useFlag<T>(flagKey, defaultValue?)`
64
+
65
+ Server-evaluated flag value. Fires `$flag_exposure` once per session.
66
+
67
+ ### `useExperiment(experimentKey)`
68
+
69
+ Returns `{ variant, payload }`. Assignment is sticky per device.
70
+
71
+ ### `useTrack()`
72
+
73
+ Returns a stable `track(eventName, properties?)` function.
74
+
75
+ ### `useGoaTech()`
76
+
77
+ Returns the underlying `GoaTech` client. Use it for identity controls on login/logout:
78
+
79
+ ```tsx
80
+ const gt = useGoaTech();
81
+ gt.identify("user_abc123", { email: "jane@example.com" }); // after login
82
+ gt.reset(); // after logout
83
+ ```
84
+
85
+ ## Components
86
+
87
+ ### `<Feature flagKey="..." fallback={...}>`
88
+
89
+ Render-prop wrapper around `useFlag` for binary or value-matched gates.
90
+
91
+ ```tsx
92
+ import { Feature } from "@goatech/react";
93
+
94
+ <Feature flagKey="new_checkout_flow" fallback={<LegacyCheckout />}>
95
+ <NewCheckout />
96
+ </Feature>;
97
+
98
+ // Match a specific value when the flag is non-boolean:
99
+ <Feature flagKey="cta_variant" match="bold" fallback={<DefaultCTA />}>
100
+ <BoldCTA />
101
+ </Feature>;
102
+ ```
103
+
104
+ ### `<Experiment experimentKey="..." variants={{ ... }}>`
105
+
106
+ Render the bucketed variant for an experiment. Assignment is sticky per device; `$exposure` fires automatically on first render.
107
+
108
+ ```tsx
109
+ import { Experiment } from "@goatech/react";
110
+
111
+ <Experiment
112
+ experimentKey="checkout_button_copy"
113
+ variants={{
114
+ control: <button>Buy</button>,
115
+ bold: <button>Get It Now</button>,
116
+ }}
117
+ fallback={<button>Buy</button>}
118
+ />;
119
+
120
+ // Render-prop form for full access to the result + payload:
121
+ <Experiment experimentKey="hero_h1">
122
+ {({ variant, payload }) => <h1>{(payload as { headline: string }).headline}</h1>}
123
+ </Experiment>;
124
+ ```
125
+
126
+ ### `<PageViewTracker pathname={...} searchParams={...} />`
127
+
128
+ Mount inside a Next.js layout to fire `$pageview` whenever pathname or search params change. Pair with `usePathname()` + `useSearchParams()`.
129
+
130
+ ```tsx
131
+ "use client";
132
+ import { PageViewTracker } from "@goatech/react";
133
+ import { usePathname, useSearchParams } from "next/navigation";
134
+
135
+ export function Analytics() {
136
+ const pathname = usePathname();
137
+ const searchParams = useSearchParams();
138
+ return <PageViewTracker pathname={pathname} searchParams={searchParams} />;
139
+ }
140
+ ```
141
+
142
+ ### `<ErrorBoundary fallback={...}>`
143
+
144
+ React error boundary that forwards render-time crashes to GoaTech as `$error` events with `component_stack`. Pair with the SDK's pre-React boot-error capture for full coverage.
145
+
146
+ ```tsx
147
+ import { ErrorBoundary } from "@goatech/react";
148
+
149
+ <ErrorBoundary fallback={<FatalErrorScreen />}>
150
+ <App />
151
+ </ErrorBoundary>;
152
+
153
+ // Render-prop form gives you the error + a reset callback:
154
+ <ErrorBoundary
155
+ fallback={({ error, reset }) => (
156
+ <div>
157
+ <p>{error.message}</p>
158
+ <button onClick={reset}>Try again</button>
159
+ </div>
160
+ )}
161
+ >
162
+ <App />
163
+ </ErrorBoundary>;
164
+ ```
165
+
166
+ ## Testing
167
+
168
+ ```tsx
169
+ import { TestProvider } from "@goatech/react/test";
170
+
171
+ render(
172
+ <TestProvider flags={{ new_checkout_flow: true }}>
173
+ <CheckoutButton />
174
+ </TestProvider>,
175
+ );
176
+ ```
177
+
178
+ ## Next.js
179
+
180
+ Works in both App Router and Pages Router. The provider is client-only (`"use client"`) — put it inside a client component boundary.
181
+
182
+ ## License
183
+
184
+ MIT © GoaTech
@@ -0,0 +1,2 @@
1
+ import {DiagnosticBus}from'@goatech/sdk-js';import {createContext}from'react';var r=new DiagnosticBus(0),e={track:()=>{},identify:()=>{},reset:()=>{},flag:(i,t=false)=>t,experiment:()=>({variant:"control"}),overrideFlag:()=>{},clearOverrides:()=>{},getOverrides:()=>({}),flush:()=>Promise.resolve(),recordPageView:()=>{},status:()=>({initialized:false,online:false,queueDepth:0,offlineQueueDepth:0,lastFlushAt:null,deviceId:null,userId:null,flagCount:0,experimentCount:0,sdkVersion:"noop"}),destroy:()=>{},diagnostics:()=>r,getRecentDiagnostics:()=>[]};var p=createContext(e);export{e as a,p as b};//# sourceMappingURL=chunk-OKZIRDLB.mjs.map
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9ub29wLWNsaWVudC50cyIsIi4uL3NyYy9jb250ZXh0LnRzIl0sIm5hbWVzIjpbIm5vb3BCdXMiLCJEaWFnbm9zdGljQnVzIiwibm9vcENsaWVudCIsIl9rZXkiLCJkZWZhdWx0VmFsdWUiLCJHb2FUZWNoQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiXSwibWFwcGluZ3MiOiI4RUFJQSxJQUFNQSxFQUFVLElBQUlDLGFBQUFBLENBQWMsQ0FBQyxDQUFBLENBUXRCQyxDQUFBQSxDQUF1QixDQUNsQyxLQUFBLENBQU8sSUFBTSxDQUFDLENBQUEsQ0FDZCxRQUFBLENBQVUsSUFBTSxDQUFDLENBQUEsQ0FDakIsS0FBQSxDQUFPLElBQU0sQ0FBQyxDQUFBLENBQ2QsS0FBTSxDQUFDQyxDQUFBQSxDQUFjQyxFQUEwQixLQUFBLEdBQVVBLENBQUFBLENBQ3pELFdBQVksS0FBeUIsQ0FBRSxPQUFBLENBQVMsU0FBVSxDQUFBLENBQUEsQ0FDMUQsWUFBQSxDQUFjLElBQU0sQ0FBQyxDQUFBLENBQ3JCLGVBQWdCLElBQU0sQ0FBQyxFQUN2QixZQUFBLENBQWMsS0FBTyxFQUFDLENBQUEsQ0FDdEIsS0FBQSxDQUFPLElBQU0sUUFBUSxPQUFBLEVBQVEsQ0FDN0IsZUFBZ0IsSUFBTSxDQUFDLEVBQ3ZCLE1BQUEsQ0FBUSxLQUFrQixDQUN4QixXQUFBLENBQWEsS0FBQSxDQUNiLE1BQUEsQ0FBUSxNQUNSLFVBQUEsQ0FBWSxDQUFBLENBQ1osa0JBQW1CLENBQUEsQ0FDbkIsV0FBQSxDQUFhLEtBQ2IsUUFBQSxDQUFVLElBQUEsQ0FDVixNQUFBLENBQVEsSUFBQSxDQUNSLFNBQUEsQ0FBVyxDQUFBLENBQ1gsZ0JBQWlCLENBQUEsQ0FDakIsVUFBQSxDQUFZLE1BQ2QsQ0FBQSxDQUFBLENBQ0EsT0FBQSxDQUFTLElBQU0sQ0FBQyxDQUFBLENBQ2hCLFdBQUEsQ0FBYSxJQUFNSixDQUFBQSxDQUNuQixvQkFBQSxDQUFzQixJQUFNLEVBQzlCLEVDOUJPLElBQU1LLENBQUFBLENBQWlCQyxhQUFBQSxDQUF3QkosQ0FBVSIsImZpbGUiOiJjaHVuay1PS1pJUkRMQi5tanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IElHb2FUZWNoIH0gZnJvbSBcIkBnb2F0ZWNoL3Nkay1qc1wiO1xuaW1wb3J0IHR5cGUgeyBGbGFnVmFsdWUsIEV4cGVyaW1lbnRSZXN1bHQsIFNES1N0YXR1cyB9IGZyb20gXCJAZ29hdGVjaC9zZGstanNcIjtcbmltcG9ydCB7IERpYWdub3N0aWNCdXMgfSBmcm9tIFwiQGdvYXRlY2gvc2RrLWpzXCI7XG5cbmNvbnN0IG5vb3BCdXMgPSBuZXcgRGlhZ25vc3RpY0J1cygwKTtcblxuLyoqXG4gKiBTaWxlbnQgbm8tb3AgY2xpZW50LiBVc2VkIHdoZW46XG4gKiAtIFNESyBpcyBub3QgeWV0IGluaXRpYWxpemVkIChTU1IsIGluaXRpYWwgcmVuZGVyKVxuICogLSBBUEkga2V5IGlzIG5vdCBjb25maWd1cmVkIChsb2NhbCBkZXYpXG4gKiAtIFRlc3RzIHRoYXQgZG9uJ3QgY2FyZSBhYm91dCBhbmFseXRpY3NcbiAqL1xuZXhwb3J0IGNvbnN0IG5vb3BDbGllbnQ6IElHb2FUZWNoID0ge1xuICB0cmFjazogKCkgPT4ge30sXG4gIGlkZW50aWZ5OiAoKSA9PiB7fSxcbiAgcmVzZXQ6ICgpID0+IHt9LFxuICBmbGFnOiAoX2tleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IEZsYWdWYWx1ZSA9IGZhbHNlKSA9PiBkZWZhdWx0VmFsdWUsXG4gIGV4cGVyaW1lbnQ6ICgpOiBFeHBlcmltZW50UmVzdWx0ID0+ICh7IHZhcmlhbnQ6IFwiY29udHJvbFwiIH0pLFxuICBvdmVycmlkZUZsYWc6ICgpID0+IHt9LFxuICBjbGVhck92ZXJyaWRlczogKCkgPT4ge30sXG4gIGdldE92ZXJyaWRlczogKCkgPT4gKHt9KSxcbiAgZmx1c2g6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLFxuICByZWNvcmRQYWdlVmlldzogKCkgPT4ge30sXG4gIHN0YXR1czogKCk6IFNES1N0YXR1cyA9PiAoe1xuICAgIGluaXRpYWxpemVkOiBmYWxzZSxcbiAgICBvbmxpbmU6IGZhbHNlLFxuICAgIHF1ZXVlRGVwdGg6IDAsXG4gICAgb2ZmbGluZVF1ZXVlRGVwdGg6IDAsXG4gICAgbGFzdEZsdXNoQXQ6IG51bGwsXG4gICAgZGV2aWNlSWQ6IG51bGwsXG4gICAgdXNlcklkOiBudWxsLFxuICAgIGZsYWdDb3VudDogMCxcbiAgICBleHBlcmltZW50Q291bnQ6IDAsXG4gICAgc2RrVmVyc2lvbjogXCJub29wXCIsXG4gIH0pLFxuICBkZXN0cm95OiAoKSA9PiB7fSxcbiAgZGlhZ25vc3RpY3M6ICgpID0+IG5vb3BCdXMsXG4gIGdldFJlY2VudERpYWdub3N0aWNzOiAoKSA9PiBbXSxcbn07XG4iLCJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IElHb2FUZWNoIH0gZnJvbSBcIkBnb2F0ZWNoL3Nkay1qc1wiO1xuaW1wb3J0IHsgbm9vcENsaWVudCB9IGZyb20gXCIuL25vb3AtY2xpZW50LmpzXCI7XG5cbi8qKlxuICogSW50ZXJuYWwgY29udGV4dCDigJQgY29uc3VtZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VHb2FUZWNoKClgIGhvb2suXG4gKiBFeHBvcnRlZCBvbmx5IGZvciBUZXN0UHJvdmlkZXIgdG8gaW5qZWN0IGEgbW9jayBjbGllbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBHb2FUZWNoQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8SUdvYVRlY2g+KG5vb3BDbGllbnQpO1xuIl19
@@ -0,0 +1,196 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as react from 'react';
3
+ import { ReactNode, Component, ErrorInfo } from 'react';
4
+ import { GoaTechConfig, IGoaTech, FlagValue, ExperimentResult } from '@goatech/sdk-js';
5
+ export { ExperimentResult, FlagValue, GoaTechConfig, IGoaTech } from '@goatech/sdk-js';
6
+ export { n as noopClient } from './noop-client-CIawzLT5.mjs';
7
+
8
+ interface GoaTechProviderProps {
9
+ /** SDK configuration. Provider calls GoaTech.create() internally. */
10
+ config: GoaTechConfig;
11
+ /** Current user for automatic identity sync. Pass null when logged out. */
12
+ user?: {
13
+ id: string;
14
+ traits?: Record<string, unknown>;
15
+ } | null;
16
+ children: ReactNode;
17
+ }
18
+ declare function GoaTechProvider({ config, user, children }: GoaTechProviderProps): react_jsx_runtime.JSX.Element;
19
+
20
+ /**
21
+ * Access the underlying `GoaTech` client from context. Use this for
22
+ * identity controls (`identify`, `reset`) — for flag / experiment /
23
+ * track calls prefer the dedicated hooks (`useFlag`, `useExperiment`,
24
+ * `useTrack`) which give you stable references and trigger re-renders
25
+ * on config refresh.
26
+ *
27
+ * @example
28
+ * function LoginForm() {
29
+ * const gt = useGoaTech();
30
+ * async function onLogin(user) {
31
+ * await api.login(user);
32
+ * gt.identify(user.id, { email: user.email });
33
+ * }
34
+ * // …
35
+ * }
36
+ *
37
+ * @example
38
+ * function LogoutButton() {
39
+ * const gt = useGoaTech();
40
+ * return <button onClick={() => gt.reset()}>Log out</button>;
41
+ * }
42
+ */
43
+ declare function useGoaTech(): IGoaTech;
44
+
45
+ /**
46
+ * Returns a stable `track(eventName, properties?)` function bound to
47
+ * the current GoaTech client. The reference is stable across renders,
48
+ * so it's safe to pass into `useEffect` deps.
49
+ *
50
+ * @example
51
+ * function CheckoutButton({ courseId }: { courseId: string }) {
52
+ * const track = useTrack();
53
+ * return (
54
+ * <button onClick={() => track("checkout_started", { course_id: courseId })}>
55
+ * Buy
56
+ * </button>
57
+ * );
58
+ * }
59
+ */
60
+ declare function useTrack(): (eventName: string, properties?: Record<string, unknown>) => void;
61
+
62
+ /**
63
+ * Evaluate a feature flag. Returns the resolved value (server-side
64
+ * targeting + rollout math) or `defaultValue` while the SDK config is
65
+ * still loading. Fires `$flag_exposure` once per session per flag.
66
+ *
67
+ * @param flagKey - Flag key declared in the GoaTech dashboard.
68
+ * @param defaultValue - Returned when the SDK has no answer yet.
69
+ * Defaults to `false` to match the typical boolean-flag use case.
70
+ *
71
+ * @example
72
+ * function CheckoutButton() {
73
+ * const newFlow = useFlag("new_checkout_flow", false);
74
+ * return newFlow ? <NewCheckout /> : <LegacyCheckout />;
75
+ * }
76
+ *
77
+ * @example
78
+ * // Multi-value flag — pass a matching default
79
+ * const variant = useFlag<"control" | "bold">("cta_copy_v1", "control");
80
+ */
81
+ declare function useFlag(flagKey: string, defaultValue?: FlagValue): FlagValue;
82
+
83
+ /**
84
+ * Get the bucketed variant + payload for an experiment. Assignment is
85
+ * sticky per device. Fires `$exposure` once per session per experiment
86
+ * the first time it resolves to a non-control variant.
87
+ *
88
+ * @param experimentKey - Experiment key declared in the GoaTech dashboard.
89
+ * @returns `{ variant: string, payload: Record<string, unknown> }`.
90
+ * `variant` falls back to `"control"` until the SDK config loads.
91
+ *
92
+ * @example
93
+ * function HeroH1() {
94
+ * const { variant, payload } = useExperiment("hero_h1_copy_v1");
95
+ * if (variant === "control") return <h1>Ship faster.</h1>;
96
+ * return <h1>{(payload as { headline: string }).headline}</h1>;
97
+ * }
98
+ */
99
+ declare function useExperiment(experimentKey: string): ExperimentResult;
100
+
101
+ interface FeatureProps {
102
+ /** The flag key to evaluate */
103
+ flagKey: string;
104
+ /** Render when flag is truthy (or matches `match` value) */
105
+ children: ReactNode;
106
+ /** Optional fallback when flag is falsy */
107
+ fallback?: ReactNode;
108
+ /** Optional: match a specific value instead of truthy check */
109
+ match?: FlagValue;
110
+ }
111
+ declare function Feature({ flagKey, children, fallback, match }: FeatureProps): react_jsx_runtime.JSX.Element;
112
+
113
+ interface ExperimentProps {
114
+ /** The experiment key */
115
+ experimentKey: string;
116
+ /** Map variant key -> ReactNode (simple mode). */
117
+ variants?: Record<string, ReactNode>;
118
+ /** Render prop alternative — receives { variant, payload }. */
119
+ children?: (result: ExperimentResult) => ReactNode;
120
+ /** Fallback if no variant matches (defaults to "control" variant or null) */
121
+ fallback?: ReactNode;
122
+ }
123
+ declare function Experiment({ experimentKey, variants, children, fallback }: ExperimentProps): react_jsx_runtime.JSX.Element;
124
+
125
+ interface PageViewTrackerProps {
126
+ /** Current pathname — pass from your router (e.g., Next.js usePathname()). */
127
+ pathname: string;
128
+ /** Current search params string (optional). */
129
+ searchParams?: string;
130
+ }
131
+ /**
132
+ * Track page views on route change.
133
+ *
134
+ * Emits two events per route change:
135
+ *
136
+ * - `$page_leave` for the prior route, with `time_on_page_ms`,
137
+ * `max_scroll_pct`, `tab_hidden_count`, etc. (emitted by
138
+ * `client.recordPageView()` via the SDK's `LifecycleManager`).
139
+ * - `$page_view` for the new route.
140
+ *
141
+ * The order matters — leave before view — so the leave event carries
142
+ * the previous path, and the view marks the start of the new page's
143
+ * dwell window. Both events end up in `events_raw` so funnels can
144
+ * filter at either grain.
145
+ *
146
+ * Unlike the web-app version, this component does NOT import
147
+ * `next/navigation` directly — the caller provides pathname and
148
+ * searchParams so it works with any router (Next.js, React Router,
149
+ * TanStack Router, etc.).
150
+ */
151
+ declare function PageViewTracker({ pathname, searchParams }: PageViewTrackerProps): null;
152
+
153
+ interface ErrorBoundaryProps {
154
+ /**
155
+ * Rendered when a descendant render throws. Receives the error and a
156
+ * `reset()` function to clear the boundary state. If omitted, children
157
+ * are hidden after a crash (null fallback).
158
+ */
159
+ fallback?: ReactNode | ((state: {
160
+ error: Error;
161
+ reset: () => void;
162
+ }) => ReactNode);
163
+ /**
164
+ * Called with the captured error AFTER it has been forwarded to GoaTech.
165
+ * Useful for surfacing a toast or forwarding to another telemetry system.
166
+ */
167
+ onError?: (error: Error, info: ErrorInfo) => void;
168
+ children: ReactNode;
169
+ }
170
+ interface State {
171
+ error: Error | null;
172
+ }
173
+ /**
174
+ * React ErrorBoundary that forwards render-time crashes to GoaTech as
175
+ * `$error` events. Use it to wrap any sub-tree whose crashes would
176
+ * otherwise produce a blank page (or the Next.js root error screen).
177
+ *
178
+ * <GoaTechProvider ...>
179
+ * <ErrorBoundary fallback={<FatalError />}>
180
+ * <App />
181
+ * </ErrorBoundary>
182
+ * </GoaTechProvider>
183
+ *
184
+ * Reaches the GoaTech client via context so no explicit wiring is needed.
185
+ */
186
+ declare class ErrorBoundary extends Component<ErrorBoundaryProps, State> {
187
+ static contextType: react.Context<IGoaTech>;
188
+ context: IGoaTech;
189
+ state: State;
190
+ static getDerivedStateFromError(error: Error): State;
191
+ componentDidCatch(error: Error, info: ErrorInfo): void;
192
+ private readonly reset;
193
+ render(): ReactNode;
194
+ }
195
+
196
+ export { ErrorBoundary, type ErrorBoundaryProps, Experiment, type ExperimentProps, Feature, type FeatureProps, GoaTechProvider, type GoaTechProviderProps, PageViewTracker, type PageViewTrackerProps, useExperiment, useFlag, useGoaTech, useTrack };
@@ -0,0 +1,196 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as react from 'react';
3
+ import { ReactNode, Component, ErrorInfo } from 'react';
4
+ import { GoaTechConfig, IGoaTech, FlagValue, ExperimentResult } from '@goatech/sdk-js';
5
+ export { ExperimentResult, FlagValue, GoaTechConfig, IGoaTech } from '@goatech/sdk-js';
6
+ export { n as noopClient } from './noop-client-CIawzLT5.js';
7
+
8
+ interface GoaTechProviderProps {
9
+ /** SDK configuration. Provider calls GoaTech.create() internally. */
10
+ config: GoaTechConfig;
11
+ /** Current user for automatic identity sync. Pass null when logged out. */
12
+ user?: {
13
+ id: string;
14
+ traits?: Record<string, unknown>;
15
+ } | null;
16
+ children: ReactNode;
17
+ }
18
+ declare function GoaTechProvider({ config, user, children }: GoaTechProviderProps): react_jsx_runtime.JSX.Element;
19
+
20
+ /**
21
+ * Access the underlying `GoaTech` client from context. Use this for
22
+ * identity controls (`identify`, `reset`) — for flag / experiment /
23
+ * track calls prefer the dedicated hooks (`useFlag`, `useExperiment`,
24
+ * `useTrack`) which give you stable references and trigger re-renders
25
+ * on config refresh.
26
+ *
27
+ * @example
28
+ * function LoginForm() {
29
+ * const gt = useGoaTech();
30
+ * async function onLogin(user) {
31
+ * await api.login(user);
32
+ * gt.identify(user.id, { email: user.email });
33
+ * }
34
+ * // …
35
+ * }
36
+ *
37
+ * @example
38
+ * function LogoutButton() {
39
+ * const gt = useGoaTech();
40
+ * return <button onClick={() => gt.reset()}>Log out</button>;
41
+ * }
42
+ */
43
+ declare function useGoaTech(): IGoaTech;
44
+
45
+ /**
46
+ * Returns a stable `track(eventName, properties?)` function bound to
47
+ * the current GoaTech client. The reference is stable across renders,
48
+ * so it's safe to pass into `useEffect` deps.
49
+ *
50
+ * @example
51
+ * function CheckoutButton({ courseId }: { courseId: string }) {
52
+ * const track = useTrack();
53
+ * return (
54
+ * <button onClick={() => track("checkout_started", { course_id: courseId })}>
55
+ * Buy
56
+ * </button>
57
+ * );
58
+ * }
59
+ */
60
+ declare function useTrack(): (eventName: string, properties?: Record<string, unknown>) => void;
61
+
62
+ /**
63
+ * Evaluate a feature flag. Returns the resolved value (server-side
64
+ * targeting + rollout math) or `defaultValue` while the SDK config is
65
+ * still loading. Fires `$flag_exposure` once per session per flag.
66
+ *
67
+ * @param flagKey - Flag key declared in the GoaTech dashboard.
68
+ * @param defaultValue - Returned when the SDK has no answer yet.
69
+ * Defaults to `false` to match the typical boolean-flag use case.
70
+ *
71
+ * @example
72
+ * function CheckoutButton() {
73
+ * const newFlow = useFlag("new_checkout_flow", false);
74
+ * return newFlow ? <NewCheckout /> : <LegacyCheckout />;
75
+ * }
76
+ *
77
+ * @example
78
+ * // Multi-value flag — pass a matching default
79
+ * const variant = useFlag<"control" | "bold">("cta_copy_v1", "control");
80
+ */
81
+ declare function useFlag(flagKey: string, defaultValue?: FlagValue): FlagValue;
82
+
83
+ /**
84
+ * Get the bucketed variant + payload for an experiment. Assignment is
85
+ * sticky per device. Fires `$exposure` once per session per experiment
86
+ * the first time it resolves to a non-control variant.
87
+ *
88
+ * @param experimentKey - Experiment key declared in the GoaTech dashboard.
89
+ * @returns `{ variant: string, payload: Record<string, unknown> }`.
90
+ * `variant` falls back to `"control"` until the SDK config loads.
91
+ *
92
+ * @example
93
+ * function HeroH1() {
94
+ * const { variant, payload } = useExperiment("hero_h1_copy_v1");
95
+ * if (variant === "control") return <h1>Ship faster.</h1>;
96
+ * return <h1>{(payload as { headline: string }).headline}</h1>;
97
+ * }
98
+ */
99
+ declare function useExperiment(experimentKey: string): ExperimentResult;
100
+
101
+ interface FeatureProps {
102
+ /** The flag key to evaluate */
103
+ flagKey: string;
104
+ /** Render when flag is truthy (or matches `match` value) */
105
+ children: ReactNode;
106
+ /** Optional fallback when flag is falsy */
107
+ fallback?: ReactNode;
108
+ /** Optional: match a specific value instead of truthy check */
109
+ match?: FlagValue;
110
+ }
111
+ declare function Feature({ flagKey, children, fallback, match }: FeatureProps): react_jsx_runtime.JSX.Element;
112
+
113
+ interface ExperimentProps {
114
+ /** The experiment key */
115
+ experimentKey: string;
116
+ /** Map variant key -> ReactNode (simple mode). */
117
+ variants?: Record<string, ReactNode>;
118
+ /** Render prop alternative — receives { variant, payload }. */
119
+ children?: (result: ExperimentResult) => ReactNode;
120
+ /** Fallback if no variant matches (defaults to "control" variant or null) */
121
+ fallback?: ReactNode;
122
+ }
123
+ declare function Experiment({ experimentKey, variants, children, fallback }: ExperimentProps): react_jsx_runtime.JSX.Element;
124
+
125
+ interface PageViewTrackerProps {
126
+ /** Current pathname — pass from your router (e.g., Next.js usePathname()). */
127
+ pathname: string;
128
+ /** Current search params string (optional). */
129
+ searchParams?: string;
130
+ }
131
+ /**
132
+ * Track page views on route change.
133
+ *
134
+ * Emits two events per route change:
135
+ *
136
+ * - `$page_leave` for the prior route, with `time_on_page_ms`,
137
+ * `max_scroll_pct`, `tab_hidden_count`, etc. (emitted by
138
+ * `client.recordPageView()` via the SDK's `LifecycleManager`).
139
+ * - `$page_view` for the new route.
140
+ *
141
+ * The order matters — leave before view — so the leave event carries
142
+ * the previous path, and the view marks the start of the new page's
143
+ * dwell window. Both events end up in `events_raw` so funnels can
144
+ * filter at either grain.
145
+ *
146
+ * Unlike the web-app version, this component does NOT import
147
+ * `next/navigation` directly — the caller provides pathname and
148
+ * searchParams so it works with any router (Next.js, React Router,
149
+ * TanStack Router, etc.).
150
+ */
151
+ declare function PageViewTracker({ pathname, searchParams }: PageViewTrackerProps): null;
152
+
153
+ interface ErrorBoundaryProps {
154
+ /**
155
+ * Rendered when a descendant render throws. Receives the error and a
156
+ * `reset()` function to clear the boundary state. If omitted, children
157
+ * are hidden after a crash (null fallback).
158
+ */
159
+ fallback?: ReactNode | ((state: {
160
+ error: Error;
161
+ reset: () => void;
162
+ }) => ReactNode);
163
+ /**
164
+ * Called with the captured error AFTER it has been forwarded to GoaTech.
165
+ * Useful for surfacing a toast or forwarding to another telemetry system.
166
+ */
167
+ onError?: (error: Error, info: ErrorInfo) => void;
168
+ children: ReactNode;
169
+ }
170
+ interface State {
171
+ error: Error | null;
172
+ }
173
+ /**
174
+ * React ErrorBoundary that forwards render-time crashes to GoaTech as
175
+ * `$error` events. Use it to wrap any sub-tree whose crashes would
176
+ * otherwise produce a blank page (or the Next.js root error screen).
177
+ *
178
+ * <GoaTechProvider ...>
179
+ * <ErrorBoundary fallback={<FatalError />}>
180
+ * <App />
181
+ * </ErrorBoundary>
182
+ * </GoaTechProvider>
183
+ *
184
+ * Reaches the GoaTech client via context so no explicit wiring is needed.
185
+ */
186
+ declare class ErrorBoundary extends Component<ErrorBoundaryProps, State> {
187
+ static contextType: react.Context<IGoaTech>;
188
+ context: IGoaTech;
189
+ state: State;
190
+ static getDerivedStateFromError(error: Error): State;
191
+ componentDidCatch(error: Error, info: ErrorInfo): void;
192
+ private readonly reset;
193
+ render(): ReactNode;
194
+ }
195
+
196
+ export { ErrorBoundary, type ErrorBoundaryProps, Experiment, type ExperimentProps, Feature, type FeatureProps, GoaTechProvider, type GoaTechProviderProps, PageViewTracker, type PageViewTrackerProps, useExperiment, useFlag, useGoaTech, useTrack };
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),sdkJs=require('@goatech/sdk-js'),jsxRuntime=require('react/jsx-runtime');var G=new sdkJs.DiagnosticBus(0),l={track:()=>{},identify:()=>{},reset:()=>{},flag:(o,e=false)=>e,experiment:()=>({variant:"control"}),overrideFlag:()=>{},clearOverrides:()=>{},getOverrides:()=>({}),flush:()=>Promise.resolve(),recordPageView:()=>{},status:()=>({initialized:false,online:false,queueDepth:0,offlineQueueDepth:0,lastFlushAt:null,deviceId:null,userId:null,flagCount:0,experimentCount:0,sdkVersion:"noop"}),destroy:()=>{},diagnostics:()=>G,getRecentDiagnostics:()=>[]};var p=react.createContext(l);function v({config:o,user:e,children:r}){let t=react.useRef(null),[n,a]=react.useState(l),u=react.useRef(null);react.useEffect(()=>{if(!t.current&&!(typeof window>"u"))try{let i=sdkJs.GoaTech.create(o);return t.current=i,a(i),()=>{i.destroy(),t.current=null;}}catch(i){typeof window<"u"&&console.warn("[GoaTech] SDK init failed \u2014 events, flags, and experiments are disabled.",i instanceof Error?i.message:i);}},[]);let s=e?.id??null;return react.useEffect(()=>{let i=t.current;i&&(s&&u.current!==s?(i.identify(s,e?.traits),u.current=s):!s&&u.current!==null&&(i.reset(),u.current=null));},[s,e?.traits]),jsxRuntime.jsx(p.Provider,{value:n,children:r})}function c(){return react.useContext(p)}function m(){let o=c();return react.useCallback((e,r)=>{o.track(e,r);},[o])}function d(o,e=false){return c().flag(o,e)}function h(o){return c().experiment(o)}function w({flagKey:o,children:e,fallback:r=null,match:t}){let n=d(o,false);return jsxRuntime.jsx(jsxRuntime.Fragment,{children:(t!==void 0?n===t:!!n)?e:r})}function S({experimentKey:o,variants:e,children:r,fallback:t}){let n=h(o);return r?jsxRuntime.jsx(jsxRuntime.Fragment,{children:r(n)}):e&&n.variant in e?jsxRuntime.jsx(jsxRuntime.Fragment,{children:e[n.variant]}):jsxRuntime.jsx(jsxRuntime.Fragment,{children:t??e?.control??null})}function b({pathname:o,searchParams:e}){let r=c(),t=m(),n=react.useRef("");return react.useEffect(()=>{let a=e?`${o}?${e}`:o;a!==n.current&&(n.current=a,r.recordPageView(a),t("$page_view",{path:o,url:a,referrer:typeof document<"u"&&document.referrer||null,title:typeof document<"u"&&document.title||null}));},[o,e,r,t]),null}var f=class extends react.Component{constructor(){super(...arguments);this.state={error:null};this.reset=()=>{this.setState({error:null});};}static getDerivedStateFromError(r){return {error:r}}componentDidCatch(r,t){try{this.context.track("$error",{message:r.message,stack:r.stack?r.stack.slice(0,4096):null,component_stack:t.componentStack?t.componentStack.slice(0,4096):null,type:"react_boundary"});}catch{}try{this.props.onError?.(r,t);}catch{}}render(){let{error:r}=this.state;if(!r)return this.props.children;let{fallback:t}=this.props;return typeof t=="function"?t({error:r,reset:this.reset}):t??null}};f.contextType=p;exports.ErrorBoundary=f;exports.Experiment=S;exports.Feature=w;exports.GoaTechProvider=v;exports.PageViewTracker=b;exports.noopClient=l;exports.useExperiment=h;exports.useFlag=d;exports.useGoaTech=c;exports.useTrack=m;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9ub29wLWNsaWVudC50cyIsIi4uL3NyYy9jb250ZXh0LnRzIiwiLi4vc3JjL3Byb3ZpZGVyLnRzeCIsIi4uL3NyYy9ob29rcy91c2UtZ29hdGVjaC50cyIsIi4uL3NyYy9ob29rcy91c2UtdHJhY2sudHMiLCIuLi9zcmMvaG9va3MvdXNlLWZsYWcudHMiLCIuLi9zcmMvaG9va3MvdXNlLWV4cGVyaW1lbnQudHMiLCIuLi9zcmMvY29tcG9uZW50cy9mZWF0dXJlLnRzeCIsIi4uL3NyYy9jb21wb25lbnRzL2V4cGVyaW1lbnQudHN4IiwiLi4vc3JjL2NvbXBvbmVudHMvcGFnZS12aWV3LXRyYWNrZXIudHN4IiwiLi4vc3JjL2NvbXBvbmVudHMvZXJyb3ItYm91bmRhcnkudHN4Il0sIm5hbWVzIjpbIm5vb3BCdXMiLCJEaWFnbm9zdGljQnVzIiwibm9vcENsaWVudCIsIl9rZXkiLCJkZWZhdWx0VmFsdWUiLCJHb2FUZWNoQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJHb2FUZWNoUHJvdmlkZXIiLCJjb25maWciLCJ1c2VyIiwiY2hpbGRyZW4iLCJjbGllbnRSZWYiLCJ1c2VSZWYiLCJjbGllbnQiLCJzZXRDbGllbnQiLCJ1c2VTdGF0ZSIsImlkZW50aWZpZWRSZWYiLCJ1c2VFZmZlY3QiLCJjIiwiR29hVGVjaCIsImVyciIsInVzZXJJZCIsImpzeCIsInVzZUdvYVRlY2giLCJ1c2VDb250ZXh0IiwidXNlVHJhY2siLCJ1c2VDYWxsYmFjayIsImV2ZW50TmFtZSIsInByb3BlcnRpZXMiLCJ1c2VGbGFnIiwiZmxhZ0tleSIsInVzZUV4cGVyaW1lbnQiLCJleHBlcmltZW50S2V5IiwiRmVhdHVyZSIsImZhbGxiYWNrIiwibWF0Y2giLCJ2YWx1ZSIsIkZyYWdtZW50IiwiRXhwZXJpbWVudCIsInZhcmlhbnRzIiwicmVzdWx0IiwiUGFnZVZpZXdUcmFja2VyIiwicGF0aG5hbWUiLCJzZWFyY2hQYXJhbXMiLCJ0cmFjayIsImxhc3RQYXRoUmVmIiwiZnVs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QUEsQ0FBTSxnQkFDUixDQUFDLEVBQ0gsTUFBUSxDQUVSLENBQ0EsR0FBSSxDQUNGLEtBQUssS0FBQSxDQUFNLE9BQUEsR0FBVUQsQ0FBQUEsQ0FBT0MsQ0FBSSxFQUNsQyxDQUFBLEtBQVEsQ0FFUixDQUNGLENBTUEsUUFBb0IsQ0FDbEIsR0FBTSxDQUFFLEtBQUEsQ0FBQUQsQ0FBTSxDQUFBLENBQUksSUFBQSxDQUFLLEtBQUEsQ0FDdkIsR0FBSSxDQUFDQSxDQUFBQSxDQUFPLE9BQU8sSUFBQSxDQUFLLEtBQUEsQ0FBTSxTQUU5QixHQUFNLENBQUUsUUFBQSxDQUFBZixDQUFTLEVBQUksSUFBQSxDQUFLLEtBQUEsQ0FDMUIsT0FBSSxPQUFPQSxHQUFhLFVBQUEsQ0FDZkEsQ0FBQUEsQ0FBUyxDQUFFLEtBQUEsQ0FBQWUsRUFBTyxLQUFBLENBQU8sSUFBQSxDQUFLLEtBQU0sQ0FBQyxFQUV2Q2YsQ0FBQUEsRUFBWSxJQUNyQixDQUNGLEVBMUNhYSxFQUNKLFdBQUEsQ0FBYzFDLENBQUFBIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJR29hVGVjaCB9IGZyb20gXCJAZ29hdGVjaC9zZGstanNcIjtcbmltcG9ydCB0eXBlIHsgRmxhZ1ZhbHVlLCBFeHBlcmltZW50UmVzdWx0LCBTREtTdGF0dXMgfSBmcm9tIFwiQGdvYXRlY2gvc2RrLWpzXCI7XG5pbXBvcnQgeyBEaWFnbm9zdGljQnVzIH0gZnJvbSBcIkBnb2F0ZWNoL3Nkay1qc1wiO1xuXG5jb25zdCBub29wQnVzID0gbmV3IERpYWdub3N0aWNCdXMoMCk7XG5cbi8qKlxuICogU2lsZW50IG5vLW9wIGNsaWVudC4gVXNlZCB3aGVuOlxuICogLSBTREsgaXMgbm90IHlldCBpbml0aWFsaXplZCAoU1NSLCBpbml0aWFsIHJlbmRlcilcbiAqIC0gQVBJIGtleSBpcyBub3QgY29uZmlndXJlZCAobG9jYWwgZGV2KVxuICogLSBUZXN0cyB0aGF0IGRvbid0IGNhcmUgYWJvdXQgYW5hbHl0aWNzXG4gKi9cbmV4cG9ydCBjb25zdCBub29wQ2xpZW50OiBJR29hVGVjaCA9IHtcbiAgdHJhY2s6ICgpID0+IHt9LFxuICBpZGVudGlmeTogKCkgPT4ge30sXG4gIHJlc2V0OiAoKSA9PiB7fSxcbiAgZmxhZzogKF9rZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBGbGFnVmFsdWUgPSBmYWxzZSkgPT4gZGVmYXVsdFZhbHVlLFxuICBleHBlcmltZW50OiAoKTogRXhwZXJpbWVudFJlc3VsdCA9PiAoeyB2YXJpYW50OiBcImNvbnRyb2xcIiB9KSxcbiAgb3ZlcnJpZGVGbGFnOiAoKSA9PiB7fSxcbiAgY2xlYXJPdmVycmlkZXM6ICgpID0+IHt9LFxuICBnZXRPdmVycmlkZXM6ICgpID0+ICh7fSksXG4gIGZsdXNoOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKSxcbiAgcmVjb3JkUGFnZVZpZXc6ICgpID0+IHt9LFxuICBzdGF0dXM6ICgpOiBTREtTdGF0dXMgPT4gKHtcbiAgICBpbml0aWFsaXplZDogZmFsc2UsXG4gICAgb25saW5lOiBmYWxzZSxcbiAgICBxdWV1ZURlcHRoOiAwLFxuICAgIG9mZmxpbmVRdWV1ZURlcHRoOiAwLFxuICAgIGxhc3RGbHVzaEF0OiBudWxsLFxuICAgIGRldmljZUlkOiBudWxsLFxuICAgIHVzZXJJZDogbnVsbCxcbiAgICBmbGFnQ291bnQ6IDAsXG4gICAgZXhwZXJpbWVudENvdW50OiAwLFxuICAgIHNka1ZlcnNpb246IFwibm9vcFwiLFxuICB9KSxcbiAgZGVzdHJveTogKCkgPT4ge30sXG4gIGRpYWdub3N0aWNzOiAoKSA9PiBub29wQnVzLFxuICBnZXRSZWNlbnREaWFnbm9zdGljczogKCkgPT4gW10sXG59O1xuIiwiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBJR29hVGVjaCB9IGZyb20gXCJAZ29hdGVjaC9zZGstanNcIjtcbmltcG9ydCB7IG5vb3BDbGllbnQgfSBmcm9tIFwiLi9ub29wLWNsaWVudC5qc1wiO1xuXG4vKipcbiAqIEludGVybmFsIGNvbnRleHQg4oCUIGNvbnN1bWVycyBzaG91bGQgdXNlIHRoZSBgdXNlR29hVGVjaCgpYCBob29rLlxuICogRXhwb3J0ZWQgb25seSBmb3IgVGVzdFByb3ZpZGVyIHRvIGluamVjdCBhIG1vY2sgY2xpZW50LlxuICovXG5leHBvcnQgY29uc3QgR29hVGVjaENvbnRleHQgPSBjcmVhdGVDb250ZXh0PElHb2FUZWNoPihub29wQ2xpZW50KTtcbiIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSwgdHlwZSBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IEdvYVRlY2gsIHR5cGUgR29hVGVjaENvbmZpZywgdHlwZSBJR29hVGVjaCB9IGZyb20gXCJAZ29hdGVjaC9zZGstanNcIjtcbmltcG9ydCB7IEdvYVRlY2hDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dC5qc1wiO1xuaW1wb3J0IHsgbm9vcENsaWVudCB9IGZyb20gXCIuL25vb3AtY2xpZW50LmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR29hVGVjaFByb3ZpZGVyUHJvcHMge1xuICAvKiogU0RLIGNvbmZpZ3VyYXRpb24uIFByb3ZpZGVyIGNhbGxzIEdvYVRlY2guY3JlYXRlKCkgaW50ZXJuYWxseS4gKi9cbiAgY29uZmlnOiBHb2FUZWNoQ29uZmlnO1xuICAvKiogQ3VycmVudCB1c2VyIGZvciBhdXRvbWF0aWMgaWRlbnRpdHkgc3luYy4gUGFzcyBudWxsIHdoZW4gbG9nZ2VkIG91dC4gKi9cbiAgdXNlcj86IHsgaWQ6IHN0cmluZzsgdHJhaXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSB8IG51bGw7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHb2FUZWNoUHJvdmlkZXIoeyBjb25maWcsIHVzZXIsIGNoaWxkcmVuIH06IEdvYVRlY2hQcm92aWRlclByb3BzKSB7XG4gIGNvbnN0IGNsaWVudFJlZiA9IHVzZVJlZjxJR29hVGVjaCB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbY2xpZW50LCBzZXRDbGllbnRdID0gdXNlU3RhdGU8SUdvYVRlY2g+KG5vb3BDbGllbnQpO1xuICBjb25zdCBpZGVudGlmaWVkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIENyZWF0ZSBjbGllbnQgb25jZSBvbiBtb3VudCDigJQgZ3JhY2VmdWxseSBmYWxsIGJhY2sgdG8gbm9vcCBpZiBjb25maWcgaXMgaW52YWxpZFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjbGllbnRSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGMgPSBHb2FUZWNoLmNyZWF0ZShjb25maWcpO1xuICAgICAgY2xpZW50UmVmLmN1cnJlbnQgPSBjO1xuICAgICAgc2V0Q2xpZW50KGMpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgYy5kZXN0cm95KCk7XG4gICAgICAgIGNsaWVudFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBJbnZhbGlkIGNvbmZpZyAoZS5nLiwgbWlzc2luZyBBUEkga2V5KSDigJQgc3RheSBvbiBub29wIGNsaWVudC5cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIGFwcCBmcm9tIGNyYXNoaW5nIHdoZW4gTkVYVF9QVUJMSUNfR1RfU0RLX0FQSV9LRVkgaXMgbm90IHNldC5cbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIltHb2FUZWNoXSBTREsgaW5pdCBmYWlsZWQg4oCUIGV2ZW50cywgZmxhZ3MsIGFuZCBleHBlcmltZW50cyBhcmUgZGlzYWJsZWQuXCIsXG4gICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtdKTtcblxuICAvLyBTeW5jIGlkZW50aXR5IHdoZW4gdXNlciBjaGFuZ2VzXG4gIGNvbnN0IHVzZXJJZCA9IHVzZXI/LmlkID8/IG51bGw7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgYyA9IGNsaWVudFJlZi5jdXJyZW50O1xuICAgIGlmICghYykgcmV0dXJuO1xuICAgIGlmICh1c2VySWQgJiYgaWRlbnRpZmllZFJlZi5jdXJyZW50ICE9PSB1c2VySWQpIHtcbiAgICAgIGMuaWRlbnRpZnkodXNlcklkLCB1c2VyPy50cmFpdHMpO1xuICAgICAgaWRlbnRpZmllZFJlZi5jdXJyZW50ID0gdXNlcklkO1xuICAgIH0gZWxzZSBpZiAoIXVzZXJJZCAmJiBpZGVudGlmaWVkUmVmLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIGMucmVzZXQoKTtcbiAgICAgIGlkZW50aWZpZWRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9LCBbdXNlcklkLCB1c2VyPy50cmFpdHNdKTtcblxuICByZXR1cm4gPEdvYVRlY2hDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtjbGllbnR9PntjaGlsZHJlbn08L0dvYVRlY2hDb250ZXh0LlByb3ZpZGVyPjtcbn1cbiIsImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgSUdvYVRlY2ggfSBmcm9tIFwiQGdvYXRlY2gvc2RrLWpzXCI7XG5pbXBvcnQgeyBHb2FUZWNoQ29udGV4dCB9IGZyb20gXCIuLi9jb250ZXh0LmpzXCI7XG5cbi8qKlxuICogQWNjZXNzIHRoZSB1bmRlcmx5aW5nIGBHb2FUZWNoYCBjbGllbnQgZnJvbSBjb250ZXh0LiBVc2UgdGhpcyBmb3JcbiAqIGlkZW50aXR5IGNvbnRyb2xzIChgaWRlbnRpZnlgLCBgcmVzZXRgKSDigJQgZm9yIGZsYWcgLyBleHBlcmltZW50IC9cbiAqIHRyYWNrIGNhbGxzIHByZWZlciB0aGUgZGVkaWNhdGVkIGhvb2tzIChgdXNlRmxhZ2AsIGB1c2VFeHBlcmltZW50YCxcbiAqIGB1c2VUcmFja2ApIHdoaWNoIGdpdmUgeW91IHN0YWJsZSByZWZlcmVuY2VzIGFuZCB0cmlnZ2VyIHJlLXJlbmRlcnNcbiAqIG9uIGNvbmZpZyByZWZyZXNoLlxuICpcbiAqIEBleGFtcGxlXG4gKiBmdW5jdGlvbiBMb2dpbkZvcm0oKSB7XG4gKiAgIGNvbnN0IGd0ID0gdXNlR29hVGVjaCgpO1xuICogICBhc3luYyBmdW5jdGlvbiBvbkxvZ2luKHVzZXIpIHtcbiAqICAgICBhd2FpdCBhcGkubG9naW4odXNlcik7XG4gKiAgICAgZ3QuaWRlbnRpZnkodXNlci5pZCwgeyBlbWFpbDogdXNlci5lbWFpbCB9KTtcbiAqICAgfVxuICogICAvLyDigKZcbiAqIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogZnVuY3Rpb24gTG9nb3V0QnV0dG9uKCkge1xuICogICBjb25zdCBndCA9IHVzZUdvYVRlY2goKTtcbiAqICAgcmV0dXJuIDxidXR0b24gb25DbGljaz17KCkgPT4gZ3QucmVzZXQoKX0+TG9nIG91dDwvYnV0dG9uPjtcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUdvYVRlY2goKTogSUdvYVRlY2gge1xuICByZXR1cm4gdXNlQ29udGV4dChHb2FUZWNoQ29udGV4dCk7XG59XG4iLCJpbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlR29hVGVjaCB9IGZyb20gXCIuL3VzZS1nb2F0ZWNoLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIHN0YWJsZSBgdHJhY2soZXZlbnROYW1lLCBwcm9wZXJ0aWVzPylgIGZ1bmN0aW9uIGJvdW5kIHRvXG4gKiB0aGUgY3VycmVudCBHb2FUZWNoIGNsaWVudC4gVGhlIHJlZmVyZW5jZSBpcyBzdGFibGUgYWNyb3NzIHJlbmRlcnMsXG4gKiBzbyBpdCdzIHNhZmUgdG8gcGFzcyBpbnRvIGB1c2VFZmZlY3RgIGRlcHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGZ1bmN0aW9uIENoZWNrb3V0QnV0dG9uKHsgY291cnNlSWQgfTogeyBjb3Vyc2VJZDogc3RyaW5nIH0pIHtcbiAqICAgY29uc3QgdHJhY2sgPSB1c2VUcmFjaygpO1xuICogICByZXR1cm4gKFxuICogICAgIDxidXR0b24gb25DbGljaz17KCkgPT4gdHJhY2soXCJjaGVja291dF9zdGFydGVkXCIsIHsgY291cnNlX2lkOiBjb3Vyc2VJZCB9KX0+XG4gKiAgICAgICBCdXlcbiAqICAgICA8L2J1dHRvbj5cbiAqICAgKTtcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRyYWNrKCkge1xuICBjb25zdCBjbGllbnQgPSB1c2VHb2FUZWNoKCk7XG4gIHJldHVybiB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnROYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgY2xpZW50LnRyYWNrKGV2ZW50TmFtZSwgcHJvcGVydGllcyk7XG4gICAgfSxcbiAgICBbY2xpZW50XSxcbiAgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgRmxhZ1ZhbHVlIH0gZnJvbSBcIkBnb2F0ZWNoL3Nkay1qc1wiO1xuaW1wb3J0IHsgdXNlR29hVGVjaCB9IGZyb20gXCIuL3VzZS1nb2F0ZWNoLmpzXCI7XG5cbi8qKlxuICogRXZhbHVhdGUgYSBmZWF0dXJlIGZsYWcuIFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlIChzZXJ2ZXItc2lkZVxuICogdGFyZ2V0aW5nICsgcm9sbG91dCBtYXRoKSBvciBgZGVmYXVsdFZhbHVlYCB3aGlsZSB0aGUgU0RLIGNvbmZpZyBpc1xuICogc3RpbGwgbG9hZGluZy4gRmlyZXMgYCRmbGFnX2V4cG9zdXJlYCBvbmNlIHBlciBzZXNzaW9uIHBlciBmbGFnLlxuICpcbiAqIEBwYXJhbSBmbGFnS2V5IC0gRmxhZyBrZXkgZGVjbGFyZWQgaW4gdGhlIEdvYVRlY2ggZGFzaGJvYXJkLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAtIFJldHVybmVkIHdoZW4gdGhlIFNESyBoYXMgbm8gYW5zd2VyIHlldC5cbiAqICAgRGVmYXVsdHMgdG8gYGZhbHNlYCB0byBtYXRjaCB0aGUgdHlwaWNhbCBib29sZWFuLWZsYWcgdXNlIGNhc2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGZ1bmN0aW9uIENoZWNrb3V0QnV0dG9uKCkge1xuICogICBjb25zdCBuZXdGbG93ID0gdXNlRmxhZyhcIm5ld19jaGVja291dF9mbG93XCIsIGZhbHNlKTtcbiAqICAgcmV0dXJuIG5ld0Zsb3cgPyA8TmV3Q2hlY2tvdXQgLz4gOiA8TGVnYWN5Q2hlY2tvdXQgLz47XG4gKiB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE11bHRpLXZhbHVlIGZsYWcg4oCUIHBhc3MgYSBtYXRjaGluZyBkZWZhdWx0XG4gKiBjb25zdCB2YXJpYW50ID0gdXNlRmxhZzxcImNvbnRyb2xcIiB8IFwiYm9sZFwiPihcImN0YV9jb3B5X3YxXCIsIFwiY29udHJvbFwiKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUZsYWcoZmxhZ0tleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IEZsYWdWYWx1ZSA9IGZhbHNlKTogRmxhZ1ZhbHVlIHtcbiAgY29uc3QgY2xpZW50ID0gdXNlR29hVGVjaCgpO1xuICByZXR1cm4gY2xpZW50LmZsYWcoZmxhZ0tleSwgZGVmYXVsdFZhbHVlKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgRXhwZXJpbWVudFJlc3VsdCB9IGZyb20gXCJAZ29hdGVjaC9zZGstanNcIjtcbmltcG9ydCB7IHVzZUdvYVRlY2ggfSBmcm9tIFwiLi91c2UtZ29hdGVjaC5qc1wiO1xuXG4vKipcbiAqIEdldCB0aGUgYnVja2V0ZWQgdmFyaWFudCArIHBheWxvYWQgZm9yIGFuIGV4cGVyaW1lbnQuIEFzc2lnbm1lbnQgaXNcbiAqIHN0aWNreSBwZXIgZGV2aWNlLiBGaXJlcyBgJGV4cG9zdXJlYCBvbmNlIHBlciBzZXNzaW9uIHBlciBleHBlcmltZW50XG4gKiB0aGUgZmlyc3QgdGltZSBpdCByZXNvbHZlcyB0byBhIG5vbi1jb250cm9sIHZhcmlhbnQuXG4gKlxuICogQHBhcmFtIGV4cGVyaW1lbnRLZXkgLSBFeHBlcmltZW50IGtleSBkZWNsYXJlZCBpbiB0aGUgR29hVGVjaCBkYXNoYm9hcmQuXG4gKiBAcmV0dXJucyBgeyB2YXJpYW50OiBzdHJpbmcsIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH1gLlxuICogICBgdmFyaWFudGAgZmFsbHMgYmFjayB0byBgXCJjb250cm9sXCJgIHVudGlsIHRoZSBTREsgY29uZmlnIGxvYWRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBmdW5jdGlvbiBIZXJvSDEoKSB7XG4gKiAgIGNvbnN0IHsgdmFyaWFudCwgcGF5bG9hZCB9ID0gdXNlRXhwZXJpbWVudChcImhlcm9faDFfY29weV92MVwiKTtcbiAqICAgaWYgKHZhcmlhbnQgPT09IFwiY29udHJvbFwiKSByZXR1cm4gPGgxPlNoaXAgZmFzdGVyLjwvaDE+O1xuICogICByZXR1cm4gPGgxPnsocGF5bG9hZCBhcyB7IGhlYWRsaW5lOiBzdHJpbmcgfSkuaGVhZGxpbmV9PC9oMT47XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VFeHBlcmltZW50KGV4cGVyaW1lbnRLZXk6IHN0cmluZyk6IEV4cGVyaW1lbnRSZXN1bHQge1xuICBjb25zdCBjbGllbnQgPSB1c2VHb2FUZWNoKCk7XG4gIHJldHVybiBjbGllbnQuZXhwZXJpbWVudChleHBlcmltZW50S2V5KTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IEZsYWdWYWx1ZSB9IGZyb20gXCJAZ29hdGVjaC9zZGstanNcIjtcbmltcG9ydCB7IHVzZUZsYWcgfSBmcm9tIFwiLi4vaG9va3MvdXNlLWZsYWcuanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlUHJvcHMge1xuICAvKiogVGhlIGZsYWcga2V5IHRvIGV2YWx1YXRlICovXG4gIGZsYWdLZXk6IHN0cmluZztcbiAgLyoqIFJlbmRlciB3aGVuIGZsYWcgaXMgdHJ1dGh5IChvciBtYXRjaGVzIGBtYXRjaGAgdmFsdWUpICovXG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIC8qKiBPcHRpb25hbCBmYWxsYmFjayB3aGVuIGZsYWcgaXMgZmFsc3kgKi9cbiAgZmFsbGJhY2s/OiBSZWFjdE5vZGU7XG4gIC8qKiBPcHRpb25hbDogbWF0Y2ggYSBzcGVjaWZpYyB2YWx1ZSBpbnN0ZWFkIG9mIHRydXRoeSBjaGVjayAqL1xuICBtYXRjaD86IEZsYWdWYWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZlYXR1cmUoeyBmbGFnS2V5LCBjaGlsZHJlbiwgZmFsbGJhY2sgPSBudWxsLCBtYXRjaCB9OiBGZWF0dXJlUHJvcHMpIHtcbiAgY29uc3QgdmFsdWUgPSB1c2VGbGFnKGZsYWdLZXksIGZhbHNlKTtcbiAgY29uc3QgaXNNYXRjaCA9IG1hdGNoICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA9PT0gbWF0Y2ggOiBCb29sZWFuKHZhbHVlKTtcbiAgcmV0dXJuIDw+e2lzTWF0Y2ggPyBjaGlsZHJlbiA6IGZhbGxiYWNrfTwvPjtcbn1cbiIsImltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IEV4cGVyaW1lbnRSZXN1bHQgfSBmcm9tIFwiQGdvYXRlY2gvc2RrLWpzXCI7XG5pbXBvcnQgeyB1c2VFeHBlcmltZW50IH0gZnJvbSBcIi4uL2hvb2tzL3VzZS1leHBlcmltZW50LmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwZXJpbWVudFByb3BzIHtcbiAgLyoqIFRoZSBleHBlcmltZW50IGtleSAqL1xuICBleHBlcmltZW50S2V5OiBzdHJpbmc7XG4gIC8qKiBNYXAgdmFyaWFudCBrZXkgLT4gUmVhY3ROb2RlIChzaW1wbGUgbW9kZSkuICovXG4gIHZhcmlhbnRzPzogUmVjb3JkPHN0cmluZywgUmVhY3ROb2RlPjtcbiAgLyoqIFJlbmRlciBwcm9wIGFsdGVybmF0aXZlIOKAlCByZWNlaXZlcyB7IHZhcmlhbnQsIHBheWxvYWQgfS4gKi9cbiAgY2hpbGRyZW4/OiAocmVzdWx0OiBFeHBlcmltZW50UmVzdWx0KSA9PiBSZWFjdE5vZGU7XG4gIC8qKiBGYWxsYmFjayBpZiBubyB2YXJpYW50IG1hdGNoZXMgKGRlZmF1bHRzIHRvIFwiY29udHJvbFwiIHZhcmlhbnQgb3IgbnVsbCkgKi9cbiAgZmFsbGJhY2s/OiBSZWFjdE5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBFeHBlcmltZW50KHsgZXhwZXJpbWVudEtleSwgdmFyaWFudHMsIGNoaWxkcmVuLCBmYWxsYmFjayB9OiBFeHBlcmltZW50UHJvcHMpIHtcbiAgY29uc3QgcmVzdWx0ID0gdXNlRXhwZXJpbWVudChleHBlcmltZW50S2V5KTtcblxuICAvLyBSZW5kZXIgcHJvcCBtb2RlIOKAlCBjb25zdW1lciBnZXRzIGZ1bGwgcGF5bG9hZCBhY2Nlc3NcbiAgaWYgKGNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIDw+e2NoaWxkcmVuKHJlc3VsdCl9PC8+O1xuICB9XG5cbiAgLy8gVmFyaWFudCBtYXAgbW9kZVxuICBpZiAodmFyaWFudHMgJiYgcmVzdWx0LnZhcmlhbnQgaW4gdmFyaWFudHMpIHtcbiAgICByZXR1cm4gPD57dmFyaWFudHNbcmVzdWx0LnZhcmlhbnRdfTwvPjtcbiAgfVxuXG4gIHJldHVybiA8PntmYWxsYmFjayA/PyB2YXJpYW50cz8uW1wiY29udHJvbFwiXSA/PyBudWxsfTwvPjtcbn1cbiIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VHb2FUZWNoIH0gZnJvbSBcIi4uL2hvb2tzL3VzZS1nb2F0ZWNoLmpzXCI7XG5pbXBvcnQgeyB1c2VUcmFjayB9IGZyb20gXCIuLi9ob29rcy91c2UtdHJhY2suanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQYWdlVmlld1RyYWNrZXJQcm9wcyB7XG4gIC8qKiBDdXJyZW50IHBhdGhuYW1lIOKAlCBwYXNzIGZyb20geW91ciByb3V0ZXIgKGUuZy4sIE5leHQuanMgdXNlUGF0aG5hbWUoKSkuICovXG4gIHBhdGhuYW1lOiBzdHJpbmc7XG4gIC8qKiBDdXJyZW50IHNlYXJjaCBwYXJhbXMgc3RyaW5nIChvcHRpb25hbCkuICovXG4gIHNlYXJjaFBhcmFtcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUcmFjayBwYWdlIHZpZXdzIG9uIHJvdXRlIGNoYW5nZS5cbiAqXG4gKiBFbWl0cyB0d28gZXZlbnRzIHBlciByb3V0ZSBjaGFuZ2U6XG4gKlxuICogICAtIGAkcGFnZV9sZWF2ZWAgZm9yIHRoZSBwcmlvciByb3V0ZSwgd2l0aCBgdGltZV9vbl9wYWdlX21zYCxcbiAqICAgICBgbWF4X3Njcm9sbF9wY3RgLCBgdGFiX2hpZGRlbl9jb3VudGAsIGV0Yy4gKGVtaXR0ZWQgYnlcbiAqICAgICBgY2xpZW50LnJlY29yZFBhZ2VWaWV3KClgIHZpYSB0aGUgU0RLJ3MgYExpZmVjeWNsZU1hbmFnZXJgKS5cbiAqICAgLSBgJHBhZ2Vfdmlld2AgZm9yIHRoZSBuZXcgcm91dGUuXG4gKlxuICogVGhlIG9yZGVyIG1hdHRlcnMg4oCUIGxlYXZlIGJlZm9yZSB2aWV3IOKAlCBzbyB0aGUgbGVhdmUgZXZlbnQgY2Fycmllc1xuICogdGhlIHByZXZpb3VzIHBhdGgsIGFuZCB0aGUgdmlldyBtYXJrcyB0aGUgc3RhcnQgb2YgdGhlIG5ldyBwYWdlJ3NcbiAqIGR3ZWxsIHdpbmRvdy4gQm90aCBldmVudHMgZW5kIHVwIGluIGBldmVudHNfcmF3YCBzbyBmdW5uZWxzIGNhblxuICogZmlsdGVyIGF0IGVpdGhlciBncmFpbi5cbiAqXG4gKiBVbmxpa2UgdGhlIHdlYi1hcHAgdmVyc2lvbiwgdGhpcyBjb21wb25lbnQgZG9lcyBOT1QgaW1wb3J0XG4gKiBgbmV4dC9uYXZpZ2F0aW9uYCBkaXJlY3RseSDigJQgdGhlIGNhbGxlciBwcm92aWRlcyBwYXRobmFtZSBhbmRcbiAqIHNlYXJjaFBhcmFtcyBzbyBpdCB3b3JrcyB3aXRoIGFueSByb3V0ZXIgKE5leHQuanMsIFJlYWN0IFJvdXRlcixcbiAqIFRhblN0YWNrIFJvdXRlciwgZXRjLikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQYWdlVmlld1RyYWNrZXIoeyBwYXRobmFtZSwgc2VhcmNoUGFyYW1zIH06IFBhZ2VWaWV3VHJhY2tlclByb3BzKSB7XG4gIGNvbnN0IGNsaWVudCA9IHVzZUdvYVRlY2goKTtcbiAgY29uc3QgdHJhY2sgPSB1c2VUcmFjaygpO1xuICBjb25zdCBsYXN0UGF0aFJlZiA9IHVzZVJlZjxzdHJpbmc+KFwiXCIpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBzZWFyY2hQYXJhbXMgPyBgJHtwYXRobmFtZX0/JHtzZWFyY2hQYXJhbXN9YCA6IHBhdGhuYW1lO1xuICAgIGlmIChmdWxsUGF0aCA9PT0gbGFzdFBhdGhSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgIGxhc3RQYXRoUmVmLmN1cnJlbnQgPSBmdWxsUGF0aDtcblxuICAgIC8vIFRlbGwgdGhlIFNESyBmaXJzdCBzbyBpdCBjYW4gZW1pdCBgJHBhZ2VfbGVhdmVgIGZvciB0aGUgcHJpb3JcbiAgICAvLyBwYXRoIChpZiBhbnkpIGJlZm9yZSB3ZSBzdGFtcCB0aGUgbmV3IGAkcGFnZV92aWV3YC5cbiAgICBjbGllbnQucmVjb3JkUGFnZVZpZXcoZnVsbFBhdGgpO1xuXG4gICAgdHJhY2soXCIkcGFnZV92aWV3XCIsIHtcbiAgICAgIHBhdGg6IHBhdGhuYW1lLFxuICAgICAgdXJsOiBmdWxsUGF0aCxcbiAgICAgIHJlZmVycmVyOiB0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgPyBkb2N1bWVudC5yZWZlcnJlciB8fCBudWxsIDogbnVsbCxcbiAgICAgIHRpdGxlOiB0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgPyBkb2N1bWVudC50aXRsZSB8fCBudWxsIDogbnVsbCxcbiAgICB9KTtcbiAgfSwgW3BhdGhuYW1lLCBzZWFyY2hQYXJhbXMsIGNsaWVudCwgdHJhY2tdKTtcblxuICByZXR1cm4gbnVsbDtcbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCwgdHlwZSBFcnJvckluZm8sIHR5cGUgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IElHb2FUZWNoIH0gZnJvbSBcIkBnb2F0ZWNoL3Nkay1qc1wiO1xuaW1wb3J0IHsgR29hVGVjaENvbnRleHQgfSBmcm9tIFwiLi4vY29udGV4dC5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yQm91bmRhcnlQcm9wcyB7XG4gIC8qKlxuICAgKiBSZW5kZXJlZCB3aGVuIGEgZGVzY2VuZGFudCByZW5kZXIgdGhyb3dzLiBSZWNlaXZlcyB0aGUgZXJyb3IgYW5kIGFcbiAgICogYHJlc2V0KClgIGZ1bmN0aW9uIHRvIGNsZWFyIHRoZSBib3VuZGFyeSBzdGF0ZS4gSWYgb21pdHRlZCwgY2hpbGRyZW5cbiAgICogYXJlIGhpZGRlbiBhZnRlciBhIGNyYXNoIChudWxsIGZhbGxiYWNrKS5cbiAgICovXG4gIGZhbGxiYWNrPzogUmVhY3ROb2RlIHwgKChzdGF0ZTogeyBlcnJvcjogRXJyb3I7IHJlc2V0OiAoKSA9PiB2b2lkIH0pID0+IFJlYWN0Tm9kZSk7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2l0aCB0aGUgY2FwdHVyZWQgZXJyb3IgQUZURVIgaXQgaGFzIGJlZW4gZm9yd2FyZGVkIHRvIEdvYVRlY2guXG4gICAqIFVzZWZ1bCBmb3Igc3VyZmFjaW5nIGEgdG9hc3Qgb3IgZm9yd2FyZGluZyB0byBhbm90aGVyIHRlbGVtZXRyeSBzeXN0ZW0uXG4gICAqL1xuICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgaW5mbzogRXJyb3JJbmZvKSA9PiB2b2lkO1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xufVxuXG5pbnRlcmZhY2UgU3RhdGUge1xuICBlcnJvcjogRXJyb3IgfCBudWxsO1xufVxuXG4vKipcbiAqIFJlYWN0IEVycm9yQm91bmRhcnkgdGhhdCBmb3J3YXJkcyByZW5kZXItdGltZSBjcmFzaGVzIHRvIEdvYVRlY2ggYXNcbiAqIGAkZXJyb3JgIGV2ZW50cy4gVXNlIGl0IHRvIHdyYXAgYW55IHN1Yi10cmVlIHdob3NlIGNyYXNoZXMgd291bGRcbiAqIG90aGVyd2lzZSBwcm9kdWNlIGEgYmxhbmsgcGFnZSAob3IgdGhlIE5leHQuanMgcm9vdCBlcnJvciBzY3JlZW4pLlxuICpcbiAqICAgPEdvYVRlY2hQcm92aWRlciAuLi4+XG4gKiAgICAgPEVycm9yQm91bmRhcnkgZmFsbGJhY2s9ezxGYXRhbEVycm9yIC8+fT5cbiAqICAgICAgIDxBcHAgLz5cbiAqICAgICA8L0Vycm9yQm91bmRhcnk+XG4gKiAgIDwvR29hVGVjaFByb3ZpZGVyPlxuICpcbiAqIFJlYWNoZXMgdGhlIEdvYVRlY2ggY2xpZW50IHZpYSBjb250ZXh0IHNvIG5vIGV4cGxpY2l0IHdpcmluZyBpcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBFcnJvckJvdW5kYXJ5IGV4dGVuZHMgQ29tcG9uZW50PEVycm9yQm91bmRhcnlQcm9wcywgU3RhdGU+IHtcbiAgc3RhdGljIGNvbnRleHRUeXBlID0gR29hVGVjaENvbnRleHQ7XG4gIGRlY2xhcmUgY29udGV4dDogSUdvYVRlY2g7XG5cbiAgc3RhdGU6IFN0YXRlID0geyBlcnJvcjogbnVsbCB9O1xuXG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3I6IEVycm9yKTogU3RhdGUge1xuICAgIHJldHVybiB7IGVycm9yIH07XG4gIH1cblxuICBjb21wb25lbnREaWRDYXRjaChlcnJvcjogRXJyb3IsIGluZm86IEVycm9ySW5mbyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNvbnRleHQudHJhY2soXCIkZXJyb3JcIiwge1xuICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICBzdGFjazogZXJyb3Iuc3RhY2sgPyBlcnJvci5zdGFjay5zbGljZSgwLCA0MDk2KSA6IG51bGwsXG4gICAgICAgIGNvbXBvbmVudF9zdGFjazogaW5mby5jb21wb25lbnRTdGFjayA/IGluZm8uY29tcG9uZW50U3RhY2suc2xpY2UoMCwgNDA5NikgOiBudWxsLFxuICAgICAgICB0eXBlOiBcInJlYWN0X2JvdW5kYXJ5XCIsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE5ldmVyIGxldCB0ZWxlbWV0cnkgYnJlYWsgdGhlIGZhbGxiYWNrIHJlbmRlci5cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucHJvcHMub25FcnJvcj8uKGVycm9yLCBpbmZvKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFVzZXIgY2FsbGJhY2sgaXMgdW50cnVzdGVkLlxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzZXQgPSAoKTogdm9pZCA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGVycm9yOiBudWxsIH0pO1xuICB9O1xuXG4gIHJlbmRlcigpOiBSZWFjdE5vZGUge1xuICAgIGNvbnN0IHsgZXJyb3IgfSA9IHRoaXMuc3RhdGU7XG4gICAgaWYgKCFlcnJvcikgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG5cbiAgICBjb25zdCB7IGZhbGxiYWNrIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmICh0eXBlb2YgZmFsbGJhY2sgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrKHsgZXJyb3IsIHJlc2V0OiB0aGlzLnJlc2V0IH0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsbGJhY2sgPz8gbnVsbDtcbiAgfVxufVxuIl19
package/dist/index.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import {b,a}from'./chunk-OKZIRDLB.mjs';export{a as noopClient}from'./chunk-OKZIRDLB.mjs';import {Component,useRef,useState,useEffect,useContext,useCallback}from'react';import {GoaTech}from'@goatech/sdk-js';import {jsx,Fragment}from'react/jsx-runtime';function P({config:o,user:r,children:e}){let t=useRef(null),[n,a$1]=useState(a),u=useRef(null);useEffect(()=>{if(!t.current&&!(typeof window>"u"))try{let c=GoaTech.create(o);return t.current=c,a$1(c),()=>{c.destroy(),t.current=null;}}catch(c){typeof window<"u"&&console.warn("[GoaTech] SDK init failed \u2014 events, flags, and experiments are disabled.",c instanceof Error?c.message:c);}},[]);let s=r?.id??null;return useEffect(()=>{let c=t.current;c&&(s&&u.current!==s?(c.identify(s,r?.traits),u.current=s):!s&&u.current!==null&&(c.reset(),u.current=null));},[s,r?.traits]),jsx(b.Provider,{value:n,children:e})}function i(){return useContext(b)}function m(){let o=i();return useCallback((r,e)=>{o.track(r,e);},[o])}function d(o,r=false){return i().flag(o,r)}function x(o){return i().experiment(o)}function w({flagKey:o,children:r,fallback:e=null,match:t}){let n=d(o,false);return jsx(Fragment,{children:(t!==void 0?n===t:!!n)?r:e})}function N({experimentKey:o,variants:r,children:e,fallback:t}){let n=x(o);return e?jsx(Fragment,{children:e(n)}):r&&n.variant in r?jsx(Fragment,{children:r[n.variant]}):jsx(Fragment,{children:t??r?.control??null})}function S({pathname:o,searchParams:r}){let e=i(),t=m(),n=useRef("");return useEffect(()=>{let a=r?`${o}?${r}`:o;a!==n.current&&(n.current=a,e.recordPageView(a),t("$page_view",{path:o,url:a,referrer:typeof document<"u"&&document.referrer||null,title:typeof document<"u"&&document.title||null}));},[o,r,e,t]),null}var l=class extends Component{constructor(){super(...arguments);this.state={error:null};this.reset=()=>{this.setState({error:null});};}static getDerivedStateFromError(e){return {error:e}}componentDidCatch(e,t){try{this.context.track("$error",{message:e.message,stack:e.stack?e.stack.slice(0,4096):null,component_stack:t.componentStack?t.componentStack.slice(0,4096):null,type:"react_boundary"});}catch{}try{this.props.onError?.(e,t);}catch{}}render(){let{error:e}=this.state;if(!e)return this.props.children;let{fallback:t}=this.props;return typeof t=="function"?t({error:e,reset:this.reset}):t??null}};l.contextType=b;export{l as ErrorBoundary,N as Experiment,w as Feature,P as GoaTechProvider,S as PageViewTracker,x as useExperiment,d as useFlag,i as useGoaTech,m as useTrack};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm92aWRlci50c3giLCIuLi9zcmMvaG9va3MvdXNlLWdvYXRlY2gudHMiLCIuLi9zcmMvaG9va3MvdXNlLXRyYWNrLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS1mbGFnLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS1leHBlcmltZW50LnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvZmVhdHVyZS50c3giLCIuLi9zcmMvY29tcG9uZW50cy9leHBlcmltZW50LnRzeCIsIi4uL3NyYy9jb21wb25lbnRzL3BhZ2Utdmlldy10cmFja2VyLnRzeCIsIi4uL3NyYy9jb21wb25lbnRzL2Vycm9yLWJvdW5kYXJ5LnRzeCJdLCJuYW1lcyI6WyJHb2FUZWNoUHJvdmlkZXIiLCJjb25maWciLCJ1c2VyIiwiY2hpbGRyZW4iLCJjbGllbnRSZWYiLCJ1c2VSZWYiLCJjbGllbnQiLCJzZXRDbGllbnQiLCJ1c2VTdGF0ZSIsIm5vb3BDbGllbnQiLCJpZGVudGlmaWVkUmVmIiwidXNlRWZmZWN0IiwiR29hVGVjaCIsImVyciIsInVzZXJJZCIsImpzeCIsIkdvYVRlY2hDb250ZXh0IiwidXNlR29hVGVjaCIsInVzZUNvbnRleHQiLCJ1c2VUcmFjayIsInVzZUNhbGxiYWNrIiwiZXZlbnROYW1lIiwicHJvcGVydGllcyIsInVzZUZsYWciLCJmbGFnS2V5IiwiZGVmYXVsdFZhbHVlIiwidXNlRXhwZXJpbWVudCIsImV4cGVyaW1lbnRLZXkiLCJGZWF0dXJlIiwiZmFsbGJhY2siLCJtYXRjaCIsInZhbHVlIiwiRnJhZ21lbnQiLCJFeHBlcmltZW50IiwidmFyaWFudHMiLCJyZXN1bHQiLCJQYWdlVmlld1RyYWNrZXIiLCJwYXRobmFtZSIsInNlYXJjaFBhcmFtcyIsInRyYWNrIiwibGFzdFBhdGhSZWYiLCJmdWxsUGF0aCIsIkVycm9yQm91bmRhcnkiLCJDb21wb25lbnQiLCJlcnJvciIsImluZm8iXSwibWFwcGluZ3MiOiIyUEFhTyxTQUFTQSxDQUFBQSxDQUFnQixDQUFFLE1BQUEs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QUFVLENBQzNCLE9BQUEsQ0FBU0QsQ0FBQUEsQ0FBTSxPQUFBLENBQ2YsS0FBQSxDQUFPQSxDQUFBQSxDQUFNLEtBQUEsQ0FBUUEsQ0FBQUEsQ0FBTSxLQUFBLENBQU0sS0FBQSxDQUFNLENBQUEsQ0FBRyxJQUFJLENBQUEsQ0FBSSxJQUFBLENBQ2xELGVBQUEsQ0FBaUJDLENBQUFBLENBQUssY0FBQSxDQUFpQkEsRUFBSyxjQUFBLENBQWUsS0FBQSxDQUFNLENBQUEsQ0FBRyxJQUFJLENBQUEsQ0FBSSxJQUFBLENBQzVFLElBQUEsQ0FBTSxnQkFDUixDQUFDLEVBQ0gsQ0FBQSxLQUFRLENBRVIsQ0FDQSxHQUFJLENBQ0YsSUFBQSxDQUFLLEtBQUEsQ0FBTSxPQUFBLEdBQVVELENBQUFBLENBQU9DLENBQUksRUFDbEMsQ0FBQSxLQUFRLENBRVIsQ0FDRixDQU1BLE1BQUEsRUFBb0IsQ0FDbEIsR0FBTSxDQUFFLEtBQUEsQ0FBQUQsQ0FBTSxDQUFBLENBQUksS0FBSyxLQUFBLENBQ3ZCLEdBQUksQ0FBQ0EsQ0FBQUEsQ0FBTyxPQUFPLElBQUEsQ0FBSyxLQUFBLENBQU0sUUFBQSxDQUU5QixHQUFNLENBQUUsUUFBQSxDQUFBZixDQUFTLENBQUEsQ0FBSSxJQUFBLENBQUssS0FBQSxDQUMxQixPQUFJLE9BQU9BLENBQUFBLEVBQWEsVUFBQSxDQUNmQSxDQUFBQSxDQUFTLENBQUUsS0FBQSxDQUFBZSxDQUFBQSxDQUFPLEtBQUEsQ0FBTyxJQUFBLENBQUssS0FBTSxDQUFDLENBQUEsQ0FFdkNmLENBQUFBLEVBQVksSUFDckIsQ0FDRixFQTFDYWEsRUFDSixXQUFBLENBQWMxQixDQUFBQSIsImZpbGUiOiJpbmRleC5tanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUsIHR5cGUgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBHb2FUZWNoLCB0eXBlIEdvYVRlY2hDb25maWcsIHR5cGUgSUdvYVRlY2ggfSBmcm9tIFwiQGdvYXRlY2gvc2RrLWpzXCI7XG5pbXBvcnQgeyBHb2FUZWNoQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHQuanNcIjtcbmltcG9ydCB7IG5vb3BDbGllbnQgfSBmcm9tIFwiLi9ub29wLWNsaWVudC5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdvYVRlY2hQcm92aWRlclByb3BzIHtcbiAgLyoqIFNESyBjb25maWd1cmF0aW9uLiBQcm92aWRlciBjYWxscyBHb2FUZWNoLmNyZWF0ZSgpIGludGVybmFsbHkuICovXG4gIGNvbmZpZzogR29hVGVjaENvbmZpZztcbiAgLyoqIEN1cnJlbnQgdXNlciBmb3IgYXV0b21hdGljIGlkZW50aXR5IHN5bmMuIFBhc3MgbnVsbCB3aGVuIGxvZ2dlZCBvdXQuICovXG4gIHVzZXI/OiB7IGlkOiBzdHJpbmc7IHRyYWl0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gfCBudWxsO1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gR29hVGVjaFByb3ZpZGVyKHsgY29uZmlnLCB1c2VyLCBjaGlsZHJlbiB9OiBHb2FUZWNoUHJvdmlkZXJQcm9wcykge1xuICBjb25zdCBjbGllbnRSZWYgPSB1c2VSZWY8SUdvYVRlY2ggfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2NsaWVudCwgc2V0Q2xpZW50XSA9IHVzZVN0YXRlPElHb2FUZWNoPihub29wQ2xpZW50KTtcbiAgY29uc3QgaWRlbnRpZmllZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBDcmVhdGUgY2xpZW50IG9uY2Ugb24gbW91bnQg4oCUIGdyYWNlZnVsbHkgZmFsbCBiYWNrIHRvIG5vb3AgaWYgY29uZmlnIGlzIGludmFsaWRcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY2xpZW50UmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjID0gR29hVGVjaC5jcmVhdGUoY29uZmlnKTtcbiAgICAgIGNsaWVudFJlZi5jdXJyZW50ID0gYztcbiAgICAgIHNldENsaWVudChjKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGMuZGVzdHJveSgpO1xuICAgICAgICBjbGllbnRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gSW52YWxpZCBjb25maWcgKGUuZy4sIG1pc3NpbmcgQVBJIGtleSkg4oCUIHN0YXkgb24gbm9vcCBjbGllbnQuXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSBhcHAgZnJvbSBjcmFzaGluZyB3aGVuIE5FWFRfUFVCTElDX0dUX1NES19BUElfS0VZIGlzIG5vdCBzZXQuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJbR29hVGVjaF0gU0RLIGluaXQgZmFpbGVkIOKAlCBldmVudHMsIGZsYWdzLCBhbmQgZXhwZXJpbWVudHMgYXJlIGRpc2FibGVkLlwiLFxuICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgLy8gU3luYyBpZGVudGl0eSB3aGVuIHVzZXIgY2hhbmdlc1xuICBjb25zdCB1c2VySWQgPSB1c2VyPy5pZCA/PyBudWxsO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGMgPSBjbGllbnRSZWYuY3VycmVudDtcbiAgICBpZiAoIWMpIHJldHVybjtcbiAgICBpZiAodXNlcklkICYmIGlkZW50aWZpZWRSZWYuY3VycmVudCAhPT0gdXNlcklkKSB7XG4gICAgICBjLmlkZW50aWZ5KHVzZXJJZCwgdXNlcj8udHJhaXRzKTtcbiAgICAgIGlkZW50aWZpZWRSZWYuY3VycmVudCA9IHVzZXJJZDtcbiAgICB9IGVsc2UgaWYgKCF1c2VySWQgJiYgaWRlbnRpZmllZFJlZi5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBjLnJlc2V0KCk7XG4gICAgICBpZGVudGlmaWVkUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfSwgW3VzZXJJZCwgdXNlcj8udHJhaXRzXSk7XG5cbiAgcmV0dXJuIDxHb2FUZWNoQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y2xpZW50fT57Y2hpbGRyZW59PC9Hb2FUZWNoQ29udGV4dC5Qcm92aWRlcj47XG59XG4iLCJpbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IElHb2FUZWNoIH0gZnJvbSBcIkBnb2F0ZWNoL3Nkay1qc1wiO1xuaW1wb3J0IHsgR29hVGVjaENvbnRleHQgfSBmcm9tIFwiLi4vY29udGV4dC5qc1wiO1xuXG4vKipcbiAqIEFjY2VzcyB0aGUgdW5kZXJseWluZyBgR29hVGVjaGAgY2xpZW50IGZyb20gY29udGV4dC4gVXNlIHRoaXMgZm9yXG4gKiBpZGVudGl0eSBjb250cm9scyAoYGlkZW50aWZ5YCwgYHJlc2V0YCkg4oCUIGZvciBmbGFnIC8gZXhwZXJpbWVudCAvXG4gKiB0cmFjayBjYWxscyBwcmVmZXIgdGhlIGRlZGljYXRlZCBob29rcyAoYHVzZUZsYWdgLCBgdXNlRXhwZXJpbWVudGAsXG4gKiBgdXNlVHJhY2tgKSB3aGljaCBnaXZlIHlvdSBzdGFibGUgcmVmZXJlbmNlcyBhbmQgdHJpZ2dlciByZS1yZW5kZXJzXG4gKiBvbiBjb25maWcgcmVmcmVzaC5cbiAqXG4gKiBAZXhhbXBsZVxuICogZnVuY3Rpb24gTG9naW5Gb3JtKCkge1xuICogICBjb25zdCBndCA9IHVzZUdvYVRlY2goKTtcbiAqICAgYXN5bmMgZnVuY3Rpb24gb25Mb2dpbih1c2VyKSB7XG4gKiAgICAgYXdhaXQgYXBpLmxvZ2luKHVzZXIpO1xuICogICAgIGd0LmlkZW50aWZ5KHVzZXIuaWQsIHsgZW1haWw6IHVzZXIuZW1haWwgfSk7XG4gKiAgIH1cbiAqICAgLy8g4oCmXG4gKiB9XG4gKlxuICogQGV4YW1wbGVcbiAqIGZ1bmN0aW9uIExvZ291dEJ1dHRvbigpIHtcbiAqICAgY29uc3QgZ3QgPSB1c2VHb2FUZWNoKCk7XG4gKiAgIHJldHVybiA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IGd0LnJlc2V0KCl9PkxvZyBvdXQ8L2J1dHRvbj47XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VHb2FUZWNoKCk6IElHb2FUZWNoIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoR29hVGVjaENvbnRleHQpO1xufVxuIiwiaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUdvYVRlY2ggfSBmcm9tIFwiLi91c2UtZ29hdGVjaC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBzdGFibGUgYHRyYWNrKGV2ZW50TmFtZSwgcHJvcGVydGllcz8pYCBmdW5jdGlvbiBib3VuZCB0b1xuICogdGhlIGN1cnJlbnQgR29hVGVjaCBjbGllbnQuIFRoZSByZWZlcmVuY2UgaXMgc3RhYmxlIGFjcm9zcyByZW5kZXJzLFxuICogc28gaXQncyBzYWZlIHRvIHBhc3MgaW50byBgdXNlRWZmZWN0YCBkZXBzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBmdW5jdGlvbiBDaGVja291dEJ1dHRvbih7IGNvdXJzZUlkIH06IHsgY291cnNlSWQ6IHN0cmluZyB9KSB7XG4gKiAgIGNvbnN0IHRyYWNrID0gdXNlVHJhY2soKTtcbiAqICAgcmV0dXJuIChcbiAqICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHRyYWNrKFwiY2hlY2tvdXRfc3RhcnRlZFwiLCB7IGNvdXJzZV9pZDogY291cnNlSWQgfSl9PlxuICogICAgICAgQnV5XG4gKiAgICAgPC9idXR0b24+XG4gKiAgICk7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VUcmFjaygpIHtcbiAgY29uc3QgY2xpZW50ID0gdXNlR29hVGVjaCgpO1xuICByZXR1cm4gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50TmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgIGNsaWVudC50cmFjayhldmVudE5hbWUsIHByb3BlcnRpZXMpO1xuICAgIH0sXG4gICAgW2NsaWVudF0sXG4gICk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEZsYWdWYWx1ZSB9IGZyb20gXCJAZ29hdGVjaC9zZGstanNcIjtcbmltcG9ydCB7IHVzZUdvYVRlY2ggfSBmcm9tIFwiLi91c2UtZ29hdGVjaC5qc1wiO1xuXG4vKipcbiAqIEV2YWx1YXRlIGEgZmVhdHVyZSBmbGFnLiBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZSAoc2VydmVyLXNpZGVcbiAqIHRhcmdldGluZyArIHJvbGxvdXQgbWF0aCkgb3IgYGRlZmF1bHRWYWx1ZWAgd2hpbGUgdGhlIFNESyBjb25maWcgaXNcbiAqIHN0aWxsIGxvYWRpbmcuIEZpcmVzIGAkZmxhZ19leHBvc3VyZWAgb25jZSBwZXIgc2Vzc2lvbiBwZXIgZmxhZy5cbiAqXG4gKiBAcGFyYW0gZmxhZ0tleSAtIEZsYWcga2V5IGRlY2xhcmVkIGluIHRoZSBHb2FUZWNoIGRhc2hib2FyZC5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgLSBSZXR1cm5lZCB3aGVuIHRoZSBTREsgaGFzIG5vIGFuc3dlciB5ZXQuXG4gKiAgIERlZmF1bHRzIHRvIGBmYWxzZWAgdG8gbWF0Y2ggdGhlIHR5cGljYWwgYm9vbGVhbi1mbGFnIHVzZSBjYXNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBmdW5jdGlvbiBDaGVja291dEJ1dHRvbigpIHtcbiAqICAgY29uc3QgbmV3RmxvdyA9IHVzZUZsYWcoXCJuZXdfY2hlY2tvdXRfZmxvd1wiLCBmYWxzZSk7XG4gKiAgIHJldHVybiBuZXdGbG93ID8gPE5ld0NoZWNrb3V0IC8+IDogPExlZ2FjeUNoZWNrb3V0IC8+O1xuICogfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNdWx0aS12YWx1ZSBmbGFnIOKAlCBwYXNzIGEgbWF0Y2hpbmcgZGVmYXVsdFxuICogY29uc3QgdmFyaWFudCA9IHVzZUZsYWc8XCJjb250cm9sXCIgfCBcImJvbGRcIj4oXCJjdGFfY29weV92MVwiLCBcImNvbnRyb2xcIik7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VGbGFnKGZsYWdLZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBGbGFnVmFsdWUgPSBmYWxzZSk6IEZsYWdWYWx1ZSB7XG4gIGNvbnN0IGNsaWVudCA9IHVzZUdvYVRlY2goKTtcbiAgcmV0dXJuIGNsaWVudC5mbGFnKGZsYWdLZXksIGRlZmF1bHRWYWx1ZSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEV4cGVyaW1lbnRSZXN1bHQgfSBmcm9tIFwiQGdvYXRlY2gvc2RrLWpzXCI7XG5pbXBvcnQgeyB1c2VHb2FUZWNoIH0gZnJvbSBcIi4vdXNlLWdvYXRlY2guanNcIjtcblxuLyoqXG4gKiBHZXQgdGhlIGJ1Y2tldGVkIHZhcmlhbnQgKyBwYXlsb2FkIGZvciBhbiBleHBlcmltZW50LiBBc3NpZ25tZW50IGlzXG4gKiBzdGlja3kgcGVyIGRldmljZS4gRmlyZXMgYCRleHBvc3VyZWAgb25jZSBwZXIgc2Vzc2lvbiBwZXIgZXhwZXJpbWVudFxuICogdGhlIGZpcnN0IHRpbWUgaXQgcmVzb2x2ZXMgdG8gYSBub24tY29udHJvbCB2YXJpYW50LlxuICpcbiAqIEBwYXJhbSBleHBlcmltZW50S2V5IC0gRXhwZXJpbWVudCBrZXkgZGVjbGFyZWQgaW4gdGhlIEdvYVRlY2ggZGFzaGJvYXJkLlxuICogQHJldHVybnMgYHsgdmFyaWFudDogc3RyaW5nLCBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9YC5cbiAqICAgYHZhcmlhbnRgIGZhbGxzIGJhY2sgdG8gYFwiY29udHJvbFwiYCB1bnRpbCB0aGUgU0RLIGNvbmZpZyBsb2Fkcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogZnVuY3Rpb24gSGVyb0gxKCkge1xuICogICBjb25zdCB7IHZhcmlhbnQsIHBheWxvYWQgfSA9IHVzZUV4cGVyaW1lbnQoXCJoZXJvX2gxX2NvcHlfdjFcIik7XG4gKiAgIGlmICh2YXJpYW50ID09PSBcImNvbnRyb2xcIikgcmV0dXJuIDxoMT5TaGlwIGZhc3Rlci48L2gxPjtcbiAqICAgcmV0dXJuIDxoMT57KHBheWxvYWQgYXMgeyBoZWFkbGluZTogc3RyaW5nIH0pLmhlYWRsaW5lfTwvaDE+O1xuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRXhwZXJpbWVudChleHBlcmltZW50S2V5OiBzdHJpbmcpOiBFeHBlcmltZW50UmVzdWx0IHtcbiAgY29uc3QgY2xpZW50ID0gdXNlR29hVGVjaCgpO1xuICByZXR1cm4gY2xpZW50LmV4cGVyaW1lbnQoZXhwZXJpbWVudEtleSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBGbGFnVmFsdWUgfSBmcm9tIFwiQGdvYXRlY2gvc2RrLWpzXCI7XG5pbXBvcnQgeyB1c2VGbGFnIH0gZnJvbSBcIi4uL2hvb2tzL3VzZS1mbGFnLmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZVByb3BzIHtcbiAgLyoqIFRoZSBmbGFnIGtleSB0byBldmFsdWF0ZSAqL1xuICBmbGFnS2V5OiBzdHJpbmc7XG4gIC8qKiBSZW5kZXIgd2hlbiBmbGFnIGlzIHRydXRoeSAob3IgbWF0Y2hlcyBgbWF0Y2hgIHZhbHVlKSAqL1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICAvKiogT3B0aW9uYWwgZmFsbGJhY2sgd2hlbiBmbGFnIGlzIGZhbHN5ICovXG4gIGZhbGxiYWNrPzogUmVhY3ROb2RlO1xuICAvKiogT3B0aW9uYWw6IG1hdGNoIGEgc3BlY2lmaWMgdmFsdWUgaW5zdGVhZCBvZiB0cnV0aHkgY2hlY2sgKi9cbiAgbWF0Y2g/OiBGbGFnVmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGZWF0dXJlKHsgZmxhZ0tleSwgY2hpbGRyZW4sIGZhbGxiYWNrID0gbnVsbCwgbWF0Y2ggfTogRmVhdHVyZVByb3BzKSB7XG4gIGNvbnN0IHZhbHVlID0gdXNlRmxhZyhmbGFnS2V5LCBmYWxzZSk7XG4gIGNvbnN0IGlzTWF0Y2ggPSBtYXRjaCAhPT0gdW5kZWZpbmVkID8gdmFsdWUgPT09IG1hdGNoIDogQm9vbGVhbih2YWx1ZSk7XG4gIHJldHVybiA8Pntpc01hdGNoID8gY2hpbGRyZW4gOiBmYWxsYmFja308Lz47XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBFeHBlcmltZW50UmVzdWx0IH0gZnJvbSBcIkBnb2F0ZWNoL3Nkay1qc1wiO1xuaW1wb3J0IHsgdXNlRXhwZXJpbWVudCB9IGZyb20gXCIuLi9ob29rcy91c2UtZXhwZXJpbWVudC5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4cGVyaW1lbnRQcm9wcyB7XG4gIC8qKiBUaGUgZXhwZXJpbWVudCBrZXkgKi9cbiAgZXhwZXJpbWVudEtleTogc3RyaW5nO1xuICAvKiogTWFwIHZhcmlhbnQga2V5IC0+IFJlYWN0Tm9kZSAoc2ltcGxlIG1vZGUpLiAqL1xuICB2YXJpYW50cz86IFJlY29yZDxzdHJpbmcsIFJlYWN0Tm9kZT47XG4gIC8qKiBSZW5kZXIgcHJvcCBhbHRlcm5hdGl2ZSDigJQgcmVjZWl2ZXMgeyB2YXJpYW50LCBwYXlsb2FkIH0uICovXG4gIGNoaWxkcmVuPzogKHJlc3VsdDogRXhwZXJpbWVudFJlc3VsdCkgPT4gUmVhY3ROb2RlO1xuICAvKiogRmFsbGJhY2sgaWYgbm8gdmFyaWFudCBtYXRjaGVzIChkZWZhdWx0cyB0byBcImNvbnRyb2xcIiB2YXJpYW50IG9yIG51bGwpICovXG4gIGZhbGxiYWNrPzogUmVhY3ROb2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRXhwZXJpbWVudCh7IGV4cGVyaW1lbnRLZXksIHZhcmlhbnRzLCBjaGlsZHJlbiwgZmFsbGJhY2sgfTogRXhwZXJpbWVudFByb3BzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHVzZUV4cGVyaW1lbnQoZXhwZXJpbWVudEtleSk7XG5cbiAgLy8gUmVuZGVyIHByb3AgbW9kZSDigJQgY29uc3VtZXIgZ2V0cyBmdWxsIHBheWxvYWQgYWNjZXNzXG4gIGlmIChjaGlsZHJlbikge1xuICAgIHJldHVybiA8PntjaGlsZHJlbihyZXN1bHQpfTwvPjtcbiAgfVxuXG4gIC8vIFZhcmlhbnQgbWFwIG1vZGVcbiAgaWYgKHZhcmlhbnRzICYmIHJlc3VsdC52YXJpYW50IGluIHZhcmlhbnRzKSB7XG4gICAgcmV0dXJuIDw+e3ZhcmlhbnRzW3Jlc3VsdC52YXJpYW50XX08Lz47XG4gIH1cblxuICByZXR1cm4gPD57ZmFsbGJhY2sgPz8gdmFyaWFudHM/LltcImNvbnRyb2xcIl0gPz8gbnVsbH08Lz47XG59XG4iLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlR29hVGVjaCB9IGZyb20gXCIuLi9ob29rcy91c2UtZ29hdGVjaC5qc1wiO1xuaW1wb3J0IHsgdXNlVHJhY2sgfSBmcm9tIFwiLi4vaG9va3MvdXNlLXRyYWNrLmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVZpZXdUcmFja2VyUHJvcHMge1xuICAvKiogQ3VycmVudCBwYXRobmFtZSDigJQgcGFzcyBmcm9tIHlvdXIgcm91dGVyIChlLmcuLCBOZXh0LmpzIHVzZVBhdGhuYW1lKCkpLiAqL1xuICBwYXRobmFtZTogc3RyaW5nO1xuICAvKiogQ3VycmVudCBzZWFyY2ggcGFyYW1zIHN0cmluZyAob3B0aW9uYWwpLiAqL1xuICBzZWFyY2hQYXJhbXM/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHJhY2sgcGFnZSB2aWV3cyBvbiByb3V0ZSBjaGFuZ2UuXG4gKlxuICogRW1pdHMgdHdvIGV2ZW50cyBwZXIgcm91dGUgY2hhbmdlOlxuICpcbiAqICAgLSBgJHBhZ2VfbGVhdmVgIGZvciB0aGUgcHJpb3Igcm91dGUsIHdpdGggYHRpbWVfb25fcGFnZV9tc2AsXG4gKiAgICAgYG1heF9zY3JvbGxfcGN0YCwgYHRhYl9oaWRkZW5fY291bnRgLCBldGMuIChlbWl0dGVkIGJ5XG4gKiAgICAgYGNsaWVudC5yZWNvcmRQYWdlVmlldygpYCB2aWEgdGhlIFNESydzIGBMaWZlY3ljbGVNYW5hZ2VyYCkuXG4gKiAgIC0gYCRwYWdlX3ZpZXdgIGZvciB0aGUgbmV3IHJvdXRlLlxuICpcbiAqIFRoZSBvcmRlciBtYXR0ZXJzIOKAlCBsZWF2ZSBiZWZvcmUgdmlldyDigJQgc28gdGhlIGxlYXZlIGV2ZW50IGNhcnJpZXNcbiAqIHRoZSBwcmV2aW91cyBwYXRoLCBhbmQgdGhlIHZpZXcgbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBuZXcgcGFnZSdzXG4gKiBkd2VsbCB3aW5kb3cuIEJvdGggZXZlbnRzIGVuZCB1cCBpbiBgZXZlbnRzX3Jhd2Agc28gZnVubmVscyBjYW5cbiAqIGZpbHRlciBhdCBlaXRoZXIgZ3JhaW4uXG4gKlxuICogVW5saWtlIHRoZSB3ZWItYXBwIHZlcnNpb24sIHRoaXMgY29tcG9uZW50IGRvZXMgTk9UIGltcG9ydFxuICogYG5leHQvbmF2aWdhdGlvbmAgZGlyZWN0bHkg4oCUIHRoZSBjYWxsZXIgcHJvdmlkZXMgcGF0aG5hbWUgYW5kXG4gKiBzZWFyY2hQYXJhbXMgc28gaXQgd29ya3Mgd2l0aCBhbnkgcm91dGVyIChOZXh0LmpzLCBSZWFjdCBSb3V0ZXIsXG4gKiBUYW5TdGFjayBSb3V0ZXIsIGV0Yy4pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUGFnZVZpZXdUcmFja2VyKHsgcGF0aG5hbWUsIHNlYXJjaFBhcmFtcyB9OiBQYWdlVmlld1RyYWNrZXJQcm9wcykge1xuICBjb25zdCBjbGllbnQgPSB1c2VHb2FUZWNoKCk7XG4gIGNvbnN0IHRyYWNrID0gdXNlVHJhY2soKTtcbiAgY29uc3QgbGFzdFBhdGhSZWYgPSB1c2VSZWY8c3RyaW5nPihcIlwiKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gc2VhcmNoUGFyYW1zID8gYCR7cGF0aG5hbWV9PyR7c2VhcmNoUGFyYW1zfWAgOiBwYXRobmFtZTtcbiAgICBpZiAoZnVsbFBhdGggPT09IGxhc3RQYXRoUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBsYXN0UGF0aFJlZi5jdXJyZW50ID0gZnVsbFBhdGg7XG5cbiAgICAvLyBUZWxsIHRoZSBTREsgZmlyc3Qgc28gaXQgY2FuIGVtaXQgYCRwYWdlX2xlYXZlYCBmb3IgdGhlIHByaW9yXG4gICAgLy8gcGF0aCAoaWYgYW55KSBiZWZvcmUgd2Ugc3RhbXAgdGhlIG5ldyBgJHBhZ2Vfdmlld2AuXG4gICAgY2xpZW50LnJlY29yZFBhZ2VWaWV3KGZ1bGxQYXRoKTtcblxuICAgIHRyYWNrKFwiJHBhZ2Vfdmlld1wiLCB7XG4gICAgICBwYXRoOiBwYXRobmFtZSxcbiAgICAgIHVybDogZnVsbFBhdGgsXG4gICAgICByZWZlcnJlcjogdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiID8gZG9jdW1lbnQucmVmZXJyZXIgfHwgbnVsbCA6IG51bGwsXG4gICAgICB0aXRsZTogdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiID8gZG9jdW1lbnQudGl0bGUgfHwgbnVsbCA6IG51bGwsXG4gICAgfSk7XG4gIH0sIFtwYXRobmFtZSwgc2VhcmNoUGFyYW1zLCBjbGllbnQsIHRyYWNrXSk7XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIHR5cGUgRXJyb3JJbmZvLCB0eXBlIFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBJR29hVGVjaCB9IGZyb20gXCJAZ29hdGVjaC9zZGstanNcIjtcbmltcG9ydCB7IEdvYVRlY2hDb250ZXh0IH0gZnJvbSBcIi4uL2NvbnRleHQuanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckJvdW5kYXJ5UHJvcHMge1xuICAvKipcbiAgICogUmVuZGVyZWQgd2hlbiBhIGRlc2NlbmRhbnQgcmVuZGVyIHRocm93cy4gUmVjZWl2ZXMgdGhlIGVycm9yIGFuZCBhXG4gICAqIGByZXNldCgpYCBmdW5jdGlvbiB0byBjbGVhciB0aGUgYm91bmRhcnkgc3RhdGUuIElmIG9taXR0ZWQsIGNoaWxkcmVuXG4gICAqIGFyZSBoaWRkZW4gYWZ0ZXIgYSBjcmFzaCAobnVsbCBmYWxsYmFjaykuXG4gICAqL1xuICBmYWxsYmFjaz86IFJlYWN0Tm9kZSB8ICgoc3RhdGU6IHsgZXJyb3I6IEVycm9yOyByZXNldDogKCkgPT4gdm9pZCB9KSA9PiBSZWFjdE5vZGUpO1xuICAvKipcbiAgICogQ2FsbGVkIHdpdGggdGhlIGNhcHR1cmVkIGVycm9yIEFGVEVSIGl0IGhhcyBiZWVuIGZvcndhcmRlZCB0byBHb2FUZWNoLlxuICAgKiBVc2VmdWwgZm9yIHN1cmZhY2luZyBhIHRvYXN0IG9yIGZvcndhcmRpbmcgdG8gYW5vdGhlciB0ZWxlbWV0cnkgc3lzdGVtLlxuICAgKi9cbiAgb25FcnJvcj86IChlcnJvcjogRXJyb3IsIGluZm86IEVycm9ySW5mbykgPT4gdm9pZDtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbn1cblxuaW50ZXJmYWNlIFN0YXRlIHtcbiAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZWFjdCBFcnJvckJvdW5kYXJ5IHRoYXQgZm9yd2FyZHMgcmVuZGVyLXRpbWUgY3Jhc2hlcyB0byBHb2FUZWNoIGFzXG4gKiBgJGVycm9yYCBldmVudHMuIFVzZSBpdCB0byB3cmFwIGFueSBzdWItdHJlZSB3aG9zZSBjcmFzaGVzIHdvdWxkXG4gKiBvdGhlcndpc2UgcHJvZHVjZSBhIGJsYW5rIHBhZ2UgKG9yIHRoZSBOZXh0LmpzIHJvb3QgZXJyb3Igc2NyZWVuKS5cbiAqXG4gKiAgIDxHb2FUZWNoUHJvdmlkZXIgLi4uPlxuICogICAgIDxFcnJvckJvdW5kYXJ5IGZhbGxiYWNrPXs8RmF0YWxFcnJvciAvPn0+XG4gKiAgICAgICA8QXBwIC8+XG4gKiAgICAgPC9FcnJvckJvdW5kYXJ5PlxuICogICA8L0dvYVRlY2hQcm92aWRlcj5cbiAqXG4gKiBSZWFjaGVzIHRoZSBHb2FUZWNoIGNsaWVudCB2aWEgY29udGV4dCBzbyBubyBleHBsaWNpdCB3aXJpbmcgaXMgbmVlZGVkLlxuICovXG5leHBvcnQgY2xhc3MgRXJyb3JCb3VuZGFyeSBleHRlbmRzIENvbXBvbmVudDxFcnJvckJvdW5kYXJ5UHJvcHMsIFN0YXRlPiB7XG4gIHN0YXRpYyBjb250ZXh0VHlwZSA9IEdvYVRlY2hDb250ZXh0O1xuICBkZWNsYXJlIGNvbnRleHQ6IElHb2FUZWNoO1xuXG4gIHN0YXRlOiBTdGF0ZSA9IHsgZXJyb3I6IG51bGwgfTtcblxuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yOiBFcnJvcik6IFN0YXRlIHtcbiAgICByZXR1cm4geyBlcnJvciB9O1xuICB9XG5cbiAgY29tcG9uZW50RGlkQ2F0Y2goZXJyb3I6IEVycm9yLCBpbmZvOiBFcnJvckluZm8pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5jb250ZXh0LnRyYWNrKFwiJGVycm9yXCIsIHtcbiAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrID8gZXJyb3Iuc3RhY2suc2xpY2UoMCwgNDA5NikgOiBudWxsLFxuICAgICAgICBjb21wb25lbnRfc3RhY2s6IGluZm8uY29tcG9uZW50U3RhY2sgPyBpbmZvLmNvbXBvbmVudFN0YWNrLnNsaWNlKDAsIDQwOTYpIDogbnVsbCxcbiAgICAgICAgdHlwZTogXCJyZWFjdF9ib3VuZGFyeVwiLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBOZXZlciBsZXQgdGVsZW1ldHJ5IGJyZWFrIHRoZSBmYWxsYmFjayByZW5kZXIuXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLnByb3BzLm9uRXJyb3I/LihlcnJvciwgaW5mbyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBVc2VyIGNhbGxiYWNrIGlzIHVudHJ1c3RlZC5cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHJlc2V0ID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvcjogbnVsbCB9KTtcbiAgfTtcblxuICByZW5kZXIoKTogUmVhY3ROb2RlIHtcbiAgICBjb25zdCB7IGVycm9yIH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmICghZXJyb3IpIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuXG4gICAgY29uc3QgeyBmYWxsYmFjayB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAodHlwZW9mIGZhbGxiYWNrID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBmYWxsYmFjayh7IGVycm9yLCByZXNldDogdGhpcy5yZXNldCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbGxiYWNrID8/IG51bGw7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,11 @@
1
+ import { IGoaTech } from '@goatech/sdk-js';
2
+
3
+ /**
4
+ * Silent no-op client. Used when:
5
+ * - SDK is not yet initialized (SSR, initial render)
6
+ * - API key is not configured (local dev)
7
+ * - Tests that don't care about analytics
8
+ */
9
+ declare const noopClient: IGoaTech;
10
+
11
+ export { noopClient as n };
@@ -0,0 +1,11 @@
1
+ import { IGoaTech } from '@goatech/sdk-js';
2
+
3
+ /**
4
+ * Silent no-op client. Used when:
5
+ * - SDK is not yet initialized (SSR, initial render)
6
+ * - API key is not configured (local dev)
7
+ * - Tests that don't care about analytics
8
+ */
9
+ declare const noopClient: IGoaTech;
10
+
11
+ export { noopClient as n };
@@ -0,0 +1,23 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+ import { IGoaTech } from '@goatech/sdk-js';
4
+ export { n as noopClient } from './noop-client-CIawzLT5.mjs';
5
+
6
+ interface TestProviderProps {
7
+ /** Partial client — missing methods fall back to noopClient. */
8
+ client?: Partial<IGoaTech>;
9
+ children: ReactNode;
10
+ }
11
+ /**
12
+ * Test-only provider. Inject a mock or partial client for unit tests.
13
+ * Import from `@goatech/react/test` to avoid bundling test utils in production.
14
+ */
15
+ declare function TestProvider({ client, children }: TestProviderProps): react_jsx_runtime.JSX.Element;
16
+ /**
17
+ * Create a mock client with vi.fn() spies for all methods.
18
+ * Pass a `fn` factory (e.g., `vi.fn`) to create spy functions.
19
+ * Defaults to plain no-op functions if no factory is provided.
20
+ */
21
+ declare function createMockClient(overrides?: Partial<IGoaTech>, fn?: () => (...args: unknown[]) => unknown): IGoaTech;
22
+
23
+ export { TestProvider, type TestProviderProps, createMockClient };
package/dist/test.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+ import { IGoaTech } from '@goatech/sdk-js';
4
+ export { n as noopClient } from './noop-client-CIawzLT5.js';
5
+
6
+ interface TestProviderProps {
7
+ /** Partial client — missing methods fall back to noopClient. */
8
+ client?: Partial<IGoaTech>;
9
+ children: ReactNode;
10
+ }
11
+ /**
12
+ * Test-only provider. Inject a mock or partial client for unit tests.
13
+ * Import from `@goatech/react/test` to avoid bundling test utils in production.
14
+ */
15
+ declare function TestProvider({ client, children }: TestProviderProps): react_jsx_runtime.JSX.Element;
16
+ /**
17
+ * Create a mock client with vi.fn() spies for all methods.
18
+ * Pass a `fn` factory (e.g., `vi.fn`) to create spy functions.
19
+ * Defaults to plain no-op functions if no factory is provided.
20
+ */
21
+ declare function createMockClient(overrides?: Partial<IGoaTech>, fn?: () => (...args: unknown[]) => unknown): IGoaTech;
22
+
23
+ export { TestProvider, type TestProviderProps, createMockClient };
package/dist/test.js ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),sdkJs=require('@goatech/sdk-js'),jsxRuntime=require('react/jsx-runtime');var d=new sdkJs.DiagnosticBus(0),t={track:()=>{},identify:()=>{},reset:()=>{},flag:(r,o=false)=>o,experiment:()=>({variant:"control"}),overrideFlag:()=>{},clearOverrides:()=>{},getOverrides:()=>({}),flush:()=>Promise.resolve(),recordPageView:()=>{},status:()=>({initialized:false,online:false,queueDepth:0,offlineQueueDepth:0,lastFlushAt:null,deviceId:null,userId:null,flagCount:0,experimentCount:0,sdkVersion:"noop"}),destroy:()=>{},diagnostics:()=>d,getRecentDiagnostics:()=>[]};var l=react.createContext(t);function f({client:r,children:o}){let e={...t,...r};return jsxRuntime.jsx(l.Provider,{value:e,children:o})}function g(r,o=()=>()=>{}){let e=o,n=e(),s=e(),i=e(),a=e();n.mockReturnValue?.(false),s.mockReturnValue?.({variant:"control"}),i.mockResolvedValue?.(void 0),a.mockReturnValue?.({initialized:true});let u=e(),c=e();return c.mockReturnValue?.([]),{track:e(),identify:e(),reset:e(),flag:n,experiment:s,flush:i,recordPageView:e(),status:a,destroy:e(),diagnostics:u,getRecentDiagnostics:c,...r}}exports.TestProvider=f;exports.createMockClient=g;exports.noopClient=t;//# sourceMappingURL=test.js.map
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9ub29wLWNsaWVudC50cyIsIi4uL3NyYy9jb250ZXh0LnRzIiwiLi4vc3JjL3Rlc3QtcHJvdmlkZXIudHN4Il0sIm5hbWVzIjpbIm5vb3BCdXMiLCJEaWFnbm9zdGljQnVzIiwibm9vcENsaWVudCIsIl9rZXkiLCJkZWZhdWx0VmFsdWUiLCJHb2FUZWNoQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJUZXN0UHJvdmlkZXIiLCJjbGllbnQiLCJjaGlsZHJlbiIsIm1lcmdlZCIsImpzeCIsImNyZWF0ZU1vY2tDbGllbnQiLCJvdmVycmlkZXMiLCJmbiIsIm1vY2tGbiIsImZsYWciLCJleHBlcmltZW50IiwiZmx1c2giLCJzdGF0dXMiLCJkaWFnbm9zdGljc0ZuIiwiZ2V0UmVjZW50RGlhZ25vc3RpY3NGbiJdLCJtYXBwaW5ncyI6ImlIQUlBLElBQU1BLENBQUFBLENBQVUsSUFBSUMsbUJBQUFBLENBQWMsQ0FBQyxFQVF0QkMsQ0FBQUEsQ0FBdUIsQ0FDbEMsS0FBQSxDQUFPLElBQU0sQ0FBQyxDQUFBLENBQ2QsU0FBVSxJQUFNLENBQUMsQ0FBQSxDQUNqQixLQUFBLENBQU8sSUFBTSxDQUFDLEVBQ2QsSUFBQSxDQUFNLENBQUNDLENBQUFBLENBQWNDLENBQUFBLENBQTBCLEtBQUEsR0FBVUEsQ0FBQUEsQ0FDekQsV0FBWSxLQUF5QixDQUFFLE9BQUEsQ0FBUyxTQUFVLENBQUEsQ0FBQSxDQUMxRCxZQUFBLENBQWMsSUFBTSxDQUFDLENBQUEsQ0FDckIsY0FBQSxDQUFnQixJQUFNLENBQUMsQ0FBQSxDQUN2QixhQUFjLEtBQU8sRUFBQyxDQUFBLENBQ3RCLEtBQUEsQ0FBTyxJQUFNLE9BQUEsQ0FBUSxTQUFRLENBQzdCLGNBQUEsQ0FBZ0IsSUFBTSxDQUFDLENBQUEsQ0FDdkIsTUFBQSxDQUFRLEtBQWtCLENBQ3hCLFdBQUEsQ0FBYSxLQUFBLENBQ2IsTUFBQSxDQUFRLEtBQUEsQ0FDUixVQUFBLENBQVksRUFDWixpQkFBQSxDQUFtQixDQUFBLENBQ25CLFdBQUEsQ0FBYSxJQUFBLENBQ2IsUUFBQSxDQUFVLElBQUEsQ0FDVixPQUFRLElBQUEsQ0FDUixTQUFBLENBQVcsQ0FBQSxDQUNYLGVBQUEsQ0FBaUIsQ0FBQSxDQUNqQixVQUFBLENBQVksTUFDZCxDQUFBLENBQUEsQ0FDQSxPQUFBLENBQVMsSUFBTSxDQUFDLENBQUEsQ0FDaEIsV0FBQSxDQUFhLElBQU1KLENBQUFBLENBQ25CLG9CQUFBLENBQXNCLElBQU0sRUFDOUIsRUM5Qk8sSUFBTUssQ0FBQUEsQ0FBaUJDLG1CQUFBQSxDQUF3QkosQ0FBVSxDQUFBLENDT3pELFNBQVNLLENBQUFBLENBQWEsQ0FBRSxNQUFBLENBQUFDLENBQUFBLENBQVEsUUFBQSxDQUFBQyxDQUFTLENBQUEsQ0FBc0IsQ0FDcEUsSUFBTUMsQ0FBQUEsQ0FBbUIsQ0FBRSxHQUFHUixFQUFZLEdBQUdNLENBQU8sQ0FBQSxDQUNwRCxPQUFPRyxjQUFBQSxDQUFDTixDQUFBQSxDQUFlLFNBQWYsQ0FBd0IsS0FBQSxDQUFPSyxDQUFBQSxDQUFTLFFBQUEsQ0FBQUQsQ0FBQUEsQ0FBUyxDQUMzRCxDQU9PLFNBQVNHLENBQUFBLENBQ2RDLENBQUFBLENBQ0FDLENBQUFBLENBQTRDLElBQU0sSUFBTSxDQUFDLENBQUEsQ0FDL0MsQ0FDVixJQUFNQyxDQUFBQSxDQUFTRCxDQUFBQSxDQUlURSxDQUFBQSxDQUFPRCxHQUFPLENBQ2RFLENBQUFBLENBQWFGLENBQUFBLEVBQU8sQ0FDcEJHLENBQUFBLENBQVFILENBQUFBLEdBQ1JJLENBQUFBLENBQVNKLENBQUFBLEVBQU8sQ0FDdEJDLENBQUFBLENBQUssZUFBQSxHQUFrQixLQUFLLEVBQzVCQyxDQUFBQSxDQUFXLGVBQUEsR0FBa0IsQ0FBRSxPQUFBLENBQVMsU0FBVSxDQUFDLEVBQ25EQyxDQUFBQSxDQUFNLGlCQUFBLEdBQW9CLE1BQVMsQ0FBQSxDQUNuQ0MsQ0FBQUEsQ0FBTyxlQUFBLEdBQWtCLENBQUUsV0FBQSxDQUFhLElBQUssQ0FBQyxDQUFBLENBQzlDLElBQU1DLENBQUFBLENBQWdCTCxHQUFPLENBQ3ZCTSxDQUFBQSxDQUF5Qk4sQ0FBQUEsRUFBTyxDQUN0QyxPQUFBTSxDQUFBQSxDQUF1QixrQkFBa0IsRUFBRSxDQUFBLENBQ3BDLENBQ0wsS0FBQSxDQUFPTixDQUFBQSxHQUNQLFFBQUEsQ0FBVUEsQ0FBQUEsRUFBTyxDQUNqQixLQUFBLENBQU9BLENBQUFBLEVBQU8sQ0FDZCxLQUFBQyxDQUFBQSxDQUNBLFVBQUEsQ0FBQUMsQ0FBQUEsQ0FDQSxLQUFBLENBQUFDLENBQUFBLENBQ0EsY0FBQSxDQUFnQkgsR0FBTyxDQUN2QixNQUFBLENBQUFJLENBQUFBLENBQ0EsT0FBQSxDQUFTSixDQUFBQSxFQUFPLENBQ2hCLFdBQUEsQ0FBYUssQ0FBQUEsQ0FDYixvQkFBQSxDQUFzQkMsQ0FBQUEsQ0FDdEIsR0FBR1IsQ0FDTCxDQUNGIiwiZmlsZSI6InRlc3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IElHb2FUZWNoIH0gZnJvbSBcIkBnb2F0ZWNoL3Nkay1qc1wiO1xuaW1wb3J0IHR5cGUgeyBGbGFnVmFsdWUsIEV4cGVyaW1lbnRSZXN1bHQsIFNES1N0YXR1cyB9IGZyb20gXCJAZ29hdGVjaC9zZGstanNcIjtcbmltcG9ydCB7IERpYWdub3N0aWNCdXMgfSBmcm9tIFwiQGdvYXRlY2gvc2RrLWpzXCI7XG5cbmNvbnN0IG5vb3BCdXMgPSBuZXcgRGlhZ25vc3RpY0J1cygwKTtcblxuLyoqXG4gKiBTaWxlbnQgbm8tb3AgY2xpZW50LiBVc2VkIHdoZW46XG4gKiAtIFNESyBpcyBub3QgeWV0IGluaXRpYWxpemVkIChTU1IsIGluaXRpYWwgcmVuZGVyKVxuICogLSBBUEkga2V5IGlzIG5vdCBjb25maWd1cmVkIChsb2NhbCBkZXYpXG4gKiAtIFRlc3RzIHRoYXQgZG9uJ3QgY2FyZSBhYm91dCBhbmFseXRpY3NcbiAqL1xuZXhwb3J0IGNvbnN0IG5vb3BDbGllbnQ6IElHb2FUZWNoID0ge1xuICB0cmFjazogKCkgPT4ge30sXG4gIGlkZW50aWZ5OiAoKSA9PiB7fSxcbiAgcmVzZXQ6ICgpID0+IHt9LFxuICBmbGFnOiAoX2tleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IEZsYWdWYWx1ZSA9IGZhbHNlKSA9PiBkZWZhdWx0VmFsdWUsXG4gIGV4cGVyaW1lbnQ6ICgpOiBFeHBlcmltZW50UmVzdWx0ID0+ICh7IHZhcmlhbnQ6IFwiY29udHJvbFwiIH0pLFxuICBvdmVycmlkZUZsYWc6ICgpID0+IHt9LFxuICBjbGVhck92ZXJyaWRlczogKCkgPT4ge30sXG4gIGdldE92ZXJyaWRlczogKCkgPT4gKHt9KSxcbiAgZmx1c2g6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLFxuICByZWNvcmRQYWdlVmlldzogKCkgPT4ge30sXG4gIHN0YXR1czogKCk6IFNES1N0YXR1cyA9PiAoe1xuICAgIGluaXRpYWxpemVkOiBmYWxzZSxcbiAgICBvbmxpbmU6IGZhbHNlLFxuICAgIHF1ZXVlRGVwdGg6IDAsXG4gICAgb2ZmbGluZVF1ZXVlRGVwdGg6IDAsXG4gICAgbGFzdEZsdXNoQXQ6IG51bGwsXG4gICAgZGV2aWNlSWQ6IG51bGwsXG4gICAgdXNlcklkOiBudWxsLFxuICAgIGZsYWdDb3VudDogMCxcbiAgICBleHBlcmltZW50Q291bnQ6IDAsXG4gICAgc2RrVmVyc2lvbjogXCJub29wXCIsXG4gIH0pLFxuICBkZXN0cm95OiAoKSA9PiB7fSxcbiAgZGlhZ25vc3RpY3M6ICgpID0+IG5vb3BCdXMsXG4gIGdldFJlY2VudERpYWdub3N0aWNzOiAoKSA9PiBbXSxcbn07XG4iLCJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IElHb2FUZWNoIH0gZnJvbSBcIkBnb2F0ZWNoL3Nkay1qc1wiO1xuaW1wb3J0IHsgbm9vcENsaWVudCB9IGZyb20gXCIuL25vb3AtY2xpZW50LmpzXCI7XG5cbi8qKlxuICogSW50ZXJuYWwgY29udGV4dCDigJQgY29uc3VtZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VHb2FUZWNoKClgIGhvb2suXG4gKiBFeHBvcnRlZCBvbmx5IGZvciBUZXN0UHJvdmlkZXIgdG8gaW5qZWN0IGEgbW9jayBjbGllbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBHb2FUZWNoQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8SUdvYVRlY2g+KG5vb3BDbGllbnQpO1xuIiwiaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgSUdvYVRlY2ggfSBmcm9tIFwiQGdvYXRlY2gvc2RrLWpzXCI7XG5pbXBvcnQgeyBHb2FUZWNoQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHQuanNcIjtcbmltcG9ydCB7IG5vb3BDbGllbnQgfSBmcm9tIFwiLi9ub29wLWNsaWVudC5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RQcm92aWRlclByb3BzIHtcbiAgLyoqIFBhcnRpYWwgY2xpZW50IOKAlCBtaXNzaW5nIG1ldGhvZHMgZmFsbCBiYWNrIHRvIG5vb3BDbGllbnQuICovXG4gIGNsaWVudD86IFBhcnRpYWw8SUdvYVRlY2g+O1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xufVxuXG4vKipcbiAqIFRlc3Qtb25seSBwcm92aWRlci4gSW5qZWN0IGEgbW9jayBvciBwYXJ0aWFsIGNsaWVudCBmb3IgdW5pdCB0ZXN0cy5cbiAqIEltcG9ydCBmcm9tIGBAZ29hdGVjaC9yZWFjdC90ZXN0YCB0byBhdm9pZCBidW5kbGluZyB0ZXN0IHV0aWxzIGluIHByb2R1Y3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUZXN0UHJvdmlkZXIoeyBjbGllbnQsIGNoaWxkcmVuIH06IFRlc3RQcm92aWRlclByb3BzKSB7XG4gIGNvbnN0IG1lcmdlZDogSUdvYVRlY2ggPSB7IC4uLm5vb3BDbGllbnQsIC4uLmNsaWVudCB9O1xuICByZXR1cm4gPEdvYVRlY2hDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXttZXJnZWR9PntjaGlsZHJlbn08L0dvYVRlY2hDb250ZXh0LlByb3ZpZGVyPjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBtb2NrIGNsaWVudCB3aXRoIHZpLmZuKCkgc3BpZXMgZm9yIGFsbCBtZXRob2RzLlxuICogUGFzcyBhIGBmbmAgZmFjdG9yeSAoZS5nLiwgYHZpLmZuYCkgdG8gY3JlYXRlIHNweSBmdW5jdGlvbnMuXG4gKiBEZWZhdWx0cyB0byBwbGFpbiBuby1vcCBmdW5jdGlvbnMgaWYgbm8gZmFjdG9yeSBpcyBwcm92aWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tDbGllbnQoXG4gIG92ZXJyaWRlcz86IFBhcnRpYWw8SUdvYVRlY2g+LFxuICBmbjogKCkgPT4gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93biA9ICgpID0+ICgpID0+IHt9LFxuKTogSUdvYVRlY2gge1xuICBjb25zdCBtb2NrRm4gPSBmbiBhcyAoKSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBmbj4gJiB7XG4gICAgbW9ja1JldHVyblZhbHVlPzogKHY6IHVua25vd24pID0+IHVua25vd247XG4gICAgbW9ja1Jlc29sdmVkVmFsdWU/OiAodjogdW5rbm93bikgPT4gdW5rbm93bjtcbiAgfTtcbiAgY29uc3QgZmxhZyA9IG1vY2tGbigpO1xuICBjb25zdCBleHBlcmltZW50ID0gbW9ja0ZuKCk7XG4gIGNvbnN0IGZsdXNoID0gbW9ja0ZuKCk7XG4gIGNvbnN0IHN0YXR1cyA9IG1vY2tGbigpO1xuICBmbGFnLm1vY2tSZXR1cm5WYWx1ZT8uKGZhbHNlKTtcbiAgZXhwZXJpbWVudC5tb2NrUmV0dXJuVmFsdWU/Lih7IHZhcmlhbnQ6IFwiY29udHJvbFwiIH0pO1xuICBmbHVzaC5tb2NrUmVzb2x2ZWRWYWx1ZT8uKHVuZGVmaW5lZCk7XG4gIHN0YXR1cy5tb2NrUmV0dXJuVmFsdWU/Lih7IGluaXRpYWxpemVkOiB0cnVlIH0pO1xuICBjb25zdCBkaWFnbm9zdGljc0ZuID0gbW9ja0ZuKCk7XG4gIGNvbnN0IGdldFJlY2VudERpYWdub3N0aWNzRm4gPSBtb2NrRm4oKTtcbiAgZ2V0UmVjZW50RGlhZ25vc3RpY3NGbi5tb2NrUmV0dXJuVmFsdWU/LihbXSk7XG4gIHJldHVybiB7XG4gICAgdHJhY2s6IG1vY2tGbigpLFxuICAgIGlkZW50aWZ5OiBtb2NrRm4oKSxcbiAgICByZXNldDogbW9ja0ZuKCksXG4gICAgZmxhZyxcbiAgICBleHBlcmltZW50LFxuICAgIGZsdXNoLFxuICAgIHJlY29yZFBhZ2VWaWV3OiBtb2NrRm4oKSxcbiAgICBzdGF0dXMsXG4gICAgZGVzdHJveTogbW9ja0ZuKCksXG4gICAgZGlhZ25vc3RpY3M6IGRpYWdub3N0aWNzRm4sXG4gICAgZ2V0UmVjZW50RGlhZ25vc3RpY3M6IGdldFJlY2VudERpYWdub3N0aWNzRm4sXG4gICAgLi4ub3ZlcnJpZGVzLFxuICB9IGFzIElHb2FUZWNoO1xufVxuIl19
package/dist/test.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import {a,b}from'./chunk-OKZIRDLB.mjs';export{a as noopClient}from'./chunk-OKZIRDLB.mjs';import {jsx}from'react/jsx-runtime';function l({client:o,children:t}){let e={...a,...o};return jsx(b.Provider,{value:e,children:t})}function p(o,t=()=>()=>{}){let e=t,r=e(),c=e(),a=e(),i=e();r.mockReturnValue?.(false),c.mockReturnValue?.({variant:"control"}),a.mockResolvedValue?.(void 0),i.mockReturnValue?.({initialized:true});let d=e(),s=e();return s.mockReturnValue?.([]),{track:e(),identify:e(),reset:e(),flag:r,experiment:c,flush:a,recordPageView:e(),status:i,destroy:e(),diagnostics:d,getRecentDiagnostics:s,...o}}export{l as TestProvider,p as createMockClient};//# sourceMappingURL=test.mjs.map
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy90ZXN0LXByb3ZpZGVyLnRzeCJdLCJuYW1lcyI6WyJUZXN0UHJvdmlkZXIiLCJjbGllbnQiLCJjaGlsZHJlbiIsIm1lcmdlZCIsIm5vb3BDbGllbnQiLCJqc3giLCJHb2FUZWNoQ29udGV4dCIsImNyZWF0ZU1vY2tDbGllbnQiLCJvdmVycmlkZXMiLCJmbiIsIm1vY2tGbiIsImZsYWciLCJleHBlcmltZW50IiwiZmx1c2giLCJzdGF0dXMiLCJkaWFnbm9zdGljc0ZuIiwiZ2V0UmVjZW50RGlhZ25vc3RpY3NGbiJdLCJtYXBwaW5ncyI6IjZIQWVPLFNBQVNBLENBQUFBLENBQWEsQ0FBRSxNQUFBLENBQUFDLENBQUFBLENBQVEsUUFBQSxDQUFBQyxDQUFTLENBQUEsQ0FBc0IsQ0FDcEUsSUFBTUMsQ0FBQUEsQ0FBbUIsQ0FBRSxHQUFHQyxDQUFBQSxDQUFZLEdBQUdILENBQU8sQ0FBQSxDQUNwRCxPQUFPSSxHQUFBQSxDQUFDQyxDQUFBQSxDQUFlLFFBQUEsQ0FBZixDQUF3QixLQUFBLENBQU9ILENBQUFBLENBQVMsUUFBQSxDQUFBRCxDQUFBQSxDQUFTLENBQzNELENBT08sU0FBU0ssQ0FBQUEsQ0FDZEMsQ0FBQUEsQ0FDQUMsQ0FBQUEsQ0FBNEMsSUFBTSxJQUFNLENBQUMsQ0FBQSxDQUMvQyxDQUNWLElBQU1DLENBQUFBLENBQVNELENBQUFBLENBSVRFLENBQUFBLENBQU9ELENBQUFBLEVBQU8sQ0FDZEUsQ0FBQUEsQ0FBYUYsQ0FBQUEsRUFBTyxDQUNwQkcsQ0FBQUEsQ0FBUUgsQ0FBQUEsRUFBTyxDQUNmSSxDQUFBQSxDQUFTSixDQUFBQSxFQUFPLENBQ3RCQyxDQUFBQSxDQUFLLGVBQUEsR0FBa0IsS0FBSyxDQUFBLENBQzVCQyxDQUFBQSxDQUFXLGtCQUFrQixDQUFFLE9BQUEsQ0FBUyxTQUFVLENBQUMsQ0FBQSxDQUNuREMsQ0FBQUEsQ0FBTSxpQkFBQSxHQUFvQixNQUFTLENBQUEsQ0FDbkNDLENBQUFBLENBQU8sZUFBQSxHQUFrQixDQUFFLFdBQUEsQ0FBYSxJQUFLLENBQUMsQ0FBQSxDQUM5QyxJQUFNQyxDQUFBQSxDQUFnQkwsQ0FBQUEsRUFBTyxDQUN2Qk0sQ0FBQUEsQ0FBeUJOLENBQUFBLEVBQU8sQ0FDdEMsT0FBQU0sQ0FBQUEsQ0FBdUIsZUFBQSxHQUFrQixFQUFFLENBQUEsQ0FDcEMsQ0FDTCxNQUFPTixDQUFBQSxFQUFPLENBQ2QsUUFBQSxDQUFVQSxDQUFBQSxFQUFPLENBQ2pCLEtBQUEsQ0FBT0EsQ0FBQUEsRUFBTyxDQUNkLElBQUEsQ0FBQUMsQ0FBQUEsQ0FDQSxVQUFBLENBQUFDLENBQUFBLENBQ0EsS0FBQSxDQUFBQyxDQUFBQSxDQUNBLGNBQUEsQ0FBZ0JILENBQUFBLEVBQU8sQ0FDdkIsTUFBQSxDQUFBSSxDQUFBQSxDQUNBLE9BQUEsQ0FBU0osQ0FBQUEsRUFBTyxDQUNoQixXQUFBLENBQWFLLENBQUFBLENBQ2Isb0JBQUEsQ0FBc0JDLENBQUFBLENBQ3RCLEdBQUdSLENBQ0wsQ0FDRiIsImZpbGUiOiJ0ZXN0Lm1qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IElHb2FUZWNoIH0gZnJvbSBcIkBnb2F0ZWNoL3Nkay1qc1wiO1xuaW1wb3J0IHsgR29hVGVjaENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0LmpzXCI7XG5pbXBvcnQgeyBub29wQ2xpZW50IH0gZnJvbSBcIi4vbm9vcC1jbGllbnQuanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0UHJvdmlkZXJQcm9wcyB7XG4gIC8qKiBQYXJ0aWFsIGNsaWVudCDigJQgbWlzc2luZyBtZXRob2RzIGZhbGwgYmFjayB0byBub29wQ2xpZW50LiAqL1xuICBjbGllbnQ/OiBQYXJ0aWFsPElHb2FUZWNoPjtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbn1cblxuLyoqXG4gKiBUZXN0LW9ubHkgcHJvdmlkZXIuIEluamVjdCBhIG1vY2sgb3IgcGFydGlhbCBjbGllbnQgZm9yIHVuaXQgdGVzdHMuXG4gKiBJbXBvcnQgZnJvbSBgQGdvYXRlY2gvcmVhY3QvdGVzdGAgdG8gYXZvaWQgYnVuZGxpbmcgdGVzdCB1dGlscyBpbiBwcm9kdWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gVGVzdFByb3ZpZGVyKHsgY2xpZW50LCBjaGlsZHJlbiB9OiBUZXN0UHJvdmlkZXJQcm9wcykge1xuICBjb25zdCBtZXJnZWQ6IElHb2FUZWNoID0geyAuLi5ub29wQ2xpZW50LCAuLi5jbGllbnQgfTtcbiAgcmV0dXJuIDxHb2FUZWNoQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17bWVyZ2VkfT57Y2hpbGRyZW59PC9Hb2FUZWNoQ29udGV4dC5Qcm92aWRlcj47XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbW9jayBjbGllbnQgd2l0aCB2aS5mbigpIHNwaWVzIGZvciBhbGwgbWV0aG9kcy5cbiAqIFBhc3MgYSBgZm5gIGZhY3RvcnkgKGUuZy4sIGB2aS5mbmApIHRvIGNyZWF0ZSBzcHkgZnVuY3Rpb25zLlxuICogRGVmYXVsdHMgdG8gcGxhaW4gbm8tb3AgZnVuY3Rpb25zIGlmIG5vIGZhY3RvcnkgaXMgcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrQ2xpZW50KFxuICBvdmVycmlkZXM/OiBQYXJ0aWFsPElHb2FUZWNoPixcbiAgZm46ICgpID0+ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24gPSAoKSA9PiAoKSA9PiB7fSxcbik6IElHb2FUZWNoIHtcbiAgY29uc3QgbW9ja0ZuID0gZm4gYXMgKCkgPT4gUmV0dXJuVHlwZTx0eXBlb2YgZm4+ICYge1xuICAgIG1vY2tSZXR1cm5WYWx1ZT86ICh2OiB1bmtub3duKSA9PiB1bmtub3duO1xuICAgIG1vY2tSZXNvbHZlZFZhbHVlPzogKHY6IHVua25vd24pID0+IHVua25vd247XG4gIH07XG4gIGNvbnN0IGZsYWcgPSBtb2NrRm4oKTtcbiAgY29uc3QgZXhwZXJpbWVudCA9IG1vY2tGbigpO1xuICBjb25zdCBmbHVzaCA9IG1vY2tGbigpO1xuICBjb25zdCBzdGF0dXMgPSBtb2NrRm4oKTtcbiAgZmxhZy5tb2NrUmV0dXJuVmFsdWU/LihmYWxzZSk7XG4gIGV4cGVyaW1lbnQubW9ja1JldHVyblZhbHVlPy4oeyB2YXJpYW50OiBcImNvbnRyb2xcIiB9KTtcbiAgZmx1c2gubW9ja1Jlc29sdmVkVmFsdWU/Lih1bmRlZmluZWQpO1xuICBzdGF0dXMubW9ja1JldHVyblZhbHVlPy4oeyBpbml0aWFsaXplZDogdHJ1ZSB9KTtcbiAgY29uc3QgZGlhZ25vc3RpY3NGbiA9IG1vY2tGbigpO1xuICBjb25zdCBnZXRSZWNlbnREaWFnbm9zdGljc0ZuID0gbW9ja0ZuKCk7XG4gIGdldFJlY2VudERpYWdub3N0aWNzRm4ubW9ja1JldHVyblZhbHVlPy4oW10pO1xuICByZXR1cm4ge1xuICAgIHRyYWNrOiBtb2NrRm4oKSxcbiAgICBpZGVudGlmeTogbW9ja0ZuKCksXG4gICAgcmVzZXQ6IG1vY2tGbigpLFxuICAgIGZsYWcsXG4gICAgZXhwZXJpbWVudCxcbiAgICBmbHVzaCxcbiAgICByZWNvcmRQYWdlVmlldzogbW9ja0ZuKCksXG4gICAgc3RhdHVzLFxuICAgIGRlc3Ryb3k6IG1vY2tGbigpLFxuICAgIGRpYWdub3N0aWNzOiBkaWFnbm9zdGljc0ZuLFxuICAgIGdldFJlY2VudERpYWdub3N0aWNzOiBnZXRSZWNlbnREaWFnbm9zdGljc0ZuLFxuICAgIC4uLm92ZXJyaWRlcyxcbiAgfSBhcyBJR29hVGVjaDtcbn1cbiJdfQ==
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@goatech/react",
3
+ "version": "0.1.0",
4
+ "description": "GoaTech React bindings — Provider, hooks, and components for feature flags, experiments, and analytics",
5
+ "license": "MIT",
6
+ "author": "GoaTech",
7
+ "homepage": "https://goatech.ai",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/goatech-ai/GoaTech.git",
11
+ "directory": "packages/sdk-react"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/goatech-ai/GoaTech/issues"
15
+ },
16
+ "keywords": [
17
+ "goatech",
18
+ "react",
19
+ "feature-flags",
20
+ "flags",
21
+ "experiments",
22
+ "analytics",
23
+ "hooks",
24
+ "sdk"
25
+ ],
26
+ "engines": {
27
+ "node": ">=18"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "sideEffects": false,
33
+ "main": "./dist/index.js",
34
+ "module": "./dist/index.mjs",
35
+ "types": "./dist/index.d.ts",
36
+ "exports": {
37
+ ".": {
38
+ "types": "./dist/index.d.ts",
39
+ "import": "./dist/index.mjs",
40
+ "require": "./dist/index.js"
41
+ },
42
+ "./test": {
43
+ "types": "./dist/test.d.ts",
44
+ "import": "./dist/test.mjs",
45
+ "require": "./dist/test.js"
46
+ }
47
+ },
48
+ "files": [
49
+ "dist",
50
+ "README.md",
51
+ "LICENSE"
52
+ ],
53
+ "scripts": {
54
+ "build": "tsup",
55
+ "dev": "tsup --watch",
56
+ "test": "vitest run",
57
+ "lint": "eslint src --ext .ts,.tsx"
58
+ },
59
+ "peerDependencies": {
60
+ "react": ">=18.0.0",
61
+ "@goatech/sdk-js": "^0.1.0"
62
+ },
63
+ "devDependencies": {
64
+ "@goatech/sdk-js": "workspace:*",
65
+ "@testing-library/react": "^16.0.0",
66
+ "@testing-library/jest-dom": "^6.0.0",
67
+ "@testing-library/user-event": "^14.0.0",
68
+ "@types/react": "^19.0.0",
69
+ "jsdom": "^29.0.1",
70
+ "react": "^19.0.0",
71
+ "react-dom": "^19.0.0",
72
+ "tsup": "^8.0.0",
73
+ "typescript": "^5.4.0",
74
+ "vitest": "^2.0.0"
75
+ }
76
+ }