( dir: NgControl, valueAccessors: readonly ControlValueAccessor[] | null | undefined, )
| 398 | |
| 399 | // TODO: vsavkin remove it once https://github.com/angular/angular/issues/3011 is implemented |
| 400 | export function selectValueAccessor( |
| 401 | dir: NgControl, |
| 402 | valueAccessors: readonly ControlValueAccessor[] | null | undefined, |
| 403 | ): ControlValueAccessor | null { |
| 404 | if (!valueAccessors) return null; |
| 405 | |
| 406 | if (!Array.isArray(valueAccessors) && (typeof ngDevMode === 'undefined' || ngDevMode)) |
| 407 | _throwInvalidValueAccessorError(dir); |
| 408 | |
| 409 | let defaultAccessor: ControlValueAccessor | undefined = undefined; |
| 410 | let builtinAccessor: ControlValueAccessor | undefined = undefined; |
| 411 | let customAccessor: ControlValueAccessor | undefined = undefined; |
| 412 | |
| 413 | valueAccessors.forEach((v: ControlValueAccessor) => { |
| 414 | if (v.constructor === DefaultValueAccessor) { |
| 415 | defaultAccessor = v; |
| 416 | } else if (isBuiltInAccessor(v)) { |
| 417 | if (builtinAccessor && (typeof ngDevMode === 'undefined' || ngDevMode)) |
| 418 | _throwError(dir, 'More than one built-in value accessor matches form control with'); |
| 419 | builtinAccessor = v; |
| 420 | } else { |
| 421 | if (customAccessor && (typeof ngDevMode === 'undefined' || ngDevMode)) |
| 422 | _throwError(dir, 'More than one custom value accessor matches form control with'); |
| 423 | customAccessor = v; |
| 424 | } |
| 425 | }); |
| 426 | |
| 427 | if (customAccessor) return customAccessor; |
| 428 | if (builtinAccessor) return builtinAccessor; |
| 429 | if (defaultAccessor) return defaultAccessor; |
| 430 | |
| 431 | if (typeof ngDevMode === 'undefined' || ngDevMode) { |
| 432 | _throwError(dir, 'No valid value accessor for form control with'); |
| 433 | } |
| 434 | return null; |
| 435 | } |
| 436 | |
| 437 | export function removeListItem<T>(list: T[], el: T): void { |
| 438 | const index = list.indexOf(el); |
no test coverage detected
searching dependent graphs…