Skip to content

Commit 2fa488d

Browse files
committed
chore(vscode): typing lineage and storybook
1 parent ac24736 commit 2fa488d

File tree

22 files changed

+2022
-173
lines changed

22 files changed

+2022
-173
lines changed

pnpm-lock.yaml

Lines changed: 765 additions & 53 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vscode/react/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,6 @@ node_modules
33
dist
44
dist-ssr
55
*.local
6+
7+
*storybook.log
8+
storybook-static

vscode/react/.storybook/main.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { StorybookConfig } from '@storybook/react-vite'
2+
3+
const config: StorybookConfig = {
4+
stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
5+
addons: [
6+
'@chromatic-com/storybook',
7+
'@storybook/addon-docs',
8+
'@storybook/addon-onboarding',
9+
'@storybook/addon-a11y',
10+
'@storybook/addon-vitest',
11+
],
12+
framework: {
13+
name: '@storybook/react-vite',
14+
options: {},
15+
},
16+
}
17+
export default config

vscode/react/.storybook/preview.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import type { Preview } from '@storybook/react-vite'
2+
import './storybook.css'
3+
4+
const preview: Preview = {
5+
parameters: {
6+
controls: {
7+
matchers: {
8+
color: /(background|color)$/i,
9+
date: /Date$/i,
10+
},
11+
},
12+
13+
a11y: {
14+
// 'todo' - show a11y violations in the test UI only
15+
// 'error' - fail CI on a11y violations
16+
// 'off' - skip a11y checks entirely
17+
test: 'todo',
18+
},
19+
},
20+
}
21+
22+
export default preview

vscode/react/.storybook/storybook.css

Lines changed: 917 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import * as a11yAddonAnnotations from '@storybook/addon-a11y/preview'
2+
import { setProjectAnnotations } from '@storybook/react-vite'
3+
import * as projectAnnotations from './preview'
4+
5+
// This is an important step to apply the right configuration when testing your stories.
6+
// More info at: https://storybook.js.org/docs/api/portable-stories/portable-stories-vitest#setprojectannotations
7+
setProjectAnnotations([a11yAddonAnnotations, projectAnnotations])

vscode/react/package.json

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
"serve": "vite preview",
1111
"test": "vitest run",
1212
"generate:api": "orval --config ./orval.config.ts",
13-
"lint": "tsc --noEmit"
13+
"lint": "tsc --noEmit",
14+
"storybook": "storybook dev -p 6006",
15+
"build-storybook": "storybook build"
1416
},
1517
"dependencies": {
1618
"@headlessui/react": "^2.2.4",
@@ -35,15 +37,25 @@
3537
"vscode-uri": "^3.1.0"
3638
},
3739
"devDependencies": {
40+
"@chromatic-com/storybook": "^4.0.1",
41+
"@storybook/addon-a11y": "^9.0.15",
42+
"@storybook/addon-docs": "^9.0.15",
43+
"@storybook/addon-onboarding": "^9.0.15",
44+
"@storybook/addon-vitest": "^9.0.15",
45+
"@storybook/react-vite": "^9.0.15",
3846
"@testing-library/dom": "^10.4.0",
3947
"@testing-library/react": "^16.3.0",
4048
"@types/react": "^18.3.23",
4149
"@types/react-dom": "^18.3.7",
4250
"@vitejs/plugin-react": "^4.5.1",
4351
"jsdom": "^26.1.0",
52+
"storybook": "^9.0.15",
4453
"typescript": "^5.8.3",
4554
"vite": "^6.3.5",
4655
"vitest": "^3.2.3",
47-
"web-vitals": "^4.2.4"
56+
"web-vitals": "^4.2.4",
57+
"@vitest/browser": "3.2.3",
58+
"playwright": "^1.53.2",
59+
"@vitest/coverage-v8": "3.2.3"
4860
}
4961
}

vscode/react/src/components/graph/ModelColumns.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ import {
88
isFalse,
99
isNil,
1010
isNotNil,
11-
toID,
1211
truncate,
1312
} from '@/utils/index'
14-
import { EnumSide, type Side } from './types'
13+
import { EnumSide, toID, type Side } from './types'
1514
import { NoSymbolIcon } from '@heroicons/react/24/solid'
1615
import { ClockIcon, ExclamationCircleIcon } from '@heroicons/react/24/outline'
1716
import clsx from 'clsx'
@@ -31,8 +30,7 @@ import { useLineageFlow } from './context'
3130
import { useApiColumnLineage } from '@/api/index'
3231
import SourceList from '@/components/sourceList/SourceList'
3332
import type { Lineage } from '@/domain/lineage'
34-
import type { ModelName } from '@/domain/models'
35-
import type { Column } from '@/domain/column'
33+
import type { Column, ColumnName } from '@/domain/column'
3634

