/
githubmirror
/
angular
Обзор
Документация
Войти
/
githubmirror
/
angular
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
packages/forms/signals/src/api/rules/validation/email.ts
82 строки
3 KB
kirjs
refactor(forms): use when consistently for conditional rules and validators
07 май 2026, 00:10
07 май 2026, 00:10
df54e6a
Код
Авторство
О чём код?
/** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.dev/license */ import {PathKind, SchemaPath, SchemaPathRules} from '../../types'; import {BaseValidatorConfig, getOption, isEmpty} from './util'; import {validate} from './validate'; import {emailError} from './validation_errors'; /** * A regular expression that matches valid e-mail addresses. * * At a high level, this regexp matches e-mail addresses of the format `local-part@tld`, where: * - `local-part` consists of one or more of the allowed characters (alphanumeric and some * punctuation symbols). * - `local-part` cannot begin or end with a period (`.`). * - `local-part` cannot be longer than 64 characters. * - `tld` consists of one or more `labels` separated by periods (`.`). For example `localhost` or * `foo.com`. * - A `label` consists of one or more of the allowed characters (alphanumeric, dashes (`-`) and * periods (`.`)). * - A `label` cannot begin or end with a dash (`-`) or a period (`.`). * - A `label` cannot be longer than 63 characters. * - The whole address cannot be longer than 254 characters. * * ## Implementation background * * This regexp was ported over from AngularJS (see there for git history): * https://github.com/angular/angular.js/blob/c133ef836/src/ng/directive/input.js#L27 * It is based on the * [WHATWG version](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address) with * some enhancements to incorporate more RFC rules (such as rules related to domain names and the * lengths of different parts of the address). The main differences from the WHATWG version are: * - Disallow `local-part` to begin or end with a period (`.`). * - Disallow `local-part` length to exceed 64 characters. * - Disallow total address length to exceed 254 characters. * * See [this commit](https://github.com/angular/angular.js/commit/f3f5cf72e) for more details. */ const EMAIL_REGEXP = /^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; /** * Binds a validator to the given path that requires the value to match the standard email format. * This function can only be called on string paths. * * @param path Path of the field to validate * @param config Optional, allows providing any of the following options: * - `error`: Custom validation error(s) to be used instead of the default `ValidationError.email()` * or a function that receives the `FieldContext` and returns custom validation error(s). * @template TPathKind The kind of path the logic is bound to (a root path, child path, or item of an array) * * @see [Signal Form Email Validation](guide/forms/signals/validation#email) * @category validation * @publicApi 22.0 */ export function email<TPathKind extends PathKind = PathKind.Root>( path: SchemaPath<string, SchemaPathRules.Supported, TPathKind>, config?: BaseValidatorConfig<string, TPathKind>, ) { validate(path, (ctx) => { if (config?.when && !config.when(ctx)) { return undefined; } if (isEmpty(ctx.value())) { return undefined; } if (!EMAIL_REGEXP.test(ctx.value())) { if (config?.error) { return getOption(config.error, ctx); } else { return emailError({message: getOption(config?.message, ctx)}); } } return undefined; }); }