userflow.js
Advanced tools
+7
-2
@@ -9,2 +9,6 @@ # Changelog | ||
| ## [v2.13.0] | ||
| - Added `userflow.debugger()` to toggle the internal debugger for testing user flows. | ||
| ## [v2.12.1] | ||
@@ -113,4 +117,5 @@ | ||
| [unreleased]: https://github.com/userflow/userflow.js/compare/v2.12.1...HEAD | ||
| [v2.12.0]: https://github.com/userflow/userflow.js/compare/v2.12.0...v2.12.1 | ||
| [unreleased]: https://github.com/userflow/userflow.js/compare/v2.13.0...HEAD | ||
| [v2.13.0]: https://github.com/userflow/userflow.js/compare/v2.12.1...v2.13.0 | ||
| [v2.12.1]: https://github.com/userflow/userflow.js/compare/v2.12.0...v2.12.1 | ||
| [v2.12.0]: https://github.com/userflow/userflow.js/compare/v2.11.0...v2.12.0 | ||
@@ -117,0 +122,0 @@ [v2.11.0]: https://github.com/userflow/userflow.js/compare/v2.10.0...v2.11.0 |
@@ -53,2 +53,3 @@ export interface Userflow { | ||
| disableEvalJs(): void; | ||
| debugger(): Promise<void>; | ||
| } | ||
@@ -55,0 +56,0 @@ export interface Attributes { |
@@ -211,2 +211,3 @@ /** | ||
| stubPromise('updateUser'); | ||
| stubPromise('debugger'); | ||
| // Methods that synchronously return and can be stubbed with default return | ||
@@ -213,0 +214,0 @@ // values and are not queued |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"userflow.es.js","sources":["../src/detect-browser-target.ts","../src/userflow.ts"],"sourcesContent":["type BrowserTarget = 'es2020' | 'legacy'\n\n/**\n * Returns `es2020` if the browser supports ES2020 features, `legacy` otherwise.\n *\n * It would be better to detect features, but there's no way to test e.g. if\n * dynamic imports are available in containing apps that may prevent `eval` via\n * their Content-Security-Policy.\n *\n * It's important that we don't mistake a legacy browser as es2020 (since that\n * may cause us to run an incompatible version), but it's okay to mistake an\n * es2020-capable browser and serve them the legacy version.\n *\n * The browser version numbers are based off of caniuse.com data of browsers\n * supporting ALL of the the following features:\n * - https://caniuse.com/es6-module-dynamic-import\n * - https://caniuse.com/mdn-javascript_operators_nullish_coalescing\n * - https://caniuse.com/mdn-javascript_operators_optional_chaining\n * - https://caniuse.com/bigint\n * - https://caniuse.com/mdn-javascript_builtins_promise_allsettled\n * - https://caniuse.com/mdn-javascript_builtins_globalthis\n * - https://caniuse.com/mdn-javascript_builtins_string_matchall\n */\nexport function detectBrowserTarget(agent: string): BrowserTarget {\n var options: [RegExp, RegExp, number][] = [\n // Edge. Can contain \"Chrome\", so must come before Chrome.\n [/Edg\\//, /Edg\\/(\\d+)/, 80],\n // Opera. Can contain \"Chrome\", so must come before Chrome\n [/OPR\\//, /OPR\\/(\\d+)/, 67],\n // Chrome. Can contain \"Safari\", so must come before Safari.\n [/Chrome\\//, /Chrome\\/(\\d+)/, 80],\n // Chrome on iOS. Can contain \"Safari\", so must come before Safari.\n // I'm not sure exactly what the engine driving Chrome iOS is, but assuming\n // it's based on iOS Safari, which hit v14 (that's es2020 compatible) on\n // September 16, 2020, and CriOS apparently hit v100 in April 11, 2022, we\n // just go with 100.\n [/CriOS\\//, /CriOS\\/(\\d+)/, 100],\n // Safari\n [/Safari\\//, /Version\\/(\\d+)/, 14],\n // Firefox\n [/Firefox\\//, /Firefox\\/(\\d+)/, 74]\n ]\n for (var i = 0; i < options.length; i++) {\n var option = options[i]\n var browserRegExp = option[0]\n var versionRegExp = option[1]\n var minVersion = option[2]\n if (!agent.match(browserRegExp)) {\n // No this browser\n continue\n }\n // Must be this browser, so version has to be found and be greater than\n // minVersion, otherwise we'll fall back to `legacy`.\n var versionMatch = agent.match(new RegExp(versionRegExp))\n if (versionMatch) {\n var version = parseInt(versionMatch[1], 10)\n if (version >= minVersion) {\n return 'es2020'\n }\n }\n break\n }\n return 'legacy'\n}\n","import type {ConditionalKeys} from 'type-fest'\nimport {detectBrowserTarget} from './detect-browser-target'\n\n// `userflow` lives on the `window` object\ninterface WindowWithUserflow extends Window {\n userflow?: Userflow\n\n // Array of `[method, deferred?, args]` tuples\n USERFLOWJS_QUEUE?: [string, Deferred | null, any[]][]\n\n USERFLOWJS_ENV_VARS?: Record<string, any>\n __userflowStatePatched: Boolean\n}\n\n// userflow.js API\nexport interface Userflow {\n _stubbed: boolean\n\n load: () => Promise<void>\n\n init: (token: string) => void\n\n identify: (\n userId: string,\n attributes?: Attributes,\n opts?: IdentifyOptions\n ) => Promise<void>\n\n identifyAnonymous: (\n attributes?: Attributes,\n opts?: IdentifyOptions\n ) => Promise<void>\n\n updateUser: (attributes: Attributes, opts?: IdentifyOptions) => Promise<void>\n\n group: (\n groupId: string,\n attributes?: Attributes,\n opts?: GroupOptions\n ) => Promise<void>\n\n updateGroup: (attributes: Attributes, opts?: GroupOptions) => Promise<void>\n\n track(\n name: string,\n attributes?: EventAttributes,\n opts?: TrackOptions\n ): Promise<void>\n\n isIdentified: () => boolean\n\n start: (contentId: string, opts?: StartOptions) => Promise<void>\n\n /**\n * @deprecated Use `start` instead\n */\n startFlow: (contentId: string, opts?: StartOptions) => Promise<void>\n\n /**\n * @deprecated Use `start` instead\n */\n startWalk: (contentId: string, opts?: StartOptions) => Promise<void>\n\n endAll: () => Promise<void>\n\n /**\n * @deprecated Use `endAll` instead\n */\n endAllFlows: () => Promise<void>\n\n endChecklist: () => Promise<void>\n\n openResourceCenter: () => void\n\n closeResourceCenter: () => void\n\n toggleResourceCenter: () => void\n\n setResourceCenterLauncherHidden: (hidden: boolean) => void\n\n getResourceCenterState: () => ResourceCenterState | null\n\n reset: () => void\n\n remount: () => void\n\n // eslint-disable-next-line es5/no-rest-parameters\n on(eventName: string, listener: (...args: any[]) => void): void\n\n // eslint-disable-next-line es5/no-rest-parameters\n off(eventName: string, listener: (...args: any[]) => void): void\n\n setCustomInputSelector(customInputSelector: string | null): void\n\n registerCustomInput(\n cssSelector: string,\n getValue?: (el: Element) => string\n ): void\n\n setCustomNavigate(customNavigate: ((url: string) => void) | null): void\n\n setUrlFilter(urlFilter: ((url: string) => string) | null): void\n\n setLinkUrlDecorator(linkUrlDecorator: ((url: string) => string) | null): void\n\n setInferenceAttributeNames(attributeNames: string[]): void\n\n setInferenceAttributeFilter(\n attributeName: string,\n filters: StringFilters\n ): void\n\n setInferenceClassNameFilter(filters: StringFilters): void\n\n setScrollPadding(scrollPadding: ScrollPadding | null): void\n\n setCustomScrollIntoView(scrollIntoView: ((el: Element) => void) | null): void\n\n prepareAudio(): void\n\n _setTargetEnv(targetEnv: unknown): void\n\n setShadowDomEnabled(shadowDomEnabled: boolean): void\n\n setPageTrackingDisabled(pageTrackingDisabled: boolean): void\n\n setBaseZIndex(baseZIndex: number): void\n\n setServerEndpoint(serverEndpoint: string | null | undefined): void\n\n disableEvalJs(): void\n}\n\n// Helper types for userflow.js API\nexport interface Attributes {\n [name: string]: AttributeLiteralOrList | AttributeChange\n}\n\ntype AttributeLiteral = string | number | boolean | null | undefined\ntype AttributeLiteralOrList = AttributeLiteral | AttributeLiteral[]\n\ninterface AttributeChange {\n set?: AttributeLiteralOrList\n set_once?: AttributeLiteralOrList\n add?: string | number\n subtract?: string | number\n append?: AttributeLiteralOrList\n prepend?: AttributeLiteralOrList\n remove?: AttributeLiteralOrList\n data_type?: AttributeDataType\n}\n\ntype AttributeDataType = 'string' | 'boolean' | 'number' | 'datetime' | 'list'\n\nexport type IdentifyOptions = {\n signature?: string\n}\n\nexport interface GroupOptions {\n signature?: string\n membership?: Attributes\n}\n\nexport interface EventAttributes {\n [name: string]: AttributeLiteral | EventAttributeChange\n}\n\ninterface EventAttributeChange {\n set?: AttributeLiteral\n data_type?: AttributeDataType\n}\n\nexport interface TrackOptions {\n userOnly?: boolean\n}\n\nexport interface StartOptions {\n once?: boolean\n}\n\nexport interface ResourceCenterState {\n isOpen: boolean\n hasChecklist: boolean\n uncompletedChecklistTaskCount: number\n unreadAnnouncementCount: number\n}\n\ninterface ScrollPadding {\n top?: number\n right?: number\n bottom?: number\n left?: number\n}\n\ntype StringFilter = ((className: string) => boolean) | RegExp\n\ntype StringFilters = StringFilter | StringFilter[]\n\ninterface Deferred {\n resolve: () => void\n reject: (e: any) => void\n}\n\n// If window.userflow has not been initalized yet, then stub all its methods, so\n// it can be used immediately, and load the Userflow.js script from CDN.\n// Support importing userflow.js with server-side rendering by attaching to an\n// empty object instead of `window`.\nvar w: WindowWithUserflow = typeof window === 'undefined' ? ({} as any) : window\nvar userflow = w.userflow\nvar history = w.history\n\nfunction overrideHistoryMethods(method: () => void, eventName: string) {\n return function () {\n var event = new CustomEvent(eventName)\n var args = Array.prototype.slice.call(arguments)\n var ret = method.apply(history, args as any)\n w.dispatchEvent(event)\n return ret\n }\n}\n\n// patch the history API's\n// pushState method to emit userflow:pushstate and\n// replaceState method to emit userflow:replacestate\nif (history) {\n // indicates if the history API's pushState and replaceState are patched with custom event emitters\n w.__userflowStatePatched = true\n\n var originalPushState = history.pushState\n var originalReplaceState = history.replaceState\n\n history.pushState = overrideHistoryMethods(\n originalPushState as any,\n 'userflow:pushstate'\n )\n history.replaceState = overrideHistoryMethods(\n originalReplaceState as any,\n 'userflow:replacestate'\n )\n}\n\nif (!userflow) {\n //\n var urlPrefix = 'https://js.userflow.com/'\n\n // Initialize as an empty object (methods will be stubbed below)\n var loadPromise: Promise<void> | null = null\n userflow = w.userflow = {\n _stubbed: true,\n // Helper to inject the proper Userflow.js script/module into the document\n load: function (): Promise<void> {\n // Make sure we only load Userflow.js once\n if (!loadPromise) {\n loadPromise = new Promise(function (resolve, reject) {\n var script = document.createElement('script')\n script.async = true\n // Detect if the browser supports es2020\n var envVars = w.USERFLOWJS_ENV_VARS || {}\n var browserTarget =\n envVars.USERFLOWJS_BROWSER_TARGET ||\n detectBrowserTarget(navigator.userAgent)\n if (browserTarget === 'es2020') {\n script.type = 'module'\n script.src =\n envVars.USERFLOWJS_ES2020_URL || urlPrefix + 'es2020/userflow.js'\n } else {\n script.src =\n envVars.USERFLOWJS_LEGACY_URL || urlPrefix + 'legacy/userflow.js'\n }\n script.onload = function () {\n resolve()\n }\n script.onerror = function () {\n document.head.removeChild(script)\n loadPromise = null\n var e = new Error('Could not load Userflow.js')\n console.warn(e.message)\n reject(e)\n }\n document.head.appendChild(script)\n })\n }\n return loadPromise\n }\n } as Userflow\n\n // Initialize the queue, which will be flushed by Userflow.js when it loads\n var q = (w.USERFLOWJS_QUEUE = w.USERFLOWJS_QUEUE || [])\n\n /**\n * Helper to stub void-returning methods that should be queued\n */\n var stubVoid = function (\n // eslint-disable-next-line es5/no-rest-parameters\n method: ConditionalKeys<Userflow, (...args: any[]) => void>\n ) {\n userflow![method] = function () {\n var args = Array.prototype.slice.call(arguments)\n userflow!.load()\n q.push([method, null, args])\n } as any\n }\n\n // Helper to stub promise-returning methods that should be queued\n var stubPromise = function (\n // eslint-disable-next-line es5/no-rest-parameters\n method: ConditionalKeys<Userflow, (...args: any[]) => Promise<void>>\n ) {\n userflow![method] = function () {\n var args = Array.prototype.slice.call(arguments)\n userflow!.load()\n var deferred: Deferred\n var promise = new Promise<void>(function (resolve, reject) {\n deferred = {resolve: resolve, reject: reject}\n })\n q.push([method, deferred!, args])\n return promise\n } as any\n }\n\n // Helper to stub methods that MUST return a value synchronously, and\n // therefore must support using a default callback until Userflow.js is\n // loaded.\n var stubDefault = function (\n method: ConditionalKeys<Userflow, () => any>,\n returnValue: any\n ) {\n userflow![method] = function () {\n return returnValue\n }\n }\n\n // Methods that return void and should be queued\n stubVoid('_setTargetEnv')\n stubVoid('closeResourceCenter')\n stubVoid('disableEvalJs')\n stubVoid('init')\n stubVoid('off')\n stubVoid('on')\n stubVoid('prepareAudio')\n stubVoid('registerCustomInput')\n stubVoid('remount')\n stubVoid('reset')\n stubVoid('setBaseZIndex')\n stubVoid('setCustomInputSelector')\n stubVoid('setCustomNavigate')\n stubVoid('setCustomScrollIntoView')\n stubVoid('setInferenceAttributeFilter')\n stubVoid('setInferenceAttributeNames')\n stubVoid('setInferenceClassNameFilter')\n stubVoid('setResourceCenterLauncherHidden')\n stubVoid('setScrollPadding')\n stubVoid('setServerEndpoint')\n stubVoid('setShadowDomEnabled')\n stubVoid('setPageTrackingDisabled')\n stubVoid('setUrlFilter')\n stubVoid('setLinkUrlDecorator')\n stubVoid('openResourceCenter')\n stubVoid('toggleResourceCenter')\n\n // Methods that return promises and should be queued\n stubPromise('endAll')\n stubPromise('endAllFlows') // deprecated\n stubPromise('endChecklist')\n stubPromise('group')\n stubPromise('identify')\n stubPromise('identifyAnonymous')\n stubPromise('start')\n stubPromise('startFlow') // deprecated\n stubPromise('startWalk') // deprecated\n stubPromise('track')\n stubPromise('updateGroup')\n stubPromise('updateUser')\n\n // Methods that synchronously return and can be stubbed with default return\n // values and are not queued\n stubDefault('getResourceCenterState', null)\n stubDefault('isIdentified', false)\n}\n\nexport default userflow!\n"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"userflow.es.js","sources":["../src/detect-browser-target.ts","../src/userflow.ts"],"sourcesContent":["type BrowserTarget = 'es2020' | 'legacy'\n\n/**\n * Returns `es2020` if the browser supports ES2020 features, `legacy` otherwise.\n *\n * It would be better to detect features, but there's no way to test e.g. if\n * dynamic imports are available in containing apps that may prevent `eval` via\n * their Content-Security-Policy.\n *\n * It's important that we don't mistake a legacy browser as es2020 (since that\n * may cause us to run an incompatible version), but it's okay to mistake an\n * es2020-capable browser and serve them the legacy version.\n *\n * The browser version numbers are based off of caniuse.com data of browsers\n * supporting ALL of the the following features:\n * - https://caniuse.com/es6-module-dynamic-import\n * - https://caniuse.com/mdn-javascript_operators_nullish_coalescing\n * - https://caniuse.com/mdn-javascript_operators_optional_chaining\n * - https://caniuse.com/bigint\n * - https://caniuse.com/mdn-javascript_builtins_promise_allsettled\n * - https://caniuse.com/mdn-javascript_builtins_globalthis\n * - https://caniuse.com/mdn-javascript_builtins_string_matchall\n */\nexport function detectBrowserTarget(agent: string): BrowserTarget {\n var options: [RegExp, RegExp, number][] = [\n // Edge. Can contain \"Chrome\", so must come before Chrome.\n [/Edg\\//, /Edg\\/(\\d+)/, 80],\n // Opera. Can contain \"Chrome\", so must come before Chrome\n [/OPR\\//, /OPR\\/(\\d+)/, 67],\n // Chrome. Can contain \"Safari\", so must come before Safari.\n [/Chrome\\//, /Chrome\\/(\\d+)/, 80],\n // Chrome on iOS. Can contain \"Safari\", so must come before Safari.\n // I'm not sure exactly what the engine driving Chrome iOS is, but assuming\n // it's based on iOS Safari, which hit v14 (that's es2020 compatible) on\n // September 16, 2020, and CriOS apparently hit v100 in April 11, 2022, we\n // just go with 100.\n [/CriOS\\//, /CriOS\\/(\\d+)/, 100],\n // Safari\n [/Safari\\//, /Version\\/(\\d+)/, 14],\n // Firefox\n [/Firefox\\//, /Firefox\\/(\\d+)/, 74]\n ]\n for (var i = 0; i < options.length; i++) {\n var option = options[i]\n var browserRegExp = option[0]\n var versionRegExp = option[1]\n var minVersion = option[2]\n if (!agent.match(browserRegExp)) {\n // No this browser\n continue\n }\n // Must be this browser, so version has to be found and be greater than\n // minVersion, otherwise we'll fall back to `legacy`.\n var versionMatch = agent.match(new RegExp(versionRegExp))\n if (versionMatch) {\n var version = parseInt(versionMatch[1], 10)\n if (version >= minVersion) {\n return 'es2020'\n }\n }\n break\n }\n return 'legacy'\n}\n","import type {ConditionalKeys} from 'type-fest'\nimport {detectBrowserTarget} from './detect-browser-target'\n\n// `userflow` lives on the `window` object\ninterface WindowWithUserflow extends Window {\n userflow?: Userflow\n\n // Array of `[method, deferred?, args]` tuples\n USERFLOWJS_QUEUE?: [string, Deferred | null, any[]][]\n\n USERFLOWJS_ENV_VARS?: Record<string, any>\n __userflowStatePatched: Boolean\n}\n\n// userflow.js API\nexport interface Userflow {\n _stubbed: boolean\n\n load: () => Promise<void>\n\n init: (token: string) => void\n\n identify: (\n userId: string,\n attributes?: Attributes,\n opts?: IdentifyOptions\n ) => Promise<void>\n\n identifyAnonymous: (\n attributes?: Attributes,\n opts?: IdentifyOptions\n ) => Promise<void>\n\n updateUser: (attributes: Attributes, opts?: IdentifyOptions) => Promise<void>\n\n group: (\n groupId: string,\n attributes?: Attributes,\n opts?: GroupOptions\n ) => Promise<void>\n\n updateGroup: (attributes: Attributes, opts?: GroupOptions) => Promise<void>\n\n track(\n name: string,\n attributes?: EventAttributes,\n opts?: TrackOptions\n ): Promise<void>\n\n isIdentified: () => boolean\n\n start: (contentId: string, opts?: StartOptions) => Promise<void>\n\n /**\n * @deprecated Use `start` instead\n */\n startFlow: (contentId: string, opts?: StartOptions) => Promise<void>\n\n /**\n * @deprecated Use `start` instead\n */\n startWalk: (contentId: string, opts?: StartOptions) => Promise<void>\n\n endAll: () => Promise<void>\n\n /**\n * @deprecated Use `endAll` instead\n */\n endAllFlows: () => Promise<void>\n\n endChecklist: () => Promise<void>\n\n openResourceCenter: () => void\n\n closeResourceCenter: () => void\n\n toggleResourceCenter: () => void\n\n setResourceCenterLauncherHidden: (hidden: boolean) => void\n\n getResourceCenterState: () => ResourceCenterState | null\n\n reset: () => void\n\n remount: () => void\n\n // eslint-disable-next-line es5/no-rest-parameters\n on(eventName: string, listener: (...args: any[]) => void): void\n\n // eslint-disable-next-line es5/no-rest-parameters\n off(eventName: string, listener: (...args: any[]) => void): void\n\n setCustomInputSelector(customInputSelector: string | null): void\n\n registerCustomInput(\n cssSelector: string,\n getValue?: (el: Element) => string\n ): void\n\n setCustomNavigate(customNavigate: ((url: string) => void) | null): void\n\n setUrlFilter(urlFilter: ((url: string) => string) | null): void\n\n setLinkUrlDecorator(linkUrlDecorator: ((url: string) => string) | null): void\n\n setInferenceAttributeNames(attributeNames: string[]): void\n\n setInferenceAttributeFilter(\n attributeName: string,\n filters: StringFilters\n ): void\n\n setInferenceClassNameFilter(filters: StringFilters): void\n\n setScrollPadding(scrollPadding: ScrollPadding | null): void\n\n setCustomScrollIntoView(scrollIntoView: ((el: Element) => void) | null): void\n\n prepareAudio(): void\n\n _setTargetEnv(targetEnv: unknown): void\n\n setShadowDomEnabled(shadowDomEnabled: boolean): void\n\n setPageTrackingDisabled(pageTrackingDisabled: boolean): void\n\n setBaseZIndex(baseZIndex: number): void\n\n setServerEndpoint(serverEndpoint: string | null | undefined): void\n\n disableEvalJs(): void\n\n debugger(): Promise<void>\n}\n\n// Helper types for userflow.js API\nexport interface Attributes {\n [name: string]: AttributeLiteralOrList | AttributeChange\n}\n\ntype AttributeLiteral = string | number | boolean | null | undefined\ntype AttributeLiteralOrList = AttributeLiteral | AttributeLiteral[]\n\ninterface AttributeChange {\n set?: AttributeLiteralOrList\n set_once?: AttributeLiteralOrList\n add?: string | number\n subtract?: string | number\n append?: AttributeLiteralOrList\n prepend?: AttributeLiteralOrList\n remove?: AttributeLiteralOrList\n data_type?: AttributeDataType\n}\n\ntype AttributeDataType = 'string' | 'boolean' | 'number' | 'datetime' | 'list'\n\nexport type IdentifyOptions = {\n signature?: string\n}\n\nexport interface GroupOptions {\n signature?: string\n membership?: Attributes\n}\n\nexport interface EventAttributes {\n [name: string]: AttributeLiteral | EventAttributeChange\n}\n\ninterface EventAttributeChange {\n set?: AttributeLiteral\n data_type?: AttributeDataType\n}\n\nexport interface TrackOptions {\n userOnly?: boolean\n}\n\nexport interface StartOptions {\n once?: boolean\n}\n\nexport interface ResourceCenterState {\n isOpen: boolean\n hasChecklist: boolean\n uncompletedChecklistTaskCount: number\n unreadAnnouncementCount: number\n}\n\ninterface ScrollPadding {\n top?: number\n right?: number\n bottom?: number\n left?: number\n}\n\ntype StringFilter = ((className: string) => boolean) | RegExp\n\ntype StringFilters = StringFilter | StringFilter[]\n\ninterface Deferred {\n resolve: () => void\n reject: (e: any) => void\n}\n\n// If window.userflow has not been initalized yet, then stub all its methods, so\n// it can be used immediately, and load the Userflow.js script from CDN.\n// Support importing userflow.js with server-side rendering by attaching to an\n// empty object instead of `window`.\nvar w: WindowWithUserflow = typeof window === 'undefined' ? ({} as any) : window\nvar userflow = w.userflow\nvar history = w.history\n\nfunction overrideHistoryMethods(method: () => void, eventName: string) {\n return function () {\n var event = new CustomEvent(eventName)\n var args = Array.prototype.slice.call(arguments)\n var ret = method.apply(history, args as any)\n w.dispatchEvent(event)\n return ret\n }\n}\n\n// patch the history API's\n// pushState method to emit userflow:pushstate and\n// replaceState method to emit userflow:replacestate\nif (history) {\n // indicates if the history API's pushState and replaceState are patched with custom event emitters\n w.__userflowStatePatched = true\n\n var originalPushState = history.pushState\n var originalReplaceState = history.replaceState\n\n history.pushState = overrideHistoryMethods(\n originalPushState as any,\n 'userflow:pushstate'\n )\n history.replaceState = overrideHistoryMethods(\n originalReplaceState as any,\n 'userflow:replacestate'\n )\n}\n\nif (!userflow) {\n //\n var urlPrefix = 'https://js.userflow.com/'\n\n // Initialize as an empty object (methods will be stubbed below)\n var loadPromise: Promise<void> | null = null\n userflow = w.userflow = {\n _stubbed: true,\n // Helper to inject the proper Userflow.js script/module into the document\n load: function (): Promise<void> {\n // Make sure we only load Userflow.js once\n if (!loadPromise) {\n loadPromise = new Promise(function (resolve, reject) {\n var script = document.createElement('script')\n script.async = true\n // Detect if the browser supports es2020\n var envVars = w.USERFLOWJS_ENV_VARS || {}\n var browserTarget =\n envVars.USERFLOWJS_BROWSER_TARGET ||\n detectBrowserTarget(navigator.userAgent)\n if (browserTarget === 'es2020') {\n script.type = 'module'\n script.src =\n envVars.USERFLOWJS_ES2020_URL || urlPrefix + 'es2020/userflow.js'\n } else {\n script.src =\n envVars.USERFLOWJS_LEGACY_URL || urlPrefix + 'legacy/userflow.js'\n }\n script.onload = function () {\n resolve()\n }\n script.onerror = function () {\n document.head.removeChild(script)\n loadPromise = null\n var e = new Error('Could not load Userflow.js')\n console.warn(e.message)\n reject(e)\n }\n document.head.appendChild(script)\n })\n }\n return loadPromise\n }\n } as Userflow\n\n // Initialize the queue, which will be flushed by Userflow.js when it loads\n var q = (w.USERFLOWJS_QUEUE = w.USERFLOWJS_QUEUE || [])\n\n /**\n * Helper to stub void-returning methods that should be queued\n */\n var stubVoid = function (\n // eslint-disable-next-line es5/no-rest-parameters\n method: ConditionalKeys<Userflow, (...args: any[]) => void>\n ) {\n userflow![method] = function () {\n var args = Array.prototype.slice.call(arguments)\n userflow!.load()\n q.push([method, null, args])\n } as any\n }\n\n // Helper to stub promise-returning methods that should be queued\n var stubPromise = function (\n // eslint-disable-next-line es5/no-rest-parameters\n method: ConditionalKeys<Userflow, (...args: any[]) => Promise<void>>\n ) {\n userflow![method] = function () {\n var args = Array.prototype.slice.call(arguments)\n userflow!.load()\n var deferred: Deferred\n var promise = new Promise<void>(function (resolve, reject) {\n deferred = {resolve: resolve, reject: reject}\n })\n q.push([method, deferred!, args])\n return promise\n } as any\n }\n\n // Helper to stub methods that MUST return a value synchronously, and\n // therefore must support using a default callback until Userflow.js is\n // loaded.\n var stubDefault = function (\n method: ConditionalKeys<Userflow, () => any>,\n returnValue: any\n ) {\n userflow![method] = function () {\n return returnValue\n }\n }\n\n // Methods that return void and should be queued\n stubVoid('_setTargetEnv')\n stubVoid('closeResourceCenter')\n stubVoid('disableEvalJs')\n stubVoid('init')\n stubVoid('off')\n stubVoid('on')\n stubVoid('prepareAudio')\n stubVoid('registerCustomInput')\n stubVoid('remount')\n stubVoid('reset')\n stubVoid('setBaseZIndex')\n stubVoid('setCustomInputSelector')\n stubVoid('setCustomNavigate')\n stubVoid('setCustomScrollIntoView')\n stubVoid('setInferenceAttributeFilter')\n stubVoid('setInferenceAttributeNames')\n stubVoid('setInferenceClassNameFilter')\n stubVoid('setResourceCenterLauncherHidden')\n stubVoid('setScrollPadding')\n stubVoid('setServerEndpoint')\n stubVoid('setShadowDomEnabled')\n stubVoid('setPageTrackingDisabled')\n stubVoid('setUrlFilter')\n stubVoid('setLinkUrlDecorator')\n stubVoid('openResourceCenter')\n stubVoid('toggleResourceCenter')\n\n // Methods that return promises and should be queued\n stubPromise('endAll')\n stubPromise('endAllFlows') // deprecated\n stubPromise('endChecklist')\n stubPromise('group')\n stubPromise('identify')\n stubPromise('identifyAnonymous')\n stubPromise('start')\n stubPromise('startFlow') // deprecated\n stubPromise('startWalk') // deprecated\n stubPromise('track')\n stubPromise('updateGroup')\n stubPromise('updateUser')\n stubPromise('debugger')\n\n // Methods that synchronously return and can be stubbed with default return\n // values and are not queued\n stubDefault('getResourceCenterState', null)\n stubDefault('isIdentified', false)\n}\n\nexport default userflow!\n"],"names":[],"mappings":"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"} |
@@ -1,1 +0,1 @@ | ||
| !function(){var e="undefined"==typeof window?{}:window,t=e.userflow,r=e.history;function n(t,n){return function(){var o=new CustomEvent(n),s=Array.prototype.slice.call(arguments),a=t.apply(r,s);return e.dispatchEvent(o),a}}if(r){e.__userflowStatePatched=!0;var o=r.pushState,s=r.replaceState;r.pushState=n(o,"userflow:pushstate"),r.replaceState=n(s,"userflow:replacestate")}if(!t){var a="https://js.userflow.com/",l=null;t=e.userflow={_stubbed:!0,load:function(){return l||(l=new Promise((function(t,r){var n=document.createElement("script");n.async=!0;var o=e.USERFLOWJS_ENV_VARS||{};"es2020"===(o.USERFLOWJS_BROWSER_TARGET||function(e){for(var t=[[/Edg\//,/Edg\/(\d+)/,80],[/OPR\//,/OPR\/(\d+)/,67],[/Chrome\//,/Chrome\/(\d+)/,80],[/CriOS\//,/CriOS\/(\d+)/,100],[/Safari\//,/Version\/(\d+)/,14],[/Firefox\//,/Firefox\/(\d+)/,74]],r=0;r<t.length;r++){var n=t[r],o=n[0],s=n[1],a=n[2];if(e.match(o)){var l=e.match(new RegExp(s));if(l&&parseInt(l[1],10)>=a)return"es2020";break}}return"legacy"}(navigator.userAgent))?(n.type="module",n.src=o.USERFLOWJS_ES2020_URL||a+"es2020/userflow.js"):n.src=o.USERFLOWJS_LEGACY_URL||a+"legacy/userflow.js",n.onload=function(){t()},n.onerror=function(){document.head.removeChild(n),l=null;var e=new Error("Could not load Userflow.js");console.warn(e.message),r(e)},document.head.appendChild(n)}))),l}};var u=e.USERFLOWJS_QUEUE=e.USERFLOWJS_QUEUE||[],i=function(e){t[e]=function(){var r=Array.prototype.slice.call(arguments);t.load(),u.push([e,null,r])}},c=function(e){t[e]=function(){var r,n=Array.prototype.slice.call(arguments);t.load();var o=new Promise((function(e,t){r={resolve:e,reject:t}}));return u.push([e,r,n]),o}},d=function(e,r){t[e]=function(){return r}};i("_setTargetEnv"),i("closeResourceCenter"),i("disableEvalJs"),i("init"),i("off"),i("on"),i("prepareAudio"),i("registerCustomInput"),i("remount"),i("reset"),i("setBaseZIndex"),i("setCustomInputSelector"),i("setCustomNavigate"),i("setCustomScrollIntoView"),i("setInferenceAttributeFilter"),i("setInferenceAttributeNames"),i("setInferenceClassNameFilter"),i("setResourceCenterLauncherHidden"),i("setScrollPadding"),i("setServerEndpoint"),i("setShadowDomEnabled"),i("setPageTrackingDisabled"),i("setUrlFilter"),i("setLinkUrlDecorator"),i("openResourceCenter"),i("toggleResourceCenter"),c("endAll"),c("endAllFlows"),c("endChecklist"),c("group"),c("identify"),c("identifyAnonymous"),c("start"),c("startFlow"),c("startWalk"),c("track"),c("updateGroup"),c("updateUser"),d("getResourceCenterState",null),d("isIdentified",!1)}}(); | ||
| !function(){var e="undefined"==typeof window?{}:window,t=e.userflow,r=e.history;function n(t,n){return function(){var o=new CustomEvent(n),s=Array.prototype.slice.call(arguments),a=t.apply(r,s);return e.dispatchEvent(o),a}}if(r){e.__userflowStatePatched=!0;var o=r.pushState,s=r.replaceState;r.pushState=n(o,"userflow:pushstate"),r.replaceState=n(s,"userflow:replacestate")}if(!t){var a="https://js.userflow.com/",l=null;t=e.userflow={_stubbed:!0,load:function(){return l||(l=new Promise((function(t,r){var n=document.createElement("script");n.async=!0;var o=e.USERFLOWJS_ENV_VARS||{};"es2020"===(o.USERFLOWJS_BROWSER_TARGET||function(e){for(var t=[[/Edg\//,/Edg\/(\d+)/,80],[/OPR\//,/OPR\/(\d+)/,67],[/Chrome\//,/Chrome\/(\d+)/,80],[/CriOS\//,/CriOS\/(\d+)/,100],[/Safari\//,/Version\/(\d+)/,14],[/Firefox\//,/Firefox\/(\d+)/,74]],r=0;r<t.length;r++){var n=t[r],o=n[0],s=n[1],a=n[2];if(e.match(o)){var l=e.match(new RegExp(s));if(l&&parseInt(l[1],10)>=a)return"es2020";break}}return"legacy"}(navigator.userAgent))?(n.type="module",n.src=o.USERFLOWJS_ES2020_URL||a+"es2020/userflow.js"):n.src=o.USERFLOWJS_LEGACY_URL||a+"legacy/userflow.js",n.onload=function(){t()},n.onerror=function(){document.head.removeChild(n),l=null;var e=new Error("Could not load Userflow.js");console.warn(e.message),r(e)},document.head.appendChild(n)}))),l}};var u=e.USERFLOWJS_QUEUE=e.USERFLOWJS_QUEUE||[],i=function(e){t[e]=function(){var r=Array.prototype.slice.call(arguments);t.load(),u.push([e,null,r])}},c=function(e){t[e]=function(){var r,n=Array.prototype.slice.call(arguments);t.load();var o=new Promise((function(e,t){r={resolve:e,reject:t}}));return u.push([e,r,n]),o}},d=function(e,r){t[e]=function(){return r}};i("_setTargetEnv"),i("closeResourceCenter"),i("disableEvalJs"),i("init"),i("off"),i("on"),i("prepareAudio"),i("registerCustomInput"),i("remount"),i("reset"),i("setBaseZIndex"),i("setCustomInputSelector"),i("setCustomNavigate"),i("setCustomScrollIntoView"),i("setInferenceAttributeFilter"),i("setInferenceAttributeNames"),i("setInferenceClassNameFilter"),i("setResourceCenterLauncherHidden"),i("setScrollPadding"),i("setServerEndpoint"),i("setShadowDomEnabled"),i("setPageTrackingDisabled"),i("setUrlFilter"),i("setLinkUrlDecorator"),i("openResourceCenter"),i("toggleResourceCenter"),c("endAll"),c("endAllFlows"),c("endChecklist"),c("group"),c("identify"),c("identifyAnonymous"),c("start"),c("startFlow"),c("startWalk"),c("track"),c("updateGroup"),c("updateUser"),c("debugger"),d("getResourceCenterState",null),d("isIdentified",!1)}}(); |
@@ -217,2 +217,3 @@ (function (global, factory) { | ||
| stubPromise('updateUser'); | ||
| stubPromise('debugger'); | ||
| // Methods that synchronously return and can be stubbed with default return | ||
@@ -219,0 +220,0 @@ // values and are not queued |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"userflow.umd.js","sources":["../src/detect-browser-target.ts","../src/userflow.ts"],"sourcesContent":["type BrowserTarget = 'es2020' | 'legacy'\n\n/**\n * Returns `es2020` if the browser supports ES2020 features, `legacy` otherwise.\n *\n * It would be better to detect features, but there's no way to test e.g. if\n * dynamic imports are available in containing apps that may prevent `eval` via\n * their Content-Security-Policy.\n *\n * It's important that we don't mistake a legacy browser as es2020 (since that\n * may cause us to run an incompatible version), but it's okay to mistake an\n * es2020-capable browser and serve them the legacy version.\n *\n * The browser version numbers are based off of caniuse.com data of browsers\n * supporting ALL of the the following features:\n * - https://caniuse.com/es6-module-dynamic-import\n * - https://caniuse.com/mdn-javascript_operators_nullish_coalescing\n * - https://caniuse.com/mdn-javascript_operators_optional_chaining\n * - https://caniuse.com/bigint\n * - https://caniuse.com/mdn-javascript_builtins_promise_allsettled\n * - https://caniuse.com/mdn-javascript_builtins_globalthis\n * - https://caniuse.com/mdn-javascript_builtins_string_matchall\n */\nexport function detectBrowserTarget(agent: string): BrowserTarget {\n var options: [RegExp, RegExp, number][] = [\n // Edge. Can contain \"Chrome\", so must come before Chrome.\n [/Edg\\//, /Edg\\/(\\d+)/, 80],\n // Opera. Can contain \"Chrome\", so must come before Chrome\n [/OPR\\//, /OPR\\/(\\d+)/, 67],\n // Chrome. Can contain \"Safari\", so must come before Safari.\n [/Chrome\\//, /Chrome\\/(\\d+)/, 80],\n // Chrome on iOS. Can contain \"Safari\", so must come before Safari.\n // I'm not sure exactly what the engine driving Chrome iOS is, but assuming\n // it's based on iOS Safari, which hit v14 (that's es2020 compatible) on\n // September 16, 2020, and CriOS apparently hit v100 in April 11, 2022, we\n // just go with 100.\n [/CriOS\\//, /CriOS\\/(\\d+)/, 100],\n // Safari\n [/Safari\\//, /Version\\/(\\d+)/, 14],\n // Firefox\n [/Firefox\\//, /Firefox\\/(\\d+)/, 74]\n ]\n for (var i = 0; i < options.length; i++) {\n var option = options[i]\n var browserRegExp = option[0]\n var versionRegExp = option[1]\n var minVersion = option[2]\n if (!agent.match(browserRegExp)) {\n // No this browser\n continue\n }\n // Must be this browser, so version has to be found and be greater than\n // minVersion, otherwise we'll fall back to `legacy`.\n var versionMatch = agent.match(new RegExp(versionRegExp))\n if (versionMatch) {\n var version = parseInt(versionMatch[1], 10)\n if (version >= minVersion) {\n return 'es2020'\n }\n }\n break\n }\n return 'legacy'\n}\n","import type {ConditionalKeys} from 'type-fest'\nimport {detectBrowserTarget} from './detect-browser-target'\n\n// `userflow` lives on the `window` object\ninterface WindowWithUserflow extends Window {\n userflow?: Userflow\n\n // Array of `[method, deferred?, args]` tuples\n USERFLOWJS_QUEUE?: [string, Deferred | null, any[]][]\n\n USERFLOWJS_ENV_VARS?: Record<string, any>\n __userflowStatePatched: Boolean\n}\n\n// userflow.js API\nexport interface Userflow {\n _stubbed: boolean\n\n load: () => Promise<void>\n\n init: (token: string) => void\n\n identify: (\n userId: string,\n attributes?: Attributes,\n opts?: IdentifyOptions\n ) => Promise<void>\n\n identifyAnonymous: (\n attributes?: Attributes,\n opts?: IdentifyOptions\n ) => Promise<void>\n\n updateUser: (attributes: Attributes, opts?: IdentifyOptions) => Promise<void>\n\n group: (\n groupId: string,\n attributes?: Attributes,\n opts?: GroupOptions\n ) => Promise<void>\n\n updateGroup: (attributes: Attributes, opts?: GroupOptions) => Promise<void>\n\n track(\n name: string,\n attributes?: EventAttributes,\n opts?: TrackOptions\n ): Promise<void>\n\n isIdentified: () => boolean\n\n start: (contentId: string, opts?: StartOptions) => Promise<void>\n\n /**\n * @deprecated Use `start` instead\n */\n startFlow: (contentId: string, opts?: StartOptions) => Promise<void>\n\n /**\n * @deprecated Use `start` instead\n */\n startWalk: (contentId: string, opts?: StartOptions) => Promise<void>\n\n endAll: () => Promise<void>\n\n /**\n * @deprecated Use `endAll` instead\n */\n endAllFlows: () => Promise<void>\n\n endChecklist: () => Promise<void>\n\n openResourceCenter: () => void\n\n closeResourceCenter: () => void\n\n toggleResourceCenter: () => void\n\n setResourceCenterLauncherHidden: (hidden: boolean) => void\n\n getResourceCenterState: () => ResourceCenterState | null\n\n reset: () => void\n\n remount: () => void\n\n // eslint-disable-next-line es5/no-rest-parameters\n on(eventName: string, listener: (...args: any[]) => void): void\n\n // eslint-disable-next-line es5/no-rest-parameters\n off(eventName: string, listener: (...args: any[]) => void): void\n\n setCustomInputSelector(customInputSelector: string | null): void\n\n registerCustomInput(\n cssSelector: string,\n getValue?: (el: Element) => string\n ): void\n\n setCustomNavigate(customNavigate: ((url: string) => void) | null): void\n\n setUrlFilter(urlFilter: ((url: string) => string) | null): void\n\n setLinkUrlDecorator(linkUrlDecorator: ((url: string) => string) | null): void\n\n setInferenceAttributeNames(attributeNames: string[]): void\n\n setInferenceAttributeFilter(\n attributeName: string,\n filters: StringFilters\n ): void\n\n setInferenceClassNameFilter(filters: StringFilters): void\n\n setScrollPadding(scrollPadding: ScrollPadding | null): void\n\n setCustomScrollIntoView(scrollIntoView: ((el: Element) => void) | null): void\n\n prepareAudio(): void\n\n _setTargetEnv(targetEnv: unknown): void\n\n setShadowDomEnabled(shadowDomEnabled: boolean): void\n\n setPageTrackingDisabled(pageTrackingDisabled: boolean): void\n\n setBaseZIndex(baseZIndex: number): void\n\n setServerEndpoint(serverEndpoint: string | null | undefined): void\n\n disableEvalJs(): void\n}\n\n// Helper types for userflow.js API\nexport interface Attributes {\n [name: string]: AttributeLiteralOrList | AttributeChange\n}\n\ntype AttributeLiteral = string | number | boolean | null | undefined\ntype AttributeLiteralOrList = AttributeLiteral | AttributeLiteral[]\n\ninterface AttributeChange {\n set?: AttributeLiteralOrList\n set_once?: AttributeLiteralOrList\n add?: string | number\n subtract?: string | number\n append?: AttributeLiteralOrList\n prepend?: AttributeLiteralOrList\n remove?: AttributeLiteralOrList\n data_type?: AttributeDataType\n}\n\ntype AttributeDataType = 'string' | 'boolean' | 'number' | 'datetime' | 'list'\n\nexport type IdentifyOptions = {\n signature?: string\n}\n\nexport interface GroupOptions {\n signature?: string\n membership?: Attributes\n}\n\nexport interface EventAttributes {\n [name: string]: AttributeLiteral | EventAttributeChange\n}\n\ninterface EventAttributeChange {\n set?: AttributeLiteral\n data_type?: AttributeDataType\n}\n\nexport interface TrackOptions {\n userOnly?: boolean\n}\n\nexport interface StartOptions {\n once?: boolean\n}\n\nexport interface ResourceCenterState {\n isOpen: boolean\n hasChecklist: boolean\n uncompletedChecklistTaskCount: number\n unreadAnnouncementCount: number\n}\n\ninterface ScrollPadding {\n top?: number\n right?: number\n bottom?: number\n left?: number\n}\n\ntype StringFilter = ((className: string) => boolean) | RegExp\n\ntype StringFilters = StringFilter | StringFilter[]\n\ninterface Deferred {\n resolve: () => void\n reject: (e: any) => void\n}\n\n// If window.userflow has not been initalized yet, then stub all its methods, so\n// it can be used immediately, and load the Userflow.js script from CDN.\n// Support importing userflow.js with server-side rendering by attaching to an\n// empty object instead of `window`.\nvar w: WindowWithUserflow = typeof window === 'undefined' ? ({} as any) : window\nvar userflow = w.userflow\nvar history = w.history\n\nfunction overrideHistoryMethods(method: () => void, eventName: string) {\n return function () {\n var event = new CustomEvent(eventName)\n var args = Array.prototype.slice.call(arguments)\n var ret = method.apply(history, args as any)\n w.dispatchEvent(event)\n return ret\n }\n}\n\n// patch the history API's\n// pushState method to emit userflow:pushstate and\n// replaceState method to emit userflow:replacestate\nif (history) {\n // indicates if the history API's pushState and replaceState are patched with custom event emitters\n w.__userflowStatePatched = true\n\n var originalPushState = history.pushState\n var originalReplaceState = history.replaceState\n\n history.pushState = overrideHistoryMethods(\n originalPushState as any,\n 'userflow:pushstate'\n )\n history.replaceState = overrideHistoryMethods(\n originalReplaceState as any,\n 'userflow:replacestate'\n )\n}\n\nif (!userflow) {\n //\n var urlPrefix = 'https://js.userflow.com/'\n\n // Initialize as an empty object (methods will be stubbed below)\n var loadPromise: Promise<void> | null = null\n userflow = w.userflow = {\n _stubbed: true,\n // Helper to inject the proper Userflow.js script/module into the document\n load: function (): Promise<void> {\n // Make sure we only load Userflow.js once\n if (!loadPromise) {\n loadPromise = new Promise(function (resolve, reject) {\n var script = document.createElement('script')\n script.async = true\n // Detect if the browser supports es2020\n var envVars = w.USERFLOWJS_ENV_VARS || {}\n var browserTarget =\n envVars.USERFLOWJS_BROWSER_TARGET ||\n detectBrowserTarget(navigator.userAgent)\n if (browserTarget === 'es2020') {\n script.type = 'module'\n script.src =\n envVars.USERFLOWJS_ES2020_URL || urlPrefix + 'es2020/userflow.js'\n } else {\n script.src =\n envVars.USERFLOWJS_LEGACY_URL || urlPrefix + 'legacy/userflow.js'\n }\n script.onload = function () {\n resolve()\n }\n script.onerror = function () {\n document.head.removeChild(script)\n loadPromise = null\n var e = new Error('Could not load Userflow.js')\n console.warn(e.message)\n reject(e)\n }\n document.head.appendChild(script)\n })\n }\n return loadPromise\n }\n } as Userflow\n\n // Initialize the queue, which will be flushed by Userflow.js when it loads\n var q = (w.USERFLOWJS_QUEUE = w.USERFLOWJS_QUEUE || [])\n\n /**\n * Helper to stub void-returning methods that should be queued\n */\n var stubVoid = function (\n // eslint-disable-next-line es5/no-rest-parameters\n method: ConditionalKeys<Userflow, (...args: any[]) => void>\n ) {\n userflow![method] = function () {\n var args = Array.prototype.slice.call(arguments)\n userflow!.load()\n q.push([method, null, args])\n } as any\n }\n\n // Helper to stub promise-returning methods that should be queued\n var stubPromise = function (\n // eslint-disable-next-line es5/no-rest-parameters\n method: ConditionalKeys<Userflow, (...args: any[]) => Promise<void>>\n ) {\n userflow![method] = function () {\n var args = Array.prototype.slice.call(arguments)\n userflow!.load()\n var deferred: Deferred\n var promise = new Promise<void>(function (resolve, reject) {\n deferred = {resolve: resolve, reject: reject}\n })\n q.push([method, deferred!, args])\n return promise\n } as any\n }\n\n // Helper to stub methods that MUST return a value synchronously, and\n // therefore must support using a default callback until Userflow.js is\n // loaded.\n var stubDefault = function (\n method: ConditionalKeys<Userflow, () => any>,\n returnValue: any\n ) {\n userflow![method] = function () {\n return returnValue\n }\n }\n\n // Methods that return void and should be queued\n stubVoid('_setTargetEnv')\n stubVoid('closeResourceCenter')\n stubVoid('disableEvalJs')\n stubVoid('init')\n stubVoid('off')\n stubVoid('on')\n stubVoid('prepareAudio')\n stubVoid('registerCustomInput')\n stubVoid('remount')\n stubVoid('reset')\n stubVoid('setBaseZIndex')\n stubVoid('setCustomInputSelector')\n stubVoid('setCustomNavigate')\n stubVoid('setCustomScrollIntoView')\n stubVoid('setInferenceAttributeFilter')\n stubVoid('setInferenceAttributeNames')\n stubVoid('setInferenceClassNameFilter')\n stubVoid('setResourceCenterLauncherHidden')\n stubVoid('setScrollPadding')\n stubVoid('setServerEndpoint')\n stubVoid('setShadowDomEnabled')\n stubVoid('setPageTrackingDisabled')\n stubVoid('setUrlFilter')\n stubVoid('setLinkUrlDecorator')\n stubVoid('openResourceCenter')\n stubVoid('toggleResourceCenter')\n\n // Methods that return promises and should be queued\n stubPromise('endAll')\n stubPromise('endAllFlows') // deprecated\n stubPromise('endChecklist')\n stubPromise('group')\n stubPromise('identify')\n stubPromise('identifyAnonymous')\n stubPromise('start')\n stubPromise('startFlow') // deprecated\n stubPromise('startWalk') // deprecated\n stubPromise('track')\n stubPromise('updateGroup')\n stubPromise('updateUser')\n\n // Methods that synchronously return and can be stubbed with default return\n // values and are not queued\n stubDefault('getResourceCenterState', null)\n stubDefault('isIdentified', false)\n}\n\nexport default userflow!\n"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"userflow.umd.js","sources":["../src/detect-browser-target.ts","../src/userflow.ts"],"sourcesContent":["type BrowserTarget = 'es2020' | 'legacy'\n\n/**\n * Returns `es2020` if the browser supports ES2020 features, `legacy` otherwise.\n *\n * It would be better to detect features, but there's no way to test e.g. if\n * dynamic imports are available in containing apps that may prevent `eval` via\n * their Content-Security-Policy.\n *\n * It's important that we don't mistake a legacy browser as es2020 (since that\n * may cause us to run an incompatible version), but it's okay to mistake an\n * es2020-capable browser and serve them the legacy version.\n *\n * The browser version numbers are based off of caniuse.com data of browsers\n * supporting ALL of the the following features:\n * - https://caniuse.com/es6-module-dynamic-import\n * - https://caniuse.com/mdn-javascript_operators_nullish_coalescing\n * - https://caniuse.com/mdn-javascript_operators_optional_chaining\n * - https://caniuse.com/bigint\n * - https://caniuse.com/mdn-javascript_builtins_promise_allsettled\n * - https://caniuse.com/mdn-javascript_builtins_globalthis\n * - https://caniuse.com/mdn-javascript_builtins_string_matchall\n */\nexport function detectBrowserTarget(agent: string): BrowserTarget {\n var options: [RegExp, RegExp, number][] = [\n // Edge. Can contain \"Chrome\", so must come before Chrome.\n [/Edg\\//, /Edg\\/(\\d+)/, 80],\n // Opera. Can contain \"Chrome\", so must come before Chrome\n [/OPR\\//, /OPR\\/(\\d+)/, 67],\n // Chrome. Can contain \"Safari\", so must come before Safari.\n [/Chrome\\//, /Chrome\\/(\\d+)/, 80],\n // Chrome on iOS. Can contain \"Safari\", so must come before Safari.\n // I'm not sure exactly what the engine driving Chrome iOS is, but assuming\n // it's based on iOS Safari, which hit v14 (that's es2020 compatible) on\n // September 16, 2020, and CriOS apparently hit v100 in April 11, 2022, we\n // just go with 100.\n [/CriOS\\//, /CriOS\\/(\\d+)/, 100],\n // Safari\n [/Safari\\//, /Version\\/(\\d+)/, 14],\n // Firefox\n [/Firefox\\//, /Firefox\\/(\\d+)/, 74]\n ]\n for (var i = 0; i < options.length; i++) {\n var option = options[i]\n var browserRegExp = option[0]\n var versionRegExp = option[1]\n var minVersion = option[2]\n if (!agent.match(browserRegExp)) {\n // No this browser\n continue\n }\n // Must be this browser, so version has to be found and be greater than\n // minVersion, otherwise we'll fall back to `legacy`.\n var versionMatch = agent.match(new RegExp(versionRegExp))\n if (versionMatch) {\n var version = parseInt(versionMatch[1], 10)\n if (version >= minVersion) {\n return 'es2020'\n }\n }\n break\n }\n return 'legacy'\n}\n","import type {ConditionalKeys} from 'type-fest'\nimport {detectBrowserTarget} from './detect-browser-target'\n\n// `userflow` lives on the `window` object\ninterface WindowWithUserflow extends Window {\n userflow?: Userflow\n\n // Array of `[method, deferred?, args]` tuples\n USERFLOWJS_QUEUE?: [string, Deferred | null, any[]][]\n\n USERFLOWJS_ENV_VARS?: Record<string, any>\n __userflowStatePatched: Boolean\n}\n\n// userflow.js API\nexport interface Userflow {\n _stubbed: boolean\n\n load: () => Promise<void>\n\n init: (token: string) => void\n\n identify: (\n userId: string,\n attributes?: Attributes,\n opts?: IdentifyOptions\n ) => Promise<void>\n\n identifyAnonymous: (\n attributes?: Attributes,\n opts?: IdentifyOptions\n ) => Promise<void>\n\n updateUser: (attributes: Attributes, opts?: IdentifyOptions) => Promise<void>\n\n group: (\n groupId: string,\n attributes?: Attributes,\n opts?: GroupOptions\n ) => Promise<void>\n\n updateGroup: (attributes: Attributes, opts?: GroupOptions) => Promise<void>\n\n track(\n name: string,\n attributes?: EventAttributes,\n opts?: TrackOptions\n ): Promise<void>\n\n isIdentified: () => boolean\n\n start: (contentId: string, opts?: StartOptions) => Promise<void>\n\n /**\n * @deprecated Use `start` instead\n */\n startFlow: (contentId: string, opts?: StartOptions) => Promise<void>\n\n /**\n * @deprecated Use `start` instead\n */\n startWalk: (contentId: string, opts?: StartOptions) => Promise<void>\n\n endAll: () => Promise<void>\n\n /**\n * @deprecated Use `endAll` instead\n */\n endAllFlows: () => Promise<void>\n\n endChecklist: () => Promise<void>\n\n openResourceCenter: () => void\n\n closeResourceCenter: () => void\n\n toggleResourceCenter: () => void\n\n setResourceCenterLauncherHidden: (hidden: boolean) => void\n\n getResourceCenterState: () => ResourceCenterState | null\n\n reset: () => void\n\n remount: () => void\n\n // eslint-disable-next-line es5/no-rest-parameters\n on(eventName: string, listener: (...args: any[]) => void): void\n\n // eslint-disable-next-line es5/no-rest-parameters\n off(eventName: string, listener: (...args: any[]) => void): void\n\n setCustomInputSelector(customInputSelector: string | null): void\n\n registerCustomInput(\n cssSelector: string,\n getValue?: (el: Element) => string\n ): void\n\n setCustomNavigate(customNavigate: ((url: string) => void) | null): void\n\n setUrlFilter(urlFilter: ((url: string) => string) | null): void\n\n setLinkUrlDecorator(linkUrlDecorator: ((url: string) => string) | null): void\n\n setInferenceAttributeNames(attributeNames: string[]): void\n\n setInferenceAttributeFilter(\n attributeName: string,\n filters: StringFilters\n ): void\n\n setInferenceClassNameFilter(filters: StringFilters): void\n\n setScrollPadding(scrollPadding: ScrollPadding | null): void\n\n setCustomScrollIntoView(scrollIntoView: ((el: Element) => void) | null): void\n\n prepareAudio(): void\n\n _setTargetEnv(targetEnv: unknown): void\n\n setShadowDomEnabled(shadowDomEnabled: boolean): void\n\n setPageTrackingDisabled(pageTrackingDisabled: boolean): void\n\n setBaseZIndex(baseZIndex: number): void\n\n setServerEndpoint(serverEndpoint: string | null | undefined): void\n\n disableEvalJs(): void\n\n debugger(): Promise<void>\n}\n\n// Helper types for userflow.js API\nexport interface Attributes {\n [name: string]: AttributeLiteralOrList | AttributeChange\n}\n\ntype AttributeLiteral = string | number | boolean | null | undefined\ntype AttributeLiteralOrList = AttributeLiteral | AttributeLiteral[]\n\ninterface AttributeChange {\n set?: AttributeLiteralOrList\n set_once?: AttributeLiteralOrList\n add?: string | number\n subtract?: string | number\n append?: AttributeLiteralOrList\n prepend?: AttributeLiteralOrList\n remove?: AttributeLiteralOrList\n data_type?: AttributeDataType\n}\n\ntype AttributeDataType = 'string' | 'boolean' | 'number' | 'datetime' | 'list'\n\nexport type IdentifyOptions = {\n signature?: string\n}\n\nexport interface GroupOptions {\n signature?: string\n membership?: Attributes\n}\n\nexport interface EventAttributes {\n [name: string]: AttributeLiteral | EventAttributeChange\n}\n\ninterface EventAttributeChange {\n set?: AttributeLiteral\n data_type?: AttributeDataType\n}\n\nexport interface TrackOptions {\n userOnly?: boolean\n}\n\nexport interface StartOptions {\n once?: boolean\n}\n\nexport interface ResourceCenterState {\n isOpen: boolean\n hasChecklist: boolean\n uncompletedChecklistTaskCount: number\n unreadAnnouncementCount: number\n}\n\ninterface ScrollPadding {\n top?: number\n right?: number\n bottom?: number\n left?: number\n}\n\ntype StringFilter = ((className: string) => boolean) | RegExp\n\ntype StringFilters = StringFilter | StringFilter[]\n\ninterface Deferred {\n resolve: () => void\n reject: (e: any) => void\n}\n\n// If window.userflow has not been initalized yet, then stub all its methods, so\n// it can be used immediately, and load the Userflow.js script from CDN.\n// Support importing userflow.js with server-side rendering by attaching to an\n// empty object instead of `window`.\nvar w: WindowWithUserflow = typeof window === 'undefined' ? ({} as any) : window\nvar userflow = w.userflow\nvar history = w.history\n\nfunction overrideHistoryMethods(method: () => void, eventName: string) {\n return function () {\n var event = new CustomEvent(eventName)\n var args = Array.prototype.slice.call(arguments)\n var ret = method.apply(history, args as any)\n w.dispatchEvent(event)\n return ret\n }\n}\n\n// patch the history API's\n// pushState method to emit userflow:pushstate and\n// replaceState method to emit userflow:replacestate\nif (history) {\n // indicates if the history API's pushState and replaceState are patched with custom event emitters\n w.__userflowStatePatched = true\n\n var originalPushState = history.pushState\n var originalReplaceState = history.replaceState\n\n history.pushState = overrideHistoryMethods(\n originalPushState as any,\n 'userflow:pushstate'\n )\n history.replaceState = overrideHistoryMethods(\n originalReplaceState as any,\n 'userflow:replacestate'\n )\n}\n\nif (!userflow) {\n //\n var urlPrefix = 'https://js.userflow.com/'\n\n // Initialize as an empty object (methods will be stubbed below)\n var loadPromise: Promise<void> | null = null\n userflow = w.userflow = {\n _stubbed: true,\n // Helper to inject the proper Userflow.js script/module into the document\n load: function (): Promise<void> {\n // Make sure we only load Userflow.js once\n if (!loadPromise) {\n loadPromise = new Promise(function (resolve, reject) {\n var script = document.createElement('script')\n script.async = true\n // Detect if the browser supports es2020\n var envVars = w.USERFLOWJS_ENV_VARS || {}\n var browserTarget =\n envVars.USERFLOWJS_BROWSER_TARGET ||\n detectBrowserTarget(navigator.userAgent)\n if (browserTarget === 'es2020') {\n script.type = 'module'\n script.src =\n envVars.USERFLOWJS_ES2020_URL || urlPrefix + 'es2020/userflow.js'\n } else {\n script.src =\n envVars.USERFLOWJS_LEGACY_URL || urlPrefix + 'legacy/userflow.js'\n }\n script.onload = function () {\n resolve()\n }\n script.onerror = function () {\n document.head.removeChild(script)\n loadPromise = null\n var e = new Error('Could not load Userflow.js')\n console.warn(e.message)\n reject(e)\n }\n document.head.appendChild(script)\n })\n }\n return loadPromise\n }\n } as Userflow\n\n // Initialize the queue, which will be flushed by Userflow.js when it loads\n var q = (w.USERFLOWJS_QUEUE = w.USERFLOWJS_QUEUE || [])\n\n /**\n * Helper to stub void-returning methods that should be queued\n */\n var stubVoid = function (\n // eslint-disable-next-line es5/no-rest-parameters\n method: ConditionalKeys<Userflow, (...args: any[]) => void>\n ) {\n userflow![method] = function () {\n var args = Array.prototype.slice.call(arguments)\n userflow!.load()\n q.push([method, null, args])\n } as any\n }\n\n // Helper to stub promise-returning methods that should be queued\n var stubPromise = function (\n // eslint-disable-next-line es5/no-rest-parameters\n method: ConditionalKeys<Userflow, (...args: any[]) => Promise<void>>\n ) {\n userflow![method] = function () {\n var args = Array.prototype.slice.call(arguments)\n userflow!.load()\n var deferred: Deferred\n var promise = new Promise<void>(function (resolve, reject) {\n deferred = {resolve: resolve, reject: reject}\n })\n q.push([method, deferred!, args])\n return promise\n } as any\n }\n\n // Helper to stub methods that MUST return a value synchronously, and\n // therefore must support using a default callback until Userflow.js is\n // loaded.\n var stubDefault = function (\n method: ConditionalKeys<Userflow, () => any>,\n returnValue: any\n ) {\n userflow![method] = function () {\n return returnValue\n }\n }\n\n // Methods that return void and should be queued\n stubVoid('_setTargetEnv')\n stubVoid('closeResourceCenter')\n stubVoid('disableEvalJs')\n stubVoid('init')\n stubVoid('off')\n stubVoid('on')\n stubVoid('prepareAudio')\n stubVoid('registerCustomInput')\n stubVoid('remount')\n stubVoid('reset')\n stubVoid('setBaseZIndex')\n stubVoid('setCustomInputSelector')\n stubVoid('setCustomNavigate')\n stubVoid('setCustomScrollIntoView')\n stubVoid('setInferenceAttributeFilter')\n stubVoid('setInferenceAttributeNames')\n stubVoid('setInferenceClassNameFilter')\n stubVoid('setResourceCenterLauncherHidden')\n stubVoid('setScrollPadding')\n stubVoid('setServerEndpoint')\n stubVoid('setShadowDomEnabled')\n stubVoid('setPageTrackingDisabled')\n stubVoid('setUrlFilter')\n stubVoid('setLinkUrlDecorator')\n stubVoid('openResourceCenter')\n stubVoid('toggleResourceCenter')\n\n // Methods that return promises and should be queued\n stubPromise('endAll')\n stubPromise('endAllFlows') // deprecated\n stubPromise('endChecklist')\n stubPromise('group')\n stubPromise('identify')\n stubPromise('identifyAnonymous')\n stubPromise('start')\n stubPromise('startFlow') // deprecated\n stubPromise('startWalk') // deprecated\n stubPromise('track')\n stubPromise('updateGroup')\n stubPromise('updateUser')\n stubPromise('debugger')\n\n // Methods that synchronously return and can be stubbed with default return\n // values and are not queued\n stubDefault('getResourceCenterState', null)\n stubDefault('isIdentified', false)\n}\n\nexport default userflow!\n"],"names":[],"mappings":";;;;;;EAEA;;;;;;;;;;;;;;;;;;;;EAoBG;EACG,SAAU,mBAAmB,CAAC,KAAa,EAAA;EAC/C,IAAA,IAAI,OAAO,GAA+B;;EAExC,QAAA,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC;;EAE3B,QAAA,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC;;EAE3B,QAAA,CAAC,UAAU,EAAE,eAAe,EAAE,EAAE,CAAC;;;;;;EAMjC,QAAA,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,CAAC;;EAEhC,QAAA,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,CAAC;;EAElC,QAAA,CAAC,WAAW,EAAE,gBAAgB,EAAE,EAAE,CAAC;OACpC,CAAA;EACD,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;EACvC,QAAA,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;EACvB,QAAA,IAAI,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;EAC7B,QAAA,IAAI,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;EAC7B,QAAA,IAAI,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;EAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;;cAE/B,SAAQ;EACT,SAAA;;;EAGD,QAAA,IAAI,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,CAAA;EACzD,QAAA,IAAI,YAAY,EAAE;cAChB,IAAI,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;cAC3C,IAAI,OAAO,IAAI,UAAU,EAAE;EACzB,gBAAA,OAAO,QAAQ,CAAA;EAChB,aAAA;EACF,SAAA;UACD,MAAK;EACN,KAAA;EACD,IAAA,OAAO,QAAQ,CAAA;EACjB;;EC8IA;EACA;EACA;EACA;EACA,IAAI,CAAC,GAAuB,OAAO,MAAM,KAAK,WAAW,GAAI,EAAU,GAAG,MAAM,CAAA;EAChF,IAAI,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAA;EACzB,IAAI,OAAO,GAAG,CAAC,CAAC,OAAO,CAAA;EAEvB,SAAS,sBAAsB,CAAC,MAAkB,EAAE,SAAiB,EAAA;MACnE,OAAO,YAAA;EACL,QAAA,IAAI,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAA;EACtC,QAAA,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;UAChD,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAW,CAAC,CAAA;EAC5C,QAAA,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;EACtB,QAAA,OAAO,GAAG,CAAA;EACZ,KAAC,CAAA;EACH,CAAC;EAED;EACA;EACA;EACA,IAAI,OAAO,EAAE;;EAEX,IAAA,CAAC,CAAC,sBAAsB,GAAG,IAAI,CAAA;EAE/B,IAAA,IAAI,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAA;EACzC,IAAA,IAAI,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAA;MAE/C,OAAO,CAAC,SAAS,GAAG,sBAAsB,CACxC,iBAAwB,EACxB,oBAAoB,CACrB,CAAA;MACD,OAAO,CAAC,YAAY,GAAG,sBAAsB,CAC3C,oBAA2B,EAC3B,uBAAuB,CACxB,CAAA;EACF,CAAA;EAED,IAAI,CAAC,QAAQ,EAAE;;MAEb,IAAI,SAAS,GAAG,0BAA0B,CAAA;;MAG1C,IAAI,WAAW,GAAyB,IAAI,CAAA;EAC5C,IAAA,QAAQ,GAAG,CAAC,CAAC,QAAQ,GAAG;EACtB,QAAA,QAAQ,EAAE,IAAI;;EAEd,QAAA,IAAI,EAAE,YAAA;;cAEJ,IAAI,CAAC,WAAW,EAAE;EAChB,gBAAA,WAAW,GAAG,IAAI,OAAO,CAAC,UAAU,OAAO,EAAE,MAAM,EAAA;sBACjD,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;EAC7C,oBAAA,MAAM,CAAC,KAAK,GAAG,IAAI,CAAA;;EAEnB,oBAAA,IAAI,OAAO,GAAG,CAAC,CAAC,mBAAmB,IAAI,EAAE,CAAA;EACzC,oBAAA,IAAI,aAAa,GACf,OAAO,CAAC,yBAAyB;EACjC,wBAAA,mBAAmB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;sBAC1C,IAAI,aAAa,KAAK,QAAQ,EAAE;EAC9B,wBAAA,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAA;EACtB,wBAAA,MAAM,CAAC,GAAG;EACR,4BAAA,OAAO,CAAC,qBAAqB,IAAI,SAAS,GAAG,oBAAoB,CAAA;EACpE,qBAAA;EAAM,yBAAA;EACL,wBAAA,MAAM,CAAC,GAAG;EACR,4BAAA,OAAO,CAAC,qBAAqB,IAAI,SAAS,GAAG,oBAAoB,CAAA;EACpE,qBAAA;sBACD,MAAM,CAAC,MAAM,GAAG,YAAA;EACd,wBAAA,OAAO,EAAE,CAAA;EACX,qBAAC,CAAA;sBACD,MAAM,CAAC,OAAO,GAAG,YAAA;EACf,wBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;0BACjC,WAAW,GAAG,IAAI,CAAA;EAClB,wBAAA,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;EAC/C,wBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;0BACvB,MAAM,CAAC,CAAC,CAAC,CAAA;EACX,qBAAC,CAAA;EACD,oBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;EACnC,iBAAC,CAAC,CAAA;EACH,aAAA;EACD,YAAA,OAAO,WAAW,CAAA;WACnB;OACU,CAAA;;EAGb,IAAA,IAAI,CAAC,IAAI,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAA;EAEvD;;EAEG;EACH,IAAA,IAAI,QAAQ,GAAG;;MAEb,MAA2D,EAAA;UAE3D,QAAS,CAAC,MAAM,CAAC,GAAG,YAAA;EAClB,YAAA,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;cAChD,QAAS,CAAC,IAAI,EAAE,CAAA;cAChB,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;EAC9B,SAAQ,CAAA;EACV,KAAC,CAAA;;EAGD,IAAA,IAAI,WAAW,GAAG;;MAEhB,MAAoE,EAAA;UAEpE,QAAS,CAAC,MAAM,CAAC,GAAG,YAAA;EAClB,YAAA,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;cAChD,QAAS,CAAC,IAAI,EAAE,CAAA;EAChB,YAAA,IAAI,QAAkB,CAAA;cACtB,IAAI,OAAO,GAAG,IAAI,OAAO,CAAO,UAAU,OAAO,EAAE,MAAM,EAAA;kBACvD,QAAQ,GAAG,EAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAC,CAAA;EAC/C,aAAC,CAAC,CAAA;cACF,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAS,EAAE,IAAI,CAAC,CAAC,CAAA;EACjC,YAAA,OAAO,OAAO,CAAA;EAChB,SAAQ,CAAA;EACV,KAAC,CAAA;;;;EAKD,IAAA,IAAI,WAAW,GAAG,UAChB,MAA4C,EAC5C,WAAgB,EAAA;UAEhB,QAAS,CAAC,MAAM,CAAC,GAAG,YAAA;EAClB,YAAA,OAAO,WAAW,CAAA;EACpB,SAAC,CAAA;EACH,KAAC,CAAA;;MAGD,QAAQ,CAAC,eAAe,CAAC,CAAA;MACzB,QAAQ,CAAC,qBAAqB,CAAC,CAAA;MAC/B,QAAQ,CAAC,eAAe,CAAC,CAAA;MACzB,QAAQ,CAAC,MAAM,CAAC,CAAA;MAChB,QAAQ,CAAC,KAAK,CAAC,CAAA;MACf,QAAQ,CAAC,IAAI,CAAC,CAAA;MACd,QAAQ,CAAC,cAAc,CAAC,CAAA;MACxB,QAAQ,CAAC,qBAAqB,CAAC,CAAA;MAC/B,QAAQ,CAAC,SAAS,CAAC,CAAA;MACnB,QAAQ,CAAC,OAAO,CAAC,CAAA;MACjB,QAAQ,CAAC,eAAe,CAAC,CAAA;MACzB,QAAQ,CAAC,wBAAwB,CAAC,CAAA;MAClC,QAAQ,CAAC,mBAAmB,CAAC,CAAA;MAC7B,QAAQ,CAAC,yBAAyB,CAAC,CAAA;MACnC,QAAQ,CAAC,6BAA6B,CAAC,CAAA;MACvC,QAAQ,CAAC,4BAA4B,CAAC,CAAA;MACtC,QAAQ,CAAC,6BAA6B,CAAC,CAAA;MACvC,QAAQ,CAAC,iCAAiC,CAAC,CAAA;MAC3C,QAAQ,CAAC,kBAAkB,CAAC,CAAA;MAC5B,QAAQ,CAAC,mBAAmB,CAAC,CAAA;MAC7B,QAAQ,CAAC,qBAAqB,CAAC,CAAA;MAC/B,QAAQ,CAAC,yBAAyB,CAAC,CAAA;MACnC,QAAQ,CAAC,cAAc,CAAC,CAAA;MACxB,QAAQ,CAAC,qBAAqB,CAAC,CAAA;MAC/B,QAAQ,CAAC,oBAAoB,CAAC,CAAA;MAC9B,QAAQ,CAAC,sBAAsB,CAAC,CAAA;;MAGhC,WAAW,CAAC,QAAQ,CAAC,CAAA;EACrB,IAAA,WAAW,CAAC,aAAa,CAAC,CAAA;MAC1B,WAAW,CAAC,cAAc,CAAC,CAAA;MAC3B,WAAW,CAAC,OAAO,CAAC,CAAA;MACpB,WAAW,CAAC,UAAU,CAAC,CAAA;MACvB,WAAW,CAAC,mBAAmB,CAAC,CAAA;MAChC,WAAW,CAAC,OAAO,CAAC,CAAA;EACpB,IAAA,WAAW,CAAC,WAAW,CAAC,CAAA;EACxB,IAAA,WAAW,CAAC,WAAW,CAAC,CAAA;MACxB,WAAW,CAAC,OAAO,CAAC,CAAA;MACpB,WAAW,CAAC,aAAa,CAAC,CAAA;MAC1B,WAAW,CAAC,YAAY,CAAC,CAAA;MACzB,WAAW,CAAC,UAAU,CAAC,CAAA;;;EAIvB,IAAA,WAAW,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAA;EAC3C,IAAA,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;EACnC,CAAA;AAED,mBAAe,QAAS;;;;;;;;"} |
+1
-1
| { | ||
| "name": "userflow.js", | ||
| "version": "2.12.1", | ||
| "version": "2.13.0", | ||
| "description": "Async loader for userflow.js", | ||
@@ -5,0 +5,0 @@ "homepage": "https://github.com/userflow/userflow.js", |
+3
-0
@@ -132,2 +132,4 @@ import type {ConditionalKeys} from 'type-fest' | ||
| disableEvalJs(): void | ||
| debugger(): Promise<void> | ||
| } | ||
@@ -375,2 +377,3 @@ | ||
| stubPromise('updateUser') | ||
| stubPromise('debugger') | ||
@@ -377,0 +380,0 @@ // Methods that synchronously return and can be stubbed with default return |
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
96773
0.54%1134
0.44%0
-100%