@fabricorg/experiments-web-adapters 0.0.3 → 0.1.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/dist/index.cjs +4 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -43,7 +43,8 @@ function dataLayerAdapter(options = {}) {
|
|
|
43
43
|
return (record) => {
|
|
44
44
|
var _a2;
|
|
45
45
|
const w = globalThis;
|
|
46
|
-
|
|
46
|
+
if (!w.dataLayer) w.dataLayer = [];
|
|
47
|
+
const dl = (_a2 = options.dataLayer) != null ? _a2 : w.dataLayer;
|
|
47
48
|
dl.push({
|
|
48
49
|
event: eventName,
|
|
49
50
|
fx_experiment_id: record.experimentId,
|
|
@@ -94,7 +95,8 @@ function dataLayerFailureAdapter(options = {}) {
|
|
|
94
95
|
var _a2;
|
|
95
96
|
if (!record.failure) return;
|
|
96
97
|
const w = globalThis;
|
|
97
|
-
|
|
98
|
+
if (!w.dataLayer) w.dataLayer = [];
|
|
99
|
+
const dl = (_a2 = options.dataLayer) != null ? _a2 : w.dataLayer;
|
|
98
100
|
dl.push({
|
|
99
101
|
event: eventName,
|
|
100
102
|
fx_experiment_id: record.experimentId,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["_a"],"mappings":";;;AAiBO,SAAS,eAAA,CAAgB,OAAA,GAAkC,EAAC,EAAoB;AAjBvF,EAAA,IAAA,EAAA;AAkBE,EAAA,MAAM,MAAA,GAAA,CAAS,EAAA,GAAA,OAAA,CAAQ,MAAA,KAAR,IAAA,GAAA,EAAA,GAAkB,sDAAA;AACjC,EAAA,OAAO,CAAC,MAAA,KAAW;AAnBrB,IAAA,IAAAA,GAAAA;AAoBI,IAAA,MAAM,WACJA,GAAAA,GAAA,OAAA,CAAQ,OAAA,KAAR,IAAA,GAAAA,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["_a"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ExposureRecord } from '@fabricorg/experiments-web';\n\nexport type ExposureAdapter = (record: ExposureRecord) => void;\n\n/**\n * Snowplow self-describing exposure event.\n *\n * Schema: iglu:io.fabric.experiments/exposure/jsonschema/1-0-0\n * (host the schema in your Iglu repo to validate downstream).\n */\nexport interface SnowplowAdapterOptions {\n /** Tracker function: typically `(window as any).snowplow` or the explicit tracker. */\n tracker?: (...args: unknown[]) => void;\n /** Schema URI. Override if you publish a custom schema. */\n schema?: string;\n}\n\nexport function snowplowAdapter(options: SnowplowAdapterOptions = {}): ExposureAdapter {\n const schema = options.schema ?? 'iglu:io.fabric.experiments/exposure/jsonschema/1-0-0';\n return (record) => {\n const tracker =\n options.tracker ?? (globalThis as { snowplow?: (...args: unknown[]) => void }).snowplow;\n if (!tracker) return;\n tracker('trackSelfDescribingEvent', {\n event: {\n schema,\n data: {\n experimentId: record.experimentId,\n variantKey: record.variantKey,\n subjectId: record.subjectId,\n manifestVersion: record.manifestVersion,\n at: record.at,\n failure: record.failure,\n },\n },\n });\n };\n}\n\n/**\n * Google Analytics 4 (gtag) adapter.\n * Sends an `experiment_exposure` event with custom dimensions.\n */\nexport interface GaAdapterOptions {\n gtag?: (...args: unknown[]) => void;\n /** Override the event name. Default: `experiment_exposure`. */\n eventName?: string;\n}\n\nexport function gaAdapter(options: GaAdapterOptions = {}): ExposureAdapter {\n const eventName = options.eventName ?? 'experiment_exposure';\n return (record) => {\n const gtag = options.gtag ?? (globalThis as { gtag?: (...args: unknown[]) => void }).gtag;\n if (!gtag) return;\n gtag('event', eventName, {\n experiment_id: record.experimentId,\n variant_key: record.variantKey,\n manifest_version: record.manifestVersion,\n });\n };\n}\n\n/**\n * Generic GTM dataLayer adapter — pushes a single event GTM tags can listen for.\n * This is also the default tag-loader behavior.\n */\nexport interface DataLayerAdapterOptions {\n /** Override the dataLayer reference (tests). */\n dataLayer?: Array<Record<string, unknown>>;\n /** Override the event name. Default: `fx_exposure`. */\n eventName?: string;\n}\n\nexport function dataLayerAdapter(options: DataLayerAdapterOptions = {}): ExposureAdapter {\n const eventName = options.eventName ?? 'fx_exposure';\n return (record) => {\n const w = globalThis as { dataLayer?: Array<Record<string, unknown>> };\n if (!w.dataLayer) w.dataLayer = [];\n const dl = options.dataLayer ?? w.dataLayer;\n dl.push({\n event: eventName,\n fx_experiment_id: record.experimentId,\n fx_variant_key: record.variantKey,\n fx_subject_id: record.subjectId,\n fx_manifest_version: record.manifestVersion,\n });\n };\n}\n\n/**\n * Fan out a single exposure to multiple adapters. Each adapter is wrapped in\n * a try/catch so a third-party tracker error never breaks the chain.\n */\nexport function compose(...adapters: readonly ExposureAdapter[]): ExposureAdapter {\n return (record) => {\n for (const a of adapters) {\n try {\n a(record);\n } catch {\n /* swallow */\n }\n }\n };\n}\n\n// ---- Failure adapters (Mojito onRecipeFailure parity) ----------------------\n\n/**\n * Snowplow self-describing event for variant failures.\n *\n * Schema: iglu:io.fabric.experiments/recipe_failure/jsonschema/1-0-0\n * Fires once per (experimentId, variantKey, message) — useful for alarming\n * on variant-code crashes without cluttering the exposure stream.\n */\nexport interface SnowplowFailureAdapterOptions extends SnowplowAdapterOptions {\n schema?: string;\n}\n\nexport function snowplowFailureAdapter(\n options: SnowplowFailureAdapterOptions = {},\n): ExposureAdapter {\n const schema = options.schema ?? 'iglu:io.fabric.experiments/recipe_failure/jsonschema/1-0-0';\n return (record) => {\n if (!record.failure) return;\n const tracker =\n options.tracker ?? (globalThis as { snowplow?: (...args: unknown[]) => void }).snowplow;\n if (!tracker) return;\n tracker('trackSelfDescribingEvent', {\n event: {\n schema,\n data: {\n experimentId: record.experimentId,\n variantKey: record.variantKey,\n subjectId: record.subjectId,\n manifestVersion: record.manifestVersion,\n at: record.at,\n message: record.failure.message,\n stack: record.failure.stack,\n },\n },\n });\n };\n}\n\n/** dataLayer push for variant failures — pairs with the default exposure adapter. */\nexport function dataLayerFailureAdapter(options: DataLayerAdapterOptions = {}): ExposureAdapter {\n const eventName = options.eventName ?? 'fx_recipe_failure';\n return (record) => {\n if (!record.failure) return;\n const w = globalThis as { dataLayer?: Array<Record<string, unknown>> };\n if (!w.dataLayer) w.dataLayer = [];\n const dl = options.dataLayer ?? w.dataLayer;\n dl.push({\n event: eventName,\n fx_experiment_id: record.experimentId,\n fx_variant_key: record.variantKey,\n fx_subject_id: record.subjectId,\n fx_manifest_version: record.manifestVersion,\n fx_failure_message: record.failure.message,\n });\n };\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -41,7 +41,8 @@ function dataLayerAdapter(options = {}) {
|
|
|
41
41
|
return (record) => {
|
|
42
42
|
var _a2;
|
|
43
43
|
const w = globalThis;
|
|
44
|
-
|
|
44
|
+
if (!w.dataLayer) w.dataLayer = [];
|
|
45
|
+
const dl = (_a2 = options.dataLayer) != null ? _a2 : w.dataLayer;
|
|
45
46
|
dl.push({
|
|
46
47
|
event: eventName,
|
|
47
48
|
fx_experiment_id: record.experimentId,
|
|
@@ -92,7 +93,8 @@ function dataLayerFailureAdapter(options = {}) {
|
|
|
92
93
|
var _a2;
|
|
93
94
|
if (!record.failure) return;
|
|
94
95
|
const w = globalThis;
|
|
95
|
-
|
|
96
|
+
if (!w.dataLayer) w.dataLayer = [];
|
|
97
|
+
const dl = (_a2 = options.dataLayer) != null ? _a2 : w.dataLayer;
|
|
96
98
|
dl.push({
|
|
97
99
|
event: eventName,
|
|
98
100
|
fx_experiment_id: record.experimentId,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["_a"],"mappings":";AAiBO,SAAS,eAAA,CAAgB,OAAA,GAAkC,EAAC,EAAoB;AAjBvF,EAAA,IAAA,EAAA;AAkBE,EAAA,MAAM,MAAA,GAAA,CAAS,EAAA,GAAA,OAAA,CAAQ,MAAA,KAAR,IAAA,GAAA,EAAA,GAAkB,sDAAA;AACjC,EAAA,OAAO,CAAC,MAAA,KAAW;AAnBrB,IAAA,IAAAA,GAAAA;AAoBI,IAAA,MAAM,WACJA,GAAAA,GAAA,OAAA,CAAQ,OAAA,KAAR,IAAA,GAAAA,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["_a"],"mappings":"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","file":"index.js","sourcesContent":["import type { ExposureRecord } from '@fabricorg/experiments-web';\n\nexport type ExposureAdapter = (record: ExposureRecord) => void;\n\n/**\n * Snowplow self-describing exposure event.\n *\n * Schema: iglu:io.fabric.experiments/exposure/jsonschema/1-0-0\n * (host the schema in your Iglu repo to validate downstream).\n */\nexport interface SnowplowAdapterOptions {\n /** Tracker function: typically `(window as any).snowplow` or the explicit tracker. */\n tracker?: (...args: unknown[]) => void;\n /** Schema URI. Override if you publish a custom schema. */\n schema?: string;\n}\n\nexport function snowplowAdapter(options: SnowplowAdapterOptions = {}): ExposureAdapter {\n const schema = options.schema ?? 'iglu:io.fabric.experiments/exposure/jsonschema/1-0-0';\n return (record) => {\n const tracker =\n options.tracker ?? (globalThis as { snowplow?: (...args: unknown[]) => void }).snowplow;\n if (!tracker) return;\n tracker('trackSelfDescribingEvent', {\n event: {\n schema,\n data: {\n experimentId: record.experimentId,\n variantKey: record.variantKey,\n subjectId: record.subjectId,\n manifestVersion: record.manifestVersion,\n at: record.at,\n failure: record.failure,\n },\n },\n });\n };\n}\n\n/**\n * Google Analytics 4 (gtag) adapter.\n * Sends an `experiment_exposure` event with custom dimensions.\n */\nexport interface GaAdapterOptions {\n gtag?: (...args: unknown[]) => void;\n /** Override the event name. Default: `experiment_exposure`. */\n eventName?: string;\n}\n\nexport function gaAdapter(options: GaAdapterOptions = {}): ExposureAdapter {\n const eventName = options.eventName ?? 'experiment_exposure';\n return (record) => {\n const gtag = options.gtag ?? (globalThis as { gtag?: (...args: unknown[]) => void }).gtag;\n if (!gtag) return;\n gtag('event', eventName, {\n experiment_id: record.experimentId,\n variant_key: record.variantKey,\n manifest_version: record.manifestVersion,\n });\n };\n}\n\n/**\n * Generic GTM dataLayer adapter — pushes a single event GTM tags can listen for.\n * This is also the default tag-loader behavior.\n */\nexport interface DataLayerAdapterOptions {\n /** Override the dataLayer reference (tests). */\n dataLayer?: Array<Record<string, unknown>>;\n /** Override the event name. Default: `fx_exposure`. */\n eventName?: string;\n}\n\nexport function dataLayerAdapter(options: DataLayerAdapterOptions = {}): ExposureAdapter {\n const eventName = options.eventName ?? 'fx_exposure';\n return (record) => {\n const w = globalThis as { dataLayer?: Array<Record<string, unknown>> };\n if (!w.dataLayer) w.dataLayer = [];\n const dl = options.dataLayer ?? w.dataLayer;\n dl.push({\n event: eventName,\n fx_experiment_id: record.experimentId,\n fx_variant_key: record.variantKey,\n fx_subject_id: record.subjectId,\n fx_manifest_version: record.manifestVersion,\n });\n };\n}\n\n/**\n * Fan out a single exposure to multiple adapters. Each adapter is wrapped in\n * a try/catch so a third-party tracker error never breaks the chain.\n */\nexport function compose(...adapters: readonly ExposureAdapter[]): ExposureAdapter {\n return (record) => {\n for (const a of adapters) {\n try {\n a(record);\n } catch {\n /* swallow */\n }\n }\n };\n}\n\n// ---- Failure adapters (Mojito onRecipeFailure parity) ----------------------\n\n/**\n * Snowplow self-describing event for variant failures.\n *\n * Schema: iglu:io.fabric.experiments/recipe_failure/jsonschema/1-0-0\n * Fires once per (experimentId, variantKey, message) — useful for alarming\n * on variant-code crashes without cluttering the exposure stream.\n */\nexport interface SnowplowFailureAdapterOptions extends SnowplowAdapterOptions {\n schema?: string;\n}\n\nexport function snowplowFailureAdapter(\n options: SnowplowFailureAdapterOptions = {},\n): ExposureAdapter {\n const schema = options.schema ?? 'iglu:io.fabric.experiments/recipe_failure/jsonschema/1-0-0';\n return (record) => {\n if (!record.failure) return;\n const tracker =\n options.tracker ?? (globalThis as { snowplow?: (...args: unknown[]) => void }).snowplow;\n if (!tracker) return;\n tracker('trackSelfDescribingEvent', {\n event: {\n schema,\n data: {\n experimentId: record.experimentId,\n variantKey: record.variantKey,\n subjectId: record.subjectId,\n manifestVersion: record.manifestVersion,\n at: record.at,\n message: record.failure.message,\n stack: record.failure.stack,\n },\n },\n });\n };\n}\n\n/** dataLayer push for variant failures — pairs with the default exposure adapter. */\nexport function dataLayerFailureAdapter(options: DataLayerAdapterOptions = {}): ExposureAdapter {\n const eventName = options.eventName ?? 'fx_recipe_failure';\n return (record) => {\n if (!record.failure) return;\n const w = globalThis as { dataLayer?: Array<Record<string, unknown>> };\n if (!w.dataLayer) w.dataLayer = [];\n const dl = options.dataLayer ?? w.dataLayer;\n dl.push({\n event: eventName,\n fx_experiment_id: record.experimentId,\n fx_variant_key: record.variantKey,\n fx_subject_id: record.subjectId,\n fx_manifest_version: record.manifestVersion,\n fx_failure_message: record.failure.message,\n });\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fabricorg/experiments-web-adapters",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"registry": "https://registry.npmjs.org",
|
|
6
6
|
"access": "public"
|
|
@@ -22,11 +22,11 @@
|
|
|
22
22
|
"scripts": {
|
|
23
23
|
"build": "tsup",
|
|
24
24
|
"type-check": "tsc --noEmit",
|
|
25
|
-
"test": "vitest run
|
|
25
|
+
"test": "vitest run",
|
|
26
26
|
"clean": "rm -rf dist"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@fabricorg/experiments-web": "
|
|
29
|
+
"@fabricorg/experiments-web": "^0.2.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"tsup": "^8.3.5",
|