@descope/sdk-mixins 0.26.0 → 0.27.0

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.
Files changed (52) hide show
  1. package/dist/cjs/index.js +2 -0
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/mixins/flowInputMixin/flowInputMixin.js.map +1 -1
  4. package/dist/cjs/mixins/flowModalMixin/flowModalMixin.js +36 -0
  5. package/dist/cjs/mixins/flowModalMixin/flowModalMixin.js.map +1 -0
  6. package/dist/cjs/mixins/modalMixin/modalMixin.js +8 -2
  7. package/dist/cjs/mixins/modalMixin/modalMixin.js.map +1 -1
  8. package/dist/cjs/mixins/telemetryMixin/telemetryMixin.js +34 -8
  9. package/dist/cjs/mixins/telemetryMixin/telemetryMixin.js.map +1 -1
  10. package/dist/esm/index.js +1 -0
  11. package/dist/esm/index.js.map +1 -1
  12. package/dist/esm/mixins/flowInputMixin/flowInputMixin.js.map +1 -1
  13. package/dist/esm/mixins/flowModalMixin/flowModalMixin.js +34 -0
  14. package/dist/esm/mixins/flowModalMixin/flowModalMixin.js.map +1 -0
  15. package/dist/esm/mixins/modalMixin/modalMixin.js +8 -2
  16. package/dist/esm/mixins/modalMixin/modalMixin.js.map +1 -1
  17. package/dist/esm/mixins/telemetryMixin/telemetryMixin.js +34 -8
  18. package/dist/esm/mixins/telemetryMixin/telemetryMixin.js.map +1 -1
  19. package/dist/index.d.ts +786 -290
  20. package/dist/types/index.d.ts +1 -0
  21. package/dist/types/mixins/componentsConditionsMixin/componentsConditionsMixin.d.ts +9 -9
  22. package/dist/types/mixins/configMixin/configMixin.d.ts +14 -14
  23. package/dist/types/mixins/configMixin/types.d.ts +1 -0
  24. package/dist/types/mixins/createStateManagementMixin.d.ts +2 -2
  25. package/dist/types/mixins/createValidateAttributesMixin/createValidateAttributesMixin.d.ts +5 -5
  26. package/dist/types/mixins/cspNonceMixin.d.ts +5 -5
  27. package/dist/types/mixins/debuggerMixin/debugger-wc.d.ts +5 -5
  28. package/dist/types/mixins/debuggerMixin/debuggerMixin.d.ts +8 -8
  29. package/dist/types/mixins/descopeUiMixin/descopeUiMixin.d.ts +19 -19
  30. package/dist/types/mixins/fetchWidgetPagesMixin/createFetchWidgetPagesMixin.d.ts +15 -15
  31. package/dist/types/mixins/flowIdMixin.d.ts +5 -5
  32. package/dist/types/mixins/flowInputMixin/flowInputMixin.d.ts +42 -41
  33. package/dist/types/mixins/flowModalMixin/flowModalMixin.d.ts +462 -0
  34. package/dist/types/mixins/flowModalMixin/index.d.ts +1 -0
  35. package/dist/types/mixins/formMixin.d.ts +2 -2
  36. package/dist/types/mixins/initElementMixin.d.ts +5 -5
  37. package/dist/types/mixins/initLifecycleMixin.d.ts +1 -1
  38. package/dist/types/mixins/injectNpmLibMixin/injectNpmLibMixin.d.ts +2 -2
  39. package/dist/types/mixins/injectStyleMixin.d.ts +5 -5
  40. package/dist/types/mixins/loggerMixin/loggerMixin.d.ts +2 -2
  41. package/dist/types/mixins/modalMixin/modalMixin.d.ts +56 -24
  42. package/dist/types/mixins/notificationsMixin/notificationsMixin.d.ts +23 -23
  43. package/dist/types/mixins/observeAttributesMixin/observeAttributesMixin.d.ts +4 -4
  44. package/dist/types/mixins/projectIdMixin.d.ts +5 -5
  45. package/dist/types/mixins/resetMixin.d.ts +6 -6
  46. package/dist/types/mixins/staticResourcesMixin/staticResourcesMixin.d.ts +10 -10
  47. package/dist/types/mixins/telemetryMixin/telemetryMixin.d.ts +24 -24
  48. package/dist/types/mixins/tenantIdMixin.d.ts +5 -5
  49. package/dist/types/mixins/themeMixin/themeMixin.d.ts +40 -40
  50. package/dist/types/mixins/widgetConfigMixin/widgetConfigMixin.d.ts +14 -14
  51. package/dist/types/mixins/widgetIdMixin.d.ts +5 -5
  52. package/package.json +3 -3
package/dist/cjs/index.js CHANGED
@@ -6,6 +6,7 @@ var debuggerMixin = require('./mixins/debuggerMixin/debuggerMixin.js');
6
6
  var descopeUiMixin = require('./mixins/descopeUiMixin/descopeUiMixin.js');
7
7
  var loggerMixin = require('./mixins/loggerMixin/loggerMixin.js');
8
8
  var modalMixin = require('./mixins/modalMixin/modalMixin.js');
9
+ var flowModalMixin = require('./mixins/flowModalMixin/flowModalMixin.js');
9
10
  var notificationsMixin = require('./mixins/notificationsMixin/notificationsMixin.js');
10
11
  var observeAttributesMixin = require('./mixins/observeAttributesMixin/observeAttributesMixin.js');
11
12
  var staticResourcesMixin = require('./mixins/staticResourcesMixin/staticResourcesMixin.js');
@@ -39,6 +40,7 @@ exports.debuggerMixin = debuggerMixin.debuggerMixin;
39
40
  exports.descopeUiMixin = descopeUiMixin.descopeUiMixin;
40
41
  exports.loggerMixin = loggerMixin.loggerMixin;
41
42
  exports.modalMixin = modalMixin.modalMixin;
43
+ exports.flowModalMixin = flowModalMixin.flowModalMixin;
42
44
  exports.notificationsMixin = notificationsMixin.notificationsMixin;
43
45
  exports.observeAttributesMixin = observeAttributesMixin.observeAttributesMixin;
44
46
  exports.getResourceUrl = staticResourcesMixin.getResourceUrl;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"flowInputMixin.js","sources":["../../../../src/mixins/flowInputMixin/flowInputMixin.ts"],"sourcesContent":["import { createSingletonMixin, createFlowTemplate } from '@descope/sdk-helpers';\nimport { themeMixin } from '../themeMixin';\n\ntype FlowInputConfig = {\n flowId: string;\n // per-flow inputs the widget supplies; merged over the caller-supplied inputs\n client?: Record<string, any>;\n form?: Record<string, any>;\n // widget-specific context forwarded as-is (e.g. tenant, outboundAppId)\n tenant?: string;\n outboundAppId?: string;\n};\n\n/**\n * Exposes a widget's caller-supplied flow inputs (`client.*` / `form.*`) and\n * builds the internal `<descope-wc>` flow template with the widget's shared\n * config, forwarding those inputs into the flow-start call - the same way they\n * flow for a directly-embedded `<Descope>` flow.\n *\n * `createFlowTemplate` (the method) wraps the `createFlowTemplate` helper so\n * every flow a widget runs gets the shared config + inputs from one place,\n * instead of each call site rebuilding the config. Composes `themeMixin` for\n * the resolved `theme` / `styleId`; the rest are plain attribute reads.\n */\nexport const flowInputMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) =>\n class FlowInputMixinClass extends themeMixin(superclass) {\n // caller-supplied client context, forwarded as flow-start `options.client`\n get clientInput(): Record<string, any> {\n try {\n return JSON.parse(this.getAttribute('client')) || {};\n } catch (e) {\n return {};\n }\n }\n\n // caller-supplied form inputs (raw JSON string), forwarded as flow inputs\n get formInput(): string | undefined {\n return this.getAttribute('form') || undefined;\n }\n\n // merge a per-flow form (e.g. ids the widget supplies) over the\n // caller-supplied form inputs, with the per-flow values taking precedence\n #resolveForm(\n form?: Record<string, any>,\n ): Record<string, any> | string | undefined {\n const callerForm = this.formInput;\n if (!form) return callerForm;\n if (!callerForm) return form;\n try {\n return { ...JSON.parse(callerForm), ...form };\n } catch (e) {\n return form;\n }\n }\n\n createFlowTemplate({\n flowId,\n client,\n form,\n ...overrides\n }: FlowInputConfig) {\n return createFlowTemplate({\n projectId: this.getAttribute('project-id'),\n flowId,\n baseUrl: this.getAttribute('base-url') || '',\n baseStaticUrl: this.getAttribute('base-static-url') || '',\n baseCdnUrl: this.getAttribute('base-cdn-url') || '',\n refreshCookieName: this.getAttribute('refresh-cookie-name') || '',\n theme: this.theme,\n 'style-id': this.styleId,\n locale: this.getAttribute('locale') || '',\n form: this.#resolveForm(form),\n client: { ...this.clientInput, ...client },\n ...overrides,\n });\n }\n },\n);\n"],"names":["createSingletonMixin","themeMixin","__rest","createFlowTemplate","__classPrivateFieldGet"],"mappings":";;;;;;AAaA;;;;;;;;;;AAUG;AACU,MAAA,cAAc,GAAGA,+BAAoB,CAChD,CAAqC,UAAa,6FAChD,MAAM,mBAAoB,SAAQC,qBAAU,CAAC,UAAU,CAAC,CAAA;AAAxD,QAAA,WAAA,GAAA;;;SAmDC;;AAjDC,QAAA,IAAI,WAAW,GAAA;AACb,YAAA,IAAI;AACF,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;aACtD;YAAC,OAAO,CAAC,EAAE;AACV,gBAAA,OAAO,EAAE,CAAC;aACX;SACF;;AAGD,QAAA,IAAI,SAAS,GAAA;YACX,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;SAC/C;AAiBD,QAAA,kBAAkB,CAAC,EAKD,EAAA;gBALC,EACjB,MAAM,EACN,MAAM,EACN,IAAI,OAEY,EADb,SAAS,GAJKC,YAAA,CAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,MAAA,CAKlB,CADa,CAAA;YAEZ,OAAOC,6BAAkB,iBACvB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAC1C,MAAM,EACN,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,EAC5C,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,EACzD,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,EAAE,EACnD,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,EAAE,EACjE,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,UAAU,EAAE,IAAI,CAAC,OAAO,EACxB,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,EACzC,IAAI,EAAEC,6BAAA,IAAI,EAAA,8BAAA,EAAA,GAAA,EAAA,gCAAA,CAAa,CAAjB,IAAA,CAAA,IAAI,EAAc,IAAI,CAAC,EAC7B,MAAM,EAAO,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,IAAI,CAAC,WAAW,GAAK,MAAM,CAAA,EAAA,EACrC,SAAS,CAAA,CACZ,CAAC;SACJ;AACF,KAAA;;iFAjCG,IAA0B,EAAA;AAE1B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;AAClC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,UAAU,CAAC;AAC7B,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,IAAI,CAAC;AAC7B,QAAA,IAAI;YACF,OAAY,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA,EAAK,IAAI,CAAG,CAAA;SAC/C;QAAC,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,IAAI,CAAC;SACb;KACF;AAuBF,IAAA,EAAA,CAAA,EAAA;;;;"}
