{"version":3,"file":"aegis-techno-ngx-model-forms.mjs","sources":["../../../../libs/ngx-model-forms/src/lib/directive/form-validation-scope.directive.ts","../../../../libs/ngx-model-forms/src/lib/components/input-base.component.ts","../../../../libs/ngx-model-forms/src/lib/components/input-base-error.component.ts","../../../../libs/ngx-model-forms/src/lib/tokens/async-validation-suite-factories.token.ts","../../../../libs/ngx-model-forms/src/lib/tokens/sync-validation-suites.token.ts","../../../../libs/ngx-model-forms/src/lib/tokens/validation-context.token.ts","../../../../libs/ngx-model-forms/src/lib/validators/vest-async-field.validator.ts","../../../../libs/ngx-model-forms/src/lib/validators/vest-sync-field.validator.ts","../../../../libs/ngx-model-forms/src/lib/directive/form-field-ng-model.directive.ts","../../../../libs/ngx-model-forms/src/lib/providers/form-container-view.provider.ts","../../../../libs/ngx-model-forms/src/lib/utils/unit-test-validation-helpers.ts","../../../../libs/ngx-model-forms/src/lib/utils/validation-helpers.ts","../../../../libs/ngx-model-forms/src/test/models/us-states.model.ts","../../../../libs/ngx-model-forms/src/test/validations-suites/address-sync.validations-suite.ts","../../../../libs/ngx-model-forms/src/test/services/remote-fein-validation.service.ts","../../../../libs/ngx-model-forms/src/test/services/fein-validation.service.ts","../../../../libs/ngx-model-forms/src/test/validations-suites/company-async.validations-suite.ts","../../../../libs/ngx-model-forms/src/test/validations-suites/company-sync.validations-suite.ts","../../../../libs/ngx-model-forms/src/test/providers/validation-suites.providers.ts"],"sourcesContent":["import {Directive, Input, OnChanges, SimpleChanges} from '@angular/core';\nimport {Indexable} from '@aegis-techno/ngx-core';\nimport {Subject} from 'rxjs';\nimport {ValidationContext} from '../models/validation-context.model';\n\n/** Set the validation scope variables on a form, ngModelGroup, or an element with a `ngxValModel` attribute.\n * Must specify model and modelType to match this directive.\n */\n@Directive({\n    selector:\n        'form[ngxModel][modelType]:not([ngNoForm]):not([formGroup]),ng-form[ngxModel][modelType],[ngForm][ngxModel][modelType],[ngModelGroup][ngxModel][modelType],[ngxValModel]',\n    standalone: true,\n})\nexport class FormValidationScopeDirective implements OnChanges {\n    /** data model whose properties will be validated. Required. */\n    @Input() ngxModel: Indexable | undefined;\n\n    /** Name of the type of model to be validated. Identifies the suite of validators to apply. Required.  */\n    @Input() modelType: string | undefined;\n\n    /** Name of the type of model to be validated. Identifies the suite of validators to apply. Required.  */\n    @Input() readonly = false;\n\n    /** Group name of tests within the validaotion suite. Only process tests in that group. */\n    @Input() group?: string;\n\n    /** Context that validators may reference for external information and services. */\n    @Input() context?: ValidationContext;\n\n    private changeSubject = new Subject<any>();\n\n    /** Observable that emits when any of the validation scope inputs changed. */\n    changed = this.changeSubject.asObservable();\n\n    ngOnChanges(_changes: SimpleChanges): void {\n        this.changeSubject.next(null);\n    }\n}\n","import {\n    AfterViewInit,\n    Component,\n    ElementRef,\n    EventEmitter,\n    HostBinding,\n    Input,\n    OnChanges,\n    OnDestroy,\n    OnInit,\n    Optional,\n    Output,\n    ViewChild,\n} from '@angular/core';\nimport {FormControl, NgModel, Validators} from '@angular/forms';\nimport {Booleans, Indexable, Objects} from '@aegis-techno/ngx-core';\nimport {Subscription} from 'rxjs';\nimport {FormValidationScopeDirective} from '../directive/form-validation-scope.directive';\nimport {ValidationContext} from '../models/validation-context.model';\n\nexport type FormHooks = 'change' | 'blur' | 'submit';\n\nexport interface NgModelOptions {\n    name?: string;\n    standalone?: boolean;\n    updateOn?: FormHooks;\n}\n\nexport function trim(value: any | null) {\n    return typeof value === 'string' ? value.trim() : value;\n}\n\nclass NameCounter {\n    counter = 0;\n\n    get next() {\n        return this.counter++;\n    }\n}\n\nexport const nameCounter = new NameCounter();\n\n/** Base component for input element wrapper classes. Never instantiated! */\n// Shouldn't have a Component decorator but Angular won't compile w/o it.\n@Component({\n    standalone: true,\n    selector: 'ngx-input-base',\n    template: '',\n})\nexport abstract class InputBaseComponent<ItemType> implements AfterViewInit, OnInit, OnChanges, OnDestroy {\n    @HostBinding('class')\n    public readonly class = 'tw-flex-col tw-w-full input-base';\n\n    @Input() context?: ValidationContext;\n\n    @HostBinding('class.input-base-disabled')\n    @Input()\n    get disabled(): boolean {\n        return this._disabled;\n    }\n\n    set disabled(value: any) {\n        this._disabled = Booleans.coerceBoolean(value);\n    }\n\n    @HostBinding('class.input-base-readonly')\n    @Input()\n    get readonly(): boolean {\n        return this._readonly;\n    }\n\n    set readonly(value: any) {\n        this._readonly = Booleans.coerceBoolean(value);\n    }\n\n    protected _disabled = false;\n    protected _readonly = false;\n\n    @Input() field?: string;\n    @Input() group?: string;\n    @Input() label?: string;\n    @Input()\n    public suffixIcon?: string;\n    // eslint-disable-next-line @angular-eslint/no-input-rename\n    @Input('model') inputModel?: Indexable;\n    @Input() modelType?: string;\n    @Input() name?: string;\n    @Input() placeholder = '';\n    @Input() type = 'text';\n    @Input() updateOn?: FormHooks;\n    @Input() className = 'tw-flex-col tw-w-full';\n    @Input() required = false;\n\n    /** Emit when the field value changes. */\n    @Output() changed = new EventEmitter<ItemType | null>();\n\n    @ViewChild('input') inputElRef?: ElementRef;\n    @ViewChild('ngModel') ngModel?: NgModel;\n\n    control?: FormControl;\n    private hostEl: HTMLInputElement = this.hostElRef.nativeElement;\n    model?: Indexable;\n    protected ngModelOptions?: NgModelOptions;\n    originalValue: ItemType | null = null;\n    scopeSub?: Subscription;\n\n    get value(): ItemType | null {\n        return this.model![this.field!];\n    }\n\n    set value(val: ItemType | null) {\n        // TODO: coerce value to type of original value\n        val = trim(val);\n        if (this.field) {\n            this.model![this.field] = val;\n        }\n        this.changed.emit(val);\n        if (!!this.ngModel && !!this.ngModel.control) {\n            this.ngModel.control.markAsDirty();\n            this.ngModel.control.markAsTouched();\n        }\n    }\n\n    protected constructor(\n        @Optional() protected formValidationScope: FormValidationScopeDirective,\n        protected hostElRef: ElementRef\n    ) {\n        // Apply the class attribute on the host; if none, apply app standard CSS classes\n        this.scopeSub = formValidationScope?.changed.subscribe((_: any) => this.ngOnChanges()); // might reset the model\n    }\n\n    ngOnChanges(): void {\n        // only care about inputModel and updateOn changes; changes to other input vars are ignored.\n        // inputModel trumps validation scope model\n        this.model = this.inputModel ?? this.formValidationScope?.ngxModel ?? {};\n        if (this.updateOn) {\n            this.ngModelOptions = {updateOn: this.updateOn};\n        }\n    }\n\n    ngOnInit(): void {\n        this.field = this.field ?? this.name;\n        this.name = this.name ?? `${this.field ?? ''}$${nameCounter.next}`;\n        this.originalValue = trim(this.model![this.field!]);\n    }\n\n    ngAfterViewInit() {\n        this.control = this.ngModel!.control;\n        if (this.hostEl.hasAttribute('required')) {\n            // Pass it along to the nested input element\n            // Wait a tick to bypass ExpressionChangedAfterItHasBeenCheckedError\n            setTimeout(() => {\n                // Adding the required validator triggers Angular Material\n                // to add the required attribute and update the label with the required marker.\n                this.control!.addValidators(Validators.required);\n                this.control!.updateValueAndValidity({onlySelf: true});\n            });\n        }\n    }\n\n    ngOnDestroy(): void {\n        this.scopeSub?.unsubscribe();\n    }\n\n    /** User pressed escape. Restores original value */\n    protected escaped(inputElm?: HTMLElement) {\n        const elRef: HTMLInputElement = this.inputElRef?.nativeElement ?? inputElm;\n        if (Objects.isDefined(elRef)) {\n            const elementValue = elRef.value;\n            if (elementValue !== this.originalValue) {\n                this.value = this.originalValue;\n            }\n        }\n    }\n}\n","import {CommonModule} from '@angular/common';\nimport {Component, Input, OnDestroy, OnInit} from '@angular/core';\nimport {AbstractControl, ValidationErrors} from '@angular/forms';\nimport {Subscription} from 'rxjs';\n\n@Component({\n    selector: 'ngx-input-base-error',\n    imports: [CommonModule],\n    template: '',\n})\nexport class InputBaseErrorComponent implements OnDestroy, OnInit {\n    @Input() control?: AbstractControl;\n\n    error?: ValidationErrors | null;\n    pending = false;\n\n    private sub?: Subscription;\n\n    get show() {\n        return !!this.control?.touched;\n    }\n\n    ngOnInit(): void {\n        if (this.control) {\n            const control = this.control;\n            this.sub = control.statusChanges.subscribe((changes) => {\n                this.error = null;\n                this.pending = false;\n                if (changes === 'INVALID') {\n                    if (control.errors) {\n                        const newError: any = control.errors['error'];\n                        this.error = typeof newError == 'string' ? {message: newError} : newError;\n                    } else {\n                        this.error = null;\n                    }\n                } else {\n                    this.pending = changes === 'PENDING';\n                    this.error = null;\n                }\n            });\n        }\n    }\n\n    ngOnDestroy(): void {\n        this.sub?.unsubscribe();\n    }\n}\n","import {InjectionToken} from '@angular/core';\n\nexport const ASYNC_VALIDATION_SUITE_FACTORIES = new InjectionToken('Async Validation Suite Factories');\n","import {InjectionToken} from '@angular/core';\n\nexport const SYNC_VALIDATION_SUITES = new InjectionToken('Synchronous Validation Suites');\n","import {InjectionToken} from '@angular/core';\nimport {ValidationContext} from '../models/validation-context.model';\n\n/** Injection token for the global validation context. The app can implement and provide with this token. */\nexport const VALIDATION_CONTEXT = new InjectionToken<ValidationContext>('ValidationContext');\n","import {Indexable} from '@aegis-techno/ngx-core';\nimport {AbstractControl, AsyncValidatorFn, ValidationErrors} from '@angular/forms';\nimport {ValidationContext} from '../models/validation-context.model';\nimport {ValidationSuite} from '../models/validation-suite.model';\n\n/** Create Angular asynchronous validator function for a single field of the model in the validation context\n * When validation fails, the function returns a validation errors with two properties:\n * `error` - the first vest validation error,\n * `errors` - all of the vest validation errors for that field.\n * @param suite that creates the vest suite with async validation rules.\n * @param field to validate\n * @param [model] the view model data to validate or a function returning such a model\n * Merges the control.value as the field property of that model.\n * @param [group] the name of a group of tests; only process tests in this group.\n * @param [context] global contextual data passed to vest validation rules.\n *\n * The must be a unique instance!\n *\n * Each async validator needs its own instance of the async vest suite.\n * You can only call `done()` once per suite invocation.\n * If you call `done()` twice while an async operation is flight,\n * that operation's resolution will not be caught by the later `done()`.\n * So we need to isolate suite instances.\n */\nexport function vestAsyncFieldValidator(\n    suite: ValidationSuite,\n    field: string,\n    model?: Indexable | (() => Indexable),\n    group?: string,\n    context?: ValidationContext\n): AsyncValidatorFn {\n    // console.log(`*** Creating vestAsyncValidator for field ${field}`)\n    const vestAsyncValidator = (control: AbstractControl): Promise<ValidationErrors | null> => {\n        const promise = new Promise<ValidationErrors | null>((resolve) => {\n            // console.log(`async validator for ${field} started`);\n            let mod: Indexable = typeof model == 'function' ? model() : model;\n            // Merge control.value because ngModel will not have updated the viewModel yet.\n            mod = {...mod, [field]: control.value};\n            suite(mod, field, group, context)\n                .done(field, (result: any) => {\n                    // console.log(`async validator for ${field} resolved`);\n                    const errors = result.getErrors()[field];\n                    resolve(errors ? {error: errors[0], errors} : null);\n                })\n                // Catch case where the field has no async validations\n                .done((_result: any) => {\n                    // All validations complete. Resolve w/o error.\n                    // Harmless if field DID have async validation and resolved earlier\n                    // because this second call to `resolve` would do nothing.\n                    // But if the field did NOT have an async validation,\n                    // the earlier field resolve would not have been called and\n                    // the field status would be \"PENDING\" forever.\n                    // Example: comment out all async validations for \"legalName\".\n                    resolve(null);\n                });\n        });\n        return promise;\n    };\n    return vestAsyncValidator;\n}\n","import {Indexable} from '@aegis-techno/ngx-core';\nimport {AbstractControl, ValidationErrors, ValidatorFn, Validators} from '@angular/forms';\nimport {ValidationContext} from '../models/validation-context.model';\nimport {ValidationSuite} from '../models/validation-suite.model';\n\n/** Create Angular synchronous validator function for a single field of the model in the validation context.\n * When validation fails, the function returns a validation errors with two properties:\n * `error` - the first vest validation error,\n * `errors` - all of the vest validation errors for that field.\n * @param suite the vest suite with validation rules\n * @param field to validate\n * @param [model] the view model data to validate or a function returning such a model\n * Merges the control.value as the field property of that model.\n * @param [group] the name of a group of tests; only process tests in this group.\n * @param [context] global contextual data passed to vest validation rules.\n */\nexport function vestSyncFieldValidator(\n    suite: ValidationSuite, // the validations\n    field: string, // the property to validate\n    model?: Indexable | (() => Indexable), // the view model with the data to validate\n    group?: string, // the group of properties to validate (if specified)\n    context?: ValidationContext // extra stuff validators could use\n): ValidatorFn | ValidatorFn[] {\n    const vestValidator = (control: AbstractControl): ValidationErrors | null => {\n        let mod: Indexable = typeof model == 'function' ? model() : model;\n        // Merge `control.value` because ngModel will not have updated the viewModel yet.\n        mod = {...mod, [field]: control.value};\n        const result = suite(mod, field, group, context).getErrors();\n        const errors = result[field];\n        return errors ? {error: errors[0], errors} : null;\n    };\n\n    // HACK to find out if the field is required.\n    // Angular Material  looks for an Angular required validator and draws the component label accordingly.\n    // So if we discover that the field is required, \"compose\" with that Angular required validator\n    const testRun = suite({[field]: null}, field, group, context).getErrors();\n    const isRequired = (testRun[field] ?? []).some((err: any) => err.includes('required'));\n    return isRequired ? [vestValidator, Validators.required] : vestValidator;\n}\n","import {Directive, Inject, Input, OnChanges, OnDestroy, Optional} from '@angular/core';\nimport {NgModel} from '@angular/forms';\nimport {Indexable} from '@aegis-techno/ngx-core';\nimport {Subscription} from 'rxjs';\nimport {AsyncValidationSuiteFactories} from '../models/async-validation-suite-factories.model';\nimport {SyncValidationSuites} from '../models/sync-validation-suites.model';\nimport {ValidationContext} from '../models/validation-context.model';\nimport {ASYNC_VALIDATION_SUITE_FACTORIES} from '../tokens/async-validation-suite-factories.token';\nimport {SYNC_VALIDATION_SUITES} from '../tokens/sync-validation-suites.token';\nimport {VALIDATION_CONTEXT} from '../tokens/validation-context.token';\nimport {vestAsyncFieldValidator} from '../validators/vest-async-field.validator';\nimport {vestSyncFieldValidator} from '../validators/vest-sync-field.validator';\nimport {FormValidationScopeDirective} from './form-validation-scope.directive';\n\n/** Sets validators for Template-Driven controls using NgModel\n * Skipped if element with `[ngModel]` also has `no-val` attribute\n */\n@Directive({\n    // eslint-disable-next-line @angular-eslint/directive-selector\n    selector: '[ngModel]:not([no-val])',\n    standalone: true,\n})\nexport class FormFieldNgModelDirective implements OnChanges, OnDestroy {\n    /** Context that validators may reference for external information and services.\n     * Blended with global ValidationContext and parent FormValidationModelDirective context.\n     * Optional.\n     */\n    @Input() context?: ValidationContext;\n\n    /** Field name to validate. Should be a property of the model.\n     * If not specified, will use the NgModel control's name (value of the `name` attribute).\n     */\n    @Input() field?: string;\n\n    /** Group name of tests within the validation suite.\n     * If not specified, try to pick up from parent FormValidationModelDirective.\n     * If there is a group name, only process tests in that group.\n     */\n    @Input() group?: string;\n\n    /** Data model whose properties will be validated.\n     * If not specified, try to pick up from parent FormValidationModelDirective.\n     */\n    @Input() model?: Indexable;\n\n    /** Name of the type of model to be validated. Identifies the suite of validators to apply.\n     * If not specified, try to pick up from parent FormValidationModelDirective.\n     * Required for validation.\n     */\n    @Input() modelType?: string;\n\n    private scopeSub?: Subscription;\n\n    constructor(\n        @Optional() private formValidationScope: FormValidationScopeDirective,\n        @Optional()\n        @Inject(ASYNC_VALIDATION_SUITE_FACTORIES)\n        private asyncValidationSuiteFactories: AsyncValidationSuiteFactories,\n        @Optional()\n        @Inject(SYNC_VALIDATION_SUITES)\n        private syncValidationSuites: SyncValidationSuites,\n        @Optional()\n        @Inject(VALIDATION_CONTEXT)\n        private globalContext: ValidationContext,\n        /** Form control for the ngModel directive */\n        private ngModel: NgModel\n    ) {\n        if (formValidationScope) {\n            // (re)setup validation if the validation scope was updated.\n            this.scopeSub = this.formValidationScope.changed.subscribe((_) => this.ngOnChanges());\n        }\n    }\n\n    ngOnChanges(): void {\n        if (!this.syncValidationSuites && !this.asyncValidationSuiteFactories) {\n            throw 'FormFieldNgModelDirective: cannot validate because there are no registered validation suites.';\n        }\n\n        const ngModelControl = this.ngModel.control;\n\n        const field = this.field ?? this.ngModel.name; // if no field name, assume the name of the control is the field name.\n        const modelType = this.modelType ?? this.formValidationScope?.modelType;\n\n        const model = this.model ?? this.formValidationScope?.ngxModel;\n\n        if (!field || !model || !modelType) {\n            // Must have the field, model, and modelType to add a validator.\n            (ngModelControl as any)._validationMetadata = undefined; // NOT adding validators\n            return;\n        }\n\n        // Blend contexts with more local context (ex: this.context) taking precedence.\n        const context = {\n            ...this.globalContext,\n            ...this.formValidationScope?.context,\n            ...this.context,\n        };\n        const group = this.group ?? this.formValidationScope?.group;\n        (ngModelControl as any)._validationMetadata = {field, modelType};\n\n        if (this.formValidationScope.readonly) {\n            ngModelControl.clearValidators();\n            ngModelControl.updateValueAndValidity();\n            return;\n        }\n\n        if (this.syncValidationSuites) {\n            const suite = this.syncValidationSuites[modelType];\n            if (suite) {\n                const validator = vestSyncFieldValidator(suite, field, model, group, context);\n                ngModelControl.clearValidators();\n                ngModelControl.addValidators(validator);\n            }\n        }\n\n        /* Async suite factory creates a vest suite of async validations for the given model type\n         *\n         * Each async validator needs its own instance of the async vest suite.\n         * You can only call `done()` once per suite invocation.\n         * If you call `done()` twice while an async operation is flight,\n         * that operation's resolution will not be caught by the later `done()`.\n         * So we need to isolate suite instances.\n         */\n        if (this.asyncValidationSuiteFactories) {\n            const asyncSuiteFactory = this.asyncValidationSuiteFactories[modelType];\n            if (asyncSuiteFactory) {\n                const asyncSuite = asyncSuiteFactory();\n                const validator = vestAsyncFieldValidator(asyncSuite, field, model, group, context);\n                ngModelControl.clearAsyncValidators();\n                ngModelControl.addAsyncValidators(validator);\n            }\n        }\n\n        ngModelControl.updateValueAndValidity();\n    }\n\n    ngOnDestroy(): void {\n        this.scopeSub?.unsubscribe();\n    }\n}\n","import {inject, Provider} from '@angular/core';\nimport {ControlContainer, NgForm, NgModelGroup} from '@angular/forms';\n\nexport const formContainerViewProvider: Provider = {\n    provide: ControlContainer,\n    useFactory: formContainerFactory,\n};\n\nexport function formContainerFactory() {\n    const ngModelGroup = inject(NgModelGroup, {optional: true});\n    const ngForm = inject(NgForm, {optional: true});\n    return ngModelGroup ?? ngForm ?? null;\n}\n","import {SuiteResult, SuiteRunResult} from 'vest';\n\nexport type MatcherResult = {\n    pass: boolean;\n    message?: string;\n};\n\nexport function hasExpectedFieldError(actual: SuiteRunResult | SuiteResult, field: string, errRegExp?: RegExp): MatcherResult {\n    const errors = actual.getErrors()[field];\n    let message: string | undefined;\n    if (errors) {\n        if (errRegExp && !errors.some((e) => errRegExp.test(e))) {\n            message = `Expected one of the \"${field}\" errors to match ${errRegExp}; got ${JSON.stringify(errors)}`;\n        }\n    } else {\n        message = `Expected errors for field \"${field}\" but got none`;\n    }\n    const pass = message == null;\n    expect(pass).toBe(true);\n    return {\n        pass,\n        message: pass ? `has expected error for \"${field}\"` : message,\n    };\n}\n\nexport function hasNoFieldErrors(actual: SuiteRunResult | SuiteResult, field: string): MatcherResult {\n    const errors = actual.getErrors()[field];\n    let message: string | undefined;\n    if (errors) {\n        message = `Expected no errors for field \"${field}\" but got ${JSON.stringify(errors)}`;\n    }\n    const pass = message == null;\n    // Result and message generation.\n    expect(pass).toBe(true);\n    return {\n        pass,\n        message: pass ? `\"${field}\" has no errors` : message,\n    };\n}\n","import {Indexable, Numbers, Objects} from '@aegis-techno/ngx-core';\nimport {enforce, omitWhen, test} from 'vest';\n\nexport function testRequired(model: Partial<Indexable>, fieldName: string): void {\n    test(fieldName, `validationsErrors.global.required`, () => {\n        enforce(Objects.isDefined(model[fieldName])).isTruthy();\n    });\n}\n\nexport function testMaxLength(model: Partial<Indexable>, fieldName: string, max: number): void {\n    omitWhen(\n        () => !model[fieldName],\n        () => {\n            test(fieldName, `validationsErrors.global.maxLength__${max}`, () => {\n                enforce(model[fieldName].length < max).isTruthy();\n            });\n        }\n    );\n}\n\nexport function testMin(model: Partial<Indexable>, fieldName: string, min: number): void {\n    omitWhen(\n        () => !model[fieldName],\n        () => {\n            test(fieldName, `validationsErrors.global.min__${min}`, () => {\n                enforce(Numbers.parseFormatted(model[fieldName]) ?? 0).greaterThanOrEquals(min);\n            });\n        }\n    );\n}\n","import {Indexable} from '@aegis-techno/ngx-core';\n\n/** Map of US state names to their abbreviations */\nexport const UsStates = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS', disabled: true},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {\n        name: 'Federated States Of Micronesia',\n        abbreviation: 'FM',\n        disabled: true,\n    },\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH', disabled: true},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP', disabled: true},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW', disabled: true},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'},\n];\n\nexport const UsStatesSelectOptions = toSelectOptions(UsStates, 'name', 'abbreviation');\n\nexport interface SelectOption {\n    name: string;\n    value: any;\n    disabled?: boolean;\n}\n\nfunction toSelectOptions(\n    source: Array<Indexable> | null | undefined,\n    /** Source property to be mapped to `name`. */\n    nameProp = 'name',\n    /** Source property to be mapped to `value`. */\n    valueProp = 'value',\n    /** Source property indicating if option is disabled (false by default). */\n    disabledProp = 'disabled'\n): SelectOption[] {\n    return (source ?? []).map((opt) => ({\n        name: opt[nameProp],\n        value: opt[valueProp],\n        disabled: opt[disabledProp] === true,\n    }));\n}\n","import {create, enforce, omitWhen, only, test} from 'vest';\nimport {ValidationContext} from '../../lib/models/validation-context.model';\nimport {ValidationSuiteFn} from '../../lib/models/validation-suite-fn.model';\nimport {ValidationSuite} from '../../lib/models/validation-suite.model';\nimport {Address} from '../models/address.model';\nimport {UsStates} from '../models/us-states.model';\n\nexport const addressSyncValidationSuite: ValidationSuite = create(\n    'AddressSyncValidationSuite',\n    (model: Partial<Address>, field?: string, groupName?: string, context?: ValidationContext) => {\n        only(field); // if field defined, limit to tests of this field\n        addressSyncValidations(model, field, groupName, context);\n    }\n);\n\nexport const addressSyncValidations: ValidationSuiteFn = (model: Partial<Address>) => {\n    model = model ?? {};\n\n    test('street', 'Street is required', () => {\n        enforce(model.street).isNotBlank();\n    });\n\n    omitWhen(!model.street, () => {\n        test('street', 'Street must be at least 3 characters long', () => {\n            enforce(model.street).longerThanOrEquals(3);\n        });\n\n        test('street', 'Street may be at most 50 characters long', () => {\n            enforce(model.street).shorterThanOrEquals(50);\n        });\n    });\n\n    test('city', 'City is required', () => {\n        enforce(model.city).isNotBlank();\n    });\n\n    test('state', 'State is required', () => {\n        enforce(model.state).isNotBlank();\n    });\n\n    test('state', 'State must be one of the supported US states', () => {\n        enforce(model.state).condition((state: string) => UsStates.some((s) => s.abbreviation === state && !s.disabled));\n    });\n\n    test('postalCode', 'Postal Code is required', () => {\n        enforce(model.postalCode).isNotBlank();\n    });\n\n    omitWhen(!model.postalCode, () => {\n        test('postalCode', 'Postal Code must be 5 digit zip (12345) or a zip+4 (12345-1234)', () => {\n            enforce(/^\\d{5}(-\\d{4}){0,1}$/.test(model.postalCode ?? '')).isTruthy();\n        });\n    });\n};\n","import {Injectable} from '@angular/core';\nimport {Indexable} from '@aegis-techno/ngx-core';\nimport {Observable, of} from 'rxjs';\nimport {delay} from 'rxjs/operators';\n\nexport interface FeinValidationResponse {\n    fein: string;\n    feinName?: string;\n}\n\n/** Delay response by this number of milliseconds to simulate latency. */\nconst latencyDelayMs = 2000;\n\nconst knownFeins: Indexable<string> = {\n    '13-1234567': 'MARVELOUS PRODUCTS, INC.',\n};\n\n/** Mock the remote FEIN Validation Service */\n@Injectable({providedIn: 'root'})\nexport class RemoteFeinValidationService {\n    /** Check if provided fein is registered with the IRS.\n     * If the FEIN exists, return the FEIN and FEIN name.\n     * If it doesn't, return the FEIN.\n     * Special cases:\n     * FEIN starting '22' is always valid and the FEIN name is the wildcard, '*'.\n     * FEIN starting 66' is always invalid.\n     */\n    check(fein: string): Observable<FeinValidationResponse> {\n        const response: FeinValidationResponse = {fein};\n        const lead = fein.substring(0, 2); // mock response based on lead 2 digits.\n        if (lead === '22') {\n            response.feinName = '*'; // Always OK\n        } else if (lead === '66') {\n            // Always BAD\n        } else {\n            response.feinName = knownFeins[fein];\n        }\n        return of(response).pipe(delay(latencyDelayMs));\n    }\n}\n","import {Injectable} from '@angular/core';\nimport {firstValueFrom} from 'rxjs';\nimport {FeinValidationResponse, RemoteFeinValidationService} from './remote-fein-validation.service';\n\nexport {FeinValidationResponse};\n\n@Injectable({providedIn: 'root'})\nexport class FeinValidationService {\n    constructor(private remoteFeinValidationService: RemoteFeinValidationService) {}\n\n    /** Cache of FEIN Validation Response promises accumulated in this user session.\n     * These promises may take time to resolve.\n     */\n    private responses: {[fein: string]: Promise<FeinValidationResponse>} = {};\n\n    /** Check with the FEIN Validation Service if an FEIN/Legal Name combination is valid\n     * @returns Promise of the service response. May be a cached response.\n     */\n    check(fein: string): Promise<FeinValidationResponse> {\n        if (!isGoodFein(fein)) {\n            return Promise.reject(`Bad FEIN \"${fein}\"`);\n        }\n\n        // Check the cached responses first.\n        const cachedResponse = this.responses[fein];\n        if (cachedResponse) {\n            return cachedResponse;\n        } else {\n            const promise = firstValueFrom(this.remoteFeinValidationService.check(fein));\n            this.responses[fein] = promise; // cache the promise of the response\n            return promise;\n        }\n    }\n}\n\n/** Return true if the fein value is a well-formed FEIN number although it might not be a real FEIN. */\nexport function isGoodFein(fein?: string): boolean {\n    return fein ? /^\\d{2}-\\d{7}$/.test(fein) : false;\n}\n","import {create, enforce, group, omitWhen, only, test} from 'vest';\nimport {ValidationContext} from '../../lib/models/validation-context.model';\nimport {ValidationSuiteFn} from '../../lib/models/validation-suite-fn.model';\nimport {ValidationSuite} from '../../lib/models/validation-suite.model';\nimport {Company} from '../models/company.model';\nimport {AppValidationContext} from '../providers/app-validation-context.provider';\nimport {isGoodFein} from '../services/fein-validation.service';\nimport {FeinValidationResponse} from '../services/remote-fein-validation.service';\n\nexport function createCompanyAsyncValidationSuite() {\n    return create(\n        'CompanyAsyncValidationSuite',\n        (model: Partial<Company>, field?: string, groupName?: string, context?: ValidationContext) => {\n            only(field); // if field defined, limit to tests of this field\n            only.group(groupName); // if groupName defined, limit to tests of this group\n            group('company', () => companyAsyncValidations(model, field, groupName, context));\n        }\n    ) as ValidationSuite;\n}\n\nexport const companyAsyncValidationSuite: ValidationSuite = createCompanyAsyncValidationSuite();\n\n/** Company Asynchronous Validation Suite */\nexport const companyAsyncValidations: ValidationSuiteFn = (\n    /** The object with data to validate */\n    model: Partial<Company>,\n    /** The property of that data to validate, if we only want to validate one property */\n    _field?: string,\n    /** The group of properties in that data to validate, if we only want to validate one group */\n    _groupName?: string,\n    /** Extra resources that a validator might need */\n    context?: ValidationContext\n) => {\n    model = model ?? {};\n\n    const fvs = (<AppValidationContext>context)?.feinValidationService;\n    /** FEIN check function (or FN returning \"not found\" result) */\n    const checkFein = fvs\n        ? fvs.check.bind(fvs)\n        : // No fvs? This is almost certainly a bug. Remember to provide a context.\n          (fein: string) => Promise.resolve<FeinValidationResponse>({fein});\n\n    omitWhen(!isGoodFein(model.fein), () => {\n        // these validations will be completely omitted if the FEIN is not valid\n\n        test('fein', 'Tax Number is not registered with the IRS', async () => {\n            const response = await checkFein(model.fein!);\n            // console.log('fein checkFein response', response);\n            enforce(response.feinName).isNotNullish();\n        });\n\n        test('legalName', 'Legal Name must match Federal Tax Name', async () => {\n            if (model.legalName) {\n                const response = await checkFein(model.fein!);\n                // console.log('legal name checkFein response', response);\n                const name = response.feinName;\n\n                enforce(name)\n                    .message(`Does not match the name, \"${name}\", registered with the IRS for this tax number`)\n                    .condition((name) => !name || name === '*' || name === model.legalName!.toUpperCase());\n            }\n        });\n    });\n};\n","import {create, enforce, group, omitWhen, only, test} from 'vest';\nimport {ValidationContext} from '../../lib/models/validation-context.model';\nimport {ValidationSuiteFn} from '../../lib/models/validation-suite-fn.model';\nimport {ValidationSuite} from '../../lib/models/validation-suite.model';\nimport {Company} from '../models/company.model';\nimport {isGoodFein} from '../services/fein-validation.service';\nimport {addressSyncValidations} from './address-sync.validations-suite';\n\n/** Company Synchronous Validation Suite */\nexport const companySyncValidationSuite: ValidationSuite = create(\n    'CompanySyncValidationSuite',\n    (\n        /** The object with data to validate */\n        model: Partial<Company>,\n        /** The property of that data to validate, if we only want to validate one property */\n        field?: string,\n        /** The group of properties in that data to validate, if we only want to validate one group */\n        groupName?: string,\n        /** Extra resources that a validator might need */\n        context?: ValidationContext\n    ) => {\n        only(field); // if field defined, limit to tests of this field\n        only.group(groupName); // if groupName defined, limit to tests of this group\n        group('company', () => companySyncValidations(model, field, groupName, context));\n        group('workAddress', () => addressSyncValidations(model.workAddress!, field, groupName, context));\n    }\n);\n\n/** Company Synchronous Validations, written in vest. */\nexport const companySyncValidations: ValidationSuiteFn = (model: Partial<Company>) => {\n    model = model ?? {};\n\n    test('legalName', 'Legal Name is required', () => {\n        enforce(model.legalName).isNotBlank();\n    });\n\n    omitWhen(!model.legalName, () => {\n        test('legalName', 'Legal Name must be at least 3 characters long', () => {\n            enforce(model.legalName).longerThanOrEquals(3);\n        });\n\n        test('legalName', 'Legal Name may be at most 30 characters long', () => {\n            enforce(model.legalName).shorterThanOrEquals(30);\n        });\n    });\n\n    test('fein', 'Tax Number is required', () => {\n        enforce(model.fein).isNotBlank();\n    });\n\n    test('fein', 'Tax Number format must be 99-9999999', () => {\n        enforce(isGoodFein(model.fein)).equals(true);\n    });\n};\n","import {Provider} from '@angular/core';\nimport {ASYNC_VALIDATION_SUITE_FACTORIES} from '../../lib/tokens/async-validation-suite-factories.token';\nimport {SYNC_VALIDATION_SUITES} from '../../lib/tokens/sync-validation-suites.token';\nimport {addressSyncValidationSuite} from '../validations-suites/address-sync.validations-suite';\nimport {createCompanyAsyncValidationSuite} from '../validations-suites/company-async.validations-suite';\nimport {companySyncValidationSuite} from '../validations-suites/company-sync.validations-suite';\n\nexport const validationSuiteProvidersMock: Provider[] = [\n    {\n        provide: ASYNC_VALIDATION_SUITE_FACTORIES,\n        useValue: {\n            company: createCompanyAsyncValidationSuite,\n        },\n    },\n    {\n        provide: SYNC_VALIDATION_SUITES,\n        useValue: {\n            address: addressSyncValidationSuite,\n            company: companySyncValidationSuite,\n        },\n    },\n];\n"],"names":["i1.FormValidationScopeDirective","i1.RemoteFeinValidationService"],"mappings":"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"}