@datarecce/ui 0.1.30 → 0.1.31

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 (549) hide show
  1. package/dist/api.d.mts +1 -1
  2. package/dist/api.d.ts +1 -1
  3. package/dist/components.d.mts +1 -1
  4. package/dist/components.d.ts +1 -1
  5. package/dist/hooks.d.mts +1 -1
  6. package/dist/hooks.d.ts +1 -1
  7. package/dist/{index-BNUP2V_N.d.ts → index-B9lSPJTi.d.ts} +184 -2
  8. package/dist/index-B9lSPJTi.d.ts.map +1 -0
  9. package/dist/{index-DOPZuhD8.d.mts → index-IIXVIoOL.d.mts} +253 -71
  10. package/dist/index-IIXVIoOL.d.mts.map +1 -0
  11. package/dist/index.d.mts +2 -2
  12. package/dist/index.d.ts +2 -2
  13. package/dist/index.js +8 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/index.mjs +3 -2
  16. package/dist/index.mjs.map +1 -1
  17. package/dist/styles.css +4 -0
  18. package/dist/theme.d.mts +2 -185
  19. package/dist/theme.d.ts +2 -185
  20. package/dist/types.d.mts +1 -1
  21. package/dist/types.d.ts +1 -1
  22. package/package.json +4 -2
  23. package/recce-source/.editorconfig +26 -0
  24. package/recce-source/.flake8 +37 -0
  25. package/recce-source/.github/ISSUE_TEMPLATE/bug_report.yml +67 -0
  26. package/recce-source/.github/ISSUE_TEMPLATE/custom.md +10 -0
  27. package/recce-source/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
  28. package/recce-source/.github/PULL_REQUEST_TEMPLATE.md +21 -0
  29. package/recce-source/.github/copilot-instructions.md +331 -0
  30. package/recce-source/.github/instructions/backend-instructions.md +541 -0
  31. package/recce-source/.github/instructions/frontend-instructions.md +317 -0
  32. package/recce-source/.github/workflows/build-statics.yaml +72 -0
  33. package/recce-source/.github/workflows/bump.yaml +48 -0
  34. package/recce-source/.github/workflows/integration-tests-cloud.yaml +92 -0
  35. package/recce-source/.github/workflows/integration-tests-sqlmesh.yaml +33 -0
  36. package/recce-source/.github/workflows/integration-tests.yaml +52 -0
  37. package/recce-source/.github/workflows/nightly.yaml +246 -0
  38. package/recce-source/.github/workflows/release.yaml +196 -0
  39. package/recce-source/.github/workflows/tests-js.yaml +58 -0
  40. package/recce-source/.github/workflows/tests-python.yaml +128 -0
  41. package/recce-source/.pre-commit-config.yaml +26 -0
  42. package/recce-source/CLAUDE.md +483 -0
  43. package/recce-source/CODE_OF_CONDUCT.md +128 -0
  44. package/recce-source/CONTRIBUTING.md +107 -0
  45. package/recce-source/LICENSE +201 -0
  46. package/recce-source/Makefile +126 -0
  47. package/recce-source/README.md +182 -0
  48. package/recce-source/RECCE_CLOUD.md +81 -0
  49. package/recce-source/SECURITY.md +25 -0
  50. package/recce-source/docs/PACKAGING.md +340 -0
  51. package/recce-source/docs/README.md +1 -0
  52. package/recce-source/integration_tests/dbt/dbt_project.yml +26 -0
  53. package/recce-source/integration_tests/dbt/models/customers.sql +69 -0
  54. package/recce-source/integration_tests/dbt/models/docs.md +14 -0
  55. package/recce-source/integration_tests/dbt/models/orders.sql +56 -0
  56. package/recce-source/integration_tests/dbt/models/schema.yml +82 -0
  57. package/recce-source/integration_tests/dbt/models/staging/schema.yml +31 -0
  58. package/recce-source/integration_tests/dbt/models/staging/stg_customers.sql +22 -0
  59. package/recce-source/integration_tests/dbt/models/staging/stg_orders.sql +23 -0
  60. package/recce-source/integration_tests/dbt/models/staging/stg_payments.sql +25 -0
  61. package/recce-source/integration_tests/dbt/packages.yml +7 -0
  62. package/recce-source/integration_tests/dbt/profiles.yml +8 -0
  63. package/recce-source/integration_tests/dbt/seeds/raw_customers.csv +101 -0
  64. package/recce-source/integration_tests/dbt/seeds/raw_orders.csv +100 -0
  65. package/recce-source/integration_tests/dbt/seeds/raw_payments.csv +114 -0
  66. package/recce-source/integration_tests/dbt/seeds/raw_statuses.csv +5 -0
  67. package/recce-source/integration_tests/dbt/smoke_test.sh +72 -0
  68. package/recce-source/integration_tests/dbt/smoke_test_cloud.sh +71 -0
  69. package/recce-source/integration_tests/sqlmesh/__init__.py +0 -0
  70. package/recce-source/integration_tests/sqlmesh/audits/assert_item_price_above_zero.sql +9 -0
  71. package/recce-source/integration_tests/sqlmesh/audits/items.sql +7 -0
  72. package/recce-source/integration_tests/sqlmesh/audits/order_items.sql +7 -0
  73. package/recce-source/integration_tests/sqlmesh/config.py +171 -0
  74. package/recce-source/integration_tests/sqlmesh/helper.py +20 -0
  75. package/recce-source/integration_tests/sqlmesh/hooks/__init__.py +0 -0
  76. package/recce-source/integration_tests/sqlmesh/macros/__init__.py +0 -0
  77. package/recce-source/integration_tests/sqlmesh/macros/macros.py +8 -0
  78. package/recce-source/integration_tests/sqlmesh/macros/macros.sql +8 -0
  79. package/recce-source/integration_tests/sqlmesh/macros/utils.py +11 -0
  80. package/recce-source/integration_tests/sqlmesh/metrics/metrics.sql +25 -0
  81. package/recce-source/integration_tests/sqlmesh/models/customer_revenue_by_day.sql +41 -0
  82. package/recce-source/integration_tests/sqlmesh/models/customer_revenue_lifetime.sql +60 -0
  83. package/recce-source/integration_tests/sqlmesh/models/customers.sql +32 -0
  84. package/recce-source/integration_tests/sqlmesh/models/items.py +95 -0
  85. package/recce-source/integration_tests/sqlmesh/models/marketing.sql +15 -0
  86. package/recce-source/integration_tests/sqlmesh/models/order_items.py +95 -0
  87. package/recce-source/integration_tests/sqlmesh/models/orders.py +70 -0
  88. package/recce-source/integration_tests/sqlmesh/models/raw_marketing.py +62 -0
  89. package/recce-source/integration_tests/sqlmesh/models/top_waiters.sql +23 -0
  90. package/recce-source/integration_tests/sqlmesh/models/waiter_as_customer_by_day.sql +29 -0
  91. package/recce-source/integration_tests/sqlmesh/models/waiter_names.sql +10 -0
  92. package/recce-source/integration_tests/sqlmesh/models/waiter_revenue_by_day.sql +29 -0
  93. package/recce-source/integration_tests/sqlmesh/models/waiters.py +62 -0
  94. package/recce-source/integration_tests/sqlmesh/prep_env.sh +16 -0
  95. package/recce-source/integration_tests/sqlmesh/schema.yaml +5 -0
  96. package/recce-source/integration_tests/sqlmesh/seeds/waiter_names.csv +11 -0
  97. package/recce-source/integration_tests/sqlmesh/test_server.sh +29 -0
  98. package/recce-source/integration_tests/sqlmesh/tests/test_customer_revenue_by_day.yaml +63 -0
  99. package/recce-source/integration_tests/sqlmesh/tests/test_order_items.yaml +72 -0
  100. package/recce-source/js/.editorconfig +27 -0
  101. package/recce-source/js/.env.development +5 -0
  102. package/recce-source/js/.husky/pre-commit +29 -0
  103. package/recce-source/js/.nvmrc +1 -0
  104. package/recce-source/js/README.md +39 -0
  105. package/recce-source/js/app/(mainComponents)/DisplayModeToggle.tsx +65 -0
  106. package/recce-source/js/app/(mainComponents)/NavBar.tsx +228 -0
  107. package/recce-source/js/app/(mainComponents)/RecceVersionBadge.tsx +107 -0
  108. package/recce-source/js/app/(mainComponents)/TopBar.tsx +252 -0
  109. package/recce-source/js/app/@lineage/default.tsx +20 -0
  110. package/recce-source/js/app/@lineage/page.tsx +14 -0
  111. package/recce-source/js/app/MainLayout.tsx +170 -0
  112. package/recce-source/js/app/Providers.tsx +49 -0
  113. package/recce-source/js/app/checks/page.tsx +296 -0
  114. package/recce-source/js/app/error.tsx +93 -0
  115. package/recce-source/js/app/favicon.ico +0 -0
  116. package/recce-source/js/app/global-error.tsx +115 -0
  117. package/recce-source/js/app/global.css +82 -0
  118. package/recce-source/js/app/layout.tsx +48 -0
  119. package/recce-source/js/app/lineage/page.tsx +15 -0
  120. package/recce-source/js/app/page.tsx +12 -0
  121. package/recce-source/js/app/query/page.tsx +8 -0
  122. package/recce-source/js/biome.json +313 -0
  123. package/recce-source/js/jest.config.js +34 -0
  124. package/recce-source/js/jest.globals.d.ts +32 -0
  125. package/recce-source/js/jest.setup.js +91 -0
  126. package/recce-source/js/next.config.js +16 -0
  127. package/recce-source/js/package-lock.json +13843 -0
  128. package/recce-source/js/package.json +123 -0
  129. package/recce-source/js/pnpm-lock.yaml +9235 -0
  130. package/recce-source/js/pnpm-workspace.yaml +6 -0
  131. package/recce-source/js/postcss.config.js +5 -0
  132. package/recce-source/js/public/auth_callback.html +68 -0
  133. package/recce-source/js/public/imgs/feedback/thumbs-down.png +0 -0
  134. package/recce-source/js/public/imgs/feedback/thumbs-up.png +0 -0
  135. package/recce-source/js/public/imgs/reload-image.svg +4 -0
  136. package/recce-source/js/public/logo/recce-logo-white.png +0 -0
  137. package/recce-source/js/src/components/AuthModal/AuthModal.tsx +202 -0
  138. package/recce-source/js/src/components/app/AvatarDropdown.tsx +159 -0
  139. package/recce-source/js/src/components/app/EnvInfo.tsx +357 -0
  140. package/recce-source/js/src/components/app/Filename.tsx +388 -0
  141. package/recce-source/js/src/components/app/SetupConnectionPopover.tsx +91 -0
  142. package/recce-source/js/src/components/app/StateExporter.tsx +57 -0
  143. package/recce-source/js/src/components/app/StateImporter.tsx +198 -0
  144. package/recce-source/js/src/components/app/StateSharing.tsx +145 -0
  145. package/recce-source/js/src/components/app/StateSynchronizer.tsx +205 -0
  146. package/recce-source/js/src/components/charts/HistogramChart.tsx +291 -0
  147. package/recce-source/js/src/components/charts/SquareIcon.tsx +51 -0
  148. package/recce-source/js/src/components/charts/TopKSummaryList.tsx +457 -0
  149. package/recce-source/js/src/components/charts/chartTheme.ts +74 -0
  150. package/recce-source/js/src/components/check/CheckBreadcrumb.tsx +97 -0
  151. package/recce-source/js/src/components/check/CheckDescription.tsx +134 -0
  152. package/recce-source/js/src/components/check/CheckDetail.tsx +797 -0
  153. package/recce-source/js/src/components/check/CheckEmptyState.tsx +84 -0
  154. package/recce-source/js/src/components/check/CheckList.tsx +320 -0
  155. package/recce-source/js/src/components/check/LineageDiffView.tsx +32 -0
  156. package/recce-source/js/src/components/check/PresetCheckTemplateView.tsx +48 -0
  157. package/recce-source/js/src/components/check/SchemaDiffView.tsx +290 -0
  158. package/recce-source/js/src/components/check/check.ts +25 -0
  159. package/recce-source/js/src/components/check/timeline/CheckTimeline.tsx +163 -0
  160. package/recce-source/js/src/components/check/timeline/CommentInput.tsx +84 -0
  161. package/recce-source/js/src/components/check/timeline/TimelineEvent.tsx +468 -0
  162. package/recce-source/js/src/components/check/timeline/index.ts +12 -0
  163. package/recce-source/js/src/components/check/utils.ts +12 -0
  164. package/recce-source/js/src/components/data-grid/ScreenshotDataGrid.tsx +333 -0
  165. package/recce-source/js/src/components/data-grid/agGridStyles.css +55 -0
  166. package/recce-source/js/src/components/data-grid/agGridTheme.ts +43 -0
  167. package/recce-source/js/src/components/editor/CodeEditor.tsx +107 -0
  168. package/recce-source/js/src/components/editor/DiffEditor.tsx +162 -0
  169. package/recce-source/js/src/components/editor/index.ts +12 -0
  170. package/recce-source/js/src/components/errorboundary/ErrorBoundary.tsx +87 -0
  171. package/recce-source/js/src/components/histogram/HistogramDiffForm.tsx +147 -0
  172. package/recce-source/js/src/components/histogram/HistogramDiffResultView.tsx +63 -0
  173. package/recce-source/js/src/components/icons/index.tsx +142 -0
  174. package/recce-source/js/src/components/lineage/ActionControl.tsx +63 -0
  175. package/recce-source/js/src/components/lineage/ActionTag.tsx +141 -0
  176. package/recce-source/js/src/components/lineage/ChangeStatusLegend.tsx +46 -0
  177. package/recce-source/js/src/components/lineage/ColumnLevelLineageControl.tsx +327 -0
  178. package/recce-source/js/src/components/lineage/ColumnLevelLineageLegend.tsx +57 -0
  179. package/recce-source/js/src/components/lineage/GraphColumnNode.tsx +199 -0
  180. package/recce-source/js/src/components/lineage/GraphEdge.tsx +59 -0
  181. package/recce-source/js/src/components/lineage/GraphNode.tsx +555 -0
  182. package/recce-source/js/src/components/lineage/LineagePage.tsx +10 -0
  183. package/recce-source/js/src/components/lineage/LineageView.tsx +1384 -0
  184. package/recce-source/js/src/components/lineage/LineageViewContext.tsx +86 -0
  185. package/recce-source/js/src/components/lineage/LineageViewContextMenu.tsx +637 -0
  186. package/recce-source/js/src/components/lineage/LineageViewNotification.tsx +64 -0
  187. package/recce-source/js/src/components/lineage/LineageViewTopBar.tsx +596 -0
  188. package/recce-source/js/src/components/lineage/NodeSqlView.tsx +136 -0
  189. package/recce-source/js/src/components/lineage/NodeTag.tsx +278 -0
  190. package/recce-source/js/src/components/lineage/NodeView.tsx +642 -0
  191. package/recce-source/js/src/components/lineage/SandboxView.tsx +436 -0
  192. package/recce-source/js/src/components/lineage/ServerDisconnectedModalContent.tsx +105 -0
  193. package/recce-source/js/src/components/lineage/SetupConnectionBanner.tsx +52 -0
  194. package/recce-source/js/src/components/lineage/SingleEnvironmentQueryView.tsx +152 -0
  195. package/recce-source/js/src/components/lineage/graph.test.ts +31 -0
  196. package/recce-source/js/src/components/lineage/graph.ts +58 -0
  197. package/recce-source/js/src/components/lineage/lineage.test.ts +169 -0
  198. package/recce-source/js/src/components/lineage/lineage.ts +521 -0
  199. package/recce-source/js/src/components/lineage/styles.css +42 -0
  200. package/recce-source/js/src/components/lineage/styles.tsx +165 -0
  201. package/recce-source/js/src/components/lineage/useMultiNodesAction.ts +352 -0
  202. package/recce-source/js/src/components/lineage/useValueDiffAlertDialog.tsx +108 -0
  203. package/recce-source/js/src/components/onboarding-guide/Notification.tsx +62 -0
  204. package/recce-source/js/src/components/profile/ProfileDiffForm.tsx +134 -0
  205. package/recce-source/js/src/components/profile/ProfileDiffResultView.tsx +245 -0
  206. package/recce-source/js/src/components/query/ChangedOnlyCheckbox.tsx +29 -0
  207. package/recce-source/js/src/components/query/DiffText.tsx +120 -0
  208. package/recce-source/js/src/components/query/QueryDiffResultView.tsx +470 -0
  209. package/recce-source/js/src/components/query/QueryForm.tsx +80 -0
  210. package/recce-source/js/src/components/query/QueryPage.tsx +282 -0
  211. package/recce-source/js/src/components/query/QueryResultView.tsx +180 -0
  212. package/recce-source/js/src/components/query/SetupConnectionGuide.tsx +57 -0
  213. package/recce-source/js/src/components/query/SqlEditor.tsx +245 -0
  214. package/recce-source/js/src/components/query/ToggleSwitch.tsx +84 -0
  215. package/recce-source/js/src/components/query/styles.css +21 -0
  216. package/recce-source/js/src/components/routing/DirectUrlAccess.test.tsx +428 -0
  217. package/recce-source/js/src/components/routing/LineageStatePreservation.test.tsx +311 -0
  218. package/recce-source/js/src/components/routing/Navigation.test.tsx +256 -0
  219. package/recce-source/js/src/components/rowcount/RowCountDiffResultView.tsx +109 -0
  220. package/recce-source/js/src/components/rowcount/delta.ts +11 -0
  221. package/recce-source/js/src/components/run/RunList.tsx +303 -0
  222. package/recce-source/js/src/components/run/RunModal.tsx +191 -0
  223. package/recce-source/js/src/components/run/RunPage.tsx +26 -0
  224. package/recce-source/js/src/components/run/RunResultPane.tsx +454 -0
  225. package/recce-source/js/src/components/run/RunStatusAndDate.tsx +106 -0
  226. package/recce-source/js/src/components/run/RunToolbar.tsx +70 -0
  227. package/recce-source/js/src/components/run/RunView.tsx +196 -0
  228. package/recce-source/js/src/components/run/registry.ts +214 -0
  229. package/recce-source/js/src/components/run/types.ts +14 -0
  230. package/recce-source/js/src/components/schema/ColumnNameCell.test.tsx +169 -0
  231. package/recce-source/js/src/components/schema/ColumnNameCell.tsx +198 -0
  232. package/recce-source/js/src/components/schema/SchemaView.tsx +337 -0
  233. package/recce-source/js/src/components/schema/schemaDiff.ts +32 -0
  234. package/recce-source/js/src/components/schema/style.css +134 -0
  235. package/recce-source/js/src/components/screenshot/ScreenshotBox.tsx +39 -0
  236. package/recce-source/js/src/components/shared/HistoryToggle.tsx +35 -0
  237. package/recce-source/js/src/components/split/Split.tsx +40 -0
  238. package/recce-source/js/src/components/split/styles.css +24 -0
  239. package/recce-source/js/src/components/summary/ChangeSummary.tsx +264 -0
  240. package/recce-source/js/src/components/summary/SchemaSummary.tsx +123 -0
  241. package/recce-source/js/src/components/summary/SummaryView.tsx +29 -0
  242. package/recce-source/js/src/components/timeout/IdleTimeoutBadge.tsx +48 -0
  243. package/recce-source/js/src/components/top-k/TopKDiffForm.tsx +58 -0
  244. package/recce-source/js/src/components/top-k/TopKDiffResultView.tsx +73 -0
  245. package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnGroupHeader.tsx +228 -0
  246. package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnHeader.tsx +113 -0
  247. package/recce-source/js/src/components/ui/dataGrid/defaultRenderCell.tsx +72 -0
  248. package/recce-source/js/src/components/ui/dataGrid/index.ts +23 -0
  249. package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.test.tsx +607 -0
  250. package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.tsx +211 -0
  251. package/recce-source/js/src/components/ui/dataGrid/schemaCells.test.tsx +452 -0
  252. package/recce-source/js/src/components/ui/dataGrid/schemaCells.tsx +142 -0
  253. package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.test.tsx +178 -0
  254. package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.tsx +275 -0
  255. package/recce-source/js/src/components/ui/markdown/ExternalLinkConfirmDialog.tsx +134 -0
  256. package/recce-source/js/src/components/ui/markdown/MarkdownContent.tsx +364 -0
  257. package/recce-source/js/src/components/ui/mui/index.ts +13 -0
  258. package/recce-source/js/src/components/ui/mui-provider.tsx +67 -0
  259. package/recce-source/js/src/components/ui/mui-theme.ts +1039 -0
  260. package/recce-source/js/src/components/ui/mui-utils.ts +113 -0
  261. package/recce-source/js/src/components/ui/toaster.tsx +288 -0
  262. package/recce-source/js/src/components/valuediff/ValueDiffDetailResultView.tsx +217 -0
  263. package/recce-source/js/src/components/valuediff/ValueDiffForm.tsx +246 -0
  264. package/recce-source/js/src/components/valuediff/ValueDiffResultView.tsx +82 -0
  265. package/recce-source/js/src/components/valuediff/shared.ts +33 -0
  266. package/recce-source/js/src/constants/tooltipMessage.ts +3 -0
  267. package/recce-source/js/src/constants/urls.ts +1 -0
  268. package/recce-source/js/src/lib/UrlHash.ts +12 -0
  269. package/recce-source/js/src/lib/api/adhocQuery.ts +70 -0
  270. package/recce-source/js/src/lib/api/axiosClient.ts +9 -0
  271. package/recce-source/js/src/lib/api/cacheKeys.ts +13 -0
  272. package/recce-source/js/src/lib/api/checkEvents.ts +252 -0
  273. package/recce-source/js/src/lib/api/checks.ts +129 -0
  274. package/recce-source/js/src/lib/api/cll.ts +53 -0
  275. package/recce-source/js/src/lib/api/connectToCloud.ts +13 -0
  276. package/recce-source/js/src/lib/api/flag.ts +37 -0
  277. package/recce-source/js/src/lib/api/info.ts +198 -0
  278. package/recce-source/js/src/lib/api/instanceInfo.ts +25 -0
  279. package/recce-source/js/src/lib/api/keepAlive.ts +108 -0
  280. package/recce-source/js/src/lib/api/lineagecheck.ts +35 -0
  281. package/recce-source/js/src/lib/api/localStorageKeys.ts +7 -0
  282. package/recce-source/js/src/lib/api/models.ts +59 -0
  283. package/recce-source/js/src/lib/api/profile.ts +65 -0
  284. package/recce-source/js/src/lib/api/rowcount.ts +19 -0
  285. package/recce-source/js/src/lib/api/runs.ts +174 -0
  286. package/recce-source/js/src/lib/api/schemacheck.ts +31 -0
  287. package/recce-source/js/src/lib/api/select.ts +25 -0
  288. package/recce-source/js/src/lib/api/sessionStorageKeys.ts +8 -0
  289. package/recce-source/js/src/lib/api/state.ts +117 -0
  290. package/recce-source/js/src/lib/api/track.ts +281 -0
  291. package/recce-source/js/src/lib/api/types.ts +284 -0
  292. package/recce-source/js/src/lib/api/user.ts +42 -0
  293. package/recce-source/js/src/lib/api/valuediff.ts +46 -0
  294. package/recce-source/js/src/lib/api/version.ts +40 -0
  295. package/recce-source/js/src/lib/const.ts +9 -0
  296. package/recce-source/js/src/lib/dataGrid/crossFunctionConsistency.test.ts +626 -0
  297. package/recce-source/js/src/lib/dataGrid/dataGridFactory.test.ts +2140 -0
  298. package/recce-source/js/src/lib/dataGrid/dataGridFactory.ts +397 -0
  299. package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.test.ts +132 -0
  300. package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.ts +126 -0
  301. package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.test.ts +1627 -0
  302. package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.ts +140 -0
  303. package/recce-source/js/src/lib/dataGrid/generators/toDataGrid.ts +67 -0
  304. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.test.ts +142 -0
  305. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.ts +71 -0
  306. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.test.ts +258 -0
  307. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.ts +153 -0
  308. package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.test.ts +951 -0
  309. package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.ts +221 -0
  310. package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.test.ts +395 -0
  311. package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.ts +184 -0
  312. package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.test.ts +884 -0
  313. package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.ts +113 -0
  314. package/recce-source/js/src/lib/dataGrid/index.ts +51 -0
  315. package/recce-source/js/src/lib/dataGrid/propertyBased.test.ts +858 -0
  316. package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.test.ts +482 -0
  317. package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.ts +345 -0
  318. package/recce-source/js/src/lib/dataGrid/shared/dataTypeEdgeCases.test.ts +698 -0
  319. package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.test.tsx +820 -0
  320. package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.tsx +277 -0
  321. package/recce-source/js/src/lib/dataGrid/shared/gridUtils.test.ts +785 -0
  322. package/recce-source/js/src/lib/dataGrid/shared/gridUtils.ts +370 -0
  323. package/recce-source/js/src/lib/dataGrid/shared/index.ts +81 -0
  324. package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.test.ts +909 -0
  325. package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.ts +325 -0
  326. package/recce-source/js/src/lib/dataGrid/shared/simpleColumnBuilder.tsx +240 -0
  327. package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.test.tsx +719 -0
  328. package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.tsx +231 -0
  329. package/recce-source/js/src/lib/dataGrid/shared/validation.test.ts +559 -0
  330. package/recce-source/js/src/lib/dataGrid/shared/validation.ts +367 -0
  331. package/recce-source/js/src/lib/dataGrid/warehouseNamingConventions.test.ts +1117 -0
  332. package/recce-source/js/src/lib/formatSelect.ts +50 -0
  333. package/recce-source/js/src/lib/hooks/ApiConfigContext.tsx +181 -0
  334. package/recce-source/js/src/lib/hooks/IdleTimeoutContext.tsx +177 -0
  335. package/recce-source/js/src/lib/hooks/LineageGraphContext.tsx +512 -0
  336. package/recce-source/js/src/lib/hooks/RecceActionContext.tsx +269 -0
  337. package/recce-source/js/src/lib/hooks/RecceCheckContext.tsx +33 -0
  338. package/recce-source/js/src/lib/hooks/RecceContextProvider.tsx +54 -0
  339. package/recce-source/js/src/lib/hooks/RecceInstanceContext.tsx +129 -0
  340. package/recce-source/js/src/lib/hooks/RecceQueryContext.tsx +98 -0
  341. package/recce-source/js/src/lib/hooks/RecceShareStateContext.tsx +59 -0
  342. package/recce-source/js/src/lib/hooks/ScreenShot.tsx +399 -0
  343. package/recce-source/js/src/lib/hooks/useAppRouter.test.ts +211 -0
  344. package/recce-source/js/src/lib/hooks/useAppRouter.ts +200 -0
  345. package/recce-source/js/src/lib/hooks/useCheckEvents.ts +99 -0
  346. package/recce-source/js/src/lib/hooks/useCheckToast.tsx +14 -0
  347. package/recce-source/js/src/lib/hooks/useClipBoardToast.tsx +27 -0
  348. package/recce-source/js/src/lib/hooks/useCountdownToast.tsx +102 -0
  349. package/recce-source/js/src/lib/hooks/useFeedbackCollectionToast.tsx +130 -0
  350. package/recce-source/js/src/lib/hooks/useGuideToast.tsx +45 -0
  351. package/recce-source/js/src/lib/hooks/useIdleDetection.tsx +185 -0
  352. package/recce-source/js/src/lib/hooks/useModelColumns.tsx +113 -0
  353. package/recce-source/js/src/lib/hooks/useRecceInstanceInfo.tsx +13 -0
  354. package/recce-source/js/src/lib/hooks/useRecceServerFlag.tsx +13 -0
  355. package/recce-source/js/src/lib/hooks/useRun.tsx +89 -0
  356. package/recce-source/js/src/lib/hooks/useThemeColors.ts +115 -0
  357. package/recce-source/js/src/lib/mergeKeys.test.ts +89 -0
  358. package/recce-source/js/src/lib/mergeKeys.ts +86 -0
  359. package/recce-source/js/src/lib/result/ResultErrorFallback.tsx +9 -0
  360. package/recce-source/js/src/lib/utils/formatTime.ts +84 -0
  361. package/recce-source/js/src/lib/utils/urls.ts +16 -0
  362. package/recce-source/js/src/utils/DropdownValuesInput.tsx +297 -0
  363. package/recce-source/js/src/utils/formatters.tsx +237 -0
  364. package/recce-source/js/src/utils/transforms.ts +81 -0
  365. package/recce-source/js/tsconfig.json +47 -0
  366. package/recce-source/macros/README.md +8 -0
  367. package/recce-source/macros/recce_athena.sql +73 -0
  368. package/recce-source/pyproject.toml +109 -0
  369. package/recce-source/recce/VERSION +1 -0
  370. package/recce-source/recce/__init__.py +84 -0
  371. package/recce-source/recce/adapter/__init__.py +0 -0
  372. package/recce-source/recce/adapter/base.py +109 -0
  373. package/recce-source/recce/adapter/dbt_adapter/__init__.py +1699 -0
  374. package/recce-source/recce/adapter/dbt_adapter/dbt_version.py +42 -0
  375. package/recce-source/recce/adapter/sqlmesh_adapter.py +141 -0
  376. package/recce-source/recce/apis/__init__.py +0 -0
  377. package/recce-source/recce/apis/check_api.py +203 -0
  378. package/recce-source/recce/apis/check_events_api.py +353 -0
  379. package/recce-source/recce/apis/check_func.py +130 -0
  380. package/recce-source/recce/apis/run_api.py +130 -0
  381. package/recce-source/recce/apis/run_func.py +258 -0
  382. package/recce-source/recce/artifact.py +266 -0
  383. package/recce-source/recce/cli.py +1846 -0
  384. package/recce-source/recce/config.py +127 -0
  385. package/recce-source/recce/connect_to_cloud.py +138 -0
  386. package/recce-source/recce/core.py +334 -0
  387. package/recce-source/recce/diff.py +26 -0
  388. package/recce-source/recce/event/CONFIG +1 -0
  389. package/recce-source/recce/event/SENTRY_DNS +1 -0
  390. package/recce-source/recce/event/__init__.py +304 -0
  391. package/recce-source/recce/event/collector.py +184 -0
  392. package/recce-source/recce/event/track.py +158 -0
  393. package/recce-source/recce/exceptions.py +21 -0
  394. package/recce-source/recce/git.py +77 -0
  395. package/recce-source/recce/github.py +222 -0
  396. package/recce-source/recce/mcp_server.py +861 -0
  397. package/recce-source/recce/models/__init__.py +6 -0
  398. package/recce-source/recce/models/check.py +473 -0
  399. package/recce-source/recce/models/run.py +46 -0
  400. package/recce-source/recce/models/types.py +218 -0
  401. package/recce-source/recce/pull_request.py +124 -0
  402. package/recce-source/recce/run.py +390 -0
  403. package/recce-source/recce/server.py +877 -0
  404. package/recce-source/recce/state/__init__.py +31 -0
  405. package/recce-source/recce/state/cloud.py +644 -0
  406. package/recce-source/recce/state/const.py +26 -0
  407. package/recce-source/recce/state/local.py +56 -0
  408. package/recce-source/recce/state/state.py +119 -0
  409. package/recce-source/recce/state/state_loader.py +174 -0
  410. package/recce-source/recce/summary.py +575 -0
  411. package/recce-source/recce/tasks/__init__.py +23 -0
  412. package/recce-source/recce/tasks/core.py +134 -0
  413. package/recce-source/recce/tasks/dataframe.py +170 -0
  414. package/recce-source/recce/tasks/histogram.py +433 -0
  415. package/recce-source/recce/tasks/lineage.py +19 -0
  416. package/recce-source/recce/tasks/profile.py +298 -0
  417. package/recce-source/recce/tasks/query.py +450 -0
  418. package/recce-source/recce/tasks/rowcount.py +277 -0
  419. package/recce-source/recce/tasks/schema.py +65 -0
  420. package/recce-source/recce/tasks/top_k.py +172 -0
  421. package/recce-source/recce/tasks/utils.py +147 -0
  422. package/recce-source/recce/tasks/valuediff.py +497 -0
  423. package/recce-source/recce/util/__init__.py +4 -0
  424. package/recce-source/recce/util/api_token.py +80 -0
  425. package/recce-source/recce/util/breaking.py +330 -0
  426. package/recce-source/recce/util/cache.py +25 -0
  427. package/recce-source/recce/util/cll.py +355 -0
  428. package/recce-source/recce/util/cloud/__init__.py +15 -0
  429. package/recce-source/recce/util/cloud/base.py +115 -0
  430. package/recce-source/recce/util/cloud/check_events.py +190 -0
  431. package/recce-source/recce/util/cloud/checks.py +242 -0
  432. package/recce-source/recce/util/io.py +120 -0
  433. package/recce-source/recce/util/lineage.py +83 -0
  434. package/recce-source/recce/util/logger.py +25 -0
  435. package/recce-source/recce/util/onboarding_state.py +45 -0
  436. package/recce-source/recce/util/perf_tracking.py +85 -0
  437. package/recce-source/recce/util/pydantic_model.py +22 -0
  438. package/recce-source/recce/util/recce_cloud.py +454 -0
  439. package/recce-source/recce/util/singleton.py +18 -0
  440. package/recce-source/recce/util/startup_perf.py +121 -0
  441. package/recce-source/recce/yaml/__init__.py +58 -0
  442. package/recce-source/recce_cloud/README.md +780 -0
  443. package/recce-source/recce_cloud/VERSION +1 -0
  444. package/recce-source/recce_cloud/__init__.py +24 -0
  445. package/recce-source/recce_cloud/api/__init__.py +17 -0
  446. package/recce-source/recce_cloud/api/base.py +132 -0
  447. package/recce-source/recce_cloud/api/client.py +186 -0
  448. package/recce-source/recce_cloud/api/exceptions.py +26 -0
  449. package/recce-source/recce_cloud/api/factory.py +63 -0
  450. package/recce-source/recce_cloud/api/github.py +106 -0
  451. package/recce-source/recce_cloud/api/gitlab.py +111 -0
  452. package/recce-source/recce_cloud/artifact.py +57 -0
  453. package/recce-source/recce_cloud/ci_providers/__init__.py +9 -0
  454. package/recce-source/recce_cloud/ci_providers/base.py +82 -0
  455. package/recce-source/recce_cloud/ci_providers/detector.py +147 -0
  456. package/recce-source/recce_cloud/ci_providers/github_actions.py +136 -0
  457. package/recce-source/recce_cloud/ci_providers/gitlab_ci.py +130 -0
  458. package/recce-source/recce_cloud/cli.py +434 -0
  459. package/recce-source/recce_cloud/download.py +230 -0
  460. package/recce-source/recce_cloud/hatch_build.py +20 -0
  461. package/recce-source/recce_cloud/pyproject.toml +49 -0
  462. package/recce-source/recce_cloud/upload.py +214 -0
  463. package/recce-source/test.py +0 -0
  464. package/recce-source/tests/__init__.py +0 -0
  465. package/recce-source/tests/adapter/__init__.py +0 -0
  466. package/recce-source/tests/adapter/dbt_adapter/__init__.py +0 -0
  467. package/recce-source/tests/adapter/dbt_adapter/conftest.py +17 -0
  468. package/recce-source/tests/adapter/dbt_adapter/dbt_test_helper.py +298 -0
  469. package/recce-source/tests/adapter/dbt_adapter/test_dbt_adapter.py +25 -0
  470. package/recce-source/tests/adapter/dbt_adapter/test_dbt_cll.py +717 -0
  471. package/recce-source/tests/adapter/dbt_adapter/test_proj/dbt_project.yml +4 -0
  472. package/recce-source/tests/adapter/dbt_adapter/test_proj/manifest.json +1 -0
  473. package/recce-source/tests/adapter/dbt_adapter/test_proj/package-lock.yml +8 -0
  474. package/recce-source/tests/adapter/dbt_adapter/test_proj/packages.yml +7 -0
  475. package/recce-source/tests/adapter/dbt_adapter/test_proj/profiles.yml +6 -0
  476. package/recce-source/tests/adapter/dbt_adapter/test_selector.py +205 -0
  477. package/recce-source/tests/apis/__init__.py +0 -0
  478. package/recce-source/tests/apis/row_count_diff.json +59 -0
  479. package/recce-source/tests/apis/test_check_events_api.py +615 -0
  480. package/recce-source/tests/apis/test_run_func.py +433 -0
  481. package/recce-source/tests/catalog.json +527 -0
  482. package/recce-source/tests/data/manifest/base/catalog.json +1 -0
  483. package/recce-source/tests/data/manifest/base/manifest.json +1 -0
  484. package/recce-source/tests/data/manifest/pr2/catalog.json +1 -0
  485. package/recce-source/tests/data/manifest/pr2/manifest.json +1 -0
  486. package/recce-source/tests/manifest.json +10655 -0
  487. package/recce-source/tests/models/__init__.py +0 -0
  488. package/recce-source/tests/models/test_check.py +731 -0
  489. package/recce-source/tests/models/test_run_models.py +295 -0
  490. package/recce-source/tests/recce_cloud/__init__.py +0 -0
  491. package/recce-source/tests/recce_cloud/test_ci_providers.py +351 -0
  492. package/recce-source/tests/recce_cloud/test_cli.py +735 -0
  493. package/recce-source/tests/recce_cloud/test_client.py +379 -0
  494. package/recce-source/tests/recce_cloud/test_platform_clients.py +483 -0
  495. package/recce-source/tests/recce_state.json +1 -0
  496. package/recce-source/tests/state/test_cloud.py +719 -0
  497. package/recce-source/tests/state/test_local.py +164 -0
  498. package/recce-source/tests/state/test_state_loader.py +211 -0
  499. package/recce-source/tests/tasks/__init__.py +0 -0
  500. package/recce-source/tests/tasks/conftest.py +4 -0
  501. package/recce-source/tests/tasks/test_histogram.py +129 -0
  502. package/recce-source/tests/tasks/test_lineage.py +55 -0
  503. package/recce-source/tests/tasks/test_preset_checks.py +64 -0
  504. package/recce-source/tests/tasks/test_profile.py +397 -0
  505. package/recce-source/tests/tasks/test_query.py +528 -0
  506. package/recce-source/tests/tasks/test_row_count.py +133 -0
  507. package/recce-source/tests/tasks/test_schema.py +122 -0
  508. package/recce-source/tests/tasks/test_top_k.py +77 -0
  509. package/recce-source/tests/tasks/test_utils.py +439 -0
  510. package/recce-source/tests/tasks/test_valuediff.py +361 -0
  511. package/recce-source/tests/test_cli.py +236 -0
  512. package/recce-source/tests/test_cli_mcp_optional.py +45 -0
  513. package/recce-source/tests/test_cloud_listing_cli.py +324 -0
  514. package/recce-source/tests/test_config.py +43 -0
  515. package/recce-source/tests/test_connect_to_cloud.py +82 -0
  516. package/recce-source/tests/test_core.py +174 -0
  517. package/recce-source/tests/test_dbt.py +36 -0
  518. package/recce-source/tests/test_mcp_server.py +505 -0
  519. package/recce-source/tests/test_pull_request.py +130 -0
  520. package/recce-source/tests/test_server.py +202 -0
  521. package/recce-source/tests/test_server_lifespan.py +138 -0
  522. package/recce-source/tests/test_summary.py +73 -0
  523. package/recce-source/tests/util/__init__.py +0 -0
  524. package/recce-source/tests/util/cloud/__init__.py +0 -0
  525. package/recce-source/tests/util/cloud/test_check_events.py +255 -0
  526. package/recce-source/tests/util/cloud/test_checks.py +204 -0
  527. package/recce-source/tests/util/test_api_token.py +119 -0
  528. package/recce-source/tests/util/test_breaking.py +1427 -0
  529. package/recce-source/tests/util/test_cll.py +706 -0
  530. package/recce-source/tests/util/test_lineage.py +122 -0
  531. package/recce-source/tests/util/test_onboarding_state.py +84 -0
  532. package/recce-source/tests/util/test_recce_cloud.py +231 -0
  533. package/recce-source/tox.ini +40 -0
  534. package/recce-source/uv.lock +3928 -0
  535. package/src/api/index.ts +32 -0
  536. package/src/components/index.ts +154 -0
  537. package/src/global.d.ts +14 -0
  538. package/src/hooks/index.ts +56 -0
  539. package/src/index.ts +17 -0
  540. package/src/lib/hooks/RouteConfigContext.ts +139 -0
  541. package/src/lib/hooks/useAppRouter.ts +240 -0
  542. package/src/mui-augmentation.d.ts +139 -0
  543. package/src/theme/index.ts +13 -0
  544. package/src/theme.ts +23 -0
  545. package/src/types/index.ts +23 -0
  546. package/dist/index-BNUP2V_N.d.ts.map +0 -1
  547. package/dist/index-DOPZuhD8.d.mts.map +0 -1
  548. package/dist/theme.d.mts.map +0 -1
  549. package/dist/theme.d.ts.map +0 -1
