@umapi/contracts 1.0.21 → 1.0.22

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.
@@ -5,11 +5,41 @@ import { AuthMethod } from '../interfaces';
5
5
  */
6
6
  export declare class OtpRequestDto {
7
7
  method: AuthMethod;
8
- phone?: string;
9
- email?: string;
8
+ private _identifier;
9
+ get identifier(): string;
10
+ set identifier(value: string);
10
11
  /**
11
- * Нормализует телефонный номер к стандартному формату
12
+ * Возвращает телефон, если метод OTP_PHONE и номер валиден
12
13
  */
13
- normalizePhone(): string | undefined;
14
+ get phone(): string | null;
15
+ /**
16
+ * Возвращает email, если метод OTP_EMAIL и формат валиден
17
+ */
18
+ get email(): string | null;
19
+ /**
20
+ * Нормализует телефонный номер к стандартному формату E.164
21
+ * @returns Нормализованный номер или null если невалидный
22
+ */
23
+ normalizePhone(): string | null;
24
+ /**
25
+ * Проверяет валидность телефонного номера
26
+ * @returns boolean
27
+ */
28
+ isPhoneValid(): boolean;
29
+ /**
30
+ * Форматирует телефон в национальный формат
31
+ * @returns Отформатированный номер или null
32
+ */
33
+ formatPhoneNational(): string | null;
34
+ /**
35
+ * Форматирует телефон в RFC3966 (tel:+79991234567)
36
+ * @returns Отформатированный номер или null
37
+ */
38
+ formatPhoneUrl(): string | null;
39
+ /**
40
+ * Проверяет валидность всего DTO
41
+ * @returns boolean
42
+ */
43
+ isValid(): boolean;
14
44
  }
15
45
  //# sourceMappingURL=otp-request.dto.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"otp-request.dto.d.ts","sourceRoot":"","sources":["../../src/dto/otp-request.dto.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C;;;GAGG;AACH,qBAAa,aAAa;IAGtB,MAAM,EAAG,UAAU,CAAC;IAMpB,KAAK,CAAC,EAAE,MAAM,CAAC;IAMf,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,SAAS;CAkBvC"}
