From c3c61909c0e82e7abb970e47481578ea4047d09b Mon Sep 17 00:00:00 2001 From: Will Yuponce Date: Tue, 17 Feb 2026 16:27:43 -0500 Subject: [PATCH 1/2] ci: add frontend build check to catch broken builds Recent code was committed that broke the UI because vite build was never run in CI. This adds a parallel frontend-build job that runs `yarn build` to verify the frontend compiles successfully. Co-authored-by: Cursor --- .github/workflows/test-coverage.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/test-coverage.yml b/.github/workflows/test-coverage.yml index 62a9c35c..cf457b14 100644 --- a/.github/workflows/test-coverage.yml +++ b/.github/workflows/test-coverage.yml @@ -183,6 +183,30 @@ jobs: working-directory: ./src/frontend run: yarn type-check + frontend-build: + name: Frontend Build Check + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: '24' + cache: 'yarn' + cache-dependency-path: './src/frontend/yarn.lock' + + - name: Install dependencies + working-directory: ./src/frontend + run: yarn install --frozen-lockfile + + - name: Build frontend + working-directory: ./src/frontend + run: yarn build + coverage-report: name: Coverage Report runs-on: ubuntu-latest From de747f47e5fe9c9d6825beeee0037b8e72e7ba45 Mon Sep 17 00:00:00 2001 From: Will Yuponce Date: Tue, 17 Feb 2026 16:32:49 -0500 Subject: [PATCH 2/2] fix(frontend): resolve TypeScript errors breaking vite build - Remove redundant string literal comparisons in uc-asset-lookup-dialog (enum values already match the strings, so TS narrowing flagged them) - Widen navigateToEntity param to EnrichedSemanticLink for entity_name access - Allow empty string in assignTargetType state union type Co-authored-by: Cursor --- .../data-contracts/uc-asset-lookup-dialog.tsx | 10 +++++----- src/frontend/src/components/search/concepts-search.tsx | 2 +- .../src/components/search/properties-search.tsx | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/frontend/src/components/data-contracts/uc-asset-lookup-dialog.tsx b/src/frontend/src/components/data-contracts/uc-asset-lookup-dialog.tsx index 936801da..33e81f27 100644 --- a/src/frontend/src/components/data-contracts/uc-asset-lookup-dialog.tsx +++ b/src/frontend/src/components/data-contracts/uc-asset-lookup-dialog.tsx @@ -393,9 +393,9 @@ export default function UCAssetLookupDialog({ } const parts = item.id.split('.') - const isCatalog = parts.length === 1 || item.type === UCAssetType.CATALOG || item.type === 'catalog' - const isSchema = parts.length === 2 || item.type === UCAssetType.SCHEMA || item.type === 'schema' - const isColumn = parts.length === 4 || item.type === UCAssetType.COLUMN || item.type === 'column' + const isCatalog = parts.length === 1 || item.type === UCAssetType.CATALOG + const isSchema = parts.length === 2 || item.type === UCAssetType.SCHEMA + const isColumn = parts.length === 4 || item.type === UCAssetType.COLUMN if (isCatalog) { const assetInfo: UCAssetInfo = { @@ -740,8 +740,8 @@ export default function UCAssetLookupDialog({ const currentSegment = segments[level] return nodes.filter((node) => { - const isColumn = node.type === UCAssetType.COLUMN || node.type === 'column' - const isCatalogOrSchema = node.type === UCAssetType.CATALOG || node.type === UCAssetType.SCHEMA || node.type === 'catalog' || node.type === 'schema' + const isColumn = node.type === UCAssetType.COLUMN + const isCatalogOrSchema = node.type === UCAssetType.CATALOG || node.type === UCAssetType.SCHEMA // When selectable via selectableTypes (e.g. catalog/schema), skip allowedTypes filter if (isNodeSelectable(node.type as UCAssetType) && !isColumn) { if (!isCatalogOrSchema) { diff --git a/src/frontend/src/components/search/concepts-search.tsx b/src/frontend/src/components/search/concepts-search.tsx index 934d1434..37dcab05 100644 --- a/src/frontend/src/components/search/concepts-search.tsx +++ b/src/frontend/src/components/search/concepts-search.tsx @@ -353,7 +353,7 @@ export default function ConceptsSearch({ }; // Navigate to entity detail page - const navigateToEntity = (link: SemanticLink) => { + const navigateToEntity = (link: EnrichedSemanticLink) => { let path = ''; switch (link.entity_type) { case 'data_product': diff --git a/src/frontend/src/components/search/properties-search.tsx b/src/frontend/src/components/search/properties-search.tsx index 2ed84e6c..9be68f31 100644 --- a/src/frontend/src/components/search/properties-search.tsx +++ b/src/frontend/src/components/search/properties-search.tsx @@ -60,7 +60,7 @@ export default function PropertiesSearch({ // Assign dialog: target type and selection const [assignDialogOpen, setAssignDialogOpen] = useState(false); - const [assignTargetType, setAssignTargetType] = useState<'data_contract_property' | 'uc_column'>(''); + const [assignTargetType, setAssignTargetType] = useState<'data_contract_property' | 'uc_column' | ''>(''); const [contracts, setContracts] = useState([]); const [selectedContractId, setSelectedContractId] = useState(''); const [selectedSchemaName, setSelectedSchemaName] = useState('');