@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.
Files changed (40) hide show
  1. package/dist/index.d.mts +179 -0
  2. package/dist/index.d.ts +179 -10
  3. package/dist/index.js +524 -25
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +460 -0
  6. package/dist/index.mjs.map +1 -0
  7. package/package.json +12 -5
  8. package/dist/config/config.d.ts +0 -10
  9. package/dist/config/config.js +0 -24
  10. package/dist/config/config.js.map +0 -1
  11. package/dist/constants/environments.d.ts +0 -5
  12. package/dist/constants/environments.js +0 -9
  13. package/dist/constants/environments.js.map +0 -1
  14. package/dist/core/ApiError.d.ts +0 -54
  15. package/dist/core/ApiError.js +0 -133
  16. package/dist/core/ApiError.js.map +0 -1
  17. package/dist/core/ApiResponse.d.ts +0 -83
  18. package/dist/core/ApiResponse.js +0 -140
  19. package/dist/core/ApiResponse.js.map +0 -1
  20. package/dist/core/Logger.d.ts +0 -2
  21. package/dist/core/Logger.js +0 -74
  22. package/dist/core/Logger.js.map +0 -1
  23. package/dist/middlewares/schemaValidator.d.ts +0 -4
  24. package/dist/middlewares/schemaValidator.js +0 -21
  25. package/dist/middlewares/schemaValidator.js.map +0 -1
  26. package/dist/middlewares/verifyToken.d.ts +0 -2
  27. package/dist/middlewares/verifyToken.js +0 -33
  28. package/dist/middlewares/verifyToken.js.map +0 -1
  29. package/dist/services/jwt.service.d.ts +0 -10
  30. package/dist/services/jwt.service.js +0 -26
  31. package/dist/services/jwt.service.js.map +0 -1
  32. package/dist/services/password.service.d.ts +0 -4
  33. package/dist/services/password.service.js +0 -32
  34. package/dist/services/password.service.js.map +0 -1
  35. package/dist/types/validation.d.ts +0 -6
  36. package/dist/types/validation.js +0 -11
  37. package/dist/types/validation.js.map +0 -1
  38. package/dist/utils/asyncHandler.d.ts +0 -4
  39. package/dist/utils/asyncHandler.js +0 -13
  40. package/dist/utils/asyncHandler.js.map +0 -1
