@ajayjbtickets/common 1.0.9 → 1.0.10
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/index.d.mts +179 -0
- package/dist/index.d.ts +179 -10
- package/dist/index.js +524 -25
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +460 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +12 -5
- package/dist/config/config.d.ts +0 -10
- package/dist/config/config.js +0 -24
- package/dist/config/config.js.map +0 -1
- package/dist/constants/environments.d.ts +0 -5
- package/dist/constants/environments.js +0 -9
- package/dist/constants/environments.js.map +0 -1
- package/dist/core/ApiError.d.ts +0 -54
- package/dist/core/ApiError.js +0 -133
- package/dist/core/ApiError.js.map +0 -1
- package/dist/core/ApiResponse.d.ts +0 -83
- package/dist/core/ApiResponse.js +0 -140
- package/dist/core/ApiResponse.js.map +0 -1
- package/dist/core/Logger.d.ts +0 -2
- package/dist/core/Logger.js +0 -74
- package/dist/core/Logger.js.map +0 -1
- package/dist/middlewares/schemaValidator.d.ts +0 -4
- package/dist/middlewares/schemaValidator.js +0 -21
- package/dist/middlewares/schemaValidator.js.map +0 -1
- package/dist/middlewares/verifyToken.d.ts +0 -2
- package/dist/middlewares/verifyToken.js +0 -33
- package/dist/middlewares/verifyToken.js.map +0 -1
- package/dist/services/jwt.service.d.ts +0 -10
- package/dist/services/jwt.service.js +0 -26
- package/dist/services/jwt.service.js.map +0 -1
- package/dist/services/password.service.d.ts +0 -4
- package/dist/services/password.service.js +0 -32
- package/dist/services/password.service.js.map +0 -1
- package/dist/types/validation.d.ts +0 -6
- package/dist/types/validation.js +0 -11
- package/dist/types/validation.js.map +0 -1
- package/dist/utils/asyncHandler.d.ts +0 -4
- package/dist/utils/asyncHandler.js +0 -13
- package/dist/utils/asyncHandler.js.map +0 -1
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { Response, Request, NextFunction } from 'express';
|
|
2
|
+
import winston from 'winston';
|
|
3
|
+
import { ZodSchema } from 'zod';
|
|
4
|
+
import jsonwebtoken, { SignOptions, VerifyOptions } from 'jsonwebtoken';
|
|
5
|
+
|
|
6
|
+
declare const ENVIRONMENTS: {
|
|
7
|
+
production: string;
|
|
8
|
+
development: string;
|
|
9
|
+
testing: string;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
declare enum ErrorType {
|
|
13
|
+
BAD_TOKEN = "BadTokenError",
|
|
14
|
+
TOKEN_EXPIRED = "TokenExpiredError",
|
|
15
|
+
UNAUTHORIZED = "AuthFailureError",
|
|
16
|
+
ACCESS_TOKEN = "AccessTokenError",
|
|
17
|
+
INTERNAL = "InternalError",
|
|
18
|
+
NOT_FOUND = "NotFoundError",
|
|
19
|
+
NO_ENTRY = "NoEntryError",
|
|
20
|
+
NO_DATA = "NoDataError",
|
|
21
|
+
BAD_REQUEST = "BadRequestError",
|
|
22
|
+
FORBIDDEN = "ForbiddenError"
|
|
23
|
+
}
|
|
24
|
+
type ErrorDetailType = {
|
|
25
|
+
field: string | number;
|
|
26
|
+
message?: (string | number)[];
|
|
27
|
+
};
|
|
28
|
+
declare abstract class ApiError extends Error {
|
|
29
|
+
type: ErrorType;
|
|
30
|
+
message: string;
|
|
31
|
+
errors: ErrorDetailType[];
|
|
32
|
+
constructor(type: ErrorType, message: string | undefined, errors: ErrorDetailType[]);
|
|
33
|
+
static handle(err: ApiError, res: Response): void;
|
|
34
|
+
}
|
|
35
|
+
declare class BadTokenError extends ApiError {
|
|
36
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
37
|
+
}
|
|
38
|
+
declare class TokenExpiredError extends ApiError {
|
|
39
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
40
|
+
}
|
|
41
|
+
declare class AuthFailureError extends ApiError {
|
|
42
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
43
|
+
}
|
|
44
|
+
declare class AccessTokenError extends ApiError {
|
|
45
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
46
|
+
}
|
|
47
|
+
declare class InternalError extends ApiError {
|
|
48
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
49
|
+
}
|
|
50
|
+
declare class NotFoundError extends ApiError {
|
|
51
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
52
|
+
}
|
|
53
|
+
declare class NoEntryError extends ApiError {
|
|
54
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
55
|
+
}
|
|
56
|
+
declare class NoDataError extends ApiError {
|
|
57
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
58
|
+
}
|
|
59
|
+
declare class BadRequestError extends ApiError {
|
|
60
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
61
|
+
}
|
|
62
|
+
declare class ForbiddenError extends ApiError {
|
|
63
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
declare enum StatusCode {
|
|
67
|
+
SUCCESS = "10000",
|
|
68
|
+
FAILURE = "10001",
|
|
69
|
+
RETRY = "10002",
|
|
70
|
+
IN_VALID_ACCESS_TOKEN = "10003"
|
|
71
|
+
}
|
|
72
|
+
declare enum ResponseStatusCode {
|
|
73
|
+
SUCCESS = 200,
|
|
74
|
+
CREATED = 201,
|
|
75
|
+
ACCEPTED = 202,
|
|
76
|
+
NO_CONTENT = 204,
|
|
77
|
+
MOVED_PERMANENTLY = 301,
|
|
78
|
+
FOUND = 302,
|
|
79
|
+
NOT_MODIFIED = 304,
|
|
80
|
+
TEMPORARY_REDIRECT = 307,
|
|
81
|
+
PERMANENT_REDIRECT = 308,
|
|
82
|
+
BAD_REQUEST = 400,
|
|
83
|
+
UNAUTHORIZED = 401,
|
|
84
|
+
PAYMENT_REQUIRED = 402,
|
|
85
|
+
FORBIDDEN = 403,
|
|
86
|
+
NOT_FOUND = 404,
|
|
87
|
+
METHOD_NOT_ALLOWED = 405,
|
|
88
|
+
NOT_ACCEPTABLE = 406,
|
|
89
|
+
CONFLICT = 409,
|
|
90
|
+
GONE = 410,
|
|
91
|
+
PAYLOAD_TOO_LARGE = 413,
|
|
92
|
+
UNSUPPORTED_MEDIA_TYPE = 415,
|
|
93
|
+
UNPROCESSABLE_ENTITY = 422,
|
|
94
|
+
TOO_MANY_REQUESTS = 429,
|
|
95
|
+
INTERNAL_ERROR = 500,
|
|
96
|
+
NOT_IMPLEMENTED = 501,
|
|
97
|
+
BAD_GATEWAY = 502,
|
|
98
|
+
SERVICE_UNAVAILABLE = 503,
|
|
99
|
+
GATEWAY_TIMEOUT = 504
|
|
100
|
+
}
|
|
101
|
+
declare abstract class ApiResponse {
|
|
102
|
+
message: string;
|
|
103
|
+
statusCode: string | undefined;
|
|
104
|
+
status: number;
|
|
105
|
+
constructor(status: number, message: string, statusCode?: string);
|
|
106
|
+
prepare<T extends ApiResponse>(res: Response, response: T, headers?: {
|
|
107
|
+
[key: string]: string;
|
|
108
|
+
}): void;
|
|
109
|
+
send(res: Response, headers?: {
|
|
110
|
+
[key: string]: string;
|
|
111
|
+
}): void;
|
|
112
|
+
private sanitize;
|
|
113
|
+
}
|
|
114
|
+
declare class SuccessResponse<T> extends ApiResponse {
|
|
115
|
+
data: T;
|
|
116
|
+
constructor(responseStatusCode: ResponseStatusCode.SUCCESS | ResponseStatusCode.CREATED | ResponseStatusCode.ACCEPTED | ResponseStatusCode.NO_CONTENT, message: string, data: T);
|
|
117
|
+
send(res: Response): void;
|
|
118
|
+
}
|
|
119
|
+
declare class AccessTokenErrorResponse extends ApiResponse {
|
|
120
|
+
protected instruction: string;
|
|
121
|
+
errors: ErrorDetailType[];
|
|
122
|
+
constructor(message: string, errors: ErrorDetailType[]);
|
|
123
|
+
send(res: Response, headers?: {
|
|
124
|
+
[key: string]: string;
|
|
125
|
+
}): void;
|
|
126
|
+
}
|
|
127
|
+
declare class BadTokenResponse extends ApiResponse {
|
|
128
|
+
errors: ErrorDetailType[];
|
|
129
|
+
constructor(message: string, errors: ErrorDetailType[]);
|
|
130
|
+
}
|
|
131
|
+
declare class BadRequestResponse extends ApiResponse {
|
|
132
|
+
errors: ErrorDetailType[];
|
|
133
|
+
constructor(message: string, errors: ErrorDetailType[]);
|
|
134
|
+
}
|
|
135
|
+
declare class InternalErrorResponse extends ApiResponse {
|
|
136
|
+
errors: ErrorDetailType[];
|
|
137
|
+
constructor(message: string, errors: ErrorDetailType[]);
|
|
138
|
+
}
|
|
139
|
+
declare class NoFoundResponse extends ApiResponse {
|
|
140
|
+
errors: ErrorDetailType[];
|
|
141
|
+
constructor(message: string, errors: ErrorDetailType[]);
|
|
142
|
+
}
|
|
143
|
+
declare class ForbiddenResponse extends ApiResponse {
|
|
144
|
+
errors: ErrorDetailType[];
|
|
145
|
+
constructor(message: string, errors: ErrorDetailType[]);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
declare const logger: winston.Logger;
|
|
149
|
+
|
|
150
|
+
declare enum ValidationSource {
|
|
151
|
+
BODY = "body",
|
|
152
|
+
HEADER = "headers",
|
|
153
|
+
QUERY = "query",
|
|
154
|
+
PARAM = "params"
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
declare const schemaValidator: (type: ValidationSource, schema: ZodSchema) => (req: Request, res: Response, next: NextFunction) => void;
|
|
158
|
+
|
|
159
|
+
declare const verifyToken: (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
160
|
+
|
|
161
|
+
interface JwtPayload {
|
|
162
|
+
_id: string;
|
|
163
|
+
email: string;
|
|
164
|
+
}
|
|
165
|
+
declare class JwtService {
|
|
166
|
+
static sign(payload: string | Buffer | object, signOptions?: SignOptions): string;
|
|
167
|
+
static verify(token: string, verifyOptions?: VerifyOptions): string | jsonwebtoken.Jwt | jsonwebtoken.JwtPayload;
|
|
168
|
+
static generatePayload<T extends JwtPayload>(user: T): T;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
declare class Password {
|
|
172
|
+
static hashPassword(password: string): Promise<string>;
|
|
173
|
+
static comparePassword(password: string, hashedPassword: string): Promise<string | boolean>;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
type AsyncFunction = (req: Request, res: Response, next: NextFunction) => Promise<any>;
|
|
177
|
+
declare const asyncHandler: (execution: AsyncFunction) => (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
178
|
+
|
|
179
|
+
export { AccessTokenError, AccessTokenErrorResponse, ApiError, ApiResponse, AuthFailureError, BadRequestError, BadRequestResponse, BadTokenError, BadTokenResponse, ENVIRONMENTS, type ErrorDetailType, ErrorType, ForbiddenError, ForbiddenResponse, InternalError, InternalErrorResponse, type JwtPayload, JwtService, NoDataError, NoEntryError, NoFoundResponse, NotFoundError, Password, ResponseStatusCode, StatusCode, SuccessResponse, TokenExpiredError, ValidationSource, asyncHandler, logger, schemaValidator, verifyToken };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,179 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { Response, Request, NextFunction } from 'express';
|
|
2
|
+
import winston from 'winston';
|
|
3
|
+
import { ZodSchema } from 'zod';
|
|
4
|
+
import jsonwebtoken, { SignOptions, VerifyOptions } from 'jsonwebtoken';
|
|
5
|
+
|
|
6
|
+
declare const ENVIRONMENTS: {
|
|
7
|
+
production: string;
|
|
8
|
+
development: string;
|
|
9
|
+
testing: string;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
declare enum ErrorType {
|
|
13
|
+
BAD_TOKEN = "BadTokenError",
|
|
14
|
+
TOKEN_EXPIRED = "TokenExpiredError",
|
|
15
|
+
UNAUTHORIZED = "AuthFailureError",
|
|
16
|
+
ACCESS_TOKEN = "AccessTokenError",
|
|
17
|
+
INTERNAL = "InternalError",
|
|
18
|
+
NOT_FOUND = "NotFoundError",
|
|
19
|
+
NO_ENTRY = "NoEntryError",
|
|
20
|
+
NO_DATA = "NoDataError",
|
|
21
|
+
BAD_REQUEST = "BadRequestError",
|
|
22
|
+
FORBIDDEN = "ForbiddenError"
|
|
23
|
+
}
|
|
24
|
+
type ErrorDetailType = {
|
|
25
|
+
field: string | number;
|
|
26
|
+
message?: (string | number)[];
|
|
27
|
+
};
|
|
28
|
+
declare abstract class ApiError extends Error {
|
|
29
|
+
type: ErrorType;
|
|
30
|
+
message: string;
|
|
31
|
+
errors: ErrorDetailType[];
|
|
32
|
+
constructor(type: ErrorType, message: string | undefined, errors: ErrorDetailType[]);
|
|
33
|
+
static handle(err: ApiError, res: Response): void;
|
|
34
|
+
}
|
|
35
|
+
declare class BadTokenError extends ApiError {
|
|
36
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
37
|
+
}
|
|
38
|
+
declare class TokenExpiredError extends ApiError {
|
|
39
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
40
|
+
}
|
|
41
|
+
declare class AuthFailureError extends ApiError {
|
|
42
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
43
|
+
}
|
|
44
|
+
declare class AccessTokenError extends ApiError {
|
|
45
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
46
|
+
}
|
|
47
|
+
declare class InternalError extends ApiError {
|
|
48
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
49
|
+
}
|
|
50
|
+
declare class NotFoundError extends ApiError {
|
|
51
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
52
|
+
}
|
|
53
|
+
declare class NoEntryError extends ApiError {
|
|
54
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
55
|
+
}
|
|
56
|
+
declare class NoDataError extends ApiError {
|
|
57
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
58
|
+
}
|
|
59
|
+
declare class BadRequestError extends ApiError {
|
|
60
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
61
|
+
}
|
|
62
|
+
declare class ForbiddenError extends ApiError {
|
|
63
|
+
constructor(message?: string, errors?: ErrorDetailType[]);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
declare enum StatusCode {
|
|
67
|
+
SUCCESS = "10000",
|
|
68
|
+
FAILURE = "10001",
|
|
69
|
+
RETRY = "10002",
|
|
70
|
+
IN_VALID_ACCESS_TOKEN = "10003"
|
|
71
|
+
}
|
|
72
|
+
declare enum ResponseStatusCode {
|
|
73
|
+
SUCCESS = 200,
|
|
74
|
+
CREATED = 201,
|
|
75
|
+
ACCEPTED = 202,
|
|
76
|
+
NO_CONTENT = 204,
|
|
77
|
+
MOVED_PERMANENTLY = 301,
|
|
78
|
+
FOUND = 302,
|
|
79
|
+
NOT_MODIFIED = 304,
|
|
80
|
+
TEMPORARY_REDIRECT = 307,
|
|
81
|
+
PERMANENT_REDIRECT = 308,
|
|
82
|
+
BAD_REQUEST = 400,
|
|
83
|
+
UNAUTHORIZED = 401,
|
|
84
|
+
PAYMENT_REQUIRED = 402,
|
|
85
|
+
FORBIDDEN = 403,
|
|
86
|
+
NOT_FOUND = 404,
|
|
87
|
+
METHOD_NOT_ALLOWED = 405,
|
|
88
|
+
NOT_ACCEPTABLE = 406,
|
|
89
|
+
CONFLICT = 409,
|
|
90
|
+
GONE = 410,
|
|
91
|
+
PAYLOAD_TOO_LARGE = 413,
|
|
92
|
+
UNSUPPORTED_MEDIA_TYPE = 415,
|
|
93
|
+
UNPROCESSABLE_ENTITY = 422,
|
|
94
|
+
TOO_MANY_REQUESTS = 429,
|
|
95
|
+
INTERNAL_ERROR = 500,
|
|
96
|
+
NOT_IMPLEMENTED = 501,
|
|
97
|
+
BAD_GATEWAY = 502,
|
|
98
|
+
SERVICE_UNAVAILABLE = 503,
|
|
99
|
+
GATEWAY_TIMEOUT = 504
|
|
100
|
+
}
|
|
101
|
+
declare abstract class ApiResponse {
|
|
102
|
+
message: string;
|
|
103
|
+
statusCode: string | undefined;
|
|
104
|
+
status: number;
|
|
105
|
+
constructor(status: number, message: string, statusCode?: string);
|
|
106
|
+
prepare<T extends ApiResponse>(res: Response, response: T, headers?: {
|
|
107
|
+
[key: string]: string;
|
|
108
|
+
}): void;
|
|
109
|
+
send(res: Response, headers?: {
|
|
110
|
+
[key: string]: string;
|
|
111
|
+
}): void;
|
|
112
|
+
private sanitize;
|
|
113
|
+
}
|
|
114
|
+
declare class SuccessResponse<T> extends ApiResponse {
|
|
115
|
+
data: T;
|
|
116
|
+
constructor(responseStatusCode: ResponseStatusCode.SUCCESS | ResponseStatusCode.CREATED | ResponseStatusCode.ACCEPTED | ResponseStatusCode.NO_CONTENT, message: string, data: T);
|
|
117
|
+
send(res: Response): void;
|
|
118
|
+
}
|
|
119
|
+
declare class AccessTokenErrorResponse extends ApiResponse {
|
|
120
|
+
protected instruction: string;
|
|
121
|
+
errors: ErrorDetailType[];
|
|
122
|
+
constructor(message: string, errors: ErrorDetailType[]);
|
|
123
|
+
send(res: Response, headers?: {
|
|
124
|
+
[key: string]: string;
|
|
125
|
+
}): void;
|
|
126
|
+
}
|
|
127
|
+
declare class BadTokenResponse extends ApiResponse {
|
|
128
|
+
errors: ErrorDetailType[];
|
|
129
|
+
constructor(message: string, errors: ErrorDetailType[]);
|
|
130
|
+
}
|
|
131
|
+
declare class BadRequestResponse extends ApiResponse {
|
|
132
|
+
errors: ErrorDetailType[];
|
|
133
|
+
constructor(message: string, errors: ErrorDetailType[]);
|
|
134
|
+
}
|
|
135
|
+
declare class InternalErrorResponse extends ApiResponse {
|
|
136
|
+
errors: ErrorDetailType[];
|
|
137
|
+
constructor(message: string, errors: ErrorDetailType[]);
|
|
138
|
+
}
|
|
139
|
+
declare class NoFoundResponse extends ApiResponse {
|
|
140
|
+
errors: ErrorDetailType[];
|
|
141
|
+
constructor(message: string, errors: ErrorDetailType[]);
|
|
142
|
+
}
|
|
143
|
+
declare class ForbiddenResponse extends ApiResponse {
|
|
144
|
+
errors: ErrorDetailType[];
|
|
145
|
+
constructor(message: string, errors: ErrorDetailType[]);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
declare const logger: winston.Logger;
|
|
149
|
+
|
|
150
|
+
declare enum ValidationSource {
|
|
151
|
+
BODY = "body",
|
|
152
|
+
HEADER = "headers",
|
|
153
|
+
QUERY = "query",
|
|
154
|
+
PARAM = "params"
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
declare const schemaValidator: (type: ValidationSource, schema: ZodSchema) => (req: Request, res: Response, next: NextFunction) => void;
|
|
158
|
+
|
|
159
|
+
declare const verifyToken: (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
160
|
+
|
|
161
|
+
interface JwtPayload {
|
|
162
|
+
_id: string;
|
|
163
|
+
email: string;
|
|
164
|
+
}
|
|
165
|
+
declare class JwtService {
|
|
166
|
+
static sign(payload: string | Buffer | object, signOptions?: SignOptions): string;
|
|
167
|
+
static verify(token: string, verifyOptions?: VerifyOptions): string | jsonwebtoken.Jwt | jsonwebtoken.JwtPayload;
|
|
168
|
+
static generatePayload<T extends JwtPayload>(user: T): T;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
declare class Password {
|
|
172
|
+
static hashPassword(password: string): Promise<string>;
|
|
173
|
+
static comparePassword(password: string, hashedPassword: string): Promise<string | boolean>;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
type AsyncFunction = (req: Request, res: Response, next: NextFunction) => Promise<any>;
|
|
177
|
+
declare const asyncHandler: (execution: AsyncFunction) => (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
178
|
+
|
|
179
|
+
export { AccessTokenError, AccessTokenErrorResponse, ApiError, ApiResponse, AuthFailureError, BadRequestError, BadRequestResponse, BadTokenError, BadTokenResponse, ENVIRONMENTS, type ErrorDetailType, ErrorType, ForbiddenError, ForbiddenResponse, InternalError, InternalErrorResponse, type JwtPayload, JwtService, NoDataError, NoEntryError, NoFoundResponse, NotFoundError, Password, ResponseStatusCode, StatusCode, SuccessResponse, TokenExpiredError, ValidationSource, asyncHandler, logger, schemaValidator, verifyToken };
|