fiberx-backend-toolkit 0.0.12 → 0.0.13

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.
@@ -1038,4 +1038,4 @@ export {
1038
1038
  safe_execute_util_default,
1039
1039
  cache_util_default
1040
1040
  };
1041
- //# sourceMappingURL=chunk-SI4SUH2O.js.map
1041
+ //# sourceMappingURL=chunk-XUYXE74J.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 static isLive() { return [\"production\", \"staging\"].includes(InputValidatorUtil?.env_manager?.env_data?.MODE || \"\"); }\n\n /** ✅ Validate ReCaptcha */\n static async isValidReCaptcha(\n recpatcha_token: string\n ) {\n const {\n RECAPTCHA_SECRET_KEY,\n RECPATHA_VERIFY_URL\n } = InputValidatorUtil?.env_manager?.env_data\n try {\n const secret_key = RECAPTCHA_SECRET_KEY\n const url = RECPATHA_VERIFY_URL;\n const params = { secret: secret_key, response: recpatcha_token }\n const response = await axios.post(url!, null, { params });\n\n return response.data.success;\n } \n catch (error) {\n console.error(\"reCAPTCHA verification failed:\", error);\n return false;\n }\n }\n\n // Method to check if a directory exists\n\tstatic dirExists (\n directory: string, \n create_directory: boolean = false, \n return_dir_path: boolean = false\n ): boolean | string { \n const exist = fs.existsSync(directory); \n\n if(!create_directory) { return exist }\n\n if (!exist) { fs.mkdirSync(directory); }\n\n return return_dir_path ? directory : true;\n }\n\n}\n\nexport default InputValidatorUtil;","import fs from \"fs\";\nimport path from \"path\";\nimport yaml from \"js-yaml\";\nimport axios from \"axios\";\n\nimport LoggerUtil from \"./logger_util\";\nimport { EnvConfigInterface } from \"@/types/util_type\";\nimport { ENV_VAR_DIR } from \"@/config/constants\";\n\nclass EnvManagerUtil {\n public readonly name = \"env_manager_util\";\n public env_file_name: string = \"env.yaml\";\n\n private static instance: EnvManagerUtil;\n\n private readonly yaml_env_file_path: string;\n private readonly logger: LoggerUtil;\n\n public env_data: EnvConfigInterface;\n\n // 🔒 Private constructor\n private constructor() {\n this.env_file_name = this.getEnvFileName();\n this.yaml_env_file_path = path.join(ENV_VAR_DIR, this.env_file_name);\n this.logger = new LoggerUtil(this.name);\n this.env_data = this.readENVData();\n }\n\n // Method to get env file name\n private getEnvFileName (): string {\n if (process?.env?.MODE === \"development\") { return \"env.yaml\" }\n\n else if (process?.env?.MODE === \"staging\") { return \"staging_env.yaml\" }\n\n else if (process?.env?.MODE === \"production\") { return \"production_env.yaml\" }\n\n else { return \"env.yaml\" }\n }\n\n // ✅ Global access point\n public static getInstance(): EnvManagerUtil {\n if (!EnvManagerUtil.instance) {\n EnvManagerUtil.instance = new EnvManagerUtil();\n }\n return EnvManagerUtil.instance;\n }\n\n // Read environment data from YAML\n private readENVData(): EnvConfigInterface {\n try {\n if (!fs.existsSync(this.yaml_env_file_path)) {\n this.logger.info(`YAML file not found at: ${this.yaml_env_file_path}`);\n return {};\n }\n\n const file_content = fs.readFileSync(this.yaml_env_file_path, \"utf8\");\n return (yaml.load(file_content) as EnvConfigInterface) || {};\n } catch (error: unknown) {\n this.logger.error(`${this.name} - readENVData`, { error });\n return {};\n }\n }\n\n // Get env var from YAML → process.env → default \n public getEnvVar<T = any>(key: string, default_value?: T): T | undefined {\n if (key in this.env_data) { return this.env_data[key]; }\n\n if (key in process.env) { return process.env[key] as T; }\n\n return default_value;\n }\n\n // Fetch remote env variables and merge\n public async fetchRemoteEnv(url: string): Promise<void> {\n try {\n const response = await axios.get(url);\n\n if (typeof response.data === \"object\" && response.data !== null) {\n this.env_data = { ...this.env_data, ...response.data };\n this.logger.success(\"Remote env variables loaded.\");\n } else {\n this.logger.error(\"Unexpected response format from remote env endpoint.\");\n }\n } catch (error: unknown) {\n this.logger.error(`${this.name} - fetchRemoteEnv`, { error });\n }\n }\n}\n\nexport default EnvManagerUtil;\n","class SqlFormatterUtil {\n\n // Basic ANSI color helpers\n private static AnsiColor = {\n reset: \"\\x1b[0m\",\n cyan: (text: string) => `\\x1b[36m${text}\\x1b[0m`,\n green: (text: string) => `\\x1b[32m${text}\\x1b[0m`,\n yellow: (text: string) => `\\x1b[33m${text}\\x1b[0m`,\n red: (text: string) => `\\x1b[31m${text}\\x1b[0m`,\n };\n\n private static sqlColors: Record<string, (text: string) => string> = {\n SELECT: SqlFormatterUtil.AnsiColor.cyan,\n INSERT: SqlFormatterUtil.AnsiColor.green,\n UPDATE: SqlFormatterUtil.AnsiColor.yellow,\n DELETE: SqlFormatterUtil.AnsiColor.red,\n };\n\n /**\n * Normalize SQL:\n * - Collapse multiple whitespaces/newlines\n * - Remove extra spaces inside parentheses\n */\n public static normalize(sql: string): string {\n return sql\n .replace(/\\s+/g, \" \")\n .replace(/\\(\\s+/g, \"(\")\n .replace(/\\s+\\)/g, \")\")\n .trim();\n }\n\n /**\n * Colorize SQL keywords (SELECT, INSERT, UPDATE, DELETE)\n */\n public static colorize(sql: string): string {\n const first_word = sql.split(\" \")[0].toUpperCase();\n const colorFN = this.sqlColors[first_word];\n \n return colorFN ? colorFN(sql) : sql;\n }\n\n /**\n * Full formatting for logging\n */\n public static format(sql: string): string {\n return this.colorize(this.normalize(sql));\n }\n}\n\nexport default SqlFormatterUtil;\n","import { Server } from \"http\";\nimport { LoggerUtil } from \"@/utils\"\nimport { ServerErrorInterface } from \"@/types\";\n\nclass ServerUtil {\n public readonly name: string = \"server_util\";\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);\n private readonly port: number;\n\n constructor(port: number) {\n this.port = port || 4000;\n }\n\n // Method to print app banner\n private printAppBanner (app_name: string): void {\n const raw = app_name.replace(/[-_]/g, \" \");\n const title = raw.toUpperCase();\n const border_char = \"═\";\n const corner_tl = \"╔\";\n const corner_tr = \"╗\";\n const corner_bl = \"╚\";\n const corner_br = \"╝\";\n const side_char = \"║\";\n const padding = 4;\n const content_width = title.length + padding * 2;\n const border = border_char.repeat(content_width);\n\n const line1 = `${corner_tl}${border}${corner_tr}`;\n const line2 = `${side_char} ${\" \".repeat(padding)}${title}${\" \".repeat(padding)}${side_char} `;\n const line3 = `${corner_bl}${border}${corner_br} `;\n\n console.log(\"\\n\" + line1);\n console.log(line2);\n console.log(line3 + \"\\n\");\n }\n\n // Method to handle server errors\n public onServerError (error: ServerErrorInterface): void {\n if (error.syscall !== \"listen\") { \n this.logger.error(\"Unexpected server error\", { error });\n throw error; \n }\n\n const bind = `Port ${this.port}`;\n\n switch (error.code) {\n case \"EACCES\":\n this.logger.error(`${bind} requires elevated privileges`);\n process.exit(1);\n break;\n case \"EADDRINUSE\":\n this.logger.error(`${bind} is already in use`);\n process.exit(1);\n break;\n default:\n throw error;\n }\n }\n\n // Method to handle server listening\n public onServerListening = (server: Server): void => {\n this.printAppBanner(\"fibase-server-app\");\n\n const addr = server.address();\n const bind = typeof addr === \"string\" ? `pipe ${addr}` : `port ${addr?.port}`;\n\n this.logger.info(`Listening on ${bind}`);\n }\n}\n\nexport default ServerUtil;","\nimport { Response } from \"express\";\n\nimport { LoggerUtil } from \"@/utils\";\nimport { ErrorHandlingStrategyEnum } from \"@/types/util_type\";\n\n\n\nclass SafeExecuteUtil {\n // Store instances by class constructor (WeakMap ensures GC can clean up)\n private static instances = new WeakMap<object, any>();\n\n // Store instances by string keys (Map keeps strong references)\n private static named_insatnces = new Map<string, any>();\n\n public static setInstance(key: object, instance: any) {\n SafeExecuteUtil.instances.set(key, instance);\n }\n\n /** Set instance by string key */\n public static setNamedInstance(key: string, instance: any) {\n SafeExecuteUtil.named_insatnces.set(key, instance);\n }\n\n private static getInstance(key: object, fallback: any) {\n return SafeExecuteUtil.instances.get(key) ?? fallback;\n }\n\n /** Get instance by string key */\n public static getNamedInstance(key: string, fallback?: any) {\n return SafeExecuteUtil.named_insatnces.get(key) ?? fallback;\n }\n\n // Method to Safely stringify any object for logging\n private static safeStringify(obj: unknown): string {\n try { return JSON.stringify(obj); }\n catch { return \"[Unserializable Params]\"; }\n }\n\n // 🔹 Method to Execution time logger\n private static logExecutionTime(\n start: [number, number], \n class_name: string, \n method_name: string, \n logger: LoggerUtil\n ) {\n const [seconds, nanoseconds] = process.hrtime(start);\n const ms = (seconds * 1000 + nanoseconds / 1e6).toFixed(2);\n\n logger.info(`[${class_name}] ⏱️ ${method_name} executed in ${ms}ms`);\n }\n\n // Method to handle on error action\n private static handleOnErrorAction (\n error: unknown, \n strategy: ErrorHandlingStrategyEnum, \n default_value: any, \n controller_response?: Response\n ) {\n if (strategy === ErrorHandlingStrategyEnum.CONTROLLER_ERROR && controller_response?.errResponse) {\n return controller_response?.errResponse?.(500, \"invalid_error_request\");\n }\n switch (strategy) {\n case ErrorHandlingStrategyEnum.RETURN_DEFAULT: return default_value;\n case ErrorHandlingStrategyEnum.EXIT_PROCESS: process.exit(1);\n case ErrorHandlingStrategyEnum.THROW_ERROR: throw error;\n } \n \n return;\n }\n\n // 🔹 Method to Unifysafe execution wrapper (normal methods)\n public static createSafeFunction<T>(\n class_name: string,\n method_name: string,\n original_method: (...args: any[]) => T | Promise<T>,\n strategy: ErrorHandlingStrategyEnum,\n default_value?: T,\n ): (...args: any[]) => Promise<T | undefined> {\n return async function (this: any, ...args: any[]): Promise<T | undefined> {\n const class_instance = SafeExecuteUtil.getNamedInstance(class_name, this);\n const logger: LoggerUtil = class_instance?.logger || new LoggerUtil(class_name);\n const method_params = args;\n\n try {\n return await original_method.apply(class_instance, method_params);\n } \n catch (error: unknown) {\n const safely_stringified_error = SafeExecuteUtil.safeStringify(error);\n logger.error(`[${class_name}] ❌ Error in method ${method_name}`, { method_params, error, safely_stringified_error});\n SafeExecuteUtil.handleOnErrorAction(error, strategy, default_value); \n }\n };\n }\n\n // 🔹 Unified safe execution wrapper with timing (for controller/service)\n private static createTimedSafeFunction<T>(\n class_name: string,\n method_name: string,\n original_method: (...args: any[]) => T | Promise<T>,\n strategy: ErrorHandlingStrategyEnum,\n default_value?: T,\n ): (...args: any[]) => Promise<T | undefined> {\n return async function (this: any, ...args: any[]): Promise<T | undefined> {\n const class_instance = SafeExecuteUtil.getNamedInstance(class_name, this);\n const logger: LoggerUtil = class_instance?.logger || new LoggerUtil(class_name);\n const start_time = process.hrtime();\n const method_params = args;\n const controller_response = args && args.length ? args[1] : undefined;\n\n try {\n const result = await original_method.apply(class_instance, args);\n return result\n } \n catch (error: unknown) {\n const safely_stringified_error = SafeExecuteUtil.safeStringify(error);\n logger.error(`[${class_name}] ❌ Error in method ${method_name}`, { method_params, error, safely_stringified_error});\n SafeExecuteUtil.handleOnErrorAction(error, strategy, default_value, controller_response); \n } \n finally { \n SafeExecuteUtil.logExecutionTime(start_time, class_name, method_name, logger); \n }\n }\n };\n\n // Decorator Method to handle wrapping cclass methods\n private static applySafeWrapper(\n target: Object, \n class_name: string,\n property_key: string | symbol, \n descriptor: PropertyDescriptor,\n strategy: ErrorHandlingStrategyEnum,\n timed: boolean,\n default_value?: any,\n ) {\n if (typeof descriptor.value !== \"function\") { return; }\n\n descriptor.value = timed ? \n SafeExecuteUtil.createTimedSafeFunction(\n class_name,\n String(property_key), \n descriptor.value, \n strategy,\n default_value,\n )\n :\n SafeExecuteUtil.createSafeFunction(\n class_name,\n String(property_key), \n descriptor.value, \n strategy,\n default_value\n )\n }\n\n // Decorator method to handle controller methods\n public static safeExecuteController(\n class_name: string\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.CONTROLLER_ERROR,\n true\n );\n }\n }\n\n // Decorator Method to handle service methods\n public static safeExecuteService(\n class_name: string, \n default_value?: any\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT, \n true,\n default_value\n )\n }\n }\n\n // Decorator Method to wrap method with retrun value\n public static safeExecuteReturn<T = any>(\n class_name: string, \n default_value?: T\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT,\n false,\n default_value\n )\n }\n }\n\n // Decorator Method to wrap method with retrun value\n public static safeExecuteTransaction<T = any>(\n class_name: string, \n default_value?: T\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT, \n false,\n default_value\n )\n }\n }\n\n // Decorator method to wrap method with void return\n public static safeExecute(class_name: string) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT,\n false\n );\n }\n }\n \n // Decorator method to wrap method with void return\n public static safeExecuteExit(class_name: string) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.EXIT_PROCESS,\n false\n );\n }\n }\n\n // Decorator method to wrap method with void return\n public static safeExecuteThrow(class_name: string) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.THROW_ERROR,\n false\n );\n }\n }\n\n\n}\n\nexport default SafeExecuteUtil;","type CacheEntry<T> = {\n value: T;\n expires_at: number; // unix ms timestamp\n};\n\nclass InMemoryCache<T = unknown> {\n private store = new Map<string, CacheEntry<T>>();\n\n /**\n * Set a cache value with TTL (ms)\n */\n public set(key: string, value: T, ttl_ms: number): void {\n if (!key) return;\n\n const expires_at = Date.now() + ttl_ms;\n this.store.set(key, { value, expires_at });\n }\n\n /**\n * Get a cache value (returns undefined if missing or expired)\n */\n public get(key: string): T | undefined {\n const entry = this.store.get(key);\n\n if (!entry) return undefined;\n\n if (Date.now() > entry.expires_at) {\n this.store.delete(key);\n return undefined;\n }\n\n return entry.value;\n }\n\n /**\n * Check if a key exists and is valid\n */\n public has(key: string): boolean {\n return this.get(key) !== undefined;\n }\n\n /**\n * Update an existing cache entry (keeps old TTL)\n */\n public update(key: string, value: T): boolean {\n const entry = this.store.get(key);\n\n if (!entry) return false;\n\n if (Date.now() > entry.expires_at) {\n this.store.delete(key);\n return false;\n }\n\n this.store.set(key, { ...entry, value });\n return true;\n }\n\n /**\n * Delete a single cache entry\n */\n public delete(key: string): boolean {\n return this.store.delete(key);\n }\n\n /**\n * Clear entire cache\n */\n public clear(): void {\n this.store.clear();\n }\n\n /**\n * Manually expire a key immediately\n */\n public expire(key: string): void {\n this.store.delete(key);\n }\n\n /**\n * Cleanup expired entries (optional call)\n */\n public cleanup(): void {\n const now = Date.now();\n for (const [key, entry] of this.store.entries()) {\n if (now > entry.expires_at) {\n this.store.delete(key);\n }\n }\n }\n\n /**\n * Cache size (for metrics)\n */\n public size(): number {\n return this.store.size;\n }\n}\n\nexport default InMemoryCache;\n"],"mappings":"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","names":["path","path","fs","dayjs","bcrypt","axios","fs","path","axios","path","fs","axios","dayjs","bcrypt","axios","fs"]}
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;","\nimport path from \"path\";\n\n// Database constants\nexport const BASE_DIR = process.cwd();\nexport const LOG_DIR = path.join(BASE_DIR, \"logs\");\nexport const ENV_VAR_DIR = path.join(BASE_DIR, \"environment_varaiables\");\nexport const SCHEMAS_DIR = path.join(BASE_DIR, \"src/database/schemas\");\nexport const SCHEMA_SNAPSHOTS_DIR = path.join(BASE_DIR, \"src/database/schema_snapshots\");\nexport const MODELS_DIR = path.join(BASE_DIR, \"src/database/models\");\nexport const MIGRATIONS_DIR = path.join(BASE_DIR, \"src/database/migrations\");\nexport const SEEDERS_DIR = path.join(BASE_DIR, \"src/database/seeders\");\n\nexport const SEQUELIZE_META_TABLE_NAME = \"sequelize_database_tables_meta\";\nexport const SEQUELIZE_SEEDER_META_TABLE_NAME = \"sequelize_database_table_seeder_meta\";\n\nexport const REQUEST_ID_COOKIE_MAX_AGE = (1000 * 60 * 60 * 24 * 7); // 7 days\n\n// CORS constants\nexport const CORS_ALLOWED_METHODS = [\"GET\", \"POST\", \"PATCH\", \"DELETE\", \"OPTIONS\"];\nexport const CORS_ALLOWED_HEADERS = [ \"Content-Type\", \"Authorization\", \"X-Device-Id\", \"X-Device-Name\", \"User-Agent\"];\nexport const CORS_MAX_AGE_IN_SECONDS = (600) // default: 10 min\nexport const CORS_MAX_AGE_IN_MICRO_SECONDS = (1000 * 60 * 10); // 10 minutes\n\n// Rate limitter\nexport const REQUEST_RATE_LIMITTER_OPTIONS = {\n window_ms: (60 * 1000), // 1 MINS\n max_requests: 50,\n message: \"⏳ Too many requests from this IP, please try again later\"\n}","import axios from \"axios\";\nimport bcrypt from \"bcrypt\";\nimport dayjs from \"dayjs\";\n\nimport {\n CountLookupItemInterface,\n PaginationResultInterface,\n} from \"@/types/util_type\";\n\n// Utility class for transforming and formatting input values\nclass InputTransformerUtil {\n /**\n * Lookup table for number formatting suffixes\n */\n private static count_lookup: CountLookupItemInterface[] = [\n { value: 1, symbol: \"\" },\n { value: 1_000, symbol: \"K\" },\n { value: 1_000_000, symbol: \"M\" },\n { value: 1_000_000_000, symbol: \"B\" },\n { value: 1_000_000_000_000, symbol: \"T\" },\n ];\n\n /**\n * Capitalize the first letter of a string\n */\n public static capitalize(input: string): string {\n return input\n ? input.charAt(0).toUpperCase() + input.slice(1).toLowerCase()\n : input;\n }\n\n /**\n * Capitalize the first letter of each word in a string\n */\n public static capitalizeEachWord(input?: string): string {\n if (!input) {\n return \"\";\n }\n\n return input\n .split(\" \")\n .map((word) => this.capitalize(word))\n .join(\" \");\n }\n\n /**\n * Format date of birth to YYYY-MM-DD\n */\n public static formatDob(dob?: string | Date | null): string | null {\n return dob ? dayjs(dob).format(\"YYYY-MM-DD\") : null;\n }\n\n /**\n * Format full name from first and last name\n */\n public static formatMemberFullName(\n first_name?: string,\n last_name?: string\n ): string | null {\n return first_name && last_name ? `${first_name} ${last_name}` : null;\n }\n\n /**\n * Format member preview string\n */\n public static formatMemberPreview(\n first_name?: string,\n last_name?: string,\n public_id?: string\n ): string | null {\n return first_name && last_name && public_id\n ? `(${public_id}) - ${first_name} ${last_name}`\n : null;\n }\n\n /**\n * Format a number with commas\n */\n public static formatAmount(amount: number): string {\n if (!amount) {\n return \"0\";\n }\n\n return amount > 0\n ? Intl.NumberFormat(\"en-US\").format(amount)\n : amount.toString();\n }\n\n /**\n * Format large numbers with suffixes (K, M, B, T)\n */\n public static nFormatter(num: number, digits = 1): string {\n const lookup_item = this.count_lookup\n .slice()\n .reverse()\n .find((item) => num >= item.value);\n\n if (!lookup_item) {\n return \"0\";\n }\n\n const formatted_value = (num / lookup_item.value)\n .toFixed(digits)\n .replace(/\\.0+$|(\\.[0-9]*[1-9])0+$/, \"$1\");\n\n return `${formatted_value}${lookup_item.symbol}`;\n }\n\n /**\n * Round a number to two decimal places\n */\n public static roundToTwoDecimalPlaces(value: number): number {\n if (typeof value !== \"number\") {\n throw new Error(\"Input must be a number\");\n }\n\n return Math.round(value * 100) / 100;\n }\n\n /**\n * Remove leading zeros from a number or string\n */\n public static removeLeadingZeros(value: string | number): string {\n return value.toString().replace(/^0+/, \"\") || \"0\";\n }\n\n /**\n * Get country/location based on IP address\n */\n public static async ipAddressToLocation(\n ip_address: string | null = null\n ): Promise<string> {\n try {\n const suffix =\n !ip_address || ip_address === \"::1\"\n ? \"s\"\n : `?ip=${ip_address}`;\n\n const response = await axios.get(`https://ip2c.org/${suffix}`);\n const response_text = response.data.toString();\n\n if (response_text[0] === \"1\") {\n const location_parts = response_text.split(\";\");\n return location_parts[location_parts.length - 1];\n }\n\n return \"Unknown\";\n } catch (error) {\n console.error(\n `Error fetching location for IP ${ip_address}:`,\n error\n );\n return \"Unknown\";\n }\n }\n\n /**\n * Convert date of birth string to age\n */\n public static dobToAge(dob_string: string): number {\n const dob_date = new Date(dob_string);\n const today = new Date();\n\n let age = today.getFullYear() - dob_date.getFullYear();\n const month_difference =\n today.getMonth() - dob_date.getMonth();\n\n if (\n month_difference < 0 ||\n (month_difference === 0 &&\n today.getDate() < dob_date.getDate())\n ) {\n age--;\n }\n\n return age;\n }\n\n /**\n * Hash plain text password\n */\n public static textToPasswordHash(password: string): string {\n return bcrypt.hashSync(password, bcrypt.genSaltSync(10));\n }\n\n /**\n\t * Ensures singular, snake_case, and appends `_schema`\n\t * Example:\n\t * - \"Users\" → \"user_schema\"\n\t * - \"UserProfile\" → \"user_profile_schema\"\n\t */\n\tpublic static toSchemaFileName(input: string): string {\n\t\tconst snake = this.toSnakeCase(input);\n\n\t\t// naive singularization (good enough for now)\n\t\tconst singular = snake.endsWith(\"s\") ? snake.slice(0, -1) : snake;\n\n\t\treturn `${singular}_schema`;\n\t}\n\n /**\n * Convert snake_case to Title Case\n */\n public static toTitleCase(input: string): string {\n return input\n .split(\"_\")\n .map(\n (word) =>\n word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join(\" \");\n }\n\n /**\n * Convert snake_case to PascalCase\n */\n public static toPascalCase(input: string): string {\n return input\n .split(\"_\")\n .map(\n (word) =>\n word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join(\"\");\n }\n\n /**\n * Convert string to snake_case\n */\n public static toSnakeCase(input: string): string {\n return input\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1_$2\")\n .toLowerCase();\n }\n\n /**\n * Pluralize a snake_case string\n */\n public static pluralizeSnakeCase(\n snake_str: string\n ): string {\n const parts = snake_str.split(\"_\");\n const last_word = parts.pop() as string;\n\n let plural_word: string;\n\n if (\n last_word.endsWith(\"y\") &&\n !/[aeiou]y$/.test(last_word)\n ) {\n plural_word = last_word.slice(0, -1) + \"ies\";\n } else if (\n [\"s\", \"x\", \"z\"].includes(last_word.slice(-1)) ||\n last_word.endsWith(\"ch\") ||\n last_word.endsWith(\"sh\")\n ) {\n plural_word = `${last_word}es`;\n } else {\n plural_word = `${last_word}s`;\n }\n\n return [...parts, plural_word].join(\"_\");\n }\n\n /**\n * Remove empty, null, or undefined fields from an object\n */\n public static filterOutEmptyFields(\n obj: Record<string, any>\n ): Record<string, any> {\n const filtered_object: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (\n value !== null &&\n value !== undefined &&\n !(typeof value === \"string\" && value.trim() === \"\") &&\n !(Array.isArray(value) && value.length === 0)\n ) {\n filtered_object[key] = value;\n }\n }\n\n return filtered_object;\n }\n\n /**\n * Safely parse JSON input\n */\n public static toJson<T = unknown>(\n json_input: string | unknown | null | undefined\n ): T | null {\n try {\n if (!json_input) {\n return null;\n }\n\n if (typeof json_input === \"string\") {\n return JSON.parse(json_input) as T;\n }\n\n if (typeof json_input === \"object\") {\n return json_input as T;\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n /**\n * Calculate pagination offset and limit\n */\n public static calculatePaginationOffset(\n page: number,\n size: number\n ): { limit: number; offset: number } {\n const page_number = page > 0 ? page - 1 : 0;\n const adjusted_size = size > 200 ? 200 : size;\n const limit = adjusted_size || 10;\n const offset = page_number * limit;\n\n return { limit, offset };\n }\n\n /**\n * Format paginated response\n */\n public static formatPaginatedResponse(\n page: number,\n limit: number,\n data: { rows: any[]; count: number }\n ): PaginationResultInterface {\n const { count: total_items, rows: records } = data;\n\n const current_page = page || 0;\n const total_pages = Math.ceil(total_items / limit);\n\n return {\n total_items,\n records,\n total_pages,\n current_page,\n };\n }\n\n /**\n * Compare two records and detect changes\n */\n public static detectChanges(\n old_record: Record<string, any> = {},\n new_record: Record<string, any> = {},\n keys_to_check?: string[]\n ): {\n readable: string;\n structured: Record<string, { old: any; new: any }>;\n } {\n const structured_diff: Record<\n string,\n { old: any; new: any }\n > = {};\n\n const all_keys =\n keys_to_check ?? Object.keys(new_record);\n\n for (const key of all_keys) {\n const old_value = old_record[key];\n const new_value = new_record[key];\n\n if (old_value == new_value) {\n continue;\n }\n\n const formatted_old =\n typeof old_value === \"object\" &&\n old_value !== null\n ? JSON.stringify(old_value)\n : String(old_value ?? \"null\");\n\n const formatted_new =\n typeof new_value === \"object\" &&\n new_value !== null\n ? JSON.stringify(new_value)\n : String(new_value ?? \"null\");\n\n structured_diff[key] = {\n old: formatted_old,\n new: formatted_new,\n };\n }\n\n const readable_changes = Object.entries(\n structured_diff\n )\n .map(\n ([key, value]) =>\n `${key} changed from '${value.old}' → '${value.new}'`\n )\n .join(\"; \");\n\n return {\n readable:\n readable_changes ||\n \"No significant changes detected\",\n structured: structured_diff,\n };\n }\n\n /**\n * Normalize social links object keys\n */\n public static formatLinksObject(\n links: Record<string, string>\n ): Record<string, string> {\n const formatted_links: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(links)) {\n const normalized_key = key\n .toLowerCase()\n .endsWith(\"_link\")\n ? key.toLowerCase()\n : `${key.toLowerCase()}_link`;\n\n formatted_links[normalized_key] = value;\n }\n\n return formatted_links;\n }\n}\n\nexport default InputTransformerUtil;\n","import fs from \"fs\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport isSameOrAfter from \"dayjs/plugin/isSameOrAfter\";\nimport bcrypt from \"bcrypt\";\nimport axios from \"axios\";\n// import speakeasy from \"speakeasy\";\n\nimport EnvManagerUtil from \"@/utils/env_manager_util\";\n\ndayjs.extend(isSameOrAfter);\n\nclass InputValidatorUtil {\n private static readonly optional_field_regex = /^[a-zA-Z0-9_\\-]+$/; \n private static readonly name_regex_reg_exp = /^[A-Za-z.'\\s/_-]*$/;\n private static readonly namey_regex_reg_exp = /^[A-Za-z0-9.'\\s,/_\\-()&]*$/;\n private static readonly email_regex_reg_exp = /^(?=.{1,255}$)[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,190}\\.[a-zA-Z]{2,}$/i;\n private static readonly tel_regex_reg_exp = /^[\\s()+-]*([0-9][\\s()+-]*){6,20}$/;\n private static readonly pass_regex_reg_exp = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{6,}$/\n private static readonly url_regex_reg_exp = /^(https?:\\/\\/)?((localhost|[a-zA-Z0-9-_.]+)(:[0-9]{1,5})?)(\\/[a-zA-Z0-9-._~:/?#@!$&'()*+,;=%]*)?$/;\n private static readonly text_area_regex_reg_exp = /^(?=.*[a-zA-Z])[\\p{L}\\p{N}\\p{P}\\p{Zs}–—“”‘’]*$/u;\n private static readonly uuid_regex_reg_exp = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n private static readonly custom_uuid_regex_reg_exp = /^[A-Z0-9]{12}-[A-Z0-9]{12}-[A-Z0-9]{12}-[A-Z0-9]{12}$/;\n private static readonly env_manager = EnvManagerUtil.getInstance();\n\n public static isValidateIn = (value: any, allowed: any[]) => allowed.includes(value);\n\n /** ✅ Check member roles */\n static isAdmin(name: string) { return [\"SuperAdmin\", \"AdminI\", \"AdminT\"].includes(name); }\n\n static isSuperAdmin(name: string) { return name === \"SuperAdmin\"; }\n\n static isLowerSnakeCase(str: string): boolean { return /^[a-z]+(_[a-z]+)*$/.test(str); }\n\n static isUpperPascalCase(str: string): boolean { return /^[A-Z][a-zA-Z]*$/.test(str); }\n\n static isEmpty(input: any): boolean { return !input || input.toString().trim() === \"\"; }\n\n static isValidOptionalField(str: string): boolean { return this.optional_field_regex.test(str); }\n\n static isValidName(name: string): boolean { return this.name_regex_reg_exp.test(name); }\n\n static isValidNamey(name: string): boolean { return this.namey_regex_reg_exp.test(name); }\n\n static isValidEmail(email: string): boolean { return this.email_regex_reg_exp.test(email) && email.length <= 254; }\n\n static isValidPhoneNumber(tel: string): boolean { return this.tel_regex_reg_exp.test(tel); }\n\n static isValidPassword(password: string): boolean { return this.pass_regex_reg_exp.test(password); }\n\n static isDigit(input: any): boolean { return !isNaN(input); }\n\n static isValidInteger(input: any): boolean { return Number.isInteger(input) && input > 0; }\n\n static isValidFloat(input: any): boolean { return !isNaN(input) && parseFloat(input) > 0; }\n\n static isValidURLY(url: string): boolean {\n try { \n new URL(url);\n return true;\n } \n catch (_) { return false; }\n }\n\n static isValidURL(url: string): boolean { return this.url_regex_reg_exp.test(url) && this.isValidURLY(url); }\n\n static isBoolean(value: any): boolean { return typeof value === \"boolean\" || [\"1\", \"0\"].includes(String(value)); }\n\n static isValidLongText(text: string): boolean {\n if (!text || typeof text !== \"string\") { return false; }\n\n const forbidden_pattern = /[<>{};`]/;\n\n if (forbidden_pattern.test(text)) { return false; }\n \n return this.text_area_regex_reg_exp.test(text.trim());\n }\n\n static isValidUUID(uuid: string): boolean { return this.uuid_regex_reg_exp.test(uuid); }\n \n static isValidCustomUUID(uuid: string): boolean { return this.custom_uuid_regex_reg_exp.test(uuid); }\n \n static isArrayUnique(arr: any[]): boolean { return new Set(arr).size === arr.length; }\n \n static isValidFutureDate(date_string: string): boolean {\n const date = dayjs(date_string);\n\n return date.isValid() && date.isAfter(dayjs());\n }\n\n static isValidDateAndDifference(\n input?: string | null,\n unit: \"years\" | \"days\" | \"hours\" | \"minutes\" | \"seconds\" = \"years\"\n ): { date: Dayjs; difference: number } | null {\n if(!input) { return null }\n \n const date = dayjs(input);\n\n // Check validity\n if (!date.isValid()) { return null; }\n\n // Compute difference between now and the input date\n return { date, difference: dayjs().diff(date, unit) };\n }\n\n /** ✅ Validate password hash */\n static async isValidHashPassword(password: string, hash_password: string): Promise<boolean> { \n if(!password || !hash_password) { return false }\n\n return await bcrypt.compare(password, hash_password); \n }\n\n /** ✅ Check environment */\n static isProduction() { return InputValidatorUtil?.env_manager?.env_data?.MODE === \"production\"; }\n\n static isStaging() { return InputValidatorUtil?.env_manager?.env_data?.MODE === \"staging\"; }\n\n static isDevelopment() { return InputValidatorUtil?.env_manager?.env_data?.MODE === \"development\"; }\n\n static isLive() { return [\"production\", \"staging\"].includes(InputValidatorUtil?.env_manager?.env_data?.MODE || \"\"); }\n\n /** ✅ Validate ReCaptcha */\n static async isValidReCaptcha(\n recpatcha_token: string\n ) {\n const {\n RECAPTCHA_SECRET_KEY,\n RECPATHA_VERIFY_URL\n } = InputValidatorUtil?.env_manager?.env_data\n try {\n const secret_key = RECAPTCHA_SECRET_KEY\n const url = RECPATHA_VERIFY_URL;\n const params = { secret: secret_key, response: recpatcha_token }\n const response = await axios.post(url!, null, { params });\n\n return response.data.success;\n } \n catch (error) {\n console.error(\"reCAPTCHA verification failed:\", error);\n return false;\n }\n }\n\n // Method to check if a directory exists\n\tstatic dirExists (\n directory: string, \n create_directory: boolean = false, \n return_dir_path: boolean = false\n ): boolean | string { \n const exist = fs.existsSync(directory); \n\n if(!create_directory) { return exist }\n\n if (!exist) { fs.mkdirSync(directory); }\n\n return return_dir_path ? directory : true;\n }\n\n}\n\nexport default InputValidatorUtil;","import fs from \"fs\";\nimport path from \"path\";\nimport yaml from \"js-yaml\";\nimport axios from \"axios\";\n\nimport LoggerUtil from \"./logger_util\";\nimport { EnvConfigInterface } from \"@/types/util_type\";\nimport { ENV_VAR_DIR } from \"@/config/constants\";\n\nclass EnvManagerUtil {\n public readonly name = \"env_manager_util\";\n public env_file_name: string = \"env.yaml\";\n\n private static instance: EnvManagerUtil;\n\n private readonly yaml_env_file_path: string;\n private readonly logger: LoggerUtil;\n\n public env_data: EnvConfigInterface;\n\n // 🔒 Private constructor\n private constructor() {\n this.env_file_name = this.getEnvFileName();\n this.yaml_env_file_path = path.join(ENV_VAR_DIR, this.env_file_name);\n this.logger = new LoggerUtil(this.name);\n this.env_data = this.readENVData();\n }\n\n // Method to get env file name\n private getEnvFileName (): string {\n if (process?.env?.MODE === \"development\") { return \"env.yaml\" }\n\n else if (process?.env?.MODE === \"staging\") { return \"staging_env.yaml\" }\n\n else if (process?.env?.MODE === \"production\") { return \"production_env.yaml\" }\n\n else { return \"env.yaml\" }\n }\n\n // ✅ Global access point\n public static getInstance(): EnvManagerUtil {\n if (!EnvManagerUtil.instance) {\n EnvManagerUtil.instance = new EnvManagerUtil();\n }\n return EnvManagerUtil.instance;\n }\n\n // Read environment data from YAML\n private readENVData(): EnvConfigInterface {\n try {\n if (!fs.existsSync(this.yaml_env_file_path)) {\n this.logger.info(`YAML file not found at: ${this.yaml_env_file_path}`);\n return {};\n }\n\n const file_content = fs.readFileSync(this.yaml_env_file_path, \"utf8\");\n return (yaml.load(file_content) as EnvConfigInterface) || {};\n } catch (error: unknown) {\n this.logger.error(`${this.name} - readENVData`, { error });\n return {};\n }\n }\n\n // Get env var from YAML → process.env → default \n public getEnvVar<T = any>(key: string, default_value?: T): T | undefined {\n if (key in this.env_data) { return this.env_data[key]; }\n\n if (key in process.env) { return process.env[key] as T; }\n\n return default_value;\n }\n\n // Fetch remote env variables and merge\n public async fetchRemoteEnv(url: string): Promise<void> {\n try {\n const response = await axios.get(url);\n\n if (typeof response.data === \"object\" && response.data !== null) {\n this.env_data = { ...this.env_data, ...response.data };\n this.logger.success(\"Remote env variables loaded.\");\n } else {\n this.logger.error(\"Unexpected response format from remote env endpoint.\");\n }\n } catch (error: unknown) {\n this.logger.error(`${this.name} - fetchRemoteEnv`, { error });\n }\n }\n}\n\nexport default EnvManagerUtil;\n","class SqlFormatterUtil {\n\n // Basic ANSI color helpers\n private static AnsiColor = {\n reset: \"\\x1b[0m\",\n cyan: (text: string) => `\\x1b[36m${text}\\x1b[0m`,\n green: (text: string) => `\\x1b[32m${text}\\x1b[0m`,\n yellow: (text: string) => `\\x1b[33m${text}\\x1b[0m`,\n red: (text: string) => `\\x1b[31m${text}\\x1b[0m`,\n };\n\n private static sqlColors: Record<string, (text: string) => string> = {\n SELECT: SqlFormatterUtil.AnsiColor.cyan,\n INSERT: SqlFormatterUtil.AnsiColor.green,\n UPDATE: SqlFormatterUtil.AnsiColor.yellow,\n DELETE: SqlFormatterUtil.AnsiColor.red,\n };\n\n /**\n * Normalize SQL:\n * - Collapse multiple whitespaces/newlines\n * - Remove extra spaces inside parentheses\n */\n public static normalize(sql: string): string {\n return sql\n .replace(/\\s+/g, \" \")\n .replace(/\\(\\s+/g, \"(\")\n .replace(/\\s+\\)/g, \")\")\n .trim();\n }\n\n /**\n * Colorize SQL keywords (SELECT, INSERT, UPDATE, DELETE)\n */\n public static colorize(sql: string): string {\n const first_word = sql.split(\" \")[0].toUpperCase();\n const colorFN = this.sqlColors[first_word];\n \n return colorFN ? colorFN(sql) : sql;\n }\n\n /**\n * Full formatting for logging\n */\n public static format(sql: string): string {\n return this.colorize(this.normalize(sql));\n }\n}\n\nexport default SqlFormatterUtil;\n","import { Server } from \"http\";\nimport { LoggerUtil } from \"@/utils\"\nimport { ServerErrorInterface } from \"@/types\";\n\nclass ServerUtil {\n public readonly name: string = \"server_util\";\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);\n private readonly port: number;\n\n constructor(port: number) {\n this.port = port || 4000;\n }\n\n // Method to print app banner\n private printAppBanner (app_name: string): void {\n const raw = app_name.replace(/[-_]/g, \" \");\n const title = raw.toUpperCase();\n const border_char = \"═\";\n const corner_tl = \"╔\";\n const corner_tr = \"╗\";\n const corner_bl = \"╚\";\n const corner_br = \"╝\";\n const side_char = \"║\";\n const padding = 4;\n const content_width = title.length + padding * 2;\n const border = border_char.repeat(content_width);\n\n const line1 = `${corner_tl}${border}${corner_tr}`;\n const line2 = `${side_char} ${\" \".repeat(padding)}${title}${\" \".repeat(padding)}${side_char} `;\n const line3 = `${corner_bl}${border}${corner_br} `;\n\n console.log(\"\\n\" + line1);\n console.log(line2);\n console.log(line3 + \"\\n\");\n }\n\n // Method to handle server errors\n public onServerError (error: ServerErrorInterface): void {\n if (error.syscall !== \"listen\") { \n this.logger.error(\"Unexpected server error\", { error });\n throw error; \n }\n\n const bind = `Port ${this.port}`;\n\n switch (error.code) {\n case \"EACCES\":\n this.logger.error(`${bind} requires elevated privileges`);\n process.exit(1);\n break;\n case \"EADDRINUSE\":\n this.logger.error(`${bind} is already in use`);\n process.exit(1);\n break;\n default:\n throw error;\n }\n }\n\n // Method to handle server listening\n public onServerListening = (server: Server): void => {\n this.printAppBanner(\"fibase-server-app\");\n\n const addr = server.address();\n const bind = typeof addr === \"string\" ? `pipe ${addr}` : `port ${addr?.port}`;\n\n this.logger.info(`Listening on ${bind}`);\n }\n}\n\nexport default ServerUtil;","\nimport { Response } from \"express\";\n\nimport { LoggerUtil } from \"@/utils\";\nimport { ErrorHandlingStrategyEnum } from \"@/types/util_type\";\n\n\n\nclass SafeExecuteUtil {\n // Store instances by class constructor (WeakMap ensures GC can clean up)\n private static instances = new WeakMap<object, any>();\n\n // Store instances by string keys (Map keeps strong references)\n private static named_insatnces = new Map<string, any>();\n\n public static setInstance(key: object, instance: any) {\n SafeExecuteUtil.instances.set(key, instance);\n }\n\n /** Set instance by string key */\n public static setNamedInstance(key: string, instance: any) {\n SafeExecuteUtil.named_insatnces.set(key, instance);\n }\n\n private static getInstance(key: object, fallback: any) {\n return SafeExecuteUtil.instances.get(key) ?? fallback;\n }\n\n /** Get instance by string key */\n public static getNamedInstance(key: string, fallback?: any) {\n return SafeExecuteUtil.named_insatnces.get(key) ?? fallback;\n }\n\n // Method to Safely stringify any object for logging\n private static safeStringify(obj: unknown): string {\n try { return JSON.stringify(obj); }\n catch { return \"[Unserializable Params]\"; }\n }\n\n // 🔹 Method to Execution time logger\n private static logExecutionTime(\n start: [number, number], \n class_name: string, \n method_name: string, \n logger: LoggerUtil\n ) {\n const [seconds, nanoseconds] = process.hrtime(start);\n const ms = (seconds * 1000 + nanoseconds / 1e6).toFixed(2);\n\n logger.info(`[${class_name}] ⏱️ ${method_name} executed in ${ms}ms`);\n }\n\n // Method to handle on error action\n private static handleOnErrorAction (\n error: unknown, \n strategy: ErrorHandlingStrategyEnum, \n default_value: any, \n controller_response?: Response\n ) {\n if (strategy === ErrorHandlingStrategyEnum.CONTROLLER_ERROR && controller_response?.errResponse) {\n return controller_response?.errResponse?.(500, \"invalid_error_request\");\n }\n switch (strategy) {\n case ErrorHandlingStrategyEnum.RETURN_DEFAULT: return default_value;\n case ErrorHandlingStrategyEnum.EXIT_PROCESS: process.exit(1);\n case ErrorHandlingStrategyEnum.THROW_ERROR: throw error;\n } \n \n return;\n }\n\n // 🔹 Method to Unifysafe execution wrapper (normal methods)\n public static createSafeFunction<T>(\n class_name: string,\n method_name: string,\n original_method: (...args: any[]) => T | Promise<T>,\n strategy: ErrorHandlingStrategyEnum,\n default_value?: T,\n ): (...args: any[]) => Promise<T | undefined> {\n return async function (this: any, ...args: any[]): Promise<T | undefined> {\n const class_instance = SafeExecuteUtil.getNamedInstance(class_name, this);\n const logger: LoggerUtil = class_instance?.logger || new LoggerUtil(class_name);\n const method_params = args;\n\n try {\n return await original_method.apply(class_instance, method_params);\n } \n catch (error: unknown) {\n const safely_stringified_error = SafeExecuteUtil.safeStringify(error);\n logger.error(`[${class_name}] ❌ Error in method ${method_name}`, { method_params, error, safely_stringified_error});\n SafeExecuteUtil.handleOnErrorAction(error, strategy, default_value); \n }\n };\n }\n\n // 🔹 Unified safe execution wrapper with timing (for controller/service)\n private static createTimedSafeFunction<T>(\n class_name: string,\n method_name: string,\n original_method: (...args: any[]) => T | Promise<T>,\n strategy: ErrorHandlingStrategyEnum,\n default_value?: T,\n ): (...args: any[]) => Promise<T | undefined> {\n return async function (this: any, ...args: any[]): Promise<T | undefined> {\n const class_instance = SafeExecuteUtil.getNamedInstance(class_name, this);\n const logger: LoggerUtil = class_instance?.logger || new LoggerUtil(class_name);\n const start_time = process.hrtime();\n const method_params = args;\n const controller_response = args && args.length ? args[1] : undefined;\n\n try {\n const result = await original_method.apply(class_instance, args);\n return result\n } \n catch (error: unknown) {\n const safely_stringified_error = SafeExecuteUtil.safeStringify(error);\n logger.error(`[${class_name}] ❌ Error in method ${method_name}`, { method_params, error, safely_stringified_error});\n SafeExecuteUtil.handleOnErrorAction(error, strategy, default_value, controller_response); \n } \n finally { \n SafeExecuteUtil.logExecutionTime(start_time, class_name, method_name, logger); \n }\n }\n };\n\n // Decorator Method to handle wrapping cclass methods\n private static applySafeWrapper(\n target: Object, \n class_name: string,\n property_key: string | symbol, \n descriptor: PropertyDescriptor,\n strategy: ErrorHandlingStrategyEnum,\n timed: boolean,\n default_value?: any,\n ) {\n if (typeof descriptor.value !== \"function\") { return; }\n\n descriptor.value = timed ? \n SafeExecuteUtil.createTimedSafeFunction(\n class_name,\n String(property_key), \n descriptor.value, \n strategy,\n default_value,\n )\n :\n SafeExecuteUtil.createSafeFunction(\n class_name,\n String(property_key), \n descriptor.value, \n strategy,\n default_value\n )\n }\n\n // Decorator method to handle controller methods\n public static safeExecuteController(\n class_name: string\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.CONTROLLER_ERROR,\n true\n );\n }\n }\n\n // Decorator Method to handle service methods\n public static safeExecuteService(\n class_name: string, \n default_value?: any\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT, \n true,\n default_value\n )\n }\n }\n\n // Decorator Method to wrap method with retrun value\n public static safeExecuteReturn<T = any>(\n class_name: string, \n default_value?: T\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT,\n false,\n default_value\n )\n }\n }\n\n // Decorator Method to wrap method with retrun value\n public static safeExecuteTransaction<T = any>(\n class_name: string, \n default_value?: T\n ) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT, \n false,\n default_value\n )\n }\n }\n\n // Decorator method to wrap method with void return\n public static safeExecute(class_name: string) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.RETURN_DEFAULT,\n false\n );\n }\n }\n \n // Decorator method to wrap method with void return\n public static safeExecuteExit(class_name: string) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.EXIT_PROCESS,\n false\n );\n }\n }\n\n // Decorator method to wrap method with void return\n public static safeExecuteThrow(class_name: string) {\n return function (target: Object, property_key: string | symbol, descriptor: PropertyDescriptor) {\n return SafeExecuteUtil.applySafeWrapper(\n target, \n class_name,\n property_key, \n descriptor, \n ErrorHandlingStrategyEnum.THROW_ERROR,\n false\n );\n }\n }\n\n\n}\n\nexport default SafeExecuteUtil;","type CacheEntry<T> = {\n value: T;\n expires_at: number; // unix ms timestamp\n};\n\nclass InMemoryCache<T = unknown> {\n private store = new Map<string, CacheEntry<T>>();\n\n /**\n * Set a cache value with TTL (ms)\n */\n public set(key: string, value: T, ttl_ms: number): void {\n if (!key) return;\n\n const expires_at = Date.now() + ttl_ms;\n this.store.set(key, { value, expires_at });\n }\n\n /**\n * Get a cache value (returns undefined if missing or expired)\n */\n public get(key: string): T | undefined {\n const entry = this.store.get(key);\n\n if (!entry) return undefined;\n\n if (Date.now() > entry.expires_at) {\n this.store.delete(key);\n return undefined;\n }\n\n return entry.value;\n }\n\n /**\n * Check if a key exists and is valid\n */\n public has(key: string): boolean {\n return this.get(key) !== undefined;\n }\n\n /**\n * Update an existing cache entry (keeps old TTL)\n */\n public update(key: string, value: T): boolean {\n const entry = this.store.get(key);\n\n if (!entry) return false;\n\n if (Date.now() > entry.expires_at) {\n this.store.delete(key);\n return false;\n }\n\n this.store.set(key, { ...entry, value });\n return true;\n }\n\n /**\n * Delete a single cache entry\n */\n public delete(key: string): boolean {\n return this.store.delete(key);\n }\n\n /**\n * Clear entire cache\n */\n public clear(): void {\n this.store.clear();\n }\n\n /**\n * Manually expire a key immediately\n */\n public expire(key: string): void {\n this.store.delete(key);\n }\n\n /**\n * Cleanup expired entries (optional call)\n */\n public cleanup(): void {\n const now = Date.now();\n for (const [key, entry] of this.store.entries()) {\n if (now > entry.expires_at) {\n this.store.delete(key);\n }\n }\n }\n\n /**\n * Cache size (for metrics)\n */\n public size(): number {\n return this.store.size;\n }\n}\n\nexport default InMemoryCache;\n"],"mappings":"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","names":["path","path","fs","dayjs","bcrypt","axios","fs","path","axios","path","fs","axios","dayjs","bcrypt","axios","fs"]}
@@ -1,4 +1,4 @@
1
- import { e as SchemaSnapshotInterface, d as SchemaDiffInterface, c as SchemaDefinitionInterface, M as MigrationOperationTypes, f as SeederOperationTypes } from '../migration_type-XLMG0zzO.js';
1
+ import { e as SchemaSnapshotInterface, d as SchemaDiffInterface, c as SchemaDefinitionInterface, M as MigrationOperationTypes, f as SeederOperationTypes, g as SequelizeConnectionOptions } from '../database_type-TaZge-7g.js';
2
2
  import { E as EnvManagerUtil, L as LoggerUtil } from '../env_manager_util-DLs1b9Q7.js';