package/dist/index.mjs ADDED
@@ -0,0 +1,460 @@
1
+ // src/constants/environments.ts
2
+ var ENVIRONMENTS = {
3
+ production: "production",
4
+ development: "development",
5
+ testing: "testing"
6
+ };
7
+
8
+ // src/core/ApiResponse.ts
9
+ var StatusCode = /* @__PURE__ */ ((StatusCode2) => {
10
+ StatusCode2["SUCCESS"] = "10000";
11
+ StatusCode2["FAILURE"] = "10001";
12
+ StatusCode2["RETRY"] = "10002";
13
+ StatusCode2["IN_VALID_ACCESS_TOKEN"] = "10003";
14
+ return StatusCode2;
15
+ })(StatusCode || {});
16
+ var ResponseStatusCode = /* @__PURE__ */ ((ResponseStatusCode2) => {
17
+ ResponseStatusCode2[ResponseStatusCode2["SUCCESS"] = 200] = "SUCCESS";
18
+ ResponseStatusCode2[ResponseStatusCode2["CREATED"] = 201] = "CREATED";
19
+ ResponseStatusCode2[ResponseStatusCode2["ACCEPTED"] = 202] = "ACCEPTED";
20
+ ResponseStatusCode2[ResponseStatusCode2["NO_CONTENT"] = 204] = "NO_CONTENT";
21
+ ResponseStatusCode2[ResponseStatusCode2["MOVED_PERMANENTLY"] = 301] = "MOVED_PERMANENTLY";
22
+ ResponseStatusCode2[ResponseStatusCode2["FOUND"] = 302] = "FOUND";
23
+ ResponseStatusCode2[ResponseStatusCode2["NOT_MODIFIED"] = 304] = "NOT_MODIFIED";
24
+ ResponseStatusCode2[ResponseStatusCode2["TEMPORARY_REDIRECT"] = 307] = "TEMPORARY_REDIRECT";
25
+ ResponseStatusCode2[ResponseStatusCode2["PERMANENT_REDIRECT"] = 308] = "PERMANENT_REDIRECT";
26
+ ResponseStatusCode2[ResponseStatusCode2["BAD_REQUEST"] = 400] = "BAD_REQUEST";
27
+ ResponseStatusCode2[ResponseStatusCode2["UNAUTHORIZED"] = 401] = "UNAUTHORIZED";
28
+ ResponseStatusCode2[ResponseStatusCode2["PAYMENT_REQUIRED"] = 402] = "PAYMENT_REQUIRED";
29
+ ResponseStatusCode2[ResponseStatusCode2["FORBIDDEN"] = 403] = "FORBIDDEN";
30
+ ResponseStatusCode2[ResponseStatusCode2["NOT_FOUND"] = 404] = "NOT_FOUND";
31
+ ResponseStatusCode2[ResponseStatusCode2["METHOD_NOT_ALLOWED"] = 405] = "METHOD_NOT_ALLOWED";
32
+ ResponseStatusCode2[ResponseStatusCode2["NOT_ACCEPTABLE"] = 406] = "NOT_ACCEPTABLE";
33
+ ResponseStatusCode2[ResponseStatusCode2["CONFLICT"] = 409] = "CONFLICT";
34
+ ResponseStatusCode2[ResponseStatusCode2["GONE"] = 410] = "GONE";
35
+ ResponseStatusCode2[ResponseStatusCode2["PAYLOAD_TOO_LARGE"] = 413] = "PAYLOAD_TOO_LARGE";
36
+ ResponseStatusCode2[ResponseStatusCode2["UNSUPPORTED_MEDIA_TYPE"] = 415] = "UNSUPPORTED_MEDIA_TYPE";
37
+ ResponseStatusCode2[ResponseStatusCode2["UNPROCESSABLE_ENTITY"] = 422] = "UNPROCESSABLE_ENTITY";
38
+ ResponseStatusCode2[ResponseStatusCode2["TOO_MANY_REQUESTS"] = 429] = "TOO_MANY_REQUESTS";
39
+ ResponseStatusCode2[ResponseStatusCode2["INTERNAL_ERROR"] = 500] = "INTERNAL_ERROR";
40
+ ResponseStatusCode2[ResponseStatusCode2["NOT_IMPLEMENTED"] = 501] = "NOT_IMPLEMENTED";
41
+ ResponseStatusCode2[ResponseStatusCode2["BAD_GATEWAY"] = 502] = "BAD_GATEWAY";
42
+ ResponseStatusCode2[ResponseStatusCode2["SERVICE_UNAVAILABLE"] = 503] = "SERVICE_UNAVAILABLE";
43
+ ResponseStatusCode2[ResponseStatusCode2["GATEWAY_TIMEOUT"] = 504] = "GATEWAY_TIMEOUT";
44
+ return ResponseStatusCode2;
45
+ })(ResponseStatusCode || {});
46
+ var ApiResponse = class {
47
+ message;
48
+ statusCode;
49
+ status;
50
+ constructor(status, message, statusCode) {
51
+ this.message = message;
52
+ this.status = status;
53
+ if (statusCode) {
54
+ this.statusCode = statusCode;
55
+ }
56
+ }
57
+ prepare(res, response, headers = {}) {
58
+ for (const [key, value] of Object.entries(headers)) {
59
+ res.append(key, value);
60
+ }
61
+ res.status(this.status).send(this.sanitize(response));
62
+ }
63
+ send(res, headers = {}) {
64
+ this.prepare(res, this, headers);
65
+ }
66
+ sanitize(response) {
67
+ const clone = {};
68
+ Object.assign(clone, response);
69
+ delete clone["statusCode"];
70
+ for (const key in clone) {
71
+ const typedKey = key;
72
+ if (clone[typedKey] === void 0) {
73
+ delete clone[typedKey];
74
+ }
75
+ }
76
+ return clone;
77
+ }
78
+ };
79
+ var SuccessResponse = class extends ApiResponse {
80
+ constructor(responseStatusCode, message, data) {
81
+ super(responseStatusCode, message, "10000" /* SUCCESS */);
82
+ this.data = data;
83
+ this.data = data;
84
+ }
85
+ send(res) {
86
+ this.prepare(res, this, {});
87
+ }
88
+ };
89
+ var AccessTokenErrorResponse = class extends ApiResponse {
90
+ instruction = "refresh_token";
91
+ errors;
92
+ constructor(message, errors) {
93
+ super(
94
+ 401 /* UNAUTHORIZED */,
95
+ message,
96
+ "10003" /* IN_VALID_ACCESS_TOKEN */
97
+ );
98
+ this.errors = errors || [];
99
+ }
100
+ send(res, headers = {}) {
101
+ headers.instruction = this.instruction;
102
+ this.prepare(res, this, headers);
103
+ }
104
+ };
105
+ var BadTokenResponse = class extends ApiResponse {
106
+ errors;
107
+ constructor(message, errors) {
108
+ super(401 /* UNAUTHORIZED */, message, "10001" /* FAILURE */);
109
+ this.errors = errors || [];
110
+ }
111
+ };
112
+ var BadRequestResponse = class extends ApiResponse {
113
+ errors;
114
+ constructor(message, errors) {
115
+ super(400 /* BAD_REQUEST */, message, "10001" /* FAILURE */);
116
+ this.errors = errors || [];
117
+ }
118
+ };
119
+ var InternalErrorResponse = class extends ApiResponse {
120
+ errors;
121
+ constructor(message, errors) {
122
+ super(500 /* INTERNAL_ERROR */, message, "10001" /* FAILURE */);
123
+ this.errors = errors || [];
124
+ }
125
+ };
126
+ var NoFoundResponse = class extends ApiResponse {
127
+ errors;
128
+ constructor(message, errors) {
129
+ super(404 /* NOT_FOUND */, message, "10001" /* FAILURE */);
130
+ this.errors = errors || [];
131
+ }
132
+ };
133
+ var ForbiddenResponse = class extends ApiResponse {
134
+ errors;
135
+ constructor(message, errors) {
136
+ super(403 /* FORBIDDEN */, message, "10001" /* FAILURE */);
137
+ this.errors = errors || [];
138
+ }
139
+ };
140
+
141
+ // src/config/config.ts
142
+ import "dotenv/config";
143
+ var getConfig = () => {
144
+ return {
145
+ ENVIRONMENT: process.env.ENVIRONMENT,
146
+ LOG_DIR: process.env.LOG_DIR,
147
+ LOG_LEVEL: process.env.LOG_LEVEL,
148
+ SALT_ROUNDS: parseInt(process.env.SALT_ROUNDS),
149
+ JWT_KEY: process.env.JWT_KEY
150
+ };
151
+ };
152
+ var getSanitizedConfig = (config2) => {
153
+ for (const [key, value] of Object.entries(config2)) {
154
+ if (!value) {
155
+ throw new Error(`Missing key ${key} in config.env`);
156
+ }
157
+ }
158
+ return config2;
159
+ };
160
+ var config = getConfig();
161
+ var sanitizedConfig = getSanitizedConfig(config);
162
+
163
+ // src/core/ApiError.ts
164
+ var ErrorType = /* @__PURE__ */ ((ErrorType2) => {
165
+ ErrorType2["BAD_TOKEN"] = "BadTokenError";
166
+ ErrorType2["TOKEN_EXPIRED"] = "TokenExpiredError";
167
+ ErrorType2["UNAUTHORIZED"] = "AuthFailureError";
168
+ ErrorType2["ACCESS_TOKEN"] = "AccessTokenError";
169
+ ErrorType2["INTERNAL"] = "InternalError";
170
+ ErrorType2["NOT_FOUND"] = "NotFoundError";
171
+ ErrorType2["NO_ENTRY"] = "NoEntryError";
172
+ ErrorType2["NO_DATA"] = "NoDataError";
173
+ ErrorType2["BAD_REQUEST"] = "BadRequestError";
174
+ ErrorType2["FORBIDDEN"] = "ForbiddenError";
175
+ return ErrorType2;
176
+ })(ErrorType || {});
177
+ var ApiError = class extends Error {
178
+ constructor(type, message = "Error", errors) {
179
+ super(type);
180
+ this.type = type;
181
+ this.message = message;
182
+ this.errors = errors;
183
+ this.type = type;
184
+ this.message = message;
185
+ this.errors = errors;
186
+ }
187
+ static handle(err, res) {
188
+ switch (err.type) {
189
+ case "BadTokenError" /* BAD_TOKEN */:
190
+ case "TokenExpiredError" /* TOKEN_EXPIRED */:
191
+ case "AuthFailureError" /* UNAUTHORIZED */:
192
+ new BadTokenResponse(err.message, err.errors).send(res);
193
+ break;
194
+ case "AccessTokenError" /* ACCESS_TOKEN */:
195
+ new AccessTokenErrorResponse(err.message, err.errors).send(res);
196
+ break;
197
+ case "InternalError" /* INTERNAL */:
198
+ new InternalErrorResponse(err.message, err.errors).send(res);
199
+ break;
200
+ case "NotFoundError" /* NOT_FOUND */:
201
+ case "NoEntryError" /* NO_ENTRY */:
202
+ case "NoDataError" /* NO_DATA */:
203
+ new NoFoundResponse(err.message, err.errors).send(res);
204
+ break;
205
+ case "BadRequestError" /* BAD_REQUEST */:
206
+ new BadRequestResponse(err.message, err.errors).send(res);
207
+ break;
208
+ case "ForbiddenError" /* FORBIDDEN */:
209
+ new ForbiddenResponse(err.message, err.errors).send(res);
210
+ break;
211
+ default:
212
+ let messsage = err.message;
213
+ messsage = sanitizedConfig.ENVIRONMENT !== ENVIRONMENTS.production ? messsage : "Something went wrong!";
214
+ new InternalErrorResponse(messsage, err.errors).send(res);
215
+ break;
216
+ }
217
+ }
218
+ };
219
+ var BadTokenError = class extends ApiError {
220
+ constructor(message = "Invalid token", errors = []) {
221
+ super("BadTokenError" /* BAD_TOKEN */, message, errors);
222
+ }
223
+ };
224
+ var TokenExpiredError = class extends ApiError {
225
+ constructor(message = "Token expired", errors = []) {
226
+ super("TokenExpiredError" /* TOKEN_EXPIRED */, message, errors);
227
+ }
228
+ };
229
+ var AuthFailureError = class extends ApiError {
230
+ constructor(message = "Invalid Credentials", errors = []) {
231
+ super("AuthFailureError" /* UNAUTHORIZED */, message, errors);
232
+ }
233
+ };
234
+ var AccessTokenError = class extends ApiError {
235
+ constructor(message = "Invalid access token", errors = []) {
236
+ super("AccessTokenError" /* ACCESS_TOKEN */, message, errors);
237
+ }
238
+ };
239
+ var InternalError = class extends ApiError {
240
+ constructor(message = "Internal error", errors = []) {
241
+ message = sanitizedConfig.ENVIRONMENT !== ENVIRONMENTS.production ? message : "Something went wrong!";
242
+ super("InternalError" /* INTERNAL */, message, errors);
243
+ }
244
+ };
245
+ var NotFoundError = class extends ApiError {
246
+ constructor(message = "Not found", errors = []) {
247
+ super("NotFoundError" /* NOT_FOUND */, message, errors);
248
+ }
249
+ };
250
+ var NoEntryError = class extends ApiError {
251
+ constructor(message = "Entry don't exists", errors = []) {
252
+ super("NoEntryError" /* NO_ENTRY */, message, errors);
253
+ }
254
+ };
255
+ var NoDataError = class extends ApiError {
256
+ constructor(message = "No data", errors = []) {
257
+ super("NoDataError" /* NO_DATA */, message, errors);
258
+ }
259
+ };
260
+ var BadRequestError = class extends ApiError {
261
+ constructor(message = "Bad request", errors = []) {
262
+ super("BadRequestError" /* BAD_REQUEST */, message, errors);
263
+ }
264
+ };
265
+ var ForbiddenError = class extends ApiError {
266
+ constructor(message = "Permission denied", errors = []) {
267
+ super("ForbiddenError" /* FORBIDDEN */, message, errors);
268
+ }
269
+ };
270
+
271
+ // src/core/Logger.ts
272
+ import winston, { format } from "winston";
273
+ import fs from "fs";
274
+ import path from "path";
275
+ import DailyRotateFile from "winston-daily-rotate-file";
276
+ var dir = sanitizedConfig.LOG_DIR;
277
+ if (!dir) {
278
+ dir = path.resolve("logs");
279
+ }
280
+ if (!fs.existsSync(dir)) {
281
+ fs.mkdirSync(dir);
282
+ }
283
+ var logfileRotateTransport = new DailyRotateFile({
284
+ level: sanitizedConfig.LOG_LEVEL,
285
+ // @ts-ignore
286
+ filename: dir + "/%DATE%.log",
287
+ datePattern: "YYYY-MM-DD",
288
+ zippedArchive: true,
289
+ handleExceptions: true,
290
+ maxSize: "20m",
291
+ maxFiles: "14d",
292
+ format: format.combine(
293
+ format.errors({ stack: true }),
294
+ format.timestamp(),
295
+ format.json()
296
+ )
297
+ });
298
+ var consoleTransport = new winston.transports.Console({
299
+ level: process.env.LOG_LEVEL,
300
+ format: format.combine(
301
+ format.colorize({ all: true }),
302
+ format.timestamp({
303
+ format: "YYYY-MM-DD hh:mm:ss.SSS A"
304
+ }),
305
+ format.align(),
306
+ format.printf(
307
+ (info) => `[${info.timestamp}] ${info.level}: ${info.message}`
308
+ )
309
+ )
310
+ });
311
+ var logger = winston.createLogger({
312
+ transports: [consoleTransport, logfileRotateTransport],
313
+ exceptionHandlers: [logfileRotateTransport],
314
+ exitOnError: false
315
+ });
316
+
317
+ // src/middlewares/schemaValidator.ts
318
+ var schemaValidator = (type, schema) => {
319
+ return (req, res, next) => {
320
+ const result = schema.safeParse(req[type]);
321
+ if (!result.success) {
322
+ const errors = Object.entries(result.error.flatten().fieldErrors).map(
323
+ ([key, value]) => ({
324
+ field: key,
325
+ message: value
326
+ })
327
+ );
328
+ next(new BadRequestError("Bad request", errors));
329
+ } else {
330
+ next();
331
+ }
332
+ };
333
+ };
334
+
335
+ // src/middlewares/verifyToken.ts
336
+ import jsonwebtoken2 from "jsonwebtoken";
337
+
338
+ // src/services/jwt.service.ts
339
+ import jsonwebtoken from "jsonwebtoken";
340
+ var JwtService = class {
341
+ static sign(payload, signOptions = {}) {
342
+ const token = jsonwebtoken.sign(
343
+ payload,
344
+ sanitizedConfig.JWT_KEY,
345
+ signOptions
346
+ );
347
+ return token;
348
+ }
349
+ static verify(token, verifyOptions) {
350
+ const decoded = jsonwebtoken.verify(
351
+ token,
352
+ sanitizedConfig.JWT_KEY,
353
+ verifyOptions
354
+ );
355
+ return decoded;
356
+ }
357
+ static generatePayload(user) {
358
+ return {
359
+ _id: user._id.toString(),
360
+ email: user.email
361
+ };
362
+ }
363
+ };
364
+
365
+ // src/middlewares/verifyToken.ts
366
+ var verifyToken = async (req, res, next) => {
367
+ try {
368
+ const { token } = req?.session;
369
+ if (!token) {
370
+ next(new BadTokenError("Authentication token is missing"));
371
+ }
372
+ const decoded = JwtService.verify(token);
373
+ req.user = decoded;
374
+ next();
375
+ } catch (error) {
376
+ if (error instanceof jsonwebtoken2.TokenExpiredError) {
377
+ next(new TokenExpiredError());
378
+ } else if (error instanceof jsonwebtoken2.JsonWebTokenError) {
379
+ next(new BadTokenError());
380
+ } else {
381
+ next(new BadTokenError());
382
+ }
383
+ }
384
+ };
385
+
386
+ // src/services/password.service.ts
387
+ import bcrypt from "bcrypt";
388
+ var Password = class {
389
+ static hashPassword(password) {
390
+ return new Promise((resolve, reject) => {
391
+ bcrypt.hash(password, sanitizedConfig.SALT_ROUNDS, function(err, hash) {
392
+ if (err) {
393
+ reject(err.message);
394
+ }
395
+ resolve(hash);
396
+ });
397
+ });
398
+ }
399
+ static comparePassword(password, hashedPassword) {
400
+ return new Promise((resolve, reject) => {
401
+ bcrypt.compare(password, hashedPassword, function(err, result) {
402
+ if (err) {
403
+ reject(err.message);
404
+ }
405
+ resolve(result);
406
+ });
407
+ });
408
+ }
409
+ };
410
+
411
+ // src/types/validation.ts
412
+ var ValidationSource = /* @__PURE__ */ ((ValidationSource2) => {
413
+ ValidationSource2["BODY"] = "body";
414
+ ValidationSource2["HEADER"] = "headers";
415
+ ValidationSource2["QUERY"] = "query";
416
+ ValidationSource2["PARAM"] = "params";
417
+ return ValidationSource2;
418
+ })(ValidationSource || {});
419
+
420
+ // src/utils/asyncHandler.ts
421
+ var asyncHandler = (execution) => async (req, res, next) => {
422
+ try {
423
+ await execution(req, res, next);
424
+ } catch (err) {
425
+ next(err);
426
+ }
427
+ };
428
+ export {
429
+ AccessTokenError,
430
+ AccessTokenErrorResponse,
431
+ ApiError,
432
+ ApiResponse,
433
+ AuthFailureError,
434
+ BadRequestError,
435
+ BadRequestResponse,
436
+ BadTokenError,
437
+ BadTokenResponse,
438
+ ENVIRONMENTS,
439
+ ErrorType,
440
+ ForbiddenError,
441
+ ForbiddenResponse,
442
+ InternalError,
443
+ InternalErrorResponse,
444
+ JwtService,
445
+ NoDataError,
446
+ NoEntryError,
447
+ NoFoundResponse,
448
+ NotFoundError,
449
+ Password,
450
+ ResponseStatusCode,
451
+ StatusCode,
452
+ SuccessResponse,
453
+ TokenExpiredError,
454
+ ValidationSource,
455
+ asyncHandler,
456
+ logger,
457
+ schemaValidator,
458
+ verifyToken
459
+ };
460
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants/environments.ts","../src/core/ApiResponse.ts","../src/config/config.ts","../src/core/ApiError.ts","../src/core/Logger.ts","../src/middlewares/schemaValidator.ts","../src/middlewares/verifyToken.ts","../src/services/jwt.service.ts","../src/services/password.service.ts","../src/types/validation.ts","../src/utils/asyncHandler.ts"],"sourcesContent":["export const ENVIRONMENTS = {\n production: \"production\",\n development: \"development\",\n testing: \"testing\",\n};\n","import { Response } from \"express\";\nimport { ErrorDetailType } from \"@/core/ApiError\";\n\nexport enum StatusCode {\n SUCCESS = \"10000\",\n FAILURE = \"10001\",\n RETRY = \"10002\",\n IN_VALID_ACCESS_TOKEN = \"10003\",\n}\n\nexport enum ResponseStatusCode {\n SUCCESS = 200,\n CREATED = 201,\n ACCEPTED = 202,\n NO_CONTENT = 204,\n\n MOVED_PERMANENTLY = 301,\n FOUND = 302,\n NOT_MODIFIED = 304,\n TEMPORARY_REDIRECT = 307,\n PERMANENT_REDIRECT = 308,\n\n BAD_REQUEST = 400,\n UNAUTHORIZED = 401,\n PAYMENT_REQUIRED = 402,\n FORBIDDEN = 403,\n NOT_FOUND = 404,\n METHOD_NOT_ALLOWED = 405,\n NOT_ACCEPTABLE = 406,\n CONFLICT = 409,\n GONE = 410,\n PAYLOAD_TOO_LARGE = 413,\n UNSUPPORTED_MEDIA_TYPE = 415,\n UNPROCESSABLE_ENTITY = 422,\n TOO_MANY_REQUESTS = 429,\n\n INTERNAL_ERROR = 500,\n NOT_IMPLEMENTED = 501,\n BAD_GATEWAY = 502,\n SERVICE_UNAVAILABLE = 503,\n GATEWAY_TIMEOUT = 504,\n}\n\nexport abstract class ApiResponse {\n public message: string;\n public statusCode: string | undefined;\n public status: number;\n\n constructor(status: number, message: string, statusCode?: string) {\n this.message = message;\n this.status = status;\n if (statusCode) {\n this.statusCode = statusCode;\n }\n }\n\n public prepare<T extends ApiResponse>(\n res: Response,\n response: T,\n headers: { [key: string]: string } = {}\n ) {\n for (const [key, value] of Object.entries(headers)) {\n res.append(key, value);\n }\n res.status(this.status).send(this.sanitize(response));\n }\n\n public send(res: Response, headers: { [key: string]: string } = {}) {\n this.prepare<ApiResponse>(res, this, headers);\n }\n\n private sanitize<T extends ApiResponse>(response: T) {\n const clone = {} as T;\n Object.assign(clone, response);\n\n delete clone[\"statusCode\"];\n\n for (const key in clone) {\n const typedKey = key as keyof T;\n if (clone[typedKey] === undefined) {\n delete clone[typedKey];\n }\n }\n return clone;\n }\n}\n\nexport class SuccessResponse<T> extends ApiResponse {\n constructor(\n responseStatusCode:\n | ResponseStatusCode.SUCCESS\n | ResponseStatusCode.CREATED\n | ResponseStatusCode.ACCEPTED\n | ResponseStatusCode.NO_CONTENT,\n message: string,\n public data: T\n ) {\n super(responseStatusCode, message, StatusCode.SUCCESS);\n this.data = data;\n }\n\n send(res: Response) {\n this.prepare<SuccessResponse<T>>(res, this, {});\n }\n}\n\nexport class AccessTokenErrorResponse extends ApiResponse {\n protected instruction: string = \"refresh_token\";\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(\n ResponseStatusCode.UNAUTHORIZED,\n message,\n StatusCode.IN_VALID_ACCESS_TOKEN\n );\n this.errors = errors || [];\n }\n\n send(res: Response, headers: { [key: string]: string } = {}) {\n headers.instruction = this.instruction;\n this.prepare<AccessTokenErrorResponse>(res, this, headers);\n }\n}\n\nexport class BadTokenResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.UNAUTHORIZED, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class BadRequestResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.BAD_REQUEST, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class InternalErrorResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.INTERNAL_ERROR, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class NoFoundResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.NOT_FOUND, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class ForbiddenResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.FORBIDDEN, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n","import \"dotenv/config\";\n\ninterface Env {\n ENVIRONMENT: string;\n LOG_DIR: string;\n LOG_LEVEL: string;\n SALT_ROUNDS: number;\n JWT_KEY: string;\n}\n\nconst getConfig = (): Env => {\n return {\n ENVIRONMENT: process.env.ENVIRONMENT,\n LOG_DIR: process.env.LOG_DIR,\n LOG_LEVEL: process.env.LOG_LEVEL,\n SALT_ROUNDS: parseInt(process.env.SALT_ROUNDS),\n JWT_KEY: process.env.JWT_KEY,\n };\n};\n\nconst getSanitizedConfig = (config: Env): Env => {\n for (const [key, value] of Object.entries(config)) {\n if (!value) {\n throw new Error(`Missing key ${key} in config.env`);\n }\n }\n\n return config;\n};\n\nconst config = getConfig();\nexport const sanitizedConfig = getSanitizedConfig(config);\n","import { Response } from \"express\";\n\nimport {\n AccessTokenErrorResponse,\n BadRequestResponse,\n BadTokenResponse,\n ForbiddenResponse,\n InternalErrorResponse,\n NoFoundResponse,\n} from \"@/core/ApiResponse\";\nimport { sanitizedConfig } from \"@/config/config\";\nimport { ENVIRONMENTS } from \"@/constants/environments\";\n\nexport enum ErrorType {\n BAD_TOKEN = \"BadTokenError\",\n TOKEN_EXPIRED = \"TokenExpiredError\",\n UNAUTHORIZED = \"AuthFailureError\",\n ACCESS_TOKEN = \"AccessTokenError\",\n INTERNAL = \"InternalError\",\n NOT_FOUND = \"NotFoundError\",\n NO_ENTRY = \"NoEntryError\",\n NO_DATA = \"NoDataError\",\n BAD_REQUEST = \"BadRequestError\",\n FORBIDDEN = \"ForbiddenError\",\n}\n\nexport type ErrorDetailType = {\n field: string | number;\n message?: (string | number)[];\n};\n\nexport abstract class ApiError extends Error {\n constructor(\n public type: ErrorType,\n public message: string = \"Error\",\n public errors: ErrorDetailType[]\n ) {\n super(type);\n this.type = type;\n this.message = message;\n this.errors = errors;\n }\n\n public static handle(err: ApiError, res: Response) {\n switch (err.type) {\n case ErrorType.BAD_TOKEN:\n case ErrorType.TOKEN_EXPIRED:\n case ErrorType.UNAUTHORIZED:\n new BadTokenResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.ACCESS_TOKEN:\n new AccessTokenErrorResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.INTERNAL:\n new InternalErrorResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.NOT_FOUND:\n case ErrorType.NO_ENTRY:\n case ErrorType.NO_DATA:\n new NoFoundResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.BAD_REQUEST:\n new BadRequestResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.FORBIDDEN:\n new ForbiddenResponse(err.message, err.errors).send(res);\n break;\n default:\n let messsage = err.message;\n messsage =\n sanitizedConfig.ENVIRONMENT !== ENVIRONMENTS.production\n ? messsage\n : \"Something went wrong!\";\n new InternalErrorResponse(messsage, err.errors).send(res);\n break;\n }\n }\n}\n\nexport class BadTokenError extends ApiError {\n constructor(\n message: string = \"Invalid token\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.BAD_TOKEN, message, errors);\n }\n}\n\nexport class TokenExpiredError extends ApiError {\n constructor(\n message: string = \"Token expired\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.TOKEN_EXPIRED, message, errors);\n }\n}\n\nexport class AuthFailureError extends ApiError {\n constructor(\n message: string = \"Invalid Credentials\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.UNAUTHORIZED, message, errors);\n }\n}\n\nexport class AccessTokenError extends ApiError {\n constructor(\n message: string = \"Invalid access token\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.ACCESS_TOKEN, message, errors);\n }\n}\nexport class InternalError extends ApiError {\n constructor(\n message: string = \"Internal error\",\n errors: ErrorDetailType[] = []\n ) {\n message =\n sanitizedConfig.ENVIRONMENT !== ENVIRONMENTS.production\n ? message\n : \"Something went wrong!\";\n super(ErrorType.INTERNAL, message, errors);\n }\n}\n\nexport class NotFoundError extends ApiError {\n constructor(message: string = \"Not found\", errors: ErrorDetailType[] = []) {\n super(ErrorType.NOT_FOUND, message, errors);\n }\n}\n\nexport class NoEntryError extends ApiError {\n constructor(\n message: string = \"Entry don't exists\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.NO_ENTRY, message, errors);\n }\n}\n\nexport class NoDataError extends ApiError {\n constructor(message: string = \"No data\", errors: ErrorDetailType[] = []) {\n super(ErrorType.NO_DATA, message, errors);\n }\n}\n\nexport class BadRequestError extends ApiError {\n constructor(message: string = \"Bad request\", errors: ErrorDetailType[] = []) {\n super(ErrorType.BAD_REQUEST, message, errors);\n }\n}\n\nexport class ForbiddenError extends ApiError {\n constructor(\n message: string = \"Permission denied\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.FORBIDDEN, message, errors);\n }\n}\n","import winston, { format } from \"winston\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport DailyRotateFile from \"winston-daily-rotate-file\";\nimport { sanitizedConfig } from \"@/config/config\";\n\nlet dir = sanitizedConfig.LOG_DIR;\nif (!dir) {\n dir = path.resolve(\"logs\");\n}\n\nif (!fs.existsSync(dir)) {\n fs.mkdirSync(dir);\n}\n\nconst logfileRotateTransport = new DailyRotateFile({\n level: sanitizedConfig.LOG_LEVEL,\n // @ts-ignore\n filename: dir + \"/%DATE%.log\",\n datePattern: \"YYYY-MM-DD\",\n zippedArchive: true,\n handleExceptions: true,\n maxSize: \"20m\",\n maxFiles: \"14d\",\n format: format.combine(\n format.errors({ stack: true }),\n format.timestamp(),\n format.json()\n ),\n});\n\nconst consoleTransport = new winston.transports.Console({\n level: process.env.LOG_LEVEL,\n format: format.combine(\n format.colorize({ all: true }),\n format.timestamp({\n format: \"YYYY-MM-DD hh:mm:ss.SSS A\",\n }),\n format.align(),\n format.printf(\n (info) => `[${info.timestamp}] ${info.level}: ${info.message}`\n )\n ),\n});\n\nexport const logger = winston.createLogger({\n transports: [consoleTransport, logfileRotateTransport],\n exceptionHandlers: [logfileRotateTransport],\n exitOnError: false,\n});\n","import { Request, Response, NextFunction } from \"express\";\nimport { ZodSchema } from \"zod\";\n\nimport { BadRequestError } from \"@/core/ApiError\";\nimport { ValidationSource } from \"@/types/validation\";\n\nexport const schemaValidator = (type: ValidationSource, schema: ZodSchema) => {\n return (req: Request, res: Response, next: NextFunction) => {\n const result = schema.safeParse(req[type]);\n\n if (!result.success) {\n const errors = Object.entries(result.error.flatten().fieldErrors).map(\n ([key, value]) => ({\n field: key,\n message: value,\n })\n );\n next(new BadRequestError(\"Bad request\", errors));\n } else {\n next();\n }\n };\n};\n\n","import jsonwebtoken from \"jsonwebtoken\";\nimport { Request, Response, NextFunction } from \"express\";\n\nimport { BadTokenError, TokenExpiredError } from \"@/core/ApiError\";\nimport { JwtPayload, JwtService } from \"@/services/jwt.service\";\n\nexport const verifyToken = async (\n req: Request,\n res: Response,\n next: NextFunction\n) => {\n try {\n const { token } = req?.session;\n if (!token) {\n next(new BadTokenError(\"Authentication token is missing\"));\n }\n\n const decoded = JwtService.verify(token) as JwtPayload;\n\n req.user = decoded;\n next();\n } catch (error) {\n if (error instanceof jsonwebtoken.TokenExpiredError) {\n next(new TokenExpiredError());\n } else if (error instanceof jsonwebtoken.JsonWebTokenError) {\n next(new BadTokenError());\n } else {\n next(new BadTokenError());\n }\n }\n};\n","import { sanitizedConfig } from \"@/config/config\";\nimport jsonwebtoken, { SignOptions, VerifyOptions } from \"jsonwebtoken\";\n\nexport interface JwtPayload {\n _id: string;\n email: string;\n}\n\nexport class JwtService {\n static sign(\n payload: string | Buffer | object,\n signOptions: SignOptions = {}\n ): string {\n const token = jsonwebtoken.sign(\n payload,\n sanitizedConfig.JWT_KEY,\n signOptions\n );\n return token;\n }\n\n static verify(token: string, verifyOptions?: VerifyOptions) {\n const decoded = jsonwebtoken.verify(\n token,\n sanitizedConfig.JWT_KEY,\n verifyOptions\n );\n return decoded;\n }\n\n static generatePayload<T extends JwtPayload>(user: T): T {\n return {\n _id: user._id.toString(),\n email: user.email,\n } as T;\n }\n}\n","import { sanitizedConfig } from \"@/config/config\";\nimport bcrypt from \"bcrypt\";\n\nexport class Password {\n static hashPassword(password: string): Promise<string> {\n return new Promise((resolve, reject) => {\n bcrypt.hash(password, sanitizedConfig.SALT_ROUNDS, function (err, hash) {\n if (err) {\n reject(err.message);\n }\n resolve(hash);\n });\n });\n }\n\n static comparePassword(\n password: string,\n hashedPassword: string\n ): Promise<string | boolean> {\n return new Promise((resolve, reject) => {\n bcrypt.compare(password, hashedPassword, function (err, result) {\n if (err) {\n reject(err.message);\n }\n resolve(result);\n });\n });\n }\n}\n\n","export enum ValidationSource {\n BODY = 'body',\n HEADER = 'headers',\n QUERY = 'query',\n PARAM = 'params',\n }","import { Request, Response, NextFunction } from \"express\";\n\ntype AsyncFunction = (\n req: Request,\n res: Response,\n next: NextFunction\n) => Promise<any>;\n\nexport const asyncHandler =\n (execution: AsyncFunction) =>\n async (req: Request, res: Response, next: NextFunction) => {\n try {\n await execution(req, res, next);\n } catch (err) {\n next(err);\n }\n };\n"],"mappings":";AAAO,IAAM,eAAe;AAAA,EAC1B,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,SAAS;AACX;;;ACDO,IAAK,aAAL,kBAAKA,gBAAL;AACL,EAAAA,YAAA,aAAU;AACV,EAAAA,YAAA,aAAU;AACV,EAAAA,YAAA,WAAQ;AACR,EAAAA,YAAA,2BAAwB;AAJd,SAAAA;AAAA,GAAA;AAOL,IAAK,qBAAL,kBAAKC,wBAAL;AACL,EAAAA,wCAAA,aAAU,OAAV;AACA,EAAAA,wCAAA,aAAU,OAAV;AACA,EAAAA,wCAAA,cAAW,OAAX;AACA,EAAAA,wCAAA,gBAAa,OAAb;AAEA,EAAAA,wCAAA,uBAAoB,OAApB;AACA,EAAAA,wCAAA,WAAQ,OAAR;AACA,EAAAA,wCAAA,kBAAe,OAAf;AACA,EAAAA,wCAAA,wBAAqB,OAArB;AACA,EAAAA,wCAAA,wBAAqB,OAArB;AAEA,EAAAA,wCAAA,iBAAc,OAAd;AACA,EAAAA,wCAAA,kBAAe,OAAf;AACA,EAAAA,wCAAA,sBAAmB,OAAnB;AACA,EAAAA,wCAAA,eAAY,OAAZ;AACA,EAAAA,wCAAA,eAAY,OAAZ;AACA,EAAAA,wCAAA,wBAAqB,OAArB;AACA,EAAAA,wCAAA,oBAAiB,OAAjB;AACA,EAAAA,wCAAA,cAAW,OAAX;AACA,EAAAA,wCAAA,UAAO,OAAP;AACA,EAAAA,wCAAA,uBAAoB,OAApB;AACA,EAAAA,wCAAA,4BAAyB,OAAzB;AACA,EAAAA,wCAAA,0BAAuB,OAAvB;AACA,EAAAA,wCAAA,uBAAoB,OAApB;AAEA,EAAAA,wCAAA,oBAAiB,OAAjB;AACA,EAAAA,wCAAA,qBAAkB,OAAlB;AACA,EAAAA,wCAAA,iBAAc,OAAd;AACA,EAAAA,wCAAA,yBAAsB,OAAtB;AACA,EAAAA,wCAAA,qBAAkB,OAAlB;AA9BU,SAAAA;AAAA,GAAA;AAiCL,IAAe,cAAf,MAA2B;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EAEP,YAAY,QAAgB,SAAiB,YAAqB;AAChE,SAAK,UAAU;AACf,SAAK,SAAS;AACd,QAAI,YAAY;AACd,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AAAA,EAEO,QACL,KACA,UACA,UAAqC,CAAC,GACtC;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,UAAI,OAAO,KAAK,KAAK;AAAA,IACvB;AACA,QAAI,OAAO,KAAK,MAAM,EAAE,KAAK,KAAK,SAAS,QAAQ,CAAC;AAAA,EACtD;AAAA,EAEO,KAAK,KAAe,UAAqC,CAAC,GAAG;AAClE,SAAK,QAAqB,KAAK,MAAM,OAAO;AAAA,EAC9C;AAAA,EAEQ,SAAgC,UAAa;AACnD,UAAM,QAAQ,CAAC;AACf,WAAO,OAAO,OAAO,QAAQ;AAE7B,WAAO,MAAM,YAAY;AAEzB,eAAW,OAAO,OAAO;AACvB,YAAM,WAAW;AACjB,UAAI,MAAM,QAAQ,MAAM,QAAW;AACjC,eAAO,MAAM,QAAQ;AAAA,MACvB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEO,IAAM,kBAAN,cAAiC,YAAY;AAAA,EAClD,YACE,oBAKA,SACO,MACP;AACA,UAAM,oBAAoB,SAAS,qBAAkB;AAF9C;AAGP,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,KAAK,KAAe;AAClB,SAAK,QAA4B,KAAK,MAAM,CAAC,CAAC;AAAA,EAChD;AACF;AAEO,IAAM,2BAAN,cAAuC,YAAY;AAAA,EAC9C,cAAsB;AAAA,EACzB;AAAA,EAEP,YAAY,SAAiB,QAA2B;AACtD;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,SAAS,UAAU,CAAC;AAAA,EAC3B;AAAA,EAEA,KAAK,KAAe,UAAqC,CAAC,GAAG;AAC3D,YAAQ,cAAc,KAAK;AAC3B,SAAK,QAAkC,KAAK,MAAM,OAAO;AAAA,EAC3D;AACF;AAEO,IAAM,mBAAN,cAA+B,YAAY;AAAA,EACzC;AAAA,EAEP,YAAY,SAAiB,QAA2B;AACtD,UAAM,wBAAiC,SAAS,qBAAkB;AAClE,SAAK,SAAS,UAAU,CAAC;AAAA,EAC3B;AACF;AAEO,IAAM,qBAAN,cAAiC,YAAY;AAAA,EAC3C;AAAA,EAEP,YAAY,SAAiB,QAA2B;AACtD,UAAM,uBAAgC,SAAS,qBAAkB;AACjE,SAAK,SAAS,UAAU,CAAC;AAAA,EAC3B;AACF;AAEO,IAAM,wBAAN,cAAoC,YAAY;AAAA,EAC9C;AAAA,EAEP,YAAY,SAAiB,QAA2B;AACtD,UAAM,0BAAmC,SAAS,qBAAkB;AACpE,SAAK,SAAS,UAAU,CAAC;AAAA,EAC3B;AACF;AAEO,IAAM,kBAAN,cAA8B,YAAY;AAAA,EACxC;AAAA,EAEP,YAAY,SAAiB,QAA2B;AACtD,UAAM,qBAA8B,SAAS,qBAAkB;AAC/D,SAAK,SAAS,UAAU,CAAC;AAAA,EAC3B;AACF;AAEO,IAAM,oBAAN,cAAgC,YAAY;AAAA,EAC1C;AAAA,EAEP,YAAY,SAAiB,QAA2B;AACtD,UAAM,qBAA8B,SAAS,qBAAkB;AAC/D,SAAK,SAAS,UAAU,CAAC;AAAA,EAC3B;AACF;;;ACxKA,OAAO;AAUP,IAAM,YAAY,MAAW;AAC3B,SAAO;AAAA,IACL,aAAa,QAAQ,IAAI;AAAA,IACzB,SAAS,QAAQ,IAAI;AAAA,IACrB,WAAW,QAAQ,IAAI;AAAA,IACvB,aAAa,SAAS,QAAQ,IAAI,WAAW;AAAA,IAC7C,SAAS,QAAQ,IAAI;AAAA,EACvB;AACF;AAEA,IAAM,qBAAqB,CAACC,YAAqB;AAC/C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQA,OAAM,GAAG;AACjD,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,eAAe,GAAG,gBAAgB;AAAA,IACpD;AAAA,EACF;AAEA,SAAOA;AACT;AAEA,IAAM,SAAS,UAAU;AAClB,IAAM,kBAAkB,mBAAmB,MAAM;;;AClBjD,IAAK,YAAL,kBAAKC,eAAL;AACL,EAAAA,WAAA,eAAY;AACZ,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,kBAAe;AACf,EAAAA,WAAA,kBAAe;AACf,EAAAA,WAAA,cAAW;AACX,EAAAA,WAAA,eAAY;AACZ,EAAAA,WAAA,cAAW;AACX,EAAAA,WAAA,aAAU;AACV,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,eAAY;AAVF,SAAAA;AAAA,GAAA;AAkBL,IAAe,WAAf,cAAgC,MAAM;AAAA,EAC3C,YACS,MACA,UAAkB,SAClB,QACP;AACA,UAAM,IAAI;AAJH;AACA;AACA;AAGP,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,OAAc,OAAO,KAAe,KAAe;AACjD,YAAQ,IAAI,MAAM;AAAA,MAChB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,YAAI,iBAAiB,IAAI,SAAS,IAAI,MAAM,EAAE,KAAK,GAAG;AACtD;AAAA,MACF,KAAK;AACH,YAAI,yBAAyB,IAAI,SAAS,IAAI,MAAM,EAAE,KAAK,GAAG;AAC9D;AAAA,MACF,KAAK;AACH,YAAI,sBAAsB,IAAI,SAAS,IAAI,MAAM,EAAE,KAAK,GAAG;AAC3D;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,YAAI,gBAAgB,IAAI,SAAS,IAAI,MAAM,EAAE,KAAK,GAAG;AACrD;AAAA,MACF,KAAK;AACH,YAAI,mBAAmB,IAAI,SAAS,IAAI,MAAM,EAAE,KAAK,GAAG;AACxD;AAAA,MACF,KAAK;AACH,YAAI,kBAAkB,IAAI,SAAS,IAAI,MAAM,EAAE,KAAK,GAAG;AACvD;AAAA,MACF;AACE,YAAI,WAAW,IAAI;AACnB,mBACE,gBAAgB,gBAAgB,aAAa,aACzC,WACA;AACN,YAAI,sBAAsB,UAAU,IAAI,MAAM,EAAE,KAAK,GAAG;AACxD;AAAA,IACJ;AAAA,EACF;AACF;AAEO,IAAM,gBAAN,cAA4B,SAAS;AAAA,EAC1C,YACE,UAAkB,iBAClB,SAA4B,CAAC,GAC7B;AACA,UAAM,iCAAqB,SAAS,MAAM;AAAA,EAC5C;AACF;AAEO,IAAM,oBAAN,cAAgC,SAAS;AAAA,EAC9C,YACE,UAAkB,iBAClB,SAA4B,CAAC,GAC7B;AACA,UAAM,yCAAyB,SAAS,MAAM;AAAA,EAChD;AACF;AAEO,IAAM,mBAAN,cAA+B,SAAS;AAAA,EAC7C,YACE,UAAkB,uBAClB,SAA4B,CAAC,GAC7B;AACA,UAAM,uCAAwB,SAAS,MAAM;AAAA,EAC/C;AACF;AAEO,IAAM,mBAAN,cAA+B,SAAS;AAAA,EAC7C,YACE,UAAkB,wBAClB,SAA4B,CAAC,GAC7B;AACA,UAAM,uCAAwB,SAAS,MAAM;AAAA,EAC/C;AACF;AACO,IAAM,gBAAN,cAA4B,SAAS;AAAA,EAC1C,YACE,UAAkB,kBAClB,SAA4B,CAAC,GAC7B;AACA,cACE,gBAAgB,gBAAgB,aAAa,aACzC,UACA;AACN,UAAM,gCAAoB,SAAS,MAAM;AAAA,EAC3C;AACF;AAEO,IAAM,gBAAN,cAA4B,SAAS;AAAA,EAC1C,YAAY,UAAkB,aAAa,SAA4B,CAAC,GAAG;AACzE,UAAM,iCAAqB,SAAS,MAAM;AAAA,EAC5C;AACF;AAEO,IAAM,eAAN,cAA2B,SAAS;AAAA,EACzC,YACE,UAAkB,sBAClB,SAA4B,CAAC,GAC7B;AACA,UAAM,+BAAoB,SAAS,MAAM;AAAA,EAC3C;AACF;AAEO,IAAM,cAAN,cAA0B,SAAS;AAAA,EACxC,YAAY,UAAkB,WAAW,SAA4B,CAAC,GAAG;AACvE,UAAM,6BAAmB,SAAS,MAAM;AAAA,EAC1C;AACF;AAEO,IAAM,kBAAN,cAA8B,SAAS;AAAA,EAC5C,YAAY,UAAkB,eAAe,SAA4B,CAAC,GAAG;AAC3E,UAAM,qCAAuB,SAAS,MAAM;AAAA,EAC9C;AACF;AAEO,IAAM,iBAAN,cAA6B,SAAS;AAAA,EAC3C,YACE,UAAkB,qBAClB,SAA4B,CAAC,GAC7B;AACA,UAAM,kCAAqB,SAAS,MAAM;AAAA,EAC5C;AACF;;;ACjKA,OAAO,WAAW,cAAc;AAChC,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,qBAAqB;AAG5B,IAAI,MAAM,gBAAgB;AAC1B,IAAI,CAAC,KAAK;AACR,QAAM,KAAK,QAAQ,MAAM;AAC3B;AAEA,IAAI,CAAC,GAAG,WAAW,GAAG,GAAG;AACvB,KAAG,UAAU,GAAG;AAClB;AAEA,IAAM,yBAAyB,IAAI,gBAAgB;AAAA,EACjD,OAAO,gBAAgB;AAAA;AAAA,EAEvB,UAAU,MAAM;AAAA,EAChB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ,OAAO;AAAA,IACb,OAAO,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,IAC7B,OAAO,UAAU;AAAA,IACjB,OAAO,KAAK;AAAA,EACd;AACF,CAAC;AAED,IAAM,mBAAmB,IAAI,QAAQ,WAAW,QAAQ;AAAA,EACtD,OAAO,QAAQ,IAAI;AAAA,EACnB,QAAQ,OAAO;AAAA,IACb,OAAO,SAAS,EAAE,KAAK,KAAK,CAAC;AAAA,IAC7B,OAAO,UAAU;AAAA,MACf,QAAQ;AAAA,IACV,CAAC;AAAA,IACD,OAAO,MAAM;AAAA,IACb,OAAO;AAAA,MACL,CAAC,SAAS,IAAI,KAAK,SAAS,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO;AAAA,IAC9D;AAAA,EACF;AACF,CAAC;AAEM,IAAM,SAAS,QAAQ,aAAa;AAAA,EACzC,YAAY,CAAC,kBAAkB,sBAAsB;AAAA,EACrD,mBAAmB,CAAC,sBAAsB;AAAA,EAC1C,aAAa;AACf,CAAC;;;AC3CM,IAAM,kBAAkB,CAAC,MAAwB,WAAsB;AAC5E,SAAO,CAAC,KAAc,KAAe,SAAuB;AAC1D,UAAM,SAAS,OAAO,UAAU,IAAI,IAAI,CAAC;AAEzC,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,SAAS,OAAO,QAAQ,OAAO,MAAM,QAAQ,EAAE,WAAW,EAAE;AAAA,QAChE,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,UACjB,OAAO;AAAA,UACP,SAAS;AAAA,QACX;AAAA,MACF;AACA,WAAK,IAAI,gBAAgB,eAAe,MAAM,CAAC;AAAA,IACjD,OAAO;AACL,WAAK;AAAA,IACP;AAAA,EACF;AACF;;;ACtBA,OAAOC,mBAAkB;;;ACCzB,OAAO,kBAAkD;AAOlD,IAAM,aAAN,MAAiB;AAAA,EACtB,OAAO,KACL,SACA,cAA2B,CAAC,GACpB;AACR,UAAM,QAAQ,aAAa;AAAA,MACzB;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,OAAO,OAAe,eAA+B;AAC1D,UAAM,UAAU,aAAa;AAAA,MAC3B;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,gBAAsC,MAAY;AACvD,WAAO;AAAA,MACL,KAAK,KAAK,IAAI,SAAS;AAAA,MACvB,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AACF;;;AD9BO,IAAM,cAAc,OACzB,KACA,KACA,SACG;AACH,MAAI;AACF,UAAM,EAAE,MAAM,IAAI,KAAK;AACvB,QAAI,CAAC,OAAO;AACV,WAAK,IAAI,cAAc,iCAAiC,CAAC;AAAA,IAC3D;AAEA,UAAM,UAAU,WAAW,OAAO,KAAK;AAEvC,QAAI,OAAO;AACX,SAAK;AAAA,EACP,SAAS,OAAO;AACd,QAAI,iBAAiBC,cAAa,mBAAmB;AACnD,WAAK,IAAI,kBAAkB,CAAC;AAAA,IAC9B,WAAW,iBAAiBA,cAAa,mBAAmB;AAC1D,WAAK,IAAI,cAAc,CAAC;AAAA,IAC1B,OAAO;AACL,WAAK,IAAI,cAAc,CAAC;AAAA,IAC1B;AAAA,EACF;AACF;;;AE7BA,OAAO,YAAY;AAEZ,IAAM,WAAN,MAAe;AAAA,EACpB,OAAO,aAAa,UAAmC;AACrD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,aAAO,KAAK,UAAU,gBAAgB,aAAa,SAAU,KAAK,MAAM;AACtE,YAAI,KAAK;AACP,iBAAO,IAAI,OAAO;AAAA,QACpB;AACA,gBAAQ,IAAI;AAAA,MACd,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,gBACL,UACA,gBAC2B;AAC3B,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,aAAO,QAAQ,UAAU,gBAAgB,SAAU,KAAK,QAAQ;AAC9D,YAAI,KAAK;AACP,iBAAO,IAAI,OAAO;AAAA,QACpB;AACA,gBAAQ,MAAM;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;AC5BO,IAAK,mBAAL,kBAAKC,sBAAL;AACH,EAAAA,kBAAA,UAAO;AACP,EAAAA,kBAAA,YAAS;AACT,EAAAA,kBAAA,WAAQ;AACR,EAAAA,kBAAA,WAAQ;AAJA,SAAAA;AAAA,GAAA;;;ACQL,IAAM,eACX,CAAC,cACD,OAAO,KAAc,KAAe,SAAuB;AACzD,MAAI;AACF,UAAM,UAAU,KAAK,KAAK,IAAI;AAAA,EAChC,SAAS,KAAK;AACZ,SAAK,GAAG;AAAA,EACV;AACF;","names":["StatusCode","ResponseStatusCode","config","ErrorType","jsonwebtoken","jsonwebtoken","ValidationSource"]}
package/package.json CHANGED
@@ -1,17 +1,23 @@
1
1
  {
2
2
  "name": "@ajayjbtickets/common",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "description": "",
5
- "type": "module",
6
- "main": "./dist/index.js",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "files": [
9
9
  "dist/**/*"
10
10
  ],
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ }
16
+ },
11
17
  "scripts": {
12
18
  "clean": "del ./dist/*",
13
- "build": "npm run clean && tsc",
14
- "pub": "git add . && git commit -m \"updates\" && npm version patch && npm run build && npm publish"
19
+ "build": "npm run clean && tsup",
20
+ "pub": "git add . && git commit -m \"updates\" && npm version patch && npm run build && npm publish"
15
21
  },
