@skyux/validation 6.0.2 → 6.1.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.
package/esm2020/index.mjs CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './lib/modules/email-validation/email-validation.module';
2
+ export * from './lib/modules/url-validation/url-validation-options';
2
3
  export * from './lib/modules/url-validation/url-validation.module';
3
4
  export * from './lib/modules/validation/validation';
4
5
  export * from './lib/modules/validators/validators';
@@ -6,4 +7,4 @@ export * from './lib/modules/validators/validators';
6
7
  // Obscure names are used to indicate types are not part of the public API.
7
8
  export { SkyEmailValidationDirective as λ1 } from './lib/modules/email-validation/email-validation.directive';
8
9
  export { SkyUrlValidationDirective as λ2 } from './lib/modules/url-validation/url-validation.directive';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvdmFsaWRhdGlvbi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx3REFBd0QsQ0FBQztBQUN2RSxjQUFjLG9EQUFvRCxDQUFDO0FBQ25FLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyxxQ0FBcUMsQ0FBQztBQUVwRCwwRkFBMEY7QUFDMUYsMkVBQTJFO0FBQzNFLE9BQU8sRUFBRSwyQkFBMkIsSUFBSSxFQUFFLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUM5RyxPQUFPLEVBQUUseUJBQXlCLElBQUksRUFBRSxFQUFFLE1BQU0sdURBQXVELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9tb2R1bGVzL2VtYWlsLXZhbGlkYXRpb24vZW1haWwtdmFsaWRhdGlvbi5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kdWxlcy91cmwtdmFsaWRhdGlvbi91cmwtdmFsaWRhdGlvbi5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kdWxlcy92YWxpZGF0aW9uL3ZhbGlkYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kdWxlcy92YWxpZGF0b3JzL3ZhbGlkYXRvcnMnO1xuXG4vLyBDb21wb25lbnRzIGFuZCBkaXJlY3RpdmVzIG11c3QgYmUgZXhwb3J0ZWQgdG8gc3VwcG9ydCBBbmd1bGFyJ3MgXCJwYXJ0aWFsXCIgSXZ5IGNvbXBpbGVyLlxuLy8gT2JzY3VyZSBuYW1lcyBhcmUgdXNlZCB0byBpbmRpY2F0ZSB0eXBlcyBhcmUgbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuXG5leHBvcnQgeyBTa3lFbWFpbFZhbGlkYXRpb25EaXJlY3RpdmUgYXMgzrsxIH0gZnJvbSAnLi9saWIvbW9kdWxlcy9lbWFpbC12YWxpZGF0aW9uL2VtYWlsLXZhbGlkYXRpb24uZGlyZWN0aXZlJztcbmV4cG9ydCB7IFNreVVybFZhbGlkYXRpb25EaXJlY3RpdmUgYXMgzrsyIH0gZnJvbSAnLi9saWIvbW9kdWxlcy91cmwtdmFsaWRhdGlvbi91cmwtdmFsaWRhdGlvbi5kaXJlY3RpdmUnO1xuIl19
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvdmFsaWRhdGlvbi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx3REFBd0QsQ0FBQztBQUN2RSxjQUFjLHFEQUFxRCxDQUFDO0FBQ3BFLGNBQWMsb0RBQW9ELENBQUM7QUFDbkUsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLHFDQUFxQyxDQUFDO0FBRXBELDBGQUEwRjtBQUMxRiwyRUFBMkU7QUFDM0UsT0FBTyxFQUFFLDJCQUEyQixJQUFJLEVBQUUsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQzlHLE9BQU8sRUFBRSx5QkFBeUIsSUFBSSxFQUFFLEVBQUUsTUFBTSx1REFBdUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL21vZHVsZXMvZW1haWwtdmFsaWRhdGlvbi9lbWFpbC12YWxpZGF0aW9uLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2R1bGVzL3VybC12YWxpZGF0aW9uL3VybC12YWxpZGF0aW9uLW9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kdWxlcy91cmwtdmFsaWRhdGlvbi91cmwtdmFsaWRhdGlvbi5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kdWxlcy92YWxpZGF0aW9uL3ZhbGlkYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kdWxlcy92YWxpZGF0b3JzL3ZhbGlkYXRvcnMnO1xuXG4vLyBDb21wb25lbnRzIGFuZCBkaXJlY3RpdmVzIG11c3QgYmUgZXhwb3J0ZWQgdG8gc3VwcG9ydCBBbmd1bGFyJ3MgXCJwYXJ0aWFsXCIgSXZ5IGNvbXBpbGVyLlxuLy8gT2JzY3VyZSBuYW1lcyBhcmUgdXNlZCB0byBpbmRpY2F0ZSB0eXBlcyBhcmUgbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuXG5leHBvcnQgeyBTa3lFbWFpbFZhbGlkYXRpb25EaXJlY3RpdmUgYXMgzrsxIH0gZnJvbSAnLi9saWIvbW9kdWxlcy9lbWFpbC12YWxpZGF0aW9uL2VtYWlsLXZhbGlkYXRpb24uZGlyZWN0aXZlJztcbmV4cG9ydCB7IFNreVVybFZhbGlkYXRpb25EaXJlY3RpdmUgYXMgzrsyIH0gZnJvbSAnLi9saWIvbW9kdWxlcy91cmwtdmFsaWRhdGlvbi91cmwtdmFsaWRhdGlvbi5kaXJlY3RpdmUnO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLXZhbGlkYXRpb24tb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy92YWxpZGF0aW9uL3NyYy9saWIvbW9kdWxlcy91cmwtdmFsaWRhdGlvbi91cmwtdmFsaWRhdGlvbi1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciB0aGUgVVJMIHZhbGlkYXRvciBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2t5VXJsVmFsaWRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSBydWxlc2V0IHRvIHVzZSBmb3IgVVJMIHZhbGlkYXRpb24uIFJ1bGVzZXQgMSB1c2VzIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBydWxlc2V0IDIgdXNlcyB0aGUgdGhpcmQtcGFydHkgW3ZhbGlkYXRvci5qcyBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vdmFsaWRhdG9yanMvdmFsaWRhdG9yLmpzLykuXG4gICAqL1xuICBydWxlc2V0VmVyc2lvbjogMSB8IDI7XG59XG4iXX0=
@@ -1,7 +1,8 @@
1
- import { Directive, forwardRef } from '@angular/core';
2
- import { NG_VALIDATORS } from '@angular/forms';
1
+ import { Directive, Input, forwardRef } from '@angular/core';
2
+ import { NG_VALIDATORS, } from '@angular/forms';
3
3
  import { SkyValidation } from '../validation/validation';
4
4
  import * as i0 from "@angular/core";
