@segment/browser-destination-runtime 1.0.0 → 1.4.1-AudienceSettingsSupport.5

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.
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const plugin_1 = require("../plugin");
4
+ describe('generatePlugins', () => {
5
+ const initializeSpy = jest.fn();
6
+ const destinationDefinition = {
7
+ name: 'Test destination',
8
+ slug: 'test-web-destination',
9
+ mode: 'device',
10
+ settings: {},
11
+ initialize: async () => {
12
+ initializeSpy();
13
+ },
14
+ actions: {
15
+ trackEventA: {
16
+ title: 'Track Event',
17
+ description: 'Tests track events',
18
+ platform: 'web',
19
+ defaultSubscription: 'type = "track"',
20
+ fields: {},
21
+ perform: () => { }
22
+ },
23
+ trackEventB: {
24
+ title: 'Track Event',
25
+ description: 'Tests track events',
26
+ platform: 'web',
27
+ defaultSubscription: 'type = "track"',
28
+ fields: {},
29
+ perform: () => { }
30
+ }
31
+ }
32
+ };
33
+ beforeEach(() => {
34
+ jest.resetAllMocks();
35
+ });
36
+ test('only loads once', async () => {
37
+ const plugins = plugin_1.generatePlugins(destinationDefinition, {}, [
38
+ {
39
+ enabled: true,
40
+ mapping: {},
41
+ name: 'a',
42
+ partnerAction: 'trackEventA',
43
+ subscribe: 'type = "track"'
44
+ },
45
+ {
46
+ enabled: true,
47
+ mapping: {},
48
+ name: 'b',
49
+ partnerAction: 'trackEventB',
50
+ subscribe: 'type = "track"'
51
+ }
52
+ ]);
53
+ expect(plugins.length).toBe(2);
54
+ await Promise.all(plugins.map((p) => p.load({}, {})));
55
+ expect(initializeSpy).toHaveBeenCalledTimes(1);
56
+ });
57
+ });
58
+ //# sourceMappingURL=plugin.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.test.js","sourceRoot":"","sources":["../../../src/__tests__/plugin.test.ts"],"names":[],"mappings":";;AACA,sCAA2C;AAE3C,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,EAAE,EAAE,CAAA;IAC/B,MAAM,qBAAqB,GAA8C;QACvE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK,IAAI,EAAE;YACrB,aAAa,EAAE,CAAA;QACjB,CAAC;QACD,OAAO,EAAE;YACP,WAAW,EAAE;gBACX,KAAK,EAAE,aAAa;gBACpB,WAAW,EAAE,oBAAoB;gBACjC,QAAQ,EAAE,KAAK;gBACf,mBAAmB,EAAE,gBAAgB;gBACrC,MAAM,EAAE,EAAE;gBACV,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;aAClB;YACD,WAAW,EAAE;gBACX,KAAK,EAAE,aAAa;gBACpB,WAAW,EAAE,oBAAoB;gBACjC,QAAQ,EAAE,KAAK;gBACf,mBAAmB,EAAE,gBAAgB;gBACrC,MAAM,EAAE,EAAE;gBACV,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;aAClB;SACF;KACF,CAAA;IAED,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QACjC,MAAM,OAAO,GAAG,wBAAe,CAAC,qBAAqB,EAAE,EAAE,EAAE;YACzD;gBACE,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,GAAG;gBACT,aAAa,EAAE,aAAa;gBAC5B,SAAS,EAAE,gBAAgB;aAC5B;YACD;gBACE,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,GAAG;gBACT,aAAa,EAAE,aAAa;gBAC5B,SAAS,EAAE,gBAAgB;aAC5B;SACF,CAAC,CAAA;QAEF,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAE9B,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAS,EAAE,EAAS,CAAC,CAAC,CAAC,CAAA;QAEnE,MAAM,CAAC,aAAa,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export declare function loadScript(src: string, attributes?: Record<string, string>): Promise<HTMLScriptElement>;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadScript = void 0;
4
+ async function loadScript(src, attributes) {
5
+ const scripts = Array.from(window.document.querySelectorAll('script'));
6
+ const found = scripts.find((s) => s.src === src);
7
+ if (found !== undefined) {
8
+ const status = found?.getAttribute('status');
9
+ if (status === 'loaded') {
10
+ return found;
11
+ }
12
+ if (status === 'loading') {
13
+ return new Promise((resolve, reject) => {
14
+ found.addEventListener('load', () => resolve(found));
15
+ found.addEventListener('error', (err) => reject(err));
16
+ });
17
+ }
18
+ }
19
+ return new Promise((resolve, reject) => {
20
+ const script = window.document.createElement('script');
21
+ script.type = 'text/javascript';
22
+ script.src = src;
23
+ script.async = true;
24
+ script.setAttribute('status', 'loading');
25
+ for (const [k, v] of Object.entries(attributes ?? {})) {
26
+ script.setAttribute(k, v);
27
+ }
28
+ script.onload = () => {
29
+ script.onerror = script.onload = null;
30
+ script.setAttribute('status', 'loaded');
31
+ resolve(script);
32
+ };
33
+ script.onerror = () => {
34
+ script.onerror = script.onload = null;
35
+ script.setAttribute('status', 'error');
36
+ reject(new Error(`Failed to load ${src}`));
37
+ };
38
+ const tag = window.document.getElementsByTagName('script')[0];
39
+ tag.parentElement?.insertBefore(script, tag);
40
+ });
41
+ }
42
+ exports.loadScript = loadScript;
43
+ //# sourceMappingURL=load-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-script.js","sourceRoot":"","sources":["../../src/load-script.ts"],"names":[],"mappings":";;;AAAO,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,UAAmC;IAC/E,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAA;IACtE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAA;IAEhD,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,MAAM,MAAM,GAAG,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;QAE5C,IAAI,MAAM,KAAK,QAAQ,EAAE;YACvB,OAAO,KAAK,CAAA;SACb;QAED,IAAI,MAAM,KAAK,SAAS,EAAE;YACxB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;gBACpD,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;YACvD,CAAC,CAAC,CAAA;SACH;KACF;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAEtD,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAA;QAC/B,MAAM,CAAC,GAAG,GAAG,GAAG,CAAA;QAChB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAA;QAEnB,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;YACrD,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;SAC1B;QAED,MAAM,CAAC,MAAM,GAAG,GAAS,EAAE;YACzB,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAA;YACrC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YACvC,OAAO,CAAC,MAAM,CAAC,CAAA;QACjB,CAAC,CAAA;QAED,MAAM,CAAC,OAAO,GAAG,GAAS,EAAE;YAC1B,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAA;YACrC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YACtC,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC,CAAA;QAC5C,CAAC,CAAA;QAED,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7D,GAAG,CAAC,aAAa,EAAE,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;AACJ,CAAC;AA9CD,gCA8CC"}
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from '@segment/analytics-next';
2
+ import { BrowserDestinationDefinition, Subscription } from './types';
3
+ export declare function generatePlugins<S, C>(def: BrowserDestinationDefinition<S, C>, settings: S, subscriptions: Subscription[]): Plugin[];
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generatePlugins = void 0;
4
+ const mapping_kit_1 = require("@segment/actions-core/mapping-kit");
5
+ const destination_subscriptions_1 = require("@segment/destination-subscriptions");
6
+ const load_script_1 = require("./load-script");
7
+ const resolve_when_1 = require("./resolve-when");
8
+ function generatePlugins(def, settings, subscriptions) {
9
+ let hasInitialized = false;
10
+ let client;
11
+ let analytics;
12
+ let initializing;
13
+ const load = async (_ctx, analyticsInstance) => {
14
+ if (hasInitialized) {
15
+ return;
16
+ }
17
+ if (initializing) {
18
+ await initializing;
19
+ return;
20
+ }
21
+ analytics = analyticsInstance;
22
+ initializing = def.initialize?.({ settings, analytics }, { loadScript: load_script_1.loadScript, resolveWhen: resolve_when_1.resolveWhen });
23
+ client = await initializing;
24
+ hasInitialized = true;
25
+ };
26
+ return Object.entries(def.actions).reduce((acc, [key, action]) => {
27
+ // Grab all the enabled subscriptions that invoke this action
28
+ const actionSubscriptions = subscriptions.filter((s) => s.enabled && s.partnerAction === key);
29
+ if (actionSubscriptions.length === 0)
30
+ return acc;
31
+ async function evaluate(ctx) {
32
+ const invocations = [];
33
+ for (const sub of actionSubscriptions) {
34
+ const isSubscribed = destination_subscriptions_1.validate(destination_subscriptions_1.parseFql(sub.subscribe), ctx.event);
35
+ if (!isSubscribed)
36
+ continue;
37
+ const mapping = (sub.mapping ?? {});
38
+ const payload = mapping_kit_1.transform(mapping, ctx.event);
39
+ const input = {
40
+ payload,
41
+ mapping,
42
+ settings,
43
+ analytics,
44
+ context: ctx
45
+ };
46
+ invocations.push(action.perform(client, input));
47
+ }
48
+ await Promise.all(invocations);
49
+ // TODO: some sort of error handling
50
+ return ctx;
51
+ }
52
+ const plugin = {
53
+ name: `${def.name} ${key}`,
54
+ type: action.lifecycleHook ?? 'destination',
55
+ version: '0.1.0',
56
+ ready: () => Promise.resolve(),
57
+ isLoaded: () => hasInitialized,
58
+ load,
59
+ track: evaluate,
60
+ page: evaluate,
61
+ alias: evaluate,
62
+ identify: evaluate,
63
+ group: evaluate
64
+ };
65
+ acc.push(plugin);
66
+ return acc;
67
+ }, []);
68
+ }
69
+ exports.generatePlugins = generatePlugins;
70
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;AAEA,mEAA6D;AAC7D,kFAAuE;AAEvE,+CAA0C;AAC1C,iDAA4C;AAI5C,SAAgB,eAAe,CAC7B,GAAuC,EACvC,QAAW,EACX,aAA6B;IAE7B,IAAI,cAAc,GAAG,KAAK,CAAA;IAC1B,IAAI,MAAS,CAAA;IACb,IAAI,SAAoB,CAAA;IACxB,IAAI,YAAoC,CAAA;IAExC,MAAM,IAAI,GAAmB,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE;QAC7D,IAAI,cAAc,EAAE;YAClB,OAAM;SACP;QAED,IAAI,YAAY,EAAE;YAChB,MAAM,YAAY,CAAA;YAClB,OAAM;SACP;QAED,SAAS,GAAG,iBAAiB,CAAA;QAC7B,YAAY,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAV,wBAAU,EAAE,WAAW,EAAX,0BAAW,EAAE,CAAC,CAAA;QACrF,MAAM,GAAG,MAAM,YAAY,CAAA;QAC3B,cAAc,GAAG,IAAI,CAAA;IACvB,CAAC,CAAA;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE;QAC/D,6DAA6D;QAC7D,MAAM,mBAAmB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,aAAa,KAAK,GAAG,CAAC,CAAA;QAC7F,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,CAAA;QAEhD,KAAK,UAAU,QAAQ,CAAC,GAAY;YAClC,MAAM,WAAW,GAAiC,EAAE,CAAA;YAEpD,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE;gBACrC,MAAM,YAAY,GAAG,oCAAQ,CAAC,oCAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAA;gBACjE,IAAI,CAAC,YAAY;oBAAE,SAAQ;gBAE3B,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAe,CAAA;gBACjD,MAAM,OAAO,GAAG,uBAAS,CAAC,OAAO,EAAE,GAAG,CAAC,KAA8B,CAAC,CAAA;gBAEtE,MAAM,KAAK,GAA4B;oBACrC,OAAO;oBACP,OAAO;oBACP,QAAQ;oBACR,SAAS;oBACT,OAAO,EAAE,GAAG;iBACb,CAAA;gBAED,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA;aAChD;YAED,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YAC9B,oCAAoC;YACpC,OAAO,GAAG,CAAA;QACZ,CAAC;QAED,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE;YAC1B,IAAI,EAAE,MAAM,CAAC,aAAa,IAAI,aAAa;YAC3C,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;YAE9B,QAAQ,EAAE,GAAG,EAAE,CAAC,cAAc;YAC9B,IAAI;YAEJ,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,QAAQ;SAChB,CAAA;QAED,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAChB,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAc,CAAC,CAAA;AACpB,CAAC;AA5ED,0CA4EC"}
@@ -0,0 +1 @@
1
+ export declare function resolveWhen(condition: () => boolean, timeout?: number): Promise<void>;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveWhen = void 0;
4
+ async function resolveWhen(condition, timeout) {
5
+ return new Promise((resolve, _reject) => {
6
+ if (condition()) {
7
+ resolve();
8
+ return;
9
+ }
10
+ const check = () => setTimeout(() => {
11
+ if (condition()) {
12
+ resolve();
13
+ }
14
+ else {
15
+ check();
16
+ }
17
+ }, timeout);
18
+ check();
19
+ });
20
+ }
21
+ exports.resolveWhen = resolveWhen;
22
+ //# sourceMappingURL=resolve-when.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-when.js","sourceRoot":"","sources":["../../src/resolve-when.ts"],"names":[],"mappings":";;;AAAO,KAAK,UAAU,WAAW,CAAC,SAAwB,EAAE,OAAgB;IAC1E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;QACtC,IAAI,SAAS,EAAE,EAAE;YACf,OAAO,EAAE,CAAA;YACT,OAAM;SACP;QAED,MAAM,KAAK,GAAG,GAAG,EAAE,CACjB,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,SAAS,EAAE,EAAE;gBACf,OAAO,EAAE,CAAA;aACV;iBAAM;gBACL,KAAK,EAAE,CAAA;aACR;QACH,CAAC,EAAE,OAAO,CAAC,CAAA;QAEb,KAAK,EAAE,CAAA;IACT,CAAC,CAAC,CAAA;AACJ,CAAC;AAlBD,kCAkBC"}
@@ -0,0 +1,2 @@
1
+ import type { BrowserDestinationDefinition, PluginFactory } from './types';
2
+ export declare function browserDestination<S, C>(definition: BrowserDestinationDefinition<S, C>): PluginFactory;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.browserDestination = void 0;
23
+ function browserDestination(definition) {
24
+ const factory = (async (settings) => {
25
+ const plugin = await Promise.resolve().then(() => __importStar(require(
26
+ /* webpackChunkName: "actions-plugin" */
27
+ /* webpackMode: "lazy-once" */
28
+ './plugin')));
29
+ return plugin.generatePlugins(definition, settings, settings.subscriptions || []);
30
+ });
31
+ factory.pluginName = definition.name;
32
+ return factory;
33
+ }
34
+ exports.browserDestination = browserDestination;
35
+ //# sourceMappingURL=shim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shim.js","sourceRoot":"","sources":["../../src/shim.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAEA,SAAgB,kBAAkB,CAAO,UAA8C;IACrF,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,QAAgD,EAAE,EAAE;QAC1E,MAAM,MAAM,GAAG;QACb,wCAAwC;QACxC,8BAA8B;QAC9B,UAAU,GACX,CAAA;QACD,OAAO,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,aAAa,IAAI,EAAE,CAAC,CAAA;IACnF,CAAC,CAA6B,CAAA;IAE9B,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,IAAI,CAAA;IAEpC,OAAO,OAAO,CAAA;AAChB,CAAC;AAbD,gDAaC"}
@@ -0,0 +1,52 @@
1
+ import type { Analytics, Context, Plugin } from '@segment/analytics-next';
2
+ import type { BaseDefinition, BaseActionDefinition, ExecuteInput, JSONLikeObject, GlobalSetting, JSONValue } from '@segment/actions-core';
3
+ export declare type ActionInput<Settings, Payload> = ExecuteInput<Settings, Payload> & {
4
+ analytics: Analytics;
5
+ context: Context;
6
+ };
7
+ export interface BrowserActionDefinition<Settings, Client, Payload = any> extends BaseActionDefinition {
8
+ /** The operation to perform when this action is triggered */
9
+ perform: (client: Client, data: ActionInput<Settings, Payload>) => Promise<unknown> | unknown;
10
+ /**
11
+ * The target platform for the action
12
+ */
13
+ platform: 'web';
14
+ /** Which step in the Analytics.js lifecycle this action should run */
15
+ lifecycleHook?: Plugin['type'];
16
+ }
17
+ export interface BrowserDestinationDependencies {
18
+ loadScript: (src: string, attributes?: Record<string, string>) => Promise<HTMLScriptElement>;
19
+ resolveWhen: (condition: () => boolean, timeout?: number) => Promise<void>;
20
+ }
21
+ export declare type InitializeOptions<Settings> = {
22
+ settings: Settings;
23
+ analytics: Analytics;
24
+ };
25
+ export interface BrowserDestinationDefinition<Settings = unknown, Client = unknown> extends BaseDefinition {
26
+ mode: 'device';
27
+ /**
28
+ * The function called when the destination has loaded and is ready to be initialized
29
+ * Typically you would configure an SDK or API client here.
30
+ * The return value is injected to your actions as the `client`
31
+ */
32
+ initialize: (options: InitializeOptions<Settings>, dependencies: BrowserDestinationDependencies) => Promise<Client>;
33
+ /**
34
+ * Top-level settings that should be available across all actions
35
+ * This is often where you would put initialization settings,
36
+ * SDK keys, API subdomains, etc.
37
+ */
38
+ settings?: Record<string, GlobalSetting>;
39
+ /** Actions */
40
+ actions: Record<string, BrowserActionDefinition<Settings, Client>>;
41
+ }
42
+ export interface Subscription {
43
+ partnerAction: string;
44
+ name: string;
45
+ enabled: boolean;
46
+ subscribe: string;
47
+ mapping: JSONLikeObject;
48
+ }
49
+ export interface PluginFactory {
50
+ (settings: JSONValue): Plugin | Plugin[] | Promise<Plugin | Plugin[]>;
51
+ pluginName: string;
52
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,56 @@
1
+ import { generatePlugins } from '../plugin';
2
+ describe('generatePlugins', () => {
3
+ const initializeSpy = jest.fn();
4
+ const destinationDefinition = {
5
+ name: 'Test destination',
6
+ slug: 'test-web-destination',
7
+ mode: 'device',
8
+ settings: {},
9
+ initialize: async () => {
10
+ initializeSpy();
11
+ },
12
+ actions: {
13
+ trackEventA: {
14
+ title: 'Track Event',
15
+ description: 'Tests track events',
16
+ platform: 'web',
17
+ defaultSubscription: 'type = "track"',
18
+ fields: {},
19
+ perform: () => { }
20
+ },
21
+ trackEventB: {
22
+ title: 'Track Event',
23
+ description: 'Tests track events',
24
+ platform: 'web',
25
+ defaultSubscription: 'type = "track"',
26
+ fields: {},
27
+ perform: () => { }
28
+ }
29
+ }
30
+ };
31
+ beforeEach(() => {
32
+ jest.resetAllMocks();
33
+ });
34
+ test('only loads once', async () => {
35
+ const plugins = generatePlugins(destinationDefinition, {}, [
36
+ {
37
+ enabled: true,
38
+ mapping: {},
39
+ name: 'a',
40
+ partnerAction: 'trackEventA',
41
+ subscribe: 'type = "track"'
42
+ },
43
+ {
44
+ enabled: true,
45
+ mapping: {},
46
+ name: 'b',
47
+ partnerAction: 'trackEventB',
48
+ subscribe: 'type = "track"'
49
+ }
50
+ ]);
51
+ expect(plugins.length).toBe(2);
52
+ await Promise.all(plugins.map((p) => p.load({}, {})));
53
+ expect(initializeSpy).toHaveBeenCalledTimes(1);
54
+ });
55
+ });
56
+ //# sourceMappingURL=plugin.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.test.js","sourceRoot":"","sources":["../../../src/__tests__/plugin.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,EAAE,EAAE,CAAA;IAC/B,MAAM,qBAAqB,GAA8C;QACvE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK,IAAI,EAAE;YACrB,aAAa,EAAE,CAAA;QACjB,CAAC;QACD,OAAO,EAAE;YACP,WAAW,EAAE;gBACX,KAAK,EAAE,aAAa;gBACpB,WAAW,EAAE,oBAAoB;gBACjC,QAAQ,EAAE,KAAK;gBACf,mBAAmB,EAAE,gBAAgB;gBACrC,MAAM,EAAE,EAAE;gBACV,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;aAClB;YACD,WAAW,EAAE;gBACX,KAAK,EAAE,aAAa;gBACpB,WAAW,EAAE,oBAAoB;gBACjC,QAAQ,EAAE,KAAK;gBACf,mBAAmB,EAAE,gBAAgB;gBACrC,MAAM,EAAE,EAAE;gBACV,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;aAClB;SACF;KACF,CAAA;IAED,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QACjC,MAAM,OAAO,GAAG,eAAe,CAAC,qBAAqB,EAAE,EAAE,EAAE;YACzD;gBACE,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,GAAG;gBACT,aAAa,EAAE,aAAa;gBAC5B,SAAS,EAAE,gBAAgB;aAC5B;YACD;gBACE,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,GAAG;gBACT,aAAa,EAAE,aAAa;gBAC5B,SAAS,EAAE,gBAAgB;aAC5B;SACF,CAAC,CAAA;QAEF,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAE9B,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAS,EAAE,EAAS,CAAC,CAAC,CAAC,CAAA;QAEnE,MAAM,CAAC,aAAa,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export declare function loadScript(src: string, attributes?: Record<string, string>): Promise<HTMLScriptElement>;
@@ -0,0 +1,39 @@
1
+ export async function loadScript(src, attributes) {
2
+ const scripts = Array.from(window.document.querySelectorAll('script'));
3
+ const found = scripts.find((s) => s.src === src);
4
+ if (found !== undefined) {
5
+ const status = found?.getAttribute('status');
6
+ if (status === 'loaded') {
7
+ return found;
8
+ }
9
+ if (status === 'loading') {
10
+ return new Promise((resolve, reject) => {
11
+ found.addEventListener('load', () => resolve(found));
12
+ found.addEventListener('error', (err) => reject(err));
13
+ });
14
+ }
15
+ }
16
+ return new Promise((resolve, reject) => {
17
+ const script = window.document.createElement('script');
18
+ script.type = 'text/javascript';
19
+ script.src = src;
20
+ script.async = true;
21
+ script.setAttribute('status', 'loading');
22
+ for (const [k, v] of Object.entries(attributes ?? {})) {
23
+ script.setAttribute(k, v);
24
+ }
25
+ script.onload = () => {
26
+ script.onerror = script.onload = null;
27
+ script.setAttribute('status', 'loaded');
28
+ resolve(script);
29
+ };
30
+ script.onerror = () => {
31
+ script.onerror = script.onload = null;
32
+ script.setAttribute('status', 'error');
33
+ reject(new Error(`Failed to load ${src}`));
34
+ };
35
+ const tag = window.document.getElementsByTagName('script')[0];
36
+ tag.parentElement?.insertBefore(script, tag);
37
+ });
38
+ }
39
+ //# sourceMappingURL=load-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-script.js","sourceRoot":"","sources":["../../src/load-script.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,UAAmC;IAC/E,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAA;IACtE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAA;IAEhD,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,MAAM,MAAM,GAAG,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;QAE5C,IAAI,MAAM,KAAK,QAAQ,EAAE;YACvB,OAAO,KAAK,CAAA;SACb;QAED,IAAI,MAAM,KAAK,SAAS,EAAE;YACxB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;gBACpD,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;YACvD,CAAC,CAAC,CAAA;SACH;KACF;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAEtD,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAA;QAC/B,MAAM,CAAC,GAAG,GAAG,GAAG,CAAA;QAChB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAA;QAEnB,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;YACrD,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;SAC1B;QAED,MAAM,CAAC,MAAM,GAAG,GAAS,EAAE;YACzB,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAA;YACrC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YACvC,OAAO,CAAC,MAAM,CAAC,CAAA;QACjB,CAAC,CAAA;QAED,MAAM,CAAC,OAAO,GAAG,GAAS,EAAE;YAC1B,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAA;YACrC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YACtC,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC,CAAA;QAC5C,CAAC,CAAA;QAED,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7D,GAAG,CAAC,aAAa,EAAE,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from '@segment/analytics-next';
2
+ import { BrowserDestinationDefinition, Subscription } from './types';
3
+ export declare function generatePlugins<S, C>(def: BrowserDestinationDefinition<S, C>, settings: S, subscriptions: Subscription[]): Plugin[];
@@ -0,0 +1,66 @@
1
+ import { transform } from '@segment/actions-core/mapping-kit';
2
+ import { parseFql, validate } from '@segment/destination-subscriptions';
3
+ import { loadScript } from './load-script';
4
+ import { resolveWhen } from './resolve-when';
5
+ export function generatePlugins(def, settings, subscriptions) {
6
+ let hasInitialized = false;
7
+ let client;
8
+ let analytics;
9
+ let initializing;
10
+ const load = async (_ctx, analyticsInstance) => {
11
+ if (hasInitialized) {
12
+ return;
13
+ }
14
+ if (initializing) {
15
+ await initializing;
16
+ return;
17
+ }
18
+ analytics = analyticsInstance;
19
+ initializing = def.initialize?.({ settings, analytics }, { loadScript, resolveWhen });
20
+ client = await initializing;
21
+ hasInitialized = true;
22
+ };
23
+ return Object.entries(def.actions).reduce((acc, [key, action]) => {
24
+ // Grab all the enabled subscriptions that invoke this action
25
+ const actionSubscriptions = subscriptions.filter((s) => s.enabled && s.partnerAction === key);
26
+ if (actionSubscriptions.length === 0)
27
+ return acc;
28
+ async function evaluate(ctx) {
29
+ const invocations = [];
30
+ for (const sub of actionSubscriptions) {
31
+ const isSubscribed = validate(parseFql(sub.subscribe), ctx.event);
32
+ if (!isSubscribed)
33
+ continue;
34
+ const mapping = (sub.mapping ?? {});
35
+ const payload = transform(mapping, ctx.event);
36
+ const input = {
37
+ payload,
38
+ mapping,
39
+ settings,
40
+ analytics,
41
+ context: ctx
42
+ };
43
+ invocations.push(action.perform(client, input));
44
+ }
45
+ await Promise.all(invocations);
46
+ // TODO: some sort of error handling
47
+ return ctx;
48
+ }
49
+ const plugin = {
50
+ name: `${def.name} ${key}`,
51
+ type: action.lifecycleHook ?? 'destination',
52
+ version: '0.1.0',
53
+ ready: () => Promise.resolve(),
54
+ isLoaded: () => hasInitialized,
55
+ load,
56
+ track: evaluate,
57
+ page: evaluate,
58
+ alias: evaluate,
59
+ identify: evaluate,
60
+ group: evaluate
61
+ };
62
+ acc.push(plugin);
63
+ return acc;
64
+ }, []);
65
+ }
66
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function resolveWhen(condition: () => boolean, timeout?: number): Promise<void>;
@@ -0,0 +1,18 @@
1
+ export async function resolveWhen(condition, timeout) {
2
+ return new Promise((resolve, _reject) => {
3
+ if (condition()) {
4
+ resolve();
5
+ return;
6
+ }
7
+ const check = () => setTimeout(() => {
8
+ if (condition()) {
9
+ resolve();
10
+ }
11
+ else {
12
+ check();
13
+ }
14
+ }, timeout);
15
+ check();
16
+ });
17
+ }
18
+ //# sourceMappingURL=resolve-when.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-when.js","sourceRoot":"","sources":["../../src/resolve-when.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAwB,EAAE,OAAgB;IAC1E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;QACtC,IAAI,SAAS,EAAE,EAAE;YACf,OAAO,EAAE,CAAA;YACT,OAAM;SACP;QAED,MAAM,KAAK,GAAG,GAAG,EAAE,CACjB,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,SAAS,EAAE,EAAE;gBACf,OAAO,EAAE,CAAA;aACV;iBAAM;gBACL,KAAK,EAAE,CAAA;aACR;QACH,CAAC,EAAE,OAAO,CAAC,CAAA;QAEb,KAAK,EAAE,CAAA;IACT,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { BrowserDestinationDefinition, PluginFactory } from './types';
2
+ export declare function browserDestination<S, C>(definition: BrowserDestinationDefinition<S, C>): PluginFactory;
@@ -0,0 +1,12 @@
1
+ export function browserDestination(definition) {
2
+ const factory = (async (settings) => {
3
+ const plugin = await import(
4
+ /* webpackChunkName: "actions-plugin" */
5
+ /* webpackMode: "lazy-once" */
6
+ './plugin');
7
+ return plugin.generatePlugins(definition, settings, settings.subscriptions || []);
8
+ });
9
+ factory.pluginName = definition.name;
10
+ return factory;
11
+ }
12
+ //# sourceMappingURL=shim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shim.js","sourceRoot":"","sources":["../../src/shim.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAO,UAA8C;IACrF,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,QAAgD,EAAE,EAAE;QAC1E,MAAM,MAAM,GAAG,MAAM,MAAM;QACzB,wCAAwC;QACxC,8BAA8B;QAC9B,UAAU,CACX,CAAA;QACD,OAAO,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,aAAa,IAAI,EAAE,CAAC,CAAA;IACnF,CAAC,CAA6B,CAAA;IAE9B,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,IAAI,CAAA;IAEpC,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,52 @@
1
+ import type { Analytics, Context, Plugin } from '@segment/analytics-next';
2
+ import type { BaseDefinition, BaseActionDefinition, ExecuteInput, JSONLikeObject, GlobalSetting, JSONValue } from '@segment/actions-core';
3
+ export declare type ActionInput<Settings, Payload> = ExecuteInput<Settings, Payload> & {
4
+ analytics: Analytics;
5
+ context: Context;
6
+ };
7
+ export interface BrowserActionDefinition<Settings, Client, Payload = any> extends BaseActionDefinition {
8
+ /** The operation to perform when this action is triggered */
9
+ perform: (client: Client, data: ActionInput<Settings, Payload>) => Promise<unknown> | unknown;
10
+ /**
11
+ * The target platform for the action
12
+ */
13
+ platform: 'web';
14
+ /** Which step in the Analytics.js lifecycle this action should run */
15
+ lifecycleHook?: Plugin['type'];
16
+ }
17
+ export interface BrowserDestinationDependencies {
18
+ loadScript: (src: string, attributes?: Record<string, string>) => Promise<HTMLScriptElement>;
19
+ resolveWhen: (condition: () => boolean, timeout?: number) => Promise<void>;
20
+ }
21
+ export declare type InitializeOptions<Settings> = {
22
+ settings: Settings;
23
+ analytics: Analytics;
24
+ };
25
+ export interface BrowserDestinationDefinition<Settings = unknown, Client = unknown> extends BaseDefinition {
26
+ mode: 'device';
27
+ /**
28
+ * The function called when the destination has loaded and is ready to be initialized
29
+ * Typically you would configure an SDK or API client here.
30
+ * The return value is injected to your actions as the `client`
31
+ */
32
+ initialize: (options: InitializeOptions<Settings>, dependencies: BrowserDestinationDependencies) => Promise<Client>;
33
+ /**
34
+ * Top-level settings that should be available across all actions
35
+ * This is often where you would put initialization settings,
36
+ * SDK keys, API subdomains, etc.
37
+ */
38
+ settings?: Record<string, GlobalSetting>;
39
+ /** Actions */
40
+ actions: Record<string, BrowserActionDefinition<Settings, Client>>;
41
+ }
42
+ export interface Subscription {
43
+ partnerAction: string;
44
+ name: string;
45
+ enabled: boolean;
46
+ subscribe: string;
47
+ mapping: JSONLikeObject;
48
+ }
49
+ export interface PluginFactory {
50
+ (settings: JSONValue): Plugin | Plugin[] | Promise<Plugin | Plugin[]>;
51
+ pluginName: string;
52
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@segment/browser-destination-runtime",
3
- "version": "1.0.0",
3
+ "version": "1.4.1-AudienceSettingsSupport.5+fbdecc05",
4
4
  "scripts": {
5
5
  "build": "yarn build:esm && yarn build:cjs",
6
6
  "build:esm": "tsc --outDir ./dist/esm",
@@ -55,12 +55,13 @@
55
55
  }
56
56
  },
57
57
  "dependencies": {
58
- "@segment/actions-core": "^3.71.0"
58
+ "@segment/actions-core": "^3.75.1-AudienceSettingsSupport.5+fbdecc05"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@segment/analytics-next": "*"
62
62
  },
63
63
  "peerDependencies": {
64
64
  "@segment/analytics-next": "*"
65
- }
65
+ },
66
+ "gitHead": "fbdecc0598a398a564426c3ca81094974753f629"
66
67
  }