@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 +21 -0
- package/README.md +184 -0
- package/dist/chunk-OKZIRDLB.mjs +2 -0
- package/dist/index.d.mts +196 -0
- package/dist/index.d.ts +196 -0
- package/dist/index.js +2 -0
- package/dist/index.mjs +2 -0
- package/dist/noop-client-CIawzLT5.d.mts +11 -0
- package/dist/noop-client-CIawzLT5.d.ts +11 -0
- package/dist/test.d.mts +23 -0
- package/dist/test.d.ts +23 -0
- package/dist/test.js +2 -0
- package/dist/test.mjs +2 -0
- package/package.json +76 -0
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
|
package/dist/index.d.mts
ADDED
|
@@ -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 };
|
package/dist/index.d.ts
ADDED
|
@@ -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 };
|
package/dist/test.d.mts
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.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
|
+
}
|