@remkoj/optimizely-one-nextjs 6.0.0-pre8 → 6.0.0-rc.1
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 +12 -12
- package/README.md +168 -164
- package/dist/api/index.js +5 -3
- package/dist/api/index.js.map +1 -1
- package/dist/client-types.d.ts +74 -3
- package/dist/client-types.js +5 -1
- package/dist/client-types.js.map +1 -1
- package/dist/components/context.d.ts +218 -64
- package/dist/components/context.js +159 -67
- package/dist/components/context.js.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/optimizely-one-gadget/_notice.js +1 -0
- package/dist/components/optimizely-one-gadget/_notice.js.map +1 -1
- package/dist/components/optimizely-one-gadget/audiences-panel.js +1 -0
- package/dist/components/optimizely-one-gadget/audiences-panel.js.map +1 -1
- package/dist/components/optimizely-one-gadget/exp-panel.js +1 -0
- package/dist/components/optimizely-one-gadget/exp-panel.js.map +1 -1
- package/dist/components/optimizely-one-gadget/gadget.js +24 -16
- package/dist/components/optimizely-one-gadget/gadget.js.map +1 -1
- package/dist/components/optimizely-one-gadget/goals-panel.js +1 -0
- package/dist/components/optimizely-one-gadget/goals-panel.js.map +1 -1
- package/dist/components/optimizely-one-gadget/graph-panel.js +1 -0
- package/dist/components/optimizely-one-gadget/graph-panel.js.map +1 -1
- package/dist/components/optimizely-one-gadget/interests-panel.js +1 -0
- package/dist/components/optimizely-one-gadget/interests-panel.js.map +1 -1
- package/dist/components/optimizely-one-gadget/logo.js +1 -0
- package/dist/components/optimizely-one-gadget/logo.js.map +1 -1
- package/dist/components/optimizely-one-gadget/profile-panel.js +1 -0
- package/dist/components/optimizely-one-gadget/profile-panel.js.map +1 -1
- package/dist/components/page-activator.js +12 -31
- package/dist/components/page-activator.js.map +1 -1
- package/dist/components/service-filters.d.ts +46 -0
- package/dist/components/service-filters.js +56 -0
- package/dist/components/service-filters.js.map +1 -0
- package/dist/components/types.d.ts +2 -0
- package/dist/components/types.js +2 -0
- package/dist/components/types.js.map +1 -0
- package/dist/components/use-local-state.d.ts +24 -0
- package/dist/components/use-local-state.js +55 -0
- package/dist/components/use-local-state.js.map +1 -0
- package/dist/config.d.ts +119 -0
- package/dist/config.js +101 -2
- package/dist/config.js.map +1 -1
- package/dist/env-vars.d.ts +3 -0
- package/dist/env-vars.js +3 -0
- package/dist/env-vars.js.map +1 -1
- package/dist/products/content-recs/client.d.ts +10 -3
- package/dist/products/content-recs/client.js +38 -2
- package/dist/products/content-recs/client.js.map +1 -1
- package/dist/products/content-recs/snippet.js +16 -16
- package/dist/{api/content-goals.d.ts → products/content-recs/webservice-goals.d.ts} +1 -1
- package/dist/{api/content-goals.js → products/content-recs/webservice-goals.js} +4 -4
- package/dist/products/content-recs/webservice-goals.js.map +1 -0
- package/dist/{api/content-recs.d.ts → products/content-recs/webservice.d.ts} +1 -1
- package/dist/{api/content-recs.js → products/content-recs/webservice.js} +13 -12
- package/dist/products/content-recs/webservice.js.map +1 -0
- package/dist/products/data-platform/client.d.ts +11 -2
- package/dist/products/data-platform/client.js +52 -9
- package/dist/products/data-platform/client.js.map +1 -1
- package/dist/products/data-platform/snippet.js +3 -3
- package/dist/products/data-platform/snippet.js.map +1 -1
- package/dist/products/feature-experimentation/provider.d.ts +7 -0
- package/dist/products/feature-experimentation/provider.js +32 -0
- package/dist/products/feature-experimentation/provider.js.map +1 -0
- package/dist/products/web-experimentation/client.d.ts +5 -2
- package/dist/products/web-experimentation/client.js +21 -7
- package/dist/products/web-experimentation/client.js.map +1 -1
- package/dist/products/web-experimentation/snippet.js +17 -17
- package/dist/products/web-experimentation/snippet.js.map +1 -1
- package/dist/{api/experimentation-api.d.ts → products/web-experimentation/webservice.d.ts} +1 -1
- package/dist/{api/experimentation-api.js → products/web-experimentation/webservice.js} +2 -2
- package/dist/products/web-experimentation/webservice.js.map +1 -0
- package/dist/server-components/index.d.ts +3 -0
- package/dist/server-components/index.js +3 -0
- package/dist/server-components/index.js.map +1 -1
- package/dist/{components/optimizely-one-gadget/index.d.ts → server-components/optimizely-one-gadget.d.ts} +1 -1
- package/dist/{components/optimizely-one-gadget/index.js → server-components/optimizely-one-gadget.js} +4 -5
- package/dist/server-components/optimizely-one-gadget.js.map +1 -0
- package/dist/server-components/optimizely-one.d.ts +219 -0
- package/dist/server-components/optimizely-one.js +112 -0
- package/dist/server-components/optimizely-one.js.map +1 -0
- package/dist/server.d.ts +1 -2
- package/dist/server.js +1 -6
- package/dist/server.js.map +1 -1
- package/dist/styles.css +2 -2
- package/dist/utils/products.d.ts +92 -0
- package/dist/utils/products.js +84 -0
- package/dist/utils/products.js.map +1 -0
- package/package.json +25 -30
- package/dist/api/content-goals.js.map +0 -1
- package/dist/api/content-recs.js.map +0 -1
- package/dist/api/experimentation-api.js.map +0 -1
- package/dist/components/optimizely-one-gadget/index.js.map +0 -1
- package/dist/components/rsc.d.ts +0 -2
- package/dist/components/rsc.js +0 -3
- package/dist/components/rsc.js.map +0 -1
package/dist/config.d.ts
CHANGED
|
@@ -1,3 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load Optimizely One configuration from environment variables.
|
|
3
|
+
*
|
|
4
|
+
* Reads environment variables using the `EnvVars` map and returns a typed
|
|
5
|
+
* configuration object containing all Optimizely One service parameters.
|
|
6
|
+
*
|
|
7
|
+
* This function is called automatically by `getEnabledProducts()` if a custom
|
|
8
|
+
* config is not provided.
|
|
9
|
+
*
|
|
10
|
+
* **Configuration properties:**
|
|
11
|
+
*
|
|
12
|
+
* - `RuntimeEnv`: Node runtime environment (defaults to `'production'`)
|
|
13
|
+
* - `OdpApiKey`: API key for Optimizely Data Platform
|
|
14
|
+
* - `OdpService`: ODP service endpoint URL (defaults to `https://api.zaius.com/`)
|
|
15
|
+
* - `OdpAudienceBatchSize`: Batch size for ODP audience queries (defaults to `25`)
|
|
16
|
+
* - `HelperEnabled`: Enable/disable Optimizely One integration (defaults to `false`)
|
|
17
|
+
* - `ContentRecsClient`: Content Recommendations client identifier
|
|
18
|
+
* - `ContentRecsDelivery`: Content Recommendations delivery method (defaults to `0`)
|
|
19
|
+
* - `ContentRecsDeliveryKey`: API key for Content Recommendations
|
|
20
|
+
* - `ContentRecsHost`: Content Recommendations host (defaults to `"idio.co"`)
|
|
21
|
+
* - `FrontendCookie`: Cookie name for visitor ID (defaults to `"visitorId"`)
|
|
22
|
+
* - `WebExperimentationProject`: Project ID for Web Experimentation
|
|
23
|
+
* - `OptimizelyDebug`: Enable debug logging for Optimizely (defaults to `false`)
|
|
24
|
+
*
|
|
25
|
+
* @returns Configuration object with type `OptiOneConfig`.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```tsx
|
|
29
|
+
* import { readConfigFromEnv } from '@remkoj/optimizely-one-nextjs'
|
|
30
|
+
*
|
|
31
|
+
* const config = readConfigFromEnv()
|
|
32
|
+
* console.log('ODP API Key:', config.OdpApiKey)
|
|
33
|
+
* console.log('Runtime Environment:', config.RuntimeEnv)
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```tsx
|
|
38
|
+
* // Use for conditional initialization
|
|
39
|
+
* import { readConfigFromEnv, checkProductStatus } from '@remkoj/optimizely-one-nextjs'
|
|
40
|
+
*
|
|
41
|
+
* const config = readConfigFromEnv()
|
|
42
|
+
* const productStatus = checkProductStatus(config)
|
|
43
|
+
* if (productStatus.dataPlatform) {
|
|
44
|
+
* initializeODP(config.OdpApiKey, config.OdpService)
|
|
45
|
+
* }
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
1
48
|
export declare function readConfigFromEnv(): {
|
|
2
49
|
RuntimeEnv: string;
|
|
3
50
|
OdpApiKey: string | undefined;
|
|
@@ -11,12 +58,84 @@ export declare function readConfigFromEnv(): {
|
|
|
11
58
|
FrontendCookie: string;
|
|
12
59
|
WebExperimentationProject: string | undefined;
|
|
13
60
|
OptimizelyDebug: boolean;
|
|
61
|
+
FeatureExperimentationProject: string | undefined;
|
|
62
|
+
FeatureExperimentationSdkKey: string | undefined;
|
|
63
|
+
FeatureExperimentationToken: string | undefined;
|
|
14
64
|
};
|
|
65
|
+
/**
|
|
66
|
+
* Evaluate product enablement status based on configuration.
|
|
67
|
+
*
|
|
68
|
+
* Checks the provided configuration object to determine which Optimizely One
|
|
69
|
+
* products are properly configured and available for use. Each product has
|
|
70
|
+
* specific configuration requirements:
|
|
71
|
+
*
|
|
72
|
+
* **Activation criteria:**
|
|
73
|
+
*
|
|
74
|
+
* - `dataPlatform`: `OdpApiKey` must be a string with >8 characters
|
|
75
|
+
* - `contentRecsClient`: Both `ContentRecsClient` AND `ContentRecsDelivery` must be set
|
|
76
|
+
* - `contentRecsApi`: Both `ContentRecsClient` AND `ContentRecsDeliveryKey` must be set
|
|
77
|
+
* - `webExperimentation`: `WebExperimentationProject` must be a string with >5 characters
|
|
78
|
+
*
|
|
79
|
+
* @param config - Optional partial configuration object.
|
|
80
|
+
* If not provided, configuration is read from environment variables.
|
|
81
|
+
* @returns An object with boolean status for each product:
|
|
82
|
+
* - `dataPlatform: boolean`
|
|
83
|
+
* - `contentRecsClient: boolean`
|
|
84
|
+
* - `contentRecsApi: boolean`
|
|
85
|
+
* - `webExperimentation: boolean`
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```tsx
|
|
89
|
+
* import { checkProductStatus, readConfigFromEnv } from '@remkoj/optimizely-one-nextjs'
|
|
90
|
+
*
|
|
91
|
+
* const config = readConfigFromEnv()
|
|
92
|
+
* const status = checkProductStatus(config)
|
|
93
|
+
*
|
|
94
|
+
* Object.entries(status).forEach(([product, isEnabled]) => {
|
|
95
|
+
* console.log(`${product}: ${isEnabled ? 'enabled' : 'disabled'}`)
|
|
96
|
+
* })
|
|
97
|
+
* ```
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```tsx
|
|
101
|
+
* import { checkProductStatus } from '@remkoj/optimizely-one-nextjs'
|
|
102
|
+
*
|
|
103
|
+
* // Check with custom configuration
|
|
104
|
+
* const customConfig = {
|
|
105
|
+
* OdpApiKey: 'my-api-key-12345678',
|
|
106
|
+
* WebExperimentationProject: 'campaign-123456',
|
|
107
|
+
* ContentRecsClient: 'my-client',
|
|
108
|
+
* ContentRecsDeliveryKey: 'content-key'
|
|
109
|
+
* }
|
|
110
|
+
* const productStatus = checkProductStatus(customConfig)
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
15
113
|
export declare function checkProductStatus(config?: Partial<OptiOneConfig>): {
|
|
16
114
|
dataPlatform: boolean;
|
|
17
115
|
contentRecsClient: boolean;
|
|
18
116
|
contentRecsApi: boolean;
|
|
19
117
|
webExperimentation: boolean;
|
|
118
|
+
featureExperimentation: boolean;
|
|
20
119
|
};
|
|
120
|
+
/**
|
|
121
|
+
* Complete Optimizely One configuration object.
|
|
122
|
+
*
|
|
123
|
+
* This is the return type of `readConfigFromEnv()` and represents all
|
|
124
|
+
* configuration parameters available for Optimizely One services.
|
|
125
|
+
*
|
|
126
|
+
* Contains settings for:
|
|
127
|
+
* - ODP (Data Platform)
|
|
128
|
+
* - Content Recommendations
|
|
129
|
+
* - Web Experimentation
|
|
130
|
+
* - General platform options
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```tsx
|
|
134
|
+
* import type { OptiOneConfig } from '@remkoj/optimizely-one-nextjs'
|
|
135
|
+
* import { readConfigFromEnv } from '@remkoj/optimizely-one-nextjs'
|
|
136
|
+
*
|
|
137
|
+
* const config: OptiOneConfig = readConfigFromEnv()
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
21
140
|
export type OptiOneConfig = ReturnType<typeof readConfigFromEnv>;
|
|
22
141
|
export default readConfigFromEnv;
|
package/dist/config.js
CHANGED
|
@@ -1,5 +1,52 @@
|
|
|
1
1
|
import { readValue, readValueAsBoolean, readValueAsInt } from "./utils/env";
|
|
2
2
|
import EnvVars from "./env-vars";
|
|
3
|
+
/**
|
|
4
|
+
* Load Optimizely One configuration from environment variables.
|
|
5
|
+
*
|
|
6
|
+
* Reads environment variables using the `EnvVars` map and returns a typed
|
|
7
|
+
* configuration object containing all Optimizely One service parameters.
|
|
8
|
+
*
|
|
9
|
+
* This function is called automatically by `getEnabledProducts()` if a custom
|
|
10
|
+
* config is not provided.
|
|
11
|
+
*
|
|
12
|
+
* **Configuration properties:**
|
|
13
|
+
*
|
|
14
|
+
* - `RuntimeEnv`: Node runtime environment (defaults to `'production'`)
|
|
15
|
+
* - `OdpApiKey`: API key for Optimizely Data Platform
|
|
16
|
+
* - `OdpService`: ODP service endpoint URL (defaults to `https://api.zaius.com/`)
|
|
17
|
+
* - `OdpAudienceBatchSize`: Batch size for ODP audience queries (defaults to `25`)
|
|
18
|
+
* - `HelperEnabled`: Enable/disable Optimizely One integration (defaults to `false`)
|
|
19
|
+
* - `ContentRecsClient`: Content Recommendations client identifier
|
|
20
|
+
* - `ContentRecsDelivery`: Content Recommendations delivery method (defaults to `0`)
|
|
21
|
+
* - `ContentRecsDeliveryKey`: API key for Content Recommendations
|
|
22
|
+
* - `ContentRecsHost`: Content Recommendations host (defaults to `"idio.co"`)
|
|
23
|
+
* - `FrontendCookie`: Cookie name for visitor ID (defaults to `"visitorId"`)
|
|
24
|
+
* - `WebExperimentationProject`: Project ID for Web Experimentation
|
|
25
|
+
* - `OptimizelyDebug`: Enable debug logging for Optimizely (defaults to `false`)
|
|
26
|
+
*
|
|
27
|
+
* @returns Configuration object with type `OptiOneConfig`.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* import { readConfigFromEnv } from '@remkoj/optimizely-one-nextjs'
|
|
32
|
+
*
|
|
33
|
+
* const config = readConfigFromEnv()
|
|
34
|
+
* console.log('ODP API Key:', config.OdpApiKey)
|
|
35
|
+
* console.log('Runtime Environment:', config.RuntimeEnv)
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```tsx
|
|
40
|
+
* // Use for conditional initialization
|
|
41
|
+
* import { readConfigFromEnv, checkProductStatus } from '@remkoj/optimizely-one-nextjs'
|
|
42
|
+
*
|
|
43
|
+
* const config = readConfigFromEnv()
|
|
44
|
+
* const productStatus = checkProductStatus(config)
|
|
45
|
+
* if (productStatus.dataPlatform) {
|
|
46
|
+
* initializeODP(config.OdpApiKey, config.OdpService)
|
|
47
|
+
* }
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
3
50
|
export function readConfigFromEnv() {
|
|
4
51
|
return {
|
|
5
52
|
RuntimeEnv: readValue('NODE_ENV', 'production'),
|
|
@@ -13,16 +60,68 @@ export function readConfigFromEnv() {
|
|
|
13
60
|
ContentRecsHost: readValue(EnvVars.ContentRecsHost, "idio.co"),
|
|
14
61
|
FrontendCookie: readValue(EnvVars.FrontendCookie, "visitorId"),
|
|
15
62
|
WebExperimentationProject: readValue(EnvVars.WebExperimentationProject),
|
|
16
|
-
OptimizelyDebug: readValueAsBoolean(EnvVars.OptimizelyDebug, false)
|
|
63
|
+
OptimizelyDebug: readValueAsBoolean(EnvVars.OptimizelyDebug, false),
|
|
64
|
+
FeatureExperimentationProject: readValue(EnvVars.FeatureExperimentationProject),
|
|
65
|
+
FeatureExperimentationSdkKey: readValue(EnvVars.FeatureExperimentationSdkKey),
|
|
66
|
+
FeatureExperimentationToken: readValue(EnvVars.FeatureExperimentationPat)
|
|
17
67
|
};
|
|
18
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Evaluate product enablement status based on configuration.
|
|
71
|
+
*
|
|
72
|
+
* Checks the provided configuration object to determine which Optimizely One
|
|
73
|
+
* products are properly configured and available for use. Each product has
|
|
74
|
+
* specific configuration requirements:
|
|
75
|
+
*
|
|
76
|
+
* **Activation criteria:**
|
|
77
|
+
*
|
|
78
|
+
* - `dataPlatform`: `OdpApiKey` must be a string with >8 characters
|
|
79
|
+
* - `contentRecsClient`: Both `ContentRecsClient` AND `ContentRecsDelivery` must be set
|
|
80
|
+
* - `contentRecsApi`: Both `ContentRecsClient` AND `ContentRecsDeliveryKey` must be set
|
|
81
|
+
* - `webExperimentation`: `WebExperimentationProject` must be a string with >5 characters
|
|
82
|
+
*
|
|
83
|
+
* @param config - Optional partial configuration object.
|
|
84
|
+
* If not provided, configuration is read from environment variables.
|
|
85
|
+
* @returns An object with boolean status for each product:
|
|
86
|
+
* - `dataPlatform: boolean`
|
|
87
|
+
* - `contentRecsClient: boolean`
|
|
88
|
+
* - `contentRecsApi: boolean`
|
|
89
|
+
* - `webExperimentation: boolean`
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```tsx
|
|
93
|
+
* import { checkProductStatus, readConfigFromEnv } from '@remkoj/optimizely-one-nextjs'
|
|
94
|
+
*
|
|
95
|
+
* const config = readConfigFromEnv()
|
|
96
|
+
* const status = checkProductStatus(config)
|
|
97
|
+
*
|
|
98
|
+
* Object.entries(status).forEach(([product, isEnabled]) => {
|
|
99
|
+
* console.log(`${product}: ${isEnabled ? 'enabled' : 'disabled'}`)
|
|
100
|
+
* })
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```tsx
|
|
105
|
+
* import { checkProductStatus } from '@remkoj/optimizely-one-nextjs'
|
|
106
|
+
*
|
|
107
|
+
* // Check with custom configuration
|
|
108
|
+
* const customConfig = {
|
|
109
|
+
* OdpApiKey: 'my-api-key-12345678',
|
|
110
|
+
* WebExperimentationProject: 'campaign-123456',
|
|
111
|
+
* ContentRecsClient: 'my-client',
|
|
112
|
+
* ContentRecsDeliveryKey: 'content-key'
|
|
113
|
+
* }
|
|
114
|
+
* const productStatus = checkProductStatus(customConfig)
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
19
117
|
export function checkProductStatus(config) {
|
|
20
118
|
const appConfig = config ?? readConfigFromEnv();
|
|
21
119
|
return {
|
|
22
120
|
dataPlatform: typeof (appConfig.OdpApiKey) == 'string' && appConfig.OdpApiKey.length > 8,
|
|
23
121
|
contentRecsClient: appConfig.ContentRecsClient && appConfig.ContentRecsDelivery ? true : false,
|
|
24
122
|
contentRecsApi: appConfig.ContentRecsClient && appConfig.ContentRecsDeliveryKey ? true : false,
|
|
25
|
-
webExperimentation: typeof (appConfig.WebExperimentationProject) == 'string' && appConfig.WebExperimentationProject.length > 5
|
|
123
|
+
webExperimentation: typeof (appConfig.WebExperimentationProject) == 'string' && appConfig.WebExperimentationProject.length > 5,
|
|
124
|
+
featureExperimentation: typeof (appConfig.FeatureExperimentationSdkKey) == 'string' && appConfig.FeatureExperimentationSdkKey.length > 5
|
|
26
125
|
};
|
|
27
126
|
}
|
|
28
127
|
export default readConfigFromEnv;
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,OAAO,MAAM,YAAY,CAAA;AAEhC,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC;QAC/C,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QACvC,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,wBAAwB,CAAC;QACnE,oBAAoB,EAAE,cAAc,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;QACtE,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC;QAC/D,iBAAiB,EAAE,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC;QACvD,mBAAmB,EAAE,cAAc,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACnE,sBAAsB,EAAE,SAAS,CAAC,OAAO,CAAC,sBAAsB,CAAC;QACjE,eAAe,EAAE,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC;QAC9D,cAAc,EAAE,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC;QAC9D,yBAAyB,EAAE,SAAS,CAAC,OAAO,CAAC,yBAAyB,CAAC;QACvE,eAAe,EAAE,kBAAkB,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,OAAO,MAAM,YAAY,CAAA;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC;QAC/C,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QACvC,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,wBAAwB,CAAC;QACnE,oBAAoB,EAAE,cAAc,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;QACtE,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC;QAC/D,iBAAiB,EAAE,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC;QACvD,mBAAmB,EAAE,cAAc,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACnE,sBAAsB,EAAE,SAAS,CAAC,OAAO,CAAC,sBAAsB,CAAC;QACjE,eAAe,EAAE,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC;QAC9D,cAAc,EAAE,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC;QAC9D,yBAAyB,EAAE,SAAS,CAAC,OAAO,CAAC,yBAAyB,CAAC;QACvE,eAAe,EAAE,kBAAkB,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC;QACnE,6BAA6B,EAAE,SAAS,CAAC,OAAO,CAAC,6BAA6B,CAAC;QAC/E,4BAA4B,EAAE,SAAS,CAAC,OAAO,CAAC,4BAA4B,CAAC;QAC7E,2BAA2B,EAAE,SAAS,CAAC,OAAO,CAAC,yBAAyB,CAAC;KAC1E,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA+B;IAOhE,MAAM,SAAS,GAA2B,MAAM,IAAI,iBAAiB,EAAE,CAAA;IACvE,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,QAAQ,IAAI,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QACxF,iBAAiB,EAAE,SAAS,CAAC,iBAAiB,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;QAC9F,cAAc,EAAE,SAAS,CAAC,iBAAiB,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;QAC9F,kBAAkB,EAAE,OAAO,CAAC,SAAS,CAAC,yBAAyB,CAAC,IAAI,QAAQ,IAAI,SAAS,CAAC,yBAAyB,CAAC,MAAM,GAAG,CAAC;QAC9H,sBAAsB,EAAE,OAAO,CAAC,SAAS,CAAC,4BAA4B,CAAC,IAAI,QAAQ,IAAI,SAAS,CAAC,4BAA4B,CAAC,MAAM,GAAG,CAAC;KACzI,CAAA;AACH,CAAC;AAwBD,eAAe,iBAAiB,CAAA"}
|
package/dist/env-vars.d.ts
CHANGED
|
@@ -9,6 +9,9 @@ export declare const enum EnvVars {
|
|
|
9
9
|
ContentRecsHost = "OPTIMIZELY_CONTENTRECS_DOMAIN",
|
|
10
10
|
FrontendCookie = "OPTIMIZELY_FRONTEND_COOKIE",
|
|
11
11
|
WebExperimentationProject = "OPTIMIZELY_WEB_EXPERIMENTATION_PROJECT",
|
|
12
|
+
FeatureExperimentationSdkKey = "OPTIMIZELY_FX_SDKKEY",
|
|
13
|
+
FeatureExperimentationProject = "OPTIMIZELY_FX_PROJECT",
|
|
14
|
+
FeatureExperimentationPat = "OPTIMIZELY_FX_PAT",
|
|
12
15
|
OptimizelyDebug = "OPTIMIZELY_DEBUG"
|
|
13
16
|
}
|
|
14
17
|
export default EnvVars;
|
package/dist/env-vars.js
CHANGED
|
@@ -10,6 +10,9 @@ export var EnvVars;
|
|
|
10
10
|
EnvVars["ContentRecsHost"] = "OPTIMIZELY_CONTENTRECS_DOMAIN";
|
|
11
11
|
EnvVars["FrontendCookie"] = "OPTIMIZELY_FRONTEND_COOKIE";
|
|
12
12
|
EnvVars["WebExperimentationProject"] = "OPTIMIZELY_WEB_EXPERIMENTATION_PROJECT";
|
|
13
|
+
EnvVars["FeatureExperimentationSdkKey"] = "OPTIMIZELY_FX_SDKKEY";
|
|
14
|
+
EnvVars["FeatureExperimentationProject"] = "OPTIMIZELY_FX_PROJECT";
|
|
15
|
+
EnvVars["FeatureExperimentationPat"] = "OPTIMIZELY_FX_PAT";
|
|
13
16
|
EnvVars["OptimizelyDebug"] = "OPTIMIZELY_DEBUG";
|
|
14
17
|
})(EnvVars || (EnvVars = {}));
|
|
15
18
|
export default EnvVars;
|
package/dist/env-vars.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-vars.js","sourceRoot":"","sources":["../src/env-vars.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAkB,
|
|
1
|
+
{"version":3,"file":"env-vars.js","sourceRoot":"","sources":["../src/env-vars.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAkB,OAejB;AAfD,WAAkB,OAAO;IACvB,mDAAwC,CAAA;IACxC,0DAA+C,CAAA;IAC/C,sEAA2D,CAAA;IAC3D,kDAAuC,CAAA;IACvC,8DAAmD,CAAA;IACnD,kEAAuD,CAAA;IACvD,yEAA8D,CAAA;IAC9D,4DAAiD,CAAA;IACjD,wDAA6C,CAAA;IAC7C,+EAAoE,CAAA;IACpE,gEAAqD,CAAA;IACrD,kEAAuD,CAAA;IACvD,0DAA+C,CAAA;IAC/C,+CAAoC,CAAA;AACtC,CAAC,EAfiB,OAAO,KAAP,OAAO,QAexB;AAED,eAAe,OAAO,CAAA"}
|
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
import * as ClientApi from '../../client-types';
|
|
2
|
-
|
|
2
|
+
import * as GlobalClientTypes from '../../components/types';
|
|
3
|
+
export declare class ContentRecsService implements ClientApi.OptimizelyOneService<ClientApi.OptimizelyContentRecsApi, 'crecs'> {
|
|
4
|
+
private _apiEnabled;
|
|
5
|
+
private _clientEnabled;
|
|
6
|
+
constructor(enabledServices?: Array<GlobalClientTypes.SupportedProductNames>);
|
|
7
|
+
get isApiEnabled(): boolean;
|
|
8
|
+
get isClientEnabled(): boolean;
|
|
3
9
|
order: Readonly<number>;
|
|
4
|
-
code: Readonly<
|
|
10
|
+
code: Readonly<'crecs'>;
|
|
5
11
|
debug: boolean;
|
|
6
12
|
endpoint: string;
|
|
7
13
|
get isActive(): boolean;
|
|
8
14
|
trackPage(): void;
|
|
15
|
+
trackEvent(event: ClientApi.OptimizelyOneEvent): void;
|
|
9
16
|
getBrowserApi(): ClientApi.OptimizelyContentRecsApi | undefined;
|
|
10
|
-
discoverProfileData(signal?: AbortSignal | null): Promise<ClientApi.OptimizelyOneProfileData
|
|
17
|
+
discoverProfileData(signal?: AbortSignal | null): Promise<Partial<ClientApi.OptimizelyOneProfileData>>;
|
|
11
18
|
}
|
|
12
19
|
export default ContentRecsService;
|
|
@@ -1,13 +1,33 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
export class ContentRecsService {
|
|
3
|
+
_apiEnabled = true;
|
|
4
|
+
_clientEnabled = true;
|
|
5
|
+
constructor(enabledServices) {
|
|
6
|
+
if (enabledServices) {
|
|
7
|
+
this._apiEnabled = enabledServices.includes("contentRecsApi");
|
|
8
|
+
this._clientEnabled = enabledServices.includes("contentRecsClient");
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
this._apiEnabled = false;
|
|
12
|
+
this._clientEnabled = false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
get isApiEnabled() {
|
|
16
|
+
return this._apiEnabled;
|
|
17
|
+
}
|
|
18
|
+
get isClientEnabled() {
|
|
19
|
+
return this._clientEnabled;
|
|
20
|
+
}
|
|
3
21
|
order = 300;
|
|
4
|
-
code =
|
|
22
|
+
code = 'crecs';
|
|
5
23
|
debug = false;
|
|
6
24
|
endpoint = "/api/me/cgoals";
|
|
7
25
|
get isActive() {
|
|
8
|
-
return this.
|
|
26
|
+
return this._apiEnabled || this._clientEnabled;
|
|
9
27
|
}
|
|
10
28
|
trackPage() {
|
|
29
|
+
if (!this._clientEnabled)
|
|
30
|
+
return;
|
|
11
31
|
const idio = this.getBrowserApi();
|
|
12
32
|
if (!idio)
|
|
13
33
|
return;
|
|
@@ -15,8 +35,22 @@ export class ContentRecsService {
|
|
|
15
35
|
console.log("Content Recommendations / Analytics - Tracking page view");
|
|
16
36
|
idio.push(['track', 'consume']);
|
|
17
37
|
}
|
|
38
|
+
trackEvent(event) {
|
|
39
|
+
const idio = this.getBrowserApi();
|
|
40
|
+
if (!idio)
|
|
41
|
+
return; // We're disabled so, stop here
|
|
42
|
+
const goalName = [event.event, event.action].filter(x => x).join('-');
|
|
43
|
+
if (!goalName || goalName.length == 0)
|
|
44
|
+
return; // Only track if we've a goal
|
|
45
|
+
if (this.debug)
|
|
46
|
+
console.log("Content Recommendations / Analytics - Tracking goal: " + goalName);
|
|
47
|
+
idio.push(['goal', goalName]);
|
|
48
|
+
idio.push(['track', 'convert']);
|
|
49
|
+
}
|
|
18
50
|
getBrowserApi() {
|
|
19
51
|
try {
|
|
52
|
+
if (!this._clientEnabled)
|
|
53
|
+
return undefined;
|
|
20
54
|
if (!window._iaq)
|
|
21
55
|
window._iaq = [];
|
|
22
56
|
return window._iaq;
|
|
@@ -26,6 +60,8 @@ export class ContentRecsService {
|
|
|
26
60
|
}
|
|
27
61
|
}
|
|
28
62
|
async discoverProfileData(signal) {
|
|
63
|
+
if (!this._apiEnabled)
|
|
64
|
+
return {};
|
|
29
65
|
const nbg = await fetch(this.endpoint, { cache: 'no-store', signal }).then(r => r.ok ? r.json() : undefined);
|
|
30
66
|
return {
|
|
31
67
|
custom: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/products/content-recs/client.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/products/content-recs/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,22 +2,22 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
/* eslint @next/next/no-before-interactive-script-outside-document: 0 */
|
|
3
3
|
import Script from 'next/script';
|
|
4
4
|
export const OptimizelyContentRecsTrackingScript = ({ client: client_id, delivery: delivery_id, domain = 'idio.co' }) => {
|
|
5
|
-
return _jsx(Script, { id: 'content-recs-script', strategy: 'beforeInteractive', children: `
|
|
6
|
-
// Set client and delivery
|
|
7
|
-
_iaq = [
|
|
8
|
-
['client', ${JSON.stringify(client_id)}],
|
|
9
|
-
['delivery', ${JSON.stringify(delivery_id)}]
|
|
10
|
-
];
|
|
11
|
-
|
|
12
|
-
// Include Content Analytics
|
|
13
|
-
!function(d,s){
|
|
14
|
-
var ia=d.createElement(s);
|
|
15
|
-
ia.async=1;
|
|
16
|
-
ia.id='content-recs-snippet';
|
|
17
|
-
ia.src='//s.${domain}/ia.js';
|
|
18
|
-
s=d.getElementById('content-recs-script');
|
|
19
|
-
s.parentNode.insertBefore(ia,s)
|
|
20
|
-
}(document,'script');
|
|
5
|
+
return _jsx(Script, { id: 'content-recs-script', strategy: 'beforeInteractive', children: `
|
|
6
|
+
// Set client and delivery
|
|
7
|
+
_iaq = [
|
|
8
|
+
['client', ${JSON.stringify(client_id)}],
|
|
9
|
+
['delivery', ${JSON.stringify(delivery_id)}]
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
// Include Content Analytics
|
|
13
|
+
!function(d,s){
|
|
14
|
+
var ia=d.createElement(s);
|
|
15
|
+
ia.async=1;
|
|
16
|
+
ia.id='content-recs-snippet';
|
|
17
|
+
ia.src='//s.${domain}/ia.js';
|
|
18
|
+
s=d.getElementById('content-recs-script');
|
|
19
|
+
s.parentNode.insertBefore(ia,s)
|
|
20
|
+
}(document,'script');
|
|
21
21
|
` });
|
|
22
22
|
};
|
|
23
23
|
export default OptimizelyContentRecsTrackingScript;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import getConfig, { checkProductStatus } from '
|
|
3
|
-
import * as Responses from '
|
|
1
|
+
import * as ContentRecs from './';
|
|
2
|
+
import getConfig, { checkProductStatus } from '../../config';
|
|
3
|
+
import * as Responses from '../../api/responses';
|
|
4
4
|
export const ContentRecsGoalsService = {
|
|
5
5
|
for: { path: '/cgoals', verb: 'get' },
|
|
6
6
|
handler: async (query, cookies) => {
|
|
@@ -19,4 +19,4 @@ export const ContentRecsGoalsService = {
|
|
|
19
19
|
}
|
|
20
20
|
};
|
|
21
21
|
export default ContentRecsGoalsService;
|
|
22
|
-
//# sourceMappingURL=
|
|
22
|
+
//# sourceMappingURL=webservice-goals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webservice-goals.js","sourceRoot":"","sources":["../../../src/products/content-recs/webservice-goals.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,WAAW,MAAM,IAAI,CAAA;AACjC,OAAO,SAAS,EAAE,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,KAAK,SAAS,MAAM,qBAAqB,CAAA;AAgBhD,MAAM,CAAC,MAAM,uBAAuB,GAA6B;IAC/D,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE;IACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE,OAAO,SAAS,CAAC,QAAQ,CAAA;QAEpD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;QAC3C,IAAI,CAAC,QAAQ,CAAC,cAAc;YAAE,OAAO,SAAS,CAAC,QAAQ,CAAA;QAEvD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,OAAO,CAAC,CAAA;QAC1D,IAAI,CAAC,IAAI;YACP,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;QAC7B,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QAC7C,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;QAC9E,OAAO,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,GAAG,CAAC,CAAA;IACxC,CAAC;CACF,CAAA;AAED,eAAe,uBAAuB,CAAA"}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
import { ContentRecs } from '../
|
|
2
|
-
import { readConfigFromEnv } from '
|
|
3
|
-
import * as Responses from '
|
|
1
|
+
import { ContentRecs } from '../index.js';
|
|
2
|
+
import { readConfigFromEnv } from '../../config.js';
|
|
3
|
+
import * as Responses from '../../api/responses.js';
|
|
4
4
|
export const ContentRecsApiService = {
|
|
5
5
|
for: { path: '/crecs', verb: 'get' },
|
|
6
6
|
handler: async (query, cookies) => {
|
|
7
|
+
// Read configuration
|
|
7
8
|
const optiOneConfig = readConfigFromEnv();
|
|
8
9
|
if (!optiOneConfig.ContentRecsHost)
|
|
9
10
|
return Responses.NotFound;
|
|
11
|
+
// Identify visitor
|
|
10
12
|
const crId = ContentRecs.Tools.getVisitorID(await cookies);
|
|
11
13
|
if (!crId)
|
|
12
14
|
return [{ total_hits: 0, content: [] }, 200];
|
|
15
|
+
// Send request to Content Recommendations, and strip JSONP function call
|
|
13
16
|
const recsService = new URL(`https://api.${optiOneConfig.ContentRecsHost}/1.0/users/idio_visitor_id:${crId}/content?callback=fn`);
|
|
14
17
|
query.forEach((value, name) => {
|
|
15
18
|
if (name.toLowerCase() != 'callback')
|
|
@@ -20,20 +23,18 @@ export const ContentRecsApiService = {
|
|
|
20
23
|
return [{ error: { status: snippetResponse.status, message: snippetResponse.statusText } }, snippetResponse.status];
|
|
21
24
|
const body = await snippetResponse.text();
|
|
22
25
|
const jsonData = body.substring(body.indexOf('{'), body.lastIndexOf('}') + 1);
|
|
26
|
+
// Convert and return data
|
|
23
27
|
try {
|
|
24
28
|
const recsData = JSON.parse(jsonData);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
next_page: (new URL(recsData.next_page)).search
|
|
29
|
-
},
|
|
30
|
-
200
|
|
31
|
-
];
|
|
29
|
+
if (recsData.next_page)
|
|
30
|
+
recsData.next_page = (new URL(recsData.next_page)).search;
|
|
31
|
+
return [recsData, 200];
|
|
32
32
|
}
|
|
33
|
-
catch {
|
|
33
|
+
catch (e) {
|
|
34
|
+
console.error("Error in processing Content Recommendations", e);
|
|
34
35
|
return [{ error: { status: 500, message: "Unable to parse Content Recommendations data" } }, 500];
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
};
|
|
38
39
|
export default ContentRecsApiService;
|
|
39
|
-
//# sourceMappingURL=
|
|
40
|
+
//# sourceMappingURL=webservice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webservice.js","sourceRoot":"","sources":["../../../src/products/content-recs/webservice.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAA;AAEnD,MAAM,CAAC,MAAM,qBAAqB,GAAoB;IACpD,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE;IACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChC,qBAAqB;QACrB,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;QAC1C,IAAI,CAAC,aAAa,CAAC,eAAe;YAChC,OAAO,SAAS,CAAC,QAAQ,CAAA;QAE3B,mBAAmB;QACnB,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,OAAO,CAAC,CAAA;QAC1D,IAAI,CAAC,IAAI;YACP,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;QAE9C,yEAAyE;QACzE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,eAAe,aAAa,CAAC,eAAe,8BAA8B,IAAI,sBAAsB,CAAC,CAAA;QACjI,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC5B,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,UAAU;gBAClC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QACF,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;QACvE,IAAI,CAAC,eAAe,CAAC,EAAE;YACrB,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,UAAU,EAAE,EAAE,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;QACrH,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,CAAA;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QAE7E,0BAA0B;QAC1B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YACrC,IAAI,QAAQ,CAAC,SAAS;gBACpB,QAAQ,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAA;YAC3D,OAAO,CAAE,QAAQ,EAAE,GAAG,CAAE,CAAA;QAC1B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,CAAC,CAAC,CAAA;YAC/D,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,8CAA8C,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;QACnG,CAAC;IACH,CAAC;CACF,CAAA;AAED,eAAe,qBAAqB,CAAA"}
|
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
import * as ClientApi from '../../client-types';
|
|
2
|
-
|
|
2
|
+
import * as GlobalClientTypes from '../../components/types';
|
|
3
|
+
export declare class DataPlatformService implements ClientApi.OptimizelyOneService<ClientApi.OptimizelyDataPlatformApi, 'odp'> {
|
|
4
|
+
private _odpEnabled;
|
|
5
|
+
constructor(enabledServices?: Array<GlobalClientTypes.SupportedProductNames>);
|
|
3
6
|
order: Readonly<number>;
|
|
4
|
-
code: Readonly<
|
|
7
|
+
code: Readonly<'odp'>;
|
|
5
8
|
debug: boolean;
|
|
6
9
|
get isActive(): boolean;
|
|
7
10
|
trackPage(): void;
|
|
8
11
|
trackEvent(event: ClientApi.OptimizelyOneEvent): void;
|
|
9
12
|
getBrowserApi(): ClientApi.OptimizelyDataPlatformApi | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Discover the visitorId cookie and make it available to the systems as identifier
|
|
15
|
+
*
|
|
16
|
+
* @returns The partial profile data
|
|
17
|
+
*/
|
|
18
|
+
discoverProfileData(): Promise<Partial<ClientApi.OptimizelyOneProfileData>>;
|
|
10
19
|
updateProfile(profileData: ClientApi.OptimizelyOneProfileData): void;
|
|
11
20
|
private lastTrackedContentIntelligenceId;
|
|
12
21
|
private get contentIntelligenceId();
|
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
export class DataPlatformService {
|
|
3
|
+
_odpEnabled = true;
|
|
4
|
+
constructor(enabledServices) {
|
|
5
|
+
if (enabledServices)
|
|
6
|
+
this._odpEnabled = enabledServices.includes("dataPlatform");
|
|
7
|
+
}
|
|
3
8
|
order = 200;
|
|
4
|
-
code =
|
|
9
|
+
code = 'odp';
|
|
5
10
|
debug = false;
|
|
6
11
|
get isActive() {
|
|
7
|
-
return this.
|
|
12
|
+
return this._odpEnabled;
|
|
8
13
|
}
|
|
9
14
|
trackPage() {
|
|
15
|
+
if (!this._odpEnabled)
|
|
16
|
+
return;
|
|
10
17
|
const zaius = this.getBrowserApi();
|
|
11
18
|
if (!zaius)
|
|
12
19
|
return;
|
|
@@ -21,37 +28,73 @@ export class DataPlatformService {
|
|
|
21
28
|
}
|
|
22
29
|
}
|
|
23
30
|
trackEvent(event) {
|
|
31
|
+
if (!this._odpEnabled)
|
|
32
|
+
return;
|
|
24
33
|
const zaius = this.getBrowserApi();
|
|
25
34
|
if (!zaius)
|
|
26
35
|
return;
|
|
27
36
|
const event_name = event.event;
|
|
28
|
-
const event_data = {
|
|
29
|
-
for (const prop_name of Object.getOwnPropertyNames(event)) {
|
|
37
|
+
const event_data = Object.entries(event).reduce((data, [prop_name, prop_value]) => {
|
|
30
38
|
if (prop_name != 'event')
|
|
31
|
-
|
|
32
|
-
|
|
39
|
+
data[prop_name] = prop_value;
|
|
40
|
+
return data;
|
|
41
|
+
}, {});
|
|
33
42
|
if (this.debug)
|
|
34
43
|
console.log("🏬 Data platform - Tracking event:", event_name, event_data);
|
|
35
44
|
zaius.event(event_name, event_data);
|
|
36
45
|
}
|
|
37
46
|
getBrowserApi() {
|
|
38
47
|
try {
|
|
48
|
+
if (!this._odpEnabled)
|
|
49
|
+
return undefined;
|
|
39
50
|
return window.zaius;
|
|
40
51
|
}
|
|
41
52
|
catch {
|
|
42
53
|
return undefined;
|
|
43
54
|
}
|
|
44
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Discover the visitorId cookie and make it available to the systems as identifier
|
|
58
|
+
*
|
|
59
|
+
* @returns The partial profile data
|
|
60
|
+
*/
|
|
61
|
+
discoverProfileData() {
|
|
62
|
+
return new Promise((resolve) => {
|
|
63
|
+
try {
|
|
64
|
+
const cookies = document.cookie.split(';').map(x => x.trim().split('=', 2)).reduce((obj, cData) => { obj[cData[0]] = cData[1]; return obj; }, {});
|
|
65
|
+
const visitorId = cookies['visitorId'];
|
|
66
|
+
if (visitorId)
|
|
67
|
+
return resolve({ feature_experimentation_id: visitorId });
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
//Ignore errors on purpose
|
|
71
|
+
}
|
|
72
|
+
return resolve({});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
45
75
|
updateProfile(profileData) {
|
|
46
76
|
const zaius = this.getBrowserApi();
|
|
47
77
|
if (!zaius)
|
|
48
78
|
return;
|
|
49
|
-
|
|
79
|
+
// Build IDs
|
|
80
|
+
const ids = { ...profileData.ids };
|
|
50
81
|
if (profileData.content_intelligence_id)
|
|
51
82
|
ids.content_intelligence_id = profileData.content_intelligence_id;
|
|
83
|
+
if (profileData.feature_experimentation_id)
|
|
84
|
+
ids.fs_user_id = profileData.feature_experimentation_id;
|
|
85
|
+
// Build fields
|
|
86
|
+
const fields = Object.entries({
|
|
87
|
+
...ids,
|
|
88
|
+
...profileData.custom,
|
|
89
|
+
...profileData.customPII
|
|
90
|
+
}).reduce((acc, [key, value]) => {
|
|
91
|
+
if (value)
|
|
92
|
+
acc[key] = value;
|
|
93
|
+
return acc;
|
|
94
|
+
}, {});
|
|
52
95
|
if (this.debug)
|
|
53
|
-
console.log("🏬 Data platform - Updating profile (ids, attributes):", ids,
|
|
54
|
-
zaius.customer(ids,
|
|
96
|
+
console.log("🏬 Data platform - Updating profile (ids, attributes):", ids, fields);
|
|
97
|
+
zaius.customer(ids, fields);
|
|
55
98
|
}
|
|
56
99
|
lastTrackedContentIntelligenceId = undefined;
|
|
57
100
|
get contentIntelligenceId() {
|