fiberx-backend-toolkit 0.0.7 → 0.0.8

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.
@@ -1,9 +1,19 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
1
3
  var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
4
  get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
5
  }) : x)(function(x) {
4
6
  if (typeof require !== "undefined") return require.apply(this, arguments);
5
7
  throw Error('Dynamic require of "' + x + '" is not supported');
6
8
  });
9
+ var __decorateClass = (decorators, target, key, kind) => {
10
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
11
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
12
+ if (decorator = decorators[i])
13
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
14
+ if (kind && result) __defProp(target, key, result);
15
+ return result;
16
+ };
7
17
 
8
18
  // src/types/util_type.ts
9
19
  var ErrorHandlingStrategyEnum = /* @__PURE__ */ ((ErrorHandlingStrategyEnum2) => {
@@ -16,6 +26,7 @@ var ErrorHandlingStrategyEnum = /* @__PURE__ */ ((ErrorHandlingStrategyEnum2) =>
16
26
 
17
27
  export {
18
28
  __require,
29
+ __decorateClass,
19
30
  ErrorHandlingStrategyEnum
20
31
  };
21
- //# sourceMappingURL=chunk-FKITWVZO.js.map
32
+ //# sourceMappingURL=chunk-6AJLW7HC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/util_type.ts"],"sourcesContent":["export type LogLevelType = \"INFO\" | \"ERROR\" | \"ALERT\" | \"SUCCESS\";\n\nexport interface LogEntryInterface {\n timestamp: string;\n status: LogLevelType;\n message: string;\n data_error?: unknown;\n}\n\nexport interface CountLookupItemInterface { \n value: number; \n symbol: string; \n}\n\nexport interface PaginationResultInterface {\n total_items: number; \n records: any[],\n total_pages: number, \n current_page: number\n}\n\nexport interface EnvConfigInterface {\n STORE_LOG?: \"YES\" | \"NO\";\n MODE?: \"production\" | \"staging\" | \"development\" | string;\n DATA_SHIFT_LIVE?: string;\n DATA_SHIFT_TEST?: string;\n JSON_WEB_TOKEN_KEY?: string;\n APP_NAME?: string;\n APP_ID?: string;\n [key: string]: any;\n}\n\nexport interface ServerErrorInterface extends Error {\n syscall?: string;\n code?: string;\n}\n\nexport enum ErrorHandlingStrategyEnum {\n RETURN_DEFAULT,\n EXIT_PROCESS,\n THROW_ERROR,\n CONTROLLER_ERROR,\n}"],"mappings":";;;;;;;;AAqCO,IAAK,4BAAL,kBAAKA,+BAAL;AACH,EAAAA,sDAAA;AACA,EAAAA,sDAAA;AACA,EAAAA,sDAAA;AACA,EAAAA,sDAAA;AAJQ,SAAAA;AAAA,GAAA;","names":["ErrorHandlingStrategyEnum"]}
1
+ {"version":3,"sources":["../src/types/util_type.ts"],"sourcesContent":["export type LogLevelType = \"INFO\" | \"ERROR\" | \"ALERT\" | \"SUCCESS\";\n\nexport interface LogEntryInterface {\n timestamp: string;\n status: LogLevelType;\n message: string;\n data_error?: unknown;\n}\n\nexport interface CountLookupItemInterface { \n value: number; \n symbol: string; \n}\n\nexport interface PaginationResultInterface {\n total_items: number; \n records: any[],\n total_pages: number, \n current_page: number\n}\n\nexport interface EnvConfigInterface {\n STORE_LOG?: \"YES\" | \"NO\";\n MODE?: \"production\" | \"staging\" | \"development\" | string;\n DATA_SHIFT_LIVE?: string;\n DATA_SHIFT_TEST?: string;\n JSON_WEB_TOKEN_KEY?: string;\n APP_NAME?: string;\n APP_ID?: string;\n [key: string]: any;\n}\n\nexport interface ServerErrorInterface extends Error {\n syscall?: string;\n code?: string;\n}\n\nexport enum ErrorHandlingStrategyEnum {\n RETURN_DEFAULT,\n EXIT_PROCESS,\n THROW_ERROR,\n CONTROLLER_ERROR,\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAqCO,IAAK,4BAAL,kBAAKA,+BAAL;AACH,EAAAA,sDAAA;AACA,EAAAA,sDAAA;AACA,EAAAA,sDAAA;AACA,EAAAA,sDAAA;AAJQ,SAAAA;AAAA,GAAA;","names":["ErrorHandlingStrategyEnum"]}
@@ -15,6 +15,9 @@ var SEEDERS_DIR = path.join(BASE_DIR, "src/database/seeders");
15
15
  var SEQUELIZE_META_TABLE_NAME = "sequelize_database_tables_meta";
16
16
  var SEQUELIZE_SEEDER_META_TABLE_NAME = "sequelize_database_table_seeder_meta";
17
17
  var REQUEST_ID_COOKIE_MAX_AGE = 1e3 * 60 * 60 * 24 * 7;
18
+ var CORS_ALLOWED_METHODS = ["GET", "POST", "PATCH", "DELETE", "OPTIONS"];
19
+ var CORS_ALLOWED_HEADERS = ["Content-Type", "Authorization", "X-Device-Id", "X-Device-Name", "User-Agent"];
20
+ var CORS_MAX_AGE_IN_SECONDS = 600;
18
21
  var CORS_MAX_AGE_IN_MICRO_SECONDS = 1e3 * 60 * 10;
19
22
  var REQUEST_RATE_LIMITTER_OPTIONS = {
20
23
  window_ms: 60 * 1e3,
@@ -1017,6 +1020,12 @@ export {
1017
1020
  SEEDERS_DIR,
1018
1021
  SEQUELIZE_META_TABLE_NAME,
1019
1022
  SEQUELIZE_SEEDER_META_TABLE_NAME,
1023
+ REQUEST_ID_COOKIE_MAX_AGE,
1024
+ CORS_ALLOWED_METHODS,
1025
+ CORS_ALLOWED_HEADERS,
1026
+ CORS_MAX_AGE_IN_SECONDS,
1027
+ CORS_MAX_AGE_IN_MICRO_SECONDS,
1028
+ REQUEST_RATE_LIMITTER_OPTIONS,
1020
1029
  logger_util_default,
1021
1030
  input_transformer_util_default,
1022
1031
  env_manager_util_default,
@@ -1026,4 +1035,4 @@ export {
1026
1035
  safe_execute_util_default,
1027
1036
  cache_util_default
1028
1037
  };
1029
- //# sourceMappingURL=chunk-BK6YPN2O.js.map
1038
+ //# sourceMappingURL=chunk-LN65UUHQ.js.map
@@ -1 +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 /** ✅ 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"]}
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"]}
@@ -10,10 +10,10 @@ import {
10
10
  input_validator_util_default,
11
11
  logger_util_default,
12
12
  sql_formatter_util_default
13
- } from "../chunk-BK6YPN2O.js";
13
+ } from "../chunk-LN65UUHQ.js";
14
14
  import {
15
15
  __require
16
- } from "../chunk-FKITWVZO.js";
16
+ } from "../chunk-6AJLW7HC.js";
17
17
 
18
18
  // src/database/schema/schema_diff_util.ts
19
19
  var SchemaDiffUtil = class _SchemaDiffUtil {
@@ -0,0 +1,131 @@
1
+ import { Request as Request$1, Response, NextFunction } from 'express';
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
+ }
41
+
42
+ declare class CookieManagerMiddleWare {
43
+ private name;
44
+ private logger;
45
+ private readonly default_cookie_options;
46
+ private request_id_max_age;
47
+ private request_id_generator;
48
+ constructor(options?: CookieManagerOptions);
49
+ private getDefaultCookieOptions;
50
+ /** Get cookie value safely */
51
+ get(req: Request$1, name: string): string | undefined;
52
+ /** Set cookie with enforced defaults */
53
+ set(res: Response, name: string, value: string, options?: {
54
+ max_age?: number;
55
+ }): void;
56
+ /** Clear cookie */
57
+ clear(res: Response, name: string): void;
58
+ /** Middleware */
59
+ middleware(req: Request$1, res: Response, next: NextFunction): void;
60
+ }
61
+
62
+ declare class CorsMiddleWare {
63
+ private name;
64
+ private logger;
65
+ private origin_cache;
66
+ private origins;
67
+ private methods;
68
+ private headers;
69
+ private credentials;
70
+ private max_age;
71
+ private allow_null_origin;
72
+ private origin_resolver;
73
+ constructor(options?: CorsOptions);
74
+ private resolveAllowedOrigins;
75
+ private isValidOrigin;
76
+ getRequestOrigin(req: Request$1): Promise<string>;
77
+ middleware(req: Request$1, res: Response, next: NextFunction): Promise<void | Response>;
78
+ }
79
+
80
+ declare class RateLimiterMiddleWare {
81
+ readonly name = "rate_limiter_middle_ware";
82
+ private window_ms;
83
+ private max_requests;
84
+ private message;
85
+ private cache;
86
+ private logger;
87
+ private key_generator;
88
+ constructor(options?: RateLimiterOptions);
89
+ private generateRequestIdentitfier;
90
+ private getResetSeconds;
91
+ middleware(req: Request$1, res: Response, next: NextFunction): Response | void;
92
+ }
93
+
94
+ declare class HTTPSEnforcementMiddleWare {
95
+ private name;
96
+ private logger;
97
+ private readonly enabled?;
98
+ private readonly redirect_status?;
99
+ private readonly trust_proxy?;
100
+ constructor(options?: ForceHTTPSOptions);
101
+ middleware(req: Request$1, res: Response, next: NextFunction): Promise<void | Response>;
102
+ }
103
+
104
+ declare class SecureHeadersMiddleWare {
105
+ private name;
106
+ private logger;
107
+ private readonly enabled?;
108
+ private readonly HSTS_enabled?;
109
+ private readonly HSTS_max_age?;
110
+ private readonly frame_options;
111
+ private readonly xss_protection?;
112
+ private readonly content_type_options?;
113
+ private readonly referrer_policy;
114
+ private readonly content_security_policy;
115
+ private readonly HSTS_Extras;
116
+ private readonly cors_policy;
117
+ private readonly cors_opener_policy;
118
+ constructor(options?: SecureHeadersOptions);
119
+ private getDefaultContentSecurityPolicy;
120
+ private getContentSecurityPolicyString;
121
+ middleware(req: Request$1, res: Response, next: NextFunction): Promise<void | Response>;
122
+ }
123
+
124
+ declare class RequestLoggerMiddleWare {
125
+ private name;
126
+ private logger;
127
+ constructor();
128
+ middleware(req: Request$1, res: Response, next: NextFunction): Promise<void | Response>;
129
+ }
130
+
131
+ export { CookieManagerMiddleWare, CorsMiddleWare, HTTPSEnforcementMiddleWare, RateLimiterMiddleWare, RequestLoggerMiddleWare, SecureHeadersMiddleWare };
@@ -0,0 +1,385 @@
1
+ import {
2
+ CORS_ALLOWED_HEADERS,
3
+ CORS_ALLOWED_METHODS,
4
+ CORS_MAX_AGE_IN_MICRO_SECONDS,
5
+ CORS_MAX_AGE_IN_SECONDS,
6
+ REQUEST_ID_COOKIE_MAX_AGE,
7
+ REQUEST_RATE_LIMITTER_OPTIONS,
8
+ cache_util_default,
9
+ input_validator_util_default,
10
+ logger_util_default,
11
+ safe_execute_util_default
12
+ } from "../chunk-LN65UUHQ.js";
13
+ import {
14
+ __decorateClass
15
+ } from "../chunk-6AJLW7HC.js";
16
+
17
+ // src/middle_ware/cookie_manager_middle_ware.ts
18
+ import crypto from "crypto";
19
+ var CookieManagerMiddleWare = class {
20
+ name = "cookie_manager_middle_ware";
21
+ logger = new logger_util_default(this.name);
22
+ default_cookie_options = this.getDefaultCookieOptions();
23
+ request_id_max_age;
24
+ request_id_generator;
25
+ constructor(options = {}) {
26
+ this.request_id_max_age = options?.request_id_max_age || REQUEST_ID_COOKIE_MAX_AGE;
27
+ this.request_id_generator = options?.request_id_generator || crypto.randomUUID;
28
+ safe_execute_util_default.setNamedInstance(this.name, this);
29
+ }
30
+ // Method to get default cookie options
31
+ getDefaultCookieOptions() {
32
+ return {
33
+ httpOnly: true,
34
+ sameSite: "strict",
35
+ path: "/",
36
+ secure: input_validator_util_default.isProduction()
37
+ };
38
+ }
39
+ /** Get cookie value safely */
40
+ get(req, name) {
41
+ return req.cookies?.[name];
42
+ }
43
+ /** Set cookie with enforced defaults */
44
+ set(res, name, value, options = {}) {
45
+ const cookie_options = { ...this.default_cookie_options, maxAge: options.max_age };
46
+ res.cookie(name, value, cookie_options);
47
+ }
48
+ /** Clear cookie */
49
+ clear(res, name) {
50
+ res.clearCookie(name, this.default_cookie_options);
51
+ }
52
+ middleware(req, res, next) {
53
+ req.getCookie = (name) => this.get(req, name);
54
+ req.setCookie = (name, value, options = {}) => this.set(res, name, value, options);
55
+ req.clearCookie = (name) => this.clear(res, name);
56
+ let request_id = req.getCookie("request_id");
57
+ if (!request_id) {
58
+ request_id = this.request_id_generator();
59
+ this.set(res, "request_id", request_id, { max_age: this.request_id_max_age });
60
+ res.setHeader("X-Request-Id", request_id);
61
+ this.logger.info(`Generated request_id: ${request_id}`);
62
+ }
63
+ this.logger.info(`[REQ:${request_id}] ${req.method} ${req.originalUrl}`);
64
+ req.request_id = request_id;
65
+ next();
66
+ }
67
+ };
68
+ __decorateClass([
69
+ safe_execute_util_default.safeExecuteThrow("cookie_manager_middle_ware")
70
+ ], CookieManagerMiddleWare.prototype, "middleware", 1);
71
+ var cookie_manager_middle_ware_default = CookieManagerMiddleWare;
72
+
73
+ // src/middle_ware/cors_middle_ware.ts
74
+ var CorsMiddleWare = class {
75
+ name = "cors_middle_ware";
76
+ logger = new logger_util_default(this.name);
77
+ origin_cache = new cache_util_default();
78
+ origins;
79
+ methods;
80
+ headers;
81
+ credentials;
82
+ max_age;
83
+ allow_null_origin;
84
+ origin_resolver;
85
+ constructor(options = {}) {
86
+ this.origins = options.origins || [];
87
+ this.methods = options.methods ?? CORS_ALLOWED_METHODS;
88
+ this.headers = options.headers ?? CORS_ALLOWED_HEADERS;
89
+ this.credentials = options.credentials ?? true;
90
+ this.max_age = options.max_age ?? CORS_MAX_AGE_IN_SECONDS;
91
+ this.allow_null_origin = options.allow_null_origin ?? false, this.origin_resolver = options?.origin_resolver || null;
92
+ safe_execute_util_default.setNamedInstance(this.name, this);
93
+ }
94
+ async resolveAllowedOrigins() {
95
+ if (Array.isArray(this.origins) && this.origins.length) {
96
+ return this.origins;
97
+ } else if (this.origin_resolver && typeof this.origin_resolver === "function") {
98
+ const result = await this.origin_resolver();
99
+ return Array.isArray(result) ? result : [];
100
+ }
101
+ return [];
102
+ }
103
+ async isValidOrigin(origin) {
104
+ if (!origin) {
105
+ return this.allow_null_origin;
106
+ }
107
+ if (this.origin_cache.has(origin)) {
108
+ return true;
109
+ } else if (this.origin_resolver && typeof this.origin_resolver === "function") {
110
+ const result = await this.origin_resolver(origin);
111
+ if (typeof result === "boolean") {
112
+ if (result) {
113
+ this.origin_cache.set(origin, true, CORS_MAX_AGE_IN_MICRO_SECONDS);
114
+ }
115
+ return result;
116
+ }
117
+ }
118
+ const allowed = await this.resolveAllowedOrigins();
119
+ const is_valid = allowed.includes(origin);
120
+ if (is_valid) {
121
+ this.origin_cache.set(origin, true, CORS_MAX_AGE_IN_MICRO_SECONDS);
122
+ }
123
+ return is_valid;
124
+ }
125
+ async getRequestOrigin(req) {
126
+ const { headers, protocol } = req;
127
+ if (headers?.origin) {
128
+ return headers?.origin;
129
+ } else if (headers?.referer) {
130
+ return new URL(headers.referer).origin;
131
+ }
132
+ return `${protocol}://${req?.get("host")}`;
133
+ }
134
+ async middleware(req, res, next) {
135
+ const origin = await this.getRequestOrigin(req);
136
+ const is_allowed = await this.isValidOrigin(origin);
137
+ res.setHeader("Vary", "Origin");
138
+ if (!is_allowed) {
139
+ this.logger.error(`Blocked CORS request from origin: ${origin}`);
140
+ return res.status(403).json({ status: "error", code: 403, msg: "cors_blocked" });
141
+ }
142
+ res.setHeader("Access-Control-Allow-Origin", origin);
143
+ res.setHeader("Access-Control-Allow-Methods", this.methods.join(","));
144
+ res.setHeader("Access-Control-Allow-Headers", this.headers.join(","));
145
+ if (this.credentials) {
146
+ res.setHeader("Access-Control-Allow-Credentials", "true");
147
+ }
148
+ if (this.max_age) {
149
+ res.setHeader("Access-Control-Max-Age", this.max_age.toString());
150
+ }
151
+ if (req.method === "OPTIONS") {
152
+ return res.sendStatus(204);
153
+ }
154
+ next();
155
+ }
156
+ };
157
+ __decorateClass([
158
+ safe_execute_util_default.safeExecuteReturn("cors_middle_ware", [])
159
+ ], CorsMiddleWare.prototype, "resolveAllowedOrigins", 1);
160
+ __decorateClass([
161
+ safe_execute_util_default.safeExecuteReturn("cors_middle_ware", false)
162
+ ], CorsMiddleWare.prototype, "isValidOrigin", 1);
163
+ __decorateClass([
164
+ safe_execute_util_default.safeExecuteReturn("cors_middle_ware", "unknown")
165
+ ], CorsMiddleWare.prototype, "getRequestOrigin", 1);
166
+ __decorateClass([
167
+ safe_execute_util_default.safeExecuteThrow("cors_middle_ware")
168
+ ], CorsMiddleWare.prototype, "middleware", 1);
169
+ var cors_middle_ware_default = CorsMiddleWare;
170
+
171
+ // src/middle_ware/rate_limiter_middle_ware.ts
172
+ var RateLimiterMiddleWare = class {
173
+ name = "rate_limiter_middle_ware";
174
+ window_ms;
175
+ max_requests;
176
+ message;
177
+ cache;
178
+ logger;
179
+ key_generator;
180
+ constructor(options = {}) {
181
+ this.window_ms = options?.window_ms ?? REQUEST_RATE_LIMITTER_OPTIONS.window_ms;
182
+ this.max_requests = options?.max_requests ?? REQUEST_RATE_LIMITTER_OPTIONS.max_requests;
183
+ this.message = options.message ?? REQUEST_RATE_LIMITTER_OPTIONS.message;
184
+ this.key_generator = options?.key_generator || this.generateRequestIdentitfier;
185
+ this.cache = new cache_util_default();
186
+ this.logger = new logger_util_default(this.name);
187
+ safe_execute_util_default.setNamedInstance(this.name, this);
188
+ }
189
+ // Method to help generate request key
190
+ generateRequestIdentitfier(req) {
191
+ return req?.request_id || req?.clientIp || req?.ip || "unknown";
192
+ }
193
+ // Method to reset seconds counter
194
+ getResetSeconds(expires_at) {
195
+ return Math.max(Math.ceil((expires_at - Date.now()) / 1e3), 0);
196
+ }
197
+ middleware(req, res, next) {
198
+ const key = this.key_generator(req);
199
+ const now = Date.now();
200
+ let record = this.cache.get(key);
201
+ if (!record) {
202
+ record = {
203
+ count: 1,
204
+ expires_at: now + this.window_ms
205
+ };
206
+ this.cache.set(key, record, this.window_ms);
207
+ } else {
208
+ record.count++;
209
+ this.cache.update(key, record);
210
+ }
211
+ const remaining = Math.max(this.max_requests - record.count, 0);
212
+ const reset_seconds = this.getResetSeconds(record.expires_at);
213
+ res.setHeader("X-RateLimit-Limit", this.max_requests);
214
+ res.setHeader("X-RateLimit-Remaining", remaining);
215
+ res.setHeader("X-RateLimit-Reset", reset_seconds);
216
+ if (record.count > this.max_requests) {
217
+ this.logger.alert(`\u26A0\uFE0F Rate limit exceeded for key: ${key} (retry in ${reset_seconds}s)`);
218
+ res.setHeader("Retry-After", reset_seconds);
219
+ return res.status(429).json({
220
+ status: "error",
221
+ code: 429,
222
+ msg: "rate_limit_exceeded",
223
+ data: {
224
+ message: this.message,
225
+ retry_after: `${reset_seconds}s`
226
+ }
227
+ });
228
+ }
229
+ next();
230
+ }
231
+ };
232
+ __decorateClass([
233
+ safe_execute_util_default.safeExecuteThrow("rate_limiter_middle_ware")
234
+ ], RateLimiterMiddleWare.prototype, "middleware", 1);
235
+ var rate_limiter_middle_ware_default = RateLimiterMiddleWare;
236
+
237
+ // src/middle_ware/https_enforcement_middle_ware.ts
238
+ var HTTPSEnforcementMiddleWare = class {
239
+ name = "https_enforcement_middle_ware";
240
+ logger = new logger_util_default(this.name);
241
+ enabled;
242
+ redirect_status;
243
+ trust_proxy;
244
+ constructor(options = {}) {
245
+ this.enabled = options.enabled ?? !input_validator_util_default.isDevelopment();
246
+ this.redirect_status = options?.redirect_status ?? 301;
247
+ this.trust_proxy = options.trust_proxy ?? true;
248
+ safe_execute_util_default.setNamedInstance(this.name, this);
249
+ }
250
+ async middleware(req, res, next) {
251
+ if (!this.enabled) {
252
+ return next();
253
+ }
254
+ const is_secure = req.secure || this.trust_proxy && req.headers["x-forwarded-proto"] === "https";
255
+ if (is_secure) {
256
+ return next();
257
+ }
258
+ const host = req.headers.host;
259
+ const url = req.originalUrl;
260
+ const redirect_status = this.redirect_status || 301;
261
+ this.logger.alert(`Redirecting HTTP \u2192 HTTPS: ${url}`);
262
+ res.redirect(redirect_status, `https://${host}${url}`);
263
+ }
264
+ };
265
+ __decorateClass([
266
+ safe_execute_util_default.safeExecuteThrow("https_enforcement_middle_ware")
267
+ ], HTTPSEnforcementMiddleWare.prototype, "middleware", 1);
268
+ var https_enforcement_middle_ware_default = HTTPSEnforcementMiddleWare;
269
+
270
+ // src/middle_ware/secure_headers_middle_ware.ts
271
+ var SecureHeadersMiddleWare = class {
272
+ name = "secure_headers_middle_ware";
273
+ logger = new logger_util_default(this.name);
274
+ enabled;
275
+ HSTS_enabled;
276
+ HSTS_max_age;
277
+ frame_options;
278
+ xss_protection;
279
+ content_type_options;
280
+ referrer_policy;
281
+ content_security_policy;
282
+ HSTS_Extras;
283
+ cors_policy;
284
+ cors_opener_policy;
285
+ constructor(options = {}) {
286
+ this.enabled = options.enabled ?? true;
287
+ this.HSTS_enabled = options?.HSTS_enabled ?? input_validator_util_default.isProduction();
288
+ this.HSTS_max_age = options?.HSTS_max_age ?? 63072e3;
289
+ this.frame_options = options?.frame_options ?? "SAMEORIGIN";
290
+ this.xss_protection = options?.xss_protection ?? true;
291
+ this.content_type_options = options?.content_type_options ?? true;
292
+ this.referrer_policy = options?.referrer_policy ?? "no-referrer-when-downgrade";
293
+ this.content_security_policy = options?.content_security_policy ?? this.getDefaultContentSecurityPolicy(), this.HSTS_Extras = options?.HSTS_Extras ?? "includeSubDomains; preload;";
294
+ this.cors_policy = options?.cors_policy ?? "same-origin";
295
+ this.cors_opener_policy = options?.cors_opener_policy ?? "same-origin";
296
+ safe_execute_util_default.setNamedInstance(this.name, this);
297
+ }
298
+ // Method to get default content security policy
299
+ getDefaultContentSecurityPolicy() {
300
+ return {
301
+ "default-src": ["'self'"],
302
+ "object-src": ["'none'"],
303
+ "script-src": ["'self'"],
304
+ "style-src": ["'self'", "https://fonts.googleapis.com"],
305
+ "font-src": ["'self'", "https://fonts.gstatic.com"],
306
+ "img-src": ["'self'"],
307
+ "connect-src": ["'self'"],
308
+ "base-uri": ["'self'"],
309
+ "frame-ancestors": ["'self'"]
310
+ };
311
+ }
312
+ // Method to convert content security policy object to string
313
+ getContentSecurityPolicyString(policy) {
314
+ return Object.entries(policy).map(([key, value]) => `${key} ${value.join(" ")}`).join("; ");
315
+ }
316
+ async middleware(req, res, next) {
317
+ if (!this.enabled) {
318
+ return next();
319
+ }
320
+ if (this.xss_protection) {
321
+ res.setHeader("X-XSS-Protection", "1; mode=block");
322
+ } else {
323
+ res.setHeader("X-XSS-Protection", "0");
324
+ }
325
+ if (this.content_type_options) {
326
+ res.setHeader("X-Content-Type-Options", "nosniff");
327
+ }
328
+ res.setHeader("X-Frame-Options", this.frame_options);
329
+ res.setHeader("Referrer-Policy", this.referrer_policy);
330
+ if (this.cors_policy) {
331
+ res.setHeader("Cross-Origin-Resource-Policy", this.cors_policy);
332
+ }
333
+ if (this.cors_opener_policy) {
334
+ res.setHeader("Cross-Origin-Opener-Policy", this.cors_opener_policy);
335
+ }
336
+ if (this.content_security_policy) {
337
+ const content_security_policy_string = this.getContentSecurityPolicyString(this.content_security_policy);
338
+ res.setHeader("Content-Security-Policy", content_security_policy_string);
339
+ }
340
+ if (this.HSTS_enabled) {
341
+ res.setHeader("Strict-Transport-Security", `max-age=${this.HSTS_max_age}; ${this.HSTS_Extras}`);
342
+ }
343
+ next();
344
+ }
345
+ };
346
+ __decorateClass([
347
+ safe_execute_util_default.safeExecuteThrow("secure_headers_middle_ware")
348
+ ], SecureHeadersMiddleWare.prototype, "middleware", 1);
349
+ var secure_headers_middle_ware_default = SecureHeadersMiddleWare;
350
+
351
+ // src/middle_ware/request_logger_middle_ware.ts
352
+ var RequestLoggerMiddleWare = class {
353
+ name = "request_logger_middle_ware";
354
+ logger = new logger_util_default(this.name);
355
+ constructor() {
356
+ safe_execute_util_default.setNamedInstance(this.name, this);
357
+ }
358
+ async middleware(req, res, next) {
359
+ const origin = req.headers.origin || (req.headers.referer ? new URL(req.headers.referer).origin : "unknown");
360
+ const device_id = req.headers["x-device-id"] || "unknown";
361
+ const device_name = req.headers["x-device-name"] || "unknown";
362
+ const user_agent = req.headers["user-agent"] || "unknown";
363
+ const request_id = req.cookies?.request_id ?? null;
364
+ const ip = req.clientIp || req.ip || "unknown";
365
+ this.logger.info(`[${this.name}] ${req.method} ${req.originalUrl}`);
366
+ this.logger.info(`[${this.name}] Origin: ${origin}, Host: ${req.get("host")}`);
367
+ this.logger.info(`[${this.name}] Device ID: ${device_id}, Device Name: ${device_name}`);
368
+ this.logger.info(`[${this.name}] Request ID: ${request_id}, IP: ${ip}`);
369
+ this.logger.info(`[${this.name}] User-Agent: ${user_agent}`);
370
+ next();
371
+ }
372
+ };
373
+ __decorateClass([
374
+ safe_execute_util_default.safeExecuteThrow("request_logger_middle_ware")
375
+ ], RequestLoggerMiddleWare.prototype, "middleware", 1);
376
+ var request_logger_middle_ware_default = RequestLoggerMiddleWare;
377
+ export {
378
+ cookie_manager_middle_ware_default as CookieManagerMiddleWare,
379
+ cors_middle_ware_default as CorsMiddleWare,
380
+ https_enforcement_middle_ware_default as HTTPSEnforcementMiddleWare,
381
+ rate_limiter_middle_ware_default as RateLimiterMiddleWare,
382
+ request_logger_middle_ware_default as RequestLoggerMiddleWare,
383
+ secure_headers_middle_ware_default as SecureHeadersMiddleWare
384
+ };
385
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,6 +1,6 @@
1
1
  import {
2
2
  ErrorHandlingStrategyEnum
3
- } from "../chunk-FKITWVZO.js";
3
+ } from "../chunk-6AJLW7HC.js";
4
4
  export {
5
5
  ErrorHandlingStrategyEnum
6
6
  };
@@ -7,8 +7,8 @@ import {
7
7
  safe_execute_util_default,
8
8
  server_util_default,
9
9
  sql_formatter_util_default
10
- } from "../chunk-BK6YPN2O.js";
11
- import "../chunk-FKITWVZO.js";
10
+ } from "../chunk-LN65UUHQ.js";
11
+ import "../chunk-6AJLW7HC.js";
12
12
  export {
13
13
  env_manager_util_default as EnvManagerUtil,
14
14
  cache_util_default as InMemoryCache,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fiberx-backend-toolkit",
3
- "version": "0.0.7",
3
+ "version": "0.0.8",
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",
@@ -9,7 +9,8 @@
9
9
  ".": "./dist/index.js",
10
10
  "./utils": "./dist/utils/index.js",
11
11
  "./types": "./dist/types/index.js",
12
- "./database": "./dist/database/index.js"
12
+ "./database": "./dist/database/index.js",
13
+ "./middle_ware": "./dist/middle_ware/index.js"
13
14
  },
14
15
  "scripts": {
15
16
  "build": "tsup",