Skip to content

Commit 2a45a13

Browse files
authored
Use react19 (#35)
* upgrade dependencies + explicitly sort the dataframe + use react 19 * fix color * upgrade deps * upgrade dependencies and adapt code * hotfix css
1 parent de83e8e commit 2a45a13

File tree

7 files changed

+50
-66
lines changed

7 files changed

+50
-66
lines changed

hightable/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,23 @@
1414
"typecheck": "tsc"
1515
},
1616
"dependencies": {
17-
"hightable": "0.19.3",
17+
"hightable": "0.19.5",
1818
"react": "19.1.1",
1919
"react-dom": "19.1.1",
20-
"react-router": "7.8.2"
20+
"react-router": "7.9.1"
2121
},
2222
"devDependencies": {
23-
"@types/react": "19.1.12",
23+
"@types/react": "19.1.13",
2424
"@types/react-dom": "19.1.9",
25-
"@vitejs/plugin-react": "5.0.2",
25+
"@vitejs/plugin-react": "5.0.3",
2626
"@vitest/coverage-v8": "3.2.4",
2727
"eslint": "9.35.0",
2828
"eslint-plugin-react": "7.37.5",
2929
"eslint-plugin-react-hooks": "5.2.0",
3030
"eslint-plugin-react-refresh": "0.4.20",
3131
"globals": "16.4.0",
3232
"typescript": "5.8.3",
33-
"typescript-eslint": "8.43.0",
33+
"typescript-eslint": "8.44.0",
3434
"vite": "7.1.5",
3535
"vitest": "3.2.4"
3636
}

hyparquet/package.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,26 @@
1414
"typecheck": "tsc"
1515
},
1616
"dependencies": {
17-
"hightable": "0.18.4",
18-
"hyparquet": "1.17.2",
17+
"hightable": "0.19.5",
18+
"hyparquet": "1.18.0",
1919
"hyparquet-compressors": "1.1.1",
20-
"hyperparam": "0.3.12",
21-
"react": "18.3.1",
22-
"react-dom": "18.3.1"
20+
"hyperparam": "0.3.18",
21+
"react": "19.1.1",
22+
"react-dom": "19.1.1"
2323
},
2424
"devDependencies": {
25-
"@types/react": "19.1.10",
26-
"@types/react-dom": "19.1.7",
27-
"@vitejs/plugin-react": "5.0.0",
25+
"@types/react": "19.1.13",
26+
"@types/react-dom": "19.1.9",
27+
"@vitejs/plugin-react": "5.0.3",
2828
"@vitest/coverage-v8": "3.2.4",
29-
"eslint": "9.33.0",
29+
"eslint": "9.35.0",
3030
"eslint-plugin-react": "7.37.5",
3131
"eslint-plugin-react-hooks": "5.2.0",
3232
"eslint-plugin-react-refresh": "0.4.20",
33-
"globals": "16.3.0",
33+
"globals": "16.4.0",
3434
"typescript": "5.8.3",
35-
"typescript-eslint": "8.39.1",
36-
"vite": "7.1.2",
35+
"typescript-eslint": "8.44.0",
36+
"vite": "7.1.5",
3737
"vitest": "3.2.4"
3838
}
3939
}

hyparquet/src/App.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { ReactNode } from 'react'
22
import Page, { PageProps } from './Page.js'
33
import Welcome from './Welcome.js'
44

