web-mojo 2.2.11 → 2.2.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin.cjs.js +1 -1
- package/dist/admin.cjs.js.map +1 -1
- package/dist/admin.es.js +473 -491
- package/dist/admin.es.js.map +1 -1
- package/dist/auth.cjs.js +1 -1
- package/dist/auth.es.js +1 -1
- package/dist/charts.cjs.js +1 -1
- package/dist/charts.es.js +4 -4
- package/dist/chunks/{ChatView-BxIeRwBQ.js → ChatView-DGulpthL.js} +2 -2
- package/dist/chunks/{ChatView-BxIeRwBQ.js.map → ChatView-DGulpthL.js.map} +1 -1
- package/dist/chunks/{ChatView-DIzLD6LF.js → ChatView-eFzjsHBL.js} +9 -9
- package/dist/chunks/{ChatView-DIzLD6LF.js.map → ChatView-eFzjsHBL.js.map} +1 -1
- package/dist/chunks/{Collection-BgX6OcUC.js → Collection-BlP54kxB.js} +2 -2
- package/dist/chunks/{Collection-BgX6OcUC.js.map → Collection-BlP54kxB.js.map} +1 -1
- package/dist/chunks/{Collection-BcCcol8p.js → Collection-CTkDG1NZ.js} +2 -2
- package/dist/chunks/{Collection-BcCcol8p.js.map → Collection-CTkDG1NZ.js.map} +1 -1
- package/dist/chunks/{ContextMenu-C4_MWleT.js → ContextMenu-BH5SaDXX.js} +2 -2
- package/dist/chunks/{ContextMenu-C4_MWleT.js.map → ContextMenu-BH5SaDXX.js.map} +1 -1
- package/dist/chunks/{ContextMenu-DYLw4o0S.js → ContextMenu-Capwv7d-.js} +3 -3
- package/dist/chunks/{ContextMenu-DYLw4o0S.js.map → ContextMenu-Capwv7d-.js.map} +1 -1
- package/dist/chunks/{DataView-i7kpJjVQ.js → DataView-BpXdthN2.js} +2 -2
- package/dist/chunks/{DataView-i7kpJjVQ.js.map → DataView-BpXdthN2.js.map} +1 -1
- package/dist/chunks/{DataView-BYNjIf--.js → DataView-R_LkYBAw.js} +2 -2
- package/dist/chunks/{DataView-BYNjIf--.js.map → DataView-R_LkYBAw.js.map} +1 -1
- package/dist/chunks/{Dialog-DX5h2QA9.js → Dialog--hl_Uh6X.js} +2 -2
- package/dist/chunks/{Dialog-DX5h2QA9.js.map → Dialog--hl_Uh6X.js.map} +1 -1
- package/dist/chunks/{Dialog-Cu_Dx46k.js → Dialog-RzLLLfJD.js} +5 -5
- package/dist/chunks/{Dialog-Cu_Dx46k.js.map → Dialog-RzLLLfJD.js.map} +1 -1
- package/dist/chunks/{FormView-B_90L1RY.js → FormView--WuITh01.js} +2 -2
- package/dist/chunks/{FormView-B_90L1RY.js.map → FormView--WuITh01.js.map} +1 -1
- package/dist/chunks/{FormView-Bwofbd8S.js → FormView-C1emfj3B.js} +2 -2
- package/dist/chunks/{FormView-Bwofbd8S.js.map → FormView-C1emfj3B.js.map} +1 -1
- package/dist/chunks/{ListView-PvjChHYI.js → ListView-CNkYumcc.js} +5 -5
- package/dist/chunks/ListView-CNkYumcc.js.map +1 -0
- package/dist/chunks/{ListView-OWwlcGGg.js → ListView-O9AO02Rf.js} +2 -2
- package/dist/chunks/ListView-O9AO02Rf.js.map +1 -0
- package/dist/chunks/{MetricsMiniChartWidget-vXr5pxpm.js → MetricsMiniChartWidget-DoxqoF1X.js} +2 -2
- package/dist/chunks/{MetricsMiniChartWidget-vXr5pxpm.js.map → MetricsMiniChartWidget-DoxqoF1X.js.map} +1 -1
- package/dist/chunks/{MetricsMiniChartWidget-DL5stA6A.js → MetricsMiniChartWidget-DyVs4Wt0.js} +4 -4
- package/dist/chunks/{MetricsMiniChartWidget-DL5stA6A.js.map → MetricsMiniChartWidget-DyVs4Wt0.js.map} +1 -1
- package/dist/chunks/{PDFViewer-DSmi78S6.js → PDFViewer-BxFcG82d.js} +2 -2
- package/dist/chunks/{PDFViewer-DSmi78S6.js.map → PDFViewer-BxFcG82d.js.map} +1 -1
- package/dist/chunks/{PDFViewer--jlqnuVw.js → PDFViewer-CHX2NLkG.js} +3 -3
- package/dist/chunks/{PDFViewer--jlqnuVw.js.map → PDFViewer-CHX2NLkG.js.map} +1 -1
- package/dist/chunks/{Rest-ChN4Ntac.js → Rest-0oRgqNjX.js} +16 -1
- package/dist/chunks/Rest-0oRgqNjX.js.map +1 -0
- package/dist/chunks/Rest-P-KCJpjB.js +2 -0
- package/dist/chunks/Rest-P-KCJpjB.js.map +1 -0
- package/dist/chunks/{TokenManager-DC1jXSK4.js → TokenManager-CBXqj6Iw.js} +5 -5
- package/dist/chunks/{TokenManager-DC1jXSK4.js.map → TokenManager-CBXqj6Iw.js.map} +1 -1
- package/dist/chunks/{TokenManager-CEOPgnsw.js → TokenManager-CCfcK4aA.js} +2 -2
- package/dist/chunks/{TokenManager-CEOPgnsw.js.map → TokenManager-CCfcK4aA.js.map} +1 -1
- package/dist/chunks/{WebSocketClient-JHjYcYbU.js → WebSocketClient-BbPsISrp.js} +2 -2
- package/dist/chunks/{WebSocketClient-JHjYcYbU.js.map → WebSocketClient-BbPsISrp.js.map} +1 -1
- package/dist/chunks/{WebSocketClient-bLYhu2Wv.js → WebSocketClient-D53hpvM8.js} +2 -2
- package/dist/chunks/{WebSocketClient-bLYhu2Wv.js.map → WebSocketClient-D53hpvM8.js.map} +1 -1
- package/dist/chunks/{version-CM7fRavU.js → version-DCTYSNWj.js} +4 -4
- package/dist/chunks/{version-CM7fRavU.js.map → version-DCTYSNWj.js.map} +1 -1
- package/dist/chunks/{version-CAOxcUyu.js → version-DnlcM3tJ.js} +2 -2
- package/dist/chunks/{version-CAOxcUyu.js.map → version-DnlcM3tJ.js.map} +1 -1
- package/dist/docit.cjs.js +1 -1
- package/dist/docit.es.js +6 -6
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +15 -15
- package/dist/lightbox.cjs.js +1 -1
- package/dist/lightbox.es.js +5 -5
- package/dist/map.cjs.js +1 -1
- package/dist/map.es.js +2 -2
- package/dist/timeline.cjs.js +1 -1
- package/dist/timeline.es.js +4 -4
- package/package.json +1 -1
- package/dist/chunks/ListView-OWwlcGGg.js.map +0 -1
- package/dist/chunks/ListView-PvjChHYI.js.map +0 -1
- package/dist/chunks/Rest-ChN4Ntac.js.map +0 -1
- package/dist/chunks/Rest-DhD-U1vp.js +0 -2
- package/dist/chunks/Rest-DhD-U1vp.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rest-0oRgqNjX.js","sources":["../../src/core/utils/DataFormatter.js","../../src/core/utils/MOJOUtils.js","../../src/core/utils/mustache.js","../../src/core/mixins/EventDelegate.js","../../src/core/mixins/EventEmitter.js","../../src/core/View.js","../../src/core/Rest.js"],"sourcesContent":["/**\n * DataFormatter - Universal data formatting utility for MOJO Framework\n * Provides consistent formatting with clean APIs and pipe syntax support\n * @version 1.0.0\n */\n\n// A generic, gray, person icon SVG, encoded as a Base64 data URI.\n// This is used as a fallback for the avatar formatter when no image URL is provided.\nconst GENERIC_AVATAR_SVG = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI2NlZDRkYSI+PHBhdGggZD0iTTEyIDEyYzIuMjEgMCA0LTEuNzkgNC00cy0xLjc5LTQtNC00LTQgMS43OS00IDQgMS43OSA0IDQgNHptMCAyYy0yLjY3IDAtOCAxLjM0LTggNHYyaDE2di0yYzAtMi42Ni01LjMzLTQtOC00eiIvPjwvc3ZnPg==';\n\nclass DataFormatter {\n constructor() {\n this.formatters = new Map();\n this.registerBuiltInFormatters();\n }\n\n escapeHtml(str) {\n if (str === null || str === undefined) {\n return '';\n }\n const map = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n return String(str).replace(/[&<>\"']/g, (m) => map[m]);\n }\n\n /**\n * Register all built-in formatters\n */\n registerBuiltInFormatters() {\n // Date/Time formatters\n this.register('date', this.date.bind(this));\n this.register('time', this.time.bind(this));\n this.register('datetime', this.datetime.bind(this));\n this.register('datetime_tz', this.datetime_tz.bind(this));\n this.register('datatime_tz', this.datetime_tz.bind(this)); // Alias for common typo\n this.register('date_range', this.date_range.bind(this));\n this.register('datetime_range', this.datetime_range.bind(this));\n this.register('relative', this.relative.bind(this));\n this.register('fromNow', this.relative.bind(this)); // Alias\n this.register('relative_short', this.relative_short.bind(this)); // Alias for short relative time\n this.register('iso', this.iso.bind(this));\n this.register('epoch', (v) => {\n if (v === null || v === undefined || v === '') return v;\n const num = parseFloat(v);\n if (isNaN(num)) return v;\n // Convert seconds to milliseconds\n return num * 1000;\n });\n\n // Number formatters\n this.register('number', this.number.bind(this));\n this.register('currency', this.currency.bind(this));\n this.register('percent', this.percent.bind(this));\n this.register('filesize', this.filesize.bind(this));\n this.register('ordinal', this.ordinal.bind(this));\n this.register('compact', this.compact.bind(this));\n \n // Math formatters\n this.register('add', this.add.bind(this));\n this.register('subtract', this.subtract.bind(this));\n this.register('multiply', this.multiply.bind(this));\n this.register('divide', this.divide.bind(this));\n this.register('sub', this.subtract.bind(this)); // Alias\n this.register('mult', this.multiply.bind(this)); // Alias\n this.register('div', this.divide.bind(this)); // Alias\n\n // String formatters\n this.register('uppercase', (v) => String(v).toUpperCase());\n this.register('lowercase', (v) => String(v).toLowerCase());\n this.register('upper', (v) => String(v).toUpperCase());\n this.register('lower', (v) => String(v).toLowerCase());\n this.register('capitalize', this.capitalize.bind(this));\n this.register('caps', this.capitalize.bind(this));\n this.register('truncate', this.truncate.bind(this));\n this.register('truncate_middle', this.truncate_middle.bind(this));\n this.register('truncate_front', this.truncate_front.bind(this));\n this.register('slug', this.slug.bind(this));\n this.register('initials', this.initials.bind(this));\n this.register('mask', this.mask.bind(this));\n this.register('hex', this.hex.bind(this));\n this.register('tohex', this.hex.bind(this));\n this.register('unhex', this.unhex.bind(this));\n this.register('fromhex', this.unhex.bind(this));\n\n // HTML/Web formatters\n this.register('email', this.email.bind(this));\n this.register('phone', this.phone.bind(this));\n this.register('url', this.url.bind(this));\n this.register('badge', this.badge.bind(this));\n this.register('badgeClass', this.badgeClass.bind(this));\n this.register('status', this.status.bind(this));\n this.register('status_text', this.status_text.bind(this));\n this.register('status_icon', this.status_icon.bind(this));\n this.register('boolean', this.boolean.bind(this));\n this.register('bool', this.boolean.bind(this));\n this.register('yesno', (v) => this.boolean(v, 'Yes', 'No'));\n this.register('yesnoicon', this.yesnoicon.bind(this));\n this.register('icon', this.icon.bind(this));\n this.register('avatar', this.avatar.bind(this));\n this.register('image', this.image.bind(this));\n this.register('tooltip', this.tooltip.bind(this));\n this.register('linkify', this.linkify.bind(this));\n this.register('clipboard', this.clipboard.bind(this));\n\n // Utility formatters\n this.register('default', this.default.bind(this));\n this.register('equals', this.equals.bind(this));\n this.register('json', this.json.bind(this));\n this.register('raw', (v) => v);\n this.register('custom', (v, fn) => typeof fn === 'function' ? fn(v) : v);\n this.register('iter', this.iter.bind(this));\n this.register('keys', (v) => {\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n return Object.keys(v);\n }\n return null;\n });\n this.register('values', (v) => {\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n return Object.values(v);\n }\n return null;\n });\n\n // Text/Content formatters\n this.register('plural', this.plural.bind(this));\n this.register('list', this.formatList.bind(this));\n this.register('duration', this.duration.bind(this));\n this.register('hash', this.hash.bind(this));\n this.register('stripHtml', this.stripHtml.bind(this));\n this.register('highlight', this.highlight.bind(this));\n this.register('nl2br', this.nl2br.bind(this));\n this.register('code', this.code.bind(this));\n this.register('pre', (v) => `<pre class=\"bg-light p-2 rounded border\">${this.escapeHtml(String(v))}</pre>`);\n }\n\n relative_short(value) {\n return this.relative(value, true);\n }\n\n linkify(value, options = {}) {\n if (value === null || value === undefined) return '';\n const text = String(value);\n const escaped = this.escapeHtml(text);\n const defaults = { urls: true, emails: true, target: '_blank', rel: 'noopener noreferrer' };\n const opts = (options && typeof options === 'object') ? { ...defaults, ...options } : defaults;\n\n let result = escaped;\n\n // URLs: http(s):// and www.\n if (opts.urls !== false) {\n const urlRegex = /(^|\\s)((?:https?:\\/\\/|www\\.)[^\\s<]+)/gi;\n result = result.replace(urlRegex, (match, prefix, url) => {\n const href = url.startsWith('www.') ? `https://${url}` : url;\n return `${prefix}<a href=\"${href}\" target=\"${opts.target}\" rel=\"${opts.rel}\">${url}</a>`;\n });\n }\n\n // Emails\n if (opts.emails !== false) {\n const emailRegex = /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi;\n result = result.replace(emailRegex, (email) => `<a href=\"mailto:${email}\">${email}</a>`);\n }\n\n return result;\n }\n\n clipboard(value, mode = 'text') {\n if (value === null || value === undefined) return '';\n const text = String(value);\n const escapedText = this.escapeHtml(text);\n const showText = mode !== 'icon-only';\n\n const buttonHtml = `\n <button type=\"button\"\n class=\"btn btn-sm btn-outline-secondary ms-1 p-0 border-0 bg-transparent\"\n title=\"Copy\"\n data-bs-toggle=\"tooltip\"\n data-action=\"copy-to-clipboard\"\n data-clipboard=\"${escapedText}\">\n <i class=\"bi bi-clipboard\"></i>\n </button>`.trim();\n\n return `\n <span class=\"mojo-clipboard d-inline-flex align-items-center\">\n ${showText ? `<span class=\"font-monospace\">${escapedText}</span>` : ''}\n ${buttonHtml}\n </span>\n `;\n }\n\n nl2br(value) {\n if (value === null || value === undefined) return '';\n return this.escapeHtml(String(value)).replace(/\\r\\n|\\r|\\n/g, '<br>');\n }\n\n code(value, lang = '') {\n if (value === null || value === undefined) return '';\n const language = lang ? `language-${this.escapeHtml(String(lang))}` : '';\n const content = this.escapeHtml(String(value));\n return `<pre class=\"bg-light p-2 rounded border\"><code class=\"${language}\">${content}</code></pre>`;\n }\n\n /**\n * Register a custom formatter\n * @param {string} name - Formatter name\n * @param {Function} formatter - Formatter function\n * @returns {DataFormatter} This instance for chaining\n */\n register(name, formatter) {\n if (typeof formatter !== 'function') {\n throw new Error(`Formatter must be a function, got ${typeof formatter}`);\n }\n this.formatters.set(name.toLowerCase(), formatter);\n return this;\n }\n\n /**\n * Apply a formatter\n * @param {string} name - Formatter name\n * @param {*} value - Value to format\n * @param {...*} args - Additional arguments\n * @returns {*} Formatted value\n */\n apply(name, value, ...args) {\n try {\n const formatter = this.formatters.get(name.toLowerCase());\n if (!formatter) {\n console.warn(`Formatter '${name}' not found`);\n return value;\n }\n return formatter(value, ...args);\n } catch (error) {\n console.error(`Error in formatter '${name}':`, error);\n return value;\n }\n }\n\n /**\n * Process pipe string\n * @param {*} value - Value to format\n * @param {string} pipeString - Pipe string (e.g., \"date('YYYY-MM-DD')|uppercase\")\n * @param {object} context - Optional context for resolving variables in formatter arguments\n * @returns {*} Formatted value\n */\n pipe(value, pipeString, context = null) {\n if (!pipeString) return value;\n\n // Split by pipe and process each formatter\n const pipes = this.parsePipeString(pipeString, context);\n\n return pipes.reduce((currentValue, pipe) => {\n return this.apply(pipe.name, currentValue, ...pipe.args);\n }, value);\n }\n\n /**\n * Parse pipe string into formatter calls\n * @param {string} pipeString - Pipe string\n * @param {object} context - Optional context for resolving variables\n * @returns {Array} Array of {name, args} objects\n */\n parsePipeString(pipeString, context = null) {\n const pipes = [];\n const tokens = pipeString.split('|').map(s => s.trim());\n\n for (const token of tokens) {\n const parsed = this.parseFormatter(token, context);\n if (parsed) {\n pipes.push(parsed);\n }\n }\n\n return pipes;\n }\n\n /**\n * Parse individual formatter with arguments\n * Supports both syntaxes:\n * - Parentheses: formatter('arg1', 'arg2', 3)\n * - Colon: formatter:'arg1':'arg2':3\n *\n * @param {string} token - Formatter token\n * @param {object} context - Optional context for resolving variables\n * @returns {Object} {name, args} object\n */\n parseFormatter(token, context = null) {\n // Try parentheses syntax first: formatter(arg1, arg2)\n const parenMatch = token.match(/^([a-zA-Z_]\\w*)\\s*\\((.*)\\)$/);\n if (parenMatch) {\n const [, name, argsString] = parenMatch;\n const args = argsString ? this.parseArguments(argsString, context) : [];\n return { name, args };\n }\n\n // Try colon syntax: formatter:arg1:arg2\n const colonMatch = token.match(/^([a-zA-Z_]\\w*)(?::(.+))?$/);\n if (colonMatch) {\n const [, name, argsString] = colonMatch;\n const args = argsString ? this.parseColonArguments(argsString, context) : [];\n return { name, args };\n }\n\n return null;\n }\n\n /**\n * Parse formatter arguments (comma-separated, parentheses syntax)\n * @param {string} argsString - Arguments string\n * @param {object} context - Optional context for resolving variables\n * @returns {Array} Parsed arguments\n */\n parseArguments(argsString, context = null) {\n const args = [];\n let current = '';\n let inQuotes = false;\n let quoteChar = null;\n let depth = 0;\n\n for (let i = 0; i < argsString.length; i++) {\n const char = argsString[i];\n\n if (!inQuotes && (char === '\"' || char === \"'\")) {\n inQuotes = true;\n quoteChar = char;\n current += char;\n } else if (inQuotes && char === quoteChar && argsString[i - 1] !== '\\\\') {\n inQuotes = false;\n quoteChar = null;\n current += char;\n } else if (!inQuotes && char === '{') {\n depth++;\n current += char;\n } else if (!inQuotes && char === '}') {\n depth--;\n current += char;\n } else if (!inQuotes && depth === 0 && char === ',') {\n args.push(this.parseValue(current.trim(), context));\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current.trim()) {\n args.push(this.parseValue(current.trim(), context));\n }\n\n return args;\n }\n\n /**\n * Parse formatter arguments (colon-separated syntax)\n * Handles quoted strings with colons inside them\n * @param {string} argsString - Arguments string\n * @param {object} context - Optional context for resolving variables\n * @returns {Array} Parsed arguments\n */\n parseColonArguments(argsString, context = null) {\n const args = [];\n let current = '';\n let inQuotes = false;\n let quoteChar = null;\n\n for (let i = 0; i < argsString.length; i++) {\n const char = argsString[i];\n\n if (!inQuotes && (char === '\"' || char === \"'\")) {\n inQuotes = true;\n quoteChar = char;\n current += char;\n } else if (inQuotes && char === quoteChar && argsString[i - 1] !== '\\\\') {\n inQuotes = false;\n quoteChar = null;\n current += char;\n } else if (!inQuotes && char === ':') {\n args.push(this.parseValue(current.trim(), context));\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current.trim()) {\n args.push(this.parseValue(current.trim(), context));\n }\n\n return args;\n }\n\n /**\n * Parse a single value\n * @param {string} value - Value string\n * @param {object} context - Optional context for resolving variables\n * @returns {*} Parsed value\n */\n parseValue(value, context = null) {\n // Remove quotes if present - quoted strings are always literals\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n return value.slice(1, -1);\n }\n\n // Boolean values\n if (value === 'true') return true;\n if (value === 'false') return false;\n if (value === 'null') return null;\n if (value === 'undefined') return undefined;\n\n // Numbers\n if (!isNaN(value) && value !== '') {\n return Number(value);\n }\n\n // Objects\n if (value.startsWith('{') && value.endsWith('}')) {\n try {\n return JSON.parse(value);\n } catch (e) {\n // Not valid JSON, continue\n }\n }\n\n // Try to resolve from context if available\n // This allows: {{value|tooltip:title:'top'}} where title is a context variable\n // Also supports dot notation: {{value|tooltip:model.email}}\n if (context && this.isIdentifier(value)) {\n // For simple identifiers, try direct property access\n if (!value.includes('.')) {\n if (Object.prototype.hasOwnProperty.call(context, value)) {\n return context[value];\n }\n }\n\n // Try get() method (for Models/Views) - handles dot notation\n if (context.get && typeof context.get === 'function') {\n const contextValue = context.get(value);\n if (contextValue !== undefined) {\n return contextValue;\n }\n }\n // Try getContextValue() method - handles dot notation\n if (context.getContextValue && typeof context.getContextValue === 'function') {\n const contextValue = context.getContextValue(value);\n if (contextValue !== undefined) {\n return contextValue;\n }\n }\n\n // For dot notation on plain objects, use MOJOUtils\n if (value.includes('.')) {\n // Import MOJOUtils if needed for nested property access\n const MOJOUtils = window.MOJOUtils || (typeof require !== 'undefined' ? require('./MOJOUtils.js').default : null);\n if (MOJOUtils) {\n const contextValue = MOJOUtils.getNestedValue(context, value);\n if (contextValue !== undefined) {\n return contextValue;\n }\n }\n }\n }\n\n // Fall back to treating as literal string\n return value;\n }\n\n /**\n * Check if a value is a valid identifier (variable name or dot-notation path)\n * @param {string} value - Value to check\n * @returns {boolean} True if valid identifier or path\n */\n isIdentifier(value) {\n // Valid JavaScript identifier or dot notation path\n // Examples: \"email\", \"model.email\", \"user.profile.name\"\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*(\\.[a-zA-Z_$][a-zA-Z0-9_$]*)*$/.test(value);\n }\n\n // ============= Date/Time Formatters =============\n\n /**\n * Format date\n * @param {*} value - Date value\n * @param {string} format - Date format pattern\n * @returns {string} Formatted date\n */\n date(value, format = 'MM/DD/YYYY') {\n if (!value) return '';\n value = this.normalizeEpoch(value);\n let date;\n if (value instanceof Date) {\n date = value;\n } else if (typeof value === 'string') {\n // Handle date strings more carefully to avoid timezone issues\n // If it's a date-only string (YYYY-MM-DD), parse as local time\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n const [year, month, day] = value.split('-').map(Number);\n date = new Date(year, month - 1, day);\n } else {\n date = new Date(value);\n }\n } else {\n date = new Date(value);\n }\n\n if (isNaN(date.getTime())) return String(value);\n\n // Build replacements with placeholders to avoid corruption\n const tokens = {\n 'YYYY': date.getFullYear(),\n 'YY': String(date.getFullYear()).slice(-2),\n 'MMMM': date.toLocaleDateString('en-US', { month: 'long' }),\n 'MMM': date.toLocaleDateString('en-US', { month: 'short' }),\n 'MM': String(date.getMonth() + 1).padStart(2, '0'),\n 'M': date.getMonth() + 1,\n 'dddd': date.toLocaleDateString('en-US', { weekday: 'long' }),\n 'ddd': date.toLocaleDateString('en-US', { weekday: 'short' }),\n 'DD': String(date.getDate()).padStart(2, '0'),\n 'D': date.getDate()\n };\n\n // Replace tokens using a single pass with placeholders\n let result = format;\n const tokenPattern = new RegExp(`(${Object.keys(tokens).join('|')})`, 'g');\n result = result.replace(tokenPattern, (match) => tokens[match] || match);\n\n return result;\n }\n\n /**\n * Format time\n * @param {*} value - Time value\n * @param {string} format - Time format pattern\n * @returns {string} Formatted time\n */\n time(value, format = 'HH:mm:ss') {\n if (!value) return '';\n value = this.normalizeEpoch(value);\n const date = value instanceof Date ? value : new Date(value);\n if (isNaN(date.getTime())) return String(value);\n\n const hours = date.getHours();\n const replacements = {\n 'HH': String(hours).padStart(2, '0'),\n 'H': hours,\n 'hh': String(hours % 12 || 12).padStart(2, '0'),\n 'h': hours % 12 || 12,\n 'mm': String(date.getMinutes()).padStart(2, '0'),\n 'm': date.getMinutes(),\n 'ss': String(date.getSeconds()).padStart(2, '0'),\n 's': date.getSeconds(),\n 'A': hours >= 12 ? 'PM' : 'AM',\n 'a': hours >= 12 ? 'pm' : 'am'\n };\n\n let result = format;\n const sortedKeys = Object.keys(replacements).sort((a, b) => b.length - a.length);\n for (const key of sortedKeys) {\n result = result.replace(new RegExp(key, 'g'), replacements[key]);\n }\n\n return result;\n }\n\n /**\n * Format date and time\n * @param {*} value - DateTime value\n * @param {string} dateFormat - Date format\n * @param {string} timeFormat - Time format\n * @returns {string} Formatted datetime\n */\n datetime(value, dateFormat = 'MM/DD/YYYY', timeFormat = 'HH:mm:ss') {\n value = this.normalizeEpoch(value);\n const dateStr = this.date(value, dateFormat);\n const timeStr = this.time(value, timeFormat);\n return dateStr && timeStr ? `${dateStr} ${timeStr}` : '';\n }\n\n /**\n * Format date and time with short timezone abbreviation (e.g., EST, PDT)\n * @param {*} value - DateTime value\n * @param {string} dateFormat - Date format\n * @param {string} timeFormat - Time format\n * @param {Object} options - Options: { timeZone?: string, locale?: string }\n * @returns {string} Formatted datetime with timezone abbreviation\n */\n datetime_tz(value, dateFormat = 'MM/DD/YYYY', timeFormat = 'HH:mm:ss', options = {}) {\n if (!value) return '';\n value = this.normalizeEpoch(value);\n const date = value instanceof Date ? value : new Date(value);\n if (isNaN(date.getTime())) return String(value);\n\n const locale = (options && options.locale) || 'en-US';\n const timeZone = options && options.timeZone ? options.timeZone : undefined;\n\n // Helper: build short TZ abbreviation in the requested zone\n const getTzAbbr = () => {\n let abbr = '';\n try {\n const parts = new Intl.DateTimeFormat(locale, {\n hour: '2-digit',\n minute: '2-digit',\n timeZoneName: 'short',\n ...(timeZone ? { timeZone } : {})\n }).formatToParts(date);\n const tzPart = parts.find(p => p.type === 'timeZoneName');\n abbr = tzPart ? tzPart.value : '';\n\n // Try to avoid GMT offsets if browser returns them\n if (abbr && /^GMT[+-]/i.test(abbr)) {\n try {\n const parts2 = new Intl.DateTimeFormat(locale, {\n timeStyle: 'short',\n timeZoneName: 'short',\n ...(timeZone ? { timeZone } : {})\n }).formatToParts(date);\n const tz2 = parts2.find(p => p.type === 'timeZoneName');\n if (tz2 && tz2.value && !/^GMT[+-]/i.test(tz2.value)) {\n abbr = tz2.value;\n }\n } catch (e) { void 0; }\n }\n // Collapse long names like \"Eastern Daylight Time\" to initials \"EDT\"\n if (abbr && /\\s/.test(abbr)) {\n const initials = abbr.split(/\\s+/).map(w => w[0]).join('').toUpperCase();\n if (initials.length >= 2 && initials.length <= 4) {\n abbr = initials;\n }\n }\n } catch (e) {\n abbr = '';\n }\n return abbr;\n };\n\n // If no specific timeZone requested, fall back to existing date/time logic\n if (!timeZone) {\n const dateStr = this.date(date, dateFormat);\n const timeStr = this.time(date, timeFormat);\n const abbr = getTzAbbr();\n return dateStr && timeStr ? `${dateStr} ${timeStr} ${abbr}`.trim() : '';\n }\n\n // With a specific timeZone, generate tokens from Intl parts in that zone\n const parts = new Intl.DateTimeFormat(locale, {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hourCycle: 'h23'\n }).formatToParts(date);\n const get = (type) => {\n const p = parts.find(pt => pt.type === type);\n return p ? p.value : '';\n };\n\n const y4 = get('year');\n const M2 = get('month'); // '01'..'12'\n const D2 = get('day'); // '01'..'31'\n const H2 = get('hour'); // '00'..'23'\n const m2 = get('minute');\n const s2 = get('second');\n\n const M = M2 ? String(parseInt(M2, 10)) : '';\n const D = D2 ? String(parseInt(D2, 10)) : '';\n const H = H2 ? String(parseInt(H2, 10)) : '';\n const hNum = H2 ? ((parseInt(H2, 10) % 12) || 12) : '';\n const A = H2 ? (parseInt(H2, 10) >= 12 ? 'PM' : 'AM') : '';\n const a = A ? A.toLowerCase() : '';\n\n const monthLong = new Intl.DateTimeFormat(locale, { timeZone, month: 'long' }).format(date);\n const monthShort = new Intl.DateTimeFormat(locale, { timeZone, month: 'short' }).format(date);\n const weekdayLong = new Intl.DateTimeFormat(locale, { timeZone, weekday: 'long' }).format(date);\n const weekdayShort = new Intl.DateTimeFormat(locale, { timeZone, weekday: 'short' }).format(date);\n\n const dateTokens = {\n 'YYYY': y4,\n 'YY': y4 ? y4.slice(-2) : '',\n 'MMMM': monthLong,\n 'MMM': monthShort,\n 'MM': M2,\n 'M': M,\n 'dddd': weekdayLong,\n 'ddd': weekdayShort,\n 'DD': D2,\n 'D': D\n };\n const timeTokens = {\n 'HH': H2,\n 'H': H,\n 'hh': hNum !== '' ? String(hNum).padStart(2, '0') : '',\n 'h': hNum !== '' ? String(hNum) : '',\n 'mm': m2,\n 'm': m2 ? String(parseInt(m2, 10)) : '',\n 'ss': s2,\n 's': s2 ? String(parseInt(s2, 10)) : '',\n 'A': A,\n 'a': a\n };\n\n const replaceTokens = (fmt, tokens) => {\n if (!fmt) return '';\n const pattern = new RegExp(`(${Object.keys(tokens).sort((a, b) => b.length - a.length).join('|')})`, 'g');\n return fmt.replace(pattern, (match) => tokens[match] ?? match);\n };\n\n const dateStr = replaceTokens(dateFormat, dateTokens);\n const timeStr = replaceTokens(timeFormat, timeTokens);\n const abbr = getTzAbbr();\n\n return dateStr && timeStr ? `${dateStr} ${timeStr} ${abbr}`.trim() : '';\n }\n\n normalizeEpoch(value) {\n if (typeof value !== \"number\") value = Number(value);\n\n // Check if the number is valid\n if (isNaN(value)) return '';\n\n // treat anything smaller than year 2000 in ms as seconds\n if (value < 1e11) { // less than ~Sat Mar 03 1973 09:46:40 GMT\n return value * 1000; // seconds → ms\n } else if (value > 1e12 && value < 1e13) {\n return value; // already ms\n } else {\n throw new Error(\"Value doesn't look like epoch seconds or ms\");\n }\n }\n\n /**\n * Format date range\n * @param {*} startValue - Start date (required)\n * @param {*} endValue - End date (defaults to now)\n * @param {string} format - Date format (defaults to 'MM/DD/YYYY')\n * @returns {string} Formatted date range (e.g., \"01/01/2025 - 01/31/2025\")\n */\n date_range(startValue, endValue = null, format = 'MM/DD/YYYY') {\n if (!startValue) return '';\n \n const endVal = endValue || new Date();\n const startStr = this.date(startValue, format);\n const endStr = this.date(endVal, format);\n \n if (!startStr || !endStr) return '';\n return `${startStr} - ${endStr}`;\n }\n\n /**\n * Format datetime range\n * @param {*} startValue - Start datetime (required)\n * @param {*} endValue - End datetime (defaults to now)\n * @param {string} dateFormat - Date format (defaults to 'MM/DD/YYYY')\n * @param {string} timeFormat - Time format (defaults to 'HH:mm')\n * @returns {string} Formatted datetime range (e.g., \"01/01/2025 14:30 - 01/31/2025 16:45\")\n */\n datetime_range(startValue, endValue = null, dateFormat = 'MM/DD/YYYY', timeFormat = 'HH:mm') {\n if (!startValue) return '';\n \n const endVal = endValue || new Date();\n const startStr = this.datetime(startValue, dateFormat, timeFormat);\n const endStr = this.datetime(endVal, dateFormat, timeFormat);\n \n if (!startStr || !endStr) return '';\n return `${startStr} - ${endStr}`;\n }\n\n /**\n * Format relative time\n * @param {*} value - Date value\n * @param {boolean} short - Use short format\n * @returns {string} Relative time string\n */\n relative(value, short = false) {\n if (!value) return '';\n value = this.normalizeEpoch(value);\n const date = value instanceof Date ? value : new Date(value);\n if (isNaN(date.getTime())) return String(value);\n\n const now = new Date();\n const diffMs = now - date;\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (short) {\n if (diffDays > 365) return Math.floor(diffDays / 365) + 'y';\n if (diffDays > 30) return Math.floor(diffDays / 30) + 'mo';\n if (diffDays > 7) return Math.floor(diffDays / 7) + 'w';\n if (diffDays > 0) return diffDays + 'd';\n if (diffHours > 0) return diffHours + 'h';\n if (diffMins > 0) return diffMins + 'm';\n return 'now';\n }\n\n if (diffDays > 365) {\n const years = Math.floor(diffDays / 365);\n return years + ' year' + (years > 1 ? 's' : '') + ' ago';\n }\n if (diffDays > 30) {\n const months = Math.floor(diffDays / 30);\n return months + ' month' + (months > 1 ? 's' : '') + ' ago';\n }\n if (diffDays > 7) {\n const weeks = Math.floor(diffDays / 7);\n return weeks + ' week' + (weeks > 1 ? 's' : '') + ' ago';\n }\n if (diffDays === 1) return 'yesterday';\n if (diffDays > 0) return diffDays + ' days ago';\n if (diffHours > 0) return diffHours + ' hour' + (diffHours > 1 ? 's' : '') + ' ago';\n if (diffMins > 0) return diffMins + ' minute' + (diffMins > 1 ? 's' : '') + ' ago';\n if (diffSecs > 30) return diffSecs + ' seconds ago';\n\n return 'just now';\n }\n\n /**\n * Format ISO date\n * @param {*} value - Date value\n * @param {boolean} dateOnly - Return date only\n * @returns {string} ISO date string\n */\n iso(value, dateOnly = false) {\n if (!value) return '';\n value = this.normalizeEpoch(value);\n const date = value instanceof Date ? value : new Date(value);\n if (isNaN(date.getTime())) return String(value);\n\n if (dateOnly) {\n return date.toISOString().split('T')[0];\n }\n return date.toISOString();\n }\n\n // ============= Number Formatters =============\n\n /**\n * Format number\n * @param {*} value - Number value\n * @param {number} decimals - Decimal places\n * @param {string} locale - Locale string\n * @returns {string} Formatted number\n */\n number(value, decimals = 2, locale = 'en-US') {\n const num = parseFloat(value);\n if (isNaN(num)) return String(value);\n\n return num.toLocaleString(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals\n });\n }\n\n /**\n * Format currency\n * @param {*} value - Number value in cents\n * @param {string} symbol - Currency symbol\n * @param {number} decimals - Decimal places\n * @returns {string} Formatted currency\n */\n currency(value, symbol = '$', decimals = 2) {\n const num = parseInt(value);\n if (isNaN(num)) return String(value);\n\n // Convert cents to dollars using string manipulation to avoid floating point issues\n const centsStr = Math.abs(num).toString();\n const sign = num < 0 ? '-' : '';\n\n let dollars, cents;\n if (centsStr.length <= 2) {\n dollars = '0';\n cents = centsStr.padStart(2, '0');\n } else {\n dollars = centsStr.slice(0, -2);\n cents = centsStr.slice(-2);\n }\n\n // Add thousands separators to dollars part\n dollars = dollars.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n // Format based on requested decimals\n let formatted;\n if (decimals === 0) {\n // Round to nearest dollar\n const totalCents = parseInt(cents);\n if (totalCents >= 50) {\n dollars = (parseInt(dollars.replace(/,/g, '')) + 1).toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n }\n formatted = dollars;\n } else if (decimals === 2) {\n formatted = `${dollars}.${cents}`;\n } else {\n // For other decimal places, truncate or pad cents as needed\n const adjustedCents = cents.slice(0, decimals).padEnd(decimals, '0');\n formatted = `${dollars}.${adjustedCents}`;\n }\n\n return sign + symbol + formatted;\n }\n\n /**\n * Format percentage\n * @param {*} value - Number value\n * @param {number} decimals - Decimal places\n * @param {boolean} multiply - Multiply by 100\n * @returns {string} Formatted percentage\n */\n percent(value, decimals = 0, multiply = true) {\n const num = parseFloat(value);\n if (isNaN(num)) return String(value);\n\n const percent = multiply ? num * 100 : num;\n return this.number(percent, decimals) + '%';\n }\n\n /**\n * Format file size\n * @param {*} value - Size in bytes\n * @param {boolean} binary - Use binary units (1024)\n * @param {number} decimals - Decimal places\n * @returns {string} Formatted file size\n */\n filesize(value, binary = false, decimals = 1) {\n const bytes = parseInt(value);\n if (isNaN(bytes)) return String(value);\n\n const units = binary ?\n ['B', 'KiB', 'MiB', 'GiB', 'TiB'] :\n ['B', 'KB', 'MB', 'GB', 'TB'];\n const divisor = binary ? 1024 : 1000;\n\n let size = bytes;\n let unitIndex = 0;\n\n while (size >= divisor && unitIndex < units.length - 1) {\n size /= divisor;\n unitIndex++;\n }\n\n const decimalPlaces = unitIndex === 0 ? 0 : decimals;\n return `${size.toFixed(decimalPlaces)} ${units[unitIndex]}`;\n }\n\n /**\n * Format ordinal number\n * @param {*} value - Number value\n * @param {boolean} suffixOnly - Return suffix only\n * @returns {string} Ordinal number\n */\n ordinal(value, suffixOnly = false) {\n const num = parseInt(value);\n if (isNaN(num)) return String(value);\n\n const j = num % 10;\n const k = num % 100;\n\n let suffix = 'th';\n if (j === 1 && k !== 11) suffix = 'st';\n else if (j === 2 && k !== 12) suffix = 'nd';\n else if (j === 3 && k !== 13) suffix = 'rd';\n\n return suffixOnly ? suffix : num + suffix;\n }\n\n /**\n * Format compact number\n * @param {*} value - Number value\n * @param {number} decimals - Decimal places\n * @returns {string} Compact number\n */\n compact(value, decimals = 1) {\n const num = parseFloat(value);\n if (isNaN(num)) return String(value);\n\n const abs = Math.abs(num);\n const sign = num < 0 ? '-' : '';\n\n if (abs >= 1e9) {\n return sign + (abs / 1e9).toFixed(decimals) + 'B';\n }\n if (abs >= 1e6) {\n return sign + (abs / 1e6).toFixed(decimals) + 'M';\n }\n if (abs >= 1e3) {\n return sign + (abs / 1e3).toFixed(decimals) + 'K';\n }\n\n return String(num);\n }\n\n /**\n * Add numbers\n * @param {*} value - First number\n * @param {*} addend - Number to add\n * @returns {number} Sum\n */\n add(value, addend) {\n const num1 = parseFloat(value);\n const num2 = parseFloat(addend);\n if (isNaN(num1) || isNaN(num2)) return value;\n return num1 + num2;\n }\n\n /**\n * Subtract numbers\n * @param {*} value - First number\n * @param {*} subtrahend - Number to subtract\n * @returns {number} Difference\n */\n subtract(value, subtrahend) {\n const num1 = parseFloat(value);\n const num2 = parseFloat(subtrahend);\n if (isNaN(num1) || isNaN(num2)) return value;\n return num1 - num2;\n }\n\n /**\n * Multiply numbers\n * @param {*} value - First number\n * @param {*} multiplier - Number to multiply by\n * @returns {number} Product\n */\n multiply(value, multiplier) {\n const num1 = parseFloat(value);\n const num2 = parseFloat(multiplier);\n if (isNaN(num1) || isNaN(num2)) return value;\n return num1 * num2;\n }\n\n /**\n * Divide numbers\n * @param {*} value - Dividend\n * @param {*} divisor - Divisor\n * @returns {number} Quotient\n */\n divide(value, divisor) {\n const num1 = parseFloat(value);\n const num2 = parseFloat(divisor);\n if (isNaN(num1) || isNaN(num2) || num2 === 0) return value;\n return num1 / num2;\n }\n\n // ============= String Formatters =============\n\n /**\n * Capitalize string\n * @param {*} value - String value\n * @param {boolean} all - Capitalize all words (default: true). If false, only capitalizes first letter\n * @returns {string} Capitalized string\n */\n capitalize(value, all = true) {\n const str = String(value);\n if (!str) return '';\n\n if (all) {\n return str.replace(/\\b\\w/g, c => c.toUpperCase());\n }\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n /**\n * Truncate string\n * @param {*} value - String value\n * @param {number} length - Max length\n * @param {string} suffix - Suffix to append\n * @returns {string} Truncated string\n */\n truncate(value, length = 50, suffix = '...') {\n const str = String(value);\n if (str.length <= length) return str;\n return str.substring(0, length) + suffix;\n }\n\n /**\n * Truncate keeping only the end of the string\n * @param {*} value - String value\n * @param {number} length - Characters to keep at the end\n * @param {string} prefix - Text to prepend when truncating\n * @returns {string} Truncated string\n */\n truncate_front(value, length = 8, prefix = '...') {\n const str = String(value);\n if (str.length <= length) {\n return str;\n }\n return `${prefix}${str.slice(-length)}`;\n }\n\n /**\n * Truncate string in the middle\n * @param {*} value - String value\n * @param {number} size - The total number of characters to keep (half for the start, half for the end).\n * @param {string} replace - The character(s) to use for the middle part.\n * @returns {string} Truncated string\n */\n truncate_middle(value, size = 8, replace = '***') {\n const str = String(value);\n if (str.length <= size) {\n return str;\n }\n\n const halfSize = Math.floor(size / 2);\n const front = str.substring(0, halfSize);\n const back = str.substring(str.length - halfSize);\n\n return `${front}${replace}${back}`;\n }\n\n /**\n * Create slug from string\n * @param {*} value - String value\n * @param {string} separator - Word separator\n * @returns {string} Slug\n */\n slug(value, separator = '-') {\n const str = String(value);\n return str\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, separator)\n .replace(new RegExp(`${separator}+`, 'g'), separator)\n .replace(new RegExp(`^${separator}|${separator}$`, 'g'), '');\n }\n\n /**\n * Get initials from string\n * @param {*} value - String value\n * @param {number} count - Number of initials\n * @returns {string} Initials\n */\n initials(value, count = 2) {\n const str = String(value);\n const words = str.split(/\\s+/).filter(w => w.length > 0);\n return words\n .slice(0, count)\n .map(word => word.charAt(0).toUpperCase())\n .join('');\n }\n\n /**\n * Mask string\n * @param {*} value - String value\n * @param {string} char - Mask character\n * @param {number} showLast - Number of chars to show at end\n * @returns {string} Masked string\n */\n mask(value, char = '*', showLast = 4) {\n const str = String(value);\n if (str.length <= showLast) return str;\n\n const masked = char.repeat(Math.max(0, str.length - showLast));\n const visible = str.slice(-showLast);\n return masked + visible;\n }\n\n // ============= HTML/Web Formatters =============\n\n /**\n * Format email\n * @param {*} value - Email value\n * @param {Object} options - Options\n * @returns {string} Formatted email\n */\n email(value, options = {}) {\n const email = String(value).trim();\n if (!email) return '';\n\n if (options.link === false) {\n return email;\n }\n\n const subject = options.subject ? `?subject=${encodeURIComponent(options.subject)}` : '';\n const body = options.body ? `&body=${encodeURIComponent(options.body)}` : '';\n const className = options.class ? ` class=\"${options.class}\"` : '';\n\n return `<a href=\"mailto:${email}${subject}${body}\"${className}>${email}</a>`;\n }\n\n /**\n * Format phone number\n * @param {*} value - Phone value\n * @param {string} format - Format type\n * @param {boolean} link - Create tel link\n * @returns {string} Formatted phone\n */\n phone(value, format = 'US', link = true) {\n let phone = String(value).replace(/\\D/g, '');\n\n let formatted = phone;\n if (format === 'US') {\n if (phone.length === 10) {\n formatted = `(${phone.slice(0, 3)}) ${phone.slice(3, 6)}-${phone.slice(6)}`;\n } else if (phone.length === 11 && phone[0] === '1') {\n formatted = `+1 (${phone.slice(1, 4)}) ${phone.slice(4, 7)}-${phone.slice(7)}`;\n }\n }\n\n if (!link) {\n return formatted;\n }\n\n return `<a href=\"tel:${phone}\">${formatted}</a>`;\n }\n\n /**\n * Format URL\n * @param {*} value - URL value\n * @param {string} text - Link text\n * @param {boolean} newWindow - Open in new window\n * @returns {string} Formatted URL\n */\n url(value, text = null, newWindow = true) {\n let url = String(value).trim();\n if (!url) return '';\n\n // Add protocol if missing\n if (!/^https?:\\/\\//.test(url)) {\n url = 'https://' + url;\n }\n\n const linkText = text || url;\n const target = newWindow ? ' target=\"_blank\"' : '';\n const rel = newWindow ? ' rel=\"noopener noreferrer\"' : '';\n\n return `<a href=\"${url}\"${target}${rel}>${linkText}</a>`;\n }\n\n /**\n * Format as badge\n * @param {*} value - Badge text\n * @param {string} type - Badge type\n * @returns {string} Badge HTML\n */\n badge(value, type = 'auto') {\n // If the value is an array, map over it and create a badge for each item.\n if (Array.isArray(value)) {\n return value.map(item => this.badge(item, type)).join(' ');\n }\n\n const text = String(value);\n const badgeType = type === 'auto' ? this.inferBadgeType(text) : type;\n const className = badgeType ? `bg-${badgeType}` : 'bg-secondary';\n\n return `<span class=\"badge ${className}\">${text}</span>`;\n }\n\n /**\n * Get badge CSS class for a value\n * @param {*} value - Value to get badge class for\n * @param {string} type - Badge type (optional, auto-detected if not specified)\n * @returns {string} Badge CSS class\n */\n badgeClass(value, type = 'auto') {\n const text = String(value);\n const badgeType = type === 'auto' ? this.inferBadgeType(text) : type;\n return badgeType ? `bg-${badgeType}` : 'bg-secondary';\n }\n\n /**\n * Infer badge type from text\n * @param {string} text - Badge text\n * @returns {string} Badge type\n */\n inferBadgeType(text) {\n const lowered = text.toLowerCase();\n if (['active', 'success', 'complete', 'completed', 'approved', 'done', 'true', 'on', 'yes'].includes(lowered)) return 'success';\n if (['error', 'failed', 'rejected', 'deleted', 'cancelled', 'false', 'off', 'no', 'declined'].includes(lowered)) return 'danger';\n if (['warning', 'pending', 'review', 'processing', 'uploading'].includes(lowered)) return 'warning';\n if (['info', 'new', 'draft'].includes(lowered)) return 'info';\n if (['inactive', 'disabled', 'archived', 'suspended'].includes(lowered)) return 'secondary';\n return 'secondary';\n }\n\n status(value) {\n return this._status(value);\n }\n\n status_icon(value) {\n return this._status(value, {}, {}, false, true);\n }\n\n status_text(value) {\n return this._status(value, {}, {}, true, false);\n }\n\n /**\n * Format status\n * @param {*} value - Status value\n * @param {Object} icons - Icon mapping\n * @param {Object} colors - Color mapping\n * @param {boolean} noIcons - Whether to include icons\n * @param {boolean} noText - Whether to include text\n * @returns {string} Status HTML\n */\n _status(value, icons = {}, colors = {}, noIcons = false, noText = false) {\n const status = String(value).toLowerCase();\n\n const defaultIcons = {\n 'active': 'bi bi-check-circle-fill',\n 'approved': 'bi bi-check-circle-fill',\n 'declined': 'bi bi-x-circle-fill',\n 'inactive': 'bi bi-pause-circle-fill',\n 'pending': 'bi bi-clock-fill',\n 'success': 'bi bi-check-circle-fill',\n 'error': 'bi bi-exclamation-triangle-fill',\n 'warning': 'bi bi-exclamation-triangle-fill'\n };\n\n const defaultColors = {\n 'active': 'success',\n \"approved\": \"success\",\n \"declined\": \"danger\",\n 'inactive': 'secondary',\n 'pending': 'warning',\n 'success': 'success',\n 'error': 'danger',\n 'warning': 'warning'\n };\n\n const iconClass = icons[status] || defaultIcons[status] || '';\n const color = colors[status] || defaultColors[status] || 'secondary';\n\n let icon = '';\n if (!noIcons && iconClass) {\n icon = `<i class=\"${iconClass}\"></i>`;\n }\n let text = '';\n if (!noText) {\n text = value;\n }\n\n return `<span class=\"text-${color}\">${icon}${icon ? ' ' : ''}${text}</span>`;\n }\n\n /**\n * Format boolean\n * @param {*} value - Boolean value\n * @param {string} trueText - Text for true\n * @param {string} falseText - Text for false\n * @returns {string} Boolean text\n */\n boolean(value, trueText = 'True', falseText = 'False', colored = false) {\n const text = value ? trueText : falseText;\n return colored ? `<span class=\"text-${value ? 'success' : 'danger'}\">${text}</span>` : text;\n }\n\n /**\n * Format icon\n * @param {*} value - Icon key\n * @param {Object} mapping - Icon mapping\n * @returns {string} Icon HTML\n */\n icon(value, mapping = {}) {\n const key = String(value).toLowerCase();\n const icon = mapping[key] || '';\n return icon ? `<i class=\"${icon}\"></i>` : '';\n }\n\n /**\n * Format boolean as a yes/no icon\n * @param {*} value - Boolean value\n * @returns {string} Icon HTML\n */\n yesnoicon(value, yesIcon = 'bi bi-check-circle-fill text-success', noIcon = 'bi bi-x-circle-fill text-danger') {\n if (value) { // Handles true, 1, \"true\", \"on\", etc.\n return `<i class=\"${yesIcon}\"></i>`;\n }\n // Handles false, 0, \"\", null, undefined\n return `<i class=\"${noIcon}\"></i>`;\n }\n\n /**\n * Format value as Bootstrap 5 image with optional rendition support\n * @param {string|object} value - URL string or file object with renditions\n * @param {string} rendition - Desired rendition (thumbnail, thumbnail_sm, etc.)\n * @param {string} classes - Additional CSS classes\n * @param {string} alt - Alt text for the image\n * @returns {string} Bootstrap image HTML\n */\n image(value, rendition = 'thumbnail', classes = 'img-fluid', alt = '') {\n const url = this._extractImageUrl(value, rendition);\n if (!url) return '';\n\n return `<img src=\"${url}\" class=\"${classes}\" alt=\"${alt}\" />`;\n }\n\n /**\n * Format value as Bootstrap 5 avatar (circular image)\n * @param {string|object} value - URL string or file object with renditions\n * @param {string} size - Avatar size (xs, sm, md, lg, xl)\n * @param {string} classes - Additional CSS classes\n * @param {string} alt - Alt text for the avatar\n * @returns {string} Bootstrap avatar HTML\n */\n avatar(value, size = 'md', classes = 'rounded-circle', alt = '') {\n const url = this._extractImageUrl(value, 'square_sm') || GENERIC_AVATAR_SVG;\n\n // Bootstrap avatar sizing\n const sizeClasses = {\n 'xs': 'width: 1.5rem; height: 1.5rem;',\n 'sm': 'width: 2rem; height: 2rem;',\n 'md': 'width: 3rem; height: 3rem;',\n 'lg': 'width: 4rem; height: 4rem;',\n 'xl': 'width: 5rem; height: 5rem;'\n };\n\n const sizeStyle = sizeClasses[size] || sizeClasses['md'];\n const baseClasses = 'object-fit-cover';\n const allClasses = `${baseClasses} ${classes}`.trim();\n\n return `<img src=\"${url}\" class=\"${allClasses}\" style=\"${sizeStyle}\" alt=\"${alt}\" />`;\n }\n\n /**\n * Tooltip formatter - wraps value with Bootstrap tooltip\n * Usage:\n * {{value|tooltip:'Tooltip text'}}\n * {{value|tooltip:'Help text':top}}\n * {{value|tooltip:'Info':bottom:html}}\n *\n * @param {*} value - Value to display (not escaped, works with formatter chains)\n * @param {string} text - Tooltip text content\n * @param {string} placement - Tooltip placement: top, bottom, left, right (default: top)\n * @param {string} html - 'html' to allow HTML in tooltip (default: text only)\n * @returns {string} HTML with tooltip\n */\n tooltip(value, text = '', placement = 'top', html = '') {\n if (value === null || value === undefined) return '';\n\n // Don't escape value - it may be HTML from previous formatters in the chain\n const displayValue = String(value);\n const tooltipText = html === 'html' ? text : this.escapeHtml(text);\n const dataAttr = html === 'html' ? 'data-bs-html=\"true\"' : '';\n\n return `<span data-bs-toggle=\"tooltip\" data-bs-placement=\"${placement}\" ${dataAttr} data-bs-title=\"${tooltipText}\">${displayValue}</span>`;\n }\n\n /**\n * Helper method to extract image URL from string or file object\n * @param {string|object} value - URL string or file object with renditions\n * @param {string} preferredRendition - Preferred rendition name\n * @returns {string|null} Image URL or null if not found\n */\n _extractImageUrl(value, preferredRendition = 'thumbnail') {\n // Handle null/undefined\n if (!value) return null;\n\n // Handle string URL directly\n if (typeof value === 'string') {\n return value;\n }\n\n // Handle file object with renditions\n if (typeof value === 'object') {\n\n if (value.attributes) value = value.attributes;\n if (preferredRendition === \"thumbnail\" && value.thumbnail && typeof value.thumbnail === 'string') {\n return value.thumbnail;\n }\n // Check if it has renditions\n if (value.renditions && typeof value.renditions === 'object') {\n // Try to get preferred rendition\n const rendition = value.renditions[preferredRendition];\n if (rendition && rendition.url) {\n return rendition.url;\n }\n\n // Fallback to any available rendition\n const availableRenditions = Object.values(value.renditions);\n if (availableRenditions.length > 0 && availableRenditions[0].url) {\n return availableRenditions[0].url;\n }\n }\n\n // Fallback to original file URL\n if (value.url) {\n return value.url;\n }\n }\n\n return null;\n }\n\n // ============= Utility Formatters =============\n\n /**\n * Apply default value\n * @param {*} value - Value\n * @param {*} defaultValue - Default value\n * @returns {*} Value or default\n */\n default(value, defaultValue = '') {\n return value === null || value === undefined || value === '' ? defaultValue : value;\n }\n\n /**\n * Compare value and return one of two results based on equality\n * Useful for conditional CSS classes, text, or any conditional output\n * \n * @param {*} value - Value to compare\n * @param {*} compareValue - Value to compare against\n * @param {*} trueResult - Result if values are equal\n * @param {*} falseResult - Result if values are not equal (optional, defaults to empty string)\n * @returns {*} trueResult or falseResult\n * \n * @example\n * // CSS classes\n * {{status|equals:1:'text-success':'text-secondary'}}\n * {{model.state|equals:'active':'badge-success':'badge-secondary'}}\n * \n * // Text output\n * {{role|equals:'admin':'Administrator':'User'}}\n * \n * // Numbers\n * {{count|equals:0:'No items':'Has items'}}\n */\n equals(value, compareValue, trueResult, falseResult = '') {\n // Handle loose equality for common cases (1 == '1', true == 'true', etc.)\n // eslint-disable-next-line eqeqeq\n return value == compareValue ? trueResult : falseResult;\n }\n\n /**\n * Format as JSON\n * @param {*} value - Value to stringify\n * @param {number} indent - Indentation\n * @returns {string} JSON string\n */\n /**\n * Format pluralization based on count\n * @param {number} count - The count value\n * @param {string} singular - Singular form of the word\n * @param {string|null} plural - Plural form (defaults to singular + 's')\n * @param {boolean} includeCount - Whether to include the count in output\n * @returns {string} Formatted plural string\n */\n plural(count, singular, plural = null, includeCount = true) {\n if (count === null || count === undefined || singular === null || singular === undefined) {\n return includeCount ? `${count} ${singular}` : (singular || '');\n }\n\n const num = parseInt(count);\n if (isNaN(num)) {\n return includeCount ? `${count} ${singular}` : (singular || '');\n }\n\n const word = Math.abs(num) === 1 ? singular : (plural || singular + 's');\n return includeCount ? `${num} ${word}` : word;\n }\n\n /**\n * Format array as a human-readable list\n * @param {Array} array - Array to format\n * @param {Object} options - Formatting options\n * @returns {string} Formatted list string\n */\n formatList(array, options = {}) {\n if (!Array.isArray(array)) {\n return String(array);\n }\n\n const { conjunction = 'and', limit = null, moreText = 'others' } = options;\n\n if (array.length === 0) return '';\n if (array.length === 1) return String(array[0]);\n\n let items = array.slice();\n let hasMore = false;\n\n if (limit && array.length > limit) {\n items = array.slice(0, limit);\n hasMore = true;\n }\n\n if (hasMore) {\n const remaining = array.length - limit;\n return `${items.join(', ')}, ${conjunction} ${remaining} ${moreText}`;\n }\n\n if (items.length === 2) {\n return `${items[0]} ${conjunction} ${items[1]}`;\n }\n\n return `${items.slice(0, -1).join(', ')}, ${conjunction} ${items[items.length - 1]}`;\n }\n\n /**\n * Format duration to human-readable format\n * @param {number} value - Duration value\n * @param {string} unit - Input unit: 'ms', 's', 'm', 'h', 'd' (defaults to 'ms')\n * @param {boolean} short - Use short format (e.g., '1h30m' vs '1 hour 30 minutes')\n * @param {number} precision - Max number of units to show (defaults to 2)\n * @returns {string} Formatted duration string\n */\n duration(value, unit = 'ms', short = false, precision = 2) {\n if (value === null || value === undefined) return '';\n\n const num = parseFloat(value);\n if (isNaN(num)) return String(value);\n\n // Convert input to milliseconds\n let ms;\n switch (unit) {\n case 's':\n case 'sec':\n case 'seconds':\n ms = num * 1000;\n break;\n case 'm':\n case 'min':\n case 'minutes':\n ms = num * 60000;\n break;\n case 'h':\n case 'hr':\n case 'hours':\n ms = num * 3600000;\n break;\n case 'd':\n case 'day':\n case 'days':\n ms = num * 86400000;\n break;\n case 'ms':\n case 'milliseconds':\n default:\n ms = num;\n }\n\n const units = [\n { name: 'day', short: 'd', value: 86400000 },\n { name: 'hour', short: 'h', value: 3600000 },\n { name: 'minute', short: 'm', value: 60000 },\n { name: 'second', short: 's', value: 1000 }\n ];\n\n if (ms === 0) return short ? '0s' : '0 seconds';\n\n const absMs = Math.abs(ms);\n const sign = ms < 0 ? '-' : '';\n const parts = [];\n let remaining = absMs;\n\n for (const u of units) {\n if (remaining >= u.value) {\n const count = Math.floor(remaining / u.value);\n remaining = remaining % u.value;\n\n const unitName = short ? u.short : (count === 1 ? u.name : u.name + 's');\n parts.push(short ? `${count}${unitName}` : `${count} ${unitName}`);\n\n if (parts.length >= precision) break;\n }\n }\n\n if (parts.length === 0) {\n return short ? `${Math.round(absMs)}ms` : `${Math.round(absMs)} milliseconds`;\n }\n\n return sign + (short ? parts.join('') : parts.join(' '));\n }\n\n /**\n * Format long strings/IDs with truncation\n * @param {string} value - Value to format\n * @param {number} length - Maximum length before truncation\n * @param {string} prefix - Prefix to add\n * @param {string} suffix - Suffix for truncated strings\n * @returns {string} Formatted hash string\n */\n hash(value, length = 8, prefix = '', suffix = '...') {\n if (value === null || value === undefined) return '';\n\n const str = String(value);\n if (str.length <= length) return prefix + str;\n return prefix + str.substring(0, length) + suffix;\n }\n\n /**\n * Strip HTML tags from text\n * @param {string} html - HTML string to strip\n * @returns {string} Plain text without HTML tags\n */\n stripHtml(html) {\n if (html === null || html === undefined) return '';\n return String(html).replace(/<[^>]*>/g, '');\n }\n\n /**\n * Highlight search terms in text\n * @param {string} text - Text to search in\n * @param {string} searchTerm - Term to highlight\n * @param {string} className - CSS class for highlighting\n * @returns {string} Text with highlighted terms\n */\n highlight(text, searchTerm, className = 'highlight') {\n if (text === null || text === undefined || !searchTerm) {\n return String(text || '');\n }\n\n const escapedTerm = String(searchTerm).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`(${escapedTerm})`, 'gi');\n return String(text).replace(regex, `<mark class=\"${className}\">$1</mark>`);\n }\n\n /**\n * Encode a value as a hex string.\n * - Strings are encoded as UTF-8 bytes, then hex-encoded\n * - Numbers are converted to base-16 (padded to even length)\n * - Uint8Array/ArrayBuffer/number[] are treated as bytes\n *\n * @param {*} value - The value to encode\n * @param {boolean} uppercase - Uppercase hex letters (A-F)\n * @param {boolean} withPrefix - Prefix with '0x'\n * @returns {string} Hex string\n */\n hex(value, uppercase = false, withPrefix = false) {\n if (value === null || value === undefined) return '';\n\n let hexStr = '';\n\n const toHexFromBytes = (bytes) =>\n Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n\n if (typeof value === 'number') {\n let hex = Math.abs(Math.trunc(value)).toString(16);\n if (hex.length % 2) hex = '0' + hex;\n hexStr = hex;\n } else if (value instanceof Uint8Array) {\n hexStr = toHexFromBytes(value);\n } else if (value instanceof ArrayBuffer) {\n hexStr = toHexFromBytes(new Uint8Array(value));\n } else if (Array.isArray(value) && value.every(n => typeof n === 'number')) {\n hexStr = toHexFromBytes(Uint8Array.from(value.map(n => n & 0xFF)));\n } else {\n // Treat everything else as string and encode to UTF-8\n const enc = new TextEncoder();\n const bytes = enc.encode(String(value));\n hexStr = toHexFromBytes(bytes);\n }\n\n if (uppercase) hexStr = hexStr.toUpperCase();\n return (withPrefix ? '0x' : '') + hexStr;\n }\n\n /**\n * Decode a hex string into UTF-8 text.\n * Accepts optional '0x' prefix and ignores whitespace.\n *\n * @param {string} value - Hex string\n * @returns {string} Decoded UTF-8 string (or original value on parse error)\n */\n unhex(value) {\n if (value === null || value === undefined) return '';\n\n let str = String(value).trim();\n if (str.startsWith('0x') || str.startsWith('0X')) str = str.slice(2);\n str = str.replace(/\\s+/g, '');\n\n if (str.length === 0) return '';\n\n // If odd length, pad with leading zero\n if (str.length % 2 !== 0) str = '0' + str;\n\n const bytes = new Uint8Array(str.length / 2);\n for (let i = 0; i < str.length; i += 2) {\n const byte = parseInt(str.slice(i, i + 2), 16);\n if (Number.isNaN(byte)) {\n return String(value);\n }\n bytes[i / 2] = byte;\n }\n\n try {\n const dec = new TextDecoder();\n return dec.decode(bytes);\n } catch (e) {\n // Fallback if TextDecoder is unavailable\n let text = '';\n for (const b of bytes) text += String.fromCharCode(b);\n return text;\n }\n }\n\n json(value, indent = 2) {\n try {\n return JSON.stringify(value, null, indent);\n } catch (e) {\n return String(value);\n }\n }\n\n /**\n * Check if formatter exists\n * @param {string} name - Formatter name\n * @returns {boolean} True if exists\n */\n has(name) {\n return this.formatters.has(name.toLowerCase());\n }\n\n /**\n * Remove a formatter\n * @param {string} name - Formatter name\n * @returns {boolean} True if removed\n */\n unregister(name) {\n return this.formatters.delete(name.toLowerCase());\n }\n\n /**\n * Get all formatter names\n * @returns {Array} Formatter names\n */\n listFormatters() {\n return Array.from(this.formatters.keys()).sort();\n }\n\n iter(v) {\n if (v === null || v === undefined) {\n return [];\n }\n\n // If it's already an array, return as-is\n if (Array.isArray(v)) {\n return v;\n }\n\n // If it's an object, convert to key-value pairs\n if (typeof v === 'object') {\n return Object.entries(v).map(([key, value]) => ({\n key: key,\n value: value\n }));\n }\n\n // For primitive values, wrap in array with single item\n return [{ key: '0', value: v }];\n }\n}\n\n// Create singleton instance\nconst dataFormatter = new DataFormatter();\nwindow.dataFormatter = dataFormatter;\n\n// Export both class and instance\nexport { DataFormatter };\nexport default dataFormatter;\n","/**\n * MOJOUtils - Core utility functions for MOJO Framework\n * Provides centralized data access and formatting utilities\n */\n\nimport dataFormatter from './DataFormatter.js';\n\nclass MOJOUtils {\n /**\n * Get data from context with support for:\n * - Dot notation (e.g., \"user.name\")\n * - Pipe formatting (e.g., \"name|uppercase\")\n * - Combined (e.g., \"user.name|uppercase|truncate(10)\")\n *\n * @param {object} context - The data context to search in\n * @param {string} key - The key path with optional pipes\n * @returns {*} The value, possibly formatted\n */\n static getContextData(context, key) {\n if (!key || context == null) {\n return undefined;\n }\n\n // Check for pipe syntax - split on first pipe outside of parentheses\n let field = key;\n let pipes = '';\n\n // Find the first pipe that's not inside parentheses\n let parenDepth = 0;\n let pipeIndex = -1;\n\n for (let i = 0; i < key.length; i++) {\n const char = key[i];\n if (char === '(') parenDepth++;\n else if (char === ')') parenDepth--;\n else if (char === '|' && parenDepth === 0) {\n pipeIndex = i;\n break;\n }\n }\n\n if (pipeIndex > -1) {\n field = key.substring(0, pipeIndex).trim();\n pipes = key.substring(pipeIndex + 1).trim();\n }\n\n // Get the raw value\n const value = this.getNestedValue(context, field);\n\n // Apply pipes if present, passing context for variable resolution\n if (pipes) {\n return dataFormatter.pipe(value, pipes, context);\n }\n\n return value;\n }\n\n /**\n * Get nested value from object using dot notation\n * IMPORTANT: Never calls get() on the top-level context to avoid recursion\n * But DOES call get() on nested objects if they have that method\n *\n * @param {object} context - The object to search in\n * @param {string} path - Dot notation path\n * @returns {*} The value at the path\n */\n static getNestedValue(context, path) {\n if (!path || context == null) {\n return undefined;\n }\n\n // If no dots, simple property lookup\n if (!path.includes('.')) {\n // Direct property access - never call get() on top level\n // Check if property exists (including prototype chain for methods)\n if (path in context) {\n const value = context[path];\n // Check if it's a method (like getStatus, getButtonClass)\n if (typeof value === 'function') {\n return value.call(context);\n }\n return value;\n }\n\n return undefined;\n }\n\n // Handle dot notation\n const keys = path.split('.');\n let current = context;\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n\n if (current == null) {\n return undefined;\n }\n\n // For the first key, never use get() (it's the top-level context)\n if (i === 0) {\n // Direct property access\n if (current.hasOwnProperty(key)) {\n const value = current[key];\n // Check if it's a method and call it\n if (typeof value === 'function') {\n current = value.call(context);\n } else {\n current = value;\n }\n } else {\n return undefined;\n }\n } else {\n // For nested objects, check if they have a get() method\n if (current && typeof current.getContextValue === 'function') {\n // Use get() for the remaining path\n const remainingPath = keys.slice(i).join('.');\n return current.getContextValue(remainingPath);\n }\n\n // Standard property access\n if (Array.isArray(current) && !isNaN(key)) {\n // Array index access\n current = current[parseInt(key)];\n } else if (current.hasOwnProperty(key)) {\n current = current[key];\n } else if (typeof current[key] === 'function') {\n current = current[key].call(current);\n } else {\n return undefined;\n }\n }\n }\n\n return current;\n }\n\n /**\n * Check if a value is null or undefined\n * @param {*} value - Value to check\n * @returns {boolean} True if null or undefined\n */\n static isNullOrUndefined(value) {\n return value === null || value === undefined;\n }\n\n /**\n * Deep clone an object\n * @param {*} obj - Object to clone\n * @returns {*} Cloned object\n */\n static deepClone(obj) {\n if (obj === null || typeof obj !== 'object') return obj;\n if (obj instanceof Date) return new Date(obj.getTime());\n if (obj instanceof Array) return obj.map(item => this.deepClone(item));\n if (obj instanceof Object) {\n const clonedObj = {};\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n clonedObj[key] = this.deepClone(obj[key]);\n }\n }\n return clonedObj;\n }\n }\n\n /**\n * Merge objects deeply\n * @param {object} target - Target object\n * @param {...object} sources - Source objects to merge\n * @returns {object} Merged object\n */\n static deepMerge(target, ...sources) {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (this.isObject(target) && this.isObject(source)) {\n for (const key in source) {\n if (this.isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n this.deepMerge(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n\n return this.deepMerge(target, ...sources);\n }\n\n /**\n * Check if value is a plain object\n * @param {*} item - Value to check\n * @returns {boolean} True if plain object\n */\n static isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n }\n\n /**\n * Debounce function calls\n * @param {function} func - Function to debounce\n * @param {number} wait - Wait time in milliseconds\n * @returns {function} Debounced function\n */\n static debounce(func, wait) {\n let timeout;\n return function executedFunction(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n }\n\n /**\n * Throttle function calls\n * @param {function} func - Function to throttle\n * @param {number} limit - Time limit in milliseconds\n * @returns {function} Throttled function\n */\n static throttle(func, limit) {\n let inThrottle;\n return function(...args) {\n if (!inThrottle) {\n func.apply(this, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n }\n\n /**\n * Generate a unique ID\n * @param {string} prefix - Optional prefix for the ID\n * @returns {string} Unique ID\n */\n static generateId(prefix = '') {\n const timestamp = Date.now().toString(36);\n const randomStr = Math.random().toString(36).substr(2, 9);\n return prefix ? `${prefix}_${timestamp}_${randomStr}` : `${timestamp}_${randomStr}`;\n }\n\n /**\n * Escape HTML special characters\n * @param {string} str - String to escape\n * @returns {string} Escaped string\n */\n static escapeHtml(str) {\n const entityMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/',\n '`': '`',\n '=': '='\n };\n\n return String(str).replace(/[&<>\"'`=\\/]/g, s => entityMap[s]);\n }\n\n /**\n * Check password strength and provide detailed feedback\n * @param {string} password - Password to check\n * @returns {object} Password strength analysis\n */\n static checkPasswordStrength(password) {\n if (!password || typeof password !== 'string') {\n return {\n score: 0,\n strength: 'invalid',\n feedback: ['Password must be a non-empty string'],\n details: {\n length: 0,\n hasLowercase: false,\n hasUppercase: false,\n hasNumbers: false,\n hasSpecialChars: false,\n hasCommonPatterns: false,\n isCommonPassword: false\n }\n };\n }\n\n const feedback = [];\n const details = {\n length: password.length,\n hasLowercase: /[a-z]/.test(password),\n hasUppercase: /[A-Z]/.test(password),\n hasNumbers: /[0-9]/.test(password),\n hasSpecialChars: /[^a-zA-Z0-9]/.test(password),\n hasCommonPatterns: false,\n isCommonPassword: false\n };\n\n let score = 0;\n\n // Length scoring\n if (password.length < 6) {\n feedback.push('Password should be at least 6 characters long');\n } else if (password.length < 8) {\n score += 1;\n feedback.push('Consider using at least 8 characters for better security');\n } else if (password.length < 12) {\n score += 3;\n } else {\n score += 4;\n }\n\n // Character variety scoring\n if (details.hasLowercase) score += 1;\n else feedback.push('Include lowercase letters');\n\n if (details.hasUppercase) score += 1;\n else feedback.push('Include uppercase letters');\n\n if (details.hasNumbers) score += 1;\n else feedback.push('Include numbers');\n\n if (details.hasSpecialChars) score += 2;\n else feedback.push('Include special characters (!@#$%^&* etc.)');\n\n // Check for common patterns\n const commonPatterns = [\n /123/, // Sequential numbers\n /abc/i, // Sequential letters\n /qwerty/i, // Keyboard patterns\n /asdf/i, // Keyboard patterns\n /(.)\\1{2,}/, // Repeated characters (aaa, 111)\n /password/i, // Contains \"password\"\n /admin/i, // Contains \"admin\"\n /user/i, // Contains \"user\"\n /login/i // Contains \"login\"\n ];\n\n for (const pattern of commonPatterns) {\n if (pattern.test(password)) {\n details.hasCommonPatterns = true;\n score -= 1;\n feedback.push('Avoid common patterns and dictionary words');\n break;\n }\n }\n\n // Check against very common passwords\n const commonPasswords = [\n '123456', 'password', '123456789', '12345678', '12345',\n '1234567', '1234567890', 'qwerty', 'abc123', '111111',\n '123123', 'admin', 'letmein', 'welcome', 'monkey',\n 'password123', '123qwe', 'qwerty123', '000000', 'dragon',\n 'sunshine', 'princess', 'azerty', '1234', 'iloveyou',\n 'trustno1', 'superman', 'shadow', 'master', 'jennifer'\n ];\n\n if (commonPasswords.includes(password.toLowerCase())) {\n details.isCommonPassword = true;\n score = Math.max(0, score - 3);\n feedback.push('This password is too common and easily guessed');\n }\n\n // Calculate final strength\n let strength;\n if (score < 2) {\n strength = 'very-weak';\n } else if (score < 4) {\n strength = 'weak';\n } else if (score < 6) {\n strength = 'fair';\n } else if (score < 8) {\n strength = 'good';\n } else {\n strength = 'strong';\n }\n\n // Add positive feedback for strong passwords\n if (score >= 7 && feedback.length === 0) {\n feedback.push('Strong password! Consider using a password manager.');\n } else if (score >= 5 && feedback.length <= 1) {\n feedback.push('Good password strength. Consider adding more variety.');\n }\n\n return {\n score: Math.max(0, score),\n strength,\n feedback,\n details\n };\n }\n\n /**\n * Generate a secure password with customizable options\n * @param {object} options - Password generation options\n * @param {number} options.length - Password length (default: 12)\n * @param {boolean} options.includeLowercase - Include lowercase letters (default: true)\n * @param {boolean} options.includeUppercase - Include uppercase letters (default: true)\n * @param {boolean} options.includeNumbers - Include numbers (default: true)\n * @param {boolean} options.includeSpecialChars - Include special characters (default: true)\n * @param {string} options.customChars - Custom character set to use\n * @param {boolean} options.excludeAmbiguous - Exclude ambiguous characters like 0, O, l, I (default: false)\n * @returns {string} Generated password\n */\n static generatePassword(options = {}) {\n const defaults = {\n length: 12,\n includeLowercase: true,\n includeUppercase: true,\n includeNumbers: true,\n includeSpecialChars: true,\n customChars: '',\n excludeAmbiguous: false\n };\n\n const config = { ...defaults, ...options };\n\n if (config.length < 4) {\n throw new Error('Password length must be at least 4 characters');\n }\n\n // Build character sets\n let lowercase = 'abcdefghijklmnopqrstuvwxyz';\n let uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n let numbers = '0123456789';\n let specialChars = '!@#$%^&*()_+-=[]{}|;:,.<>?';\n\n // Remove ambiguous characters if requested\n if (config.excludeAmbiguous) {\n lowercase = lowercase.replace(/[il]/g, '');\n uppercase = uppercase.replace(/[IOL]/g, '');\n numbers = numbers.replace(/[01]/g, '');\n specialChars = specialChars.replace(/[|]/g, '');\n }\n\n // Build character pool\n let charPool = '';\n const requiredChars = [];\n\n if (config.customChars) {\n charPool = config.customChars;\n } else {\n if (config.includeLowercase) {\n charPool += lowercase;\n requiredChars.push(lowercase[Math.floor(Math.random() * lowercase.length)]);\n }\n if (config.includeUppercase) {\n charPool += uppercase;\n requiredChars.push(uppercase[Math.floor(Math.random() * uppercase.length)]);\n }\n if (config.includeNumbers) {\n charPool += numbers;\n requiredChars.push(numbers[Math.floor(Math.random() * numbers.length)]);\n }\n if (config.includeSpecialChars) {\n charPool += specialChars;\n requiredChars.push(specialChars[Math.floor(Math.random() * specialChars.length)]);\n }\n }\n\n if (!charPool) {\n throw new Error('No character types selected for password generation');\n }\n\n // Generate password\n let password = '';\n\n // Add required characters first to ensure variety\n for (const char of requiredChars) {\n password += char;\n }\n\n // Fill remaining length with random characters\n for (let i = password.length; i < config.length; i++) {\n password += charPool[Math.floor(Math.random() * charPool.length)];\n }\n\n // Shuffle the password to avoid predictable patterns\n return password.split('').sort(() => Math.random() - 0.5).join('');\n }\n\n /**\n * Parse query string into object\n * @param {string} queryString - Query string to parse\n * @returns {object} Parsed query parameters\n */\n static parseQueryString(queryString) {\n const params = {};\n const searchParams = new URLSearchParams(queryString);\n for (const [key, value] of searchParams.entries()) {\n params[key] = value;\n }\n return params;\n }\n\n /**\n * Convert object to query string\n * @param {object} params - Parameters object\n * @returns {string} Query string\n */\n static toQueryString(params) {\n return new URLSearchParams(params).toString();\n }\n\n /**\n * Wrap data objects to provide get() method support\n * This ensures pipe formatting works in all contexts\n * @param {*} data - Data to wrap\n * @param {object} rootContext - Optional root context for nested access\n * @returns {*} Wrapped data if object/array, otherwise original\n */\n static wrapData(data, rootContext = null, depth = 3) {\n if (!data || typeof data !== 'object') {\n return data;\n }\n\n // Don't wrap built-in types (Date, RegExp, etc.)\n if (data instanceof Date || data instanceof RegExp || data instanceof Error) {\n return data;\n }\n\n // Stop wrapping at max depth to prevent infinite recursion\n if (depth <= 0) {\n return data;\n }\n\n // Don't wrap if already has get method\n if (typeof data.getContextValue === 'function') {\n return data;\n }\n\n // Handle arrays specially - wrap each element but keep as array\n if (Array.isArray(data)) {\n return data.map(item => {\n if (item && typeof item === 'object' && !item.getContextValue) {\n return new DataWrapper(item, rootContext);\n }\n return item;\n });\n }\n\n // Use DataWrapper for objects\n return new DataWrapper(data, rootContext);\n }\n}\n\n/**\n * DataWrapper - Wraps plain objects to provide get() method with pipe support\n * Used internally by View to ensure all data objects support formatting\n */\nclass DataWrapper {\n constructor(data, rootContext = null) {\n // Store the wrapped data as non-enumerable to avoid JSDOM serialization issues\n Object.defineProperty(this, '_data', {\n value: data,\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n Object.defineProperty(this, '_rootContext', {\n value: rootContext,\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n // Copy all properties from data to this wrapper\n // This allows direct property access\n if (data && typeof data === 'object') {\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n const value = data[key];\n // Wrap nested values using wrapData for consistency\n this[key] = MOJOUtils.wrapData(value, rootContext);\n }\n }\n }\n }\n\n /**\n * Get value with pipe support\n * @param {string} key - Key with optional pipes\n * @returns {*} Value, possibly formatted\n */\n getContextValue(key) {\n // Check if key has pipes\n let field = key;\n let pipes = '';\n\n // Find the first pipe that's not inside parentheses\n let parenDepth = 0;\n let pipeIndex = -1;\n\n for (let i = 0; i < key.length; i++) {\n const char = key[i];\n if (char === '(') parenDepth++;\n else if (char === ')') parenDepth--;\n else if (char === '|' && parenDepth === 0) {\n pipeIndex = i;\n break;\n }\n }\n\n if (pipeIndex > -1) {\n field = key.substring(0, pipeIndex).trim();\n pipes = key.substring(pipeIndex + 1).trim();\n }\n\n // Get value - supports both direct properties and dot-notation paths\n let value;\n \n // First check if it's a direct property on the wrapper (already wrapped)\n if (field in this && field !== '_data' && field !== '_rootContext') {\n value = this[field];\n } else {\n // Try to get nested value using dot-notation path\n value = MOJOUtils.getNestedValue(this._data, field);\n }\n\n // Apply pipes if present, passing root context for variable resolution\n if (pipes && value !== undefined) {\n return dataFormatter.pipe(value, pipes, this._rootContext || this._data);\n }\n\n return value;\n }\n\n /**\n * Check if wrapper has a property\n * @param {string} key - Property key\n * @returns {boolean} True if property exists\n */\n has(key) {\n return this._data && this._data.hasOwnProperty(key);\n }\n\n /**\n * Get the raw wrapped data\n * @returns {object} The original data object\n */\n toJSON() {\n return this._data;\n }\n}\n\n// Attach DataWrapper to MOJOUtils for easy access\nMOJOUtils.DataWrapper = DataWrapper;\n\n// Export as both class and singleton for flexibility\nexport default MOJOUtils;\nexport { MOJOUtils, DataWrapper };\n\n// Also attach to window for global access if needed\nif (typeof window !== 'undefined') {\n // window.MOJO = window.MOJO || {};\n // window.MOJO.Utils = MOJOUtils;\n // window.MOJO.DataWrapper = DataWrapper;\n window.utils = MOJOUtils;\n}\n","/**\n * MOJO Mustache - Clean ES6 Template Engine\n * Simplified mustache implementation for MOJO Framework\n * Based on mustache.js logic-less templates\n */\n\nimport MOJOUtils from './MOJOUtils.js';\n\n// Utility functions\nconst objectToString = Object.prototype.toString;\nconst isArray = Array.isArray || function(obj) {\n return objectToString.call(obj) === '[object Array]';\n};\n\nconst isFunction = function(obj) {\n return typeof obj === 'function';\n};\n\nconst isObject = function(obj) {\n return obj != null && typeof obj === 'object';\n};\n\nconst escapeHtml = function(string) {\n const entityMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/',\n '`': '`',\n '=': '='\n };\n\n return String(string).replace(/[&<>\"'`=\\/]/g, function(s) {\n return entityMap[s];\n });\n};\n\n// Scanner class for parsing templates\nclass Scanner {\n constructor(string) {\n this.string = string;\n this.tail = string;\n this.pos = 0;\n }\n\n eos() {\n return this.tail === '';\n }\n\n scan(re) {\n const match = this.tail.match(re);\n if (!match || match.index !== 0) {\n return '';\n }\n\n const string = match[0];\n this.tail = this.tail.substring(string.length);\n this.pos += string.length;\n return string;\n }\n\n scanUntil(re) {\n const index = this.tail.search(re);\n let match;\n\n switch (index) {\n case -1:\n match = this.tail;\n this.tail = '';\n break;\n case 0:\n match = '';\n break;\n default:\n match = this.tail.substring(0, index);\n this.tail = this.tail.substring(index);\n }\n\n this.pos += match.length;\n return match;\n }\n}\n\n// Context class for variable resolution\nclass Context {\n constructor(view, parentContext) {\n this.view = view;\n this.cache = { '.': this.view };\n this.parent = parentContext;\n\n // Generate unique context ID for render caching\n if (!this.view?._cacheId) {\n if (this.view && typeof this.view === 'object') {\n this.view._cacheId = Math.random().toString(36).substring(2);\n }\n }\n }\n\n push(view) {\n return new Context(view, this);\n }\n\n lookup(name) {\n // Check render-level cache first\n if (this.renderCache && this.view?._cacheId) {\n const cacheKey = `${this.view._cacheId}:${name}`;\n if (this.renderCache.has(cacheKey)) {\n return this.renderCache.get(cacheKey);\n }\n }\n\n // Special case: '.' refers to the current context value itself\n if (name === '.') {\n return this.view;\n }\n\n // Handle dot-prefix to prevent context chain walking\n // If name starts with '.', only look in current context\n if (name && name.startsWith('.')) {\n let actualName = name.substring(1);\n let shouldIterate = false;\n\n // Check for |iter suffix for array iteration\n if (actualName.endsWith('|iter')) {\n actualName = actualName.substring(0, actualName.length - 5); // Remove '|iter'\n shouldIterate = true;\n }\n\n // Only check current view, not parents\n if (this.view && typeof this.view === 'object') {\n let value;\n\n // Check if view has a get method for unified access\n if (typeof this.view.getContextValue === 'function') {\n try {\n value = this.view.getContextValue(actualName);\n if (value !== undefined) {\n if (isFunction(value)) {\n value = value.call(this.view);\n }\n }\n } catch (e) {\n // Fall back to direct property access\n value = undefined;\n }\n }\n\n // Direct property access if get didn't work\n if (value === undefined && actualName in this.view) {\n value = this.view[actualName];\n if (isFunction(value)) {\n value = value.call(this.view);\n }\n }\n\n // Handle array values based on shouldIterate flag\n if (isArray(value)) {\n if (shouldIterate) {\n // Return array for iteration\n return value;\n } else {\n // Return boolean for existence check\n return value.length > 0;\n }\n }\n\n if (isObject(value)) {\n if (shouldIterate) {\n // Return array of key-value pairs for iteration\n return Object.entries(value).map(([key, val]) => ({\n key: key,\n value: val\n }));\n } else {\n // Return boolean for existence check\n return Object.keys(value).length > 0;\n }\n }\n\n return value;\n }\n\n return undefined; // Don't walk up the chain\n }\n\n // Original lookup logic for non-dot-prefixed names\n const cache = this.cache;\n\n let value;\n if (cache.hasOwnProperty(name)) {\n value = cache[name];\n } else {\n let context = this;\n let intermediateValue;\n let names;\n let index;\n let lookupHit = false;\n\n while (context) {\n // Check if view has a get method for unified access\n if (context.view && typeof context.view.getContextValue === 'function') {\n try {\n intermediateValue = context.view.getContextValue(name);\n if (intermediateValue !== undefined) {\n lookupHit = true;\n }\n } catch (e) {\n // If get throws, fall back to standard lookup\n lookupHit = false;\n }\n }\n\n // Fall back to standard property lookup if get method didn't work\n if (!lookupHit) {\n if (name.indexOf('.') > 0) {\n intermediateValue = context.view;\n names = name.split('.');\n index = 0;\n\n while (intermediateValue != null && index < names.length) {\n // Check if intermediate value has a get method\n if (intermediateValue && typeof intermediateValue.getContextValue === 'function' && index < names.length) {\n try {\n const remainingPath = names.slice(index).join('.');\n intermediateValue = intermediateValue.getContextValue(remainingPath);\n index = names.length; // Skip to end\n if (intermediateValue !== undefined) {\n lookupHit = true;\n }\n } catch (e) {\n // Fall back to property access\n if (index === names.length - 1) {\n lookupHit = (\n hasProperty(intermediateValue, names[index]) ||\n primitiveHasOwnProperty(intermediateValue, names[index])\n );\n }\n intermediateValue = intermediateValue[names[index++]];\n }\n } else {\n if (index === names.length - 1) {\n lookupHit = (\n hasProperty(intermediateValue, names[index]) ||\n primitiveHasOwnProperty(intermediateValue, names[index])\n );\n }\n intermediateValue = intermediateValue[names[index++]];\n }\n }\n } else {\n intermediateValue = context.view[name];\n lookupHit = hasProperty(context.view, name);\n }\n }\n\n if (lookupHit) {\n value = intermediateValue;\n break;\n }\n\n context = context.parent;\n }\n\n cache[name] = value;\n }\n\n if (isFunction(value)) value = value.call(this.view);\n\n // Store in render-level cache after function evaluation\n if (this.renderCache && this.view?._cacheId) {\n const cacheKey = `${this.view._cacheId}:${name}`;\n this.renderCache.set(cacheKey, value);\n }\n\n return value;\n }\n}\n\n// Helper functions\nfunction hasProperty(obj, propName) {\n return obj != null && typeof obj === 'object' && (propName in obj);\n}\n\nfunction primitiveHasOwnProperty(primitive, propName) {\n return (\n primitive != null &&\n typeof primitive !== 'object' &&\n primitive.hasOwnProperty &&\n primitive.hasOwnProperty(propName)\n );\n}\n\n// Writer class for rendering\nclass Writer {\n constructor() {\n this.templateCache = new Map();\n }\n\n clearCache() {\n this.templateCache.clear();\n }\n\n parse(template, tags) {\n tags = tags || ['{{', '}}'];\n\n const cacheKey = template + ':' + tags.join(':');\n let tokens = this.templateCache.get(cacheKey);\n\n if (tokens == null) {\n tokens = this.parseTemplate(template, tags);\n this.templateCache.set(cacheKey, tokens);\n }\n\n return tokens;\n }\n\n parseTemplate(template, tags) {\n if (!template) return [];\n\n const openingTag = tags[0];\n const closingTag = tags[1];\n const scanner = new Scanner(template);\n const tokens = [];\n let start, type, value, chr, token;\n\n const openingTagRe = new RegExp(escapeRegExp(openingTag) + '\\\\s*');\n const closingTagRe = new RegExp('\\\\s*' + escapeRegExp(closingTag));\n const closingCurlyRe = new RegExp('\\\\s*' + escapeRegExp('}' + closingTag));\n\n while (!scanner.eos()) {\n start = scanner.pos;\n\n // Match text before tags\n value = scanner.scanUntil(openingTagRe);\n\n if (value) {\n for (let i = 0; i < value.length; ++i) {\n chr = value.charAt(i);\n\n if (chr === '\\n') {\n tokens.push(['text', chr]);\n } else {\n tokens.push(['text', chr]);\n }\n }\n }\n\n if (!scanner.scan(openingTagRe)) break;\n\n type = scanner.scan(/[#^\\/>{&=!]/);\n if (!type) type = 'name';\n\n scanner.scan(/\\s*/);\n\n if (type === '=') {\n value = scanner.scanUntil(/\\s*=/);\n scanner.scan(/\\s*=/);\n scanner.scanUntil(closingTagRe);\n } else if (type === '{') {\n value = scanner.scanUntil(closingCurlyRe);\n scanner.scan(closingCurlyRe);\n type = '&';\n } else {\n value = scanner.scanUntil(closingTagRe);\n }\n\n scanner.scan(closingTagRe);\n\n if (type === '#' || type === '^') {\n token = [type, value, start, scanner.pos];\n tokens.push(token);\n } else if (type === '/') {\n // Find matching opening section\n let openSection;\n for (let i = tokens.length - 1; i >= 0; --i) {\n if (tokens[i][0] === '#' || tokens[i][0] === '^') {\n if (tokens[i][1] === value) {\n openSection = tokens[i];\n break;\n }\n }\n }\n\n if (openSection) {\n // Add closing position if token doesn't have it yet\n if (openSection.length === 4) {\n openSection.push(scanner.pos);\n }\n }\n // Add closing token for nestSections processing\n tokens.push([type, value, start, scanner.pos]);\n } else {\n tokens.push([type, value, start, scanner.pos]);\n }\n }\n\n return this.nestSections(this.squashTokens(tokens));\n }\n\n squashTokens(tokens) {\n const squashedTokens = [];\n let token, lastToken;\n\n for (let i = 0; i < tokens.length; ++i) {\n token = tokens[i];\n\n if (token) {\n if (token[0] === 'text' && lastToken && lastToken[0] === 'text') {\n lastToken[1] += token[1];\n lastToken[3] = token[3];\n } else {\n squashedTokens.push(token);\n lastToken = token;\n }\n }\n }\n\n return squashedTokens;\n }\n\n nestSections(tokens) {\n const nestedTokens = [];\n let collector = nestedTokens;\n const sections = [];\n\n for (let i = 0; i < tokens.length; ++i) {\n const token = tokens[i];\n\n switch (token[0]) {\n case '#':\n case '^':\n // Create section token with proper structure: [type, name, start, end, children, closing]\n const sectionToken = [\n token[0], // type ('#' or '^')\n token[1], // section name\n token[2], // start position\n token[3], // end position after opening tag\n [], // children array\n token[4] || null // closing position (if set during parsing)\n ];\n\n collector.push(sectionToken);\n sections.push(sectionToken);\n collector = sectionToken[4]; // children array\n break;\n case '/':\n const section = sections.pop();\n if (section) {\n // Set closing position\n section[5] = token[2];\n // Return to parent collector\n collector = sections.length > 0 ? sections[sections.length - 1][4] : nestedTokens;\n }\n break;\n default:\n collector.push(token);\n }\n }\n\n return nestedTokens;\n }\n\n render(template, view, partials, config) {\n const tags = this.getConfigTags(config) || ['{{', '}}'];\n const tokens = this.parse(template, tags);\n\n // Create render-level cache for this render operation\n const renderCache = new Map();\n\n return this.renderTokens(tokens, new Context(view), partials, template, config, renderCache);\n }\n\n renderTokens(tokens, context, partials, originalTemplate, config, renderCache) {\n // Attach render cache to context if provided\n if (renderCache && !context.renderCache) {\n context.renderCache = renderCache;\n }\n let buffer = '';\n\n for (let i = 0; i < tokens.length; ++i) {\n const token = tokens[i];\n let value;\n\n switch (token[0]) {\n case '#':\n value = context.lookup(token[1]);\n if (!value) continue;\n\n // Ensure we have child tokens\n const childTokens = token[4];\n if (!childTokens || !isArray(childTokens)) {\n console.warn(`MUSTACHE WARNING - Section ${token[1]} has no child tokens:`, token);\n continue;\n }\n\n if (isArray(value)) {\n // Process each array item\n for (let j = 0; j < value.length; ++j) {\n const itemContext = context.push(value[j]);\n // Pass render cache to child context\n if (context.renderCache) {\n itemContext.renderCache = context.renderCache;\n }\n const itemResult = this.renderTokens(childTokens, itemContext, partials, originalTemplate, config, renderCache);\n buffer += itemResult;\n }\n } else if (typeof value === 'object' || typeof value === 'string' || typeof value === 'number') {\n const pushedContext = context.push(value);\n // Pass render cache to child context\n if (context.renderCache) {\n pushedContext.renderCache = context.renderCache;\n }\n buffer += this.renderTokens(childTokens, pushedContext, partials, originalTemplate, config, renderCache);\n } else if (isFunction(value)) {\n const text = originalTemplate == null ? null : originalTemplate.slice(token[3], token[5]);\n value = value.call(context.view, text, (template) => this.render(template, context.view, partials, config));\n if (value != null) buffer += value;\n } else if (value) {\n // Handle boolean true and other truthy values\n buffer += this.renderTokens(childTokens, context, partials, originalTemplate, config, renderCache);\n }\n break;\n\n case '^':\n value = context.lookup(token[1]);\n if (!value || (isArray(value) && value.length === 0)) {\n // Ensure we have child tokens for inverted sections too\n const childTokens = token[4];\n if (childTokens && isArray(childTokens)) {\n buffer += this.renderTokens(childTokens, context, partials, originalTemplate, config, renderCache);\n }\n }\n break;\n\n case '>':\n if (!partials) continue;\n value = isFunction(partials) ? partials(token[1]) : partials[token[1]];\n if (value != null) {\n buffer += this.render(value, context.view, partials, config);\n }\n break;\n\n case '&':\n value = context.lookup(token[1]);\n if (value != null) buffer += value;\n break;\n\n case 'name':\n value = context.lookup(token[1]);\n if (value != null) buffer += escapeHtml(value);\n break;\n\n case 'text':\n buffer += token[1];\n break;\n }\n }\n\n return buffer;\n }\n\n getConfigTags(config) {\n if (isObject(config) && isArray(config.tags)) {\n return config.tags;\n }\n return null;\n }\n}\n\nfunction escapeRegExp(string) {\n return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&');\n}\n\n// Default writer instance\nconst defaultWriter = new Writer();\n\n// Main Mustache object\nconst Mustache = {\n name: 'MOJO Mustache',\n version: '1.0.0',\n tags: ['{{', '}}'],\n\n Scanner,\n Context,\n Writer,\n\n escape: escapeHtml,\n\n clearCache() {\n return defaultWriter.clearCache();\n },\n\n parse(template, tags) {\n return defaultWriter.parse(template, tags);\n },\n\n render(template, view, partials, config) {\n if (typeof template !== 'string') {\n throw new TypeError('Invalid template! Template should be a \"string\"');\n }\n\n // Auto-wrap context to enable pipe formatters if not already wrapped\n // This ensures pipes work everywhere without requiring manual wrapping\n if (view && typeof view === 'object' && !view.getContextValue && typeof view.toJSON !== 'function') {\n view = MOJOUtils.wrapData(view);\n }\n\n return defaultWriter.render(template, view, partials, config);\n }\n};\n\n// ES6 Module Export\nexport default Mustache;\n","// EventDelegate.js\nexport class EventDelegate {\n constructor(view) {\n this.view = view;\n this.domListeners = [];\n this.debounceTimers = new Map();\n }\n\n bind(rootEl) {\n this.unbind();\n if (!rootEl) return;\n\n const onClick = async (event) => {\n const actionEl = event.target.closest('[data-action]');\n if (actionEl && this.shouldHandle(actionEl, event)) {\n const action = actionEl.getAttribute('data-action');\n\n // Hide any tooltips on the clicked element\n this.hideTooltip(actionEl);\n\n const handled = await this.dispatch(action, event, actionEl);\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n event.handledByChild = true;\n return;\n }\n }\n const navEl = event.target.closest('a[href], [data-page]');\n if (navEl && !navEl.hasAttribute('data-action') && this.shouldHandle(navEl, event)) {\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.button === 1) return;\n if (navEl.tagName === 'A') {\n const href = navEl.getAttribute('href');\n if (href && href !== '#' && !href.startsWith('#') &&\n (this.view.isExternalLink(href) || navEl.hasAttribute('data-external'))) return;\n }\n\n // Hide any tooltips on the clicked element before navigation\n this.hideTooltip(navEl);\n\n event.preventDefault();\n event.stopPropagation();\n event.handledByChild = true;\n if (navEl.hasAttribute('data-page')) await this.view.handlePageNavigation(navEl);\n else await this.view.handleHrefNavigation(navEl);\n }\n };\n\n const onChange = (event) => {\n const el = event.target.closest('[data-change-action]');\n if (!el || !this.shouldHandle(el, event)) return;\n const action = el.getAttribute('data-change-action');\n this.dispatchChange(action, event, el).then((handled) => {\n if (handled) {\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n };\n\n const onInput = (event) => {\n const el = event.target.closest('[data-change-action]');\n if (!el || !this.shouldHandle(el, event)) return;\n\n const liveSearch = event.target.matches('[data-filter=\"live-search\"]');\n if (!liveSearch) return;\n\n const action = el.getAttribute('data-change-action');\n const debounceMs = parseInt(el.getAttribute('data-filter-debounce')) || 300;\n const timerId = `${action}-${el.getAttribute('data-container') || 'default'}`;\n\n // Clear existing timer\n if (this.debounceTimers.has(timerId)) {\n clearTimeout(this.debounceTimers.get(timerId));\n }\n\n // Set new debounced timer\n const timer = setTimeout(() => {\n this.debounceTimers.delete(timerId);\n this.dispatchChange(action, event, el).then((handled) => {\n if (handled) {\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n }, debounceMs);\n\n this.debounceTimers.set(timerId, timer);\n };\n\n const onKeyDown = (event) => {\n if (event.target.matches('[data-filter=\"search\"]')) return;\n const el = event.target.closest('[data-keydown-action]') || event.target.closest('[data-change-action]');\n if (!el || !this.shouldHandle(el, event)) return;\n let changeKeys = [\"Enter\"];\n if (el.getAttribute('data-change-keys')) {\n changeKeys = el.getAttribute('data-change-keys').split(',').map(key => key.trim());\n }\n if (changeKeys.includes('*') || changeKeys.includes(event.key)) {\n const action = el.getAttribute('data-keydown-action') || el.getAttribute('data-change-action');\n this.dispatch(action, event, el).then((handled) => {\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n }\n };\n\n const onSubmit = (event) => {\n const form = event.target.closest('form[data-action]');\n if (!form || !this.shouldHandle(form, event)) return;\n event.preventDefault();\n const action = form.getAttribute('data-action');\n this.dispatch(action, event, form);\n };\n\n rootEl.addEventListener('click', onClick);\n rootEl.addEventListener('change', onChange);\n rootEl.addEventListener('input', onInput);\n rootEl.addEventListener('keydown', onKeyDown);\n rootEl.addEventListener('submit', onSubmit);\n\n this.domListeners.push(\n { el: rootEl, type: 'click', fn: onClick },\n { el: rootEl, type: 'change', fn: onChange },\n { el: rootEl, type: 'input', fn: onInput },\n { el: rootEl, type: 'keydown', fn: onKeyDown },\n { el: rootEl, type: 'submit', fn: onSubmit },\n );\n }\n\n unbind() {\n for (const { el, type, fn } of this.domListeners) el.removeEventListener(type, fn);\n this.domListeners = [];\n\n // Clear any pending debounce timers\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n }\n\n hideDropdown(element) {\n const dropdownMenu = element.closest('.dropdown-menu');\n const dropdown = dropdownMenu.closest('.dropdown');\n if (!dropdown) {\n return;\n }\n\n const dropdownBtn = dropdown.querySelector('[data-bs-toggle=\"dropdown\"]');\n if (dropdownBtn && window.bootstrap?.Dropdown) {\n const dropdownInstance = window.bootstrap.Dropdown.getInstance(dropdownBtn);\n dropdownInstance?.hide();\n }\n }\n\n hideTooltip(element) {\n // Hide tooltip on the clicked element\n if (element && window.bootstrap?.Tooltip) {\n const tooltip = window.bootstrap.Tooltip.getInstance(element);\n if (tooltip) {\n tooltip.dispose();\n // tooltip.hide();\n }\n }\n }\n\n hideAllTooltips() {\n // Hide all visible tooltips in the document\n if (window.bootstrap?.Tooltip) {\n const tooltips = document.querySelectorAll('[data-bs-toggle=\"tooltip\"]');\n tooltips.forEach(el => {\n const tooltip = window.bootstrap.Tooltip.getInstance(el);\n if (tooltip) {\n tooltip.hide();\n }\n });\n }\n }\n\n async dispatch(action, event, el) {\n const v = this.view;\n const cap = (s) => (s.includes('-') ? s.split('-').map(w => w[0].toUpperCase()+w.slice(1)).join('') : s[0].toUpperCase()+s.slice(1));\n\n const specific = `handleAction${cap(action)}`;\n if (typeof v[specific] === 'function') {\n try { event.preventDefault(); await v[specific](event, el); return true; }\n catch (e) { console.error(`Error in action ${action}:`, e); v.handleActionError(action, e, event, el); return true; }\n }\n\n const generic = `onAction${cap(action)}`;\n if (typeof v[generic] === 'function') {\n try {\n if (await v[generic](event, el)) {\n const isInDropdown = !!el.closest('.dropdown-menu');\n if (isInDropdown) this.hideDropdown(el);\n event.preventDefault();\n event.stopPropagation();\n return true;\n }\n return false;\n }\n catch (e) { console.error(`Error in action ${action}:`, e); v.handleActionError(action, e, event, el); return true; }\n }\n\n const passThru = `onPassThruAction${cap(action)}`;\n if (typeof v[passThru] === 'function') {\n try { await v[passThru](event, el); return false; }\n catch (e) { console.error(`Error in action ${action}:`, e); v.handleActionError(action, e, event, el); return true; }\n }\n\n if (typeof v.onActionDefault === 'function') {\n try { return await v.onActionDefault(action, event, el); }\n catch (e) { console.error(`Error in default action handler for ${action}:`, e); v.handleActionError(action, e, event, el); return true; }\n }\n\n v.emit?.(`action:${action}`, { action, event, element: el });\n return false;\n }\n\n async dispatchChange(action, event, el) {\n const v = this.view;\n const cap = (s) => (s.includes('-') ? s.split('-').map(w => w[0].toUpperCase()+w.slice(1)).join('') : s[0].toUpperCase()+s.slice(1));\n\n const changeHandler = `onChange${cap(action)}`;\n if (typeof v[changeHandler] === 'function') {\n try {\n await v[changeHandler](event, el);\n return true;\n }\n catch (e) {\n console.error(`Error in onChange ${action}:`, e);\n v.handleActionError?.(action, e, event, el);\n return true;\n }\n }\n\n // Fall back to regular dispatch if no onChange handler exists\n return await this.dispatch(action, event, el);\n }\n\n shouldHandle(el, event) {\n if (this.owns(el)) return true;\n if (this.contains(el) && !event.handledByChild) return true;\n return false;\n }\n\n owns(el) {\n const root = this.view.element;\n if (!root || !root.contains(el)) return false;\n for (const child of Object.values(this.view.children)) {\n if (child.element && child.element.contains(el)) return false;\n }\n return true;\n }\n\n contains(el) { return !!this.view.element && this.view.element.contains(el); }\n}\n\nexport default EventDelegate;\n","/**\n * EventEmitter - Lightweight event system for instance-level events.\n *\n * Provides a simple, consistent event API for Models, Collections, Views, and Pages.\n * Events are scoped to individual instances - use the global EventBus for cross-component communication.\n *\n * Usage as a mixin:\n * Object.assign(MyClass.prototype, EventEmitter);\n *\n * API:\n * on(event, callback, context) - Add event listener with optional context\n * off(event, callback, context) - Remove event listener\n * once(event, callback, context) - Add one-time event listener with optional context\n * emit(event, ...args) - Emit event to all listeners\n *\n * @example\n * // Clean context binding\n * model.on('change', this.handleChange, this);\n * model.off('change', this.handleChange, this); // Easy cleanup!\n * \n * // Traditional usage still works\n * model.on('change', (data) => console.log(data));\n */\n\nconst EventEmitter = {\n /**\n * Add an event listener\n * @param {string} event - Event name to listen for\n * @param {Function} callback - Function to call when event is emitted\n * @param {Object} [context] - Context to bind the callback to (optional)\n * @returns {Object} This instance for method chaining\n *\n * @example\n * // With context binding\n * model.on('change', this.handleChange, this);\n * \n * // Without context (traditional)\n * model.on('change', (data) => console.log(data));\n */\n on(event, callback, context) {\n if (!this._listeners) this._listeners = {};\n if (!this._listeners[event]) this._listeners[event] = [];\n \n const listener = {\n callback,\n context,\n fn: context ? callback.bind(context) : callback\n };\n \n this._listeners[event].push(listener);\n return this;\n },\n\n /**\n * Remove an event listener\n * @param {string} event - Event name\n * @param {Function} [callback] - Specific callback to remove. If omitted, removes all listeners for the event\n * @param {Object} [context] - Context that was used when adding the listener\n * @returns {Object} This instance for method chaining\n *\n * @example\n * // Remove specific listener with context\n * model.off('change', this.handleChange, this);\n *\n * // Remove specific callback (any context)\n * model.off('change', myHandler);\n *\n * // Remove all listeners for an event\n * model.off('change');\n */\n off(event, callback, context) {\n if (!this._listeners || !this._listeners[event]) return this;\n\n if (!callback) {\n // Remove all listeners for event\n delete this._listeners[event];\n } else {\n // Remove specific listener(s)\n this._listeners[event] = this._listeners[event].filter(listener => {\n // Match callback\n if (listener.callback !== callback) return true;\n \n // If context specified, must match context too\n if (arguments.length === 3 && listener.context !== context) return true;\n \n // This listener should be removed\n return false;\n });\n \n if (this._listeners[event].length === 0) {\n delete this._listeners[event];\n }\n }\n return this;\n },\n\n /**\n * Add a one-time event listener that automatically removes itself after being called\n * @param {string} event - Event name to listen for\n * @param {Function} callback - Function to call when event is emitted (called only once)\n * @param {Object} [context] - Context to bind the callback to (optional)\n * @returns {Object} This instance for method chaining\n *\n * @example\n * model.once('ready', this.handleReady, this);\n */\n once(event, callback, context) {\n const onceWrapper = (...args) => {\n this.off(event, onceWrapper);\n const fn = context ? callback.bind(context) : callback;\n fn.apply(context || this, args);\n };\n \n this.on(event, onceWrapper);\n return this;\n },\n\n /**\n * Emit an event to all registered listeners\n * @param {string} event - Event name to emit\n * @param {...*} args - Arguments to pass to event listeners\n * @returns {Object} This instance for method chaining\n *\n * @example\n * // Emit with single argument\n * model.emit('change', { field: 'name', value: 'John' });\n *\n * // Emit with multiple arguments\n * model.emit('update', oldValue, newValue, timestamp);\n *\n * // Emit without arguments\n * model.emit('ready');\n */\n emit(event, ...args) {\n if (!this._listeners || !this._listeners[event]) return this;\n \n // Copy the listeners in case one removes itself during emit\n const listeners = this._listeners[event].slice();\n \n for (const listener of listeners) {\n try {\n listener.fn.apply(listener.context || this, args);\n } catch (error) {\n // Don't allow one bad handler to block other listeners\n if (console && console.error) {\n console.error(`Error in ${event} event handler:`, error);\n }\n }\n }\n return this;\n }\n};\n\nexport default EventEmitter;","// -----------------------------------------------\n// Imports\n// -----------------------------------------------\nimport Mustache from '@core/utils/mustache.js';\nif (typeof window !== 'undefined') {\n window.Mustache = Mustache;\n}\nimport MOJOUtils from '@core/utils/MOJOUtils.js';\nimport EventDelegate from '@core/mixins/EventDelegate.js';\n\n// -----------------------------------------------\n// View\n// -----------------------------------------------\nexport class View {\n // ---------------------------------------------\n // Construction & defaults\n // ---------------------------------------------\n constructor(opts = {}) {\n this.tagName = opts.tagName ?? \"div\";\n this.className = opts.className ?? \"mojo-view\";\n this.style = opts.style ?? null; // inline css text\n this.id = opts.id ?? View._genId(); // element id\n this.containerId = opts.containerId ?? null; // container to render into\n this.container = opts.container ?? null; // container element\n\n // If container is a string, treat it as containerId and set container to null\n if (typeof this.container === 'string') {\n this.containerId = this.container;\n this.container = null;\n }\n this.parent = opts.parent ?? null; // parent view\n this.children = opts.children ?? {}; // dict of id -> child view\n this.template = opts.template || opts.templateUrl || \"\"; // string or function(model) -> string\n this.data = opts.data ?? {}; // data for Mustache or basic templating\n this.isRendering = false;\n this.lastRenderTime = 0;\n this.mounted = false;\n this.debug = opts.debug ?? false;\n this.app = opts.app ?? null;\n this.cacheTemplate = opts.cacheTemplate ?? true;\n this.enableTooltips = opts.enableTooltips ?? false; // Auto-initialize Bootstrap tooltips after render\n\n // keep original options\n this.options = { ...opts };\n\n // internal DOM element\n this.element = this._ensureElement();\n\n // in constructor\n this.events = new EventDelegate(this);\n\n if (opts.model) this.setModel(opts.model);\n\n }\n\n // ---------------------------------------------\n // Lifecycle hooks (overridable)\n // ---------------------------------------------\n async onInit() {\n\n }\n async onInitView() {\n if (this.initialized) return;\n this.initialized = true;\n await this.onInit();\n }\n async onBeforeRender() {}\n async onAfterRender() {}\n async onBeforeMount() {}\n async onAfterMount() {}\n async onBeforeUnmount() {}\n async onAfterUnmount() {}\n async onBeforeDestroy() {}\n async onAfterDestroy() {}\n\n // ---------------------------------------------\n // Public API\n // ---------------------------------------------\n setModel(model = {}) {\n let isDiff = model !== this.model;\n if (!isDiff) return this;\n if (this.model && this.model.off) {\n this.model.off(\"change\", this._onModelChange, this);\n }\n this.model = model;\n if (this.model && this.model.on) {\n this.model.on(\"change\", this._onModelChange, this);\n }\n\n // Set model on all children\n for (const id in this.children) {\n const child = this.children[id];\n if (child && typeof child.setModel === 'function') {\n child.setModel(model);\n }\n }\n\n if (isDiff ) {\n this._onModelChange();\n }\n return this;\n }\n\n _onModelChange() {\n if (this.isMounted()) {\n this.render();\n }\n }\n\n setTemplate(tpl) { this.template = tpl ?? \"\"; return this; }\n\n addChild(childView) {\n try {\n if (!childView || typeof childView !== \"object\") return this;\n childView.parent = this;\n if (this.getApp()) childView.app = this.app;\n this.children[childView.id] = childView;\n } catch (e) { View._warn(\"addChild error\", e); }\n return childView;\n }\n\n removeChild(idOrView) {\n try {\n const id = typeof idOrView === \"string\" ? idOrView : (idOrView && idOrView.id);\n if (!id) return this;\n const child = this.children[id];\n if (child) {\n // allow for async or sync destroy\n Promise.resolve(child.destroy()).catch(err => View._warn(\"removeChild destroy error\", err));\n delete this.children[id];\n }\n } catch (e) { View._warn(\"removeChild error\", e); }\n return this;\n }\n\n getChild(id) {\n return this.children[id];\n }\n\n async updateData(newData, rerender = false) {\n Object.assign(this.data, newData);\n\n if (rerender && this.isMounted()) {\n await this.render();\n }\n\n return this;\n }\n\n toggleClass(className, force) {\n if (force === undefined) {\n force = !this.element.classList.contains(className);\n }\n this.element.classList.toggle(className, force);\n return this;\n }\n\n addClass(className) {\n this.element.classList.add(className);\n return this;\n }\n\n setClass(className) {\n this.element.className = className;\n return this;\n }\n\n removeClass(className) {\n this.element.classList.remove(className);\n return this;\n }\n\n canRender() {\n if (this.isRendering) return false;\n // Optional render throttling\n const now = Date.now();\n if (this.options.renderCooldown > 0 && now - this.lastRenderTime < this.options.renderCooldown) {\n View._warn(`View ${this.id}: Render called too quickly, cooldown active`);\n return false;\n }\n if (this.options.noAppend) {\n if (this.parent) {\n if (!this.parent.contains(this.containerId || this.container)) {\n return false;\n } else if (this.containerId && !document.getElementById(this.containerId)) {\n return false;\n } else if (this.container && !document.contains(this.container)) {\n return false;\n }\n }\n }\n return true;\n }\n\n // ---------------------------------------------\n // Render flow\n // ---------------------------------------------\n async render(allowMount = true, container = null) {\n const now = Date.now();\n\n if (!this.canRender()) {\n return this;\n }\n\n this.isRendering = true;\n this.lastRenderTime = now;\n\n try {\n if (!this.initialized) await this.onInitView();\n this.unbindEvents();\n\n await this.onBeforeRender();\n if (this.getViewData) {\n this.data = await this.getViewData();\n }\n // 1) render own HTML (FIX #5: await the async template render)\n const html = await this.renderTemplate();\n this.element.innerHTML = html;\n\n if (allowMount && !this.isMounted()) {\n await this.mount(container)\n }\n\n // 3) render children\n await this._renderChildren();\n await this.onAfterRender();\n this.bindEvents();\n\n } catch (e) {\n View._warn(`Render error in ${this.id}`, e);\n } finally {\n // FIX #4: always reset isRendering\n this.isRendering = false;\n }\n\n return this;\n }\n\n async _renderChildren() {\n for (const id in this.children) {\n const child = this.children[id];\n if (!child) continue;\n child.parent = this;\n await Promise.resolve(child.render()).catch(err => View._warn(`Child render error (${id})`, err));\n }\n }\n\n async _unmountChildren() {\n for (const id in this.children) {\n const child = this.children[id];\n if (!child) continue;\n child.unbindEvents()\n }\n }\n\n\n isMounted() {\n return this.element?.isConnected;\n }\n\n getChildElementById(id, root = null) {\n const cleanId = id.startsWith('#') ? id.substring(1) : id;\n if (root) {\n return root.querySelector(`#${cleanId}`);\n }\n return this.element.querySelector(`#${cleanId}`);\n }\n\n getChildElement(id) {\n if (id.startsWith(\"#\")) {\n return this.getChildElementById(id);\n }\n let el = this.element?.querySelector(`[data-container=\"${id}\"]`);\n if (!el) {\n return this.getChildElementById(id);\n }\n return el;\n }\n\n getContainer() {\n if (this.replaceById) {\n // this means we want to place the element in the dom that matches our id\n if (this.parent) {\n return this.parent.getChildElementById(this.id);\n }\n // return this.getChildElementById(this.id, document.body);\n return null;\n }\n if (!this.containerId) return null;\n if (this.parent) {\n return this.parent.getChildElement(this.containerId);\n }\n return this.getChildElementById(this.containerId, document.body);\n }\n\n async mount(container = null) {\n await this.onBeforeMount();\n if (!container) {\n container = this.getContainer();\n }\n\n if (this.containerId && !container) {\n // throw new Error(`Container not found for ${this.containerId}`);\n console.error(`Container not found for ${this.containerId}`);\n return;\n }\n\n if (container && this.replaceById) {\n container.replaceWith(this.element);\n } else if (container) {\n // if we have a container just replace its children with our element\n container.replaceChildren(this.element);\n } else if (!this.containerId && this.parent) {\n // append to parent\n this.parent.element.appendChild(this.element);\n } else if (!this.containerId && !this.parent && this.options.allowAppendToBody) {\n // append to body\n console.log(\"APPENDING TO BODY!!!!\");\n document.body.appendChild(this.element);\n } else {\n // there is a containerId but no container\n console.error(`Container not found for ${this.containerId}`);\n }\n\n await this.onAfterMount();\n this.mounted = true;\n }\n\n async unmount() {\n if (!this.element || !this.element.parentNode) return;\n await this.onBeforeUnmount();\n // unbind all children\n await this._unmountChildren();\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\n this.events.unbind();\n await this.onAfterUnmount();\n this.mounted = false;\n }\n\n // FIX #1: make destroy async (it already awaited hooks)\n async destroy() {\n try {\n this.events.unbind();\n // destroy children first (support async or sync destroy)\n for (const id in this.children) {\n const ch = this.children[id];\n if (ch) {\n await Promise.resolve(ch.destroy()).catch(err => View._warn(`Child destroy error (${id})`, err));\n }\n }\n this.mounted = false;\n if (this.element && this.element.parentNode) {\n await this.onBeforeDestroy();\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\n await this.onAfterDestroy();\n }\n } catch (e) {\n View._warn(`Destroy error in ${this.id}`, e);\n }\n }\n\n // ---------------------------------------------\n // DOM helpers\n // ---------------------------------------------\n _ensureElement() {\n try {\n if (this.element && this.element.tagName?.toLowerCase() === this.tagName) {\n this._syncAttrs();\n return this.element;\n }\n const el = document.createElement(this.tagName);\n this.element = el;\n this.el = el;\n this._syncAttrs();\n return el;\n } catch (e) {\n View._warn(\"ensureElement error\", e);\n // last resort: create a DIV to avoid throwing\n const el = document.createElement(\"div\");\n // FIX #2: use View._genId() (not SimpleView)\n el.id = this.id || View._genId();\n return el;\n }\n }\n\n _syncAttrs() {\n try {\n if (!this.element) return;\n if (this.id) this.element.id = this.id;\n this.element.className = this.className || \"\";\n if (this.style == null) {\n this.element.removeAttribute(\"style\");\n } else {\n this.element.style.cssText = String(this.style);\n }\n } catch (e) { View._warn(\"_syncAttrs error\", e); }\n }\n\n bindEvents() {\n this.events.bind(this.element);\n\n // Initialize tooltips if enabled\n if (this.enableTooltips) {\n this.initializeTooltips();\n }\n }\n\n unbindEvents() {\n this.events.unbind();\n\n // Cleanup tooltips if enabled\n if (this.enableTooltips) {\n this.disposeTooltips();\n }\n }\n\n // ---------------------------------------------\n // Template helpers\n // ---------------------------------------------\n async renderTemplate() {\n const templateContent = await this.getTemplate();\n if (!templateContent) return '';\n const partials = this.getPartials();\n return Mustache.render(templateContent, this, partials);\n }\n\n renderTemplateString(template, context, partials) {\n // Mustache.render now auto-wraps context to enable pipe formatters\n return Mustache.render(template, context, partials);\n }\n\n getPartials() { return {}; }\n\n async getTemplate() {\n if (this._templateCache && this.cacheTemplate) {\n return this._templateCache;\n }\n const template = this.template || this.templateUrl;\n if (!template) {\n throw new Error('Template not found');\n }\n\n let templateContent = '';\n\n if (typeof template === 'string') {\n if (template.includes('<') || template.includes('{')) {\n templateContent = template;\n } else {\n try {\n let templatePath = template;\n if (!this.app) this.app = this.getApp();\n if (this.app && this.app.basePath) {\n if (!templatePath.startsWith('/') &&\n !templatePath.startsWith('http://') &&\n !templatePath.startsWith('https://')) {\n const base = this.app.basePath.endsWith('/')\n ? this.app.basePath.slice(0, -1)\n : this.app.basePath;\n templatePath = `${base}/${templatePath}`;\n }\n }\n\n const response = await fetch(templatePath);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n templateContent = await response.text();\n } catch (error) {\n View._warn(`Failed to load template from ${template}: ${error}`);\n // NOTE: showError may be provided by host app\n this.showError?.(`Failed to load template from ${template}: ${error.message}`);\n }\n }\n } else if (typeof template === 'function') {\n templateContent = await this.template(this.data, this.state);\n }\n\n if (this.cacheTemplate && templateContent) {\n this._templateCache = templateContent;\n }\n\n return templateContent;\n }\n\n getContextValue(path) {\n const value = MOJOUtils.getContextData(this, path);\n\n if (path && path.startsWith('data.') && value && typeof value === 'object') {\n return MOJOUtils.wrapData(value, this);\n }\n\n if (path && path.startsWith('model.') &&\n path !== 'model' &&\n value && typeof value === 'object' &&\n typeof value.getContextValue !== 'function') {\n return MOJOUtils.wrapData(value, null);\n }\n\n return value;\n }\n\n // 9) Navigation Helpers ------------------------------------------------------\n async handlePageNavigation(element) {\n const pageName = element.getAttribute('data-page');\n const paramsAttr = element.getAttribute('data-params');\n let params = {};\n if (paramsAttr) {\n try { params = JSON.parse(paramsAttr); }\n catch (error) { console.warn('Invalid JSON in data-params:', paramsAttr); }\n }\n\n const app = this.getApp();\n if (app) { app.showPage(pageName, params); return; }\n\n const router = this.findRouter();\n if (router && typeof router.navigateToPage === 'function') {\n await router.navigateToPage(pageName, params);\n } else {\n console.error(`No router found for page navigation to '${pageName}'`);\n }\n }\n\n async handleHrefNavigation(element) {\n const href = element.getAttribute('href');\n if (this.isExternalLink(href) || element.hasAttribute('data-external')) return;\n\n const router = this.findRouter();\n if (router) {\n if (router.options && router.options.mode === 'param' && href.startsWith('?')) {\n const fullPath = '/' + href;\n await router.navigate(fullPath);\n return;\n }\n if (router.options && router.options.mode === 'hash' && href.startsWith('#')) {\n await router.navigate(href);\n return;\n }\n const routePath = this.hrefToRoutePath(href);\n await router.navigate(routePath);\n } else {\n console.warn('No router found for navigation, using default behavior');\n window.location.href = href;\n }\n }\n\n isExternalLink(href) {\n if (!href) return true;\n if (href.startsWith(\"/\") && this.getApp()) {\n if (href.startsWith(this.findRouter().basePath)) return false;\n return true;\n }\n return href.startsWith('#') || href.startsWith('mailto:') || href.startsWith('tel:') || href.startsWith('http://') || href.startsWith('https://') || href.startsWith('//');\n }\n\n hrefToRoutePath(href) {\n if (href.startsWith('/')) {\n const router = this.findRouter();\n if (router && router.options && router.options.base) {\n const base = router.options.base;\n if (href.startsWith(base)) return href.substring(base.length) || '/';\n }\n return href;\n }\n return href.startsWith('./') ? href.substring(2) : href;\n }\n\n findRouter() {\n this.getApp();\n return this.app?.router || null;\n }\n\n getApp() {\n if (this.app) return this.app;\n const apps = [\n window.__app__,\n window.MOJO?.app,\n window.APP,\n window.app,\n window.WebApp,\n window.matchUUID ? window[window.matchUUID]() : window[window.matchUUID]\n ];\n this.app = apps.find(app => app && typeof app.showPage === 'function') || null;\n return this.app;\n }\n\n handleActionError(action, err, evt, el) {\n this.showError(`Action '${action}' failed: ${err}`, evt, el);\n }\n\n // ---------------------------------------------\n // Utilities\n // ---------------------------------------------\n /**\n * Escape HTML characters\n * @param {string} str - String to escape\n * @returns {string} Escaped string\n */\n escapeHtml(str) {\n if (typeof str !== 'string') return str;\n\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n }\n\n contains(el) {\n if (typeof el === 'string') {\n if (!this.element) return false; // no parent element yet\n el = document.getElementById(el);\n }\n if (!el) return false; // no element with that id\n return this.element.contains(el);\n }\n\n /**\n * Initialize Bootstrap tooltips in this view's element\n * Called automatically in bindEvents() if enableTooltips is true\n */\n initializeTooltips() {\n if (!this.element || !window.bootstrap?.Tooltip) return;\n this.disposeTooltips();\n const tooltipTriggerList = this.element.querySelectorAll('[data-bs-toggle=\"tooltip\"]');\n [...tooltipTriggerList].map(tooltipTriggerEl => {\n // Extract custom options from data attributes\n const theme = tooltipTriggerEl.getAttribute('data-tooltip-theme');\n const size = tooltipTriggerEl.getAttribute('data-tooltip-size');\n\n // Build custom class list\n let customClass = '';\n if (theme) customClass += `tooltip-${theme} `;\n if (size) customClass += `tooltip-${size}`;\n\n // Build options object - only include customClass if it has a value\n const options = {};\n const trimmedClass = customClass.trim();\n if (trimmedClass) {\n options.customClass = trimmedClass;\n }\n\n // Initialize tooltip with custom options\n return new window.bootstrap.Tooltip(tooltipTriggerEl, options);\n });\n }\n\n /**\n * Dispose all Bootstrap tooltips in this view's element\n * Called automatically in unbindEvents() if enableTooltips is true\n */\n disposeTooltips() {\n if (!this.element || !window.bootstrap?.Tooltip) return;\n\n const tooltipElements = this.element.querySelectorAll('[data-bs-toggle=\"tooltip\"]');\n tooltipElements.forEach(element => {\n const tooltip = window.bootstrap.Tooltip.getInstance(element);\n if (tooltip) {\n tooltip.dispose();\n }\n });\n }\n\n /**\n * Show error message\n * @param {string} message - Error message\n */\n async showError(message) {\n console.error(`View ${this.id} error:`, message);\n const app = this.getApp ? this.getApp() : (this.app || null);\n if (app && typeof app.showError === 'function') {\n await app.showError(message);\n return;\n }\n // Fallback to browser alert if no app or helper available\n alert(`Error: ${message}`);\n }\n\n /**\n * Show success message\n * @param {string} message - Success message\n */\n async showSuccess(message) {\n if (this.debug) {\n console.log(`View ${this.id} success:`, message);\n }\n const app = this.getApp ? this.getApp() : (this.app || null);\n if (app && typeof app.showSuccess === 'function') {\n await app.showSuccess(message);\n return;\n }\n // Fallback to browser alert if no app or helper available\n alert(`Success: ${message}`);\n }\n\n /**\n * Show info message\n * @param {string} message - Info message\n */\n async showInfo(message) {\n console.info(`View ${this.id} info:`, message);\n const app = this.getApp ? this.getApp() : (this.app || null);\n if (app && typeof app.showInfo === 'function') {\n await app.showInfo(message);\n return;\n }\n // Fallback to browser alert if no app or helper available\n alert(`Info: ${message}`);\n }\n\n /**\n * Show warning message\n * @param {string} message - Warning message\n */\n async showWarning(message) {\n console.warn(`View ${this.id} warning:`, message);\n const app = this.getApp ? this.getApp() : (this.app || null);\n if (app && typeof app.showWarning === 'function') {\n await app.showWarning(message);\n return;\n }\n // Fallback to browser alert if no app or helper available\n alert(`Warning: ${message}`);\n }\n\n // Default action: copy value from data-clipboard to clipboard\n async onActionCopyToClipboard(event, element) {\n try {\n const carrier = element?.closest('[data-clipboard]') || element;\n const text = carrier?.getAttribute('data-clipboard') || '';\n // Consider handled even if empty to avoid bubbling\n if (!text) return true;\n\n if (navigator.clipboard && window.isSecureContext) {\n await navigator.clipboard.writeText(text);\n } else {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n }\n\n // Visual feedback: temporarily swap icon to a checkmark\n const icon = element.querySelector('i');\n const originalClass = icon && icon.className;\n if (icon) {\n icon.className = 'bi bi-check';\n setTimeout(() => { icon.className = originalClass; }, 1000);\n }\n return true;\n } catch (err) {\n console.warn('Copy to clipboard failed:', err);\n return true;\n }\n }\n\n static _genId() { return `view_${Math.random().toString(36).substr(2, 9)}`; }\n\n static _warn(msg, err) {\n try {\n if (err) console.warn(`[View] ${msg}:`, err);\n else console.warn(`[View] ${msg}`);\n } catch { /* never throw on logging */ }\n }\n}\n\nimport EventEmitter from '@core/mixins/EventEmitter.js';\nObject.assign(View.prototype, EventEmitter);\n\nexport default View;\n","/**\n * Rest - HTTP client for API communication\n * Provides methods for making REST API calls with interceptors and error handling\n */\n\nclass Rest {\n constructor() {\n this.config = {\n baseURL: '',\n timeout: 30000,\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n trackDevice: true, // New setting to control DUID tracking\n duidHeader: 'X-Mojo-UID', // Header name for the DUID\n duidTransport: 'header' // How to send the DUID: 'payload' or 'header'\n };\n\n this.interceptors = {\n request: [],\n response: []\n };\n\n this.duid = null;\n if (this.config.trackDevice) {\n this._initializeDuid();\n }\n }\n\n /**\n * Initialize or generate the Device Unique ID (DUID)\n * @private\n */\n _initializeDuid() {\n const storageKey = 'mojo_device_uid';\n try {\n let storedDuid = localStorage.getItem(storageKey);\n if (storedDuid) {\n this.duid = storedDuid;\n } else {\n this.duid = this._generateDuid();\n localStorage.setItem(storageKey, this.duid);\n }\n } catch (e) {\n console.error(\"Could not access localStorage to get/set DUID.\", e);\n // Use a non-persistent DUID as a fallback\n this.duid = this._generateDuid();\n }\n }\n\n /**\n * Generate a new DUID (UUID v4)\n * @private\n * @returns {string} A new UUID\n */\n _generateDuid() {\n if (crypto && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n // Fallback for older browsers\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n /**\n * Configure the REST client\n * @param {object} config - Configuration object\n */\n configure(config) {\n if (config.baseUrl) config.baseURL = config.baseUrl;\n const oldTrackDevice = this.config.trackDevice;\n\n this.config = {\n ...this.config,\n ...config,\n headers: {\n ...this.config.headers,\n ...config.headers\n }\n };\n\n // Initialize DUID if tracking is newly enabled\n if (this.config.trackDevice && !oldTrackDevice) {\n this._initializeDuid();\n }\n }\n\n /**\n * Add request or response interceptor\n * @param {string} type - 'request' or 'response'\n * @param {function} interceptor - Interceptor function\n */\n addInterceptor(type, interceptor) {\n if (this.interceptors[type]) {\n this.interceptors[type].push(interceptor);\n }\n }\n\n /**\n * Build complete URL\n * @param {string} url - Endpoint URL\n * @returns {string} Complete URL\n */\n buildUrl(url) {\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return url;\n }\n\n\n const baseURL = this.config.baseURL.endsWith('/')\n ? this.config.baseURL.slice(0, -1)\n : this.config.baseURL;\n\n const endpoint = url.startsWith('/') ? url : `/${url}`;\n\n return `${baseURL}${endpoint}`;\n }\n\n /**\n * Categorize error into common reason codes\n * @param {Error} error - The error object\n * @param {number} status - HTTP status code (if available)\n * @returns {object} Object with reason code and user-friendly message\n */\n categorizeError(error, status = 0) {\n // Network/connection errors\n if (error.name === 'TypeError' && error.message.includes('fetch')) {\n return {\n reason: 'not_reachable',\n message: 'Service is not reachable - please check your connection'\n };\n }\n\n if (error.name === 'AbortError') {\n return {\n reason: 'cancelled',\n message: 'Request was cancelled'\n };\n }\n\n if (error.name === 'TimeoutError' || error.message.includes('timeout')) {\n return {\n reason: 'timed_out',\n message: 'Request timed out - please try again'\n };\n }\n\n // HTTP status-based categorization\n if (status >= 400) {\n if (status === 400) {\n return {\n reason: 'bad_request',\n message: 'Invalid request data'\n };\n }\n if (status === 401) {\n return {\n reason: 'unauthorized',\n message: 'Authentication required'\n };\n }\n if (status === 403) {\n return {\n reason: 'forbidden',\n message: 'Access denied'\n };\n }\n if (status === 404) {\n return {\n reason: 'not_found',\n message: 'Resource not found'\n };\n }\n if (status === 409) {\n return {\n reason: 'conflict',\n message: 'Resource conflict'\n };\n }\n if (status === 422) {\n return {\n reason: 'validation_error',\n message: 'Validation failed'\n };\n }\n if (status === 429) {\n return {\n reason: 'rate_limited',\n message: 'Too many requests - please wait'\n };\n }\n if (status >= 500) {\n return {\n reason: 'server_error',\n message: 'Server error - please try again later'\n };\n }\n if (status >= 400) {\n return {\n reason: 'client_error',\n message: 'Request error'\n };\n }\n }\n\n // Generic network errors\n if (error.message.includes('CORS')) {\n return {\n reason: 'cors_error',\n message: 'Cross-origin request blocked'\n };\n }\n\n if (error.message.includes('DNS') || error.message.includes('ENOTFOUND')) {\n return {\n reason: 'dns_error',\n message: 'Unable to resolve server address'\n };\n }\n\n // Default fallback\n return {\n reason: 'unknown_error',\n message: `Network error: ${error.message}`\n };\n }\n\n /**\n * Build query string from parameters\n * @param {object} params - Query parameters\n * @returns {string} Query string\n */\n buildQueryString(params = {}) {\n const searchParams = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== null && value !== undefined) {\n if (Array.isArray(value)) {\n value.forEach(v => searchParams.append(`${key}[]`, v));\n } else {\n searchParams.append(key, value);\n }\n }\n });\n\n const queryString = searchParams.toString();\n return queryString ? `?${queryString}` : '';\n }\n\n /**\n * Process request through interceptors\n * @param {object} request - Request configuration\n * @returns {object} Processed request configuration\n */\n async processRequestInterceptors(request) {\n let processedRequest = { ...request };\n\n for (const interceptor of this.interceptors.request) {\n try {\n processedRequest = await interceptor(processedRequest);\n } catch (error) {\n console.error('Request interceptor error:', error);\n throw error;\n }\n }\n\n return processedRequest;\n }\n\n /**\n * Process response through interceptors\n * @param {Response} response - Fetch response object\n * @param {object} request - Original request configuration\n * @returns {object} Processed response data\n */\n async processResponseInterceptors(response, request) {\n let responseData = {\n success: response.ok,\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n data: null,\n errors: null,\n message: null,\n reason: null\n };\n\n // Parse response body\n try {\n const contentType = response.headers.get('content-type');\n\n if (contentType && contentType.includes('application/json')) {\n const jsonData = await response.json();\n responseData.data = jsonData;\n\n // Handle API error responses\n if (!response.ok) {\n const errorInfo = this.categorizeError(new Error('HTTP Error'), response.status);\n responseData.errors = jsonData.errors || {};\n responseData.message = jsonData.message || errorInfo.message;\n responseData.reason = errorInfo.reason;\n }\n } else {\n responseData.data = await response.text();\n\n if (!response.ok) {\n const errorInfo = this.categorizeError(new Error('HTTP Error'), response.status);\n responseData.message = errorInfo.message;\n responseData.reason = errorInfo.reason;\n }\n }\n } catch (error) {\n responseData.errors = { parse: 'Failed to parse response' };\n responseData.message = 'Invalid response format';\n }\n\n // Process through response interceptors\n for (const interceptor of this.interceptors.response) {\n try {\n responseData = await interceptor(responseData, request);\n } catch (error) {\n console.error('Response interceptor error:', error);\n }\n }\n\n return responseData;\n }\n\n /**\n * Make HTTP request\n * @param {string} method - HTTP method\n * @param {string} url - Request URL\n * @param {object} data - Request body data\n * @param {object} params - Query parameters\n * @param {object} options - Additional request options\n * @returns {Promise} Promise that resolves with response data\n */\n async request(method, url, data = null, params = {}, options = {}) {\n // Build request configuration\n let request = {\n method: method.toUpperCase(),\n url: this.buildUrl(url) + this.buildQueryString(params),\n headers: {\n ...this.config.headers,\n ...options.headers\n },\n data,\n options: {\n timeout: this.config.timeout,\n ...options\n }\n };\n\n // Process request interceptors\n request = await this.processRequestInterceptors(request);\n\n // Add DUID if tracking is enabled\n if (this.config.trackDevice && this.duid) {\n if (this.config.duidTransport === 'header') {\n // Always add as a header\n request.headers[this.config.duidHeader] = this.duid;\n } else { // 'payload' transport (default)\n if (request.method === 'GET') {\n // For GET requests, add as a query parameter\n const url = new URL(request.url);\n url.searchParams.append('duid', this.duid);\n request.url = url.toString();\n } else if (request.data && typeof request.data === 'object' && !(request.data instanceof FormData)) {\n // For POST/PUT/PATCH with JSON body, add to the data payload\n request.data.duid = this.duid;\n }\n // Note: For other request types like FormData, the duid is not sent in 'payload' mode.\n }\n }\n\n // Prepare fetch options\n const fetchOptions = {\n method: request.method,\n headers: request.headers\n };\n\n // Handle abort signals - combine timeout and external signal if provided\n const signals = [];\n\n // Add timeout signal\n if (request.options.timeout) {\n signals.push(AbortSignal.timeout(request.options.timeout));\n }\n\n // Add external signal if provided\n if (request.options.signal) {\n signals.push(request.options.signal);\n }\n\n // Combine signals or use single signal\n if (signals.length > 1) {\n fetchOptions.signal = AbortSignal.any ? AbortSignal.any(signals) : signals[0];\n } else if (signals.length === 1) {\n fetchOptions.signal = signals[0];\n }\n\n // Add body for methods that support it\n if (request.data && ['POST', 'PUT', 'PATCH'].includes(request.method)) {\n if (request.data instanceof FormData) {\n fetchOptions.body = request.data;\n // Remove Content-Type header for FormData (browser sets it with boundary)\n delete fetchOptions.headers['Content-Type'];\n } else if (typeof request.data === 'object') {\n fetchOptions.body = JSON.stringify(request.data);\n } else {\n fetchOptions.body = request.data;\n }\n }\n\n try {\n // Make the request\n const response = await fetch(request.url, fetchOptions);\n\n // Process response through interceptors\n const responseData = await this.processResponseInterceptors(response, request);\n\n return responseData;\n\n } catch (error) {\n // Handle AbortError (cancellation) - re-throw to be handled by caller\n if (error.name === 'AbortError') {\n throw error;\n }\n\n // Categorize the error\n const errorInfo = this.categorizeError(error);\n\n // Handle network and timeout errors\n const errorResponse = {\n success: false,\n status: 0,\n statusText: 'Network Error',\n headers: {},\n data: null,\n errors: { network: error.message },\n message: errorInfo.message,\n reason: errorInfo.reason\n };\n\n // Create mock response for interceptor processing\n const mockResponse = {\n ok: false,\n status: 0,\n statusText: 'Network Error',\n headers: new Headers(),\n json: async () => ({}),\n text: async () => ''\n };\n\n // Process through interceptors and return the categorized error\n await this.processResponseInterceptors(mockResponse, request);\n return errorResponse;\n }\n }\n\n /**\n * GET request\n * @param {string} url - Request URL\n * @param {object} params - Query parameters\n * @param {object} options - Request options\n * @returns {Promise} Promise that resolves with response data\n */\n async GET(url, params = {}, options = {}) {\n return this.request('GET', url, null, params, options);\n }\n\n /**\n * POST request\n * @param {string} url - Request URL\n * @param {object} data - Request body data\n * @param {object} params - Query parameters\n * @param {object} options - Request options\n * @returns {Promise} Promise that resolves with response data\n */\n async POST(url, data = {}, params = {}, options = {}) {\n return this.request('POST', url, data, params, options);\n }\n\n /**\n * PUT request\n * @param {string} url - Request URL\n * @param {object} data - Request body data\n * @param {object} params - Query parameters\n * @param {object} options - Request options\n * @returns {Promise} Promise that resolves with response data\n */\n async PUT(url, data = {}, params = {}, options = {}) {\n return this.request('PUT', url, data, params, options);\n }\n\n /**\n * PATCH request\n * @param {string} url - Request URL\n * @param {object} data - Request body data\n * @param {object} params - Query parameters\n * @param {object} options - Request options\n * @returns {Promise} Promise that resolves with response data\n */\n async PATCH(url, data = {}, params = {}, options = {}) {\n return this.request('PATCH', url, data, params, options);\n }\n\n /**\n * DELETE request\n * @param {string} url - Request URL\n * @param {object} params - Query parameters\n * @param {object} options - Request options\n * @returns {Promise} Promise that resolves with response data\n */\n async DELETE(url, params = {}, options = {}) {\n return this.request('DELETE', url, null, params, options);\n }\n\n /**\n * Download a file from a URL\n * @param {string} url - Request URL\n * @param {object} params - Query parameters\n * @param {object} options - Request options\n * @returns {Promise} Promise that resolves when download is initiated\n */\n async download(url, params = {}, options = {}) {\n const requestUrl = this.buildUrl(url) + this.buildQueryString(params);\n const request = {\n method: 'GET',\n url: requestUrl,\n headers: {\n ...this.config.headers,\n 'Accept': '*/*', // Default, can be overridden by options\n ...options.headers\n },\n options: {\n ...options\n }\n };\n // Remove content-type for GET request\n delete request.headers['Content-Type'];\n\n try {\n const response = await fetch(request.url, {\n method: request.method,\n headers: request.headers,\n signal: request.options.signal\n });\n\n if (!response.ok) {\n throw new Error(`Download failed: ${response.status} ${response.statusText}`);\n }\n\n const contentDisposition = response.headers.get('content-disposition');\n let filename = options.filename || 'download';\n\n if (contentDisposition) {\n const filenameMatch = contentDisposition.match(/filename=\"?(.+)\"?/);\n if (filenameMatch && filenameMatch.length > 1) {\n filename = filenameMatch[1];\n }\n }\n\n // Create download without loading entire file into memory\n const reader = response.body.getReader();\n const stream = new ReadableStream({\n start(controller) {\n function pump() {\n return reader.read().then(({ done, value }) => {\n if (done) {\n controller.close();\n return;\n }\n controller.enqueue(value);\n return pump();\n });\n }\n return pump();\n }\n });\n\n const blob = await new Response(stream).blob();\n const downloadUrl = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.style.display = 'none';\n a.href = downloadUrl;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n window.URL.revokeObjectURL(downloadUrl);\n a.remove();\n\n return { success: true, message: 'Download initiated' };\n\n } catch (error) {\n console.error('Download error:', error);\n return { success: false, message: error.message };\n }\n }\n\n /**\n * Download a file from a URL by fetching the entire content into a Blob.\n * @param {string} url - Request URL\n * @param {object} params - Query parameters\n * @param {object} options - Request options\n * @returns {Promise} Promise that resolves when download is initiated\n */\n async downloadBlob(url, params = {}, options = {}) {\n const requestUrl = this.buildUrl(url) + this.buildQueryString(params);\n const request = {\n method: 'GET',\n url: requestUrl,\n headers: {\n ...this.config.headers,\n 'Accept': '*/*', // Default, can be overridden by options\n ...options.headers\n },\n options: {\n ...options\n }\n };\n // Remove content-type for GET request\n delete request.headers['Content-Type'];\n\n try {\n const response = await fetch(request.url, {\n method: request.method,\n headers: request.headers,\n signal: request.options.signal\n });\n\n if (!response.ok) {\n throw new Error(`Download failed: ${response.status} ${response.statusText}`);\n }\n\n const blob = await response.blob();\n const contentDisposition = response.headers.get('content-disposition');\n let filename = options.filename || 'download';\n\n if (contentDisposition) {\n const filenameMatch = contentDisposition.match(/filename=\"?(.+)\"?/);\n if (filenameMatch && filenameMatch.length > 1) {\n filename = filenameMatch[1];\n }\n }\n\n const downloadUrl = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.style.display = 'none';\n a.href = downloadUrl;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n window.URL.revokeObjectURL(downloadUrl);\n a.remove();\n\n return { success: true, message: 'Download initiated' };\n\n } catch (error) {\n console.error('Download error:', error);\n return { success: false, message: error.message };\n }\n }\n\n /**\n * Upload file with raw PUT request (compatible with legacy backend)\n * @param {string} url - Upload URL\n * @param {File} file - Single file to upload\n * @param {object} options - Request options\n * @param {function} options.onProgress - Progress callback function(event)\n * @returns {Promise} Promise that resolves with response data\n */\n async upload(url, file, options = {}) {\n return new Promise((resolve, reject) => {\n // Validate input - only accept single File objects\n if (!(file instanceof File)) {\n reject(new Error('Only single File objects are supported for legacy backend compatibility'));\n return;\n }\n\n const xhr = new XMLHttpRequest();\n\n // Set up progress tracking if callback provided\n if (options.onProgress && typeof options.onProgress === 'function') {\n xhr.upload.onprogress = options.onProgress;\n }\n\n // Set up response handlers\n xhr.onload = function() {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve({\n data: xhr.response,\n status: xhr.status,\n statusText: xhr.statusText,\n xhr: xhr\n });\n } else {\n reject(new Error(`Upload failed: ${xhr.status} ${xhr.statusText}`));\n }\n };\n\n xhr.onerror = function() {\n reject(new Error('Upload failed: Network error'));\n };\n\n xhr.ontimeout = function() {\n reject(new Error('Upload failed: Timeout'));\n };\n\n // Configure request - use PUT method with raw file data\n xhr.open('PUT', url);\n xhr.setRequestHeader('Content-Type', file.type);\n\n // Set timeout if specified\n if (options.timeout) {\n xhr.timeout = options.timeout;\n }\n\n // Send the raw file data\n xhr.send(file);\n });\n }\n\n /**\n * Upload multiple files with multipart/form-data (for modern backends)\n * @param {string} url - Upload URL\n * @param {File|FileList|FormData} files - File(s) to upload\n * @param {object} additionalData - Additional form fields\n * @param {object} options - Request options\n * @returns {Promise} Promise that resolves with response data\n */\n async uploadMultipart(url, files, additionalData = {}, options = {}) {\n const formData = new FormData();\n\n // Add files to form data\n if (files instanceof FileList) {\n Array.from(files).forEach((file, index) => {\n formData.append(`file_${index}`, file);\n });\n } else if (files instanceof File) {\n formData.append('file', files);\n } else if (files instanceof FormData) {\n // Use provided FormData directly\n return this.POST(url, files, {}, options);\n }\n\n // Add additional data\n Object.entries(additionalData).forEach(([key, value]) => {\n formData.append(key, value);\n });\n\n return this.POST(url, formData, {}, options);\n }\n\n /**\n * Set authentication token\n * @param {string} token - JWT or API token\n * @param {string} type - Token type ('Bearer', 'Token', etc.)\n */\n setAuthToken(token, type = 'Bearer') {\n if (token) {\n this.config.headers['Authorization'] = `${type} ${token}`;\n } else {\n delete this.config.headers['Authorization'];\n }\n }\n\n /**\n * Clear authentication\n */\n clearAuth() {\n delete this.config.headers['Authorization'];\n }\n\n /**\n * Check if an error is retryable (network issues that might resolve)\n * @param {object} response - Response object with reason field\n * @returns {boolean} True if error can be retried\n */\n isRetryableError(response) {\n const retryableReasons = [\n 'not_reachable',\n 'timed_out',\n 'server_error',\n 'dns_error'\n ];\n return retryableReasons.includes(response.reason);\n }\n\n /**\n * Check if error requires authentication\n * @param {object} response - Response object with reason field\n * @returns {boolean} True if authentication is required\n */\n requiresAuth(response) {\n return response.reason === 'unauthorized';\n }\n\n /**\n * Check if error is network-related\n * @param {object} response - Response object with reason field\n * @returns {boolean} True if it's a network error\n */\n isNetworkError(response) {\n const networkReasons = [\n 'not_reachable',\n 'timed_out',\n 'cancelled',\n 'cors_error',\n 'dns_error'\n ];\n return networkReasons.includes(response.reason);\n }\n\n /**\n * Get user-friendly error message based on reason\n * @param {object} response - Response object with reason field\n * @returns {string} User-friendly error message\n */\n getUserMessage(response) {\n if (response.message) {\n return response.message;\n }\n\n const messages = {\n 'not_reachable': 'Unable to connect to the server. Please check your internet connection.',\n 'timed_out': 'The request took too long. Please try again.',\n 'cancelled': 'The request was cancelled.',\n 'unauthorized': 'Please log in to continue.',\n 'forbidden': 'You don\\'t have permission to perform this action.',\n 'not_found': 'The requested resource was not found.',\n 'validation_error': 'Please check your input and try again.',\n 'rate_limited': 'Too many requests. Please wait a moment before trying again.',\n 'server_error': 'Server error. Please try again later.',\n 'cors_error': 'Access blocked by security policy.',\n 'dns_error': 'Unable to reach the server.',\n 'unknown_error': 'An unexpected error occurred.'\n };\n\n return messages[response.reason] || 'An error occurred. Please try again.';\n }\n}\n\n// Create singleton instance\nconst rest = new Rest();\n\nexport default rest;\n"],"names":["MOJOUtils","abbr","parts","parts2","dateStr","timeStr","a","value","childTokens","url"],"mappings":"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"}
|