@codenokami/node-api-master 1.4.1 → 1.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.
package/dist/index.js CHANGED
@@ -1,415 +1 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, { get: all[name], enumerable: true });
10
- };
11
- var __copyProps = (to, from, except, desc) => {
12
- if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
- }
17
- return to;
18
- };
19
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
- // If the importer is in node compatibility mode or this is not an ESM
21
- // file that has been converted to a CommonJS file using a Babel-
22
- // compatible transform (i.e. "__esModule" has not been set), then set
23
- // "default" to the CommonJS "module.exports" for node compatibility.
24
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
- mod
26
- ));
27
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
-
29
- // src/index.js
30
- var index_exports = {};
31
- __export(index_exports, {
32
- AppError: () => AppError_default,
33
- Joi: () => import_joi3.default,
34
- STATUS_CODES: () => constants_default,
35
- admin: () => admin,
36
- apiResponse: () => response_exports,
37
- auth: () => auth,
38
- catchAsync: () => catchAsync_default,
39
- comparePassword: () => comparePassword,
40
- connectDB: () => connection_default,
41
- errorMiddleware: () => errorMiddleware_default,
42
- generateToken: () => generateToken,
43
- generateUUID: () => uuid_default,
44
- hashPassword: () => hashPassword,
45
- schemas: () => validations_default,
46
- socket: () => socket_exports,
47
- validate: () => validate_default
48
- });
49
- module.exports = __toCommonJS(index_exports);
50
- var import_joi3 = __toESM(require("joi"));
51
-
52
- // src/db/connection.js
53
- var import_mongoose = __toESM(require("mongoose"));
54
- var connectDB = async (url) => {
55
- if (!url) {
56
- console.error(
57
- "\u274C Error: MongoDB URL is required to connect to the database."
58
- );
59
- process.exit(1);
60
- }
61
- try {
62
- const conn = await import_mongoose.default.connect(url);
63
- console.log(`\u2705 MongoDB Connected: ${conn.connection.host}`);
64
- } catch (error) {
65
- console.error(`\u274C Error: ${error.message}`);
66
- process.exit(1);
67
- }
68
- };
69
- var connection_default = connectDB;
70
-
71
- // src/middleware/auth.js
72
- var import_jsonwebtoken = __toESM(require("jsonwebtoken"));
73
-
74
- // src/utils/AppError.js
75
- var AppError = class extends Error {
76
- constructor(message, statusCode) {
77
- super(message);
78
- this.statusCode = statusCode;
79
- this.status = `${statusCode}`.startsWith("4") ? "fail" : "error";
80
- this.isOperational = true;
81
- Error.captureStackTrace(this, this.constructor);
82
- }
83
- };
84
- var AppError_default = AppError;
85
-
86
- // src/utils/catchAsync.js
87
- var catchAsync = (fn) => {
88
- return (req, res, next) => {
89
- fn(req, res, next).catch(next);
90
- };
91
- };
92
- var catchAsync_default = catchAsync;
93
-
94
- // src/middleware/auth.js
95
- var auth = (secret = process.env.JWT_SECRET) => catchAsync_default(async (req, res, next) => {
96
- let token;
97
- if (req.headers.authorization && req.headers.authorization.startsWith("Bearer")) {
98
- token = req.headers.authorization.split(" ")[1];
99
- } else if (req.cookies && req.cookies.jwt) {
100
- token = req.cookies.jwt;
101
- }
102
- if (!secret) {
103
- return next(
104
- new AppError_default("JWT Secret is not defined in environment variables", 500)
105
- );
106
- }
107
- if (!token) {
108
- return next(
109
- new AppError_default(
110
- "You are not logged in! Please log in to get access.",
111
- 401
112
- )
113
- );
114
- }
115
- try {
116
- const decoded = import_jsonwebtoken.default.verify(token, secret);
117
- req.user = decoded;
118
- next();
119
- } catch (error) {
120
- return next(
121
- new AppError_default("Invalid token or expired. Please log in again.", 401)
122
- );
123
- }
124
- });
125
- var admin = (req, res, next) => {
126
- if (req.user && req.user.role === "admin") {
127
- next();
128
- } else {
129
- return next(
130
- new AppError_default("You do not have permission to perform this action", 403)
131
- );
132
- }
133
- };
134
-
135
- // src/middleware/validate.js
136
- var validate = (schema) => (req, res, next) => {
137
- const { error, value } = schema.validate(req.body, {
138
- abortEarly: false,
139
- // Error အားလုံးကို တစ်ခါတည်း ပြရန်
140
- allowUnknown: true,
141
- // Schema ထဲမပါတဲ့ field တွေပါလာရင် လက်ခံရန်
142
- stripUnknown: true
143
- // Schema ထဲမပါတဲ့ field တွေကို ဖယ်ထုတ်ပစ်ရန်
144
- });
145
- if (error) {
146
- const errorMessage = error.details.map((detail) => detail.message.replace(/"/g, "")).join(", ");
147
- return next(new AppError_default(errorMessage, 400));
148
- }
149
- req.body = value;
150
- next();
151
- };
152
- var validate_default = validate;
153
-
154
- // src/utils/constants.js
155
- var PORT = process.env.PORT || 5e3;
156
- var STATUS_CODES = {
157
- // --- 2xx Success ---
158
- OK: 200,
159
- // Request အောင်မြင်သည်
160
- CREATED: 201,
161
- // Data အသစ် တည်ဆောက်မှု အောင်မြင်သည်
162
- ACCEPTED: 202,
163
- // လက်ခံရရှိသည် (နောက်မှ အလုပ်လုပ်မည်)
164
- NO_CONTENT: 204,
165
- // အောင်မြင်သည်၊ သို့သော် ပြစရာ Data မရှိ (ဥပမာ- Delete လုပ်ပြီးချိန်)
166
- // --- 3xx Redirection ---
167
- MOVED_PERMANENTLY: 301,
168
- FOUND: 302,
169
- // --- 4xx Client Errors ---
170
- BAD_REQUEST: 400,
171
- // ပေးပို့လိုက်သော Data Format မှားနေသည် (Validation error)
172
- UNAUTHORIZED: 401,
173
- // Login ဝင်ရန် လိုအပ်သည် (သို့မဟုတ် Token မှားသည်)
174
- FORBIDDEN: 403,
175
- // လုပ်ပိုင်ခွင့်မရှိ (ဥပမာ- Admin မဟုတ်ဘဲ Admin panel ဝင်ခြင်း)
176
- NOT_FOUND: 404,
177
- // ရှာဖွေနေသော Resource မရှိပါ
178
- METHOD_NOT_ALLOWED: 405,
179
- // API Method (GET, POST, etc.) မှားနေသည်
180
- CONFLICT: 409,
181
- // Data ထပ်နေသည် (ဥပမာ- ရှိပြီးသား Email နဲ့ Register လုပ်ခြင်း)
182
- UNPROCESSABLE_ENTITY: 422,
183
- // Validation Error များအတွက် အသုံးများသည်
184
- TOO_MANY_REQUESTS: 429,
185
- // API ကို ခဏခဏ ဆက်တိုက်ခေါ်ခြင်း (Rate limiting)
186
- // --- 5xx Server Errors ---
187
- INTERNAL_SERVER_ERROR: 500,
188
- // Server ထဲတွင် Code မှားယွင်းခြင်း
189
- NOT_IMPLEMENTED: 501,
190
- BAD_GATEWAY: 502,
191
- SERVICE_UNAVAILABLE: 503,
192
- // Server ခေတ္တပိတ်ထားသည်
193
- GATEWAY_TIMEOUT: 504,
194
- PORT
195
- };
196
- var constants_default = STATUS_CODES;
197
-
198
- // src/middleware/errorMiddleware.js
199
- var errorMiddleware = (err, req, res, next) => {
200
- err.statusCode = err.statusCode || constants_default.INTERNAL_SERVER_ERROR;
201
- err.status = err.status || "error";
202
- if (process.env.NODE_ENV === "development") {
203
- res.status(err.statusCode).json({
204
- status: err.status,
205
- error: err,
206
- message: err.message,
207
- stack: err.stack
208
- });
209
- } else {
210
- if (err.isOperational) {
211
- res.status(err.statusCode).json({
212
- status: err.status,
213
- message: err.message
214
- });
215
- } else {
216
- console.error("ERROR \u{1F4A5}", err);
217
- res.status(constants_default.INTERNAL_SERVER_ERROR).json({
218
- status: "error",
219
- message: "Something went very wrong!"
220
- });
221
- }
222
- }
223
- };
224
- var errorMiddleware_default = errorMiddleware;
225
-
226
- // src/utils/response.js
227
- var response_exports = {};
228
- __export(response_exports, {
229
- default: () => response_default
230
- });
231
- var apiResponse = {
232
- // အောင်မြင်တဲ့ response ပေးပို့ရန်
233
- success: (res, data, message = "Success", statusCode = constants_default.OK) => {
234
- return res.status(statusCode).json({
235
- status: "success",
236
- message,
237
- data
238
- });
239
- },
240
- // Error response ပေးပို့ရန် (Operational error များအတွက်)
241
- error: (res, message = "Internal Server Error", statusCode = constants_default.INTERNAL_SERVER_ERROR) => {
242
- return res.status(statusCode).json({
243
- status: "error",
244
- message
245
- });
246
- }
247
- };
248
- var response_default = apiResponse;
249
-
250
- // src/utils/authHelper.js
251
- var import_bcryptjs = __toESM(require("bcryptjs"));
252
- var import_jsonwebtoken2 = __toESM(require("jsonwebtoken"));
253
- var hashPassword = async (password) => {
254
- const salt = await import_bcryptjs.default.genSalt(10);
255
- return await import_bcryptjs.default.hash(password, salt);
256
- };
257
- var comparePassword = async (password, hashedPassword) => {
258
- return await import_bcryptjs.default.compare(password, hashedPassword);
259
- };
260
- var generateToken = (payload, res, options = {}) => {
261
- const secret = options.secret || process.env.JWT_SECRET;
262
- const expiresIn = options.expiresIn || "30d";
263
- const cookieName = options.cookieName || "jwt";
264
- const token = import_jsonwebtoken2.default.sign(payload, secret, {
265
- expiresIn
266
- });
267
- const cookieOptions = {
268
- maxAge: options.maxAge || 30 * 24 * 60 * 60 * 1e3,
269
- // Default 30 days
270
- httpOnly: true,
271
- // JavaScript မှ ဖတ်မရအောင် (Prevent XSS)
272
- sameSite: process.env.NODE_ENV === "production" ? "none" : "lax",
273
- // CSRF Protection
274
- secure: process.env.NODE_ENV === "production",
275
- // Production တွင် HTTPS သုံးမှသာ အလုပ်လုပ်မည်
276
- ...options.extraCookieOptions
277
- // တခြား အပို options များရှိလျှင် ထည့်ရန်
278
- };
279
- res.cookie(cookieName, token, cookieOptions);
280
- return token;
281
- };
282
-
283
- // src/utils/uuid.js
284
- var import_crypto = __toESM(require("crypto"));
285
- var generateUUID = () => {
286
- if (typeof import_crypto.default.randomUUID === "function") {
287
- return import_crypto.default.randomUUID();
288
- }
289
- return ("10000000-1000-4000-8000" + -1e11).replace(
290
- /[018]/g,
291
- (c) => (c ^ import_crypto.default.randomBytes(1).readUInt8() & 15 >> c / 4).toString(16)
292
- );
293
- };
294
- var uuid_default = generateUUID;
295
-
296
- // src/validations/user.schema.js
297
- var import_joi = __toESM(require("joi"));
298
- var userSchema = {
299
- // Standard Register Schema
300
- register: import_joi.default.object({
301
- username: import_joi.default.string().alphanum().min(3).max(30).required().messages({
302
- "string.min": "Username must be at least 3 characters long",
303
- "any.required": "Username is a required field"
304
- }),
305
- email: import_joi.default.string().email({ minDomainSegments: 2, tlds: { allow: ["com", "net", "org"] } }).required().messages({
306
- "string.email": "Please provide a valid email address"
307
- }),
308
- password: import_joi.default.string().min(8).required().messages({
309
- "string.min": "Password must be at least 8 characters long"
310
- }),
311
- confirmPassword: import_joi.default.any().equal(import_joi.default.ref("password")).required().messages({ "any.only": "Passwords do not match" }),
312
- role: import_joi.default.string().valid("user", "admin").default("user")
313
- }),
314
- // Login Schema
315
- login: import_joi.default.object({
316
- email: import_joi.default.string().email().required(),
317
- password: import_joi.default.string().required()
318
- }),
319
- // Password Update Schema
320
- updatePassword: import_joi.default.object({
321
- currentPassword: import_joi.default.string().required(),
322
- newPassword: import_joi.default.string().min(8).required()
323
- }),
324
- /**
325
- * စိတ်ကြိုက် schema အသစ်ဆောက်ချင်ရင် သုံးရန် (Dynamic Flexibility)
326
- * @param {Object} schemaDefinition - Joi object definition
327
- */
328
- custom: (schemaDefinition) => import_joi.default.object(schemaDefinition)
329
- };
330
- var user_schema_default = userSchema;
331
-
332
- // src/validations/common.schema.js
333
- var import_joi2 = __toESM(require("joi"));
334
- var commonSchema = {
335
- // MongoDB ObjectId စစ်ဆေးရန် (24 hex characters)
336
- objectId: import_joi2.default.string().regex(/^[0-9a-fA-F]{24}$/).messages({
337
- "string.pattern.base": "Invalid ID format. Must be a valid ObjectId."
338
- }),
339
- // Pagination အတွက် (Query strings)
340
- pagination: import_joi2.default.object({
341
- page: import_joi2.default.number().integer().min(1).default(1),
342
- limit: import_joi2.default.number().integer().min(1).max(100).default(10),
343
- sort: import_joi2.default.string().optional(),
344
- fields: import_joi2.default.string().optional()
345
- })
346
- };
347
- var common_schema_default = commonSchema;
348
-
349
- // src/validations/index.js
350
- var schemas = {
351
- user: user_schema_default,
352
- common: common_schema_default
353
- };
354
- var validations_default = schemas;
355
-
356
- // src/socket/index.js
357
- var socket_exports = {};
358
- __export(socket_exports, {
359
- getIO: () => getIO,
360
- initSocket: () => initSocket
361
- });
362
- var import_socket = require("socket.io");
363
- var import_jsonwebtoken3 = __toESM(require("jsonwebtoken"));
364
- var io;
365
- var socketAuth = (secret) => {
366
- return (socket, next) => {
367
- var _a, _b;
368
- const token = ((_a = socket.handshake.auth) == null ? void 0 : _a.token) || ((_b = socket.handshake.headers) == null ? void 0 : _b.token);
369
- if (!token) {
370
- return next(new Error("Authentication error: Token missing"));
371
- }
372
- try {
373
- const decoded = import_jsonwebtoken3.default.verify(token, secret || process.env.JWT_SECRET);
374
- socket.user = decoded;
375
- next();
376
- } catch (err) {
377
- next(new Error("Authentication error: Invalid token"));
378
- }
379
- };
380
- };
381
- var initSocket = (server, options = {}) => {
382
- io = new import_socket.Server(server, {
383
- cors: {
384
- origin: options.origin || "*"
385
- },
386
- ...options
387
- });
388
- if (options.authRequired) {
389
- io.use(socketAuth(options.jwtSecret));
390
- }
391
- return io;
392
- };
393
- var getIO = () => {
394
- if (!io) throw new Error("Socket.io not initialized!");
395
- return io;
396
- };
397
- // Annotate the CommonJS export names for ESM import in node:
398
- 0 && (module.exports = {
399
- AppError,
400
- Joi,
401
- STATUS_CODES,
402
- admin,
403
- apiResponse,
404
- auth,
405
- catchAsync,
406
- comparePassword,
407
- connectDB,
408
- errorMiddleware,
409
- generateToken,
410
- generateUUID,
411
- hashPassword,
412
- schemas,
413
- socket,
414
- validate
415
- });
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _chunkZJQTZFDUjs = require('./chunk-ZJQTZFDU.js');var _mongoose = require('mongoose'); var _mongoose2 = _interopRequireDefault(_mongoose);var R=async e=>{e||(console.error("\u274C Error: MongoDB URL is required to connect to the database."),process.exit(1));try{let t=await _mongoose2.default.connect(e);console.log(`\u2705 MongoDB Connected: ${t.connection.host}`)}catch(t){console.error(`\u274C Error: ${t.message}`),process.exit(1)}},T= exports.connectDB =R;var _jsonwebtoken = require('jsonwebtoken'); var _jsonwebtoken2 = _interopRequireDefault(_jsonwebtoken);var f=e=>(t,o,r)=>{e(t,o,r).catch(r)},m= exports.catchAsync =f;var N=(e=process.env.JWT_SECRET,t={})=>m(async(o,r,n)=>{let a;if(o.headers.authorization&&o.headers.authorization.startsWith("Bearer")?a=o.headers.authorization.split(" ")[1]:o.cookies&&o.cookies[t.cookieName||"jwt"]&&(a=o.cookies[t.cookieName||"jwt"]),!e)return n(new (0, _chunkZJQTZFDUjs.a)("JWT Secret is not defined in environment variables",500));if(!a)return n(new (0, _chunkZJQTZFDUjs.a)("You are not logged in! Please log in to get access.",401));try{let i=_jsonwebtoken2.default.verify(a,e);o.user=i,n()}catch (e2){return n(new (0, _chunkZJQTZFDUjs.a)("Invalid token or expired. Please log in again.",401))}}),l= exports.admin =(e,t,o)=>{if(e.user&&e.user.role==="admin")o();else return o(new (0, _chunkZJQTZFDUjs.a)("You do not have permission to perform this action",403))};var A=process.env.PORT||5e3,S={OK:200,CREATED:201,ACCEPTED:202,NO_CONTENT:204,MOVED_PERMANENTLY:301,FOUND:302,BAD_REQUEST:400,UNAUTHORIZED:401,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_ALLOWED:405,CONFLICT:409,UNPROCESSABLE_ENTITY:422,TOO_MANY_REQUESTS:429,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504,PORT:A},s= exports.STATUS_CODES =S;var _=(e,t,o,r)=>{e.statusCode=e.statusCode||s.INTERNAL_SERVER_ERROR,e.status=e.status||"error",process.env.NODE_ENV==="development"?o.status(e.statusCode).json({status:e.status,error:e,message:e.message,stack:e.stack}):e.isOperational?o.status(e.statusCode).json({status:e.status,message:e.message}):(console.error("ERROR \u{1F4A5}",e),o.status(s.INTERNAL_SERVER_ERROR).json({status:"error",message:"Something went very wrong!"}))},g= exports.errorMiddleware =_;var D={success:(e,t,o="Success",r=s.OK)=>e.status(r).json({status:"success",message:o,data:t}),error:(e,t="Internal Server Error",o=s.INTERNAL_SERVER_ERROR)=>e.status(o).json({status:"error",message:t})},h= exports.apiResponse =D;var _bcryptjs = require('bcryptjs'); var _bcryptjs2 = _interopRequireDefault(_bcryptjs);var I=async e=>{let t=await _bcryptjs2.default.genSalt(10);return await _bcryptjs2.default.hash(e,t)},w= exports.comparePassword =async(e,t)=>await _bcryptjs2.default.compare(e,t),C= exports.generateToken =(e,t,o={})=>{let r=o.secret||process.env.JWT_SECRET,n=o.expiresIn||"30d",a=o.cookieName||"jwt",i=_jsonwebtoken2.default.sign(e,r,{expiresIn:n}),u={maxAge:o.maxAge||720*60*60*1e3,httpOnly:!0,sameSite:process.env.NODE_ENV==="production"?"none":"lax",secure:process.env.NODE_ENV==="production",...o.extraCookieOptions};return t.cookie(a,i,u),i};var _crypto = require('crypto'); var _crypto2 = _interopRequireDefault(_crypto);var x=()=>typeof _crypto2.default.randomUUID=="function"?_crypto2.default.randomUUID():("10000000-1000-4000-8000"+-1e11).replace(/[018]/g,e=>(e^_crypto2.default.randomBytes(1).readUInt8()&15>>e/4).toString(16)),k= exports.generateUUID =x;exports.AppError = _chunkZJQTZFDUjs.a; exports.STATUS_CODES = s; exports.admin = l; exports.apiResponse = h; exports.auth = N; exports.catchAsync = m; exports.comparePassword = w; exports.connectDB = T; exports.errorMiddleware = g; exports.generateToken = C; exports.generateUUID = k; exports.hashPassword = I;