5+
import { sortableDataFrame } from 'hightable'
56
import { byteLengthFromUrl, parquetMetadataAsync } from 'hyparquet'
67
import { AsyncBufferFrom, asyncBufferFrom, parquetDataFrame } from 'hyperparam'
78
import { useCallback, useEffect, useState } from 'react'
@@ -22,7 +23,7 @@ export default function App(): ReactNode {
2223
const setAsyncBuffer = useCallback(async function setAsyncBuffer(name: string, from: AsyncBufferFrom) {
2324
const asyncBuffer = await asyncBufferFrom(from)
2425
const metadata = await parquetMetadataAsync(asyncBuffer)
25-
const df = parquetDataFrame(from, metadata)
26+
const df = sortableDataFrame(parquetDataFrame(from, metadata))
2627
setPageProps({ metadata, df, name, byteLength: from.byteLength, setError: setUnknownError })
2728
}, [setUnknownError])
2829

hyparquet/src/index.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,3 +316,7 @@ input[type="file"] {
316316
background-color: #22222b;
317317
padding-left: 20px;
318318
}
319+
320+
[role="menu"] > button[role="menuitem"] {
321+
color: #444;
322+
}

icebird/package.json

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,25 @@
1414
"typecheck": "tsc"
1515
},
1616
"dependencies": {
17-
"hightable": "0.18.4",
18-
"hyperparam": "0.3.12",
17+
"hightable": "0.19.5",
18+
"hyperparam": "0.3.18",
1919
"icebird": "0.3.0",
20-
"react": "18.3.1",
21-
"react-dom": "18.3.1"
20+
"react": "19.1.1",
21+
"react-dom": "19.1.1"
2222
},
2323
"devDependencies": {
24-
"@types/react": "19.1.10",
25-
"@types/react-dom": "19.1.7",
26-
"@vitejs/plugin-react": "5.0.0",
24+
"@types/react": "19.1.13",
25+
"@types/react-dom": "19.1.9",
26+
"@vitejs/plugin-react": "5.0.3",
2727
"@vitest/coverage-v8": "3.2.4",
28-
"eslint": "9.33.0",
28+
"eslint": "9.35.0",
2929
"eslint-plugin-react": "7.37.5",
3030
"eslint-plugin-react-hooks": "5.2.0",
3131
"eslint-plugin-react-refresh": "0.4.20",
32-
"globals": "16.3.0",
32+
"globals": "16.4.0",
3333
"typescript": "5.8.3",
34-
"typescript-eslint": "8.39.1",
35-
"vite": "7.1.2",
34+
"typescript-eslint": "8.44.0",
35+
"vite": "7.1.5",
3636
"vitest": "3.2.4"
3737
}
3838
}

icebird/src/App.tsx

Lines changed: 12 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ import { ReactNode } from 'react'
22
import Page, { PageProps } from './Page.js'
33
import Welcome from './Welcome.js'
44

5-
import type { DataFrame, DataFrameEvents, ResolvedValue, UnsortableDataFrame } from 'hightable'
6-
import { createEventTarget, sortableDataFrame } from 'hightable'
5+
import type { DataFrame, DataFrameEvents, ResolvedValue } from 'hightable'
6+
import { checkSignal, createEventTarget, sortableDataFrame, validateFetchParams, validateGetCellParams, validateGetRowNumberParams } from 'hightable'
77
import { icebergListVersions, icebergMetadata, icebergRead } from 'icebird'
88
import type { Snapshot, TableMetadata } from 'icebird/src/types.js'
99
import { useCallback, useEffect, useState } from 'react'
1010
import Layout from './Layout.js'
1111