1
+ {"version":3,"file":"otp-request.dto.d.ts","sourceRoot":"","sources":["../../src/dto/otp-request.dto.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C;;;GAGG;AACH,qBAAa,aAAa;IAGtB,MAAM,EAAG,UAAU,CAAC;IASpB,OAAO,CAAC,WAAW,CAAU;IAG7B,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,EAE3B;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAMzB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAOzB;IAED;;;OAGG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B;;;OAGG;IACH,YAAY,IAAI,OAAO;IAIvB;;;OAGG;IACH,mBAAmB,IAAI,MAAM,GAAG,IAAI;IAIpC;;;OAGG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B;;;OAGG;IACH,OAAO,IAAI,OAAO;CAYrB"}
@@ -13,28 +13,81 @@ exports.OtpRequestDto = void 0;
13
13
  const swagger_1 = require("@nestjs/swagger");
14
14
  const class_validator_1 = require("class-validator");
15
15
  const interfaces_1 = require("../interfaces");
16
+ const phone_helper_1 = require("../helpers/phone.helper");
16
17
  /**
17
18
  * DTO для запроса OTP
18
19
  * Требует указания либо phone, либо email
19
20
  */
20
21
  class OtpRequestDto {
22
+ // Getter и Setter для автоматической обработки
23
+ get identifier() {
24
+ return this._identifier;
25
+ }
26
+ set identifier(value) {
27
+ this._identifier = value;
28
+ }
29
+ /**
30
+ * Возвращает телефон, если метод OTP_PHONE и номер валиден
31
+ */
32
+ get phone() {
33
+ if (this.method === interfaces_1.AuthMethod.OTP_PHONE) {
34
+ const normalized = phone_helper_1.PhoneHelper.normalize(this._identifier);
35
+ return normalized || null;
36
+ }
37
+ return null;
38
+ }
21
39
  /**
22
- * Нормализует телефонный номер к стандартному формату
40
+ * Возвращает email, если метод OTP_EMAIL и формат валиден
41
+ */
42
+ get email() {
43
+ if (this.method === interfaces_1.AuthMethod.OTP_EMAIL) {
44
+ // Простая проверка формата email
45
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
46
+ return emailRegex.test(this._identifier) ? this._identifier : null;
47
+ }
48
+ return null;
49
+ }
50
+ /**
51
+ * Нормализует телефонный номер к стандартному формату E.164
52
+ * @returns Нормализованный номер или null если невалидный
23
53
  */
24
54
  normalizePhone() {
25
- if (!this.phone)
26
- return undefined;
27
- // Удаляем все нецифровые символы кроме +
28
- let normalized = this.phone.replace(/[^0-9+]/g, '');
29
- // Если начинается с 8, заменяем на +7
30
- if (normalized.startsWith('8')) {
31
- normalized = '+7' + normalized.substring(1);
55
+ return phone_helper_1.PhoneHelper.normalize(this.phone || '');
56
+ }
57
+ /**
58
+ * Проверяет валидность телефонного номера
59
+ * @returns boolean
60
+ */
61
+ isPhoneValid() {
62
+ return phone_helper_1.PhoneHelper.isValid(this.phone || '');
63
+ }
64
+ /**
65
+ * Форматирует телефон в национальный формат
66
+ * @returns Отформатированный номер или null
67
+ */
68
+ formatPhoneNational() {
69
+ return phone_helper_1.PhoneHelper.formatNational(this.phone || '');
70
+ }
71
+ /**
72
+ * Форматирует телефон в RFC3966 (tel:+79991234567)
73
+ * @returns Отформатированный номер или null
74
+ */
75
+ formatPhoneUrl() {
76
+ return phone_helper_1.PhoneHelper.formatUrl(this.phone || '');
77
+ }
78
+ /**
79
+ * Проверяет валидность всего DTO
80
+ * @returns boolean
81
+ */
82
+ isValid() {
83
+ // Проверяем обязательные поля в зависимости от метода
84
+ if (this.method === interfaces_1.AuthMethod.OTP_PHONE) {
85
+ return !!this.phone;
32
86
  }
33
- // Если нет кода страны, добавляем +7 (Россия по умолчанию)
34
- if (!normalized.startsWith('+')) {
35
- normalized = '+7' + normalized;
87
+ if (this.method === interfaces_1.AuthMethod.OTP_EMAIL) {
88
+ return !!this.email;
36
89
  }
37
- return normalized;
90
+ return false;
38
91
  }
39
92
  }
40
93
  exports.OtpRequestDto = OtpRequestDto;
@@ -44,17 +97,13 @@ __decorate([
44
97
  __metadata("design:type", String)
45
98
  ], OtpRequestDto.prototype, "method", void 0);
46
99
  __decorate([
47
- (0, swagger_1.ApiProperty)({ description: 'Номер телефона в международном формате', required: false, example: '+79991234567' }),
48
- (0, class_validator_1.ValidateIf)(o => o.method === interfaces_1.AuthMethod.OTP_PHONE),
49
- (0, class_validator_1.IsNotEmpty)({ message: 'Телефон обязателен для метода OTP_PHONE' }),
100
+ (0, swagger_1.ApiProperty)({
101
+ description: 'Идентификатор пользователя (телефон или email)',
102
+ required: true,
103
+ example: '+79991234567'
104
+ }),
105
+ (0, class_validator_1.IsNotEmpty)({ message: 'Идентификатор обязателен' }),
50
106
  (0, class_validator_1.IsString)(),
51
107
  __metadata("design:type", String)
52
- ], OtpRequestDto.prototype, "phone", void 0);
53
- __decorate([
54
- (0, swagger_1.ApiProperty)({ description: 'Адрес электронной почты', required: false, example: 'user@example.com' }),
55
- (0, class_validator_1.ValidateIf)(o => o.method === interfaces_1.AuthMethod.OTP_EMAIL),
56
- (0, class_validator_1.IsNotEmpty)({ message: 'Email обязателен для метода OTP_EMAIL' }),
57
- (0, class_validator_1.IsEmail)({}, { message: 'Неверный формат email' }),
58
- __metadata("design:type", String)
59
- ], OtpRequestDto.prototype, "email", void 0);
108
+ ], OtpRequestDto.prototype, "_identifier", void 0);
60
109
  //# sourceMappingURL=otp-request.dto.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"otp-request.dto.js","sourceRoot":"","sources":["../../src/dto/otp-request.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA8C;AAC9C,qDAAoF;AACpF,8CAA2C;AAE3C;;;GAGG;AACH,MAAa,aAAa;IAiBtB;;OAEG;IACH,cAAc;QACV,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAElC,yCAAyC;QACzC,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAEpD,sCAAsC;QACtC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,UAAU,GAAG,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,2DAA2D;QAC3D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,UAAU,GAAG,IAAI,GAAG,UAAU,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;CACJ;AAtCD,sCAsCC;AAnCG;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,IAAI,EAAE,uBAAU,EAAE,OAAO,EAAE,uBAAU,CAAC,SAAS,EAAE,CAAC;IACrG,IAAA,wBAAM,EAAC,uBAAU,CAAC;;6CACC;AAMpB;IAJC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IAChH,IAAA,4BAAU,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,uBAAU,CAAC,SAAS,CAAC;IAClD,IAAA,4BAAU,EAAC,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC;IAClE,IAAA,0BAAQ,GAAE;;4CACI;AAMf;IAJC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IACrG,IAAA,4BAAU,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,uBAAU,CAAC,SAAS,CAAC;IAClD,IAAA,4BAAU,EAAC,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC;IAChE,IAAA,yBAAO,EAAC,EAAE,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;;4CACnC"}
1
+ {"version":3,"file":"otp-request.dto.js","sourceRoot":"","sources":["../../src/dto/otp-request.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA8C;AAC9C,qDAAoF;AACpF,8CAA2C;AAC3C,0DAAsD;AAEtD;;;GAGG;AACH,MAAa,aAAa;IActB,+CAA+C;IAC/C,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,IAAI,UAAU,CAAC,KAAa;QACxB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACL,IAAI,IAAI,CAAC,MAAM,KAAK,uBAAU,CAAC,SAAS,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,0BAAW,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC3D,OAAO,UAAU,IAAI,IAAI,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACL,IAAI,IAAI,CAAC,MAAM,KAAK,uBAAU,CAAC,SAAS,EAAE,CAAC;YACvC,iCAAiC;YACjC,MAAM,UAAU,GAAG,4BAA4B,CAAC;YAChD,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;QACvE,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,cAAc;QACV,OAAO,0BAAW,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED;;;OAGG;IACH,YAAY;QACR,OAAO,0BAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,mBAAmB;QACf,OAAO,0BAAW,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,cAAc;QACV,OAAO,0BAAW,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED;;;OAGG;IACH,OAAO;QACH,sDAAsD;QACtD,IAAI,IAAI,CAAC,MAAM,KAAK,uBAAU,CAAC,SAAS,EAAE,CAAC;YACvC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACxB,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,uBAAU,CAAC,SAAS,EAAE,CAAC;YACvC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACxB,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ;AA9FD,sCA8FC;AA3FG;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,IAAI,EAAE,uBAAU,EAAE,OAAO,EAAE,uBAAU,CAAC,SAAS,EAAE,CAAC;IACrG,IAAA,wBAAM,EAAC,uBAAU,CAAC;;6CACC;AASZ;IAPP,IAAA,qBAAW,EAAC;QACT,WAAW,EAAE,gDAAgD;QAC7D,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,cAAc;KAC1B,CAAC;IACD,IAAA,4BAAU,EAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACnD,IAAA,0BAAQ,GAAE;;kDACkB"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Утилиты для работы с телефонными номерами
3
+ */
4
+ export declare class PhoneHelper {
5
+ /**
6
+ * Нормализует телефонный номер к формату E.164 (+79991234567)
7
+ * @param phone Исходный номер телефона
8
+ * @returns Нормализованный номер или null если невалидный
9
+ */
10
+ static normalize(phone: string): string | null;
11
+ /**
12
+ * Проверяет валидность телефонного номера
13
+ * @param phone Номер телефона
14
+ * @returns boolean
15
+ */
16
+ static isValid(phone: string): boolean;
17
+ /**
18
+ * Форматирует телефон в национальный формат (8 (999) 123-45-67)
19
+ * @param phone Номер телефона
20
+ * @returns Отформатированный номер или null
21
+ */
22
+ static formatNational(phone: string): string | null;
23
+ /**
24
+ * Форматирует телефон в RFC3966 (tel:+79991234567)
25
+ * @param phone Номер телефона
26
+ * @returns Отформатированный номер или null
27
+ */
28
+ static formatUrl(phone: string): string | null;
29
+ /**
30
+ * Получает код страны из номера
31
+ * @param phone Номер телефона
32
+ * @returns Код страны или null
33
+ */
34
+ static getCountryCode(phone: string): string | null;
35
+ }
36
+ //# sourceMappingURL=phone.helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone.helper.d.ts","sourceRoot":"","sources":["../../src/helpers/phone.helper.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,WAAW;IACtB;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAqB9C;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAWtC;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAcnD;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAc9C;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAUpD"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PhoneHelper = void 0;
7
+ const libphonenumber_js_1 = __importDefault(require("libphonenumber-js"));
8
+ /**
9
+ * Утилиты для работы с телефонными номерами
10
+ */
11
+ class PhoneHelper {
12
+ /**
13
+ * Нормализует телефонный номер к формату E.164 (+79991234567)
14
+ * @param phone Исходный номер телефона
15
+ * @returns Нормализованный номер или null если невалидный
16
+ */
17
+ static normalize(phone) {
18
+ if (!phone)
19
+ return null;
20
+ try {
21
+ // Сначала очищаем номер от лишних символов
22
+ const cleaned = phone.replace(/[^\d+]/g, '');
23
+ // Парсим номер
24
+ const phoneNumber = (0, libphonenumber_js_1.default)(cleaned);
25
+ // Возвращаем в формате E.164 если валиден
26
+ if (phoneNumber?.isValid()) {
27
+ return phoneNumber.number.toString();
28
+ }
29
+ return null;
30
+ }
31
+ catch (error) {
32
+ return null;
33
+ }
34
+ }
35
+ /**
36
+ * Проверяет валидность телефонного номера
37
+ * @param phone Номер телефона
38
+ * @returns boolean
39
+ */
40
+ static isValid(phone) {
41
+ if (!phone)
42
+ return false;
43
+ try {
44
+ const phoneNumber = (0, libphonenumber_js_1.default)(phone);
45
+ return phoneNumber?.isValid() || false;
46
+ }
47
+ catch (error) {
48
+ return false;
49
+ }
50
+ }
51
+ /**
52
+ * Форматирует телефон в национальный формат (8 (999) 123-45-67)
53
+ * @param phone Номер телефона
54
+ * @returns Отформатированный номер или null
55
+ */
56
+ static formatNational(phone) {
57
+ if (!phone)
58
+ return null;
59
+ try {
60
+ const phoneNumber = (0, libphonenumber_js_1.default)(phone);
61
+ if (phoneNumber?.isValid()) {
62
+ return phoneNumber.format('NATIONAL');
63
+ }
64
+ return null;
65
+ }
66
+ catch (error) {
67
+ return null;
68
+ }
69
+ }
70
+ /**
71
+ * Форматирует телефон в RFC3966 (tel:+79991234567)
72
+ * @param phone Номер телефона
73
+ * @returns Отформатированный номер или null
74
+ */
75
+ static formatUrl(phone) {
76
+ if (!phone)
77
+ return null;
78
+ try {
79
+ const phoneNumber = (0, libphonenumber_js_1.default)(phone);
80
+ if (phoneNumber?.isValid()) {
81
+ return phoneNumber.format('RFC3966');
82
+ }
83
+ return null;
84
+ }
85
+ catch (error) {
86
+ return null;
87
+ }
88
+ }
89
+ /**
90
+ * Получает код страны из номера
91
+ * @param phone Номер телефона
92
+ * @returns Код страны или null
93
+ */
94
+ static getCountryCode(phone) {
95
+ if (!phone)
96
+ return null;
97
+ try {
98
+ const phoneNumber = (0, libphonenumber_js_1.default)(phone);
99
+ return phoneNumber?.country || null;
100
+ }
101
+ catch (error) {
102
+ return null;
103
+ }
104
+ }
105
+ }
106
+ exports.PhoneHelper = PhoneHelper;
107
+ //# sourceMappingURL=phone.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone.helper.js","sourceRoot":"","sources":["../../src/helpers/phone.helper.ts"],"names":[],"mappings":";;;;;;AAAA,0EAAiD;AAEjD;;GAEG;AACH,MAAa,WAAW;IACtB;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,KAAa;QAC5B,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,IAAI,CAAC;YACH,2CAA2C;YAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAE7C,eAAe;YACf,MAAM,WAAW,GAAG,IAAA,2BAAgB,EAAC,OAAO,CAAC,CAAC;YAE9C,0CAA0C;YAC1C,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC3B,OAAO,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvC,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,KAAa;QAC1B,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAA,2BAAgB,EAAC,KAAK,CAAC,CAAC;YAC5C,OAAO,WAAW,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,KAAa;QACjC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAA,2BAAgB,EAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC3B,OAAO,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,KAAa;QAC5B,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAA,2BAAgB,EAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC3B,OAAO,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,KAAa;QACjC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAA,2BAAgB,EAAC,KAAK,CAAC,CAAC;YAC5C,OAAO,WAAW,EAAE,OAAO,IAAI,IAAI,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAhGD,kCAgGC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './dto';
2
2
  export * from './interfaces';
3
+ export * from './helpers/phone.helper';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC"}
package/dist/index.js CHANGED
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  // Экспорт всех контрактов
18
18
  __exportStar(require("./dto"), exports);
19
19
  __exportStar(require("./interfaces"), exports);
20
+ __exportStar(require("./helpers/phone.helper"), exports);
20
21
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0BAA0B;AAC1B,wCAAsB;AACtB,+CAA6B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0BAA0B;AAC1B,wCAAsB;AACtB,+CAA6B;AAC7B,yDAAuC"}
@@ -0,0 +1,7 @@
1
+ import { ValidationOptions, ValidatorConstraintInterface } from 'class-validator';
2
+ export declare class IsValidPhoneConstraint implements ValidatorConstraintInterface {
3
+ validate(phone: string): boolean;
4
+ defaultMessage(): string;
5
+ }
6
+ export declare function IsValidPhone(validationOptions?: ValidationOptions): (object: Object, propertyName: string) => void;
7
+ //# sourceMappingURL=phone.validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone.validator.d.ts","sourceRoot":"","sources":["../../src/validators/phone.validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,iBAAiB,EAAuB,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAG1H,qBACa,sBAAuB,YAAW,4BAA4B;IACzE,QAAQ,CAAC,KAAK,EAAE,MAAM;IAWtB,cAAc;CAGf;AAED,wBAAgB,YAAY,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,IAC/C,QAAQ,MAAM,EAAE,cAAc,MAAM,UAStD"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.IsValidPhoneConstraint = void 0;
13
+ exports.IsValidPhone = IsValidPhone;
14
+ const class_validator_1 = require("class-validator");
15
+ const libphonenumber_js_1 = __importDefault(require("libphonenumber-js"));
16
+ let IsValidPhoneConstraint = class IsValidPhoneConstraint {
17
+ validate(phone) {
18
+ if (!phone)
19
+ return false;
20
+ try {
21
+ const phoneNumber = (0, libphonenumber_js_1.default)(phone);
22
+ return phoneNumber?.isValid() || false;
23
+ }
24
+ catch (error) {
25
+ return false;
26
+ }
27
+ }
28
+ defaultMessage() {
29
+ return 'Неверный формат номера телефона. Используйте международный формат: +79991234567';
30
+ }
31
+ };
32
+ exports.IsValidPhoneConstraint = IsValidPhoneConstraint;
33
+ exports.IsValidPhoneConstraint = IsValidPhoneConstraint = __decorate([
34
+ (0, class_validator_1.ValidatorConstraint)({ async: false })
35
+ ], IsValidPhoneConstraint);
36
+ function IsValidPhone(validationOptions) {
37
+ return function (object, propertyName) {
38
+ (0, class_validator_1.registerDecorator)({
39
+ target: object.constructor,
40
+ propertyName: propertyName,
41
+ options: validationOptions,
42
+ constraints: [],
43
+ validator: IsValidPhoneConstraint,
44
+ });
45
+ };
46
+ }
47
+ //# sourceMappingURL=phone.validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone.validator.js","sourceRoot":"","sources":["../../src/validators/phone.validator.ts"],"names":[],"mappings":";;;;;;;;;;;;AAqBA,oCAUC;AA/BD,qDAA0H;AAC1H,0EAAiD;AAG1C,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjC,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAA,2BAAgB,EAAC,KAAK,CAAC,CAAC;YAC5C,OAAO,WAAW,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,cAAc;QACZ,OAAO,iFAAiF,CAAC;IAC3F,CAAC;CACF,CAAA;AAfY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,qCAAmB,EAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;GACzB,sBAAsB,CAelC;AAED,SAAgB,YAAY,CAAC,iBAAqC;IAChE,OAAO,UAAU,MAAc,EAAE,YAAoB;QACnD,IAAA,mCAAiB,EAAC;YAChB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,YAAY,EAAE,YAAY;YAC1B,OAAO,EAAE,iBAAiB;YAC1B,WAAW,EAAE,EAAE;YACf,SAAS,EAAE,sBAAsB;SAClC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umapi/contracts",
3
- "version": "1.0.21",
3
+ "version": "1.0.22",
4
4
  "description": "Shared contracts for UMAPI microservices",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -20,6 +20,7 @@
20
20
  "dependencies": {
21
21
  "class-transformer": "^0.5.1",
22
22
  "class-validator": "^0.14.1",
23
+ "libphonenumber-js": "^1.12.33",
23
24
  "reflect-metadata": "^0.2.2"
24
25
  },
25
26
  "peerDependencies": {