@@ -0,0 +1,719 @@
1
+ /**
2
+ * @file toDiffColumn.test.tsx
3
+ * @description Tests for toDiffColumn shared column builder
4
+ *
5
+ * Tests cover:
6
+ * - createCellClassBase factory function
7
+ * - createCellClassCurrent factory function
8
+ * - toDiffColumn inline mode
9
+ * - toDiffColumn side_by_side mode
10
+ * - Column metadata preservation
11
+ * - Header cell class assignment
12
+ */
13
+
14
+ import type { CellClassParams } from "ag-grid-community";
15
+ import React from "react";
16
+ import { ColumnRenderMode, ColumnType, RowObjectType } from "@/lib/api/types";
17
+ import {
18
+ createCellClassBase,
19
+ createCellClassCurrent,
20
+ DiffColumnConfig,
21
+ DiffColumnResult,
22
+ toDiffColumn,
23
+ } from "./toDiffColumn";
24
+
25
+ // ============================================================================
26
+ // Mocks
27
+ // ============================================================================
28
+
29
+ // Mock AG Grid modules
30
+ jest.mock("ag-grid-community", () => ({
31
+ ModuleRegistry: { registerModules: jest.fn() },
32
+ AllCommunityModule: {},
33
+ }));
34
+
35
+ // Mock the UI components to avoid React rendering complexity
36
+ jest.mock("@/components/ui/dataGrid", () => ({
37
+ DataFrameColumnGroupHeader: () => null,
38
+ defaultRenderCell: jest.fn(),
39
+ inlineRenderCell: jest.fn(),
40
+ }));
41
+
42
+ jest.mock("./gridUtils", () => ({
43
+ getHeaderCellClass: (status: string | undefined) => {
44
+ if (status === "added") return "diff-header-added";
45
+ if (status === "removed") return "diff-header-removed";
46
+ return undefined;
47
+ },
48
+ }));
49
+
50
+ // ============================================================================
51
+ // Types for testing (uses AG Grid types)
52
+ // ============================================================================
53
+
54
+ /**
55
+ * Context for custom column metadata
56
+ */
57
+ interface TestColumnContext {
58
+ columnType?: ColumnType;
59
+ columnRenderMode?: ColumnRenderMode;
60
+ }
61
+
62
+ /**
63
+ * Test-friendly Column type (based on AG Grid ColDef)
64
+ */
65
+ interface TestColumn {
66
+ field: string;
67
+ headerName?: string;
68
+ headerComponent?: React.ComponentType;
69
+ headerClass?: string;
70
+ cellClass?:
71
+ | string
72
+ | ((params: CellClassParams<RowObjectType>) => string | undefined);
73
+ cellRenderer?: unknown;
74
+ context?: TestColumnContext;
75
+ }
76
+
77
+ /**
78
+ * Test-friendly ColumnGroup type (based on AG Grid ColGroupDef)
79
+ */
80
+ interface TestColumnGroup {
81
+ headerName?: string;
82
+ headerClass?: string;
83
+ children: readonly TestColumn[];
84
+ context?: TestColumnContext;
85
+ }
86
+
87
+ // ============================================================================
88
+ // Test Helpers
89
+ // ============================================================================
90
+
91
+ /**
92
+ * Helper to create a valid RowObjectType with required __status
93
+ */
94
+ const createRow = (
95
+ values: Record<string, number | string | boolean | null | undefined>,
96
+ status: "added" | "removed" | "modified" | undefined = undefined,
97
+ ): RowObjectType => ({
98
+ ...values,
99
+ __status: status,
100
+ });
101
+
102
+ /**
103
+ * Helper to create mock CellClassParams from a row
104
+ * This is needed because AG Grid cellClass functions expect CellClassParams
105
+ */
106
+ const createCellClassParams = (
107
+ row: RowObjectType,
108
+ ): CellClassParams<RowObjectType> =>
109
+ ({
110
+ data: row,
111
+ value: undefined,
112
+ node: undefined,
113
+ colDef: {},
114
+ column: {},
115
+ api: {},
116
+ rowIndex: 0,
117
+ }) as unknown as CellClassParams<RowObjectType>;
118
+
119
+ /**
120
+ * Creates a minimal DiffColumnConfig for testing
121
+ */
122
+ const createConfig = (
123
+ overrides: Partial<DiffColumnConfig> = {},
124
+ ): DiffColumnConfig => ({
125
+ name: "test_column",
126
+ columnStatus: "",
127
+ columnType: "text",
128
+ displayMode: "inline",
129
+ ...overrides,
130
+ });
131
+
132
+ /**
133
+ * Check if result is a Column (inline mode) - has 'field' property
134
+ * Returns boolean instead of type predicate to avoid ESM type compatibility issues
135
+ */
136
+ function isColumn(result: DiffColumnResult): boolean {
137
+ return "field" in result && !("children" in result);
138
+ }
139
+
140
+ /**
141
+ * Check if result is a ColumnGroup (side_by_side mode) - has 'children' property
142
+ * Returns boolean instead of type predicate to avoid ESM type compatibility issues
143
+ */
144
+ function isColumnGroup(result: DiffColumnResult): boolean {
145
+ return (
146
+ "children" in result &&
147
+ Array.isArray((result as unknown as TestColumnGroup).children)
148
+ );
149
+ }
150
+
151
+ /**
152
+ * Cast result to TestColumn for accessing column properties
153
+ */
154
+ function asColumn(result: DiffColumnResult): TestColumn {
155
+ return result as unknown as TestColumn;
156
+ }
157
+
158
+ /**
159
+ * Cast result to TestColumnGroup for accessing column group properties
160
+ */
161
+ function asColumnGroup(result: DiffColumnResult): TestColumnGroup {
162
+ return result as unknown as TestColumnGroup;
163
+ }
164
+
165
+ /**
166
+ * Helper to get children from a column group as TestColumn array
167
+ */
168
+ function getChildren(result: DiffColumnResult): TestColumn[] {
169
+ return asColumnGroup(result).children as TestColumn[];
170
+ }
171
+
172
+ // ============================================================================
173
+ // createCellClassBase Tests
174
+ // ============================================================================
175
+
176
+ describe("createCellClassBase", () => {
177
+ test("returns a function", () => {
178
+ const cellClassFn = createCellClassBase("value", "");
179
+
180
+ expect(typeof cellClassFn).toBe("function");
181
+ });
182
+
183
+ test("returns 'diff-cell-removed' for removed row status", () => {
184
+ const cellClassFn = createCellClassBase("value", "");
185
+ const row = createRow({}, "removed");
186
+
187
+ expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-removed");
188
+ });
189
+
190
+ test("returns 'diff-cell-added' for added row status", () => {
191
+ const cellClassFn = createCellClassBase("value", "");
192
+ const row = createRow({}, "added");
193
+
194
+ expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-added");
195
+ });
196
+
197
+ test("returns undefined for added column status", () => {
198
+ const cellClassFn = createCellClassBase("value", "added");
199
+ const row = createRow({ base__value: 100, current__value: 200 });
200
+
201
+ expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
202
+ });
203
+
204
+ test("returns undefined for removed column status", () => {
205
+ const cellClassFn = createCellClassBase("value", "removed");
206
+ const row = createRow({ base__value: 100, current__value: 200 });
207
+
208
+ expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
209
+ });
210
+
211
+ test("returns 'diff-cell-removed' when base and current values differ", () => {
212
+ const cellClassFn = createCellClassBase("value", "");
213
+ const row = createRow({ base__value: 100, current__value: 200 });
214
+
215
+ expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-removed");
216
+ });
217
+
218
+ test("returns undefined when base and current values are equal", () => {
219
+ const cellClassFn = createCellClassBase("value", "");
220
+ const row = createRow({ base__value: 100, current__value: 100 });
221
+
222
+ expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
223
+ });
224
+
225
+ test("handles case-insensitive key lookup (lowercase)", () => {
226
+ const cellClassFn = createCellClassBase("Value", "");
227
+ // Keys are lowercased: base__value, current__value
228
+ const row = createRow({ base__value: 100, current__value: 200 });
229
+
230
+ expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-removed");
231
+ });
232
+
233
+ test("handles null values", () => {
234
+ const cellClassFn = createCellClassBase("value", "");
235
+ const row = createRow({ base__value: null, current__value: "test" });
236
+
237
+ expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-removed");
238
+ });
239
+
240
+ test("handles undefined values (both undefined = equal)", () => {
241
+ const cellClassFn = createCellClassBase("value", "");
242
+ const row = createRow({});
243
+
244
+ expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
245
+ });
246
+
247
+ test("handles modified row status with equal values", () => {
248
+ const cellClassFn = createCellClassBase("value", "");
249
+ const row = createRow(
250
+ { base__value: 100, current__value: 100 },
251
+ "modified",
252
+ );
253
+
254
+ // Row status is modified, but this specific column has equal values
255
+ expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
256
+ });
257
+
258
+ test("handles object value comparison with lodash isEqual", () => {
259
+ const cellClassFn = createCellClassBase("data", "");
260
+ // Objects with same content should be considered equal
261
+ const row = createRow({});
262
+ // Manually set object values (createRow doesn't support objects in its type)
263
+ (row as Record<string, unknown>).base__data = { a: 1 };
264
+ (row as Record<string, unknown>).current__data = { a: 1 };
265
+
266
+ expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
267
+ });
268
+
269
+ test("detects different objects as modified", () => {
270
+ const cellClassFn = createCellClassBase("data", "");
271
+ const row = createRow({});
272
+ (row as Record<string, unknown>).base__data = { a: 1 };
273
+ (row as Record<string, unknown>).current__data = { a: 2 };
274
+
275
+ expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-removed");
276
+ });
277
+ });
278
+
279
+ // ============================================================================
280
+ // createCellClassCurrent Tests
281
+ // ============================================================================
282
+
283
+ describe("createCellClassCurrent", () => {
284
+ test("returns a function", () => {
285
+ const cellClassFn = createCellClassCurrent("value", "");
286
+
287
+ expect(typeof cellClassFn).toBe("function");
288
+ });
289
+
290
+ test("returns 'diff-cell-removed' for removed row status", () => {
291
+ const cellClassFn = createCellClassCurrent("value", "");
292
+ const row = createRow({}, "removed");
293
+
294
+ expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-removed");
295
+ });
296
+
297
+ test("returns 'diff-cell-added' for added row status", () => {
298
+ const cellClassFn = createCellClassCurrent("value", "");
299
+ const row = createRow({}, "added");
300
+
301
+ expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-added");
302
+ });
303
+
304
+ test("returns undefined for added column status", () => {
305
+ const cellClassFn = createCellClassCurrent("value", "added");
306
+ const row = createRow({ base__value: 100, current__value: 200 });
307
+
308
+ expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
309
+ });
310
+
311
+ test("returns undefined for removed column status", () => {
312
+ const cellClassFn = createCellClassCurrent("value", "removed");
313
+ const row = createRow({ base__value: 100, current__value: 200 });
314
+
315
+ expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
316
+ });
317
+
318
+ test("returns 'diff-cell-added' when base and current values differ", () => {
319
+ const cellClassFn = createCellClassCurrent("value", "");
320
+ const row = createRow({ base__value: 100, current__value: 200 });
321
+
322
+ // Current column shows "added" styling for modified cells
323
+ expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-added");
324
+ });
325
+
326
+ test("returns undefined when base and current values are equal", () => {
327
+ const cellClassFn = createCellClassCurrent("value", "");
328
+ const row = createRow({ base__value: 100, current__value: 100 });
329
+
330
+ expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
331
+ });
332
+
333
+ test("handles case-insensitive key lookup (lowercase)", () => {
334
+ const cellClassFn = createCellClassCurrent("Value", "");
335
+ const row = createRow({ base__value: 100, current__value: 200 });
336
+
337
+ expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-added");
338
+ });
339
+ });
340
+
341
+ // ============================================================================
342
+ // createCellClassBase vs createCellClassCurrent Comparison
343
+ // ============================================================================
344
+
345
+ describe("createCellClassBase vs createCellClassCurrent", () => {
346
+ test("base returns 'diff-cell-removed', current returns 'diff-cell-added' for same modified cell", () => {
347
+ const baseFn = createCellClassBase("value", "");
348
+ const currentFn = createCellClassCurrent("value", "");
349
+ const row = createRow({ base__value: 100, current__value: 200 });
350
+
351
+ expect(baseFn(createCellClassParams(row))).toBe("diff-cell-removed");
352
+ expect(currentFn(createCellClassParams(row))).toBe("diff-cell-added");
353
+ });
354
+
355
+ test("both return same class for row-level status (added/removed)", () => {
356
+ const baseFn = createCellClassBase("value", "");
357
+ const currentFn = createCellClassCurrent("value", "");
358
+
359
+ const addedRow = createRow({}, "added");
360
+ const removedRow = createRow({}, "removed");
361
+
362
+ expect(baseFn(createCellClassParams(addedRow))).toBe(
363
+ currentFn(createCellClassParams(addedRow)),
364
+ );
365
+ expect(baseFn(createCellClassParams(removedRow))).toBe(
366
+ currentFn(createCellClassParams(removedRow)),
367
+ );
368
+ });
369
+
370
+ test("both return undefined for unchanged cells", () => {
371
+ const baseFn = createCellClassBase("value", "");
372
+ const currentFn = createCellClassCurrent("value", "");
373
+ const row = createRow({ base__value: 100, current__value: 100 });
374
+
375
+ expect(baseFn(createCellClassParams(row))).toBeUndefined();
376
+ expect(currentFn(createCellClassParams(row))).toBeUndefined();
377
+ });
378
+ });
379
+
380
+ // ============================================================================
381
+ // toDiffColumn - Inline Mode Tests
382
+ // ============================================================================
383
+
384
+ describe("toDiffColumn - inline mode", () => {
385
+ test("returns column with field matching column name", () => {
386
+ const result = toDiffColumn(createConfig({ name: "price" }));
387
+
388
+ expect(isColumn(result)).toBe(true);
389
+ const col = asColumn(result);
390
+ expect(col.field).toBe("price");
391
+ });
392
+
393
+ test("does not have children property", () => {
394
+ const result = toDiffColumn(createConfig({ displayMode: "inline" }));
395
+
396
+ expect(isColumnGroup(result)).toBe(false);
397
+ });
398
+
399
+ test("includes cellRenderer function (inlineRenderCell)", () => {
400
+ const result = toDiffColumn(createConfig({ displayMode: "inline" }));
401
+
402
+ expect(isColumn(result)).toBe(true);
403
+ const col = asColumn(result);
404
+ expect(col.cellRenderer).toBeDefined();
405
+ });
406
+
407
+ test("preserves columnType", () => {
408
+ const result = toDiffColumn(
409
+ createConfig({ columnType: "number", displayMode: "inline" }),
410
+ );
411
+
412
+ expect(result.context?.columnType).toBe("number");
413
+ });
414
+
415
+ test("preserves columnRenderMode", () => {
416
+ const result = toDiffColumn(
417
+ createConfig({ columnRenderMode: "percent", displayMode: "inline" }),
418
+ );
419
+
420
+ expect(result.context?.columnRenderMode).toBe("percent");
421
+ });
422
+
423
+ test("uses undefined as default columnRenderMode (triggers smart formatting)", () => {
424
+ const result = toDiffColumn(createConfig({ displayMode: "inline" }));
425
+
426
+ expect(result.context?.columnRenderMode).toBeUndefined();
427
+ });
428
+
429
+ test("sets headerClass for added column", () => {
430
+ const result = toDiffColumn(
431
+ createConfig({ columnStatus: "added", displayMode: "inline" }),
432
+ );
433
+
434
+ expect(result.headerClass).toBe("diff-header-added");
435
+ });
436
+
437
+ test("sets headerClass for removed column", () => {
438
+ const result = toDiffColumn(
439
+ createConfig({ columnStatus: "removed", displayMode: "inline" }),
440
+ );
441
+
442
+ expect(result.headerClass).toBe("diff-header-removed");
443
+ });
444
+
445
+ test("headerClass is undefined for empty status", () => {
446
+ const result = toDiffColumn(
447
+ createConfig({ columnStatus: "", displayMode: "inline" }),
448
+ );
449
+
450
+ expect(result.headerClass).toBeUndefined();
451
+ });
452
+
453
+ test("has headerComponent", () => {
454
+ const result = toDiffColumn(createConfig({ displayMode: "inline" }));
455
+
456
+ // biome-ignore lint/suspicious/noExplicitAny: Accessing AG Grid internal property for testing
457
+ expect((result as any).headerComponent).toBeDefined();
458
+ });
459
+ });
460
+
461
+ // ============================================================================
462
+ // toDiffColumn - Side-by-Side Mode Tests
463
+ // ============================================================================
464
+
465
+ describe("toDiffColumn - side_by_side mode", () => {
466
+ test("returns column group with children", () => {
467
+ const result = toDiffColumn(createConfig({ displayMode: "side_by_side" }));
468
+
469
+ expect(isColumnGroup(result)).toBe(true);
470
+ });
471
+
472
+ test("has exactly 2 children (base and current)", () => {
473
+ const result = toDiffColumn(createConfig({ displayMode: "side_by_side" }));
474
+
475
+ const children = getChildren(result);
476
+ expect(children).toHaveLength(2);
477
+ });
478
+
479
+ test("children have correct fields (base__name and current__name)", () => {
480
+ const result = toDiffColumn(
481
+ createConfig({ name: "value", displayMode: "side_by_side" }),
482
+ );
483
+
484
+ const children = getChildren(result);
485
+ const fields = children.map((child) => child.field);
486
+ expect(fields).toContain("base__value");
487
+ expect(fields).toContain("current__value");
488
+ });
489
+
490
+ test("uses default titles 'Base' and 'Current'", () => {
491
+ const result = toDiffColumn(createConfig({ displayMode: "side_by_side" }));
492
+
493
+ const children = getChildren(result);
494
+ const names = children.map((child) => child.headerName);
495
+ expect(names).toContain("Base");
496
+ expect(names).toContain("Current");
497
+ });
498
+
499
+ test("uses custom baseTitle and currentTitle", () => {
500
+ const result = toDiffColumn(
501
+ createConfig({
502
+ displayMode: "side_by_side",
503
+ baseTitle: "Before",
504
+ currentTitle: "After",
505
+ }),
506
+ );
507
+
508
+ const children = getChildren(result);
509
+ const names = children.map((child) => child.headerName);
510
+ expect(names).toContain("Before");
511
+ expect(names).toContain("After");
512
+ });
513
+
514
+ test("children have cellClass functions", () => {
515
+ const result = toDiffColumn(createConfig({ displayMode: "side_by_side" }));
516
+
517
+ const children = getChildren(result);
518
+ children.forEach((child) => {
519
+ expect(typeof child.cellClass).toBe("function");
520
+ });
521
+ });
522
+
523
+ test("children have cellRenderer function (defaultRenderCell)", () => {
524
+ const result = toDiffColumn(createConfig({ displayMode: "side_by_side" }));
525
+
526
+ const children = getChildren(result);
527
+ children.forEach((child) => {
528
+ expect(child.cellRenderer).toBeDefined();
529
+ });
530
+ });
531
+
532
+ test("children inherit headerCellClass", () => {
533
+ const result = toDiffColumn(
534
+ createConfig({ columnStatus: "added", displayMode: "side_by_side" }),
535
+ );
536
+
537
+ const children = getChildren(result);
538
+ children.forEach((child) => {
539
+ expect(child.headerClass).toBe("diff-header-added");
540
+ });
541
+ });
542
+
543
+ test("children have columnType and columnRenderMode", () => {
544
+ const result = toDiffColumn(
545
+ createConfig({
546
+ displayMode: "side_by_side",
547
+ columnType: "number",
548
+ columnRenderMode: 2,
549
+ }),
550
+ );
551
+
552
+ const children = getChildren(result);
553
+ children.forEach((child) => {
554
+ expect(child.context?.columnType).toBe("number");
555
+ expect(child.context?.columnRenderMode).toBe(2);
556
+ });
557
+ });
558
+
559
+ test("has headerGroupComponent", () => {
560
+ const result = toDiffColumn(createConfig({ displayMode: "side_by_side" }));
561
+
562
+ // biome-ignore lint/suspicious/noExplicitAny: Accessing AG Grid internal property for testing
563
+ expect((result as any).headerGroupComponent).toBeDefined();
564
+ });
565
+
566
+ test("does not have field property (column group)", () => {
567
+ const result = toDiffColumn(createConfig({ displayMode: "side_by_side" }));
568
+
569
+ // Column groups don't have a field at the top level
570
+ expect(isColumn(result)).toBe(false);
571
+ });
572
+ });
573
+
574
+ // ============================================================================
575
+ // toDiffColumn - headerProps Tests
576
+ // ============================================================================
577
+
578
+ describe("toDiffColumn - headerProps", () => {
579
+ test("passes headerProps to DataFrameColumnGroupHeader", () => {
580
+ const headerProps = {
581
+ primaryKeys: ["id"],
582
+ pinnedColumns: ["name"],
583
+ };
584
+
585
+ const result = toDiffColumn(
586
+ createConfig({
587
+ headerProps,
588
+ displayMode: "inline",
589
+ }),
590
+ );
591
+
592
+ // The header is rendered via headerComponent
593
+ // biome-ignore lint/suspicious/noExplicitAny: Accessing AG Grid internal property for testing
594
+ expect((result as any).headerComponent).toBeDefined();
595
+ });
596
+
597
+ test("uses empty object when headerProps is undefined", () => {
598
+ const result = toDiffColumn(
599
+ createConfig({
600
+ headerProps: undefined,
601
+ displayMode: "inline",
602
+ }),
603
+ );
604
+
605
+ // biome-ignore lint/suspicious/noExplicitAny: Accessing AG Grid internal property for testing
606
+ expect((result as any).headerComponent).toBeDefined();
607
+ });
608
+ });
609
+
610
+ // ============================================================================
611
+ // toDiffColumn - Edge Cases
612
+ // ============================================================================
613
+
614
+ describe("toDiffColumn - edge cases", () => {
615
+ test("handles empty column name", () => {
616
+ const result = toDiffColumn(createConfig({ name: "" }));
617
+
618
+ const col = asColumn(result);
619
+ expect(col.field).toBe("");
620
+ });
621
+
622
+ test("handles column name with special characters", () => {
623
+ const result = toDiffColumn(createConfig({ name: "col-with-dashes" }));
624
+
625
+ const col = asColumn(result);
626
+ expect(col.field).toBe("col-with-dashes");
627
+ });
628
+
629
+ test("handles column name with spaces", () => {
630
+ const result = toDiffColumn(createConfig({ name: "Column Name" }));
631
+
632
+ const col = asColumn(result);
633
+ expect(col.field).toBe("Column Name");
634
+ });
635
+
636
+ test("handles various columnType values", () => {
637
+ const types = [
638
+ "text",
639
+ "number",
640
+ "integer",
641
+ "boolean",
642
+ "date",
643
+ "datetime",
644
+ "unknown",
645
+ ] as const;
646
+
647
+ types.forEach((type) => {
648
+ const result = toDiffColumn(createConfig({ columnType: type }));
649
+ expect(result.context?.columnType).toBe(type);
650
+ });
651
+ });
652
+
653
+ test("handles numeric columnRenderMode", () => {
654
+ const modes = [2] as const;
655
+
656
+ modes.forEach((mode) => {
657
+ const result = toDiffColumn(createConfig({ columnRenderMode: mode }));
658
+ expect(result.context?.columnRenderMode).toBe(mode);
659
+ });
660
+ });
661
+
662
+ test("handles modified columnStatus (no special header class)", () => {
663
+ const result = toDiffColumn(createConfig({ columnStatus: "modified" }));
664
+
665
+ // "modified" doesn't have a special header class in getHeaderCellClass
666
+ expect(result.headerClass).toBeUndefined();
667
+ });
668
+ });
669
+
670
+ // ============================================================================
671
+ // Integration: Cell Class Functions in Side-by-Side Mode
672
+ // ============================================================================
673
+
674
+ describe("toDiffColumn - side_by_side cell class integration", () => {
675
+ test("base child cellClass returns correct class for modified row", () => {
676
+ const result = toDiffColumn(
677
+ createConfig({ name: "value", displayMode: "side_by_side" }),
678
+ );
679
+
680
+ const children = getChildren(result);
681
+ const baseChild = children[0];
682
+ if (typeof baseChild.cellClass === "function") {
683
+ const row = createRow({ base__value: 100, current__value: 200 });
684
+ expect(baseChild.cellClass(createCellClassParams(row))).toBe(
685
+ "diff-cell-removed",
686
+ );
687
+ }
688
+ });
689
+
690
+ test("current child cellClass returns correct class for modified row", () => {
691
+ const result = toDiffColumn(
692
+ createConfig({ name: "value", displayMode: "side_by_side" }),
693
+ );
694
+
695
+ const children = getChildren(result);
696
+ const currentChild = children[1];
697
+ if (typeof currentChild.cellClass === "function") {
698
+ const row = createRow({ base__value: 100, current__value: 200 });
699
+ expect(currentChild.cellClass(createCellClassParams(row))).toBe(
700
+ "diff-cell-added",
701
+ );
702
+ }
703
+ });
704
+
705
+ test("both children return undefined for unchanged row", () => {
706
+ const result = toDiffColumn(
707
+ createConfig({ name: "value", displayMode: "side_by_side" }),
708
+ );
709
+
710
+ const children = getChildren(result);
711
+ const row = createRow({ base__value: 100, current__value: 100 });
712
+
713
+ children.forEach((child) => {
714
+ if (typeof child.cellClass === "function") {
715
+ expect(child.cellClass(createCellClassParams(row))).toBeUndefined();
716
+ }
717
+ });
718
+ });
719
+ });