5
+ // tslint:disable:no-forward-ref no-use-before-declare
5
6
  const SKY_URL_VALIDATION_VALIDATOR = {
6
7
  provide: NG_VALIDATORS,
7
8
  useExisting: forwardRef(() => SkyUrlValidationDirective),
@@ -13,30 +14,39 @@ const SKY_URL_VALIDATION_VALIDATOR = {
13
14
  * This directive uses `NgModel` to bind data.
14
15
  */
15
16
  export class SkyUrlValidationDirective {
17
+ constructor() {
18
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
19
+ this._validatorChange = () => { };
20
+ }
21
+ /**
22
+ * Specifies configuration options for the URL validation component.
23
+ */
24
+ set skyUrlValidation(value) {
25
+ this._skyUrlValidationOptions = value;
26
+ this._validatorChange();
27
+ }
16
28
  validate(control) {
17
29
  const value = control.value;
18
30
  if (!value) {
19
- return;
20
- }
21
- if (!this.urlIsValid(value)) {
22
- return {
23
- skyUrl: {
24
- invalid: control.value,
25
- },
26
- };
31
+ return null;
27
32
  }
33
+ return SkyValidation.isUrl(value, this._skyUrlValidationOptions)
34
+ ? null
35
+ : { skyUrl: { invalid: value } };
28
36
  }
29
- urlIsValid(url) {
30
- return SkyValidation.isUrl(url);
37
+ registerOnValidatorChange(fn) {
38
+ this._validatorChange = fn;
31
39
  }
32
40
  }
33
41
  SkyUrlValidationDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyUrlValidationDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
34
- SkyUrlValidationDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.2", type: SkyUrlValidationDirective, selector: "[skyUrlValidation]", providers: [SKY_URL_VALIDATION_VALIDATOR], ngImport: i0 });
42
+ SkyUrlValidationDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.2", type: SkyUrlValidationDirective, selector: "[skyUrlValidation]", inputs: { skyUrlValidation: "skyUrlValidation" }, providers: [SKY_URL_VALIDATION_VALIDATOR], ngImport: i0 });
35
43
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyUrlValidationDirective, decorators: [{
36
44
  type: Directive,
37
45
  args: [{
38
46
  selector: '[skyUrlValidation]',
39
47
  providers: [SKY_URL_VALIDATION_VALIDATOR],
40
48
  }]
41
- }] });
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLXZhbGlkYXRpb24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3ZhbGlkYXRpb24vc3JjL2xpYi9tb2R1bGVzL3VybC12YWxpZGF0aW9uL3VybC12YWxpZGF0aW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQW1CLGFBQWEsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFFekQsTUFBTSw0QkFBNEIsR0FBRztJQUNuQyxPQUFPLEVBQUUsYUFBYTtJQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHlCQUF5QixDQUFDO0lBQ3hELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQUVGOzs7O0dBSUc7QUFLSCxNQUFNLE9BQU8seUJBQXlCO0lBQzdCLFFBQVEsQ0FBQyxPQUF3QjtRQUN0QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBRTVCLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMzQixPQUFPO2dCQUNMLE1BQU0sRUFBRTtvQkFDTixPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUs7aUJBQ3ZCO2FBQ0YsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVNLFVBQVUsQ0FBQyxHQUFXO1FBQzNCLE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDOztzSEFuQlUseUJBQXlCOzBHQUF6Qix5QkFBeUIsNkNBRnpCLENBQUMsNEJBQTRCLENBQUM7MkZBRTlCLHlCQUF5QjtrQkFKckMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixTQUFTLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQztpQkFDMUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgTkdfVkFMSURBVE9SUywgVmFsaWRhdG9yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBTa3lWYWxpZGF0aW9uIH0gZnJvbSAnLi4vdmFsaWRhdGlvbi92YWxpZGF0aW9uJztcblxuY29uc3QgU0tZX1VSTF9WQUxJREFUSU9OX1ZBTElEQVRPUiA9IHtcbiAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2t5VXJsVmFsaWRhdGlvbkRpcmVjdGl2ZSksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGlucHV0IHRvIHZhbGlkYXRlIFVSTHMuIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uIGFuIGBpbnB1dGAgZWxlbWVudC5cbiAqIElmIHVzZXJzIGVudGVycyB2YWx1ZXMgdGhhdCBhcmUgbm90IHZhbGlkIFVSTHMsIGFuIGVycm9yIG1lc3NhZ2UgYXBwZWFycy5cbiAqIFRoaXMgZGlyZWN0aXZlIHVzZXMgYE5nTW9kZWxgIHRvIGJpbmQgZGF0YS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3NreVVybFZhbGlkYXRpb25dJyxcbiAgcHJvdmlkZXJzOiBbU0tZX1VSTF9WQUxJREFUSU9OX1ZBTElEQVRPUl0sXG59KVxuZXhwb3J0IGNsYXNzIFNreVVybFZhbGlkYXRpb25EaXJlY3RpdmUgaW1wbGVtZW50cyBWYWxpZGF0b3Ige1xuICBwdWJsaWMgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy51cmxJc1ZhbGlkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2t5VXJsOiB7XG4gICAgICAgICAgaW52YWxpZDogY29udHJvbC52YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVybElzVmFsaWQodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gU2t5VmFsaWRhdGlvbi5pc1VybCh1cmwpO1xuICB9XG59XG4iXX0=
49
+ }], propDecorators: { skyUrlValidation: [{
50
+ type: Input
51
+ }] } });
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLXZhbGlkYXRpb24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3ZhbGlkYXRpb24vc3JjL2xpYi9tb2R1bGVzL3VybC12YWxpZGF0aW9uL3VybC12YWxpZGF0aW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUVMLGFBQWEsR0FHZCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFJekQsc0RBQXNEO0FBQ3RELE1BQU0sNEJBQTRCLEdBQUc7SUFDbkMsT0FBTyxFQUFFLGFBQWE7SUFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztJQUN4RCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRjs7OztHQUlHO0FBS0gsTUFBTSxPQUFPLHlCQUF5QjtJQUp0QztRQWdCRSxnRUFBZ0U7UUFDeEQscUJBQWdCLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0tBaUJyQztJQTdCQzs7T0FFRztJQUNILElBQ1csZ0JBQWdCLENBQUMsS0FBMEM7UUFDcEUsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztRQUN0QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBT00sUUFBUSxDQUFDLE9BQXdCO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFFNUIsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztZQUM5RCxDQUFDLENBQUMsSUFBSTtZQUNOLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTSx5QkFBeUIsQ0FBQyxFQUFjO1FBQzdDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQzs7c0hBN0JVLHlCQUF5QjswR0FBekIseUJBQXlCLCtGQUZ6QixDQUFDLDRCQUE0QixDQUFDOzJGQUU5Qix5QkFBeUI7a0JBSnJDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsU0FBUyxFQUFFLENBQUMsNEJBQTRCLENBQUM7aUJBQzFDOzhCQU1ZLGdCQUFnQjtzQkFEMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgTkdfVkFMSURBVE9SUyxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFNreVZhbGlkYXRpb24gfSBmcm9tICcuLi92YWxpZGF0aW9uL3ZhbGlkYXRpb24nO1xuXG5pbXBvcnQgeyBTa3lVcmxWYWxpZGF0aW9uT3B0aW9ucyB9IGZyb20gJy4vdXJsLXZhbGlkYXRpb24tb3B0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWZvcndhcmQtcmVmIG5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuY29uc3QgU0tZX1VSTF9WQUxJREFUSU9OX1ZBTElEQVRPUiA9IHtcbiAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2t5VXJsVmFsaWRhdGlvbkRpcmVjdGl2ZSksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGlucHV0IHRvIHZhbGlkYXRlIFVSTHMuIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uIGFuIGBpbnB1dGAgZWxlbWVudC5cbiAqIElmIHVzZXJzIGVudGVycyB2YWx1ZXMgdGhhdCBhcmUgbm90IHZhbGlkIFVSTHMsIGFuIGVycm9yIG1lc3NhZ2UgYXBwZWFycy5cbiAqIFRoaXMgZGlyZWN0aXZlIHVzZXMgYE5nTW9kZWxgIHRvIGJpbmQgZGF0YS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3NreVVybFZhbGlkYXRpb25dJyxcbiAgcHJvdmlkZXJzOiBbU0tZX1VSTF9WQUxJREFUSU9OX1ZBTElEQVRPUl0sXG59KVxuZXhwb3J0IGNsYXNzIFNreVVybFZhbGlkYXRpb25EaXJlY3RpdmUgaW1wbGVtZW50cyBWYWxpZGF0b3Ige1xuICAvKipcbiAgICogU3BlY2lmaWVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIFVSTCB2YWxpZGF0aW9uIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2t5VXJsVmFsaWRhdGlvbih2YWx1ZTogU2t5VXJsVmFsaWRhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9za3lVcmxWYWxpZGF0aW9uT3B0aW9ucyA9IHZhbHVlO1xuICAgIHRoaXMuX3ZhbGlkYXRvckNoYW5nZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2t5VXJsVmFsaWRhdGlvbk9wdGlvbnM6IFNreVVybFZhbGlkYXRpb25PcHRpb25zIHwgdW5kZWZpbmVkO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgcHJpdmF0ZSBfdmFsaWRhdG9yQ2hhbmdlID0gKCkgPT4ge307XG5cbiAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gU2t5VmFsaWRhdGlvbi5pc1VybCh2YWx1ZSwgdGhpcy5fc2t5VXJsVmFsaWRhdGlvbk9wdGlvbnMpXG4gICAgICA/IG51bGxcbiAgICAgIDogeyBza3lVcmw6IHsgaW52YWxpZDogdmFsdWUgfSB9O1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl92YWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgfVxufVxuIl19
@@ -1,3 +1,4 @@
1
+ import isURL from 'validator/es/lib/isURL';
1
2
  export class SkyValidation {
2
3
  static isEmail(emailAddress) {
3
4
  // The regex was obtained from http://emailregex.com/
@@ -5,9 +6,24 @@ export class SkyValidation {
5
6
  const regex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
6
7
  return regex.test(emailAddress);
7
8
  }
8
- static isUrl(url) {
9
+ static isUrl(value, options) {
10
+ if (typeof value !== 'string') {
11
+ return false;
12
+ }
13
+ const url = value;
9
14
  const regex = /^((http|https):\/\/)?([\w-]+\.)+[\w-]+/i;
10
- return regex.test(url);
15
+ if (options) {
16
+ switch (options.rulesetVersion) {
17
+ case 1:
18
+ return regex.test(url);
19
+ case 2:
20
+ // we are using the `validator` package's default options
21
+ return isURL(url);
22
+ }
23
+ }
24
+ else {
25
+ return regex.test(url);
26
+ }
11
27
  }
12
28
  }
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy92YWxpZGF0aW9uL3NyYy9saWIvbW9kdWxlcy92YWxpZGF0aW9uL3ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFnQixhQUFhO0lBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBb0I7UUFDeEMscURBQXFEO1FBQ3JELGdFQUFnRTtRQUNoRSxNQUFNLEtBQUssR0FDVCxzSkFBc0osQ0FBQztRQUN6SixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBVztRQUM3QixNQUFNLEtBQUssR0FBRyx5Q0FBeUMsQ0FBQztRQUN4RCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNreVZhbGlkYXRpb24ge1xuICBwdWJsaWMgc3RhdGljIGlzRW1haWwoZW1haWxBZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBUaGUgcmVnZXggd2FzIG9idGFpbmVkIGZyb20gaHR0cDovL2VtYWlscmVnZXguY29tL1xuICAgIC8vIHdoaWNoIGNsYWltcyB0byBjb3JyZWN0bHkgaGFuZGxlIH45OSUgb2YgYWxsIGVtYWlsIGFkZHJlc3Nlcy5cbiAgICBjb25zdCByZWdleCA9XG4gICAgICAvXigoW148PigpW1xcXVxcXFwuLDs6XFxzQFwiXSsoXFwuW148PigpW1xcXVxcXFwuLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfV0pfCgoW2EtekEtWlxcLTAtOV0rXFwuKStbYS16QS1aXXsyLH0pKSQvO1xuICAgIHJldHVybiByZWdleC50ZXN0KGVtYWlsQWRkcmVzcyk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzVXJsKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVnZXggPSAvXigoaHR0cHxodHRwcyk6XFwvXFwvKT8oW1xcdy1dK1xcLikrW1xcdy1dKy9pO1xuICAgIHJldHVybiByZWdleC50ZXN0KHVybCk7XG4gIH1cbn1cbiJdfQ==
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy92YWxpZGF0aW9uL3NyYy9saWIvbW9kdWxlcy92YWxpZGF0aW9uL3ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sd0JBQXdCLENBQUM7QUFJM0MsTUFBTSxPQUFnQixhQUFhO0lBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBb0I7UUFDeEMscURBQXFEO1FBQ3JELGdFQUFnRTtRQUNoRSxNQUFNLEtBQUssR0FDVCxzSkFBc0osQ0FBQztRQUN6SixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQ2pCLEtBQWMsRUFDZCxPQUFpQztRQUVqQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM3QixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsTUFBTSxHQUFHLEdBQVcsS0FBSyxDQUFDO1FBRTFCLE1BQU0sS0FBSyxHQUFHLHlDQUF5QyxDQUFDO1FBQ3hELElBQUksT0FBTyxFQUFFO1lBQ1gsUUFBUSxPQUFPLENBQUMsY0FBYyxFQUFFO2dCQUM5QixLQUFLLENBQUM7b0JBQ0osT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QixLQUFLLENBQUM7b0JBQ0oseURBQXlEO29CQUN6RCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNyQjtTQUNGO2FBQU07WUFDTCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDeEI7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaXNVUkwgZnJvbSAndmFsaWRhdG9yL2VzL2xpYi9pc1VSTCc7XG5cbmltcG9ydCB7IFNreVVybFZhbGlkYXRpb25PcHRpb25zIH0gZnJvbSAnLi4vdXJsLXZhbGlkYXRpb24vdXJsLXZhbGlkYXRpb24tb3B0aW9ucyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTa3lWYWxpZGF0aW9uIHtcbiAgcHVibGljIHN0YXRpYyBpc0VtYWlsKGVtYWlsQWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gVGhlIHJlZ2V4IHdhcyBvYnRhaW5lZCBmcm9tIGh0dHA6Ly9lbWFpbHJlZ2V4LmNvbS9cbiAgICAvLyB3aGljaCBjbGFpbXMgdG8gY29ycmVjdGx5IGhhbmRsZSB+OTklIG9mIGFsbCBlbWFpbCBhZGRyZXNzZXMuXG4gICAgY29uc3QgcmVnZXggPVxuICAgICAgL14oKFtePD4oKVtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVtcXF1cXFxcLiw7Olxcc0BcIl0rKSopfChcIi4rXCIpKUAoKFxcW1swLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31dKXwoKFthLXpBLVpcXC0wLTldK1xcLikrW2EtekEtWl17Mix9KSkkLztcbiAgICByZXR1cm4gcmVnZXgudGVzdChlbWFpbEFkZHJlc3MpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc1VybChcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBvcHRpb25zPzogU2t5VXJsVmFsaWRhdGlvbk9wdGlvbnNcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmw6IHN0cmluZyA9IHZhbHVlO1xuXG4gICAgY29uc3QgcmVnZXggPSAvXigoaHR0cHxodHRwcyk6XFwvXFwvKT8oW1xcdy1dK1xcLikrW1xcdy1dKy9pO1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBzd2l0Y2ggKG9wdGlvbnMucnVsZXNldFZlcnNpb24pIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KHVybCk7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAvLyB3ZSBhcmUgdXNpbmcgdGhlIGB2YWxpZGF0b3JgIHBhY2thZ2UncyBkZWZhdWx0IG9wdGlvbnNcbiAgICAgICAgICByZXR1cm4gaXNVUkwodXJsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodXJsKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -7,33 +7,43 @@ export class SkyValidators {
7
7
  * Validates email addresses in reactive forms. Add this validator directly to the form control
8
8
  * model in the component class. If users enter values that are not valid email addresses, the
9
9
  * validator throws an error. Since this is a sync validator, it returns a set of validation
10
- * errors or `undefined` immediately when users enter values.
11
- * @param control
10
+ * errors or `null` immediately when users enter values.
12
11
  */
13
12
  static email(control) {
14
13
  const value = control.value;
15
14
  if (!value) {
16
- return undefined;
15
+ return null;
17
16
  }
18
17
  return SkyValidation.isEmail(value)
19
- ? undefined
18
+ ? null
20
19
  : { skyEmail: { invalid: value } };
21
20
  }
22
- /**
23
- * Validates URLs in reactive forms. Add this validator directly to the form control model in
24
- * the component class. If users enter values that are not valid URLs, the validator throws an
25
- * error. Since this is a sync validator, it returns a set of validation errors or `undefined`
26
- * immediately when users enter values.
27
- * @param control
28
- */
29
- static url(control) {
30
- const value = control.value;
31
- if (!value) {
32
- return undefined;
21
+ static url(value) {
22
+ const typeTester = value;
23
+ if (typeTester.rulesetVersion === undefined) {
24
+ // there are no SkyUrlValidationOptions passed in, so return ValidationErrors | null
25
+ const abstractControl = value;
26
+ const abstractControlValue = abstractControl.value;
27
+ if (!abstractControlValue) {
28
+ return null;
29
+ }
30
+ return SkyValidation.isUrl(abstractControlValue)
31
+ ? null
32
+ : { skyUrl: { invalid: abstractControlValue } };
33
+ }
34
+ else {
35
+ // there are SkyUrlValidationOptions passed in, so return ValidatorFn
36
+ const skyUrlValidationOptions = value;
37
+ return (abstractControl) => {
38
+ const abstractControlValue = abstractControl.value;
39
+ if (!abstractControlValue) {
40
+ return null;
41
+ }
42
+ return SkyValidation.isUrl(abstractControl.value, skyUrlValidationOptions)
43
+ ? null
44
+ : { skyUrl: { invalid: abstractControl.value } };
45
+ };
33
46
  }
34
- return SkyValidation.isUrl(value)
35
- ? undefined
36
- : { skyUrl: { invalid: value } };
37
47
  }
38
48
  }
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy92YWxpZGF0aW9uL3NyYy9saWIvbW9kdWxlcy92YWxpZGF0b3JzL3ZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpELHFFQUFxRTtBQUNyRSwyREFBMkQ7QUFDM0QsV0FBVztBQUNYLE1BQU0sT0FBTyxhQUFhO0lBQ3hCOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBd0I7UUFDMUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUU1QixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxPQUFPLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBd0I7UUFDeEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUU1QixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxPQUFPLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQy9CLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7SUFDckMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBTa3lWYWxpZGF0aW9uIH0gZnJvbSAnLi4vdmFsaWRhdGlvbi92YWxpZGF0aW9uJztcblxuLy8gTmVlZCB0byBhZGQgdGhlIGZvbGxvd2luZyB0byBjbGFzc2VzIHdoaWNoIGNvbnRhaW4gc3RhdGljIG1ldGhvZHMuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1wYWNrYWdyL25nLXBhY2thZ3IvaXNzdWVzLzY0MVxuLy8gQGR5bmFtaWNcbmV4cG9ydCBjbGFzcyBTa3lWYWxpZGF0b3JzIHtcbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBlbWFpbCBhZGRyZXNzZXMgaW4gcmVhY3RpdmUgZm9ybXMuIEFkZCB0aGlzIHZhbGlkYXRvciBkaXJlY3RseSB0byB0aGUgZm9ybSBjb250cm9sXG4gICAqIG1vZGVsIGluIHRoZSBjb21wb25lbnQgY2xhc3MuIElmIHVzZXJzIGVudGVyIHZhbHVlcyB0aGF0IGFyZSBub3QgdmFsaWQgZW1haWwgYWRkcmVzc2VzLCB0aGVcbiAgICogdmFsaWRhdG9yIHRocm93cyBhbiBlcnJvci4gU2luY2UgdGhpcyBpcyBhIHN5bmMgdmFsaWRhdG9yLCBpdCByZXR1cm5zIGEgc2V0IG9mIHZhbGlkYXRpb25cbiAgICogZXJyb3JzIG9yIGB1bmRlZmluZWRgIGltbWVkaWF0ZWx5IHdoZW4gdXNlcnMgZW50ZXIgdmFsdWVzLlxuICAgKiBAcGFyYW0gY29udHJvbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBlbWFpbChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gU2t5VmFsaWRhdGlvbi5pc0VtYWlsKHZhbHVlKVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogeyBza3lFbWFpbDogeyBpbnZhbGlkOiB2YWx1ZSB9IH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIFVSTHMgaW4gcmVhY3RpdmUgZm9ybXMuIEFkZCB0aGlzIHZhbGlkYXRvciBkaXJlY3RseSB0byB0aGUgZm9ybSBjb250cm9sIG1vZGVsIGluXG4gICAqIHRoZSBjb21wb25lbnQgY2xhc3MuIElmIHVzZXJzIGVudGVyIHZhbHVlcyB0aGF0IGFyZSBub3QgdmFsaWQgVVJMcywgdGhlIHZhbGlkYXRvciB0aHJvd3MgYW5cbiAgICogZXJyb3IuIFNpbmNlIHRoaXMgaXMgYSBzeW5jIHZhbGlkYXRvciwgaXQgcmV0dXJucyBhIHNldCBvZiB2YWxpZGF0aW9uIGVycm9ycyBvciBgdW5kZWZpbmVkYFxuICAgKiBpbW1lZGlhdGVseSB3aGVuIHVzZXJzIGVudGVyIHZhbHVlcy5cbiAgICogQHBhcmFtIGNvbnRyb2xcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXJsKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBTa3lWYWxpZGF0aW9uLmlzVXJsKHZhbHVlKVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogeyBza3lVcmw6IHsgaW52YWxpZDogdmFsdWUgfSB9O1xuICB9XG59XG4iXX0=
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy92YWxpZGF0aW9uL3NyYy9saWIvbW9kdWxlcy92YWxpZGF0b3JzL3ZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpELHFFQUFxRTtBQUNyRSwyREFBMkQ7QUFDM0QsV0FBVztBQUNYLE1BQU0sT0FBTyxhQUFhO0lBQ3hCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUF3QjtRQUMxQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBRTVCLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsT0FBTyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNqQyxDQUFDLENBQUMsSUFBSTtZQUNOLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFvQk0sTUFBTSxDQUFDLEdBQUcsQ0FDZixLQUFnRDtRQUVoRCxNQUFNLFVBQVUsR0FBRyxLQUFnQyxDQUFDO1FBQ3BELElBQUksVUFBVSxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUU7WUFDM0Msb0ZBQW9GO1lBQ3BGLE1BQU0sZUFBZSxHQUFHLEtBQXdCLENBQUM7WUFDakQsTUFBTSxvQkFBb0IsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQ25ELElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDekIsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQztnQkFDOUMsQ0FBQyxDQUFDLElBQUk7Z0JBQ04sQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEVBQUUsQ0FBQztTQUNuRDthQUFNO1lBQ0wscUVBQXFFO1lBQ3JFLE1BQU0sdUJBQXVCLEdBQUcsS0FBZ0MsQ0FBQztZQUNqRSxPQUFPLENBQUMsZUFBZ0MsRUFBMkIsRUFBRTtnQkFDbkUsTUFBTSxvQkFBb0IsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsb0JBQW9CLEVBQUU7b0JBQ3pCLE9BQU8sSUFBSSxDQUFDO2lCQUNiO2dCQUVELE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FDeEIsZUFBZSxDQUFDLEtBQUssRUFDckIsdUJBQXVCLENBQ3hCO29CQUNDLENBQUMsQ0FBQyxJQUFJO29CQUNOLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNyRCxDQUFDLENBQUM7U0FDSDtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFNreVVybFZhbGlkYXRpb25PcHRpb25zIH0gZnJvbSAnLi4vdXJsLXZhbGlkYXRpb24vdXJsLXZhbGlkYXRpb24tb3B0aW9ucyc7XG5pbXBvcnQgeyBTa3lWYWxpZGF0aW9uIH0gZnJvbSAnLi4vdmFsaWRhdGlvbi92YWxpZGF0aW9uJztcblxuLy8gTmVlZCB0byBhZGQgdGhlIGZvbGxvd2luZyB0byBjbGFzc2VzIHdoaWNoIGNvbnRhaW4gc3RhdGljIG1ldGhvZHMuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1wYWNrYWdyL25nLXBhY2thZ3IvaXNzdWVzLzY0MVxuLy8gQGR5bmFtaWNcbmV4cG9ydCBjbGFzcyBTa3lWYWxpZGF0b3JzIHtcbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBlbWFpbCBhZGRyZXNzZXMgaW4gcmVhY3RpdmUgZm9ybXMuIEFkZCB0aGlzIHZhbGlkYXRvciBkaXJlY3RseSB0byB0aGUgZm9ybSBjb250cm9sXG4gICAqIG1vZGVsIGluIHRoZSBjb21wb25lbnQgY2xhc3MuIElmIHVzZXJzIGVudGVyIHZhbHVlcyB0aGF0IGFyZSBub3QgdmFsaWQgZW1haWwgYWRkcmVzc2VzLCB0aGVcbiAgICogdmFsaWRhdG9yIHRocm93cyBhbiBlcnJvci4gU2luY2UgdGhpcyBpcyBhIHN5bmMgdmFsaWRhdG9yLCBpdCByZXR1cm5zIGEgc2V0IG9mIHZhbGlkYXRpb25cbiAgICogZXJyb3JzIG9yIGBudWxsYCBpbW1lZGlhdGVseSB3aGVuIHVzZXJzIGVudGVyIHZhbHVlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZW1haWwoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcblxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBTa3lWYWxpZGF0aW9uLmlzRW1haWwodmFsdWUpXG4gICAgICA/IG51bGxcbiAgICAgIDogeyBza3lFbWFpbDogeyBpbnZhbGlkOiB2YWx1ZSB9IH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIFVSTHMgaW4gcmVhY3RpdmUgZm9ybXMuIEFkZCB0aGlzIHZhbGlkYXRvciBkaXJlY3RseSB0byB0aGUgZm9ybSBjb250cm9sIG1vZGVsIGluXG4gICAqIHRoZSBjb21wb25lbnQgY2xhc3MuIElmIHVzZXJzIGVudGVyIHZhbHVlcyB0aGF0IGFyZSBub3QgdmFsaWQgVVJMcywgdGhlIHZhbGlkYXRvciB0aHJvd3MgYW5cbiAgICogZXJyb3IuIFNpbmNlIHRoaXMgaXMgYSBzeW5jIHZhbGlkYXRvciwgaXQgcmV0dXJucyBhIHNldCBvZiB2YWxpZGF0aW9uIGVycm9ycyBvciBgbnVsbGBcbiAgICogaW1tZWRpYXRlbHkgd2hlbiB1c2VycyBlbnRlciB2YWx1ZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVybChhYnN0cmFjdENvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgVVJMcyBpbiByZWFjdGl2ZSBmb3Jtcy4gQWRkIHRoaXMgdmFsaWRhdG9yIHdpdGggcnVsZXNldCBwYXJhbWV0ZXJzIGRpcmVjdGx5IHRvXG4gICAqIHRoZSBmb3JtIGNvbnRyb2wgbW9kZWwgaW4gdGhlIGNvbXBvbmVudCBjbGFzcy4gSWYgdXNlcnMgZW50ZXIgdmFsdWVzIHRoYXQgYXJlIG5vdCB2YWxpZFxuICAgKiBVUkxzLCB0aGUgdmFsaWRhdG9yIHRocm93cyBhbiBlcnJvci4gU2luY2UgdGhpcyBpcyBhIHN5bmMgdmFsaWRhdG9yLCBpdCByZXR1cm5zIGEgc2V0IG9mXG4gICAqIHZhbGlkYXRpb24gZXJyb3JzIG9yIGBudWxsYCBpbW1lZGlhdGVseSB3aGVuIHVzZXJzIGVudGVyIHZhbHVlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXJsKFxuICAgIHNreVVybFZhbGlkYXRpb25PcHRpb25zOiBTa3lVcmxWYWxpZGF0aW9uT3B0aW9uc1xuICApOiBWYWxpZGF0b3JGbiB8IG51bGw7XG5cbiAgcHVibGljIHN0YXRpYyB1cmwoXG4gICAgdmFsdWU6IEFic3RyYWN0Q29udHJvbCB8IFNreVVybFZhbGlkYXRpb25PcHRpb25zXG4gICk6IFZhbGlkYXRvckZuIHwgVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHR5cGVUZXN0ZXIgPSB2YWx1ZSBhcyBTa3lVcmxWYWxpZGF0aW9uT3B0aW9ucztcbiAgICBpZiAodHlwZVRlc3Rlci5ydWxlc2V0VmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyB0aGVyZSBhcmUgbm8gU2t5VXJsVmFsaWRhdGlvbk9wdGlvbnMgcGFzc2VkIGluLCBzbyByZXR1cm4gVmFsaWRhdGlvbkVycm9ycyB8IG51bGxcbiAgICAgIGNvbnN0IGFic3RyYWN0Q29udHJvbCA9IHZhbHVlIGFzIEFic3RyYWN0Q29udHJvbDtcbiAgICAgIGNvbnN0IGFic3RyYWN0Q29udHJvbFZhbHVlID0gYWJzdHJhY3RDb250cm9sLnZhbHVlO1xuICAgICAgaWYgKCFhYnN0cmFjdENvbnRyb2xWYWx1ZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTa3lWYWxpZGF0aW9uLmlzVXJsKGFic3RyYWN0Q29udHJvbFZhbHVlKVxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB7IHNreVVybDogeyBpbnZhbGlkOiBhYnN0cmFjdENvbnRyb2xWYWx1ZSB9IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZXJlIGFyZSBTa3lVcmxWYWxpZGF0aW9uT3B0aW9ucyBwYXNzZWQgaW4sIHNvIHJldHVybiBWYWxpZGF0b3JGblxuICAgICAgY29uc3Qgc2t5VXJsVmFsaWRhdGlvbk9wdGlvbnMgPSB2YWx1ZSBhcyBTa3lVcmxWYWxpZGF0aW9uT3B0aW9ucztcbiAgICAgIHJldHVybiAoYWJzdHJhY3RDb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IGFic3RyYWN0Q29udHJvbFZhbHVlID0gYWJzdHJhY3RDb250cm9sLnZhbHVlO1xuICAgICAgICBpZiAoIWFic3RyYWN0Q29udHJvbFZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gU2t5VmFsaWRhdGlvbi5pc1VybChcbiAgICAgICAgICBhYnN0cmFjdENvbnRyb2wudmFsdWUsXG4gICAgICAgICAgc2t5VXJsVmFsaWRhdGlvbk9wdGlvbnNcbiAgICAgICAgKVxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogeyBza3lVcmw6IHsgaW52YWxpZDogYWJzdHJhY3RDb250cm9sLnZhbHVlIH0gfTtcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,6 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { forwardRef, Directive, NgModule } from '@angular/core';
2
+ import { forwardRef, Directive, NgModule, Input } from '@angular/core';
3
3
  import { NG_VALIDATORS, FormsModule } from '@angular/forms';
4
+ import isURL from 'validator/es/lib/isURL';
4
5
 
5
6
  class SkyValidation {
6
7
  static isEmail(emailAddress) {
@@ -9,9 +10,24 @@ class SkyValidation {
9
10
  const regex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
10
11
  return regex.test(emailAddress);
11
12
  }
12
- static isUrl(url) {
13
+ static isUrl(value, options) {
14
+ if (typeof value !== 'string') {
15
+ return false;
16
+ }
17
+ const url = value;
13
18
  const regex = /^((http|https):\/\/)?([\w-]+\.)+[\w-]+/i;
14
- return regex.test(url);
19
+ if (options) {
20
+ switch (options.rulesetVersion) {
21
+ case 1:
22
+ return regex.test(url);
23
+ case 2:
24
+ // we are using the `validator` package's default options
25
+ return isURL(url);
26
+ }
27
+ }
28
+ else {
29
+ return regex.test(url);
30
+ }
15
31
  }
16
32
  }
17
33
 
@@ -67,6 +83,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
67
83
  }]
68
84
  }] });
