Skip to content

Commit 8906f30

Browse files
committed
temp [ci skip]
1 parent ddc3616 commit 8906f30

9 files changed

Lines changed: 2384 additions & 69 deletions

File tree

vscode/extension/openapi.json

Lines changed: 2243 additions & 0 deletions
Large diffs are not rendered by default.

vscode/extension/src/webviews/lineagePanel.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,7 @@ export class LineagePanel implements WebviewViewProvider, Disposable {
4848
})
4949
}
5050

51-
public resolveWebviewView(
52-
webviewView: WebviewView,
53-
) {
51+
public resolveWebviewView(webviewView: WebviewView) {
5452
if (this.panel) {
5553
webviewView = this.panel
5654
}
@@ -98,7 +96,10 @@ export class LineagePanel implements WebviewViewProvider, Disposable {
9896
throw new Error('queryRequest is not supported')
9997
}
10098
default: {
101-
console.log('Unhandled message type under vscode_callback: ', message)
99+
console.log(
100+
'Unhandled message type under vscode_callback: ',
101+
message,
102+
)
102103
}
103104
}
104105
break
@@ -111,7 +112,12 @@ export class LineagePanel implements WebviewViewProvider, Disposable {
111112
'sqlmesh/api',
112113
payload,
113114
)
114-
console.log('response from lsp', response, 'with requestId', requestId)
115+
console.log(
116+
'response from lsp',
117+
response,
118+
'with requestId',
119+
requestId,
120+
)
115121
webviewView.webview.postMessage({
116122
key: 'query_response',
117123
payload: response,

vscode/react/src/App.css

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
}
4545
}
4646

47-
4847
@layer components {
4948
.scrollbar--horizontal::-webkit-scrollbar {
5049
height: var(--scrollbar-size);
@@ -71,5 +70,5 @@
7170
--color-graph-edge-secondary: blue;
7271
--color-graph-edge-main: red;
7372
--color-graph-edge-selected: green;
74-
--color-graph-edge-direct: yellow;
73+
--color-graph-edge-direct: yellow;
7574
}

vscode/react/src/api/client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Generated by orval v7.8.0 🍺
2+
* Generated by orval v7.9.0 🍺
33
* Do not edit manually.
44
* FastAPI
55
* OpenAPI spec version: 0.1.0

vscode/react/src/api/instance.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,19 @@ async function fetchAPIDevelopment<T = any, B extends object = any>(
7979

8080
// If we're in an iframe, we need to post the message to the parent window
8181
if (window.parent !== window) {
82-
window.parent.postMessage({
83-
key: 'queryRequest',
84-
payload: {
85-
requestId,
86-
url: config.url,
87-
params: config.params as any,
88-
data: config.data,
89-
method: config.method,
82+
window.parent.postMessage(
83+
{
84+
key: 'queryRequest',
85+
payload: {
86+
requestId,
87+
url: config.url,
88+
params: config.params as any,
89+
data: config.data,
90+
method: config.method,
91+
},
9092
},
91-
}, '*')
93+
'*',
94+
)
9295
return
9396
}
9497

vscode/react/src/components/graph/help.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ function getEdges(lineage: Record<string, Lineage> = {}): Edge[] {
102102

103103
for (const targetModelName of modelNames) {
104104
const targetModel = lineage[targetModelName]!
105-
105+
106106
// @ts-ignore
107107
targetModel.models.forEach(sourceModelName => {
108108
outputEdges.push(createGraphEdge(sourceModelName, targetModelName))
@@ -189,8 +189,8 @@ function getNodeMap({
189189
: EnumLineageNodeModelType.cte,
190190
})
191191
const columnsCount = withColumns
192-
// @ts-ignore
193-
? (models[modelName]?.columns?.length ?? 0)
192+
? // @ts-ignore
193+
(models[modelName]?.columns?.length ?? 0)
194194
: 0
195195

196196
const maxWidth = Math.min(
@@ -698,7 +698,10 @@ function getUpdatedNodes(
698698

699699
function hasActiveEdge(
700700
activeEdges: ActiveEdges = new Map(),
701-
[leftConnect, rightConnect]: [string | undefined | null, string | undefined | null],
701+
[leftConnect, rightConnect]: [
702+
string | undefined | null,
703+
string | undefined | null,
704+
],
702705
): boolean {
703706
if (isNil(leftConnect) && isNil(rightConnect)) return false
704707

vscode/react/src/main.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { routeTree } from './routeTree.gen'
77

88
import './styles.css'
99
import reportWebVitals from './reportWebVitals.ts'
10+
import { EventBusProvider } from './utilsutils/eventBus.tsx'
1011

1112
// Create a new router instance
1213
const router = createRouter({
@@ -31,7 +32,9 @@ if (rootElement && !rootElement.innerHTML) {
3132
const root = ReactDOM.createRoot(rootElement)
3233
root.render(
3334
<StrictMode>
34-
<RouterProvider router={router} />
35+
<EventBusProvider>
36+
<RouterProvider router={router} />
37+
</EventBusProvider>
3538
</StrictMode>,
3639
)
3740
}

vscode/react/src/pages/lineage.tsx

Lines changed: 5 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ import { ModelLineage } from '@/components/graph/ModelLineage'
1010
import { useVSCode } from '@/hooks/vscode'
1111
import React from 'react'
1212
import { ModelSQLMeshModel } from '@/domain/sqlmesh-model'
13+
import { useEventBus } from '@/utilsutils/eventBus'
1314

1415
export function LineagePage() {
16+
const { emit } = useEventBus()
1517
// Handle messages from VSCode extension
1618
React.useEffect(() => {
1719
const handleMessage = (event: MessageEvent) => {
@@ -21,7 +23,7 @@ export function LineagePage() {
2123
switch (payload.key) {
2224
case 'changeFocusOnFile':
2325
console.log('Changing focus to file:', payload.payload.path)
24-
// Implement your focus change logic here
26+
emit('changeFocusedFile', { fileUri: payload.payload.path })
2527
break
2628
default:
2729
console.error(
@@ -92,6 +94,7 @@ export function LineageComponentFromWeb({
9294
}): JSX.Element {
9395
const vscode = useVSCode()
9496
function handleClickModel(id: string): void {
97+
console.log('handling click', id)
9598
const decodedId = decodeURIComponent(id)
9699
const model = Object.values(models).find((m: Model) => m.fqn === decodedId)
97100
if (!model) {
@@ -121,53 +124,8 @@ export function LineageComponentFromWeb({
121124
models={models}
122125
showControls={false}
123126
>
124-
{' '}
125-
<UpdateLineageFocus>
126-
<ModelLineage model={sqlmModel} />
127-
</UpdateLineageFocus>
127+
<ModelLineage model={sqlmModel} />
128128
</LineageFlowProvider>
129129
</div>
130130
)
131131
}
132-
133-
export function UpdateLineageFocus({
134-
children,
135-
}: {
136-
children: React.ReactNode
137-
}) {
138-
const lineageFlow = useLineageFlow()
139-
140-
React.useEffect(() => {
141-
const handleMessage = (event: MessageEvent) => {
142-
console.log('handleMessage in lineage page', event)
143-
// Ensure the message is from VSCode
144-
if (event.data && event.data.key === 'vscode_send') {
145-
const payload = event.data.payload
146-
switch (payload.key) {
147-
case 'changeFocusOnFile':
148-
console.log('Changing focus to file:', payload.payload.path)
149-
lineageFlow.setMainNode('"memory"."sushi"."customers"')
150-
// Add a small delay to ensure the state update is processed
151-
setTimeout(() => {
152-
console.log('Delayed state update confirmation')
153-
}, 1000)
154-
console.log('set main node', lineageFlow.mainNode)
155-
// Implement your focus change logic here
156-
// TODO NEED TO PASS THE FQN of the model not the path
157-
break
158-
default:
159-
console.error(
160-
'Unhandled message type in lineage page:',
161-
payload.key,
162-
)
163-
}
164-
}
165-
}
166-
window.addEventListener('message', handleMessage)
167-
return () => {
168-
window.removeEventListener('message', handleMessage)
169-
}
170-
}, [])
171-
172-
return children
173-
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
// event-bus.tsx
2+
import {
3+
createContext,
4+
useContext,
5+
useMemo,
6+
useRef,
7+
useEffect,
8+
type PropsWithChildren,
9+
} from 'react'
10+
11+
/**
12+
* 1️⃣ List every event & its payload shape here
13+
*/
14+
export type EventMap = {
15+
changeFocusedFile: {
16+
fileUri: string
17+
}
18+
}
19+
20+
/**
21+
* 2️⃣ Generic bus API — strongly–typed by EventMap
22+
*/
23+
export type EventBus<M extends Record<string, any>> = {
24+
emit<K extends keyof M>(type: K, payload: M[K]): void
25+
on<K extends keyof M>(type: K, handler: (payload: M[K]) => void): () => void // returns “unsubscribe”
26+
}
27+
28+
function createEventBus<M extends Record<string, any>>(): EventBus<M> {
29+
const listeners = new Map<keyof M, Set<(p: any) => void>>()
30+
31+
return {
32+
emit(type, payload) {
33+
listeners.get(type)?.forEach(fn => fn(payload))
34+
},
35+
on(type, handler) {
36+
let set = listeners.get(type)
37+
if (!set) {
38+
set = new Set()
39+
listeners.set(type, set)
40+
}
41+
set.add(handler)
42+
// remove listener on demand
43+
return () => set!.delete(handler)
44+
},
45+
}
46+
}
47+
48+
/**
49+
* 3️⃣ React Context wrapper
50+
*/
51+
const EventBusContext = createContext<EventBus<EventMap> | null>(null)
52+
53+
export const EventBusProvider = ({ children }: PropsWithChildren<{}>) => {
54+
const bus = useMemo(() => createEventBus<EventMap>(), [])
55+
return (
56+
<EventBusContext.Provider value={bus}>{children}</EventBusContext.Provider>
57+
)
58+
}
59+
60+
/**
61+
* 4️⃣ Convenience hooks
62+
*/
63+
export function useEventBus() {
64+
const bus = useContext(EventBusContext)
65+
if (!bus) throw new Error('useEventBus must be inside <EventBusProvider>')
66+
return bus
67+
}
68+
69+
export function useEvent<K extends keyof EventMap>(
70+
type: K,
71+
handler: (payload: EventMap[K]) => void,
72+
) {
73+
const bus = useEventBus()
74+
// keep latest handler ref without resubscribing each render
75+
const saved = useRef<typeof handler>(handler)
76+
useEffect(() => {
77+
saved.current = handler
78+
})
79+
useEffect(() => {
80+
const unsub = bus.on(type, payload => saved.current(payload))
81+
return unsub // unsubscribe on unmount
82+
}, [bus, type])
83+
}
84+
85+
/**
86+
* 5️⃣ Example usage:
87+
*
88+
* // index.tsx
89+
* <EventBusProvider>
90+
* <App />
91+
* </EventBusProvider>
92+
*
93+
* // Any deep component
94+
* const bus = useEventBus();
95+
* bus.emit('cart:add', { productId: 'sku123', qty: 2 });
96+
*
97+
* useEvent('user:login', ({ id }) => {
98+
* console.log('Logged in', id);
99+
* });
100+
*/

0 commit comments

Comments
 (0)