fiberx-backend-toolkit 0.0.8 → 0.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/{chunk-LN65UUHQ.js → chunk-SI4SUH2O.js} +4 -1
- package/dist/chunk-SI4SUH2O.js.map +1 -0
- package/dist/database/index.d.ts +1 -1
- package/dist/database/index.js +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/middle_ware/index.d.ts +24 -49
- package/dist/middle_ware/index.js +67 -15
- package/dist/middle_ware/index.js.map +1 -1
- package/dist/middle_ware_type-D8LA7qF3.d.ts +51 -0
- package/dist/migration_type-XLMG0zzO.d.ts +93 -0
- package/dist/types/index.d.ts +3 -93
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-LN65UUHQ.js.map +0 -1
|
@@ -603,6 +603,9 @@ var InputValidatorUtil = class _InputValidatorUtil {
|
|
|
603
603
|
static isDevelopment() {
|
|
604
604
|
return _InputValidatorUtil?.env_manager?.env_data?.MODE === "development";
|
|
605
605
|
}
|
|
606
|
+
static isLive() {
|
|
607
|
+
return ["production", "staging"].includes(_InputValidatorUtil?.env_manager?.env_data?.MODE || "");
|
|
608
|
+
}
|
|
606
609
|
/** ✅ Validate ReCaptcha */
|
|
607
610
|
static async isValidReCaptcha(recpatcha_token) {
|
|
608
611
|
const {
|
|
@@ -1035,4 +1038,4 @@ export {
|
|
|
1035
1038
|
safe_execute_util_default,
|
|
1036
1039
|
cache_util_default
|
|
1037
1040
|
};
|
|
1038
|
-
//# sourceMappingURL=chunk-
|
|
1041
|
+
//# sourceMappingURL=chunk-SI4SUH2O.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger_util.ts","../src/config/constants.ts","../src/utils/input_transformer_util.ts","../src/utils/input_validator_util.ts","../src/utils/env_manager_util.ts","../src/utils/sql_formatter_util.ts","../src/utils/server_util.ts","../src/utils/safe_execute_util.ts","../src/utils/cache_util.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport { LOG_DIR } from \"@/config/constants\";\nimport {\n LogEntryInterface,\n LogLevelType,\n} from \"@/types/util_type\"\n\nclass LoggerUtil {\n private readonly module_name: string;\n private readonly base_dir: string;\n private readonly log_file_path: string;\n private readonly log_directory: string;\n private readonly store_log_locally: boolean;\n\n constructor(module_name: string) {\n this.module_name = module_name;\n this.store_log_locally = true;\n this.base_dir = process.cwd();\n this.log_directory = this.ensureDirExists(LOG_DIR)\n this.log_file_path = this.getLogFilePath();\n }\n\n /**\n * Ensures a directory exists. If it doesn't, creates it.\n * @param directory_path - Path to the directory\n * @returns The absolute path of the ensured directory\n */\n private ensureDirExists(directory_path: string): string {\n const resolved_path = path.resolve(directory_path);\n\n if (!fs.existsSync(resolved_path)) {\n fs.mkdirSync(resolved_path, { recursive: true });\n }\n\n return resolved_path;\n }\n\n /**\n * Generate log unique log file name with timestamp and module name\n * @returns The absolute path of the module log file\n */\n private getLogFilePath():string {\n const timestamp = Math.floor(Date.now() / 1000);\n const file_name = `${this.module_name}-${timestamp}.log`;\n const log_file_path = path.join(this.log_directory, file_name);\n\n return log_file_path;\n }\n\n // Safely stringify objects while avoiding circular references\n private safeStringify(\n obj: unknown, \n space = 2\n ): string {\n const seen = new WeakSet();\n return JSON.stringify(\n obj, \n (key, value) => {\n if (typeof value === \"object\" && value !== null) {\n if (seen.has(value)) { return \"[Circular]\"; }\n\n seen.add(value);\n }\n\n return value;\n },\n space\n );\n }\n\n // Log a message with optional error data and level\n private log( \n message = \"\", \n data_error: unknown = {}, \n status: LogLevelType = \"INFO\"\n ): LogEntryInterface {\n const timestamp = new Date().toISOString();\n const error_str = data_error && typeof data_error === \"object\" && Object.keys(data_error as object).length ? this.safeStringify(data_error, 0) : \"\";\n const formatted_message = message.startsWith(`[${this.module_name}]`) ? message : `[${this.module_name}] ${message}`;\n const log_line = `${timestamp} [${status}] ${formatted_message} ${error_str}\\n`;\n const log_entry: LogEntryInterface = { timestamp, status, message, data_error: data_error };\n\n\n if (this.store_log_locally) { fs.appendFileSync(this.log_file_path, log_line); }\n\n console.log(`\\n${timestamp} [${status}] ${formatted_message}\\n`);\n\n if (data_error && typeof data_error === \"object\" && Object.keys(data_error as object).length) {\n console.log({ ...data_error });\n console.log(\"\\n\");\n console.log(\"========================================\");\n }\n\n return log_entry;\n }\n\n // Log info-level messages\n public info(message: string, data: unknown = \"\"): LogEntryInterface { return this.log(message, data, \"INFO\"); }\n\n // Log error-level messages\n public error(message: string, error: unknown = \"\"): LogEntryInterface { return this.log(message, error, \"ERROR\"); }\n\n // Log alert-level messages\n public alert(message: string, data: unknown = \"\"): LogEntryInterface { return this.log(message, data, \"ALERT\"); }\n\n // Log success-level messages\n public success(message: string, data: unknown = \"\"): LogEntryInterface { return this.log(message, data, \"SUCCESS\"); }\n\n // Log how long a method took to execute\n public logExecutionTime(start_time: [number, number], class_name: string, method_name: string): void {\n const [seconds, nanoseconds] = process.hrtime(start_time);\n const duration_ms = (seconds * 1000 + nanoseconds / 1e6).toFixed(2);\n\n this.info(`${class_name} - ${method_name} completed in ${duration_ms}ms`);\n }\n}\n\nexport default LoggerUtil;","import { RateLimiterOptions } from \"@/types/middle_ware_type\";\nimport path from \"path\";\n\n// Database constants\nexport const BASE_DIR = process.cwd();\nexport const LOG_DIR = path.join(BASE_DIR, \"logs\");\nexport const ENV_VAR_DIR = path.join(BASE_DIR, \"environment_varaiables\");\nexport const SCHEMAS_DIR = path.join(BASE_DIR, \"src/database/schemas\");\nexport const SCHEMA_SNAPSHOTS_DIR = path.join(BASE_DIR, \"src/database/schema_snapshots\");\nexport const MODELS_DIR = path.join(BASE_DIR, \"src/database/models\");\nexport const MIGRATIONS_DIR = path.join(BASE_DIR, \"src/database/migrations\");\nexport const SEEDERS_DIR = path.join(BASE_DIR, \"src/database/seeders\");\n\nexport const SEQUELIZE_META_TABLE_NAME = \"sequelize_database_tables_meta\";\nexport const SEQUELIZE_SEEDER_META_TABLE_NAME = \"sequelize_database_table_seeder_meta\";\n\nexport const REQUEST_ID_COOKIE_MAX_AGE = (1000 * 60 * 60 * 24 * 7); // 7 days\n\n// CORS constants\nexport const CORS_ALLOWED_METHODS = [\"GET\", \"POST\", \"PATCH\", \"DELETE\", \"OPTIONS\"];\nexport const CORS_ALLOWED_HEADERS = [ \"Content-Type\", \"Authorization\", \"X-Device-Id\", \"X-Device-Name\", \"User-Agent\"];\nexport const CORS_MAX_AGE_IN_SECONDS = (600) // default: 10 min\nexport const CORS_MAX_AGE_IN_MICRO_SECONDS = (1000 * 60 * 10); // 10 minutes\n\n// Rate limitter\nexport const REQUEST_RATE_LIMITTER_OPTIONS = {\n window_ms: (60 * 1000), // 1 MINS\n max_requests: 50,\n message: \"⏳ Too many requests from this IP, please try again later\"\n}","import axios from \"axios\";\nimport bcrypt from \"bcrypt\";\nimport dayjs from \"dayjs\";\n\nimport {\n CountLookupItemInterface,\n PaginationResultInterface,\n} from \"@/types/util_type\";\n\n// Utility class for transforming and formatting input values\nclass InputTransformerUtil {\n /**\n * Lookup table for number formatting suffixes\n */\n private static count_lookup: CountLookupItemInterface[] = [\n { value: 1, symbol: \"\" },\n { value: 1_000, symbol: \"K\" },\n { value: 1_000_000, symbol: \"M\" },\n { value: 1_000_000_000, symbol: \"B\" },\n { value: 1_000_000_000_000, symbol: \"T\" },\n ];\n\n /**\n * Capitalize the first letter of a string\n */\n public static capitalize(input: string): string {\n return input\n ? input.charAt(0).toUpperCase() + input.slice(1).toLowerCase()\n : input;\n }\n\n /**\n * Capitalize the first letter of each word in a string\n */\n public static capitalizeEachWord(input?: string): string {\n if (!input) {\n return \"\";\n }\n\n return input\n .split(\" \")\n .map((word) => this.capitalize(word))\n .join(\" \");\n }\n\n /**\n * Format date of birth to YYYY-MM-DD\n */\n public static formatDob(dob?: string | Date | null): string | null {\n return dob ? dayjs(dob).format(\"YYYY-MM-DD\") : null;\n }\n\n /**\n * Format full name from first and last name\n */\n public static formatMemberFullName(\n first_name?: string,\n last_name?: string\n ): string | null {\n return first_name && last_name ? `${first_name} ${last_name}` : null;\n }\n\n /**\n * Format member preview string\n */\n public static formatMemberPreview(\n first_name?: string,\n last_name?: string,\n public_id?: string\n ): string | null {\n return first_name && last_name && public_id\n ? `(${public_id}) - ${first_name} ${last_name}`\n : null;\n }\n\n /**\n * Format a number with commas\n */\n public static formatAmount(amount: number): string {\n if (!amount) {\n return \"0\";\n }\n\n return amount > 0\n ? Intl.NumberFormat(\"en-US\").format(amount)\n : amount.toString();\n }\n\n /**\n * Format large numbers with suffixes (K, M, B, T)\n */\n public static nFormatter(num: number, digits = 1): string {\n const lookup_item = this.count_lookup\n .slice()\n .reverse()\n .find((item) => num >= item.value);\n\n if (!lookup_item) {\n return \"0\";\n }\n\n const formatted_value = (num / lookup_item.value)\n .toFixed(digits)\n .replace(/\\.0+$|(\\.[0-9]*[1-9])0+$/, \"$1\");\n\n return `${formatted_value}${lookup_item.symbol}`;\n }\n\n /**\n * Round a number to two decimal places\n */\n public static roundToTwoDecimalPlaces(value: number): number {\n if (typeof value !== \"number\") {\n throw new Error(\"Input must be a number\");\n }\n\n return Math.round(value * 100) / 100;\n }\n\n /**\n * Remove leading zeros from a number or string\n */\n public static removeLeadingZeros(value: string | number): string {\n return value.toString().replace(/^0+/, \"\") || \"0\";\n }\n\n /**\n * Get country/location based on IP address\n */\n public static async ipAddressToLocation(\n ip_address: string | null = null\n ): Promise<string> {\n try {\n const suffix =\n !ip_address || ip_address === \"::1\"\n ? \"s\"\n : `?ip=${ip_address}`;\n\n const response = await axios.get(`https://ip2c.org/${suffix}`);\n const response_text = response.data.toString();\n\n if (response_text[0] === \"1\") {\n const location_parts = response_text.split(\";\");\n return location_parts[location_parts.length - 1];\n }\n\n return \"Unknown\";\n } catch (error) {\n console.error(\n `Error fetching location for IP ${ip_address}:`,\n error\n );\n return \"Unknown\";\n }\n }\n\n /**\n * Convert date of birth string to age\n */\n public static dobToAge(dob_string: string): number {\n const dob_date = new Date(dob_string);\n const today = new Date();\n\n let age = today.getFullYear() - dob_date.getFullYear();\n const month_difference =\n today.getMonth() - dob_date.getMonth();\n\n if (\n month_difference < 0 ||\n (month_difference === 0 &&\n today.getDate() < dob_date.getDate())\n ) {\n age--;\n }\n\n return age;\n }\n\n /**\n * Hash plain text password\n */\n public static textToPasswordHash(password: string): string {\n return bcrypt.hashSync(password, bcrypt.genSaltSync(10));\n }\n\n /**\n\t * Ensures singular, snake_case, and appends `_schema`\n\t * Example:\n\t * - \"Users\" → \"user_schema\"\n\t * - \"UserProfile\" → \"user_profile_schema\"\n\t */\n\tpublic static toSchemaFileName(input: string): string {\n\t\tconst snake = this.toSnakeCase(input);\n\n\t\t// naive singularization (good enough for now)\n\t\tconst singular = snake.endsWith(\"s\") ? snake.slice(0, -1) : snake;\n\n\t\treturn `${singular}_schema`;\n\t}\n\n /**\n * Convert snake_case to Title Case\n */\n public static toTitleCase(input: string): string {\n return input\n .split(\"_\")\n .map(\n (word) =>\n word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join(\" \");\n }\n\n /**\n * Convert snake_case to PascalCase\n */\n public static toPascalCase(input: string): string {\n return input\n .split(\"_\")\n .map(\n (word) =>\n word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join(\"\");\n }\n\n /**\n * Convert string to snake_case\n */\n public static toSnakeCase(input: string): string {\n return input\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1_$2\")\n .toLowerCase();\n }\n\n /**\n * Pluralize a snake_case string\n */\n public static pluralizeSnakeCase(\n snake_str: string\n ): string {\n const parts = snake_str.split(\"_\");\n const last_word = parts.pop() as string;\n\n let plural_word: string;\n\n if (\n last_word.endsWith(\"y\") &&\n !/[aeiou]y$/.test(last_word)\n ) {\n plural_word = last_word.slice(0, -1) + \"ies\";\n } else if (\n [\"s\", \"x\", \"z\"].includes(last_word.slice(-1)) ||\n last_word.endsWith(\"ch\") ||\n last_word.endsWith(\"sh\")\n ) {\n plural_word = `${last_word}es`;\n } else {\n plural_word = `${last_word}s`;\n }\n\n return [...parts, plural_word].join(\"_\");\n }\n\n /**\n * Remove empty, null, or undefined fields from an object\n */\n public static filterOutEmptyFields(\n obj: Record<string, any>\n ): Record<string, any> {\n const filtered_object: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (\n value !== null &&\n value !== undefined &&\n !(typeof value === \"string\" && value.trim() === \"\") &&\n !(Array.isArray(value) && value.length === 0)\n ) {\n filtered_object[key] = value;\n }\n }\n\n return filtered_object;\n }\n\n /**\n * Safely parse JSON input\n */\n public static toJson<T = unknown>(\n json_input: string | unknown | null | undefined\n ): T | null {\n try {\n if (!json_input) {\n return null;\n }\n\n if (typeof json_input === \"string\") {\n return JSON.parse(json_input) as T;\n }\n\n if (typeof json_input === \"object\") {\n return json_input as T;\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n /**\n * Calculate pagination offset and limit\n */\n public static calculatePaginationOffset(\n page: number,\n size: number\n ): { limit: number; offset: number } {\n const page_number = page > 0 ? page - 1 : 0;\n const adjusted_size = size > 200 ? 200 : size;\n const limit = adjusted_size || 10;\n const offset = page_number * limit;\n\n return { limit, offset };\n }\n\n /**\n * Format paginated response\n */\n public static formatPaginatedResponse(\n page: number,\n limit: number,\n data: { rows: any[]; count: number }\n ): PaginationResultInterface {\n const { count: total_items, rows: records } = data;\n\n const current_page = page || 0;\n const total_pages = Math.ceil(total_items / limit);\n\n return {\n total_items,\n records,\n total_pages,\n current_page,\n };\n }\n\n /**\n * Compare two records and detect changes\n */\n public static detectChanges(\n old_record: Record<string, any> = {},\n new_record: Record<string, any> = {},\n keys_to_check?: string[]\n ): {\n readable: string;\n structured: Record<string, { old: any; new: any }>;\n } {\n const structured_diff: Record<\n string,\n { old: any; new: any }\n > = {};\n\n const all_keys =\n keys_to_check ?? Object.keys(new_record);\n\n for (const key of all_keys) {\n const old_value = old_record[key];\n const new_value = new_record[key];\n\n if (old_value == new_value) {\n continue;\n }\n\n const formatted_old =\n typeof old_value === \"object\" &&\n old_value !== null\n ? JSON.stringify(old_value)\n : String(old_value ?? \"null\");\n\n const formatted_new =\n typeof new_value === \"object\" &&\n new_value !== null\n ? JSON.stringify(new_value)\n : String(new_value ?? \"null\");\n\n structured_diff[key] = {\n old: formatted_old,\n new: formatted_new,\n };\n }\n\n const readable_changes = Object.entries(\n structured_diff\n )\n .map(\n ([key, value]) =>\n `${key} changed from '${value.old}' → '${value.new}'`\n )\n .join(\"; \");\n\n return {\n readable:\n readable_changes ||\n \"No significant changes detected\",\n structured: structured_diff,\n };\n }\n\n /**\n * Normalize social links object keys\n */\n public static formatLinksObject(\n links: Record<string, string>\n ): Record<string, string> {\n const formatted_links: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(links)) {\n const normalized_key = key\n .toLowerCase()\n .endsWith(\"_link\")\n ? key.toLowerCase()\n : `${key.toLowerCase()}_link`;\n\n formatted_links[normalized_key] = value;\n }\n\n return formatted_links;\n }\n}\n\nexport default InputTransformerUtil;\n","import fs from \"fs\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport isSameOrAfter from \"dayjs/plugin/isSameOrAfter\";\nimport bcrypt from \"bcrypt\";\nimport axios from \"axios\";\n// import speakeasy from \"speakeasy\";\n\nimport EnvManagerUtil from \"@/utils/env_manager_util\";\n\ndayjs.extend(isSameOrAfter);\n\nclass InputValidatorUtil {\n private static readonly optional_field_regex = /^[a-zA-Z0-9_\\-]+$/; \n private static readonly name_regex_reg_exp = /^[A-Za-z.'\\s/_-]*$/;\n private static readonly namey_regex_reg_exp = /^[A-Za-z0-9.'\\s,/_\\-()&]*$/;\n private static readonly email_regex_reg_exp = /^(?=.{1,255}$)[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,190}\\.[a-zA-Z]{2,}$/i;\n private static readonly tel_regex_reg_exp = /^[\\s()+-]*([0-9][\\s()+-]*){6,20}$/;\n private static readonly pass_regex_reg_exp = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{6,}$/\n private static readonly url_regex_reg_exp = /^(https?:\\/\\/)?((localhost|[a-zA-Z0-9-_.]+)(:[0-9]{1,5})?)(\\/[a-zA-Z0-9-._~:/?#@!$&'()*+,;=%]*)?$/;\n private static readonly text_area_regex_reg_exp = /^(?=.*[a-zA-Z])[\\p{L}\\p{N}\\p{P}\\p{Zs}–—“”‘’]*$/u;\n private static readonly uuid_regex_reg_exp = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n private static readonly custom_uuid_regex_reg_exp = /^[A-Z0-9]{12}-[A-Z0-9]{12}-[A-Z0-9]{12}-[A-Z0-9]{12}$/;\n private static readonly env_manager = EnvManagerUtil.getInstance();\n\n public static isValidateIn = (value: any, allowed: any[]) => allowed.includes(value);\n\n /** ✅ Check member roles */\n static isAdmin(name: string) { return [\"SuperAdmin\", \"AdminI\", \"AdminT\"].includes(name); }\n\n static isSuperAdmin(name: string) { return name === \"SuperAdmin\"; }\n\n static isLowerSnakeCase(str: string): boolean { return /^[a-z]+(_[a-z]+)*$/.test(str); }\n\n static isUpperPascalCase(str: string): boolean { return /^[A-Z][a-zA-Z]*$/.test(str); }\n\n static isEmpty(input: any): boolean { return !input || input.toString().trim() === \"\"; }\n\n static isValidOptionalField(str: string): boolean { return this.optional_field_regex.test(str); }\n\n static isValidName(name: string): boolean { return this.name_regex_reg_exp.test(name); }\n\n static isValidNamey(name: string): boolean { return this.namey_regex_reg_exp.test(name); }\n\n static isValidEmail(email: string): boolean { return this.email_regex_reg_exp.test(email) && email.length <= 254; }\n\n static isValidPhoneNumber(tel: string): boolean { return this.tel_regex_reg_exp.test(tel); }\n\n static isValidPassword(password: string): boolean { return this.pass_regex_reg_exp.test(password); }\n\n static isDigit(input: any): boolean { return !isNaN(input); }\n\n static isValidInteger(input: any): boolean { return Number.isInteger(input) && input > 0; }\n\n static isValidFloat(input: any): boolean { return !isNaN(input) && parseFloat(input) > 0; }\n\n static isValidURLY(url: string): boolean {\n try { \n new URL(url);\n return true;\n } \n catch (_) { return false; }\n }\n\n static isValidURL(url: string): boolean { return this.url_regex_reg_exp.test(url) && this.isValidURLY(url); }\n\n static isBoolean(value: any): boolean { return typeof value === \"boolean\" || [\"1\", \"0\"].includes(String(value)); }\n\n static isValidLongText(text: string): boolean {\n if (!text || typeof text !== \"string\") { return false; }\n\n const forbidden_pattern = /[<>{};`]/;\n\n if (forbidden_pattern.test(text)) { return false; }\n \n return this.text_area_regex_reg_exp.test(text.trim());\n }\n\n static isValidUUID(uuid: string): boolean { return this.uuid_regex_reg_exp.test(uuid); }\n \n static isValidCustomUUID(uuid: string): boolean { return this.custom_uuid_regex_reg_exp.test(uuid); }\n \n static isArrayUnique(arr: any[]): boolean { return new Set(arr).size === arr.length; }\n \n static isValidFutureDate(date_string: string): boolean {\n const date = dayjs(date_string);\n\n return date.isValid() && date.isAfter(dayjs());\n }\n\n static isValidDateAndDifference(\n input?: string | null,\n unit: \"years\" | \"days\" | \"hours\" | \"minutes\" | \"seconds\" = \"years\"\n ): { date: Dayjs; difference: number } | null {\n if(!input) { return null }\n \n const date = dayjs(input);\n\n // Check validity\n if (!date.isValid()) { return null; }\n\n // Compute difference between now and the input date\n return { date, difference: dayjs().diff(date, unit) };\n }\n\n /** ✅ Validate password hash */\n static async isValidHashPassword(password: string, hash_password: string): Promise<boolean> { \n if(!password || !hash_password) { return false }\n\n return await bcrypt.compare(password, hash_password); \n }\n\n /** ✅ Check environment */\n static isProduction() { return InputValidatorUtil?.env_manager?.env_data?.MODE === \"production\"; }\n\n static isStaging() { return InputValidatorUtil?.env_manager?.env_data?.MODE === \"staging\"; }\n\n static isDevelopment() { return InputValidatorUtil?.env_manager?.env_data?.MODE === \"development\"; }\n\n static isLive() { return [\"production\", \"staging\"].includes(InputValidatorUtil?.env_manager?.env_data?.MODE || \"\"); }\n\n /** ✅ Validate ReCaptcha */\n static async isValidReCaptcha(\n recpatcha_token: string\n ) {\n const {\n RECAPTCHA_SECRET_KEY,\n RECPATHA_VERIFY_URL\n } = InputValidatorUtil?.env_manager?.env_data\n try {\n const secret_key = RECAPTCHA_SECRET_KEY\n const url = RECPATHA_VERIFY_URL;\n const params = { secret: secret_key, response: recpatcha_token }\n const response = await axios.post(url!, null, { params });\n\n return response.data.success;\n } \n catch (error) {\n console.error(\"reCAPTCHA verification failed:\", error);\n return false;\n }\n }\n\n // Method to check if a directory exists\n\tstatic dirExists (\n directory: string, \n create_directory: boolean = false, \n return_dir_path: boolean = false\n ): boolean | string { \n const exist = fs.existsSync(directory); \n\n if(!create_directory) { return exist }\n\n if (!exist) { fs.mkdirSync(directory); }\n\n return return_dir_path ? directory : true;\n }\n\n}\n\nexport default InputValidatorUtil;","import fs from \"fs\";\nimport path from \"path\";\nimport yaml from \"js-yaml\";\nimport axios from \"axios\";\n\nimport LoggerUtil from \"./logger_util\";\nimport { EnvConfigInterface } from \"@/types/util_type\";\nimport { ENV_VAR_DIR } from \"@/config/constants\";\n\nclass EnvManagerUtil {\n public readonly name = \"env_manager_util\";\n public env_file_name: string = \"env.yaml\";\n\n private static instance: EnvManagerUtil;\n\n private readonly yaml_env_file_path: string;\n private readonly logger: LoggerUtil;\n\n public env_data: EnvConfigInterface;\n\n // 🔒 Private constructor\n private constructor() {\n this.env_file_name = this.getEnvFileName();\n this.yaml_env_file_path = path.join(ENV_VAR_DIR, this.env_file_name);\n this.logger = new LoggerUtil(this.name);\n this.env_data = this.readENVData();\n }\n\n // Method to get env file name\n private getEnvFileName (): string {\n if (process?.env?.MODE === \"development\") { return \"env.yaml\" }\n\n else if (process?.env?.MODE === \"staging\") { return \"staging_env.yaml\" }\n\n else if (process?.env?.MODE === \"production\") { return \"production_env.yaml\" }\n\n else { return \"env.yaml\" }\n }\n\n // ✅ Global access point\n public static getInstance(): EnvManagerUtil {\n if (!EnvManagerUtil.instance) {\n EnvManagerUtil.instance = new EnvManagerUtil();\n }\n return EnvManagerUtil.instance;\n }\n\n // Read environment data from YAML\n private readENVData(): EnvConfigInterface {\n try {\n if (!fs.existsSync(this.yaml_env_file_path)) {\n this.logger.info(`YAML file not found at: ${this.yaml_env_file_path}`);\n return {};\n }\n\n const file_content = fs.readFileSync(this.yaml_env_file_path, \"utf8\");\n return (yaml.load(file_content) as EnvConfigInterface) || {};\n } catch (error: unknown) {\n this.logger.error(`${this.name} - readENVData`, { error });\n return {};\n }\n }\n\n // Get env var from YAML → process.env → default \n public getEnvVar<T = any>(key: string, default_value?: T): T | undefined {\n if (key in this.env_data) { return this.env_data[key]; }\n\n if (key in process.env) { return process.env[key] as T; }\n\n return default_value;\n }\n\n // Fetch remote env variables and merge\n public async fetchRemoteEnv(url: string): Promise<void> {\n try {\n const response = await axios.get(url);\n\n if (typeof response.data === \"object\" && response.data !== null) {\n this.env_data = { ...this.env_data, ...response.data };\n this.logger.success(\"Remote env variables loaded.\");\n } else {\n this.logger.error(\"Unexpected response format from remote env endpoint.\");\n }\n } catch (error: unknown) {\n this.logger.error(`${this.name} - fetchRemoteEnv`, { error });\n }\n }\n}\n\nexport default EnvManagerUtil;\n","class SqlFormatterUtil {\n\n // Basic ANSI color helpers\n private static AnsiColor = {\n reset: \"\\x1b[0m\",\n cyan: (text: string) => `\\x1b[36m${text}\\x1b[0m`,\n green: (text: string) => `\\x1b[32m${text}\\x1b[0m`,\n yellow: (text: string) => `\\x1b[33m${text}\\x1b[0m`,\n red: (text: string) => `\\x1b[31m${text}\\x1b[0m`,\n };\n\n private static sqlColors: Record<string, (text: string) => string> = {\n SELECT: SqlFormatterUtil.AnsiColor.cyan,\n INSERT: SqlFormatterUtil.AnsiColor.green,\n UPDATE: SqlFormatterUtil.AnsiColor.yellow,\n DELETE: SqlFormatterUtil.AnsiColor.red,\n };\n\n /**\n * Normalize SQL:\n * - Collapse multiple whitespaces/newlines\n * - Remove extra spaces inside parentheses\n */\n public static normalize(sql: string): string {\n return sql\n .replace(/\\s+/g, \" \")\n .replace(/\\(\\s+/g, \"(\")\n .replace(/\\s+\\)/g, \")\")\n .trim();\n }\n\n /**\n * Colorize SQL keywords (SELECT, INSERT, UPDATE, DELETE)\n */\n public static colorize(sql: string): string {\n const first_word = sql.split(\" \")[0].toUpperCase();\n const colorFN = this.sqlColors[first_word];\n \n return colorFN ? colorFN(sql) : sql;\n }\n\n /**\n * Full formatting for logging\n */\n public static format(sql: string): string {\n return this.colorize(this.normalize(sql));\n }\n}\n\nexport default SqlFormatterUtil;\n","import { Server } from \"http\";\nimport { LoggerUtil } from \"@/utils\"\nimport { ServerErrorInterface } from \"@/types\";\n\nclass ServerUtil {\n public readonly name: string = \"server_util\";\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);\n private readonly port: number;\n\n constructor(port: number) {\n this.port = port || 4000;\n }\n\n // Method to print app banner\n private printAppBanner (app_name: string): void {\n const raw = app_name.replace(/[-_]/g, \" \");\n const title = raw.toUpperCase();\n const border_char = \"═\";\n const corner_tl = \"╔\";\n const corner_tr = \"╗\";\n const corner_bl = \"╚\";\n const corner_br = \"╝\";\n const side_char = \"║\";\n const padding = 4;\n const content_width = title.length + padding * 2;\n const border = border_char.repeat(content_width);\n\n const line1 = `${corner_tl}${border}${corner_tr}`;\n const line2 = `${side_char} ${\" \".repeat(padding)}${title}${\" \".repeat(padding)}${side_char} `;\n const line3 = `${corner_bl}${border}${corner_br} `;\n\n console.log(\"\\n\" + line1);\n console.log(line2);\n console.log(line3 + \"\\n\");\n }\n\n // Method to handle server errors\n public onServerError (error: ServerErrorInterface): void {\n if (error.syscall !== \"listen\") { \n this.logger.error(\"Unexpected server error\", { error });\n throw error; \n }\n\n const bind = `Port ${this.port}`;\n\n switch (error.code) {\n case \"EACCES\":\n this.logger.error(`${bind} requires elevated privileges`);\n process.exit(1);\n break;\n case \"EADDRINUSE\":\n this.logger.error(`${bind} is already in use`);\n process.exit(1);\n break;\n default:\n throw error;\n }\n }\n\n // Method to handle server listening\n public onServerListening = (server: Server): void => {\n this.printAppBanner(\"fibase-server-app\");\n\n const addr = server.address();\n const bind = typeof addr === \"string\" ? `pipe ${addr}` : `port ${addr?.port}`;\n\n this.logger.info(`Listening on ${bind}`);\n }\n}\n\nexport default ServerUtil;","\nimport { Response } from \"express\";\n\nimport { LoggerUtil } from \"@/utils\";\nimport { ErrorHandlingStrategyEnum } from \"@/types/util_type\";\n\n\n\nclass SafeExecuteUtil {\n // Store instances by class constructor (WeakMap ensures GC can clean up)\n private static instances = new WeakMap<object, any>();\n\n // Store instances by string keys (Map keeps strong references)\n private static named_insatnces = new Map<string, any>();\n\n public static setInstance(key: object, instance: any) {\n SafeExecuteUtil.instances.set(key, instance);\n }\n\n /** Set instance by string key */\n public static setNamedInstance(key: string, instance: any) {\n SafeExecuteUtil.named_insatnces.set(key, instance);\n }\n\n private static getInstance(key: object, fallback: any) {\n return SafeExecuteUtil.instances.get(key) ?? fallback;\n }\n\n /** Get instance by string key */\n public static getNamedInstance(key: string, fallback?: any) {\n return SafeExecuteUtil.named_insatnces.get(key) ?? fallback;\n }\n\n // Method to Safely stringify any object for logging\n private static safeStringify(obj: unknown): string {\n try { return JSON.stringify(obj); }\n catch { return \"[Unserializable Params]\"; }\n }\n\n // 🔹 Method to Execution time logger\n private static logExecutionTime(\n start: [number, number], \n class_name: string, \n method_name: string, \n logger: LoggerUtil\n ) {\n const [seconds, nanoseconds] = process.hrtime(start);\n const ms = (seconds * 1000 + nanoseconds / 1e6).toFixed(2);\n\n logger.info(`[${class_name}] ⏱️ ${method_name} executed in ${ms}ms`);\n }\n\n // Method to handle on error action\n private static handleOnErrorAction (\n error: unknown, \n strategy: ErrorHandlingStrategyEnum, \n default_value: any, \n controller_response?: Response\n ) {\n if (strategy === ErrorHandlingStrategyEnum.CONTROLLER_ERROR && controller_response?.errResponse) {\n return controller_response?.errResponse?.(500, \"invalid_error_request\");\n }\n switch (strategy) {\n case ErrorHandlingStrategyEnum.RETURN_DEFAULT: return default_value;\n case ErrorHandlingStrategyEnum.EXIT_PROCESS: process.exit(1);\n case ErrorHandlingStrategyEnum.THROW_ERROR: throw error;\n } \n \n return;\n }\n\n // 🔹 Method to Unifysafe execution wrapper (normal methods)\n public static createSafeFunction<T>(\n class_name: string,\n method_name: string,\n original_method: (...args: any[]) => T | Promise<T>,\n strategy: ErrorHandlingStrategyEnum,\n default_value?: T,\n ): (...args: any[]) => Promise<T | undefined> {\n return async function (this: any, ...args: any[]): Promise<T | undefined> {\n const class_instance = SafeExecuteUtil.getNamedInstance(class_name, this);\n const logger: LoggerUtil = class_instance?.logger || new LoggerUtil(class_name);\n const method_params = args;\n\n try {\n return await original_method.apply(class_instance, method_params);\n } \n catch (error: unknown) {\n const safely_stringified_error = SafeExecuteUtil.safeStringify(error);\n logger.error(`[${class_name}] ❌ Error in method ${method_name}`, { method_params, error, safely_stringified_error});\n SafeExecuteUtil.handleOnErrorAction(error, strategy, default_value); \n }\n };\n }\n\n // 🔹 Unified safe execution wrapper with timing (for controller/service)\n private static createTimedSafeFunction<T>(\n class_name: string,\n method_name: string,\n original_method: (...args: any[]) => T | Promise<T>,\n strategy: ErrorHandlingStrategyEnum,\n default_value?: T,\n ): (...args: any[]) => Promise<T | undefined> {\n return async function (this: any, ...args: any[]): Promise<T | undefined> {\n const class_instance = SafeExecuteUtil.getNamedInstance(class_name, this);\n const logger: LoggerUtil = class_instance?.logger || new LoggerUtil(class_name);\n const start_time = process.hrtime();\n const method_params = args;\n const controller_response = args && args.length ? args[1] : undefined;\n\n try {\n const result = await original_method.apply(class_instance, args);\n return result\n } \n catch (error: unknown) {\n const safely_stringified_error = SafeExecuteUtil.safeStringify(error);\n logger.error(`[${class_name}] ❌ Error in method ${method_name}`, { method_params, error, safely_stringified_error});\n SafeExecuteUtil.handleOnErrorAction(error, strategy, default_value, controller_response); \n } \n finally { \n SafeExecuteUtil.logExecutionTime(start_time, class_name, method_name, logger); \n }\n }\n };\n\n // Decorator Method to handle wrapping cclass methods\n private static applySafeWrapper(\n target: Object, \n class_name: string,\n property_key: string | symbol, \n descriptor: PropertyDescriptor,\n strategy: ErrorHandlingStrategyEnum,\n timed: boolean,\n default_value?: any,\n ) {\n if (typeof descriptor.value !== \"function\") { return; }\n\n descriptor.value = timed ? \n SafeExecuteUtil.createTimedSafeFunction(\n class_name,\n String(property_key), \n descriptor.value, \n strategy,\n default_value,\n )\n :\n SafeExecuteUtil.createSafeFunction(\n class_name,\n String(property_key), \n descriptor.value, \n strategy,\n default_value\n )\n }\n\n // Decorator method to handle controller methods\n public static safeExecuteController(\n class_name: string\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.CONTROLLER_ERROR,\n true\n );\n }\n }\n\n // Decorator Method to handle service methods\n public static safeExecuteService(\n class_name: string, \n default_value?: any\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT, \n true,\n default_value\n )\n }\n }\n\n // Decorator Method to wrap method with retrun value\n public static safeExecuteReturn<T = any>(\n class_name: string, \n default_value?: T\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT,\n false,\n default_value\n )\n }\n }\n\n // Decorator Method to wrap method with retrun value\n public static safeExecuteTransaction<T = any>(\n class_name: string, \n default_value?: T\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT, \n false,\n default_value\n )\n }\n }\n\n // Decorator method to wrap method with void return\n public static safeExecute(class_name: string) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT,\n false\n );\n }\n }\n \n // Decorator method to wrap method with void return\n public static safeExecuteExit(class_name: string) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.EXIT_PROCESS,\n false\n );\n }\n }\n\n // Decorator method to wrap method with void return\n public static safeExecuteThrow(class_name: string) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.THROW_ERROR,\n false\n );\n }\n }\n\n\n}\n\nexport default SafeExecuteUtil;","type CacheEntry<T> = {\n value: T;\n expires_at: number; // unix ms timestamp\n};\n\nclass InMemoryCache<T = unknown> {\n private store = new Map<string, CacheEntry<T>>();\n\n /**\n * Set a cache value with TTL (ms)\n */\n public set(key: string, value: T, ttl_ms: number): void {\n if (!key) return;\n\n const expires_at = Date.now() + ttl_ms;\n this.store.set(key, { value, expires_at });\n }\n\n /**\n * Get a cache value (returns undefined if missing or expired)\n */\n public get(key: string): T | undefined {\n const entry = this.store.get(key);\n\n if (!entry) return undefined;\n\n if (Date.now() > entry.expires_at) {\n this.store.delete(key);\n return undefined;\n }\n\n return entry.value;\n }\n\n /**\n * Check if a key exists and is valid\n */\n public has(key: string): boolean {\n return this.get(key) !== undefined;\n }\n\n /**\n * Update an existing cache entry (keeps old TTL)\n */\n public update(key: string, value: T): boolean {\n const entry = this.store.get(key);\n\n if (!entry) return false;\n\n if (Date.now() > entry.expires_at) {\n this.store.delete(key);\n return false;\n }\n\n this.store.set(key, { ...entry, value });\n return true;\n }\n\n /**\n * Delete a single cache entry\n */\n public delete(key: string): boolean {\n return this.store.delete(key);\n }\n\n /**\n * Clear entire cache\n */\n public clear(): void {\n this.store.clear();\n }\n\n /**\n * Manually expire a key immediately\n */\n public expire(key: string): void {\n this.store.delete(key);\n }\n\n /**\n * Cleanup expired entries (optional call)\n */\n public cleanup(): void {\n const now = Date.now();\n for (const [key, entry] of this.store.entries()) {\n if (now > entry.expires_at) {\n this.store.delete(key);\n }\n }\n }\n\n /**\n * Cache size (for metrics)\n */\n public size(): number {\n return this.store.size;\n }\n}\n\nexport default InMemoryCache;\n"],"mappings":"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","names":["path","path","fs","dayjs","bcrypt","axios","fs","path","axios","path","fs","axios","dayjs","bcrypt","axios","fs"]}
|
package/dist/database/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SchemaSnapshotInterface, SchemaDiffInterface, SchemaDefinitionInterface, MigrationOperationTypes, SeederOperationTypes } from '../
|
|
1
|
+
import { e as SchemaSnapshotInterface, d as SchemaDiffInterface, c as SchemaDefinitionInterface, M as MigrationOperationTypes, f as SeederOperationTypes } from '../migration_type-XLMG0zzO.js';
|
|
2
2
|
import { E as EnvManagerUtil, L as LoggerUtil } from '../env_manager_util-DLs1b9Q7.js';
|
|
3
3
|
import { Sequelize } from 'sequelize';
|
|
4
4
|
import '../util_type-Yyo1nXmm.js';
|
package/dist/database/index.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { ColumnDiffInterface, IndexDiffInterface, IndexFieldOptionsInterface, MigrationOperationTypes, MigrationRecordInterface, SchemaColumnInterface, SchemaDefinitionInterface, SchemaDiffInterface, SchemaSnapshotInterface, SeederOperationTypes } from './
|
|
1
|
+
export { C as ColumnDiffInterface, I as IndexDiffInterface, a as IndexFieldOptionsInterface, M as MigrationOperationTypes, b as MigrationRecordInterface, S as SchemaColumnInterface, c as SchemaDefinitionInterface, d as SchemaDiffInterface, e as SchemaSnapshotInterface, f as SeederOperationTypes } from './migration_type-XLMG0zzO.js';
|
|
2
2
|
export { C as CountLookupItemInterface, E as EnvConfigInterface, a as ErrorHandlingStrategyEnum, L as LogEntryInterface, b as LogLevelType, P as PaginationResultInterface, S as ServerErrorInterface } from './util_type-Yyo1nXmm.js';
|
|
3
|
+
export { C as CookieManagerOptions, a as CorsOptions, b as CorsOriginResolver, F as ForceHTTPSOptions, R as RateLimitRecord, c as RateLimiterOptions, d as ResponseFormatterOptions, S as SecureHeadersOptions } from './middle_ware_type-D8LA7qF3.js';
|
|
3
4
|
import 'sequelize';
|
|
@@ -1,43 +1,5 @@
|
|
|
1
|
-
import { Request
|
|
2
|
-
|
|
3
|
-
type CorsOriginResolver = ((origin?: string) => boolean | Promise<boolean>) | (() => Promise<string[]>);
|
|
4
|
-
interface CorsOptions {
|
|
5
|
-
origins?: string[];
|
|
6
|
-
origin_resolver?: CorsOriginResolver;
|
|
7
|
-
methods?: string[];
|
|
8
|
-
headers?: string[];
|
|
9
|
-
credentials?: boolean;
|
|
10
|
-
max_age?: number;
|
|
11
|
-
allow_null_origin?: boolean;
|
|
12
|
-
}
|
|
13
|
-
interface RateLimiterOptions {
|
|
14
|
-
window_ms?: number;
|
|
15
|
-
max_requests?: number;
|
|
16
|
-
message?: string;
|
|
17
|
-
key_generator?: (req: Request) => string;
|
|
18
|
-
}
|
|
19
|
-
interface CookieManagerOptions {
|
|
20
|
-
request_id_max_age?: number;
|
|
21
|
-
request_id_generator?: () => string;
|
|
22
|
-
}
|
|
23
|
-
interface ForceHTTPSOptions {
|
|
24
|
-
enabled?: boolean;
|
|
25
|
-
redirect_status?: number | 301 | 302 | 307 | 308;
|
|
26
|
-
trust_proxy?: boolean;
|
|
27
|
-
}
|
|
28
|
-
interface SecureHeadersOptions {
|
|
29
|
-
enabled?: boolean;
|
|
30
|
-
HSTS_enabled?: boolean;
|
|
31
|
-
HSTS_max_age?: number;
|
|
32
|
-
frame_options?: "DENY" | "SAMEORIGIN";
|
|
33
|
-
xss_protection?: boolean;
|
|
34
|
-
content_type_options?: boolean;
|
|
35
|
-
referrer_policy?: string;
|
|
36
|
-
content_security_policy?: Record<string, string[]>;
|
|
37
|
-
HSTS_Extras?: string;
|
|
38
|
-
cors_policy?: string;
|
|
39
|
-
cors_opener_policy?: string;
|
|
40
|
-
}
|
|
1
|
+
import { Request, Response, NextFunction } from 'express';
|
|
2
|
+
import { C as CookieManagerOptions, a as CorsOptions, c as RateLimiterOptions, F as ForceHTTPSOptions, S as SecureHeadersOptions, d as ResponseFormatterOptions } from '../middle_ware_type-D8LA7qF3.js';
|
|
41
3
|
|
|
42
4
|
declare class CookieManagerMiddleWare {
|
|
43
5
|
private name;
|
|
@@ -48,7 +10,7 @@ declare class CookieManagerMiddleWare {
|
|
|
48
10
|
constructor(options?: CookieManagerOptions);
|
|
49
11
|
private getDefaultCookieOptions;
|
|
50
12
|
/** Get cookie value safely */
|
|
51
|
-
get(req: Request
|
|
13
|
+
get(req: Request, name: string): string | undefined;
|
|
52
14
|
/** Set cookie with enforced defaults */
|
|
53
15
|
set(res: Response, name: string, value: string, options?: {
|
|
54
16
|
max_age?: number;
|
|
@@ -56,7 +18,7 @@ declare class CookieManagerMiddleWare {
|
|
|
56
18
|
/** Clear cookie */
|
|
57
19
|
clear(res: Response, name: string): void;
|
|
58
20
|
/** Middleware */
|
|
59
|
-
|
|
21
|
+
middleWare(req: Request, res: Response, next: NextFunction): Promise<void | Response>;
|
|
60
22
|
}
|
|
61
23
|
|
|
62
24
|
declare class CorsMiddleWare {
|
|
@@ -73,8 +35,8 @@ declare class CorsMiddleWare {
|
|
|
73
35
|
constructor(options?: CorsOptions);
|
|
74
36
|
private resolveAllowedOrigins;
|
|
75
37
|
private isValidOrigin;
|
|
76
|
-
getRequestOrigin(req: Request
|
|
77
|
-
|
|
38
|
+
getRequestOrigin(req: Request): Promise<string>;
|
|
39
|
+
middleWare(req: Request, res: Response, next: NextFunction): Promise<void | Response>;
|
|
78
40
|
}
|
|
79
41
|
|
|
80
42
|
declare class RateLimiterMiddleWare {
|
|
@@ -88,7 +50,7 @@ declare class RateLimiterMiddleWare {
|
|
|
88
50
|
constructor(options?: RateLimiterOptions);
|
|
89
51
|
private generateRequestIdentitfier;
|
|
90
52
|
private getResetSeconds;
|
|
91
|
-
|
|
53
|
+
middleWare(req: Request, res: Response, next: NextFunction): Promise<void | Response>;
|
|
92
54
|
}
|
|
93
55
|
|
|
94
56
|
declare class HTTPSEnforcementMiddleWare {
|
|
@@ -98,7 +60,7 @@ declare class HTTPSEnforcementMiddleWare {
|
|
|
98
60
|
private readonly redirect_status?;
|
|
99
61
|
private readonly trust_proxy?;
|
|
100
62
|
constructor(options?: ForceHTTPSOptions);
|
|
101
|
-
|
|
63
|
+
middleWare(req: Request, res: Response, next: NextFunction): Promise<void | Response>;
|
|
102
64
|
}
|
|
103
65
|
|
|
104
66
|
declare class SecureHeadersMiddleWare {
|
|
@@ -118,14 +80,27 @@ declare class SecureHeadersMiddleWare {
|
|
|
118
80
|
constructor(options?: SecureHeadersOptions);
|
|
119
81
|
private getDefaultContentSecurityPolicy;
|
|
120
82
|
private getContentSecurityPolicyString;
|
|
121
|
-
middleware(req: Request
|
|
83
|
+
middleware(req: Request, res: Response, next: NextFunction): Promise<void | Response>;
|
|
122
84
|
}
|
|
123
85
|
|
|
124
86
|
declare class RequestLoggerMiddleWare {
|
|
125
87
|
private name;
|
|
126
88
|
private logger;
|
|
127
89
|
constructor();
|
|
128
|
-
middleware(req: Request
|
|
90
|
+
middleware(req: Request, res: Response, next: NextFunction): Promise<void | Response>;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
declare class ResponseFormatterMiddleWare {
|
|
94
|
+
private readonly name;
|
|
95
|
+
private readonly logger;
|
|
96
|
+
private readonly include_request_id;
|
|
97
|
+
private readonly default_success_message;
|
|
98
|
+
private readonly default_error_message;
|
|
99
|
+
private readonly default_info_message;
|
|
100
|
+
private readonly default_not_found_message;
|
|
101
|
+
constructor(options?: ResponseFormatterOptions);
|
|
102
|
+
handleGeneralError: (error: unknown, req: Request, res: Response, _next: NextFunction) => Response;
|
|
103
|
+
responseFormatterMiddleWare(req: Request, res: Response, next: NextFunction): void;
|
|
129
104
|
}
|
|
130
105
|
|
|
131
|
-
export { CookieManagerMiddleWare, CorsMiddleWare, HTTPSEnforcementMiddleWare, RateLimiterMiddleWare, RequestLoggerMiddleWare, SecureHeadersMiddleWare };
|
|
106
|
+
export { CookieManagerMiddleWare, CorsMiddleWare, HTTPSEnforcementMiddleWare, RateLimiterMiddleWare, RequestLoggerMiddleWare, ResponseFormatterMiddleWare, SecureHeadersMiddleWare };
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
input_validator_util_default,
|
|
10
10
|
logger_util_default,
|
|
11
11
|
safe_execute_util_default
|
|
12
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-SI4SUH2O.js";
|
|
13
13
|
import {
|
|
14
14
|
__decorateClass
|
|
15
15
|
} from "../chunk-6AJLW7HC.js";
|
|
@@ -49,7 +49,7 @@ var CookieManagerMiddleWare = class {
|
|
|
49
49
|
clear(res, name) {
|
|
50
50
|
res.clearCookie(name, this.default_cookie_options);
|
|
51
51
|
}
|
|
52
|
-
|
|
52
|
+
async middleWare(req, res, next) {
|
|
53
53
|
req.getCookie = (name) => this.get(req, name);
|
|
54
54
|
req.setCookie = (name, value, options = {}) => this.set(res, name, value, options);
|
|
55
55
|
req.clearCookie = (name) => this.clear(res, name);
|
|
@@ -62,12 +62,12 @@ var CookieManagerMiddleWare = class {
|
|
|
62
62
|
}
|
|
63
63
|
this.logger.info(`[REQ:${request_id}] ${req.method} ${req.originalUrl}`);
|
|
64
64
|
req.request_id = request_id;
|
|
65
|
-
next();
|
|
65
|
+
return next();
|
|
66
66
|
}
|
|
67
67
|
};
|
|
68
68
|
__decorateClass([
|
|
69
69
|
safe_execute_util_default.safeExecuteThrow("cookie_manager_middle_ware")
|
|
70
|
-
], CookieManagerMiddleWare.prototype, "
|
|
70
|
+
], CookieManagerMiddleWare.prototype, "middleWare", 1);
|
|
71
71
|
var cookie_manager_middle_ware_default = CookieManagerMiddleWare;
|
|
72
72
|
|
|
73
73
|
// src/middle_ware/cors_middle_ware.ts
|
|
@@ -131,7 +131,7 @@ var CorsMiddleWare = class {
|
|
|
131
131
|
}
|
|
132
132
|
return `${protocol}://${req?.get("host")}`;
|
|
133
133
|
}
|
|
134
|
-
async
|
|
134
|
+
async middleWare(req, res, next) {
|
|
135
135
|
const origin = await this.getRequestOrigin(req);
|
|
136
136
|
const is_allowed = await this.isValidOrigin(origin);
|
|
137
137
|
res.setHeader("Vary", "Origin");
|
|
@@ -151,7 +151,7 @@ var CorsMiddleWare = class {
|
|
|
151
151
|
if (req.method === "OPTIONS") {
|
|
152
152
|
return res.sendStatus(204);
|
|
153
153
|
}
|
|
154
|
-
next();
|
|
154
|
+
return next();
|
|
155
155
|
}
|
|
156
156
|
};
|
|
157
157
|
__decorateClass([
|
|
@@ -165,7 +165,7 @@ __decorateClass([
|
|
|
165
165
|
], CorsMiddleWare.prototype, "getRequestOrigin", 1);
|
|
166
166
|
__decorateClass([
|
|
167
167
|
safe_execute_util_default.safeExecuteThrow("cors_middle_ware")
|
|
168
|
-
], CorsMiddleWare.prototype, "
|
|
168
|
+
], CorsMiddleWare.prototype, "middleWare", 1);
|
|
169
169
|
var cors_middle_ware_default = CorsMiddleWare;
|
|
170
170
|
|
|
171
171
|
// src/middle_ware/rate_limiter_middle_ware.ts
|
|
@@ -194,7 +194,7 @@ var RateLimiterMiddleWare = class {
|
|
|
194
194
|
getResetSeconds(expires_at) {
|
|
195
195
|
return Math.max(Math.ceil((expires_at - Date.now()) / 1e3), 0);
|
|
196
196
|
}
|
|
197
|
-
|
|
197
|
+
async middleWare(req, res, next) {
|
|
198
198
|
const key = this.key_generator(req);
|
|
199
199
|
const now = Date.now();
|
|
200
200
|
let record = this.cache.get(key);
|
|
@@ -226,12 +226,12 @@ var RateLimiterMiddleWare = class {
|
|
|
226
226
|
}
|
|
227
227
|
});
|
|
228
228
|
}
|
|
229
|
-
next();
|
|
229
|
+
return next();
|
|
230
230
|
}
|
|
231
231
|
};
|
|
232
232
|
__decorateClass([
|
|
233
233
|
safe_execute_util_default.safeExecuteThrow("rate_limiter_middle_ware")
|
|
234
|
-
], RateLimiterMiddleWare.prototype, "
|
|
234
|
+
], RateLimiterMiddleWare.prototype, "middleWare", 1);
|
|
235
235
|
var rate_limiter_middle_ware_default = RateLimiterMiddleWare;
|
|
236
236
|
|
|
237
237
|
// src/middle_ware/https_enforcement_middle_ware.ts
|
|
@@ -247,7 +247,7 @@ var HTTPSEnforcementMiddleWare = class {
|
|
|
247
247
|
this.trust_proxy = options.trust_proxy ?? true;
|
|
248
248
|
safe_execute_util_default.setNamedInstance(this.name, this);
|
|
249
249
|
}
|
|
250
|
-
async
|
|
250
|
+
async middleWare(req, res, next) {
|
|
251
251
|
if (!this.enabled) {
|
|
252
252
|
return next();
|
|
253
253
|
}
|
|
@@ -259,12 +259,12 @@ var HTTPSEnforcementMiddleWare = class {
|
|
|
259
259
|
const url = req.originalUrl;
|
|
260
260
|
const redirect_status = this.redirect_status || 301;
|
|
261
261
|
this.logger.alert(`Redirecting HTTP \u2192 HTTPS: ${url}`);
|
|
262
|
-
res.redirect(redirect_status, `https://${host}${url}`);
|
|
262
|
+
return res.redirect(redirect_status, `https://${host}${url}`);
|
|
263
263
|
}
|
|
264
264
|
};
|
|
265
265
|
__decorateClass([
|
|
266
266
|
safe_execute_util_default.safeExecuteThrow("https_enforcement_middle_ware")
|
|
267
|
-
], HTTPSEnforcementMiddleWare.prototype, "
|
|
267
|
+
], HTTPSEnforcementMiddleWare.prototype, "middleWare", 1);
|
|
268
268
|
var https_enforcement_middle_ware_default = HTTPSEnforcementMiddleWare;
|
|
269
269
|
|
|
270
270
|
// src/middle_ware/secure_headers_middle_ware.ts
|
|
@@ -340,7 +340,7 @@ var SecureHeadersMiddleWare = class {
|
|
|
340
340
|
if (this.HSTS_enabled) {
|
|
341
341
|
res.setHeader("Strict-Transport-Security", `max-age=${this.HSTS_max_age}; ${this.HSTS_Extras}`);
|
|
342
342
|
}
|
|
343
|
-
next();
|
|
343
|
+
return next();
|
|
344
344
|
}
|
|
345
345
|
};
|
|
346
346
|
__decorateClass([
|
|
@@ -367,19 +367,71 @@ var RequestLoggerMiddleWare = class {
|
|
|
367
367
|
this.logger.info(`[${this.name}] Device ID: ${device_id}, Device Name: ${device_name}`);
|
|
368
368
|
this.logger.info(`[${this.name}] Request ID: ${request_id}, IP: ${ip}`);
|
|
369
369
|
this.logger.info(`[${this.name}] User-Agent: ${user_agent}`);
|
|
370
|
-
next();
|
|
370
|
+
return next();
|
|
371
371
|
}
|
|
372
372
|
};
|
|
373
373
|
__decorateClass([
|
|
374
374
|
safe_execute_util_default.safeExecuteThrow("request_logger_middle_ware")
|
|
375
375
|
], RequestLoggerMiddleWare.prototype, "middleware", 1);
|
|
376
376
|
var request_logger_middle_ware_default = RequestLoggerMiddleWare;
|
|
377
|
+
|
|
378
|
+
// src/middle_ware/response_formatter_middle_ware.ts
|
|
379
|
+
var ResponseFormatterMiddleWare = class {
|
|
380
|
+
name = "response_formatter_middle_ware";
|
|
381
|
+
logger = new logger_util_default(this.name);
|
|
382
|
+
include_request_id;
|
|
383
|
+
default_success_message;
|
|
384
|
+
default_error_message;
|
|
385
|
+
default_info_message;
|
|
386
|
+
default_not_found_message;
|
|
387
|
+
constructor(options = {}) {
|
|
388
|
+
this.include_request_id = options.include_request_id ?? true;
|
|
389
|
+
this.default_success_message = options.default_success_message ?? "operation_successful";
|
|
390
|
+
this.default_error_message = options.default_error_message ?? "server_error";
|
|
391
|
+
this.default_info_message = options.default_info_message ?? "operation_information";
|
|
392
|
+
this.default_not_found_message = options.default_not_found_message ?? "invalid_request_resource_not_found";
|
|
393
|
+
safe_execute_util_default.setNamedInstance(this.name, this);
|
|
394
|
+
}
|
|
395
|
+
// -------------------------
|
|
396
|
+
// Express error middleware
|
|
397
|
+
// -------------------------
|
|
398
|
+
handleGeneralError = (error, req, res, _next) => {
|
|
399
|
+
const is_development = input_validator_util_default.isDevelopment();
|
|
400
|
+
const error_message = error instanceof Error ? error.message : String(error);
|
|
401
|
+
const error_stack = error instanceof Error ? { stack: error.stack } : void 0;
|
|
402
|
+
const request_id = req.request_id;
|
|
403
|
+
res.locals.message = error_message;
|
|
404
|
+
res.locals.error = is_development ? error : {};
|
|
405
|
+
this.logger.error(`[${this.name}] Unhandled error for request ${request_id} Message ${error_message}`, { error_stack, error });
|
|
406
|
+
return res.status(500).json({ status: "error", code: 500, msg: this.default_error_message });
|
|
407
|
+
};
|
|
408
|
+
responseFormatterMiddleWare(req, res, next) {
|
|
409
|
+
res.errResponse = (code = 500, msg = this.default_error_message, data = []) => {
|
|
410
|
+
return res.status(code).json({ status: "error", msg, data });
|
|
411
|
+
};
|
|
412
|
+
res.successResponse = (code = 200, msg = this.default_success_message, data = []) => {
|
|
413
|
+
return res.status(code).json({ status: "success", msg, data });
|
|
414
|
+
};
|
|
415
|
+
res.infoResponse = (code = 200, msg = this.default_info_message, data = []) => {
|
|
416
|
+
return res.status(code).json({ status: "info", msg, data });
|
|
417
|
+
};
|
|
418
|
+
res.handle404Error = () => {
|
|
419
|
+
return res.status(404).json({ status: "error", msg: this.default_not_found_message });
|
|
420
|
+
};
|
|
421
|
+
next();
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
__decorateClass([
|
|
425
|
+
safe_execute_util_default.safeExecuteThrow("response_formatter_middle_ware")
|
|
426
|
+
], ResponseFormatterMiddleWare.prototype, "responseFormatterMiddleWare", 1);
|
|
427
|
+
var response_formatter_middle_ware_default = ResponseFormatterMiddleWare;
|
|
377
428
|
export {
|
|
378
429
|
cookie_manager_middle_ware_default as CookieManagerMiddleWare,
|
|
379
430
|
cors_middle_ware_default as CorsMiddleWare,
|
|
380
431
|
https_enforcement_middle_ware_default as HTTPSEnforcementMiddleWare,
|
|
381
432
|
rate_limiter_middle_ware_default as RateLimiterMiddleWare,
|
|
382
433
|
request_logger_middle_ware_default as RequestLoggerMiddleWare,
|
|
434
|
+
response_formatter_middle_ware_default as ResponseFormatterMiddleWare,
|
|
383
435
|
secure_headers_middle_ware_default as SecureHeadersMiddleWare
|
|
384
436
|
};
|
|
385
437
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/middle_ware/cookie_manager_middle_ware.ts","../../src/middle_ware/cors_middle_ware.ts","../../src/middle_ware/rate_limiter_middle_ware.ts","../../src/middle_ware/https_enforcement_middle_ware.ts","../../src/middle_ware/secure_headers_middle_ware.ts","../../src/middle_ware/request_logger_middle_ware.ts"],"sourcesContent":["import crypto from \"crypto\";\nimport {\n Request,\n Response,\n NextFunction,\n CookieOptions\n} from \"express\";\n\nimport {\n InputValidatorUtil,\n LoggerUtil,\n SafeExecuteUtil\n} from \"@/utils\";\n\nimport { CookieManagerOptions } from \"@/types/middle_ware_type\";\n\nimport { REQUEST_ID_COOKIE_MAX_AGE } from \"@/config/constants\";\n\nclass CookieManagerMiddleWare {\n private name = \"cookie_manager_middle_ware\";\n private logger = new LoggerUtil(this.name);\n private readonly default_cookie_options: CookieOptions = this.getDefaultCookieOptions();\n private request_id_max_age: number;\n private request_id_generator: () => string\n\n constructor(options: CookieManagerOptions = {}) {\n this.request_id_max_age = options?.request_id_max_age || REQUEST_ID_COOKIE_MAX_AGE;\n this.request_id_generator = options?.request_id_generator || crypto.randomUUID;\n \n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method to get default cookie options\n private getDefaultCookieOptions (): CookieOptions {\n return {\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n secure: InputValidatorUtil.isProduction(),\n };\n }\n\n /** Get cookie value safely */\n public get(req: Request, name: string): string | undefined {\n return req.cookies?.[name];\n }\n\n /** Set cookie with enforced defaults */\n public set(\n res: Response,\n name: string,\n value: string,\n options: { max_age?: number; } = {}\n ): void {\n const cookie_options = { ...this.default_cookie_options, maxAge: options.max_age, }\n res.cookie( name, value, cookie_options );\n }\n\n /** Clear cookie */\n public clear(res: Response, name: string): void {\n res.clearCookie(name, this.default_cookie_options);\n }\n\n /** Middleware */\n @SafeExecuteUtil.safeExecuteThrow(\"cookie_manager_middle_ware\")\n public middleware(\n req: Request, \n res: Response, \n next: NextFunction\n ): void {\n // Attach helpers\n req.getCookie = (name: string) => this.get(req, name);\n req.setCookie = (name, value, options = {}) => this.set(res, name, value, options);\n req.clearCookie = (name) => this.clear(res, name);\n\n // Request ID handling\n let request_id = req.getCookie(\"request_id\");\n\n if (!request_id) {\n request_id = this.request_id_generator();\n\n this.set( res, \"request_id\", request_id, { max_age: this.request_id_max_age } );\n\n res.setHeader(\"X-Request-Id\", request_id);\n\n this.logger.info(`Generated request_id: ${request_id}`);\n }\n\n this.logger.info(`[REQ:${request_id}] ${req.method} ${req.originalUrl}`);\n\n req.request_id = request_id;\n\n next();\n }\n}\n\nexport default CookieManagerMiddleWare;\n","import { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport { \n CORS_ALLOWED_METHODS,\n CORS_ALLOWED_HEADERS,\n CORS_MAX_AGE_IN_SECONDS,\n CORS_MAX_AGE_IN_MICRO_SECONDS\n} from \"@/config/constants\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InMemoryCache\n} from \"@/utils\"\n\nimport { \n CorsOptions, \n CorsOriginResolver \n} from \"@/types/middle_ware_type\";\n\n\nclass CorsMiddleWare {\n private name = \"cors_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n private origin_cache: InMemoryCache = new InMemoryCache<boolean>();\n private origins: string[];\n private methods: string[];\n private headers: string[];\n private credentials: boolean;\n private max_age: number;\n private allow_null_origin: boolean\n private origin_resolver: CorsOriginResolver | null;\n\n constructor(options: CorsOptions = {}) {\n this.origins = options.origins || [];\n this.methods = options.methods ?? CORS_ALLOWED_METHODS;\n this.headers = options.headers ?? CORS_ALLOWED_HEADERS;\n this.credentials = options.credentials ?? true;\n this.max_age = options.max_age ?? CORS_MAX_AGE_IN_SECONDS\n this.allow_null_origin = options.allow_null_origin ?? false,\n this.origin_resolver = options?.origin_resolver || null;\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method for Origin resolution logic\n @SafeExecuteUtil.safeExecuteReturn(\"cors_middle_ware\", [])\n private async resolveAllowedOrigins(): Promise<string[]> {\n if(Array.isArray(this.origins) && this.origins.length) {\n return this.origins\n }\n else if (this.origin_resolver && typeof this.origin_resolver === \"function\") {\n const result = await this.origin_resolver();\n return Array.isArray(result) ? result : [];\n\n }\n \n return [];\n }\n\n // Method to validate origin\n @SafeExecuteUtil.safeExecuteReturn(\"cors_middle_ware\", false)\n private async isValidOrigin(origin: string): Promise<boolean> {\n if (!origin) { return this.allow_null_origin; }\n\n // Cached\n if (this.origin_cache.has(origin)) { return true; }\n\n // Function validator\n else if (this.origin_resolver && typeof this.origin_resolver === \"function\") {\n const result = await this.origin_resolver(origin);\n\n if (typeof result === \"boolean\") {\n if (result) { \n this.origin_cache.set(origin, true, CORS_MAX_AGE_IN_MICRO_SECONDS); \n }\n return result;\n }\n }\n\n // List validator\n const allowed = await this.resolveAllowedOrigins();\n const is_valid = allowed.includes(origin);\n\n if (is_valid) { \n this.origin_cache.set(origin, true, CORS_MAX_AGE_IN_MICRO_SECONDS); \n }\n\n return is_valid;\n }\n\n // -------------------------\n // Origin detection\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteReturn(\"cors_middle_ware\", \"unknown\")\n public async getRequestOrigin(req: Request): Promise<string> {\n const { headers, protocol } = req;\n\n if(headers?.origin) { return headers?.origin }\n\n else if(headers?.referer) { return new URL(headers.referer).origin }\n\n return `${protocol}://${req?.get('host')}` ;\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"cors_middle_ware\")\n public async middleware (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n const origin = await this.getRequestOrigin(req);\n const is_allowed = await this.isValidOrigin(origin);\n\n res.setHeader(\"Vary\", \"Origin\");\n\n if (!is_allowed) {\n this.logger.error(`Blocked CORS request from origin: ${origin}`);\n return res.status(403).json({ status: \"error\", code: 403, msg: \"cors_blocked\" });\n }\n\n res.setHeader(\"Access-Control-Allow-Origin\", origin);\n res.setHeader(\"Access-Control-Allow-Methods\", this.methods.join(\",\"));\n res.setHeader(\"Access-Control-Allow-Headers\", this.headers.join(\",\"));\n\n if (this.credentials) {\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n }\n\n if (this.max_age) {\n res.setHeader( \"Access-Control-Max-Age\", this.max_age.toString());\n }\n\n if (req.method === \"OPTIONS\") {\n return res.sendStatus(204);\n }\n\n next();\n };\n}\n\nexport default CorsMiddleWare;\n","import { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InMemoryCache\n} from \"@/utils\"\n\nimport { \n RateLimitRecord,\n RateLimiterOptions\n} from \"@/types/middle_ware_type\";\n\nimport { \n REQUEST_RATE_LIMITTER_OPTIONS \n} from \"@/config/constants\";\n\n\n\nclass RateLimiterMiddleWare {\n public readonly name = \"rate_limiter_middle_ware\";\n\n private window_ms: number;\n private max_requests: number;\n private message: string;\n private cache: InMemoryCache<RateLimitRecord>;\n private logger: LoggerUtil;\n private key_generator: Function;\n\n constructor(options: RateLimiterOptions = {}) {\n this.window_ms = options?.window_ms ?? REQUEST_RATE_LIMITTER_OPTIONS.window_ms;\n this.max_requests = options?.max_requests ?? REQUEST_RATE_LIMITTER_OPTIONS.max_requests;\n this.message = options.message ?? REQUEST_RATE_LIMITTER_OPTIONS.message;\n this.key_generator = options?.key_generator || this.generateRequestIdentitfier\n\n this.cache = new InMemoryCache<RateLimitRecord>();\n this.logger = new LoggerUtil(this.name);\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method to help generate request key\n private generateRequestIdentitfier (req: Request): string {\n return req?.request_id || req?.clientIp || req?.ip || \"unknown\";\n }\n\n // Method to reset seconds counter\n private getResetSeconds(expires_at: number): number {\n return Math.max(Math.ceil((expires_at - Date.now()) / 1000), 0);\n }\n\n @SafeExecuteUtil.safeExecuteThrow(\"rate_limiter_middle_ware\")\n public middleware(\n req: Request,\n res: Response,\n next: NextFunction\n ): Response | void {\n const key = this.key_generator(req);\n const now = Date.now();\n\n let record = this.cache.get(key);\n\n if (!record) {\n record = {\n count: 1,\n expires_at: now + this.window_ms,\n };\n\n this.cache.set(key, record, this.window_ms);\n } \n else {\n record.count++;\n this.cache.update(key, record);\n }\n\n const remaining = Math.max(this.max_requests - record.count, 0);\n const reset_seconds = this.getResetSeconds(record.expires_at);\n\n // RFC-ish headers\n res.setHeader(\"X-RateLimit-Limit\", this.max_requests);\n res.setHeader(\"X-RateLimit-Remaining\", remaining);\n res.setHeader(\"X-RateLimit-Reset\", reset_seconds);\n\n if (record.count > this.max_requests) {\n this.logger.alert(`⚠️ Rate limit exceeded for key: ${key} (retry in ${reset_seconds}s)`);\n\n res.setHeader(\"Retry-After\", reset_seconds);\n\n return res.status(429).json({\n status: \"error\",\n code: 429,\n msg: \"rate_limit_exceeded\",\n data: {\n message: this.message,\n retry_after: `${reset_seconds}s`,\n },\n });\n }\n\n next();\n };\n\n}\n\nexport default RateLimiterMiddleWare;\n\n\n\n\n","\nimport { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InputValidatorUtil,\n} from \"@/utils\"\n\nimport { ForceHTTPSOptions } from \"@/types/middle_ware_type\";\n\nclass HTTPSEnforcementMiddleWare {\n private name = \"https_enforcement_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n private readonly enabled?: boolean;\n private readonly redirect_status?: number;\n private readonly trust_proxy?: boolean;\n\n constructor(options: ForceHTTPSOptions = {}) {\n this.enabled = options.enabled ?? !InputValidatorUtil.isDevelopment();\n this.redirect_status = options?.redirect_status ?? 301;\n this.trust_proxy = options.trust_proxy ?? true\n\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"https_enforcement_middle_ware\")\n public async middleware (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n if (!this.enabled) { return next(); }\n\n const is_secure = req.secure || (this.trust_proxy && req.headers[\"x-forwarded-proto\"] === \"https\");\n\n if (is_secure) { return next(); }\n\n const host = req.headers.host;\n const url = req.originalUrl;\n const redirect_status = this.redirect_status || 301;\n\n this.logger.alert(`Redirecting HTTP → HTTPS: ${url}`);\n\n res.redirect(redirect_status, `https://${host}${url}`);\n }\n \n\n}\n\nexport default HTTPSEnforcementMiddleWare","\nimport { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InputValidatorUtil,\n} from \"@/utils\"\n\nimport { SecureHeadersOptions } from \"@/types/middle_ware_type\";\n\nclass SecureHeadersMiddleWare {\n private name = \"secure_headers_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n private readonly enabled?: boolean;\n private readonly HSTS_enabled?: boolean;\n private readonly HSTS_max_age?: number;\n private readonly frame_options: \"DENY\" | \"SAMEORIGIN\";\n private readonly xss_protection?: boolean;\n private readonly content_type_options?: boolean;\n private readonly referrer_policy: string;\n private readonly content_security_policy: Record<string, string[]>;\n private readonly HSTS_Extras: string;\n private readonly cors_policy: string;\n private readonly cors_opener_policy: string;\n\n constructor(options: SecureHeadersOptions = {}) {\n this.enabled = options.enabled ?? true;\n this.HSTS_enabled = options?.HSTS_enabled ?? InputValidatorUtil.isProduction();\n this.HSTS_max_age = options?.HSTS_max_age ?? 63072000;\n this.frame_options = options?.frame_options ?? \"SAMEORIGIN\";\n this.xss_protection = options?.xss_protection ?? true;\n this.content_type_options = options?.content_type_options ?? true;\n this.referrer_policy = options?.referrer_policy ?? \"no-referrer-when-downgrade\";\n this.content_security_policy = options?.content_security_policy ?? this.getDefaultContentSecurityPolicy(),\n this.HSTS_Extras = options?.HSTS_Extras ?? \"includeSubDomains; preload;\";\n this.cors_policy = options?.cors_policy ?? \"same-origin\";\n this.cors_opener_policy = options?.cors_opener_policy ?? \"same-origin\";\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method to get default content security policy\n private getDefaultContentSecurityPolicy (): Record<string, string[]> {\n return {\n \"default-src\": [\"'self'\"],\n \"object-src\": [\"'none'\"],\n \"script-src\": [\"'self'\"],\n \"style-src\": [\"'self'\", \"https://fonts.googleapis.com\"],\n \"font-src\": [\"'self'\", \"https://fonts.gstatic.com\"],\n \"img-src\": [\"'self'\"],\n \"connect-src\": [\"'self'\"],\n \"base-uri\": [\"'self'\"],\n \"frame-ancestors\": [\"'self'\"],\n };\n }\n\n // Method to convert content security policy object to string\n private getContentSecurityPolicyString(\n policy: Record<string, string[]>\n ): string {\n return Object.entries(policy)\n .map(([key, value]) => `${key} ${value.join(\" \")}`)\n .join(\"; \");\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"secure_headers_middle_ware\")\n public async middleware (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n if (!this.enabled) { return next(); }\n\n // Prevent XSS\n if (this.xss_protection) {\n res.setHeader(\"X-XSS-Protection\", \"1; mode=block\");\n }\n else {\n res.setHeader(\"X-XSS-Protection\", \"0\");\n }\n\n // Prevent MIME-type sniffing\n if (this.content_type_options) {\n res.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n }\n\n // Disable framing (clickjacking protection)\n res.setHeader(\"X-Frame-Options\", this.frame_options);\n res.setHeader(\"Referrer-Policy\", this.referrer_policy);\n\n if(this.cors_policy) {\n res.setHeader(\"Cross-Origin-Resource-Policy\", this.cors_policy);\n }\n\n if(this.cors_opener_policy) {\n res.setHeader(\"Cross-Origin-Opener-Policy\", this.cors_opener_policy);\n }\n\n // Content Security Policy\n if (this.content_security_policy) {\n const content_security_policy_string = this.getContentSecurityPolicyString(this.content_security_policy);\n res.setHeader(\"Content-Security-Policy\", content_security_policy_string);\n }\n\n if (this.HSTS_enabled) {\n res.setHeader(\"Strict-Transport-Security\", `max-age=${this.HSTS_max_age}; ${this.HSTS_Extras}`);\n }\n\n next();\n }\n \n\n}\n\nexport default SecureHeadersMiddleWare","\n\nimport { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n} from \"@/utils\"\n\n\nclass RequestLoggerMiddleWare {\n private name = \"request_logger_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n\n\n constructor() {\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"request_logger_middle_ware\")\n public async middleware (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n const origin = req.headers.origin || (req.headers.referer ? new URL(req.headers.referer).origin : \"unknown\");\n const device_id = req.headers[\"x-device-id\"] || \"unknown\";\n const device_name = req.headers[\"x-device-name\"] || \"unknown\";\n const user_agent = req.headers[\"user-agent\"] || \"unknown\";\n const request_id = req.cookies?.request_id ?? null;\n const ip = req.clientIp || req.ip || \"unknown\";\n\n this.logger.info(`[${this.name}] ${req.method} ${req.originalUrl}`);\n this.logger.info(`[${this.name}] Origin: ${origin}, Host: ${req.get(\"host\")}`);\n this.logger.info(`[${this.name}] Device ID: ${device_id}, Device Name: ${device_name}`);\n this.logger.info(`[${this.name}] Request ID: ${request_id}, IP: ${ip}`);\n this.logger.info(`[${this.name}] User-Agent: ${user_agent}`);\n\n next();\n }\n \n\n}\n\nexport default RequestLoggerMiddleWare"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/middle_ware/cookie_manager_middle_ware.ts","../../src/middle_ware/cors_middle_ware.ts","../../src/middle_ware/rate_limiter_middle_ware.ts","../../src/middle_ware/https_enforcement_middle_ware.ts","../../src/middle_ware/secure_headers_middle_ware.ts","../../src/middle_ware/request_logger_middle_ware.ts","../../src/middle_ware/response_formatter_middle_ware.ts"],"sourcesContent":["import crypto from \"crypto\";\nimport {\n Request,\n Response,\n NextFunction,\n CookieOptions\n} from \"express\";\n\nimport {\n InputValidatorUtil,\n LoggerUtil,\n SafeExecuteUtil\n} from \"@/utils\";\n\nimport { CookieManagerOptions } from \"@/types/middle_ware_type\";\n\nimport { REQUEST_ID_COOKIE_MAX_AGE } from \"@/config/constants\";\n\nclass CookieManagerMiddleWare {\n private name = \"cookie_manager_middle_ware\";\n private logger = new LoggerUtil(this.name);\n private readonly default_cookie_options: CookieOptions = this.getDefaultCookieOptions();\n private request_id_max_age: number;\n private request_id_generator: () => string\n\n constructor(options: CookieManagerOptions = {}) {\n this.request_id_max_age = options?.request_id_max_age || REQUEST_ID_COOKIE_MAX_AGE;\n this.request_id_generator = options?.request_id_generator || crypto.randomUUID;\n \n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method to get default cookie options\n private getDefaultCookieOptions (): CookieOptions {\n return {\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n secure: InputValidatorUtil.isProduction(),\n };\n }\n\n /** Get cookie value safely */\n public get(req: Request, name: string): string | undefined {\n return req.cookies?.[name];\n }\n\n /** Set cookie with enforced defaults */\n public set(\n res: Response,\n name: string,\n value: string,\n options: { max_age?: number; } = {}\n ): void {\n const cookie_options = { ...this.default_cookie_options, maxAge: options.max_age, }\n res.cookie( name, value, cookie_options );\n }\n\n /** Clear cookie */\n public clear(res: Response, name: string): void {\n res.clearCookie(name, this.default_cookie_options);\n }\n\n /** Middleware */\n @SafeExecuteUtil.safeExecuteThrow(\"cookie_manager_middle_ware\")\n public async middleWare(\n req: Request, \n res: Response, \n next: NextFunction\n ): Promise<void | Response> {\n // Attach helpers\n req.getCookie = (name: string) => this.get(req, name);\n req.setCookie = (name, value, options = {}) => this.set(res, name, value, options);\n req.clearCookie = (name) => this.clear(res, name);\n\n // Request ID handling\n let request_id = req.getCookie(\"request_id\");\n\n if (!request_id) {\n request_id = this.request_id_generator();\n\n this.set( res, \"request_id\", request_id, { max_age: this.request_id_max_age } );\n\n res.setHeader(\"X-Request-Id\", request_id);\n\n this.logger.info(`Generated request_id: ${request_id}`);\n }\n\n this.logger.info(`[REQ:${request_id}] ${req.method} ${req.originalUrl}`);\n\n req.request_id = request_id;\n\n return next();\n }\n}\n\nexport default CookieManagerMiddleWare;\n","import { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport { \n CORS_ALLOWED_METHODS,\n CORS_ALLOWED_HEADERS,\n CORS_MAX_AGE_IN_SECONDS,\n CORS_MAX_AGE_IN_MICRO_SECONDS\n} from \"@/config/constants\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InMemoryCache\n} from \"@/utils\"\n\nimport { \n CorsOptions, \n CorsOriginResolver \n} from \"@/types/middle_ware_type\";\n\n\nclass CorsMiddleWare {\n private name = \"cors_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n private origin_cache: InMemoryCache = new InMemoryCache<boolean>();\n private origins: string[];\n private methods: string[];\n private headers: string[];\n private credentials: boolean;\n private max_age: number;\n private allow_null_origin: boolean\n private origin_resolver: CorsOriginResolver | null;\n\n constructor(options: CorsOptions = {}) {\n this.origins = options.origins || [];\n this.methods = options.methods ?? CORS_ALLOWED_METHODS;\n this.headers = options.headers ?? CORS_ALLOWED_HEADERS;\n this.credentials = options.credentials ?? true;\n this.max_age = options.max_age ?? CORS_MAX_AGE_IN_SECONDS\n this.allow_null_origin = options.allow_null_origin ?? false,\n this.origin_resolver = options?.origin_resolver || null;\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method for Origin resolution logic\n @SafeExecuteUtil.safeExecuteReturn(\"cors_middle_ware\", [])\n private async resolveAllowedOrigins(): Promise<string[]> {\n if(Array.isArray(this.origins) && this.origins.length) {\n return this.origins\n }\n else if (this.origin_resolver && typeof this.origin_resolver === \"function\") {\n const result = await this.origin_resolver();\n return Array.isArray(result) ? result : [];\n\n }\n \n return [];\n }\n\n // Method to validate origin\n @SafeExecuteUtil.safeExecuteReturn(\"cors_middle_ware\", false)\n private async isValidOrigin(origin: string): Promise<boolean> {\n if (!origin) { return this.allow_null_origin; }\n\n // Cached\n if (this.origin_cache.has(origin)) { return true; }\n\n // Function validator\n else if (this.origin_resolver && typeof this.origin_resolver === \"function\") {\n const result = await this.origin_resolver(origin);\n\n if (typeof result === \"boolean\") {\n if (result) { \n this.origin_cache.set(origin, true, CORS_MAX_AGE_IN_MICRO_SECONDS); \n }\n return result;\n }\n }\n\n // List validator\n const allowed = await this.resolveAllowedOrigins();\n const is_valid = allowed.includes(origin);\n\n if (is_valid) { \n this.origin_cache.set(origin, true, CORS_MAX_AGE_IN_MICRO_SECONDS); \n }\n\n return is_valid;\n }\n\n // -------------------------\n // Origin detection\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteReturn(\"cors_middle_ware\", \"unknown\")\n public async getRequestOrigin(req: Request): Promise<string> {\n const { headers, protocol } = req;\n\n if(headers?.origin) { return headers?.origin }\n\n else if(headers?.referer) { return new URL(headers.referer).origin }\n\n return `${protocol}://${req?.get('host')}` ;\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"cors_middle_ware\")\n public async middleWare (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n const origin = await this.getRequestOrigin(req);\n const is_allowed = await this.isValidOrigin(origin);\n\n res.setHeader(\"Vary\", \"Origin\");\n\n if (!is_allowed) {\n this.logger.error(`Blocked CORS request from origin: ${origin}`);\n return res.status(403).json({ status: \"error\", code: 403, msg: \"cors_blocked\" });\n }\n\n res.setHeader(\"Access-Control-Allow-Origin\", origin);\n res.setHeader(\"Access-Control-Allow-Methods\", this.methods.join(\",\"));\n res.setHeader(\"Access-Control-Allow-Headers\", this.headers.join(\",\"));\n\n if (this.credentials) {\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n }\n\n if (this.max_age) {\n res.setHeader( \"Access-Control-Max-Age\", this.max_age.toString());\n }\n\n if (req.method === \"OPTIONS\") {\n return res.sendStatus(204);\n }\n\n return next();\n };\n}\n\nexport default CorsMiddleWare;\n","import { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InMemoryCache\n} from \"@/utils\"\n\nimport { \n RateLimitRecord,\n RateLimiterOptions\n} from \"@/types/middle_ware_type\";\n\nimport { \n REQUEST_RATE_LIMITTER_OPTIONS \n} from \"@/config/constants\";\n\n\n\nclass RateLimiterMiddleWare {\n public readonly name = \"rate_limiter_middle_ware\";\n\n private window_ms: number;\n private max_requests: number;\n private message: string;\n private cache: InMemoryCache<RateLimitRecord>;\n private logger: LoggerUtil;\n private key_generator: Function;\n\n constructor(options: RateLimiterOptions = {}) {\n this.window_ms = options?.window_ms ?? REQUEST_RATE_LIMITTER_OPTIONS.window_ms;\n this.max_requests = options?.max_requests ?? REQUEST_RATE_LIMITTER_OPTIONS.max_requests;\n this.message = options.message ?? REQUEST_RATE_LIMITTER_OPTIONS.message;\n this.key_generator = options?.key_generator || this.generateRequestIdentitfier\n\n this.cache = new InMemoryCache<RateLimitRecord>();\n this.logger = new LoggerUtil(this.name);\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method to help generate request key\n private generateRequestIdentitfier (req: Request): string {\n return req?.request_id || req?.clientIp || req?.ip || \"unknown\";\n }\n\n // Method to reset seconds counter\n private getResetSeconds(expires_at: number): number {\n return Math.max(Math.ceil((expires_at - Date.now()) / 1000), 0);\n }\n\n @SafeExecuteUtil.safeExecuteThrow(\"rate_limiter_middle_ware\")\n public async middleWare(\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n const key = this.key_generator(req);\n const now = Date.now();\n\n let record = this.cache.get(key);\n\n if (!record) {\n record = {\n count: 1,\n expires_at: now + this.window_ms,\n };\n\n this.cache.set(key, record, this.window_ms);\n } \n else {\n record.count++;\n this.cache.update(key, record);\n }\n\n const remaining = Math.max(this.max_requests - record.count, 0);\n const reset_seconds = this.getResetSeconds(record.expires_at);\n\n // RFC-ish headers\n res.setHeader(\"X-RateLimit-Limit\", this.max_requests);\n res.setHeader(\"X-RateLimit-Remaining\", remaining);\n res.setHeader(\"X-RateLimit-Reset\", reset_seconds);\n\n if (record.count > this.max_requests) {\n this.logger.alert(`⚠️ Rate limit exceeded for key: ${key} (retry in ${reset_seconds}s)`);\n\n res.setHeader(\"Retry-After\", reset_seconds);\n\n return res.status(429).json({\n status: \"error\",\n code: 429,\n msg: \"rate_limit_exceeded\",\n data: {\n message: this.message,\n retry_after: `${reset_seconds}s`,\n },\n });\n }\n\n return next();\n };\n\n}\n\nexport default RateLimiterMiddleWare;\n\n\n\n\n","\nimport { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InputValidatorUtil,\n} from \"@/utils\"\n\nimport { ForceHTTPSOptions } from \"@/types/middle_ware_type\";\n\nclass HTTPSEnforcementMiddleWare {\n private name = \"https_enforcement_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n private readonly enabled?: boolean;\n private readonly redirect_status?: number;\n private readonly trust_proxy?: boolean;\n\n constructor(options: ForceHTTPSOptions = {}) {\n this.enabled = options.enabled ?? !InputValidatorUtil.isDevelopment();\n this.redirect_status = options?.redirect_status ?? 301;\n this.trust_proxy = options.trust_proxy ?? true\n\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"https_enforcement_middle_ware\")\n public async middleWare (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n if (!this.enabled) { return next(); }\n\n const is_secure = req.secure || (this.trust_proxy && req.headers[\"x-forwarded-proto\"] === \"https\");\n\n if (is_secure) { return next(); }\n\n const host = req.headers.host;\n const url = req.originalUrl;\n const redirect_status = this.redirect_status || 301;\n\n this.logger.alert(`Redirecting HTTP → HTTPS: ${url}`);\n\n return res.redirect(redirect_status, `https://${host}${url}`);\n }\n \n\n}\n\nexport default HTTPSEnforcementMiddleWare","\nimport { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InputValidatorUtil,\n} from \"@/utils\"\n\nimport { SecureHeadersOptions } from \"@/types/middle_ware_type\";\n\nclass SecureHeadersMiddleWare {\n private name = \"secure_headers_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n private readonly enabled?: boolean;\n private readonly HSTS_enabled?: boolean;\n private readonly HSTS_max_age?: number;\n private readonly frame_options: \"DENY\" | \"SAMEORIGIN\";\n private readonly xss_protection?: boolean;\n private readonly content_type_options?: boolean;\n private readonly referrer_policy: string;\n private readonly content_security_policy: Record<string, string[]>;\n private readonly HSTS_Extras: string;\n private readonly cors_policy: string;\n private readonly cors_opener_policy: string;\n\n constructor(options: SecureHeadersOptions = {}) {\n this.enabled = options.enabled ?? true;\n this.HSTS_enabled = options?.HSTS_enabled ?? InputValidatorUtil.isProduction();\n this.HSTS_max_age = options?.HSTS_max_age ?? 63072000;\n this.frame_options = options?.frame_options ?? \"SAMEORIGIN\";\n this.xss_protection = options?.xss_protection ?? true;\n this.content_type_options = options?.content_type_options ?? true;\n this.referrer_policy = options?.referrer_policy ?? \"no-referrer-when-downgrade\";\n this.content_security_policy = options?.content_security_policy ?? this.getDefaultContentSecurityPolicy(),\n this.HSTS_Extras = options?.HSTS_Extras ?? \"includeSubDomains; preload;\";\n this.cors_policy = options?.cors_policy ?? \"same-origin\";\n this.cors_opener_policy = options?.cors_opener_policy ?? \"same-origin\";\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method to get default content security policy\n private getDefaultContentSecurityPolicy (): Record<string, string[]> {\n return {\n \"default-src\": [\"'self'\"],\n \"object-src\": [\"'none'\"],\n \"script-src\": [\"'self'\"],\n \"style-src\": [\"'self'\", \"https://fonts.googleapis.com\"],\n \"font-src\": [\"'self'\", \"https://fonts.gstatic.com\"],\n \"img-src\": [\"'self'\"],\n \"connect-src\": [\"'self'\"],\n \"base-uri\": [\"'self'\"],\n \"frame-ancestors\": [\"'self'\"],\n };\n }\n\n // Method to convert content security policy object to string\n private getContentSecurityPolicyString(\n policy: Record<string, string[]>\n ): string {\n return Object.entries(policy)\n .map(([key, value]) => `${key} ${value.join(\" \")}`)\n .join(\"; \");\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"secure_headers_middle_ware\")\n public async middleware (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n if (!this.enabled) { return next(); }\n\n // Prevent XSS\n if (this.xss_protection) {\n res.setHeader(\"X-XSS-Protection\", \"1; mode=block\");\n }\n else {\n res.setHeader(\"X-XSS-Protection\", \"0\");\n }\n\n // Prevent MIME-type sniffing\n if (this.content_type_options) {\n res.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n }\n\n // Disable framing (clickjacking protection)\n res.setHeader(\"X-Frame-Options\", this.frame_options);\n res.setHeader(\"Referrer-Policy\", this.referrer_policy);\n\n if(this.cors_policy) {\n res.setHeader(\"Cross-Origin-Resource-Policy\", this.cors_policy);\n }\n\n if(this.cors_opener_policy) {\n res.setHeader(\"Cross-Origin-Opener-Policy\", this.cors_opener_policy);\n }\n\n // Content Security Policy\n if (this.content_security_policy) {\n const content_security_policy_string = this.getContentSecurityPolicyString(this.content_security_policy);\n res.setHeader(\"Content-Security-Policy\", content_security_policy_string);\n }\n\n if (this.HSTS_enabled) {\n res.setHeader(\"Strict-Transport-Security\", `max-age=${this.HSTS_max_age}; ${this.HSTS_Extras}`);\n }\n\n return next();\n }\n \n}\n\nexport default SecureHeadersMiddleWare","\n\nimport { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n} from \"@/utils\"\n\n\nclass RequestLoggerMiddleWare {\n private name = \"request_logger_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n\n\n constructor() {\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"request_logger_middle_ware\")\n public async middleware (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n const origin = req.headers.origin || (req.headers.referer ? new URL(req.headers.referer).origin : \"unknown\");\n const device_id = req.headers[\"x-device-id\"] || \"unknown\";\n const device_name = req.headers[\"x-device-name\"] || \"unknown\";\n const user_agent = req.headers[\"user-agent\"] || \"unknown\";\n const request_id = req.cookies?.request_id ?? null;\n const ip = req.clientIp || req.ip || \"unknown\";\n\n this.logger.info(`[${this.name}] ${req.method} ${req.originalUrl}`);\n this.logger.info(`[${this.name}] Origin: ${origin}, Host: ${req.get(\"host\")}`);\n this.logger.info(`[${this.name}] Device ID: ${device_id}, Device Name: ${device_name}`);\n this.logger.info(`[${this.name}] Request ID: ${request_id}, IP: ${ip}`);\n this.logger.info(`[${this.name}] User-Agent: ${user_agent}`);\n\n return next();\n }\n \n\n}\n\nexport default RequestLoggerMiddleWare","import { Request, Response, NextFunction } from \"express\";\nimport { SafeExecuteUtil, LoggerUtil, InputValidatorUtil } from \"@/utils\";\nimport { EnvConfigInterface } from \"@/types/util_type\";\nimport { ResponseFormatterOptions } from \"@/types/middle_ware_type\";\n\nclass ResponseFormatterMiddleWare {\n private readonly name = \"response_formatter_middle_ware\";\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);;\n\n private readonly include_request_id: boolean;\n private readonly default_success_message: string;\n private readonly default_error_message: string;\n private readonly default_info_message: string;\n private readonly default_not_found_message: string;\n\n constructor(options: ResponseFormatterOptions = {}) {\n this.include_request_id = options.include_request_id ?? true;\n this.default_success_message = options.default_success_message ?? \"operation_successful\";\n this.default_error_message = options.default_error_message ?? \"server_error\";\n this.default_info_message = options.default_info_message ?? \"operation_information\";\n this.default_not_found_message = options.default_not_found_message ?? \"invalid_request_resource_not_found\";\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // -------------------------\n // Express error middleware\n // -------------------------\n public handleGeneralError = (\n error: unknown,\n req: Request,\n res: Response,\n _next: NextFunction\n ): Response => {\n const is_development = InputValidatorUtil.isDevelopment();\n const error_message = error instanceof Error ? error.message : String(error);\n const error_stack = error instanceof Error ? { stack: error.stack } : undefined;\n const request_id = req.request_id\n\n res.locals.message = error_message;\n res.locals.error = is_development ? error : {};\n\n this.logger.error(`[${this.name}] Unhandled error for request ${request_id} Message ${error_message}`, { error_stack, error });\n\n return res.status(500).json({ status: \"error\", code: 500, msg: this.default_error_message });\n };\n\n // -------------------------\n // Middleware\n // -------------------------\n @SafeExecuteUtil.safeExecuteThrow(\"response_formatter_middle_ware\")\n public responseFormatterMiddleWare(\n req: Request,\n res: Response,\n next: NextFunction\n ): void {\n\n // Generic error response\n res.errResponse = (code = 500, msg = this.default_error_message, data: any = []) => {\n return res.status(code).json({ status: \"error\", msg, data });\n };\n\n // Generic success response\n res.successResponse = (code = 200, msg = this.default_success_message, data: any = []) => {\n return res.status(code).json({ status: \"success\", msg, data });\n };\n\n // Informational response\n res.infoResponse = (code = 200, msg = this.default_info_message, data: any = []) => {\n return res.status(code).json({ status: \"info\", msg, data });\n };\n\n // 404 handler\n res.handle404Error = () => {\n return res.status(404).json({ status: \"error\", msg: this.default_not_found_message });\n };\n\n next();\n }\n\n}\n\nexport default ResponseFormatterMiddleWare;\n\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
type CorsOriginResolver = ((origin?: string) => boolean | Promise<boolean>) | (() => Promise<string[]>);
|
|
2
|
+
interface CorsOptions {
|
|
3
|
+
origins?: string[];
|
|
4
|
+
origin_resolver?: CorsOriginResolver;
|
|
5
|
+
methods?: string[];
|
|
6
|
+
headers?: string[];
|
|
7
|
+
credentials?: boolean;
|
|
8
|
+
max_age?: number;
|
|
9
|
+
allow_null_origin?: boolean;
|
|
10
|
+
}
|
|
11
|
+
interface RateLimiterOptions {
|
|
12
|
+
window_ms?: number;
|
|
13
|
+
max_requests?: number;
|
|
14
|
+
message?: string;
|
|
15
|
+
key_generator?: (req: Request) => string;
|
|
16
|
+
}
|
|
17
|
+
type RateLimitRecord = {
|
|
18
|
+
count: number;
|
|
19
|
+
expires_at: number;
|
|
20
|
+
};
|
|
21
|
+
interface CookieManagerOptions {
|
|
22
|
+
request_id_max_age?: number;
|
|
23
|
+
request_id_generator?: () => string;
|
|
24
|
+
}
|
|
25
|
+
interface ForceHTTPSOptions {
|
|
26
|
+
enabled?: boolean;
|
|
27
|
+
redirect_status?: number | 301 | 302 | 307 | 308;
|
|
28
|
+
trust_proxy?: boolean;
|
|
29
|
+
}
|
|
30
|
+
interface SecureHeadersOptions {
|
|
31
|
+
enabled?: boolean;
|
|
32
|
+
HSTS_enabled?: boolean;
|
|
33
|
+
HSTS_max_age?: number;
|
|
34
|
+
frame_options?: "DENY" | "SAMEORIGIN";
|
|
35
|
+
xss_protection?: boolean;
|
|
36
|
+
content_type_options?: boolean;
|
|
37
|
+
referrer_policy?: string;
|
|
38
|
+
content_security_policy?: Record<string, string[]>;
|
|
39
|
+
HSTS_Extras?: string;
|
|
40
|
+
cors_policy?: string;
|
|
41
|
+
cors_opener_policy?: string;
|
|
42
|
+
}
|
|
43
|
+
interface ResponseFormatterOptions {
|
|
44
|
+
include_request_id?: boolean;
|
|
45
|
+
default_success_message?: string;
|
|
46
|
+
default_error_message?: string;
|
|
47
|
+
default_info_message?: string;
|
|
48
|
+
default_not_found_message?: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export type { CookieManagerOptions as C, ForceHTTPSOptions as F, RateLimitRecord as R, SecureHeadersOptions as S, CorsOptions as a, CorsOriginResolver as b, RateLimiterOptions as c, ResponseFormatterOptions as d };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { DataType } from 'sequelize';
|
|
2
|
+
|
|
3
|
+
interface SchemaColumnInterface {
|
|
4
|
+
type: DataType;
|
|
5
|
+
allowNull?: boolean;
|
|
6
|
+
primaryKey?: boolean;
|
|
7
|
+
autoIncrement?: boolean;
|
|
8
|
+
unique?: boolean;
|
|
9
|
+
defaultValue?: any;
|
|
10
|
+
references?: {
|
|
11
|
+
model?: string;
|
|
12
|
+
key: string;
|
|
13
|
+
table?: string;
|
|
14
|
+
};
|
|
15
|
+
onUpdate?: "CASCADE" | "RESTRICT" | "SET NULL" | "NO ACTION";
|
|
16
|
+
onDelete?: "CASCADE" | "RESTRICT" | "SET NULL" | "NO ACTION";
|
|
17
|
+
/**
|
|
18
|
+
* Sequelize getters/setters
|
|
19
|
+
*/
|
|
20
|
+
get?(): any;
|
|
21
|
+
set?(value: any): void;
|
|
22
|
+
/**
|
|
23
|
+
* Validation rules
|
|
24
|
+
*/
|
|
25
|
+
validate?: Record<string, any>;
|
|
26
|
+
/**
|
|
27
|
+
* Optional comment for DB / documentation
|
|
28
|
+
*/
|
|
29
|
+
comment?: string;
|
|
30
|
+
}
|
|
31
|
+
interface IndexFieldOptionsInterface {
|
|
32
|
+
fields: string[];
|
|
33
|
+
name: string;
|
|
34
|
+
using?: string;
|
|
35
|
+
operator?: string;
|
|
36
|
+
unique?: boolean;
|
|
37
|
+
comment?: string;
|
|
38
|
+
}
|
|
39
|
+
interface SchemaDefinitionInterface {
|
|
40
|
+
database_name: string;
|
|
41
|
+
migration_priority: number;
|
|
42
|
+
table_name: string;
|
|
43
|
+
model_name: string;
|
|
44
|
+
timestamps: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Sequelize column definitions
|
|
47
|
+
*/
|
|
48
|
+
columns: Record<string, SchemaColumnInterface>;
|
|
49
|
+
/**
|
|
50
|
+
* Index definitions
|
|
51
|
+
*/
|
|
52
|
+
indexes?: IndexFieldOptionsInterface[];
|
|
53
|
+
}
|
|
54
|
+
interface SchemaSnapshotInterface extends SchemaDefinitionInterface {
|
|
55
|
+
}
|
|
56
|
+
interface ColumnDiffInterface {
|
|
57
|
+
before: SchemaColumnInterface;
|
|
58
|
+
after: SchemaColumnInterface;
|
|
59
|
+
}
|
|
60
|
+
interface IndexDiffInterface {
|
|
61
|
+
before: IndexFieldOptionsInterface;
|
|
62
|
+
after: IndexFieldOptionsInterface;
|
|
63
|
+
}
|
|
64
|
+
interface SchemaDiffInterface {
|
|
65
|
+
table_renamed?: {
|
|
66
|
+
from: string;
|
|
67
|
+
to: string;
|
|
68
|
+
};
|
|
69
|
+
columns: {
|
|
70
|
+
added: string[];
|
|
71
|
+
removed: Record<string, SchemaColumnInterface>;
|
|
72
|
+
modified: Record<string, {
|
|
73
|
+
before: SchemaColumnInterface;
|
|
74
|
+
after: SchemaColumnInterface;
|
|
75
|
+
}>;
|
|
76
|
+
};
|
|
77
|
+
indexes: {
|
|
78
|
+
added: IndexFieldOptionsInterface[];
|
|
79
|
+
removed: IndexFieldOptionsInterface[];
|
|
80
|
+
modified: Record<string, {
|
|
81
|
+
before: IndexFieldOptionsInterface;
|
|
82
|
+
after: IndexFieldOptionsInterface;
|
|
83
|
+
}>;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
interface MigrationRecordInterface {
|
|
88
|
+
name: string;
|
|
89
|
+
}
|
|
90
|
+
type MigrationOperationTypes = "up" | "down";
|
|
91
|
+
type SeederOperationTypes = "up" | "down";
|
|
92
|
+
|
|
93
|
+
export type { ColumnDiffInterface as C, IndexDiffInterface as I, MigrationOperationTypes as M, SchemaColumnInterface as S, IndexFieldOptionsInterface as a, MigrationRecordInterface as b, SchemaDefinitionInterface as c, SchemaDiffInterface as d, SchemaSnapshotInterface as e, SeederOperationTypes as f };
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,94 +1,4 @@
|
|
|
1
|
+
export { C as ColumnDiffInterface, I as IndexDiffInterface, a as IndexFieldOptionsInterface, M as MigrationOperationTypes, b as MigrationRecordInterface, S as SchemaColumnInterface, c as SchemaDefinitionInterface, d as SchemaDiffInterface, e as SchemaSnapshotInterface, f as SeederOperationTypes } from '../migration_type-XLMG0zzO.js';
|
|
1
2
|
export { C as CountLookupItemInterface, E as EnvConfigInterface, a as ErrorHandlingStrategyEnum, L as LogEntryInterface, b as LogLevelType, P as PaginationResultInterface, S as ServerErrorInterface } from '../util_type-Yyo1nXmm.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
interface SchemaColumnInterface {
|
|
5
|
-
type: DataType;
|
|
6
|
-
allowNull?: boolean;
|
|
7
|
-
primaryKey?: boolean;
|
|
8
|
-
autoIncrement?: boolean;
|
|
9
|
-
unique?: boolean;
|
|
10
|
-
defaultValue?: any;
|
|
11
|
-
references?: {
|
|
12
|
-
model?: string;
|
|
13
|
-
key: string;
|
|
14
|
-
table?: string;
|
|
15
|
-
};
|
|
16
|
-
onUpdate?: "CASCADE" | "RESTRICT" | "SET NULL" | "NO ACTION";
|
|
17
|
-
onDelete?: "CASCADE" | "RESTRICT" | "SET NULL" | "NO ACTION";
|
|
18
|
-
/**
|
|
19
|
-
* Sequelize getters/setters
|
|
20
|
-
*/
|
|
21
|
-
get?(): any;
|
|
22
|
-
set?(value: any): void;
|
|
23
|
-
/**
|
|
24
|
-
* Validation rules
|
|
25
|
-
*/
|
|
26
|
-
validate?: Record<string, any>;
|
|
27
|
-
/**
|
|
28
|
-
* Optional comment for DB / documentation
|
|
29
|
-
*/
|
|
30
|
-
comment?: string;
|
|
31
|
-
}
|
|
32
|
-
interface IndexFieldOptionsInterface {
|
|
33
|
-
fields: string[];
|
|
34
|
-
name: string;
|
|
35
|
-
using?: string;
|
|
36
|
-
operator?: string;
|
|
37
|
-
unique?: boolean;
|
|
38
|
-
comment?: string;
|
|
39
|
-
}
|
|
40
|
-
interface SchemaDefinitionInterface {
|
|
41
|
-
database_name: string;
|
|
42
|
-
migration_priority: number;
|
|
43
|
-
table_name: string;
|
|
44
|
-
model_name: string;
|
|
45
|
-
timestamps: boolean;
|
|
46
|
-
/**
|
|
47
|
-
* Sequelize column definitions
|
|
48
|
-
*/
|
|
49
|
-
columns: Record<string, SchemaColumnInterface>;
|
|
50
|
-
/**
|
|
51
|
-
* Index definitions
|
|
52
|
-
*/
|
|
53
|
-
indexes?: IndexFieldOptionsInterface[];
|
|
54
|
-
}
|
|
55
|
-
interface SchemaSnapshotInterface extends SchemaDefinitionInterface {
|
|
56
|
-
}
|
|
57
|
-
interface ColumnDiffInterface {
|
|
58
|
-
before: SchemaColumnInterface;
|
|
59
|
-
after: SchemaColumnInterface;
|
|
60
|
-
}
|
|
61
|
-
interface IndexDiffInterface {
|
|
62
|
-
before: IndexFieldOptionsInterface;
|
|
63
|
-
after: IndexFieldOptionsInterface;
|
|
64
|
-
}
|
|
65
|
-
interface SchemaDiffInterface {
|
|
66
|
-
table_renamed?: {
|
|
67
|
-
from: string;
|
|
68
|
-
to: string;
|
|
69
|
-
};
|
|
70
|
-
columns: {
|
|
71
|
-
added: string[];
|
|
72
|
-
removed: Record<string, SchemaColumnInterface>;
|
|
73
|
-
modified: Record<string, {
|
|
74
|
-
before: SchemaColumnInterface;
|
|
75
|
-
after: SchemaColumnInterface;
|
|
76
|
-
}>;
|
|
77
|
-
};
|
|
78
|
-
indexes: {
|
|
79
|
-
added: IndexFieldOptionsInterface[];
|
|
80
|
-
removed: IndexFieldOptionsInterface[];
|
|
81
|
-
modified: Record<string, {
|
|
82
|
-
before: IndexFieldOptionsInterface;
|
|
83
|
-
after: IndexFieldOptionsInterface;
|
|
84
|
-
}>;
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
interface MigrationRecordInterface {
|
|
89
|
-
name: string;
|
|
90
|
-
}
|
|
91
|
-
type MigrationOperationTypes = "up" | "down";
|
|
92
|
-
type SeederOperationTypes = "up" | "down";
|
|
93
|
-
|
|
94
|
-
export type { ColumnDiffInterface, IndexDiffInterface, IndexFieldOptionsInterface, MigrationOperationTypes, MigrationRecordInterface, SchemaColumnInterface, SchemaDefinitionInterface, SchemaDiffInterface, SchemaSnapshotInterface, SeederOperationTypes };
|
|
3
|
+
export { C as CookieManagerOptions, a as CorsOptions, b as CorsOriginResolver, F as ForceHTTPSOptions, R as RateLimitRecord, c as RateLimiterOptions, d as ResponseFormatterOptions, S as SecureHeadersOptions } from '../middle_ware_type-D8LA7qF3.js';
|
|
4
|
+
import 'sequelize';
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -163,6 +163,7 @@ declare class InputValidatorUtil {
|
|
|
163
163
|
static isProduction(): boolean;
|
|
164
164
|
static isStaging(): boolean;
|
|
165
165
|
static isDevelopment(): boolean;
|
|
166
|
+
static isLive(): boolean;
|
|
166
167
|
/** ✅ Validate ReCaptcha */
|
|
167
168
|
static isValidReCaptcha(recpatcha_token: string): Promise<any>;
|
|
168
169
|
static dirExists(directory: string, create_directory?: boolean, return_dir_path?: boolean): boolean | string;
|
package/dist/utils/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fiberx-backend-toolkit",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.10",
|
|
4
4
|
"description": "A TypeScript backend toolkit providing shared domain logic, infrastructure helpers, and utilities for FiberX server-side applications and services.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/logger_util.ts","../src/config/constants.ts","../src/utils/input_transformer_util.ts","../src/utils/input_validator_util.ts","../src/utils/env_manager_util.ts","../src/utils/sql_formatter_util.ts","../src/utils/server_util.ts","../src/utils/safe_execute_util.ts","../src/utils/cache_util.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport { LOG_DIR } from \"@/config/constants\";\nimport {\n LogEntryInterface,\n LogLevelType,\n} from \"@/types/util_type\"\n\nclass LoggerUtil {\n private readonly module_name: string;\n private readonly base_dir: string;\n private readonly log_file_path: string;\n private readonly log_directory: string;\n private readonly store_log_locally: boolean;\n\n constructor(module_name: string) {\n this.module_name = module_name;\n this.store_log_locally = true;\n this.base_dir = process.cwd();\n this.log_directory = this.ensureDirExists(LOG_DIR)\n this.log_file_path = this.getLogFilePath();\n }\n\n /**\n * Ensures a directory exists. If it doesn't, creates it.\n * @param directory_path - Path to the directory\n * @returns The absolute path of the ensured directory\n */\n private ensureDirExists(directory_path: string): string {\n const resolved_path = path.resolve(directory_path);\n\n if (!fs.existsSync(resolved_path)) {\n fs.mkdirSync(resolved_path, { recursive: true });\n }\n\n return resolved_path;\n }\n\n /**\n * Generate log unique log file name with timestamp and module name\n * @returns The absolute path of the module log file\n */\n private getLogFilePath():string {\n const timestamp = Math.floor(Date.now() / 1000);\n const file_name = `${this.module_name}-${timestamp}.log`;\n const log_file_path = path.join(this.log_directory, file_name);\n\n return log_file_path;\n }\n\n // Safely stringify objects while avoiding circular references\n private safeStringify(\n obj: unknown, \n space = 2\n ): string {\n const seen = new WeakSet();\n return JSON.stringify(\n obj, \n (key, value) => {\n if (typeof value === \"object\" && value !== null) {\n if (seen.has(value)) { return \"[Circular]\"; }\n\n seen.add(value);\n }\n\n return value;\n },\n space\n );\n }\n\n // Log a message with optional error data and level\n private log( \n message = \"\", \n data_error: unknown = {}, \n status: LogLevelType = \"INFO\"\n ): LogEntryInterface {\n const timestamp = new Date().toISOString();\n const error_str = data_error && typeof data_error === \"object\" && Object.keys(data_error as object).length ? this.safeStringify(data_error, 0) : \"\";\n const formatted_message = message.startsWith(`[${this.module_name}]`) ? message : `[${this.module_name}] ${message}`;\n const log_line = `${timestamp} [${status}] ${formatted_message} ${error_str}\\n`;\n const log_entry: LogEntryInterface = { timestamp, status, message, data_error: data_error };\n\n\n if (this.store_log_locally) { fs.appendFileSync(this.log_file_path, log_line); }\n\n console.log(`\\n${timestamp} [${status}] ${formatted_message}\\n`);\n\n if (data_error && typeof data_error === \"object\" && Object.keys(data_error as object).length) {\n console.log({ ...data_error });\n console.log(\"\\n\");\n console.log(\"========================================\");\n }\n\n return log_entry;\n }\n\n // Log info-level messages\n public info(message: string, data: unknown = \"\"): LogEntryInterface { return this.log(message, data, \"INFO\"); }\n\n // Log error-level messages\n public error(message: string, error: unknown = \"\"): LogEntryInterface { return this.log(message, error, \"ERROR\"); }\n\n // Log alert-level messages\n public alert(message: string, data: unknown = \"\"): LogEntryInterface { return this.log(message, data, \"ALERT\"); }\n\n // Log success-level messages\n public success(message: string, data: unknown = \"\"): LogEntryInterface { return this.log(message, data, \"SUCCESS\"); }\n\n // Log how long a method took to execute\n public logExecutionTime(start_time: [number, number], class_name: string, method_name: string): void {\n const [seconds, nanoseconds] = process.hrtime(start_time);\n const duration_ms = (seconds * 1000 + nanoseconds / 1e6).toFixed(2);\n\n this.info(`${class_name} - ${method_name} completed in ${duration_ms}ms`);\n }\n}\n\nexport default LoggerUtil;","import { RateLimiterOptions } from \"@/types/middle_ware_type\";\nimport path from \"path\";\n\n// Database constants\nexport const BASE_DIR = process.cwd();\nexport const LOG_DIR = path.join(BASE_DIR, \"logs\");\nexport const ENV_VAR_DIR = path.join(BASE_DIR, \"environment_varaiables\");\nexport const SCHEMAS_DIR = path.join(BASE_DIR, \"src/database/schemas\");\nexport const SCHEMA_SNAPSHOTS_DIR = path.join(BASE_DIR, \"src/database/schema_snapshots\");\nexport const MODELS_DIR = path.join(BASE_DIR, \"src/database/models\");\nexport const MIGRATIONS_DIR = path.join(BASE_DIR, \"src/database/migrations\");\nexport const SEEDERS_DIR = path.join(BASE_DIR, \"src/database/seeders\");\n\nexport const SEQUELIZE_META_TABLE_NAME = \"sequelize_database_tables_meta\";\nexport const SEQUELIZE_SEEDER_META_TABLE_NAME = \"sequelize_database_table_seeder_meta\";\n\nexport const REQUEST_ID_COOKIE_MAX_AGE = (1000 * 60 * 60 * 24 * 7); // 7 days\n\n// CORS constants\nexport const CORS_ALLOWED_METHODS = [\"GET\", \"POST\", \"PATCH\", \"DELETE\", \"OPTIONS\"];\nexport const CORS_ALLOWED_HEADERS = [ \"Content-Type\", \"Authorization\", \"X-Device-Id\", \"X-Device-Name\", \"User-Agent\"];\nexport const CORS_MAX_AGE_IN_SECONDS = (600) // default: 10 min\nexport const CORS_MAX_AGE_IN_MICRO_SECONDS = (1000 * 60 * 10); // 10 minutes\n\n// Rate limitter\nexport const REQUEST_RATE_LIMITTER_OPTIONS = {\n window_ms: (60 * 1000), // 1 MINS\n max_requests: 50,\n message: \"⏳ Too many requests from this IP, please try again later\"\n}","import axios from \"axios\";\nimport bcrypt from \"bcrypt\";\nimport dayjs from \"dayjs\";\n\nimport {\n CountLookupItemInterface,\n PaginationResultInterface,\n} from \"@/types/util_type\";\n\n// Utility class for transforming and formatting input values\nclass InputTransformerUtil {\n /**\n * Lookup table for number formatting suffixes\n */\n private static count_lookup: CountLookupItemInterface[] = [\n { value: 1, symbol: \"\" },\n { value: 1_000, symbol: \"K\" },\n { value: 1_000_000, symbol: \"M\" },\n { value: 1_000_000_000, symbol: \"B\" },\n { value: 1_000_000_000_000, symbol: \"T\" },\n ];\n\n /**\n * Capitalize the first letter of a string\n */\n public static capitalize(input: string): string {\n return input\n ? input.charAt(0).toUpperCase() + input.slice(1).toLowerCase()\n : input;\n }\n\n /**\n * Capitalize the first letter of each word in a string\n */\n public static capitalizeEachWord(input?: string): string {\n if (!input) {\n return \"\";\n }\n\n return input\n .split(\" \")\n .map((word) => this.capitalize(word))\n .join(\" \");\n }\n\n /**\n * Format date of birth to YYYY-MM-DD\n */\n public static formatDob(dob?: string | Date | null): string | null {\n return dob ? dayjs(dob).format(\"YYYY-MM-DD\") : null;\n }\n\n /**\n * Format full name from first and last name\n */\n public static formatMemberFullName(\n first_name?: string,\n last_name?: string\n ): string | null {\n return first_name && last_name ? `${first_name} ${last_name}` : null;\n }\n\n /**\n * Format member preview string\n */\n public static formatMemberPreview(\n first_name?: string,\n last_name?: string,\n public_id?: string\n ): string | null {\n return first_name && last_name && public_id\n ? `(${public_id}) - ${first_name} ${last_name}`\n : null;\n }\n\n /**\n * Format a number with commas\n */\n public static formatAmount(amount: number): string {\n if (!amount) {\n return \"0\";\n }\n\n return amount > 0\n ? Intl.NumberFormat(\"en-US\").format(amount)\n : amount.toString();\n }\n\n /**\n * Format large numbers with suffixes (K, M, B, T)\n */\n public static nFormatter(num: number, digits = 1): string {\n const lookup_item = this.count_lookup\n .slice()\n .reverse()\n .find((item) => num >= item.value);\n\n if (!lookup_item) {\n return \"0\";\n }\n\n const formatted_value = (num / lookup_item.value)\n .toFixed(digits)\n .replace(/\\.0+$|(\\.[0-9]*[1-9])0+$/, \"$1\");\n\n return `${formatted_value}${lookup_item.symbol}`;\n }\n\n /**\n * Round a number to two decimal places\n */\n public static roundToTwoDecimalPlaces(value: number): number {\n if (typeof value !== \"number\") {\n throw new Error(\"Input must be a number\");\n }\n\n return Math.round(value * 100) / 100;\n }\n\n /**\n * Remove leading zeros from a number or string\n */\n public static removeLeadingZeros(value: string | number): string {\n return value.toString().replace(/^0+/, \"\") || \"0\";\n }\n\n /**\n * Get country/location based on IP address\n */\n public static async ipAddressToLocation(\n ip_address: string | null = null\n ): Promise<string> {\n try {\n const suffix =\n !ip_address || ip_address === \"::1\"\n ? \"s\"\n : `?ip=${ip_address}`;\n\n const response = await axios.get(`https://ip2c.org/${suffix}`);\n const response_text = response.data.toString();\n\n if (response_text[0] === \"1\") {\n const location_parts = response_text.split(\";\");\n return location_parts[location_parts.length - 1];\n }\n\n return \"Unknown\";\n } catch (error) {\n console.error(\n `Error fetching location for IP ${ip_address}:`,\n error\n );\n return \"Unknown\";\n }\n }\n\n /**\n * Convert date of birth string to age\n */\n public static dobToAge(dob_string: string): number {\n const dob_date = new Date(dob_string);\n const today = new Date();\n\n let age = today.getFullYear() - dob_date.getFullYear();\n const month_difference =\n today.getMonth() - dob_date.getMonth();\n\n if (\n month_difference < 0 ||\n (month_difference === 0 &&\n today.getDate() < dob_date.getDate())\n ) {\n age--;\n }\n\n return age;\n }\n\n /**\n * Hash plain text password\n */\n public static textToPasswordHash(password: string): string {\n return bcrypt.hashSync(password, bcrypt.genSaltSync(10));\n }\n\n /**\n\t * Ensures singular, snake_case, and appends `_schema`\n\t * Example:\n\t * - \"Users\" → \"user_schema\"\n\t * - \"UserProfile\" → \"user_profile_schema\"\n\t */\n\tpublic static toSchemaFileName(input: string): string {\n\t\tconst snake = this.toSnakeCase(input);\n\n\t\t// naive singularization (good enough for now)\n\t\tconst singular = snake.endsWith(\"s\") ? snake.slice(0, -1) : snake;\n\n\t\treturn `${singular}_schema`;\n\t}\n\n /**\n * Convert snake_case to Title Case\n */\n public static toTitleCase(input: string): string {\n return input\n .split(\"_\")\n .map(\n (word) =>\n word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join(\" \");\n }\n\n /**\n * Convert snake_case to PascalCase\n */\n public static toPascalCase(input: string): string {\n return input\n .split(\"_\")\n .map(\n (word) =>\n word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join(\"\");\n }\n\n /**\n * Convert string to snake_case\n */\n public static toSnakeCase(input: string): string {\n return input\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1_$2\")\n .toLowerCase();\n }\n\n /**\n * Pluralize a snake_case string\n */\n public static pluralizeSnakeCase(\n snake_str: string\n ): string {\n const parts = snake_str.split(\"_\");\n const last_word = parts.pop() as string;\n\n let plural_word: string;\n\n if (\n last_word.endsWith(\"y\") &&\n !/[aeiou]y$/.test(last_word)\n ) {\n plural_word = last_word.slice(0, -1) + \"ies\";\n } else if (\n [\"s\", \"x\", \"z\"].includes(last_word.slice(-1)) ||\n last_word.endsWith(\"ch\") ||\n last_word.endsWith(\"sh\")\n ) {\n plural_word = `${last_word}es`;\n } else {\n plural_word = `${last_word}s`;\n }\n\n return [...parts, plural_word].join(\"_\");\n }\n\n /**\n * Remove empty, null, or undefined fields from an object\n */\n public static filterOutEmptyFields(\n obj: Record<string, any>\n ): Record<string, any> {\n const filtered_object: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (\n value !== null &&\n value !== undefined &&\n !(typeof value === \"string\" && value.trim() === \"\") &&\n !(Array.isArray(value) && value.length === 0)\n ) {\n filtered_object[key] = value;\n }\n }\n\n return filtered_object;\n }\n\n /**\n * Safely parse JSON input\n */\n public static toJson<T = unknown>(\n json_input: string | unknown | null | undefined\n ): T | null {\n try {\n if (!json_input) {\n return null;\n }\n\n if (typeof json_input === \"string\") {\n return JSON.parse(json_input) as T;\n }\n\n if (typeof json_input === \"object\") {\n return json_input as T;\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n /**\n * Calculate pagination offset and limit\n */\n public static calculatePaginationOffset(\n page: number,\n size: number\n ): { limit: number; offset: number } {\n const page_number = page > 0 ? page - 1 : 0;\n const adjusted_size = size > 200 ? 200 : size;\n const limit = adjusted_size || 10;\n const offset = page_number * limit;\n\n return { limit, offset };\n }\n\n /**\n * Format paginated response\n */\n public static formatPaginatedResponse(\n page: number,\n limit: number,\n data: { rows: any[]; count: number }\n ): PaginationResultInterface {\n const { count: total_items, rows: records } = data;\n\n const current_page = page || 0;\n const total_pages = Math.ceil(total_items / limit);\n\n return {\n total_items,\n records,\n total_pages,\n current_page,\n };\n }\n\n /**\n * Compare two records and detect changes\n */\n public static detectChanges(\n old_record: Record<string, any> = {},\n new_record: Record<string, any> = {},\n keys_to_check?: string[]\n ): {\n readable: string;\n structured: Record<string, { old: any; new: any }>;\n } {\n const structured_diff: Record<\n string,\n { old: any; new: any }\n > = {};\n\n const all_keys =\n keys_to_check ?? Object.keys(new_record);\n\n for (const key of all_keys) {\n const old_value = old_record[key];\n const new_value = new_record[key];\n\n if (old_value == new_value) {\n continue;\n }\n\n const formatted_old =\n typeof old_value === \"object\" &&\n old_value !== null\n ? JSON.stringify(old_value)\n : String(old_value ?? \"null\");\n\n const formatted_new =\n typeof new_value === \"object\" &&\n new_value !== null\n ? JSON.stringify(new_value)\n : String(new_value ?? \"null\");\n\n structured_diff[key] = {\n old: formatted_old,\n new: formatted_new,\n };\n }\n\n const readable_changes = Object.entries(\n structured_diff\n )\n .map(\n ([key, value]) =>\n `${key} changed from '${value.old}' → '${value.new}'`\n )\n .join(\"; \");\n\n return {\n readable:\n readable_changes ||\n \"No significant changes detected\",\n structured: structured_diff,\n };\n }\n\n /**\n * Normalize social links object keys\n */\n public static formatLinksObject(\n links: Record<string, string>\n ): Record<string, string> {\n const formatted_links: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(links)) {\n const normalized_key = key\n .toLowerCase()\n .endsWith(\"_link\")\n ? key.toLowerCase()\n : `${key.toLowerCase()}_link`;\n\n formatted_links[normalized_key] = value;\n }\n\n return formatted_links;\n }\n}\n\nexport default InputTransformerUtil;\n","import fs from \"fs\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport isSameOrAfter from \"dayjs/plugin/isSameOrAfter\";\nimport bcrypt from \"bcrypt\";\nimport axios from \"axios\";\n// import speakeasy from \"speakeasy\";\n\nimport EnvManagerUtil from \"@/utils/env_manager_util\";\n\ndayjs.extend(isSameOrAfter);\n\nclass InputValidatorUtil {\n private static readonly optional_field_regex = /^[a-zA-Z0-9_\\-]+$/; \n private static readonly name_regex_reg_exp = /^[A-Za-z.'\\s/_-]*$/;\n private static readonly namey_regex_reg_exp = /^[A-Za-z0-9.'\\s,/_\\-()&]*$/;\n private static readonly email_regex_reg_exp = /^(?=.{1,255}$)[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,190}\\.[a-zA-Z]{2,}$/i;\n private static readonly tel_regex_reg_exp = /^[\\s()+-]*([0-9][\\s()+-]*){6,20}$/;\n private static readonly pass_regex_reg_exp = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{6,}$/\n private static readonly url_regex_reg_exp = /^(https?:\\/\\/)?((localhost|[a-zA-Z0-9-_.]+)(:[0-9]{1,5})?)(\\/[a-zA-Z0-9-._~:/?#@!$&'()*+,;=%]*)?$/;\n private static readonly text_area_regex_reg_exp = /^(?=.*[a-zA-Z])[\\p{L}\\p{N}\\p{P}\\p{Zs}–—“”‘’]*$/u;\n private static readonly uuid_regex_reg_exp = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n private static readonly custom_uuid_regex_reg_exp = /^[A-Z0-9]{12}-[A-Z0-9]{12}-[A-Z0-9]{12}-[A-Z0-9]{12}$/;\n private static readonly env_manager = EnvManagerUtil.getInstance();\n\n public static isValidateIn = (value: any, allowed: any[]) => allowed.includes(value);\n\n /** ✅ Check member roles */\n static isAdmin(name: string) { return [\"SuperAdmin\", \"AdminI\", \"AdminT\"].includes(name); }\n\n static isSuperAdmin(name: string) { return name === \"SuperAdmin\"; }\n\n static isLowerSnakeCase(str: string): boolean { return /^[a-z]+(_[a-z]+)*$/.test(str); }\n\n static isUpperPascalCase(str: string): boolean { return /^[A-Z][a-zA-Z]*$/.test(str); }\n\n static isEmpty(input: any): boolean { return !input || input.toString().trim() === \"\"; }\n\n static isValidOptionalField(str: string): boolean { return this.optional_field_regex.test(str); }\n\n static isValidName(name: string): boolean { return this.name_regex_reg_exp.test(name); }\n\n static isValidNamey(name: string): boolean { return this.namey_regex_reg_exp.test(name); }\n\n static isValidEmail(email: string): boolean { return this.email_regex_reg_exp.test(email) && email.length <= 254; }\n\n static isValidPhoneNumber(tel: string): boolean { return this.tel_regex_reg_exp.test(tel); }\n\n static isValidPassword(password: string): boolean { return this.pass_regex_reg_exp.test(password); }\n\n static isDigit(input: any): boolean { return !isNaN(input); }\n\n static isValidInteger(input: any): boolean { return Number.isInteger(input) && input > 0; }\n\n static isValidFloat(input: any): boolean { return !isNaN(input) && parseFloat(input) > 0; }\n\n static isValidURLY(url: string): boolean {\n try { \n new URL(url);\n return true;\n } \n catch (_) { return false; }\n }\n\n static isValidURL(url: string): boolean { return this.url_regex_reg_exp.test(url) && this.isValidURLY(url); }\n\n static isBoolean(value: any): boolean { return typeof value === \"boolean\" || [\"1\", \"0\"].includes(String(value)); }\n\n static isValidLongText(text: string): boolean {\n if (!text || typeof text !== \"string\") { return false; }\n\n const forbidden_pattern = /[<>{};`]/;\n\n if (forbidden_pattern.test(text)) { return false; }\n \n return this.text_area_regex_reg_exp.test(text.trim());\n }\n\n static isValidUUID(uuid: string): boolean { return this.uuid_regex_reg_exp.test(uuid); }\n \n static isValidCustomUUID(uuid: string): boolean { return this.custom_uuid_regex_reg_exp.test(uuid); }\n \n static isArrayUnique(arr: any[]): boolean { return new Set(arr).size === arr.length; }\n \n static isValidFutureDate(date_string: string): boolean {\n const date = dayjs(date_string);\n\n return date.isValid() && date.isAfter(dayjs());\n }\n\n static isValidDateAndDifference(\n input?: string | null,\n unit: \"years\" | \"days\" | \"hours\" | \"minutes\" | \"seconds\" = \"years\"\n ): { date: Dayjs; difference: number } | null {\n if(!input) { return null }\n \n const date = dayjs(input);\n\n // Check validity\n if (!date.isValid()) { return null; }\n\n // Compute difference between now and the input date\n return { date, difference: dayjs().diff(date, unit) };\n }\n\n /** ✅ Validate password hash */\n static async isValidHashPassword(password: string, hash_password: string): Promise<boolean> { \n if(!password || !hash_password) { return false }\n\n return await bcrypt.compare(password, hash_password); \n }\n\n /** ✅ Check environment */\n static isProduction() { return InputValidatorUtil?.env_manager?.env_data?.MODE === \"production\"; }\n\n static isStaging() { return InputValidatorUtil?.env_manager?.env_data?.MODE === \"staging\"; }\n\n static isDevelopment() { return InputValidatorUtil?.env_manager?.env_data?.MODE === \"development\"; }\n\n /** ✅ Validate ReCaptcha */\n static async isValidReCaptcha(\n recpatcha_token: string\n ) {\n const {\n RECAPTCHA_SECRET_KEY,\n RECPATHA_VERIFY_URL\n } = InputValidatorUtil?.env_manager?.env_data\n try {\n const secret_key = RECAPTCHA_SECRET_KEY\n const url = RECPATHA_VERIFY_URL;\n const params = { secret: secret_key, response: recpatcha_token }\n const response = await axios.post(url!, null, { params });\n\n return response.data.success;\n } \n catch (error) {\n console.error(\"reCAPTCHA verification failed:\", error);\n return false;\n }\n }\n\n // Method to check if a directory exists\n\tstatic dirExists (\n directory: string, \n create_directory: boolean = false, \n return_dir_path: boolean = false\n ): boolean | string { \n const exist = fs.existsSync(directory); \n\n if(!create_directory) { return exist }\n\n if (!exist) { fs.mkdirSync(directory); }\n\n return return_dir_path ? directory : true;\n }\n\n}\n\nexport default InputValidatorUtil;","import fs from \"fs\";\nimport path from \"path\";\nimport yaml from \"js-yaml\";\nimport axios from \"axios\";\n\nimport LoggerUtil from \"./logger_util\";\nimport { EnvConfigInterface } from \"@/types/util_type\";\nimport { ENV_VAR_DIR } from \"@/config/constants\";\n\nclass EnvManagerUtil {\n public readonly name = \"env_manager_util\";\n public env_file_name: string = \"env.yaml\";\n\n private static instance: EnvManagerUtil;\n\n private readonly yaml_env_file_path: string;\n private readonly logger: LoggerUtil;\n\n public env_data: EnvConfigInterface;\n\n // 🔒 Private constructor\n private constructor() {\n this.env_file_name = this.getEnvFileName();\n this.yaml_env_file_path = path.join(ENV_VAR_DIR, this.env_file_name);\n this.logger = new LoggerUtil(this.name);\n this.env_data = this.readENVData();\n }\n\n // Method to get env file name\n private getEnvFileName (): string {\n if (process?.env?.MODE === \"development\") { return \"env.yaml\" }\n\n else if (process?.env?.MODE === \"staging\") { return \"staging_env.yaml\" }\n\n else if (process?.env?.MODE === \"production\") { return \"production_env.yaml\" }\n\n else { return \"env.yaml\" }\n }\n\n // ✅ Global access point\n public static getInstance(): EnvManagerUtil {\n if (!EnvManagerUtil.instance) {\n EnvManagerUtil.instance = new EnvManagerUtil();\n }\n return EnvManagerUtil.instance;\n }\n\n // Read environment data from YAML\n private readENVData(): EnvConfigInterface {\n try {\n if (!fs.existsSync(this.yaml_env_file_path)) {\n this.logger.info(`YAML file not found at: ${this.yaml_env_file_path}`);\n return {};\n }\n\n const file_content = fs.readFileSync(this.yaml_env_file_path, \"utf8\");\n return (yaml.load(file_content) as EnvConfigInterface) || {};\n } catch (error: unknown) {\n this.logger.error(`${this.name} - readENVData`, { error });\n return {};\n }\n }\n\n // Get env var from YAML → process.env → default \n public getEnvVar<T = any>(key: string, default_value?: T): T | undefined {\n if (key in this.env_data) { return this.env_data[key]; }\n\n if (key in process.env) { return process.env[key] as T; }\n\n return default_value;\n }\n\n // Fetch remote env variables and merge\n public async fetchRemoteEnv(url: string): Promise<void> {\n try {\n const response = await axios.get(url);\n\n if (typeof response.data === \"object\" && response.data !== null) {\n this.env_data = { ...this.env_data, ...response.data };\n this.logger.success(\"Remote env variables loaded.\");\n } else {\n this.logger.error(\"Unexpected response format from remote env endpoint.\");\n }\n } catch (error: unknown) {\n this.logger.error(`${this.name} - fetchRemoteEnv`, { error });\n }\n }\n}\n\nexport default EnvManagerUtil;\n","class SqlFormatterUtil {\n\n // Basic ANSI color helpers\n private static AnsiColor = {\n reset: \"\\x1b[0m\",\n cyan: (text: string) => `\\x1b[36m${text}\\x1b[0m`,\n green: (text: string) => `\\x1b[32m${text}\\x1b[0m`,\n yellow: (text: string) => `\\x1b[33m${text}\\x1b[0m`,\n red: (text: string) => `\\x1b[31m${text}\\x1b[0m`,\n };\n\n private static sqlColors: Record<string, (text: string) => string> = {\n SELECT: SqlFormatterUtil.AnsiColor.cyan,\n INSERT: SqlFormatterUtil.AnsiColor.green,\n UPDATE: SqlFormatterUtil.AnsiColor.yellow,\n DELETE: SqlFormatterUtil.AnsiColor.red,\n };\n\n /**\n * Normalize SQL:\n * - Collapse multiple whitespaces/newlines\n * - Remove extra spaces inside parentheses\n */\n public static normalize(sql: string): string {\n return sql\n .replace(/\\s+/g, \" \")\n .replace(/\\(\\s+/g, \"(\")\n .replace(/\\s+\\)/g, \")\")\n .trim();\n }\n\n /**\n * Colorize SQL keywords (SELECT, INSERT, UPDATE, DELETE)\n */\n public static colorize(sql: string): string {\n const first_word = sql.split(\" \")[0].toUpperCase();\n const colorFN = this.sqlColors[first_word];\n \n return colorFN ? colorFN(sql) : sql;\n }\n\n /**\n * Full formatting for logging\n */\n public static format(sql: string): string {\n return this.colorize(this.normalize(sql));\n }\n}\n\nexport default SqlFormatterUtil;\n","import { Server } from \"http\";\nimport { LoggerUtil } from \"@/utils\"\nimport { ServerErrorInterface } from \"@/types\";\n\nclass ServerUtil {\n public readonly name: string = \"server_util\";\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);\n private readonly port: number;\n\n constructor(port: number) {\n this.port = port || 4000;\n }\n\n // Method to print app banner\n private printAppBanner (app_name: string): void {\n const raw = app_name.replace(/[-_]/g, \" \");\n const title = raw.toUpperCase();\n const border_char = \"═\";\n const corner_tl = \"╔\";\n const corner_tr = \"╗\";\n const corner_bl = \"╚\";\n const corner_br = \"╝\";\n const side_char = \"║\";\n const padding = 4;\n const content_width = title.length + padding * 2;\n const border = border_char.repeat(content_width);\n\n const line1 = `${corner_tl}${border}${corner_tr}`;\n const line2 = `${side_char} ${\" \".repeat(padding)}${title}${\" \".repeat(padding)}${side_char} `;\n const line3 = `${corner_bl}${border}${corner_br} `;\n\n console.log(\"\\n\" + line1);\n console.log(line2);\n console.log(line3 + \"\\n\");\n }\n\n // Method to handle server errors\n public onServerError (error: ServerErrorInterface): void {\n if (error.syscall !== \"listen\") { \n this.logger.error(\"Unexpected server error\", { error });\n throw error; \n }\n\n const bind = `Port ${this.port}`;\n\n switch (error.code) {\n case \"EACCES\":\n this.logger.error(`${bind} requires elevated privileges`);\n process.exit(1);\n break;\n case \"EADDRINUSE\":\n this.logger.error(`${bind} is already in use`);\n process.exit(1);\n break;\n default:\n throw error;\n }\n }\n\n // Method to handle server listening\n public onServerListening = (server: Server): void => {\n this.printAppBanner(\"fibase-server-app\");\n\n const addr = server.address();\n const bind = typeof addr === \"string\" ? `pipe ${addr}` : `port ${addr?.port}`;\n\n this.logger.info(`Listening on ${bind}`);\n }\n}\n\nexport default ServerUtil;","\nimport { Response } from \"express\";\n\nimport { LoggerUtil } from \"@/utils\";\nimport { ErrorHandlingStrategyEnum } from \"@/types/util_type\";\n\n\n\nclass SafeExecuteUtil {\n // Store instances by class constructor (WeakMap ensures GC can clean up)\n private static instances = new WeakMap<object, any>();\n\n // Store instances by string keys (Map keeps strong references)\n private static named_insatnces = new Map<string, any>();\n\n public static setInstance(key: object, instance: any) {\n SafeExecuteUtil.instances.set(key, instance);\n }\n\n /** Set instance by string key */\n public static setNamedInstance(key: string, instance: any) {\n SafeExecuteUtil.named_insatnces.set(key, instance);\n }\n\n private static getInstance(key: object, fallback: any) {\n return SafeExecuteUtil.instances.get(key) ?? fallback;\n }\n\n /** Get instance by string key */\n public static getNamedInstance(key: string, fallback?: any) {\n return SafeExecuteUtil.named_insatnces.get(key) ?? fallback;\n }\n\n // Method to Safely stringify any object for logging\n private static safeStringify(obj: unknown): string {\n try { return JSON.stringify(obj); }\n catch { return \"[Unserializable Params]\"; }\n }\n\n // 🔹 Method to Execution time logger\n private static logExecutionTime(\n start: [number, number], \n class_name: string, \n method_name: string, \n logger: LoggerUtil\n ) {\n const [seconds, nanoseconds] = process.hrtime(start);\n const ms = (seconds * 1000 + nanoseconds / 1e6).toFixed(2);\n\n logger.info(`[${class_name}] ⏱️ ${method_name} executed in ${ms}ms`);\n }\n\n // Method to handle on error action\n private static handleOnErrorAction (\n error: unknown, \n strategy: ErrorHandlingStrategyEnum, \n default_value: any, \n controller_response?: Response\n ) {\n if (strategy === ErrorHandlingStrategyEnum.CONTROLLER_ERROR && controller_response?.errResponse) {\n return controller_response?.errResponse?.(500, \"invalid_error_request\");\n }\n switch (strategy) {\n case ErrorHandlingStrategyEnum.RETURN_DEFAULT: return default_value;\n case ErrorHandlingStrategyEnum.EXIT_PROCESS: process.exit(1);\n case ErrorHandlingStrategyEnum.THROW_ERROR: throw error;\n } \n \n return;\n }\n\n // 🔹 Method to Unifysafe execution wrapper (normal methods)\n public static createSafeFunction<T>(\n class_name: string,\n method_name: string,\n original_method: (...args: any[]) => T | Promise<T>,\n strategy: ErrorHandlingStrategyEnum,\n default_value?: T,\n ): (...args: any[]) => Promise<T | undefined> {\n return async function (this: any, ...args: any[]): Promise<T | undefined> {\n const class_instance = SafeExecuteUtil.getNamedInstance(class_name, this);\n const logger: LoggerUtil = class_instance?.logger || new LoggerUtil(class_name);\n const method_params = args;\n\n try {\n return await original_method.apply(class_instance, method_params);\n } \n catch (error: unknown) {\n const safely_stringified_error = SafeExecuteUtil.safeStringify(error);\n logger.error(`[${class_name}] ❌ Error in method ${method_name}`, { method_params, error, safely_stringified_error});\n SafeExecuteUtil.handleOnErrorAction(error, strategy, default_value); \n }\n };\n }\n\n // 🔹 Unified safe execution wrapper with timing (for controller/service)\n private static createTimedSafeFunction<T>(\n class_name: string,\n method_name: string,\n original_method: (...args: any[]) => T | Promise<T>,\n strategy: ErrorHandlingStrategyEnum,\n default_value?: T,\n ): (...args: any[]) => Promise<T | undefined> {\n return async function (this: any, ...args: any[]): Promise<T | undefined> {\n const class_instance = SafeExecuteUtil.getNamedInstance(class_name, this);\n const logger: LoggerUtil = class_instance?.logger || new LoggerUtil(class_name);\n const start_time = process.hrtime();\n const method_params = args;\n const controller_response = args && args.length ? args[1] : undefined;\n\n try {\n const result = await original_method.apply(class_instance, args);\n return result\n } \n catch (error: unknown) {\n const safely_stringified_error = SafeExecuteUtil.safeStringify(error);\n logger.error(`[${class_name}] ❌ Error in method ${method_name}`, { method_params, error, safely_stringified_error});\n SafeExecuteUtil.handleOnErrorAction(error, strategy, default_value, controller_response); \n } \n finally { \n SafeExecuteUtil.logExecutionTime(start_time, class_name, method_name, logger); \n }\n }\n };\n\n // Decorator Method to handle wrapping cclass methods\n private static applySafeWrapper(\n target: Object, \n class_name: string,\n property_key: string | symbol, \n descriptor: PropertyDescriptor,\n strategy: ErrorHandlingStrategyEnum,\n timed: boolean,\n default_value?: any,\n ) {\n if (typeof descriptor.value !== \"function\") { return; }\n\n descriptor.value = timed ? \n SafeExecuteUtil.createTimedSafeFunction(\n class_name,\n String(property_key), \n descriptor.value, \n strategy,\n default_value,\n )\n :\n SafeExecuteUtil.createSafeFunction(\n class_name,\n String(property_key), \n descriptor.value, \n strategy,\n default_value\n )\n }\n\n // Decorator method to handle controller methods\n public static safeExecuteController(\n class_name: string\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.CONTROLLER_ERROR,\n true\n );\n }\n }\n\n // Decorator Method to handle service methods\n public static safeExecuteService(\n class_name: string, \n default_value?: any\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT, \n true,\n default_value\n )\n }\n }\n\n // Decorator Method to wrap method with retrun value\n public static safeExecuteReturn<T = any>(\n class_name: string, \n default_value?: T\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT,\n false,\n default_value\n )\n }\n }\n\n // Decorator Method to wrap method with retrun value\n public static safeExecuteTransaction<T = any>(\n class_name: string, \n default_value?: T\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT, \n false,\n default_value\n )\n }\n }\n\n // Decorator method to wrap method with void return\n public static safeExecute(class_name: string) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT,\n false\n );\n }\n }\n \n // Decorator method to wrap method with void return\n public static safeExecuteExit(class_name: string) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.EXIT_PROCESS,\n false\n );\n }\n }\n\n // Decorator method to wrap method with void return\n public static safeExecuteThrow(class_name: string) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.THROW_ERROR,\n false\n );\n }\n }\n\n\n}\n\nexport default SafeExecuteUtil;","type CacheEntry<T> = {\n value: T;\n expires_at: number; // unix ms timestamp\n};\n\nclass InMemoryCache<T = unknown> {\n private store = new Map<string, CacheEntry<T>>();\n\n /**\n * Set a cache value with TTL (ms)\n */\n public set(key: string, value: T, ttl_ms: number): void {\n if (!key) return;\n\n const expires_at = Date.now() + ttl_ms;\n this.store.set(key, { value, expires_at });\n }\n\n /**\n * Get a cache value (returns undefined if missing or expired)\n */\n public get(key: string): T | undefined {\n const entry = this.store.get(key);\n\n if (!entry) return undefined;\n\n if (Date.now() > entry.expires_at) {\n this.store.delete(key);\n return undefined;\n }\n\n return entry.value;\n }\n\n /**\n * Check if a key exists and is valid\n */\n public has(key: string): boolean {\n return this.get(key) !== undefined;\n }\n\n /**\n * Update an existing cache entry (keeps old TTL)\n */\n public update(key: string, value: T): boolean {\n const entry = this.store.get(key);\n\n if (!entry) return false;\n\n if (Date.now() > entry.expires_at) {\n this.store.delete(key);\n return false;\n }\n\n this.store.set(key, { ...entry, value });\n return true;\n }\n\n /**\n * Delete a single cache entry\n */\n public delete(key: string): boolean {\n return this.store.delete(key);\n }\n\n /**\n * Clear entire cache\n */\n public clear(): void {\n this.store.clear();\n }\n\n /**\n * Manually expire a key immediately\n */\n public expire(key: string): void {\n this.store.delete(key);\n }\n\n /**\n * Cleanup expired entries (optional call)\n */\n public cleanup(): void {\n const now = Date.now();\n for (const [key, entry] of this.store.entries()) {\n if (now > entry.expires_at) {\n this.store.delete(key);\n }\n }\n }\n\n /**\n * Cache size (for metrics)\n */\n public size(): number {\n return this.store.size;\n }\n}\n\nexport default InMemoryCache;\n"],"mappings":"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","names":["path","path","fs","dayjs","bcrypt","axios","fs","path","axios","path","fs","axios","dayjs","bcrypt","axios","fs"]}
|