1
+ {"version":3,"file":"flowInputMixin.js","sources":["../../../../src/mixins/flowInputMixin/flowInputMixin.ts"],"sourcesContent":["import { createSingletonMixin, createFlowTemplate } from '@descope/sdk-helpers';\nimport { themeMixin } from '../themeMixin';\n\ntype FlowInputConfig = {\n flowId: string;\n // per-flow inputs the widget supplies; merged over the caller-supplied inputs\n client?: Record<string, any>;\n form?: Record<string, any>;\n // hold the flow's start call until the element's start() is called - modals\n // default this to true, pass false to start the flow as soon as it renders\n lazyStart?: boolean;\n // widget-specific context forwarded as-is (e.g. tenant, outboundAppId)\n tenant?: string;\n outboundAppId?: string;\n};\n\n/**\n * Exposes a widget's caller-supplied flow inputs (`client.*` / `form.*`) and\n * builds the internal `<descope-wc>` flow template with the widget's shared\n * config, forwarding those inputs into the flow-start call - the same way they\n * flow for a directly-embedded `<Descope>` flow.\n *\n * `createFlowTemplate` (the method) wraps the `createFlowTemplate` helper so\n * every flow a widget runs gets the shared config + inputs from one place,\n * instead of each call site rebuilding the config. Composes `themeMixin` for\n * the resolved `theme` / `styleId`; the rest are plain attribute reads.\n */\nexport const flowInputMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) =>\n class FlowInputMixinClass extends themeMixin(superclass) {\n // caller-supplied client context, forwarded as flow-start `options.client`\n get clientInput(): Record<string, any> {\n try {\n return JSON.parse(this.getAttribute('client')) || {};\n } catch (e) {\n return {};\n }\n }\n\n // caller-supplied form inputs (raw JSON string), forwarded as flow inputs\n get formInput(): string | undefined {\n return this.getAttribute('form') || undefined;\n }\n\n // merge a per-flow form (e.g. ids the widget supplies) over the\n // caller-supplied form inputs, with the per-flow values taking precedence\n #resolveForm(\n form?: Record<string, any>,\n ): Record<string, any> | string | undefined {\n const callerForm = this.formInput;\n if (!form) return callerForm;\n if (!callerForm) return form;\n try {\n return { ...JSON.parse(callerForm), ...form };\n } catch (e) {\n return form;\n }\n }\n\n createFlowTemplate({\n flowId,\n client,\n form,\n ...overrides\n }: FlowInputConfig) {\n return createFlowTemplate({\n projectId: this.getAttribute('project-id'),\n flowId,\n baseUrl: this.getAttribute('base-url') || '',\n baseStaticUrl: this.getAttribute('base-static-url') || '',\n baseCdnUrl: this.getAttribute('base-cdn-url') || '',\n refreshCookieName: this.getAttribute('refresh-cookie-name') || '',\n theme: this.theme,\n 'style-id': this.styleId,\n locale: this.getAttribute('locale') || '',\n form: this.#resolveForm(form),\n client: { ...this.clientInput, ...client },\n ...overrides,\n });\n }\n },\n);\n"],"names":["createSingletonMixin","themeMixin","__rest","createFlowTemplate","__classPrivateFieldGet"],"mappings":";;;;;;AAgBA;;;;;;;;;;AAUG;AACU,MAAA,cAAc,GAAGA,+BAAoB,CAChD,CAAqC,UAAa,6FAChD,MAAM,mBAAoB,SAAQC,qBAAU,CAAC,UAAU,CAAC,CAAA;AAAxD,QAAA,WAAA,GAAA;;;SAmDC;;AAjDC,QAAA,IAAI,WAAW,GAAA;AACb,YAAA,IAAI;AACF,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;aACtD;YAAC,OAAO,CAAC,EAAE;AACV,gBAAA,OAAO,EAAE,CAAC;aACX;SACF;;AAGD,QAAA,IAAI,SAAS,GAAA;YACX,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;SAC/C;AAiBD,QAAA,kBAAkB,CAAC,EAKD,EAAA;gBALC,EACjB,MAAM,EACN,MAAM,EACN,IAAI,OAEY,EADb,SAAS,GAJKC,YAAA,CAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,MAAA,CAKlB,CADa,CAAA;YAEZ,OAAOC,6BAAkB,iBACvB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAC1C,MAAM,EACN,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,EAC5C,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,EACzD,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,EAAE,EACnD,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,EAAE,EACjE,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,UAAU,EAAE,IAAI,CAAC,OAAO,EACxB,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,EACzC,IAAI,EAAEC,6BAAA,IAAI,EAAA,8BAAA,EAAA,GAAA,EAAA,gCAAA,CAAa,CAAjB,IAAA,CAAA,IAAI,EAAc,IAAI,CAAC,EAC7B,MAAM,EAAO,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,IAAI,CAAC,WAAW,GAAK,MAAM,CAAA,EAAA,EACrC,SAAS,CAAA,CACZ,CAAC;SACJ;AACF,KAAA;;iFAjCG,IAA0B,EAAA;AAE1B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;AAClC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,UAAU,CAAC;AAC7B,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,IAAI,CAAC;AAC7B,QAAA,IAAI;YACF,OAAY,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA,EAAK,IAAI,CAAG,CAAA;SAC/C;QAAC,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,IAAI,CAAC;SACb;KACF;AAuBF,IAAA,EAAA,CAAA,EAAA;;;;"}
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ var sdkHelpers = require('@descope/sdk-helpers');
4
+ var modalMixin = require('../modalMixin/modalMixin.js');
5
+
6
+ /**
7
+ * A modal that hosts a flow.
8
+ *
9
+ * Widgets build a modal's flow ahead of the modal being opened, so the flow's
10
+ * start call is held until it opens - otherwise a preloaded modal the user
11
+ * never opens still creates a flow execution. A caller whose flow must start as
12
+ * soon as it renders opts out with `lazyStart: false` on the flow template.
13
+ */
14
+ const flowModalMixin = sdkHelpers.createSingletonMixin((superclass) => class FlowModalMixinClass extends modalMixin.modalMixin(superclass) {
15
+ createFlowModal(config) {
16
+ const ModalDriverClass = this.modalDriverClass;
17
+ class FlowModalDriver extends ModalDriverClass {
18
+ setContent(template) {
19
+ const flowEle = template.content.querySelector('descope-wc');
20
+ if (flowEle && !flowEle.hasAttribute('lazy-start')) {
21
+ flowEle.setAttribute('lazy-start', 'true');
22
+ }
23
+ super.setContent(template);
24
+ }
25
+ async open() {
26
+ var _a, _b, _c;
27
+ await super.open();
28
+ (_c = (_b = (_a = this.ele) === null || _a === void 0 ? void 0 : _a.querySelector('descope-wc')) === null || _b === void 0 ? void 0 : _b.start) === null || _c === void 0 ? void 0 : _c.call(_b);
29
+ }
30
+ }
31
+ return this.createModal(config, FlowModalDriver);
32
+ }
33
+ });
34
+
35
+ exports.flowModalMixin = flowModalMixin;
36
+ //# sourceMappingURL=flowModalMixin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowModalMixin.js","sources":["../../../../src/mixins/flowModalMixin/flowModalMixin.ts"],"sourcesContent":["import { createSingletonMixin } from '@descope/sdk-helpers';\nimport { ModalDriver } from '@descope/sdk-component-drivers';\nimport { modalMixin } from '../modalMixin';\n\n/**\n * A modal that hosts a flow.\n *\n * Widgets build a modal's flow ahead of the modal being opened, so the flow's\n * start call is held until it opens - otherwise a preloaded modal the user\n * never opens still creates a flow execution. A caller whose flow must start as\n * soon as it renders opts out with `lazyStart: false` on the flow template.\n */\nexport const flowModalMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) =>\n class FlowModalMixinClass extends modalMixin(superclass) {\n createFlowModal(config?: Record<string, string>) {\n const ModalDriverClass = this.modalDriverClass;\n\n class FlowModalDriver extends ModalDriverClass {\n setContent(template: HTMLTemplateElement) {\n const flowEle = template.content.querySelector('descope-wc');\n if (flowEle && !flowEle.hasAttribute('lazy-start')) {\n flowEle.setAttribute('lazy-start', 'true');\n }\n super.setContent(template);\n }\n\n async open() {\n await super.open();\n (this.ele?.querySelector('descope-wc') as any)?.start?.();\n }\n }\n\n return this.createModal(config, FlowModalDriver as typeof ModalDriver);\n }\n },\n);\n"],"names":["createSingletonMixin","modalMixin"],"mappings":";;;;;AAIA;;;;;;;AAOG;AACU,MAAA,cAAc,GAAGA,+BAAoB,CAChD,CAAqC,UAAa,KAChD,MAAM,mBAAoB,SAAQC,qBAAU,CAAC,UAAU,CAAC,CAAA;AACtD,IAAA,eAAe,CAAC,MAA+B,EAAA;AAC7C,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAE/C,MAAM,eAAgB,SAAQ,gBAAgB,CAAA;AAC5C,YAAA,UAAU,CAAC,QAA6B,EAAA;gBACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;gBAC7D,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE;AAClD,oBAAA,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;iBAC5C;AACD,gBAAA,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;aAC5B;AAED,YAAA,MAAM,IAAI,GAAA;;AACR,gBAAA,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;AACnB,gBAAA,CAAA,EAAA,GAAA,CAAC,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,GAAG,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,aAAa,CAAC,YAAY,CAAS,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAK,kDAAI,CAAC;aAC3D;AACF,SAAA;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,eAAqC,CAAC,CAAC;KACxE;AACF,CAAA;;;;"}
@@ -25,11 +25,17 @@ const modalMixin = sdkHelpers.createSingletonMixin((superclass) => {
25
25
  };
26
26
  })());
27
27
  }