3735
export function ModelColumns({
3836
nodeId,
@@ -590,5 +588,5 @@ function getColumnFromLineage(
590588
nodeId: string,
591589
columnName: string,
592590
): LineageColumn | undefined {
593-
return lineage?.[nodeId]?.columns?.[encodeURI(columnName) as ModelName]
591+
return lineage?.[nodeId]?.columns?.[columnName as ColumnName]
594592
}

vscode/react/src/components/graph/ModelLineage.tsx

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,14 @@ import {
3535
import { Popover } from '@headlessui/react'
3636
import ModelLineageDetails from './ModelLineageDetails'
3737
import { Divider } from '@/components/divider/Divider'
38-
import { type ModelLineageApiLineageModelNameGet200 } from '@/api/client'
3938
import { SettingsControl } from '@/components/graph/SettingsControl'
39+
import {
40+
toModelLineage,
41+
type ModelLineage as ModelLineageType,
42+
} from '@/domain/lineage'
4043
import './Graph.css'
44+
import { toKeys } from './types'
45+
import { encode } from '@/domain/models'
4146

4247
const WITH_COLUMNS_LIMIT = 30
4348

@@ -81,7 +86,7 @@ export function ModelLineage({
8186

8287
const [isMergingModels, setIsMergingModels] = useState(false)
8388
const [modelLineage, setModelLineage] = useState<
84-
ModelLineageApiLineageModelNameGet200 | undefined
89+
ModelLineageType | undefined
8590
>(undefined)
8691

8792
useEffect(() => {
@@ -91,7 +96,7 @@ export function ModelLineage({
9196

9297
getModelLineage()
9398
.then(({ data }) => {
94-
setModelLineage(data)
99+
setModelLineage(data ? toModelLineage(data) : undefined)
95100
if (isNil(data)) return
96101

97102
setIsMergingModels(true)
@@ -129,13 +134,16 @@ export function ModelLineage({
129134
}, [model.name, model.hash])
130135

131136
useEffect(() => {
132-
Object.keys(modelLineage ?? {}).forEach(modelName => {
133-
modelName = encodeURI(modelName)
134-
135-
if (isFalse(modelName in models) && isFalse(modelName in unknownModels)) {
136-
unknownModels.add(modelName)
137+
const modelNames = toKeys(modelLineage ?? {})
138+
for (const modelName of modelNames) {
139+
const encodedModelName = encode(modelName)
140+
if (
141+
isFalse(encodedModelName in models) &&
142+
isFalse(encodedModelName in unknownModels)
143+
) {
144+
unknownModels.add(encodedModelName)
137145
}
138-
})
146+
}
139147

140148
setUnknownModels(new Set(unknownModels))
141149
}, [modelLineage, models])
@@ -329,6 +337,7 @@ function ModelColumnLineage(): JSX.Element {
329337

330338
setEdges(newEdges)
331339
setNodes(newNodes)
340+
console.log('newActiveNodes', newActiveNodes)
332341
setActiveNodes(newActiveNodes)
333342
}, [
334343
connections,

vscode/react/src/components/graph/ModelNode.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { Position, type NodeProps } from 'reactflow'
88
import { ModelNodeHeaderHandles } from './ModelNodeHeaderHandles'
99
import { ModelColumns } from './ModelColumns'
1010
import { fromAPIColumn, type Column } from '@/domain/column'
11+
import type { ModelEncodedFQN } from '@/domain/models'
1112

1213
export const EnumLineageNodeModelType = {
1314
...ModelType,
@@ -150,7 +151,7 @@ export default function ModelNode({
150151
const isActiveNode =
151152
selectedNodes.size > 0 || activeNodes.size > 0 || withConnected
152153
? isSelected ||
153-
activeNodes.has(id) ||
154+
activeNodes.has(id as ModelEncodedFQN) ||
154155
(withConnected && connectedNodes.has(id))
155156
: connectedNodes.has(id)
156157
const isInteractive = true

0 commit comments

Comments
 (0)