@descope/web-component 3.47.10 → 3.47.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/cjs/descope-wc/BaseDescopeWc.js +1 -1
- package/dist/cjs/descope-wc/BaseDescopeWc.js.map +1 -1
- package/dist/cjs/descope-wc/DescopeWc.js +1 -1
- package/dist/cjs/descope-wc/DescopeWc.js.map +1 -1
- package/dist/cjs/helpers/storage.js.map +1 -1
- package/dist/cjs/helpers/templates.js +1 -1
- package/dist/cjs/helpers/templates.js.map +1 -1
- package/dist/esm/descope-wc/BaseDescopeWc.js +1 -1
- package/dist/esm/descope-wc/BaseDescopeWc.js.map +1 -1
- package/dist/esm/descope-wc/DescopeWc.js +1 -1
- package/dist/esm/descope-wc/DescopeWc.js.map +1 -1
- package/dist/esm/helpers/storage.js.map +1 -1
- package/dist/esm/helpers/templates.js +1 -1
- package/dist/esm/helpers/templates.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -2
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sources":["../../../src/lib/helpers/templates.ts"],"sourcesContent":["import { escapeMarkdown } from '@descope/escape-markdown';\nimport {\n ELEMENT_TYPE_ATTRIBUTE,\n DESCOPE_ATTRIBUTE_EXCLUDE_FIELD,\n HAS_DYNAMIC_VALUES_ATTR_NAME,\n} from '../constants';\nimport { ComponentsConfig, CssVars, ScreenState } from '../types';\nimport { shouldHandleMarkdown } from './helpers';\n\nconst ALLOWED_INPUT_CONFIG_ATTRS = ['disabled'];\n\nexport const replaceElementMessage = (\n baseEle: HTMLElement,\n eleType: string,\n message = '',\n) => {\n const eleList = baseEle.querySelectorAll(\n `[${ELEMENT_TYPE_ATTRIBUTE}=\"${eleType}\"]`,\n );\n eleList.forEach((ele: HTMLElement) => {\n // eslint-disable-next-line no-param-reassign\n ele.textContent = message;\n ele.classList[message ? 'remove' : 'add']('hide');\n });\n};\n\n/**\n * Replace the 'value' attribute of screen inputs with screen state's inputs.\n * For example: if base element contains '<input name=\"key1\" ...>' and screen input is in form of { key1: 'val1' },\n * it will add 'val1' as the input value\n */\nconst replaceElementInputs = (\n baseEle: HTMLElement,\n screenInputs: Record<string, string>,\n) => {\n Object.entries(screenInputs || {}).forEach(([name, value]) => {\n const inputEls = Array.from(\n baseEle.querySelectorAll(\n `*[name=\"${name}\"]:not([${DESCOPE_ATTRIBUTE_EXCLUDE_FIELD}])`,\n ),\n ) as HTMLInputElement[];\n inputEls.forEach((inputEle) => {\n // eslint-disable-next-line no-param-reassign\n inputEle.value = value;\n });\n });\n};\n\n/**\n * Get object nested path.\n * Examples:\n * - getByPath({ { a { b: 'rob' } }, 'a.b') => 'hey rob'\n * - getByPath({}, 'a.b') => ''\n */\nconst getByPath = (obj: Record<string, any>, path: string) =>\n path.split('.').reduce((prev, next) => prev?.[next] || '', obj);\n\n/**\n * Apply template language on text, based on screen state.\n * Examples:\n * - 'hey {{a.b}}', { a { b: 'rob' }} => 'hey rob'\n * - 'hey {{not.exists}}', {} => 'hey '\n */\nconst applyTemplates = (\n text: string,\n screenState?: Record<string, any>,\n handleMarkdown?: boolean,\n): string =>\n text.replace(/{{(.+?)}}/g, (_, match) =>\n handleMarkdown\n ? escapeMarkdown(getByPath(screenState, match))\n : getByPath(screenState, match),\n );\n\n/**\n * Replace the templates of content of inner text/link elements with screen state data\n */\nconst replaceElementTemplates = (\n baseEle: DocumentFragment,\n screenState?: Record<string, any>,\n) => {\n const eleList = baseEle.querySelectorAll(\n 'descope-text,descope-link,descope-enriched-text,descope-code-snippet',\n );\n eleList.forEach((inEle: HTMLElement) => {\n const handleMarkdown = shouldHandleMarkdown(inEle.localName);\n // eslint-disable-next-line no-param-reassign\n inEle.textContent = applyTemplates(\n inEle.textContent,\n screenState,\n handleMarkdown,\n );\n const href = inEle.getAttribute('href');\n if (href) {\n inEle.setAttribute('href', applyTemplates(href, screenState));\n }\n });\n};\n\nconst replaceTemplateDynamicAttrValues = (\n baseEle: DocumentFragment,\n screenState?: Record<string, any>,\n) => {\n const eleList = baseEle.querySelectorAll(`[${HAS_DYNAMIC_VALUES_ATTR_NAME}]`);\n eleList.forEach((ele: HTMLElement) => {\n Array.from(ele.attributes).forEach((attr) => {\n // eslint-disable-next-line no-param-reassign\n attr.value = applyTemplates(attr.value, screenState);\n });\n });\n};\n\nconst replaceHrefByDataType = (\n baseEle: DocumentFragment,\n dataType: string,\n provisionUrl?: string,\n) => {\n const eleList = baseEle.querySelectorAll(\n `[${ELEMENT_TYPE_ATTRIBUTE}=\"${dataType}\"]`,\n );\n eleList.forEach((ele: HTMLLinkElement) => {\n // eslint-disable-next-line no-param-reassign\n ele.setAttribute('href', provisionUrl);\n });\n};\n\nconst setFormConfigValues = (\n baseEle: DocumentFragment,\n formData: Record<string, string>,\n) => {\n Object.entries(formData).forEach(([name, config]) => {\n const eles = baseEle.querySelectorAll(`[name=\"${name}\"]`);\n\n eles.forEach((ele) => {\n Object.entries(config).forEach(([attrName, attrValue]) => {\n if (ALLOWED_INPUT_CONFIG_ATTRS.includes(attrName)) {\n ele.setAttribute(attrName, attrValue);\n }\n });\n });\n });\n};\n\nexport const setCssVars = (\n rootEle: HTMLElement,\n nextPageTemplate: DocumentFragment,\n cssVars: CssVars,\n logger: {\n error: (message: string, description: string) => void;\n info: (message: string, description: string) => void;\n debug: (message: string, description: string) => void;\n },\n) => {\n if (!cssVars) {\n return;\n }\n\n Object.keys(cssVars).forEach((componentName) => {\n if (!nextPageTemplate.querySelector(componentName)) {\n logger.debug(\n `Skipping css vars for component \"${componentName}}\"`,\n `Got css vars for component ${componentName} but Could not find it on next page`,\n );\n }\n const componentClass:\n | (CustomElementConstructor & { cssVarList: CssVars })\n | undefined = customElements.get(componentName) as any;\n\n if (!componentClass) {\n logger.info(\n `Could not find component class for ${componentName}`,\n 'Check if the component is registered',\n );\n return;\n }\n\n Object.keys(cssVars[componentName]).forEach((cssVarKey) => {\n const componentCssVars = cssVars[componentName];\n const varName = componentClass?.cssVarList?.[cssVarKey];\n\n if (!varName) {\n logger.info(\n `Could not find css variable name for ${cssVarKey} in ${componentName}`,\n 'Check if the css variable is defined in the component',\n );\n return;\n }\n\n const value = componentCssVars[cssVarKey];\n\n rootEle.style.setProperty(varName, value);\n });\n });\n};\n\nconst setElementConfig = (\n baseEle: DocumentFragment,\n componentsConfig: ComponentsConfig,\n logger?: { error: (message: string, description: string) => void },\n) => {\n if (!componentsConfig) {\n return;\n }\n const { componentsDynamicAttrs, ...rest } = componentsConfig;\n\n const configMap = Object.keys(rest).reduce((acc, componentName) => {\n acc[`[name=${componentName}]`] = rest[componentName];\n return acc;\n }, {});\n\n if (componentsDynamicAttrs) {\n Object.keys(componentsDynamicAttrs).forEach((componentSelector) => {\n const componentDynamicAttrs = componentsDynamicAttrs[componentSelector];\n if (componentDynamicAttrs) {\n const { attributes } = componentDynamicAttrs;\n if (attributes && Object.keys(attributes).length) {\n configMap[componentSelector] = attributes;\n }\n }\n });\n }\n\n // collect components that needs configuration from DOM\n Object.keys(configMap).forEach((componentsSelector) => {\n baseEle.querySelectorAll(componentsSelector).forEach((comp) => {\n const config = configMap[componentsSelector];\n\n Object.keys(config).forEach((attr) => {\n let value = config[attr];\n\n if (typeof value !== 'string') {\n try {\n value = JSON.stringify(value);\n } catch (e) {\n logger.error(\n `Could not stringify value \"${value}\" for \"${attr}\"`,\n e.message,\n );\n value = '';\n }\n }\n\n comp.setAttribute(attr, value);\n });\n });\n });\n};\n\nconst setImageVariable = (\n rootEle: HTMLElement,\n name: string,\n image?: string,\n) => {\n const imageVarName = (\n customElements.get(name) as CustomElementConstructor & {\n cssVarList: Record<string, string>;\n }\n )?.cssVarList.url;\n\n if (image && imageVarName) {\n rootEle?.style?.setProperty(\n imageVarName,\n `url(data:image/jpg;base64,${image})`,\n );\n }\n};\n\n/**\n * Update a screen template based on the screen state\n * - Show/hide error messages\n * - Replace element templates ({{...}} syntax) with screen state object\n */\nexport const updateTemplateFromScreenState = (\n baseEle: DocumentFragment,\n screenState?: ScreenState,\n componentsConfig?: ComponentsConfig,\n flowInputs?: Record<string, string>,\n logger?: { error: (message: string, description: string) => void },\n) => {\n replaceHrefByDataType(baseEle, 'totp-link', screenState?.totp?.provisionUrl);\n replaceHrefByDataType(baseEle, 'notp-link', screenState?.notp?.redirectUrl);\n replaceElementTemplates(baseEle, screenState);\n setElementConfig(baseEle, componentsConfig, logger);\n replaceTemplateDynamicAttrValues(baseEle, screenState);\n setFormConfigValues(baseEle, flowInputs);\n};\n\n/**\n * Update a screen based on a screen state\n * - Replace values of element inputs with screen state's inputs\n */\nexport const updateScreenFromScreenState = (\n baseEle: HTMLElement,\n screenState?: ScreenState,\n) => {\n replaceElementInputs(baseEle, screenState?.inputs);\n replaceElementInputs(baseEle, screenState?.form);\n};\n\nexport const setTOTPVariable = (rootEle: HTMLElement, image?: string) => {\n setImageVariable(rootEle, 'descope-totp-image', image);\n};\n\nexport const setNOTPVariable = (rootEle: HTMLElement, image?: string) => {\n setImageVariable(rootEle, 'descope-notp-image', image);\n};\n\nexport const setPhoneAutoDetectDefaultCode = (\n fragment: DocumentFragment,\n autoDetectCode?: string,\n) => {\n Array.from(fragment.querySelectorAll('[default-code=\"autoDetect\"]')).forEach(\n (phoneEle) => {\n phoneEle.setAttribute('default-code', autoDetectCode);\n },\n );\n};\n\nexport const disableWebauthnButtons = (fragment: DocumentFragment) => {\n const webauthnButtons = fragment.querySelectorAll(\n `descope-button[${ELEMENT_TYPE_ATTRIBUTE}=\"biometrics\"]`,\n );\n webauthnButtons.forEach((button) => button.setAttribute('disabled', 'true'));\n};\n\nexport const getDescopeUiComponentsList = (clone: DocumentFragment) => [\n ...Array.from(clone.querySelectorAll('*')).reduce<Set<string>>(\n (acc, el: HTMLElement) =>\n el.tagName.startsWith('DESCOPE-')\n ? acc.add(el.tagName.toLocaleLowerCase())\n : acc,\n new Set(),\n ),\n];\n"],"names":["ALLOWED_INPUT_CONFIG_ATTRS","replaceElementMessage","baseEle","eleType","message","querySelectorAll","ELEMENT_TYPE_ATTRIBUTE","forEach","ele","textContent","classList","replaceElementInputs","screenInputs","Object","entries","name","value","Array","from","DESCOPE_ATTRIBUTE_EXCLUDE_FIELD","inputEle","getByPath","obj","path","split","reduce","prev","next","applyTemplates","text","screenState","handleMarkdown","replace","_","match","escapeMarkdown","replaceHrefByDataType","dataType","provisionUrl","setAttribute","setCssVars","rootEle","nextPageTemplate","cssVars","logger","keys","componentName","querySelector","debug","componentClass","customElements","get","cssVarKey","componentCssVars","varName","_a","cssVarList","info","style","setProperty","setImageVariable","image","imageVarName","url","_b","updateTemplateFromScreenState","componentsConfig","flowInputs","totp","notp","redirectUrl","inEle","shouldHandleMarkdown","localName","href","getAttribute","replaceElementTemplates","componentsDynamicAttrs","rest","__rest","configMap","acc","componentSelector","componentDynamicAttrs","attributes","length","componentsSelector","comp","config","attr","JSON","stringify","e","error","setElementConfig","HAS_DYNAMIC_VALUES_ATTR_NAME","replaceTemplateDynamicAttrValues","formData","attrName","attrValue","includes","setFormConfigValues","updateScreenFromScreenState","inputs","form","setTOTPVariable","setNOTPVariable","setPhoneAutoDetectDefaultCode","fragment","autoDetectCode","phoneEle","disableWebauthnButtons","button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"templates.js","sources":["../../../src/lib/helpers/templates.ts"],"sourcesContent":["import { escapeMarkdown } from '@descope/escape-markdown';\nimport {\n ELEMENT_TYPE_ATTRIBUTE,\n DESCOPE_ATTRIBUTE_EXCLUDE_FIELD,\n HAS_DYNAMIC_VALUES_ATTR_NAME,\n} from '../constants';\nimport { ComponentsConfig, CssVars, ScreenState } from '../types';\nimport { shouldHandleMarkdown } from './helpers';\n\nconst ALLOWED_INPUT_CONFIG_ATTRS = ['disabled'];\n\nexport const replaceElementMessage = (\n baseEle: HTMLElement,\n eleType: string,\n message = '',\n) => {\n const eleList = baseEle.querySelectorAll(\n `[${ELEMENT_TYPE_ATTRIBUTE}=\"${eleType}\"]`,\n );\n eleList.forEach((ele: HTMLElement) => {\n // eslint-disable-next-line no-param-reassign\n ele.textContent = message;\n ele.classList[message ? 'remove' : 'add']('hide');\n });\n};\n\n/**\n * Replace the 'value' attribute of screen inputs with screen state's inputs.\n * For example: if base element contains '<input name=\"key1\" ...>' and screen input is in form of { key1: 'val1' },\n * it will add 'val1' as the input value\n */\nconst replaceElementInputs = (\n baseEle: HTMLElement,\n screenInputs: Record<string, string>,\n) => {\n Object.entries(screenInputs || {}).forEach(([name, value]) => {\n const inputEls = Array.from(\n baseEle.querySelectorAll(\n `*[name=\"${name}\"]:not([${DESCOPE_ATTRIBUTE_EXCLUDE_FIELD}])`,\n ),\n ) as HTMLInputElement[];\n inputEls.forEach((inputEle) => {\n // eslint-disable-next-line no-param-reassign\n inputEle.value = value;\n });\n });\n};\n\n/**\n * Get object nested path.\n * Examples:\n * - getByPath({ { a { b: 'rob' } }, 'a.b') => 'hey rob'\n * - getByPath({}, 'a.b') => ''\n */\nconst getByPath = (obj: Record<string, any>, path: string) =>\n path.split('.').reduce((prev, next) => prev?.[next] || '', obj);\n\n/**\n * Apply template language on text, based on screen state.\n * Examples:\n * - 'hey {{a.b}}', { a { b: 'rob' }} => 'hey rob'\n * - 'hey {{not.exists}}', {} => 'hey '\n */\nconst applyTemplates = (\n text: string,\n screenState?: Record<string, any>,\n handleMarkdown?: boolean,\n): string =>\n text.replace(/{{(.+?)}}/g, (_, match) =>\n handleMarkdown\n ? escapeMarkdown(getByPath(screenState, match))\n : getByPath(screenState, match),\n );\n\n/**\n * Replace the templates of content of inner text/link elements with screen state data\n */\nconst replaceElementTemplates = (\n baseEle: DocumentFragment,\n screenState?: Record<string, any>,\n) => {\n const eleList = baseEle.querySelectorAll(\n 'descope-text,descope-link,descope-enriched-text,descope-code-snippet',\n );\n eleList.forEach((inEle: HTMLElement) => {\n const handleMarkdown = shouldHandleMarkdown(inEle.localName);\n // eslint-disable-next-line no-param-reassign\n inEle.textContent = applyTemplates(\n inEle.textContent,\n screenState,\n handleMarkdown,\n );\n const href = inEle.getAttribute('href');\n if (href) {\n inEle.setAttribute('href', applyTemplates(href, screenState));\n }\n });\n};\n\nconst replaceTemplateDynamicAttrValues = (\n baseEle: DocumentFragment,\n screenState?: Record<string, any>,\n) => {\n const eleList = baseEle.querySelectorAll(`[${HAS_DYNAMIC_VALUES_ATTR_NAME}]`);\n eleList.forEach((ele: HTMLElement) => {\n Array.from(ele.attributes).forEach((attr) => {\n // eslint-disable-next-line no-param-reassign\n attr.value = applyTemplates(attr.value, screenState);\n });\n });\n};\n\nconst replaceHrefByDataType = (\n baseEle: DocumentFragment,\n dataType: string,\n provisionUrl?: string,\n) => {\n const eleList = baseEle.querySelectorAll(\n `[${ELEMENT_TYPE_ATTRIBUTE}=\"${dataType}\"]`,\n );\n eleList.forEach((ele: HTMLLinkElement) => {\n // eslint-disable-next-line no-param-reassign\n ele.setAttribute('href', provisionUrl);\n });\n};\n\nconst setFormConfigValues = (\n baseEle: DocumentFragment,\n formData: Record<string, string>,\n) => {\n Object.entries(formData).forEach(([name, config]) => {\n const eles = baseEle.querySelectorAll(`[name=\"${name}\"]`);\n\n eles.forEach((ele) => {\n Object.entries(config).forEach(([attrName, attrValue]) => {\n if (ALLOWED_INPUT_CONFIG_ATTRS.includes(attrName)) {\n ele.setAttribute(attrName, attrValue);\n }\n });\n });\n });\n};\n\nexport const setCssVars = (\n rootEle: HTMLElement,\n nextPageTemplate: DocumentFragment,\n cssVars: CssVars,\n logger: {\n error: (message: string, description: string) => void;\n info: (message: string, description: string) => void;\n debug: (message: string, description: string) => void;\n },\n) => {\n if (!cssVars) {\n return;\n }\n\n Object.keys(cssVars).forEach((componentName) => {\n if (!nextPageTemplate.querySelector(componentName)) {\n logger.debug(\n `Skipping css vars for component \"${componentName}\"`,\n `Got css vars for component ${componentName} but Could not find it on next page`,\n );\n\n return;\n }\n const componentClass:\n | (CustomElementConstructor & { cssVarList: CssVars })\n | undefined = customElements.get(componentName) as any;\n\n if (!componentClass) {\n logger.debug(\n `Could not find component class for ${componentName}`,\n 'Check if the component is registered',\n );\n\n return;\n }\n\n Object.keys(cssVars[componentName]).forEach((cssVarKey) => {\n const componentCssVars = cssVars[componentName];\n const varName = componentClass?.cssVarList?.[cssVarKey];\n\n if (!varName) {\n logger.info(\n `Could not find css variable name for ${cssVarKey} in ${componentName}`,\n 'Check if the css variable is defined in the component',\n );\n return;\n }\n\n const value = componentCssVars[cssVarKey];\n\n rootEle.style.setProperty(varName, value);\n });\n });\n};\n\nconst setElementConfig = (\n baseEle: DocumentFragment,\n componentsConfig: ComponentsConfig,\n logger?: { error: (message: string, description: string) => void },\n) => {\n if (!componentsConfig) {\n return;\n }\n const { componentsDynamicAttrs, ...rest } = componentsConfig;\n\n const configMap = Object.keys(rest).reduce((acc, componentName) => {\n acc[`[name=${componentName}]`] = rest[componentName];\n return acc;\n }, {});\n\n if (componentsDynamicAttrs) {\n Object.keys(componentsDynamicAttrs).forEach((componentSelector) => {\n const componentDynamicAttrs = componentsDynamicAttrs[componentSelector];\n if (componentDynamicAttrs) {\n const { attributes } = componentDynamicAttrs;\n if (attributes && Object.keys(attributes).length) {\n configMap[componentSelector] = attributes;\n }\n }\n });\n }\n\n // collect components that needs configuration from DOM\n Object.keys(configMap).forEach((componentsSelector) => {\n baseEle.querySelectorAll(componentsSelector).forEach((comp) => {\n const config = configMap[componentsSelector];\n\n Object.keys(config).forEach((attr) => {\n let value = config[attr];\n\n if (typeof value !== 'string') {\n try {\n value = JSON.stringify(value);\n } catch (e) {\n logger.error(\n `Could not stringify value \"${value}\" for \"${attr}\"`,\n e.message,\n );\n value = '';\n }\n }\n\n comp.setAttribute(attr, value);\n });\n });\n });\n};\n\nconst setImageVariable = (\n rootEle: HTMLElement,\n name: string,\n image?: string,\n) => {\n const imageVarName = (\n customElements.get(name) as CustomElementConstructor & {\n cssVarList: Record<string, string>;\n }\n )?.cssVarList.url;\n\n if (image && imageVarName) {\n rootEle?.style?.setProperty(\n imageVarName,\n `url(data:image/jpg;base64,${image})`,\n );\n }\n};\n\n/**\n * Update a screen template based on the screen state\n * - Show/hide error messages\n * - Replace element templates ({{...}} syntax) with screen state object\n */\nexport const updateTemplateFromScreenState = (\n baseEle: DocumentFragment,\n screenState?: ScreenState,\n componentsConfig?: ComponentsConfig,\n flowInputs?: Record<string, string>,\n logger?: { error: (message: string, description: string) => void },\n) => {\n replaceHrefByDataType(baseEle, 'totp-link', screenState?.totp?.provisionUrl);\n replaceHrefByDataType(baseEle, 'notp-link', screenState?.notp?.redirectUrl);\n replaceElementTemplates(baseEle, screenState);\n setElementConfig(baseEle, componentsConfig, logger);\n replaceTemplateDynamicAttrValues(baseEle, screenState);\n setFormConfigValues(baseEle, flowInputs);\n};\n\n/**\n * Update a screen based on a screen state\n * - Replace values of element inputs with screen state's inputs\n */\nexport const updateScreenFromScreenState = (\n baseEle: HTMLElement,\n screenState?: ScreenState,\n) => {\n replaceElementInputs(baseEle, screenState?.inputs);\n replaceElementInputs(baseEle, screenState?.form);\n};\n\nexport const setTOTPVariable = (rootEle: HTMLElement, image?: string) => {\n setImageVariable(rootEle, 'descope-totp-image', image);\n};\n\nexport const setNOTPVariable = (rootEle: HTMLElement, image?: string) => {\n setImageVariable(rootEle, 'descope-notp-image', image);\n};\n\nexport const setPhoneAutoDetectDefaultCode = (\n fragment: DocumentFragment,\n autoDetectCode?: string,\n) => {\n Array.from(fragment.querySelectorAll('[default-code=\"autoDetect\"]')).forEach(\n (phoneEle) => {\n phoneEle.setAttribute('default-code', autoDetectCode);\n },\n );\n};\n\nexport const disableWebauthnButtons = (fragment: DocumentFragment) => {\n const webauthnButtons = fragment.querySelectorAll(\n `descope-button[${ELEMENT_TYPE_ATTRIBUTE}=\"biometrics\"]`,\n );\n webauthnButtons.forEach((button) => button.setAttribute('disabled', 'true'));\n};\n\nexport const getDescopeUiComponentsList = (clone: DocumentFragment) => [\n ...Array.from(clone.querySelectorAll('*')).reduce<Set<string>>(\n (acc, el: HTMLElement) =>\n el.tagName.startsWith('DESCOPE-')\n ? acc.add(el.tagName.toLocaleLowerCase())\n : acc,\n new Set(),\n ),\n];\n"],"names":["ALLOWED_INPUT_CONFIG_ATTRS","replaceElementMessage","baseEle","eleType","message","querySelectorAll","ELEMENT_TYPE_ATTRIBUTE","forEach","ele","textContent","classList","replaceElementInputs","screenInputs","Object","entries","name","value","Array","from","DESCOPE_ATTRIBUTE_EXCLUDE_FIELD","inputEle","getByPath","obj","path","split","reduce","prev","next","applyTemplates","text","screenState","handleMarkdown","replace","_","match","escapeMarkdown","replaceHrefByDataType","dataType","provisionUrl","setAttribute","setCssVars","rootEle","nextPageTemplate","cssVars","logger","keys","componentName","querySelector","debug","componentClass","customElements","get","cssVarKey","componentCssVars","varName","_a","cssVarList","info","style","setProperty","setImageVariable","image","imageVarName","url","_b","updateTemplateFromScreenState","componentsConfig","flowInputs","totp","notp","redirectUrl","inEle","shouldHandleMarkdown","localName","href","getAttribute","replaceElementTemplates","componentsDynamicAttrs","rest","__rest","configMap","acc","componentSelector","componentDynamicAttrs","attributes","length","componentsSelector","comp","config","attr","JSON","stringify","e","error","setElementConfig","HAS_DYNAMIC_VALUES_ATTR_NAME","replaceTemplateDynamicAttrValues","formData","attrName","attrValue","includes","setFormConfigValues","updateScreenFromScreenState","inputs","form","setTOTPVariable","setNOTPVariable","setPhoneAutoDetectDefaultCode","fragment","autoDetectCode","phoneEle","disableWebauthnButtons","button"],"mappings":"mRASA,MAAMA,EAA6B,CAAC,YAEvBC,EAAwB,CACnCC,EACAC,EACAC,EAAU,MAEMF,EAAQG,iBACtB,IAAIC,MAA2BH,OAEzBI,SAASC,IAEfA,EAAIC,YAAcL,EAClBI,EAAIE,UAAUN,EAAU,SAAW,OAAO,OAAO,GACjD,EAQEO,EAAuB,CAC3BT,EACAU,KAEAC,OAAOC,QAAQF,GAAgB,CAAE,GAAEL,SAAQ,EAAEQ,EAAMC,MAChCC,MAAMC,KACrBhB,EAAQG,iBACN,WAAWU,YAAeI,QAGrBZ,SAASa,IAEhBA,EAASJ,MAAQA,CAAK,GACtB,GACF,EASEK,EAAY,CAACC,EAA0BC,IAC3CA,EAAKC,MAAM,KAAKC,QAAO,CAACC,EAAMC,KAASD,aAAI,EAAJA,EAAOC,KAAS,IAAIL,GAQvDM,EAAiB,CACrBC,EACAC,EACAC,IAEAF,EAAKG,QAAQ,cAAc,CAACC,EAAGC,IAC7BH,EACII,EAAed,EAAUS,EAAaI,IACtCb,EAAUS,EAAaI,KAyCzBE,EAAwB,CAC5BlC,EACAmC,EACAC,KAEgBpC,EAAQG,iBACtB,IAAIC,MAA2B+B,OAEzB9B,SAASC,IAEfA,EAAI+B,aAAa,OAAQD,EAAa,GACtC,EAoBSE,EAAa,CACxBC,EACAC,EACAC,EACAC,KAMKD,GAIL9B,OAAOgC,KAAKF,GAASpC,SAASuC,IAC5B,IAAKJ,EAAiBK,cAAcD,GAMlC,YALAF,EAAOI,MACL,oCAAoCF,KACpC,8BAA8BA,wCAKlC,MAAMG,EAEUC,eAAeC,IAAIL,GAE9BG,EASLpC,OAAOgC,KAAKF,EAAQG,IAAgBvC,SAAS6C,UAC3C,MAAMC,EAAmBV,EAAQG,GAC3BQ,EAAuC,QAA7BC,EAAAN,aAAA,EAAAA,EAAgBO,kBAAa,IAAAD,OAAA,EAAAA,EAAAH,GAE7C,IAAKE,EAKH,YAJAV,EAAOa,KACL,wCAAwCL,QAAgBN,IACxD,yDAKJ,MAAM9B,EAAQqC,EAAiBD,GAE/BX,EAAQiB,MAAMC,YAAYL,EAAStC,EAAM,IAtBzC4B,EAAOI,MACL,sCAAsCF,IACtC,uCAqBF,GACF,EAwDEc,EAAmB,CACvBnB,EACA1B,EACA8C,aAEA,MAAMC,EAIL,QAHCP,EAAAL,eAAeC,IAAIpC,UAGpB,IAAAwC,OAAA,EAAAA,EAAEC,WAAWO,IAEVF,GAASC,IACG,QAAdE,EAAAvB,aAAA,EAAAA,EAASiB,aAAK,IAAAM,GAAAA,EAAEL,YACdG,EACA,6BAA6BD,MAEhC,EAQUI,EAAgC,CAC3C/D,EACA4B,EACAoC,EACAC,EACAvB,aAEAR,EAAsBlC,EAAS,YAAgC,UAAnB4B,aAAW,EAAXA,EAAasC,YAAM,IAAAb,OAAA,EAAAA,EAAAjB,cAC/DF,EAAsBlC,EAAS,YAAgC,UAAnB4B,aAAW,EAAXA,EAAauC,YAAM,IAAAL,OAAA,EAAAA,EAAAM,aA9MjC,EAC9BpE,EACA4B,KAEgB5B,EAAQG,iBACtB,wEAEME,SAASgE,IACf,MAAMxC,EAAiByC,EAAqBD,EAAME,WAElDF,EAAM9D,YAAcmB,EAClB2C,EAAM9D,YACNqB,EACAC,GAEF,MAAM2C,EAAOH,EAAMI,aAAa,QAC5BD,GACFH,EAAMhC,aAAa,OAAQX,EAAe8C,EAAM5C,GACjD,GACD,EA4LF8C,CAAwB1E,EAAS4B,GAtFV,EACvB5B,EACAgE,EACAtB,KAEA,IAAKsB,EACH,OAEF,MAAMW,uBAAEA,GAAoCX,EAATY,EAAIC,EAAKb,EAAtC,CAAmC,2BAEnCc,EAAYnE,OAAOgC,KAAKiC,GAAMrD,QAAO,CAACwD,EAAKnC,KAC/CmC,EAAI,SAASnC,MAAoBgC,EAAKhC,GAC/BmC,IACN,CAAE,GAEDJ,GACFhE,OAAOgC,KAAKgC,GAAwBtE,SAAS2E,IAC3C,MAAMC,EAAwBN,EAAuBK,GACrD,GAAIC,EAAuB,CACzB,MAAMC,WAAEA,GAAeD,EACnBC,GAAcvE,OAAOgC,KAAKuC,GAAYC,SACxCL,EAAUE,GAAqBE,EAElC,KAKLvE,OAAOgC,KAAKmC,GAAWzE,SAAS+E,IAC9BpF,EAAQG,iBAAiBiF,GAAoB/E,SAASgF,IACpD,MAAMC,EAASR,EAAUM,GAEzBzE,OAAOgC,KAAK2C,GAAQjF,SAASkF,IAC3B,IAAIzE,EAAQwE,EAAOC,GAEnB,GAAqB,iBAAVzE,EACT,IACEA,EAAQ0E,KAAKC,UAAU3E,EACxB,CAAC,MAAO4E,GACPhD,EAAOiD,MACL,8BAA8B7E,WAAeyE,KAC7CG,EAAExF,SAEJY,EAAQ,EACT,CAGHuE,EAAKhD,aAAakD,EAAMzE,EAAM,GAC9B,GACF,GACF,EAqCF8E,CAAiB5F,EAASgE,EAAkBtB,GA1LL,EACvC1C,EACA4B,KAEgB5B,EAAQG,iBAAiB,IAAI0F,MACrCxF,SAASC,IACfS,MAAMC,KAAKV,EAAI4E,YAAY7E,SAASkF,IAElCA,EAAKzE,MAAQY,EAAe6D,EAAKzE,MAAOc,EAAY,GACpD,GACF,EAiLFkE,CAAiC9F,EAAS4B,GAhKhB,EAC1B5B,EACA+F,KAEApF,OAAOC,QAAQmF,GAAU1F,SAAQ,EAAEQ,EAAMyE,MAC1BtF,EAAQG,iBAAiB,UAAUU,OAE3CR,SAASC,IACZK,OAAOC,QAAQ0E,GAAQjF,SAAQ,EAAE2F,EAAUC,MACrCnG,EAA2BoG,SAASF,IACtC1F,EAAI+B,aAAa2D,EAAUC,EAC5B,GACD,GACF,GACF,EAmJFE,CAAoBnG,EAASiE,EAAW,EAO7BmC,EAA8B,CACzCpG,EACA4B,KAEAnB,EAAqBT,EAAS4B,aAAW,EAAXA,EAAayE,QAC3C5F,EAAqBT,EAAS4B,aAAW,EAAXA,EAAa0E,KAAK,EAGrCC,EAAkB,CAAChE,EAAsBoB,KACpDD,EAAiBnB,EAAS,qBAAsBoB,EAAM,EAG3C6C,EAAkB,CAACjE,EAAsBoB,KACpDD,EAAiBnB,EAAS,qBAAsBoB,EAAM,EAG3C8C,EAAgC,CAC3CC,EACAC,KAEA5F,MAAMC,KAAK0F,EAASvG,iBAAiB,gCAAgCE,SAClEuG,IACCA,EAASvE,aAAa,eAAgBsE,EAAe,GAExD,EAGUE,EAA0BH,IACbA,EAASvG,iBAC/B,kBAAkBC,mBAEJC,SAASyG,GAAWA,EAAOzE,aAAa,WAAY,SAAQ"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1722,6 +1722,7 @@ declare class BaseDescopeWc extends BaseClass {
|
|
|
1722
1722
|
};
|
|
1723
1723
|
get outboundAppId(): string;
|
|
1724
1724
|
get outboundAppScopes(): any;
|
|
1725
|
+
get popupOrigin(): string | null;
|
|
1725
1726
|
get customStorage(): CustomStorage | undefined;
|
|
1726
1727
|
set customStorage(storage: CustomStorage | undefined);
|
|
1727
1728
|
getConfig: () => Promise<_descope_sdk_mixins_static_resources_mixin.Config | {
|
|
@@ -1785,6 +1786,7 @@ declare class DescopeWc extends BaseDescopeWc {
|
|
|
1785
1786
|
handleRedirect: (redirectTo: string) => void;
|
|
1786
1787
|
onStepChange(currentState: StepState, prevState: StepState): Promise<void>;
|
|
1787
1788
|
getInputs(): HTMLInputElement[];
|
|
1789
|
+
protected shouldUsePopupPostMessage(): boolean;
|
|
1788
1790
|
}
|
|
1789
1791
|
|
|
1790
1792
|
type ILogger = Partial<DescopeWc['logger']>;
|