@pendo/openfeature-web-provider 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -82
- package/dist/PendoProvider.d.ts +33 -33
- package/dist/PendoProvider.js +74 -38
- package/dist/PendoTelemetryHook.d.ts +2 -1
- package/dist/PendoTelemetryHook.js +5 -4
- package/dist/types.d.ts +22 -0
- package/dist/types.js +6 -0
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -10,15 +10,15 @@ npm install @pendo/openfeature-web-provider @openfeature/web-sdk
|
|
|
10
10
|
|
|
11
11
|
## Prerequisites
|
|
12
12
|
|
|
13
|
-
The Pendo
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
13
|
+
The Pendo Web SDK must be installed and initialized on your page with `requestSegmentFlags: true` enabled.
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
// Initialize Pendo with segment flags enabled
|
|
17
|
+
pendo.initialize({
|
|
18
|
+
visitor: { id: 'user-123' },
|
|
19
|
+
account: { id: 'account-456' },
|
|
20
|
+
requestSegmentFlags: true // Required for feature flags
|
|
21
|
+
});
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
## Usage
|
|
@@ -29,7 +29,7 @@ The Pendo agent must be installed on your page. The provider reads flags from `w
|
|
|
29
29
|
import { OpenFeature } from '@openfeature/web-sdk';
|
|
30
30
|
import { PendoProvider } from '@pendo/openfeature-web-provider';
|
|
31
31
|
|
|
32
|
-
// Initialize the provider (waits for Pendo
|
|
32
|
+
// Initialize the provider (waits for Pendo to be ready)
|
|
33
33
|
await OpenFeature.setProviderAndWait(new PendoProvider());
|
|
34
34
|
|
|
35
35
|
// Get a client
|
|
@@ -40,16 +40,16 @@ const client = OpenFeature.getClient();
|
|
|
40
40
|
|
|
41
41
|
```typescript
|
|
42
42
|
// Boolean flag
|
|
43
|
-
const showNewFeature =
|
|
43
|
+
const showNewFeature = client.getBooleanValue('new-checkout-flow', false);
|
|
44
44
|
|
|
45
45
|
// String flag (returns "on" or "off")
|
|
46
|
-
const variant =
|
|
46
|
+
const variant = client.getStringValue('checkout-variant', 'control');
|
|
47
47
|
|
|
48
48
|
// Number flag (returns 1 or 0)
|
|
49
|
-
const flagValue =
|
|
49
|
+
const flagValue = client.getNumberValue('feature-score', 0);
|
|
50
50
|
|
|
51
51
|
// Object flag (returns { enabled: true/false })
|
|
52
|
-
const config =
|
|
52
|
+
const config = client.getObjectValue('feature-config', { enabled: false });
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
### Event Tracking
|
|
@@ -57,18 +57,47 @@ const config = await client.getObjectValue('feature-config', { enabled: false })
|
|
|
57
57
|
Track custom events to Pendo:
|
|
58
58
|
|
|
59
59
|
```typescript
|
|
60
|
-
const
|
|
61
|
-
await OpenFeature.setProviderAndWait(provider);
|
|
60
|
+
const client = OpenFeature.getClient();
|
|
62
61
|
|
|
63
|
-
// Track an event
|
|
64
|
-
|
|
62
|
+
// Track an event (delegates to pendo.track)
|
|
63
|
+
client.track('checkout_started', { cartValue: '99.99' });
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Configuration Options
|
|
65
67
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
```typescript
|
|
69
|
+
const provider = new PendoProvider({
|
|
70
|
+
// Timeout waiting for the Pendo Web SDK to be ready (default: 5000ms)
|
|
71
|
+
readyTimeout: 10000,
|
|
72
|
+
});
|
|
69
73
|
```
|
|
70
74
|
|
|
71
|
-
|
|
75
|
+
## How It Works
|
|
76
|
+
|
|
77
|
+
1. The provider waits for the Pendo Web SDK to be ready
|
|
78
|
+
2. Flag evaluation checks if the flag key exists in `pendo.segmentFlags`
|
|
79
|
+
3. When Pendo updates flags (on metadata/identity changes), the provider emits `ConfigurationChanged`
|
|
80
|
+
4. React/Angular OpenFeature SDKs automatically re-render when flags change
|
|
81
|
+
|
|
82
|
+
## Automatic Flag Updates
|
|
83
|
+
|
|
84
|
+
The provider subscribes to Pendo's `Events.segmentFlagsUpdated` event to detect when flags are updated. This happens automatically when:
|
|
85
|
+
|
|
86
|
+
- Pendo initializes and loads initial flags
|
|
87
|
+
- Visitor metadata changes
|
|
88
|
+
- Visitor identity changes (via `pendo.identify()`)
|
|
89
|
+
|
|
90
|
+
When flags update, the provider emits a `ConfigurationChanged` event, which triggers re-renders in React/Angular SDKs.
|
|
91
|
+
|
|
92
|
+
## Resolution Details
|
|
93
|
+
|
|
94
|
+
| Scenario | Reason | Variant |
|
|
95
|
+
|----------|--------|---------|
|
|
96
|
+
| Flag key in segmentFlags | `TARGETING_MATCH` | `on` |
|
|
97
|
+
| Flag key not in segmentFlags | `DEFAULT` | `off` |
|
|
98
|
+
| Pendo not ready / no flags | `DEFAULT` | `default` |
|
|
99
|
+
|
|
100
|
+
## Telemetry Hook
|
|
72
101
|
|
|
73
102
|
Automatically track all flag evaluations to Pendo using the telemetry hook:
|
|
74
103
|
|
|
@@ -83,7 +112,7 @@ await OpenFeature.setProviderAndWait(provider);
|
|
|
83
112
|
OpenFeature.addHooks(telemetryHook);
|
|
84
113
|
```
|
|
85
114
|
|
|
86
|
-
|
|
115
|
+
### Telemetry Hook Options
|
|
87
116
|
|
|
88
117
|
```typescript
|
|
89
118
|
const telemetryHook = new PendoTelemetryHook({
|
|
@@ -95,62 +124,14 @@ const telemetryHook = new PendoTelemetryHook({
|
|
|
95
124
|
});
|
|
96
125
|
```
|
|
97
126
|
|
|
98
|
-
#### Event Payload
|
|
99
|
-
|
|
100
|
-
Each flag evaluation sends a track event with these properties:
|
|
101
|
-
|
|
102
|
-
| Property | Description |
|
|
103
|
-
|----------|-------------|
|
|
104
|
-
| `flag_key` | The flag that was evaluated |
|
|
105
|
-
| `flag_variant` | "on", "off", or variant name |
|
|
106
|
-
| `flag_reason` | "TARGETING_MATCH", "DEFAULT", or "ERROR" |
|
|
107
|
-
| `flag_value` | Stringified value |
|
|
108
|
-
| `provider_name` | "pendo-provider" |
|
|
109
|
-
|
|
110
|
-
### Configuration Options
|
|
111
|
-
|
|
112
|
-
```typescript
|
|
113
|
-
const provider = new PendoProvider({
|
|
114
|
-
// API key for Pendo initialization (optional if already initialized)
|
|
115
|
-
apiKey: 'YOUR_API_KEY',
|
|
116
|
-
|
|
117
|
-
// Timeout waiting for Pendo agent to be ready (default: 5000ms)
|
|
118
|
-
readyTimeout: 10000,
|
|
119
|
-
});
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
## How It Works
|
|
123
|
-
|
|
124
|
-
1. The provider waits for the Pendo agent to initialize
|
|
125
|
-
2. Flag evaluation checks if the flag key exists in `window.pendo.segmentFlags`
|
|
126
|
-
3. If the flag key is present, the flag is enabled; otherwise, it returns the default value
|
|
127
|
-
|
|
128
|
-
## Context
|
|
129
|
-
|
|
130
|
-
The web provider does not require explicit context for flag evaluation since the Pendo agent maintains visitor/account identity automatically. However, you can pass context for consistency with the OpenFeature API:
|
|
131
|
-
|
|
132
|
-
```typescript
|
|
133
|
-
const enabled = await client.getBooleanValue('my-flag', false, {
|
|
134
|
-
targetingKey: 'user-123', // Ignored by web provider
|
|
135
|
-
accountId: 'account-456', // Ignored by web provider
|
|
136
|
-
});
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
## Resolution Details
|
|
140
|
-
|
|
141
|
-
| Scenario | Reason | Variant |
|
|
142
|
-
|----------|--------|---------|
|
|
143
|
-
| Flag key in segmentFlags | `TARGETING_MATCH` | `on` |
|
|
144
|
-
| Flag key not in segmentFlags | `DEFAULT` | `off` |
|
|
145
|
-
| Pendo not ready | `DEFAULT` | `default` |
|
|
146
|
-
|
|
147
127
|
## Troubleshooting
|
|
148
128
|
|
|
149
129
|
### Flags always return default values
|
|
150
130
|
|
|
151
|
-
1.
|
|
152
|
-
2.
|
|
153
|
-
3.
|
|
131
|
+
1. Ensure `requestSegmentFlags: true` is set in your Pendo initialization
|
|
132
|
+
2. Check that Pendo is properly initialized before the provider
|
|
133
|
+
3. Verify the visitor is in a segment with the flag enabled
|
|
134
|
+
4. Check browser console for `[PendoProvider]` warnings
|
|
154
135
|
|
|
155
136
|
### Provider times out
|
|
156
137
|
|
|
@@ -160,15 +141,13 @@ Increase the `readyTimeout` option:
|
|
|
160
141
|
new PendoProvider({ readyTimeout: 15000 });
|
|
161
142
|
```
|
|
162
143
|
|
|
163
|
-
###
|
|
144
|
+
### Flags not updating
|
|
164
145
|
|
|
165
|
-
|
|
146
|
+
The provider automatically detects flag changes. If flags aren't updating:
|
|
166
147
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
171
|
-
```
|
|
148
|
+
1. Verify Pendo is receiving metadata/identity updates
|
|
149
|
+
2. Check that `requestSegmentFlags: true` is enabled
|
|
150
|
+
3. Ensure your segments are configured correctly in Pendo
|
|
172
151
|
|
|
173
152
|
## License
|
|
174
153
|
|
package/dist/PendoProvider.d.ts
CHANGED
|
@@ -1,23 +1,9 @@
|
|
|
1
1
|
import type { Provider, ProviderMetadata, ResolutionDetails, EvaluationContext, JsonValue, Hook, TrackingEventDetails } from "@openfeature/web-sdk";
|
|
2
|
-
import { ClientProviderStatus } from "@openfeature/web-sdk";
|
|
3
|
-
|
|
4
|
-
interface Window {
|
|
5
|
-
pendo?: {
|
|
6
|
-
segmentFlags?: string[];
|
|
7
|
-
isReady?: () => boolean;
|
|
8
|
-
initialize?: (options: unknown) => void;
|
|
9
|
-
track?: (event: string, properties?: Record<string, string>) => void;
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
}
|
|
2
|
+
import { ClientProviderStatus, OpenFeatureEventEmitter } from "@openfeature/web-sdk";
|
|
3
|
+
import "./types";
|
|
13
4
|
export interface PendoProviderOptions {
|
|
14
5
|
/**
|
|
15
|
-
*
|
|
16
|
-
* If not provided, assumes Pendo is already initialized on the page.
|
|
17
|
-
*/
|
|
18
|
-
apiKey?: string;
|
|
19
|
-
/**
|
|
20
|
-
* Optional: Timeout in milliseconds to wait for Pendo to be ready.
|
|
6
|
+
* Timeout in milliseconds to wait for Pendo to be ready.
|
|
21
7
|
* Default: 5000ms
|
|
22
8
|
*/
|
|
23
9
|
readyTimeout?: number;
|
|
@@ -25,37 +11,55 @@ export interface PendoProviderOptions {
|
|
|
25
11
|
/**
|
|
26
12
|
* OpenFeature provider for Pendo feature flags.
|
|
27
13
|
*
|
|
28
|
-
* This provider
|
|
29
|
-
*
|
|
14
|
+
* This provider integrates with the Pendo Web SDK's segment-flags plugin
|
|
15
|
+
* to evaluate feature flags based on segment membership.
|
|
16
|
+
*
|
|
17
|
+
* Prerequisites:
|
|
18
|
+
* - Pendo Web SDK must be installed and initialized on the page
|
|
19
|
+
* - `requestSegmentFlags: true` must be set in the Pendo configuration
|
|
30
20
|
*
|
|
31
21
|
* @example
|
|
32
22
|
* ```typescript
|
|
33
23
|
* import { OpenFeature } from '@openfeature/web-sdk';
|
|
34
24
|
* import { PendoProvider } from '@pendo/openfeature-web-provider';
|
|
35
25
|
*
|
|
26
|
+
* // Pendo must be initialized with requestSegmentFlags enabled:
|
|
27
|
+
* // pendo.initialize({
|
|
28
|
+
* // visitor: { id: 'user-123' },
|
|
29
|
+
* // account: { id: 'account-456' },
|
|
30
|
+
* // requestSegmentFlags: true
|
|
31
|
+
* // });
|
|
32
|
+
*
|
|
36
33
|
* await OpenFeature.setProviderAndWait(new PendoProvider());
|
|
37
34
|
*
|
|
38
35
|
* const client = OpenFeature.getClient();
|
|
39
|
-
* const enabled =
|
|
36
|
+
* const enabled = client.getBooleanValue('myFeature', false);
|
|
40
37
|
* ```
|
|
41
38
|
*/
|
|
42
39
|
export declare class PendoProvider implements Provider {
|
|
43
40
|
readonly metadata: ProviderMetadata;
|
|
44
|
-
readonly
|
|
41
|
+
readonly events: OpenFeatureEventEmitter;
|
|
45
42
|
status: ClientProviderStatus;
|
|
46
43
|
hooks?: Hook[];
|
|
47
44
|
private options;
|
|
48
|
-
private
|
|
45
|
+
private flagChangeDetectionSetup;
|
|
46
|
+
private flagChangeHandler;
|
|
49
47
|
constructor(options?: PendoProviderOptions);
|
|
50
48
|
/**
|
|
51
49
|
* Initialize the provider.
|
|
52
|
-
* Waits for Pendo to be ready
|
|
50
|
+
* Waits for Pendo to be ready and sets up flag change detection.
|
|
53
51
|
*/
|
|
54
52
|
initialize(): Promise<void>;
|
|
55
53
|
/**
|
|
56
54
|
* Wait for Pendo to be ready with timeout.
|
|
57
55
|
*/
|
|
58
56
|
private waitForPendo;
|
|
57
|
+
/**
|
|
58
|
+
* Set up detection for when segment flags change.
|
|
59
|
+
* Listens for the segmentFlagsUpdated event from Pendo.
|
|
60
|
+
* Idempotent - only runs once.
|
|
61
|
+
*/
|
|
62
|
+
private setupFlagChangeDetection;
|
|
59
63
|
/**
|
|
60
64
|
* Shutdown the provider.
|
|
61
65
|
*/
|
|
@@ -84,19 +88,15 @@ export declare class PendoProvider implements Provider {
|
|
|
84
88
|
* For Pendo flags, this returns { enabled: true/false }.
|
|
85
89
|
*/
|
|
86
90
|
resolveObjectEvaluation<T extends JsonValue>(flagKey: string, defaultValue: T, context: EvaluationContext): ResolutionDetails<T>;
|
|
87
|
-
/**
|
|
88
|
-
* Get the segment flags array from Pendo.
|
|
89
|
-
*/
|
|
90
|
-
private getSegmentFlags;
|
|
91
91
|
/**
|
|
92
92
|
* Track a custom event in Pendo.
|
|
93
93
|
*
|
|
94
|
-
*
|
|
95
|
-
* The Pendo agent must be initialized on the page for this to work.
|
|
96
|
-
*
|
|
97
|
-
* @param trackingEventName - The name of the event to track
|
|
98
|
-
* @param _context - Evaluation context (unused in web provider, Pendo agent handles visitor context)
|
|
99
|
-
* @param trackingEventDetails - Optional additional event properties
|
|
94
|
+
* Delegates to the Pendo Web SDK's track function.
|
|
100
95
|
*/
|
|
101
96
|
track(trackingEventName: string, _context: EvaluationContext, trackingEventDetails: TrackingEventDetails): void;
|
|
97
|
+
/**
|
|
98
|
+
* Get the segment flags array from Pendo.
|
|
99
|
+
* Returns null if Pendo is not available or flags haven't been loaded.
|
|
100
|
+
*/
|
|
101
|
+
private getSegmentFlags;
|
|
102
102
|
}
|
package/dist/PendoProvider.js
CHANGED
|
@@ -2,21 +2,33 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PendoProvider = void 0;
|
|
4
4
|
const web_sdk_1 = require("@openfeature/web-sdk");
|
|
5
|
+
require("./types");
|
|
5
6
|
/**
|
|
6
7
|
* OpenFeature provider for Pendo feature flags.
|
|
7
8
|
*
|
|
8
|
-
* This provider
|
|
9
|
-
*
|
|
9
|
+
* This provider integrates with the Pendo Web SDK's segment-flags plugin
|
|
10
|
+
* to evaluate feature flags based on segment membership.
|
|
11
|
+
*
|
|
12
|
+
* Prerequisites:
|
|
13
|
+
* - Pendo Web SDK must be installed and initialized on the page
|
|
14
|
+
* - `requestSegmentFlags: true` must be set in the Pendo configuration
|
|
10
15
|
*
|
|
11
16
|
* @example
|
|
12
17
|
* ```typescript
|
|
13
18
|
* import { OpenFeature } from '@openfeature/web-sdk';
|
|
14
19
|
* import { PendoProvider } from '@pendo/openfeature-web-provider';
|
|
15
20
|
*
|
|
21
|
+
* // Pendo must be initialized with requestSegmentFlags enabled:
|
|
22
|
+
* // pendo.initialize({
|
|
23
|
+
* // visitor: { id: 'user-123' },
|
|
24
|
+
* // account: { id: 'account-456' },
|
|
25
|
+
* // requestSegmentFlags: true
|
|
26
|
+
* // });
|
|
27
|
+
*
|
|
16
28
|
* await OpenFeature.setProviderAndWait(new PendoProvider());
|
|
17
29
|
*
|
|
18
30
|
* const client = OpenFeature.getClient();
|
|
19
|
-
* const enabled =
|
|
31
|
+
* const enabled = client.getBooleanValue('myFeature', false);
|
|
20
32
|
* ```
|
|
21
33
|
*/
|
|
22
34
|
class PendoProvider {
|
|
@@ -24,8 +36,10 @@ class PendoProvider {
|
|
|
24
36
|
this.metadata = {
|
|
25
37
|
name: "pendo-provider",
|
|
26
38
|
};
|
|
39
|
+
this.events = new web_sdk_1.OpenFeatureEventEmitter();
|
|
27
40
|
this.status = web_sdk_1.ClientProviderStatus.NOT_READY;
|
|
28
|
-
this.
|
|
41
|
+
this.flagChangeDetectionSetup = false;
|
|
42
|
+
this.flagChangeHandler = null;
|
|
29
43
|
this.options = {
|
|
30
44
|
readyTimeout: 5000,
|
|
31
45
|
...options,
|
|
@@ -33,23 +47,24 @@ class PendoProvider {
|
|
|
33
47
|
}
|
|
34
48
|
/**
|
|
35
49
|
* Initialize the provider.
|
|
36
|
-
* Waits for Pendo to be ready
|
|
50
|
+
* Waits for Pendo to be ready and sets up flag change detection.
|
|
37
51
|
*/
|
|
38
52
|
async initialize() {
|
|
39
|
-
if
|
|
40
|
-
|
|
53
|
+
// Listen for pendo_ready to set up detection even if we timeout initially
|
|
54
|
+
if (typeof document !== "undefined") {
|
|
55
|
+
document.addEventListener("pendo_ready", () => this.setupFlagChangeDetection(), { once: true });
|
|
41
56
|
}
|
|
42
|
-
|
|
43
|
-
|
|
57
|
+
await this.waitForPendo();
|
|
58
|
+
this.setupFlagChangeDetection();
|
|
44
59
|
this.status = web_sdk_1.ClientProviderStatus.READY;
|
|
45
60
|
}
|
|
46
61
|
/**
|
|
47
62
|
* Wait for Pendo to be ready with timeout.
|
|
48
63
|
*/
|
|
49
64
|
async waitForPendo() {
|
|
50
|
-
const timeout = this.options.readyTimeout
|
|
65
|
+
const timeout = this.options.readyTimeout;
|
|
51
66
|
const startTime = Date.now();
|
|
52
|
-
return new Promise((resolve
|
|
67
|
+
return new Promise((resolve) => {
|
|
53
68
|
const check = () => {
|
|
54
69
|
// Check if pendo is available and ready
|
|
55
70
|
if (typeof window !== "undefined" && window.pendo) {
|
|
@@ -60,8 +75,6 @@ class PendoProvider {
|
|
|
60
75
|
}
|
|
61
76
|
// Check timeout
|
|
62
77
|
if (Date.now() - startTime > timeout) {
|
|
63
|
-
// Don't reject - just resolve and work without Pendo
|
|
64
|
-
// Flags will default to false
|
|
65
78
|
console.warn("[PendoProvider] Pendo not ready within timeout. Flags will use default values.");
|
|
66
79
|
resolve();
|
|
67
80
|
return;
|
|
@@ -69,21 +82,46 @@ class PendoProvider {
|
|
|
69
82
|
// Try again
|
|
70
83
|
setTimeout(check, 100);
|
|
71
84
|
};
|
|
72
|
-
// Also listen for
|
|
85
|
+
// Also listen for pendo_ready event
|
|
73
86
|
if (typeof document !== "undefined") {
|
|
74
|
-
document.addEventListener("
|
|
75
|
-
resolve();
|
|
76
|
-
}, { once: true });
|
|
87
|
+
document.addEventListener("pendo_ready", () => resolve(), { once: true });
|
|
77
88
|
}
|
|
78
89
|
check();
|
|
79
90
|
});
|
|
80
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Set up detection for when segment flags change.
|
|
94
|
+
* Listens for the segmentFlagsUpdated event from Pendo.
|
|
95
|
+
* Idempotent - only runs once.
|
|
96
|
+
*/
|
|
97
|
+
setupFlagChangeDetection() {
|
|
98
|
+
if (this.flagChangeDetectionSetup) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (typeof window === "undefined" || !window.pendo?.Events?.segmentFlagsUpdated) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
this.flagChangeDetectionSetup = true;
|
|
105
|
+
// Create handler and store reference for cleanup
|
|
106
|
+
this.flagChangeHandler = () => {
|
|
107
|
+
this.events.emit(web_sdk_1.ProviderEvents.ConfigurationChanged);
|
|
108
|
+
};
|
|
109
|
+
// Subscribe to Pendo's segmentFlagsUpdated event
|
|
110
|
+
window.pendo.Events.segmentFlagsUpdated.on(this.flagChangeHandler);
|
|
111
|
+
}
|
|
81
112
|
/**
|
|
82
113
|
* Shutdown the provider.
|
|
83
114
|
*/
|
|
84
115
|
async onClose() {
|
|
116
|
+
// Unsubscribe from Pendo events
|
|
117
|
+
if (typeof window !== "undefined" &&
|
|
118
|
+
window.pendo?.Events?.segmentFlagsUpdated &&
|
|
119
|
+
this.flagChangeHandler) {
|
|
120
|
+
window.pendo.Events.segmentFlagsUpdated.off(this.flagChangeHandler);
|
|
121
|
+
}
|
|
85
122
|
this.status = web_sdk_1.ClientProviderStatus.NOT_READY;
|
|
86
|
-
this.
|
|
123
|
+
this.flagChangeHandler = null;
|
|
124
|
+
this.flagChangeDetectionSetup = false;
|
|
87
125
|
}
|
|
88
126
|
/**
|
|
89
127
|
* Resolve a boolean flag value.
|
|
@@ -92,7 +130,7 @@ class PendoProvider {
|
|
|
92
130
|
*/
|
|
93
131
|
resolveBooleanEvaluation(flagKey, defaultValue, _context) {
|
|
94
132
|
const flags = this.getSegmentFlags();
|
|
95
|
-
if (
|
|
133
|
+
if (flags === null) {
|
|
96
134
|
return {
|
|
97
135
|
value: defaultValue,
|
|
98
136
|
reason: "DEFAULT",
|
|
@@ -166,40 +204,38 @@ class PendoProvider {
|
|
|
166
204
|
variant: boolResult.variant,
|
|
167
205
|
};
|
|
168
206
|
}
|
|
169
|
-
/**
|
|
170
|
-
* Get the segment flags array from Pendo.
|
|
171
|
-
*/
|
|
172
|
-
getSegmentFlags() {
|
|
173
|
-
if (typeof window === "undefined") {
|
|
174
|
-
return undefined;
|
|
175
|
-
}
|
|
176
|
-
return window.pendo?.segmentFlags;
|
|
177
|
-
}
|
|
178
207
|
/**
|
|
179
208
|
* Track a custom event in Pendo.
|
|
180
209
|
*
|
|
181
|
-
*
|
|
182
|
-
* The Pendo agent must be initialized on the page for this to work.
|
|
183
|
-
*
|
|
184
|
-
* @param trackingEventName - The name of the event to track
|
|
185
|
-
* @param _context - Evaluation context (unused in web provider, Pendo agent handles visitor context)
|
|
186
|
-
* @param trackingEventDetails - Optional additional event properties
|
|
210
|
+
* Delegates to the Pendo Web SDK's track function.
|
|
187
211
|
*/
|
|
188
212
|
track(trackingEventName, _context, trackingEventDetails) {
|
|
189
213
|
if (typeof window === "undefined" || !window.pendo?.track) {
|
|
190
|
-
console.warn("[PendoProvider] Pendo
|
|
214
|
+
console.warn("[PendoProvider] Pendo Web SDK not available for tracking");
|
|
191
215
|
return;
|
|
192
216
|
}
|
|
193
|
-
// Convert TrackingEventDetails to Record<string, string> for Pendo
|
|
217
|
+
// Convert TrackingEventDetails to Record<string, string> for Pendo Web SDK
|
|
194
218
|
const properties = {};
|
|
195
219
|
for (const [key, value] of Object.entries(trackingEventDetails)) {
|
|
196
220
|
if (value !== undefined && value !== null) {
|
|
197
221
|
properties[key] = String(value);
|
|
198
222
|
}
|
|
199
223
|
}
|
|
200
|
-
// Fire-and-forget: delegate to Pendo agent
|
|
201
224
|
window.pendo.track(trackingEventName, properties);
|
|
202
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* Get the segment flags array from Pendo.
|
|
228
|
+
* Returns null if Pendo is not available or flags haven't been loaded.
|
|
229
|
+
*/
|
|
230
|
+
getSegmentFlags() {
|
|
231
|
+
if (typeof window === "undefined" || !window.pendo) {
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
const flags = window.pendo.segmentFlags;
|
|
235
|
+
// Return null if flags haven't been loaded yet (undefined)
|
|
236
|
+
// Return the array (even if empty) if flags have been loaded
|
|
237
|
+
return flags === undefined ? null : flags;
|
|
238
|
+
}
|
|
203
239
|
}
|
|
204
240
|
exports.PendoProvider = PendoProvider;
|
|
205
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVuZG9Qcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QZW5kb1Byb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVNBLGtEQUE0RDtBQTJCNUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFhLGFBQWE7SUFZeEIsWUFBWSxVQUFnQyxFQUFFO1FBWHJDLGFBQVEsR0FBcUI7WUFDcEMsSUFBSSxFQUFFLGdCQUFnQjtTQUN2QixDQUFDO1FBR0YsV0FBTSxHQUF5Qiw4QkFBb0IsQ0FBQyxTQUFTLENBQUM7UUFJdEQsaUJBQVksR0FBeUIsSUFBSSxDQUFDO1FBR2hELElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixZQUFZLEVBQUUsSUFBSTtZQUNsQixHQUFHLE9BQU87U0FDWCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxVQUFVO1FBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyw4QkFBb0IsQ0FBQyxLQUFLLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFlBQVk7UUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDO1FBQ2xELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUU3QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRTtnQkFDakIsd0NBQXdDO2dCQUN4QyxJQUFJLE9BQU8s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QU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUNILGlCQUF5QixFQUN6QixRQUEyQixFQUMzQixvQkFBMEM7UUFFMUMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzFELE9BQU8sQ0FBQyxJQUFJLENBQUMsd0RBQXdELENBQUMsQ0FBQztZQUN2RSxPQUFPO1FBQ1QsQ0FBQztRQUVELHlFQUF5RTtRQUN6RSxNQUFNLFVBQVUsR0FBMkIsRUFBRSxDQUFDO1FBQzlDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztZQUNoRSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUMxQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLENBQUM7UUFDSCxDQUFDO1FBRUQsMkNBQTJDO1FBQzNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRjtBQWhQRCxzQ0FnUEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIFByb3ZpZGVyLFxuICBQcm92aWRlck1ldGFkYXRhLFxuICBSZXNvbHV0aW9uRGV0YWlscyxcbiAgRXZhbHVhdGlvbkNvbnRleHQsXG4gIEpzb25WYWx1ZSxcbiAgSG9vayxcbiAgVHJhY2tpbmdFdmVudERldGFpbHMsXG59IGZyb20gXCJAb3BlbmZlYXR1cmUvd2ViLXNka1wiO1xuaW1wb3J0IHsgQ2xpZW50UHJvdmlkZXJTdGF0dXMgfSBmcm9tIFwiQG9wZW5mZWF0dXJlL3dlYi1zZGtcIjtcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBwZW5kbz86IHtcbiAgICAgIHNlZ21lbnRGbGFncz86IHN0cmluZ1tdO1xuICAgICAgaXNSZWFkeT86ICgpID0+IGJvb2xlYW47XG4gICAgICBpbml0aWFsaXplPzogKG9wdGlvbnM6IHVua25vd24pID0+IHZvaWQ7XG4gICAgICB0cmFjaz86IChldmVudDogc3RyaW5nLCBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4gdm9pZDtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZG9Qcm92aWRlck9wdGlvbnMge1xuICAvKipcbiAgICogT3B0aW9uYWw6IFBlbmRvIEFQSSBrZXkgZm9yIGluaXRpYWxpemF0aW9uLlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGFzc3VtZXMgUGVuZG8gaXMgYWxyZWFkeSBpbml0aWFsaXplZCBvbiB0aGUgcGFnZS5cbiAgICovXG4gIGFwaUtleT86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWw6IFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIFBlbmRvIHRvIGJlIHJlYWR5LlxuICAgKiBEZWZhdWx0OiA1MDAwbXNcbiAgICovXG4gIHJlYWR5VGltZW91dD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcGVuRmVhdHVyZSBwcm92aWRlciBmb3IgUGVuZG8gZmVhdHVyZSBmbGFncy5cbiAqXG4gKiBUaGlzIHByb3ZpZGVyIGV2YWx1YXRlcyBmZWF0dXJlIGZsYWdzIGJ5IGNoZWNraW5nIHRoZSBgcGVuZG8uc2VnbWVudEZsYWdzYCBhcnJheVxuICogd2hpY2ggaXMgcG9wdWxhdGVkIGJ5IHRoZSBQZW5kbyBhZ2VudCBiYXNlZCBvbiBzZWdtZW50IG1lbWJlcnNoaXAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IE9wZW5GZWF0dXJlIH0gZnJvbSAnQG9wZW5mZWF0dXJlL3dlYi1zZGsnO1xuICogaW1wb3J0IHsgUGVuZG9Qcm92aWRlciB9IGZyb20gJ0BwZW5kby9vcGVuZmVhdHVyZS13ZWItcHJvdmlkZXInO1xuICpcbiAqIGF3YWl0IE9wZW5GZWF0dXJlLnNldFByb3ZpZGVyQW5kV2FpdChuZXcgUGVuZG9Qcm92aWRlcigpKTtcbiAqXG4gKiBjb25zdCBjbGllbnQgPSBPcGVuRmVhdHVyZS5nZXRDbGllbnQoKTtcbiAqIGNvbnN0IGVuYWJsZWQgPSBhd2FpdCBjbGllbnQuZ2V0Qm9vbGVhblZhbHVlKCdteUZlYXR1cmUnLCBmYWxzZSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFBlbmRvUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlciB7XG4gIHJlYWRvbmx5IG1ldGFkYXRhOiBQcm92aWRlck1ldGFkYXRhID0ge1xuICAgIG5hbWU6IFwicGVuZG8tcHJvdmlkZXJcIixcbiAgfTtcblxuICByZWFkb25seSBydWxlc0NoYW5nZWQ/OiAoKSA9PiB2b2lkO1xuICBzdGF0dXM6IENsaWVudFByb3ZpZGVyU3RhdHVzID0gQ2xpZW50UHJvdmlkZXJTdGF0dXMuTk9UX1JFQURZO1xuICBob29rcz86IEhvb2tbXTtcblxuICBwcml2YXRlIG9wdGlvbnM6IFBlbmRvUHJvdmlkZXJPcHRpb25zO1xuICBwcml2YXRlIHJlYWR5UHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFBlbmRvUHJvdmlkZXJPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICByZWFkeVRpbWVvdXQ6IDUwMDAsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgcHJvdmlkZXIuXG4gICAqIFdhaXRzIGZvciBQZW5kbyB0byBiZSByZWFkeSBiZWZvcmUgcmVzb2x2aW5nLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5yZWFkeVByb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWR5UHJvbWlzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlYWR5UHJvbWlzZSA9IHRoaXMud2FpdEZvclBlbmRvKCk7XG4gICAgYXdhaXQgdGhpcy5yZWFkeVByb21pc2U7XG4gICAgdGhpcy5zdGF0dXMgPSBDbGllbnRQcm92aWRlclN0YXR1cy5SRUFEWTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0IGZvciBQZW5kbyB0byBiZSByZWFkeSB3aXRoIHRpbWVvdXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JQZW5kbygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5vcHRpb25zLnJlYWR5VGltZW91dCA/PyA1MDAwO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgY2hlY2sgPSAoKSA9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHBlbmRvIGlzIGF2YWlsYWJsZSBhbmQgcmVhZHlcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LnBlbmRvKSB7XG4gICAgICAgICAgaWYgKHdpbmRvdy5wZW5kby5pc1JlYWR5Py4oKSB8fCB3aW5kb3cucGVuZG8uc2VnbWVudEZsYWdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aW1lb3V0XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID4gdGltZW91dCkge1xuICAgICAgICAgIC8vIERvbid0IHJlamVjdCAtIGp1c3QgcmVzb2x2ZSBhbmQgd29yayB3aXRob3V0IFBlbmRvXG4gICAgICAgICAgLy8gRmxhZ3Mgd2lsbCBkZWZhdWx0IHRvIGZhbHNlXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgXCJbUGVuZG9Qcm92aWRlcl0gUGVuZG8gbm90IHJlYWR5IHdpdGhpbiB0aW1lb3V0LiBGbGFncyB3aWxsIHVzZSBkZWZhdWx0IHZhbHVlcy5cIlxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyeSBhZ2FpblxuICAgICAgICBzZXRUaW1lb3V0KGNoZWNrLCAxMDApO1xuICAgICAgfTtcblxuICAgICAgLy8gQWxzbyBsaXN0ZW4gZm9yIHBlbmRvOnJlYWR5IGV2ZW50XG4gICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJwZW5kbzpyZWFkeVwiLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2h1dGRvd24gdGhlIHByb3ZpZGVyLlxuICAgKi9cbiAgYXN5bmMgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXR1cyA9IENsaWVudFByb3ZpZGVyU3RhdHVzLk5PVF9SRUFEWTtcbiAgICB0aGlzLnJlYWR5UHJvbWlzZSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGJvb2xlYW4gZmxhZyB2YWx1ZS5cbiAgICpcbiAgICogQ2hlY2tzIGlmIHRoZSBmbGFnS2V5IGV4aXN0cyBpbiBwZW5kby5zZWdtZW50RmxhZ3MgYXJyYXkuXG4gICAqL1xuICByZXNvbHZlQm9vbGVhbkV2YWx1YXRpb24oXG4gICAgZmxhZ0tleTogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogYm9vbGVhbixcbiAgICBfY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHRcbiAgKTogUmVzb2x1dGlvbkRldGFpbHM8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGZsYWdzID0gdGhpcy5nZXRTZWdtZW50RmxhZ3MoKTtcblxuICAgIGlmICghZmxhZ3MpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgICAgIHJlYXNvbjogXCJERUZBVUxUXCIsXG4gICAgICAgIHZhcmlhbnQ6IFwiZGVmYXVsdFwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVkID0gZmxhZ3MuaW5jbHVkZXMoZmxhZ0tleSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGVuYWJsZWQsXG4gICAgICByZWFzb246IGVuYWJsZWQgPyBcIlRBUkdFVElOR19NQVRDSFwiIDogXCJERUZBVUxUXCIsXG4gICAgICB2YXJpYW50OiBlbmFibGVkID8gXCJvblwiIDogXCJvZmZcIixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBzdHJpbmcgZmxhZyB2YWx1ZS5cbiAgICpcbiAgICogRm9yIFBlbmRvIGZsYWdzLCB0aGlzIHJldHVybnMgXCJvblwiIGlmIHRoZSBmbGFnIGlzIGVuYWJsZWQsIFwib2ZmXCIgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVzb2x2ZVN0cmluZ0V2YWx1YXRpb24oXG4gICAgZmxhZ0tleTogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogc3RyaW5nLFxuICAgIGNvbnRleHQ6IEV2YWx1YXRpb25Db250ZXh0XG4gICk6IFJlc29sdXRpb25EZXRhaWxzPHN0cmluZz4ge1xuICAgIGNvbnN0IGJvb2xSZXN1bHQgPSB0aGlzLnJlc29sdmVCb29sZWFuRXZhbHVhdGlvbihmbGFnS2V5LCBmYWxzZSwgY29udGV4dCk7XG5cbiAgICBpZiAoYm9vbFJlc3VsdC5yZWFzb24gPT09IFwiREVGQVVMVFwiICYmICFib29sUmVzdWx0LnZhbHVlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgICAgICByZWFzb246IFwiREVGQVVMVFwiLFxuICAgICAgICB2YXJpYW50OiBcImRlZmF1bHRcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBib29sUmVzdWx0LnZhbHVlID8gXCJvblwiIDogXCJvZmZcIixcbiAgICAgIHJlYXNvbjogYm9vbFJlc3VsdC5yZWFzb24sXG4gICAgICB2YXJpYW50OiBib29sUmVzdWx0LnZhcmlhbnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgbnVtYmVyIGZsYWcgdmFsdWUuXG4gICAqXG4gICAqIEZvciBQZW5kbyBmbGFncywgdGhpcyByZXR1cm5zIDEgaWYgZW5hYmxlZCwgMCBpZiBkaXNhYmxlZC5cbiAgICovXG4gIHJlc29sdmVOdW1iZXJFdmFsdWF0aW9uKFxuICAgIGZsYWdLZXk6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bWJlcixcbiAgICBjb250ZXh0OiBFdmFsdWF0aW9uQ29udGV4dFxuICApOiBSZXNvbHV0aW9uRGV0YWlsczxudW1iZXI+IHtcbiAgICBjb25zdCBib29sUmVzdWx0ID0gdGhpcy5yZXNvbHZlQm9vbGVhbkV2YWx1YXRpb24oZmxhZ0tleSwgZmFsc2UsIGNvbnRleHQpO1xuXG4gICAgaWYgKGJvb2xSZXN1bHQucmVhc29uID09PSBcIkRFRkFVTFRcIiAmJiAhYm9vbFJlc3VsdC52YWx1ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgcmVhc29uOiBcIkRFRkFVTFRcIixcbiAgICAgICAgdmFyaWFudDogXCJkZWZhdWx0XCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogYm9vbFJlc3VsdC52YWx1ZSA/IDEgOiAwLFxuICAgICAgcmVhc29uOiBib29sUmVzdWx0LnJlYXNvbixcbiAgICAgIHZhcmlhbnQ6IGJvb2xSZXN1bHQudmFyaWFudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gb2JqZWN0IGZsYWcgdmFsdWUuXG4gICAqXG4gICAqIEZvciBQZW5kbyBmbGFncywgdGhpcyByZXR1cm5zIHsgZW5hYmxlZDogdHJ1ZS9mYWxzZSB9LlxuICAgKi9cbiAgcmVzb2x2ZU9iamVjdEV2YWx1YXRpb248VCBleHRlbmRzIEpzb25WYWx1ZT4oXG4gICAgZmxhZ0tleTogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogVCxcbiAgICBjb250ZXh0OiBFdmFsdWF0aW9uQ29udGV4dFxuICApOiBSZXNvbHV0aW9uRGV0YWlsczxUPiB7XG4gICAgY29uc3QgYm9vbFJlc3VsdCA9IHRoaXMucmVzb2x2ZUJvb2xlYW5FdmFsdWF0aW9uKGZsYWdLZXksIGZhbHNlLCBjb250ZXh0KTtcblxuICAgIGlmIChib29sUmVzdWx0LnJlYXNvbiA9PT0gXCJERUZBVUxUXCIgJiYgIWJvb2xSZXN1bHQudmFsdWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgICAgIHJlYXNvbjogXCJERUZBVUxUXCIsXG4gICAgICAgIHZhcmlhbnQ6IFwiZGVmYXVsdFwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHsgZW5hYmxlZDogYm9vbFJlc3VsdC52YWx1ZSB9IGFzIHVua25vd24gYXMgVCxcbiAgICAgIHJlYXNvbjogYm9vbFJlc3VsdC5yZWFzb24sXG4gICAgICB2YXJpYW50OiBib29sUmVzdWx0LnZhcmlhbnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlZ21lbnQgZmxhZ3MgYXJyYXkgZnJvbSBQZW5kby5cbiAgICovXG4gIHByaXZhdGUgZ2V0U2VnbWVudEZsYWdzKCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93LnBlbmRvPy5zZWdtZW50RmxhZ3M7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgYSBjdXN0b20gZXZlbnQgaW4gUGVuZG8uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGRlbGVnYXRlcyB0byB0aGUgUGVuZG8gYWdlbnQncyB0cmFjayBmdW5jdGlvbi5cbiAgICogVGhlIFBlbmRvIGFnZW50IG11c3QgYmUgaW5pdGlhbGl6ZWQgb24gdGhlIHBhZ2UgZm9yIHRoaXMgdG8gd29yay5cbiAgICpcbiAgICogQHBhcmFtIHRyYWNraW5nRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyYWNrXG4gICAqIEBwYXJhbSBfY29udGV4dCAtIEV2YWx1YXRpb24gY29udGV4dCAodW51c2VkIGluIHdlYiBwcm92aWRlciwgUGVuZG8gYWdlbnQgaGFuZGxlcyB2aXNpdG9yIGNvbnRleHQpXG4gICAqIEBwYXJhbSB0cmFja2luZ0V2ZW50RGV0YWlscyAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgZXZlbnQgcHJvcGVydGllc1xuICAgKi9cbiAgdHJhY2soXG4gICAgdHJhY2tpbmdFdmVudE5hbWU6IHN0cmluZyxcbiAgICBfY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHQsXG4gICAgdHJhY2tpbmdFdmVudERldGFpbHM6IFRyYWNraW5nRXZlbnREZXRhaWxzXG4gICk6IHZvaWQge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8ICF3aW5kb3cucGVuZG8/LnRyYWNrKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJbUGVuZG9Qcm92aWRlcl0gUGVuZG8gYWdlbnQgbm90IGF2YWlsYWJsZSBmb3IgdHJhY2tpbmdcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBUcmFja2luZ0V2ZW50RGV0YWlscyB0byBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IGZvciBQZW5kbyBhZ2VudFxuICAgIGNvbnN0IHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0cmFja2luZ0V2ZW50RGV0YWlscykpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHByb3BlcnRpZXNba2V5XSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlyZS1hbmQtZm9yZ2V0OiBkZWxlZ2F0ZSB0byBQZW5kbyBhZ2VudFxuICAgIHdpbmRvdy5wZW5kby50cmFjayh0cmFja2luZ0V2ZW50TmFtZSwgcHJvcGVydGllcyk7XG4gIH1cbn1cbiJdfQ==
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVuZG9Qcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QZW5kb1Byb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVNBLGtEQUk4QjtBQUM5QixtQkFBaUI7QUFVakI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQWEsYUFBYTtJQWF4QixZQUFZLFVBQWdDLEVBQUU7UUFackMsYUFBUSxHQUFxQjtZQUNwQyxJQUFJLEVBQUUsZ0JBQWdCO1NBQ3ZCLENBQUM7UUFFTyxXQUFNLEdBQUcsSUFBSSxpQ0FBdUIsRUFBRSxDQUFDO1FBQ2hELFdBQU0sR0FBeUIsOEJBQW9CLENBQUMsU0FBUyxDQUFDO1FBSXRELDZCQUF3QixHQUFHLEtBQUssQ0FBQztRQUNqQyxzQkFBaUIsR0FBd0IsSUFBSSxDQUFDO1FBR3BELElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixZQUFZLEVBQUUsSUFBSTtZQUNsQixHQUFHLE9BQU87U0FDWCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxVQUFVO1FBQ2QsMEVBQTBFO1FBQzFFLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEMsUUFBUSxDQUFDLGdCQUFnQixDQUN2QixhQUFhLEVBQ2IsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEVBQ3JDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUNmLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyw4QkFBb0IsQ0FBQyxLQUFLLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFlBQVk7UUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZ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LENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUMxRCxPQUFPLENBQUMsSUFBSSxDQUFDLDBEQUEwRCxDQUFDLENBQUM7WUFDekUsT0FBTztRQUNULENBQUM7UUFFRCwyRUFBMkU7UUFDM0UsTUFBTSxVQUFVLEdBQTJCLEVBQUUsQ0FBQztRQUM5QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7WUFDaEUsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDMUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSyxlQUFlO1FBQ3JCLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25ELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBRXhDLDJEQUEyRDtRQUMzRCw2REFBNkQ7UUFDN0QsT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM1QyxDQUFDO0NBQ0Y7QUFwUkQsc0NBb1JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBQcm92aWRlcixcbiAgUHJvdmlkZXJNZXRhZGF0YSxcbiAgUmVzb2x1dGlvbkRldGFpbHMsXG4gIEV2YWx1YXRpb25Db250ZXh0LFxuICBKc29uVmFsdWUsXG4gIEhvb2ssXG4gIFRyYWNraW5nRXZlbnREZXRhaWxzLFxufSBmcm9tIFwiQG9wZW5mZWF0dXJlL3dlYi1zZGtcIjtcbmltcG9ydCB7XG4gIENsaWVudFByb3ZpZGVyU3RhdHVzLFxuICBPcGVuRmVhdHVyZUV2ZW50RW1pdHRlcixcbiAgUHJvdmlkZXJFdmVudHMsXG59IGZyb20gXCJAb3BlbmZlYXR1cmUvd2ViLXNka1wiO1xuaW1wb3J0IFwiLi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBlbmRvUHJvdmlkZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIFBlbmRvIHRvIGJlIHJlYWR5LlxuICAgKiBEZWZhdWx0OiA1MDAwbXNcbiAgICovXG4gIHJlYWR5VGltZW91dD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcGVuRmVhdHVyZSBwcm92aWRlciBmb3IgUGVuZG8gZmVhdHVyZSBmbGFncy5cbiAqXG4gKiBUaGlzIHByb3ZpZGVyIGludGVncmF0ZXMgd2l0aCB0aGUgUGVuZG8gV2ViIFNESydzIHNlZ21lbnQtZmxhZ3MgcGx1Z2luXG4gKiB0byBldmFsdWF0ZSBmZWF0dXJlIGZsYWdzIGJhc2VkIG9uIHNlZ21lbnQgbWVtYmVyc2hpcC5cbiAqXG4gKiBQcmVyZXF1aXNpdGVzOlxuICogLSBQZW5kbyBXZWIgU0RLIG11c3QgYmUgaW5zdGFsbGVkIGFuZCBpbml0aWFsaXplZCBvbiB0aGUgcGFnZVxuICogLSBgcmVxdWVzdFNlZ21lbnRGbGFnczogdHJ1ZWAgbXVzdCBiZSBzZXQgaW4gdGhlIFBlbmRvIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgT3BlbkZlYXR1cmUgfSBmcm9tICdAb3BlbmZlYXR1cmUvd2ViLXNkayc7XG4gKiBpbXBvcnQgeyBQZW5kb1Byb3ZpZGVyIH0gZnJvbSAnQHBlbmRvL29wZW5mZWF0dXJlLXdlYi1wcm92aWRlcic7XG4gKlxuICogLy8gUGVuZG8gbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIHJlcXVlc3RTZWdtZW50RmxhZ3MgZW5hYmxlZDpcbiAqIC8vIHBlbmRvLmluaXRpYWxpemUoe1xuICogLy8gICB2aXNpdG9yOiB7IGlkOiAndXNlci0xMjMnIH0sXG4gKiAvLyAgIGFjY291bnQ6IHsgaWQ6ICdhY2NvdW50LTQ1NicgfSxcbiAqIC8vICAgcmVxdWVzdFNlZ21lbnRGbGFnczogdHJ1ZVxuICogLy8gfSk7XG4gKlxuICogYXdhaXQgT3BlbkZlYXR1cmUuc2V0UHJvdmlkZXJBbmRXYWl0KG5ldyBQZW5kb1Byb3ZpZGVyKCkpO1xuICpcbiAqIGNvbnN0IGNsaWVudCA9IE9wZW5GZWF0dXJlLmdldENsaWVudCgpO1xuICogY29uc3QgZW5hYmxlZCA9IGNsaWVudC5nZXRCb29sZWFuVmFsdWUoJ215RmVhdHVyZScsIGZhbHNlKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUGVuZG9Qcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyIHtcbiAgcmVhZG9ubHkgbWV0YWRhdGE6IFByb3ZpZGVyTWV0YWRhdGEgPSB7XG4gICAgbmFtZTogXCJwZW5kby1wcm92aWRlclwiLFxuICB9O1xuXG4gIHJlYWRvbmx5IGV2ZW50cyA9IG5ldyBPcGVuRmVhdHVyZUV2ZW50RW1pdHRlcigpO1xuICBzdGF0dXM6IENsaWVudFByb3ZpZGVyU3RhdHVzID0gQ2xpZW50UHJvdmlkZXJTdGF0dXMuTk9UX1JFQURZO1xuICBob29rcz86IEhvb2tbXTtcblxuICBwcml2YXRlIG9wdGlvbnM6IFJlcXVpcmVkPFBlbmRvUHJvdmlkZXJPcHRpb25zPjtcbiAgcHJpdmF0ZSBmbGFnQ2hhbmdlRGV0ZWN0aW9uU2V0dXAgPSBmYWxzZTtcbiAgcHJpdmF0ZSBmbGFnQ2hhbmdlSGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUGVuZG9Qcm92aWRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIHJlYWR5VGltZW91dDogNTAwMCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBwcm92aWRlci5cbiAgICogV2FpdHMgZm9yIFBlbmRvIHRvIGJlIHJlYWR5IGFuZCBzZXRzIHVwIGZsYWcgY2hhbmdlIGRldGVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTGlzdGVuIGZvciBwZW5kb19yZWFkeSB0byBzZXQgdXAgZGV0ZWN0aW9uIGV2ZW4gaWYgd2UgdGltZW91dCBpbml0aWFsbHlcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICBcInBlbmRvX3JlYWR5XCIsXG4gICAgICAgICgpID0+IHRoaXMuc2V0dXBGbGFnQ2hhbmdlRGV0ZWN0aW9uKCksXG4gICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud2FpdEZvclBlbmRvKCk7XG4gICAgdGhpcy5zZXR1cEZsYWdDaGFuZ2VEZXRlY3Rpb24oKTtcbiAgICB0aGlzLnN0YXR1cyA9IENsaWVudFByb3ZpZGVyU3RhdHVzLlJFQURZO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXQgZm9yIFBlbmRvIHRvIGJlIHJlYWR5IHdpdGggdGltZW91dC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclBlbmRvKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLm9wdGlvbnMucmVhZHlUaW1lb3V0O1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGNoZWNrID0gKCkgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiBwZW5kbyBpcyBhdmFpbGFibGUgYW5kIHJlYWR5XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5wZW5kbykge1xuICAgICAgICAgIGlmICh3aW5kb3cucGVuZG8uaXNSZWFkeT8uKCkgfHwgd2luZG93LnBlbmRvLnNlZ21lbnRGbGFncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGltZW91dFxuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+IHRpbWVvdXQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIltQZW5kb1Byb3ZpZGVyXSBQZW5kbyBub3QgcmVhZHkgd2l0aGluIHRpbWVvdXQuIEZsYWdzIHdpbGwgdXNlIGRlZmF1bHQgdmFsdWVzLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ5IGFnYWluXG4gICAgICAgIHNldFRpbWVvdXQoY2hlY2ssIDEwMCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBBbHNvIGxpc3RlbiBmb3IgcGVuZG9fcmVhZHkgZXZlbnRcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBcInBlbmRvX3JlYWR5XCIsXG4gICAgICAgICAgKCkgPT4gcmVzb2x2ZSgpLFxuICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIGRldGVjdGlvbiBmb3Igd2hlbiBzZWdtZW50IGZsYWdzIGNoYW5nZS5cbiAgICogTGlzdGVucyBmb3IgdGhlIHNlZ21lbnRGbGFnc1VwZGF0ZWQgZXZlbnQgZnJvbSBQZW5kby5cbiAgICogSWRlbXBvdGVudCAtIG9ubHkgcnVucyBvbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEZsYWdDaGFuZ2VEZXRlY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmxhZ0NoYW5nZURldGVjdGlvblNldHVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHwgIXdpbmRvdy5wZW5kbz8uRXZlbnRzPy5zZWdtZW50RmxhZ3NVcGRhdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5mbGFnQ2hhbmdlRGV0ZWN0aW9uU2V0dXAgPSB0cnVlO1xuXG4gICAgLy8gQ3JlYXRlIGhhbmRsZXIgYW5kIHN0b3JlIHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgIHRoaXMuZmxhZ0NoYW5nZUhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KFByb3ZpZGVyRXZlbnRzLkNvbmZpZ3VyYXRpb25DaGFuZ2VkKTtcbiAgICB9O1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIFBlbmRvJ3Mgc2VnbWVudEZsYWdzVXBkYXRlZCBldmVudFxuICAgIHdpbmRvdy5wZW5kby5FdmVudHMuc2VnbWVudEZsYWdzVXBkYXRlZC5vbih0aGlzLmZsYWdDaGFuZ2VIYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaHV0ZG93biB0aGUgcHJvdmlkZXIuXG4gICAqL1xuICBhc3luYyBvbkNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gUGVuZG8gZXZlbnRzXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgd2luZG93LnBlbmRvPy5FdmVudHM/LnNlZ21lbnRGbGFnc1VwZGF0ZWQgJiZcbiAgICAgIHRoaXMuZmxhZ0NoYW5nZUhhbmRsZXJcbiAgICApIHtcbiAgICAgIHdpbmRvdy5wZW5kby5FdmVudHMuc2VnbWVudEZsYWdzVXBkYXRlZC5vZmYodGhpcy5mbGFnQ2hhbmdlSGFuZGxlcik7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0dXMgPSBDbGllbnRQcm92aWRlclN0YXR1cy5OT1RfUkVBRFk7XG4gICAgdGhpcy5mbGFnQ2hhbmdlSGFuZGxlciA9IG51bGw7XG4gICAgdGhpcy5mbGFnQ2hhbmdlRGV0ZWN0aW9uU2V0dXAgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgYm9vbGVhbiBmbGFnIHZhbHVlLlxuICAgKlxuICAgKiBDaGVja3MgaWYgdGhlIGZsYWdLZXkgZXhpc3RzIGluIHBlbmRvLnNlZ21lbnRGbGFncyBhcnJheS5cbiAgICovXG4gIHJlc29sdmVCb29sZWFuRXZhbHVhdGlvbihcbiAgICBmbGFnS2V5OiBzdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiBib29sZWFuLFxuICAgIF9jb250ZXh0OiBFdmFsdWF0aW9uQ29udGV4dFxuICApOiBSZXNvbHV0aW9uRGV0YWlsczxib29sZWFuPiB7XG4gICAgY29uc3QgZmxhZ3MgPSB0aGlzLmdldFNlZ21lbnRGbGFncygpO1xuXG4gICAgaWYgKGZsYWdzID09PSBudWxsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgICAgICByZWFzb246IFwiREVGQVVMVFwiLFxuICAgICAgICB2YXJpYW50OiBcImRlZmF1bHRcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlZCA9IGZsYWdzLmluY2x1ZGVzKGZsYWdLZXkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBlbmFibGVkLFxuICAgICAgcmVhc29uOiBlbmFibGVkID8gXCJUQVJHRVRJTkdfTUFUQ0hcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgdmFyaWFudDogZW5hYmxlZCA/IFwib25cIiA6IFwib2ZmXCIsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgc3RyaW5nIGZsYWcgdmFsdWUuXG4gICAqXG4gICAqIEZvciBQZW5kbyBmbGFncywgdGhpcyByZXR1cm5zIFwib25cIiBpZiB0aGUgZmxhZyBpcyBlbmFibGVkLCBcIm9mZlwiIG90aGVyd2lzZS5cbiAgICovXG4gIHJlc29sdmVTdHJpbmdFdmFsdWF0aW9uKFxuICAgIGZsYWdLZXk6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IHN0cmluZyxcbiAgICBjb250ZXh0OiBFdmFsdWF0aW9uQ29udGV4dFxuICApOiBSZXNvbHV0aW9uRGV0YWlsczxzdHJpbmc+IHtcbiAgICBjb25zdCBib29sUmVzdWx0ID0gdGhpcy5yZXNvbHZlQm9vbGVhbkV2YWx1YXRpb24oZmxhZ0tleSwgZmFsc2UsIGNvbnRleHQpO1xuXG4gICAgaWYgKGJvb2xSZXN1bHQucmVhc29uID09PSBcIkRFRkFVTFRcIiAmJiAhYm9vbFJlc3VsdC52YWx1ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgcmVhc29uOiBcIkRFRkFVTFRcIixcbiAgICAgICAgdmFyaWFudDogXCJkZWZhdWx0XCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogYm9vbFJlc3VsdC52YWx1ZSA/IFwib25cIiA6IFwib2ZmXCIsXG4gICAgICByZWFzb246IGJvb2xSZXN1bHQucmVhc29uLFxuICAgICAgdmFyaWFudDogYm9vbFJlc3VsdC52YXJpYW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIG51bWJlciBmbGFnIHZhbHVlLlxuICAgKlxuICAgKiBGb3IgUGVuZG8gZmxhZ3MsIHRoaXMgcmV0dXJucyAxIGlmIGVuYWJsZWQsIDAgaWYgZGlzYWJsZWQuXG4gICAqL1xuICByZXNvbHZlTnVtYmVyRXZhbHVhdGlvbihcbiAgICBmbGFnS2V5OiBzdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiBudW1iZXIsXG4gICAgY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHRcbiAgKTogUmVzb2x1dGlvbkRldGFpbHM8bnVtYmVyPiB7XG4gICAgY29uc3QgYm9vbFJlc3VsdCA9IHRoaXMucmVzb2x2ZUJvb2xlYW5FdmFsdWF0aW9uKGZsYWdLZXksIGZhbHNlLCBjb250ZXh0KTtcblxuICAgIGlmIChib29sUmVzdWx0LnJlYXNvbiA9PT0gXCJERUZBVUxUXCIgJiYgIWJvb2xSZXN1bHQudmFsdWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgICAgIHJlYXNvbjogXCJERUZBVUxUXCIsXG4gICAgICAgIHZhcmlhbnQ6IFwiZGVmYXVsdFwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGJvb2xSZXN1bHQudmFsdWUgPyAxIDogMCxcbiAgICAgIHJlYXNvbjogYm9vbFJlc3VsdC5yZWFzb24sXG4gICAgICB2YXJpYW50OiBib29sUmVzdWx0LnZhcmlhbnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFuIG9iamVjdCBmbGFnIHZhbHVlLlxuICAgKlxuICAgKiBGb3IgUGVuZG8gZmxhZ3MsIHRoaXMgcmV0dXJucyB7IGVuYWJsZWQ6IHRydWUvZmFsc2UgfS5cbiAgICovXG4gIHJlc29sdmVPYmplY3RFdmFsdWF0aW9uPFQgZXh0ZW5kcyBKc29uVmFsdWU+KFxuICAgIGZsYWdLZXk6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IFQsXG4gICAgY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHRcbiAgKTogUmVzb2x1dGlvbkRldGFpbHM8VD4ge1xuICAgIGNvbnN0IGJvb2xSZXN1bHQgPSB0aGlzLnJlc29sdmVCb29sZWFuRXZhbHVhdGlvbihmbGFnS2V5LCBmYWxzZSwgY29udGV4dCk7XG5cbiAgICBpZiAoYm9vbFJlc3VsdC5yZWFzb24gPT09IFwiREVGQVVMVFwiICYmICFib29sUmVzdWx0LnZhbHVlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgICAgICByZWFzb246IFwiREVGQVVMVFwiLFxuICAgICAgICB2YXJpYW50OiBcImRlZmF1bHRcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB7IGVuYWJsZWQ6IGJvb2xSZXN1bHQudmFsdWUgfSBhcyB1bmtub3duIGFzIFQsXG4gICAgICByZWFzb246IGJvb2xSZXN1bHQucmVhc29uLFxuICAgICAgdmFyaWFudDogYm9vbFJlc3VsdC52YXJpYW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgYSBjdXN0b20gZXZlbnQgaW4gUGVuZG8uXG4gICAqXG4gICAqIERlbGVnYXRlcyB0byB0aGUgUGVuZG8gV2ViIFNESydzIHRyYWNrIGZ1bmN0aW9uLlxuICAgKi9cbiAgdHJhY2soXG4gICAgdHJhY2tpbmdFdmVudE5hbWU6IHN0cmluZyxcbiAgICBfY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHQsXG4gICAgdHJhY2tpbmdFdmVudERldGFpbHM6IFRyYWNraW5nRXZlbnREZXRhaWxzXG4gICk6IHZvaWQge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8ICF3aW5kb3cucGVuZG8/LnRyYWNrKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJbUGVuZG9Qcm92aWRlcl0gUGVuZG8gV2ViIFNESyBub3QgYXZhaWxhYmxlIGZvciB0cmFja2luZ1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IFRyYWNraW5nRXZlbnREZXRhaWxzIHRvIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gZm9yIFBlbmRvIFdlYiBTREtcbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModHJhY2tpbmdFdmVudERldGFpbHMpKSB7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBwcm9wZXJ0aWVzW2tleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdpbmRvdy5wZW5kby50cmFjayh0cmFja2luZ0V2ZW50TmFtZSwgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzZWdtZW50IGZsYWdzIGFycmF5IGZyb20gUGVuZG8uXG4gICAqIFJldHVybnMgbnVsbCBpZiBQZW5kbyBpcyBub3QgYXZhaWxhYmxlIG9yIGZsYWdzIGhhdmVuJ3QgYmVlbiBsb2FkZWQuXG4gICAqL1xuICBwcml2YXRlIGdldFNlZ21lbnRGbGFncygpOiBzdHJpbmdbXSB8IG51bGwge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8ICF3aW5kb3cucGVuZG8pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZsYWdzID0gd2luZG93LnBlbmRvLnNlZ21lbnRGbGFncztcblxuICAgIC8vIFJldHVybiBudWxsIGlmIGZsYWdzIGhhdmVuJ3QgYmVlbiBsb2FkZWQgeWV0ICh1bmRlZmluZWQpXG4gICAgLy8gUmV0dXJuIHRoZSBhcnJheSAoZXZlbiBpZiBlbXB0eSkgaWYgZmxhZ3MgaGF2ZSBiZWVuIGxvYWRlZFxuICAgIHJldHVybiBmbGFncyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGZsYWdzO1xuICB9XG59XG4iXX0=
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Hook, HookContext, EvaluationDetails, FlagValue } from "@openfeature/web-sdk";
|
|
2
|
+
import "./types";
|
|
2
3
|
export interface PendoTelemetryHookOptions {
|
|
3
4
|
/**
|
|
4
5
|
* Event name for flag evaluation tracking.
|
|
@@ -17,7 +18,7 @@ export interface PendoTelemetryHookOptions {
|
|
|
17
18
|
* This hook sends an event to Pendo after each flag evaluation, allowing you
|
|
18
19
|
* to analyze feature flag usage alongside your other Pendo analytics.
|
|
19
20
|
*
|
|
20
|
-
* The hook uses the Pendo
|
|
21
|
+
* The hook uses the Pendo Web SDK's track function, so the Pendo Web SDK must be
|
|
21
22
|
* initialized on the page for tracking to work.
|
|
22
23
|
*
|
|
23
24
|
* @example
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PendoTelemetryHook = void 0;
|
|
4
|
+
require("./types");
|
|
4
5
|
/**
|
|
5
6
|
* OpenFeature hook that automatically tracks flag evaluations to Pendo.
|
|
6
7
|
*
|
|
7
8
|
* This hook sends an event to Pendo after each flag evaluation, allowing you
|
|
8
9
|
* to analyze feature flag usage alongside your other Pendo analytics.
|
|
9
10
|
*
|
|
10
|
-
* The hook uses the Pendo
|
|
11
|
+
* The hook uses the Pendo Web SDK's track function, so the Pendo Web SDK must be
|
|
11
12
|
* initialized on the page for tracking to work.
|
|
12
13
|
*
|
|
13
14
|
* @example
|
|
@@ -39,7 +40,7 @@ class PendoTelemetryHook {
|
|
|
39
40
|
if (this.options.flagFilter && !this.options.flagFilter(flagKey)) {
|
|
40
41
|
return;
|
|
41
42
|
}
|
|
42
|
-
// Check if Pendo
|
|
43
|
+
// Check if Pendo Web SDK is available
|
|
43
44
|
if (typeof window === "undefined" || !window.pendo?.track) {
|
|
44
45
|
return;
|
|
45
46
|
}
|
|
@@ -50,7 +51,7 @@ class PendoTelemetryHook {
|
|
|
50
51
|
flag_value: this.stringifyValue(evaluationDetails.value),
|
|
51
52
|
provider_name: hookContext.providerMetadata.name,
|
|
52
53
|
};
|
|
53
|
-
// Fire-and-forget: delegate to Pendo
|
|
54
|
+
// Fire-and-forget: delegate to Pendo Web SDK
|
|
54
55
|
window.pendo.track(this.options.eventName, properties);
|
|
55
56
|
}
|
|
56
57
|
/**
|
|
@@ -67,4 +68,4 @@ class PendoTelemetryHook {
|
|
|
67
68
|
}
|
|
68
69
|
}
|
|
69
70
|
exports.PendoTelemetryHook = PendoTelemetryHook;
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVuZG9UZWxlbWV0cnlIb29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1BlbmRvVGVsZW1ldHJ5SG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNQSxtQkFBaUI7QUFnQmpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQWEsa0JBQWtCO0lBSzdCLFlBQVksVUFBcUMsRUFBRTtRQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixHQUFHLE9BQU87U0FDWCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FDSCxXQUE2QyxFQUM3QyxpQkFBK0M7UUFFL0MsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLFdBQVcsQ0FBQztRQUVoQyx1Q0FBdUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDakUsT0FBTztRQUNULENBQUM7UUFFRCxzQ0FBc0M7UUFDdEMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzFELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQTJCO1lBQ3pDLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLElBQUksU0FBUztZQUNwRCxXQUFXLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxJQUFJLFNBQVM7WUFDbEQsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1lBQ3hELGFBQWEsRUFBRSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSTtTQUNqRCxDQUFDO1FBRUYsNkNBQTZDO1FBQzdDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxLQUFnQjtRQUNyQyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNuQixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQXhERCxnREF3REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEhvb2ssXG4gIEhvb2tDb250ZXh0LFxuICBFdmFsdWF0aW9uRGV0YWlscyxcbiAgRmxhZ1ZhbHVlLFxufSBmcm9tIFwiQG9wZW5mZWF0dXJlL3dlYi1zZGtcIjtcbmltcG9ydCBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQZW5kb1RlbGVtZXRyeUhvb2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIEV2ZW50IG5hbWUgZm9yIGZsYWcgZXZhbHVhdGlvbiB0cmFja2luZy5cbiAgICogRGVmYXVsdDogXCJmbGFnX2V2YWx1YXRlZFwiXG4gICAqL1xuICBldmVudE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGZpbHRlciBmdW5jdGlvbiB0byBzZWxlY3RpdmVseSB0cmFjayBmbGFncy5cbiAgICogUmV0dXJuIHRydWUgdG8gdHJhY2sgdGhlIGZsYWcsIGZhbHNlIHRvIHNraXAuXG4gICAqL1xuICBmbGFnRmlsdGVyPzogKGZsYWdLZXk6IHN0cmluZykgPT4gYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcGVuRmVhdHVyZSBob29rIHRoYXQgYXV0b21hdGljYWxseSB0cmFja3MgZmxhZyBldmFsdWF0aW9ucyB0byBQZW5kby5cbiAqXG4gKiBUaGlzIGhvb2sgc2VuZHMgYW4gZXZlbnQgdG8gUGVuZG8gYWZ0ZXIgZWFjaCBmbGFnIGV2YWx1YXRpb24sIGFsbG93aW5nIHlvdVxuICogdG8gYW5hbHl6ZSBmZWF0dXJlIGZsYWcgdXNhZ2UgYWxvbmdzaWRlIHlvdXIgb3RoZXIgUGVuZG8gYW5hbHl0aWNzLlxuICpcbiAqIFRoZSBob29rIHVzZXMgdGhlIFBlbmRvIFdlYiBTREsncyB0cmFjayBmdW5jdGlvbiwgc28gdGhlIFBlbmRvIFdlYiBTREsgbXVzdCBiZVxuICogaW5pdGlhbGl6ZWQgb24gdGhlIHBhZ2UgZm9yIHRyYWNraW5nIHRvIHdvcmsuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IE9wZW5GZWF0dXJlIH0gZnJvbSAnQG9wZW5mZWF0dXJlL3dlYi1zZGsnO1xuICogaW1wb3J0IHsgUGVuZG9Qcm92aWRlciwgUGVuZG9UZWxlbWV0cnlIb29rIH0gZnJvbSAnQHBlbmRvL29wZW5mZWF0dXJlLXdlYi1wcm92aWRlcic7XG4gKlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgUGVuZG9Qcm92aWRlcigpO1xuICogY29uc3QgdGVsZW1ldHJ5SG9vayA9IG5ldyBQZW5kb1RlbGVtZXRyeUhvb2soKTtcbiAqXG4gKiBhd2FpdCBPcGVuRmVhdHVyZS5zZXRQcm92aWRlckFuZFdhaXQocHJvdmlkZXIpO1xuICogT3BlbkZlYXR1cmUuYWRkSG9va3ModGVsZW1ldHJ5SG9vayk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFBlbmRvVGVsZW1ldHJ5SG9vayBpbXBsZW1lbnRzIEhvb2sge1xuICBwcml2YXRlIG9wdGlvbnM6IFJlcXVpcmVkPE9taXQ8UGVuZG9UZWxlbWV0cnlIb29rT3B0aW9ucywgXCJmbGFnRmlsdGVyXCI+PiAmIHtcbiAgICBmbGFnRmlsdGVyPzogKGZsYWdLZXk6IHN0cmluZykgPT4gYm9vbGVhbjtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQZW5kb1RlbGVtZXRyeUhvb2tPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBldmVudE5hbWU6IFwiZmxhZ19ldmFsdWF0ZWRcIixcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgYSBmbGFnIGlzIHN1Y2Nlc3NmdWxseSBldmFsdWF0ZWQuXG4gICAqIFNlbmRzIHRoZSBldmFsdWF0aW9uIHJlc3VsdCB0byBQZW5kbyBhcyBhIHRyYWNrIGV2ZW50LlxuICAgKi9cbiAgYWZ0ZXIoXG4gICAgaG9va0NvbnRleHQ6IFJlYWRvbmx5PEhvb2tDb250ZXh0PEZsYWdWYWx1ZT4+LFxuICAgIGV2YWx1YXRpb25EZXRhaWxzOiBFdmFsdWF0aW9uRGV0YWlsczxGbGFnVmFsdWU+XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgZmxhZ0tleSB9ID0gaG9va0NvbnRleHQ7XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGZsYWcgc2hvdWxkIGJlIHRyYWNrZWRcbiAgICBpZiAodGhpcy5vcHRpb25zLmZsYWdGaWx0ZXIgJiYgIXRoaXMub3B0aW9ucy5mbGFnRmlsdGVyKGZsYWdLZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgUGVuZG8gV2ViIFNESyBpcyBhdmFpbGFibGVcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhd2luZG93LnBlbmRvPy50cmFjaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBmbGFnX2tleTogZmxhZ0tleSxcbiAgICAgIGZsYWdfdmFyaWFudDogZXZhbHVhdGlvbkRldGFpbHMudmFyaWFudCB8fCBcInVua25vd25cIixcbiAgICAgIGZsYWdfcmVhc29uOiBldmFsdWF0aW9uRGV0YWlscy5yZWFzb24gfHwgXCJVTktOT1dOXCIsXG4gICAgICBmbGFnX3ZhbHVlOiB0aGlzLnN0cmluZ2lmeVZhbHVlKGV2YWx1YXRpb25EZXRhaWxzLnZhbHVlKSxcbiAgICAgIHByb3ZpZGVyX25hbWU6IGhvb2tDb250ZXh0LnByb3ZpZGVyTWV0YWRhdGEubmFtZSxcbiAgICB9O1xuXG4gICAgLy8gRmlyZS1hbmQtZm9yZ2V0OiBkZWxlZ2F0ZSB0byBQZW5kbyBXZWIgU0RLXG4gICAgd2luZG93LnBlbmRvLnRyYWNrKHRoaXMub3B0aW9ucy5ldmVudE5hbWUsIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBmbGFnIHZhbHVlIHRvIGEgc3RyaW5nIGZvciB0cmFja2luZy5cbiAgICovXG4gIHByaXZhdGUgc3RyaW5naWZ5VmFsdWUodmFsdWU6IEZsYWdWYWx1ZSk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG59XG4iXX0=
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type declarations for Pendo Web SDK integration.
|
|
3
|
+
*/
|
|
4
|
+
interface PendoEventEmitter {
|
|
5
|
+
on: (handler: (data?: unknown) => void) => void;
|
|
6
|
+
off: (handler: (data?: unknown) => void) => void;
|
|
7
|
+
trigger: (data?: unknown) => void;
|
|
8
|
+
}
|
|
9
|
+
declare global {
|
|
10
|
+
interface Window {
|
|
11
|
+
pendo?: {
|
|
12
|
+
segmentFlags?: string[] | null;
|
|
13
|
+
isReady?: () => boolean;
|
|
14
|
+
initialize?: (options: unknown) => void;
|
|
15
|
+
track?: (event: string, properties?: Record<string, string>) => void;
|
|
16
|
+
Events?: {
|
|
17
|
+
segmentFlagsUpdated?: PendoEventEmitter;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export {};
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Type declarations for Pendo Web SDK integration.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUeXBlIGRlY2xhcmF0aW9ucyBmb3IgUGVuZG8gV2ViIFNESyBpbnRlZ3JhdGlvbi5cbiAqL1xuXG5pbnRlcmZhY2UgUGVuZG9FdmVudEVtaXR0ZXIge1xuICBvbjogKGhhbmRsZXI6IChkYXRhPzogdW5rbm93bikgPT4gdm9pZCkgPT4gdm9pZDtcbiAgb2ZmOiAoaGFuZGxlcjogKGRhdGE/OiB1bmtub3duKSA9PiB2b2lkKSA9PiB2b2lkO1xuICB0cmlnZ2VyOiAoZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgcGVuZG8/OiB7XG4gICAgICBzZWdtZW50RmxhZ3M/OiBzdHJpbmdbXSB8IG51bGw7XG4gICAgICBpc1JlYWR5PzogKCkgPT4gYm9vbGVhbjtcbiAgICAgIGluaXRpYWxpemU/OiAob3B0aW9uczogdW5rbm93bikgPT4gdm9pZDtcbiAgICAgIHRyYWNrPzogKGV2ZW50OiBzdHJpbmcsIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiB2b2lkO1xuICAgICAgRXZlbnRzPzoge1xuICAgICAgICBzZWdtZW50RmxhZ3NVcGRhdGVkPzogUGVuZG9FdmVudEVtaXR0ZXI7XG4gICAgICB9O1xuICAgIH07XG4gIH1cbn1cblxuLy8gVGhpcyBleHBvcnQgbWFrZXMgdGhpcyBmaWxlIGEgbW9kdWxlXG5leHBvcnQge307XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pendo/openfeature-web-provider",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "OpenFeature provider for Pendo feature flags (web/browser)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -11,7 +11,11 @@
|
|
|
11
11
|
"scripts": {
|
|
12
12
|
"build": "tsc",
|
|
13
13
|
"test": "jest",
|
|
14
|
-
"lint": "eslint src"
|
|
14
|
+
"lint": "eslint src",
|
|
15
|
+
"prepublishOnly": "npm run build && npm test"
|
|
16
|
+
},
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"access": "public"
|
|
15
19
|
},
|
|
16
20
|
"peerDependencies": {
|
|
17
21
|
"@openfeature/web-sdk": "^1.0.0"
|