3
3
  import { Sequelize } from 'sequelize';
4
4
  import '../util_type-Yyo1nXmm.js';
@@ -115,12 +115,16 @@ declare abstract class BaseConnector<TConnection> {
115
115
 
116
116
  declare class SequelizeConnector extends BaseConnector<Sequelize> {
117
117
  private static instance;
118
- private readonly name;
119
- private static sequelize_db_instance;
118
+ private static connections;
120
119
  private constructor();
121
120
  static getInstance(): SequelizeConnector;
122
121
  private formatSQLQueryLog;
123
- connect(): Sequelize;
122
+ connect(options?: SequelizeConnectionOptions): Sequelize;
123
+ connectNamed(name: string, options?: SequelizeConnectionOptions): Sequelize;
124
+ getConnection(name?: string): Sequelize | undefined;
125
+ hasConnection(name?: string): boolean;
126
+ closeConnection(name?: string): Promise<void>;
127
+ closeAll(): Promise<void>;
124
128
  }
125
129
 
126
130
  export { BaseConnector, CreateSchemaScript, CreateSeederScript, MakeMigrationsScript, MigrationRunnerScript, SchemaDiffUtil, SchemaNormalizerUtil, SeederRunnerScript, SequelizeConnector };
@@ -10,7 +10,7 @@ import {
10
10
  input_validator_util_default,
11
11
  logger_util_default,
12
12
  sql_formatter_util_default
13
- } from "../chunk-SI4SUH2O.js";
13
+ } from "../chunk-XUYXE74J.js";
14
14
  import {
15
15
  __require
16
16
  } from "../chunk-6AJLW7HC.js";