1212
const empty: DataFrame = {
13-
header: [],
13+
columnDescriptors: [],
1414
numRows: 0,
1515
eventTarget: createEventTarget<DataFrameEvents>(),
1616
getRowNumber: () => undefined,
@@ -89,7 +89,7 @@ function icebergDataFrame(tableUrl: string, metadataFileName: string, metadata:
8989
const currentSchemaId = metadata['current-schema-id']
9090
const schema = metadata.schemas.find(s => s['schema-id'] === currentSchemaId)
9191
if (!schema) throw new Error('Current schema not found in metadata')
92-
const header = schema.fields.map(f => f.name)
92+
const columnDescriptors = schema.fields.map(({ name }) => ({ name }))
9393
const eventTarget = createEventTarget<DataFrameEvents>()
9494

9595
type CachedValue<T> = {
@@ -101,16 +101,15 @@ function icebergDataFrame(tableUrl: string, metadataFileName: string, metadata:
101101

102102
const rowNumberCache: CachedValue<number>[] = []
103103
const cellCache = new Map<string, CachedValue<unknown>[]>()
104-
header.forEach(column => cellCache.set(column, []))
104+
columnDescriptors.forEach(({ name }) => cellCache.set(name, []))
105105

106-
function getRowNumber({ row }: {row: number}): ResolvedValue<number> | undefined {
107-
validateRow({ row, data: { numRows } })
106+
function getRowNumber({ row }: { row: number }): ResolvedValue<number> | undefined {
107+
validateGetRowNumberParams({ row, data: { numRows, columnDescriptors } })
108108
const cachedValue = rowNumberCache[row]
109109
return cachedValue?.kind === 'fetched' ? cachedValue.value : undefined
110110
}
111-
function getCell({ row, column }: {row: number, column: string}): ResolvedValue<unknown> | undefined {
112-
validateRow({ row, data: { numRows } })
113-
validateColumn({ column, data: { header } })
111+
function getCell({ row, column }: { row: number, column: string }): ResolvedValue<unknown> | undefined {
112+
validateGetCellParams({ row, column, data: { numRows, columnDescriptors } })
114113
const cachedValue = cellCache.get(column)?.[row]
115114
return cachedValue?.kind === 'fetched' ? cachedValue.value : undefined
116115
}
@@ -120,14 +119,14 @@ function icebergDataFrame(tableUrl: string, metadataFileName: string, metadata:
120119

121120
// TODO: fetch by row groups, to avoid fetching row by row when we scroll
122121

123-
const unsortableDataFrame: UnsortableDataFrame = {
124-
header,
122+
const unsortableDataFrame: DataFrame = {
123+
columnDescriptors,
125124
numRows,
126125
eventTarget,
127126
getRowNumber,
128127
getCell,
129128
async fetch({ rowStart, rowEnd, columns, signal }) {
130-
validateFetchParams({ rowStart, rowEnd, columns, data: { numRows, header } })
129+
validateFetchParams({ rowStart, rowEnd, columns, data: { numRows, columnDescriptors } })
131130
checkSignal(signal)
132131

133132
const ranges = []
@@ -200,27 +199,3 @@ function icebergDataFrame(tableUrl: string, metadataFileName: string, metadata:
200199
return sortableDataFrame(unsortableDataFrame)
201200

202201
}
203-
204-
function validateFetchParams({ rowStart, rowEnd, columns, data: { numRows, header } }: {rowStart: number, rowEnd: number, columns?: string[], data: Pick<DataFrame, 'numRows' | 'header'>}): void {
205-
if (rowStart < 0 || rowEnd > numRows || !Number.isInteger(rowStart) || !Number.isInteger(rowEnd) || rowStart > rowEnd) {
206-
throw new Error(`Invalid row range: ${rowStart} - ${rowEnd}, numRows: ${numRows}`)
207-
}
208-
if (columns?.some(column => !header.includes(column))) {
209-
throw new Error(`Invalid columns: ${columns.join(', ')}. Available columns: ${header.join(', ')}`)
210-
}
211-
}
212-
function validateRow({ row, data: { numRows } }: {row: number, data: Pick<DataFrame, 'numRows'>}): void {
213-
if (row < 0 || row >= numRows || !Number.isInteger(row)) {
214-
throw new Error(`Invalid row index: ${row}, numRows: ${numRows}`)
215-
}
216-
}
217-
function validateColumn({ column, data: { header } }: {column: string, data: Pick<DataFrame, 'header'>}): void {
218-
if (!header.includes(column)) {
219-
throw new Error(`Invalid column: ${column}. Available columns: ${header.join(', ')}`)
220-
}
221-
}
222-
function checkSignal(signal?: AbortSignal): void {
223-
if (signal?.aborted) {
224-
throw new DOMException('The operation was aborted.', 'AbortError')
225-
}
226-
}

icebird/src/index.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,3 +257,7 @@ main {
257257
align-items: center;
258258
gap: 8px;
259259
}
260+
261+
[role="menu"] > button[role="menuitem"] {
262+
color: #444;
263+
}

0 commit comments

Comments
 (0)