@amplitude/plugin-autocapture-browser 1.14.2 → 1.14.3

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.
@@ -1,4 +1,4 @@
1
- import { type BrowserClient, type BrowserConfig, type EnrichmentPlugin, type ElementInteractionsOptions } from '@amplitude/analytics-core';
1
+ import { type BrowserClient, type BrowserConfig, type EnrichmentPlugin, type ElementInteractionsOptions, IDiagnosticsClient } from '@amplitude/analytics-core';
2
2
  import { type Observable } from 'rxjs';
3
3
  import { type ElementBasedTimestampedEvent, type TimestampedEvent, type NavigateEvent } from './helpers';
4
4
  import type { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';
@@ -21,6 +21,8 @@ export interface AllWindowObservables {
21
21
  [ObservablesEnum.NavigateObservable]: Observable<TimestampedEvent<NavigateEvent>> | undefined;
22
22
  [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;
23
23
  }
24
- export declare const autocapturePlugin: (options?: ElementInteractionsOptions) => BrowserEnrichmentPlugin;
24
+ export declare const autocapturePlugin: (options?: ElementInteractionsOptions, context?: {
25
+ diagnosticsClient: IDiagnosticsClient;
26
+ }) => BrowserEnrichmentPlugin;
25
27
  export {};
26
28
  //# sourceMappingURL=autocapture-plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"autocapture-plugin.d.ts","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAIhC,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAkB,KAAK,UAAU,EAA4B,MAAM,MAAM,CAAC;AACjF,OAAO,EAEL,KAAK,4BAA4B,EACjC,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,WAAW,CAAC;AAKnB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAUlF,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC;KAC5C;CACF;AAED,KAAK,uBAAuB,GAAG,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAE9E,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CACnD,IAAI,CAAC,0BAA0B,EAAE,cAAc,GAAG,sBAAsB,GAAG,sBAAsB,CAAC,CACnG,GACC,0BAA0B,CAAC;AAE7B,oBAAY,eAAe;IACzB,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IAErC,kBAAkB,uBAAuB;IACzC,kBAAkB,uBAAuB;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,UAAU,CAAC,CAAC,CAAC;IACxF,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpF,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9F,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;CACtF;AAED,eAAO,MAAM,iBAAiB,aAAa,0BAA0B,KAAQ,uBA2P5E,CAAC"}
1
+ {"version":3,"file":"autocapture-plugin.d.ts","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAI/B,kBAAkB,EACnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAkB,KAAK,UAAU,EAA4B,MAAM,MAAM,CAAC;AACjF,OAAO,EAEL,KAAK,4BAA4B,EACjC,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,WAAW,CAAC;AAKnB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAUlF,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC;KAC5C;CACF;AAED,KAAK,uBAAuB,GAAG,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAE9E,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CACnD,IAAI,CAAC,0BAA0B,EAAE,cAAc,GAAG,sBAAsB,GAAG,sBAAsB,CAAC,CACnG,GACC,0BAA0B,CAAC;AAE7B,oBAAY,eAAe;IACzB,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IAErC,kBAAkB,uBAAuB;IACzC,kBAAkB,uBAAuB;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,UAAU,CAAC,CAAC,CAAC;IACxF,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpF,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9F,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;CACtF;AAED,eAAO,MAAM,iBAAiB,aACnB,0BAA0B,YACzB;IAAE,iBAAiB,EAAE,kBAAkB,CAAA;CAAE,KAClD,uBAgPF,CAAC"}
@@ -4,7 +4,6 @@ exports.autocapturePlugin = exports.ObservablesEnum = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  /* eslint-disable no-restricted-globals */
6
6
  var analytics_core_1 = require("@amplitude/analytics-core");
7
- var analytics_remote_config_1 = require("@amplitude/analytics-remote-config");
8
7
  var constants = tslib_1.__importStar(require("./constants"));
9
8
  var rxjs_1 = require("rxjs");
10
9
  var helpers_1 = require("./helpers");
@@ -23,7 +22,7 @@ var ObservablesEnum;
23
22
  ObservablesEnum["NavigateObservable"] = "navigateObservable";
24
23
  ObservablesEnum["MutationObservable"] = "mutationObservable";
25
24
  })(ObservablesEnum = exports.ObservablesEnum || (exports.ObservablesEnum = {}));