@@ -1045,8 +1045,7 @@ var base_connector_default = BaseConnector;
1045
1045
  import { Sequelize as Sequelize3 } from "sequelize";
1046
1046
  var SequelizeConnector = class _SequelizeConnector extends base_connector_default {
1047
1047
  static instance;
1048
- name = "sequelize_connector";
1049
- static sequelize_db_instance = null;
1048
+ static connections = /* @__PURE__ */ new Map();
1050
1049
  constructor() {
1051
1050
  super("sequelize_connector");
1052
1051
  }
@@ -1056,7 +1055,9 @@ var SequelizeConnector = class _SequelizeConnector extends base_connector_defaul
1056
1055
  }
1057
1056
  return _SequelizeConnector.instance;
1058
1057
  }
1059
- // Method to format sql query log
1058
+ // ----------------------------------
1059
+ // SQL logging
1060
+ // ----------------------------------
1060
1061
  formatSQLQueryLog = (sql, timing) => {
1061
1062
  try {
1062
1063
  const formatted = sql_formatter_util_default.format(sql);
@@ -1069,25 +1070,64 @@ var SequelizeConnector = class _SequelizeConnector extends base_connector_defaul
1069
1070
  this.logger.error("Failed to log SQL query", { error });
1070
1071
  }
1071
1072
  };
