@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.
- package/dist/api.d.mts +1 -1
- package/dist/api.d.ts +1 -1
- package/dist/components.d.mts +1 -1
- package/dist/components.d.ts +1 -1
- package/dist/hooks.d.mts +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/{index-BNUP2V_N.d.ts → index-B9lSPJTi.d.ts} +184 -2
- package/dist/index-B9lSPJTi.d.ts.map +1 -0
- package/dist/{index-DOPZuhD8.d.mts → index-IIXVIoOL.d.mts} +253 -71
- package/dist/index-IIXVIoOL.d.mts.map +1 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -2
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +4 -0
- package/dist/theme.d.mts +2 -185
- package/dist/theme.d.ts +2 -185
- package/dist/types.d.mts +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +4 -2
- package/recce-source/.editorconfig +26 -0
- package/recce-source/.flake8 +37 -0
- package/recce-source/.github/ISSUE_TEMPLATE/bug_report.yml +67 -0
- package/recce-source/.github/ISSUE_TEMPLATE/custom.md +10 -0
- package/recce-source/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
- package/recce-source/.github/PULL_REQUEST_TEMPLATE.md +21 -0
- package/recce-source/.github/copilot-instructions.md +331 -0
- package/recce-source/.github/instructions/backend-instructions.md +541 -0
- package/recce-source/.github/instructions/frontend-instructions.md +317 -0
- package/recce-source/.github/workflows/build-statics.yaml +72 -0
- package/recce-source/.github/workflows/bump.yaml +48 -0
- package/recce-source/.github/workflows/integration-tests-cloud.yaml +92 -0
- package/recce-source/.github/workflows/integration-tests-sqlmesh.yaml +33 -0
- package/recce-source/.github/workflows/integration-tests.yaml +52 -0
- package/recce-source/.github/workflows/nightly.yaml +246 -0
- package/recce-source/.github/workflows/release.yaml +196 -0
- package/recce-source/.github/workflows/tests-js.yaml +58 -0
- package/recce-source/.github/workflows/tests-python.yaml +128 -0
- package/recce-source/.pre-commit-config.yaml +26 -0
- package/recce-source/CLAUDE.md +483 -0
- package/recce-source/CODE_OF_CONDUCT.md +128 -0
- package/recce-source/CONTRIBUTING.md +107 -0
- package/recce-source/LICENSE +201 -0
- package/recce-source/Makefile +126 -0
- package/recce-source/README.md +182 -0
- package/recce-source/RECCE_CLOUD.md +81 -0
- package/recce-source/SECURITY.md +25 -0
- package/recce-source/docs/PACKAGING.md +340 -0
- package/recce-source/docs/README.md +1 -0
- package/recce-source/integration_tests/dbt/dbt_project.yml +26 -0
- package/recce-source/integration_tests/dbt/models/customers.sql +69 -0
- package/recce-source/integration_tests/dbt/models/docs.md +14 -0
- package/recce-source/integration_tests/dbt/models/orders.sql +56 -0
- package/recce-source/integration_tests/dbt/models/schema.yml +82 -0
- package/recce-source/integration_tests/dbt/models/staging/schema.yml +31 -0
- package/recce-source/integration_tests/dbt/models/staging/stg_customers.sql +22 -0
- package/recce-source/integration_tests/dbt/models/staging/stg_orders.sql +23 -0
- package/recce-source/integration_tests/dbt/models/staging/stg_payments.sql +25 -0
- package/recce-source/integration_tests/dbt/packages.yml +7 -0
- package/recce-source/integration_tests/dbt/profiles.yml +8 -0
- package/recce-source/integration_tests/dbt/seeds/raw_customers.csv +101 -0
- package/recce-source/integration_tests/dbt/seeds/raw_orders.csv +100 -0
- package/recce-source/integration_tests/dbt/seeds/raw_payments.csv +114 -0
- package/recce-source/integration_tests/dbt/seeds/raw_statuses.csv +5 -0
- package/recce-source/integration_tests/dbt/smoke_test.sh +72 -0
- package/recce-source/integration_tests/dbt/smoke_test_cloud.sh +71 -0
- package/recce-source/integration_tests/sqlmesh/__init__.py +0 -0
- package/recce-source/integration_tests/sqlmesh/audits/assert_item_price_above_zero.sql +9 -0
- package/recce-source/integration_tests/sqlmesh/audits/items.sql +7 -0
- package/recce-source/integration_tests/sqlmesh/audits/order_items.sql +7 -0
- package/recce-source/integration_tests/sqlmesh/config.py +171 -0
- package/recce-source/integration_tests/sqlmesh/helper.py +20 -0
- package/recce-source/integration_tests/sqlmesh/hooks/__init__.py +0 -0
- package/recce-source/integration_tests/sqlmesh/macros/__init__.py +0 -0
- package/recce-source/integration_tests/sqlmesh/macros/macros.py +8 -0
- package/recce-source/integration_tests/sqlmesh/macros/macros.sql +8 -0
- package/recce-source/integration_tests/sqlmesh/macros/utils.py +11 -0
- package/recce-source/integration_tests/sqlmesh/metrics/metrics.sql +25 -0
- package/recce-source/integration_tests/sqlmesh/models/customer_revenue_by_day.sql +41 -0
- package/recce-source/integration_tests/sqlmesh/models/customer_revenue_lifetime.sql +60 -0
- package/recce-source/integration_tests/sqlmesh/models/customers.sql +32 -0
- package/recce-source/integration_tests/sqlmesh/models/items.py +95 -0
- package/recce-source/integration_tests/sqlmesh/models/marketing.sql +15 -0
- package/recce-source/integration_tests/sqlmesh/models/order_items.py +95 -0
- package/recce-source/integration_tests/sqlmesh/models/orders.py +70 -0
- package/recce-source/integration_tests/sqlmesh/models/raw_marketing.py +62 -0
- package/recce-source/integration_tests/sqlmesh/models/top_waiters.sql +23 -0
- package/recce-source/integration_tests/sqlmesh/models/waiter_as_customer_by_day.sql +29 -0
- package/recce-source/integration_tests/sqlmesh/models/waiter_names.sql +10 -0
- package/recce-source/integration_tests/sqlmesh/models/waiter_revenue_by_day.sql +29 -0
- package/recce-source/integration_tests/sqlmesh/models/waiters.py +62 -0
- package/recce-source/integration_tests/sqlmesh/prep_env.sh +16 -0
- package/recce-source/integration_tests/sqlmesh/schema.yaml +5 -0
- package/recce-source/integration_tests/sqlmesh/seeds/waiter_names.csv +11 -0
- package/recce-source/integration_tests/sqlmesh/test_server.sh +29 -0
- package/recce-source/integration_tests/sqlmesh/tests/test_customer_revenue_by_day.yaml +63 -0
- package/recce-source/integration_tests/sqlmesh/tests/test_order_items.yaml +72 -0
- package/recce-source/js/.editorconfig +27 -0
- package/recce-source/js/.env.development +5 -0
- package/recce-source/js/.husky/pre-commit +29 -0
- package/recce-source/js/.nvmrc +1 -0
- package/recce-source/js/README.md +39 -0
- package/recce-source/js/app/(mainComponents)/DisplayModeToggle.tsx +65 -0
- package/recce-source/js/app/(mainComponents)/NavBar.tsx +228 -0
- package/recce-source/js/app/(mainComponents)/RecceVersionBadge.tsx +107 -0
- package/recce-source/js/app/(mainComponents)/TopBar.tsx +252 -0
- package/recce-source/js/app/@lineage/default.tsx +20 -0
- package/recce-source/js/app/@lineage/page.tsx +14 -0
- package/recce-source/js/app/MainLayout.tsx +170 -0
- package/recce-source/js/app/Providers.tsx +49 -0
- package/recce-source/js/app/checks/page.tsx +296 -0
- package/recce-source/js/app/error.tsx +93 -0
- package/recce-source/js/app/favicon.ico +0 -0
- package/recce-source/js/app/global-error.tsx +115 -0
- package/recce-source/js/app/global.css +82 -0
- package/recce-source/js/app/layout.tsx +48 -0
- package/recce-source/js/app/lineage/page.tsx +15 -0
- package/recce-source/js/app/page.tsx +12 -0
- package/recce-source/js/app/query/page.tsx +8 -0
- package/recce-source/js/biome.json +313 -0
- package/recce-source/js/jest.config.js +34 -0
- package/recce-source/js/jest.globals.d.ts +32 -0
- package/recce-source/js/jest.setup.js +91 -0
- package/recce-source/js/next.config.js +16 -0
- package/recce-source/js/package-lock.json +13843 -0
- package/recce-source/js/package.json +123 -0
- package/recce-source/js/pnpm-lock.yaml +9235 -0
- package/recce-source/js/pnpm-workspace.yaml +6 -0
- package/recce-source/js/postcss.config.js +5 -0
- package/recce-source/js/public/auth_callback.html +68 -0
- package/recce-source/js/public/imgs/feedback/thumbs-down.png +0 -0
- package/recce-source/js/public/imgs/feedback/thumbs-up.png +0 -0
- package/recce-source/js/public/imgs/reload-image.svg +4 -0
- package/recce-source/js/public/logo/recce-logo-white.png +0 -0
- package/recce-source/js/src/components/AuthModal/AuthModal.tsx +202 -0
- package/recce-source/js/src/components/app/AvatarDropdown.tsx +159 -0
- package/recce-source/js/src/components/app/EnvInfo.tsx +357 -0
- package/recce-source/js/src/components/app/Filename.tsx +388 -0
- package/recce-source/js/src/components/app/SetupConnectionPopover.tsx +91 -0
- package/recce-source/js/src/components/app/StateExporter.tsx +57 -0
- package/recce-source/js/src/components/app/StateImporter.tsx +198 -0
- package/recce-source/js/src/components/app/StateSharing.tsx +145 -0
- package/recce-source/js/src/components/app/StateSynchronizer.tsx +205 -0
- package/recce-source/js/src/components/charts/HistogramChart.tsx +291 -0
- package/recce-source/js/src/components/charts/SquareIcon.tsx +51 -0
- package/recce-source/js/src/components/charts/TopKSummaryList.tsx +457 -0
- package/recce-source/js/src/components/charts/chartTheme.ts +74 -0
- package/recce-source/js/src/components/check/CheckBreadcrumb.tsx +97 -0
- package/recce-source/js/src/components/check/CheckDescription.tsx +134 -0
- package/recce-source/js/src/components/check/CheckDetail.tsx +797 -0
- package/recce-source/js/src/components/check/CheckEmptyState.tsx +84 -0
- package/recce-source/js/src/components/check/CheckList.tsx +320 -0
- package/recce-source/js/src/components/check/LineageDiffView.tsx +32 -0
- package/recce-source/js/src/components/check/PresetCheckTemplateView.tsx +48 -0
- package/recce-source/js/src/components/check/SchemaDiffView.tsx +290 -0
- package/recce-source/js/src/components/check/check.ts +25 -0
- package/recce-source/js/src/components/check/timeline/CheckTimeline.tsx +163 -0
- package/recce-source/js/src/components/check/timeline/CommentInput.tsx +84 -0
- package/recce-source/js/src/components/check/timeline/TimelineEvent.tsx +468 -0
- package/recce-source/js/src/components/check/timeline/index.ts +12 -0
- package/recce-source/js/src/components/check/utils.ts +12 -0
- package/recce-source/js/src/components/data-grid/ScreenshotDataGrid.tsx +333 -0
- package/recce-source/js/src/components/data-grid/agGridStyles.css +55 -0
- package/recce-source/js/src/components/data-grid/agGridTheme.ts +43 -0
- package/recce-source/js/src/components/editor/CodeEditor.tsx +107 -0
- package/recce-source/js/src/components/editor/DiffEditor.tsx +162 -0
- package/recce-source/js/src/components/editor/index.ts +12 -0
- package/recce-source/js/src/components/errorboundary/ErrorBoundary.tsx +87 -0
- package/recce-source/js/src/components/histogram/HistogramDiffForm.tsx +147 -0
- package/recce-source/js/src/components/histogram/HistogramDiffResultView.tsx +63 -0
- package/recce-source/js/src/components/icons/index.tsx +142 -0
- package/recce-source/js/src/components/lineage/ActionControl.tsx +63 -0
- package/recce-source/js/src/components/lineage/ActionTag.tsx +141 -0
- package/recce-source/js/src/components/lineage/ChangeStatusLegend.tsx +46 -0
- package/recce-source/js/src/components/lineage/ColumnLevelLineageControl.tsx +327 -0
- package/recce-source/js/src/components/lineage/ColumnLevelLineageLegend.tsx +57 -0
- package/recce-source/js/src/components/lineage/GraphColumnNode.tsx +199 -0
- package/recce-source/js/src/components/lineage/GraphEdge.tsx +59 -0
- package/recce-source/js/src/components/lineage/GraphNode.tsx +555 -0
- package/recce-source/js/src/components/lineage/LineagePage.tsx +10 -0
- package/recce-source/js/src/components/lineage/LineageView.tsx +1384 -0
- package/recce-source/js/src/components/lineage/LineageViewContext.tsx +86 -0
- package/recce-source/js/src/components/lineage/LineageViewContextMenu.tsx +637 -0
- package/recce-source/js/src/components/lineage/LineageViewNotification.tsx +64 -0
- package/recce-source/js/src/components/lineage/LineageViewTopBar.tsx +596 -0
- package/recce-source/js/src/components/lineage/NodeSqlView.tsx +136 -0
- package/recce-source/js/src/components/lineage/NodeTag.tsx +278 -0
- package/recce-source/js/src/components/lineage/NodeView.tsx +642 -0
- package/recce-source/js/src/components/lineage/SandboxView.tsx +436 -0
- package/recce-source/js/src/components/lineage/ServerDisconnectedModalContent.tsx +105 -0
- package/recce-source/js/src/components/lineage/SetupConnectionBanner.tsx +52 -0
- package/recce-source/js/src/components/lineage/SingleEnvironmentQueryView.tsx +152 -0
- package/recce-source/js/src/components/lineage/graph.test.ts +31 -0
- package/recce-source/js/src/components/lineage/graph.ts +58 -0
- package/recce-source/js/src/components/lineage/lineage.test.ts +169 -0
- package/recce-source/js/src/components/lineage/lineage.ts +521 -0
- package/recce-source/js/src/components/lineage/styles.css +42 -0
- package/recce-source/js/src/components/lineage/styles.tsx +165 -0
- package/recce-source/js/src/components/lineage/useMultiNodesAction.ts +352 -0
- package/recce-source/js/src/components/lineage/useValueDiffAlertDialog.tsx +108 -0
- package/recce-source/js/src/components/onboarding-guide/Notification.tsx +62 -0
- package/recce-source/js/src/components/profile/ProfileDiffForm.tsx +134 -0
- package/recce-source/js/src/components/profile/ProfileDiffResultView.tsx +245 -0
- package/recce-source/js/src/components/query/ChangedOnlyCheckbox.tsx +29 -0
- package/recce-source/js/src/components/query/DiffText.tsx +120 -0
- package/recce-source/js/src/components/query/QueryDiffResultView.tsx +470 -0
- package/recce-source/js/src/components/query/QueryForm.tsx +80 -0
- package/recce-source/js/src/components/query/QueryPage.tsx +282 -0
- package/recce-source/js/src/components/query/QueryResultView.tsx +180 -0
- package/recce-source/js/src/components/query/SetupConnectionGuide.tsx +57 -0
- package/recce-source/js/src/components/query/SqlEditor.tsx +245 -0
- package/recce-source/js/src/components/query/ToggleSwitch.tsx +84 -0
- package/recce-source/js/src/components/query/styles.css +21 -0
- package/recce-source/js/src/components/routing/DirectUrlAccess.test.tsx +428 -0
- package/recce-source/js/src/components/routing/LineageStatePreservation.test.tsx +311 -0
- package/recce-source/js/src/components/routing/Navigation.test.tsx +256 -0
- package/recce-source/js/src/components/rowcount/RowCountDiffResultView.tsx +109 -0
- package/recce-source/js/src/components/rowcount/delta.ts +11 -0
- package/recce-source/js/src/components/run/RunList.tsx +303 -0
- package/recce-source/js/src/components/run/RunModal.tsx +191 -0
- package/recce-source/js/src/components/run/RunPage.tsx +26 -0
- package/recce-source/js/src/components/run/RunResultPane.tsx +454 -0
- package/recce-source/js/src/components/run/RunStatusAndDate.tsx +106 -0
- package/recce-source/js/src/components/run/RunToolbar.tsx +70 -0
- package/recce-source/js/src/components/run/RunView.tsx +196 -0
- package/recce-source/js/src/components/run/registry.ts +214 -0
- package/recce-source/js/src/components/run/types.ts +14 -0
- package/recce-source/js/src/components/schema/ColumnNameCell.test.tsx +169 -0
- package/recce-source/js/src/components/schema/ColumnNameCell.tsx +198 -0
- package/recce-source/js/src/components/schema/SchemaView.tsx +337 -0
- package/recce-source/js/src/components/schema/schemaDiff.ts +32 -0
- package/recce-source/js/src/components/schema/style.css +134 -0
- package/recce-source/js/src/components/screenshot/ScreenshotBox.tsx +39 -0
- package/recce-source/js/src/components/shared/HistoryToggle.tsx +35 -0
- package/recce-source/js/src/components/split/Split.tsx +40 -0
- package/recce-source/js/src/components/split/styles.css +24 -0
- package/recce-source/js/src/components/summary/ChangeSummary.tsx +264 -0
- package/recce-source/js/src/components/summary/SchemaSummary.tsx +123 -0
- package/recce-source/js/src/components/summary/SummaryView.tsx +29 -0
- package/recce-source/js/src/components/timeout/IdleTimeoutBadge.tsx +48 -0
- package/recce-source/js/src/components/top-k/TopKDiffForm.tsx +58 -0
- package/recce-source/js/src/components/top-k/TopKDiffResultView.tsx +73 -0
- package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnGroupHeader.tsx +228 -0
- package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnHeader.tsx +113 -0
- package/recce-source/js/src/components/ui/dataGrid/defaultRenderCell.tsx +72 -0
- package/recce-source/js/src/components/ui/dataGrid/index.ts +23 -0
- package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.test.tsx +607 -0
- package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.tsx +211 -0
- package/recce-source/js/src/components/ui/dataGrid/schemaCells.test.tsx +452 -0
- package/recce-source/js/src/components/ui/dataGrid/schemaCells.tsx +142 -0
- package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.test.tsx +178 -0
- package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.tsx +275 -0
- package/recce-source/js/src/components/ui/markdown/ExternalLinkConfirmDialog.tsx +134 -0
- package/recce-source/js/src/components/ui/markdown/MarkdownContent.tsx +364 -0
- package/recce-source/js/src/components/ui/mui/index.ts +13 -0
- package/recce-source/js/src/components/ui/mui-provider.tsx +67 -0
- package/recce-source/js/src/components/ui/mui-theme.ts +1039 -0
- package/recce-source/js/src/components/ui/mui-utils.ts +113 -0
- package/recce-source/js/src/components/ui/toaster.tsx +288 -0
- package/recce-source/js/src/components/valuediff/ValueDiffDetailResultView.tsx +217 -0
- package/recce-source/js/src/components/valuediff/ValueDiffForm.tsx +246 -0
- package/recce-source/js/src/components/valuediff/ValueDiffResultView.tsx +82 -0
- package/recce-source/js/src/components/valuediff/shared.ts +33 -0
- package/recce-source/js/src/constants/tooltipMessage.ts +3 -0
- package/recce-source/js/src/constants/urls.ts +1 -0
- package/recce-source/js/src/lib/UrlHash.ts +12 -0
- package/recce-source/js/src/lib/api/adhocQuery.ts +70 -0
- package/recce-source/js/src/lib/api/axiosClient.ts +9 -0
- package/recce-source/js/src/lib/api/cacheKeys.ts +13 -0
- package/recce-source/js/src/lib/api/checkEvents.ts +252 -0
- package/recce-source/js/src/lib/api/checks.ts +129 -0
- package/recce-source/js/src/lib/api/cll.ts +53 -0
- package/recce-source/js/src/lib/api/connectToCloud.ts +13 -0
- package/recce-source/js/src/lib/api/flag.ts +37 -0
- package/recce-source/js/src/lib/api/info.ts +198 -0
- package/recce-source/js/src/lib/api/instanceInfo.ts +25 -0
- package/recce-source/js/src/lib/api/keepAlive.ts +108 -0
- package/recce-source/js/src/lib/api/lineagecheck.ts +35 -0
- package/recce-source/js/src/lib/api/localStorageKeys.ts +7 -0
- package/recce-source/js/src/lib/api/models.ts +59 -0
- package/recce-source/js/src/lib/api/profile.ts +65 -0
- package/recce-source/js/src/lib/api/rowcount.ts +19 -0
- package/recce-source/js/src/lib/api/runs.ts +174 -0
- package/recce-source/js/src/lib/api/schemacheck.ts +31 -0
- package/recce-source/js/src/lib/api/select.ts +25 -0
- package/recce-source/js/src/lib/api/sessionStorageKeys.ts +8 -0
- package/recce-source/js/src/lib/api/state.ts +117 -0
- package/recce-source/js/src/lib/api/track.ts +281 -0
- package/recce-source/js/src/lib/api/types.ts +284 -0
- package/recce-source/js/src/lib/api/user.ts +42 -0
- package/recce-source/js/src/lib/api/valuediff.ts +46 -0
- package/recce-source/js/src/lib/api/version.ts +40 -0
- package/recce-source/js/src/lib/const.ts +9 -0
- package/recce-source/js/src/lib/dataGrid/crossFunctionConsistency.test.ts +626 -0
- package/recce-source/js/src/lib/dataGrid/dataGridFactory.test.ts +2140 -0
- package/recce-source/js/src/lib/dataGrid/dataGridFactory.ts +397 -0
- package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.test.ts +132 -0
- package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.ts +126 -0
- package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.test.ts +1627 -0
- package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.ts +140 -0
- package/recce-source/js/src/lib/dataGrid/generators/toDataGrid.ts +67 -0
- package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.test.ts +142 -0
- package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.ts +71 -0
- package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.test.ts +258 -0
- package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.ts +153 -0
- package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.test.ts +951 -0
- package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.ts +221 -0
- package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.test.ts +395 -0
- package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.ts +184 -0
- package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.test.ts +884 -0
- package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.ts +113 -0
- package/recce-source/js/src/lib/dataGrid/index.ts +51 -0
- package/recce-source/js/src/lib/dataGrid/propertyBased.test.ts +858 -0
- package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.test.ts +482 -0
- package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.ts +345 -0
- package/recce-source/js/src/lib/dataGrid/shared/dataTypeEdgeCases.test.ts +698 -0
- package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.test.tsx +820 -0
- package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.tsx +277 -0
- package/recce-source/js/src/lib/dataGrid/shared/gridUtils.test.ts +785 -0
- package/recce-source/js/src/lib/dataGrid/shared/gridUtils.ts +370 -0
- package/recce-source/js/src/lib/dataGrid/shared/index.ts +81 -0
- package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.test.ts +909 -0
- package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.ts +325 -0
- package/recce-source/js/src/lib/dataGrid/shared/simpleColumnBuilder.tsx +240 -0
- package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.test.tsx +719 -0
- package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.tsx +231 -0
- package/recce-source/js/src/lib/dataGrid/shared/validation.test.ts +559 -0
- package/recce-source/js/src/lib/dataGrid/shared/validation.ts +367 -0
- package/recce-source/js/src/lib/dataGrid/warehouseNamingConventions.test.ts +1117 -0
- package/recce-source/js/src/lib/formatSelect.ts +50 -0
- package/recce-source/js/src/lib/hooks/ApiConfigContext.tsx +181 -0
- package/recce-source/js/src/lib/hooks/IdleTimeoutContext.tsx +177 -0
- package/recce-source/js/src/lib/hooks/LineageGraphContext.tsx +512 -0
- package/recce-source/js/src/lib/hooks/RecceActionContext.tsx +269 -0
- package/recce-source/js/src/lib/hooks/RecceCheckContext.tsx +33 -0
- package/recce-source/js/src/lib/hooks/RecceContextProvider.tsx +54 -0
- package/recce-source/js/src/lib/hooks/RecceInstanceContext.tsx +129 -0
- package/recce-source/js/src/lib/hooks/RecceQueryContext.tsx +98 -0
- package/recce-source/js/src/lib/hooks/RecceShareStateContext.tsx +59 -0
- package/recce-source/js/src/lib/hooks/ScreenShot.tsx +399 -0
- package/recce-source/js/src/lib/hooks/useAppRouter.test.ts +211 -0
- package/recce-source/js/src/lib/hooks/useAppRouter.ts +200 -0
- package/recce-source/js/src/lib/hooks/useCheckEvents.ts +99 -0
- package/recce-source/js/src/lib/hooks/useCheckToast.tsx +14 -0
- package/recce-source/js/src/lib/hooks/useClipBoardToast.tsx +27 -0
- package/recce-source/js/src/lib/hooks/useCountdownToast.tsx +102 -0
- package/recce-source/js/src/lib/hooks/useFeedbackCollectionToast.tsx +130 -0
- package/recce-source/js/src/lib/hooks/useGuideToast.tsx +45 -0
- package/recce-source/js/src/lib/hooks/useIdleDetection.tsx +185 -0
- package/recce-source/js/src/lib/hooks/useModelColumns.tsx +113 -0
- package/recce-source/js/src/lib/hooks/useRecceInstanceInfo.tsx +13 -0
- package/recce-source/js/src/lib/hooks/useRecceServerFlag.tsx +13 -0
- package/recce-source/js/src/lib/hooks/useRun.tsx +89 -0
- package/recce-source/js/src/lib/hooks/useThemeColors.ts +115 -0
- package/recce-source/js/src/lib/mergeKeys.test.ts +89 -0
- package/recce-source/js/src/lib/mergeKeys.ts +86 -0
- package/recce-source/js/src/lib/result/ResultErrorFallback.tsx +9 -0
- package/recce-source/js/src/lib/utils/formatTime.ts +84 -0
- package/recce-source/js/src/lib/utils/urls.ts +16 -0
- package/recce-source/js/src/utils/DropdownValuesInput.tsx +297 -0
- package/recce-source/js/src/utils/formatters.tsx +237 -0
- package/recce-source/js/src/utils/transforms.ts +81 -0
- package/recce-source/js/tsconfig.json +47 -0
- package/recce-source/macros/README.md +8 -0
- package/recce-source/macros/recce_athena.sql +73 -0
- package/recce-source/pyproject.toml +109 -0
- package/recce-source/recce/VERSION +1 -0
- package/recce-source/recce/__init__.py +84 -0
- package/recce-source/recce/adapter/__init__.py +0 -0
- package/recce-source/recce/adapter/base.py +109 -0
- package/recce-source/recce/adapter/dbt_adapter/__init__.py +1699 -0
- package/recce-source/recce/adapter/dbt_adapter/dbt_version.py +42 -0
- package/recce-source/recce/adapter/sqlmesh_adapter.py +141 -0
- package/recce-source/recce/apis/__init__.py +0 -0
- package/recce-source/recce/apis/check_api.py +203 -0
- package/recce-source/recce/apis/check_events_api.py +353 -0
- package/recce-source/recce/apis/check_func.py +130 -0
- package/recce-source/recce/apis/run_api.py +130 -0
- package/recce-source/recce/apis/run_func.py +258 -0
- package/recce-source/recce/artifact.py +266 -0
- package/recce-source/recce/cli.py +1846 -0
- package/recce-source/recce/config.py +127 -0
- package/recce-source/recce/connect_to_cloud.py +138 -0
- package/recce-source/recce/core.py +334 -0
- package/recce-source/recce/diff.py +26 -0
- package/recce-source/recce/event/CONFIG +1 -0
- package/recce-source/recce/event/SENTRY_DNS +1 -0
- package/recce-source/recce/event/__init__.py +304 -0
- package/recce-source/recce/event/collector.py +184 -0
- package/recce-source/recce/event/track.py +158 -0
- package/recce-source/recce/exceptions.py +21 -0
- package/recce-source/recce/git.py +77 -0
- package/recce-source/recce/github.py +222 -0
- package/recce-source/recce/mcp_server.py +861 -0
- package/recce-source/recce/models/__init__.py +6 -0
- package/recce-source/recce/models/check.py +473 -0
- package/recce-source/recce/models/run.py +46 -0
- package/recce-source/recce/models/types.py +218 -0
- package/recce-source/recce/pull_request.py +124 -0
- package/recce-source/recce/run.py +390 -0
- package/recce-source/recce/server.py +877 -0
- package/recce-source/recce/state/__init__.py +31 -0
- package/recce-source/recce/state/cloud.py +644 -0
- package/recce-source/recce/state/const.py +26 -0
- package/recce-source/recce/state/local.py +56 -0
- package/recce-source/recce/state/state.py +119 -0
- package/recce-source/recce/state/state_loader.py +174 -0
- package/recce-source/recce/summary.py +575 -0
- package/recce-source/recce/tasks/__init__.py +23 -0
- package/recce-source/recce/tasks/core.py +134 -0
- package/recce-source/recce/tasks/dataframe.py +170 -0
- package/recce-source/recce/tasks/histogram.py +433 -0
- package/recce-source/recce/tasks/lineage.py +19 -0
- package/recce-source/recce/tasks/profile.py +298 -0
- package/recce-source/recce/tasks/query.py +450 -0
- package/recce-source/recce/tasks/rowcount.py +277 -0
- package/recce-source/recce/tasks/schema.py +65 -0
- package/recce-source/recce/tasks/top_k.py +172 -0
- package/recce-source/recce/tasks/utils.py +147 -0
- package/recce-source/recce/tasks/valuediff.py +497 -0
- package/recce-source/recce/util/__init__.py +4 -0
- package/recce-source/recce/util/api_token.py +80 -0
- package/recce-source/recce/util/breaking.py +330 -0
- package/recce-source/recce/util/cache.py +25 -0
- package/recce-source/recce/util/cll.py +355 -0
- package/recce-source/recce/util/cloud/__init__.py +15 -0
- package/recce-source/recce/util/cloud/base.py +115 -0
- package/recce-source/recce/util/cloud/check_events.py +190 -0
- package/recce-source/recce/util/cloud/checks.py +242 -0
- package/recce-source/recce/util/io.py +120 -0
- package/recce-source/recce/util/lineage.py +83 -0
- package/recce-source/recce/util/logger.py +25 -0
- package/recce-source/recce/util/onboarding_state.py +45 -0
- package/recce-source/recce/util/perf_tracking.py +85 -0
- package/recce-source/recce/util/pydantic_model.py +22 -0
- package/recce-source/recce/util/recce_cloud.py +454 -0
- package/recce-source/recce/util/singleton.py +18 -0
- package/recce-source/recce/util/startup_perf.py +121 -0
- package/recce-source/recce/yaml/__init__.py +58 -0
- package/recce-source/recce_cloud/README.md +780 -0
- package/recce-source/recce_cloud/VERSION +1 -0
- package/recce-source/recce_cloud/__init__.py +24 -0
- package/recce-source/recce_cloud/api/__init__.py +17 -0
- package/recce-source/recce_cloud/api/base.py +132 -0
- package/recce-source/recce_cloud/api/client.py +186 -0
- package/recce-source/recce_cloud/api/exceptions.py +26 -0
- package/recce-source/recce_cloud/api/factory.py +63 -0
- package/recce-source/recce_cloud/api/github.py +106 -0
- package/recce-source/recce_cloud/api/gitlab.py +111 -0
- package/recce-source/recce_cloud/artifact.py +57 -0
- package/recce-source/recce_cloud/ci_providers/__init__.py +9 -0
- package/recce-source/recce_cloud/ci_providers/base.py +82 -0
- package/recce-source/recce_cloud/ci_providers/detector.py +147 -0
- package/recce-source/recce_cloud/ci_providers/github_actions.py +136 -0
- package/recce-source/recce_cloud/ci_providers/gitlab_ci.py +130 -0
- package/recce-source/recce_cloud/cli.py +434 -0
- package/recce-source/recce_cloud/download.py +230 -0
- package/recce-source/recce_cloud/hatch_build.py +20 -0
- package/recce-source/recce_cloud/pyproject.toml +49 -0
- package/recce-source/recce_cloud/upload.py +214 -0
- package/recce-source/test.py +0 -0
- package/recce-source/tests/__init__.py +0 -0
- package/recce-source/tests/adapter/__init__.py +0 -0
- package/recce-source/tests/adapter/dbt_adapter/__init__.py +0 -0
- package/recce-source/tests/adapter/dbt_adapter/conftest.py +17 -0
- package/recce-source/tests/adapter/dbt_adapter/dbt_test_helper.py +298 -0
- package/recce-source/tests/adapter/dbt_adapter/test_dbt_adapter.py +25 -0
- package/recce-source/tests/adapter/dbt_adapter/test_dbt_cll.py +717 -0
- package/recce-source/tests/adapter/dbt_adapter/test_proj/dbt_project.yml +4 -0
- package/recce-source/tests/adapter/dbt_adapter/test_proj/manifest.json +1 -0
- package/recce-source/tests/adapter/dbt_adapter/test_proj/package-lock.yml +8 -0
- package/recce-source/tests/adapter/dbt_adapter/test_proj/packages.yml +7 -0
- package/recce-source/tests/adapter/dbt_adapter/test_proj/profiles.yml +6 -0
- package/recce-source/tests/adapter/dbt_adapter/test_selector.py +205 -0
- package/recce-source/tests/apis/__init__.py +0 -0
- package/recce-source/tests/apis/row_count_diff.json +59 -0
- package/recce-source/tests/apis/test_check_events_api.py +615 -0
- package/recce-source/tests/apis/test_run_func.py +433 -0
- package/recce-source/tests/catalog.json +527 -0
- package/recce-source/tests/data/manifest/base/catalog.json +1 -0
- package/recce-source/tests/data/manifest/base/manifest.json +1 -0
- package/recce-source/tests/data/manifest/pr2/catalog.json +1 -0
- package/recce-source/tests/data/manifest/pr2/manifest.json +1 -0
- package/recce-source/tests/manifest.json +10655 -0
- package/recce-source/tests/models/__init__.py +0 -0
- package/recce-source/tests/models/test_check.py +731 -0
- package/recce-source/tests/models/test_run_models.py +295 -0
- package/recce-source/tests/recce_cloud/__init__.py +0 -0
- package/recce-source/tests/recce_cloud/test_ci_providers.py +351 -0
- package/recce-source/tests/recce_cloud/test_cli.py +735 -0
- package/recce-source/tests/recce_cloud/test_client.py +379 -0
- package/recce-source/tests/recce_cloud/test_platform_clients.py +483 -0
- package/recce-source/tests/recce_state.json +1 -0
- package/recce-source/tests/state/test_cloud.py +719 -0
- package/recce-source/tests/state/test_local.py +164 -0
- package/recce-source/tests/state/test_state_loader.py +211 -0
- package/recce-source/tests/tasks/__init__.py +0 -0
- package/recce-source/tests/tasks/conftest.py +4 -0
- package/recce-source/tests/tasks/test_histogram.py +129 -0
- package/recce-source/tests/tasks/test_lineage.py +55 -0
- package/recce-source/tests/tasks/test_preset_checks.py +64 -0
- package/recce-source/tests/tasks/test_profile.py +397 -0
- package/recce-source/tests/tasks/test_query.py +528 -0
- package/recce-source/tests/tasks/test_row_count.py +133 -0
- package/recce-source/tests/tasks/test_schema.py +122 -0
- package/recce-source/tests/tasks/test_top_k.py +77 -0
- package/recce-source/tests/tasks/test_utils.py +439 -0
- package/recce-source/tests/tasks/test_valuediff.py +361 -0
- package/recce-source/tests/test_cli.py +236 -0
- package/recce-source/tests/test_cli_mcp_optional.py +45 -0
- package/recce-source/tests/test_cloud_listing_cli.py +324 -0
- package/recce-source/tests/test_config.py +43 -0
- package/recce-source/tests/test_connect_to_cloud.py +82 -0
- package/recce-source/tests/test_core.py +174 -0
- package/recce-source/tests/test_dbt.py +36 -0
- package/recce-source/tests/test_mcp_server.py +505 -0
- package/recce-source/tests/test_pull_request.py +130 -0
- package/recce-source/tests/test_server.py +202 -0
- package/recce-source/tests/test_server_lifespan.py +138 -0
- package/recce-source/tests/test_summary.py +73 -0
- package/recce-source/tests/util/__init__.py +0 -0
- package/recce-source/tests/util/cloud/__init__.py +0 -0
- package/recce-source/tests/util/cloud/test_check_events.py +255 -0
- package/recce-source/tests/util/cloud/test_checks.py +204 -0
- package/recce-source/tests/util/test_api_token.py +119 -0
- package/recce-source/tests/util/test_breaking.py +1427 -0
- package/recce-source/tests/util/test_cll.py +706 -0
- package/recce-source/tests/util/test_lineage.py +122 -0
- package/recce-source/tests/util/test_onboarding_state.py +84 -0
- package/recce-source/tests/util/test_recce_cloud.py +231 -0
- package/recce-source/tox.ini +40 -0
- package/recce-source/uv.lock +3928 -0
- package/src/api/index.ts +32 -0
- package/src/components/index.ts +154 -0
- package/src/global.d.ts +14 -0
- package/src/hooks/index.ts +56 -0
- package/src/index.ts +17 -0
- package/src/lib/hooks/RouteConfigContext.ts +139 -0
- package/src/lib/hooks/useAppRouter.ts +240 -0
- package/src/mui-augmentation.d.ts +139 -0
- package/src/theme/index.ts +13 -0
- package/src/theme.ts +23 -0
- package/src/types/index.ts +23 -0
- package/dist/index-BNUP2V_N.d.ts.map +0 -1
- package/dist/index-DOPZuhD8.d.mts.map +0 -1
- package/dist/theme.d.mts.map +0 -1
- package/dist/theme.d.ts.map +0 -1
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file rowBuilders.ts
|
|
3
|
+
* @description Shared row building utilities for diff grids
|
|
4
|
+
*
|
|
5
|
+
* Provides unified row generation logic for both querydiff (dual DataFrames)
|
|
6
|
+
* and valuediff (joined DataFrame with in_a/in_b) scenarios.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import _ from "lodash";
|
|
10
|
+
import { DataFrame, RowObjectType } from "@/lib/api/types";
|
|
11
|
+
import { mergeKeysWithStatus } from "@/lib/mergeKeys";
|
|
12
|
+
import { keyToNumber } from "@/utils/transforms";
|
|
13
|
+
import { ColumnMapEntry, MergeColumnMapEntry, RowStats } from "./gridUtils";
|
|
14
|
+
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Types
|
|
17
|
+
// ============================================================================
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Union type for column map entries (supports both querydiff and valuediff)
|
|
21
|
+
*/
|
|
22
|
+
export type DiffColumnMapEntry = ColumnMapEntry | MergeColumnMapEntry;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Type guard to check if entry is a MergeColumnMapEntry (has separate base/current keys)
|
|
26
|
+
*/
|
|
27
|
+
function isMergeColumnMapEntry(
|
|
28
|
+
entry: DiffColumnMapEntry,
|
|
29
|
+
): entry is MergeColumnMapEntry {
|
|
30
|
+
return "baseColumnKey" in entry && "currentColumnKey" in entry;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Configuration for building diff rows
|
|
35
|
+
*/
|
|
36
|
+
export interface BuildDiffRowsConfig {
|
|
37
|
+
/**
|
|
38
|
+
* Map of primary key values to base row data
|
|
39
|
+
* Keys should already be normalized (e.g., lowercased if case-insensitive)
|
|
40
|
+
*/
|
|
41
|
+
baseMap: Record<string, RowObjectType | undefined>;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Map of primary key values to current row data
|
|
45
|
+
* Keys should already be normalized (e.g., lowercased if case-insensitive)
|
|
46
|
+
*/
|
|
47
|
+
currentMap: Record<string, RowObjectType | undefined>;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Column definitions for base data
|
|
51
|
+
* Used to iterate and extract values from base rows
|
|
52
|
+
*/
|
|
53
|
+
baseColumns: DataFrame["columns"];
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Column definitions for current data
|
|
57
|
+
* Used to iterate and extract values from current rows
|
|
58
|
+
* For joined data (valuediff), this is the same as baseColumns
|
|
59
|
+
*/
|
|
60
|
+
currentColumns: DataFrame["columns"];
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Column map for tracking column metadata and status
|
|
64
|
+
* This object WILL BE MUTATED to update column.status when modifications are detected
|
|
65
|
+
*/
|
|
66
|
+
columnMap: Record<string, DiffColumnMapEntry>;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* List of primary key column names
|
|
70
|
+
* These columns are stored directly on the row (not prefixed with base__/current__)
|
|
71
|
+
*/
|
|
72
|
+
primaryKeys: string[];
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Whether to filter out unchanged rows
|
|
76
|
+
* When true, only rows with status "added", "removed", or "modified" are returned
|
|
77
|
+
*/
|
|
78
|
+
changedOnly?: boolean;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Result from building diff rows
|
|
83
|
+
*/
|
|
84
|
+
export interface BuildDiffRowsResult {
|
|
85
|
+
/** The generated rows with __status and prefixed column values */
|
|
86
|
+
rows: RowObjectType[];
|
|
87
|
+
|
|
88
|
+
/** Statistics about row changes */
|
|
89
|
+
rowStats: RowStats;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// ============================================================================
|
|
93
|
+
// Helper Functions
|
|
94
|
+
// ============================================================================
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Checks if a column name is a primary key (exact matching)
|
|
98
|
+
*/
|
|
99
|
+
function isPrimaryKey(columnName: string, primaryKeys: string[]): boolean {
|
|
100
|
+
return primaryKeys.includes(columnName);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Gets the column key to use for value comparison
|
|
105
|
+
* For MergeColumnMapEntry, uses baseColumnKey/currentColumnKey
|
|
106
|
+
* For ColumnMapEntry, uses the single key
|
|
107
|
+
*/
|
|
108
|
+
function getComparisonKeys(entry: DiffColumnMapEntry): {
|
|
109
|
+
baseKey: string;
|
|
110
|
+
currentKey: string;
|
|
111
|
+
} {
|
|
112
|
+
if (isMergeColumnMapEntry(entry)) {
|
|
113
|
+
return {
|
|
114
|
+
baseKey: entry.baseColumnKey,
|
|
115
|
+
currentKey: entry.currentColumnKey,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
baseKey: entry.key,
|
|
120
|
+
currentKey: entry.key,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Populates row values from a source row for the given columns
|
|
126
|
+
*
|
|
127
|
+
* @param targetRow - The row object to populate
|
|
128
|
+
* @param sourceRow - The source row to extract values from
|
|
129
|
+
* @param columns - Column definitions to iterate
|
|
130
|
+
* @param prefix - Prefix to add to column keys (e.g., "base__" or "current__")
|
|
131
|
+
* @param primaryKeys - Primary key column names (stored without prefix)
|
|
132
|
+
*/
|
|
133
|
+
function populateRowValues(
|
|
134
|
+
targetRow: RowObjectType,
|
|
135
|
+
sourceRow: RowObjectType,
|
|
136
|
+
columns: DataFrame["columns"],
|
|
137
|
+
prefix: string,
|
|
138
|
+
primaryKeys: string[],
|
|
139
|
+
): void {
|
|
140
|
+
columns.forEach((col) => {
|
|
141
|
+
const colKey = col.key;
|
|
142
|
+
const isPK = isPrimaryKey(colKey, primaryKeys);
|
|
143
|
+
|
|
144
|
+
if (isPK) {
|
|
145
|
+
// Primary keys stored directly (not prefixed)
|
|
146
|
+
targetRow[String(colKey).toLowerCase()] = sourceRow[colKey];
|
|
147
|
+
} else {
|
|
148
|
+
// Non-PK columns are prefixed
|
|
149
|
+
targetRow[`${prefix}${colKey}`.toLowerCase()] = sourceRow[colKey];
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Detects if a row has been modified by comparing base and current values
|
|
156
|
+
* Also mutates columnMap entries to mark modified columns
|
|
157
|
+
*
|
|
158
|
+
* @returns true if any non-PK column value differs
|
|
159
|
+
*/
|
|
160
|
+
function detectModifications(
|
|
161
|
+
baseRow: RowObjectType,
|
|
162
|
+
currentRow: RowObjectType,
|
|
163
|
+
columnMap: Record<string, DiffColumnMapEntry>,
|
|
164
|
+
primaryKeys: string[],
|
|
165
|
+
): boolean {
|
|
166
|
+
let isModified = false;
|
|
167
|
+
|
|
168
|
+
for (const [name, column] of Object.entries(columnMap)) {
|
|
169
|
+
// Skip index column
|
|
170
|
+
if (name === "index") continue;
|
|
171
|
+
|
|
172
|
+
// Skip primary key columns
|
|
173
|
+
if (isPrimaryKey(name, primaryKeys)) continue;
|
|
174
|
+
|
|
175
|
+
const { baseKey, currentKey } = getComparisonKeys(column);
|
|
176
|
+
|
|
177
|
+
// Skip if either key is unknown (column added/removed in schema)
|
|
178
|
+
if (baseKey === "unknown" || currentKey === "unknown") continue;
|
|
179
|
+
|
|
180
|
+
const baseValue = baseRow[baseKey];
|
|
181
|
+
const currentValue = currentRow[currentKey];
|
|
182
|
+
|
|
183
|
+
if (!_.isEqual(baseValue, currentValue)) {
|
|
184
|
+
isModified = true;
|
|
185
|
+
// Mutate column status to track which columns have modifications
|
|
186
|
+
column.status = "modified";
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return isModified;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// ============================================================================
|
|
194
|
+
// Main Function
|
|
195
|
+
// ============================================================================
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Builds diff rows from base and current row maps
|
|
199
|
+
*
|
|
200
|
+
* @description This function unifies the row generation logic from both
|
|
201
|
+
* `toDataDiffGrid` (querydiff) and `toValueDiffGrid` (valuediff).
|
|
202
|
+
*
|
|
203
|
+
* Key behaviors:
|
|
204
|
+
* - Merges base and current row keys to determine all unique rows
|
|
205
|
+
* - Creates row objects with `_index` and `__status` fields
|
|
206
|
+
* - Prefixes non-PK columns with `base__` or `current__` (lowercased)
|
|
207
|
+
* - Stores PK columns directly without prefix
|
|
208
|
+
* - Detects added/removed/modified status
|
|
209
|
+
* - Mutates columnMap to mark modified columns
|
|
210
|
+
* - Optionally filters to changed rows only
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* ```typescript
|
|
214
|
+
* // For querydiff (two separate DataFrames)
|
|
215
|
+
* const result = buildDiffRows({
|
|
216
|
+
* baseMap,
|
|
217
|
+
* currentMap,
|
|
218
|
+
* baseColumns: base.columns,
|
|
219
|
+
* currentColumns: current.columns,
|
|
220
|
+
* columnMap: mergedColumnMap,
|
|
221
|
+
* primaryKeys: ["id"],
|
|
222
|
+
* changedOnly: false,
|
|
223
|
+
* });
|
|
224
|
+
*
|
|
225
|
+
* // For valuediff (joined DataFrame)
|
|
226
|
+
* const result = buildDiffRows({
|
|
227
|
+
* baseMap,
|
|
228
|
+
* currentMap,
|
|
229
|
+
* baseColumns: df.columns,
|
|
230
|
+
* currentColumns: df.columns, // Same columns for both
|
|
231
|
+
* columnMap: joinedColumnMap,
|
|
232
|
+
* primaryKeys: ["id"],
|
|
233
|
+
* changedOnly: true,
|
|
234
|
+
* });
|
|
235
|
+
* ```
|
|
236
|
+
*/
|
|
237
|
+
export function buildDiffRows(
|
|
238
|
+
config: BuildDiffRowsConfig,
|
|
239
|
+
): BuildDiffRowsResult {
|
|
240
|
+
const {
|
|
241
|
+
baseMap,
|
|
242
|
+
currentMap,
|
|
243
|
+
baseColumns,
|
|
244
|
+
currentColumns,
|
|
245
|
+
columnMap,
|
|
246
|
+
primaryKeys,
|
|
247
|
+
changedOnly = false,
|
|
248
|
+
} = config;
|
|
249
|
+
|
|
250
|
+
// Merge base and current keys to get all unique row identifiers
|
|
251
|
+
const mergedMap = mergeKeysWithStatus(
|
|
252
|
+
Object.keys(baseMap),
|
|
253
|
+
Object.keys(currentMap),
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
const rowStats: RowStats = {
|
|
257
|
+
added: 0,
|
|
258
|
+
removed: 0,
|
|
259
|
+
modified: 0,
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
// Build rows from merged keys
|
|
263
|
+
let rows = Object.entries(mergedMap).map(([key]) => {
|
|
264
|
+
const baseRow = baseMap[key];
|
|
265
|
+
const currentRow = currentMap[key];
|
|
266
|
+
|
|
267
|
+
// Initialize row with index and undefined status
|
|
268
|
+
const row: RowObjectType = {
|
|
269
|
+
_index: keyToNumber(key),
|
|
270
|
+
__status: undefined,
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
// Populate base values
|
|
274
|
+
if (baseRow) {
|
|
275
|
+
populateRowValues(row, baseRow, baseColumns, "base__", primaryKeys);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Populate current values
|
|
279
|
+
if (currentRow) {
|
|
280
|
+
populateRowValues(
|
|
281
|
+
row,
|
|
282
|
+
currentRow,
|
|
283
|
+
currentColumns,
|
|
284
|
+
"current__",
|
|
285
|
+
primaryKeys,
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Determine row status
|
|
290
|
+
if (!baseRow) {
|
|
291
|
+
row.__status = "added";
|
|
292
|
+
rowStats.added++;
|
|
293
|
+
} else if (!currentRow) {
|
|
294
|
+
row.__status = "removed";
|
|
295
|
+
rowStats.removed++;
|
|
296
|
+
} else {
|
|
297
|
+
// Both rows exist - check for modifications
|
|
298
|
+
const isModified = detectModifications(
|
|
299
|
+
baseRow,
|
|
300
|
+
currentRow,
|
|
301
|
+
columnMap,
|
|
302
|
+
primaryKeys,
|
|
303
|
+
);
|
|
304
|
+
|
|
305
|
+
if (isModified) {
|
|
306
|
+
row.__status = "modified";
|
|
307
|
+
rowStats.modified++;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
return row;
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
// Filter to changed rows if requested
|
|
315
|
+
if (changedOnly) {
|
|
316
|
+
rows = rows.filter(
|
|
317
|
+
(row) =>
|
|
318
|
+
row.__status === "added" ||
|
|
319
|
+
row.__status === "removed" ||
|
|
320
|
+
row.__status === "modified",
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return { rows, rowStats };
|
|
325
|
+
}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file simpleColumnBuilder.tsx
|
|
3
|
+
* @description Builds AG Grid column definitions for simple (non-diff) grids
|
|
4
|
+
*
|
|
5
|
+
* This module transforms the pure data structures from columnBuilders.ts
|
|
6
|
+
* into actual column definitions with React components for headers.
|
|
7
|
+
*
|
|
8
|
+
* Unlike diffColumnBuilder.tsx, this handles simple grids without:
|
|
9
|
+
* - Base/current value comparison
|
|
10
|
+
* - Inline vs side-by-side display modes
|
|
11
|
+
* - Column status (added/removed/modified)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { ColDef, ColGroupDef } from "ag-grid-community";
|
|
15
|
+
import {
|
|
16
|
+
DataFrameColumnGroupHeader,
|
|
17
|
+
DataFrameColumnHeader,
|
|
18
|
+
defaultRenderCell,
|
|
19
|
+
} from "@/components/ui/dataGrid";
|
|
20
|
+
import { ColumnRenderMode, ColumnType, RowObjectType } from "@/lib/api/types";
|
|
21
|
+
import { ColumnConfig } from "./columnBuilders";
|
|
22
|
+
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Types
|
|
25
|
+
// ============================================================================
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Custom context data for Recce columns
|
|
29
|
+
* Stored in colDef.context to avoid AG Grid validation warnings
|
|
30
|
+
*/
|
|
31
|
+
export interface RecceColumnContext {
|
|
32
|
+
columnType?: ColumnType;
|
|
33
|
+
columnRenderMode?: ColumnRenderMode;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Extended column type with context metadata
|
|
38
|
+
* Uses context property for custom data per AG Grid best practices
|
|
39
|
+
* Note: Distributed form allows TypeScript to narrow types correctly
|
|
40
|
+
*/
|
|
41
|
+
export type SimpleColumnDefinition =
|
|
42
|
+
| (ColDef<RowObjectType> & { context?: RecceColumnContext })
|
|
43
|
+
| (ColGroupDef<RowObjectType> & { context?: RecceColumnContext });
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Configuration for building simple column definitions
|
|
47
|
+
*/
|
|
48
|
+
export interface BuildSimpleColumnDefinitionsConfig {
|
|
49
|
+
/**
|
|
50
|
+
* Column configurations from getSimpleDisplayColumns()
|
|
51
|
+
*/
|
|
52
|
+
columns: ColumnConfig[];
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Props to pass to column headers
|
|
56
|
+
*/
|
|
57
|
+
headerProps: {
|
|
58
|
+
pinnedColumns?: string[];
|
|
59
|
+
onPinnedColumnsChange?: (pinnedColumns: string[]) => void;
|
|
60
|
+
onColumnsRenderModeChanged?: (
|
|
61
|
+
cols: Record<string, ColumnRenderMode>,
|
|
62
|
+
) => void;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Whether to add index column when no primary keys exist
|
|
67
|
+
* Only applies when columns array has no isPrimaryKey entries
|
|
68
|
+
* @default true
|
|
69
|
+
*/
|
|
70
|
+
allowIndexFallback?: boolean;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Result from building simple column definitions
|
|
75
|
+
*/
|
|
76
|
+
export interface BuildSimpleColumnDefinitionsResult {
|
|
77
|
+
/**
|
|
78
|
+
* The generated column definitions ready for AG Grid
|
|
79
|
+
*/
|
|
80
|
+
columns: SimpleColumnDefinition[];
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Whether an index fallback column was added
|
|
84
|
+
*/
|
|
85
|
+
usedIndexFallback: boolean;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// ============================================================================
|
|
89
|
+
// Helper Functions
|
|
90
|
+
// ============================================================================
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Creates the index fallback column used when no primary keys are specified
|
|
94
|
+
*/
|
|
95
|
+
function createIndexColumn(): SimpleColumnDefinition {
|
|
96
|
+
return {
|
|
97
|
+
field: "_index",
|
|
98
|
+
headerName: "",
|
|
99
|
+
width: 50,
|
|
100
|
+
cellClass: "index-column",
|
|
101
|
+
resizable: false,
|
|
102
|
+
pinned: "left",
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Creates a primary key column definition
|
|
108
|
+
*
|
|
109
|
+
* Primary key columns are:
|
|
110
|
+
* - Pinned left (sticky left)
|
|
111
|
+
* - Use DataFrameColumnGroupHeader (with columnStatus="")
|
|
112
|
+
* - Use defaultRenderCell
|
|
113
|
+
*/
|
|
114
|
+
function createPrimaryKeyColumn(
|
|
115
|
+
config: ColumnConfig,
|
|
116
|
+
headerProps: BuildSimpleColumnDefinitionsConfig["headerProps"],
|
|
117
|
+
): SimpleColumnDefinition {
|
|
118
|
+
const { key, name, columnType, columnRenderMode } = config;
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
field: key,
|
|
122
|
+
headerName: name,
|
|
123
|
+
headerComponent: () => (
|
|
124
|
+
<DataFrameColumnGroupHeader
|
|
125
|
+
name={name}
|
|
126
|
+
columnStatus=""
|
|
127
|
+
columnType={columnType}
|
|
128
|
+
pinnedColumns={headerProps.pinnedColumns}
|
|
129
|
+
onPinnedColumnsChange={headerProps.onPinnedColumnsChange}
|
|
130
|
+
onColumnsRenderModeChanged={headerProps.onColumnsRenderModeChanged}
|
|
131
|
+
/>
|
|
132
|
+
),
|
|
133
|
+
pinned: "left",
|
|
134
|
+
cellRenderer: defaultRenderCell,
|
|
135
|
+
context: { columnType, columnRenderMode },
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Creates a regular (non-PK) column definition
|
|
141
|
+
*
|
|
142
|
+
* Regular columns use DataFrameColumnHeader (simpler, no PK toggle)
|
|
143
|
+
*/
|
|
144
|
+
function createRegularColumn(
|
|
145
|
+
config: ColumnConfig,
|
|
146
|
+
headerProps: BuildSimpleColumnDefinitionsConfig["headerProps"],
|
|
147
|
+
): SimpleColumnDefinition {
|
|
148
|
+
const { key, name, columnType, columnRenderMode } = config;
|
|
149
|
+
|
|
150
|
+
return {
|
|
151
|
+
field: key,
|
|
152
|
+
headerName: name,
|
|
153
|
+
headerComponent: () => (
|
|
154
|
+
<DataFrameColumnHeader
|
|
155
|
+
name={name}
|
|
156
|
+
columnType={columnType}
|
|
157
|
+
pinnedColumns={headerProps.pinnedColumns}
|
|
158
|
+
onPinnedColumnsChange={headerProps.onPinnedColumnsChange}
|
|
159
|
+
onColumnsRenderModeChanged={headerProps.onColumnsRenderModeChanged}
|
|
160
|
+
/>
|
|
161
|
+
),
|
|
162
|
+
cellRenderer: defaultRenderCell,
|
|
163
|
+
context: { columnType, columnRenderMode },
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// ============================================================================
|
|
168
|
+
// Main Function
|
|
169
|
+
// ============================================================================
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Builds AG Grid column definitions from ColumnConfig array
|
|
173
|
+
*
|
|
174
|
+
* @description Transforms pure column configuration objects into actual
|
|
175
|
+
* column definitions with React JSX headers. Handles:
|
|
176
|
+
*
|
|
177
|
+
* - Primary key columns (pinned, use DataFrameColumnGroupHeader)
|
|
178
|
+
* - Regular columns (use DataFrameColumnHeader)
|
|
179
|
+
* - Index fallback (when no PKs and allowIndexFallback is true)
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```tsx
|
|
183
|
+
* // Get column configs from shared utility
|
|
184
|
+
* const columnConfigs = getSimpleDisplayColumns({
|
|
185
|
+
* columnMap,
|
|
186
|
+
* primaryKeys,
|
|
187
|
+
* pinnedColumns,
|
|
188
|
+
* columnsRenderMode,
|
|
189
|
+
* });
|
|
190
|
+
*
|
|
191
|
+
* // Build actual column definitions
|
|
192
|
+
* const { columns } = buildSimpleColumnDefinitions({
|
|
193
|
+
* columns: columnConfigs,
|
|
194
|
+
* headerProps: {
|
|
195
|
+
* pinnedColumns,
|
|
196
|
+
* onPinnedColumnsChange,
|
|
197
|
+
* onColumnsRenderModeChanged,
|
|
198
|
+
* },
|
|
199
|
+
* });
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
export function buildSimpleColumnDefinitions(
|
|
203
|
+
config: BuildSimpleColumnDefinitionsConfig,
|
|
204
|
+
): BuildSimpleColumnDefinitionsResult {
|
|
205
|
+
const {
|
|
206
|
+
columns: columnConfigs,
|
|
207
|
+
headerProps,
|
|
208
|
+
allowIndexFallback = true,
|
|
209
|
+
} = config;
|
|
210
|
+
|
|
211
|
+
const columns: SimpleColumnDefinition[] = [];
|
|
212
|
+
let usedIndexFallback = false;
|
|
213
|
+
|
|
214
|
+
// Check if we have any primary key columns
|
|
215
|
+
const hasPrimaryKeys = columnConfigs.some((col) => col.isPrimaryKey);
|
|
216
|
+
|
|
217
|
+
// Add index fallback if no PKs and allowed
|
|
218
|
+
if (!hasPrimaryKeys && allowIndexFallback) {
|
|
219
|
+
columns.push(createIndexColumn());
|
|
220
|
+
usedIndexFallback = true;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Build column definitions
|
|
224
|
+
for (const colConfig of columnConfigs) {
|
|
225
|
+
if (colConfig.isPrimaryKey) {
|
|
226
|
+
columns.push(createPrimaryKeyColumn(colConfig, headerProps));
|
|
227
|
+
} else {
|
|
228
|
+
const regularColumn = createRegularColumn(colConfig, headerProps);
|
|
229
|
+
|
|
230
|
+
// Set pinned property - "left" for frozen columns, undefined to explicitly unpin
|
|
231
|
+
// Setting undefined is important to override AG Grid's internal pinned state
|
|
232
|
+
columns.push({
|
|
233
|
+
...regularColumn,
|
|
234
|
+
pinned: colConfig.frozen ? "left" : undefined,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return { columns, usedIndexFallback };
|
|
240
|
+
}
|