69
85
 
86
+ // tslint:disable:no-forward-ref no-use-before-declare
70
87
  const SKY_URL_VALIDATION_VALIDATOR = {
71
88
  provide: NG_VALIDATORS,
72
89
  useExisting: forwardRef(() => SkyUrlValidationDirective),
@@ -78,32 +95,41 @@ const SKY_URL_VALIDATION_VALIDATOR = {
78
95
  * This directive uses `NgModel` to bind data.
79
96
  */
80
97
  class SkyUrlValidationDirective {
98
+ constructor() {
99
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
100
+ this._validatorChange = () => { };
101
+ }
102
+ /**
103
+ * Specifies configuration options for the URL validation component.
104
+ */
105
+ set skyUrlValidation(value) {
106
+ this._skyUrlValidationOptions = value;
107
+ this._validatorChange();
108
+ }
81
109
  validate(control) {
82
110
  const value = control.value;
83
111
  if (!value) {
84
- return;
85
- }
86
- if (!this.urlIsValid(value)) {
87
- return {
88
- skyUrl: {
89
- invalid: control.value,
90
- },
91
- };
112
+ return null;
92
113
  }
114
+ return SkyValidation.isUrl(value, this._skyUrlValidationOptions)
115
+ ? null
116
+ : { skyUrl: { invalid: value } };
93
117
  }
94
- urlIsValid(url) {
95
- return SkyValidation.isUrl(url);
118
+ registerOnValidatorChange(fn) {
119
+ this._validatorChange = fn;
96
120
  }
97
121
  }
98
122
  SkyUrlValidationDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyUrlValidationDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
99
- SkyUrlValidationDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.2", type: SkyUrlValidationDirective, selector: "[skyUrlValidation]", providers: [SKY_URL_VALIDATION_VALIDATOR], ngImport: i0 });
123
+ SkyUrlValidationDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.2", type: SkyUrlValidationDirective, selector: "[skyUrlValidation]", inputs: { skyUrlValidation: "skyUrlValidation" }, providers: [SKY_URL_VALIDATION_VALIDATOR], ngImport: i0 });
100
124
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyUrlValidationDirective, decorators: [{
101
125
  type: Directive,
102
126
  args: [{
103
127
  selector: '[skyUrlValidation]',
104
128
  providers: [SKY_URL_VALIDATION_VALIDATOR],
105
129
  }]
106
- }] });
130
+ }], propDecorators: { skyUrlValidation: [{
131
+ type: Input
132
+ }] } });
107
133
 