1072
- // Method to connect to db
1073
- connect() {
1074
- if (!_SequelizeConnector.sequelize_db_instance) {
1075
- const dialect = this.env_manager.getEnvVar("DB_DIALECT", "postgres");
1076
- const logging_enabled = this.env_manager.getEnvVar("DB_LOGGING", false);
1077
- const logging = logging_enabled ? this.formatSQLQueryLog : false;
1078
- _SequelizeConnector.sequelize_db_instance = new Sequelize3({
1079
- database: this.env_manager.getEnvVar("DB_NAME"),
1080
- username: this.env_manager.getEnvVar("DB_USER"),
1081
- password: this.env_manager.getEnvVar("DB_PASSWORD"),
1082
- host: this.env_manager.getEnvVar("DB_HOST"),
1083
- port: this.env_manager.getEnvVar("DB_PORT", 5432),
1084
- dialect,
1085
- logging,
1086
- benchmark: logging_enabled
1087
- });
1088
- this.logger.success("\u2705 Sequelize connected");
1073
+ // ----------------------------------
1074
+ // Single default connection
1075
+ // ----------------------------------
1076
+ connect(options = {}) {
1077
+ return this.connectNamed(options.name ?? "default", options);
1078
+ }
1079
+ // ----------------------------------
1080
+ // Multiple named connections
1081
+ // ----------------------------------
1082
+ connectNamed(name, options = {}) {
1083
+ if (_SequelizeConnector.connections.has(name)) {
1084
+ return _SequelizeConnector.connections.get(name);
1085
+ }
1086
+ const dialect = options.dialect ?? this.env_manager.getEnvVar("DB_DIALECT", "postgres");
1087
+ const logging_enabled = options.logging ?? this.env_manager.getEnvVar("DB_LOGGING", false);
1088
+ const logging = logging_enabled ? this.formatSQLQueryLog : false;
1089
+ const database = options.database ?? this.env_manager.getEnvVar("DB_NAME");
1090
+ const username = options.username ?? this.env_manager.getEnvVar("DB_USER");
1091
+ const password = options.password ?? this.env_manager.getEnvVar("DB_PASSWORD");
1092
+ const host = options.host ?? this.env_manager.getEnvVar("DB_HOST");
1093
+ const port = options.port ?? this.env_manager.getEnvVar("DB_PORT", 5432);
1094
+ const sequelize = new Sequelize3({
1095
+ database,
1096
+ username,
1097
+ password,
1098
+ host,
1099
+ port,
1100
+ dialect,
1101
+ logging,
1102
+ benchmark: logging_enabled
1103
+ });
1104
+ _SequelizeConnector.connections.set(name, sequelize);
1105
+ this.logger.success(`\u2705 Sequelize connected [${name}]`);
1106
+ return sequelize;
1107
+ }
1108
+ // ----------------------------------
1109
+ // Utilities
1110
+ // ----------------------------------
1111
+ getConnection(name = "default") {
1112
+ return _SequelizeConnector.connections.get(name);
1113
+ }
1114
+ hasConnection(name = "default") {
1115
+ return _SequelizeConnector.connections.has(name);
1116
+ }
1117
+ async closeConnection(name = "default") {
1118
+ const conn = _SequelizeConnector.connections.get(name);
1119
+ if (conn) {
1120
+ await conn.close();
1121
+ _SequelizeConnector.connections.delete(name);
1122
+ this.logger.info(`\u{1F50C} Sequelize connection closed [${name}]`);
1123
+ }
1124
+ }
1125
+ async closeAll() {
1126
+ for (const [name, conn] of _SequelizeConnector.connections.entries()) {
1127
+ await conn.close();
1128
+ this.logger.info(`\u{1F50C} Sequelize connection closed [${name}]`);
1089
1129
  }
1090
- return _SequelizeConnector.sequelize_db_instance;
1130
+ _SequelizeConnector.connections.clear();
1091
1131
  }
1092
1132
  };
1093
1133
  var sequelize_connector_default = SequelizeConnector;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/database/schema/schema_diff_util.ts","../../src/database/schema/schema_normalizer_util.ts","../../src/database/scripts/create_schema_script.ts","../../src/code_templates/sequelize_code_template.ts","../../src/database/scripts/make_migrations_script.ts","../../src/database/scripts/migration_runner_script.ts","../../src/database/scripts/create_seeder_script.ts","../../src/database/scripts/seeder_runner_script.ts","../../src/database/connectors/base_connector.ts","../../src/database/connectors/sequelize_connector.ts"],"sourcesContent":["import { \n SchemaDiffInterface, \n SchemaSnapshotInterface,\n IndexFieldOptionsInterface,\n SchemaColumnInterface\n} from \"@/types/schema_type\";\n\n\n\nclass SchemaDiffUtil {\n\n private static indexKey(i: IndexFieldOptionsInterface): string {\n return JSON.stringify({\n fields: i.fields,\n unique: i.unique,\n using: i.using,\n operator: i.operator,\n });\n }\n\n public static getSchemaDifference(\n prev: SchemaSnapshotInterface, \n curr: SchemaSnapshotInterface\n ): SchemaDiffInterface {\n\n const diff: SchemaDiffInterface = {\n columns: { added: [], removed: {}, modified: {} },\n indexes: { added: [], removed: [], modified: {} },\n };\n\n // Table rename\n if (prev.table_name !== curr.table_name) {\n diff.table_renamed = {\n from: prev.table_name,\n to: curr.table_name,\n };\n }\n\n // Columns\n for (const [col_name, col_def] of Object.entries(curr.columns)) {\n const prev_col: SchemaColumnInterface = prev.columns[col_name];\n\n if(!prev_col) {\n diff.columns.added.push(col_name);\n }\n else if (JSON.stringify(prev_col) !== JSON.stringify(col_def)) {\n diff.columns.modified[col_name] = { \n before: prev_col, \n after: col_def \n };\n }\n }\n\n for (const [prev_col_name, prev_col_def] of Object.entries(prev.columns)) {\n if (!curr.columns[prev_col_name]) {\n diff.columns.removed[prev_col_name] = prev_col_def;\n }\n }\n\n // Indexes\n const prev_indexes = prev?.indexes || [];\n const curr_indexes = curr?.indexes || [];\n const prev_map = new Map(prev_indexes.map(i => [SchemaDiffUtil.indexKey(i), i]));\n const curr_map = new Map(curr_indexes.map(i => [SchemaDiffUtil.indexKey(i), i]));\n\n for (const [key, idx] of curr_map) {\n if (!prev_map.has(key)) {\n diff.indexes.added.push(idx);\n }\n }\n\n for (const [key, idx] of prev_map) {\n if (!curr_map.has(key)) {\n diff.indexes.removed.push(idx);\n }\n }\n\n // Modified indexes (same fields, different options)\n for (const curr_idx of curr_indexes) {\n const prev_idx = prev_indexes.find(\n p => JSON.stringify([...p.fields].sort()) === JSON.stringify([...curr_idx.fields].sort())\n );\n\n if (prev_idx && JSON.stringify(prev_idx) !== JSON.stringify(curr_idx)) {\n diff.indexes.modified[curr_idx?.name] = { \n before: prev_idx, \n after: curr_idx \n };\n }\n }\n\n return diff;\n }\n}\n\nexport default SchemaDiffUtil;\n","import { \n SchemaDefinitionInterface, \n SchemaSnapshotInterface \n} from \"@/types/schema_type\";\n\n\nclass SchemaNormalizerUtil {\n static normalizeColumn(column: any) {\n return {\n type: column.type?.key ?? column.type?.toString(),\n allow_null: column.allowNull ?? true,\n primary_key: !!column.primaryKey,\n auto_increment: !!column.autoIncrement,\n unique: !!column.unique,\n default_value: column.defaultValue ?? null,\n references: column.references ?? null,\n on_update: column.onUpdate ?? null,\n on_delete: column.onDelete ?? null,\n };\n }\n\n static normalizeIndex(index: any) {\n return {\n name: index.name ?? null,\n fields: [...index.fields].sort(),\n unique: !!index.unique,\n using: index.using ?? null,\n operator: index.operator ?? null,\n };\n }\n\n static normalizeSchema(\n schema: SchemaDefinitionInterface\n ): SchemaSnapshotInterface {\n return {\n database_name: schema.database_name,\n table_name: schema.table_name,\n model_name: schema.model_name,\n migration_priority: schema.migration_priority,\n timestamps: schema.timestamps,\n\n columns: Object.fromEntries(\n Object.entries(schema.columns).map(([key, col]) => [\n key,\n this.normalizeColumn(col),\n ])\n ),\n\n indexes: (schema.indexes ?? []).map(this.normalizeIndex),\n };\n }\n}\n\nexport default SchemaNormalizerUtil\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { SCHEMAS_DIR } from \"@/config/constants\";\nimport { SEQUELIZE_SCHEMA_CODE_TEMPLATE } from \"@/code_templates/sequelize_code_template\"\n\nimport { \n\tLoggerUtil,\n\tInputTransformerUtil,\n\tInputValidatorUtil,\n} from \"@/utils\";\n\nclass CreateSchemaScript {\n\tprivate name: string = \"create_schema_script\"\n\tprivate readonly raw_input: string;\n\tprivate readonly schemas_dir: string;\n\tprivate readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n constructor(raw_input?: string) {\n\t\tif (!raw_input) {\n\t\t\tconst log_msg = \"❌ Please provide a schema name.\"\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\tthis.raw_input \t\t= raw_input;\n\t\tthis.schemas_dir \t= SCHEMAS_DIR;\n\t}\n\n // Method to ensure schema does not exist\n\tprivate ensureSchemaDoesNotExist(file_path: string): void {\n\t\tif (fs.existsSync(file_path)) {\n\t\t\tconst log_msg = `❌ Schema already exists. File: ${file_path}`\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\t}\n\n\t// Determine next migration priority from existing schemas\n private getNextMigrationPriority(): number {\n if (!fs.existsSync(this.schemas_dir)) {\n return 1;\n }\n\n const files = fs.readdirSync(this.schemas_dir);\n\n return files.length + 1;\n }\n\n // Pad migration priority (e.g. 1 -> 001)\n private formatPriority(priority: number): string {\n return priority.toString().padStart(3, \"0\");\n }\n\n\t// Method to create schema file with boilerplate data\n\tprivate createSchemaFile(\n file_path: string, \n schema_name: string, \n model_name: string, \n table_name: string, \n migration_priority: number\n ): void {\n \tconst template = SEQUELIZE_SCHEMA_CODE_TEMPLATE(schema_name, table_name, model_name, migration_priority);\n\n\t\ttry {\n\t\t\tfs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`❌ Failed to write schema file: ${file_path}`);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n // Main Method to run\n\tpublic run(): void {\n\t\tconst file_base_name \t\t= InputTransformerUtil.toSchemaFileName(this.raw_input);\n const base_pascal \t\t\t= InputTransformerUtil.toPascalCase(file_base_name);\n const schema_name \t= base_pascal.toLowerCase().endsWith(\"schema\") ? base_pascal : `${base_pascal}Schema`;\n const model_name \t\t\t= base_pascal.toLowerCase().endsWith(\"schema\") ? base_pascal.replace(/Schema$/i, \"\") : base_pascal;\n const table_name \t\t\t= InputTransformerUtil.pluralizeSnakeCase(InputTransformerUtil.toSnakeCase(model_name));\n const migration_priority \t= this.getNextMigrationPriority();\n const file_name \t\t\t= `${file_base_name}.ts`;\n const file_path \t\t\t= path.join(this.schemas_dir, file_name);\n\n\t\t// Ensure schemas directory exists (create if missing)\n\t\tInputValidatorUtil.dirExists(this.schemas_dir, true);\n\n\t\tthis.ensureSchemaDoesNotExist(file_path);\n\t\tthis.createSchemaFile(file_path, schema_name, model_name, table_name, migration_priority);\n;\n\t\tthis.logger.success(\"✅ Schema created successfully Created database/schemas/${file_base_name}.ts\");\n this.logger.info(`📄 File Path: ${file_path}`);\n this.logger.info(`🧩 Schema Name: ${schema_name}`);\n this.logger.info(`📦 Model Name: ${model_name}`);\n this.logger.info(`🗄️ Table Name: ${table_name}`);\n\t}\n}\n\nexport default CreateSchemaScript;\n\n// CLI entry point\ntry {\n\tnew CreateSchemaScript(process.argv[2]).run();\n\tprocess.exit(0);\n} \ncatch (error: any) {\n\tconsole.error(error?.message || \"\");\n\tprocess.exit(1);\n}","import { \n IndexFieldOptionsInterface,\n SchemaColumnInterface, \n SchemaDiffInterface \n} from \"@/types/schema_type\";\n\nconst SEQUELIZE_SCHEMA_CODE_TEMPLATE = (\n schema_name: string, \n table_name: string, \n model_name: string, \n migration_priority: number\n): string => \n{\n return `\nimport { DataTypes } from \"sequelize\";\nimport { SchemaDefinitionInterface } from \"fiberx-backend-toolkit/types/schema_type\";\n\nconst ${schema_name}: SchemaDefinitionInterface = {\n database_name: \"public\",\n migration_priority: ${migration_priority},\n\n table_name: \"${table_name}\",\n model_name: \"${model_name}\",\n timestamps:true,\n\n columns: {\n id: {\n type: DataTypes.BIGINT,\n primaryKey: true,\n autoIncrement: true,\n allowNull: false,\n },\n\n created_at: {\n type: DataTypes.DATE,\n defaultValue: DataTypes.NOW,\n },\n\n updated_at: {\n type: DataTypes.DATE,\n allowNull: true,\n defaultValue: null,\n },\n },\n\n indexes: [\n { fields: [\"\"], name: \"\" },\n ],\n};\n\nexport default ${schema_name};\n`\n}\n\nconst SEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE = ( \n schema_table_name: string, \n schema_model_name: string,\n schema_file_name: string \n): string => `\nimport { QueryInterface, DataTypes, Sequelize } from \"sequelize\";\nimport { LoggerUtil } from \"fiberx-backend-toolkit//utils\";\nimport { SchemaDefinitionInterface } from \"fiberx-backend-toolkit/types/schema_type\";\nimport ${schema_model_name}Schema from \"@/database/schemas/${schema_file_name.replace(\".ts\", \"\")}\";\n\nclass Create${schema_model_name}TableMigration {\n private name: string = \"create_table_${schema_table_name}_migration_file\";\n private schema: SchemaDefinitionInterface = ${schema_model_name}Schema;\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n constructor() {}\n\n // Migration UP\n public async up(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, columns = {}, indexes = [] } = this.schema;\n\n await queryInterface.createTable(table_name, columns);\n\n for (const index_field_obj of indexes) {\n\n const { fields, name, index_options } = index_field_obj;\n const index_name = \\`idx_\\${table_name}_\\${fields.join(\"_\")}\\`\n \n await queryInterface.addIndex(\n table_name, \n fields, \n { name: index_name, ...index_options }\n );\n }\n\n this.logger.success(\\`✅ Table \"\\${table_name}\" for schema \"\\${model_name}Schema\" created with \"\\${this.index_attributes.length}\" indexed Fields.\\`);\n } \n catch (error: any) {\n this.logger.error(\\`🚫 Migration failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Migration failed: \"\\${error.message}\"\\`);\n }\n }\n\n // Migration DOWN\n public async down(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, database_name, model_name } = this.schema;\n await queryInterface.dropTable(table_name, {});\n this.logger.success(\\`🗑️ Table \"\\${table_name}\" dropped successfully.\\`);\n } catch (error: any) {\n this.logger.error(\\`🚫 Migration rollback failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Migration rollback failed: \"\\${error.message}\"\\`);\n }\n }\n}\n\nexport default Create${schema_model_name}TableMigration;\n`;\n\nconst SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE = (\n schema_table_name: string,\n schema_model_name: string,\n diff: SchemaDiffInterface,\n schema_file_name: string\n): string => `\nimport { QueryInterface, DataTypes, Sequelize } from \"sequelize\";\nimport { LoggerUtil } from \"fiberx-backend-toolkit//utils\";\nimport { SchemaDefinitionInterface } from \"fiberx-backend-toolkit/types/schema_type\";\nimport ${schema_model_name}Schema from \"@/database/schemas/${schema_file_name.replace(\".ts\", \"\")}\";\n\nclass Update${schema_model_name}TableMigration {\n private name: string = \"update_table_${schema_table_name}_migration_file\";\n private schema: SchemaDefinitionInterface = ${schema_model_name}Schema;\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n constructor() {}\n\n public async up(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, model_name, columns = {}, indexes = [] } = this.schema;\n\n ${diff.table_renamed ? `\n await queryInterface.renameTable(\n \"${diff.table_renamed.from}\",\n \"${diff.table_renamed.to}\"\n );` \n : \n \"\"\n }\n\n // Add columns\n ${diff.columns.added.map((column_name: string) => `\n await queryInterface.addColumn(\n table_name,\n \"${column_name}\",\n columns[\"${column_name}\"]\n );\n `).join(\"\")}\n\n // Modify columns\n ${Object.entries(diff.columns.modified).map(([col_name, col_modified]) => `\n await queryInterface.changeColumn(\n table_name, \n \"${col_name}\", \n ${JSON.stringify(col_modified?.after)}\n );\n `\n ).join(\"\")}\n\n // Remove columns\n ${Object.entries(diff.columns.modified).map(([col_name, col_Def]) => `\n await queryInterface.removeColumn(\n table_name, \n \"${col_name}\"\n );\n `\n ).join(\"\")}\n\n\n // Add indexes\n ${diff.indexes.added.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx.fields)}, \n ${JSON.stringify(idx)}\n );\n `\n ).join(\"\")}\n\n // Modify indexes (remove + add)\n ${Object.entries(diff.indexes.modified).map(([idx_name, idx_modified]) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx_modified.before.name)}\n );\n\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx_modified.after.fields)}, \n ${JSON.stringify(idx_modified.after)}\n );\n `\n ).join(\"\")}\n\n // Remove indexes\n ${diff.indexes.removed.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx.name)}\n );\n `\n ).join(\"\")}\n\n\n this.logger.success(\\`✅ Table \"\\${table_name}\" for schema \"\\${model_name}Schema\" updated successfully.\\`);\n } \n catch (error: any) {\n this.logger.error(\\`🚫 Update migration failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Update migration failed: \"\\${error.message}\"\\`);\n }\n }\n\n public async down(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, model_name, columns = {} } = this.schema;\n\n // Revert Added indexes\n ${diff.indexes.added.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx.name)}\n );`\n ).join(\"\")}\n\n // Revert Modified Indexes\n ${Object.entries(diff.indexes.modified).map(([idx_name, idx_modified]) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx_modified.after.name)}\n );\n\n\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx_modified.before.fields)}, \n ${JSON.stringify(idx_modified.before)}\n );`\n ).join(\"\")}\n\n // Revert removed indexes\n ${diff.indexes.removed.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx.fields)}, \n ${JSON.stringify(idx)}\n );`\n ).join(\"\")}\n\n // Revert Modified columns\n ${Object.entries(diff.columns.modified).map(([col_name, col_modified]) => `\n await queryInterface.changeColumn(\n table_name, \n \"${col_name}\", \n ${JSON.stringify(col_modified.before)}\n );`\n ).join(\"\")}\n\n // Revert added columns\n ${diff.columns.added.map((column_name: string) => `\n await queryInterface.removeColumn(table_name, \"${column_name}\");\n `).join(\"\")}\n\n ${Object.entries(diff.columns.modified).map(([col_name, col_Def]) => `\n await queryInterface.addColumn(\n table_name, \n \"${col_name}\", \n ${JSON.stringify(col_Def)}\n );\n `).join(\"\")}\n\n ${diff.table_renamed ? `\n await queryInterface.renameTable(\n \"${diff.table_renamed.to}\",\n \"${diff.table_renamed.from}\"\n );` : \"\"\n }\n\n this.logger.success(\\`🗑️ Rollback of table \"\\${table_name}\" completed successfully.\\`);\n } \n catch (error: any) {\n this.logger.error(\\`🚫 Rollback migration failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Rollback migration failed: \"\\${error.message}\"\\`);\n }\n }\n}\n\nexport default Update${schema_model_name}TableMigration;\n`;\n\nconst SEQUELIZE_SEEDER_TEMPLATE = (\n class_name: string, \n table_name: string\n): string => `\n'use strict';\n\nimport { QueryInterface } from 'sequelize';\n\nclass ${class_name}Seeder {\n\t/**\n\t * Seed method\n\t */\n\tpublic async up(queryInterface: QueryInterface): Promise<void> {\n const seed_data = this.getSeedData();\n\n\t\tif (!seed_data || seed_data.length === 0) {\n\t\t\tthrow new Error(\"❌ Seeder data for 'roles' is empty. Aborting bulk insert.\");\n\t\t}\n\n\t\tawait queryInterface.bulkInsert('${table_name.toLowerCase()}', seed_data);\n\t}\n\n\t/**\n\t * Undo seed method\n\t */\n\tpublic async down(queryInterface: QueryInterface): Promise<void> {\n const seed_data = this.getSeedData();\n\n\t\tif (!seed_data || seed_data.length === 0) {\n\t\t\tthrow new Error(\"❌ Seeder data for 'roles' is empty. Nothing to delete.\");\n\t\t}\n\n\t\tconst ids = seed_data.map(row => row.id);\n\n\t\tawait queryInterface.bulkDelete('${table_name.toLowerCase()}', { id: ids });\n\t}\n\n\t/**\n\t * Provide seed data array\n\t */\n\tprivate getSeedData(): Array<Record<string, any>> {\n\t\t// TODO: Replace this with real seed data\n\t\treturn [];\n\t}\n}\n\nexport default ${class_name}Seeder;\n`;\n\nexport {\n SEQUELIZE_SCHEMA_CODE_TEMPLATE,\n SEQUELIZE_SEEDER_TEMPLATE,\n SEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE,\n SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE\n}\n\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { \n SCHEMAS_DIR,\n MIGRATIONS_DIR,\n SCHEMA_SNAPSHOTS_DIR\n} from \"@/config/constants\";\n\nimport {\n\tSEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE,\n SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE\n} from \"@/code_templates/sequelize_code_template\"\n\nimport { \n\tLoggerUtil,\n\tInputValidatorUtil,\n InputTransformerUtil\n} from \"@/utils\";\n\nimport { \n SchemaDefinitionInterface, \n SchemaDiffInterface, \n SchemaSnapshotInterface\n} from \"@/types/schema_type\";\n\nimport {\n SchemaDiffUtil,\n SchemaNormalizerUtil\n} from \"@/database/\"\n\n\nclass MakeMigrationsScript {\n\tprivate name: string = \"make_migrations_script\";\n private readonly schemas_dir: string = SCHEMAS_DIR;\n\tprivate readonly migrations_dir: string = MIGRATIONS_DIR;\n private readonly snapshot_dir: string = SCHEMA_SNAPSHOTS_DIR;\n\tprivate readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n\tconstructor() {}\n\n private getSnapshotPath(model_name: string) {\n return path.join(this.snapshot_dir, `${InputTransformerUtil.toSnakeCase(model_name)}.schema_snapshot.json`);\n }\n\n // Method to handle generating migration file name\n private generateMigrationFilename (\n table_name: string, \n type: \"create\" | \"update\", \n migration_priority: number\n ): string {\n const timestamp = new Date().toISOString().replace(/[-:.TZ]/g, '').slice(0, 14);\n return `${migration_priority}_${timestamp}_${type}_table_${table_name}.ts`;\n };\n\n // Methos to write schema snapshot\n private writeSchemaSnapshot(\n model_name: string,\n normalized_schema: SchemaSnapshotInterface\n ): boolean {\n const snapshot_path = this.getSnapshotPath(model_name);\n\n try {\n // Ensure snapshot directory exists\n InputValidatorUtil.dirExists(this.snapshot_dir, true);\n\n fs.writeFileSync(\n snapshot_path,\n JSON.stringify(normalized_schema, null, 2),\n { encoding: \"utf-8\" }\n );\n\n this.logger.success(`📸 Schema snapshot saved: ${snapshot_path}`);\n return true;\n } catch (error: any) {\n this.logger.error(`❌ Failed to write schema snapshot: ${snapshot_path}`);\n this.logger.error(error?.message || error);\n return false;\n }\n }\n\n // Method to handle create update schema table migration file\n private createUpdateSchemaMigrationFile (\n file_path: string, \n schema_file_path: string, \n schema_content: SchemaDefinitionInterface, \n schema_diff: SchemaDiffInterface\n ): boolean {\n const { table_name, model_name } = schema_content;\n \n const schema_file_name = path.basename(schema_file_path);\n\n const template = SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE(\n table_name,\n model_name,\n schema_diff,\n schema_file_name\n );\n \n try {\n fs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n } catch (error) {\n this.logger.error(`❌ Failed to write create update schema migration file: ${file_path}`);\n return false\n }\n\n return true\n }\n\n // Method to handle create new schema table migration file\n private createNewSchemaMigrationFile (\n file_path: string, \n schema_file_path: string, \n schema_content: SchemaDefinitionInterface\n ): boolean {\n const { table_name, model_name } = schema_content;\n\n const schema_file_name = path.basename(schema_file_path);\n\n const template = SEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE(\n table_name, \n model_name,\n schema_file_name\n );\n \n try {\n fs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n } catch (error) {\n this.logger.error(`❌ Failed to write create new schema migration file: ${file_path}`);\n return false\n }\n\n return true\n }\n\n // Method to handle creating migration files for new and updated schemas\n private createMigrationForSchema(\n schema_file_path: string, \n schema_content: SchemaDefinitionInterface\n ) {\n this.logger.info(`💾 Ready to create migration for: ${schema_file_path}`);\n \n const { table_name, migration_priority, model_name, } = schema_content;\n\n if (!table_name) {\n this.logger.error(`❌ Schema has no table_name: ${schema_file_path}`);\n return;\n }\n\n const normalized_schema = SchemaNormalizerUtil.normalizeSchema(schema_content);\n const snapshot_path = this.getSnapshotPath(model_name);\n const operation = !fs.existsSync(snapshot_path) ? \"create\" : \"update\";\n const migration_file_name = this.generateMigrationFilename(table_name, operation, migration_priority);\n const migration_file_path = path.join(this.migrations_dir, migration_file_name);\n\n let migration_file_created: boolean = false\n\n if (!fs.existsSync(snapshot_path)) {\n this.logger.info(`Creating Migration File for New schema: ${model_name}Schema`);\n migration_file_created = this.createNewSchemaMigrationFile(migration_file_path, schema_file_path, schema_content);\n }\n else {\n // Existing migration → UPDATE\n this.logger.info(`🔄 Found existing migration snapshots: ${snapshot_path} → checking for updates...`);\n\n const previous_snapshot: SchemaSnapshotInterface = JSON.parse(fs.readFileSync(snapshot_path, \"utf-8\"));\n const diff: SchemaDiffInterface = SchemaDiffUtil.getSchemaDifference(previous_snapshot, normalized_schema);\n\n if (\n !diff.table_renamed &&\n !diff.columns.added.length &&\n !diff.columns.removed.length &&\n !Object.keys(diff.columns.modified).length &&\n !diff.indexes.added.length &&\n !diff.indexes.removed.length\n ) {\n this.logger.info(\"ℹ️ No schema changes detected\");\n return false;\n }\n\n migration_file_created = this.createUpdateSchemaMigrationFile(\n migration_file_path, \n schema_file_path, \n schema_content,\n diff\n );\n }\n\n if (migration_file_created) {\n this.logger.success(`✅ Migration file created: ${migration_file_name}`);\n\n // Update snapshot AFTER successful migration creation\n const snapshot_written = this.writeSchemaSnapshot(model_name, normalized_schema);\n\n if (!snapshot_written) {\n this.logger.error(`⚠️ Migration created but snapshot update failed for \"${model_name}\"`);\n }\n } else {\n this.logger.info(`ℹ️ No migration created for table \"${table_name}\".`);\n }\n return migration_file_created;\n \n }\n\n // Main Method\n\tpublic run(): void {\n this.logger.info(`🔍 Scanning schemas in directory: ${this.schemas_dir}`);\n\n // Ensure directory exists\n InputValidatorUtil.dirExists(this.schemas_dir, true);\n InputValidatorUtil.dirExists(this.migrations_dir, true);\n\n // Fetch all TypeScript schema files\n const schema_files = fs.readdirSync(this.schemas_dir).filter(file => file.endsWith(\".ts\"));\n\n if (!schema_files.length) {\n this.logger.info(\"⚠️ No schema files found.\");\n return;\n }\n\n this.logger.info(`✅ Found ${schema_files.length} schema file(s).`);\n\n let created_count = 0;\n let failed_count = 0;\n\n for (const file of schema_files) {\n const file_path = path.join(this.schemas_dir, file);\n\n try {\n // Dynamically import the schema\n // Using require + resolve to get absolute path\n const schema_module = require(file_path);\n\n this.logger.info(`Processing schema file: ${file_path}`);\n \n // Log details if default export exists\n if (schema_module?.default) {\n const schema_content = schema_module.default;\n this.logger.info(`Schema Name: ${schema_content?.model_name || \"N/A\"}Schema`);\n this.logger.info(`Model Name: ${schema_content?.model_name || \"N/A\"}`);\n this.logger.info(`Table Name: ${schema_content?.table_name || \"N/A\"}`);\n\n // Pass to migration creation logic\n const created = this.createMigrationForSchema(file_path, schema_content);\n\n if (created) { created_count++; }\n } else {\n this.logger.error(`⚠️ Schema file has no default export: ${file_path}`);\n failed_count++;\n }\n } \n catch (error: any) {\n this.logger.error(`❌ Failed to load schema file: ${file_path}`);\n this.logger.error(`Error: ${error?.message || error}`);\n failed_count++;\n }\n }\n\n this.logger.success(`🏁 Migration generation summary:`);\n this.logger.success(`Successfully processed: ${created_count}`);\n this.logger.success(`Failed: ${failed_count}`);\n }\n\n}\n\nexport default MakeMigrationsScript\n\n// CLI entry point\ntry {\n\tnew MakeMigrationsScript().run();\n} \ncatch (error: any) {\n\tconsole.error(error?.message || \"\");\n\tprocess.exit(1);\n}\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { Sequelize, QueryInterface, DataTypes } from \"sequelize\";\n\nimport { SequelizeConnector } from \"@/database\";\nimport { MIGRATIONS_DIR, SEQUELIZE_META_TABLE_NAME } from \"@/config/constants\";\nimport { LoggerUtil, InputValidatorUtil, } from \"@/utils\";\nimport { MigrationOperationTypes } from \"@/types/migration_type\";\n\nclass MigrationRunnerScript {\n private module_name = \"migration_runner_script\";\n private readonly migrations_dir: string = MIGRATIONS_DIR;\n private readonly db_connection: SequelizeConnector = SequelizeConnector?.getInstance?.();\n private readonly logger: LoggerUtil = new LoggerUtil(this.module_name);\n private readonly sequelize_instance: Sequelize;\n\n constructor() {\n InputValidatorUtil.dirExists(this.migrations_dir, true);\n\n this.sequelize_instance = this.db_connection.connect();\n }\n\n // Fetch all migration files\n private getMigrationFiles(schema_name?: string): string[] {\n const files = fs.readdirSync(this.migrations_dir).filter(f => f.endsWith(\".ts\"));\n\n if (schema_name) {\n return files.filter(f => f.toLowerCase().includes(schema_name.toLowerCase()));\n }\n return files;\n }\n\n // Ensure SequelizeMeta table exists\n private async ensureMetaTable() {\n const queryInterface = this.sequelize_instance.getQueryInterface();\n const table_names = await queryInterface.showAllTables();\n\n if (!table_names.includes(SEQUELIZE_META_TABLE_NAME)) {\n this.logger.info(\"⏳ Creating SequelizeMeta table...\");\n\n await queryInterface.createTable(\n SEQUELIZE_META_TABLE_NAME, \n {\n name: { \n type: DataTypes.STRING, \n allowNull: false, \n primaryKey: true \n }\n }\n );\n\n this.logger.success(\"✅ SequelizeMeta table created.\");\n }\n }\n\n // Fetch already applied migrations\n private async getAppliedMigrations(): Promise<string[]> {\n const [results] = await this.sequelize_instance.query(`SELECT name FROM \\\"${SEQUELIZE_META_TABLE_NAME}\\\";`);\n return Array.isArray(results) ? results.map((r: any) => r.name) : [];\n }\n\n // Apply a single migration\n private async applyMigration(file_path: string, operation: MigrationOperationTypes ) {\n const MigrationClass = require(file_path)?.default;\n\n if (!MigrationClass) { \n const log_msg = `Migration file has no default export: ${file_path}`\n this.logger.error(log_msg);\n throw new Error(log_msg); \n }\n\n const migration_instance = new MigrationClass();\n\n const queryInterface: QueryInterface = this.sequelize_instance.getQueryInterface();\n\n if (operation === \"up\") {\n await migration_instance.up.bind(migration_instance)(queryInterface, this.sequelize_instance);\n await this.sequelize_instance.getQueryInterface().bulkInsert(SEQUELIZE_META_TABLE_NAME, [{ name: path.basename(file_path) }]);\n } else {\n await migration_instance.down.bind(migration_instance)(queryInterface, this.sequelize_instance);\n await this.sequelize_instance.getQueryInterface().bulkDelete(SEQUELIZE_META_TABLE_NAME, { name: path.basename(file_path) });\n }\n }\n\n // Main runner\n public async run(\n operation: MigrationOperationTypes,\n schema_name?: string,\n migration_file?: string,\n ) {\n this.logger.info(`🏃‍♂️ Starting Migration process Operation: ${operation.toUpperCase()}, Schema: ${schema_name}, File: ${migration_file || \"all\"}`);\n\n await this.sequelize_instance?.authenticate();\n\n this.logger.success(\"✅ Database connected.\");\n\n await this.ensureMetaTable();\n\n let files: string[] = [];\n\n if (migration_file) {\n const full_path = path.join(this.migrations_dir, migration_file);\n\n if (!fs.existsSync(full_path)){\n const log_msg = `Migration file not found: ${full_path}`;\n this.logger.error(log_msg);\n throw new Error(log_msg);\n } \n\n files = [full_path];\n } else {\n files = this.getMigrationFiles(schema_name).map(f => path.join(this.migrations_dir, f));\n }\n\n // Sort ascending for UP, descending for DOWN\n files.sort((a, b) => {\n const getPriority = (file_path: string) => {\n const file_name = file_path.split(\"/\").pop() || \"\";\n const match = file_name.match(/^(\\d+)_/);\n return match ? Number(match[1]) : Number.MAX_SAFE_INTEGER;\n };\n\n const a_priority = getPriority(a);\n const b_priority = getPriority(b);\n\n return operation === \"up\"\n ? a_priority - b_priority\n : b_priority - a_priority;\n });\n\n const applied_migrations = await this.getAppliedMigrations();\n\n for (const file of files) {\n const file_name = path.basename(file);\n\n if (operation === \"up\" && applied_migrations.includes(file_name)) {\n this.logger.info(`⏭️ Skipping already applied migration: ${file_name}`);\n continue;\n }\n if (operation === \"down\" && !applied_migrations.includes(file_name)) {\n this.logger.info(`⏭️ Skipping not-applied migration: ${file_name}`);\n continue;\n }\n\n this.logger.info(`${operation === \"up\" ? \"Applying\" : \"Reverting\"} migration: ${file_name}`);\n await this.applyMigration(file, operation);\n this.logger.success(`${operation === \"up\" ? \"Applied\" : \"Reverted\"} migration: ${file_name}`);\n }\n\n this.logger.success(`🏁 Migration process completed.`);\n }\n\n}\n\nexport default MigrationRunnerScript;\n\n// -----------------------\n// CLI ENTRY POINT\n// -----------------------\n(async () => {\n try {\n const args = process.argv.slice(2);\n\n // Parse CLI args\n const operation_arg = args.find(arg => arg.startsWith(\"--operation=\")) || \"--operation=up\";\n const schema_arg = args.find(arg => arg.startsWith(\"--schema_name=\"));\n const file_arg = args.find(arg => arg.startsWith(\"--file_name=\"));\n\n const operation = operation_arg.split(\"=\")[1] as MigrationOperationTypes;\n const schema_name = schema_arg ? schema_arg.split(\"=\")[1] : undefined;\n const migration_file = file_arg ? file_arg.split(\"=\")[1] : undefined;\n\n if (![\"up\", \"down\"].includes(operation)) {\n throw new Error(`Invalid operation: ${operation}. Must be \"up\" or \"down\".`);\n }\n\n await new MigrationRunnerScript().run(operation, schema_name, migration_file);\n process.exit(0);\n } catch (error: any) {\n console.error(\"❌\", error?.message || error);\n process.exit(1);\n }\n})();\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { SCHEMAS_DIR, SEEDERS_DIR } from \"@/config/constants\";\nimport { SEQUELIZE_SEEDER_TEMPLATE } from \"@/code_templates/sequelize_code_template\";\n\nimport { \n\tLoggerUtil,\n\tInputTransformerUtil,\n\tInputValidatorUtil,\n} from \"@/utils\";\n\nclass CreateSeederScript {\n\tprivate module_name: string = \"create_seeder_script\";\n\tprivate readonly schema_input: string;\n\tprivate readonly seeder_file_input: string;\n\tprivate readonly seeders_dir: string = SEEDERS_DIR;\n\tprivate readonly schemas_dir: string = SCHEMAS_DIR;\n\tprivate readonly logger: LoggerUtil = new LoggerUtil(this.module_name);\n\n constructor(schema_input?: string, seeder_file_input?: string) {\n\t\tif (!schema_input || !seeder_file_input) {\n\t\t\tconst log_msg = \"❌ Please provide a schema name and seeder file name.\";\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\tthis.schema_input = schema_input;\n\t\tthis.seeder_file_input = seeder_file_input;\n\t}\n\n // Method to ensure seeder file does not exists\n private ensureSeederDoesNotExist(file_path: string): void {\n\t\tif (fs.existsSync(file_path)) {\n\t\t\tconst log_msg = `❌ Seeder already exists: ${file_path}`;\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\t}\n\n // method to generate seeder file name\n private generateSeederFileName (\n migration_priority: number\n ): string {\n const timestamp \t\t\t\t\t= Date.now();\n const formatted_migration_priority = this.formatPriority(migration_priority)\n const seedeer_name = InputTransformerUtil.toSnakeCase(this.seeder_file_input);\n\n return `${formatted_migration_priority}_${seedeer_name}_${timestamp}.ts`\n }\n\n // Method to format migration priority number for file name\n\tprivate formatPriority(priority: number): string {\n\t\treturn priority.toString().padStart(3, \"0\");\n\t}\n\n // Method to create seeder file with content\n\tprivate createSeederFile(\n file_path: string, \n sedder_file_class_name: string, \n table_name: string\n ): void {\n\t\tconst template = SEQUELIZE_SEEDER_TEMPLATE(sedder_file_class_name, table_name);\n\n\t\ttry {\n\t\t\tfs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`❌ Failed to write seeder file: ${file_path}`);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n // Method to run create seeder file script\n public run(): void {\n\t\t// Transform input to schema file name (snake_case)\n\t\tconst file_base_name \t\t= InputTransformerUtil.toSchemaFileName(this.schema_input);\n\t\tconst schema_file_path \t\t= path.join(this.schemas_dir, `${file_base_name}.ts`);\n\n\t\t// Check if schema exists\n\t\tif (!fs.existsSync(schema_file_path)) {\n\t\t\tconst log_msg = `❌ Schema file not found: ${schema_file_path}`;\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\t// Require schema file to extract model/table info\n\t\tconst schema_module = require(schema_file_path).default;\n\n\t\tif (!schema_module) {\n\t\t\tconst log_msg = `❌ Failed to load schema file: ${schema_file_path}`;\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\t// Generate unique seeder file name with optional custom name or timestamp\n const { model_name, table_name, migration_priority } = schema_module;\n\n\t\tconst seeder_file_name \t\t\t\t= this.generateSeederFileName(migration_priority)\n\t\tconst file_path: string \t\t\t= path.join(this.seeders_dir, seeder_file_name);\n const seedeer_file_class_name = InputTransformerUtil.toPascalCase(this.seeder_file_input);\n\n\t\t// Ensure seeders directory exists\n\t\tInputValidatorUtil.dirExists(this.seeders_dir, true);\n\n\t\tthis.ensureSeederDoesNotExist(file_path);\n\t\tthis.createSeederFile( file_path, seedeer_file_class_name, table_name);\n\n\t\tthis.logger.success(`✅ Seeder created successfully: ${seeder_file_name}`);\n\t\tthis.logger.info(`📄 File Path: ${file_path}`);\n\t\tthis.logger.info(`🧩 Model Name: ${model_name}`);\n\t\tthis.logger.info(`🗄️ Table Name: ${table_name}`);\n\t\tthis.logger.info(`🔢 Migration Priority: ${migration_priority}`);\n\t}\n\n}\n\nexport default CreateSeederScript\n\n","import fs from \"fs\";\nimport path from \"path\";\nimport { Sequelize, QueryInterface, DataTypes } from \"sequelize\";\n\nimport { SequelizeConnector } from \"@/database\";\nimport { SEEDERS_DIR, SEQUELIZE_SEEDER_META_TABLE_NAME } from \"@/config/constants\";\nimport { LoggerUtil, InputValidatorUtil } from \"@/utils\";\nimport { SeederOperationTypes } from \"@/types/migration_type\";\n\nclass SeederRunnerScript {\n private module_name = \"seeder_runner_script\";\n private readonly seeders_dir: string = SEEDERS_DIR;\n private readonly db_connection: SequelizeConnector = SequelizeConnector?.getInstance?.();\n private readonly logger: LoggerUtil = new LoggerUtil(this.module_name);\n private readonly sequelize_instance: Sequelize;\n\n constructor() {\n InputValidatorUtil.dirExists(this.seeders_dir, true);\n\n this.sequelize_instance = this.db_connection.connect();\n }\n\n // Get all seeder files\n private getSeederFiles(seeder_name?: string): string[] {\n let files = fs.readdirSync(this.seeders_dir).filter(f => f.endsWith(\".ts\"));\n if (seeder_name) {\n files = files.filter(f => f.toLowerCase().includes(seeder_name.toLowerCase()));\n }\n return files;\n }\n\n // Ensure SequelizeSeederMeta table exists\n private async ensureMetaTable() {\n const queryInterface = this.sequelize_instance.getQueryInterface();\n const tables = await queryInterface.showAllTables();\n\n if (!tables.includes(SEQUELIZE_SEEDER_META_TABLE_NAME)) {\n this.logger.info(\"⏳ Creating Sequelize seeder meta table table...\");\n await queryInterface.createTable(SEQUELIZE_SEEDER_META_TABLE_NAME, {\n name: { type: DataTypes.STRING, allowNull: false, primaryKey: true },\n });\n this.logger.success(\"✅ SequelizeSeederMeta table created.\");\n }\n }\n\n // Get already applied seeders\n private async getAppliedSeeders(): Promise<string[]> {\n const [results] = await this.sequelize_instance.query(`SELECT name FROM \"${SEQUELIZE_SEEDER_META_TABLE_NAME}\";`);\n return Array.isArray(results) ? results.map((r: any) => r.name) : [];\n }\n\n // Apply a single seeder\n private async applySeeder(\n file_path: string, \n operation: SeederOperationTypes\n ) {\n const SeederClass = require(file_path)?.default;\n\n if (!SeederClass) {\n throw new Error(`Seeder file has no default export: ${file_path}`);\n }\n\n const seeder_instance = new SeederClass();\n const queryInterface: QueryInterface = this.sequelize_instance.getQueryInterface();\n\n if (operation === \"up\") {\n await seeder_instance.up(queryInterface, this.sequelize_instance);\n await queryInterface.bulkInsert(SEQUELIZE_SEEDER_META_TABLE_NAME, [{ name: path.basename(file_path) }]);\n } else {\n await seeder_instance.down(queryInterface, this.sequelize_instance);\n await queryInterface.bulkDelete(SEQUELIZE_SEEDER_META_TABLE_NAME, { name: path.basename(file_path) });\n }\n }\n\n // Main runner\n public async run(\n operation: SeederOperationTypes,\n seeder_name?: string,\n seeder_file?: string\n ) {\n try {\n this.logger.info(`🏃‍♂️ Starting seeder process Operation: ${operation.toUpperCase()}, Seeder: ${seeder_name || \"all\"}, File: ${seeder_file || \"none\"}`);\n \n await this.sequelize_instance?.authenticate();\n\n this.logger.success(\"✅ Database connected.\");\n\n await this.ensureMetaTable();\n\n let files: string[] = [];\n\n if (seeder_file) {\n const full_path = path.join(this.seeders_dir, seeder_file);\n\n if (!fs.existsSync(full_path)) { \n this.logger.error(`Seeder file not found: ${full_path}`)\n throw new Error(`Seeder file not found: ${full_path}`);\n }\n\n files = [full_path];\n } else {\n files = this.getSeederFiles(seeder_name).map(f => path.join(this.seeders_dir, f));\n }\n\n // Sort by filename: ascending for UP, descending for DOWN\n files.sort((a, b) => (operation === \"up\" ? a.localeCompare(b) : b.localeCompare(a)));\n\n const applied_seeders = await this.getAppliedSeeders();\n\n for (const file of files) {\n const file_name = path.basename(file);\n\n if (operation === \"up\" && applied_seeders.includes(file_name)) {\n this.logger.info(`⏭️ Skipping already applied seeder: ${file_name}`);\n continue;\n }\n\n if (operation === \"down\" && !applied_seeders.includes(file_name)) {\n this.logger.info(`⏭️ Skipping not-applied seeder: ${file_name}`);\n continue;\n }\n\n this.logger.info(`${operation === \"up\" ? \"Applying\" : \"Reverting\"} seeder: ${file_name}`);\n await this.applySeeder(file, operation);\n this.logger.success(`${operation === \"up\" ? \"Applied\" : \"Reverted\"} seeder: ${file_name}`);\n }\n\n this.logger.success(\"🏁 Seeder process completed.\");\n }\n catch (error: any) {\n this.logger.error(`❌ ${error?.message}`, { error })\n process.exit(1);\n }\n }\n\n}\n\nexport default SeederRunnerScript;\n\n// -----------------------\n// CLI ENTRY POINT\n// -----------------------\n(async () => {\n try {\n const args = process.argv.slice(2);\n\n const operation_arg = args.find(arg => arg.startsWith(\"--operation=\")) || \"--operation=up\";\n const seeder_arg = args.find(arg => arg.startsWith(\"--seeder=\"));\n const file_arg = args.find(arg => arg.startsWith(\"--file_name=\"));\n\n const operation = operation_arg.split(\"=\")[1] as SeederOperationTypes;\n const seeder_name = seeder_arg ? seeder_arg.split(\"=\")[1] : undefined;\n const seeder_file = file_arg ? file_arg.split(\"=\")[1] : undefined;\n\n if (![\"up\", \"down\"].includes(operation)) {\n throw new Error(`Invalid operation: ${operation}. Must be \"up\" or \"down\".`);\n }\n\n await new SeederRunnerScript().run(operation, seeder_name, seeder_file);\n process.exit(0);\n } \n catch (error: any) {\n console.error(`❌ ${error?.message}`, { error })\n process.exit(1);\n }\n})();\n\n","\nimport { LoggerUtil, EnvManagerUtil } from \"@/utils\";\n\n/**\n * Base connector abstraction for all DB / external service connectors\n */\nabstract class BaseConnector<TConnection> {\n public readonly env_manager = EnvManagerUtil.getInstance();\n public readonly logger: LoggerUtil;\n\n protected constructor(\n protected readonly connector_name: string\n ) {\n this.logger = new LoggerUtil(connector_name);\n }\n\n // Connect and return the underlying connection instance\n public abstract connect(): TConnection;\n}\n\nexport default BaseConnector;\n","\nimport { Sequelize, Dialect } from \"sequelize\";\nimport { LoggerUtil, EnvManagerUtil, SqlFormatterUtil } from \"@/utils\";\n\nimport BaseConnector from \"./base_connector\";\n\nclass SequelizeConnector extends BaseConnector<Sequelize> {\n private static instance: SequelizeConnector;\n private readonly name: string = \"sequelize_connector\";\n private static sequelize_db_instance: Sequelize | null = null;\n\n private constructor() {\n super(\"sequelize_connector\");\n }\n\n public static getInstance(): SequelizeConnector {\n if (!SequelizeConnector.instance) {\n SequelizeConnector.instance = new SequelizeConnector();\n }\n return SequelizeConnector.instance;\n }\n\n // Method to format sql query log\n private formatSQLQueryLog = (sql: string, timing?: number): void => {\n try {\n const formatted = SqlFormatterUtil.format(sql);\n\n if (typeof timing === \"number\") {\n this.logger.info(`[SQL ${timing}ms] ${formatted}`);\n } else {\n this.logger.info(`[SQL] ${formatted}`);\n }\n } catch (error: any) {\n // Never let logging crash Sequelize\n this.logger.error(\"Failed to log SQL query\", {error});\n }\n };\n\n // Method to connect to db\n public connect (): Sequelize {\n if(!SequelizeConnector.sequelize_db_instance) {\n const dialect = this.env_manager.getEnvVar<Dialect>(\"DB_DIALECT\", \"postgres\");\n const logging_enabled = this.env_manager.getEnvVar<boolean>(\"DB_LOGGING\", false);\n const logging = logging_enabled ? this.formatSQLQueryLog : false;\n\n SequelizeConnector.sequelize_db_instance = new Sequelize({\n database: this.env_manager.getEnvVar<string>(\"DB_NAME\")!,\n username: this.env_manager.getEnvVar<string>(\"DB_USER\")!,\n password: this.env_manager.getEnvVar<string>(\"DB_PASSWORD\"),\n host: this.env_manager.getEnvVar<string>(\"DB_HOST\")!,\n port: this.env_manager.getEnvVar<number>(\"DB_PORT\", 5432),\n dialect,\n logging,\n benchmark: logging_enabled\n });\n\n this.logger.success(\"✅ Sequelize connected\");\n\n }\n\n return SequelizeConnector.sequelize_db_instance;\n }\n\n}\n\nexport default SequelizeConnector"],"mappings":"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","names":["fs","path","path","fs","fs","path","fs","path","fs","path","fs","path","fs","path","DataTypes","fs","DataTypes","path","Sequelize","Sequelize"]}