26
- var autocapturePlugin = function (options) {
25
+ var autocapturePlugin = function (options, context) {
27
26
  var _a, _b, _c, _d, _e, _f, _g, _h;
28
27
  if (options === void 0) { options = {}; }
29
28
  var _j = options.dataAttributePrefix, dataAttributePrefix = _j === void 0 ? analytics_core_1.DEFAULT_DATA_ATTRIBUTE_PREFIX : _j, _k = options.visualTaggingOptions, visualTaggingOptions = _k === void 0 ? {
@@ -55,7 +54,7 @@ var autocapturePlugin = function (options) {
55
54
  var type = 'enrichment';
56
55
  var subscriptions = [];
57
56
  // Create data extractor based on options
58
- var dataExtractor = new data_extractor_1.DataExtractor(options);
57
+ var dataExtractor = new data_extractor_1.DataExtractor(options, context);
59
58
  // Create observables on events on the window
60
59
  var createObservables = function () {
61
60
  var _a;
@@ -118,38 +117,15 @@ var autocapturePlugin = function (options) {
118
117
  }
119
118
  // Fetch remote config for pageActions in a non-blocking manner
120
119
  if (config.fetchRemoteConfig) {
121
- (0, analytics_remote_config_1.createRemoteConfigFetch)({
122
- localConfig: config,
123
- configKeys: ['analyticsSDK.pageActions'],
124
- })
125
- .then(function (remoteConfigFetch) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
126
- var remotePageActions, error_1;
127
- var _a;
128
- return tslib_1.__generator(this, function (_b) {
129
- switch (_b.label) {
130
- case 0:
131
- _b.trys.push([0, 2, , 3]);
132
- return [4 /*yield*/, remoteConfigFetch.getRemoteConfig('analyticsSDK', 'pageActions')];
133
- case 1:
134
- remotePageActions = _b.sent();
135
- recomputePageActionsData(remotePageActions);
136
- return [3 /*break*/, 3];
137
- case 2:
138
- error_1 = _b.sent();
139
- // Log error but don't fail the setup
140
- /* istanbul ignore next */
141
- (_a = config === null || config === void 0 ? void 0 : config.loggerProvider) === null || _a === void 0 ? void 0 : _a.error("Failed to fetch remote config: ".concat(String(error_1)));
142
- return [3 /*break*/, 3];
143
- case 3: return [2 /*return*/];
144
- }
120
+ if (!config.remoteConfigClient) {
121
+ // TODO(xinyi): Diagnostics.recordEvent
122
+ config.loggerProvider.debug('Remote config client is not provided, skipping remote config fetch');
123
+ }
124
+ else {
125
+ config.remoteConfigClient.subscribe('analyticsSDK.pageActions', 'all', function (remoteConfig) {
126
+ recomputePageActionsData(remoteConfig);
145
127
  });
146
- }); })
147
- .catch(function (error) {
148
- var _a;
149
- // Log error but don't fail the setup
150
- /* istanbul ignore next */
151
- (_a = config === null || config === void 0 ? void 0 : config.loggerProvider) === null || _a === void 0 ? void 0 : _a.error("Failed to create remote config fetch: ".concat(String(error)));
152
- });
128
+ }
153
129
  }
154
130
  shouldTrackEvent = (0, helpers_1.createShouldTrackEvent)(options, options.cssSelectorAllowlist);
155
131
  shouldTrackActionClick = (0, helpers_1.createShouldTrackEvent)(options, options.actionClickAllowlist);
@@ -1 +1 @@
1
- {"version":3,"file":"autocapture-plugin.js","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n type BrowserClient,\n type BrowserConfig,\n type EnrichmentPlugin,\n type ElementInteractionsOptions,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n} from '@amplitude/analytics-core';\nimport { createRemoteConfigFetch } from '@amplitude/analytics-remote-config';\nimport * as constants from './constants';\nimport { fromEvent, map, type Observable, type Subscription, share } from 'rxjs';\nimport {\n createShouldTrackEvent,\n type ElementBasedTimestampedEvent,\n type TimestampedEvent,\n type NavigateEvent,\n} from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { trackClicks } from './autocapture/track-click';\nimport { trackChange } from './autocapture/track-change';\nimport { trackActionClick } from './autocapture/track-action-click';\nimport type { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';\nimport { createMutationObservable, createClickObservable } from './observables';\n\nimport {\n createLabeledEventToTriggerMap,\n createTriggerEvaluator,\n groupLabeledEventIdsByEventType,\n} from './pageActions/triggers';\nimport { DataExtractor } from './data-extractor';\n\ndeclare global {\n interface Window {\n navigation: HasEventTargetAddRemove<Event>;\n }\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport enum ObservablesEnum {\n ClickObservable = 'clickObservable',\n ChangeObservable = 'changeObservable',\n // ErrorObservable = 'errorObservable',\n NavigateObservable = 'navigateObservable',\n MutationObservable = 'mutationObservable',\n}\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;\n // [ObservablesEnum.ErrorObservable]: Observable<TimestampedEvent<ErrorEvent>>;\n [ObservablesEnum.NavigateObservable]: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n}\n\nexport const autocapturePlugin = (options: ElementInteractionsOptions = {}): BrowserEnrichmentPlugin => {\n const {\n dataAttributePrefix = DEFAULT_DATA_ATTRIBUTE_PREFIX,\n visualTaggingOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n\n options.cssSelectorAllowlist = options.cssSelectorAllowlist ?? DEFAULT_CSS_SELECTOR_ALLOWLIST;\n options.actionClickAllowlist = options.actionClickAllowlist ?? DEFAULT_ACTION_CLICK_ALLOWLIST;\n options.debounceTime = options.debounceTime ?? 0; // TODO: update this when rage clicks are added to 1000ms\n\n options.pageUrlExcludelist = options.pageUrlExcludelist?.reduce(\n (acc: (string | RegExp | { pattern: string })[], excludePattern) => {\n if (typeof excludePattern === 'string') {\n acc.push(excludePattern);\n }\n if (excludePattern instanceof RegExp) {\n acc.push(excludePattern);\n }\n if (typeof excludePattern === 'object' && excludePattern !== null && 'pattern' in excludePattern) {\n try {\n acc.push(new RegExp(excludePattern.pattern));\n } catch (regexError) {\n console.warn(`Invalid regex pattern: ${excludePattern.pattern}`, regexError);\n return acc;\n }\n }\n return acc;\n },\n [],\n );\n\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Subscription[] = [];\n\n // Create data extractor based on options\n const dataExtractor = new DataExtractor(options);\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n // Create Observables from direct user events\n const clickObservable = createClickObservable().pipe(\n map((click) =>\n dataExtractor.addAdditionalEventProperties(\n click,\n 'click',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n const changeObservable = fromEvent<Event>(document, 'change', { capture: true }).pipe(\n map((change) =>\n dataExtractor.addAdditionalEventProperties(\n change,\n 'change',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n\n // Create Observable from unhandled errors\n // const errorObservable = fromEvent<ErrorEvent>(window, 'error').pipe(\n // map((error) => addAdditionalEventProperties(error, 'error')),\n // );\n\n // Create observable for URL changes\n let navigateObservable: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n /* istanbul ignore next */\n if (window.navigation) {\n navigateObservable = fromEvent<NavigateEvent>(window.navigation, 'navigate').pipe(\n map((navigate) =>\n dataExtractor.addAdditionalEventProperties(\n navigate,\n 'navigate',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n }\n\n // Track DOM Mutations using shared observable\n const mutationObservable = createMutationObservable().pipe(\n map((mutation) =>\n dataExtractor.addAdditionalEventProperties(\n mutation,\n 'mutation',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n\n return {\n [ObservablesEnum.ClickObservable]: clickObservable as Observable<ElementBasedTimestampedEvent<MouseEvent>>,\n [ObservablesEnum.ChangeObservable]: changeObservable as Observable<ElementBasedTimestampedEvent<Event>>,\n // [ObservablesEnum.ErrorObservable]: errorObservable,\n [ObservablesEnum.NavigateObservable]: navigateObservable,\n [ObservablesEnum.MutationObservable]: mutationObservable,\n };\n };\n\n // Group labeled events by event type (eg. click, change)\n let groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions?.labeledEvents ?? {}));\n\n let labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions?.triggers ?? []);\n\n // Evaluate triggers for the given event by running the actions associated with the matching triggers\n const evaluateTriggers = createTriggerEvaluator(\n groupedLabeledEvents,\n labeledEventToTriggerMap,\n dataExtractor,\n options,\n );\n\n // Function to recalculate internal variables when remote config is updated\n const recomputePageActionsData = (remotePageActions: ElementInteractionsOptions['pageActions']) => {\n if (remotePageActions) {\n // Merge remote config with local options\n options.pageActions = {\n ...options.pageActions,\n ...remotePageActions,\n };\n\n // Recalculate internal variables\n groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions.labeledEvents ?? {}));\n labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions.triggers ?? []);\n\n // Update evaluateTriggers function\n evaluateTriggers.update(groupedLabeledEvents, labeledEventToTriggerMap, options);\n }\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Fetch remote config for pageActions in a non-blocking manner\n if (config.fetchRemoteConfig) {\n createRemoteConfigFetch({\n localConfig: config,\n configKeys: ['analyticsSDK.pageActions'],\n })\n .then(async (remoteConfigFetch) => {\n try {\n const remotePageActions = await remoteConfigFetch.getRemoteConfig('analyticsSDK', 'pageActions');\n recomputePageActionsData(remotePageActions as ElementInteractionsOptions['pageActions']);\n } catch (error) {\n // Log error but don't fail the setup\n /* istanbul ignore next */\n config?.loggerProvider?.error(`Failed to fetch remote config: ${String(error)}`);\n }\n })\n .catch((error) => {\n // Log error but don't fail the setup\n /* istanbul ignore next */\n config?.loggerProvider?.error(`Failed to create remote config fetch: ${String(error)}`);\n });\n }\n\n // Create should track event functions the different allowlists\n const shouldTrackEvent = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n );\n const shouldTrackActionClick = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist,\n );\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n // Create subscriptions\n const clickTrackingSubscription = trackClicks({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n subscriptions.push(clickTrackingSubscription);\n\n const changeSubscription = trackChange({\n allObservables,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n subscriptions.push(changeSubscription);\n\n const actionClickSubscription = trackActionClick({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent,\n shouldTrackActionClick: shouldTrackActionClick,\n });\n subscriptions.push(actionClickSubscription);\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n\n // Setup visual tagging selector\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n dataExtractor: dataExtractor,\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist: actionClickAllowlist,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
1
+ {"version":3,"file":"autocapture-plugin.js","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n type BrowserClient,\n type BrowserConfig,\n type EnrichmentPlugin,\n type ElementInteractionsOptions,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n IDiagnosticsClient,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { fromEvent, map, type Observable, type Subscription, share } from 'rxjs';\nimport {\n createShouldTrackEvent,\n type ElementBasedTimestampedEvent,\n type TimestampedEvent,\n type NavigateEvent,\n} from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { trackClicks } from './autocapture/track-click';\nimport { trackChange } from './autocapture/track-change';\nimport { trackActionClick } from './autocapture/track-action-click';\nimport type { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';\nimport { createMutationObservable, createClickObservable } from './observables';\n\nimport {\n createLabeledEventToTriggerMap,\n createTriggerEvaluator,\n groupLabeledEventIdsByEventType,\n} from './pageActions/triggers';\nimport { DataExtractor } from './data-extractor';\n\ndeclare global {\n interface Window {\n navigation: HasEventTargetAddRemove<Event>;\n }\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport enum ObservablesEnum {\n ClickObservable = 'clickObservable',\n ChangeObservable = 'changeObservable',\n // ErrorObservable = 'errorObservable',\n NavigateObservable = 'navigateObservable',\n MutationObservable = 'mutationObservable',\n}\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;\n // [ObservablesEnum.ErrorObservable]: Observable<TimestampedEvent<ErrorEvent>>;\n [ObservablesEnum.NavigateObservable]: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n}\n\nexport const autocapturePlugin = (\n options: ElementInteractionsOptions = {},\n context?: { diagnosticsClient: IDiagnosticsClient },\n): BrowserEnrichmentPlugin => {\n const {\n dataAttributePrefix = DEFAULT_DATA_ATTRIBUTE_PREFIX,\n visualTaggingOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n\n options.cssSelectorAllowlist = options.cssSelectorAllowlist ?? DEFAULT_CSS_SELECTOR_ALLOWLIST;\n options.actionClickAllowlist = options.actionClickAllowlist ?? DEFAULT_ACTION_CLICK_ALLOWLIST;\n options.debounceTime = options.debounceTime ?? 0; // TODO: update this when rage clicks are added to 1000ms\n\n options.pageUrlExcludelist = options.pageUrlExcludelist?.reduce(\n (acc: (string | RegExp | { pattern: string })[], excludePattern) => {\n if (typeof excludePattern === 'string') {\n acc.push(excludePattern);\n }\n if (excludePattern instanceof RegExp) {\n acc.push(excludePattern);\n }\n if (typeof excludePattern === 'object' && excludePattern !== null && 'pattern' in excludePattern) {\n try {\n acc.push(new RegExp(excludePattern.pattern));\n } catch (regexError) {\n console.warn(`Invalid regex pattern: ${excludePattern.pattern}`, regexError);\n return acc;\n }\n }\n return acc;\n },\n [],\n );\n\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Subscription[] = [];\n\n // Create data extractor based on options\n const dataExtractor = new DataExtractor(options, context);\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n // Create Observables from direct user events\n const clickObservable = createClickObservable().pipe(\n map((click) =>\n dataExtractor.addAdditionalEventProperties(\n click,\n 'click',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n const changeObservable = fromEvent<Event>(document, 'change', { capture: true }).pipe(\n map((change) =>\n dataExtractor.addAdditionalEventProperties(\n change,\n 'change',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n\n // Create Observable from unhandled errors\n // const errorObservable = fromEvent<ErrorEvent>(window, 'error').pipe(\n // map((error) => addAdditionalEventProperties(error, 'error')),\n // );\n\n // Create observable for URL changes\n let navigateObservable: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n /* istanbul ignore next */\n if (window.navigation) {\n navigateObservable = fromEvent<NavigateEvent>(window.navigation, 'navigate').pipe(\n map((navigate) =>\n dataExtractor.addAdditionalEventProperties(\n navigate,\n 'navigate',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n }\n\n // Track DOM Mutations using shared observable\n const mutationObservable = createMutationObservable().pipe(\n map((mutation) =>\n dataExtractor.addAdditionalEventProperties(\n mutation,\n 'mutation',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n\n return {\n [ObservablesEnum.ClickObservable]: clickObservable as Observable<ElementBasedTimestampedEvent<MouseEvent>>,\n [ObservablesEnum.ChangeObservable]: changeObservable as Observable<ElementBasedTimestampedEvent<Event>>,\n // [ObservablesEnum.ErrorObservable]: errorObservable,\n [ObservablesEnum.NavigateObservable]: navigateObservable,\n [ObservablesEnum.MutationObservable]: mutationObservable,\n };\n };\n\n // Group labeled events by event type (eg. click, change)\n let groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions?.labeledEvents ?? {}));\n\n let labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions?.triggers ?? []);\n\n // Evaluate triggers for the given event by running the actions associated with the matching triggers\n const evaluateTriggers = createTriggerEvaluator(\n groupedLabeledEvents,\n labeledEventToTriggerMap,\n dataExtractor,\n options,\n );\n\n // Function to recalculate internal variables when remote config is updated\n const recomputePageActionsData = (remotePageActions: ElementInteractionsOptions['pageActions']) => {\n if (remotePageActions) {\n // Merge remote config with local options\n options.pageActions = {\n ...options.pageActions,\n ...remotePageActions,\n };\n\n // Recalculate internal variables\n groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions.labeledEvents ?? {}));\n labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions.triggers ?? []);\n\n // Update evaluateTriggers function\n evaluateTriggers.update(groupedLabeledEvents, labeledEventToTriggerMap, options);\n }\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Fetch remote config for pageActions in a non-blocking manner\n if (config.fetchRemoteConfig) {\n if (!config.remoteConfigClient) {\n // TODO(xinyi): Diagnostics.recordEvent\n config.loggerProvider.debug('Remote config client is not provided, skipping remote config fetch');\n } else {\n config.remoteConfigClient.subscribe('analyticsSDK.pageActions', 'all', (remoteConfig) => {\n recomputePageActionsData(remoteConfig as ElementInteractionsOptions['pageActions']);\n });\n }\n }\n\n // Create should track event functions the different allowlists\n const shouldTrackEvent = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n );\n const shouldTrackActionClick = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist,\n );\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n // Create subscriptions\n const clickTrackingSubscription = trackClicks({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n subscriptions.push(clickTrackingSubscription);\n\n const changeSubscription = trackChange({\n allObservables,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n subscriptions.push(changeSubscription);\n\n const actionClickSubscription = trackActionClick({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent,\n shouldTrackActionClick: shouldTrackActionClick,\n });\n subscriptions.push(actionClickSubscription);\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n\n // Setup visual tagging selector\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n dataExtractor: dataExtractor,\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist: actionClickAllowlist,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
@@ -1,11 +1,14 @@
1
- import { ElementInteractionsOptions, ActionType } from '@amplitude/analytics-core';
1
+ import { ElementInteractionsOptions, ActionType, IDiagnosticsClient } from '@amplitude/analytics-core';
2
2
  import type { DataSource } from '@amplitude/analytics-core/lib/esm/types/element-interactions';
3
3
  import type { ElementBasedTimestampedEvent, TimestampedEvent } from './helpers';
4
4
  import type { JSONValue } from './helpers';
5
5
  import { Hierarchy } from './typings/autocapture';
6
6
  export declare class DataExtractor {
7
7
  private readonly additionalMaskTextPatterns;
8
- constructor(options: ElementInteractionsOptions);
8
+ diagnosticsClient?: IDiagnosticsClient;
9
+ constructor(options: ElementInteractionsOptions, context?: {
10
+ diagnosticsClient: IDiagnosticsClient;
11
+ });
9
12
  replaceSensitiveString: (text: string | null) => string;
10
13
  getHierarchy: (element: Element | null) => Hierarchy;
11
14
  getNearestLabel: (element: Element) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"data-extractor.d.ts","sourceRoot":"","sources":["../../src/data-extractor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,UAAU,EAAgB,MAAM,2BAA2B,CAAC;AACjG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8DAA8D,CAAC;AAU/F,OAAO,KAAK,EAAwB,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEtG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAOlD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAW;gBAE1C,OAAO,EAAE,0BAA0B;IAqB/C,sBAAsB,SAAU,MAAM,GAAG,IAAI,KAAG,MAAM,CA0BpD;IAGF,YAAY,YAAa,OAAO,GAAG,IAAI,eAuCrC;IAEF,eAAe,YAAa,OAAO,KAAG,MAAM,CAiB1C;IAGF,kBAAkB,eAAgB,UAAU,WAAW,OAAO,uBAAuB,MAAM;;MA0CzF;IAEF,4BAA4B,0GAGP,MAAM,EAAE,uBACN,MAAM,6DAuC3B;IAEF,yBAAyB,eAAgB,UAAU,kBAAkB,WAAW,+BAkB9E;IAEF,OAAO,YAAa,OAAO,KAAG,MAAM,CAkBlC;IAGF,gBAAgB,YAAa,OAAO,KAAG,OAAO,MAAM,EAAE,SAAS,CAAC,CAa9D;CACH"}
1
+ {"version":3,"file":"data-extractor.d.ts","sourceRoot":"","sources":["../../src/data-extractor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,UAAU,EAAgB,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACrH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8DAA8D,CAAC;AAU/F,OAAO,KAAK,EAAwB,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEtG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAOlD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAW;IACtD,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;gBAE3B,OAAO,EAAE,0BAA0B,EAAE,OAAO,CAAC,EAAE;QAAE,iBAAiB,EAAE,kBAAkB,CAAA;KAAE;IAuBpG,sBAAsB,SAAU,MAAM,GAAG,IAAI,KAAG,MAAM,CA0BpD;IAGF,YAAY,YAAa,OAAO,GAAG,IAAI,eA4CrC;IAEF,eAAe,YAAa,OAAO,KAAG,MAAM,CAiB1C;IAGF,kBAAkB,eAAgB,UAAU,WAAW,OAAO,uBAAuB,MAAM;;MA0CzF;IAEF,4BAA4B,0GAGP,MAAM,EAAE,uBACN,MAAM,6DAuC3B;IAEF,yBAAyB,eAAgB,UAAU,kBAAkB,WAAW,+BAkB9E;IAEF,OAAO,YAAa,OAAO,KAAG,MAAM,CAkBlC;IAGF,gBAAgB,YAAa,OAAO,KAAG,OAAO,MAAM,EAAE,SAAS,CAAC,CAa9D;CACH"}
@@ -13,7 +13,7 @@ var CC_REGEX = /\b(?:\d[ -]*?){13,16}\b/;
13
13
  var SSN_REGEX = /(\d{3}-?\d{2}-?\d{4})/g;
14
14
  var EMAIL_REGEX = /[^\s@]+@[^\s@.]+\.[^\s@]+/g;
15
15
  var DataExtractor = /** @class */ (function () {
16
- function DataExtractor(options) {
16
+ function DataExtractor(options, context) {
17
17
  var e_1, _a;
18
18
  var _this = this;
19
19
  var _b;
@@ -53,7 +53,8 @@ var DataExtractor = /** @class */ (function () {
53
53
  // Get the DOM hierarchy of the element, starting from the target element to the root element.
54
54
  this.getHierarchy = function (element) {
55
55
  var e_3, _a;
56
- var _b;
56
+ var _b, _c;
57
+ var startTime = performance.now();
57
58
  var hierarchy = [];
58
59
  if (!element) {
59
60
  return [];
@@ -96,6 +97,8 @@ var DataExtractor = /** @class */ (function () {
96
97
  }
97
98
  finally { if (e_3) throw e_3.error; }
98
99
  }
100
+ var endTime = performance.now();
101
+ (_c = _this.diagnosticsClient) === null || _c === void 0 ? void 0 : _c.recordHistogram('autocapturePlugin.getHierarchy', endTime - startTime);
99
102
  return hierarchy;
100
103
  };
101
104
  this.getNearestLabel = function (element) {
@@ -237,6 +240,7 @@ var DataExtractor = /** @class */ (function () {
237
240
  _a);
238
241
  return (0, helpers_1.removeEmptyProperties)(properties);
239
242
  };
243
+ this.diagnosticsClient = context === null || context === void 0 ? void 0 : context.diagnosticsClient;
240
244
  var rawPatterns = (_b = options.maskTextRegex) !== null && _b !== void 0 ? _b : [];
241
245
  var compiled = [];
242
246
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"data-extractor.js","sourceRoot":"","sources":["../../src/data-extractor.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { ElementInteractionsOptions, ActionType, getDecodeURI } from '@amplitude/analytics-core';\nimport type { DataSource } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport * as constants from './constants';\nimport {\n removeEmptyProperties,\n extractPrefixedAttributes,\n isElementPointerCursor,\n getClosestElement,\n isElementBasedEvent,\n parseAttributesToMask,\n} from './helpers';\nimport type { BaseTimestampedEvent, ElementBasedTimestampedEvent, TimestampedEvent } from './helpers';\nimport { getAncestors, getElementProperties } from './hierarchy';\nimport type { JSONValue } from './helpers';\nimport { getDataSource } from './pageActions/actions';\nimport { Hierarchy } from './typings/autocapture';\nimport { MASKED_TEXT_VALUE, TEXT_MASK_ATTRIBUTE, getPageTitle } from '@amplitude/analytics-client-common';\n\nconst CC_REGEX = /\\b(?:\\d[ -]*?){13,16}\\b/;\nconst SSN_REGEX = /(\\d{3}-?\\d{2}-?\\d{4})/g;\nconst EMAIL_REGEX = /[^\\s@]+@[^\\s@.]+\\.[^\\s@]+/g;\n\nexport class DataExtractor {\n private readonly additionalMaskTextPatterns: RegExp[];\n\n constructor(options: ElementInteractionsOptions) {\n const rawPatterns = options.maskTextRegex ?? [];\n\n const compiled: RegExp[] = [];\n for (const entry of rawPatterns) {\n if (compiled.length >= constants.MAX_MASK_TEXT_PATTERNS) {\n break;\n }\n if (entry instanceof RegExp) {\n compiled.push(entry);\n } else if ('pattern' in entry && typeof entry.pattern === 'string') {\n try {\n compiled.push(new RegExp(entry.pattern, 'i'));\n } catch {\n // ignore invalid pattern strings\n }\n }\n }\n this.additionalMaskTextPatterns = compiled;\n }\n\n replaceSensitiveString = (text: string | null): string => {\n if (typeof text !== 'string') {\n return '';\n }\n\n let result = text;\n\n // Check for credit card number (with or without spaces/dashes)\n result = result.replace(CC_REGEX, MASKED_TEXT_VALUE);\n\n // Check for social security number\n result = result.replace(SSN_REGEX, MASKED_TEXT_VALUE);\n\n // Check for email\n result = result.replace(EMAIL_REGEX, MASKED_TEXT_VALUE);\n\n // Check for additional mask text patterns\n for (const pattern of this.additionalMaskTextPatterns) {\n try {\n result = result.replace(pattern, MASKED_TEXT_VALUE);\n } catch {\n // ignore invalid pattern\n }\n }\n\n return result;\n };\n\n // Get the DOM hierarchy of the element, starting from the target element to the root element.\n getHierarchy = (element: Element | null): Hierarchy => {\n let hierarchy: Hierarchy = [];\n if (!element) {\n return [];\n }\n\n // Get list of ancestors including itself and get properties at each level in the hierarchy\n const ancestors = getAncestors(element);\n\n // Build attributes to mask map\n const elementToAttributesToMaskMap = new Map<Element, Set<string>>();\n\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const node = ancestors[i];\n if (node) {\n const attributesToMask = parseAttributesToMask(node.getAttribute(constants.DATA_AMP_MASK_ATTRIBUTES));\n const ancestorAttributesToMask =\n i === ancestors.length - 1 ? [] : elementToAttributesToMaskMap.get(ancestors[i + 1]) ?? new Set<string>();\n const combinedAttributesToMask = new Set([...ancestorAttributesToMask, ...attributesToMask]);\n elementToAttributesToMaskMap.set(node, combinedAttributesToMask);\n }\n }\n\n hierarchy = ancestors.map((el) =>\n getElementProperties(el, elementToAttributesToMaskMap.get(el) ?? new Set<string>()),\n );\n\n // Search for and mask any sensitive attribute values\n for (const hierarchyNode of hierarchy) {\n if (hierarchyNode?.attrs) {\n Object.entries(hierarchyNode.attrs).forEach(([key, value]) => {\n if (hierarchyNode.attrs) {\n hierarchyNode.attrs[key] = this.replaceSensitiveString(value);\n }\n });\n }\n }\n\n return hierarchy;\n };\n\n getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n let labelElement: Element | null;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n } catch {\n /* istanbul ignore next */\n labelElement = null;\n }\n if (labelElement) {\n /* istanbul ignore next */\n return this.getText(labelElement);\n }\n return this.getNearestLabel(parent);\n };\n\n // Returns the Amplitude event properties for the given element.\n getEventProperties = (actionType: ActionType, element: Element, dataAttributePrefix: string) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n /* istanbul ignore next */\n const rect =\n typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };\n\n const hierarchy = this.getHierarchy(element);\n const currentElementAttributes = hierarchy[0]?.attrs;\n const nearestLabel = this.getNearestLabel(element);\n const attributes = extractPrefixedAttributes(currentElementAttributes ?? {}, dataAttributePrefix);\n\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: hierarchy,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT]: rect.left == null ? null : Math.round(rect.left),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP]: rect.top == null ? null : Math.round(rect.top),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL]: nearestLabel,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: getDecodeURI(window.location.href.split('?')[0]),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE]: (\n getPageTitle as (parseTitleFunction: (title: string) => string) => string\n )(this.replaceSensitiveString),\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n\n // id is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.getAttribute('id') || '';\n\n // class is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS] = element.getAttribute('class');\n\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL] = currentElementAttributes?.['aria-label'];\n\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = this.replaceSensitiveString(element.href); // we don't use hierarchy here because we don't want href value to be changed\n }\n\n return removeEmptyProperties(properties);\n };\n\n addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n selectorAllowlist: string[],\n dataAttributePrefix: string,\n // capture the event if the cursor is a \"pointer\" when this element is clicked on\n // reason: a \"pointer\" cursor indicates that an element should be interactable\n // regardless of the element's tag name\n isCapturingCursorPointer = false,\n ): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {\n if (isCapturingCursorPointer) {\n const isCursorPointer = isElementPointerCursor(baseEvent.event.target as Element, baseEvent.type);\n if (isCursorPointer) {\n baseEvent.closestTrackedAncestor = baseEvent.event.target as HTMLElement;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n baseEvent.closestTrackedAncestor,\n dataAttributePrefix,\n );\n return baseEvent;\n }\n }\n // Retrieve additional event properties from the target element\n const closestTrackedAncestor = getClosestElement(baseEvent.event.target as HTMLElement, selectorAllowlist);\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n closestTrackedAncestor,\n dataAttributePrefix,\n );\n }\n return baseEvent;\n }\n\n return baseEvent;\n };\n\n extractDataFromDataSource = (dataSource: DataSource, contextElement: HTMLElement) => {\n // Extract from DOM Element\n if (dataSource.sourceType === 'DOM_ELEMENT') {\n const sourceElement = getDataSource(dataSource, contextElement);\n if (!sourceElement) {\n return undefined;\n }\n\n if (dataSource.elementExtractType === 'TEXT') {\n return this.getText(sourceElement);\n } else if (dataSource.elementExtractType === 'ATTRIBUTE' && dataSource.attribute) {\n return sourceElement.getAttribute(dataSource.attribute);\n }\n return undefined;\n }\n\n // TODO: Extract from other source types\n return undefined;\n };\n\n getText = (element: Element): string => {\n // Check if element or any parent has data-amp-mask attribute\n const hasMaskAttribute = element.closest(`[${TEXT_MASK_ATTRIBUTE}]`) !== null;\n if (hasMaskAttribute) {\n return MASKED_TEXT_VALUE;\n }\n let output = '';\n if (!element.querySelector(`[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`)) {\n output = (element as HTMLElement).innerText || '';\n } else {\n const clonedTree = element.cloneNode(true) as HTMLElement;\n // replace all elements with TEXT_MASK_ATTRIBUTE attribute and contenteditable with the text MASKED_TEXT_VALUE\n clonedTree.querySelectorAll(`[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`).forEach((node) => {\n (node as HTMLElement).innerText = MASKED_TEXT_VALUE;\n });\n output = clonedTree.innerText || '';\n }\n return this.replaceSensitiveString(output.substring(0, 255)).replace(/\\s+/g, ' ').trim();\n };\n\n // Returns the element properties for the given element in Visual Labeling.\n getEventTagProps = (element: Element): Record<string, JSONValue> => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties) as Record<string, JSONValue>;\n };\n}\n"]}
1
+ {"version":3,"file":"data-extractor.js","sourceRoot":"","sources":["../../src/data-extractor.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { ElementInteractionsOptions, ActionType, getDecodeURI, IDiagnosticsClient } from '@amplitude/analytics-core';\nimport type { DataSource } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport * as constants from './constants';\nimport {\n removeEmptyProperties,\n extractPrefixedAttributes,\n isElementPointerCursor,\n getClosestElement,\n isElementBasedEvent,\n parseAttributesToMask,\n} from './helpers';\nimport type { BaseTimestampedEvent, ElementBasedTimestampedEvent, TimestampedEvent } from './helpers';\nimport { getAncestors, getElementProperties } from './hierarchy';\nimport type { JSONValue } from './helpers';\nimport { getDataSource } from './pageActions/actions';\nimport { Hierarchy } from './typings/autocapture';\nimport { MASKED_TEXT_VALUE, TEXT_MASK_ATTRIBUTE, getPageTitle } from '@amplitude/analytics-client-common';\n\nconst CC_REGEX = /\\b(?:\\d[ -]*?){13,16}\\b/;\nconst SSN_REGEX = /(\\d{3}-?\\d{2}-?\\d{4})/g;\nconst EMAIL_REGEX = /[^\\s@]+@[^\\s@.]+\\.[^\\s@]+/g;\n\nexport class DataExtractor {\n private readonly additionalMaskTextPatterns: RegExp[];\n diagnosticsClient?: IDiagnosticsClient;\n\n constructor(options: ElementInteractionsOptions, context?: { diagnosticsClient: IDiagnosticsClient }) {\n this.diagnosticsClient = context?.diagnosticsClient;\n\n const rawPatterns = options.maskTextRegex ?? [];\n\n const compiled: RegExp[] = [];\n for (const entry of rawPatterns) {\n if (compiled.length >= constants.MAX_MASK_TEXT_PATTERNS) {\n break;\n }\n if (entry instanceof RegExp) {\n compiled.push(entry);\n } else if ('pattern' in entry && typeof entry.pattern === 'string') {\n try {\n compiled.push(new RegExp(entry.pattern, 'i'));\n } catch {\n // ignore invalid pattern strings\n }\n }\n }\n this.additionalMaskTextPatterns = compiled;\n }\n\n replaceSensitiveString = (text: string | null): string => {\n if (typeof text !== 'string') {\n return '';\n }\n\n let result = text;\n\n // Check for credit card number (with or without spaces/dashes)\n result = result.replace(CC_REGEX, MASKED_TEXT_VALUE);\n\n // Check for social security number\n result = result.replace(SSN_REGEX, MASKED_TEXT_VALUE);\n\n // Check for email\n result = result.replace(EMAIL_REGEX, MASKED_TEXT_VALUE);\n\n // Check for additional mask text patterns\n for (const pattern of this.additionalMaskTextPatterns) {\n try {\n result = result.replace(pattern, MASKED_TEXT_VALUE);\n } catch {\n // ignore invalid pattern\n }\n }\n\n return result;\n };\n\n // Get the DOM hierarchy of the element, starting from the target element to the root element.\n getHierarchy = (element: Element | null): Hierarchy => {\n const startTime = performance.now();\n\n let hierarchy: Hierarchy = [];\n if (!element) {\n return [];\n }\n\n // Get list of ancestors including itself and get properties at each level in the hierarchy\n const ancestors = getAncestors(element);\n\n // Build attributes to mask map\n const elementToAttributesToMaskMap = new Map<Element, Set<string>>();\n\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const node = ancestors[i];\n if (node) {\n const attributesToMask = parseAttributesToMask(node.getAttribute(constants.DATA_AMP_MASK_ATTRIBUTES));\n const ancestorAttributesToMask =\n i === ancestors.length - 1 ? [] : elementToAttributesToMaskMap.get(ancestors[i + 1]) ?? new Set<string>();\n const combinedAttributesToMask = new Set([...ancestorAttributesToMask, ...attributesToMask]);\n elementToAttributesToMaskMap.set(node, combinedAttributesToMask);\n }\n }\n\n hierarchy = ancestors.map((el) =>\n getElementProperties(el, elementToAttributesToMaskMap.get(el) ?? new Set<string>()),\n );\n\n // Search for and mask any sensitive attribute values\n for (const hierarchyNode of hierarchy) {\n if (hierarchyNode?.attrs) {\n Object.entries(hierarchyNode.attrs).forEach(([key, value]) => {\n if (hierarchyNode.attrs) {\n hierarchyNode.attrs[key] = this.replaceSensitiveString(value);\n }\n });\n }\n }\n\n const endTime = performance.now();\n this.diagnosticsClient?.recordHistogram('autocapturePlugin.getHierarchy', endTime - startTime);\n\n return hierarchy;\n };\n\n getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n let labelElement: Element | null;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n } catch {\n /* istanbul ignore next */\n labelElement = null;\n }\n if (labelElement) {\n /* istanbul ignore next */\n return this.getText(labelElement);\n }\n return this.getNearestLabel(parent);\n };\n\n // Returns the Amplitude event properties for the given element.\n getEventProperties = (actionType: ActionType, element: Element, dataAttributePrefix: string) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n /* istanbul ignore next */\n const rect =\n typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };\n\n const hierarchy = this.getHierarchy(element);\n const currentElementAttributes = hierarchy[0]?.attrs;\n const nearestLabel = this.getNearestLabel(element);\n const attributes = extractPrefixedAttributes(currentElementAttributes ?? {}, dataAttributePrefix);\n\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: hierarchy,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT]: rect.left == null ? null : Math.round(rect.left),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP]: rect.top == null ? null : Math.round(rect.top),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL]: nearestLabel,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: getDecodeURI(window.location.href.split('?')[0]),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE]: (\n getPageTitle as (parseTitleFunction: (title: string) => string) => string\n )(this.replaceSensitiveString),\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n\n // id is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.getAttribute('id') || '';\n\n // class is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS] = element.getAttribute('class');\n\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL] = currentElementAttributes?.['aria-label'];\n\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = this.replaceSensitiveString(element.href); // we don't use hierarchy here because we don't want href value to be changed\n }\n\n return removeEmptyProperties(properties);\n };\n\n addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n selectorAllowlist: string[],\n dataAttributePrefix: string,\n // capture the event if the cursor is a \"pointer\" when this element is clicked on\n // reason: a \"pointer\" cursor indicates that an element should be interactable\n // regardless of the element's tag name\n isCapturingCursorPointer = false,\n ): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {\n if (isCapturingCursorPointer) {\n const isCursorPointer = isElementPointerCursor(baseEvent.event.target as Element, baseEvent.type);\n if (isCursorPointer) {\n baseEvent.closestTrackedAncestor = baseEvent.event.target as HTMLElement;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n baseEvent.closestTrackedAncestor,\n dataAttributePrefix,\n );\n return baseEvent;\n }\n }\n // Retrieve additional event properties from the target element\n const closestTrackedAncestor = getClosestElement(baseEvent.event.target as HTMLElement, selectorAllowlist);\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n closestTrackedAncestor,\n dataAttributePrefix,\n );\n }\n return baseEvent;\n }\n\n return baseEvent;\n };\n\n extractDataFromDataSource = (dataSource: DataSource, contextElement: HTMLElement) => {\n // Extract from DOM Element\n if (dataSource.sourceType === 'DOM_ELEMENT') {\n const sourceElement = getDataSource(dataSource, contextElement);\n if (!sourceElement) {\n return undefined;\n }\n\n if (dataSource.elementExtractType === 'TEXT') {\n return this.getText(sourceElement);\n } else if (dataSource.elementExtractType === 'ATTRIBUTE' && dataSource.attribute) {\n return sourceElement.getAttribute(dataSource.attribute);\n }\n return undefined;\n }\n\n // TODO: Extract from other source types\n return undefined;\n };\n\n getText = (element: Element): string => {\n // Check if element or any parent has data-amp-mask attribute\n const hasMaskAttribute = element.closest(`[${TEXT_MASK_ATTRIBUTE}]`) !== null;\n if (hasMaskAttribute) {\n return MASKED_TEXT_VALUE;\n }\n let output = '';\n if (!element.querySelector(`[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`)) {\n output = (element as HTMLElement).innerText || '';\n } else {\n const clonedTree = element.cloneNode(true) as HTMLElement;\n // replace all elements with TEXT_MASK_ATTRIBUTE attribute and contenteditable with the text MASKED_TEXT_VALUE\n clonedTree.querySelectorAll(`[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`).forEach((node) => {\n (node as HTMLElement).innerText = MASKED_TEXT_VALUE;\n });\n output = clonedTree.innerText || '';\n }\n return this.replaceSensitiveString(output.substring(0, 255)).replace(/\\s+/g, ' ').trim();\n };\n\n // Returns the element properties for the given element in Visual Labeling.\n getEventTagProps = (element: Element): Record<string, JSONValue> => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties) as Record<string, JSONValue>;\n };\n}\n"]}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "1.14.2";
1
+ export declare const VERSION = "1.14.3";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = '1.14.2';
4
+ exports.VERSION = '1.14.3';
5
5
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["export const VERSION = '1.14.2';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["export const VERSION = '1.14.3';\n"]}
@@ -1,4 +1,4 @@
1
- import { type BrowserClient, type BrowserConfig, type EnrichmentPlugin, type ElementInteractionsOptions } from '@amplitude/analytics-core';
1
+ import { type BrowserClient, type BrowserConfig, type EnrichmentPlugin, type ElementInteractionsOptions, IDiagnosticsClient } from '@amplitude/analytics-core';
2
2
  import { type Observable } from 'rxjs';
3
3
  import { type ElementBasedTimestampedEvent, type TimestampedEvent, type NavigateEvent } from './helpers';
4
4
  import type { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';
@@ -21,6 +21,8 @@ export interface AllWindowObservables {
21
21
  [ObservablesEnum.NavigateObservable]: Observable<TimestampedEvent<NavigateEvent>> | undefined;
22
22
  [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;
23
23
  }
24
- export declare const autocapturePlugin: (options?: ElementInteractionsOptions) => BrowserEnrichmentPlugin;
24
+ export declare const autocapturePlugin: (options?: ElementInteractionsOptions, context?: {
25
+ diagnosticsClient: IDiagnosticsClient;
26
+ }) => BrowserEnrichmentPlugin;
25
27
  export {};
26
28
  //# sourceMappingURL=autocapture-plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"autocapture-plugin.d.ts","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAIhC,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAkB,KAAK,UAAU,EAA4B,MAAM,MAAM,CAAC;AACjF,OAAO,EAEL,KAAK,4BAA4B,EACjC,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,WAAW,CAAC;AAKnB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAUlF,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC;KAC5C;CACF;AAED,KAAK,uBAAuB,GAAG,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAE9E,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CACnD,IAAI,CAAC,0BAA0B,EAAE,cAAc,GAAG,sBAAsB,GAAG,sBAAsB,CAAC,CACnG,GACC,0BAA0B,CAAC;AAE7B,oBAAY,eAAe;IACzB,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IAErC,kBAAkB,uBAAuB;IACzC,kBAAkB,uBAAuB;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,UAAU,CAAC,CAAC,CAAC;IACxF,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpF,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9F,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;CACtF;AAED,eAAO,MAAM,iBAAiB,aAAa,0BAA0B,KAAQ,uBA2P5E,CAAC"}
1
+ {"version":3,"file":"autocapture-plugin.d.ts","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAI/B,kBAAkB,EACnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAkB,KAAK,UAAU,EAA4B,MAAM,MAAM,CAAC;AACjF,OAAO,EAEL,KAAK,4BAA4B,EACjC,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,WAAW,CAAC;AAKnB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAUlF,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC;KAC5C;CACF;AAED,KAAK,uBAAuB,GAAG,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAE9E,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CACnD,IAAI,CAAC,0BAA0B,EAAE,cAAc,GAAG,sBAAsB,GAAG,sBAAsB,CAAC,CACnG,GACC,0BAA0B,CAAC;AAE7B,oBAAY,eAAe;IACzB,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IAErC,kBAAkB,uBAAuB;IACzC,kBAAkB,uBAAuB;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,UAAU,CAAC,CAAC,CAAC;IACxF,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpF,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9F,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;CACtF;AAED,eAAO,MAAM,iBAAiB,aACnB,0BAA0B,YACzB;IAAE,iBAAiB,EAAE,kBAAkB,CAAA;CAAE,KAClD,uBAgPF,CAAC"}
@@ -1,7 +1,6 @@
1
1
  import { __assign, __awaiter, __generator, __read, __spreadArray, __values } from "tslib";
2
2
  /* eslint-disable no-restricted-globals */
3
3
  import { DEFAULT_CSS_SELECTOR_ALLOWLIST, DEFAULT_ACTION_CLICK_ALLOWLIST, DEFAULT_DATA_ATTRIBUTE_PREFIX, } from '@amplitude/analytics-core';
4
- import { createRemoteConfigFetch } from '@amplitude/analytics-remote-config';
5
4
  import * as constants from './constants';
6
5
  import { fromEvent, map, share } from 'rxjs';
7
6
  import { createShouldTrackEvent, } from './helpers';
@@ -20,7 +19,7 @@ export var ObservablesEnum;
20
19
  ObservablesEnum["NavigateObservable"] = "navigateObservable";
21
20
  ObservablesEnum["MutationObservable"] = "mutationObservable";
22
21
  })(ObservablesEnum || (ObservablesEnum = {}));
23
- export var autocapturePlugin = function (options) {
22
+ export var autocapturePlugin = function (options, context) {
24
23
  var _a, _b, _c, _d, _e, _f, _g, _h;
25
24
  if (options === void 0) { options = {}; }
26
25
  var _j = options.dataAttributePrefix, dataAttributePrefix = _j === void 0 ? DEFAULT_DATA_ATTRIBUTE_PREFIX : _j, _k = options.visualTaggingOptions, visualTaggingOptions = _k === void 0 ? {
@@ -52,7 +51,7 @@ export var autocapturePlugin = function (options) {
52
51
  var type = 'enrichment';
53
52
  var subscriptions = [];
54
53
  // Create data extractor based on options
55
- var dataExtractor = new DataExtractor(options);
54
+ var dataExtractor = new DataExtractor(options, context);
56
55
  // Create observables on events on the window
57
56
  var createObservables = function () {
58
57
  var _a;
@@ -115,38 +114,15 @@ export var autocapturePlugin = function (options) {
115
114
  }
116
115
  // Fetch remote config for pageActions in a non-blocking manner
117
116
  if (config.fetchRemoteConfig) {
118
- createRemoteConfigFetch({
119
- localConfig: config,
120
- configKeys: ['analyticsSDK.pageActions'],
121
- })
122
- .then(function (remoteConfigFetch) { return __awaiter(void 0, void 0, void 0, function () {
123
- var remotePageActions, error_1;
124
- var _a;
125
- return __generator(this, function (_b) {
126
- switch (_b.label) {
127
- case 0:
128
- _b.trys.push([0, 2, , 3]);
129
- return [4 /*yield*/, remoteConfigFetch.getRemoteConfig('analyticsSDK', 'pageActions')];
130
- case 1:
131
- remotePageActions = _b.sent();
132
- recomputePageActionsData(remotePageActions);
133
- return [3 /*break*/, 3];
134
- case 2:
135
- error_1 = _b.sent();
136
- // Log error but don't fail the setup
137
- /* istanbul ignore next */
138
- (_a = config === null || config === void 0 ? void 0 : config.loggerProvider) === null || _a === void 0 ? void 0 : _a.error("Failed to fetch remote config: ".concat(String(error_1)));
139
- return [3 /*break*/, 3];
140
- case 3: return [2 /*return*/];
141
- }
117
+ if (!config.remoteConfigClient) {
118
+ // TODO(xinyi): Diagnostics.recordEvent
119
+ config.loggerProvider.debug('Remote config client is not provided, skipping remote config fetch');
120
+ }
121
+ else {
122
+ config.remoteConfigClient.subscribe('analyticsSDK.pageActions', 'all', function (remoteConfig) {
123
+ recomputePageActionsData(remoteConfig);
142
124
  });
143
- }); })
144
- .catch(function (error) {
145
- var _a;
146
- // Log error but don't fail the setup
147
- /* istanbul ignore next */
148
- (_a = config === null || config === void 0 ? void 0 : config.loggerProvider) === null || _a === void 0 ? void 0 : _a.error("Failed to create remote config fetch: ".concat(String(error)));
149
- });
125
+ }
150
126
  }
151
127
  shouldTrackEvent = createShouldTrackEvent(options, options.cssSelectorAllowlist);
152
128
  shouldTrackActionClick = createShouldTrackEvent(options, options.actionClickAllowlist);
@@ -1 +1 @@
1
- {"version":3,"file":"autocapture-plugin.js","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":";AAAA,0CAA0C;AAC1C,OAAO,EAKL,8BAA8B,EAC9B,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAsC,KAAK,EAAE,MAAM,MAAM,CAAC;AACjF,OAAO,EACL,sBAAsB,GAIvB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEhF,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,EACtB,+BAA+B,GAChC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAejD,MAAM,CAAN,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,sDAAmC,CAAA;IACnC,wDAAqC,CAAA;IACrC,uCAAuC;IACvC,4DAAyC,CAAA;IACzC,4DAAyC,CAAA;AAC3C,CAAC,EANW,eAAe,KAAf,eAAe,QAM1B;AAUD,MAAM,CAAC,IAAM,iBAAiB,GAAG,UAAC,OAAwC;;IAAxC,wBAAA,EAAA,YAAwC;IAEtE,IAAA,KAKE,OAAO,oBAL0C,EAAnD,mBAAmB,mBAAG,6BAA6B,KAAA,EACnD,KAIE,OAAO,qBADR,EAHD,oBAAoB,mBAAG;QACrB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI,eAAe,EAAE;KACjC,KAAA,CACS;IAEZ,OAAO,CAAC,oBAAoB,GAAG,MAAA,OAAO,CAAC,oBAAoB,mCAAI,8BAA8B,CAAC;IAC9F,OAAO,CAAC,oBAAoB,GAAG,MAAA,OAAO,CAAC,oBAAoB,mCAAI,8BAA8B,CAAC;IAC9F,OAAO,CAAC,YAAY,GAAG,MAAA,OAAO,CAAC,YAAY,mCAAI,CAAC,CAAC,CAAC,yDAAyD;IAE3G,OAAO,CAAC,kBAAkB,GAAG,MAAA,OAAO,CAAC,kBAAkB,0CAAE,MAAM,CAC7D,UAAC,GAA8C,EAAE,cAAc;QAC7D,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE;YACtC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SAC1B;QACD,IAAI,cAAc,YAAY,MAAM,EAAE;YACpC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SAC1B;QACD,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,KAAK,IAAI,IAAI,SAAS,IAAI,cAAc,EAAE;YAChG,IAAI;gBACF,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;aAC9C;YAAC,OAAO,UAAU,EAAE;gBACnB,OAAO,CAAC,IAAI,CAAC,iCAA0B,cAAc,CAAC,OAAO,CAAE,EAAE,UAAU,CAAC,CAAC;gBAC7E,OAAO,GAAG,CAAC;aACZ;SACF;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,CACH,CAAC;IAEF,IAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC;IACnC,IAAM,IAAI,GAAG,YAAY,CAAC;IAE1B,IAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,yCAAyC;IACzC,IAAM,aAAa,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAEjD,6CAA6C;IAC7C,IAAM,iBAAiB,GAAG;;QACxB,6CAA6C;QAC7C,IAAM,eAAe,GAAG,qBAAqB,EAAE,CAAC,IAAI,CAClD,GAAG,CAAC,UAAC,KAAK;YACR,OAAA,aAAa,CAAC,4BAA4B,CACxC,KAAK,EACL,OAAO,EACN,OAA0C,CAAC,oBAAoB,EAChE,mBAAmB,CACpB;QALD,CAKC,CACF,EACD,KAAK,EAAE,CACR,CAAC;QACF,IAAM,gBAAgB,GAAG,SAAS,CAAQ,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACnF,GAAG,CAAC,UAAC,MAAM;YACT,OAAA,aAAa,CAAC,4BAA4B,CACxC,MAAM,EACN,QAAQ,EACP,OAA0C,CAAC,oBAAoB,EAChE,mBAAmB,CACpB;QALD,CAKC,CACF,EACD,KAAK,EAAE,CACR,CAAC;QAEF,0CAA0C;QAC1C,uEAAuE;QACvE,kEAAkE;QAClE,KAAK;QAEL,oCAAoC;QACpC,IAAI,kBAA2E,CAAC;QAChF,0BAA0B;QAC1B,IAAI,MAAM,CAAC,UAAU,EAAE;YACrB,kBAAkB,GAAG,SAAS,CAAgB,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAC/E,GAAG,CAAC,UAAC,QAAQ;gBACX,OAAA,aAAa,CAAC,4BAA4B,CACxC,QAAQ,EACR,UAAU,EACT,OAA0C,CAAC,oBAAoB,EAChE,mBAAmB,CACpB;YALD,CAKC,CACF,EACD,KAAK,EAAE,CACR,CAAC;SACH;QAED,8CAA8C;QAC9C,IAAM,kBAAkB,GAAG,wBAAwB,EAAE,CAAC,IAAI,CACxD,GAAG,CAAC,UAAC,QAAQ;YACX,OAAA,aAAa,CAAC,4BAA4B,CACxC,QAAQ,EACR,UAAU,EACT,OAA0C,CAAC,oBAAoB,EAChE,mBAAmB,CACpB;QALD,CAKC,CACF,EACD,KAAK,EAAE,CACR,CAAC;QAEF;YACE,GAAC,eAAe,CAAC,eAAe,IAAG,eAAuE;YAC1G,GAAC,eAAe,CAAC,gBAAgB,IAAG,gBAAmE;YACvG,sDAAsD;YACtD,GAAC,eAAe,CAAC,kBAAkB,IAAG,kBAAkB;YACxD,GAAC,eAAe,CAAC,kBAAkB,IAAG,kBAAkB;eACxD;IACJ,CAAC,CAAC;IAEF,yDAAyD;IACzD,IAAI,oBAAoB,GAAG,+BAA+B,CAAC,MAAM,CAAC,MAAM,CAAC,MAAA,MAAA,OAAO,CAAC,WAAW,0CAAE,aAAa,mCAAI,EAAE,CAAC,CAAC,CAAC;IAEpH,IAAI,wBAAwB,GAAG,8BAA8B,CAAC,MAAA,MAAA,OAAO,CAAC,WAAW,0CAAE,QAAQ,mCAAI,EAAE,CAAC,CAAC;IAEnG,qGAAqG;IACrG,IAAM,gBAAgB,GAAG,sBAAsB,CAC7C,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,EACb,OAAO,CACR,CAAC;IAEF,2EAA2E;IAC3E,IAAM,wBAAwB,GAAG,UAAC,iBAA4D;;QAC5F,IAAI,iBAAiB,EAAE;YACrB,yCAAyC;YACzC,OAAO,CAAC,WAAW,yBACd,OAAO,CAAC,WAAW,GACnB,iBAAiB,CACrB,CAAC;YAEF,iCAAiC;YACjC,oBAAoB,GAAG,+BAA+B,CAAC,MAAM,CAAC,MAAM,CAAC,MAAA,OAAO,CAAC,WAAW,CAAC,aAAa,mCAAI,EAAE,CAAC,CAAC,CAAC;YAC/G,wBAAwB,GAAG,8BAA8B,CAAC,MAAA,OAAO,CAAC,WAAW,CAAC,QAAQ,mCAAI,EAAE,CAAC,CAAC;YAE9F,mCAAmC;YACnC,gBAAgB,CAAC,MAAM,CAAC,oBAAoB,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAC;SAClF;IACH,CAAC,CAAC;IAEF,IAAM,KAAK,GAAqC,UAAO,MAAM,EAAE,SAAS;;;;YACtE,wBAAwB;YACxB,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;gBACnC,sBAAO;aACR;YAED,+DAA+D;YAC/D,IAAI,MAAM,CAAC,iBAAiB,EAAE;gBAC5B,uBAAuB,CAAC;oBACtB,WAAW,EAAE,MAAM;oBACnB,UAAU,EAAE,CAAC,0BAA0B,CAAC;iBACzC,CAAC;qBACC,IAAI,CAAC,UAAO,iBAAiB;;;;;;;gCAEA,qBAAM,iBAAiB,CAAC,eAAe,CAAC,cAAc,EAAE,aAAa,CAAC,EAAA;;gCAA1F,iBAAiB,GAAG,SAAsE;gCAChG,wBAAwB,CAAC,iBAA8D,CAAC,CAAC;;;;gCAEzF,qCAAqC;gCACrC,0BAA0B;gCAC1B,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,0CAAE,KAAK,CAAC,yCAAkC,MAAM,CAAC,OAAK,CAAC,CAAE,CAAC,CAAC;;;;;qBAEpF,CAAC;qBACD,KAAK,CAAC,UAAC,KAAK;;oBACX,qCAAqC;oBACrC,0BAA0B;oBAC1B,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,0CAAE,KAAK,CAAC,gDAAyC,MAAM,CAAC,KAAK,CAAC,CAAE,CAAC,CAAC;gBAC1F,CAAC,CAAC,CAAC;aACN;YAGK,gBAAgB,GAAG,sBAAsB,CAC7C,OAAO,EACN,OAA0C,CAAC,oBAAoB,CACjE,CAAC;YACI,sBAAsB,GAAG,sBAAsB,CACnD,OAAO,EACN,OAA0C,CAAC,oBAAoB,CACjE,CAAC;YAGI,cAAc,GAAG,iBAAiB,EAAE,CAAC;YAGrC,yBAAyB,GAAG,WAAW,CAAC;gBAC5C,cAAc,gBAAA;gBACd,OAAO,EAAE,OAAyC;gBAClD,SAAS,WAAA;gBACT,gBAAgB,EAAE,gBAAgB;gBAClC,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC;aACnE,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAExC,kBAAkB,GAAG,WAAW,CAAC;gBACrC,cAAc,gBAAA;gBACd,kBAAkB,EAAE;oBAAC,cAAO;yBAAP,UAAO,EAAP,qBAAO,EAAP,IAAO;wBAAP,yBAAO;;oBAAK,OAAA,aAAa,CAAC,kBAAkB,OAAhC,aAAa,yCAAuB,IAAI,YAAE,mBAAmB;gBAA7D,CAA8D;gBAC/F,SAAS,WAAA;gBACT,gBAAgB,EAAE,gBAAgB;gBAClC,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC;aACnE,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAEjC,uBAAuB,GAAG,gBAAgB,CAAC;gBAC/C,cAAc,gBAAA;gBACd,OAAO,EAAE,OAAyC;gBAClD,kBAAkB,EAAE;oBAAC,cAAO;yBAAP,UAAO,EAAP,qBAAO,EAAP,IAAO;wBAAP,yBAAO;;oBAAK,OAAA,aAAa,CAAC,kBAAkB,OAAhC,aAAa,yCAAuB,IAAI,YAAE,mBAAmB;gBAA7D,CAA8D;gBAC/F,SAAS,WAAA;gBACT,gBAAgB,kBAAA;gBAChB,sBAAsB,EAAE,sBAAsB;aAC/C,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAE5C,0BAA0B;YAC1B,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,0CAAE,GAAG,CAAC,UAAG,IAAI,kCAA+B,CAAC,CAAC;YAEpE,gCAAgC;YAChC,IAAI,MAAM,CAAC,MAAM,IAAI,oBAAoB,CAAC,OAAO,EAAE;gBAC3C,SAAS,GAAI,OAA0C,CAAC,oBAAoB,CAAC;gBAC7E,oBAAoB,GAAI,OAA0C,CAAC,oBAAoB,CAAC;gBAE9F,0BAA0B;gBAC1B,MAAA,oBAAoB,CAAC,SAAS,0CAAE,KAAK,qBACnC,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,IAC3B,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,KAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,qBAAqB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,KAC3F,mBAAmB,EAAE,sBAAsB,CAAC,OAAO,yCAAM,SAAS,kBAAK,oBAAoB,UAAE,EAC7F,oBAAoB,EAAE,SAAS,EAC/B,oBAAoB,EAAE,oBAAoB,IAC1C,CAAC;aACJ;;;SACF,CAAC;IAEF,IAAM,OAAO,GAAuC,UAAO,KAAK;;YAC9D,sBAAO,KAAK,EAAC;;SACd,CAAC;IAEF,IAAM,QAAQ,GAAG;;;;;gBACf,KAA2B,kBAAA,SAAA,aAAa,CAAA,mHAAE;oBAA/B,YAAY;oBACrB,YAAY,CAAC,WAAW,EAAE,CAAC;iBAC5B;;;;;;;;;;;SACF,CAAC;IAEF,OAAO;QACL,IAAI,MAAA;QACJ,IAAI,MAAA;QACJ,KAAK,OAAA;QACL,OAAO,SAAA;QACP,QAAQ,UAAA;KACT,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n type BrowserClient,\n type BrowserConfig,\n type EnrichmentPlugin,\n type ElementInteractionsOptions,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n} from '@amplitude/analytics-core';\nimport { createRemoteConfigFetch } from '@amplitude/analytics-remote-config';\nimport * as constants from './constants';\nimport { fromEvent, map, type Observable, type Subscription, share } from 'rxjs';\nimport {\n createShouldTrackEvent,\n type ElementBasedTimestampedEvent,\n type TimestampedEvent,\n type NavigateEvent,\n} from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { trackClicks } from './autocapture/track-click';\nimport { trackChange } from './autocapture/track-change';\nimport { trackActionClick } from './autocapture/track-action-click';\nimport type { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';\nimport { createMutationObservable, createClickObservable } from './observables';\n\nimport {\n createLabeledEventToTriggerMap,\n createTriggerEvaluator,\n groupLabeledEventIdsByEventType,\n} from './pageActions/triggers';\nimport { DataExtractor } from './data-extractor';\n\ndeclare global {\n interface Window {\n navigation: HasEventTargetAddRemove<Event>;\n }\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport enum ObservablesEnum {\n ClickObservable = 'clickObservable',\n ChangeObservable = 'changeObservable',\n // ErrorObservable = 'errorObservable',\n NavigateObservable = 'navigateObservable',\n MutationObservable = 'mutationObservable',\n}\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;\n // [ObservablesEnum.ErrorObservable]: Observable<TimestampedEvent<ErrorEvent>>;\n [ObservablesEnum.NavigateObservable]: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n}\n\nexport const autocapturePlugin = (options: ElementInteractionsOptions = {}): BrowserEnrichmentPlugin => {\n const {\n dataAttributePrefix = DEFAULT_DATA_ATTRIBUTE_PREFIX,\n visualTaggingOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n\n options.cssSelectorAllowlist = options.cssSelectorAllowlist ?? DEFAULT_CSS_SELECTOR_ALLOWLIST;\n options.actionClickAllowlist = options.actionClickAllowlist ?? DEFAULT_ACTION_CLICK_ALLOWLIST;\n options.debounceTime = options.debounceTime ?? 0; // TODO: update this when rage clicks are added to 1000ms\n\n options.pageUrlExcludelist = options.pageUrlExcludelist?.reduce(\n (acc: (string | RegExp | { pattern: string })[], excludePattern) => {\n if (typeof excludePattern === 'string') {\n acc.push(excludePattern);\n }\n if (excludePattern instanceof RegExp) {\n acc.push(excludePattern);\n }\n if (typeof excludePattern === 'object' && excludePattern !== null && 'pattern' in excludePattern) {\n try {\n acc.push(new RegExp(excludePattern.pattern));\n } catch (regexError) {\n console.warn(`Invalid regex pattern: ${excludePattern.pattern}`, regexError);\n return acc;\n }\n }\n return acc;\n },\n [],\n );\n\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Subscription[] = [];\n\n // Create data extractor based on options\n const dataExtractor = new DataExtractor(options);\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n // Create Observables from direct user events\n const clickObservable = createClickObservable().pipe(\n map((click) =>\n dataExtractor.addAdditionalEventProperties(\n click,\n 'click',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n const changeObservable = fromEvent<Event>(document, 'change', { capture: true }).pipe(\n map((change) =>\n dataExtractor.addAdditionalEventProperties(\n change,\n 'change',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n\n // Create Observable from unhandled errors\n // const errorObservable = fromEvent<ErrorEvent>(window, 'error').pipe(\n // map((error) => addAdditionalEventProperties(error, 'error')),\n // );\n\n // Create observable for URL changes\n let navigateObservable: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n /* istanbul ignore next */\n if (window.navigation) {\n navigateObservable = fromEvent<NavigateEvent>(window.navigation, 'navigate').pipe(\n map((navigate) =>\n dataExtractor.addAdditionalEventProperties(\n navigate,\n 'navigate',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n }\n\n // Track DOM Mutations using shared observable\n const mutationObservable = createMutationObservable().pipe(\n map((mutation) =>\n dataExtractor.addAdditionalEventProperties(\n mutation,\n 'mutation',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n\n return {\n [ObservablesEnum.ClickObservable]: clickObservable as Observable<ElementBasedTimestampedEvent<MouseEvent>>,\n [ObservablesEnum.ChangeObservable]: changeObservable as Observable<ElementBasedTimestampedEvent<Event>>,\n // [ObservablesEnum.ErrorObservable]: errorObservable,\n [ObservablesEnum.NavigateObservable]: navigateObservable,\n [ObservablesEnum.MutationObservable]: mutationObservable,\n };\n };\n\n // Group labeled events by event type (eg. click, change)\n let groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions?.labeledEvents ?? {}));\n\n let labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions?.triggers ?? []);\n\n // Evaluate triggers for the given event by running the actions associated with the matching triggers\n const evaluateTriggers = createTriggerEvaluator(\n groupedLabeledEvents,\n labeledEventToTriggerMap,\n dataExtractor,\n options,\n );\n\n // Function to recalculate internal variables when remote config is updated\n const recomputePageActionsData = (remotePageActions: ElementInteractionsOptions['pageActions']) => {\n if (remotePageActions) {\n // Merge remote config with local options\n options.pageActions = {\n ...options.pageActions,\n ...remotePageActions,\n };\n\n // Recalculate internal variables\n groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions.labeledEvents ?? {}));\n labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions.triggers ?? []);\n\n // Update evaluateTriggers function\n evaluateTriggers.update(groupedLabeledEvents, labeledEventToTriggerMap, options);\n }\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Fetch remote config for pageActions in a non-blocking manner\n if (config.fetchRemoteConfig) {\n createRemoteConfigFetch({\n localConfig: config,\n configKeys: ['analyticsSDK.pageActions'],\n })\n .then(async (remoteConfigFetch) => {\n try {\n const remotePageActions = await remoteConfigFetch.getRemoteConfig('analyticsSDK', 'pageActions');\n recomputePageActionsData(remotePageActions as ElementInteractionsOptions['pageActions']);\n } catch (error) {\n // Log error but don't fail the setup\n /* istanbul ignore next */\n config?.loggerProvider?.error(`Failed to fetch remote config: ${String(error)}`);\n }\n })\n .catch((error) => {\n // Log error but don't fail the setup\n /* istanbul ignore next */\n config?.loggerProvider?.error(`Failed to create remote config fetch: ${String(error)}`);\n });\n }\n\n // Create should track event functions the different allowlists\n const shouldTrackEvent = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n );\n const shouldTrackActionClick = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist,\n );\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n // Create subscriptions\n const clickTrackingSubscription = trackClicks({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n subscriptions.push(clickTrackingSubscription);\n\n const changeSubscription = trackChange({\n allObservables,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n subscriptions.push(changeSubscription);\n\n const actionClickSubscription = trackActionClick({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent,\n shouldTrackActionClick: shouldTrackActionClick,\n });\n subscriptions.push(actionClickSubscription);\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n\n // Setup visual tagging selector\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n dataExtractor: dataExtractor,\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist: actionClickAllowlist,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
1
+ {"version":3,"file":"autocapture-plugin.js","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":";AAAA,0CAA0C;AAC1C,OAAO,EAKL,8BAA8B,EAC9B,8BAA8B,EAC9B,6BAA6B,GAE9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAsC,KAAK,EAAE,MAAM,MAAM,CAAC;AACjF,OAAO,EACL,sBAAsB,GAIvB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEhF,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,EACtB,+BAA+B,GAChC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAejD,MAAM,CAAN,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,sDAAmC,CAAA;IACnC,wDAAqC,CAAA;IACrC,uCAAuC;IACvC,4DAAyC,CAAA;IACzC,4DAAyC,CAAA;AAC3C,CAAC,EANW,eAAe,KAAf,eAAe,QAM1B;AAUD,MAAM,CAAC,IAAM,iBAAiB,GAAG,UAC/B,OAAwC,EACxC,OAAmD;;IADnD,wBAAA,EAAA,YAAwC;IAItC,IAAA,KAKE,OAAO,oBAL0C,EAAnD,mBAAmB,mBAAG,6BAA6B,KAAA,EACnD,KAIE,OAAO,qBADR,EAHD,oBAAoB,mBAAG;QACrB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI,eAAe,EAAE;KACjC,KAAA,CACS;IAEZ,OAAO,CAAC,oBAAoB,GAAG,MAAA,OAAO,CAAC,oBAAoB,mCAAI,8BAA8B,CAAC;IAC9F,OAAO,CAAC,oBAAoB,GAAG,MAAA,OAAO,CAAC,oBAAoB,mCAAI,8BAA8B,CAAC;IAC9F,OAAO,CAAC,YAAY,GAAG,MAAA,OAAO,CAAC,YAAY,mCAAI,CAAC,CAAC,CAAC,yDAAyD;IAE3G,OAAO,CAAC,kBAAkB,GAAG,MAAA,OAAO,CAAC,kBAAkB,0CAAE,MAAM,CAC7D,UAAC,GAA8C,EAAE,cAAc;QAC7D,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE;YACtC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SAC1B;QACD,IAAI,cAAc,YAAY,MAAM,EAAE;YACpC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SAC1B;QACD,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,KAAK,IAAI,IAAI,SAAS,IAAI,cAAc,EAAE;YAChG,IAAI;gBACF,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;aAC9C;YAAC,OAAO,UAAU,EAAE;gBACnB,OAAO,CAAC,IAAI,CAAC,iCAA0B,cAAc,CAAC,OAAO,CAAE,EAAE,UAAU,CAAC,CAAC;gBAC7E,OAAO,GAAG,CAAC;aACZ;SACF;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,CACH,CAAC;IAEF,IAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC;IACnC,IAAM,IAAI,GAAG,YAAY,CAAC;IAE1B,IAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,yCAAyC;IACzC,IAAM,aAAa,GAAG,IAAI,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE1D,6CAA6C;IAC7C,IAAM,iBAAiB,GAAG;;QACxB,6CAA6C;QAC7C,IAAM,eAAe,GAAG,qBAAqB,EAAE,CAAC,IAAI,CAClD,GAAG,CAAC,UAAC,KAAK;YACR,OAAA,aAAa,CAAC,4BAA4B,CACxC,KAAK,EACL,OAAO,EACN,OAA0C,CAAC,oBAAoB,EAChE,mBAAmB,CACpB;QALD,CAKC,CACF,EACD,KAAK,EAAE,CACR,CAAC;QACF,IAAM,gBAAgB,GAAG,SAAS,CAAQ,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACnF,GAAG,CAAC,UAAC,MAAM;YACT,OAAA,aAAa,CAAC,4BAA4B,CACxC,MAAM,EACN,QAAQ,EACP,OAA0C,CAAC,oBAAoB,EAChE,mBAAmB,CACpB;QALD,CAKC,CACF,EACD,KAAK,EAAE,CACR,CAAC;QAEF,0CAA0C;QAC1C,uEAAuE;QACvE,kEAAkE;QAClE,KAAK;QAEL,oCAAoC;QACpC,IAAI,kBAA2E,CAAC;QAChF,0BAA0B;QAC1B,IAAI,MAAM,CAAC,UAAU,EAAE;YACrB,kBAAkB,GAAG,SAAS,CAAgB,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAC/E,GAAG,CAAC,UAAC,QAAQ;gBACX,OAAA,aAAa,CAAC,4BAA4B,CACxC,QAAQ,EACR,UAAU,EACT,OAA0C,CAAC,oBAAoB,EAChE,mBAAmB,CACpB;YALD,CAKC,CACF,EACD,KAAK,EAAE,CACR,CAAC;SACH;QAED,8CAA8C;QAC9C,IAAM,kBAAkB,GAAG,wBAAwB,EAAE,CAAC,IAAI,CACxD,GAAG,CAAC,UAAC,QAAQ;YACX,OAAA,aAAa,CAAC,4BAA4B,CACxC,QAAQ,EACR,UAAU,EACT,OAA0C,CAAC,oBAAoB,EAChE,mBAAmB,CACpB;QALD,CAKC,CACF,EACD,KAAK,EAAE,CACR,CAAC;QAEF;YACE,GAAC,eAAe,CAAC,eAAe,IAAG,eAAuE;YAC1G,GAAC,eAAe,CAAC,gBAAgB,IAAG,gBAAmE;YACvG,sDAAsD;YACtD,GAAC,eAAe,CAAC,kBAAkB,IAAG,kBAAkB;YACxD,GAAC,eAAe,CAAC,kBAAkB,IAAG,kBAAkB;eACxD;IACJ,CAAC,CAAC;IAEF,yDAAyD;IACzD,IAAI,oBAAoB,GAAG,+BAA+B,CAAC,MAAM,CAAC,MAAM,CAAC,MAAA,MAAA,OAAO,CAAC,WAAW,0CAAE,aAAa,mCAAI,EAAE,CAAC,CAAC,CAAC;IAEpH,IAAI,wBAAwB,GAAG,8BAA8B,CAAC,MAAA,MAAA,OAAO,CAAC,WAAW,0CAAE,QAAQ,mCAAI,EAAE,CAAC,CAAC;IAEnG,qGAAqG;IACrG,IAAM,gBAAgB,GAAG,sBAAsB,CAC7C,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,EACb,OAAO,CACR,CAAC;IAEF,2EAA2E;IAC3E,IAAM,wBAAwB,GAAG,UAAC,iBAA4D;;QAC5F,IAAI,iBAAiB,EAAE;YACrB,yCAAyC;YACzC,OAAO,CAAC,WAAW,yBACd,OAAO,CAAC,WAAW,GACnB,iBAAiB,CACrB,CAAC;YAEF,iCAAiC;YACjC,oBAAoB,GAAG,+BAA+B,CAAC,MAAM,CAAC,MAAM,CAAC,MAAA,OAAO,CAAC,WAAW,CAAC,aAAa,mCAAI,EAAE,CAAC,CAAC,CAAC;YAC/G,wBAAwB,GAAG,8BAA8B,CAAC,MAAA,OAAO,CAAC,WAAW,CAAC,QAAQ,mCAAI,EAAE,CAAC,CAAC;YAE9F,mCAAmC;YACnC,gBAAgB,CAAC,MAAM,CAAC,oBAAoB,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAC;SAClF;IACH,CAAC,CAAC;IAEF,IAAM,KAAK,GAAqC,UAAO,MAAM,EAAE,SAAS;;;;YACtE,wBAAwB;YACxB,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;gBACnC,sBAAO;aACR;YAED,+DAA+D;YAC/D,IAAI,MAAM,CAAC,iBAAiB,EAAE;gBAC5B,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;oBAC9B,uCAAuC;oBACvC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;iBACnG;qBAAM;oBACL,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,0BAA0B,EAAE,KAAK,EAAE,UAAC,YAAY;wBAClF,wBAAwB,CAAC,YAAyD,CAAC,CAAC;oBACtF,CAAC,CAAC,CAAC;iBACJ;aACF;YAGK,gBAAgB,GAAG,sBAAsB,CAC7C,OAAO,EACN,OAA0C,CAAC,oBAAoB,CACjE,CAAC;YACI,sBAAsB,GAAG,sBAAsB,CACnD,OAAO,EACN,OAA0C,CAAC,oBAAoB,CACjE,CAAC;YAGI,cAAc,GAAG,iBAAiB,EAAE,CAAC;YAGrC,yBAAyB,GAAG,WAAW,CAAC;gBAC5C,cAAc,gBAAA;gBACd,OAAO,EAAE,OAAyC;gBAClD,SAAS,WAAA;gBACT,gBAAgB,EAAE,gBAAgB;gBAClC,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC;aACnE,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAExC,kBAAkB,GAAG,WAAW,CAAC;gBACrC,cAAc,gBAAA;gBACd,kBAAkB,EAAE;oBAAC,cAAO;yBAAP,UAAO,EAAP,qBAAO,EAAP,IAAO;wBAAP,yBAAO;;oBAAK,OAAA,aAAa,CAAC,kBAAkB,OAAhC,aAAa,yCAAuB,IAAI,YAAE,mBAAmB;gBAA7D,CAA8D;gBAC/F,SAAS,WAAA;gBACT,gBAAgB,EAAE,gBAAgB;gBAClC,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC;aACnE,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAEjC,uBAAuB,GAAG,gBAAgB,CAAC;gBAC/C,cAAc,gBAAA;gBACd,OAAO,EAAE,OAAyC;gBAClD,kBAAkB,EAAE;oBAAC,cAAO;yBAAP,UAAO,EAAP,qBAAO,EAAP,IAAO;wBAAP,yBAAO;;oBAAK,OAAA,aAAa,CAAC,kBAAkB,OAAhC,aAAa,yCAAuB,IAAI,YAAE,mBAAmB;gBAA7D,CAA8D;gBAC/F,SAAS,WAAA;gBACT,gBAAgB,kBAAA;gBAChB,sBAAsB,EAAE,sBAAsB;aAC/C,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAE5C,0BAA0B;YAC1B,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,0CAAE,GAAG,CAAC,UAAG,IAAI,kCAA+B,CAAC,CAAC;YAEpE,gCAAgC;YAChC,IAAI,MAAM,CAAC,MAAM,IAAI,oBAAoB,CAAC,OAAO,EAAE;gBAC3C,SAAS,GAAI,OAA0C,CAAC,oBAAoB,CAAC;gBAC7E,oBAAoB,GAAI,OAA0C,CAAC,oBAAoB,CAAC;gBAE9F,0BAA0B;gBAC1B,MAAA,oBAAoB,CAAC,SAAS,0CAAE,KAAK,qBACnC,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,IAC3B,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,KAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,qBAAqB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,KAC3F,mBAAmB,EAAE,sBAAsB,CAAC,OAAO,yCAAM,SAAS,kBAAK,oBAAoB,UAAE,EAC7F,oBAAoB,EAAE,SAAS,EAC/B,oBAAoB,EAAE,oBAAoB,IAC1C,CAAC;aACJ;;;SACF,CAAC;IAEF,IAAM,OAAO,GAAuC,UAAO,KAAK;;YAC9D,sBAAO,KAAK,EAAC;;SACd,CAAC;IAEF,IAAM,QAAQ,GAAG;;;;;gBACf,KAA2B,kBAAA,SAAA,aAAa,CAAA,mHAAE;oBAA/B,YAAY;oBACrB,YAAY,CAAC,WAAW,EAAE,CAAC;iBAC5B;;;;;;;;;;;SACF,CAAC;IAEF,OAAO;QACL,IAAI,MAAA;QACJ,IAAI,MAAA;QACJ,KAAK,OAAA;QACL,OAAO,SAAA;QACP,QAAQ,UAAA;KACT,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n type BrowserClient,\n type BrowserConfig,\n type EnrichmentPlugin,\n type ElementInteractionsOptions,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n IDiagnosticsClient,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { fromEvent, map, type Observable, type Subscription, share } from 'rxjs';\nimport {\n createShouldTrackEvent,\n type ElementBasedTimestampedEvent,\n type TimestampedEvent,\n type NavigateEvent,\n} from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { trackClicks } from './autocapture/track-click';\nimport { trackChange } from './autocapture/track-change';\nimport { trackActionClick } from './autocapture/track-action-click';\nimport type { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';\nimport { createMutationObservable, createClickObservable } from './observables';\n\nimport {\n createLabeledEventToTriggerMap,\n createTriggerEvaluator,\n groupLabeledEventIdsByEventType,\n} from './pageActions/triggers';\nimport { DataExtractor } from './data-extractor';\n\ndeclare global {\n interface Window {\n navigation: HasEventTargetAddRemove<Event>;\n }\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport enum ObservablesEnum {\n ClickObservable = 'clickObservable',\n ChangeObservable = 'changeObservable',\n // ErrorObservable = 'errorObservable',\n NavigateObservable = 'navigateObservable',\n MutationObservable = 'mutationObservable',\n}\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;\n // [ObservablesEnum.ErrorObservable]: Observable<TimestampedEvent<ErrorEvent>>;\n [ObservablesEnum.NavigateObservable]: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n}\n\nexport const autocapturePlugin = (\n options: ElementInteractionsOptions = {},\n context?: { diagnosticsClient: IDiagnosticsClient },\n): BrowserEnrichmentPlugin => {\n const {\n dataAttributePrefix = DEFAULT_DATA_ATTRIBUTE_PREFIX,\n visualTaggingOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n\n options.cssSelectorAllowlist = options.cssSelectorAllowlist ?? DEFAULT_CSS_SELECTOR_ALLOWLIST;\n options.actionClickAllowlist = options.actionClickAllowlist ?? DEFAULT_ACTION_CLICK_ALLOWLIST;\n options.debounceTime = options.debounceTime ?? 0; // TODO: update this when rage clicks are added to 1000ms\n\n options.pageUrlExcludelist = options.pageUrlExcludelist?.reduce(\n (acc: (string | RegExp | { pattern: string })[], excludePattern) => {\n if (typeof excludePattern === 'string') {\n acc.push(excludePattern);\n }\n if (excludePattern instanceof RegExp) {\n acc.push(excludePattern);\n }\n if (typeof excludePattern === 'object' && excludePattern !== null && 'pattern' in excludePattern) {\n try {\n acc.push(new RegExp(excludePattern.pattern));\n } catch (regexError) {\n console.warn(`Invalid regex pattern: ${excludePattern.pattern}`, regexError);\n return acc;\n }\n }\n return acc;\n },\n [],\n );\n\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Subscription[] = [];\n\n // Create data extractor based on options\n const dataExtractor = new DataExtractor(options, context);\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n // Create Observables from direct user events\n const clickObservable = createClickObservable().pipe(\n map((click) =>\n dataExtractor.addAdditionalEventProperties(\n click,\n 'click',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n const changeObservable = fromEvent<Event>(document, 'change', { capture: true }).pipe(\n map((change) =>\n dataExtractor.addAdditionalEventProperties(\n change,\n 'change',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n\n // Create Observable from unhandled errors\n // const errorObservable = fromEvent<ErrorEvent>(window, 'error').pipe(\n // map((error) => addAdditionalEventProperties(error, 'error')),\n // );\n\n // Create observable for URL changes\n let navigateObservable: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n /* istanbul ignore next */\n if (window.navigation) {\n navigateObservable = fromEvent<NavigateEvent>(window.navigation, 'navigate').pipe(\n map((navigate) =>\n dataExtractor.addAdditionalEventProperties(\n navigate,\n 'navigate',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n }\n\n // Track DOM Mutations using shared observable\n const mutationObservable = createMutationObservable().pipe(\n map((mutation) =>\n dataExtractor.addAdditionalEventProperties(\n mutation,\n 'mutation',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n\n return {\n [ObservablesEnum.ClickObservable]: clickObservable as Observable<ElementBasedTimestampedEvent<MouseEvent>>,\n [ObservablesEnum.ChangeObservable]: changeObservable as Observable<ElementBasedTimestampedEvent<Event>>,\n // [ObservablesEnum.ErrorObservable]: errorObservable,\n [ObservablesEnum.NavigateObservable]: navigateObservable,\n [ObservablesEnum.MutationObservable]: mutationObservable,\n };\n };\n\n // Group labeled events by event type (eg. click, change)\n let groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions?.labeledEvents ?? {}));\n\n let labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions?.triggers ?? []);\n\n // Evaluate triggers for the given event by running the actions associated with the matching triggers\n const evaluateTriggers = createTriggerEvaluator(\n groupedLabeledEvents,\n labeledEventToTriggerMap,\n dataExtractor,\n options,\n );\n\n // Function to recalculate internal variables when remote config is updated\n const recomputePageActionsData = (remotePageActions: ElementInteractionsOptions['pageActions']) => {\n if (remotePageActions) {\n // Merge remote config with local options\n options.pageActions = {\n ...options.pageActions,\n ...remotePageActions,\n };\n\n // Recalculate internal variables\n groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions.labeledEvents ?? {}));\n labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions.triggers ?? []);\n\n // Update evaluateTriggers function\n evaluateTriggers.update(groupedLabeledEvents, labeledEventToTriggerMap, options);\n }\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Fetch remote config for pageActions in a non-blocking manner\n if (config.fetchRemoteConfig) {\n if (!config.remoteConfigClient) {\n // TODO(xinyi): Diagnostics.recordEvent\n config.loggerProvider.debug('Remote config client is not provided, skipping remote config fetch');\n } else {\n config.remoteConfigClient.subscribe('analyticsSDK.pageActions', 'all', (remoteConfig) => {\n recomputePageActionsData(remoteConfig as ElementInteractionsOptions['pageActions']);\n });\n }\n }\n\n // Create should track event functions the different allowlists\n const shouldTrackEvent = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n );\n const shouldTrackActionClick = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist,\n );\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n // Create subscriptions\n const clickTrackingSubscription = trackClicks({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n subscriptions.push(clickTrackingSubscription);\n\n const changeSubscription = trackChange({\n allObservables,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n subscriptions.push(changeSubscription);\n\n const actionClickSubscription = trackActionClick({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent,\n shouldTrackActionClick: shouldTrackActionClick,\n });\n subscriptions.push(actionClickSubscription);\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n\n // Setup visual tagging selector\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n dataExtractor: dataExtractor,\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist: actionClickAllowlist,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
@@ -1,11 +1,14 @@
1
- import { ElementInteractionsOptions, ActionType } from '@amplitude/analytics-core';
1
+ import { ElementInteractionsOptions, ActionType, IDiagnosticsClient } from '@amplitude/analytics-core';
2
2
  import type { DataSource } from '@amplitude/analytics-core/lib/esm/types/element-interactions';
3
3
  import type { ElementBasedTimestampedEvent, TimestampedEvent } from './helpers';
4
4
  import type { JSONValue } from './helpers';
5
5
  import { Hierarchy } from './typings/autocapture';
6
6
  export declare class DataExtractor {
7
7
  private readonly additionalMaskTextPatterns;
8
- constructor(options: ElementInteractionsOptions);
8
+ diagnosticsClient?: IDiagnosticsClient;
9
+ constructor(options: ElementInteractionsOptions, context?: {
10
+ diagnosticsClient: IDiagnosticsClient;
11
+ });
9
12
  replaceSensitiveString: (text: string | null) => string;
10
13
  getHierarchy: (element: Element | null) => Hierarchy;
11
14
  getNearestLabel: (element: Element) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"data-extractor.d.ts","sourceRoot":"","sources":["../../src/data-extractor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,UAAU,EAAgB,MAAM,2BAA2B,CAAC;AACjG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8DAA8D,CAAC;AAU/F,OAAO,KAAK,EAAwB,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEtG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAOlD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAW;gBAE1C,OAAO,EAAE,0BAA0B;IAqB/C,sBAAsB,SAAU,MAAM,GAAG,IAAI,KAAG,MAAM,CA0BpD;IAGF,YAAY,YAAa,OAAO,GAAG,IAAI,eAuCrC;IAEF,eAAe,YAAa,OAAO,KAAG,MAAM,CAiB1C;IAGF,kBAAkB,eAAgB,UAAU,WAAW,OAAO,uBAAuB,MAAM;;MA0CzF;IAEF,4BAA4B,0GAGP,MAAM,EAAE,uBACN,MAAM,6DAuC3B;IAEF,yBAAyB,eAAgB,UAAU,kBAAkB,WAAW,+BAkB9E;IAEF,OAAO,YAAa,OAAO,KAAG,MAAM,CAkBlC;IAGF,gBAAgB,YAAa,OAAO,KAAG,OAAO,MAAM,EAAE,SAAS,CAAC,CAa9D;CACH"}
1
+ {"version":3,"file":"data-extractor.d.ts","sourceRoot":"","sources":["../../src/data-extractor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,UAAU,EAAgB,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACrH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8DAA8D,CAAC;AAU/F,OAAO,KAAK,EAAwB,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEtG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAOlD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAW;IACtD,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;gBAE3B,OAAO,EAAE,0BAA0B,EAAE,OAAO,CAAC,EAAE;QAAE,iBAAiB,EAAE,kBAAkB,CAAA;KAAE;IAuBpG,sBAAsB,SAAU,MAAM,GAAG,IAAI,KAAG,MAAM,CA0BpD;IAGF,YAAY,YAAa,OAAO,GAAG,IAAI,eA4CrC;IAEF,eAAe,YAAa,OAAO,KAAG,MAAM,CAiB1C;IAGF,kBAAkB,eAAgB,UAAU,WAAW,OAAO,uBAAuB,MAAM;;MA0CzF;IAEF,4BAA4B,0GAGP,MAAM,EAAE,uBACN,MAAM,6DAuC3B;IAEF,yBAAyB,eAAgB,UAAU,kBAAkB,WAAW,+BAkB9E;IAEF,OAAO,YAAa,OAAO,KAAG,MAAM,CAkBlC;IAGF,gBAAgB,YAAa,OAAO,KAAG,OAAO,MAAM,EAAE,SAAS,CAAC,CAa9D;CACH"}