@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.
- package/dist/dto/otp-request.dto.d.ts +34 -4
- package/dist/dto/otp-request.dto.d.ts.map +1 -1
- package/dist/dto/otp-request.dto.js +72 -23
- package/dist/dto/otp-request.dto.js.map +1 -1
- package/dist/helpers/phone.helper.d.ts +36 -0
- package/dist/helpers/phone.helper.d.ts.map +1 -0
- package/dist/helpers/phone.helper.js +107 -0
- package/dist/helpers/phone.helper.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/validators/phone.validator.d.ts +7 -0
- package/dist/validators/phone.validator.d.ts.map +1 -0
- package/dist/validators/phone.validator.js +47 -0
- package/dist/validators/phone.validator.js.map +1 -0
- package/package.json +2 -1
|
@@ -5,11 +5,41 @@ import { AuthMethod } from '../interfaces';
|
|
|
5
5
|
*/
|
|
6
6
|
export declare class OtpRequestDto {
|
|
7
7
|
method: AuthMethod;
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
private _identifier;
|
|
9
|
+
get identifier(): string;
|
|
10
|
+
set identifier(value: string);
|
|
10
11
|
/**
|
|
11
|
-
*
|
|
12
|
+
* Возвращает телефон, если метод OTP_PHONE и номер валиден
|
|
12
13
|
*/
|
|
13
|
-
|
|
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;
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
normalized = '+7' + normalized;
|
|
87
|
+
if (this.method === interfaces_1.AuthMethod.OTP_EMAIL) {
|
|
88
|
+
return !!this.email;
|
|
36
89
|
}
|
|
37
|
-
return
|
|
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)({
|
|
48
|
-
|
|
49
|
-
|
|
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, "
|
|
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;
|
|
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
package/dist/index.d.ts.map
CHANGED
|
@@ -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.
|
|
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": {
|