{"version":3,"sources":["/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-2FRBWHPG.cjs","../../src/utils/template-variables.ts"],"names":[],"mappings":"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","file":"/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-2FRBWHPG.cjs","sourcesContent":[null,"/**\n * Template variable resolver for scheduled jobs.\n *\n * Resolves `{{...}}` patterns in strings to actual values at execution time.\n * Supports date-based variables with optional format and offset.\n *\n * Built-in variables:\n * - {{today}}, {{yesterday}}, {{tomorrow}}\n * - {{today+N}}, {{today-N}} (day offset)\n * - {{year}}, {{month}}, {{day}}\n * - {{year+N}}, {{year-N}}, {{month+N}}, {{month-N}}, {{day+N}}, {{day-N}}\n * - {{startOfWeek}}, {{endOfWeek}}\n * - {{startOfMonth}}, {{endOfMonth}}\n * - {{now}} (datetime)\n *\n * Format override: {{today|YYYY/MM/DD}}\n */\n\nconst TEMPLATE_PATTERN = /\\{\\{(.+?)\\}\\}/g;\nconst DEFAULT_DATE_FORMAT = \"YYYY-MM-DD\";\nconst DEFAULT_DATETIME_FORMAT = \"YYYY-MM-DD HH:mm:ss\";\nconst TIMEZONE_FORMATTER_CACHE = new Map<string, Intl.DateTimeFormat>();\n\ntype DateParts = {\n\tyear: number;\n\tmonth: number;\n\tday: number;\n\thours: number;\n\tminutes: number;\n\tseconds: number;\n};\n\nfunction padTwo(n: number): string {\n\treturn n.toString().padStart(2, \"0\");\n}\n\nfunction getFormatter(timezone: string): Intl.DateTimeFormat {\n\tconst cached = TIMEZONE_FORMATTER_CACHE.get(timezone);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst formatter = new Intl.DateTimeFormat(\"en-CA\", {\n\t\ttimeZone: timezone,\n\t\tyear: \"numeric\",\n\t\tmonth: \"2-digit\",\n\t\tday: \"2-digit\",\n\t\thour: \"2-digit\",\n\t\tminute: \"2-digit\",\n\t\tsecond: \"2-digit\",\n\t\thour12: false,\n\t});\n\tTIMEZONE_FORMATTER_CACHE.set(timezone, formatter);\n\treturn formatter;\n}\n\nfunction createUtcDateFromParts(parts: DateParts): Date {\n\treturn new Date(\n\t\tDate.UTC(\n\t\t\tparts.year,\n\t\t\tparts.month - 1,\n\t\t\tparts.day,\n\t\t\tparts.hours,\n\t\t\tparts.minutes,\n\t\t\tparts.seconds,\n\t\t),\n\t);\n}\n\nfunction formatDate(date: Date, format: string): string {\n\tconst year = date.getUTCFullYear().toString();\n\tconst month = padTwo(date.getUTCMonth() + 1);\n\tconst day = padTwo(date.getUTCDate());\n\tconst hours = padTwo(date.getUTCHours());\n\tconst minutes = padTwo(date.getUTCMinutes());\n\tconst seconds = padTwo(date.getUTCSeconds());\n\n\treturn format\n\t\t.replace(\"YYYY\", year)\n\t\t.replace(\"MM\", month)\n\t\t.replace(\"DD\", day)\n\t\t.replace(\"HH\", hours)\n\t\t.replace(\"mm\", minutes)\n\t\t.replace(\"ss\", seconds);\n}\n\nfunction getDateInTimezone(timezone?: string): Date {\n\tif (!timezone) {\n\t\tconst now = new Date();\n\t\treturn createUtcDateFromParts({\n\t\t\tyear: now.getFullYear(),\n\t\t\tmonth: now.getMonth() + 1,\n\t\t\tday: now.getDate(),\n\t\t\thours: now.getHours(),\n\t\t\tminutes: now.getMinutes(),\n\t\t\tseconds: now.getSeconds(),\n\t\t});\n\t}\n\n\tconst formatter = getFormatter(timezone);\n\tconst parts = formatter.formatToParts(new Date());\n\tconst values: Partial<DateParts> = {};\n\tfor (const part of parts) {\n\t\tswitch (part.type) {\n\t\t\tcase \"year\":\n\t\t\t\tvalues.year = Number.parseInt(part.value, 10);\n\t\t\t\tbreak;\n\t\t\tcase \"month\":\n\t\t\t\tvalues.month = Number.parseInt(part.value, 10);\n\t\t\t\tbreak;\n\t\t\tcase \"day\":\n\t\t\t\tvalues.day = Number.parseInt(part.value, 10);\n\t\t\t\tbreak;\n\t\t\tcase \"hour\":\n\t\t\t\tvalues.hours = Number.parseInt(part.value, 10);\n\t\t\t\tbreak;\n\t\t\tcase \"minute\":\n\t\t\t\tvalues.minutes = Number.parseInt(part.value, 10);\n\t\t\t\tbreak;\n\t\t\tcase \"second\":\n\t\t\t\tvalues.seconds = Number.parseInt(part.value, 10);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn createUtcDateFromParts({\n\t\tyear: values.year ?? 0,\n\t\tmonth: values.month ?? 1,\n\t\tday: values.day ?? 1,\n\t\thours: values.hours ?? 0,\n\t\tminutes: values.minutes ?? 0,\n\t\tseconds: values.seconds ?? 0,\n\t});\n}\n\nfunction addDays(date: Date, days: number): Date {\n\tconst result = new Date(date);\n\tresult.setUTCDate(result.getUTCDate() + days);\n\treturn result;\n}\n\nfunction addMonths(date: Date, months: number): Date {\n\tconst result = new Date(date);\n\tresult.setUTCMonth(result.getUTCMonth() + months);\n\treturn result;\n}\n\nfunction addYears(date: Date, years: number): Date {\n\tconst result = new Date(date);\n\tresult.setUTCFullYear(result.getUTCFullYear() + years);\n\treturn result;\n}\n\nfunction getStartOfWeek(date: Date): Date {\n\tconst result = new Date(date);\n\tconst day = result.getUTCDay();\n\t// Monday as start of week\n\tconst diff = day === 0 ? -6 : 1 - day;\n\tresult.setUTCDate(result.getUTCDate() + diff);\n\treturn result;\n}\n\nfunction getEndOfWeek(date: Date): Date {\n\tconst start = getStartOfWeek(date);\n\treturn addDays(start, 6);\n}\n\nfunction getStartOfMonth(date: Date): Date {\n\treturn new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1));\n}\n\nfunction getEndOfMonth(date: Date): Date {\n\treturn new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1, 0));\n}\n\nfunction resolveVariable(expression: string, timezone?: string): string {\n\t// Split format: \"today|YYYY/MM/DD\" → variable=\"today\", format=\"YYYY/MM/DD\"\n\tconst pipeIndex = expression.indexOf(\"|\");\n\tconst variable =\n\t\tpipeIndex >= 0 ? expression.slice(0, pipeIndex).trim() : expression.trim();\n\tconst format =\n\t\tpipeIndex >= 0 ? expression.slice(pipeIndex + 1).trim() : undefined;\n\n\tconst now = getDateInTimezone(timezone);\n\n\t// Check for offset pattern: \"today+N\" or \"today-N\"\n\tconst offsetMatch = variable.match(/^today([+-])(\\d+)$/);\n\tif (offsetMatch) {\n\t\tconst sign = offsetMatch[1] === \"+\" ? 1 : -1;\n\t\tconst days = Number.parseInt(offsetMatch[2], 10);\n\t\tconst date = addDays(now, sign * days);\n\t\treturn formatDate(date, format ?? DEFAULT_DATE_FORMAT);\n\t}\n\n\tconst componentOffsetMatch = variable.match(/^(year|month|day)([+-])(\\d+)$/);\n\tif (componentOffsetMatch) {\n\t\tconst target = componentOffsetMatch[1];\n\t\tconst sign = componentOffsetMatch[2] === \"+\" ? 1 : -1;\n\t\tconst amount = Number.parseInt(componentOffsetMatch[3], 10);\n\n\t\tswitch (target) {\n\t\t\tcase \"year\":\n\t\t\t\treturn addYears(now, sign * amount)\n\t\t\t\t\t.getUTCFullYear()\n\t\t\t\t\t.toString();\n\t\t\tcase \"month\":\n\t\t\t\treturn padTwo(addMonths(now, sign * amount).getUTCMonth() + 1);\n\t\t\tcase \"day\":\n\t\t\t\treturn padTwo(addDays(now, sign * amount).getUTCDate());\n\t\t}\n\t}\n\n\tswitch (variable) {\n\t\tcase \"today\":\n\t\t\treturn formatDate(now, format ?? DEFAULT_DATE_FORMAT);\n\t\tcase \"yesterday\":\n\t\t\treturn formatDate(addDays(now, -1), format ?? DEFAULT_DATE_FORMAT);\n\t\tcase \"tomorrow\":\n\t\t\treturn formatDate(addDays(now, 1), format ?? DEFAULT_DATE_FORMAT);\n\t\tcase \"year\":\n\t\t\treturn now.getUTCFullYear().toString();\n\t\tcase \"month\":\n\t\t\treturn padTwo(now.getUTCMonth() + 1);\n\t\tcase \"day\":\n\t\t\treturn padTwo(now.getUTCDate());\n\t\tcase \"startOfWeek\":\n\t\t\treturn formatDate(getStartOfWeek(now), format ?? DEFAULT_DATE_FORMAT);\n\t\tcase \"endOfWeek\":\n\t\t\treturn formatDate(getEndOfWeek(now), format ?? DEFAULT_DATE_FORMAT);\n\t\tcase \"startOfMonth\":\n\t\t\treturn formatDate(getStartOfMonth(now), format ?? DEFAULT_DATE_FORMAT);\n\t\tcase \"endOfMonth\":\n\t\t\treturn formatDate(getEndOfMonth(now), format ?? DEFAULT_DATE_FORMAT);\n\t\tcase \"now\":\n\t\t\treturn formatDate(now, format ?? DEFAULT_DATETIME_FORMAT);\n\t\tdefault:\n\t\t\t// Unknown variable — return as-is\n\t\t\treturn `{{${expression}}}`;\n\t}\n}\n\n/**\n * Resolves all template variables in a string.\n *\n * @example\n * resolveTemplateString(\"{{yesterday}} 매출 분석\", \"Asia/Seoul\")\n * // → \"2026-03-30 매출 분석\"\n */\nexport function resolveTemplateString(\n\ttemplate: string,\n\ttimezone?: string,\n): string {\n\treturn template.replace(TEMPLATE_PATTERN, (_, expr: string) =>\n\t\tresolveVariable(expr, timezone),\n\t);\n}\n\n/**\n * Resolves all template variables in a record of string values.\n *\n * @example\n * resolveTemplateRecord({ date: \"{{today}}\", range: \"{{startOfMonth}}~{{today}}\" }, \"Asia/Seoul\")\n * // → { date: \"2026-03-31\", range: \"2026-03-01~2026-03-31\" }\n */\nexport function resolveTemplateRecord(\n\trecord: Record<string, string>,\n\ttimezone?: string,\n): Record<string, string> {\n\tconst resolved: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(record)) {\n\t\tresolved[key] = resolveTemplateString(value, timezone);\n\t}\n\treturn resolved;\n}\n"]}