28
- createModal(config) {
28
+ // the driver class createModal instantiates - subclass it to build a
29
+ // modal driver with extra behavior (see flowModalMixin) and hand the
30
+ // result to createModal
31
+ get modalDriverClass() {
32
+ return tslib.__classPrivateFieldGet(this, _ModalMixinClass_ModalDriverWrapper, "f");
33
+ }
34
+ createModal(config, DriverClass = tslib.__classPrivateFieldGet(this, _ModalMixinClass_ModalDriverWrapper, "f")) {
29
35
  const baseConfig = {};
30
36
  const modal = helpers.createModalEle(Object.assign(Object.assign({}, baseConfig), config));
31
37
  this.rootElement.append(modal);
32
- return new (tslib.__classPrivateFieldGet(this, _ModalMixinClass_ModalDriverWrapper, "f"))(modal, {
38
+ return new DriverClass(modal, {
33
39
  logger: this.logger,
34
40
  });
35
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"modalMixin.js","sources":["../../../../src/mixins/modalMixin/modalMixin.ts"],"sourcesContent":["// eslint-disable-next-line max-classes-per-file\nimport { createSingletonMixin, compose } from '@descope/sdk-helpers';\nimport { initLifecycleMixin } from '../initLifecycleMixin';\nimport { initElementMixin } from '../initElementMixin';\nimport { descopeUiMixin } from '../descopeUiMixin';\nimport { createModalEle } from './helpers';\nimport { MODAL_ELE_TAG } from './constants';\nimport { ModalDriver } from '@descope/sdk-component-drivers';\n\nexport const modalMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n initLifecycleMixin,\n initElementMixin,\n descopeUiMixin,\n )(superclass);\n return class ModalMixinClass extends BaseClass {\n #ModalDriverWrapper = (() => {\n const loadDescopeUiComponents = this.loadDescopeUiComponents.bind(this);\n return class ModalDriverWrapper extends ModalDriver {\n setContent(template: HTMLTemplateElement) {\n loadDescopeUiComponents(template);\n super.setContent(template);\n }\n };\n })();\n\n createModal(config?: Record<string, string>) {\n const baseConfig = {};\n\n const modal = createModalEle({\n ...baseConfig,\n ...config,\n });\n\n this.rootElement.append(modal);\n\n return new this.#ModalDriverWrapper(modal, {\n logger: this.logger,\n }) as ModalDriver;\n }\n\n async init() {\n this.loadDescopeUiComponents([MODAL_ELE_TAG]);\n await super.init?.();\n }\n };\n },\n);\n"],"names":["createSingletonMixin","compose","initLifecycleMixin","initElementMixin","descopeUiMixin","ModalDriver","createModalEle","__classPrivateFieldGet","MODAL_ELE_TAG"],"mappings":";;;;;;;;;;;MASa,UAAU,GAAGA,+BAAoB,CAC5C,CAAqC,UAAa,KAAI;;AACpD,IAAA,MAAM,SAAS,GAAGC,kBAAO,CACvBC,qCAAkB,EAClBC,iCAAgB,EAChBC,6BAAc,CACf,CAAC,UAAU,CAAC,CAAC;IACd,OAAO,EAAA,GAAA,MAAM,eAAgB,SAAQ,SAAS,CAAA;AAAvC,YAAA,WAAA,GAAA;;gBACL,mCAAsB,CAAA,GAAA,CAAA,IAAA,EAAA,CAAC,MAAK;oBAC1B,MAAM,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACxE,OAAO,MAAM,kBAAmB,SAAQC,+BAAW,CAAA;AACjD,wBAAA,UAAU,CAAC,QAA6B,EAAA;4BACtC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;AAClC,4BAAA,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;yBAC5B;qBACF,CAAC;iBACH,GAAG,CAAC,CAAA;aAqBN;AAnBC,YAAA,WAAW,CAAC,MAA+B,EAAA;gBACzC,MAAM,UAAU,GAAG,EAAE,CAAC;gBAEtB,MAAM,KAAK,GAAGC,sBAAc,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACvB,UAAU,CACV,EAAA,MAAM,EACT,CAAC;AAEH,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAE/B,gBAAA,OAAO,KAAIC,4BAAA,CAAA,IAAI,EAAoB,mCAAA,EAAA,GAAA,CAAA,EAAC,KAAK,EAAE;oBACzC,MAAM,EAAE,IAAI,CAAC,MAAM;AACpB,iBAAA,CAAgB,CAAC;aACnB;AAED,YAAA,MAAM,IAAI,GAAA;;AACR,gBAAA,IAAI,CAAC,uBAAuB,CAAC,CAACC,uBAAa,CAAC,CAAC,CAAC;AAC9C,gBAAA,OAAM,CAAA,EAAA,GAAA,KAAK,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAI,CAAA,CAAC;aACtB;AACF,SAAA;;AAAC,QAAA,EAAA,CAAA;AACJ,CAAC;;;;"}
1
+ {"version":3,"file":"modalMixin.js","sources":["../../../../src/mixins/modalMixin/modalMixin.ts"],"sourcesContent":["// eslint-disable-next-line max-classes-per-file\nimport { createSingletonMixin, compose } from '@descope/sdk-helpers';\nimport { initLifecycleMixin } from '../initLifecycleMixin';\nimport { initElementMixin } from '../initElementMixin';\nimport { descopeUiMixin } from '../descopeUiMixin';\nimport { createModalEle } from './helpers';\nimport { MODAL_ELE_TAG } from './constants';\nimport { ModalDriver } from '@descope/sdk-component-drivers';\n\nexport const modalMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n initLifecycleMixin,\n initElementMixin,\n descopeUiMixin,\n )(superclass);\n return class ModalMixinClass extends BaseClass {\n #ModalDriverWrapper = (() => {\n const loadDescopeUiComponents = this.loadDescopeUiComponents.bind(this);\n return class ModalDriverWrapper extends ModalDriver {\n setContent(template: HTMLTemplateElement) {\n loadDescopeUiComponents(template);\n super.setContent(template);\n }\n };\n })();\n\n // the driver class createModal instantiates - subclass it to build a\n // modal driver with extra behavior (see flowModalMixin) and hand the\n // result to createModal\n get modalDriverClass() {\n return this.#ModalDriverWrapper;\n }\n\n createModal(\n config?: Record<string, string>,\n DriverClass: typeof ModalDriver = this.#ModalDriverWrapper,\n ) {\n const baseConfig = {};\n\n const modal = createModalEle({\n ...baseConfig,\n ...config,\n });\n\n this.rootElement.append(modal);\n\n return new DriverClass(modal, {\n logger: this.logger,\n }) as ModalDriver;\n }\n\n async init() {\n this.loadDescopeUiComponents([MODAL_ELE_TAG]);\n await super.init?.();\n }\n };\n },\n);\n"],"names":["createSingletonMixin","compose","initLifecycleMixin","initElementMixin","descopeUiMixin","ModalDriver","__classPrivateFieldGet","createModalEle","MODAL_ELE_TAG"],"mappings":";;;;;;;;;;;MASa,UAAU,GAAGA,+BAAoB,CAC5C,CAAqC,UAAa,KAAI;;AACpD,IAAA,MAAM,SAAS,GAAGC,kBAAO,CACvBC,qCAAkB,EAClBC,iCAAgB,EAChBC,6BAAc,CACf,CAAC,UAAU,CAAC,CAAC;IACd,OAAO,EAAA,GAAA,MAAM,eAAgB,SAAQ,SAAS,CAAA;AAAvC,YAAA,WAAA,GAAA;;gBACL,mCAAsB,CAAA,GAAA,CAAA,IAAA,EAAA,CAAC,MAAK;oBAC1B,MAAM,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACxE,OAAO,MAAM,kBAAmB,SAAQC,+BAAW,CAAA;AACjD,wBAAA,UAAU,CAAC,QAA6B,EAAA;4BACtC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;AAClC,4BAAA,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;yBAC5B;qBACF,CAAC;iBACH,GAAG,CAAC,CAAA;aA+BN;;;;AA1BC,YAAA,IAAI,gBAAgB,GAAA;gBAClB,OAAOC,4BAAA,CAAA,IAAI,EAAA,mCAAA,EAAA,GAAA,CAAoB,CAAC;aACjC;AAED,YAAA,WAAW,CACT,MAA+B,EAC/B,WAAkC,GAAAA,4BAAA,CAAA,IAAI,EAAoB,mCAAA,EAAA,GAAA,CAAA,EAAA;gBAE1D,MAAM,UAAU,GAAG,EAAE,CAAC;gBAEtB,MAAM,KAAK,GAAGC,sBAAc,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACvB,UAAU,CACV,EAAA,MAAM,EACT,CAAC;AAEH,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAE/B,gBAAA,OAAO,IAAI,WAAW,CAAC,KAAK,EAAE;oBAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;AACpB,iBAAA,CAAgB,CAAC;aACnB;AAED,YAAA,MAAM,IAAI,GAAA;;AACR,gBAAA,IAAI,CAAC,uBAAuB,CAAC,CAACC,uBAAa,CAAC,CAAC,CAAC;AAC9C,gBAAA,OAAM,CAAA,EAAA,GAAA,KAAK,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAI,CAAA,CAAC;aACtB;AACF,SAAA;;AAAC,QAAA,EAAA,CAAA;AACJ,CAAC;;;;"}
@@ -200,14 +200,40 @@ const telemetryMixin = sdkHelpers.createSingletonMixin((superclass) => {
200
200
  // The backend ships telemetry nested under `projectConfig` in config.json.
201
201
  const resolvedConfig = await this.config;
202
202
  const beTelemetry = (_b = resolvedConfig === null || resolvedConfig === void 0 ? void 0 : resolvedConfig.projectConfig) === null || _b === void 0 ? void 0 : _b.telemetry;
203
- const sampleRate = Number(process.env.DESCOPE_TELEMETRY_SESSION_SAMPLE_RATE);
204
- const fallback = {
205
- enabled: (process.env.DESCOPE_TELEMETRY_ENABLED || '').toLowerCase() ===
206
- 'true',
207
- rumConfig: Object.assign({ applicationId: process.env.DESCOPE_TELEMETRY_APPLICATION_ID || '', identityPoolId: process.env.DESCOPE_TELEMETRY_IDENTITY_POOL_ID || '', region: process.env.DESCOPE_TELEMETRY_REGION || '', sessionSampleRate: Number.isFinite(sampleRate) && sampleRate > 0 ? sampleRate : 1 }, (process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN && {
208
- guestRoleArn: process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN,
209
- })),
210
- };
203
+ // The DESCOPE_TELEMETRY_* reads below are build-time env tokens: the WC
204
+ // app build substitutes them from .env (rollup.config.app.mjs) and the
205
+ // WC lib build strips them to "" (stubEnvInProd). But @descope/sdk-mixins
206
+ // ships its own dist with these tokens RAW, so a non-WC consumer that
207
+ // bundles this file for the browser hits a bare `process`, which is
208
+ // undefined there -> "ReferenceError: process is not defined".
209
+ // Wrap the reads in try/catch: this keeps the literal `process.env.*`
210
+ // tokens intact (so the WC build-time replace/strip still match them),
211
+ // while falling back to an empty config wherever `process` doesn't
212
+ // exist. Real config comes from the backend (projectConfig.telemetry).
213
+ let fallback;
214
+ try {
215
+ const sampleRate = Number(process.env.DESCOPE_TELEMETRY_SESSION_SAMPLE_RATE);
216
+ fallback = {
217
+ enabled: (process.env.DESCOPE_TELEMETRY_ENABLED || '').toLowerCase() ===
218
+ 'true',
219
+ rumConfig: Object.assign({ applicationId: process.env.DESCOPE_TELEMETRY_APPLICATION_ID || '', identityPoolId: process.env.DESCOPE_TELEMETRY_IDENTITY_POOL_ID || '', region: process.env.DESCOPE_TELEMETRY_REGION || '', sessionSampleRate: Number.isFinite(sampleRate) && sampleRate > 0 ? sampleRate : 1 }, (process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN && {
220
+ guestRoleArn: process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN,
221
+ })),
222
+ };
223
+ }
224
+ catch (_c) {
225
+ // `process` is not defined (browser, no build-time replacement).
226
+ // No .env fallback here - rely on the backend telemetry config.
227
+ fallback = {
228
+ enabled: false,
229
+ rumConfig: {
230
+ applicationId: '',
231
+ identityPoolId: '',
232
+ region: '',
233
+ sessionSampleRate: 1,
234
+ },
235
+ };
236
+ }
211
237
  const cfg = Object.assign(Object.assign(Object.assign({}, fallback), beTelemetry), { rumConfig: Object.assign(Object.assign({}, fallback.rumConfig), beTelemetry === null || beTelemetry === void 0 ? void 0 : beTelemetry.rumConfig), capture: tslib.__classPrivateFieldGet(this, _TelemetryMixinClass_instances, "m", _TelemetryMixinClass_resolveCapture).call(this, beTelemetry === null || beTelemetry === void 0 ? void 0 : beTelemetry.capture) });
212
238
  // If enabled but a required RUM credential is missing (empty from both
213
239
  // the BE block and the .env fallback), disable rather than hand AwsRum
@@ -1 +1 @@
1
- {"version":3,"file":"telemetryMixin.js","sources":["../../../../src/mixins/telemetryMixin/telemetryMixin.ts"],"sourcesContent":["import { compose, createSingletonMixin } from '@descope/sdk-helpers';\nimport { injectNpmLibMixin } from '../injectNpmLibMixin';\nimport { loggerMixin } from '../loggerMixin';\nimport { TelemetryConfig } from '../configMixin/types';\nimport {\n DEBUG_LOGS_LIB_NAME,\n JS_FILE_PATH,\n LOCAL_STORAGE_OVERRIDE,\n} from './constants';\nimport { initLifecycleMixin } from '../initLifecycleMixin';\nimport { configMixin } from '../configMixin';\nimport { projectIdMixin } from '../projectIdMixin';\nimport { flowIdMixin } from '../flowIdMixin';\n\n// Human-readable delay formatter. Picks the largest unit that fits so logs\n// read as \"30 minutes\" / \"2 days\" instead of \"1800 seconds\" / \"172800 seconds\".\nfunction formatDelay(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s} seconds`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m} minutes`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h} hours`;\n return `${Math.floor(h / 24)} days`;\n}\n\n// Extend global window to include DescopeDebugLogs (UMD global)\ndeclare global {\n interface Window {\n DescopeDebugLogs?: new (config: any, context: any, logger?: any) => any;\n }\n}\n\nexport const telemetryMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n injectNpmLibMixin,\n loggerMixin,\n initLifecycleMixin,\n configMixin,\n projectIdMixin,\n flowIdMixin,\n )(superclass);\n\n return class TelemetryMixinClass extends BaseClass {\n #telemetryManager: any = null;\n #telemetryInitialized = false;\n #expirationTimeoutId: NodeJS.Timeout | null = null;\n\n async #initializeTelemetry(\n config: TelemetryConfig,\n context: {\n projectId: string;\n flowId?: string;\n sdkVersion?: string;\n },\n ) {\n if (!config?.enabled) {\n this.logger.debug('Telemetry is disabled, skipping initialization');\n return;\n }\n\n if (this.#telemetryInitialized) {\n this.logger.debug('Telemetry already initialized');\n return;\n }\n\n if (config.expiration && Date.now() >= config.expiration) {\n this.logger.info(\n `Telemetry expiration time has passed (${new Date(\n config.expiration,\n ).toISOString()}), skipping initialization`,\n );\n return;\n }\n\n try {\n this.logger.debug('Initializing telemetry...');\n const version = config.version || 'latest';\n\n await this.injectNpmLib(DEBUG_LOGS_LIB_NAME, version, JS_FILE_PATH, [\n LOCAL_STORAGE_OVERRIDE,\n ]);\n\n const TelemetryManager = window.DescopeDebugLogs;\n if (!TelemetryManager) {\n throw new Error(\n 'DescopeDebugLogs not found after loading @descope/debug-logs. ' +\n 'This likely means the UMD build failed to load from CDN.',\n );\n }\n\n this.#telemetryManager = new TelemetryManager(\n {\n enabled: true,\n rumConfig: config.rumConfig,\n capture: config.capture,\n },\n {\n projectId: context.projectId,\n flowId: context.flowId,\n version: context.sdkVersion || '1.0.0',\n },\n this.logger,\n );\n\n // The TelemetryManager constructor swallows RUM-client init errors\n // (it sets an internal failure flag instead of throwing). Confirm it\n // actually came up before flagging success - otherwise we'd log\n // \"initialized\" and, because #initializeTelemetry early-returns once\n // #telemetryInitialized is true, permanently block any retry.\n if (!this.#telemetryManager.isReady()) {\n this.logger.error(\n 'Telemetry manager failed to initialize (RUM client not ready)',\n );\n this.#telemetryManager = null;\n return;\n }\n\n this.#telemetryInitialized = true;\n\n this.logger.info('Telemetry initialized successfully');\n\n if (config.expiration) {\n this.#scheduleExpirationShutdown(config.expiration);\n }\n } catch (error) {\n this.logger.error('Failed to initialize telemetry:', error);\n this.#telemetryInitialized = false;\n }\n }\n\n /**\n * Schedule automatic telemetry shutdown at expiration time\n * @param expirationMs - Unix timestamp in milliseconds when telemetry should expire\n */\n #scheduleExpirationShutdown(expirationMs: number) {\n const now = Date.now();\n const timeUntilExpiration = expirationMs - now;\n\n if (timeUntilExpiration <= 0) {\n this.logger.info('Telemetry expiration time reached, shutting down');\n this.#shutdownTelemetry();\n return;\n }\n\n // setTimeout's max safe delay is ~24.8 days; cap at 1 day so a\n // mis-set expiration far in the future doesn't underflow to 0.\n const MAX_TIMEOUT = 86400000;\n const delay = Math.min(timeUntilExpiration, MAX_TIMEOUT);\n\n if (timeUntilExpiration > MAX_TIMEOUT) {\n this.logger.warn(\n `Telemetry expiration is beyond maximum timeout (${formatDelay(\n timeUntilExpiration,\n )}). Setting to maximum.`,\n );\n }\n\n this.logger.info(\n `Telemetry will expire at ${new Date(\n expirationMs,\n ).toISOString()} (in ${formatDelay(delay)})`,\n );\n\n this.#expirationTimeoutId = setTimeout(() => {\n this.logger.info('Telemetry expiration time reached, shutting down');\n this.#shutdownTelemetry();\n }, delay);\n }\n\n #shutdownTelemetry() {\n if (this.#expirationTimeoutId) {\n clearTimeout(this.#expirationTimeoutId);\n this.#expirationTimeoutId = null;\n }\n\n if (this.#telemetryManager) {\n try {\n this.logger.debug('Shutting down telemetry...');\n this.#telemetryManager.shutdown();\n this.#telemetryManager = null;\n this.#telemetryInitialized = false;\n this.logger.info('Telemetry shutdown complete');\n } catch (error) {\n this.logger.error('Error shutting down telemetry:', error);\n }\n }\n }\n\n /**\n * Get the telemetry manager instance (for advanced usage)\n */\n get telemetryManager() {\n return this.#telemetryManager;\n }\n\n // A RUM client needs applicationId, identityPoolId and region. If any is\n // missing, AwsRum either throws at construction or silently records\n // nothing, so we treat the config as unusable.\n #isRumConfigComplete(rumConfig?: TelemetryConfig['rumConfig']): boolean {\n return Boolean(\n rumConfig?.applicationId &&\n rumConfig?.identityPoolId &&\n rumConfig?.region,\n );\n }\n\n async #getTelemetryConfig(): Promise<TelemetryConfig> {\n // Prefer telemetry config shipped by the backend in the project's\n // config.json. Otherwise, fall back to values from\n // packages/sdks/web-component/.env (DESCOPE_TELEMETRY_* — substituted\n // at WC build time via rollup.config.app.mjs). We MERGE rather than\n // replace so the backend can override individual fields (e.g. just\n // expiration) without re-stating every credential.\n // The backend ships telemetry nested under `projectConfig` in config.json.\n const resolvedConfig = await this.config;\n const beTelemetry = resolvedConfig?.projectConfig?.telemetry;\n\n const sampleRate = Number(\n process.env.DESCOPE_TELEMETRY_SESSION_SAMPLE_RATE,\n );\n\n const fallback: NonNullable<TelemetryConfig> = {\n enabled:\n (process.env.DESCOPE_TELEMETRY_ENABLED || '').toLowerCase() ===\n 'true',\n rumConfig: {\n applicationId: process.env.DESCOPE_TELEMETRY_APPLICATION_ID || '',\n identityPoolId:\n process.env.DESCOPE_TELEMETRY_IDENTITY_POOL_ID || '',\n region: process.env.DESCOPE_TELEMETRY_REGION || '',\n sessionSampleRate:\n Number.isFinite(sampleRate) && sampleRate > 0 ? sampleRate : 1,\n ...(process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN && {\n guestRoleArn: process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN,\n }),\n },\n };\n\n const cfg: NonNullable<TelemetryConfig> = {\n ...fallback,\n ...beTelemetry,\n rumConfig: {\n ...fallback.rumConfig,\n ...beTelemetry?.rumConfig,\n },\n capture: this.#resolveCapture(beTelemetry?.capture),\n };\n\n // If enabled but a required RUM credential is missing (empty from both\n // the BE block and the .env fallback), disable rather than hand AwsRum\n // an empty applicationId/identityPoolId/region — that would either\n // throw at construction or silently no-op with no session recorded.\n if (cfg.enabled && !this.#isRumConfigComplete(cfg.rumConfig)) {\n this.logger.warn(\n 'Telemetry enabled but rumConfig is incomplete (applicationId/identityPoolId/region required). Skipping initialization.',\n );\n cfg.enabled = false;\n }\n\n // Safety cap: when no backend telemetry config is present at all,\n // end the session after 5 minutes so dev sessions don't leak. Once\n // the backend owns the config it controls expiration explicitly.\n if (!beTelemetry) {\n cfg.expiration = Date.now() + 5 * 60 * 1000;\n this.logger.debug(\n 'No backend telemetry config present; applying a 5-minute safety cap on the session.',\n );\n }\n\n return cfg;\n }\n\n /**\n * The backend can't serialize a DOM element reference, so we always\n * inject this.shadowRoot here. Respect an explicit `dom: false`.\n */\n #resolveCapture(\n beCapture: NonNullable<TelemetryConfig>['capture'],\n ): NonNullable<TelemetryConfig>['capture'] {\n // `network: true` = capture ALL network traffic. We used to default to\n // `{ urlFilter: [] }` but the two network paths had inverted semantics\n // for the empty array: the custom NetworkPlugin treated it as\n // \"capture everything\", while AWS RUM's built-in HTTP telemetry\n // treated it as \"capture nothing\". `true` is consistent — both paths\n // capture all by default. BE can override with a narrow filter later.\n const domSetting = beCapture?.dom;\n if (domSetting === false) {\n return {\n console: true,\n network: true,\n navigation: true,\n ...beCapture,\n dom: false,\n };\n }\n return {\n console: true,\n network: true,\n navigation: true,\n ...beCapture,\n dom: {\n throttleMs: 2000,\n ...(typeof domSetting === 'object' ? domSetting : {}),\n rootElement: this.shadowRoot as any,\n },\n };\n }\n\n updateTelemetryContext(context: Record<string, any>) {\n if (this.#telemetryManager) {\n try {\n this.#telemetryManager.updateContext(context);\n } catch (error) {\n // Fail silently - telemetry errors should never break the web-component\n this.logger.error('Error updating telemetry context:', error);\n }\n }\n }\n\n #telemetryReady: Promise<void> | null = null;\n\n async init() {\n // super.init() FIRST so downstream mixins finish setup and the\n // SDK's user-facing paint isn't blocked on our CDN load or the\n // `this.config` fetch. Kick off telemetry as its OWN promise chain\n // stored on the instance. NOT awaited here — tests using\n // jest.useFakeTimers can't advance the fetch chain, and blocking on\n // it would freeze the render. Failures are caught so telemetry\n // errors can never break the SDK's boot.\n await super.init?.();\n const sdkVersion = (this as any).sdkVersion || '1.0.0';\n this.#telemetryReady = this.#getTelemetryConfig()\n .then((config) =>\n this.#initializeTelemetry(config as any, {\n projectId: this.projectId,\n flowId: this.flowId,\n sdkVersion,\n }),\n )\n .catch((error) => {\n this.logger.error('Failed to start telemetry:', error);\n });\n }\n\n // Test hook: resolves once telemetry init has settled (success or\n // caught error). Not part of the public SDK contract.\n get telemetryReady(): Promise<void> {\n return this.#telemetryReady ?? Promise.resolve();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback?.();\n this.#shutdownTelemetry();\n }\n };\n },\n);\n"],"names":["createSingletonMixin","compose","injectNpmLibMixin","loggerMixin","initLifecycleMixin","configMixin","projectIdMixin","flowIdMixin","__classPrivateFieldGet","__classPrivateFieldSet","DEBUG_LOGS_LIB_NAME","JS_FILE_PATH","LOCAL_STORAGE_OVERRIDE"],"mappings":"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"}
1
+ {"version":3,"file":"telemetryMixin.js","sources":["../../../../src/mixins/telemetryMixin/telemetryMixin.ts"],"sourcesContent":["import { compose, createSingletonMixin } from '@descope/sdk-helpers';\nimport { injectNpmLibMixin } from '../injectNpmLibMixin';\nimport { loggerMixin } from '../loggerMixin';\nimport { TelemetryConfig } from '../configMixin/types';\nimport {\n DEBUG_LOGS_LIB_NAME,\n JS_FILE_PATH,\n LOCAL_STORAGE_OVERRIDE,\n} from './constants';\nimport { initLifecycleMixin } from '../initLifecycleMixin';\nimport { configMixin } from '../configMixin';\nimport { projectIdMixin } from '../projectIdMixin';\nimport { flowIdMixin } from '../flowIdMixin';\n\n// Human-readable delay formatter. Picks the largest unit that fits so logs\n// read as \"30 minutes\" / \"2 days\" instead of \"1800 seconds\" / \"172800 seconds\".\nfunction formatDelay(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s} seconds`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m} minutes`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h} hours`;\n return `${Math.floor(h / 24)} days`;\n}\n\n// Extend global window to include DescopeDebugLogs (UMD global)\ndeclare global {\n interface Window {\n DescopeDebugLogs?: new (config: any, context: any, logger?: any) => any;\n }\n}\n\nexport const telemetryMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n injectNpmLibMixin,\n loggerMixin,\n initLifecycleMixin,\n configMixin,\n projectIdMixin,\n flowIdMixin,\n )(superclass);\n\n return class TelemetryMixinClass extends BaseClass {\n #telemetryManager: any = null;\n #telemetryInitialized = false;\n #expirationTimeoutId: NodeJS.Timeout | null = null;\n\n async #initializeTelemetry(\n config: TelemetryConfig,\n context: {\n projectId: string;\n flowId?: string;\n sdkVersion?: string;\n },\n ) {\n if (!config?.enabled) {\n this.logger.debug('Telemetry is disabled, skipping initialization');\n return;\n }\n\n if (this.#telemetryInitialized) {\n this.logger.debug('Telemetry already initialized');\n return;\n }\n\n if (config.expiration && Date.now() >= config.expiration) {\n this.logger.info(\n `Telemetry expiration time has passed (${new Date(\n config.expiration,\n ).toISOString()}), skipping initialization`,\n );\n return;\n }\n\n try {\n this.logger.debug('Initializing telemetry...');\n const version = config.version || 'latest';\n\n await this.injectNpmLib(DEBUG_LOGS_LIB_NAME, version, JS_FILE_PATH, [\n LOCAL_STORAGE_OVERRIDE,\n ]);\n\n const TelemetryManager = window.DescopeDebugLogs;\n if (!TelemetryManager) {\n throw new Error(\n 'DescopeDebugLogs not found after loading @descope/debug-logs. ' +\n 'This likely means the UMD build failed to load from CDN.',\n );\n }\n\n this.#telemetryManager = new TelemetryManager(\n {\n enabled: true,\n rumConfig: config.rumConfig,\n capture: config.capture,\n },\n {\n projectId: context.projectId,\n flowId: context.flowId,\n version: context.sdkVersion || '1.0.0',\n },\n this.logger,\n );\n\n // The TelemetryManager constructor swallows RUM-client init errors\n // (it sets an internal failure flag instead of throwing). Confirm it\n // actually came up before flagging success - otherwise we'd log\n // \"initialized\" and, because #initializeTelemetry early-returns once\n // #telemetryInitialized is true, permanently block any retry.\n if (!this.#telemetryManager.isReady()) {\n this.logger.error(\n 'Telemetry manager failed to initialize (RUM client not ready)',\n );\n this.#telemetryManager = null;\n return;\n }\n\n this.#telemetryInitialized = true;\n\n this.logger.info('Telemetry initialized successfully');\n\n if (config.expiration) {\n this.#scheduleExpirationShutdown(config.expiration);\n }\n } catch (error) {\n this.logger.error('Failed to initialize telemetry:', error);\n this.#telemetryInitialized = false;\n }\n }\n\n /**\n * Schedule automatic telemetry shutdown at expiration time\n * @param expirationMs - Unix timestamp in milliseconds when telemetry should expire\n */\n #scheduleExpirationShutdown(expirationMs: number) {\n const now = Date.now();\n const timeUntilExpiration = expirationMs - now;\n\n if (timeUntilExpiration <= 0) {\n this.logger.info('Telemetry expiration time reached, shutting down');\n this.#shutdownTelemetry();\n return;\n }\n\n // setTimeout's max safe delay is ~24.8 days; cap at 1 day so a\n // mis-set expiration far in the future doesn't underflow to 0.\n const MAX_TIMEOUT = 86400000;\n const delay = Math.min(timeUntilExpiration, MAX_TIMEOUT);\n\n if (timeUntilExpiration > MAX_TIMEOUT) {\n this.logger.warn(\n `Telemetry expiration is beyond maximum timeout (${formatDelay(\n timeUntilExpiration,\n )}). Setting to maximum.`,\n );\n }\n\n this.logger.info(\n `Telemetry will expire at ${new Date(\n expirationMs,\n ).toISOString()} (in ${formatDelay(delay)})`,\n );\n\n this.#expirationTimeoutId = setTimeout(() => {\n this.logger.info('Telemetry expiration time reached, shutting down');\n this.#shutdownTelemetry();\n }, delay);\n }\n\n #shutdownTelemetry() {\n if (this.#expirationTimeoutId) {\n clearTimeout(this.#expirationTimeoutId);\n this.#expirationTimeoutId = null;\n }\n\n if (this.#telemetryManager) {\n try {\n this.logger.debug('Shutting down telemetry...');\n this.#telemetryManager.shutdown();\n this.#telemetryManager = null;\n this.#telemetryInitialized = false;\n this.logger.info('Telemetry shutdown complete');\n } catch (error) {\n this.logger.error('Error shutting down telemetry:', error);\n }\n }\n }\n\n /**\n * Get the telemetry manager instance (for advanced usage)\n */\n get telemetryManager() {\n return this.#telemetryManager;\n }\n\n // A RUM client needs applicationId, identityPoolId and region. If any is\n // missing, AwsRum either throws at construction or silently records\n // nothing, so we treat the config as unusable.\n #isRumConfigComplete(rumConfig?: TelemetryConfig['rumConfig']): boolean {\n return Boolean(\n rumConfig?.applicationId &&\n rumConfig?.identityPoolId &&\n rumConfig?.region,\n );\n }\n\n async #getTelemetryConfig(): Promise<TelemetryConfig> {\n // Prefer telemetry config shipped by the backend in the project's\n // config.json. Otherwise, fall back to values from\n // packages/sdks/web-component/.env (DESCOPE_TELEMETRY_* — substituted\n // at WC build time via rollup.config.app.mjs). We MERGE rather than\n // replace so the backend can override individual fields (e.g. just\n // expiration) without re-stating every credential.\n // The backend ships telemetry nested under `projectConfig` in config.json.\n const resolvedConfig = await this.config;\n const beTelemetry = resolvedConfig?.projectConfig?.telemetry;\n\n // The DESCOPE_TELEMETRY_* reads below are build-time env tokens: the WC\n // app build substitutes them from .env (rollup.config.app.mjs) and the\n // WC lib build strips them to \"\" (stubEnvInProd). But @descope/sdk-mixins\n // ships its own dist with these tokens RAW, so a non-WC consumer that\n // bundles this file for the browser hits a bare `process`, which is\n // undefined there -> \"ReferenceError: process is not defined\".\n // Wrap the reads in try/catch: this keeps the literal `process.env.*`\n // tokens intact (so the WC build-time replace/strip still match them),\n // while falling back to an empty config wherever `process` doesn't\n // exist. Real config comes from the backend (projectConfig.telemetry).\n let fallback: NonNullable<TelemetryConfig>;\n try {\n const sampleRate = Number(\n process.env.DESCOPE_TELEMETRY_SESSION_SAMPLE_RATE,\n );\n\n fallback = {\n enabled:\n (process.env.DESCOPE_TELEMETRY_ENABLED || '').toLowerCase() ===\n 'true',\n rumConfig: {\n applicationId: process.env.DESCOPE_TELEMETRY_APPLICATION_ID || '',\n identityPoolId:\n process.env.DESCOPE_TELEMETRY_IDENTITY_POOL_ID || '',\n region: process.env.DESCOPE_TELEMETRY_REGION || '',\n sessionSampleRate:\n Number.isFinite(sampleRate) && sampleRate > 0 ? sampleRate : 1,\n ...(process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN && {\n guestRoleArn: process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN,\n }),\n },\n };\n } catch {\n // `process` is not defined (browser, no build-time replacement).\n // No .env fallback here - rely on the backend telemetry config.\n fallback = {\n enabled: false,\n rumConfig: {\n applicationId: '',\n identityPoolId: '',\n region: '',\n sessionSampleRate: 1,\n },\n };\n }\n\n const cfg: NonNullable<TelemetryConfig> = {\n ...fallback,\n ...beTelemetry,\n rumConfig: {\n ...fallback.rumConfig,\n ...beTelemetry?.rumConfig,\n },\n capture: this.#resolveCapture(beTelemetry?.capture),\n };\n\n // If enabled but a required RUM credential is missing (empty from both\n // the BE block and the .env fallback), disable rather than hand AwsRum\n // an empty applicationId/identityPoolId/region — that would either\n // throw at construction or silently no-op with no session recorded.\n if (cfg.enabled && !this.#isRumConfigComplete(cfg.rumConfig)) {\n this.logger.warn(\n 'Telemetry enabled but rumConfig is incomplete (applicationId/identityPoolId/region required). Skipping initialization.',\n );\n cfg.enabled = false;\n }\n\n // Safety cap: when no backend telemetry config is present at all,\n // end the session after 5 minutes so dev sessions don't leak. Once\n // the backend owns the config it controls expiration explicitly.\n if (!beTelemetry) {\n cfg.expiration = Date.now() + 5 * 60 * 1000;\n this.logger.debug(\n 'No backend telemetry config present; applying a 5-minute safety cap on the session.',\n );\n }\n\n return cfg;\n }\n\n /**\n * The backend can't serialize a DOM element reference, so we always\n * inject this.shadowRoot here. Respect an explicit `dom: false`.\n */\n #resolveCapture(\n beCapture: NonNullable<TelemetryConfig>['capture'],\n ): NonNullable<TelemetryConfig>['capture'] {\n // `network: true` = capture ALL network traffic. We used to default to\n // `{ urlFilter: [] }` but the two network paths had inverted semantics\n // for the empty array: the custom NetworkPlugin treated it as\n // \"capture everything\", while AWS RUM's built-in HTTP telemetry\n // treated it as \"capture nothing\". `true` is consistent — both paths\n // capture all by default. BE can override with a narrow filter later.\n const domSetting = beCapture?.dom;\n if (domSetting === false) {\n return {\n console: true,\n network: true,\n navigation: true,\n ...beCapture,\n dom: false,\n };\n }\n return {\n console: true,\n network: true,\n navigation: true,\n ...beCapture,\n dom: {\n throttleMs: 2000,\n ...(typeof domSetting === 'object' ? domSetting : {}),\n rootElement: this.shadowRoot as any,\n },\n };\n }\n\n updateTelemetryContext(context: Record<string, any>) {\n if (this.#telemetryManager) {\n try {\n this.#telemetryManager.updateContext(context);\n } catch (error) {\n // Fail silently - telemetry errors should never break the web-component\n this.logger.error('Error updating telemetry context:', error);\n }\n }\n }\n\n #telemetryReady: Promise<void> | null = null;\n\n async init() {\n // super.init() FIRST so downstream mixins finish setup and the\n // SDK's user-facing paint isn't blocked on our CDN load or the\n // `this.config` fetch. Kick off telemetry as its OWN promise chain\n // stored on the instance. NOT awaited here — tests using\n // jest.useFakeTimers can't advance the fetch chain, and blocking on\n // it would freeze the render. Failures are caught so telemetry\n // errors can never break the SDK's boot.\n await super.init?.();\n const sdkVersion = (this as any).sdkVersion || '1.0.0';\n this.#telemetryReady = this.#getTelemetryConfig()\n .then((config) =>\n this.#initializeTelemetry(config as any, {\n projectId: this.projectId,\n flowId: this.flowId,\n sdkVersion,\n }),\n )\n .catch((error) => {\n this.logger.error('Failed to start telemetry:', error);\n });\n }\n\n // Test hook: resolves once telemetry init has settled (success or\n // caught error). Not part of the public SDK contract.\n get telemetryReady(): Promise<void> {\n return this.#telemetryReady ?? Promise.resolve();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback?.();\n this.#shutdownTelemetry();\n }\n };\n },\n);\n"],"names":["createSingletonMixin","compose","injectNpmLibMixin","loggerMixin","initLifecycleMixin","configMixin","projectIdMixin","flowIdMixin","__classPrivateFieldGet","__classPrivateFieldSet","DEBUG_LOGS_LIB_NAME","JS_FILE_PATH","LOCAL_STORAGE_OVERRIDE"],"mappings":"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"}
package/dist/esm/index.js CHANGED
@@ -4,6 +4,7 @@ export { debuggerMixin } from './mixins/debuggerMixin/debuggerMixin.js';
4
4
  export { descopeUiMixin } from './mixins/descopeUiMixin/descopeUiMixin.js';
5
5
  export { loggerMixin } from './mixins/loggerMixin/loggerMixin.js';
6
6
  export { modalMixin } from './mixins/modalMixin/modalMixin.js';
7
+ export { flowModalMixin } from './mixins/flowModalMixin/flowModalMixin.js';
7
8
  export { notificationsMixin } from './mixins/notificationsMixin/notificationsMixin.js';
8
9
  export { observeAttributesMixin } from './mixins/observeAttributesMixin/observeAttributesMixin.js';
9
10
  export { getResourceUrl, staticResourcesMixin } from './mixins/staticResourcesMixin/staticResourcesMixin.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"flowInputMixin.js","sources":["../../../../src/mixins/flowInputMixin/flowInputMixin.ts"],"sourcesContent":["import { createSingletonMixin, createFlowTemplate } from '@descope/sdk-helpers';\nimport { themeMixin } from '../themeMixin';\n\ntype FlowInputConfig = {\n flowId: string;\n // per-flow inputs the widget supplies; merged over the caller-supplied inputs\n client?: Record<string, any>;\n form?: Record<string, any>;\n // widget-specific context forwarded as-is (e.g. tenant, outboundAppId)\n tenant?: string;\n outboundAppId?: string;\n};\n\n/**\n * Exposes a widget's caller-supplied flow inputs (`client.*` / `form.*`) and\n * builds the internal `<descope-wc>` flow template with the widget's shared\n * config, forwarding those inputs into the flow-start call - the same way they\n * flow for a directly-embedded `<Descope>` flow.\n *\n * `createFlowTemplate` (the method) wraps the `createFlowTemplate` helper so\n * every flow a widget runs gets the shared config + inputs from one place,\n * instead of each call site rebuilding the config. Composes `themeMixin` for\n * the resolved `theme` / `styleId`; the rest are plain attribute reads.\n */\nexport const flowInputMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) =>\n class FlowInputMixinClass extends themeMixin(superclass) {\n // caller-supplied client context, forwarded as flow-start `options.client`\n get clientInput(): Record<string, any> {\n try {\n return JSON.parse(this.getAttribute('client')) || {};\n } catch (e) {\n return {};\n }\n }\n\n // caller-supplied form inputs (raw JSON string), forwarded as flow inputs\n get formInput(): string | undefined {\n return this.getAttribute('form') || undefined;\n }\n\n // merge a per-flow form (e.g. ids the widget supplies) over the\n // caller-supplied form inputs, with the per-flow values taking precedence\n #resolveForm(\n form?: Record<string, any>,\n ): Record<string, any> | string | undefined {\n const callerForm = this.formInput;\n if (!form) return callerForm;\n if (!callerForm) return form;\n try {\n return { ...JSON.parse(callerForm), ...form };\n } catch (e) {\n return form;\n }\n }\n\n createFlowTemplate({\n flowId,\n client,\n form,\n ...overrides\n }: FlowInputConfig) {\n return createFlowTemplate({\n projectId: this.getAttribute('project-id'),\n flowId,\n baseUrl: this.getAttribute('base-url') || '',\n baseStaticUrl: this.getAttribute('base-static-url') || '',\n baseCdnUrl: this.getAttribute('base-cdn-url') || '',\n refreshCookieName: this.getAttribute('refresh-cookie-name') || '',\n theme: this.theme,\n 'style-id': this.styleId,\n locale: this.getAttribute('locale') || '',\n form: this.#resolveForm(form),\n client: { ...this.clientInput, ...client },\n ...overrides,\n });\n }\n },\n);\n"],"names":[],"mappings":";;;;AAaA;;;;;;;;;;AAUG;AACU,MAAA,cAAc,GAAG,oBAAoB,CAChD,CAAqC,UAAa,6FAChD,MAAM,mBAAoB,SAAQ,UAAU,CAAC,UAAU,CAAC,CAAA;AAAxD,QAAA,WAAA,GAAA;;;SAmDC;;AAjDC,QAAA,IAAI,WAAW,GAAA;AACb,YAAA,IAAI;AACF,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;aACtD;YAAC,OAAO,CAAC,EAAE;AACV,gBAAA,OAAO,EAAE,CAAC;aACX;SACF;;AAGD,QAAA,IAAI,SAAS,GAAA;YACX,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;SAC/C;AAiBD,QAAA,kBAAkB,CAAC,EAKD,EAAA;gBALC,EACjB,MAAM,EACN,MAAM,EACN,IAAI,OAEY,EADb,SAAS,GAJK,MAAA,CAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,MAAA,CAKlB,CADa,CAAA;YAEZ,OAAO,kBAAkB,iBACvB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAC1C,MAAM,EACN,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,EAC5C,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,EACzD,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,EAAE,EACnD,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,EAAE,EACjE,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,UAAU,EAAE,IAAI,CAAC,OAAO,EACxB,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,EACzC,IAAI,EAAE,uBAAA,IAAI,EAAA,8BAAA,EAAA,GAAA,EAAA,gCAAA,CAAa,CAAjB,IAAA,CAAA,IAAI,EAAc,IAAI,CAAC,EAC7B,MAAM,EAAO,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,IAAI,CAAC,WAAW,GAAK,MAAM,CAAA,EAAA,EACrC,SAAS,CAAA,CACZ,CAAC;SACJ;AACF,KAAA;;iFAjCG,IAA0B,EAAA;AAE1B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;AAClC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,UAAU,CAAC;AAC7B,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,IAAI,CAAC;AAC7B,QAAA,IAAI;YACF,OAAY,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA,EAAK,IAAI,CAAG,CAAA;SAC/C;QAAC,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,IAAI,CAAC;SACb;KACF;AAuBF,IAAA,EAAA,CAAA,EAAA;;;;"}
1
+ {"version":3,"file":"flowInputMixin.js","sources":["../../../../src/mixins/flowInputMixin/flowInputMixin.ts"],"sourcesContent":["import { createSingletonMixin, createFlowTemplate } from '@descope/sdk-helpers';\nimport { themeMixin } from '../themeMixin';\n\ntype FlowInputConfig = {\n flowId: string;\n // per-flow inputs the widget supplies; merged over the caller-supplied inputs\n client?: Record<string, any>;\n form?: Record<string, any>;\n // hold the flow's start call until the element's start() is called - modals\n // default this to true, pass false to start the flow as soon as it renders\n lazyStart?: boolean;\n // widget-specific context forwarded as-is (e.g. tenant, outboundAppId)\n tenant?: string;\n outboundAppId?: string;\n};\n\n/**\n * Exposes a widget's caller-supplied flow inputs (`client.*` / `form.*`) and\n * builds the internal `<descope-wc>` flow template with the widget's shared\n * config, forwarding those inputs into the flow-start call - the same way they\n * flow for a directly-embedded `<Descope>` flow.\n *\n * `createFlowTemplate` (the method) wraps the `createFlowTemplate` helper so\n * every flow a widget runs gets the shared config + inputs from one place,\n * instead of each call site rebuilding the config. Composes `themeMixin` for\n * the resolved `theme` / `styleId`; the rest are plain attribute reads.\n */\nexport const flowInputMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) =>\n class FlowInputMixinClass extends themeMixin(superclass) {\n // caller-supplied client context, forwarded as flow-start `options.client`\n get clientInput(): Record<string, any> {\n try {\n return JSON.parse(this.getAttribute('client')) || {};\n } catch (e) {\n return {};\n }\n }\n\n // caller-supplied form inputs (raw JSON string), forwarded as flow inputs\n get formInput(): string | undefined {\n return this.getAttribute('form') || undefined;\n }\n\n // merge a per-flow form (e.g. ids the widget supplies) over the\n // caller-supplied form inputs, with the per-flow values taking precedence\n #resolveForm(\n form?: Record<string, any>,\n ): Record<string, any> | string | undefined {\n const callerForm = this.formInput;\n if (!form) return callerForm;\n if (!callerForm) return form;\n try {\n return { ...JSON.parse(callerForm), ...form };\n } catch (e) {\n return form;\n }\n }\n\n createFlowTemplate({\n flowId,\n client,\n form,\n ...overrides\n }: FlowInputConfig) {\n return createFlowTemplate({\n projectId: this.getAttribute('project-id'),\n flowId,\n baseUrl: this.getAttribute('base-url') || '',\n baseStaticUrl: this.getAttribute('base-static-url') || '',\n baseCdnUrl: this.getAttribute('base-cdn-url') || '',\n refreshCookieName: this.getAttribute('refresh-cookie-name') || '',\n theme: this.theme,\n 'style-id': this.styleId,\n locale: this.getAttribute('locale') || '',\n form: this.#resolveForm(form),\n client: { ...this.clientInput, ...client },\n ...overrides,\n });\n }\n },\n);\n"],"names":[],"mappings":";;;;AAgBA;;;;;;;;;;AAUG;AACU,MAAA,cAAc,GAAG,oBAAoB,CAChD,CAAqC,UAAa,6FAChD,MAAM,mBAAoB,SAAQ,UAAU,CAAC,UAAU,CAAC,CAAA;AAAxD,QAAA,WAAA,GAAA;;;SAmDC;;AAjDC,QAAA,IAAI,WAAW,GAAA;AACb,YAAA,IAAI;AACF,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;aACtD;YAAC,OAAO,CAAC,EAAE;AACV,gBAAA,OAAO,EAAE,CAAC;aACX;SACF;;AAGD,QAAA,IAAI,SAAS,GAAA;YACX,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;SAC/C;AAiBD,QAAA,kBAAkB,CAAC,EAKD,EAAA;gBALC,EACjB,MAAM,EACN,MAAM,EACN,IAAI,OAEY,EADb,SAAS,GAJK,MAAA,CAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,MAAA,CAKlB,CADa,CAAA;YAEZ,OAAO,kBAAkB,iBACvB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAC1C,MAAM,EACN,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,EAC5C,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,EACzD,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,EAAE,EACnD,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,EAAE,EACjE,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,UAAU,EAAE,IAAI,CAAC,OAAO,EACxB,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,EACzC,IAAI,EAAE,uBAAA,IAAI,EAAA,8BAAA,EAAA,GAAA,EAAA,gCAAA,CAAa,CAAjB,IAAA,CAAA,IAAI,EAAc,IAAI,CAAC,EAC7B,MAAM,EAAO,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,IAAI,CAAC,WAAW,GAAK,MAAM,CAAA,EAAA,EACrC,SAAS,CAAA,CACZ,CAAC;SACJ;AACF,KAAA;;iFAjCG,IAA0B,EAAA;AAE1B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;AAClC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,UAAU,CAAC;AAC7B,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,IAAI,CAAC;AAC7B,QAAA,IAAI;YACF,OAAY,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA,EAAK,IAAI,CAAG,CAAA;SAC/C;QAAC,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,IAAI,CAAC;SACb;KACF;AAuBF,IAAA,EAAA,CAAA,EAAA;;;;"}
@@ -0,0 +1,34 @@
1
+ import { createSingletonMixin } from '@descope/sdk-helpers';
2
+ import { modalMixin } from '../modalMixin/modalMixin.js';
3
+
4
+ /**
5
+ * A modal that hosts a flow.
6
+ *
7
+ * Widgets build a modal's flow ahead of the modal being opened, so the flow's
8
+ * start call is held until it opens - otherwise a preloaded modal the user
9
+ * never opens still creates a flow execution. A caller whose flow must start as
10
+ * soon as it renders opts out with `lazyStart: false` on the flow template.
11
+ */
12
+ const flowModalMixin = createSingletonMixin((superclass) => class FlowModalMixinClass extends modalMixin(superclass) {
13
+ createFlowModal(config) {
14
+ const ModalDriverClass = this.modalDriverClass;
15
+ class FlowModalDriver extends ModalDriverClass {
16
+ setContent(template) {
17
+ const flowEle = template.content.querySelector('descope-wc');
18
+ if (flowEle && !flowEle.hasAttribute('lazy-start')) {
19
+ flowEle.setAttribute('lazy-start', 'true');
20
+ }
21
+ super.setContent(template);
22
+ }
23
+ async open() {
24
+ var _a, _b, _c;
25
+ await super.open();
26
+ (_c = (_b = (_a = this.ele) === null || _a === void 0 ? void 0 : _a.querySelector('descope-wc')) === null || _b === void 0 ? void 0 : _b.start) === null || _c === void 0 ? void 0 : _c.call(_b);
27
+ }
28
+ }
29
+ return this.createModal(config, FlowModalDriver);
30
+ }
31
+ });
32
+
33
+ export { flowModalMixin };
34
+ //# sourceMappingURL=flowModalMixin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowModalMixin.js","sources":["../../../../src/mixins/flowModalMixin/flowModalMixin.ts"],"sourcesContent":["import { createSingletonMixin } from '@descope/sdk-helpers';\nimport { ModalDriver } from '@descope/sdk-component-drivers';\nimport { modalMixin } from '../modalMixin';\n\n/**\n * A modal that hosts a flow.\n *\n * Widgets build a modal's flow ahead of the modal being opened, so the flow's\n * start call is held until it opens - otherwise a preloaded modal the user\n * never opens still creates a flow execution. A caller whose flow must start as\n * soon as it renders opts out with `lazyStart: false` on the flow template.\n */\nexport const flowModalMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) =>\n class FlowModalMixinClass extends modalMixin(superclass) {\n createFlowModal(config?: Record<string, string>) {\n const ModalDriverClass = this.modalDriverClass;\n\n class FlowModalDriver extends ModalDriverClass {\n setContent(template: HTMLTemplateElement) {\n const flowEle = template.content.querySelector('descope-wc');\n if (flowEle && !flowEle.hasAttribute('lazy-start')) {\n flowEle.setAttribute('lazy-start', 'true');\n }\n super.setContent(template);\n }\n\n async open() {\n await super.open();\n (this.ele?.querySelector('descope-wc') as any)?.start?.();\n }\n }\n\n return this.createModal(config, FlowModalDriver as typeof ModalDriver);\n }\n },\n);\n"],"names":[],"mappings":";;;AAIA;;;;;;;AAOG;AACU,MAAA,cAAc,GAAG,oBAAoB,CAChD,CAAqC,UAAa,KAChD,MAAM,mBAAoB,SAAQ,UAAU,CAAC,UAAU,CAAC,CAAA;AACtD,IAAA,eAAe,CAAC,MAA+B,EAAA;AAC7C,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAE/C,MAAM,eAAgB,SAAQ,gBAAgB,CAAA;AAC5C,YAAA,UAAU,CAAC,QAA6B,EAAA;gBACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;gBAC7D,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE;AAClD,oBAAA,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;iBAC5C;AACD,gBAAA,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;aAC5B;AAED,YAAA,MAAM,IAAI,GAAA;;AACR,gBAAA,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;AACnB,gBAAA,CAAA,EAAA,GAAA,CAAC,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,GAAG,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,aAAa,CAAC,YAAY,CAAS,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAK,kDAAI,CAAC;aAC3D;AACF,SAAA;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,eAAqC,CAAC,CAAC;KACxE;AACF,CAAA;;;;"}
@@ -23,11 +23,17 @@ const modalMixin = createSingletonMixin((superclass) => {
23
23
  };
24
24
  })());
25
25
  }
26
- createModal(config) {
26
+ // the driver class createModal instantiates - subclass it to build a
27
+ // modal driver with extra behavior (see flowModalMixin) and hand the
28
+ // result to createModal
29
+ get modalDriverClass() {
30
+ return __classPrivateFieldGet(this, _ModalMixinClass_ModalDriverWrapper, "f");
31
+ }
32
+ createModal(config, DriverClass = __classPrivateFieldGet(this, _ModalMixinClass_ModalDriverWrapper, "f")) {
27
33
  const baseConfig = {};
28
34
  const modal = createModalEle(Object.assign(Object.assign({}, baseConfig), config));
29
35
  this.rootElement.append(modal);
30
- return new (__classPrivateFieldGet(this, _ModalMixinClass_ModalDriverWrapper, "f"))(modal, {
36
+ return new DriverClass(modal, {
31
37
  logger: this.logger,
32
38
  });
33
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"modalMixin.js","sources":["../../../../src/mixins/modalMixin/modalMixin.ts"],"sourcesContent":["// eslint-disable-next-line max-classes-per-file\nimport { createSingletonMixin, compose } from '@descope/sdk-helpers';\nimport { initLifecycleMixin } from '../initLifecycleMixin';\nimport { initElementMixin } from '../initElementMixin';\nimport { descopeUiMixin } from '../descopeUiMixin';\nimport { createModalEle } from './helpers';\nimport { MODAL_ELE_TAG } from './constants';\nimport { ModalDriver } from '@descope/sdk-component-drivers';\n\nexport const modalMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n initLifecycleMixin,\n initElementMixin,\n descopeUiMixin,\n )(superclass);\n return class ModalMixinClass extends BaseClass {\n #ModalDriverWrapper = (() => {\n const loadDescopeUiComponents = this.loadDescopeUiComponents.bind(this);\n return class ModalDriverWrapper extends ModalDriver {\n setContent(template: HTMLTemplateElement) {\n loadDescopeUiComponents(template);\n super.setContent(template);\n }\n };\n })();\n\n createModal(config?: Record<string, string>) {\n const baseConfig = {};\n\n const modal = createModalEle({\n ...baseConfig,\n ...config,\n });\n\n this.rootElement.append(modal);\n\n return new this.#ModalDriverWrapper(modal, {\n logger: this.logger,\n }) as ModalDriver;\n }\n\n async init() {\n this.loadDescopeUiComponents([MODAL_ELE_TAG]);\n await super.init?.();\n }\n };\n },\n);\n"],"names":[],"mappings":";;;;;;;;;MASa,UAAU,GAAG,oBAAoB,CAC5C,CAAqC,UAAa,KAAI;;AACpD,IAAA,MAAM,SAAS,GAAG,OAAO,CACvB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,CACf,CAAC,UAAU,CAAC,CAAC;IACd,OAAO,EAAA,GAAA,MAAM,eAAgB,SAAQ,SAAS,CAAA;AAAvC,YAAA,WAAA,GAAA;;gBACL,mCAAsB,CAAA,GAAA,CAAA,IAAA,EAAA,CAAC,MAAK;oBAC1B,MAAM,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACxE,OAAO,MAAM,kBAAmB,SAAQ,WAAW,CAAA;AACjD,wBAAA,UAAU,CAAC,QAA6B,EAAA;4BACtC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;AAClC,4BAAA,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;yBAC5B;qBACF,CAAC;iBACH,GAAG,CAAC,CAAA;aAqBN;AAnBC,YAAA,WAAW,CAAC,MAA+B,EAAA;gBACzC,MAAM,UAAU,GAAG,EAAE,CAAC;gBAEtB,MAAM,KAAK,GAAG,cAAc,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACvB,UAAU,CACV,EAAA,MAAM,EACT,CAAC;AAEH,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAE/B,gBAAA,OAAO,KAAI,sBAAA,CAAA,IAAI,EAAoB,mCAAA,EAAA,GAAA,CAAA,EAAC,KAAK,EAAE;oBACzC,MAAM,EAAE,IAAI,CAAC,MAAM;AACpB,iBAAA,CAAgB,CAAC;aACnB;AAED,YAAA,MAAM,IAAI,GAAA;;AACR,gBAAA,IAAI,CAAC,uBAAuB,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AAC9C,gBAAA,OAAM,CAAA,EAAA,GAAA,KAAK,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAI,CAAA,CAAC;aACtB;AACF,SAAA;;AAAC,QAAA,EAAA,CAAA;AACJ,CAAC;;;;"}
1
+ {"version":3,"file":"modalMixin.js","sources":["../../../../src/mixins/modalMixin/modalMixin.ts"],"sourcesContent":["// eslint-disable-next-line max-classes-per-file\nimport { createSingletonMixin, compose } from '@descope/sdk-helpers';\nimport { initLifecycleMixin } from '../initLifecycleMixin';\nimport { initElementMixin } from '../initElementMixin';\nimport { descopeUiMixin } from '../descopeUiMixin';\nimport { createModalEle } from './helpers';\nimport { MODAL_ELE_TAG } from './constants';\nimport { ModalDriver } from '@descope/sdk-component-drivers';\n\nexport const modalMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n initLifecycleMixin,\n initElementMixin,\n descopeUiMixin,\n )(superclass);\n return class ModalMixinClass extends BaseClass {\n #ModalDriverWrapper = (() => {\n const loadDescopeUiComponents = this.loadDescopeUiComponents.bind(this);\n return class ModalDriverWrapper extends ModalDriver {\n setContent(template: HTMLTemplateElement) {\n loadDescopeUiComponents(template);\n super.setContent(template);\n }\n };\n })();\n\n // the driver class createModal instantiates - subclass it to build a\n // modal driver with extra behavior (see flowModalMixin) and hand the\n // result to createModal\n get modalDriverClass() {\n return this.#ModalDriverWrapper;\n }\n\n createModal(\n config?: Record<string, string>,\n DriverClass: typeof ModalDriver = this.#ModalDriverWrapper,\n ) {\n const baseConfig = {};\n\n const modal = createModalEle({\n ...baseConfig,\n ...config,\n });\n\n this.rootElement.append(modal);\n\n return new DriverClass(modal, {\n logger: this.logger,\n }) as ModalDriver;\n }\n\n async init() {\n this.loadDescopeUiComponents([MODAL_ELE_TAG]);\n await super.init?.();\n }\n };\n },\n);\n"],"names":[],"mappings":";;;;;;;;;MASa,UAAU,GAAG,oBAAoB,CAC5C,CAAqC,UAAa,KAAI;;AACpD,IAAA,MAAM,SAAS,GAAG,OAAO,CACvB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,CACf,CAAC,UAAU,CAAC,CAAC;IACd,OAAO,EAAA,GAAA,MAAM,eAAgB,SAAQ,SAAS,CAAA;AAAvC,YAAA,WAAA,GAAA;;gBACL,mCAAsB,CAAA,GAAA,CAAA,IAAA,EAAA,CAAC,MAAK;oBAC1B,MAAM,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACxE,OAAO,MAAM,kBAAmB,SAAQ,WAAW,CAAA;AACjD,wBAAA,UAAU,CAAC,QAA6B,EAAA;4BACtC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;AAClC,4BAAA,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;yBAC5B;qBACF,CAAC;iBACH,GAAG,CAAC,CAAA;aA+BN;;;;AA1BC,YAAA,IAAI,gBAAgB,GAAA;gBAClB,OAAO,sBAAA,CAAA,IAAI,EAAA,mCAAA,EAAA,GAAA,CAAoB,CAAC;aACjC;AAED,YAAA,WAAW,CACT,MAA+B,EAC/B,WAAkC,GAAA,sBAAA,CAAA,IAAI,EAAoB,mCAAA,EAAA,GAAA,CAAA,EAAA;gBAE1D,MAAM,UAAU,GAAG,EAAE,CAAC;gBAEtB,MAAM,KAAK,GAAG,cAAc,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACvB,UAAU,CACV,EAAA,MAAM,EACT,CAAC;AAEH,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAE/B,gBAAA,OAAO,IAAI,WAAW,CAAC,KAAK,EAAE;oBAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;AACpB,iBAAA,CAAgB,CAAC;aACnB;AAED,YAAA,MAAM,IAAI,GAAA;;AACR,gBAAA,IAAI,CAAC,uBAAuB,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AAC9C,gBAAA,OAAM,CAAA,EAAA,GAAA,KAAK,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAI,CAAA,CAAC;aACtB;AACF,SAAA;;AAAC,QAAA,EAAA,CAAA;AACJ,CAAC;;;;"}
@@ -198,14 +198,40 @@ const telemetryMixin = createSingletonMixin((superclass) => {
198
198
  // The backend ships telemetry nested under `projectConfig` in config.json.
199
199
  const resolvedConfig = await this.config;
200
200
  const beTelemetry = (_b = resolvedConfig === null || resolvedConfig === void 0 ? void 0 : resolvedConfig.projectConfig) === null || _b === void 0 ? void 0 : _b.telemetry;
201
- const sampleRate = Number(process.env.DESCOPE_TELEMETRY_SESSION_SAMPLE_RATE);
202
- const fallback = {
203
- enabled: (process.env.DESCOPE_TELEMETRY_ENABLED || '').toLowerCase() ===
204
- 'true',
205
- rumConfig: Object.assign({ applicationId: process.env.DESCOPE_TELEMETRY_APPLICATION_ID || '', identityPoolId: process.env.DESCOPE_TELEMETRY_IDENTITY_POOL_ID || '', region: process.env.DESCOPE_TELEMETRY_REGION || '', sessionSampleRate: Number.isFinite(sampleRate) && sampleRate > 0 ? sampleRate : 1 }, (process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN && {
206
- guestRoleArn: process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN,
207
- })),
208
- };
201
+ // The DESCOPE_TELEMETRY_* reads below are build-time env tokens: the WC
202
+ // app build substitutes them from .env (rollup.config.app.mjs) and the
203
+ // WC lib build strips them to "" (stubEnvInProd). But @descope/sdk-mixins
204
+ // ships its own dist with these tokens RAW, so a non-WC consumer that
205
+ // bundles this file for the browser hits a bare `process`, which is
206
+ // undefined there -> "ReferenceError: process is not defined".
207
+ // Wrap the reads in try/catch: this keeps the literal `process.env.*`
208
+ // tokens intact (so the WC build-time replace/strip still match them),
209
+ // while falling back to an empty config wherever `process` doesn't
210
+ // exist. Real config comes from the backend (projectConfig.telemetry).
211
+ let fallback;
212
+ try {
213
+ const sampleRate = Number(process.env.DESCOPE_TELEMETRY_SESSION_SAMPLE_RATE);
214
+ fallback = {
215
+ enabled: (process.env.DESCOPE_TELEMETRY_ENABLED || '').toLowerCase() ===
216
+ 'true',
217
+ rumConfig: Object.assign({ applicationId: process.env.DESCOPE_TELEMETRY_APPLICATION_ID || '', identityPoolId: process.env.DESCOPE_TELEMETRY_IDENTITY_POOL_ID || '', region: process.env.DESCOPE_TELEMETRY_REGION || '', sessionSampleRate: Number.isFinite(sampleRate) && sampleRate > 0 ? sampleRate : 1 }, (process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN && {
218
+ guestRoleArn: process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN,
219
+ })),
220
+ };
221
+ }
222
+ catch (_c) {
223
+ // `process` is not defined (browser, no build-time replacement).
224
+ // No .env fallback here - rely on the backend telemetry config.
225
+ fallback = {
226
+ enabled: false,
227
+ rumConfig: {
228
+ applicationId: '',
229
+ identityPoolId: '',
230
+ region: '',
231
+ sessionSampleRate: 1,
232
+ },
233
+ };
234
+ }
209
235
  const cfg = Object.assign(Object.assign(Object.assign({}, fallback), beTelemetry), { rumConfig: Object.assign(Object.assign({}, fallback.rumConfig), beTelemetry === null || beTelemetry === void 0 ? void 0 : beTelemetry.rumConfig), capture: __classPrivateFieldGet(this, _TelemetryMixinClass_instances, "m", _TelemetryMixinClass_resolveCapture).call(this, beTelemetry === null || beTelemetry === void 0 ? void 0 : beTelemetry.capture) });
210
236
  // If enabled but a required RUM credential is missing (empty from both
211
237
  // the BE block and the .env fallback), disable rather than hand AwsRum