@descope/web-components-ui 1.53.0 → 1.54.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.
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunk_descope_web_components_ui=self.webpackChunk_descope_web_components_ui||[]).push([[2996],{10777:(e,t,i)=>{i.d(t,{T:()=>d,w:()=>g});var s=i(79365),r=i(81365),a=i(9696),o=i(97810),l=i(88191),n=i(25964);const d=(0,o.xE)("policy-validation"),c=["data","active-policies","overrides","data-password-policy-value-minlength","data-password-policy-value-passwordstrength","data-password-policy-actual-passwordstrength"],p=["label","value",...c];class h extends((0,r.q)({componentName:d,baseSelector:":host > div"})){#e;#t=[];#i;static get observedAttributes(){return p}constructor(){super(),this.attachShadow({mode:"open"}).innerHTML='\n <div>\n <div class="label"></div>\n <ul></ul>\n </div>\n\t\t',(0,n.fz)("\n :host > div {\n width: 100%;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n }\n .label {\n max-width: 100%;\n text-wrap: wrap;\n overflow-wrap: break-word;\n }\n .hide-label .label {\n display: none;\n }\n ul {\n display: flex;\n flex-direction: column;\n padding: 0;\n margin: 0;\n }\n ul, li {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n li::before {\n display: inline-block;\n width: 1em;\n text-align: center;\n }\n ",this),this.panel=this.shadowRoot.querySelector(":host > div"),this.label=this.shadowRoot.querySelector(".label"),this.list=this.shadowRoot.querySelector("ul")}attributeChangedCallback(e,t,i){if(super.attributeChangedCallback?.(e,t,i),t!==i){if("label"===e&&this.updateLabel(i),c.includes(e)){if("data"===e)try{this.availablePolicies=JSON.parse(i)}catch{console.error("Failed to set available policies")}if("active-policies"===e&&(this.#t=(i||"").split(",")),"data-password-policy-value-minlength"===e){const e=Number(i);!Number.isNaN(e)&&e>0&&(this.#i={...this.#i,minlength:{value:`${e}`}})}if("data-password-policy-value-passwordstrength"===e){const e=parseInt(i);!Number.isNaN(e)&&e>0&&(this.#i={...this.#i,passwordstrength:{...this.#i?.passwordstrength,expected:e}})}if("data-password-policy-actual-passwordstrength"===e){const e=Number(i);!Number.isNaN(e)&&e>0&&(this.#i={...this.#i,passwordstrength:{...this.#i?.passwordstrength,actual:e}})}}this.renderItems(this.#e,this.#t,this.#i)}}get availablePolicies(){return this.#e||[]}set availablePolicies(e){this.#e=e}get value(){return this.getAttribute("value")||""}getStrengthScore(){return this.value.length}compareValues(e,t,i){switch(e.toUpperCase()){case"GTE":return i>=t;case"GT":return i>t;case"LTE":return i<=t;case"LT":return i<t;case"EQ":return i===t;case"NEQ":return i!==t;default:throw new Error(`Invalid comparison type: ${e}`)}}validate(){let e=this.#e;return this.#i&&(e=this.#e.map((e=>{const t=this.#i[e.id];return t?{...e,data:t}:e}))),this.#t.reduce(((t,i)=>{const s=e.find((e=>e.id===i));if(!s)return t;const{pattern:r,message:a,data:o,compare:n}=s;if(!r&&!n||!a)return t;const d={message:(0,l.z)(a,o),id:i};if(r){const e=new RegExp((0,l.z)(r,o));d.valid=e.test(this.value)}else n&&(d.valid=this.compareValues(n,o.expected,o.actual));return t.push(d),t}),[])}get isValid(){return!this.validate().some((({valid:e})=>!1===e))}getValidationItemTemplate({valid:e,message:t}){return`\n <li class="item" data-valid="${this.value?e:"none"}">\n <span class="message">${t}</span>\n </li>\n `}renderItems(e,t){e&&t.length&&(this.list.innerHTML=this.validate().map(this.getValidationItemTemplate.bind(this)).join(""))}updateLabel(e){e?(this.label.textContent=e,this.classList.remove("hide-label")):(this.classList.add("hide-label"),this.label.textContent="")}}const{host:u,item:b,symbolDefault:m,symbolSuccess:v,symbolError:y}={host:{selector:()=>":host > div"},item:{selector:()=>".item"},symbolDefault:{selector:()=>'.item[data-valid="none"]::before'},symbolSuccess:{selector:()=>'.item[data-valid="true"]::before'},symbolError:{selector:()=>'.item[data-valid="false"]::before'}},g=(0,a.Zz)((0,s.RF)({componentNameOverride:(0,o.xE)("input-wrapper")}),(0,s.RF)({mappings:{hostDirection:{selector:()=>":host",property:"direction"},fontSize:{},fontFamily:{},padding:{},borderWidth:{...u,property:"border-width"},borderStyle:{...u,property:"border-style"},borderColor:{...u,property:"border-color"},borderRadius:{...u,property:"border-radius"},backgroundColor:{...u,property:"background-color"},textColor:{property:"color"},labelMargin:{...u,property:"gap"},itemsSpacing:{...b,property:"line-height"},itemSymbolSuccessColor:{...v,property:"color"},itemSymbolErrorColor:{...y,property:"color"},itemSymbolDefault:{...m,property:"content"},itemSymbolSuccess:{...v,property:"content"},itemSymbolError:{...y,property:"content"}}}),s.VO,s.tQ)(h)},26782:(e,t,i)=>{i.r(t),i.d(t,{PolicyValidationClass:()=>s.w,componentName:()=>s.T});var s=i(10777);customElements.define(s.T,s.w)},88191:(e,t,i)=>{i.d(t,{z:()=>s});const s=(e,t)=>e.replace(/{{(\w+)+}}/g,((e,i)=>t?.[i]||e))}}]);
1
+ "use strict";(self.webpackChunk_descope_web_components_ui=self.webpackChunk_descope_web_components_ui||[]).push([[2996],{10777:(e,t,i)=>{i.d(t,{T:()=>d,w:()=>g});var s=i(79365),r=i(81365),a=i(9696),o=i(97810),l=i(88191),n=i(25964);const d=(0,o.xE)("policy-validation"),c=["data","active-policies","overrides","data-password-policy-value-minlength","data-password-policy-value-passwordstrength","data-password-policy-actual-passwordstrength"],p=["label","value",...c];class h extends((0,r.q)({componentName:d,baseSelector:":host > div"})){#e;#t=[];#i;static get observedAttributes(){return p}constructor(){super(),this.attachShadow({mode:"open"}).innerHTML='\n <div>\n <div class="label"></div>\n <ul></ul>\n </div>\n\t\t',(0,n.fz)("\n :host > div {\n width: 100%;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n }\n .label {\n max-width: 100%;\n text-wrap: wrap;\n overflow-wrap: break-word;\n }\n .hide-label .label {\n display: none;\n }\n ul {\n display: flex;\n flex-direction: column;\n padding: 0;\n margin: 0;\n }\n ul, li {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n li::before {\n display: inline-block;\n width: 1em;\n text-align: center;\n }\n ",this),this.panel=this.shadowRoot.querySelector(":host > div"),this.label=this.shadowRoot.querySelector(".label"),this.list=this.shadowRoot.querySelector("ul")}attributeChangedCallback(e,t,i){if(super.attributeChangedCallback?.(e,t,i),t!==i){if("label"===e&&this.updateLabel(i),c.includes(e)){if("data"===e)try{this.availablePolicies=JSON.parse(i)}catch{console.error("Failed to set available policies")}if("active-policies"===e&&(this.#t=(i||"").split(",")),"data-password-policy-value-minlength"===e){const e=Number(i);!Number.isNaN(e)&&e>0&&(this.#i={...this.#i,minlength:{value:`${e}`}})}if("data-password-policy-value-passwordstrength"===e){const e=parseInt(i);!Number.isNaN(e)&&e>=0&&(this.#i={...this.#i,passwordstrength:{...this.#i?.passwordstrength,expected:e}})}if("data-password-policy-actual-passwordstrength"===e){const e=Number(i);!Number.isNaN(e)&&e>=0&&(this.#i={...this.#i,passwordstrength:{...this.#i?.passwordstrength,actual:e}})}}this.renderItems(this.#e,this.#t,this.#i)}}get availablePolicies(){return this.#e||[]}set availablePolicies(e){this.#e=e}get value(){return this.getAttribute("value")||""}getStrengthScore(){return this.value.length}compareValues(e,t,i){switch(e.toUpperCase()){case"GTE":return i>=t;case"GT":return i>t;case"LTE":return i<=t;case"LT":return i<t;case"EQ":return i===t;case"NEQ":return i!==t;default:throw new Error(`Invalid comparison type: ${e}`)}}validate(){let e=this.#e;return this.#i&&(e=this.#e.map((e=>{const t=this.#i[e.id];return t?{...e,data:t}:e}))),this.#t.reduce(((t,i)=>{const s=e.find((e=>e.id===i));if(!s)return t;const{pattern:r,message:a,data:o,compare:n}=s;if(!r&&!n||!a)return t;const d={message:(0,l.z)(a,o),id:i};if(r){const e=new RegExp((0,l.z)(r,o));d.valid=e.test(this.value)}else n&&(d.valid=this.compareValues(n,o?.expected??-1,o?.actual??-1));return t.push(d),t}),[])}get isValid(){return!this.validate().some((({valid:e})=>!1===e))}getValidationItemTemplate({valid:e,message:t}){return`\n <li class="item" data-valid="${this.value?e:"none"}">\n <span class="message">${t}</span>\n </li>\n `}renderItems(e,t){e&&t.length&&(this.list.innerHTML=this.validate().map(this.getValidationItemTemplate.bind(this)).join(""))}updateLabel(e){e?(this.label.textContent=e,this.classList.remove("hide-label")):(this.classList.add("hide-label"),this.label.textContent="")}}const{host:u,item:b,symbolDefault:m,symbolSuccess:v,symbolError:y}={host:{selector:()=>":host > div"},item:{selector:()=>".item"},symbolDefault:{selector:()=>'.item[data-valid="none"]::before'},symbolSuccess:{selector:()=>'.item[data-valid="true"]::before'},symbolError:{selector:()=>'.item[data-valid="false"]::before'}},g=(0,a.Zz)((0,s.RF)({componentNameOverride:(0,o.xE)("input-wrapper")}),(0,s.RF)({mappings:{hostDirection:{selector:()=>":host",property:"direction"},fontSize:{},fontFamily:{},padding:{},borderWidth:{...u,property:"border-width"},borderStyle:{...u,property:"border-style"},borderColor:{...u,property:"border-color"},borderRadius:{...u,property:"border-radius"},backgroundColor:{...u,property:"background-color"},textColor:{property:"color"},labelMargin:{...u,property:"gap"},itemsSpacing:{...b,property:"line-height"},itemSymbolSuccessColor:{...v,property:"color"},itemSymbolErrorColor:{...y,property:"color"},itemSymbolDefault:{...m,property:"content"},itemSymbolSuccess:{...v,property:"content"},itemSymbolError:{...y,property:"content"}}}),s.VO,s.tQ)(h)},26782:(e,t,i)=>{i.r(t),i.d(t,{PolicyValidationClass:()=>s.w,componentName:()=>s.T});var s=i(10777);customElements.define(s.T,s.w)},88191:(e,t,i)=>{i.d(t,{z:()=>s});const s=(e,t)=>e.replace(/{{(\w+)+}}/g,((e,i)=>t?.[i]||e))}}]);
2
2
  //# sourceMappingURL=descope-policy-validation-index-js.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"descope-policy-validation-index-js.js","mappings":"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","sources":["webpack://@descope/web-components-ui/./src/components/descope-policy-validation/PolicyValidationClass.js","webpack://@descope/web-components-ui/./src/components/descope-policy-validation/index.js","webpack://@descope/web-components-ui/./src/components/descope-policy-validation/helpers.js"],"sourcesContent":["// eslint-disable-next-line max-classes-per-file\nimport { createStyleMixin, draggableMixin, componentNameValidationMixin } from '../../mixins';\nimport { createBaseClass } from '../../baseClasses/createBaseClass';\nimport { compose } from '../../helpers';\nimport { getComponentName } from '../../helpers/componentHelpers';\nimport { interpolateString } from './helpers';\nimport { injectStyle } from '@descope-ui/common/components-helpers';\n\nexport const componentName = getComponentName('policy-validation');\n\nconst overrideAttrs = [\n 'data-password-policy-value-minlength',\n 'data-password-policy-value-passwordstrength',\n 'data-password-policy-actual-passwordstrength',\n];\nconst dataAttrs = ['data', 'active-policies', 'overrides', ...overrideAttrs];\nconst policyAttrs = ['label', 'value', ...dataAttrs];\n\nclass RawPolicyValidation extends createBaseClass({ componentName, baseSelector: ':host > div' }) {\n #availablePolicies;\n\n #activePolicies = [];\n\n #overrides;\n\n static get observedAttributes() {\n return policyAttrs;\n }\n\n constructor() {\n super();\n\n this.attachShadow({ mode: 'open' }).innerHTML = `\n <div>\n <div class=\"label\"></div>\n <ul></ul>\n </div>\n\t\t`;\n\n injectStyle(\n `\n :host > div {\n width: 100%;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n }\n .label {\n max-width: 100%;\n text-wrap: wrap;\n overflow-wrap: break-word;\n }\n .hide-label .label {\n display: none;\n }\n ul {\n display: flex;\n flex-direction: column;\n padding: 0;\n margin: 0;\n }\n ul, li {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n li::before {\n display: inline-block;\n width: 1em;\n text-align: center;\n }\n `,\n this\n );\n\n this.panel = this.shadowRoot.querySelector(':host > div');\n this.label = this.shadowRoot.querySelector('.label');\n this.list = this.shadowRoot.querySelector('ul');\n }\n\n attributeChangedCallback(attrName, oldValue, newValue) {\n super.attributeChangedCallback?.(attrName, oldValue, newValue);\n if (oldValue !== newValue) {\n if (attrName === 'label') {\n this.updateLabel(newValue);\n }\n\n // we're don't know the order in which the attributes are forwarded, so we're trying to render every time\n // once `data` and `active-policies` are populated, the render will be executed.\n // once the `overrides` object is updated, we want to re-render the panel.\n if (dataAttrs.includes(attrName)) {\n if (attrName === 'data') {\n try {\n this.availablePolicies = JSON.parse(newValue);\n } catch {\n // eslint-disable-next-line no-console\n console.error('Failed to set available policies');\n }\n }\n if (attrName === 'active-policies') {\n this.#activePolicies = (newValue || '').split(',');\n }\n\n if (attrName === 'data-password-policy-value-minlength') {\n const ln = Number(newValue);\n if (!Number.isNaN(ln) && ln > 0) {\n this.#overrides = { ...this.#overrides, minlength: { value: `${ln}` } };\n }\n }\n\n if (attrName === 'data-password-policy-value-passwordstrength') {\n const passwordStrength = parseInt(newValue);\n if (!Number.isNaN(passwordStrength) && passwordStrength > 0) {\n this.#overrides = {\n ...this.#overrides,\n passwordstrength: {\n ...this.#overrides?.passwordstrength,\n expected: passwordStrength,\n },\n };\n }\n }\n\n if (attrName === 'data-password-policy-actual-passwordstrength') {\n const ln = Number(newValue);\n if (!Number.isNaN(ln) && ln > 0) {\n this.#overrides = {\n ...this.#overrides,\n passwordstrength: { ...this.#overrides?.passwordstrength, actual: ln },\n };\n }\n }\n }\n\n this.renderItems(this.#availablePolicies, this.#activePolicies, this.#overrides);\n }\n }\n\n get availablePolicies() {\n return this.#availablePolicies || [];\n }\n\n set availablePolicies(val) {\n this.#availablePolicies = val;\n }\n\n get value() {\n return this.getAttribute('value') || '';\n }\n\n getStrengthScore() {\n return this.value.length;\n }\n\n compareValues(comparison, expected, actual) {\n switch (comparison.toUpperCase()) {\n case 'GTE': // Greater than or equal to\n return actual >= expected;\n case 'GT': // Greater than\n return actual > expected;\n case 'LTE': // Less than or equal to\n return actual <= expected;\n case 'LT': // Less than\n return actual < expected;\n case 'EQ': // Equal to\n return actual === expected;\n case 'NEQ': // Not equal to\n return actual !== expected;\n default:\n throw new Error(`Invalid comparison type: ${comparison}`);\n }\n }\n\n validate() {\n let policies = this.#availablePolicies;\n\n if (this.#overrides) {\n policies = this.#availablePolicies.map((policy) => {\n const data = this.#overrides[policy.id];\n\n if (!data) return policy;\n\n const res = { ...policy, data };\n\n return res;\n });\n }\n\n return this.#activePolicies.reduce((results, id) => {\n const policy = policies.find((p) => p.id === id);\n\n if (!policy) {\n return results;\n }\n\n const { pattern, message, data, compare } = policy;\n\n if ((!pattern && !compare) || !message) {\n return results;\n }\n\n const validationResult = {\n message: interpolateString(message, data),\n id,\n };\n\n if (pattern) {\n const exp = new RegExp(interpolateString(pattern, data));\n validationResult.valid = exp.test(this.value);\n } else if (compare) {\n validationResult.valid = this.compareValues(compare, data.expected, data.actual);\n }\n\n results.push(validationResult);\n\n return results;\n }, []);\n }\n\n get isValid() {\n return !this.validate().some(({ valid }) => valid === false);\n }\n\n getValidationItemTemplate({ valid, message }) {\n const status = !this.value ? 'none' : valid;\n return `\n <li class=\"item\" data-valid=\"${status}\">\n <span class=\"message\">${message}</span>\n </li>\n `;\n }\n\n renderItems(availablePolicies, activePolicies) {\n if (!availablePolicies || !activePolicies.length) {\n return;\n }\n\n this.list.innerHTML = this.validate().map(this.getValidationItemTemplate.bind(this)).join('');\n }\n\n updateLabel(val) {\n if (!val) {\n this.classList.add('hide-label');\n this.label.textContent = '';\n } else {\n this.label.textContent = val;\n this.classList.remove('hide-label');\n }\n }\n}\n\nconst { host, item, symbolDefault, symbolSuccess, symbolError } = {\n host: { selector: () => ':host > div' },\n item: { selector: () => '.item' },\n symbolDefault: { selector: () => '.item[data-valid=\"none\"]::before' },\n symbolSuccess: { selector: () => '.item[data-valid=\"true\"]::before' },\n symbolError: { selector: () => '.item[data-valid=\"false\"]::before' },\n};\n\nexport const PolicyValidationClass = compose(\n createStyleMixin({ componentNameOverride: getComponentName('input-wrapper') }),\n createStyleMixin({\n mappings: {\n hostDirection: { selector: () => ':host', property: 'direction' },\n fontSize: {},\n fontFamily: {},\n padding: {},\n borderWidth: { ...host, property: 'border-width' },\n borderStyle: { ...host, property: 'border-style' },\n borderColor: { ...host, property: 'border-color' },\n borderRadius: { ...host, property: 'border-radius' },\n backgroundColor: { ...host, property: 'background-color' },\n textColor: { property: 'color' },\n labelMargin: { ...host, property: 'gap' },\n itemsSpacing: { ...item, property: 'line-height' },\n itemSymbolSuccessColor: { ...symbolSuccess, property: 'color' },\n itemSymbolErrorColor: { ...symbolError, property: 'color' },\n itemSymbolDefault: { ...symbolDefault, property: 'content' },\n itemSymbolSuccess: { ...symbolSuccess, property: 'content' },\n itemSymbolError: { ...symbolError, property: 'content' },\n },\n }),\n draggableMixin,\n componentNameValidationMixin\n)(RawPolicyValidation);\n","import { componentName, PolicyValidationClass } from './PolicyValidationClass';\n\ncustomElements.define(componentName, PolicyValidationClass);\n\nexport { PolicyValidationClass, componentName };\n","export const interpolateString = (template, values) =>\n template.replace(/{{(\\w+)+}}/g, (match, key) => values?.[key] || match);\n"],"names":["componentName","dataAttrs","policyAttrs","RawPolicyValidation","baseSelector","observedAttributes","constructor","super","this","attachShadow","mode","innerHTML","panel","shadowRoot","querySelector","label","list","attributeChangedCallback","attrName","oldValue","newValue","updateLabel","includes","availablePolicies","JSON","parse","console","error","split","ln","Number","isNaN","minlength","value","passwordStrength","parseInt","passwordstrength","expected","actual","renderItems","val","getAttribute","getStrengthScore","length","compareValues","comparison","toUpperCase","Error","validate","policies","map","policy","data","id","reduce","results","find","p","pattern","message","compare","validationResult","exp","RegExp","valid","test","push","isValid","some","getValidationItemTemplate","activePolicies","bind","join","textContent","classList","remove","add","host","item","symbolDefault","symbolSuccess","symbolError","selector","PolicyValidationClass","componentNameOverride","mappings","hostDirection","property","fontSize","fontFamily","padding","borderWidth","borderStyle","borderColor","borderRadius","backgroundColor","textColor","labelMargin","itemsSpacing","itemSymbolSuccessColor","itemSymbolErrorColor","itemSymbolDefault","itemSymbolSuccess","itemSymbolError","customElements","define","interpolateString","template","values","replace","match","key"],"sourceRoot":""}
1
+ {"version":3,"file":"descope-policy-validation-index-js.js","mappings":"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","sources":["webpack://@descope/web-components-ui/./src/components/descope-policy-validation/PolicyValidationClass.js","webpack://@descope/web-components-ui/./src/components/descope-policy-validation/index.js","webpack://@descope/web-components-ui/./src/components/descope-policy-validation/helpers.js"],"sourcesContent":["// eslint-disable-next-line max-classes-per-file\nimport { createStyleMixin, draggableMixin, componentNameValidationMixin } from '../../mixins';\nimport { createBaseClass } from '../../baseClasses/createBaseClass';\nimport { compose } from '../../helpers';\nimport { getComponentName } from '../../helpers/componentHelpers';\nimport { interpolateString } from './helpers';\nimport { injectStyle } from '@descope-ui/common/components-helpers';\n\nexport const componentName = getComponentName('policy-validation');\n\nconst overrideAttrs = [\n 'data-password-policy-value-minlength',\n 'data-password-policy-value-passwordstrength',\n 'data-password-policy-actual-passwordstrength',\n];\nconst dataAttrs = ['data', 'active-policies', 'overrides', ...overrideAttrs];\nconst policyAttrs = ['label', 'value', ...dataAttrs];\n\nclass RawPolicyValidation extends createBaseClass({ componentName, baseSelector: ':host > div' }) {\n #availablePolicies;\n\n #activePolicies = [];\n\n #overrides;\n\n static get observedAttributes() {\n return policyAttrs;\n }\n\n constructor() {\n super();\n\n this.attachShadow({ mode: 'open' }).innerHTML = `\n <div>\n <div class=\"label\"></div>\n <ul></ul>\n </div>\n\t\t`;\n\n injectStyle(\n `\n :host > div {\n width: 100%;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n }\n .label {\n max-width: 100%;\n text-wrap: wrap;\n overflow-wrap: break-word;\n }\n .hide-label .label {\n display: none;\n }\n ul {\n display: flex;\n flex-direction: column;\n padding: 0;\n margin: 0;\n }\n ul, li {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n li::before {\n display: inline-block;\n width: 1em;\n text-align: center;\n }\n `,\n this\n );\n\n this.panel = this.shadowRoot.querySelector(':host > div');\n this.label = this.shadowRoot.querySelector('.label');\n this.list = this.shadowRoot.querySelector('ul');\n }\n\n attributeChangedCallback(attrName, oldValue, newValue) {\n super.attributeChangedCallback?.(attrName, oldValue, newValue);\n if (oldValue !== newValue) {\n if (attrName === 'label') {\n this.updateLabel(newValue);\n }\n\n // we're don't know the order in which the attributes are forwarded, so we're trying to render every time\n // once `data` and `active-policies` are populated, the render will be executed.\n // once the `overrides` object is updated, we want to re-render the panel.\n if (dataAttrs.includes(attrName)) {\n if (attrName === 'data') {\n try {\n this.availablePolicies = JSON.parse(newValue);\n } catch {\n // eslint-disable-next-line no-console\n console.error('Failed to set available policies');\n }\n }\n if (attrName === 'active-policies') {\n this.#activePolicies = (newValue || '').split(',');\n }\n\n if (attrName === 'data-password-policy-value-minlength') {\n const ln = Number(newValue);\n if (!Number.isNaN(ln) && ln > 0) {\n this.#overrides = { ...this.#overrides, minlength: { value: `${ln}` } };\n }\n }\n\n if (attrName === 'data-password-policy-value-passwordstrength') {\n const passwordStrength = parseInt(newValue);\n if (!Number.isNaN(passwordStrength) && passwordStrength >= 0) {\n this.#overrides = {\n ...this.#overrides,\n passwordstrength: {\n ...this.#overrides?.passwordstrength,\n expected: passwordStrength,\n },\n };\n }\n }\n\n if (attrName === 'data-password-policy-actual-passwordstrength') {\n const ln = Number(newValue);\n if (!Number.isNaN(ln) && ln >= 0) {\n this.#overrides = {\n ...this.#overrides,\n passwordstrength: { ...this.#overrides?.passwordstrength, actual: ln },\n };\n }\n }\n }\n\n this.renderItems(this.#availablePolicies, this.#activePolicies, this.#overrides);\n }\n }\n\n get availablePolicies() {\n return this.#availablePolicies || [];\n }\n\n set availablePolicies(val) {\n this.#availablePolicies = val;\n }\n\n get value() {\n return this.getAttribute('value') || '';\n }\n\n getStrengthScore() {\n return this.value.length;\n }\n\n compareValues(comparison, expected, actual) {\n switch (comparison.toUpperCase()) {\n case 'GTE': // Greater than or equal to\n return actual >= expected;\n case 'GT': // Greater than\n return actual > expected;\n case 'LTE': // Less than or equal to\n return actual <= expected;\n case 'LT': // Less than\n return actual < expected;\n case 'EQ': // Equal to\n return actual === expected;\n case 'NEQ': // Not equal to\n return actual !== expected;\n default:\n throw new Error(`Invalid comparison type: ${comparison}`);\n }\n }\n\n validate() {\n let policies = this.#availablePolicies;\n\n if (this.#overrides) {\n policies = this.#availablePolicies.map((policy) => {\n const data = this.#overrides[policy.id];\n\n if (!data) return policy;\n\n const res = { ...policy, data };\n\n return res;\n });\n }\n\n return this.#activePolicies.reduce((results, id) => {\n const policy = policies.find((p) => p.id === id);\n\n if (!policy) {\n return results;\n }\n\n const { pattern, message, data, compare } = policy;\n\n if ((!pattern && !compare) || !message) {\n return results;\n }\n\n const validationResult = {\n message: interpolateString(message, data),\n id,\n };\n\n if (pattern) {\n const exp = new RegExp(interpolateString(pattern, data));\n validationResult.valid = exp.test(this.value);\n } else if (compare) {\n validationResult.valid = this.compareValues(\n compare,\n data?.expected ?? -1,\n data?.actual ?? -1\n );\n }\n\n results.push(validationResult);\n\n return results;\n }, []);\n }\n\n get isValid() {\n return !this.validate().some(({ valid }) => valid === false);\n }\n\n getValidationItemTemplate({ valid, message }) {\n const status = !this.value ? 'none' : valid;\n return `\n <li class=\"item\" data-valid=\"${status}\">\n <span class=\"message\">${message}</span>\n </li>\n `;\n }\n\n renderItems(availablePolicies, activePolicies) {\n if (!availablePolicies || !activePolicies.length) {\n return;\n }\n\n this.list.innerHTML = this.validate().map(this.getValidationItemTemplate.bind(this)).join('');\n }\n\n updateLabel(val) {\n if (!val) {\n this.classList.add('hide-label');\n this.label.textContent = '';\n } else {\n this.label.textContent = val;\n this.classList.remove('hide-label');\n }\n }\n}\n\nconst { host, item, symbolDefault, symbolSuccess, symbolError } = {\n host: { selector: () => ':host > div' },\n item: { selector: () => '.item' },\n symbolDefault: { selector: () => '.item[data-valid=\"none\"]::before' },\n symbolSuccess: { selector: () => '.item[data-valid=\"true\"]::before' },\n symbolError: { selector: () => '.item[data-valid=\"false\"]::before' },\n};\n\nexport const PolicyValidationClass = compose(\n createStyleMixin({ componentNameOverride: getComponentName('input-wrapper') }),\n createStyleMixin({\n mappings: {\n hostDirection: { selector: () => ':host', property: 'direction' },\n fontSize: {},\n fontFamily: {},\n padding: {},\n borderWidth: { ...host, property: 'border-width' },\n borderStyle: { ...host, property: 'border-style' },\n borderColor: { ...host, property: 'border-color' },\n borderRadius: { ...host, property: 'border-radius' },\n backgroundColor: { ...host, property: 'background-color' },\n textColor: { property: 'color' },\n labelMargin: { ...host, property: 'gap' },\n itemsSpacing: { ...item, property: 'line-height' },\n itemSymbolSuccessColor: { ...symbolSuccess, property: 'color' },\n itemSymbolErrorColor: { ...symbolError, property: 'color' },\n itemSymbolDefault: { ...symbolDefault, property: 'content' },\n itemSymbolSuccess: { ...symbolSuccess, property: 'content' },\n itemSymbolError: { ...symbolError, property: 'content' },\n },\n }),\n draggableMixin,\n componentNameValidationMixin\n)(RawPolicyValidation);\n","import { componentName, PolicyValidationClass } from './PolicyValidationClass';\n\ncustomElements.define(componentName, PolicyValidationClass);\n\nexport { PolicyValidationClass, componentName };\n","export const interpolateString = (template, values) =>\n template.replace(/{{(\\w+)+}}/g, (match, key) => values?.[key] || match);\n"],"names":["componentName","dataAttrs","policyAttrs","RawPolicyValidation","baseSelector","observedAttributes","constructor","super","this","attachShadow","mode","innerHTML","panel","shadowRoot","querySelector","label","list","attributeChangedCallback","attrName","oldValue","newValue","updateLabel","includes","availablePolicies","JSON","parse","console","error","split","ln","Number","isNaN","minlength","value","passwordStrength","parseInt","passwordstrength","expected","actual","renderItems","val","getAttribute","getStrengthScore","length","compareValues","comparison","toUpperCase","Error","validate","policies","map","policy","data","id","reduce","results","find","p","pattern","message","compare","validationResult","exp","RegExp","valid","test","push","isValid","some","getValidationItemTemplate","activePolicies","bind","join","textContent","classList","remove","add","host","item","symbolDefault","symbolSuccess","symbolError","selector","PolicyValidationClass","componentNameOverride","mappings","hostDirection","property","fontSize","fontFamily","padding","borderWidth","borderStyle","borderColor","borderRadius","backgroundColor","textColor","labelMargin","itemsSpacing","itemSymbolSuccessColor","itemSymbolErrorColor","itemSymbolDefault","itemSymbolSuccess","itemSymbolError","customElements","define","interpolateString","template","values","replace","match","key"],"sourceRoot":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@descope/web-components-ui",
3
- "version": "1.53.0",
3
+ "version": "1.54.0",
4
4
  "description": "",
5
5
  "main": "dist/cjs/index.cjs.js",
6
6
  "module": "dist/index.esm.js",
@@ -151,14 +151,14 @@ class NewPasswordInternal extends BaseInputClass {
151
151
 
152
152
  // sync input value to policy validation panel
153
153
  this.passwordInput.addEventListener('input', (e) => {
154
- this.passwordStrength.addEventListener(
154
+ this.passwordStrength?.addEventListener(
155
155
  'score-changed',
156
156
  ({ detail }) => {
157
157
  this.policyPanel.setAttribute('data-password-policy-actual-passwordstrength', detail);
158
158
  },
159
159
  { once: true }
160
160
  );
161
- this.passwordStrength.setAttribute('value', e.target.value);
161
+ this.passwordStrength?.setAttribute('value', e.target.value);
162
162
  this.policyPanel.setAttribute('value', e.target.value);
163
163
  });
164
164
 
@@ -110,7 +110,7 @@ class RawPolicyValidation extends createBaseClass({ componentName, baseSelector:
110
110
 
111
111
  if (attrName === 'data-password-policy-value-passwordstrength') {
112
112
  const passwordStrength = parseInt(newValue);
113
- if (!Number.isNaN(passwordStrength) && passwordStrength > 0) {
113
+ if (!Number.isNaN(passwordStrength) && passwordStrength >= 0) {
114
114
  this.#overrides = {
115
115
  ...this.#overrides,
116
116
  passwordstrength: {
@@ -123,7 +123,7 @@ class RawPolicyValidation extends createBaseClass({ componentName, baseSelector:
123
123
 
124
124
  if (attrName === 'data-password-policy-actual-passwordstrength') {
125
125
  const ln = Number(newValue);
126
- if (!Number.isNaN(ln) && ln > 0) {
126
+ if (!Number.isNaN(ln) && ln >= 0) {
127
127
  this.#overrides = {
128
128
  ...this.#overrides,
129
129
  passwordstrength: { ...this.#overrides?.passwordstrength, actual: ln },
@@ -208,7 +208,11 @@ class RawPolicyValidation extends createBaseClass({ componentName, baseSelector:
208
208
  const exp = new RegExp(interpolateString(pattern, data));
209
209
  validationResult.valid = exp.test(this.value);
210
210
  } else if (compare) {
211
- validationResult.valid = this.compareValues(compare, data.expected, data.actual);
211
+ validationResult.valid = this.compareValues(
212
+ compare,
213
+ data?.expected ?? -1,
214
+ data?.actual ?? -1
215
+ );
212
216
  }
213
217
 
214
218
  results.push(validationResult);