1
+ {"version":3,"sources":["../../src/database/schema/schema_diff_util.ts","../../src/database/schema/schema_normalizer_util.ts","../../src/database/scripts/create_schema_script.ts","../../src/code_templates/sequelize_code_template.ts","../../src/database/scripts/make_migrations_script.ts","../../src/database/scripts/migration_runner_script.ts","../../src/database/scripts/create_seeder_script.ts","../../src/database/scripts/seeder_runner_script.ts","../../src/database/connectors/base_connector.ts","../../src/database/connectors/sequelize_connector.ts"],"sourcesContent":["import { \n SchemaDiffInterface, \n SchemaSnapshotInterface,\n IndexFieldOptionsInterface,\n SchemaColumnInterface\n} from \"@/types/schema_type\";\n\n\n\nclass SchemaDiffUtil {\n\n private static indexKey(i: IndexFieldOptionsInterface): string {\n return JSON.stringify({\n fields: i.fields,\n unique: i.unique,\n using: i.using,\n operator: i.operator,\n });\n }\n\n public static getSchemaDifference(\n prev: SchemaSnapshotInterface, \n curr: SchemaSnapshotInterface\n ): SchemaDiffInterface {\n\n const diff: SchemaDiffInterface = {\n columns: { added: [], removed: {}, modified: {} },\n indexes: { added: [], removed: [], modified: {} },\n };\n\n // Table rename\n if (prev.table_name !== curr.table_name) {\n diff.table_renamed = {\n from: prev.table_name,\n to: curr.table_name,\n };\n }\n\n // Columns\n for (const [col_name, col_def] of Object.entries(curr.columns)) {\n const prev_col: SchemaColumnInterface = prev.columns[col_name];\n\n if(!prev_col) {\n diff.columns.added.push(col_name);\n }\n else if (JSON.stringify(prev_col) !== JSON.stringify(col_def)) {\n diff.columns.modified[col_name] = { \n before: prev_col, \n after: col_def \n };\n }\n }\n\n for (const [prev_col_name, prev_col_def] of Object.entries(prev.columns)) {\n if (!curr.columns[prev_col_name]) {\n diff.columns.removed[prev_col_name] = prev_col_def;\n }\n }\n\n // Indexes\n const prev_indexes = prev?.indexes || [];\n const curr_indexes = curr?.indexes || [];\n const prev_map = new Map(prev_indexes.map(i => [SchemaDiffUtil.indexKey(i), i]));\n const curr_map = new Map(curr_indexes.map(i => [SchemaDiffUtil.indexKey(i), i]));\n\n for (const [key, idx] of curr_map) {\n if (!prev_map.has(key)) {\n diff.indexes.added.push(idx);\n }\n }\n\n for (const [key, idx] of prev_map) {\n if (!curr_map.has(key)) {\n diff.indexes.removed.push(idx);\n }\n }\n\n // Modified indexes (same fields, different options)\n for (const curr_idx of curr_indexes) {\n const prev_idx = prev_indexes.find(\n p => JSON.stringify([...p.fields].sort()) === JSON.stringify([...curr_idx.fields].sort())\n );\n\n if (prev_idx && JSON.stringify(prev_idx) !== JSON.stringify(curr_idx)) {\n diff.indexes.modified[curr_idx?.name] = { \n before: prev_idx, \n after: curr_idx \n };\n }\n }\n\n return diff;\n }\n}\n\nexport default SchemaDiffUtil;\n","import { \n SchemaDefinitionInterface, \n SchemaSnapshotInterface \n} from \"@/types/schema_type\";\n\n\nclass SchemaNormalizerUtil {\n static normalizeColumn(column: any) {\n return {\n type: column.type?.key ?? column.type?.toString(),\n allow_null: column.allowNull ?? true,\n primary_key: !!column.primaryKey,\n auto_increment: !!column.autoIncrement,\n unique: !!column.unique,\n default_value: column.defaultValue ?? null,\n references: column.references ?? null,\n on_update: column.onUpdate ?? null,\n on_delete: column.onDelete ?? null,\n };\n }\n\n static normalizeIndex(index: any) {\n return {\n name: index.name ?? null,\n fields: [...index.fields].sort(),\n unique: !!index.unique,\n using: index.using ?? null,\n operator: index.operator ?? null,\n };\n }\n\n static normalizeSchema(\n schema: SchemaDefinitionInterface\n ): SchemaSnapshotInterface {\n return {\n database_name: schema.database_name,\n table_name: schema.table_name,\n model_name: schema.model_name,\n migration_priority: schema.migration_priority,\n timestamps: schema.timestamps,\n\n columns: Object.fromEntries(\n Object.entries(schema.columns).map(([key, col]) => [\n key,\n this.normalizeColumn(col),\n ])\n ),\n\n indexes: (schema.indexes ?? []).map(this.normalizeIndex),\n };\n }\n}\n\nexport default SchemaNormalizerUtil\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { SCHEMAS_DIR } from \"@/config/constants\";\nimport { SEQUELIZE_SCHEMA_CODE_TEMPLATE } from \"@/code_templates/sequelize_code_template\"\n\nimport { \n\tLoggerUtil,\n\tInputTransformerUtil,\n\tInputValidatorUtil,\n} from \"@/utils\";\n\nclass CreateSchemaScript {\n\tprivate name: string = \"create_schema_script\"\n\tprivate readonly raw_input: string;\n\tprivate readonly schemas_dir: string;\n\tprivate readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n constructor(raw_input?: string) {\n\t\tif (!raw_input) {\n\t\t\tconst log_msg = \"❌ Please provide a schema name.\"\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\tthis.raw_input \t\t= raw_input;\n\t\tthis.schemas_dir \t= SCHEMAS_DIR;\n\t}\n\n // Method to ensure schema does not exist\n\tprivate ensureSchemaDoesNotExist(file_path: string): void {\n\t\tif (fs.existsSync(file_path)) {\n\t\t\tconst log_msg = `❌ Schema already exists. File: ${file_path}`\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\t}\n\n\t// Determine next migration priority from existing schemas\n private getNextMigrationPriority(): number {\n if (!fs.existsSync(this.schemas_dir)) {\n return 1;\n }\n\n const files = fs.readdirSync(this.schemas_dir);\n\n return files.length + 1;\n }\n\n // Pad migration priority (e.g. 1 -> 001)\n private formatPriority(priority: number): string {\n return priority.toString().padStart(3, \"0\");\n }\n\n\t// Method to create schema file with boilerplate data\n\tprivate createSchemaFile(\n file_path: string, \n schema_name: string, \n model_name: string, \n table_name: string, \n migration_priority: number\n ): void {\n \tconst template = SEQUELIZE_SCHEMA_CODE_TEMPLATE(schema_name, table_name, model_name, migration_priority);\n\n\t\ttry {\n\t\t\tfs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`❌ Failed to write schema file: ${file_path}`);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n // Main Method to run\n\tpublic run(): void {\n\t\tconst file_base_name \t\t= InputTransformerUtil.toSchemaFileName(this.raw_input);\n const base_pascal \t\t\t= InputTransformerUtil.toPascalCase(file_base_name);\n const schema_name \t= base_pascal.toLowerCase().endsWith(\"schema\") ? base_pascal : `${base_pascal}Schema`;\n const model_name \t\t\t= base_pascal.toLowerCase().endsWith(\"schema\") ? base_pascal.replace(/Schema$/i, \"\") : base_pascal;\n const table_name \t\t\t= InputTransformerUtil.pluralizeSnakeCase(InputTransformerUtil.toSnakeCase(model_name));\n const migration_priority \t= this.getNextMigrationPriority();\n const file_name \t\t\t= `${file_base_name}.ts`;\n const file_path \t\t\t= path.join(this.schemas_dir, file_name);\n\n\t\t// Ensure schemas directory exists (create if missing)\n\t\tInputValidatorUtil.dirExists(this.schemas_dir, true);\n\n\t\tthis.ensureSchemaDoesNotExist(file_path);\n\t\tthis.createSchemaFile(file_path, schema_name, model_name, table_name, migration_priority);\n;\n\t\tthis.logger.success(\"✅ Schema created successfully Created database/schemas/${file_base_name}.ts\");\n this.logger.info(`📄 File Path: ${file_path}`);\n this.logger.info(`🧩 Schema Name: ${schema_name}`);\n this.logger.info(`📦 Model Name: ${model_name}`);\n this.logger.info(`🗄️ Table Name: ${table_name}`);\n\t}\n}\n\nexport default CreateSchemaScript;\n\n// CLI entry point\ntry {\n\tnew CreateSchemaScript(process.argv[2]).run();\n\tprocess.exit(0);\n} \ncatch (error: any) {\n\tconsole.error(error?.message || \"\");\n\tprocess.exit(1);\n}","import { \n IndexFieldOptionsInterface,\n SchemaColumnInterface, \n SchemaDiffInterface \n} from \"@/types/schema_type\";\n\nconst SEQUELIZE_SCHEMA_CODE_TEMPLATE = (\n schema_name: string, \n table_name: string, \n model_name: string, \n migration_priority: number\n): string => \n{\n return `\nimport { DataTypes } from \"sequelize\";\nimport { SchemaDefinitionInterface } from \"fiberx-backend-toolkit/types/schema_type\";\n\nconst ${schema_name}: SchemaDefinitionInterface = {\n database_name: \"public\",\n migration_priority: ${migration_priority},\n\n table_name: \"${table_name}\",\n model_name: \"${model_name}\",\n timestamps:true,\n\n columns: {\n id: {\n type: DataTypes.BIGINT,\n primaryKey: true,\n autoIncrement: true,\n allowNull: false,\n },\n\n created_at: {\n type: DataTypes.DATE,\n defaultValue: DataTypes.NOW,\n },\n\n updated_at: {\n type: DataTypes.DATE,\n allowNull: true,\n defaultValue: null,\n },\n },\n\n indexes: [\n { fields: [\"\"], name: \"\" },\n ],\n};\n\nexport default ${schema_name};\n`\n}\n\nconst SEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE = ( \n schema_table_name: string, \n schema_model_name: string,\n schema_file_name: string \n): string => `\nimport { QueryInterface, DataTypes, Sequelize } from \"sequelize\";\nimport { LoggerUtil } from \"fiberx-backend-toolkit//utils\";\nimport { SchemaDefinitionInterface } from \"fiberx-backend-toolkit/types/schema_type\";\nimport ${schema_model_name}Schema from \"@/database/schemas/${schema_file_name.replace(\".ts\", \"\")}\";\n\nclass Create${schema_model_name}TableMigration {\n private name: string = \"create_table_${schema_table_name}_migration_file\";\n private schema: SchemaDefinitionInterface = ${schema_model_name}Schema;\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n constructor() {}\n\n // Migration UP\n public async up(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, columns = {}, indexes = [] } = this.schema;\n\n await queryInterface.createTable(table_name, columns);\n\n for (const index_field_obj of indexes) {\n\n const { fields, name, index_options } = index_field_obj;\n const index_name = \\`idx_\\${table_name}_\\${fields.join(\"_\")}\\`\n \n await queryInterface.addIndex(\n table_name, \n fields, \n { name: index_name, ...index_options }\n );\n }\n\n this.logger.success(\\`✅ Table \"\\${table_name}\" for schema \"\\${model_name}Schema\" created with \"\\${this.index_attributes.length}\" indexed Fields.\\`);\n } \n catch (error: any) {\n this.logger.error(\\`🚫 Migration failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Migration failed: \"\\${error.message}\"\\`);\n }\n }\n\n // Migration DOWN\n public async down(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, database_name, model_name } = this.schema;\n await queryInterface.dropTable(table_name, {});\n this.logger.success(\\`🗑️ Table \"\\${table_name}\" dropped successfully.\\`);\n } catch (error: any) {\n this.logger.error(\\`🚫 Migration rollback failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Migration rollback failed: \"\\${error.message}\"\\`);\n }\n }\n}\n\nexport default Create${schema_model_name}TableMigration;\n`;\n\nconst SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE = (\n schema_table_name: string,\n schema_model_name: string,\n diff: SchemaDiffInterface,\n schema_file_name: string\n): string => `\nimport { QueryInterface, DataTypes, Sequelize } from \"sequelize\";\nimport { LoggerUtil } from \"fiberx-backend-toolkit//utils\";\nimport { SchemaDefinitionInterface } from \"fiberx-backend-toolkit/types/schema_type\";\nimport ${schema_model_name}Schema from \"@/database/schemas/${schema_file_name.replace(\".ts\", \"\")}\";\n\nclass Update${schema_model_name}TableMigration {\n private name: string = \"update_table_${schema_table_name}_migration_file\";\n private schema: SchemaDefinitionInterface = ${schema_model_name}Schema;\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n constructor() {}\n\n public async up(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, model_name, columns = {}, indexes = [] } = this.schema;\n\n ${diff.table_renamed ? `\n await queryInterface.renameTable(\n \"${diff.table_renamed.from}\",\n \"${diff.table_renamed.to}\"\n );` \n : \n \"\"\n }\n\n // Add columns\n ${diff.columns.added.map((column_name: string) => `\n await queryInterface.addColumn(\n table_name,\n \"${column_name}\",\n columns[\"${column_name}\"]\n );\n `).join(\"\")}\n\n // Modify columns\n ${Object.entries(diff.columns.modified).map(([col_name, col_modified]) => `\n await queryInterface.changeColumn(\n table_name, \n \"${col_name}\", \n ${JSON.stringify(col_modified?.after)}\n );\n `\n ).join(\"\")}\n\n // Remove columns\n ${Object.entries(diff.columns.modified).map(([col_name, col_Def]) => `\n await queryInterface.removeColumn(\n table_name, \n \"${col_name}\"\n );\n `\n ).join(\"\")}\n\n\n // Add indexes\n ${diff.indexes.added.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx.fields)}, \n ${JSON.stringify(idx)}\n );\n `\n ).join(\"\")}\n\n // Modify indexes (remove + add)\n ${Object.entries(diff.indexes.modified).map(([idx_name, idx_modified]) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx_modified.before.name)}\n );\n\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx_modified.after.fields)}, \n ${JSON.stringify(idx_modified.after)}\n );\n `\n ).join(\"\")}\n\n // Remove indexes\n ${diff.indexes.removed.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx.name)}\n );\n `\n ).join(\"\")}\n\n\n this.logger.success(\\`✅ Table \"\\${table_name}\" for schema \"\\${model_name}Schema\" updated successfully.\\`);\n } \n catch (error: any) {\n this.logger.error(\\`🚫 Update migration failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Update migration failed: \"\\${error.message}\"\\`);\n }\n }\n\n public async down(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, model_name, columns = {} } = this.schema;\n\n // Revert Added indexes\n ${diff.indexes.added.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx.name)}\n );`\n ).join(\"\")}\n\n // Revert Modified Indexes\n ${Object.entries(diff.indexes.modified).map(([idx_name, idx_modified]) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx_modified.after.name)}\n );\n\n\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx_modified.before.fields)}, \n ${JSON.stringify(idx_modified.before)}\n );`\n ).join(\"\")}\n\n // Revert removed indexes\n ${diff.indexes.removed.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx.fields)}, \n ${JSON.stringify(idx)}\n );`\n ).join(\"\")}\n\n // Revert Modified columns\n ${Object.entries(diff.columns.modified).map(([col_name, col_modified]) => `\n await queryInterface.changeColumn(\n table_name, \n \"${col_name}\", \n ${JSON.stringify(col_modified.before)}\n );`\n ).join(\"\")}\n\n // Revert added columns\n ${diff.columns.added.map((column_name: string) => `\n await queryInterface.removeColumn(table_name, \"${column_name}\");\n `).join(\"\")}\n\n ${Object.entries(diff.columns.modified).map(([col_name, col_Def]) => `\n await queryInterface.addColumn(\n table_name, \n \"${col_name}\", \n ${JSON.stringify(col_Def)}\n );\n `).join(\"\")}\n\n ${diff.table_renamed ? `\n await queryInterface.renameTable(\n \"${diff.table_renamed.to}\",\n \"${diff.table_renamed.from}\"\n );` : \"\"\n }\n\n this.logger.success(\\`🗑️ Rollback of table \"\\${table_name}\" completed successfully.\\`);\n } \n catch (error: any) {\n this.logger.error(\\`🚫 Rollback migration failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Rollback migration failed: \"\\${error.message}\"\\`);\n }\n }\n}\n\nexport default Update${schema_model_name}TableMigration;\n`;\n\nconst SEQUELIZE_SEEDER_TEMPLATE = (\n class_name: string, \n table_name: string\n): string => `\n'use strict';\n\nimport { QueryInterface } from 'sequelize';\n\nclass ${class_name}Seeder {\n\t/**\n\t * Seed method\n\t */\n\tpublic async up(queryInterface: QueryInterface): Promise<void> {\n const seed_data = this.getSeedData();\n\n\t\tif (!seed_data || seed_data.length === 0) {\n\t\t\tthrow new Error(\"❌ Seeder data for 'roles' is empty. Aborting bulk insert.\");\n\t\t}\n\n\t\tawait queryInterface.bulkInsert('${table_name.toLowerCase()}', seed_data);\n\t}\n\n\t/**\n\t * Undo seed method\n\t */\n\tpublic async down(queryInterface: QueryInterface): Promise<void> {\n const seed_data = this.getSeedData();\n\n\t\tif (!seed_data || seed_data.length === 0) {\n\t\t\tthrow new Error(\"❌ Seeder data for 'roles' is empty. Nothing to delete.\");\n\t\t}\n\n\t\tconst ids = seed_data.map(row => row.id);\n\n\t\tawait queryInterface.bulkDelete('${table_name.toLowerCase()}', { id: ids });\n\t}\n\n\t/**\n\t * Provide seed data array\n\t */\n\tprivate getSeedData(): Array<Record<string, any>> {\n\t\t// TODO: Replace this with real seed data\n\t\treturn [];\n\t}\n}\n\nexport default ${class_name}Seeder;\n`;\n\nexport {\n SEQUELIZE_SCHEMA_CODE_TEMPLATE,\n SEQUELIZE_SEEDER_TEMPLATE,\n SEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE,\n SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE\n}\n\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { \n SCHEMAS_DIR,\n MIGRATIONS_DIR,\n SCHEMA_SNAPSHOTS_DIR\n} from \"@/config/constants\";\n\nimport {\n\tSEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE,\n SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE\n} from \"@/code_templates/sequelize_code_template\"\n\nimport { \n\tLoggerUtil,\n\tInputValidatorUtil,\n InputTransformerUtil\n} from \"@/utils\";\n\nimport { \n SchemaDefinitionInterface, \n SchemaDiffInterface, \n SchemaSnapshotInterface\n} from \"@/types/schema_type\";\n\nimport {\n SchemaDiffUtil,\n SchemaNormalizerUtil\n} from \"@/database/\"\n\n\nclass MakeMigrationsScript {\n\tprivate name: string = \"make_migrations_script\";\n private readonly schemas_dir: string = SCHEMAS_DIR;\n\tprivate readonly migrations_dir: string = MIGRATIONS_DIR;\n private readonly snapshot_dir: string = SCHEMA_SNAPSHOTS_DIR;\n\tprivate readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n\tconstructor() {}\n\n private getSnapshotPath(model_name: string) {\n return path.join(this.snapshot_dir, `${InputTransformerUtil.toSnakeCase(model_name)}.schema_snapshot.json`);\n }\n\n // Method to handle generating migration file name\n private generateMigrationFilename (\n table_name: string, \n type: \"create\" | \"update\", \n migration_priority: number\n ): string {\n const timestamp = new Date().toISOString().replace(/[-:.TZ]/g, '').slice(0, 14);\n return `${migration_priority}_${timestamp}_${type}_table_${table_name}.ts`;\n };\n\n // Methos to write schema snapshot\n private writeSchemaSnapshot(\n model_name: string,\n normalized_schema: SchemaSnapshotInterface\n ): boolean {\n const snapshot_path = this.getSnapshotPath(model_name);\n\n try {\n // Ensure snapshot directory exists\n InputValidatorUtil.dirExists(this.snapshot_dir, true);\n\n fs.writeFileSync(\n snapshot_path,\n JSON.stringify(normalized_schema, null, 2),\n { encoding: \"utf-8\" }\n );\n\n this.logger.success(`📸 Schema snapshot saved: ${snapshot_path}`);\n return true;\n } catch (error: any) {\n this.logger.error(`❌ Failed to write schema snapshot: ${snapshot_path}`);\n this.logger.error(error?.message || error);\n return false;\n }\n }\n\n // Method to handle create update schema table migration file\n private createUpdateSchemaMigrationFile (\n file_path: string, \n schema_file_path: string, \n schema_content: SchemaDefinitionInterface, \n schema_diff: SchemaDiffInterface\n ): boolean {\n const { table_name, model_name } = schema_content;\n \n const schema_file_name = path.basename(schema_file_path);\n\n const template = SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE(\n table_name,\n model_name,\n schema_diff,\n schema_file_name\n );\n \n try {\n fs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n } catch (error) {\n this.logger.error(`❌ Failed to write create update schema migration file: ${file_path}`);\n return false\n }\n\n return true\n }\n\n // Method to handle create new schema table migration file\n private createNewSchemaMigrationFile (\n file_path: string, \n schema_file_path: string, \n schema_content: SchemaDefinitionInterface\n ): boolean {\n const { table_name, model_name } = schema_content;\n\n const schema_file_name = path.basename(schema_file_path);\n\n const template = SEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE(\n table_name, \n model_name,\n schema_file_name\n );\n \n try {\n fs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n } catch (error) {\n this.logger.error(`❌ Failed to write create new schema migration file: ${file_path}`);\n return false\n }\n\n return true\n }\n\n // Method to handle creating migration files for new and updated schemas\n private createMigrationForSchema(\n schema_file_path: string, \n schema_content: SchemaDefinitionInterface\n ) {\n this.logger.info(`💾 Ready to create migration for: ${schema_file_path}`);\n \n const { table_name, migration_priority, model_name, } = schema_content;\n\n if (!table_name) {\n this.logger.error(`❌ Schema has no table_name: ${schema_file_path}`);\n return;\n }\n\n const normalized_schema = SchemaNormalizerUtil.normalizeSchema(schema_content);\n const snapshot_path = this.getSnapshotPath(model_name);\n const operation = !fs.existsSync(snapshot_path) ? \"create\" : \"update\";\n const migration_file_name = this.generateMigrationFilename(table_name, operation, migration_priority);\n const migration_file_path = path.join(this.migrations_dir, migration_file_name);\n\n let migration_file_created: boolean = false\n\n if (!fs.existsSync(snapshot_path)) {\n this.logger.info(`Creating Migration File for New schema: ${model_name}Schema`);\n migration_file_created = this.createNewSchemaMigrationFile(migration_file_path, schema_file_path, schema_content);\n }\n else {\n // Existing migration → UPDATE\n this.logger.info(`🔄 Found existing migration snapshots: ${snapshot_path} → checking for updates...`);\n\n const previous_snapshot: SchemaSnapshotInterface = JSON.parse(fs.readFileSync(snapshot_path, \"utf-8\"));\n const diff: SchemaDiffInterface = SchemaDiffUtil.getSchemaDifference(previous_snapshot, normalized_schema);\n\n if (\n !diff.table_renamed &&\n !diff.columns.added.length &&\n !diff.columns.removed.length &&\n !Object.keys(diff.columns.modified).length &&\n !diff.indexes.added.length &&\n !diff.indexes.removed.length\n ) {\n this.logger.info(\"ℹ️ No schema changes detected\");\n return false;\n }\n\n migration_file_created = this.createUpdateSchemaMigrationFile(\n migration_file_path, \n schema_file_path, \n schema_content,\n diff\n );\n }\n\n if (migration_file_created) {\n this.logger.success(`✅ Migration file created: ${migration_file_name}`);\n\n // Update snapshot AFTER successful migration creation\n const snapshot_written = this.writeSchemaSnapshot(model_name, normalized_schema);\n\n if (!snapshot_written) {\n this.logger.error(`⚠️ Migration created but snapshot update failed for \"${model_name}\"`);\n }\n } else {\n this.logger.info(`ℹ️ No migration created for table \"${table_name}\".`);\n }\n return migration_file_created;\n \n }\n\n // Main Method\n\tpublic run(): void {\n this.logger.info(`🔍 Scanning schemas in directory: ${this.schemas_dir}`);\n\n // Ensure directory exists\n InputValidatorUtil.dirExists(this.schemas_dir, true);\n InputValidatorUtil.dirExists(this.migrations_dir, true);\n\n // Fetch all TypeScript schema files\n const schema_files = fs.readdirSync(this.schemas_dir).filter(file => file.endsWith(\".ts\"));\n\n if (!schema_files.length) {\n this.logger.info(\"⚠️ No schema files found.\");\n return;\n }\n\n this.logger.info(`✅ Found ${schema_files.length} schema file(s).`);\n\n let created_count = 0;\n let failed_count = 0;\n\n for (const file of schema_files) {\n const file_path = path.join(this.schemas_dir, file);\n\n try {\n // Dynamically import the schema\n // Using require + resolve to get absolute path\n const schema_module = require(file_path);\n\n this.logger.info(`Processing schema file: ${file_path}`);\n \n // Log details if default export exists\n if (schema_module?.default) {\n const schema_content = schema_module.default;\n this.logger.info(`Schema Name: ${schema_content?.model_name || \"N/A\"}Schema`);\n this.logger.info(`Model Name: ${schema_content?.model_name || \"N/A\"}`);\n this.logger.info(`Table Name: ${schema_content?.table_name || \"N/A\"}`);\n\n // Pass to migration creation logic\n const created = this.createMigrationForSchema(file_path, schema_content);\n\n if (created) { created_count++; }\n } else {\n this.logger.error(`⚠️ Schema file has no default export: ${file_path}`);\n failed_count++;\n }\n } \n catch (error: any) {\n this.logger.error(`❌ Failed to load schema file: ${file_path}`);\n this.logger.error(`Error: ${error?.message || error}`);\n failed_count++;\n }\n }\n\n this.logger.success(`🏁 Migration generation summary:`);\n this.logger.success(`Successfully processed: ${created_count}`);\n this.logger.success(`Failed: ${failed_count}`);\n }\n\n}\n\nexport default MakeMigrationsScript\n\n// CLI entry point\ntry {\n\tnew MakeMigrationsScript().run();\n} \ncatch (error: any) {\n\tconsole.error(error?.message || \"\");\n\tprocess.exit(1);\n}\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { Sequelize, QueryInterface, DataTypes } from \"sequelize\";\n\nimport { SequelizeConnector } from \"@/database\";\nimport { MIGRATIONS_DIR, SEQUELIZE_META_TABLE_NAME } from \"@/config/constants\";\nimport { LoggerUtil, InputValidatorUtil, } from \"@/utils\";\nimport { MigrationOperationTypes } from \"@/types/migration_type\";\n\nclass MigrationRunnerScript {\n private module_name = \"migration_runner_script\";\n private readonly migrations_dir: string = MIGRATIONS_DIR;\n private readonly db_connection: SequelizeConnector = SequelizeConnector?.getInstance?.();\n private readonly logger: LoggerUtil = new LoggerUtil(this.module_name);\n private readonly sequelize_instance: Sequelize;\n\n constructor() {\n InputValidatorUtil.dirExists(this.migrations_dir, true);\n\n this.sequelize_instance = this.db_connection.connect();\n }\n\n // Fetch all migration files\n private getMigrationFiles(schema_name?: string): string[] {\n const files = fs.readdirSync(this.migrations_dir).filter(f => f.endsWith(\".ts\"));\n\n if (schema_name) {\n return files.filter(f => f.toLowerCase().includes(schema_name.toLowerCase()));\n }\n return files;\n }\n\n // Ensure SequelizeMeta table exists\n private async ensureMetaTable() {\n const queryInterface = this.sequelize_instance.getQueryInterface();\n const table_names = await queryInterface.showAllTables();\n\n if (!table_names.includes(SEQUELIZE_META_TABLE_NAME)) {\n this.logger.info(\"⏳ Creating SequelizeMeta table...\");\n\n await queryInterface.createTable(\n SEQUELIZE_META_TABLE_NAME, \n {\n name: { \n type: DataTypes.STRING, \n allowNull: false, \n primaryKey: true \n }\n }\n );\n\n this.logger.success(\"✅ SequelizeMeta table created.\");\n }\n }\n\n // Fetch already applied migrations\n private async getAppliedMigrations(): Promise<string[]> {\n const [results] = await this.sequelize_instance.query(`SELECT name FROM \\\"${SEQUELIZE_META_TABLE_NAME}\\\";`);\n return Array.isArray(results) ? results.map((r: any) => r.name) : [];\n }\n\n // Apply a single migration\n private async applyMigration(file_path: string, operation: MigrationOperationTypes ) {\n const MigrationClass = require(file_path)?.default;\n\n if (!MigrationClass) { \n const log_msg = `Migration file has no default export: ${file_path}`\n this.logger.error(log_msg);\n throw new Error(log_msg); \n }\n\n const migration_instance = new MigrationClass();\n\n const queryInterface: QueryInterface = this.sequelize_instance.getQueryInterface();\n\n if (operation === \"up\") {\n await migration_instance.up.bind(migration_instance)(queryInterface, this.sequelize_instance);\n await this.sequelize_instance.getQueryInterface().bulkInsert(SEQUELIZE_META_TABLE_NAME, [{ name: path.basename(file_path) }]);\n } else {\n await migration_instance.down.bind(migration_instance)(queryInterface, this.sequelize_instance);\n await this.sequelize_instance.getQueryInterface().bulkDelete(SEQUELIZE_META_TABLE_NAME, { name: path.basename(file_path) });\n }\n }\n\n // Main runner\n public async run(\n operation: MigrationOperationTypes,\n schema_name?: string,\n migration_file?: string,\n ) {\n this.logger.info(`🏃‍♂️ Starting Migration process Operation: ${operation.toUpperCase()}, Schema: ${schema_name}, File: ${migration_file || \"all\"}`);\n\n await this.sequelize_instance?.authenticate();\n\n this.logger.success(\"✅ Database connected.\");\n\n await this.ensureMetaTable();\n\n let files: string[] = [];\n\n if (migration_file) {\n const full_path = path.join(this.migrations_dir, migration_file);\n\n if (!fs.existsSync(full_path)){\n const log_msg = `Migration file not found: ${full_path}`;\n this.logger.error(log_msg);\n throw new Error(log_msg);\n } \n\n files = [full_path];\n } else {\n files = this.getMigrationFiles(schema_name).map(f => path.join(this.migrations_dir, f));\n }\n\n // Sort ascending for UP, descending for DOWN\n files.sort((a, b) => {\n const getPriority = (file_path: string) => {\n const file_name = file_path.split(\"/\").pop() || \"\";\n const match = file_name.match(/^(\\d+)_/);\n return match ? Number(match[1]) : Number.MAX_SAFE_INTEGER;\n };\n\n const a_priority = getPriority(a);\n const b_priority = getPriority(b);\n\n return operation === \"up\"\n ? a_priority - b_priority\n : b_priority - a_priority;\n });\n\n const applied_migrations = await this.getAppliedMigrations();\n\n for (const file of files) {\n const file_name = path.basename(file);\n\n if (operation === \"up\" && applied_migrations.includes(file_name)) {\n this.logger.info(`⏭️ Skipping already applied migration: ${file_name}`);\n continue;\n }\n if (operation === \"down\" && !applied_migrations.includes(file_name)) {\n this.logger.info(`⏭️ Skipping not-applied migration: ${file_name}`);\n continue;\n }\n\n this.logger.info(`${operation === \"up\" ? \"Applying\" : \"Reverting\"} migration: ${file_name}`);\n await this.applyMigration(file, operation);\n this.logger.success(`${operation === \"up\" ? \"Applied\" : \"Reverted\"} migration: ${file_name}`);\n }\n\n this.logger.success(`🏁 Migration process completed.`);\n }\n\n}\n\nexport default MigrationRunnerScript;\n\n// -----------------------\n// CLI ENTRY POINT\n// -----------------------\n(async () => {\n try {\n const args = process.argv.slice(2);\n\n // Parse CLI args\n const operation_arg = args.find(arg => arg.startsWith(\"--operation=\")) || \"--operation=up\";\n const schema_arg = args.find(arg => arg.startsWith(\"--schema_name=\"));\n const file_arg = args.find(arg => arg.startsWith(\"--file_name=\"));\n\n const operation = operation_arg.split(\"=\")[1] as MigrationOperationTypes;\n const schema_name = schema_arg ? schema_arg.split(\"=\")[1] : undefined;\n const migration_file = file_arg ? file_arg.split(\"=\")[1] : undefined;\n\n if (![\"up\", \"down\"].includes(operation)) {\n throw new Error(`Invalid operation: ${operation}. Must be \"up\" or \"down\".`);\n }\n\n await new MigrationRunnerScript().run(operation, schema_name, migration_file);\n process.exit(0);\n } catch (error: any) {\n console.error(\"❌\", error?.message || error);\n process.exit(1);\n }\n})();\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { SCHEMAS_DIR, SEEDERS_DIR } from \"@/config/constants\";\nimport { SEQUELIZE_SEEDER_TEMPLATE } from \"@/code_templates/sequelize_code_template\";\n\nimport { \n\tLoggerUtil,\n\tInputTransformerUtil,\n\tInputValidatorUtil,\n} from \"@/utils\";\n\nclass CreateSeederScript {\n\tprivate module_name: string = \"create_seeder_script\";\n\tprivate readonly schema_input: string;\n\tprivate readonly seeder_file_input: string;\n\tprivate readonly seeders_dir: string = SEEDERS_DIR;\n\tprivate readonly schemas_dir: string = SCHEMAS_DIR;\n\tprivate readonly logger: LoggerUtil = new LoggerUtil(this.module_name);\n\n constructor(schema_input?: string, seeder_file_input?: string) {\n\t\tif (!schema_input || !seeder_file_input) {\n\t\t\tconst log_msg = \"❌ Please provide a schema name and seeder file name.\";\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\tthis.schema_input = schema_input;\n\t\tthis.seeder_file_input = seeder_file_input;\n\t}\n\n // Method to ensure seeder file does not exists\n private ensureSeederDoesNotExist(file_path: string): void {\n\t\tif (fs.existsSync(file_path)) {\n\t\t\tconst log_msg = `❌ Seeder already exists: ${file_path}`;\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\t}\n\n // method to generate seeder file name\n private generateSeederFileName (\n migration_priority: number\n ): string {\n const timestamp \t\t\t\t\t= Date.now();\n const formatted_migration_priority = this.formatPriority(migration_priority)\n const seedeer_name = InputTransformerUtil.toSnakeCase(this.seeder_file_input);\n\n return `${formatted_migration_priority}_${seedeer_name}_${timestamp}.ts`\n }\n\n // Method to format migration priority number for file name\n\tprivate formatPriority(priority: number): string {\n\t\treturn priority.toString().padStart(3, \"0\");\n\t}\n\n // Method to create seeder file with content\n\tprivate createSeederFile(\n file_path: string, \n sedder_file_class_name: string, \n table_name: string\n ): void {\n\t\tconst template = SEQUELIZE_SEEDER_TEMPLATE(sedder_file_class_name, table_name);\n\n\t\ttry {\n\t\t\tfs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`❌ Failed to write seeder file: ${file_path}`);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n // Method to run create seeder file script\n public run(): void {\n\t\t// Transform input to schema file name (snake_case)\n\t\tconst file_base_name \t\t= InputTransformerUtil.toSchemaFileName(this.schema_input);\n\t\tconst schema_file_path \t\t= path.join(this.schemas_dir, `${file_base_name}.ts`);\n\n\t\t// Check if schema exists\n\t\tif (!fs.existsSync(schema_file_path)) {\n\t\t\tconst log_msg = `❌ Schema file not found: ${schema_file_path}`;\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\t// Require schema file to extract model/table info\n\t\tconst schema_module = require(schema_file_path).default;\n\n\t\tif (!schema_module) {\n\t\t\tconst log_msg = `❌ Failed to load schema file: ${schema_file_path}`;\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\t// Generate unique seeder file name with optional custom name or timestamp\n const { model_name, table_name, migration_priority } = schema_module;\n\n\t\tconst seeder_file_name \t\t\t\t= this.generateSeederFileName(migration_priority)\n\t\tconst file_path: string \t\t\t= path.join(this.seeders_dir, seeder_file_name);\n const seedeer_file_class_name = InputTransformerUtil.toPascalCase(this.seeder_file_input);\n\n\t\t// Ensure seeders directory exists\n\t\tInputValidatorUtil.dirExists(this.seeders_dir, true);\n\n\t\tthis.ensureSeederDoesNotExist(file_path);\n\t\tthis.createSeederFile( file_path, seedeer_file_class_name, table_name);\n\n\t\tthis.logger.success(`✅ Seeder created successfully: ${seeder_file_name}`);\n\t\tthis.logger.info(`📄 File Path: ${file_path}`);\n\t\tthis.logger.info(`🧩 Model Name: ${model_name}`);\n\t\tthis.logger.info(`🗄️ Table Name: ${table_name}`);\n\t\tthis.logger.info(`🔢 Migration Priority: ${migration_priority}`);\n\t}\n\n}\n\nexport default CreateSeederScript\n\n","import fs from \"fs\";\nimport path from \"path\";\nimport { Sequelize, QueryInterface, DataTypes } from \"sequelize\";\n\nimport { SequelizeConnector } from \"@/database\";\nimport { SEEDERS_DIR, SEQUELIZE_SEEDER_META_TABLE_NAME } from \"@/config/constants\";\nimport { LoggerUtil, InputValidatorUtil } from \"@/utils\";\nimport { SeederOperationTypes } from \"@/types/migration_type\";\n\nclass SeederRunnerScript {\n private module_name = \"seeder_runner_script\";\n private readonly seeders_dir: string = SEEDERS_DIR;\n private readonly db_connection: SequelizeConnector = SequelizeConnector?.getInstance?.();\n private readonly logger: LoggerUtil = new LoggerUtil(this.module_name);\n private readonly sequelize_instance: Sequelize;\n\n constructor() {\n InputValidatorUtil.dirExists(this.seeders_dir, true);\n\n this.sequelize_instance = this.db_connection.connect();\n }\n\n // Get all seeder files\n private getSeederFiles(seeder_name?: string): string[] {\n let files = fs.readdirSync(this.seeders_dir).filter(f => f.endsWith(\".ts\"));\n if (seeder_name) {\n files = files.filter(f => f.toLowerCase().includes(seeder_name.toLowerCase()));\n }\n return files;\n }\n\n // Ensure SequelizeSeederMeta table exists\n private async ensureMetaTable() {\n const queryInterface = this.sequelize_instance.getQueryInterface();\n const tables = await queryInterface.showAllTables();\n\n if (!tables.includes(SEQUELIZE_SEEDER_META_TABLE_NAME)) {\n this.logger.info(\"⏳ Creating Sequelize seeder meta table table...\");\n await queryInterface.createTable(SEQUELIZE_SEEDER_META_TABLE_NAME, {\n name: { type: DataTypes.STRING, allowNull: false, primaryKey: true },\n });\n this.logger.success(\"✅ SequelizeSeederMeta table created.\");\n }\n }\n\n // Get already applied seeders\n private async getAppliedSeeders(): Promise<string[]> {\n const [results] = await this.sequelize_instance.query(`SELECT name FROM \"${SEQUELIZE_SEEDER_META_TABLE_NAME}\";`);\n return Array.isArray(results) ? results.map((r: any) => r.name) : [];\n }\n\n // Apply a single seeder\n private async applySeeder(\n file_path: string, \n operation: SeederOperationTypes\n ) {\n const SeederClass = require(file_path)?.default;\n\n if (!SeederClass) {\n throw new Error(`Seeder file has no default export: ${file_path}`);\n }\n\n const seeder_instance = new SeederClass();\n const queryInterface: QueryInterface = this.sequelize_instance.getQueryInterface();\n\n if (operation === \"up\") {\n await seeder_instance.up(queryInterface, this.sequelize_instance);\n await queryInterface.bulkInsert(SEQUELIZE_SEEDER_META_TABLE_NAME, [{ name: path.basename(file_path) }]);\n } else {\n await seeder_instance.down(queryInterface, this.sequelize_instance);\n await queryInterface.bulkDelete(SEQUELIZE_SEEDER_META_TABLE_NAME, { name: path.basename(file_path) });\n }\n }\n\n // Main runner\n public async run(\n operation: SeederOperationTypes,\n seeder_name?: string,\n seeder_file?: string\n ) {\n try {\n this.logger.info(`🏃‍♂️ Starting seeder process Operation: ${operation.toUpperCase()}, Seeder: ${seeder_name || \"all\"}, File: ${seeder_file || \"none\"}`);\n \n await this.sequelize_instance?.authenticate();\n\n this.logger.success(\"✅ Database connected.\");\n\n await this.ensureMetaTable();\n\n let files: string[] = [];\n\n if (seeder_file) {\n const full_path = path.join(this.seeders_dir, seeder_file);\n\n if (!fs.existsSync(full_path)) { \n this.logger.error(`Seeder file not found: ${full_path}`)\n throw new Error(`Seeder file not found: ${full_path}`);\n }\n\n files = [full_path];\n } else {\n files = this.getSeederFiles(seeder_name).map(f => path.join(this.seeders_dir, f));\n }\n\n // Sort by filename: ascending for UP, descending for DOWN\n files.sort((a, b) => (operation === \"up\" ? a.localeCompare(b) : b.localeCompare(a)));\n\n const applied_seeders = await this.getAppliedSeeders();\n\n for (const file of files) {\n const file_name = path.basename(file);\n\n if (operation === \"up\" && applied_seeders.includes(file_name)) {\n this.logger.info(`⏭️ Skipping already applied seeder: ${file_name}`);\n continue;\n }\n\n if (operation === \"down\" && !applied_seeders.includes(file_name)) {\n this.logger.info(`⏭️ Skipping not-applied seeder: ${file_name}`);\n continue;\n }\n\n this.logger.info(`${operation === \"up\" ? \"Applying\" : \"Reverting\"} seeder: ${file_name}`);\n await this.applySeeder(file, operation);\n this.logger.success(`${operation === \"up\" ? \"Applied\" : \"Reverted\"} seeder: ${file_name}`);\n }\n\n this.logger.success(\"🏁 Seeder process completed.\");\n }\n catch (error: any) {\n this.logger.error(`❌ ${error?.message}`, { error })\n process.exit(1);\n }\n }\n\n}\n\nexport default SeederRunnerScript;\n\n// -----------------------\n// CLI ENTRY POINT\n// -----------------------\n(async () => {\n try {\n const args = process.argv.slice(2);\n\n const operation_arg = args.find(arg => arg.startsWith(\"--operation=\")) || \"--operation=up\";\n const seeder_arg = args.find(arg => arg.startsWith(\"--seeder=\"));\n const file_arg = args.find(arg => arg.startsWith(\"--file_name=\"));\n\n const operation = operation_arg.split(\"=\")[1] as SeederOperationTypes;\n const seeder_name = seeder_arg ? seeder_arg.split(\"=\")[1] : undefined;\n const seeder_file = file_arg ? file_arg.split(\"=\")[1] : undefined;\n\n if (![\"up\", \"down\"].includes(operation)) {\n throw new Error(`Invalid operation: ${operation}. Must be \"up\" or \"down\".`);\n }\n\n await new SeederRunnerScript().run(operation, seeder_name, seeder_file);\n process.exit(0);\n } \n catch (error: any) {\n console.error(`❌ ${error?.message}`, { error })\n process.exit(1);\n }\n})();\n\n","\nimport { LoggerUtil, EnvManagerUtil } from \"@/utils\";\n\n/**\n * Base connector abstraction for all DB / external service connectors\n */\nabstract class BaseConnector<TConnection> {\n public readonly env_manager = EnvManagerUtil.getInstance();\n public readonly logger: LoggerUtil;\n\n protected constructor(\n protected readonly connector_name: string\n ) {\n this.logger = new LoggerUtil(connector_name);\n }\n\n // Connect and return the underlying connection instance\n public abstract connect(): TConnection;\n}\n\nexport default BaseConnector;\n","import { Sequelize, Dialect } from \"sequelize\";\nimport BaseConnector from \"./base_connector\";\nimport SqlFormatterUtil from \"@/utils/sql_formatter_util\";\nimport { SequelizeConnectionOptions } from \"@/types/database_type\";\n\nclass SequelizeConnector extends BaseConnector<Sequelize> {\n private static instance: SequelizeConnector;\n private static connections: Map<string, Sequelize> = new Map();\n\n private constructor() {\n super(\"sequelize_connector\");\n }\n\n public static getInstance(): SequelizeConnector {\n if (!SequelizeConnector.instance) {\n SequelizeConnector.instance = new SequelizeConnector();\n }\n return SequelizeConnector.instance;\n }\n\n // ----------------------------------\n // SQL logging\n // ----------------------------------\n private formatSQLQueryLog = (sql: string, timing?: number): void => {\n try {\n const formatted = SqlFormatterUtil.format(sql);\n\n if (typeof timing === \"number\") {\n this.logger.info(`[SQL ${timing}ms] ${formatted}`);\n } else {\n this.logger.info(`[SQL] ${formatted}`);\n }\n } catch (error) {\n this.logger.error(\"Failed to log SQL query\", { error });\n }\n };\n\n // ----------------------------------\n // Single default connection\n // ----------------------------------\n\n public connect(options: SequelizeConnectionOptions = {}): Sequelize {\n return this.connectNamed(options.name ?? \"default\", options);\n }\n\n // ----------------------------------\n // Multiple named connections\n // ----------------------------------\n\n public connectNamed(\n name: string,\n options: SequelizeConnectionOptions = {}\n ): Sequelize {\n if (SequelizeConnector.connections.has(name)) {\n return SequelizeConnector.connections.get(name)!;\n }\n\n const dialect = options.dialect ?? this.env_manager.getEnvVar<Dialect>(\"DB_DIALECT\", \"postgres\");\n const logging_enabled = options.logging ?? this.env_manager.getEnvVar<boolean>(\"DB_LOGGING\", false);\n const logging = logging_enabled ? this.formatSQLQueryLog : false;\n const database = options.database ?? this.env_manager.getEnvVar<string>(\"DB_NAME\")!;\n const username = options.username ?? this.env_manager.getEnvVar<string>(\"DB_USER\")!;\n const password = options.password ?? this.env_manager.getEnvVar<string>(\"DB_PASSWORD\");\n const host = options.host ?? this.env_manager.getEnvVar<string>(\"DB_HOST\")!;\n const port = options.port ?? this.env_manager.getEnvVar<number>(\"DB_PORT\", 5432);\n\n\n const sequelize = new Sequelize({\n database,\n username,\n password,\n host,\n port,\n dialect,\n logging,\n benchmark: logging_enabled,\n });\n\n SequelizeConnector.connections.set(name, sequelize);\n\n this.logger.success(`✅ Sequelize connected [${name}]`);\n\n return sequelize;\n }\n\n // ----------------------------------\n // Utilities\n // ----------------------------------\n\n public getConnection(name = \"default\"): Sequelize | undefined {\n return SequelizeConnector.connections.get(name);\n }\n\n public hasConnection(name = \"default\"): boolean {\n return SequelizeConnector.connections.has(name);\n }\n\n public async closeConnection(name = \"default\"): Promise<void> {\n const conn = SequelizeConnector.connections.get(name);\n if (conn) {\n await conn.close();\n SequelizeConnector.connections.delete(name);\n this.logger.info(`🔌 Sequelize connection closed [${name}]`);\n }\n }\n\n public async closeAll(): Promise<void> {\n for (const [name, conn] of SequelizeConnector.connections.entries()) {\n await conn.close();\n this.logger.info(`🔌 Sequelize connection closed [${name}]`);\n }\n SequelizeConnector.connections.clear();\n }\n}\n\nexport default SequelizeConnector;\n"],"mappings":";;;;;;;;;;;;;;;;;;AASA,IAAM,iBAAN,MAAM,gBAAe;AAAA,EAEjB,OAAe,SAAS,GAAuC;AAC3D,WAAO,KAAK,UAAU;AAAA,MACd,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,OAAO,EAAE;AAAA,MACT,UAAU,EAAE;AAAA,IAChB,CAAC;AAAA,EACT;AAAA,EAEA,OAAc,oBACV,MACA,MACmB;AAEnB,UAAM,OAA4B;AAAA,MAC9B,SAAS,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,MAChD,SAAS,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,IACpD;AAGA,QAAI,KAAK,eAAe,KAAK,YAAY;AACrC,WAAK,gBAAgB;AAAA,QACjB,MAAM,KAAK;AAAA,QACX,IAAI,KAAK;AAAA,MACb;AAAA,IACJ;AAGA,eAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AAC5D,YAAM,WAAkC,KAAK,QAAQ,QAAQ;AAE7D,UAAG,CAAC,UAAU;AACV,aAAK,QAAQ,MAAM,KAAK,QAAQ;AAAA,MACpC,WACS,KAAK,UAAU,QAAQ,MAAM,KAAK,UAAU,OAAO,GAAG;AAC3D,aAAK,QAAQ,SAAS,QAAQ,IAAI;AAAA,UAC9B,QAAQ;AAAA,UACR,OAAO;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAEA,eAAW,CAAC,eAAe,YAAY,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AACtE,UAAI,CAAC,KAAK,QAAQ,aAAa,GAAG;AAC9B,aAAK,QAAQ,QAAQ,aAAa,IAAI;AAAA,MAC1C;AAAA,IACJ;AAGA,UAAM,eAAiB,MAAM,WAAW,CAAC;AACzC,UAAM,eAAiB,MAAM,WAAW,CAAC;AACzC,UAAM,WAAiB,IAAI,IAAI,aAAa,IAAI,OAAK,CAAC,gBAAe,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AACrF,UAAM,WAAiB,IAAI,IAAI,aAAa,IAAI,OAAK,CAAC,gBAAe,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAErF,eAAW,CAAC,KAAK,GAAG,KAAK,UAAU;AAC/B,UAAI,CAAC,SAAS,IAAI,GAAG,GAAG;AACpB,aAAK,QAAQ,MAAM,KAAK,GAAG;AAAA,MAC/B;AAAA,IACJ;AAEA,eAAW,CAAC,KAAK,GAAG,KAAK,UAAU;AAC/B,UAAI,CAAC,SAAS,IAAI,GAAG,GAAG;AACpB,aAAK,QAAQ,QAAQ,KAAK,GAAG;AAAA,MACjC;AAAA,IACJ;AAGA,eAAW,YAAY,cAAc;AACjC,YAAM,WAAW,aAAa;AAAA,QAC1B,OAAK,KAAK,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,GAAG,SAAS,MAAM,EAAE,KAAK,CAAC;AAAA,MAC5F;AAEA,UAAI,YAAY,KAAK,UAAU,QAAQ,MAAM,KAAK,UAAU,QAAQ,GAAG;AACnE,aAAK,QAAQ,SAAS,UAAU,IAAI,IAAI;AAAA,UACpC,QAAQ;AAAA,UACR,OAAO;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AACJ;AAEA,IAAO,2BAAQ;;;ACzFf,IAAM,uBAAN,MAA2B;AAAA,EACvB,OAAO,gBAAgB,QAAa;AAChC,WAAO;AAAA,MACH,MAAM,OAAO,MAAM,OAAO,OAAO,MAAM,SAAS;AAAA,MAChD,YAAY,OAAO,aAAa;AAAA,MAChC,aAAa,CAAC,CAAC,OAAO;AAAA,MACtB,gBAAgB,CAAC,CAAC,OAAO;AAAA,MACzB,QAAQ,CAAC,CAAC,OAAO;AAAA,MACjB,eAAe,OAAO,gBAAgB;AAAA,MACtC,YAAY,OAAO,cAAc;AAAA,MACjC,WAAW,OAAO,YAAY;AAAA,MAC9B,WAAW,OAAO,YAAY;AAAA,IAClC;AAAA,EACJ;AAAA,EAEA,OAAO,eAAe,OAAY;AAC9B,WAAO;AAAA,MACH,MAAM,MAAM,QAAQ;AAAA,MACpB,QAAQ,CAAC,GAAG,MAAM,MAAM,EAAE,KAAK;AAAA,MAC/B,QAAQ,CAAC,CAAC,MAAM;AAAA,MAChB,OAAO,MAAM,SAAS;AAAA,MACtB,UAAU,MAAM,YAAY;AAAA,IAChC;AAAA,EACJ;AAAA,EAEA,OAAO,gBACH,QACuB;AACvB,WAAO;AAAA,MACH,eAAe,OAAO;AAAA,MACtB,YAAY,OAAO;AAAA,MACnB,YAAY,OAAO;AAAA,MACnB,oBAAoB,OAAO;AAAA,MAC3B,YAAY,OAAO;AAAA,MAEnB,SAAS,OAAO;AAAA,QACZ,OAAO,QAAQ,OAAO,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM;AAAA,UAC/C;AAAA,UACA,KAAK,gBAAgB,GAAG;AAAA,QAC5B,CAAC;AAAA,MACL;AAAA,MAEA,UAAU,OAAO,WAAW,CAAC,GAAG,IAAI,KAAK,cAAc;AAAA,IAC3D;AAAA,EACJ;AACJ;AAEA,IAAO,iCAAQ;;;ACrDf,OAAO,QAAQ;AACf,OAAO,UAAU;;;ACKjB,IAAM,iCAAiC,CACnC,aACA,YACA,YACA,uBAEJ;AACI,SAAO;AAAA;AAAA;AAAA;AAAA,QAIH,WAAW;AAAA;AAAA,0BAEO,kBAAkB;AAAA;AAAA,mBAEzB,UAAU;AAAA,mBACV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBA4BZ,WAAW;AAAA;AAE5B;AAEA,IAAM,2DAA2D,CAC7D,mBACA,mBACA,qBACS;AAAA;AAAA;AAAA;AAAA,SAIJ,iBAAiB,mCAAmC,iBAAiB,QAAQ,OAAO,EAAE,CAAC;AAAA;AAAA,cAElF,iBAAiB;AAAA,2CACY,iBAAiB;AAAA,kDACV,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAmD5C,iBAAiB;AAAA;AAGxC,IAAM,gEAAgE,CAClE,mBACA,mBACA,MACA,qBACS;AAAA;AAAA;AAAA;AAAA,SAIJ,iBAAiB,mCAAmC,iBAAiB,QAAQ,OAAO,EAAE,CAAC;AAAA;AAAA,cAElF,iBAAiB;AAAA,2CACY,iBAAiB;AAAA,kDACV,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAYzD,KAAK,gBAAgB;AAAA;AAAA,mBAEZ,KAAK,cAAc,IAAI;AAAA,mBACvB,KAAK,cAAc,EAAE;AAAA,kBAG5B,EACJ;AAAA;AAAA;AAAA,UAGE,KAAK,QAAQ,MAAM,IAAI,CAAC,gBAAwB;AAAA;AAAA;AAAA,mBAGvC,WAAW;AAAA,2BACH,WAAW;AAAA;AAAA,SAE7B,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,UAGT,OAAO,QAAQ,KAAK,QAAQ,QAAQ,EAAE;AAAA,EAAI,CAAC,CAAC,UAAU,YAAY,MAAM;AAAA;AAAA;AAAA,mBAG/D,QAAQ;AAAA,kBACT,KAAK,UAAU,cAAc,KAAK,CAAC;AAAA;AAAA;AAG7C,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,UAGR,OAAO,QAAQ,KAAK,QAAQ,QAAQ,EAAE;AAAA,EAAI,CAAC,CAAC,UAAU,OAAO,MAAM;AAAA;AAAA;AAAA,mBAG1D,QAAQ;AAAA;AAAA;AAGnB,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,UAIR,KAAK,QAAQ,MAAM;AAAA,EAAK,CAAC,QAAoC;AAAA;AAAA;AAAA,kBAGrD,KAAK,UAAU,IAAI,MAAM,CAAC;AAAA,kBAC1B,KAAK,UAAU,GAAG,CAAC;AAAA;AAAA;AAG7B,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,UAGR,OAAO,QAAQ,KAAK,QAAQ,QAAQ,EAAE;AAAA,EAAI,CAAC,CAAC,UAAU,YAAY,MAAM;AAAA;AAAA;AAAA,kBAGhE,KAAK,UAAU,aAAa,OAAO,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKxC,KAAK,UAAU,aAAa,MAAM,MAAM,CAAC;AAAA,kBACzC,KAAK,UAAU,aAAa,KAAK,CAAC;AAAA;AAAA;AAG5C,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,UAGR,KAAK,QAAQ,QAAQ;AAAA,EAAK,CAAC,QAAoC;AAAA;AAAA;AAAA,kBAGvD,KAAK,UAAU,IAAI,IAAI,CAAC;AAAA;AAAA;AAGlC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAmBR,KAAK,QAAQ,MAAM;AAAA,EAAK,CAAC,QAAoC;AAAA;AAAA;AAAA,kBAGrD,KAAK,UAAU,IAAI,IAAI,CAAC;AAAA;AAElC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,UAGR,OAAO,QAAQ,KAAK,QAAQ,QAAQ,EAAE;AAAA,EAAI,CAAC,CAAC,UAAU,YAAY,MAAM;AAAA;AAAA;AAAA,kBAGhE,KAAK,UAAU,aAAa,MAAM,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAMvC,KAAK,UAAU,aAAa,OAAO,MAAM,CAAC;AAAA,kBAC1C,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA;AAE7C,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,UAGR,KAAK,QAAQ,QAAQ;AAAA,EAAK,CAAC,QAAoC;AAAA;AAAA;AAAA,kBAGvD,KAAK,UAAU,IAAI,MAAM,CAAC;AAAA,kBAC1B,KAAK,UAAU,GAAG,CAAC;AAAA;AAE7B,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,UAGR,OAAO,QAAQ,KAAK,QAAQ,QAAQ,EAAE;AAAA,EAAI,CAAC,CAAC,UAAU,YAAY,MAAM;AAAA;AAAA;AAAA,mBAG/D,QAAQ;AAAA,kBACT,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA;AAE7C,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,UAGR,KAAK,QAAQ,MAAM,IAAI,CAAC,gBAAwB;AAAA,6DACG,WAAW;AAAA,SAC/D,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,UAET,OAAO,QAAQ,KAAK,QAAQ,QAAQ,EAAE,IAAI,CAAC,CAAC,UAAU,OAAO,MAAM;AAAA;AAAA;AAAA,mBAG1D,QAAQ;AAAA,kBACT,KAAK,UAAU,OAAO,CAAC;AAAA;AAAA,SAEhC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,UAET,KAAK,gBAAgB;AAAA;AAAA,mBAEZ,KAAK,cAAc,EAAE;AAAA,mBACrB,KAAK,cAAc,IAAI;AAAA,kBACxB,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAWe,iBAAiB;AAAA;AAGxC,IAAM,4BAA4B,CAC9B,YACA,eACS;AAAA;AAAA;AAAA;AAAA;AAAA,QAKL,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAWmB,WAAW,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAexB,WAAW,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAY3C,UAAU;AAAA;;;ADpV5B,IAAM,qBAAN,MAAyB;AAAA,EAChB,OAAe;AAAA,EACN;AAAA,EACA;AAAA,EACA,SAAqB,IAAI,oBAAW,KAAK,IAAI;AAAA,EAE3D,YAAY,WAAoB;AAClC,QAAI,CAAC,WAAW;AACf,YAAM,UAAU;AAChB,WAAK,OAAO,MAAM,OAAO;AACzB,YAAM,IAAI,MAAM,OAAO;AAAA,IACxB;AAEA,SAAK,YAAc;AACnB,SAAK,cAAe;AAAA,EACrB;AAAA;AAAA,EAGQ,yBAAyB,WAAyB;AACzD,QAAI,GAAG,WAAW,SAAS,GAAG;AAC7B,YAAM,UAAU,uCAAkC,SAAS;AAC3D,WAAK,OAAO,MAAM,OAAO;AACzB,YAAM,IAAI,MAAM,OAAO;AAAA,IACxB;AAAA,EACD;AAAA;AAAA,EAGW,2BAAmC;AACvC,QAAI,CAAC,GAAG,WAAW,KAAK,WAAW,GAAG;AAClC,aAAO;AAAA,IACX;AAEA,UAAM,QAAQ,GAAG,YAAY,KAAK,WAAW;AAE7C,WAAO,MAAM,SAAS;AAAA,EAC1B;AAAA;AAAA,EAGQ,eAAe,UAA0B;AAC7C,WAAO,SAAS,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,EAC9C;AAAA;AAAA,EAGK,iBACD,WACA,aACA,YACA,YACA,oBACI;AACP,UAAM,WAAW,+BAA+B,aAAa,YAAY,YAAY,kBAAkB;AAE1G,QAAI;AACH,SAAG,cAAc,WAAW,UAAU,EAAE,UAAU,QAAQ,CAAC;AAAA,IAC5D,SAAS,OAAO;AACf,WAAK,OAAO,MAAM,uCAAkC,SAAS,EAAE;AAC/D,YAAM;AAAA,IACP;AAAA,EACD;AAAA;AAAA,EAGO,MAAY;AAClB,UAAM,iBAAmB,+BAAqB,iBAAiB,KAAK,SAAS;AACvE,UAAM,cAAiB,+BAAqB,aAAa,cAAc;AACvE,UAAM,cAAwB,YAAY,YAAY,EAAE,SAAS,QAAQ,IAAI,cAAc,GAAG,WAAW;AACzG,UAAM,aAAgB,YAAY,YAAY,EAAE,SAAS,QAAQ,IAAI,YAAY,QAAQ,YAAY,EAAE,IAAI;AAC3G,UAAM,aAAgB,+BAAqB,mBAAmB,+BAAqB,YAAY,UAAU,CAAC;AAC1G,UAAM,qBAAsB,KAAK,yBAAyB;AAC1D,UAAM,YAAe,GAAG,cAAc;AACtC,UAAM,YAAe,KAAK,KAAK,KAAK,aAAa,SAAS;AAGhE,iCAAmB,UAAU,KAAK,aAAa,IAAI;AAEnD,SAAK,yBAAyB,SAAS;AACvC,SAAK,iBAAiB,WAAW,aAAa,YAAY,YAAY,kBAAkB;AAC1F;AACE,SAAK,OAAO,QAAQ,kFAA6E;AAC3F,SAAK,OAAO,KAAK,wBAAiB,SAAS,EAAE;AAC7C,SAAK,OAAO,KAAK,0BAAmB,WAAW,EAAE;AACjD,SAAK,OAAO,KAAK,yBAAkB,UAAU,EAAE;AAC/C,SAAK,OAAO,KAAK,gCAAoB,UAAU,EAAE;AAAA,EACxD;AACD;AAEA,IAAO,+BAAQ;AAGf,IAAI;AACH,MAAI,mBAAmB,QAAQ,KAAK,CAAC,CAAC,EAAE,IAAI;AAC5C,UAAQ,KAAK,CAAC;AACf,SACO,OAAY;AAClB,UAAQ,MAAM,OAAO,WAAW,EAAE;AAClC,UAAQ,KAAK,CAAC;AACf;;;AE3GA,OAAOA,SAAQ;AACf,OAAOC,WAAU;AA+BjB,IAAM,uBAAN,MAA2B;AAAA,EAClB,OAAe;AAAA,EACH,cAAsB;AAAA,EACzB,iBAAyB;AAAA,EACtB,eAAuB;AAAA,EAC1B,SAAqB,IAAI,oBAAW,KAAK,IAAI;AAAA,EAE9D,cAAc;AAAA,EAAC;AAAA,EAEJ,gBAAgB,YAAoB;AACxC,WAAOC,MAAK,KAAK,KAAK,cAAc,GAAG,+BAAqB,YAAY,UAAU,CAAC,uBAAuB;AAAA,EAC9G;AAAA;AAAA,EAGQ,0BACJ,YACA,MACA,oBACM;AACN,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,YAAY,EAAE,EAAE,MAAM,GAAG,EAAE;AAC9E,WAAO,GAAG,kBAAkB,IAAI,SAAS,IAAI,IAAI,UAAU,UAAU;AAAA,EACzE;AAAA;AAAA,EAGQ,oBACJ,YACA,mBACO;AACP,UAAM,gBAAgB,KAAK,gBAAgB,UAAU;AAErD,QAAI;AAEA,mCAAmB,UAAU,KAAK,cAAc,IAAI;AAEpD,MAAAC,IAAG;AAAA,QACC;AAAA,QACA,KAAK,UAAU,mBAAmB,MAAM,CAAC;AAAA,QACzC,EAAE,UAAU,QAAQ;AAAA,MACxB;AAEA,WAAK,OAAO,QAAQ,oCAA6B,aAAa,EAAE;AAChE,aAAO;AAAA,IACX,SAAS,OAAY;AACjB,WAAK,OAAO,MAAM,2CAAsC,aAAa,EAAE;AACvE,WAAK,OAAO,MAAM,OAAO,WAAW,KAAK;AACzC,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA,EAGQ,gCACJ,WACA,kBACA,gBACA,aACO;AACP,UAAM,EAAE,YAAY,WAAW,IAAI;AAEnC,UAAM,mBAAmBD,MAAK,SAAS,gBAAgB;AAEvD,UAAM,WAAW;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAEA,QAAI;AACA,MAAAC,IAAG,cAAc,WAAW,UAAU,EAAE,UAAU,QAAQ,CAAC;AAAA,IAC/D,SAAS,OAAO;AACZ,WAAK,OAAO,MAAM,+DAA0D,SAAS,EAAE;AACvF,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EACX;AAAA;AAAA,EAGQ,6BACJ,WACA,kBACA,gBACO;AACP,UAAM,EAAE,YAAY,WAAW,IAAI;AAEnC,UAAM,mBAAmBD,MAAK,SAAS,gBAAgB;AAEvD,UAAM,WAAW;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAEA,QAAI;AACA,MAAAC,IAAG,cAAc,WAAW,UAAU,EAAE,UAAU,QAAQ,CAAC;AAAA,IAC/D,SAAS,OAAO;AACZ,WAAK,OAAO,MAAM,4DAAuD,SAAS,EAAE;AACpF,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EACX;AAAA;AAAA,EAGQ,yBACJ,kBACA,gBACF;AACE,SAAK,OAAO,KAAK,4CAAqC,gBAAgB,EAAE;AAExE,UAAM,EAAE,YAAY,oBAAoB,WAAY,IAAI;AAExD,QAAI,CAAC,YAAY;AACb,WAAK,OAAO,MAAM,oCAA+B,gBAAgB,EAAE;AACnE;AAAA,IACJ;AAEA,UAAM,oBAAwB,+BAAqB,gBAAgB,cAAc;AACjF,UAAM,gBAAwB,KAAK,gBAAgB,UAAU;AAC7D,UAAM,YAAwB,CAACA,IAAG,WAAW,aAAa,IAAI,WAAW;AACzE,UAAM,sBAAwB,KAAK,0BAA0B,YAAY,WAAW,kBAAkB;AACtG,UAAM,sBAAwBD,MAAK,KAAK,KAAK,gBAAgB,mBAAmB;AAEhF,QAAI,yBAAkC;AAEtC,QAAI,CAACC,IAAG,WAAW,aAAa,GAAG;AAC/B,WAAK,OAAO,KAAK,2CAA2C,UAAU,QAAQ;AAC9E,+BAAyB,KAAK,6BAA6B,qBAAqB,kBAAkB,cAAc;AAAA,IACpH,OACK;AAED,WAAK,OAAO,KAAK,iDAA0C,aAAa,iCAA4B;AAEpG,YAAM,oBAA6C,KAAK,MAAMA,IAAG,aAAa,eAAe,OAAO,CAAC;AACrG,YAAM,OAA4B,yBAAe,oBAAoB,mBAAmB,iBAAiB;AAEzG,UACI,CAAC,KAAK,iBACN,CAAC,KAAK,QAAQ,MAAM,UACpB,CAAC,KAAK,QAAQ,QAAQ,UACtB,CAAC,OAAO,KAAK,KAAK,QAAQ,QAAQ,EAAE,UACpC,CAAC,KAAK,QAAQ,MAAM,UACpB,CAAC,KAAK,QAAQ,QAAQ,QACxB;AACE,aAAK,OAAO,KAAK,yCAA+B;AAChD,eAAO;AAAA,MACX;AAEA,+BAAyB,KAAK;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,wBAAwB;AACxB,WAAK,OAAO,QAAQ,kCAA6B,mBAAmB,EAAE;AAGtE,YAAM,mBAAmB,KAAK,oBAAoB,YAAY,iBAAiB;AAE/E,UAAI,CAAC,kBAAkB;AACnB,aAAK,OAAO,MAAM,kEAAwD,UAAU,GAAG;AAAA,MAC3F;AAAA,IACJ,OAAO;AACH,WAAK,OAAO,KAAK,gDAAsC,UAAU,IAAI;AAAA,IACzE;AACA,WAAO;AAAA,EAEX;AAAA;AAAA,EAGI,MAAY;AACZ,SAAK,OAAO,KAAK,4CAAqC,KAAK,WAAW,EAAE;AAGxE,iCAAmB,UAAU,KAAK,aAAa,IAAI;AACnD,iCAAmB,UAAU,KAAK,gBAAgB,IAAI;AAGtD,UAAM,eAAeA,IAAG,YAAY,KAAK,WAAW,EAAE,OAAO,UAAQ,KAAK,SAAS,KAAK,CAAC;AAEzF,QAAI,CAAC,aAAa,QAAQ;AACtB,WAAK,OAAO,KAAK,qCAA2B;AAC5C;AAAA,IACJ;AAEA,SAAK,OAAO,KAAK,gBAAW,aAAa,MAAM,kBAAkB;AAEjE,QAAI,gBAAkB;AACtB,QAAI,eAAkB;AAEtB,eAAW,QAAQ,cAAc;AAC7B,YAAM,YAAYD,MAAK,KAAK,KAAK,aAAa,IAAI;AAElD,UAAI;AAGA,cAAM,gBAAgB,UAAQ,SAAS;AAEvC,aAAK,OAAO,KAAK,2BAA2B,SAAS,EAAE;AAGvD,YAAI,eAAe,SAAS;AACxB,gBAAM,iBAAiB,cAAc;AACrC,eAAK,OAAO,KAAK,gBAAgB,gBAAgB,cAAc,KAAK,QAAQ;AAC5E,eAAK,OAAO,KAAK,eAAe,gBAAgB,cAAc,KAAK,EAAE;AACrE,eAAK,OAAO,KAAK,eAAe,gBAAgB,cAAc,KAAK,EAAE;AAGrE,gBAAM,UAAU,KAAK,yBAAyB,WAAW,cAAc;AAEvE,cAAI,SAAS;AAAE;AAAA,UAAiB;AAAA,QACpC,OAAO;AACH,eAAK,OAAO,MAAM,mDAAyC,SAAS,EAAE;AACtE;AAAA,QACJ;AAAA,MACJ,SACO,OAAY;AACf,aAAK,OAAO,MAAM,sCAAiC,SAAS,EAAE;AAC9D,aAAK,OAAO,MAAM,UAAU,OAAO,WAAW,KAAK,EAAE;AACrD;AAAA,MACJ;AAAA,IACJ;AAEA,SAAK,OAAO,QAAQ,yCAAkC;AACtD,SAAK,OAAO,QAAQ,2BAA2B,aAAa,EAAE;AAC9D,SAAK,OAAO,QAAQ,WAAW,YAAY,EAAE;AAAA,EACjD;AAEJ;AAEA,IAAO,iCAAQ;AAGf,IAAI;AACH,MAAI,qBAAqB,EAAE,IAAI;AAChC,SACO,OAAY;AAClB,UAAQ,MAAM,OAAO,WAAW,EAAE;AAClC,UAAQ,KAAK,CAAC;AACf;;;AClRA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AAEjB,SAAoC,iBAAiB;AAOrD,IAAM,wBAAN,MAA4B;AAAA,EAChB,cAAc;AAAA,EACL,iBAAyB;AAAA,EACzB,gBAAoC,6BAAoB,cAAc;AAAA,EACtE,SAAqB,IAAI,oBAAW,KAAK,WAAW;AAAA,EACpD;AAAA,EAEjB,cAAc;AACV,iCAAmB,UAAU,KAAK,gBAAgB,IAAI;AAEtD,SAAK,qBAAqB,KAAK,cAAc,QAAQ;AAAA,EACzD;AAAA;AAAA,EAGQ,kBAAkB,aAAgC;AACtD,UAAM,QAAQC,IAAG,YAAY,KAAK,cAAc,EAAE,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC;AAE/E,QAAI,aAAa;AACb,aAAO,MAAM,OAAO,OAAK,EAAE,YAAY,EAAE,SAAS,YAAY,YAAY,CAAC,CAAC;AAAA,IAChF;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,MAAc,kBAAkB;AAC5B,UAAM,iBAAoB,KAAK,mBAAmB,kBAAkB;AACpE,UAAM,cAAoB,MAAM,eAAe,cAAc;AAE7D,QAAI,CAAC,YAAY,SAAS,yBAAyB,GAAG;AAClD,WAAK,OAAO,KAAK,wCAAmC;AAEpD,YAAM,eAAe;AAAA,QACjB;AAAA,QACA;AAAA,UACI,MAAM;AAAA,YACF,MAAM,UAAU;AAAA,YAChB,WAAW;AAAA,YACX,YAAY;AAAA,UAChB;AAAA,QACJ;AAAA,MACJ;AAEA,WAAK,OAAO,QAAQ,qCAAgC;AAAA,IACxD;AAAA,EACJ;AAAA;AAAA,EAGA,MAAc,uBAA0C;AACpD,UAAM,CAAC,OAAO,IAAI,MAAM,KAAK,mBAAmB,MAAM,qBAAsB,yBAAyB,IAAK;AAC1G,WAAO,MAAM,QAAQ,OAAO,IAAI,QAAQ,IAAI,CAAC,MAAW,EAAE,IAAI,IAAI,CAAC;AAAA,EACvE;AAAA;AAAA,EAGA,MAAc,eAAe,WAAmB,WAAqC;AACjF,UAAM,iBAAiB,UAAQ,SAAS,GAAG;AAE3C,QAAI,CAAC,gBAAgB;AACjB,YAAM,UAAU,yCAAyC,SAAS;AAClE,WAAK,OAAO,MAAM,OAAO;AACzB,YAAM,IAAI,MAAM,OAAO;AAAA,IAC3B;AAEA,UAAM,qBAAqB,IAAI,eAAe;AAE9C,UAAM,iBAAiC,KAAK,mBAAmB,kBAAkB;AAEjF,QAAI,cAAc,MAAM;AACpB,YAAM,mBAAmB,GAAG,KAAK,kBAAkB,EAAE,gBAAgB,KAAK,kBAAkB;AAC5F,YAAM,KAAK,mBAAmB,kBAAkB,EAAE,WAAW,2BAA2B,CAAC,EAAE,MAAMC,MAAK,SAAS,SAAS,EAAE,CAAC,CAAC;AAAA,IAChI,OAAO;AACH,YAAM,mBAAmB,KAAK,KAAK,kBAAkB,EAAE,gBAAgB,KAAK,kBAAkB;AAC9F,YAAM,KAAK,mBAAmB,kBAAkB,EAAE,WAAW,2BAA2B,EAAE,MAAMA,MAAK,SAAS,SAAS,EAAE,CAAC;AAAA,IAC9H;AAAA,EACJ;AAAA;AAAA,EAGA,MAAa,IACT,WACA,aACA,gBACF;AACE,SAAK,OAAO,KAAK,qEAA+C,UAAU,YAAY,CAAC,aAAa,WAAW,WAAW,kBAAkB,KAAK,EAAE;AAEnJ,UAAM,KAAK,oBAAoB,aAAa;AAE5C,SAAK,OAAO,QAAQ,4BAAuB;AAE3C,UAAM,KAAK,gBAAgB;AAE3B,QAAI,QAAkB,CAAC;AAEvB,QAAI,gBAAgB;AAChB,YAAM,YAAYA,MAAK,KAAK,KAAK,gBAAgB,cAAc;AAE/D,UAAI,CAACD,IAAG,WAAW,SAAS,GAAE;AAC1B,cAAM,UAAU,6BAA6B,SAAS;AACtD,aAAK,OAAO,MAAM,OAAO;AACzB,cAAM,IAAI,MAAM,OAAO;AAAA,MAC3B;AAEA,cAAQ,CAAC,SAAS;AAAA,IACtB,OAAO;AACH,cAAQ,KAAK,kBAAkB,WAAW,EAAE,IAAI,OAAKC,MAAK,KAAK,KAAK,gBAAgB,CAAC,CAAC;AAAA,IAC1F;AAGA,UAAM,KAAK,CAAC,GAAG,MAAM;AACjB,YAAM,cAAc,CAAC,cAAsB;AACvC,cAAM,YAAY,UAAU,MAAM,GAAG,EAAE,IAAI,KAAK;AAChD,cAAM,QAAQ,UAAU,MAAM,SAAS;AACvC,eAAO,QAAQ,OAAO,MAAM,CAAC,CAAC,IAAI,OAAO;AAAA,MAC7C;AAEA,YAAM,aAAa,YAAY,CAAC;AAChC,YAAM,aAAa,YAAY,CAAC;AAEhC,aAAO,cAAc,OACf,aAAa,aACb,aAAa;AAAA,IACnB,CAAC;AAEL,UAAM,qBAAqB,MAAM,KAAK,qBAAqB;AAE3D,eAAW,QAAQ,OAAO;AACtB,YAAM,YAAYA,MAAK,SAAS,IAAI;AAEpC,UAAI,cAAc,QAAQ,mBAAmB,SAAS,SAAS,GAAG;AAC9D,aAAK,OAAO,KAAK,oDAA0C,SAAS,EAAE;AACtE;AAAA,MACJ;AACA,UAAI,cAAc,UAAU,CAAC,mBAAmB,SAAS,SAAS,GAAG;AACjE,aAAK,OAAO,KAAK,gDAAsC,SAAS,EAAE;AAClE;AAAA,MACJ;AAEA,WAAK,OAAO,KAAK,GAAG,cAAc,OAAO,aAAa,WAAW,eAAe,SAAS,EAAE;AAC3F,YAAM,KAAK,eAAe,MAAM,SAAS;AACzC,WAAK,OAAO,QAAQ,GAAG,cAAc,OAAO,YAAY,UAAU,eAAe,SAAS,EAAE;AAAA,IAChG;AAEA,SAAK,OAAO,QAAQ,wCAAiC;AAAA,EACzD;AAEJ;AAEA,IAAO,kCAAQ;AAAA,CAKd,YAAY;AACT,MAAI;AACA,UAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AAGjC,UAAM,gBAAoB,KAAK,KAAK,SAAO,IAAI,WAAW,cAAc,CAAC,KAAK;AAC9E,UAAM,aAAoB,KAAK,KAAK,SAAO,IAAI,WAAW,gBAAgB,CAAC;AAC3E,UAAM,WAAoB,KAAK,KAAK,SAAO,IAAI,WAAW,cAAc,CAAC;AAEzE,UAAM,YAAoB,cAAc,MAAM,GAAG,EAAE,CAAC;AACpD,UAAM,cAAoB,aAAa,WAAW,MAAM,GAAG,EAAE,CAAC,IAAI;AAClE,UAAM,iBAAoB,WAAW,SAAS,MAAM,GAAG,EAAE,CAAC,IAAI;AAE9D,QAAI,CAAC,CAAC,MAAM,MAAM,EAAE,SAAS,SAAS,GAAG;AACrC,YAAM,IAAI,MAAM,sBAAsB,SAAS,2BAA2B;AAAA,IAC9E;AAEA,UAAM,IAAI,sBAAsB,EAAE,IAAI,WAAW,aAAa,cAAc;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAClB,SAAS,OAAY;AACjB,YAAQ,MAAM,UAAK,OAAO,WAAW,KAAK;AAC1C,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,GAAG;;;ACvLH,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAWjB,IAAM,qBAAN,MAAyB;AAAA,EAChB,cAAsB;AAAA,EACb;AAAA,EACA;AAAA,EACA,cAAsB;AAAA,EACtB,cAAsB;AAAA,EACtB,SAAqB,IAAI,oBAAW,KAAK,WAAW;AAAA,EAElE,YAAY,cAAuB,mBAA4B;AACjE,QAAI,CAAC,gBAAgB,CAAC,mBAAmB;AACxC,YAAM,UAAU;AAChB,WAAK,OAAO,MAAM,OAAO;AACzB,YAAM,IAAI,MAAM,OAAO;AAAA,IACxB;AAEA,SAAK,eAAyB;AAC9B,SAAK,oBAAyB;AAAA,EAC/B;AAAA;AAAA,EAGW,yBAAyB,WAAyB;AAC5D,QAAIC,IAAG,WAAW,SAAS,GAAG;AAC7B,YAAM,UAAU,iCAA4B,SAAS;AACrD,WAAK,OAAO,MAAM,OAAO;AACzB,YAAM,IAAI,MAAM,OAAO;AAAA,IACxB;AAAA,EACD;AAAA;AAAA,EAGW,uBACJ,oBACM;AACN,UAAM,YAAiB,KAAK,IAAI;AAChC,UAAM,+BAAgC,KAAK,eAAe,kBAAkB;AAC5E,UAAM,eAAgC,+BAAqB,YAAY,KAAK,iBAAiB;AAE7F,WAAO,GAAG,4BAA4B,IAAI,YAAY,IAAI,SAAS;AAAA,EACvE;AAAA;AAAA,EAGK,eAAe,UAA0B;AAChD,WAAO,SAAS,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,EAC3C;AAAA;AAAA,EAGQ,iBACD,WACA,wBACA,YACI;AACV,UAAM,WAAW,0BAA0B,wBAAwB,UAAU;AAE7E,QAAI;AACH,MAAAA,IAAG,cAAc,WAAW,UAAU,EAAE,UAAU,QAAQ,CAAC;AAAA,IAC5D,SAAS,OAAO;AACf,WAAK,OAAO,MAAM,uCAAkC,SAAS,EAAE;AAC/D,YAAM;AAAA,IACP;AAAA,EACD;AAAA;AAAA,EAGU,MAAY;AAErB,UAAM,iBAAmB,+BAAqB,iBAAiB,KAAK,YAAY;AAChF,UAAM,mBAAqBC,MAAK,KAAK,KAAK,aAAa,GAAG,cAAc,KAAK;AAG7E,QAAI,CAACD,IAAG,WAAW,gBAAgB,GAAG;AACrC,YAAM,UAAU,iCAA4B,gBAAgB;AAC5D,WAAK,OAAO,MAAM,OAAO;AACzB,YAAM,IAAI,MAAM,OAAO;AAAA,IACxB;AAGA,UAAM,gBAAgB,UAAQ,gBAAgB,EAAE;AAEhD,QAAI,CAAC,eAAe;AACnB,YAAM,UAAU,sCAAiC,gBAAgB;AACjE,WAAK,OAAO,MAAM,OAAO;AACzB,YAAM,IAAI,MAAM,OAAO;AAAA,IACxB;AAGM,UAAM,EAAE,YAAY,YAAY,mBAAmB,IAAI;AAE7D,UAAM,mBAAuB,KAAK,uBAAuB,kBAAkB;AAC3E,UAAM,YAAuBC,MAAK,KAAK,KAAK,aAAa,gBAAgB;AACnE,UAAM,0BAAgC,+BAAqB,aAAa,KAAK,iBAAiB;AAGpG,iCAAmB,UAAU,KAAK,aAAa,IAAI;AAEnD,SAAK,yBAAyB,SAAS;AACvC,SAAK,iBAAkB,WAAW,yBAAyB,UAAU;AAErE,SAAK,OAAO,QAAQ,uCAAkC,gBAAgB,EAAE;AACxE,SAAK,OAAO,KAAK,wBAAiB,SAAS,EAAE;AAC7C,SAAK,OAAO,KAAK,yBAAkB,UAAU,EAAE;AAC/C,SAAK,OAAO,KAAK,+BAAmB,UAAU,EAAE;AAChD,SAAK,OAAO,KAAK,iCAA0B,kBAAkB,EAAE;AAAA,EAChE;AAED;AAEA,IAAO,+BAAQ;;;ACpHf,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAoC,aAAAC,kBAAiB;AAOrD,IAAM,qBAAN,MAAyB;AAAA,EACb,cAAc;AAAA,EACL,cAAsB;AAAA,EACtB,gBAAoC,6BAAoB,cAAc;AAAA,EACtE,SAAqB,IAAI,oBAAW,KAAK,WAAW;AAAA,EACpD;AAAA,EAEjB,cAAc;AACV,iCAAmB,UAAU,KAAK,aAAa,IAAI;AAEnD,SAAK,qBAAqB,KAAK,cAAc,QAAQ;AAAA,EACzD;AAAA;AAAA,EAGQ,eAAe,aAAgC;AACnD,QAAI,QAAQC,IAAG,YAAY,KAAK,WAAW,EAAE,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC;AAC1E,QAAI,aAAa;AACb,cAAQ,MAAM,OAAO,OAAK,EAAE,YAAY,EAAE,SAAS,YAAY,YAAY,CAAC,CAAC;AAAA,IACjF;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,MAAc,kBAAkB;AAC5B,UAAM,iBAAoB,KAAK,mBAAmB,kBAAkB;AACpE,UAAM,SAAoB,MAAM,eAAe,cAAc;AAE7D,QAAI,CAAC,OAAO,SAAS,gCAAgC,GAAG;AACpD,WAAK,OAAO,KAAK,sDAAiD;AAClE,YAAM,eAAe,YAAY,kCAAkC;AAAA,QAC/D,MAAM,EAAE,MAAMC,WAAU,QAAQ,WAAW,OAAO,YAAY,KAAK;AAAA,MACvE,CAAC;AACD,WAAK,OAAO,QAAQ,2CAAsC;AAAA,IAC9D;AAAA,EACJ;AAAA;AAAA,EAGA,MAAc,oBAAuC;AACjD,UAAM,CAAC,OAAO,IAAI,MAAM,KAAK,mBAAmB,MAAM,qBAAqB,gCAAgC,IAAI;AAC/G,WAAO,MAAM,QAAQ,OAAO,IAAI,QAAQ,IAAI,CAAC,MAAW,EAAE,IAAI,IAAI,CAAC;AAAA,EACvE;AAAA;AAAA,EAGA,MAAc,YACV,WACA,WACF;AACE,UAAM,cAAc,UAAQ,SAAS,GAAG;AAExC,QAAI,CAAC,aAAa;AACd,YAAM,IAAI,MAAM,sCAAsC,SAAS,EAAE;AAAA,IACrE;AAEA,UAAM,kBAAkB,IAAI,YAAY;AACxC,UAAM,iBAAiC,KAAK,mBAAmB,kBAAkB;AAEjF,QAAI,cAAc,MAAM;AACpB,YAAM,gBAAgB,GAAG,gBAAgB,KAAK,kBAAkB;AAChE,YAAM,eAAe,WAAW,kCAAkC,CAAC,EAAE,MAAMC,MAAK,SAAS,SAAS,EAAE,CAAC,CAAC;AAAA,IAC1G,OAAO;AACH,YAAM,gBAAgB,KAAK,gBAAgB,KAAK,kBAAkB;AAClE,YAAM,eAAe,WAAW,kCAAkC,EAAE,MAAMA,MAAK,SAAS,SAAS,EAAE,CAAC;AAAA,IACxG;AAAA,EACJ;AAAA;AAAA,EAGA,MAAa,IACT,WACA,aACA,aACF;AACE,QAAI;AACA,WAAK,OAAO,KAAK,kEAA4C,UAAU,YAAY,CAAC,aAAa,eAAe,KAAK,WAAW,eAAe,MAAM,EAAE;AAEvJ,YAAM,KAAK,oBAAoB,aAAa;AAE5C,WAAK,OAAO,QAAQ,4BAAuB;AAE3C,YAAM,KAAK,gBAAgB;AAE3B,UAAI,QAAkB,CAAC;AAEvB,UAAI,aAAa;AACb,cAAM,YAAYA,MAAK,KAAK,KAAK,aAAa,WAAW;AAEzD,YAAI,CAACF,IAAG,WAAW,SAAS,GAAG;AAC3B,eAAK,OAAO,MAAM,0BAA0B,SAAS,EAAE;AACvD,gBAAM,IAAI,MAAM,0BAA0B,SAAS,EAAE;AAAA,QACzD;AAEA,gBAAQ,CAAC,SAAS;AAAA,MACtB,OAAO;AACH,gBAAQ,KAAK,eAAe,WAAW,EAAE,IAAI,OAAKE,MAAK,KAAK,KAAK,aAAa,CAAC,CAAC;AAAA,MACpF;AAGA,YAAM,KAAK,CAAC,GAAG,MAAO,cAAc,OAAO,EAAE,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,CAAE;AAEnF,YAAM,kBAAkB,MAAM,KAAK,kBAAkB;AAErD,iBAAW,QAAQ,OAAO;AACtB,cAAM,YAAYA,MAAK,SAAS,IAAI;AAEpC,YAAI,cAAc,QAAQ,gBAAgB,SAAS,SAAS,GAAG;AAC3D,eAAK,OAAO,KAAK,iDAAuC,SAAS,EAAE;AACnE;AAAA,QACJ;AAEA,YAAI,cAAc,UAAU,CAAC,gBAAgB,SAAS,SAAS,GAAG;AAC9D,eAAK,OAAO,KAAK,6CAAmC,SAAS,EAAE;AAC/D;AAAA,QACJ;AAEA,aAAK,OAAO,KAAK,GAAG,cAAc,OAAO,aAAa,WAAW,YAAY,SAAS,EAAE;AACxF,cAAM,KAAK,YAAY,MAAM,SAAS;AACtC,aAAK,OAAO,QAAQ,GAAG,cAAc,OAAO,YAAY,UAAU,YAAY,SAAS,EAAE;AAAA,MAC7F;AAEA,WAAK,OAAO,QAAQ,qCAA8B;AAAA,IACtD,SACO,OAAY;AACf,WAAK,OAAO,MAAM,UAAK,OAAO,OAAO,IAAI,EAAE,MAAM,CAAC;AAClD,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAEJ;AAEA,IAAO,+BAAQ;AAAA,CAKd,YAAY;AACT,MAAI;AACA,UAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AAEjC,UAAM,gBAAgB,KAAK,KAAK,SAAO,IAAI,WAAW,cAAc,CAAC,KAAK;AAC1E,UAAM,aAAa,KAAK,KAAK,SAAO,IAAI,WAAW,WAAW,CAAC;AAC/D,UAAM,WAAW,KAAK,KAAK,SAAO,IAAI,WAAW,cAAc,CAAC;AAEhE,UAAM,YAAY,cAAc,MAAM,GAAG,EAAE,CAAC;AAC5C,UAAM,cAAc,aAAa,WAAW,MAAM,GAAG,EAAE,CAAC,IAAI;AAC5D,UAAM,cAAc,WAAW,SAAS,MAAM,GAAG,EAAE,CAAC,IAAI;AAExD,QAAI,CAAC,CAAC,MAAM,MAAM,EAAE,SAAS,SAAS,GAAG;AACrC,YAAM,IAAI,MAAM,sBAAsB,SAAS,2BAA2B;AAAA,IAC9E;AAEA,UAAM,IAAI,mBAAmB,EAAE,IAAI,WAAW,aAAa,WAAW;AACtE,YAAQ,KAAK,CAAC;AAAA,EAClB,SACO,OAAY;AACf,YAAQ,MAAM,UAAK,OAAO,OAAO,IAAI,EAAE,MAAM,CAAC;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,GAAG;;;AC/JH,IAAe,gBAAf,MAA0C;AAAA,EAI5B,YACa,gBACrB;AADqB;AAEnB,SAAK,SAAS,IAAI,oBAAW,cAAc;AAAA,EAC/C;AAAA,EAPgB,cAAc,yBAAe,YAAY;AAAA,EACzC;AAUpB;AAEA,IAAO,yBAAQ;;;ACpBf,SAAS,aAAAC,kBAA0B;AAKnC,IAAM,qBAAN,MAAM,4BAA2B,uBAAyB;AAAA,EACtD,OAAe;AAAA,EACf,OAAe,cAAsC,oBAAI,IAAI;AAAA,EAErD,cAAc;AAClB,UAAM,qBAAqB;AAAA,EAC/B;AAAA,EAEA,OAAc,cAAkC;AAC5C,QAAI,CAAC,oBAAmB,UAAU;AAC9B,0BAAmB,WAAW,IAAI,oBAAmB;AAAA,IACzD;AACA,WAAO,oBAAmB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,CAAC,KAAa,WAA0B;AAChE,QAAI;AACA,YAAM,YAAY,2BAAiB,OAAO,GAAG;AAE7C,UAAI,OAAO,WAAW,UAAU;AAC5B,aAAK,OAAO,KAAK,QAAQ,MAAM,OAAO,SAAS,EAAE;AAAA,MACrD,OAAO;AACH,aAAK,OAAO,KAAK,SAAS,SAAS,EAAE;AAAA,MACzC;AAAA,IACJ,SAAS,OAAO;AACZ,WAAK,OAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC;AAAA,IAC1D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAMO,QAAQ,UAAsC,CAAC,GAAc;AAChE,WAAO,KAAK,aAAa,QAAQ,QAAQ,WAAW,OAAO;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAMO,aACH,MACA,UAAsC,CAAC,GAC9B;AACT,QAAI,oBAAmB,YAAY,IAAI,IAAI,GAAG;AAC1C,aAAO,oBAAmB,YAAY,IAAI,IAAI;AAAA,IAClD;AAEA,UAAM,UAAoB,QAAQ,WAAW,KAAK,YAAY,UAAmB,cAAc,UAAU;AACzG,UAAM,kBAAoB,QAAQ,WAAW,KAAK,YAAY,UAAmB,cAAc,KAAK;AACpG,UAAM,UAAoB,kBAAkB,KAAK,oBAAoB;AACrE,UAAM,WAAoB,QAAQ,YAAY,KAAK,YAAY,UAAkB,SAAS;AAC1F,UAAM,WAAoB,QAAQ,YAAY,KAAK,YAAY,UAAkB,SAAS;AAC1F,UAAM,WAAoB,QAAQ,YAAY,KAAK,YAAY,UAAkB,aAAa;AAC9F,UAAM,OAAoB,QAAQ,QAAQ,KAAK,YAAY,UAAkB,SAAS;AACtF,UAAM,OAAoB,QAAQ,QAAQ,KAAK,YAAY,UAAkB,WAAW,IAAI;AAG5F,UAAM,YAAY,IAAIC,WAAU;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,IACf,CAAC;AAED,wBAAmB,YAAY,IAAI,MAAM,SAAS;AAElD,SAAK,OAAO,QAAQ,+BAA0B,IAAI,GAAG;AAErD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAMO,cAAc,OAAO,WAAkC;AAC1D,WAAO,oBAAmB,YAAY,IAAI,IAAI;AAAA,EAClD;AAAA,EAEO,cAAc,OAAO,WAAoB;AAC5C,WAAO,oBAAmB,YAAY,IAAI,IAAI;AAAA,EAClD;AAAA,EAEA,MAAa,gBAAgB,OAAO,WAA0B;AAC1D,UAAM,OAAO,oBAAmB,YAAY,IAAI,IAAI;AACpD,QAAI,MAAM;AACN,YAAM,KAAK,MAAM;AACjB,0BAAmB,YAAY,OAAO,IAAI;AAC1C,WAAK,OAAO,KAAK,0CAAmC,IAAI,GAAG;AAAA,IAC/D;AAAA,EACJ;AAAA,EAEA,MAAa,WAA0B;AACnC,eAAW,CAAC,MAAM,IAAI,KAAK,oBAAmB,YAAY,QAAQ,GAAG;AACjE,YAAM,KAAK,MAAM;AACjB,WAAK,OAAO,KAAK,0CAAmC,IAAI,GAAG;AAAA,IAC/D;AACA,wBAAmB,YAAY,MAAM;AAAA,EACzC;AACJ;AAEA,IAAO,8BAAQ;","names":["fs","path","path","fs","fs","path","fs","path","fs","path","fs","path","fs","path","DataTypes","fs","DataTypes","path","Sequelize","Sequelize"]}
@@ -1,4 +1,4 @@
1
- import { DataType } from 'sequelize';
1
+ import { DataType, Dialect } from 'sequelize';
2
2
 
