@k-msg/provider 0.3.0 → 0.5.0

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.
Files changed (44) hide show
  1. package/README.md +35 -124
  2. package/dist/aligo/provider.d.ts +18 -8
  3. package/dist/index.d.ts +8 -29
  4. package/dist/index.js +47 -47
  5. package/dist/index.js.map +10 -28
  6. package/dist/index.mjs +47 -47
  7. package/dist/index.mjs.map +10 -28
  8. package/dist/iwinv/provider.d.ts +21 -59
  9. package/dist/iwinv/types/iwinv.d.ts +10 -2
  10. package/dist/providers/mock/mock.provider.d.ts +6 -1
  11. package/dist/solapi/provider.d.ts +18 -6
  12. package/dist/solapi/types/solapi.d.ts +14 -2
  13. package/package.json +2 -22
  14. package/dist/abstract/provider.base.d.ts +0 -108
  15. package/dist/adapters/aligo.adapter.d.ts +0 -50
  16. package/dist/adapters/iwinv.adapter.d.ts +0 -139
  17. package/dist/adapters/solapi.adapter.d.ts +0 -48
  18. package/dist/config/provider-config-v2.d.ts +0 -122
  19. package/dist/contracts/provider.contract.d.ts +0 -355
  20. package/dist/contracts/sms.contract.d.ts +0 -135
  21. package/dist/interfaces/index.d.ts +0 -14
  22. package/dist/interfaces/plugin.d.ts +0 -122
  23. package/dist/interfaces/services.d.ts +0 -222
  24. package/dist/iwinv/contracts/account.contract.d.ts +0 -11
  25. package/dist/iwinv/contracts/analytics.contract.d.ts +0 -16
  26. package/dist/iwinv/contracts/channel.contract.d.ts +0 -15
  27. package/dist/iwinv/contracts/messaging.contract.d.ts +0 -14
  28. package/dist/iwinv/contracts/sms.contract.d.ts +0 -33
  29. package/dist/iwinv/contracts/template.contract.d.ts +0 -18
  30. package/dist/iwinv/provider-multi.d.ts +0 -116
  31. package/dist/iwinv/provider-sms.d.ts +0 -55
  32. package/dist/middleware/index.d.ts +0 -27
  33. package/dist/mock/index.d.ts +0 -1
  34. package/dist/registry/index.d.ts +0 -1
  35. package/dist/registry/plugin-registry.d.ts +0 -15
  36. package/dist/services/provider.manager.d.ts +0 -24
  37. package/dist/services/provider.service.d.ts +0 -49
  38. package/dist/test-helpers.d.ts +0 -110
  39. package/dist/types/base.d.ts +0 -172
  40. package/dist/types/typed-templates.d.ts +0 -199
  41. package/dist/types/unified-config.d.ts +0 -197
  42. package/dist/types/unified-errors.d.ts +0 -225
  43. package/dist/utils/base-plugin.d.ts +0 -35
  44. package/dist/utils/index.d.ts +0 -12
