diff --git a/README.md b/README.md index 4f68c53..a3707f4 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,8 @@ export class AppComponent { - "skipFirstScreen": automatically focus on the first input of each screen, except first screen autoFocus="skipFirstScreen" + validateOnBlur can be true in order to show input validation errors on blur, in addition to on submit. Default is false. + errorTransformer is a function that receives an error object and returns a string. The returned string will be displayed to the user. NOTE: errorTransformer is not required. If not provided, the error object will be displayed as is. Example: diff --git a/package-lock.json b/package-lock.json index 0c36fc5..ea11506 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,12 @@ "version": "0.5.9", "license": "MIT", "dependencies": { - "@descope/access-key-management-widget": "0.1.74", - "@descope/audit-management-widget": "0.1.37", - "@descope/role-management-widget": "0.1.72", - "@descope/user-management-widget": "0.4.74", - "@descope/user-profile-widget": "0.0.40", - "@descope/web-component": "3.13.1", + "@descope/access-key-management-widget": "0.1.81", + "@descope/audit-management-widget": "0.1.44", + "@descope/role-management-widget": "0.1.79", + "@descope/user-management-widget": "0.4.81", + "@descope/user-profile-widget": "0.0.52", + "@descope/web-component": "3.15.0", "tslib": "^2.3.0" }, "devDependencies": { @@ -2550,14 +2550,14 @@ } }, "node_modules/@descope/access-key-management-widget": { - "version": "0.1.74", - "resolved": "https://registry.npmjs.org/@descope/access-key-management-widget/-/access-key-management-widget-0.1.74.tgz", - "integrity": "sha512-erbjmwGPfcAmRyqM+wQgBqYyn+izi7ltkNUzVMWR8/trLZeZBaTGnCVzb6Ae1i8GKW3/iwjQdXH43wHSX8UVug==", - "dependencies": { - "@descope/sdk-component-drivers": "0.2.17", - "@descope/sdk-helpers": "0.1.36", - "@descope/sdk-mixins": "0.2.21", - "@descope/web-js-sdk": "1.11.6", + "version": "0.1.81", + "resolved": "https://registry.npmjs.org/@descope/access-key-management-widget/-/access-key-management-widget-0.1.81.tgz", + "integrity": "sha512-vbtOHcXDdf/YUmBUvqpTSNQG2w9WTNZc9KbqItQsudMG+7dGNfM6ZK/9JUPj42DhWIpSp6xcGV+fncBMMUZfhg==", + "dependencies": { + "@descope/sdk-component-drivers": "0.2.22", + "@descope/sdk-helpers": "0.1.41", + "@descope/sdk-mixins": "0.2.26", + "@descope/web-js-sdk": "1.11.13", "@reduxjs/toolkit": "^2.0.1", "immer": "^10.0.3", "redux": "5.0.1", @@ -2567,14 +2567,14 @@ } }, "node_modules/@descope/audit-management-widget": { - "version": "0.1.37", - "resolved": "https://registry.npmjs.org/@descope/audit-management-widget/-/audit-management-widget-0.1.37.tgz", - "integrity": "sha512-14lJ/FPTQ4nUgr/stWNEshHy87Ttmhfn19gHtB4+AOomwu8p8eo5DA3elHMzCfV8h9YucQF0u/6EzConSiMWDA==", - "dependencies": { - "@descope/sdk-component-drivers": "0.2.17", - "@descope/sdk-helpers": "0.1.36", - "@descope/sdk-mixins": "0.2.21", - "@descope/web-js-sdk": "1.11.6", + "version": "0.1.44", + "resolved": "https://registry.npmjs.org/@descope/audit-management-widget/-/audit-management-widget-0.1.44.tgz", + "integrity": "sha512-Jlmykzgffo9FLdL/R4EgG30psvXBu0ZHufxpp9t94EN++uqmiaAx9sE/DHAwLo7qDLjb+d83QD70SXVI48aO6g==", + "dependencies": { + "@descope/sdk-component-drivers": "0.2.22", + "@descope/sdk-helpers": "0.1.41", + "@descope/sdk-mixins": "0.2.26", + "@descope/web-js-sdk": "1.11.13", "@reduxjs/toolkit": "^2.0.1", "immer": "^10.0.3", "redux": "5.0.1", @@ -2584,22 +2584,22 @@ } }, "node_modules/@descope/core-js-sdk": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/@descope/core-js-sdk/-/core-js-sdk-2.17.2.tgz", - "integrity": "sha512-10UxhN/H0dhOtrxXWPExQFWjow1Haq47AVgOS9WsGSpx9X8n76FLY9wC7pQv18L609m7sSrEHpAtOSHz5fFbHQ==", + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/@descope/core-js-sdk/-/core-js-sdk-2.18.2.tgz", + "integrity": "sha512-MYn7O3TPD/ls0BA63/jyVJhcgNvr9gt2Xfeg1QEsqumJy6L346Fjz/VYTUUBF7OJPfi4mp3ZIe6AlQwvGT1Yqw==", "dependencies": { "jwt-decode": "3.1.2" } }, "node_modules/@descope/role-management-widget": { - "version": "0.1.72", - "resolved": "https://registry.npmjs.org/@descope/role-management-widget/-/role-management-widget-0.1.72.tgz", - "integrity": "sha512-PkK4crfS6DsNSzgDGgfrGkmiL2rOYz5L/e1yYnu8b4IqE5e2129p9zJPuWwJ5RdzVFqudijTSITR9pdsWPzmyA==", - "dependencies": { - "@descope/sdk-component-drivers": "0.2.17", - "@descope/sdk-helpers": "0.1.36", - "@descope/sdk-mixins": "0.2.21", - "@descope/web-js-sdk": "1.11.6", + "version": "0.1.79", + "resolved": "https://registry.npmjs.org/@descope/role-management-widget/-/role-management-widget-0.1.79.tgz", + "integrity": "sha512-BziF8EYedhPtsEvSL56gRljgPxH2OSAgYcCFJKg1M2vaTRjojDCrQUDi6V8jgw38YT6cXgXVwqLaqlEW0OQX/Q==", + "dependencies": { + "@descope/sdk-component-drivers": "0.2.22", + "@descope/sdk-helpers": "0.1.41", + "@descope/sdk-mixins": "0.2.26", + "@descope/web-js-sdk": "1.11.13", "@reduxjs/toolkit": "^2.0.1", "immer": "^10.0.3", "redux": "5.0.1", @@ -2609,29 +2609,29 @@ } }, "node_modules/@descope/sdk-component-drivers": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/@descope/sdk-component-drivers/-/sdk-component-drivers-0.2.17.tgz", - "integrity": "sha512-iEIwfmlxtYsrOXm5AqwByKoo70uRbtqHqg47prVTIo/VDPhgLKwAQDbHn4ajxxAdZ0ipz2RolZ0wtR2V3KrWVw==", + "version": "0.2.22", + "resolved": "https://registry.npmjs.org/@descope/sdk-component-drivers/-/sdk-component-drivers-0.2.22.tgz", + "integrity": "sha512-/g21IwB8nBUYFQXUvFNFzVY5yH/rd7sGGYKwqk25sleBru1qTqDXHey3n+j/PsOiSAJd4REZrdnBEnzUrZzDZw==", "dependencies": { - "@descope/sdk-helpers": "0.1.36", + "@descope/sdk-helpers": "0.1.41", "tslib": "2.6.2" } }, "node_modules/@descope/sdk-helpers": { - "version": "0.1.36", - "resolved": "https://registry.npmjs.org/@descope/sdk-helpers/-/sdk-helpers-0.1.36.tgz", - "integrity": "sha512-k9FcmHSbM6wXu6jJyw6UzwA4hjVTU1HFjTXc+cZIXzG2v7GthBZil0StyizSvseDJBPvr0wuxPPqhUKrYuP/Fw==", + "version": "0.1.41", + "resolved": "https://registry.npmjs.org/@descope/sdk-helpers/-/sdk-helpers-0.1.41.tgz", + "integrity": "sha512-o6joIfm9x09Hc8B41hgScU6tSbwQOegEpx377hZmKEUlK3YJsOMku1WGtuXalDQ0WDHKl4pYfywNTANsvhknKw==", "dependencies": { "tslib": "2.6.2" } }, "node_modules/@descope/sdk-mixins": { - "version": "0.2.21", - "resolved": "https://registry.npmjs.org/@descope/sdk-mixins/-/sdk-mixins-0.2.21.tgz", - "integrity": "sha512-mPxGeiCp3om7TodCu+3IpfRB10uJ801/ABMVAIc3gJ6IUZnfrBXSRDAirvBlqFATz8sG1NIyuLn8/EVuCy/bAw==", + "version": "0.2.26", + "resolved": "https://registry.npmjs.org/@descope/sdk-mixins/-/sdk-mixins-0.2.26.tgz", + "integrity": "sha512-QzgX0Qp7QOjpM4djXkkUMJWedS956G7q/fOqca342igMMjmsJREl6yxut7SB27eWHh14g4LnQUmwhvRpNAGwaA==", "dependencies": { - "@descope/sdk-component-drivers": "0.2.17", - "@descope/sdk-helpers": "0.1.36", + "@descope/sdk-component-drivers": "0.2.22", + "@descope/sdk-helpers": "0.1.41", "tslib": "2.6.2" }, "peerDependencies": { @@ -2642,14 +2642,14 @@ } }, "node_modules/@descope/user-management-widget": { - "version": "0.4.74", - "resolved": "https://registry.npmjs.org/@descope/user-management-widget/-/user-management-widget-0.4.74.tgz", - "integrity": "sha512-ihhQkikfzNOKvtwDPDbkD/2lIr0klZ+Cnn+B9XWHxtfbLQjXmfBSo0p9elF666LiuBVz854PjHRqE9ZkNAMuQw==", - "dependencies": { - "@descope/sdk-component-drivers": "0.2.17", - "@descope/sdk-helpers": "0.1.36", - "@descope/sdk-mixins": "0.2.21", - "@descope/web-js-sdk": "1.11.6", + "version": "0.4.81", + "resolved": "https://registry.npmjs.org/@descope/user-management-widget/-/user-management-widget-0.4.81.tgz", + "integrity": "sha512-Rl1Wh+rL0htDMKRT+PoKlpy6TazwJT39ZxnwyyJbn0Hu1A1saFd0fquMXrM94UVfBJQzH3PsK/2WEVjQvfIEZw==", + "dependencies": { + "@descope/sdk-component-drivers": "0.2.22", + "@descope/sdk-helpers": "0.1.41", + "@descope/sdk-mixins": "0.2.26", + "@descope/web-js-sdk": "1.11.13", "@reduxjs/toolkit": "^2.0.1", "immer": "^10.0.3", "libphonenumber-js": "1.10.59", @@ -2665,15 +2665,15 @@ "integrity": "sha512-HeTsOrDF/hWhEiKqZVwg9Cqlep5x2T+IYDENvT2VRj3iX8JQ7Y+omENv+AIn0vC8m6GYhivfCed5Cgfw27r5SA==" }, "node_modules/@descope/user-profile-widget": { - "version": "0.0.40", - "resolved": "https://registry.npmjs.org/@descope/user-profile-widget/-/user-profile-widget-0.0.40.tgz", - "integrity": "sha512-lOp0bnWkPjEiXhhtSgzW6DmIgNfX2KB6jOT4neyiIi6NNOv1ik741m4R2x4MzIEn+BqUiVRo4D0jvULJhdu2MA==", - "dependencies": { - "@descope/sdk-component-drivers": "0.2.17", - "@descope/sdk-helpers": "0.1.36", - "@descope/sdk-mixins": "0.2.21", - "@descope/web-component": "3.12.5", - "@descope/web-js-sdk": "1.11.6", + "version": "0.0.52", + "resolved": "https://registry.npmjs.org/@descope/user-profile-widget/-/user-profile-widget-0.0.52.tgz", + "integrity": "sha512-ke0Xx+c6Me5EDY5KsgFKLYQkuu+OLj9FPrDx4H9Qflu8Qu2sEzYA8jIJg8tMKlTfKQ/Fvi3j3CDXwJdrkKSSng==", + "dependencies": { + "@descope/sdk-component-drivers": "0.2.22", + "@descope/sdk-helpers": "0.1.41", + "@descope/sdk-mixins": "0.2.26", + "@descope/web-component": "3.15.0", + "@descope/web-js-sdk": "1.11.13", "@reduxjs/toolkit": "^2.0.1", "immer": "^10.0.3", "libphonenumber-js": "1.10.58", @@ -2683,66 +2683,30 @@ "tslib": "2.6.2" }, "optionalDependencies": { - "@descope/core-js-sdk": "2.17.2" - } - }, - "node_modules/@descope/user-profile-widget/node_modules/@descope/web-component": { - "version": "3.12.5", - "resolved": "https://registry.npmjs.org/@descope/web-component/-/web-component-3.12.5.tgz", - "integrity": "sha512-C6/jGQzauJCuBRIttRGG2IKSoWkWAKBaJeRnrgb4rKeTKfqUypSaKaLwM9AL58yNIGIAuYGIvc3/RiqIx82uzg==", - "dependencies": { - "@descope/web-js-sdk": "1.11.6", - "tslib": "2.6.2" + "@descope/core-js-sdk": "2.18.2" } }, "node_modules/@descope/web-component": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@descope/web-component/-/web-component-3.13.1.tgz", - "integrity": "sha512-cLkS0K8qUqFjos71d2kcKB3LnL8NBhSWJnN9V+6h4PQ94MKbPZj541PpHT0h6d2jt1tO/IDOm4Wx+ZqxHoWSuw==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@descope/web-component/-/web-component-3.15.0.tgz", + "integrity": "sha512-HcjGDl/84Y+djBBQyqDeOLoKehWDyA6Y3E6DyDTu9u/XXr5O95CTRszqiXcvXfn03icPDv18/e+1zscBHh241A==", "dependencies": { - "@descope/web-js-sdk": "1.11.10", + "@descope/web-js-sdk": "1.11.13", "tslib": "2.6.2" } }, - "node_modules/@descope/web-component/node_modules/@descope/core-js-sdk": { - "version": "2.17.4", - "resolved": "https://registry.npmjs.org/@descope/core-js-sdk/-/core-js-sdk-2.17.4.tgz", - "integrity": "sha512-Jo3sNrceAAgkzPx1Lt9Wm4WiuTbB8qQovnu6ZjD1TvSYbsw1FpADokt71y+hB8pLRTBV30AQq8XPtxCqIxnf1g==", - "dependencies": { - "jwt-decode": "3.1.2" - } - }, - "node_modules/@descope/web-component/node_modules/@descope/web-js-sdk": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/@descope/web-js-sdk/-/web-js-sdk-1.11.10.tgz", - "integrity": "sha512-e3wvzg00/epvHuTZ6DsJqKe/5VVReexnLgMW3bpjyYX9bm25VhwM0VoTp11/RRW45sw3ewKRM/sy3HnHONJZPA==", + "node_modules/@descope/web-js-sdk": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/@descope/web-js-sdk/-/web-js-sdk-1.11.13.tgz", + "integrity": "sha512-qR2xDOOmxkrHCWFiqSk2FVopPAosoruQZcnZKiWZPejU9Gz2AitDmldMR8afuNHddid3L1XFKeca5343a1zpDw==", "dependencies": { - "@descope/core-js-sdk": "2.17.4", + "@descope/core-js-sdk": "2.18.2", "@fingerprintjs/fingerprintjs-pro": "3.9.5", "js-cookie": "3.0.5", "jwt-decode": "3.1.2", "tslib": "2.6.2" } }, - "node_modules/@descope/web-component/node_modules/@fingerprintjs/fingerprintjs-pro": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/@fingerprintjs/fingerprintjs-pro/-/fingerprintjs-pro-3.9.5.tgz", - "integrity": "sha512-pQ/2zenqRqeHFKtPeDv5OUwLulqqXFGBweKB1948DBAGv95+ePMSSosp723+lSsEz0fbo43qyNGuyEjoJlFzZw==", - "dependencies": { - "tslib": "^2.4.1" - } - }, - "node_modules/@descope/web-js-sdk": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@descope/web-js-sdk/-/web-js-sdk-1.11.6.tgz", - "integrity": "sha512-/8tvK1D5Iki5yXUU6EUzxQm9Lvb3odLH08683V1JhcPbtXwqd4oK/OP4Zwa76qKOA+YPz3UJsYCx4m48wNeIbQ==", - "dependencies": { - "@descope/core-js-sdk": "2.17.2", - "@fingerprintjs/fingerprintjs-pro": "3.9.4", - "js-cookie": "3.0.5", - "tslib": "2.6.2" - } - }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -3228,9 +3192,9 @@ } }, "node_modules/@fingerprintjs/fingerprintjs-pro": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/@fingerprintjs/fingerprintjs-pro/-/fingerprintjs-pro-3.9.4.tgz", - "integrity": "sha512-mPscxSZHTyps9zH/eRD5M/QmVmFfVZUwOq4kaWQVQodEq0PuMh6gnDS8LGQUwTJlOhu0a0MIMq58kILFmPxsDQ==", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/@fingerprintjs/fingerprintjs-pro/-/fingerprintjs-pro-3.9.5.tgz", + "integrity": "sha512-pQ/2zenqRqeHFKtPeDv5OUwLulqqXFGBweKB1948DBAGv95+ePMSSosp723+lSsEz0fbo43qyNGuyEjoJlFzZw==", "dependencies": { "tslib": "^2.4.1" } diff --git a/package.json b/package.json index 5959387..39cf42a 100644 --- a/package.json +++ b/package.json @@ -33,12 +33,12 @@ ] }, "dependencies": { - "@descope/access-key-management-widget": "0.1.74", - "@descope/audit-management-widget": "0.1.37", - "@descope/role-management-widget": "0.1.72", - "@descope/user-management-widget": "0.4.74", - "@descope/user-profile-widget": "0.0.40", - "@descope/web-component": "3.13.1", + "@descope/access-key-management-widget": "0.1.81", + "@descope/audit-management-widget": "0.1.44", + "@descope/role-management-widget": "0.1.79", + "@descope/user-management-widget": "0.4.81", + "@descope/user-profile-widget": "0.0.52", + "@descope/web-component": "3.15.0", "tslib": "^2.3.0" }, "optionalDependencies": { diff --git a/projects/angular-sdk/src/lib/components/descope/descope.component.ts b/projects/angular-sdk/src/lib/components/descope/descope.component.ts index 5f9064a..08a1970 100644 --- a/projects/angular-sdk/src/lib/components/descope/descope.component.ts +++ b/projects/angular-sdk/src/lib/components/descope/descope.component.ts @@ -32,6 +32,7 @@ export class DescopeComponent implements OnInit, OnChanges { @Input() telemetryKey: string; @Input() redirectUrl: string; @Input() autoFocus: true | false | 'skipFirstScreen'; + @Input() validateOnBlur: boolean; @Input() debug: boolean; @Input() errorTransformer: (error: { text: string; type: string }) => string; @@ -122,6 +123,12 @@ export class DescopeComponent implements OnInit, OnChanges { if (this.autoFocus) { this.webComponent.setAttribute('auto-focus', this.autoFocus.toString()); } + if (this.validateOnBlur) { + this.webComponent.setAttribute( + 'validate-on-blur', + this.validateOnBlur.toString() + ); + } if (this.debug) { this.webComponent.setAttribute('debug', this.debug.toString()); } diff --git a/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.html b/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.html index 8012d57..f789f02 100644 --- a/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.html +++ b/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.html @@ -8,6 +8,7 @@ [telemetryKey]="telemetryKey" [redirectUrl]="redirectUrl" [autoFocus]="autoFocus" + [validateOnBlur]="validateOnBlur" [debug]="debug" [errorTransformer]="errorTransformer" [client]="client" diff --git a/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.ts b/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.ts index 36a8c3e..18747ea 100644 --- a/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.ts +++ b/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.ts @@ -18,6 +18,7 @@ export class SignInFlowComponent { @Input() telemetryKey: string; @Input() redirectUrl: string; @Input() autoFocus: true | false | 'skipFirstScreen'; + @Input() validateOnBlur: boolean; @Input() debug: boolean; @Input() errorTransformer: (error: { text: string; type: string }) => string; diff --git a/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.html b/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.html index 3a8c584..e9b5d78 100644 --- a/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.html +++ b/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.html @@ -8,6 +8,7 @@ [telemetryKey]="telemetryKey" [redirectUrl]="redirectUrl" [autoFocus]="autoFocus" + [validateOnBlur]="validateOnBlur" [debug]="debug" [errorTransformer]="errorTransformer" [client]="client" diff --git a/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.ts b/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.ts index f59316b..1f80a92 100644 --- a/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.ts +++ b/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.ts @@ -18,6 +18,7 @@ export class SignUpFlowComponent { @Input() telemetryKey: string; @Input() redirectUrl: string; @Input() autoFocus: true | false | 'skipFirstScreen'; + @Input() validateOnBlur: boolean; @Input() debug: boolean; @Input() errorTransformer: (error: { text: string; type: string }) => string; diff --git a/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.html b/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.html index 35a5e08..f4642e5 100644 --- a/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.html +++ b/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.html @@ -8,6 +8,7 @@ [telemetryKey]="telemetryKey" [redirectUrl]="redirectUrl" [autoFocus]="autoFocus" + [validateOnBlur]="validateOnBlur" [debug]="debug" [errorTransformer]="errorTransformer" [client]="client" diff --git a/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.ts b/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.ts index 9f4a615..4452809 100644 --- a/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.ts +++ b/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.ts @@ -18,6 +18,7 @@ export class SignUpOrInFlowComponent { @Input() telemetryKey: string; @Input() redirectUrl: string; @Input() autoFocus: true | false | 'skipFirstScreen'; + @Input() validateOnBlur: boolean; @Input() debug: boolean; @Input() errorTransformer: (error: { text: string; type: string }) => string;