3
3
  interface SchemaColumnInterface {
4
4
  type: DataType;
@@ -90,4 +90,15 @@ interface MigrationRecordInterface {
90
90
  type MigrationOperationTypes = "up" | "down";
91
91
  type SeederOperationTypes = "up" | "down";
92
92
 
93
- export type { ColumnDiffInterface as C, IndexDiffInterface as I, MigrationOperationTypes as M, SchemaColumnInterface as S, IndexFieldOptionsInterface as a, MigrationRecordInterface as b, SchemaDefinitionInterface as c, SchemaDiffInterface as d, SchemaSnapshotInterface as e, SeederOperationTypes as f };
93
+ interface SequelizeConnectionOptions {
94
+ name?: string;
95
+ database?: string;
96
+ username?: string;
97
+ password?: string;
98
+ host?: string;
99
+ port?: number;
100
+ dialect?: Dialect;
101
+ logging?: boolean;
102
+ }
103
+
104
+ export type { ColumnDiffInterface as C, IndexDiffInterface as I, MigrationOperationTypes as M, SchemaColumnInterface as S, IndexFieldOptionsInterface as a, MigrationRecordInterface as b, SchemaDefinitionInterface as c, SchemaDiffInterface as d, SchemaSnapshotInterface as e, SeederOperationTypes as f, SequelizeConnectionOptions as g };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { C as ColumnDiffInterface, I as IndexDiffInterface, a as IndexFieldOptionsInterface, M as MigrationOperationTypes, b as MigrationRecordInterface, S as SchemaColumnInterface, c as SchemaDefinitionInterface, d as SchemaDiffInterface, e as SchemaSnapshotInterface, f as SeederOperationTypes } from './migration_type-XLMG0zzO.js';
1
+ export { C as ColumnDiffInterface, I as IndexDiffInterface, a as IndexFieldOptionsInterface, M as MigrationOperationTypes, b as MigrationRecordInterface, S as SchemaColumnInterface, c as SchemaDefinitionInterface, d as SchemaDiffInterface, e as SchemaSnapshotInterface, f as SeederOperationTypes, g as SequelizeConnectionOptions } from './database_type-TaZge-7g.js';
2
2
  export { C as CountLookupItemInterface, E as EnvConfigInterface, a as ErrorHandlingStrategyEnum, L as LogEntryInterface, b as LogLevelType, P as PaginationResultInterface, S as ServerErrorInterface } from './util_type-Yyo1nXmm.js';
3
3
  export { C as CookieManagerOptions, a as CorsOptions, b as CorsOriginResolver, F as ForceHTTPSOptions, R as RateLimitRecord, c as RateLimiterOptions, d as ResponseFormatterOptions, S as SecureHeadersOptions } from './middle_ware_type-D8LA7qF3.js';
4
4
  import 'sequelize';
@@ -9,7 +9,7 @@ import {
9
9
  input_validator_util_default,
10
10
  logger_util_default,
11
11
  safe_execute_util_default
12
- } from "../chunk-SI4SUH2O.js";
12
+ } from "../chunk-XUYXE74J.js";
13
13
  import {
14
14
  __decorateClass
15
15
  } from "../chunk-6AJLW7HC.js";
@@ -1,4 +1,4 @@
1
- export { C as ColumnDiffInterface, I as IndexDiffInterface, a as IndexFieldOptionsInterface, M as MigrationOperationTypes, b as MigrationRecordInterface, S as SchemaColumnInterface, c as SchemaDefinitionInterface, d as SchemaDiffInterface, e as SchemaSnapshotInterface, f as SeederOperationTypes } from '../migration_type-XLMG0zzO.js';
1
+ export { C as ColumnDiffInterface, I as IndexDiffInterface, a as IndexFieldOptionsInterface, M as MigrationOperationTypes, b as MigrationRecordInterface, S as SchemaColumnInterface, c as SchemaDefinitionInterface, d as SchemaDiffInterface, e as SchemaSnapshotInterface, f as SeederOperationTypes, g as SequelizeConnectionOptions } from '../database_type-TaZge-7g.js';
2
2
  export { C as CountLookupItemInterface, E as EnvConfigInterface, a as ErrorHandlingStrategyEnum, L as LogEntryInterface, b as LogLevelType, P as PaginationResultInterface, S as ServerErrorInterface } from '../util_type-Yyo1nXmm.js';
3
3
  export { C as CookieManagerOptions, a as CorsOptions, b as CorsOriginResolver, F as ForceHTTPSOptions, R as RateLimitRecord, c as RateLimiterOptions, d as ResponseFormatterOptions, S as SecureHeadersOptions } from '../middle_ware_type-D8LA7qF3.js';
4
4
  import 'sequelize';
@@ -7,7 +7,7 @@ import {
7
7
  safe_execute_util_default,
8
8
  server_util_default,
9
9
  sql_formatter_util_default
10
- } from "../chunk-SI4SUH2O.js";
10
+ } from "../chunk-XUYXE74J.js";
11
11
  import "../chunk-6AJLW7HC.js";
12
12
  export {
13
13
  env_manager_util_default as EnvManagerUtil,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fiberx-backend-toolkit",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
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",