16
22
  "keywords": [],
17
23
  "author": "",
@@ -22,6 +28,7 @@
22
28
  "@types/express": "^5.0.1",
23
29
  "@types/jsonwebtoken": "^9.0.9",
24
30
  "del-cli": "^6.0.0",
31
+ "tsup": "^8.4.0",
25
32
  "typescript": "^5.8.3"
26
33
  },
27
34
  "dependencies": {
@@ -1,10 +0,0 @@
1
- import "dotenv/config";
2
- interface Env {
3
- ENVIRONMENT: string;
4
- LOG_DIR: string;
5
- LOG_LEVEL: string;
6
- SALT_ROUNDS: number;
7
- JWT_KEY: string;
8
- }
9
- export declare const sanitizedConfig: Env;
10
- export {};
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sanitizedConfig = void 0;
4
- require("dotenv/config");
5
- const getConfig = () => {
6
- return {
7
- ENVIRONMENT: process.env.ENVIRONMENT,
8
- LOG_DIR: process.env.LOG_DIR,
9
- LOG_LEVEL: process.env.LOG_LEVEL,
10
- SALT_ROUNDS: parseInt(process.env.SALT_ROUNDS),
11
- JWT_KEY: process.env.JWT_KEY,
12
- };
13
- };
14
- const getSanitizedConfig = (config) => {
15
- for (const [key, value] of Object.entries(config)) {
16
- if (!value) {
17
- throw new Error(`Missing key ${key} in config.env`);
18
- }
19
- }
20
- return config;
21
- };
22
- const config = getConfig();
23
- exports.sanitizedConfig = getSanitizedConfig(config);
24
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":";;;AAAA,yBAAuB;AAUvB,MAAM,SAAS,GAAG,GAAQ,EAAE;IAC1B,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;QACpC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;QAC5B,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;QAChC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QAC9C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;KAC7B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAW,EAAO,EAAE;IAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,gBAAgB,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AACd,QAAA,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC"}
@@ -1,5 +0,0 @@
1
- export declare const ENVIRONMENTS: {
2
- production: string;
3
- development: string;
4
- testing: string;
5
- };
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ENVIRONMENTS = void 0;
4
- exports.ENVIRONMENTS = {
5
- production: "production",
6
- development: "development",
7
- testing: "testing",
8
- };
9
- //# sourceMappingURL=environments.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"environments.js","sourceRoot":"","sources":["../../src/constants/environments.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG;IAC1B,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,SAAS;CACnB,CAAC"}
@@ -1,54 +0,0 @@
1
- import { Response } from "express";
2
- export declare enum ErrorType {
3
- BAD_TOKEN = "BadTokenError",
4
- TOKEN_EXPIRED = "TokenExpiredError",
5
- UNAUTHORIZED = "AuthFailureError",
6
- ACCESS_TOKEN = "AccessTokenError",
7
- INTERNAL = "InternalError",
8
- NOT_FOUND = "NotFoundError",
9
- NO_ENTRY = "NoEntryError",
10
- NO_DATA = "NoDataError",
11
- BAD_REQUEST = "BadRequestError",
12
- FORBIDDEN = "ForbiddenError"
13
- }
14
- export type ErrorDetailType = {
15
- field: string | number;
16
- message?: (string | number)[];
17
- };
18
- export declare abstract class ApiError extends Error {
19
- type: ErrorType;
20
- message: string;
21
- errors: ErrorDetailType[];
22
- constructor(type: ErrorType, message: string | undefined, errors: ErrorDetailType[]);
23
- static handle(err: ApiError, res: Response): void;
24
- }
25
- export declare class BadTokenError extends ApiError {
26
- constructor(message?: string, errors?: ErrorDetailType[]);
27
- }
28
- export declare class TokenExpiredError extends ApiError {
29
- constructor(message?: string, errors?: ErrorDetailType[]);
30
- }
31
- export declare class AuthFailureError extends ApiError {
32
- constructor(message?: string, errors?: ErrorDetailType[]);
33
- }
34
- export declare class AccessTokenError extends ApiError {
35
- constructor(message?: string, errors?: ErrorDetailType[]);
36
- }
37
- export declare class InternalError extends ApiError {
38
- constructor(message?: string, errors?: ErrorDetailType[]);
39
- }
40
- export declare class NotFoundError extends ApiError {
41
- constructor(message?: string, errors?: ErrorDetailType[]);
42
- }
43
- export declare class NoEntryError extends ApiError {
44
- constructor(message?: string, errors?: ErrorDetailType[]);
45
- }
46
- export declare class NoDataError extends ApiError {
47
- constructor(message?: string, errors?: ErrorDetailType[]);
48
- }
49
- export declare class BadRequestError extends ApiError {
50
- constructor(message?: string, errors?: ErrorDetailType[]);
51
- }
52
- export declare class ForbiddenError extends ApiError {
53
- constructor(message?: string, errors?: ErrorDetailType[]);
54
- }