108
134
  class SkyUrlValidationModule {
109
135
  }
@@ -127,33 +153,43 @@ class SkyValidators {
127
153
  * Validates email addresses in reactive forms. Add this validator directly to the form control
128
154
  * model in the component class. If users enter values that are not valid email addresses, the
129
155
  * validator throws an error. Since this is a sync validator, it returns a set of validation
130
- * errors or `undefined` immediately when users enter values.
131
- * @param control
156
+ * errors or `null` immediately when users enter values.
132
157
  */
133
158
  static email(control) {
134
159
  const value = control.value;
135
160
  if (!value) {
136
- return undefined;
161
+ return null;
137
162
  }
138
163
  return SkyValidation.isEmail(value)
139
- ? undefined
164
+ ? null
140
165
  : { skyEmail: { invalid: value } };
141
166
  }
142
- /**
143
- * Validates URLs in reactive forms. Add this validator directly to the form control model in
144
- * the component class. If users enter values that are not valid URLs, the validator throws an
145
- * error. Since this is a sync validator, it returns a set of validation errors or `undefined`
146
- * immediately when users enter values.
147
- * @param control
148
- */
149
- static url(control) {
150
- const value = control.value;
151
- if (!value) {
152
- return undefined;
167
+ static url(value) {
168
+ const typeTester = value;
169
+ if (typeTester.rulesetVersion === undefined) {
170
+ // there are no SkyUrlValidationOptions passed in, so return ValidationErrors | null
171
+ const abstractControl = value;
172
+ const abstractControlValue = abstractControl.value;
173
+ if (!abstractControlValue) {
174
+ return null;
175
+ }
176
+ return SkyValidation.isUrl(abstractControlValue)
177
+ ? null
178
+ : { skyUrl: { invalid: abstractControlValue } };
179
+ }
180
+ else {
181
+ // there are SkyUrlValidationOptions passed in, so return ValidatorFn
182
+ const skyUrlValidationOptions = value;
183
+ return (abstractControl) => {
184
+ const abstractControlValue = abstractControl.value;
185
+ if (!abstractControlValue) {
186
+ return null;
187
+ }
188
+ return SkyValidation.isUrl(abstractControl.value, skyUrlValidationOptions)
189
+ ? null
190
+ : { skyUrl: { invalid: abstractControl.value } };
191
+ };
153
192
  }
154
- return SkyValidation.isUrl(value)
155
- ? undefined
156
- : { skyUrl: { invalid: value } };
157
193
  }
158
194
  }
159
195
 
@@ -1 +1 @@
1
- {"version":3,"file":"skyux-validation.mjs","sources":["../../../../../libs/components/validation/src/lib/modules/validation/validation.ts","../../../../../libs/components/validation/src/lib/modules/email-validation/email-validation.directive.ts","../../../../../libs/components/validation/src/lib/modules/email-validation/email-validation.module.ts","../../../../../libs/components/validation/src/lib/modules/url-validation/url-validation.directive.ts","../../../../../libs/components/validation/src/lib/modules/url-validation/url-validation.module.ts","../../../../../libs/components/validation/src/lib/modules/validators/validators.ts","../../../../../libs/components/validation/src/skyux-validation.ts"],"sourcesContent":["export abstract class SkyValidation {\n public static isEmail(emailAddress: string): boolean {\n // The regex was obtained from http://emailregex.com/\n // which claims to correctly handle ~99% of all email addresses.\n const regex =\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n return regex.test(emailAddress);\n }\n\n public static isUrl(url: string): boolean {\n const regex = /^((http|https):\\/\\/)?([\\w-]+\\.)+[\\w-]+/i;\n return regex.test(url);\n }\n}\n","import { Directive, forwardRef } from '@angular/core';\nimport { AbstractControl, NG_VALIDATORS, Validator } from '@angular/forms';\n\nimport { SkyValidation } from '../validation/validation';\n\nconst SKY_EMAIL_VALIDATION_VALIDATOR = {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => SkyEmailValidationDirective),\n multi: true,\n};\n\n/**\n * Creates an input to validate email addresses. Place this attribute on an `input` element.\n * If users enter values that are not valid email addresses, an error message appears.\n * The directive uses `NgModel` to bind data.\n */\n@Directive({\n selector: '[skyEmailValidation]',\n providers: [SKY_EMAIL_VALIDATION_VALIDATOR],\n})\nexport class SkyEmailValidationDirective implements Validator {\n public validate(control: AbstractControl): { [key: string]: any } {\n const value = control.value;\n\n if (!value) {\n return;\n }\n\n if (!this.emailIsValid(value)) {\n return {\n skyEmail: {\n invalid: control.value,\n },\n };\n }\n }\n\n public emailIsValid(email: string): boolean {\n return SkyValidation.isEmail(email);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { SkyEmailValidationDirective } from './email-validation.directive';\n\n@NgModule({\n declarations: [SkyEmailValidationDirective],\n imports: [FormsModule],\n exports: [SkyEmailValidationDirective],\n})\nexport class SkyEmailValidationModule {}\n","import { Directive, forwardRef } from '@angular/core';\nimport { AbstractControl, NG_VALIDATORS, Validator } from '@angular/forms';\n\nimport { SkyValidation } from '../validation/validation';\n\nconst SKY_URL_VALIDATION_VALIDATOR = {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => SkyUrlValidationDirective),\n multi: true,\n};\n\n/**\n * Creates an input to validate URLs. Place this attribute on an `input` element.\n * If users enters values that are not valid URLs, an error message appears.\n * This directive uses `NgModel` to bind data.\n */\n@Directive({\n selector: '[skyUrlValidation]',\n providers: [SKY_URL_VALIDATION_VALIDATOR],\n})\nexport class SkyUrlValidationDirective implements Validator {\n public validate(control: AbstractControl): { [key: string]: any } {\n const value = control.value;\n\n if (!value) {\n return;\n }\n\n if (!this.urlIsValid(value)) {\n return {\n skyUrl: {\n invalid: control.value,\n },\n };\n }\n }\n\n public urlIsValid(url: string): boolean {\n return SkyValidation.isUrl(url);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { SkyUrlValidationDirective } from './url-validation.directive';\n\n@NgModule({\n declarations: [SkyUrlValidationDirective],\n imports: [FormsModule],\n exports: [SkyUrlValidationDirective],\n})\nexport class SkyUrlValidationModule {}\n","import { AbstractControl, ValidationErrors } from '@angular/forms';\n\nimport { SkyValidation } from '../validation/validation';\n\n// Need to add the following to classes which contain static methods.\n// See: https://github.com/ng-packagr/ng-packagr/issues/641\n// @dynamic\nexport class SkyValidators {\n /**\n * Validates email addresses in reactive forms. Add this validator directly to the form control\n * model in the component class. If users enter values that are not valid email addresses, the\n * validator throws an error. Since this is a sync validator, it returns a set of validation\n * errors or `undefined` immediately when users enter values.\n * @param control\n */\n public static email(control: AbstractControl): ValidationErrors | null {\n const value = control.value;\n\n if (!value) {\n return undefined;\n }\n\n return SkyValidation.isEmail(value)\n ? undefined\n : { skyEmail: { invalid: value } };\n }\n\n /**\n * Validates URLs in reactive forms. Add this validator directly to the form control model in\n * the component class. If users enter values that are not valid URLs, the validator throws an\n * error. Since this is a sync validator, it returns a set of validation errors or `undefined`\n * immediately when users enter values.\n * @param control\n */\n public static url(control: AbstractControl): ValidationErrors | null {\n const value = control.value;\n\n if (!value) {\n return undefined;\n }\n\n return SkyValidation.isUrl(value)\n ? undefined\n : { skyUrl: { invalid: value } };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skyux-validation.mjs","sources":["../../../../../libs/components/validation/src/lib/modules/validation/validation.ts","../../../../../libs/components/validation/src/lib/modules/email-validation/email-validation.directive.ts","../../../../../libs/components/validation/src/lib/modules/email-validation/email-validation.module.ts","../../../../../libs/components/validation/src/lib/modules/url-validation/url-validation.directive.ts","../../../../../libs/components/validation/src/lib/modules/url-validation/url-validation.module.ts","../../../../../libs/components/validation/src/lib/modules/validators/validators.ts","../../../../../libs/components/validation/src/skyux-validation.ts"],"sourcesContent":["import isURL from 'validator/es/lib/isURL';\n\nimport { SkyUrlValidationOptions } from '../url-validation/url-validation-options';\n\nexport abstract class SkyValidation {\n public static isEmail(emailAddress: string): boolean {\n // The regex was obtained from http://emailregex.com/\n // which claims to correctly handle ~99% of all email addresses.\n const regex =\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n return regex.test(emailAddress);\n }\n\n public static isUrl(\n value: unknown,\n options?: SkyUrlValidationOptions\n ): boolean {\n if (typeof value !== 'string') {\n return false;\n }\n\n const url: string = value;\n\n const regex = /^((http|https):\\/\\/)?([\\w-]+\\.)+[\\w-]+/i;\n if (options) {\n switch (options.rulesetVersion) {\n case 1:\n return regex.test(url);\n case 2:\n // we are using the `validator` package's default options\n return isURL(url);\n }\n } else {\n return regex.test(url);\n }\n }\n}\n","import { Directive, forwardRef } from '@angular/core';\nimport { AbstractControl, NG_VALIDATORS, Validator } from '@angular/forms';\n\nimport { SkyValidation } from '../validation/validation';\n\nconst SKY_EMAIL_VALIDATION_VALIDATOR = {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => SkyEmailValidationDirective),\n multi: true,\n};\n\n/**\n * Creates an input to validate email addresses. Place this attribute on an `input` element.\n * If users enter values that are not valid email addresses, an error message appears.\n * The directive uses `NgModel` to bind data.\n */\n@Directive({\n selector: '[skyEmailValidation]',\n providers: [SKY_EMAIL_VALIDATION_VALIDATOR],\n})\nexport class SkyEmailValidationDirective implements Validator {\n public validate(control: AbstractControl): { [key: string]: any } {\n const value = control.value;\n\n if (!value) {\n return;\n }\n\n if (!this.emailIsValid(value)) {\n return {\n skyEmail: {\n invalid: control.value,\n },\n };\n }\n }\n\n public emailIsValid(email: string): boolean {\n return SkyValidation.isEmail(email);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { SkyEmailValidationDirective } from './email-validation.directive';\n\n@NgModule({\n declarations: [SkyEmailValidationDirective],\n imports: [FormsModule],\n exports: [SkyEmailValidationDirective],\n})\nexport class SkyEmailValidationModule {}\n","import { Directive, Input, forwardRef } from '@angular/core';\nimport {\n AbstractControl,\n NG_VALIDATORS,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\n\nimport { SkyValidation } from '../validation/validation';\n\nimport { SkyUrlValidationOptions } from './url-validation-options';\n\n// tslint:disable:no-forward-ref no-use-before-declare\nconst SKY_URL_VALIDATION_VALIDATOR = {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => SkyUrlValidationDirective),\n multi: true,\n};\n\n/**\n * Creates an input to validate URLs. Place this attribute on an `input` element.\n * If users enters values that are not valid URLs, an error message appears.\n * This directive uses `NgModel` to bind data.\n */\n@Directive({\n selector: '[skyUrlValidation]',\n providers: [SKY_URL_VALIDATION_VALIDATOR],\n})\nexport class SkyUrlValidationDirective implements Validator {\n /**\n * Specifies configuration options for the URL validation component.\n */\n @Input()\n public set skyUrlValidation(value: SkyUrlValidationOptions | undefined) {\n this._skyUrlValidationOptions = value;\n this._validatorChange();\n }\n\n private _skyUrlValidationOptions: SkyUrlValidationOptions | undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _validatorChange = () => {};\n\n public validate(control: AbstractControl): ValidationErrors | null {\n const value = control.value;\n\n if (!value) {\n return null;\n }\n\n return SkyValidation.isUrl(value, this._skyUrlValidationOptions)\n ? null\n : { skyUrl: { invalid: value } };\n }\n\n public registerOnValidatorChange(fn: () => void): void {\n this._validatorChange = fn;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { SkyUrlValidationDirective } from './url-validation.directive';\n\n@NgModule({\n declarations: [SkyUrlValidationDirective],\n imports: [FormsModule],\n exports: [SkyUrlValidationDirective],\n})\nexport class SkyUrlValidationModule {}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nimport { SkyUrlValidationOptions } from '../url-validation/url-validation-options';\nimport { SkyValidation } from '../validation/validation';\n\n// Need to add the following to classes which contain static methods.\n// See: https://github.com/ng-packagr/ng-packagr/issues/641\n// @dynamic\nexport class SkyValidators {\n /**\n * Validates email addresses in reactive forms. Add this validator directly to the form control\n * model in the component class. If users enter values that are not valid email addresses, the\n * validator throws an error. Since this is a sync validator, it returns a set of validation\n * errors or `null` immediately when users enter values.\n */\n public static email(control: AbstractControl): ValidationErrors | null {\n const value = control.value;\n\n if (!value) {\n return null;\n }\n\n return SkyValidation.isEmail(value)\n ? null\n : { skyEmail: { invalid: value } };\n }\n\n /**\n * Validates URLs in reactive forms. Add this validator directly to the form control model in\n * the component class. If users enter values that are not valid URLs, the validator throws an\n * error. Since this is a sync validator, it returns a set of validation errors or `null`\n * immediately when users enter values.\n */\n public static url(abstractControl: AbstractControl): ValidationErrors | null;\n\n /**\n * Validates URLs in reactive forms. Add this validator with ruleset parameters directly to\n * the form control model in the component class. If users enter values that are not valid\n * URLs, the validator throws an error. Since this is a sync validator, it returns a set of\n * validation errors or `null` immediately when users enter values.\n */\n public static url(\n skyUrlValidationOptions: SkyUrlValidationOptions\n ): ValidatorFn | null;\n\n public static url(\n value: AbstractControl | SkyUrlValidationOptions\n ): ValidatorFn | ValidationErrors | null {\n const typeTester = value as SkyUrlValidationOptions;\n if (typeTester.rulesetVersion === undefined) {\n // there are no SkyUrlValidationOptions passed in, so return ValidationErrors | null\n const abstractControl = value as AbstractControl;\n const abstractControlValue = abstractControl.value;\n if (!abstractControlValue) {\n return null;\n }\n return SkyValidation.isUrl(abstractControlValue)\n ? null\n : { skyUrl: { invalid: abstractControlValue } };\n } else {\n // there are SkyUrlValidationOptions passed in, so return ValidatorFn\n const skyUrlValidationOptions = value as SkyUrlValidationOptions;\n return (abstractControl: AbstractControl): ValidationErrors | null => {\n const abstractControlValue = abstractControl.value;\n if (!abstractControlValue) {\n return null;\n }\n\n return SkyValidation.isUrl(\n abstractControl.value,\n skyUrlValidationOptions\n )\n ? null\n : { skyUrl: { invalid: abstractControl.value } };\n };\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { forwardRef, Directive, NgModule } from '@angular/core';
2
+ import { forwardRef, Directive, NgModule, Input } from '@angular/core';
3
3
  import { NG_VALIDATORS, FormsModule } from '@angular/forms';
4
+ import isURL from 'validator/es/lib/isURL';
4
5
 
5
6
  class SkyValidation {
6
7
  static isEmail(emailAddress) {
@@ -9,9 +10,24 @@ class SkyValidation {
9
10
  const regex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
10
11
  return regex.test(emailAddress);
11
12
  }
12
- static isUrl(url) {
13
+ static isUrl(value, options) {
14
+ if (typeof value !== 'string') {
15
+ return false;
16
+ }
17
+ const url = value;
13
18
  const regex = /^((http|https):\/\/)?([\w-]+\.)+[\w-]+/i;
14
- return regex.test(url);
19
+ if (options) {
20
+ switch (options.rulesetVersion) {
21
+ case 1:
22
+ return regex.test(url);
23
+ case 2:
24
+ // we are using the `validator` package's default options
25
+ return isURL(url);
26
+ }
27
+ }
28
+ else {
29
+ return regex.test(url);
30
+ }
15
31
  }
16
32
  }
17
33
 
@@ -67,6 +83,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
67
83
  }]
68
84
  }] });
69
85
 
86
+ // tslint:disable:no-forward-ref no-use-before-declare
70
87
  const SKY_URL_VALIDATION_VALIDATOR = {
71
88
  provide: NG_VALIDATORS,
72
89
  useExisting: forwardRef(() => SkyUrlValidationDirective),
@@ -78,32 +95,41 @@ const SKY_URL_VALIDATION_VALIDATOR = {
78
95
  * This directive uses `NgModel` to bind data.
79
96
  */
80
97
  class SkyUrlValidationDirective {
98
+ constructor() {
99
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
100
+ this._validatorChange = () => { };
101
+ }
102
+ /**
103
+ * Specifies configuration options for the URL validation component.
104
+ */
105
+ set skyUrlValidation(value) {
106
+ this._skyUrlValidationOptions = value;
107
+ this._validatorChange();
108
+ }
81
109
  validate(control) {
82
110
  const value = control.value;
83
111
  if (!value) {
84
- return;
85
- }
86
- if (!this.urlIsValid(value)) {
87
- return {
88
- skyUrl: {
89
- invalid: control.value,
90
- },
91
- };
112
+ return null;
92
113
  }
114
+ return SkyValidation.isUrl(value, this._skyUrlValidationOptions)
115
+ ? null
116
+ : { skyUrl: { invalid: value } };
93
117
  }
94
- urlIsValid(url) {
95
- return SkyValidation.isUrl(url);
118
+ registerOnValidatorChange(fn) {
119
+ this._validatorChange = fn;
96
120
  }
97
121
  }
98
122
  SkyUrlValidationDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyUrlValidationDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
99
- SkyUrlValidationDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.2", type: SkyUrlValidationDirective, selector: "[skyUrlValidation]", providers: [SKY_URL_VALIDATION_VALIDATOR], ngImport: i0 });
123
+ SkyUrlValidationDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.2", type: SkyUrlValidationDirective, selector: "[skyUrlValidation]", inputs: { skyUrlValidation: "skyUrlValidation" }, providers: [SKY_URL_VALIDATION_VALIDATOR], ngImport: i0 });
100
124
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyUrlValidationDirective, decorators: [{
101
125
  type: Directive,
102
126
  args: [{
103
127
  selector: '[skyUrlValidation]',
104
128
  providers: [SKY_URL_VALIDATION_VALIDATOR],
105
129
  }]
106
- }] });
130
+ }], propDecorators: { skyUrlValidation: [{
131
+ type: Input
132
+ }] } });
107
133
 
