{"version":3,"sources":["/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-RU2THAI2.cjs","../../src/services/workflow-table/shared.ts"],"names":[],"mappings":"AAAA;ACwIO,SAAS,cAAA,CAAe,KAAA,EAAiC;AAC/D,EAAA,OAAO,OAAO,MAAA,IAAU,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAC1D;AAEA,SAAS,wBAAA,CAAyB,KAAA,EAAuB;AACxD,EAAA,MAAM,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,CAAA;AAC3B,EAAA,MAAM,oBAAA,EACL,OAAA,CAAQ,UAAA,CAAW,GAAG,EAAA,GAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,EAAA,EAC5C,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAA;AAKrB,EAAA;AACR;AAE8D;AAClC,EAAA;AACK,EAAA;AACA,IAAA;AAChC,EAAA;AACO,EAAA;AACR;AAEiE;AACL,EAAA;AACnD,IAAA;AACR,EAAA;AAE2B,EAAA;AACnB,IAAA;AACR,EAAA;AAE+B,EAAA;AACvB,IAAA;AACR,EAAA;AAE2B,EAAA;AAKN,EAAA;AAEb,IAAA;AACR,EAAA;AAEmD,EAAA;AACR,EAAA;AACnC,IAAA;AACR,EAAA;AAEgC,EAAA;AACU,EAAA;AAC3C;AAKmB;AACyC,EAAA;AACnD,IAAA;AACR,EAAA;AAE6B,EAAA;AAGb,IAAA;AAChB,EAAA;AAE2B,EAAA;AACnB,IAAA;AACR,EAAA;AAE+B,EAAA;AACvB,IAAA;AACR,EAAA;AAE2B,EAAA;AAKN,EAAA;AAEb,IAAA;AACR,EAAA;AAEqC,EAAA;AACF,EAAA;AACpC;AAOqC;AAEe;AACH,EAAA;AACa,EAAA;AAC9D;AAKU;AAC4B,EAAA;AACf,IAAA;AACE,IAAA;AAC6C,IAAA;AACpE,EAAA;AACF;AAQoB;AAC6B,EAAA;AACxC,IAAA;AACR,EAAA;AACuB,EAAA;AAC0C,IAAA;AACzD,IAAA;AACR,EAAA;AACmC,EAAA;AACpC;AAEyD;AACvB,EAAA;AAClC;AD5L0G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-RU2THAI2.cjs","sourcesContent":[null,"import type {\n\tWorkflowRenderedTableData,\n\tWorkflowTableColumnFormat,\n\tWorkflowTableColumnFormatKind,\n} from \"@/types/memory.js\";\n\nexport type NumericCellValue = number | null;\nexport type RecordCellValue = string | number | null;\nexport type RecordTableRow = Record<string, RecordCellValue>;\nexport type MatrixTable = Record<string, Record<string, NumericCellValue>>;\n\nexport type ParsedMatrixFormula =\n\t| {\n\t\t\traw: string;\n\t\t\ttarget: string;\n\t\t\ttype: \"col_sum\";\n\t\t\targs: string[];\n\t  }\n\t| {\n\t\t\traw: string;\n\t\t\ttarget: string;\n\t\t\ttype: \"row_sum\";\n\t\t\targs: string[];\n\t  }\n\t| {\n\t\t\traw: string;\n\t\t\ttarget: string;\n\t\t\ttype: \"row_share\";\n\t\t\targs: [string, string];\n\t  }\n\t| {\n\t\t\traw: string;\n\t\t\ttarget: string;\n\t\t\ttype: \"row_ratio\";\n\t\t\targs: [string, string];\n\t  }\n\t| {\n\t\t\traw: string;\n\t\t\ttarget: string;\n\t\t\ttype: \"row_delta\" | \"row_rate\" | \"row_growth\";\n\t\t\targs: [string, string];\n\t  }\n\t| {\n\t\t\traw: string;\n\t\t\ttarget: string;\n\t\t\ttype: \"col_share\";\n\t\t\targs: [string, string];\n\t  }\n\t| {\n\t\t\traw: string;\n\t\t\ttarget: string;\n\t\t\ttype: \"col_ratio\";\n\t\t\targs: [string, string];\n\t  }\n\t| {\n\t\t\traw: string;\n\t\t\ttarget: string;\n\t\t\ttype: \"col_delta\" | \"col_rate\" | \"col_growth\";\n\t\t\targs: [string, string];\n\t  };\n\nexport type RecordExpressionOperand =\n\t| { kind: \"column\"; name: string }\n\t| { kind: \"number\"; value: number };\n\nexport type ParsedRecordFormula =\n\t| {\n\t\t\traw: string;\n\t\t\ttype: \"expression\";\n\t\t\ttarget: string;\n\t\t\toperands: RecordExpressionOperand[];\n\t\t\toperators: Array<\"+\" | \"-\" | \"*\" | \"/\">;\n\t  }\n\t| {\n\t\t\traw: string;\n\t\t\ttype: \"sum\";\n\t\t\ttarget: string;\n\t\t\tcolumns: string[];\n\t  }\n\t| {\n\t\t\traw: string;\n\t\t\ttype: \"total\";\n\t\t\tcolumns: string[];\n\t  };\n\nexport type MatrixDefinition = {\n\tlayout: \"matrix\";\n\trowHeader: string;\n\trows: string[];\n\tvisibleRows: string[];\n\tcolumns: string[];\n\tvisibleColumns: string[];\n\tcolumnFormats: Record<string, WorkflowTableColumnFormat>;\n\trowFormats: Record<string, WorkflowTableColumnFormat>;\n\tsourceRows: string[];\n\tsourceColumns: string[];\n\tcomputedRowTargets: Set<string>;\n\tcomputedColumnTargets: Set<string>;\n\tcomparisonRowTargets: Set<string>;\n\tcomparisonColumnTargets: Set<string>;\n\tpercentRows: Set<string>;\n\tpercentColumns: Set<string>;\n\tformulas: ParsedMatrixFormula[];\n};\n\nexport type RecordDefinition = {\n\tlayout: \"records\";\n\tcolumns: string[];\n\tvisibleColumns: string[];\n\tcolumnFormats: Record<string, WorkflowTableColumnFormat>;\n\tsourceColumns: string[];\n\tcomputedColumns: Set<string>;\n\tpercentColumns: Set<string>;\n\tformulas: ParsedRecordFormula[];\n\ttotalFormula?: Extract<ParsedRecordFormula, { type: \"total\" }>;\n};\n\nexport type WorkflowTableDefinition = MatrixDefinition | RecordDefinition;\n\nexport type WorkflowTableRenderResult = {\n\tcontent: string;\n\tdata: WorkflowRenderedTableData;\n};\n\nexport type ResolvedColumnFormat = {\n\tkind: WorkflowTableColumnFormatKind;\n\tgrouping: boolean;\n\t/** undefined = preserve the value's own decimal precision (capped). */\n\tdecimals: number | undefined;\n\tprefix: string;\n\tsuffix: string;\n\tnullDisplay: string;\n};\n\nexport type MatrixCellRef = `${string}::${string}`;\n\nexport function isFiniteNumber(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction normalizeNumberishString(value: string): string {\n\tconst trimmed = value.trim();\n\tconst negativeParentheses =\n\t\ttrimmed.startsWith(\"(\") && trimmed.endsWith(\")\")\n\t\t\t? `-${trimmed.slice(1, -1)}`\n\t\t\t: trimmed;\n\treturn negativeParentheses\n\t\t.replace(/[%,$₩원]/g, \"\")\n\t\t.replace(/,/g, \"\")\n\t\t.trim();\n}\n\nfunction normalizeTextIdentifierString(value: string): string {\n\tconst trimmed = value.trim();\n\tif (/^\\d[\\d,]*$/.test(trimmed)) {\n\t\treturn trimmed.replace(/,/g, \"\");\n\t}\n\treturn trimmed;\n}\n\nexport function parseNumberish(value: unknown): NumericCellValue {\n\tif (value === null || value === undefined || value === \"\") {\n\t\treturn null;\n\t}\n\n\tif (isFiniteNumber(value)) {\n\t\treturn value;\n\t}\n\n\tif (typeof value !== \"string\") {\n\t\treturn null;\n\t}\n\n\tconst trimmed = value.trim();\n\tif (\n\t\ttrimmed.length === 0 ||\n\t\ttrimmed === \"-\" ||\n\t\ttrimmed.toLowerCase() === \"null\" ||\n\t\ttrimmed.toLowerCase() === \"n/a\"\n\t) {\n\t\treturn null;\n\t}\n\n\tconst normalized = normalizeNumberishString(trimmed);\n\tif (!/^-?\\d+(?:\\.\\d+)?$/.test(normalized)) {\n\t\treturn null;\n\t}\n\n\tconst parsed = Number(normalized);\n\treturn Number.isFinite(parsed) ? parsed : null;\n}\n\nexport function parseRecordCell(\n\tvalue: unknown,\n\tformat?: WorkflowTableColumnFormat,\n): RecordCellValue {\n\tif (value === null || value === undefined || value === \"\") {\n\t\treturn null;\n\t}\n\n\tif (format?.kind === \"text\") {\n\t\treturn typeof value === \"string\"\n\t\t\t? normalizeTextIdentifierString(value)\n\t\t\t: String(value);\n\t}\n\n\tif (isFiniteNumber(value)) {\n\t\treturn value;\n\t}\n\n\tif (typeof value !== \"string\") {\n\t\treturn null;\n\t}\n\n\tconst trimmed = value.trim();\n\tif (\n\t\ttrimmed.length === 0 ||\n\t\ttrimmed === \"-\" ||\n\t\ttrimmed.toLowerCase() === \"null\" ||\n\t\ttrimmed.toLowerCase() === \"n/a\"\n\t) {\n\t\treturn null;\n\t}\n\n\tconst parsed = parseNumberish(trimmed);\n\treturn parsed === null ? trimmed : parsed;\n}\n\n/**\n * Fraction digits cap when a column declares no explicit `decimals`: enough to\n * keep source precision (values parsed from text round-trip exactly), while\n * cutting binary float noise from formula-computed cells (100/3 → \"33.3333\").\n */\nconst MAX_INFERRED_FRACTION_DIGITS = 4;\n\nfunction inferFractionDigits(value: number): number {\n\tconst fraction = String(value).split(\".\")[1] ?? \"\";\n\treturn Math.min(fraction.length, MAX_INFERRED_FRACTION_DIGITS);\n}\n\nexport function formatNumber(\n\tvalue: number,\n\toptions: { grouping: boolean; decimals: number | undefined },\n): string {\n\treturn value.toLocaleString(\"en-US\", {\n\t\tuseGrouping: options.grouping,\n\t\tminimumFractionDigits: 0,\n\t\tmaximumFractionDigits: options.decimals ?? inferFractionDigits(value),\n\t});\n}\n\nexport function safeDivide(\n\tnumerator: NumericCellValue,\n\tdenominator: NumericCellValue,\n\twarnings: string[],\n\tcontext: string,\n\tmultiplier = 1,\n): NumericCellValue {\n\tif (numerator === null || denominator === null) {\n\t\treturn null;\n\t}\n\tif (denominator === 0) {\n\t\twarnings.push(`Skipped ${context} because the denominator is 0.`);\n\t\treturn null;\n\t}\n\treturn (numerator / denominator) * multiplier;\n}\n\nexport function looksPercentLike(value: string): boolean {\n\treturn /%|Pct|Growth/i.test(value);\n}\n"]}