@@ -1,24 +0,0 @@
1
- import type { BaseProvider, ProviderType, StandardRequest, StandardResult } from "@k-msg/core";
2
- import type { AlimTalkProvider, AlimTalkRequest, AlimTalkResult } from "../contracts/provider.contract";
3
- import type { SMSProvider, SMSRequest, SMSResult } from "../contracts/sms.contract";
4
- export declare class ProviderManager {
5
- private providers;
6
- private defaultProvider?;
7
- registerProvider(provider: BaseProvider<StandardRequest, StandardResult>): void;
8
- unregisterProvider(providerId: string): void;
9
- getProvider(providerId?: string): BaseProvider<StandardRequest, StandardResult> | null;
10
- getAlimTalkProvider(providerId?: string): AlimTalkProvider | null;
11
- listProviders(): BaseProvider<StandardRequest, StandardResult>[];
12
- listAlimTalkProviders(): AlimTalkProvider[];
13
- setDefaultProvider(providerId: string): void;
14
- healthCheckAll(): Promise<Record<string, boolean>>;
15
- getProvidersForChannel(channel: string): BaseProvider<StandardRequest, StandardResult>[];
16
- getProvidersByType(type: ProviderType): BaseProvider<StandardRequest, StandardResult>[];
17
- getSMSProvider(providerId?: string): SMSProvider | null;
18
- listSMSProviders(): SMSProvider[];
19
- send<TRequest extends StandardRequest, TResult extends StandardResult>(providerId: string, request: TRequest): Promise<TResult>;
20
- sendAlimTalk(providerId: string | undefined, request: AlimTalkRequest): Promise<AlimTalkResult>;
21
- sendSMS(providerId: string | undefined, request: SMSRequest): Promise<SMSResult>;
22
- private isAlimTalkProvider;
23
- private isSMSProvider;
24
- }
@@ -1,49 +0,0 @@
1
- import type { BaseProvider, StandardRequest, StandardResult } from "@k-msg/core";
2
- import type { AlimTalkProvider, AlimTalkRequest, AlimTalkResult } from "../contracts/provider.contract";
3
- /**
4
- * Manages the lifecycle and access to different messaging providers.
5
- */
6
- export declare class ProviderService {
7
- private providers;
8
- private defaultProviderId?;
9
- /**
10
- * @param defaultProviderId The ID of the provider to use when none is specified.
11
- */
12
- constructor(defaultProviderId?: string);
13
- /**
14
- * Registers a new provider instance.
15
- * If no default provider is set, the first registered provider becomes the default.
16
- * @param provider The provider instance to register.
17
- */
18
- register(provider: BaseProvider<StandardRequest, StandardResult>): void;
19
- /**
20
- * Retrieves a provider by its unique ID.
21
- * @param providerId The ID of the provider.
22
- * @returns The provider instance or undefined if not found.
23
- */
24
- get(providerId: string): BaseProvider<StandardRequest, StandardResult> | undefined;
25
- /**
26
- * Retrieves a typed AlimTalk provider by its unique ID.
27
- * @param providerId The ID of the provider.
28
- * @returns The AlimTalk provider instance or undefined if not found or not an AlimTalk provider.
29
- */
30
- getAlimTalk(providerId: string): AlimTalkProvider | undefined;
31
- /**
32
- * Retrieves the default provider.
33
- * @returns The default provider instance or undefined if not set.
34
- */
35
- getDefault(): BaseProvider<StandardRequest, StandardResult> | undefined;
36
- /**
37
- * Lists all registered providers.
38
- * @returns An array of all provider instances.
39
- */
40
- list(): BaseProvider<StandardRequest, StandardResult>[];
41
- /**
42
- * Lists all AlimTalk providers.
43
- * @returns An array of AlimTalk provider instances.
44
- */
45
- listAlimTalk(): AlimTalkProvider[];
46
- send<TRequest extends StandardRequest, TResult extends StandardResult>(providerId: string, request: TRequest): Promise<TResult>;
47
- sendAlimTalk(providerId: string, request: AlimTalkRequest): Promise<AlimTalkResult>;
48
- private isAlimTalkProvider;
49
- }
@@ -1,110 +0,0 @@
1
- /**
2
- * Test Helpers and Utilities
3
- * 테스트 헬퍼 및 유틸리티 함수들
4
- */
5
- import type { StandardRequest } from "@k-msg/core";
6
- import type { IWINVConfig } from "./iwinv/types/iwinv";
7
- export declare const TEST_CONFIGS: {
8
- development: IWINVConfig;
9
- production: IWINVConfig;
10
- invalid: IWINVConfig;
11
- };
12
- export declare const createTestRequests: () => {
13
- alimtalk: {
14
- welcome: StandardRequest;
15
- otp: StandardRequest;
16
- order: StandardRequest;
17
- };
18
- sms: {
19
- short: StandardRequest;
20
- long: StandardRequest;
21
- };
22
- invalid: {
23
- emptyPhone: StandardRequest;
24
- invalidPhone: StandardRequest;
25
- emptyTemplate: StandardRequest;
26
- };
27
- };
28
- export declare const createBulkTestData: (count?: number) => {
29
- templateCode: string;
30
- phoneNumber: string;
31
- variables: {
32
- index: string;
33
- name: string;
34
- message: string;
35
- };
36
- channel: "alimtalk" | "sms" | "auto";
37
- }[];
38
- export declare const createPerformanceTracker: () => {
39
- start: () => void;
40
- end: () => void;
41
- record: (success: boolean) => void;
42
- getMetrics: () => {
43
- startTime: number;
44
- endTime: number;
45
- duration: number;
46
- memoryUsage: {
47
- start: number;
48
- end: number;
49
- peak: number;
50
- };
51
- requestCount: number;
52
- successCount: number;
53
- errorCount: number;
54
- };
55
- reset: () => void;
56
- };
57
- export declare const createMockHttpResponse: (options?: {
58
- success?: boolean;
59
- delay?: number;
60
- statusCode?: number;
61
- data?: any;
62
- }) => Promise<unknown>;
63
- export declare const createConcurrencyTester: () => {
64
- runConcurrent: <T>(operations: (() => Promise<T>)[], maxConcurrency?: number) => Promise<Array<{
65
- result: T | null;
66
- error: Error | null;
67
- duration: number;
68
- }>>;
69
- testRateLimit: <T>(operation: () => Promise<T>, requestsPerSecond: number, duration: number) => Promise<{
70
- attempted: number;
71
- successful: number;
72
- failed: number;
73
- actualRate: number;
74
- }>;
75
- };
76
- export declare const createValidationHelpers: () => {
77
- isValidPhoneNumber: (phone: string) => boolean;
78
- isValidTemplateCode: (code: string) => boolean;
79
- containsSensitiveData: (variables: Record<string, string>) => boolean;
80
- getMessageType: (message: string) => "sms" | "lms" | "mms";
81
- };
82
- export declare const createTestStateTracker: () => {
83
- recordTest: (name: string, passed: boolean, duration: number, error?: string) => void;
84
- skip: (name: string) => void;
85
- getStats: () => {
86
- totalTests: number;
87
- passedTests: number;
88
- failedTests: number;
89
- skippedTests: number;
90
- duration: number;
91
- errors: Array<{
92
- test: string;
93
- error: string;
94
- }>;
95
- };
96
- getSummary: () => {
97
- successRate: number;
98
- averageDuration: number;
99
- totalTests: number;
100
- passedTests: number;
101
- failedTests: number;
102
- skippedTests: number;
103
- duration: number;
104
- errors: Array<{
105
- test: string;
106
- error: string;
107
- }>;
108
- };
109
- reset: () => void;
110
- };
@@ -1,172 +0,0 @@
1
- /**
2
- * 공통 프로바이더 인터페이스와 타입 정의
3
- * 모든 K-Message 프로바이더가 구현해야 하는 기본 인터페이스
4
- * 알림톡, 친구톡, SMS, LMS 등 다양한 메시징 채널 지원
5
- */
6
- export declare enum MessageChannel {
7
- ALIMTALK = "alimtalk",// 카카오 알림톡
8
- FRIENDTALK = "friendtalk",// 카카오 친구톡
9
- SMS = "sms",// 단문 메시지
10
- LMS = "lms",// 장문 메시지
11
- MMS = "mms",// 멀티미디어 메시지
12
- PUSH = "push",// 푸시 알림
13
- EMAIL = "email"
14
- }
15
- export declare enum MessageType {
16
- TEXT = "text",// 텍스트만
17
- RICH = "rich",// 리치 메시지 (버튼, 이미지 등)
18
- TEMPLATE = "template",// 템플릿 기반
19
- CUSTOM = "custom"
20
- }
21
- export interface SendOptions {
22
- channel?: MessageChannel;
23
- messageType?: MessageType;
24
- reserve?: boolean;
25
- sendDate?: Date | string;
26
- timezone?: string;
27
- senderKey?: string;
28
- senderNumber?: string;
29
- senderName?: string;
30
- enableFallback?: boolean;
31
- fallbackChannel?: MessageChannel;
32
- fallbackContent?: string;
33
- fallbackTitle?: string;
34
- title?: string;
35
- subject?: string;
36
- priority?: "high" | "normal" | "low";
37
- trackingId?: string;
38
- campaignId?: string;
39
- tags?: string[];
40
- attachments?: MediaAttachment[];
41
- metadata?: Record<string, any>;
42
- }
43
- export interface MediaAttachment {
44
- type: "image" | "video" | "audio" | "document";
45
- url: string;
46
- filename?: string;
47
- size?: number;
48
- mimeType?: string;
49
- }
50
- export interface TemplateFilters {
51
- templateCode?: string;
52
- templateName?: string;
53
- templateStatus?: string;
54
- [key: string]: any;
55
- }
56
- export interface HistoryFilters {
57
- reserve?: "Y" | "N" | boolean;
58
- startDate?: string | Date;
59
- endDate?: string | Date;
60
- messageId?: number | string;
61
- phone?: string;
62
- [key: string]: any;
63
- }
64
- export interface HealthCheckResult {
65
- healthy: boolean;
66
- issues: string[];
67
- data?: {
68
- balance?: number;
69
- status: string;
70
- code?: number;
71
- message?: string;
72
- } | null;
73
- }
74
- export interface SendResult {
75
- success: boolean;
76
- messageId: string | null;
77
- status: string;
78
- error: string | null;
79
- }
80
- export interface TemplateResult {
81
- success: boolean;
82
- templateCode: string | null;
83
- status: string;
84
- error: string | null;
85
- }
86
- export interface BaseProvider<TConfig = any> {
87
- readonly id: string;
88
- readonly name: string;
89
- readonly supportedChannels: MessageChannel[];
90
- readonly supportedTypes: MessageType[];
91
- healthCheck(): Promise<HealthCheckResult>;
92
- sendMessage?(recipient: string, // 수신자 (전화번호 또는 이메일)
93
- content: MessageContent, options?: SendOptions): Promise<SendResult>;
94
- sendTemplateMessage?(templateCode: string, phoneNumber: string, variables: Record<string, any>, options?: SendOptions): Promise<SendResult>;
95
- createTemplate?(template: TemplateCreateRequest): Promise<TemplateResult>;
96
- getTemplates?(pageNum?: number, pageSize?: number, filters?: TemplateFilters): Promise<any>;
97
- modifyTemplate?(templateCode: string, template: TemplateUpdateRequest): Promise<TemplateResult>;
98
- deleteTemplate?(templateCode: string): Promise<any>;
99
- getHistory?(pageNum?: number, pageSize?: number, filters?: HistoryFilters): Promise<any>;
100
- cancelReservation?(messageId: number | string): Promise<any>;
101
- getSenderNumbers?(): Promise<SenderNumber[]>;
102
- verifySenderNumber?(phoneNumber: string): Promise<SenderVerificationResult>;
103
- getChannelInfo?(channel: MessageChannel): Promise<ChannelInfo>;
104
- }
105
- export interface MessageContent {
106
- channel?: MessageChannel;
107
- type?: MessageType;
108
- text: string;
109
- title?: string;
110
- templateId?: string;
111
- variables?: Record<string, any>;
112
- buttons?: MessageButton[];
113
- attachments?: MediaAttachment[];
114
- }
115
- export interface MessageButton {
116
- type: "web" | "app" | "phone" | "delivery";
117
- text: string;
118
- url?: string;
119
- scheme?: string;
120
- phoneNumber?: string;
121
- }
122
- export interface TemplateCreateRequest {
123
- name: string;
124
- content: string;
125
- channel: MessageChannel;
126
- category?: string;
127
- buttons?: MessageButton[];
128
- variables?: string[];
129
- description?: string;
130
- }
131
- export interface TemplateUpdateRequest {
132
- name?: string;
133
- content?: string;
134
- buttons?: MessageButton[];
135
- description?: string;
136
- }
137
- export interface SenderNumber {
138
- phoneNumber: string;
139
- name?: string;
140
- verified: boolean;
141
- verifiedAt?: Date;
142
- status: "active" | "pending" | "rejected" | "blocked";
143
- }
144
- export interface SenderVerificationResult {
145
- success: boolean;
146
- phoneNumber: string;
147
- status: string;
148
- verificationCode?: string;
149
- error?: string;
150
- }
151
- export interface ChannelInfo {
152
- channel: MessageChannel;
153
- available: boolean;
154
- limits: {
155
- maxLength?: number;
156
- maxAttachments?: number;
157
- maxAttachmentSize?: number;
158
- };
159
- features: {
160
- supportsButtons: boolean;
161
- supportsAttachments: boolean;
162
- supportsTemplates: boolean;
163
- supportsScheduling: boolean;
164
- };
165
- }
166
- export interface BaseProviderConfig {
167
- apiKey: string;
168
- baseUrl?: string;
169
- debug?: boolean;
170
- timeout?: number;
171
- retries?: number;
172
- }
@@ -1,199 +0,0 @@
1
- /**
2
- * Typed Template System
3
- * 템플릿별 강타입 시스템
4
- */
5
- import type { StandardRequest, StandardResult } from "@k-msg/core";
6
- export type MessageChannel = "alimtalk" | "sms" | "mms";
7
- export interface VariableType {
8
- string: string;
9
- number: number;
10
- boolean: boolean;
11
- date: string;
12
- phoneNumber: string;
13
- url: string;
14
- email: string;
15
- }
16
- export interface VariableDefinition<T extends keyof VariableType = keyof VariableType> {
17
- type: T;
18
- required: boolean;
19
- description?: string;
20
- validation?: {
21
- pattern?: RegExp;
22
- minLength?: number;
23
- maxLength?: number;
24
- min?: number;
25
- max?: number;
26
- };
27
- defaultValue?: VariableType[T];
28
- }
29
- export interface TemplateSchema<V extends Record<string, VariableDefinition> = Record<string, VariableDefinition>> {
30
- templateCode: string;
31
- name: string;
32
- description?: string;
33
- channels: MessageChannel[];
34
- variables: V;
35
- metadata?: {
36
- category?: string;
37
- version?: string;
38
- author?: string;
39
- createdAt?: string;
40
- updatedAt?: string;
41
- };
42
- }
43
- export interface TemplateRegistry {
44
- WELCOME_001: TemplateSchema<{
45
- name: VariableDefinition<"string">;
46
- service: VariableDefinition<"string">;
47
- date: VariableDefinition<"date">;
48
- }>;
49
- OTP_AUTH_001: TemplateSchema<{
50
- code: VariableDefinition<"string">;
51
- expiry: VariableDefinition<"string">;
52
- serviceName: VariableDefinition<"string">;
53
- }>;
54
- ORDER_CONFIRM_001: TemplateSchema<{
55
- orderNumber: VariableDefinition<"string">;
56
- productName: VariableDefinition<"string">;
57
- amount: VariableDefinition<"string">;
58
- deliveryDate: VariableDefinition<"date">;
59
- customerName: VariableDefinition<"string">;
60
- }>;
61
- PAYMENT_COMPLETE_001: TemplateSchema<{
62
- amount: VariableDefinition<"string">;
63
- paymentMethod: VariableDefinition<"string">;
64
- transactionId: VariableDefinition<"string">;
65
- customerName: VariableDefinition<"string">;
66
- }>;
67
- SMS_DIRECT: TemplateSchema<{
68
- message: VariableDefinition<"string">;
69
- }>;
70
- LMS_DIRECT: TemplateSchema<{
71
- subject: VariableDefinition<"string">;
72
- message: VariableDefinition<"string">;
73
- }>;
74
- EMERGENCY_NOTIFICATION: TemplateSchema<{
75
- alertType: VariableDefinition<"string">;
76
- message: VariableDefinition<"string">;
77
- contactInfo: VariableDefinition<"string">;
78
- urgencyLevel: VariableDefinition<"string">;
79
- }>;
80
- }
81
- export type TemplateCode = keyof TemplateRegistry;
82
- export type ExtractVariables<T extends TemplateCode> = {
83
- [K in keyof TemplateRegistry[T]["variables"]]: TemplateRegistry[T]["variables"][K] extends VariableDefinition<infer VT> ? VariableType[VT] : never;
84
- };
85
- export type ExtractRequiredVariables<T extends TemplateCode> = {
86
- [K in keyof TemplateRegistry[T]["variables"] as TemplateRegistry[T]["variables"][K] extends {
87
- required: true;
88
- } ? K : never]: TemplateRegistry[T]["variables"][K] extends VariableDefinition<infer VT> ? VariableType[VT] : never;
89
- };
90
- export type ExtractOptionalVariables<T extends TemplateCode> = {
91
- [K in keyof TemplateRegistry[T]["variables"] as TemplateRegistry[T]["variables"][K] extends {
92
- required: false;
93
- } ? K : never]?: TemplateRegistry[T]["variables"][K] extends VariableDefinition<infer VT> ? VariableType[VT] : never;
94
- };
95
- export type TemplateVariables<T extends TemplateCode> = ExtractRequiredVariables<T> & ExtractOptionalVariables<T>;
96
- export type ExtractChannels<T extends TemplateCode> = TemplateRegistry[T]["channels"][number];
97
- export interface TypedRequest<T extends TemplateCode> {
98
- templateCode: T;
99
- phoneNumber: string;
100
- variables: TemplateVariables<T>;
101
- options?: {
102
- senderNumber?: string;
103
- scheduledAt?: Date;
104
- priority?: "high" | "normal" | "low";
105
- channel?: ExtractChannels<T>;
106
- subject?: string;
107
- };
108
- }
109
- export interface TypedResult<T extends TemplateCode> {
110
- messageId: string;
111
- templateCode: T;
112
- phoneNumber: string;
113
- channel: ExtractChannels<T>;
114
- status: "sent" | "pending" | "failed";
115
- timestamp: Date;
116
- variables: TemplateVariables<T>;
117
- error?: {
118
- code: string;
119
- message: string;
120
- retryable: boolean;
121
- };
122
- }
123
- /**
124
- * TypedRequest를 StandardRequest로 변환하는 유틸리티 타입
125
- */
126
- export type ToStandardRequest<T extends TemplateCode> = StandardRequest & {
127
- templateCode: T;
128
- variables: Record<string, string>;
129
- };
130
- /**
131
- * StandardResult를 TypedResult로 변환하는 유틸리티 타입
132
- */
133
- export type ToTypedResult<T extends TemplateCode> = Omit<TypedResult<T>, "templateCode" | "channel"> & {
134
- templateCode: T;
135
- channel: ExtractChannels<T>;
136
- };
137
- /**
138
- * 타입 안전한 템플릿 변환 함수들
139
- */
140
- export declare class TemplateTypeConverter {
141
- /**
142
- * TypedRequest를 StandardRequest로 변환
143
- */
144
- static toStandardRequest<T extends TemplateCode>(typedRequest: TypedRequest<T>): StandardRequest;
145
- /**
146
- * StandardResult를 TypedResult로 변환
147
- */
148
- static toTypedResult<T extends TemplateCode>(standardResult: StandardResult, templateCode: T, originalVariables: TemplateVariables<T>): TypedResult<T>;
149
- /**
150
- * 템플릿 코드로부터 채널 추론
151
- */
152
- private static inferChannel;
153
- /**
154
- * StandardStatus를 TypedResult 상태로 매핑
155
- */
156
- private static mapStandardStatus;
157
- }
158
- /**
159
- * 타입 안전한 Provider 래퍼
160
- * 기존 Provider를 감싸서 타입 안전성을 제공
161
- */
162
- export declare class TypedProvider {
163
- private provider;
164
- constructor(provider: import("@k-msg/core").BaseProvider);
165
- /**
166
- * 타입 안전한 메시지 전송
167
- */
168
- send<T extends TemplateCode>(request: TypedRequest<T>): Promise<TypedResult<T>>;
169
- /**
170
- * 대량 전송 (타입 안전)
171
- */
172
- sendBulk<T extends TemplateCode>(requests: TypedRequest<T>[], options?: {
173
- batchSize?: number;
174
- concurrency?: number;
175
- failFast?: boolean;
176
- }): Promise<TypedResult<T>[]>;
177
- /**
178
- * 상태 조회 (타입 안전하지 않은 부분 - messageId만 필요)
179
- */
180
- getStatus(messageId: string): Promise<import("@k-msg/core").DeliveryStatus>;
181
- /**
182
- * 기본 Provider 접근 (고급 사용자용)
183
- */
184
- getUnderlyingProvider(): import("@k-msg/core").BaseProvider<StandardRequest, StandardResult>;
185
- }
186
- export declare const TEMPLATE_REGISTRY: TemplateRegistry;
187
- export declare class TemplateValidator {
188
- static validateVariables<T extends TemplateCode>(templateCode: T, variables: Record<string, any>): ValidationResult<TemplateVariables<T>>;
189
- static validateChannel<T extends TemplateCode>(templateCode: T, channel: string): boolean;
190
- private static validateType;
191
- private static validateValue;
192
- private static applyDefaults;
193
- }
194
- export interface ValidationResult<T> {
195
- isValid: boolean;
196
- errors: string[];
197
- warnings: string[];
198
- validatedVariables: T;
199
- }