@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.
- package/dist/cjs/__tests__/plugin.test.d.ts +1 -0
- package/dist/cjs/__tests__/plugin.test.js +58 -0
- package/dist/cjs/__tests__/plugin.test.js.map +1 -0
- package/dist/cjs/load-script.d.ts +1 -0
- package/dist/cjs/load-script.js +43 -0
- package/dist/cjs/load-script.js.map +1 -0
- package/dist/cjs/plugin.d.ts +3 -0
- package/dist/cjs/plugin.js +70 -0
- package/dist/cjs/plugin.js.map +1 -0
- package/dist/cjs/resolve-when.d.ts +1 -0
- package/dist/cjs/resolve-when.js +22 -0
- package/dist/cjs/resolve-when.js.map +1 -0
- package/dist/cjs/shim.d.ts +2 -0
- package/dist/cjs/shim.js +35 -0
- package/dist/cjs/shim.js.map +1 -0
- package/dist/cjs/types.d.ts +52 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/__tests__/plugin.test.d.ts +1 -0
- package/dist/esm/__tests__/plugin.test.js +56 -0
- package/dist/esm/__tests__/plugin.test.js.map +1 -0
- package/dist/esm/load-script.d.ts +1 -0
- package/dist/esm/load-script.js +39 -0
- package/dist/esm/load-script.js.map +1 -0
- package/dist/esm/plugin.d.ts +3 -0
- package/dist/esm/plugin.js +66 -0
- package/dist/esm/plugin.js.map +1 -0
- package/dist/esm/resolve-when.d.ts +1 -0
- package/dist/esm/resolve-when.js +18 -0
- package/dist/esm/resolve-when.js.map +1 -0
- package/dist/esm/shim.d.ts +2 -0
- package/dist/esm/shim.js +12 -0
- package/dist/esm/shim.js.map +1 -0
- package/dist/esm/types.d.ts +52 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/package.json +4 -3
|
@@ -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,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"}
|
package/dist/cjs/shim.js
ADDED
|
@@ -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 @@
|
|
|
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,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"}
|
package/dist/esm/shim.js
ADDED
|
@@ -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 @@
|
|
|
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.
|
|
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.
|
|
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
|
}
|