108
134
  class SkyUrlValidationModule {
109
135
  }
@@ -127,33 +153,43 @@ class SkyValidators {
127
153
  * Validates email addresses in reactive forms. Add this validator directly to the form control
128
154
  * model in the component class. If users enter values that are not valid email addresses, the
129
155
  * validator throws an error. Since this is a sync validator, it returns a set of validation
130
- * errors or `undefined` immediately when users enter values.
131
- * @param control
156
+ * errors or `null` immediately when users enter values.
132
157
  */
133
158
  static email(control) {
134
159
  const value = control.value;
135
160
  if (!value) {
136
- return undefined;
161
+ return null;
137
162
  }
138
163
  return SkyValidation.isEmail(value)
139
- ? undefined
164
+ ? null
140
165
  : { skyEmail: { invalid: value } };
141
166
  }
142
- /**
143
- * Validates URLs in reactive forms. Add this validator directly to the form control model in
144
- * the component class. If users enter values that are not valid URLs, the validator throws an
145
- * error. Since this is a sync validator, it returns a set of validation errors or `undefined`
146
- * immediately when users enter values.
147
- * @param control
148
- */
149
- static url(control) {
150
- const value = control.value;
151
- if (!value) {
152
- return undefined;
167
+ static url(value) {
168
+ const typeTester = value;
169
+ if (typeTester.rulesetVersion === undefined) {
170
+ // there are no SkyUrlValidationOptions passed in, so return ValidationErrors | null
171
+ const abstractControl = value;
172
+ const abstractControlValue = abstractControl.value;
173
+ if (!abstractControlValue) {
174
+ return null;
175
+ }
176
+ return SkyValidation.isUrl(abstractControlValue)
177
+ ? null
178
+ : { skyUrl: { invalid: abstractControlValue } };
179
+ }
180
+ else {
181
+ // there are SkyUrlValidationOptions passed in, so return ValidatorFn
182
+ const skyUrlValidationOptions = value;
183
+ return (abstractControl) => {
184
+ const abstractControlValue = abstractControl.value;
185
+ if (!abstractControlValue) {
186
+ return null;
187
+ }
188
+ return SkyValidation.isUrl(abstractControl.value, skyUrlValidationOptions)
189
+ ? null
190
+ : { skyUrl: { invalid: abstractControl.value } };
191
+ };
153
192
  }
154
- return SkyValidation.isUrl(value)
155
- ? undefined
156
- : { skyUrl: { invalid: value } };
157
193
  }
158
194
  }
159
195