exploreda 0.0.5 → 0.1.0

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.
Files changed (208) hide show
  1. package/README.md +144 -0
  2. package/dist/ExplorEda.cjs +4608 -10858
  3. package/dist/ExplorEda.cjs.map +1 -1
  4. package/dist/ExplorEda.css +2332 -1653
  5. package/dist/ExplorEda.css.map +1 -1
  6. package/dist/ExplorEda.d.cts +125 -278
  7. package/dist/ExplorEda.d.ts +125 -278
  8. package/dist/ExplorEda.js +4521 -10782
  9. package/dist/ExplorEda.js.map +1 -1
  10. package/dist/calculations.cjs +18 -0
  11. package/dist/calculations.cjs.map +1 -0
  12. package/dist/calculations.d.cts +63 -0
  13. package/dist/calculations.d.ts +63 -0
  14. package/dist/calculations.js +3 -0
  15. package/dist/calculations.js.map +1 -0
  16. package/dist/charts/bar.cjs +27 -0
  17. package/dist/charts/bar.cjs.map +1 -0
  18. package/dist/charts/bar.d.cts +2 -0
  19. package/dist/charts/bar.d.ts +2 -0
  20. package/dist/charts/bar.js +18 -0
  21. package/dist/charts/bar.js.map +1 -0
  22. package/dist/charts/box-plot.cjs +26 -0
  23. package/dist/charts/box-plot.cjs.map +1 -0
  24. package/dist/charts/box-plot.d.cts +2 -0
  25. package/dist/charts/box-plot.d.ts +2 -0
  26. package/dist/charts/box-plot.js +17 -0
  27. package/dist/charts/box-plot.js.map +1 -0
  28. package/dist/charts/color-legend.cjs +22 -0
  29. package/dist/charts/color-legend.cjs.map +1 -0
  30. package/dist/charts/color-legend.d.cts +2 -0
  31. package/dist/charts/color-legend.d.ts +2 -0
  32. package/dist/charts/color-legend.js +13 -0
  33. package/dist/charts/color-legend.js.map +1 -0
  34. package/dist/charts/data-table.cjs +22 -0
  35. package/dist/charts/data-table.cjs.map +1 -0
  36. package/dist/charts/data-table.d.cts +2 -0
  37. package/dist/charts/data-table.d.ts +2 -0
  38. package/dist/charts/data-table.js +13 -0
  39. package/dist/charts/data-table.js.map +1 -0
  40. package/dist/charts/line.cjs +30 -0
  41. package/dist/charts/line.cjs.map +1 -0
  42. package/dist/charts/line.d.cts +2 -0
  43. package/dist/charts/line.d.ts +2 -0
  44. package/dist/charts/line.js +17 -0
  45. package/dist/charts/line.js.map +1 -0
  46. package/dist/charts/markdown.cjs +16 -0
  47. package/dist/charts/markdown.cjs.map +1 -0
  48. package/dist/charts/markdown.css +77 -0
  49. package/dist/charts/markdown.css.map +1 -0
  50. package/dist/charts/markdown.d.cts +2 -0
  51. package/dist/charts/markdown.d.ts +2 -0
  52. package/dist/charts/markdown.js +7 -0
  53. package/dist/charts/markdown.js.map +1 -0
  54. package/dist/charts/pivot-table.cjs +23 -0
  55. package/dist/charts/pivot-table.cjs.map +1 -0
  56. package/dist/charts/pivot-table.d.cts +2 -0
  57. package/dist/charts/pivot-table.d.ts +2 -0
  58. package/dist/charts/pivot-table.js +14 -0
  59. package/dist/charts/pivot-table.js.map +1 -0
  60. package/dist/charts/row.cjs +27 -0
  61. package/dist/charts/row.cjs.map +1 -0
  62. package/dist/charts/row.d.cts +6 -0
  63. package/dist/charts/row.d.ts +6 -0
  64. package/dist/charts/row.js +18 -0
  65. package/dist/charts/row.js.map +1 -0
  66. package/dist/charts/scatter.cjs +24 -0
  67. package/dist/charts/scatter.cjs.map +1 -0
  68. package/dist/charts/scatter.d.cts +2 -0
  69. package/dist/charts/scatter.d.ts +2 -0
  70. package/dist/charts/scatter.js +15 -0
  71. package/dist/charts/scatter.js.map +1 -0
  72. package/dist/charts/summary-table.cjs +19 -0
  73. package/dist/charts/summary-table.cjs.map +1 -0
  74. package/dist/charts/summary-table.d.cts +2 -0
  75. package/dist/charts/summary-table.d.ts +2 -0
  76. package/dist/charts/summary-table.js +10 -0
  77. package/dist/charts/summary-table.js.map +1 -0
  78. package/dist/charts/three-d-scatter.cjs +24 -0
  79. package/dist/charts/three-d-scatter.cjs.map +1 -0
  80. package/dist/charts/three-d-scatter.d.cts +6 -0
  81. package/dist/charts/three-d-scatter.d.ts +6 -0
  82. package/dist/charts/three-d-scatter.js +15 -0
  83. package/dist/charts/three-d-scatter.js.map +1 -0
  84. package/dist/chunk-3PGYFLE3.cjs +499 -0
  85. package/dist/chunk-3PGYFLE3.cjs.map +1 -0
  86. package/dist/chunk-4HNDKMWF.js +167 -0
  87. package/dist/chunk-4HNDKMWF.js.map +1 -0
  88. package/dist/chunk-4QNENKTV.cjs +1214 -0
  89. package/dist/chunk-4QNENKTV.cjs.map +1 -0
  90. package/dist/chunk-54M32JJB.js +132 -0
  91. package/dist/chunk-54M32JJB.js.map +1 -0
  92. package/dist/chunk-5B23JVH3.cjs +2238 -0
  93. package/dist/chunk-5B23JVH3.cjs.map +1 -0
  94. package/dist/chunk-5LH6NSNL.js +456 -0
  95. package/dist/chunk-5LH6NSNL.js.map +1 -0
  96. package/dist/chunk-6DOKKCJ5.cjs +313 -0
  97. package/dist/chunk-6DOKKCJ5.cjs.map +1 -0
  98. package/dist/chunk-6HZX5CBT.cjs +1074 -0
  99. package/dist/chunk-6HZX5CBT.cjs.map +1 -0
  100. package/dist/chunk-6U5DOIQM.js +1071 -0
  101. package/dist/chunk-6U5DOIQM.js.map +1 -0
  102. package/dist/chunk-7GBZIK2R.cjs +80 -0
  103. package/dist/chunk-7GBZIK2R.cjs.map +1 -0
  104. package/dist/chunk-7PTJNIOD.js +520 -0
  105. package/dist/chunk-7PTJNIOD.js.map +1 -0
  106. package/dist/chunk-AHZYQ7FN.js +319 -0
  107. package/dist/chunk-AHZYQ7FN.js.map +1 -0
  108. package/dist/chunk-AOODAOL4.cjs +55 -0
  109. package/dist/chunk-AOODAOL4.cjs.map +1 -0
  110. package/dist/chunk-ASKFIRMC.cjs +165 -0
  111. package/dist/chunk-ASKFIRMC.cjs.map +1 -0
  112. package/dist/chunk-B7OQUBH4.cjs +171 -0
  113. package/dist/chunk-B7OQUBH4.cjs.map +1 -0
  114. package/dist/chunk-BIMEHDLB.js +72 -0
  115. package/dist/chunk-BIMEHDLB.js.map +1 -0
  116. package/dist/chunk-C62KHV7S.js +1225 -0
  117. package/dist/chunk-C62KHV7S.js.map +1 -0
  118. package/dist/chunk-C7GQT65O.cjs +1119 -0
  119. package/dist/chunk-C7GQT65O.cjs.map +1 -0
  120. package/dist/chunk-CGDWDV4Z.js +1211 -0
  121. package/dist/chunk-CGDWDV4Z.js.map +1 -0
  122. package/dist/chunk-CJQQFNEY.js +69 -0
  123. package/dist/chunk-CJQQFNEY.js.map +1 -0
  124. package/dist/chunk-DHYLSXNR.js +964 -0
  125. package/dist/chunk-DHYLSXNR.js.map +1 -0
  126. package/dist/chunk-DKFA4KOJ.cjs +87 -0
  127. package/dist/chunk-DKFA4KOJ.cjs.map +1 -0
  128. package/dist/chunk-DS5BS7PP.cjs +357 -0
  129. package/dist/chunk-DS5BS7PP.cjs.map +1 -0
  130. package/dist/chunk-EGMFQSGK.js +909 -0
  131. package/dist/chunk-EGMFQSGK.js.map +1 -0
  132. package/dist/chunk-EU5EFHO5.cjs +53 -0
  133. package/dist/chunk-EU5EFHO5.cjs.map +1 -0
  134. package/dist/chunk-FM46QSDM.js +837 -0
  135. package/dist/chunk-FM46QSDM.js.map +1 -0
  136. package/dist/chunk-GV2LRR32.cjs +843 -0
  137. package/dist/chunk-GV2LRR32.cjs.map +1 -0
  138. package/dist/chunk-H3XKFSA5.cjs +322 -0
  139. package/dist/chunk-H3XKFSA5.cjs.map +1 -0
  140. package/dist/chunk-H5AVMMCE.js +347 -0
  141. package/dist/chunk-H5AVMMCE.js.map +1 -0
  142. package/dist/chunk-JDMUN4VK.cjs +986 -0
  143. package/dist/chunk-JDMUN4VK.cjs.map +1 -0
  144. package/dist/chunk-JNO7OXCC.js +2171 -0
  145. package/dist/chunk-JNO7OXCC.js.map +1 -0
  146. package/dist/chunk-JQMG4ZR7.js +111 -0
  147. package/dist/chunk-JQMG4ZR7.js.map +1 -0
  148. package/dist/chunk-L2Q2R43U.cjs +118 -0
  149. package/dist/chunk-L2Q2R43U.cjs.map +1 -0
  150. package/dist/chunk-LBTZVERO.js +466 -0
  151. package/dist/chunk-LBTZVERO.js.map +1 -0
  152. package/dist/chunk-LUUGGTTK.cjs +1227 -0
  153. package/dist/chunk-LUUGGTTK.cjs.map +1 -0
  154. package/dist/chunk-MEEPH7ZC.cjs +911 -0
  155. package/dist/chunk-MEEPH7ZC.cjs.map +1 -0
  156. package/dist/chunk-MJPDJ5AS.js +184 -0
  157. package/dist/chunk-MJPDJ5AS.js.map +1 -0
  158. package/dist/chunk-MJROUIDZ.cjs +219 -0
  159. package/dist/chunk-MJROUIDZ.cjs.map +1 -0
  160. package/dist/chunk-MUWSBYJS.js +528 -0
  161. package/dist/chunk-MUWSBYJS.js.map +1 -0
  162. package/dist/chunk-NDF5LCST.js +1088 -0
  163. package/dist/chunk-NDF5LCST.js.map +1 -0
  164. package/dist/chunk-NGWTPED4.js +311 -0
  165. package/dist/chunk-NGWTPED4.js.map +1 -0
  166. package/dist/chunk-PP4VCONW.js +739 -0
  167. package/dist/chunk-PP4VCONW.js.map +1 -0
  168. package/dist/chunk-PRMC2A6P.cjs +488 -0
  169. package/dist/chunk-PRMC2A6P.cjs.map +1 -0
  170. package/dist/chunk-PST6UU6S.cjs +742 -0
  171. package/dist/chunk-PST6UU6S.cjs.map +1 -0
  172. package/dist/chunk-Q7LK2UWH.js +33 -0
  173. package/dist/chunk-Q7LK2UWH.js.map +1 -0
  174. package/dist/chunk-SFV5LZPD.js +162 -0
  175. package/dist/chunk-SFV5LZPD.js.map +1 -0
  176. package/dist/chunk-SKXGYJJG.cjs +370 -0
  177. package/dist/chunk-SKXGYJJG.cjs.map +1 -0
  178. package/dist/chunk-SWLNKY6R.js +477 -0
  179. package/dist/chunk-SWLNKY6R.js.map +1 -0
  180. package/dist/chunk-TGVLNHUB.cjs +483 -0
  181. package/dist/chunk-TGVLNHUB.cjs.map +1 -0
  182. package/dist/chunk-TLLRW6S3.js +74 -0
  183. package/dist/chunk-TLLRW6S3.js.map +1 -0
  184. package/dist/chunk-TRAIXZ6M.cjs +140 -0
  185. package/dist/chunk-TRAIXZ6M.cjs.map +1 -0
  186. package/dist/chunk-U74A5VK5.cjs +74 -0
  187. package/dist/chunk-U74A5VK5.cjs.map +1 -0
  188. package/dist/chunk-UAVDLBTA.cjs +74 -0
  189. package/dist/chunk-UAVDLBTA.cjs.map +1 -0
  190. package/dist/chunk-UJWS6TRV.js +354 -0
  191. package/dist/chunk-UJWS6TRV.js.map +1 -0
  192. package/dist/chunk-UUJMUPB3.cjs +531 -0
  193. package/dist/chunk-UUJMUPB3.cjs.map +1 -0
  194. package/dist/chunk-VTKHZIJB.cjs +549 -0
  195. package/dist/chunk-VTKHZIJB.cjs.map +1 -0
  196. package/dist/chunk-YXPAWUXO.js +51 -0
  197. package/dist/chunk-YXPAWUXO.js.map +1 -0
  198. package/dist/chunk-ZD64SCZB.js +80 -0
  199. package/dist/chunk-ZD64SCZB.js.map +1 -0
  200. package/dist/core.cjs +28 -0
  201. package/dist/core.cjs.map +1 -0
  202. package/dist/core.d.cts +22 -0
  203. package/dist/core.d.ts +22 -0
  204. package/dist/core.js +3 -0
  205. package/dist/core.js.map +1 -0
  206. package/dist/dataLayerState-B4XmQjQN.d.cts +258 -0
  207. package/dist/dataLayerState-B4XmQjQN.d.ts +258 -0
  208. package/package.json +32 -52
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/categories.ts","../src/lib/dateTime.ts","../src/lib/fieldSettings.ts","../src/components/charts/chartAccessibility.ts","../src/hooks/CrossfilterWrapper.ts","../src/lib/calculations/functions/registry.ts","../src/lib/calculations/engine/Calculator.ts","../src/lib/calculations/CalculationState.ts","../src/lib/numeric.ts","../src/components/SummaryTable/utils/dataTypeDetection.ts","../src/components/SummaryTable/utils/statisticsCalculator.ts","../src/lib/fieldProfiles.ts","../src/lib/aggregates.ts","../src/utils/compactChartLayouts.ts","../src/providers/lib/dataLayerState.ts","../src/providers/DataLayerProvider.tsx","../src/lib/utils.ts","../src/components/ui/tooltip.tsx","../src/components/ui/button.tsx"],"names":["yearText","getFieldLabel","getChartDefinition","crossfilter","isEqual","utcFormat","bins","typeOverrides","parseExpression","chartRegistry","createStore","crossfilterWrapper","chart","columnData","createContext","useRef","useEffect","useContext","useStore","twMerge","clsx","jsx","TooltipPrimitive","jsxs","cva","Slot"],"mappings":"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","file":"chunk-5B23JVH3.cjs","sourcesContent":["import type { datum } from \"@/types/ChartTypes\";\n\nexport const categoryValue = (value: datum): datum => value ?? null;\nexport const categoryKey = (value: datum): string => {\n if (value == null) return JSON.stringify([\"missing\"]);\n if (typeof value === \"number\" && !Number.isFinite(value)) {\n return JSON.stringify([\"number\", String(value)]);\n }\n return JSON.stringify([typeof value, value]);\n};\n\nexport function categoryEqual(left: datum, right: datum): boolean {\n return (\n (left == null && right == null) ||\n left === right ||\n (typeof left === \"number\" &&\n typeof right === \"number\" &&\n Number.isNaN(left) &&\n Number.isNaN(right))\n );\n}\n\nexport function categoryIncludes(values: datum[], value: datum): boolean {\n return (\n values.includes(value) ||\n (value == null && values.some((item) => item == null))\n );\n}\n\nexport function categoryLabel(value: datum): string {\n if (value == null) return \"(missing)\";\n if (\n typeof value === \"string\" &&\n (!value.trim() ||\n !Number.isNaN(Number(value)) ||\n /^(true|false|null|undefined|NaN|Other categories|\\(missing\\))$/.test(\n value\n ) ||\n value.startsWith('\"'))\n )\n return JSON.stringify(value);\n return String(value);\n}\n","// ISO dates and timestamps without an offset use UTC. Explicit offsets are preserved.\nexport function dateTimestamp(value: string): number {\n return Date.parse(\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?$/.test(value)\n ? `${value}Z`\n : value\n );\n}\n","import { dateTimestamp } from \"@/lib/dateTime\";\nimport type { datum } from \"@/types/ChartTypes\";\nimport type { DataType } from \"@/components/SummaryTable/utils/dataTypeDetection\";\n\nexport type DatePreset = \"iso\" | \"month-day-year\" | \"day-month-year\";\nexport type FieldFormat =\n | \"auto\"\n | \"number\"\n | \"currency\"\n | \"percent\"\n | \"date\"\n | \"datetime\";\n\nexport interface FieldSettings {\n type?: DataType;\n label?: string;\n description?: string;\n format?: FieldFormat;\n precision?: number;\n unit?: string;\n currency?: string;\n datePreset?: DatePreset;\n nullTokens?: string[];\n}\n\nexport type FieldSettingsMap = Record<string, FieldSettings>;\n\nexport interface ConversionFailure {\n row: number;\n raw: datum;\n reason: string;\n}\n\nexport interface ConversionPreview {\n field: string;\n inferredType: DataType;\n effectiveType: DataType;\n totalCount: number;\n validCount: number;\n missingCount: number;\n failedCount: number;\n examples: Array<{ row: number; raw: datum; value: datum }>;\n failures: ConversionFailure[];\n}\n\nconst validTypes = new Set<DataType>([\n \"numeric\",\n \"categorical\",\n \"datetime\",\n \"boolean\",\n]);\nconst validFormats = new Set<FieldFormat>([\n \"auto\",\n \"number\",\n \"currency\",\n \"percent\",\n \"date\",\n \"datetime\",\n]);\n\n/** Return the validation error shown before settings are saved. */\nexport function getFieldSettingsError(\n settings: FieldSettings\n): string | undefined {\n if (settings.type && !validTypes.has(settings.type)) {\n return \"Choose a valid field type.\";\n }\n if (settings.format && !validFormats.has(settings.format)) {\n return \"Choose a valid display format.\";\n }\n if (\n settings.precision !== undefined &&\n (!Number.isInteger(settings.precision) ||\n settings.precision < 0 ||\n settings.precision > 20)\n ) {\n return \"Precision must be a whole number from 0 to 20.\";\n }\n if (settings.currency !== undefined && !/^[A-Z]{3}$/.test(settings.currency)) {\n return \"Currency must be a three-letter code, such as USD.\";\n }\n if (\n settings.datePreset !== undefined &&\n ![\"iso\", \"month-day-year\", \"day-month-year\"].includes(settings.datePreset)\n ) {\n return \"Choose a valid date input preset.\";\n }\n if (\n settings.nullTokens !== undefined &&\n settings.nullTokens.some((token) => typeof token !== \"string\")\n ) {\n return \"Null tokens must be text values.\";\n }\n return undefined;\n}\n\nfunction validCalendarDate(year: number, month: number, day: number) {\n const timestamp = Date.UTC(year, month - 1, day);\n const date = new Date(timestamp);\n return (\n Number.isFinite(timestamp) &&\n date.getUTCFullYear() === year &&\n date.getUTCMonth() === month - 1 &&\n date.getUTCDate() === day\n );\n}\n\nfunction parseDate(value: string, preset: DatePreset = \"iso\") {\n const text = value.trim();\n if (preset === \"month-day-year\" || preset === \"day-month-year\") {\n const match = text.match(/^(\\d{1,2})[/-](\\d{1,2})[/-](\\d{4})$/);\n if (match) {\n const [, first, second, yearText] = match;\n const year = Number(yearText);\n const month =\n preset === \"month-day-year\" ? Number(first) : Number(second);\n const day = preset === \"month-day-year\" ? Number(second) : Number(first);\n const parsed = Date.UTC(year, month - 1, day);\n if (validCalendarDate(year, month, day)) {\n return parsed;\n }\n }\n return NaN;\n }\n\n const isoMatch = text.match(\n /^(\\d{4})-(\\d{2})-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d+))?)?(Z|[+-]\\d{2}:\\d{2})?)?$/\n );\n if (!isoMatch) return NaN;\n const [, yearText, monthText, dayText] = isoMatch;\n if (\n !validCalendarDate(\n Number(yearText),\n Number(monthText),\n Number(dayText)\n )\n ) {\n return NaN;\n }\n return dateTimestamp(text);\n}\n\nexport function convertFieldValue(\n raw: datum,\n type: DataType,\n settings: FieldSettings = {}\n): { value: datum; error?: string } {\n if (raw == null) {\n return { value: undefined };\n }\n const text = typeof raw === \"string\" ? raw.trim() : String(raw);\n if (settings.nullTokens?.some((token) => token === text)) {\n return { value: undefined };\n }\n if (type !== \"categorical\" && text === \"\") {\n return { value: undefined };\n }\n\n switch (type) {\n case \"categorical\":\n return { value: raw };\n case \"numeric\": {\n const value = typeof raw === \"number\" ? raw : Number(text);\n return Number.isFinite(value)\n ? { value }\n : { value: undefined, error: \"Not a finite number\" };\n }\n case \"boolean\":\n if (raw === true || raw === false) {\n return { value: raw };\n }\n if (text.toLowerCase() === \"true\") {\n return { value: true };\n }\n if (text.toLowerCase() === \"false\") {\n return { value: false };\n }\n return { value: undefined, error: \"Expected true or false\" };\n case \"datetime\": {\n const timestamp = parseDate(text, settings.datePreset);\n return Number.isFinite(timestamp)\n ? { value: new Date(timestamp).toISOString() }\n : { value: undefined, error: \"Invalid date\" };\n }\n }\n}\n\nexport function getFieldLabel(field: string, settings: FieldSettings = {}) {\n const label = settings.label?.trim() || field;\n return settings.unit ? `${label} (${settings.unit})` : label;\n}\n\nexport function hasFieldDisplayFormat(settings: FieldSettings = {}) {\n return Boolean(\n (settings.format && settings.format !== \"auto\") ||\n settings.precision !== undefined ||\n settings.unit\n );\n}\n\nexport function formatFieldValue(\n field: string,\n value: datum,\n settings: FieldSettings = {}\n): string {\n void field;\n if (value == null) {\n return \"—\";\n }\n if (typeof value === \"boolean\") {\n return value ? \"Yes\" : \"No\";\n }\n if (typeof value === \"string\" && value.trim() === \"\") {\n return \"—\";\n }\n\n const format = settings.format ?? \"auto\";\n if (format === \"date\" || format === \"datetime\") {\n const date =\n typeof value === \"number\" ? new Date(value) : new Date(String(value));\n if (Number.isFinite(date.getTime())) {\n const options: Intl.DateTimeFormatOptions = {\n timeZone: \"UTC\",\n dateStyle: \"medium\",\n };\n if (format === \"datetime\") options.timeStyle = \"short\";\n const text = new Intl.DateTimeFormat(\"en-US\", options).format(date);\n return settings.unit ? `${text} ${settings.unit}` : text;\n }\n return String(value);\n }\n\n const numberValue =\n format === \"number\" || format === \"currency\" || format === \"percent\" ||\n (typeof value === \"number\" && format === \"auto\")\n ? Number(value)\n : NaN;\n if (Number.isFinite(numberValue)) {\n const precision =\n Number.isInteger(settings.precision) &&\n settings.precision !== undefined &&\n settings.precision >= 0 &&\n settings.precision <= 20\n ? settings.precision\n : undefined;\n const options: Intl.NumberFormatOptions = {\n maximumFractionDigits: precision ?? 3,\n minimumFractionDigits: precision,\n };\n if (format === \"currency\") {\n options.style = \"currency\";\n options.currency = /^[A-Z]{3}$/.test(settings.currency ?? \"\")\n ? settings.currency\n : \"USD\";\n } else if (format === \"percent\") {\n options.style = \"percent\";\n }\n const text = new Intl.NumberFormat(\"en-US\", options).format(numberValue);\n return settings.unit ? `${text} ${settings.unit}` : text;\n }\n\n return String(value);\n}\n\nexport function applyFieldSettings<T extends Record<string, datum>>(\n rows: T[],\n fieldSettings: FieldSettingsMap,\n inferredTypes: Record<string, DataType>\n): T[] {\n return rows.map((row) => {\n const next = { ...row };\n Object.entries(fieldSettings).forEach(([field, settings]) => {\n if (\n !settings.type &&\n !(settings.nullTokens && settings.nullTokens.length > 0) &&\n !settings.datePreset\n ) {\n return;\n }\n const type = settings.type ?? inferredTypes[field];\n if (!type || !(field in row)) {\n return;\n }\n (next as Record<string, datum>)[field] = convertFieldValue(\n row[field],\n type,\n settings\n ).value;\n });\n return next;\n });\n}\n\nexport function buildConversionPreview(\n field: string,\n rows: Array<Record<string, datum>>,\n settings: FieldSettings = {},\n inferredType: DataType\n): ConversionPreview {\n const effectiveType = settings.type ?? inferredType;\n const examples: ConversionPreview[\"examples\"] = [];\n const failures: ConversionFailure[] = [];\n let validCount = 0;\n let missingCount = 0;\n\n rows.forEach((row, rowIndex) => {\n const raw = row[field];\n const converts =\n settings.type !== undefined ||\n Boolean(settings.datePreset) ||\n Boolean(settings.nullTokens?.length);\n const result = converts\n ? convertFieldValue(raw, effectiveType, settings)\n : { value: raw };\n if (result.error) {\n failures.push({ row: rowIndex, raw, reason: result.error });\n } else if (raw == null || result.value == null) {\n missingCount += 1;\n } else {\n validCount += 1;\n }\n if (examples.length < 8 && (raw != null || result.error)) {\n examples.push({ row: rowIndex, raw, value: result.value });\n }\n });\n\n return {\n field,\n inferredType,\n effectiveType,\n totalCount: rows.length,\n validCount,\n missingCount,\n failedCount: failures.length,\n examples,\n failures,\n };\n}\n","import { ChartSettings } from \"@/types/ChartTypes\";\nimport { getChartDefinition } from \"@/charts/registry\";\n\nconst chartNames: Record<string, string> = {\n row: \"Row chart\",\n bar: \"Bar chart\",\n scatter: \"Scatter plot\",\n line: \"Line chart\",\n boxplot: \"Box plot\",\n \"3d-scatter\": \"3D scatter plot\",\n pivot: \"Pivot table\",\n \"data-table\": \"Data table\",\n summary: \"Summary table\",\n \"color-legend\": \"Color legend\",\n markdown: \"Markdown note\",\n};\n\nexport function getChartTitle(\n settings: ChartSettings,\n getFieldLabel: (field: string) => string = (field) => field\n): string {\n const title = settings.title.trim();\n if (\n settings.type === \"color-legend\" &&\n settings.fields.length === 1 &&\n (!title || settings.title === \"Color Legend\")\n ) {\n return getFieldLabel(settings.fields[0]!);\n }\n if (title) {\n return title;\n }\n\n const field =\n settings.type === \"bar\" ||\n settings.type === \"row\" ||\n settings.type === \"boxplot\"\n ? settings.field\n : settings.type === \"scatter\" || settings.type === \"3d-scatter\"\n ? settings.yField\n : settings.type === \"line\" && settings.seriesField.length === 1\n ? settings.seriesField[0]\n : undefined;\n if (!field) {\n return getChartDefinition(settings.type).name;\n }\n const label = field === \"__ID\" ? \"Row sequence\" : getFieldLabel(field);\n if (settings.type === \"bar\") {\n return `Distribution of ${label}`;\n }\n if (settings.type === \"row\") {\n return `Rows by ${label}`;\n }\n return `${getChartDefinition(settings.type).name} · ${label}`;\n}\n\nexport function getChartFields(settings: ChartSettings): string[] {\n const fields = (() => {\n switch (settings.type) {\n case \"line\":\n return [settings.xField, ...settings.seriesField];\n case \"scatter\":\n return [settings.xField, settings.yField, settings.colorField];\n case \"3d-scatter\":\n return [\n settings.xField,\n settings.yField,\n settings.zField,\n settings.colorField,\n settings.sizeField,\n ];\n case \"pivot\":\n return [\n ...settings.rowFields,\n settings.columnField,\n ...settings.valueFields.map((field) => field.field),\n ];\n case \"data-table\":\n return settings.columns.map((column) => column.field);\n case \"color-legend\":\n return settings.fields;\n default:\n return [settings.field, settings.colorField];\n }\n })();\n\n return Array.from(\n new Set(fields.filter((field): field is string => Boolean(field)))\n );\n}\n\nexport function getChartAxisFields(settings: ChartSettings): {\n x?: string;\n y?: string;\n} {\n switch (settings.type) {\n case \"bar\":\n return { x: settings.field };\n case \"row\":\n return { y: settings.field };\n case \"scatter\":\n return { x: settings.xField, y: settings.yField };\n case \"line\":\n return {\n x: settings.xField,\n y:\n settings.seriesField.length === 1\n ? settings.seriesField[0]\n : undefined,\n };\n case \"boxplot\":\n return { y: settings.field };\n case \"3d-scatter\":\n return { x: settings.xField, y: settings.yField };\n default:\n return {};\n }\n}\n\nexport function getChartAxisLabel(\n field: string | undefined,\n local: string,\n getFieldLabel: (field: string) => string = (value) => value\n): string {\n return (\n local ||\n (field === \"__ID\" ? \"Row sequence\" : field ? getFieldLabel(field) : \"\")\n );\n}\n\nexport function getChartSummary(\n settings: ChartSettings,\n getFieldLabel: (field: string) => string = (field) => field\n): string {\n const name = chartNames[settings.type] ?? \"Chart\";\n if (settings.type === \"summary\") {\n return `${name} of all data columns.`;\n }\n if (settings.type === \"markdown\") {\n return `${name}.`;\n }\n const fields = getChartFields(settings);\n return fields.length\n ? `${name} showing ${fields.map(getFieldLabel).join(\", \")}.`\n : `${name} with no data fields selected.`;\n}\n","import { getChartDefinition } from \"@/charts/registry\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { ChartSettings } from \"@/types/ChartTypes\";\nimport crossfilter from \"crossfilter2\";\nimport isEqual from \"react-fast-compare\";\n\ntype FieldValue = string | number | boolean | null | undefined;\n\ntype ChartDimension<TData, TId extends IdType> = {\n dimension: crossfilter.Dimension<TData, TId>;\n chart: ChartSettings;\n group: crossfilter.Group<TData, TId, number>;\n};\n\nexport class CrossfilterWrapper<T> {\n ref: crossfilter.Crossfilter<T>;\n private nonce = 0;\n charts: Map<string, ChartDimension<T, IdType>> = new Map();\n idFunction: (item: T) => IdType;\n\n // assume this gets set after creation\n fieldGetter: (name: string) => Record<IdType, FieldValue> = () => ({});\n\n constructor(data: T[], idFunction: (item: T) => IdType) {\n this.ref = crossfilter(data);\n this.idFunction = idFunction;\n }\n\n setFieldGetter(fieldGetter: (name: string) => Record<IdType, FieldValue>) {\n this.fieldGetter = fieldGetter;\n }\n\n updateChart(chart: ChartSettings) {\n const existing = this.charts.get(chart.id);\n if (!existing) {\n this.addChart(chart);\n return;\n }\n if (!isEqual(existing.chart, chart)) this.updateChartFilters(chart);\n existing.chart = chart;\n }\n\n updateChartFilters(chart: ChartSettings) {\n // get the filters from the chart\n const filterFunc = this.getFilterFunction(chart);\n\n const foundChart = this.charts.get(chart.id);\n\n // apply the filters to the dimension\n const dimension = foundChart?.dimension;\n if (!dimension) {\n return;\n }\n\n dimension.filterFunction(filterFunc);\n\n // this gives an object with key + value\n // the value will be 1 if the item should be rendered\n // will still need to check the value = 1 items in the actual chart with the filter func again\n // ideally wire up the hook to the raw crossfilter obj so charts can get IDs to render per dim\n }\n\n addChart(chart: ChartSettings) {\n // need to create a dimension for the chart\n const dimension = this.ref.dimension(this.idFunction);\n\n const chartDimension: ChartDimension<T, IdType> = {\n dimension,\n chart,\n group: dimension.group<IdType, number>(),\n };\n\n this.charts.set(chart.id, chartDimension);\n\n this.updateChartFilters(chart);\n }\n\n removeChart(chart: ChartSettings) {\n const savedChart = this.charts.get(chart.id);\n if (!savedChart) {\n throw new Error(`Chart ${chart.id} not found`);\n }\n\n savedChart.dimension.filterAll();\n savedChart.group.dispose();\n savedChart.dimension.dispose();\n this.charts.delete(chart.id);\n }\n\n removeAllCharts() {\n // Clear and dispose all dimensions\n for (const chart of this.charts.values()) {\n chart.dimension.filterAll();\n chart.group.dispose();\n chart.dimension.dispose();\n }\n // Clear the charts map\n this.charts.clear();\n }\n\n getFilterFunction(chart: ChartSettings): (d: IdType) => boolean {\n const definition = getChartDefinition(chart.type);\n return definition.getFilterFunction(chart, this.fieldGetter);\n }\n\n getFilteredRowCount() {\n return this.ref.allFiltered().length;\n }\n\n getFilteredRowIds(): IdType[] {\n return this.ref.allFiltered().map(this.idFunction);\n }\n\n getAllData() {\n // obj with key as id and value as datum\n\n // id -> count\n const data: LiveItemMap = {};\n\n const commonNonce = ++this.nonce;\n\n for (const chart of this.charts.values()) {\n data[chart.chart.id] = {\n items: chart.group.all(),\n nonce: commonNonce,\n };\n }\n\n return data;\n }\n}\n\nexport type LiveItem = {\n items: readonly crossfilter.Grouping<IdType, number>[];\n nonce: number;\n};\n\nexport type LiveItemMap = Record<string, LiveItem>;\n","import { dateTimestamp } from \"@/lib/dateTime\";\nimport { utcFormat } from \"d3-time-format\";\nimport type { CalculationValue } from \"../types\";\n\nexport function numericValue(value: CalculationValue): number {\n if (value == null || value === \"\") throw new Error(\"Missing numeric value\");\n if (\n (typeof value !== \"number\" && typeof value !== \"string\") ||\n (typeof value === \"string\" && !value.trim()) ||\n !Number.isFinite(Number(value))\n ) {\n throw new Error(`Invalid numeric value: ${String(value)}`);\n }\n return Number(value);\n}\n\nfunction dateValue(value: CalculationValue): Date {\n const date =\n value instanceof Date ? value : new Date(dateTimestamp(String(value)));\n if (!Number.isFinite(date.getTime())) {\n throw new Error(`Invalid date: ${String(value)}`);\n }\n return date;\n}\n\ninterface CalculationFunction {\n syntax: string;\n description: string;\n minArgs: number;\n maxArgs?: number;\n evaluate: (...args: CalculationValue[]) => CalculationValue;\n}\n\n// Functions operate on values within one row. Date results use UTC.\nexport const calculationFunctions: Record<string, CalculationFunction> = {\n sum: {\n description: \"Add values within this row.\",\n syntax: \"sum(x, y, …)\",\n minArgs: 1,\n evaluate: (...values) =>\n values.reduce<number>((sum, value) => sum + numericValue(value), 0),\n },\n avg: {\n description: \"Average values within this row, not across rows.\",\n syntax: \"avg(x, y, …)\",\n minArgs: 1,\n evaluate: (...values) =>\n values.reduce<number>((sum, value) => sum + numericValue(value), 0) /\n values.length,\n },\n min: {\n description: \"Return the smallest supplied value.\",\n syntax: \"min(x, y, …)\",\n minArgs: 1,\n evaluate: (...values) => Math.min(...values.map(numericValue)),\n },\n max: {\n description: \"Return the largest supplied value.\",\n syntax: \"max(x, y, …)\",\n minArgs: 1,\n evaluate: (...values) => Math.max(...values.map(numericValue)),\n },\n count: {\n description: \"Count supplied arguments, including missing values.\",\n syntax: \"count(x, y, …)\",\n minArgs: 0,\n evaluate: (...values) => values.length,\n },\n formatdate: {\n description: \"Format a UTC date. Use %Y-%m for a month label.\",\n syntax: 'formatDate(date, \"%Y-%m-%d\")',\n minArgs: 2,\n maxArgs: 2,\n evaluate: (value, format) => utcFormat(String(format))(dateValue(value)),\n },\n extractdatecomponent: {\n description: \"Extract a UTC year, month, day, quarter, or ISO week.\",\n syntax: 'extractDateComponent(date, \"year\")',\n minArgs: 2,\n maxArgs: 2,\n evaluate: (value, component) => {\n const date = dateValue(value);\n switch (component) {\n case \"year\":\n return date.getUTCFullYear();\n case \"month\":\n return date.getUTCMonth() + 1;\n case \"day\":\n return date.getUTCDate();\n case \"quarter\":\n return Math.floor(date.getUTCMonth() / 3) + 1;\n case \"week\":\n return Number(utcFormat(\"%V\")(date));\n default:\n throw new Error(`Unknown date component: ${String(component)}`);\n }\n },\n },\n};\n\nexport function getFunction(\n name: string,\n argumentCount: number\n): CalculationFunction {\n const key = name.toLowerCase();\n const fn = Object.hasOwn(calculationFunctions, key)\n ? calculationFunctions[key]\n : undefined;\n if (!fn) throw new Error(`Unknown function: ${name}`);\n if (\n argumentCount < fn.minArgs ||\n (fn.maxArgs !== undefined && argumentCount > fn.maxArgs)\n ) {\n throw new Error(`Invalid arguments. Use ${fn.syntax}`);\n }\n return fn;\n}\n","import { getFunction, numericValue } from \"../functions/registry\";\nimport type {\n CalculationContext,\n CalculationResult,\n CalculationValue,\n Expression,\n} from \"../types\";\n\nexport interface CalculationStep {\n id: string;\n depth: number;\n label: string;\n value?: CalculationValue;\n error?: string;\n}\n\nexport function validateExpression(\n expression: Expression,\n fields: string[]\n): void {\n for (const field of expression.dependencies) {\n if (!fields.includes(field)) throw new Error(`Unknown field: ${field}`);\n }\n switch (expression.type) {\n case \"function\":\n getFunction(expression.functionName, expression.arguments.length);\n expression.arguments.forEach((arg) => validateExpression(arg, fields));\n break;\n case \"basic\":\n validateExpression(expression.left, fields);\n validateExpression(expression.right, fields);\n break;\n case \"unary\":\n validateExpression(expression.operand, fields);\n break;\n case \"ternary\":\n validateExpression(expression.condition, fields);\n validateExpression(expression.trueBranch, fields);\n validateExpression(expression.falseBranch, fields);\n }\n}\n\nexport class Calculator {\n private depth = 0;\n\n constructor(\n private context: CalculationContext,\n private steps?: CalculationStep[]\n ) {}\n\n evaluate(expression: Expression): CalculationResult {\n try {\n return { success: true, value: this.value(expression) };\n } catch (error) {\n return {\n success: false,\n value: null,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n private value(expression: Expression): CalculationValue {\n const depth = this.depth++;\n const label =\n expression.type === \"literal\"\n ? (expression.dependencies[0] ?? String(expression.value))\n : expression.type === \"function\"\n ? expression.functionName\n : expression.type === \"ternary\"\n ? \"conditional\"\n : expression.operator;\n try {\n const result = this.evaluateValue(expression);\n if (typeof result === \"number\" && !Number.isFinite(result)) {\n throw new Error(\"Calculation produced a non-finite number\");\n }\n this.steps?.push({ id: expression.id, depth, label, value: result });\n return result;\n } catch (error) {\n this.steps?.push({\n id: expression.id,\n depth,\n label,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n this.depth--;\n }\n }\n\n private evaluateValue(expression: Expression): CalculationValue {\n switch (expression.type) {\n case \"literal\": {\n // The parser records a dependency only for a field reference, never quoted text.\n const field = expression.dependencies[0];\n if (field === undefined) return expression.value;\n if (!this.context.variables.has(field))\n throw new Error(`Undefined variable: ${field}`);\n return this.context.variables.get(field);\n }\n case \"function\":\n return getFunction(\n expression.functionName,\n expression.arguments.length\n ).evaluate(...expression.arguments.map((arg) => this.value(arg)));\n case \"ternary\":\n if (\n !expression.condition ||\n !expression.trueBranch ||\n !expression.falseBranch\n ) {\n throw new Error(\"Invalid ternary expression: missing branches\");\n }\n return this.value(\n this.value(expression.condition)\n ? expression.trueBranch\n : expression.falseBranch\n );\n case \"unary\": {\n if (!expression.operand)\n throw new Error(\"Invalid unary expression: missing operand\");\n const value = this.value(expression.operand);\n switch (expression.operator) {\n case \"!\":\n return !value;\n case \"-\":\n return -numericValue(value);\n case \"+\":\n return numericValue(value);\n default:\n throw new Error(`Unknown unary operator: ${expression.operator}`);\n }\n }\n case \"basic\": {\n if (!expression.left || !expression.right)\n throw new Error(\"Invalid basic expression: missing operands\");\n const left = this.value(expression.left);\n // Do not evaluate an unused branch, such as a guarded division by zero.\n if (expression.operator === \"&&\")\n return Boolean(left) && Boolean(this.value(expression.right));\n if (expression.operator === \"||\")\n return Boolean(left) || Boolean(this.value(expression.right));\n const right = this.value(expression.right);\n if (expression.operator === \"==\")\n return left == null ? right == null : left === right;\n if (expression.operator === \"!=\")\n return left == null ? right != null : left !== right;\n const a = numericValue(left);\n const b = numericValue(right);\n switch (expression.operator) {\n case \"+\":\n return a + b;\n case \"-\":\n return a - b;\n case \"*\":\n return a * b;\n case \"/\":\n if (b === 0) throw new Error(\"Division by zero\");\n return a / b;\n case \"^\":\n return a ** b;\n case \">\":\n return a > b;\n case \">=\":\n return a >= b;\n case \"<\":\n return a < b;\n case \"<=\":\n return a <= b;\n default:\n throw new Error(`Unknown operator: ${expression.operator}`);\n }\n }\n default:\n throw new Error(\"Unknown expression type\");\n }\n }\n}\n","import type { DatumObject, HasId } from \"@/providers/DataLayerProvider\";\nimport type { datum } from \"@/types/ChartTypes\";\nimport {\n Calculator,\n validateExpression,\n type CalculationStep,\n} from \"./engine/Calculator\";\nimport type { CalculationValue, Expression } from \"./types\";\n\nexport interface CalculationDefinition {\n expression: Expression;\n resultColumnName: string;\n}\n\nexport interface RowCalculationTrace {\n field: string;\n expression: string;\n value: datum;\n error?: string;\n steps: CalculationStep[];\n inputs: { field: string; value: CalculationValue }[];\n dependencies: RowCalculationTrace[];\n}\n\nexport class CalculationManager<T extends DatumObject> {\n private calculations: CalculationDefinition[] = [];\n private results = new Map<string, Map<number, datum>>();\n private errors = new Map<string, Map<number, string>>();\n\n constructor(\n private data: (T & HasId)[],\n calculations: CalculationDefinition[] = []\n ) {\n this.setCalculations(calculations);\n }\n\n setCalculations(calculations: CalculationDefinition[]): Set<string> {\n const sourceFields = new Set(this.data.flatMap((row) => Object.keys(row)));\n const names = calculations.map((calc) => calc.resultColumnName);\n for (const name of names) {\n if (!name.trim()) throw new Error(\"Enter a result column name\");\n if (\n sourceFields.has(name) ||\n names.filter((other) => other === name).length > 1\n ) {\n throw new Error(`Field already exists: ${name}`);\n }\n }\n const fields = [...sourceFields, ...names];\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const visit = (calc: CalculationDefinition) => {\n const name = calc.resultColumnName;\n if (visiting.has(name)) throw new Error(`Circular calculation: ${name}`);\n if (visited.has(name)) return;\n visiting.add(name);\n validateExpression(calc.expression, fields);\n for (const field of calc.expression.dependencies) {\n const dependency = calculations.find(\n (item) => item.resultColumnName === field\n );\n if (dependency) visit(dependency);\n }\n visiting.delete(name);\n visited.add(name);\n };\n calculations.forEach(visit);\n const affected = new Set([\n ...this.calculations.map((calc) => calc.resultColumnName),\n ...names,\n ]);\n // ponytail: edits clear all calculated results; invalidate dependents only if edit latency warrants it.\n this.calculations = [...calculations];\n this.results.clear();\n this.errors.clear();\n return affected;\n }\n\n addCalculation(calculation: CalculationDefinition): Set<string> {\n return this.setCalculations([...this.calculations, calculation]);\n }\n\n updateCalculation(\n name: string,\n calculation: CalculationDefinition\n ): Set<string> {\n if (!this.calculations.some((calc) => calc.resultColumnName === name)) {\n throw new Error(`Unknown calculation: ${name}`);\n }\n return this.setCalculations(\n this.calculations.map((calc) =>\n calc.resultColumnName === name ? calculation : calc\n )\n );\n }\n\n removeCalculation(name: string): Set<string> {\n return this.setCalculations(\n this.calculations.filter((calc) => calc.resultColumnName !== name)\n );\n }\n\n getCalculations(): CalculationDefinition[] {\n return [...this.calculations];\n }\n\n getErrors(name: string): Map<number, string> {\n const calculation = this.calculations.find(\n (calc) => calc.resultColumnName === name\n );\n if (calculation) this.executeCalculation(calculation);\n return this.errors.get(name) ?? new Map();\n }\n\n traceRow(name: string, rowId: number): RowCalculationTrace | undefined {\n const calc = this.calculations.find(\n (item) => item.resultColumnName === name\n );\n const row = this.data.find((item) => item.__ID === rowId);\n if (!calc || !row) return undefined;\n const dependencies = calc.expression.dependencies.flatMap((field) => {\n const trace = this.traceRow(field, rowId);\n return trace ? [trace] : [];\n });\n const variables = new Map<string, CalculationValue>(Object.entries(row));\n for (const field of calc.expression.dependencies) {\n const dependency = dependencies.find((item) => item.field === field);\n if (dependency) variables.set(field, dependency.value);\n }\n const steps: CalculationStep[] = [];\n const result = new Calculator(\n { data: this.data, variables },\n steps\n ).evaluate(calc.expression);\n return {\n field: name,\n expression: calc.expression.rawInput,\n value:\n result.success && !(result.value instanceof Date)\n ? (result.value ?? undefined)\n : undefined,\n error: result.error,\n steps,\n inputs: calc.expression.dependencies.map((field) => ({\n field,\n value: variables.get(field),\n })),\n dependencies,\n };\n }\n\n executeCalculation(calculation: CalculationDefinition): Map<number, datum> {\n const name = calculation.resultColumnName;\n const cached = this.results.get(name);\n if (cached) return cached;\n for (const field of calculation.expression.dependencies) {\n const dependency = this.calculations.find(\n (calc) => calc.resultColumnName === field\n );\n if (dependency) this.executeCalculation(dependency);\n }\n const values = new Map<number, datum>();\n const errors = new Map<number, string>();\n for (const row of this.data) {\n const variables = new Map<string, CalculationValue>(Object.entries(row));\n for (const field of calculation.expression.dependencies) {\n const results = this.results.get(field);\n variables.set(field, results ? results.get(row.__ID) : row[field]);\n }\n const result = new Calculator({ data: this.data, variables }).evaluate(\n calculation.expression\n );\n values.set(\n row.__ID,\n result.success && !(result.value instanceof Date)\n ? (result.value ?? undefined)\n : undefined\n );\n if (!result.success)\n errors.set(row.__ID, result.error ?? \"Calculation failed\");\n }\n this.results.set(name, values);\n this.errors.set(name, errors);\n return values;\n }\n}\n","import type { datum } from \"@/types/ChartTypes\";\n\n/**\n * One numeric eligibility rule for every numeric view.\n *\n * Missing values (null, undefined, and blank or whitespace-only strings) are\n * not measurements. Booleans are not numbers. Numbers and numeric strings\n * that are not finite (NaN, Infinity, -Infinity) belong to a numeric field\n * but are excluded from measurements, bins, extents, and aggregates.\n */\nexport function isMissingValue(value: datum): boolean {\n return (\n value === undefined ||\n value === null ||\n (typeof value === \"string\" && value.trim() === \"\")\n );\n}\n\n/** True when a present value reads as a number, finite or not. */\nexport function isNumberLike(value: datum): boolean {\n if (typeof value === \"number\") return true;\n if (typeof value !== \"string\" || value.trim() === \"\") return false;\n return value.trim() === \"NaN\" || !Number.isNaN(Number(value));\n}\n\nexport type NumericExclusionReason =\n | \"Missing value\"\n | \"Blank value\"\n | \"Boolean values are not numeric\"\n | \"Not a finite number\";\n\nexport function numericExclusionReason(\n value: datum\n): NumericExclusionReason | undefined {\n if (value === undefined || value === null || value === \"\") {\n return \"Missing value\";\n }\n if (typeof value === \"boolean\") return \"Boolean values are not numeric\";\n if (typeof value === \"string\" && value.trim() === \"\") return \"Blank value\";\n return Number.isFinite(Number(value)) ? undefined : \"Not a finite number\";\n}\n\n/** The finite measurement for a value, or undefined when it is ineligible. */\nexport function finiteNumber(value: datum): number | undefined {\n if (numericExclusionReason(value) !== undefined) return undefined;\n return Number(value);\n}\n\n/** Finite measurements from a list of values, in input order. */\nexport function finiteNumbers(values: Iterable<datum>): number[] {\n const numbers: number[] = [];\n for (const value of values) {\n const number = finiteNumber(value);\n if (number !== undefined) numbers.push(number);\n }\n return numbers;\n}\n","import { isMissingValue, isNumberLike } from \"@/lib/numeric\";\nimport { datum } from \"@/types/ChartTypes\";\n\nexport type DataType = \"numeric\" | \"categorical\" | \"datetime\" | \"boolean\";\n\nexport function detectColumnType(columnData: {\n [key: number]: datum;\n}): DataType {\n // Convert object to array for easier processing\n const values = Object.values(columnData);\n\n // Skip missing values (null, undefined, blank strings) for type detection\n const nonNullValues = values.filter((v) => !isMissingValue(v));\n if (nonNullValues.length === 0) {\n return \"categorical\";\n }\n\n // Check if all values are boolean\n const booleanValues = new Set([\"true\", \"false\", true, false]);\n if (nonNullValues.every((v) => booleanValues.has(v as string | boolean))) {\n return \"boolean\";\n }\n\n // Check if all values are numbers or can be converted to numbers\n if (nonNullValues.every(isNumberLike)) {\n return \"numeric\";\n }\n\n // Check if all values are valid dates\n if (nonNullValues.every((v) => !isNaN(Date.parse(String(v))))) {\n return \"datetime\";\n }\n\n // Default to categorical if no other type matches\n return \"categorical\";\n}\n","import { finiteNumbers, isMissingValue } from \"@/lib/numeric\";\nimport { datum } from \"@/types/ChartTypes\";\nimport { DataType } from \"./dataTypeDetection\";\n\nexport interface NumericStatistics {\n min: number;\n max: number;\n mean: number;\n median: number;\n stdDev: number;\n /** Equal-width bin counts from min to max, for inline distributions. */\n bins?: number[];\n}\n\nexport const DISTRIBUTION_BINS = 24;\n\nexport function binValues(\n sorted: number[],\n min: number,\n max: number,\n binCount = DISTRIBUTION_BINS\n) {\n if (sorted.length === 0 || !Number.isFinite(min) || !Number.isFinite(max)) {\n return [];\n }\n if (min === max) return [sorted.length];\n // Give small integer ranges one bin per value instead of sparse spikes.\n if (max - min + 1 < binCount && sorted.every(Number.isInteger)) {\n binCount = max - min + 1;\n const bins = new Array<number>(binCount).fill(0);\n for (const value of sorted) bins[value - min] += 1;\n return bins;\n }\n const bins = new Array<number>(binCount).fill(0);\n const width = (max - min) / binCount;\n for (const value of sorted) {\n if (!Number.isFinite(value)) continue;\n const index = Math.min(binCount - 1, Math.floor((value - min) / width));\n bins[index] += 1;\n }\n return bins;\n}\n\nexport interface CategoryStatistics {\n topValues: Array<{ value: datum; count: number }>;\n distribution: Array<{ value: datum; count: number }>;\n}\n\nexport interface ColumnStatistics {\n dataType: DataType;\n totalCount: number;\n uniqueCount: number;\n nullCount: number;\n /** Present values a numeric field cannot measure, such as Infinity. */\n excludedCount?: number;\n statistics?: NumericStatistics;\n categories?: CategoryStatistics;\n}\n\nexport function calculateColumnStatistics(\n columnData: { [key: number]: datum },\n dataType: DataType\n): ColumnStatistics {\n const values = Object.values(columnData);\n const totalCount = values.length;\n const nullCount = values.filter((v) => v == null).length;\n const nonNullValues = values.filter((v) => v != null);\n const uniqueValues = new Set(nonNullValues);\n const uniqueCount = uniqueValues.size;\n\n if (dataType === \"numeric\") {\n // Numeric fields share the eligibility rule used by charts and aggregates.\n const missingCount = values.filter(isMissingValue).length;\n const numericValues = finiteNumbers(values);\n const numericBase = {\n dataType,\n totalCount,\n uniqueCount,\n nullCount: missingCount,\n excludedCount: totalCount - missingCount - numericValues.length,\n };\n\n if (numericValues.length === 0) {\n return numericBase;\n }\n\n const sorted = [...numericValues].sort((a, b) => a - b);\n const min = sorted.at(0);\n const max = sorted.at(-1);\n if (min === undefined || max === undefined) {\n return numericBase;\n }\n const sum = numericValues.reduce((a, b) => a + b, 0);\n const mean = sum / numericValues.length;\n const lower = sorted[Math.floor((sorted.length - 1) / 2)];\n const upper = sorted[Math.floor(sorted.length / 2)];\n if (lower === undefined || upper === undefined) {\n return numericBase;\n }\n const median = (lower + upper) / 2;\n const squaredDiffs = numericValues.map((v) => Math.pow(v - mean, 2));\n const variance =\n squaredDiffs.reduce((a, b) => a + b, 0) / numericValues.length;\n const stdDev = Math.sqrt(variance);\n\n return {\n ...numericBase,\n statistics: {\n min,\n max,\n mean,\n median,\n stdDev,\n bins: binValues(sorted, min, max),\n },\n };\n } else {\n // For non-numeric types, calculate category statistics\n const counts = new Map<datum, number>();\n nonNullValues.forEach((value) =>\n counts.set(value, (counts.get(value) ?? 0) + 1)\n );\n const distribution = [...counts].map(([value, count]) => ({\n value,\n count,\n }));\n const topValues = [...distribution]\n .sort((a, b) => b.count - a.count)\n .slice(0, 5);\n\n return {\n dataType,\n totalCount,\n uniqueCount,\n nullCount,\n categories: {\n topValues,\n distribution,\n },\n };\n }\n}\n","import { datum } from \"@/types/ChartTypes\";\nimport {\n DataType,\n detectColumnType,\n} from \"@/components/SummaryTable/utils/dataTypeDetection\";\nimport {\n calculateColumnStatistics,\n ColumnStatistics,\n} from \"@/components/SummaryTable/utils/statisticsCalculator\";\n\nexport type NumericStatistics = NonNullable<ColumnStatistics[\"statistics\"]>;\nexport type CategoryStatistics = NonNullable<ColumnStatistics[\"categories\"]>;\n\nexport interface FieldProfile extends ColumnStatistics {\n name: string;\n dataType: DataType;\n}\n\nexport function buildFieldProfile(\n name: string,\n columnData: Record<number, datum>,\n typeOverride?: DataType\n): FieldProfile {\n return {\n name,\n ...calculateColumnStatistics(\n columnData,\n typeOverride ?? detectColumnType(columnData)\n ),\n };\n}\n\nexport function emptyFieldProfile(profile: FieldProfile): FieldProfile {\n return {\n name: profile.name,\n dataType: profile.dataType,\n totalCount: 0,\n uniqueCount: 0,\n nullCount: 0,\n statistics: undefined,\n categories: profile.categories\n ? { topValues: [], distribution: [] }\n : undefined,\n };\n}\n\nexport function buildFieldProfiles(\n rows: Array<Record<string, datum>>,\n typeOverrides: Record<string, DataType> = {}\n): FieldProfile[] {\n const fields = new Set<string>();\n for (const row of rows) {\n Object.keys(row)\n .filter((field) => field !== \"__ID\")\n .forEach((field) => fields.add(field));\n }\n\n return Array.from(fields, (name) => {\n const columnData: Record<number, datum> = {};\n rows.forEach((row, index) => {\n columnData[index] = row[name];\n });\n\n return buildFieldProfile(name, columnData, typeOverrides[name]);\n });\n}\n","import { categoryKey, categoryLabel, categoryValue } from \"@/lib/categories\";\nimport type { datum } from \"@/types/ChartTypes\";\nimport { numericExclusionReason } from \"@/lib/numeric\";\n\nexport type AggregateAggregation = \"count\" | \"sum\" | \"average\";\n\nexport interface AggregateSpec {\n id: string;\n name: string;\n groupField: string;\n measureField?: string;\n aggregation: AggregateAggregation;\n}\n\nexport interface AggregateInputRow {\n __ID: number;\n [field: string]: datum;\n}\n\nexport interface AggregateContributor {\n sourceId: number;\n input: datum;\n rawInput?: datum;\n included: boolean;\n exclusionReason?: string;\n}\n\nexport interface AggregateResultRow {\n id: string;\n groupValue: datum;\n groupLabel: string;\n value: number | undefined;\n rowCount: number;\n contributors: AggregateContributor[];\n}\n\nexport interface AggregateResult {\n spec: AggregateSpec;\n rows: AggregateResultRow[];\n sourceRowCount: number;\n}\n\nexport function displayAggregateValue(value: datum): string {\n if (value === undefined) {\n return \"undefined\";\n }\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nexport interface NumericInput {\n value: number;\n index: number;\n}\n\nexport interface NumericExclusion {\n index: number;\n reason: string;\n}\n\nexport function numericInputs(values: datum[]): {\n inputs: NumericInput[];\n exclusions: NumericExclusion[];\n} {\n const inputs: NumericInput[] = [];\n const exclusions: NumericExclusion[] = [];\n values.forEach((value, index) => {\n const reason = numericExclusionReason(value);\n if (reason) {\n exclusions.push({ index, reason });\n } else {\n inputs.push({ value: Number(value), index });\n }\n });\n return { inputs, exclusions };\n}\n\nfunction aggregateValues(\n aggregation: AggregateAggregation,\n values: datum[]\n): {\n value: number | undefined;\n included: Set<number>;\n exclusions: NumericExclusion[];\n} {\n if (aggregation === \"count\") {\n return {\n value: values.length,\n included: new Set(values.map((_, index) => index)),\n exclusions: [],\n };\n }\n\n const { inputs, exclusions } = numericInputs(values);\n if (inputs.length === 0) {\n return { value: undefined, included: new Set(), exclusions };\n }\n\n const total = inputs.reduce((sum, input) => sum + input.value, 0);\n return {\n value: aggregation === \"sum\" ? total : total / inputs.length,\n included: new Set(inputs.map((input) => input.index)),\n exclusions,\n };\n}\n\nexport function calculateGroupedAggregate(\n rows: AggregateInputRow[],\n spec: AggregateSpec,\n rawInputs: Record<number, datum> = {},\n exclusionReasons: Record<number, string> = {}\n): AggregateResult {\n if (spec.aggregation !== \"count\" && !spec.measureField) {\n throw new Error(`${spec.aggregation} requires a measure field`);\n }\n\n const groups = new Map<string, AggregateInputRow[]>();\n rows.forEach((row) => {\n const value = categoryValue(row[spec.groupField]);\n const key = categoryKey(value);\n const group = groups.get(key);\n if (group) {\n group.push(row);\n } else {\n groups.set(key, [row]);\n }\n });\n\n const resultRows = Array.from(groups, ([key, group]) => {\n const values = group.map((row) =>\n spec.measureField ? row[spec.measureField] : undefined\n );\n const result = aggregateValues(spec.aggregation, values);\n const exclusionByIndex = new Map(\n result.exclusions.map((exclusion) => [exclusion.index, exclusion.reason])\n );\n return {\n id: `${spec.id}:${key}`,\n groupValue: categoryValue(group[0]?.[spec.groupField]),\n groupLabel: categoryLabel(categoryValue(group[0]?.[spec.groupField])),\n value: result.value,\n rowCount: group.length,\n contributors: group.map((row, index) => ({\n sourceId: row.__ID,\n input: values[index],\n rawInput: rawInputs[row.__ID],\n included: result.included.has(index),\n exclusionReason: result.included.has(index)\n ? undefined\n : (exclusionReasons[row.__ID] ?? exclusionByIndex.get(index)),\n })),\n } satisfies AggregateResultRow;\n });\n\n return { spec, rows: resultRows, sourceRowCount: rows.length };\n}\n","import type { ChartLayout } from \"@/types/ChartTypes\";\n\nfunction overlaps(a: ChartLayout, b: ChartLayout) {\n return (\n a.x < b.x + b.w && b.x < a.x + a.w && a.y < b.y + b.h && b.y < a.y + a.h\n );\n}\n\n/**\n * Moves each chart up as far as it can go without overlapping a chart above\n * it, closing the gaps a deleted or moved chart leaves. Charts keep their\n * columns, sizes and top-to-bottom order.\n */\nexport function compactChartLayouts<T extends { layout: ChartLayout }>(\n items: T[]\n): T[] {\n const order = items\n .map((item, index) => ({ item, index }))\n .sort(\n (a, b) =>\n a.item.layout.y - b.item.layout.y || a.item.layout.x - b.item.layout.x\n );\n const placed: ChartLayout[] = [];\n const result = [...items];\n\n for (const { item, index } of order) {\n const layout = { ...item.layout };\n while (\n layout.y > 0 &&\n !placed.some((other) => overlaps(other, { ...layout, y: layout.y - 1 }))\n ) {\n layout.y -= 1;\n }\n placed.push(layout);\n result[index] = layout.y === item.layout.y ? item : { ...item, layout };\n }\n\n return result;\n}\n","import { datum } from \"@/types/ChartTypes\";\n\nexport type IdType = number;\nexport type DataRow = Record<string, datum>;\nexport type DataRowWithId<T extends DataRow> = T & { __ID: IdType };\n\nexport function initializeData<T extends DataRow>(data: T[]) {\n const dataWithIds = data.map((row, index) => ({\n ...row,\n __ID: index,\n })) as DataRowWithId<T>[];\n\n const emptyColumn = dataWithIds.reduce(\n (acc, row) => {\n acc[row.__ID] = undefined;\n return acc;\n },\n {} as Record<IdType, datum>\n );\n\n return { dataWithIds, emptyColumn };\n}\n\nexport function invalidateCalculationCache<T>(\n cache: Record<string, T | undefined>,\n columns: Iterable<string>\n) {\n const nextCache = { ...cache };\n for (const column of columns) {\n delete nextCache[column];\n }\n return nextCache;\n}\n","import { getChartFields } from \"@/components/charts/chartAccessibility\";\nimport { chartRegistry, getChartDefinition } from \"@/charts/registry\";\nimport {\n CrossfilterWrapper,\n LiveItem,\n LiveItemMap,\n} from \"@/hooks/CrossfilterWrapper\";\nimport {\n CalculationDefinition,\n CalculationManager,\n} from \"@/lib/calculations/CalculationState\";\nimport { parseExpression } from \"@/lib/calculations/parser/semantics\";\nimport { FieldProfile, buildFieldProfiles } from \"@/lib/fieldProfiles\";\nimport type { DataType } from \"@/components/SummaryTable/utils/dataTypeDetection\";\nimport {\n AggregateResult,\n AggregateSpec,\n calculateGroupedAggregate,\n} from \"@/lib/aggregates\";\nimport {\n applyFieldSettings,\n buildConversionPreview,\n convertFieldValue,\n FieldSettings,\n FieldSettingsMap,\n formatFieldValue as formatValue,\n getFieldSettingsError,\n getFieldLabel as resolveFieldLabel,\n} from \"@/lib/fieldSettings\";\nimport { ChartLayout, ChartSettings, datum } from \"@/types/ChartTypes\";\nimport { ColorScaleType } from \"@/types/ColorScaleTypes\";\nimport {\n GridSettings,\n SavedChartSettings,\n SavedRowsSettings,\n SerializedColorScale,\n ViewMetadata,\n} from \"@/types/SavedDataTypes\";\nimport {\n SavedAnalysisStructure,\n SavedCalculation,\n SavedDataStructure,\n SavedRow,\n} from \"@/types/SavedDataStructure\";\nimport { createContext, useContext, useEffect, useRef } from \"react\";\nimport { createStore, useStore } from \"zustand\";\nimport { compactChartLayouts } from \"@/utils/compactChartLayouts\";\nimport { IdType, initializeData } from \"./lib/dataLayerState\";\n\ntype DatumObject = { [key: string]: datum };\nexport type { DatumObject };\nexport type { IdType } from \"./lib/dataLayerState\";\n\nfunction typeOverrides(settings: FieldSettingsMap): Record<string, DataType> {\n return Object.fromEntries(\n Object.entries(settings)\n .filter(([, value]) => value.type)\n .map(([field, value]) => [field, value.type as DataType])\n );\n}\n\nfunction validateFieldSettings(settings: FieldSettingsMap) {\n for (const [field, value] of Object.entries(settings)) {\n const error = getFieldSettingsError(value);\n if (error) {\n throw new Error(`Invalid settings for ${field}: ${error}`);\n }\n }\n}\n\nconst toVector3 = ({ x, y, z }: { x: number; y: number; z: number }) => ({\n x,\n y,\n z,\n toArray: () => [x, y, z],\n clone: () => toVector3({ x, y, z }),\n});\n\nfunction toRuntimeChart(chart: SavedChartSettings): ChartSettings {\n if (chart.type !== \"3d-scatter\") {\n return chart as ChartSettings;\n }\n\n return {\n ...chart,\n cameraPosition: toVector3(chart.cameraPosition),\n cameraTarget: toVector3(chart.cameraTarget),\n } as ChartSettings;\n}\n\nfunction toSavedChart(chart: ChartSettings): SavedChartSettings {\n if (chart.type !== \"3d-scatter\") {\n return chart as SavedChartSettings;\n }\n\n return {\n ...chart,\n cameraPosition: {\n x: chart.cameraPosition.x,\n y: chart.cameraPosition.y,\n z: chart.cameraPosition.z,\n },\n cameraTarget: {\n x: chart.cameraTarget.x,\n y: chart.cameraTarget.y,\n z: chart.cameraTarget.z,\n },\n } as SavedChartSettings;\n}\n\nfunction toRuntimeCalculations(\n calculations: SavedCalculation[]\n): CalculationDefinition[] {\n return calculations.map(({ resultColumnName, expression }) => ({\n resultColumnName,\n expression: parseExpression(expression),\n }));\n}\n\nfunction toSavedCalculations(\n calculations: CalculationDefinition[]\n): SavedCalculation[] {\n return calculations.map(({ resultColumnName, expression }) => ({\n resultColumnName,\n expression: expression.rawInput,\n }));\n}\n\nfunction validateAggregateState(\n aggregates: AggregateSpec[],\n charts: SavedChartSettings[] | ChartSettings[],\n fieldNames?: Iterable<string>\n) {\n const ids = new Set<string>();\n const availableFields = fieldNames ? new Set(fieldNames) : undefined;\n for (const aggregate of aggregates) {\n if (\n !aggregate.id ||\n !aggregate.name.trim() ||\n !aggregate.groupField.trim() ||\n ![\"count\", \"sum\", \"average\"].includes(aggregate.aggregation) ||\n (aggregate.aggregation !== \"count\" && !aggregate.measureField?.trim())\n ) {\n throw new Error(\"Invalid grouped summary definition\");\n }\n if (availableFields && !availableFields.has(aggregate.groupField)) {\n throw new Error(\n `Grouped summary ${aggregate.name} references missing group field ${aggregate.groupField}`\n );\n }\n if (\n availableFields &&\n aggregate.measureField &&\n !availableFields.has(aggregate.measureField)\n ) {\n throw new Error(\n `Grouped summary ${aggregate.name} references missing measure field ${aggregate.measureField}`\n );\n }\n if (ids.has(aggregate.id)) {\n throw new Error(`Duplicate grouped summary id: ${aggregate.id}`);\n }\n ids.add(aggregate.id);\n }\n for (const chart of charts) {\n const aggregateId = (chart as ChartSettings & { aggregateId?: unknown })\n .aggregateId;\n if (\n aggregateId !== undefined &&\n (typeof aggregateId !== \"string\" || !ids.has(aggregateId))\n ) {\n throw new Error(\n `Chart references missing grouped summary: ${String(aggregateId)}`\n );\n }\n }\n}\n\nfunction getDefaultRowsSettings(\n fields: string[],\n calculationNames: string[] = []\n): SavedRowsSettings {\n const allFields = [\n ...fields,\n ...calculationNames.filter((field) => !fields.includes(field)),\n ];\n return {\n columns: allFields.map((field) => ({ id: field, field })),\n sortDirection: \"asc\",\n filters: [],\n globalSearch: \"\",\n };\n}\n\nfunction getSavedStateFingerprint(savedData: SavedDataStructure): string {\n return JSON.stringify(\n {\n ...savedData,\n metadata: {\n ...savedData.metadata,\n modifiedAt: \"\",\n },\n },\n (_key, value: unknown) => {\n if (value === undefined) {\n return { __exploreda_fingerprint: \"undefined\" };\n }\n if (typeof value === \"number\" && !Number.isFinite(value)) {\n return {\n __exploreda_fingerprint: Number.isNaN(value)\n ? \"NaN\"\n : value === Infinity\n ? \"Infinity\"\n : \"-Infinity\",\n };\n }\n return value;\n }\n );\n}\n\n// Props and State interfaces\ninterface DataLayerProps<T extends DatumObject> {\n data?: T[];\n charts?: ChartSettings[];\n savedData?: SavedDataStructure;\n onStateChange?: (state: SavedDataStructure) => void;\n}\n\n// Add ID to the data type\nexport type HasId = { __ID: IdType };\n\ninterface DataLayerState<T extends DatumObject> extends DataLayerProps<T> {\n rawData: T[];\n data: (T & HasId)[];\n fieldProfiles: FieldProfile[];\n emptyColumn: Record<IdType, datum>;\n fileName: string | undefined;\n setData: (data: T[], fileName?: string, useDefaults?: boolean) => void;\n fieldSettings: FieldSettingsMap;\n aggregates: AggregateSpec[];\n addAggregate: (spec: Omit<AggregateSpec, \"id\">) => AggregateSpec;\n updateAggregate: (\n id: string,\n updates: Partial<Omit<AggregateSpec, \"id\">>\n ) => void;\n removeAggregate: (id: string) => void;\n getAggregate: (id: string) => AggregateSpec | undefined;\n getAggregateResult: (\n id: string,\n sourceIds?: IdType[]\n ) => AggregateResult | undefined;\n updateFieldSettings: (\n field: string,\n settings: Partial<FieldSettings>\n ) => void;\n getFieldLabel: (field: string) => string;\n formatFieldValue: (field: string, value: datum) => string;\n getFieldConversionPreview: (\n field: string,\n settings?: FieldSettings\n ) => ReturnType<typeof buildConversionPreview>;\n\n liveItems: LiveItemMap;\n\n // Chart state\n charts: ChartSettings[];\n addChart: (chart: Omit<ChartSettings, \"id\">) => void;\n removeChart: (chart: ChartSettings) => void;\n removeAllCharts: () => void;\n updateChart: (id: string, settings: Partial<ChartSettings>) => void;\n updateChartLayouts: (layouts: Record<string, ChartLayout>) => void;\n\n // Color scale state\n colorScales: ColorScaleType[];\n addColorScale: (scale: Omit<ColorScaleType, \"id\">) => ColorScaleType;\n removeColorScale: (id: string) => void;\n updateColorScale: (id: string, updates: Partial<ColorScaleType>) => void;\n\n // Filter state (placeholder)\n clearAllFilters: () => void;\n filterReset: number;\n clearFilter: (chart: ChartSettings) => void;\n\n crossfilterWrapper: CrossfilterWrapper<T & HasId>;\n nonce: number;\n getLiveItems: (chart: ChartSettings) => LiveItem | undefined;\n\n // data and key functions\n getColumnData: (field: string | undefined) => Record<IdType, datum>;\n getColumnNames: () => string[];\n columnCache: Record<string, Record<IdType, datum>>;\n\n // Calculation state\n calculationManager: CalculationManager<T>;\n calculations: CalculationDefinition[];\n addCalculation: (\n calculation: Omit<CalculationDefinition, \"id\">\n ) => Promise<CalculationDefinition>;\n removeCalculation: (resultColumnName: string) => void;\n updateCalculation: (\n resultColumnName: string,\n newCalculation: CalculationDefinition\n ) => void;\n\n calcColumnCache: Record<string, Record<IdType, datum> | undefined>;\n\n // Grid settings\n gridSettings: GridSettings;\n updateGridSettings: (settings: Partial<GridSettings>) => void;\n rowsSettings: SavedRowsSettings;\n updateRowsSettings: (settings: Partial<SavedRowsSettings>) => void;\n metadata: ViewMetadata;\n\n // Save/Restore functionality\n saveToStructure: () => SavedDataStructure;\n restoreFromStructure: (savedData: SavedDataStructure) => void;\n saveAnalysisToStructure: () => SavedAnalysisStructure;\n restoreAnalysisFromStructure: (savedData: SavedAnalysisStructure) => void;\n}\n\n// Store type\ntype DataLayerStore<T extends DatumObject> = ReturnType<\n typeof createDataLayerStore<T>\n>;\n\nfunction getDataAndCrossfilterWrapper<T extends DatumObject>(\n data: T[],\n fieldGetter?: (name: string) => Record<IdType, datum>,\n charts?: ChartSettings[]\n): Partial<DataLayerState<T>> {\n const { dataWithIds, emptyColumn } = initializeData(data);\n const newCrossFilter = new CrossfilterWrapper<T & HasId>(\n dataWithIds,\n (d) => d.__ID\n );\n\n if (fieldGetter) {\n newCrossFilter.setFieldGetter(fieldGetter);\n }\n\n if (charts) {\n charts.forEach((chart) => {\n newCrossFilter.addChart(chart);\n });\n }\n\n return {\n data: dataWithIds,\n emptyColumn,\n crossfilterWrapper: newCrossFilter,\n charts: charts ?? [],\n colorScales: [],\n calculationManager: new CalculationManager<T>(dataWithIds),\n calculations: [],\n };\n}\n\nfunction createDefaultWorkspaceCharts(\n fieldProfiles: FieldProfile[]\n): ChartSettings[] {\n if (fieldProfiles.length === 0) {\n return [];\n }\n\n const summary = chartRegistry.has(\"summary\")\n ? getChartDefinition(\"summary\").createDefaultSettings({\n x: 0,\n y: 0,\n w: 5,\n h: 6,\n })\n : undefined;\n const table = chartRegistry.has(\"data-table\")\n ? getChartDefinition(\"data-table\").createDefaultSettings({\n x: 5,\n y: 0,\n w: 7,\n h: 6,\n })\n : undefined;\n if (table?.type === \"data-table\") {\n table.columns = fieldProfiles.map(({ name }) => ({\n id: name,\n field: name,\n }));\n }\n\n return [summary, table].filter((item): item is ChartSettings =>\n Boolean(item)\n );\n}\n\n// Store creator\nconst getInitialStoreState = <T extends DatumObject>(\n initProps?: Partial<DataLayerProps<T>>\n): Required<\n Pick<\n DataLayerState<T>,\n | \"rawData\"\n | \"data\"\n | \"fieldProfiles\"\n | \"emptyColumn\"\n | \"crossfilterWrapper\"\n | \"calculationManager\"\n | \"calculations\"\n | \"charts\"\n | \"colorScales\"\n | \"gridSettings\"\n | \"columnCache\"\n | \"calcColumnCache\"\n | \"nonce\"\n | \"fileName\"\n | \"rowsSettings\"\n | \"metadata\"\n | \"fieldSettings\"\n | \"aggregates\"\n >\n> => {\n const rawData = initProps?.data ?? [];\n const fieldSettings = initProps?.savedData?.fieldSettings ?? {};\n validateFieldSettings(fieldSettings);\n const inferredTypes = Object.fromEntries(\n buildFieldProfiles(rawData, typeOverrides(fieldSettings)).map((profile) => [\n profile.name,\n profile.dataType,\n ])\n );\n const runtimeData = applyFieldSettings(rawData, fieldSettings, inferredTypes);\n const {\n data: initData,\n emptyColumn: initialEmptyColumn,\n crossfilterWrapper,\n calculationManager: ogCalculationManager,\n } = getDataAndCrossfilterWrapper(runtimeData);\n const fieldProfiles = buildFieldProfiles(\n runtimeData,\n typeOverrides(fieldSettings)\n );\n\n if (!crossfilterWrapper || !initData || !ogCalculationManager) {\n throw new Error(\n \"Data, crossfilterWrapper, or calculationManager not found\"\n );\n }\n\n // Initialize with saved data if provided\n if (initProps?.savedData) {\n const savedData = initProps.savedData;\n\n // Restore calculations\n ogCalculationManager.setCalculations(\n toRuntimeCalculations(savedData.calculations)\n );\n const newCalculations = ogCalculationManager.getCalculations();\n validateAggregateState(savedData.aggregates ?? [], savedData.charts, [\n ...fieldProfiles.map((profile) => profile.name),\n ...newCalculations.map((calculation) => calculation.resultColumnName),\n ]);\n\n // Restore color scales with proper Map objects\n const restoredColorScales: ColorScaleType[] = savedData.colorScales.map(\n (scale) => {\n if (scale.type === \"categorical\") {\n return {\n ...scale,\n mapping: new Map(scale.mapping),\n };\n }\n return scale;\n }\n );\n\n return {\n rawData,\n data: initData,\n fieldProfiles,\n emptyColumn: initialEmptyColumn!,\n crossfilterWrapper,\n calculationManager: ogCalculationManager,\n calculations: newCalculations,\n charts: savedData.charts.map(toRuntimeChart),\n colorScales: restoredColorScales,\n gridSettings: savedData.gridSettings,\n rowsSettings:\n savedData.rowsSettings ??\n getDefaultRowsSettings(\n fieldProfiles.map((profile) => profile.name),\n newCalculations.map((calculation) => calculation.resultColumnName)\n ),\n metadata: savedData.metadata,\n columnCache: {},\n calcColumnCache: {},\n nonce: 0,\n fileName: undefined,\n fieldSettings,\n aggregates: savedData.aggregates ?? [],\n };\n }\n\n // Return default state if no saved data\n return {\n rawData,\n data: initData,\n fieldProfiles,\n emptyColumn: initialEmptyColumn!,\n crossfilterWrapper,\n calculationManager: ogCalculationManager,\n calculations: [],\n charts: initProps?.charts ?? createDefaultWorkspaceCharts(fieldProfiles),\n colorScales: [],\n gridSettings: {\n columnCount: 12,\n rowHeight: 100,\n containerPadding: 10,\n showBackgroundMarkers: true,\n },\n rowsSettings: getDefaultRowsSettings(\n fieldProfiles.map((profile) => profile.name)\n ),\n metadata: {\n name: \"Untitled\",\n version: 1,\n createdAt: new Date().toISOString(),\n modifiedAt: new Date().toISOString(),\n },\n columnCache: {},\n calcColumnCache: {},\n nonce: 0,\n fileName: undefined,\n fieldSettings,\n aggregates: [],\n };\n};\n\nconst createDataLayerStore = <T extends DatumObject>(\n initProps?: Partial<DataLayerProps<T>>\n) => {\n const initialState = getInitialStoreState(initProps);\n const { crossfilterWrapper } = initialState;\n\n if (!crossfilterWrapper) {\n throw new Error(\"crossfilterWrapper not found in initial state\");\n }\n\n const store = createStore<DataLayerState<T>>()((set, get) => ({\n ...initialState,\n liveItems: {},\n filterReset: 0,\n setData: (rawData, fileName, useDefaults = true) => {\n const inferredTypes = Object.fromEntries(\n buildFieldProfiles(rawData, typeOverrides({})).map((profile) => [\n profile.name,\n profile.dataType,\n ])\n );\n const runtimeData = applyFieldSettings(rawData, {}, inferredTypes);\n // Get fresh crossfilter and data with IDs\n const {\n data: newData,\n emptyColumn: newEmptyColumn,\n crossfilterWrapper: newCrossfilter,\n calculationManager: newCalculationManager,\n } = getDataAndCrossfilterWrapper(runtimeData, get().getColumnData);\n const fieldProfiles = buildFieldProfiles(runtimeData, typeOverrides({}));\n\n if (\n !newData ||\n !newEmptyColumn ||\n !newCrossfilter ||\n !newCalculationManager\n ) {\n throw new Error(\"Failed to reset data layer\");\n }\n\n const charts = useDefaults\n ? createDefaultWorkspaceCharts(fieldProfiles)\n : [];\n charts.forEach((chart) => newCrossfilter.addChart(chart));\n\n // Reset everything to initial state\n set({\n rawData,\n data: newData,\n fieldProfiles,\n emptyColumn: newEmptyColumn,\n fileName,\n crossfilterWrapper: newCrossfilter,\n calculationManager: newCalculationManager,\n calculations: [],\n charts,\n colorScales: [],\n rowsSettings: getDefaultRowsSettings(\n fieldProfiles.map((profile) => profile.name)\n ),\n liveItems: newCrossfilter.getAllData(),\n columnCache: {},\n calcColumnCache: {},\n fieldSettings: {},\n aggregates: [],\n nonce: get().nonce + 1,\n filterReset: get().filterReset + 1,\n });\n },\n\n updateFieldSettings: (field, updates) => {\n const current = get().fieldSettings[field] ?? {};\n const nextFieldSettings = { ...current, ...updates };\n const settingsError = getFieldSettingsError(nextFieldSettings);\n if (settingsError) {\n throw new Error(settingsError);\n }\n const nextFieldSettingsMap = { ...get().fieldSettings };\n if (Object.keys(nextFieldSettings).length === 0) {\n delete nextFieldSettingsMap[field];\n } else {\n nextFieldSettingsMap[field] = nextFieldSettings;\n }\n\n const typeChanged =\n current.type !== nextFieldSettings.type ||\n current.datePreset !== nextFieldSettings.datePreset ||\n JSON.stringify(current.nullTokens?.filter(Boolean) ?? []) !==\n JSON.stringify(nextFieldSettings.nullTokens?.filter(Boolean) ?? []);\n if (!typeChanged) {\n set((state) => ({\n fieldSettings: nextFieldSettingsMap,\n nonce: state.nonce + 1,\n }));\n return;\n }\n\n const inferredTypes = Object.fromEntries(\n buildFieldProfiles(\n get().rawData,\n typeOverrides(nextFieldSettingsMap)\n ).map((profile) => [profile.name, profile.dataType])\n );\n const runtimeRows = applyFieldSettings(\n get().rawData,\n nextFieldSettingsMap,\n inferredTypes\n );\n const nextData = initializeData(runtimeRows);\n const nextCrossfilter = new CrossfilterWrapper<T & HasId>(\n nextData.dataWithIds,\n (row) => row.__ID\n );\n const nextCharts = get().charts.map((chart) => ({\n ...chart,\n filters: chart.filters.filter((filter) => filter.field !== field),\n facet:\n typeChanged &&\n (chart.facet.rowVariable === field ||\n (chart.facet.type === \"grid\" &&\n chart.facet.columnVariable === field))\n ? { ...chart.facet, visibleFacetIds: undefined }\n : chart.facet,\n })) as ChartSettings[];\n nextCharts.forEach((chart) => nextCrossfilter.addChart(chart));\n const nextManager = new CalculationManager(\n nextData.dataWithIds,\n get().calculations\n );\n set((state) => ({\n fieldSettings: nextFieldSettingsMap,\n data: nextData.dataWithIds,\n emptyColumn: nextData.emptyColumn,\n fieldProfiles: buildFieldProfiles(\n runtimeRows,\n typeOverrides(nextFieldSettingsMap)\n ),\n crossfilterWrapper: nextCrossfilter,\n calculationManager: nextManager,\n charts: nextCharts,\n rowsSettings: {\n ...state.rowsSettings,\n filters: state.rowsSettings.filters.filter(\n (filter) => filter.field !== field\n ),\n },\n columnCache: {},\n calcColumnCache: {},\n liveItems: {},\n nonce: state.nonce + 1,\n filterReset: state.filterReset + 1,\n }));\n nextCrossfilter.setFieldGetter(get().getColumnData);\n nextCharts.forEach((chart) => nextCrossfilter.updateChartFilters(chart));\n set({ liveItems: nextCrossfilter.getAllData() });\n },\n\n getFieldLabel: (field) =>\n resolveFieldLabel(field, get().fieldSettings[field]),\n\n formatFieldValue: (field, value) =>\n formatValue(field, value, get().fieldSettings[field]),\n\n getFieldConversionPreview: (field, previewSettings) => {\n const rawRows = get().rawData;\n const rawProfile = buildFieldProfiles(rawRows).find(\n (profile) => profile.name === field\n );\n return buildConversionPreview(\n field,\n rawRows,\n previewSettings ?? get().fieldSettings[field],\n rawProfile?.dataType ?? \"categorical\"\n );\n },\n\n addAggregate: (spec) => {\n if (!spec.name.trim() || !spec.groupField.trim()) {\n throw new Error(\"Bar aggregates need a name and group field\");\n }\n if (spec.aggregation !== \"count\" && !spec.measureField?.trim()) {\n throw new Error(`${spec.aggregation} requires a measure field`);\n }\n validateAggregateState(\n [{ ...spec, id: \"new\" }],\n [],\n get().getColumnNames()\n );\n const aggregate = { ...spec, id: crypto.randomUUID() };\n set((state) => ({\n aggregates: [...state.aggregates, aggregate],\n nonce: state.nonce + 1,\n }));\n return aggregate;\n },\n\n updateAggregate: (id, updates) => {\n const current = get().aggregates.find((aggregate) => aggregate.id === id);\n if (!current) {\n throw new Error(\"Grouped summary was not found\");\n }\n const next = { ...current, ...updates };\n if (!next.name.trim() || !next.groupField.trim()) {\n throw new Error(\"Bar aggregates need a name and group field\");\n }\n if (next.aggregation !== \"count\" && !next.measureField?.trim()) {\n throw new Error(`${next.aggregation} requires a measure field`);\n }\n validateAggregateState([next], [], get().getColumnNames());\n set((state) => ({\n aggregates: state.aggregates.map((aggregate) =>\n aggregate.id === id ? next : aggregate\n ),\n nonce: state.nonce + 1,\n }));\n },\n\n removeAggregate: (id) => {\n const aggregate = get().aggregates.find((item) => item.id === id);\n if (!aggregate) {\n return;\n }\n if (\n get().charts.some(\n (chart) =>\n (chart as ChartSettings & { aggregateId?: string }).aggregateId ===\n id\n )\n ) {\n throw new Error(\n `Remove charts using ${aggregate.name} before deleting the grouped summary`\n );\n }\n set((state) => ({\n aggregates: state.aggregates.filter((item) => item.id !== id),\n nonce: state.nonce + 1,\n }));\n },\n\n getAggregate: (id) => get().aggregates.find((item) => item.id === id),\n\n getAggregateResult: (id, sourceIds) => {\n const spec = get().aggregates.find((item) => item.id === id);\n if (!spec) {\n return undefined;\n }\n const ids = sourceIds ?? get().crossfilterWrapper.getFilteredRowIds();\n const groupData = get().getColumnData(spec.groupField);\n const measureData = spec.measureField\n ? get().getColumnData(spec.measureField)\n : undefined;\n const rawRows = get().rawData as Array<Record<string, datum>>;\n const rawInputs: Record<number, datum> = {};\n const exclusionReasons: Record<number, string> = {};\n const calculationField = get().calculations.some(\n (calculation) => calculation.resultColumnName === spec.measureField\n );\n const measureProfile = get().fieldProfiles.find(\n (profile) => profile.name === spec.measureField\n );\n const measureSettings = spec.measureField\n ? (get().fieldSettings[spec.measureField] ?? {})\n : {};\n const rows = ids.map((sourceId) => ({\n __ID: sourceId,\n [spec.groupField]: groupData[sourceId],\n ...(spec.measureField\n ? {\n [spec.measureField]: measureData?.[sourceId],\n }\n : {}),\n }));\n if (spec.measureField) {\n ids.forEach((sourceId) => {\n const rawValue = rawRows[sourceId]?.[spec.measureField!];\n if (!calculationField) {\n rawInputs[sourceId] = rawValue;\n const conversion = convertFieldValue(\n rawValue,\n measureSettings.type ?? measureProfile?.dataType ?? \"categorical\",\n measureSettings\n );\n if (conversion.error) {\n exclusionReasons[sourceId] =\n `Conversion failed: ${conversion.error}`;\n }\n }\n });\n }\n return calculateGroupedAggregate(rows, spec, rawInputs, exclusionReasons);\n },\n\n addChart: (chartSettings) => {\n const { crossfilterWrapper } = get();\n const newChart = {\n ...chartSettings,\n id: crypto.randomUUID(),\n } as ChartSettings;\n\n crossfilterWrapper.addChart(newChart);\n set((state) => ({\n charts: [...state.charts, newChart],\n liveItems: crossfilterWrapper.getAllData(),\n }));\n },\n\n removeChart: (chart) => {\n const { crossfilterWrapper } = get();\n crossfilterWrapper.removeChart(chart);\n set((state) => ({\n charts: compactChartLayouts(\n state.charts.filter((ogChart) => ogChart.id !== chart.id)\n ),\n liveItems: crossfilterWrapper.getAllData(),\n }));\n },\n\n removeAllCharts: () => {\n const { crossfilterWrapper } = get();\n crossfilterWrapper.removeAllCharts();\n set({ charts: [], liveItems: crossfilterWrapper.getAllData() });\n },\n\n updateChart: (id, settings) => {\n const { crossfilterWrapper } = get();\n\n const chart = get().charts.find((chart) => chart.id === id);\n\n if (!chart) {\n return;\n }\n\n const updatedChart = { ...chart, ...settings, id } as ChartSettings;\n crossfilterWrapper.updateChart(updatedChart);\n set((state) => ({\n charts: state.charts.map((chart) =>\n chart.id === id ? updatedChart : chart\n ),\n liveItems: crossfilterWrapper.getAllData(),\n }));\n },\n\n updateChartLayouts: (layouts) => {\n set((state) => ({\n charts: state.charts.map((chart) => {\n const layout = layouts[chart.id];\n return layout ? { ...chart, layout } : chart;\n }),\n }));\n },\n\n addColorScale: (scale: Omit<ColorScaleType, \"id\">) => {\n const newScale = {\n ...scale,\n id: crypto.randomUUID(),\n } as ColorScaleType;\n\n set((state) => ({\n colorScales: [...state.colorScales, newScale],\n }));\n\n return newScale;\n },\n\n removeColorScale: (id: string) => {\n set((state) => ({\n colorScales: state.colorScales.filter((scale) => scale.id !== id),\n }));\n },\n\n updateColorScale: (id: string, updates: Partial<ColorScaleType>) => {\n set((state) => ({\n colorScales: state.colorScales.map((scale) =>\n scale.id === id ? ({ ...scale, ...updates } as ColorScaleType) : scale\n ),\n }));\n },\n\n clearAllFilters: () => {\n const { charts, crossfilterWrapper } = get();\n\n const newCharts = charts.map((chart) => ({\n ...chart,\n filters: [],\n ...(chart.type === \"data-table\" ? { globalSearch: \"\" } : {}),\n })) as ChartSettings[];\n\n for (const chart of newCharts) {\n crossfilterWrapper.updateChart(chart);\n }\n\n // Update all live items in a single update\n set((state) => ({\n charts: newCharts,\n rowsSettings: {\n ...state.rowsSettings,\n filters: [],\n globalSearch: \"\",\n },\n liveItems: crossfilterWrapper.getAllData(),\n filterReset: state.filterReset + 1,\n }));\n },\n\n clearFilter: (chart) => {\n const { updateChart } = get();\n updateChart(chart.id, { filters: [] });\n },\n\n getLiveItems: (chart) => {\n const { liveItems } = get();\n\n const liveItemsForChart = liveItems[chart.id] ?? undefined;\n\n return liveItemsForChart;\n },\n\n getColumnNames() {\n const { fieldProfiles, calculations } = get();\n const baseColumns = fieldProfiles.map((profile) => profile.name);\n\n const calcFields = calculations.map((calc) => calc.resultColumnName);\n\n return [...baseColumns, ...calcFields];\n },\n\n getColumnData(field: string | undefined) {\n const {\n columnCache,\n data,\n calcColumnCache,\n calculations,\n emptyColumn,\n calculationManager,\n } = get();\n\n if (!field) {\n return emptyColumn;\n }\n\n if (Object.hasOwn(columnCache, field)) {\n return columnCache[field] as Record<string, datum>;\n }\n\n const calculation = calculations.find(\n (calc) => calc.resultColumnName === field\n );\n\n if (calculation) {\n if (Object.hasOwn(calcColumnCache, field)) {\n return calcColumnCache[field] as Record<string, datum>;\n }\n\n // Calculate the column and its dependencies.\n const resultMap = calculationManager.executeCalculation(calculation);\n\n // convert to Record<IdType, datum>\n const columnData: { [key: IdType]: datum } = {};\n resultMap.forEach((value, key) => {\n columnData[key] = value;\n });\n\n // Caches are read through getters; nonce carries visible data changes.\n Object.defineProperty(calcColumnCache, field, {\n value: columnData,\n enumerable: true,\n configurable: true,\n });\n\n return columnData;\n }\n\n // check if field is in the data -- if not, return all undefined\n // do not add to column cache\n if (!data.some((row) => field in row)) {\n return emptyColumn;\n }\n\n // Otherwise, it's a regular column\n const columnData: { [key: IdType]: datum } = {};\n data.forEach((row) => {\n columnData[row.__ID] = row[field];\n });\n\n Object.defineProperty(columnCache, field, {\n value: columnData,\n enumerable: true,\n configurable: true,\n });\n\n return columnData;\n },\n\n // Calculation management\n addCalculation: async (calculation) => {\n get().calculationManager.addCalculation(calculation);\n refreshCalculations();\n return calculation;\n },\n\n removeCalculation: (name) => {\n assertUnusedCalculation(name);\n get().calculationManager.removeCalculation(name);\n refreshCalculations();\n },\n\n updateCalculation: (name, calculation) => {\n if (name !== calculation.resultColumnName) {\n assertUnusedCalculation(name);\n }\n get().calculationManager.updateCalculation(name, calculation);\n refreshCalculations();\n },\n\n updateGridSettings: (settings) => {\n set((state) => ({\n gridSettings: {\n ...state.gridSettings,\n ...settings,\n },\n }));\n },\n\n updateRowsSettings: (settings) => {\n set((state) => ({\n rowsSettings: { ...state.rowsSettings, ...settings },\n }));\n },\n\n // Save/Restore functionality\n saveToStructure: () => {\n const state = get();\n\n // Convert Map objects in colorScales to arrays for serialization\n const serializedColorScales: SerializedColorScale[] =\n state.colorScales.map((scale) => {\n if (scale.type === \"categorical\") {\n return {\n ...scale,\n mapping: Array.from(scale.mapping.entries()),\n };\n }\n return scale;\n });\n\n return {\n charts: state.charts.map(toSavedChart),\n calculations: toSavedCalculations(state.calculations),\n gridSettings: state.gridSettings,\n metadata: {\n ...state.metadata,\n modifiedAt: new Date().toISOString(),\n },\n colorScales: serializedColorScales,\n rowsSettings: state.rowsSettings,\n fieldSettings: state.fieldSettings,\n aggregates: state.aggregates,\n };\n },\n\n restoreFromStructure: (savedData: SavedDataStructure) => {\n const data = get().rawData;\n get().restoreAnalysisFromStructure({\n format: \"exploreda-analysis\",\n version: 1,\n data,\n settings: savedData,\n });\n },\n saveAnalysisToStructure: () => {\n const state = get();\n return {\n format: \"exploreda-analysis\",\n version: 1,\n data: state.rawData as SavedRow[],\n settings: state.saveToStructure(),\n };\n },\n restoreAnalysisFromStructure: (savedData) => {\n const rawData = savedData.data as T[];\n const fieldSettings = savedData.settings.fieldSettings ?? {};\n validateFieldSettings(fieldSettings);\n const inferredTypes = Object.fromEntries(\n buildFieldProfiles(rawData, typeOverrides(fieldSettings)).map(\n (profile) => [profile.name, profile.dataType]\n )\n );\n const runtimeData = applyFieldSettings(\n rawData,\n fieldSettings,\n inferredTypes\n );\n const next = getDataAndCrossfilterWrapper(runtimeData);\n const nextData = next.data;\n const nextCrossfilter = next.crossfilterWrapper;\n const nextEmptyColumn = next.emptyColumn;\n if (\n !nextData ||\n !nextCrossfilter ||\n !nextEmptyColumn ||\n !next.calculationManager\n ) {\n throw new Error(\"Failed to restore analysis rows\");\n }\n const calculations = toRuntimeCalculations(\n savedData.settings.calculations\n );\n const calculationManager = new CalculationManager(nextData, calculations);\n const fieldProfiles = buildFieldProfiles(\n runtimeData,\n typeOverrides(fieldSettings)\n );\n validateAggregateState(\n savedData.settings.aggregates ?? [],\n savedData.settings.charts,\n [\n ...fieldProfiles.map((profile) => profile.name),\n ...calculations.map((calculation) => calculation.resultColumnName),\n ]\n );\n const charts = savedData.settings.charts.map(toRuntimeChart);\n const fieldGetter = (field: string): Record<IdType, datum> => {\n const calculation = calculations.find(\n (item) => item.resultColumnName === field\n );\n if (calculation) {\n const values: Record<IdType, datum> = {};\n calculationManager\n .executeCalculation(calculation)\n .forEach((value, id) => (values[id] = value));\n return values;\n }\n if (!nextData.some((row) => field in row)) {\n return nextEmptyColumn;\n }\n return Object.fromEntries(\n nextData.map((row) => [row.__ID, row[field]])\n ) as Record<IdType, datum>;\n };\n nextCrossfilter.setFieldGetter(fieldGetter);\n charts.forEach((chart) => nextCrossfilter.addChart(chart));\n const colorScales: ColorScaleType[] = savedData.settings.colorScales.map(\n (scale) =>\n scale.type === \"categorical\"\n ? { ...scale, mapping: new Map(scale.mapping) }\n : scale\n );\n set((state) => ({\n rawData,\n data: nextData,\n fieldProfiles,\n emptyColumn: nextEmptyColumn,\n fileName: undefined,\n crossfilterWrapper: nextCrossfilter,\n calculationManager,\n calculations: calculationManager.getCalculations(),\n charts,\n colorScales,\n gridSettings: savedData.settings.gridSettings,\n rowsSettings:\n savedData.settings.rowsSettings ??\n getDefaultRowsSettings(\n fieldProfiles.map((profile) => profile.name),\n calculations.map((calculation) => calculation.resultColumnName)\n ),\n metadata: savedData.settings.metadata,\n liveItems: nextCrossfilter.getAllData(),\n columnCache: {},\n calcColumnCache: {},\n nonce: state.nonce + 1,\n filterReset: state.filterReset + 1,\n fieldSettings,\n aggregates: savedData.settings.aggregates ?? [],\n }));\n nextCrossfilter.setFieldGetter(get().getColumnData);\n },\n }));\n\n function assertUnusedCalculation(name: string) {\n const { charts, aggregates } = store.getState();\n if (\n aggregates.some(\n (aggregate) =>\n aggregate.groupField === name || aggregate.measureField === name\n )\n ) {\n throw new Error(\n `Remove ${name} from its grouped summaries before renaming or deleting it`\n );\n }\n if (\n charts.some(\n (chart) =>\n getChartFields(chart).includes(name) ||\n chart.filters.some((filter) => filter.field === name) ||\n chart.facet.rowVariable === name ||\n (chart.facet.type === \"grid\" && chart.facet.columnVariable === name)\n )\n ) {\n throw new Error(\n `Remove ${name} from its charts and colors before renaming or deleting it`\n );\n }\n }\n\n function refreshCalculations() {\n const { calculationManager, crossfilterWrapper, charts } = store.getState();\n const previousCalculations = store.getState().calculations;\n const calculations = calculationManager.getCalculations();\n const previousNames = new Set(\n previousCalculations.map((calculation) => calculation.resultColumnName)\n );\n const nextNames = new Set(\n calculations.map((calculation) => calculation.resultColumnName)\n );\n const addedNames = calculations\n .map((calculation) => calculation.resultColumnName)\n .filter((name) => !previousNames.has(name));\n store.setState((state) => ({\n calculations,\n calcColumnCache: {},\n rowsSettings: {\n ...state.rowsSettings,\n columns: [\n ...state.rowsSettings.columns.filter(\n (column) =>\n !previousNames.has(column.field) || nextNames.has(column.field)\n ),\n ...addedNames\n .filter(\n (name) =>\n !state.rowsSettings.columns.some(\n (column) => column.field === name\n )\n )\n .map((name) => ({ id: name, field: name })),\n ],\n },\n }));\n charts.forEach((chart) => crossfilterWrapper.updateChartFilters(chart));\n store.setState((state) => ({\n liveItems: crossfilterWrapper.getAllData(),\n nonce: state.nonce + 1,\n }));\n }\n\n // this stuff is done down here because we need the store methods to exist\n // before plumbing them into the crossfilter wrapper\n // not ideal... but it works.\n\n // this madness passes the column getter back into the crossfilter wrapper\n // this ensures that crossfilter has access to calculated fields\n crossfilterWrapper.setFieldGetter(store.getState().getColumnData);\n\n // add the initial charts to crossfilter\n store.getState().charts.forEach((chart) => {\n crossfilterWrapper.addChart(chart);\n });\n\n // set the live items\n store.setState({ liveItems: crossfilterWrapper.getAllData() });\n\n return store;\n};\n\n// Create context\nexport const DataLayerContext = createContext<unknown>(null);\n\n// Provider wrapper\ntype DataLayerProviderProps<T extends DatumObject> = React.PropsWithChildren<\n DataLayerProps<T>\n>;\n\nexport function DataLayerProvider<T extends DatumObject>({\n children,\n ...props\n}: DataLayerProviderProps<T>) {\n const storeRef = useRef<DataLayerStore<T> | null>(null);\n const propsRef = useRef(props);\n const onStateChangeRef = useRef(props.onStateChange);\n const suppressStateChangeRef = useRef(false);\n const savedStateFingerprintRef = useRef<string | undefined>(undefined);\n onStateChangeRef.current = props.onStateChange;\n const nextData = props.data;\n const nextSavedData = props.savedData;\n if (!storeRef.current) {\n storeRef.current = createDataLayerStore<T>(props);\n }\n\n useEffect(() => {\n const store = storeRef.current!;\n const previousProps = propsRef.current;\n const dataChanged = previousProps.data !== nextData;\n const savedDataChanged = previousProps.savedData !== nextSavedData;\n\n suppressStateChangeRef.current = true;\n try {\n if (dataChanged) {\n store.getState().setData(nextData ?? [], undefined, !nextSavedData);\n if (nextSavedData) {\n store.getState().restoreFromStructure(nextSavedData);\n }\n } else if (savedDataChanged) {\n if (nextSavedData) {\n store.getState().restoreFromStructure(nextSavedData);\n } else {\n store.getState().setData(store.getState().rawData);\n }\n }\n } finally {\n suppressStateChangeRef.current = false;\n savedStateFingerprintRef.current = getSavedStateFingerprint(\n store.getState().saveToStructure()\n );\n }\n\n propsRef.current = { data: nextData, savedData: nextSavedData };\n }, [nextData, nextSavedData]);\n\n useEffect(() => {\n const store = storeRef.current!;\n savedStateFingerprintRef.current = getSavedStateFingerprint(\n store.getState().saveToStructure()\n );\n\n return store.subscribe((state) => {\n const savedData = state.saveToStructure();\n const nextFingerprint = getSavedStateFingerprint(savedData);\n\n if (nextFingerprint === savedStateFingerprintRef.current) {\n return;\n }\n\n savedStateFingerprintRef.current = nextFingerprint;\n if (!suppressStateChangeRef.current) {\n onStateChangeRef.current?.(savedData);\n }\n });\n }, []);\n\n return (\n <DataLayerContext.Provider value={storeRef.current}>\n {children}\n </DataLayerContext.Provider>\n );\n}\n\n// Custom hook that mimics the hook returned by `create`\nexport function useDataLayer<T extends DatumObject, U>(\n selector: (state: DataLayerState<T>) => U\n): U {\n const store = useContext(DataLayerContext) as DataLayerStore<T> | null;\n if (!store) {\n throw new Error(\"Missing DataLayerContext.Provider in the tree\");\n }\n return useStore(store, selector);\n}\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction TooltipProvider({\n delayDuration = 140,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 4,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\"eda-soft-tooltip z-50\", className)}\n {...props}\n >\n {children}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nfunction ActionTooltip({\n children,\n content,\n}: {\n children: React.ReactElement;\n content: React.ReactNode;\n}) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent>{content}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\nexport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n TooltipProvider,\n ActionTooltip,\n};\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\nimport { ActionTooltip } from \"./tooltip\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 focus-visible:ring-4 focus-visible:outline-1 aria-invalid:focus-visible:ring-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n tooltip,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n tooltip?: React.ReactNode;\n }) {\n const Comp = asChild ? Slot : \"button\";\n\n const button = (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n return tooltip ? (\n <ActionTooltip content={tooltip}>{button}</ActionTooltip>\n ) : (\n button\n );\n}\n\nexport { Button, buttonVariants };\n"]}