@sqlrooms/room-shell 0.23.0 → 0.24.1
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/README.md +6 -6
- package/dist/RoomShellStore.d.ts +26 -1
- package/dist/RoomShellStore.d.ts.map +1 -1
- package/dist/RoomShellStore.js +31 -18
- package/dist/RoomShellStore.js.map +1 -1
- package/package.json +11 -11
package/README.md
CHANGED
|
@@ -41,7 +41,7 @@ The room-shell package uses Zustand for state management. You can create a custo
|
|
|
41
41
|
|
|
42
42
|
```tsx
|
|
43
43
|
import {
|
|
44
|
-
|
|
44
|
+
createRoomShellSlice,
|
|
45
45
|
createRoomStore,
|
|
46
46
|
RoomState,
|
|
47
47
|
BaseRoomConfig,
|
|
@@ -67,7 +67,7 @@ export const {roomStore, useRoomStore} = createRoomStore<
|
|
|
67
67
|
MyRoomState
|
|
68
68
|
>((set, get, store) => ({
|
|
69
69
|
// Base room slice with initial configuration
|
|
70
|
-
...
|
|
70
|
+
...createRoomShellSlice<MyRoomConfig>({
|
|
71
71
|
config: {
|
|
72
72
|
title: 'My Room',
|
|
73
73
|
layout: {
|
|
@@ -120,7 +120,7 @@ The room configuration is designed to be persisted between sessions. You can use
|
|
|
120
120
|
```tsx
|
|
121
121
|
import {persist} from 'zustand/middleware';
|
|
122
122
|
import {
|
|
123
|
-
|
|
123
|
+
createRoomShellSlice,
|
|
124
124
|
createRoomStore,
|
|
125
125
|
RoomState,
|
|
126
126
|
BaseRoomConfig,
|
|
@@ -147,7 +147,7 @@ export const {roomStore, useRoomStore} = createRoomStore<
|
|
|
147
147
|
persist(
|
|
148
148
|
(set, get, store) => ({
|
|
149
149
|
// Base room slice
|
|
150
|
-
...
|
|
150
|
+
...createRoomShellSlice<MyRoomConfig>({
|
|
151
151
|
config: {
|
|
152
152
|
title: 'My Room',
|
|
153
153
|
layout: {
|
|
@@ -187,7 +187,7 @@ For larger applications, you can organize your state into feature slices:
|
|
|
187
187
|
|
|
188
188
|
```tsx
|
|
189
189
|
import {
|
|
190
|
-
|
|
190
|
+
createRoomShellSlice,
|
|
191
191
|
createRoomStore,
|
|
192
192
|
RoomState,
|
|
193
193
|
} from '@sqlrooms/room-shell';
|
|
@@ -206,7 +206,7 @@ export const {roomStore, useRoomStore} = createRoomStore<
|
|
|
206
206
|
RoomState
|
|
207
207
|
>((set, get, store) => ({
|
|
208
208
|
// Base room slice
|
|
209
|
-
...
|
|
209
|
+
...createRoomShellSlice<MyRoomConfig>({
|
|
210
210
|
config: {
|
|
211
211
|
/* initial config */
|
|
212
212
|
},
|
package/dist/RoomShellStore.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { DataTable, DuckDbConnector, DuckDbSliceConfig, DuckDbSliceState, LoadFileOptions } from '@sqlrooms/duckdb';
|
|
2
2
|
import { LayoutSliceConfig, LayoutSliceState, RoomPanelInfo } from '@sqlrooms/layout';
|
|
3
|
-
import { BaseRoomConfig, DataSource } from '@sqlrooms/room-config';
|
|
3
|
+
import { BaseRoomConfig, DataSource, FileDataSource } from '@sqlrooms/room-config';
|
|
4
4
|
import { RoomState, RoomStateActions, RoomStateProps } from '@sqlrooms/room-store';
|
|
5
|
+
import { ProgressInfo } from '@sqlrooms/utils';
|
|
5
6
|
import { ReactNode } from 'react';
|
|
6
7
|
import { StateCreator, StoreApi } from 'zustand';
|
|
7
8
|
import { DataSourceState, DataSourceStatus, RoomFileInfo, RoomFileState } from './types';
|
|
@@ -16,6 +17,30 @@ export type RoomShellSliceStateProps<PC extends BaseRoomConfig> = RoomStateProps
|
|
|
16
17
|
dataSourceStates: {
|
|
17
18
|
[tableName: string]: DataSourceState;
|
|
18
19
|
};
|
|
20
|
+
/**
|
|
21
|
+
* Load a file data source. A fileDataSourceLoader implementation can be passed to
|
|
22
|
+
* createRoomShellSlice to specify how file data sources should be loaded.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* ...createRoomShellSlice<RoomConfig>({
|
|
27
|
+
* config: {
|
|
28
|
+
* dataSources: [
|
|
29
|
+
* { type: 'file', fileName: 'earthquakes.parquet', tableName: 'earthquakes' },
|
|
30
|
+
* ],
|
|
31
|
+
* },
|
|
32
|
+
* room: {
|
|
33
|
+
* fileDataSourceLoader: async ({fileName}, onProgress) =>
|
|
34
|
+
* await downloadFile(`https://some.url/${fileName}`, {onProgress}),
|
|
35
|
+
* },
|
|
36
|
+
* })(set, get, store)
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @param fileName - The name of the file to load.
|
|
40
|
+
* @param onProgress - A callback to report the progress of the download.
|
|
41
|
+
* @returns The loaded file.
|
|
42
|
+
*/
|
|
43
|
+
fileDataSourceLoader?: ({ fileName }: FileDataSource, onProgress: (progress: ProgressInfo) => void) => Promise<Uint8Array | File>;
|
|
19
44
|
CustomErrorBoundary: React.ComponentType<{
|
|
20
45
|
onRetry?: () => void;
|
|
21
46
|
children?: ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoomShellStore.d.ts","sourceRoot":"","sources":["../src/RoomShellStore.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EAGhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EAGd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,cAAc,EACd,UAAU,
|
|
1
|
+
{"version":3,"file":"RoomShellStore.d.ts","sourceRoot":"","sources":["../src/RoomShellStore.ts"],"names":[],"mappings":"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"}
|
package/dist/RoomShellStore.js
CHANGED
|
@@ -293,29 +293,42 @@ export function createRoomShellSlice(props) {
|
|
|
293
293
|
}
|
|
294
294
|
const loadedFiles = await Promise.all(filesToDownload.map(async (ds) => {
|
|
295
295
|
const fileName = ds.type === DataSourceTypes.Enum.file ? ds.fileName : ds.url;
|
|
296
|
+
const onProgress = (progress) => {
|
|
297
|
+
setRoomFileProgress(fileName, {
|
|
298
|
+
status: 'download',
|
|
299
|
+
progress,
|
|
300
|
+
});
|
|
301
|
+
updateTotalFileDownloadProgress();
|
|
302
|
+
};
|
|
296
303
|
try {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
304
|
+
let downloadedFile;
|
|
305
|
+
switch (ds.type) {
|
|
306
|
+
case DataSourceTypes.Enum.file: {
|
|
307
|
+
const { fileDataSourceLoader } = get().room;
|
|
308
|
+
if (!fileDataSourceLoader) {
|
|
309
|
+
throw new Error('fileDataSourceLoader is not defined');
|
|
310
|
+
}
|
|
311
|
+
downloadedFile = await fileDataSourceLoader(ds, onProgress);
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
case DataSourceTypes.Enum.url: {
|
|
315
|
+
const url = ds.url;
|
|
316
|
+
downloadedFile = await downloadFile(url, {
|
|
317
|
+
...(ds.type === DataSourceTypes.Enum.url && {
|
|
318
|
+
method: ds.httpMethod,
|
|
319
|
+
headers: ds.headers,
|
|
320
|
+
}),
|
|
321
|
+
onProgress,
|
|
311
322
|
});
|
|
312
|
-
|
|
313
|
-
}
|
|
314
|
-
}
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
315
326
|
setRoomFileProgress(fileName, { status: 'done' });
|
|
316
327
|
updateTotalFileDownloadProgress();
|
|
317
328
|
const { db } = get();
|
|
318
|
-
await db.connector.loadFile(
|
|
329
|
+
await db.connector.loadFile(downloadedFile instanceof File
|
|
330
|
+
? downloadedFile
|
|
331
|
+
: new File([downloadedFile], fileName), ds.tableName, ds.loadOptions);
|
|
319
332
|
setTableRowCount(ds.tableName, await db.getTableRowCount(ds.tableName));
|
|
320
333
|
}
|
|
321
334
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoomShellStore.js","sourceRoot":"","sources":["../src/RoomShellStore.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DataTable,\n DuckDbConnector,\n DuckDbSliceConfig,\n DuckDbSliceState,\n LoadFileOptions,\n createDefaultDuckDbConfig,\n createDuckDbSlice,\n} from '@sqlrooms/duckdb';\nimport {\n LayoutSliceConfig,\n LayoutSliceState,\n RoomPanelInfo,\n createDefaultLayoutConfig,\n createLayoutSlice,\n} from '@sqlrooms/layout';\nimport {DEFAULT_MOSAIC_LAYOUT} from '@sqlrooms/layout-config';\nimport {\n BaseRoomConfig,\n DataSource,\n DataSourceTypes,\n FileDataSource,\n SqlQueryDataSource,\n UrlDataSource,\n} from '@sqlrooms/room-config';\nimport {\n RoomState,\n RoomStateActions,\n RoomStateProps,\n createRoomSlice,\n isRoomSliceWithInitialize,\n useBaseRoomStore,\n} from '@sqlrooms/room-store';\nimport {ErrorBoundary} from '@sqlrooms/ui';\nimport {\n ProgressInfo,\n convertToUniqueColumnOrTableName,\n convertToValidColumnOrTableName,\n downloadFile,\n} from '@sqlrooms/utils';\nimport {castDraft, produce} from 'immer';\nimport {ReactNode} from 'react';\nimport {StateCreator, StoreApi} from 'zustand';\nimport {\n DataSourceState,\n DataSourceStatus,\n RoomFileInfo,\n RoomFileState,\n} from './types';\n\nexport type RoomShellStore<PC extends BaseRoomConfig> = StoreApi<\n RoomShellSliceState<PC>\n>;\n\nexport const INITIAL_BASE_ROOM_CONFIG: BaseRoomConfig &\n DuckDbSliceConfig &\n LayoutSliceConfig = {\n title: '',\n layout: DEFAULT_MOSAIC_LAYOUT,\n description: '',\n dataSources: [],\n ...createDefaultDuckDbConfig(),\n ...createDefaultLayoutConfig(),\n};\n\nexport type RoomShellSliceStateProps<PC extends BaseRoomConfig> =\n RoomStateProps<PC> & {\n roomFiles: RoomFileInfo[];\n roomFilesProgress: {[pathname: string]: RoomFileState};\n isDataAvailable: boolean; // Whether the data has been loaded (on initialization)\n dataSourceStates: {[tableName: string]: DataSourceState}; // TODO\n\n CustomErrorBoundary: React.ComponentType<{\n onRetry?: () => void;\n children?: ReactNode;\n }>;\n };\n\nexport type RoomShellSliceStateActions<PC extends BaseRoomConfig> =\n RoomStateActions<PC> & {\n setRoomTitle(title: string): void;\n setDescription(description: string): void;\n\n /**\n * Add or update a SQL query data source.\n * @param tableName - The name of the table to create or update.\n * @param query - The SQL query to execute.\n * @param oldTableName - The name of the table to replace (optional).\n */\n addOrUpdateSqlQueryDataSource(\n tableName: string,\n query: string,\n oldTableName?: string,\n ): Promise<void>;\n removeSqlQueryDataSource(tableName: string): Promise<void>;\n areDatasetsReady(): boolean;\n\n addRoomFile(\n file: File | string,\n tableName?: string,\n loadFileOptions?: LoadFileOptions,\n ): Promise<DataTable | undefined>;\n removeRoomFile(pathname: string): void;\n setRoomFiles(info: RoomFileInfo[]): void;\n setRoomFileProgress(pathname: string, fileState: RoomFileState): void;\n addDataSource: (\n dataSource: DataSource,\n status?: DataSourceStatus,\n ) => Promise<void>;\n };\n\nexport type RoomShellSliceState<PC extends BaseRoomConfig> = RoomState<PC> & {\n initialize?: () => Promise<void>;\n config: PC;\n room: RoomShellSliceStateProps<PC> & RoomShellSliceStateActions<PC>;\n} & DuckDbSliceState &\n LayoutSliceState;\n\n/**\n * \tThis type takes a union type U (for example, A | B) and transforms it into an intersection type (A & B). This is useful because if you pass in, say, two slices of type { a: number } and { b: string }, the union of the slice types would be { a: number } | { b: string }, but you really want an object that has both properties—i.e. { a: number } & { b: string }.\n */\ntype InitialState<PC extends BaseRoomConfig> = {\n connector?: DuckDbConnector;\n config: Partial<PC>;\n room: Partial<Omit<RoomShellSliceStateProps<PC>, 'config'>> & {\n panels?: Record<string, RoomPanelInfo>;\n };\n};\n\nconst DOWNLOAD_DATA_SOURCES_TASK = 'download-data-sources';\nconst INIT_DB_TASK = 'init-db';\nconst INIT_ROOM_TASK = 'init-room';\n\nexport function createRoomShellSlice<PC extends BaseRoomConfig>(\n props: InitialState<PC>,\n): StateCreator<RoomShellSliceState<PC>> {\n const slice: StateCreator<RoomShellSliceState<PC>> = (set, get, store) => {\n const {\n connector,\n config: configProps,\n room: roomStateProps,\n ...restState\n } = props;\n const initialConfig: PC = {\n ...INITIAL_BASE_ROOM_CONFIG,\n ...configProps,\n } as PC;\n const initialRoomState = {\n CustomErrorBoundary: ErrorBoundary,\n roomFiles: [],\n roomFilesProgress: {},\n isDataAvailable: false,\n dataSourceStates: {},\n ...roomStateProps,\n };\n const roomSliceState = createRoomSlice({\n config: initialConfig,\n room: initialRoomState,\n })(set, get, store);\n\n const roomState: RoomShellSliceState<PC> = {\n ...roomSliceState,\n ...createDuckDbSlice({connector})(set, get, store),\n ...createLayoutSlice({panels: roomStateProps.panels})(set, get, store),\n room: {\n ...initialRoomState,\n ...roomSliceState.room,\n async initialize() {\n await roomSliceState.room.initialize();\n\n const {setTaskProgress} = get().room;\n setTaskProgress(INIT_DB_TASK, {\n message: 'Initializing database…',\n progress: undefined,\n });\n await get().db.initialize();\n setTaskProgress(INIT_DB_TASK, undefined);\n\n setTaskProgress(INIT_ROOM_TASK, {\n message: 'Loading data sources…',\n progress: undefined,\n });\n await updateReadyDataSources();\n await maybeDownloadDataSources();\n\n // Call initialize on all other slices that have an initialize function\n const slices = Object.entries(store.getState()).filter(\n ([key, value]) =>\n key !== 'room' &&\n key !== 'db' &&\n isRoomSliceWithInitialize(value),\n );\n for (const [_, slice] of slices) {\n if (isRoomSliceWithInitialize(slice)) {\n await slice.initialize();\n }\n }\n const state = store.getState();\n if (isRoomSliceWithInitialize(state)) {\n await state.initialize();\n }\n\n setTaskProgress(INIT_ROOM_TASK, undefined);\n },\n\n setRoomConfig: (config) =>\n set((state) =>\n produce(state, (draft) => {\n draft.config = castDraft(config);\n }),\n ),\n setLastSavedConfig: (config) =>\n set((state) =>\n produce(state, (draft) => {\n draft.room.lastSavedConfig = castDraft(config);\n }),\n ),\n hasUnsavedChanges: () => {\n const {lastSavedConfig} = get().room;\n const {config} = get();\n return config !== lastSavedConfig;\n },\n\n setRoomTitle: (title) =>\n set((state) =>\n produce(state, (draft) => {\n draft.config.title = title;\n }),\n ),\n\n setDescription: (description) =>\n set((state) =>\n produce(state, (draft) => {\n draft.config.description = description;\n }),\n ),\n\n addDataSource: async (\n dataSource,\n status = DataSourceStatus.PENDING,\n ) => {\n set((state) =>\n produce(state, (draft) => {\n const dataSources = draft.config.dataSources;\n const tableName = dataSource.tableName;\n const index = dataSources.findIndex(\n (d) => d.tableName === tableName,\n );\n if (index >= 0) {\n dataSources[index] = dataSource;\n } else {\n dataSources.push(dataSource);\n }\n draft.room.dataSourceStates[tableName] = {status};\n }),\n );\n await maybeDownloadDataSources();\n },\n\n async addOrUpdateSqlQueryDataSource(tableName, query, oldTableName) {\n const {schema} = get().db;\n const {db} = get();\n const newTableName =\n tableName !== oldTableName\n ? convertToUniqueColumnOrTableName(\n tableName,\n await db.getTables(schema),\n )\n : tableName;\n const {rowCount} = await db.createTableFromQuery(newTableName, query);\n get().db.setTableRowCount(newTableName, rowCount);\n set((state) =>\n produce(state, (draft) => {\n const newDataSource = {\n type: DataSourceTypes.enum.sql,\n sqlQuery: query,\n tableName: newTableName,\n };\n if (oldTableName) {\n draft.config.dataSources = draft.config.dataSources.map(\n (dataSource) =>\n dataSource.tableName === oldTableName\n ? newDataSource\n : dataSource,\n );\n delete draft.room.dataSourceStates[oldTableName];\n } else {\n draft.config.dataSources.push(newDataSource);\n }\n draft.room.dataSourceStates[newTableName] = {\n status: DataSourceStatus.READY,\n };\n }),\n );\n await get().db.refreshTableSchemas();\n },\n\n removeSqlQueryDataSource: async (tableName) => {\n const {db} = get();\n await db.dropTable(tableName);\n set((state) =>\n produce(state, (draft) => {\n draft.config.dataSources = draft.config.dataSources.filter(\n (d) => d.tableName !== tableName,\n );\n delete draft.room.dataSourceStates[tableName];\n }),\n );\n await get().db.refreshTableSchemas();\n },\n\n setRoomFiles: (roomFiles) =>\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles = roomFiles;\n }),\n ),\n\n async addRoomFile(file, desiredTableName, loadOptions) {\n const {db} = get();\n\n const pathname = file instanceof File ? file.name : file;\n const tableName =\n desiredTableName ?? convertToValidColumnOrTableName(pathname);\n\n await db.connector.loadFile(file, tableName, loadOptions);\n\n // This must come before addDataSource, as addDataSource can trigger\n // download which also adds the file\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles.push({\n pathname,\n duckdbFileName: pathname,\n size: file instanceof File ? file.size : undefined,\n file: file instanceof File ? file : undefined,\n });\n }),\n );\n await get().room.addDataSource(\n {\n type: DataSourceTypes.enum.file,\n fileName: pathname,\n tableName,\n },\n // duckdbFileName ? DataSourceStatus.READY : DataSourceStatus.PENDING,\n DataSourceStatus.READY,\n );\n await get().db.refreshTableSchemas();\n set((state) =>\n produce(state, (draft) => {\n if (\n Object.values(get().room.dataSourceStates).every(\n (ds) => ds.status === DataSourceStatus.READY,\n )\n ) {\n draft.room.isDataAvailable = true;\n }\n }),\n );\n return get().db.findTableByName(tableName);\n },\n\n removeRoomFile(pathname) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles = draft.room.roomFiles.filter(\n (f) => f.pathname !== pathname,\n );\n draft.config.dataSources = draft.config.dataSources.filter(\n (d) =>\n d.type !== DataSourceTypes.Enum.file ||\n d.fileName !== pathname,\n );\n }),\n );\n },\n\n setRoomFileProgress(pathname, fileState) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFilesProgress[pathname] = fileState;\n // Update the file size in the room config from the progress info\n const fileInfo = draft.room.roomFiles.find(\n (f) => f.pathname === pathname,\n );\n if (fileInfo && fileInfo.size === undefined) {\n if (fileState.status !== 'error' && fileState.progress) {\n fileInfo.size = fileState.progress.total;\n }\n }\n }),\n );\n },\n\n areDatasetsReady: () => {\n const {dataSourceStates} = get().room;\n const {config} = get();\n const dataSources = config.dataSources;\n return dataSources.every(\n (ds) =>\n dataSourceStates[ds.tableName]?.status === DataSourceStatus.READY,\n );\n },\n },\n\n ...restState,\n };\n\n // If the tables have changed, update the data sources\n store.subscribe((state, prevState) => {\n if (state.db.tables !== prevState.db.tables) {\n updateReadyDataSources();\n }\n });\n\n async function updateReadyDataSources() {\n const {tables} = get().db;\n const {dataSourceStates} = get().room;\n const {config} = get();\n const {dataSources} = config;\n set((state) =>\n produce(state, (draft) => {\n for (const ds of dataSources) {\n const tableName = ds.tableName;\n const table = tables.find((t) => t.tableName === tableName);\n if (table) {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.READY,\n };\n } else {\n // Prev status could be ERROR or PENDING, don't change it then\n if (!dataSourceStates[tableName]?.status) {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.PENDING,\n };\n }\n }\n }\n }),\n );\n }\n\n async function maybeDownloadDataSources() {\n const {roomFilesProgress, dataSourceStates} = get().room;\n const {dataSources} = get().config;\n const pendingDataSources = dataSources.filter(\n (ds) =>\n !dataSourceStates[ds.tableName] ||\n dataSourceStates[ds.tableName]?.status === DataSourceStatus.PENDING,\n );\n\n const filesToDownload = pendingDataSources.filter((ds) => {\n switch (ds.type) {\n case DataSourceTypes.Enum.file:\n return !roomFilesProgress[ds.fileName];\n case DataSourceTypes.Enum.url:\n return !roomFilesProgress[ds.url];\n default:\n return false;\n }\n }) as (FileDataSource | UrlDataSource)[];\n\n if (filesToDownload.length > 0) {\n await downloadRoomFiles(filesToDownload);\n }\n\n const queriesToRun = pendingDataSources.filter(\n (ds) => ds.type === DataSourceTypes.Enum.sql,\n );\n\n if (queriesToRun.length > 0) {\n await runDataSourceQueries(queriesToRun);\n }\n\n if (get().config.dataSources.length > 0) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.isDataAvailable = true;\n }),\n );\n }\n }\n\n async function downloadRoomFiles(\n filesToDownload: (FileDataSource | UrlDataSource)[],\n ) {\n if (!filesToDownload.length) return;\n const {setTableRowCount} = get().db;\n const {captureException, setTaskProgress, setRoomFileProgress} =\n get().room;\n filesToDownload.forEach((ds) => {\n const fileName =\n ds.type === DataSourceTypes.Enum.file ? ds.fileName : ds.url;\n set((state) =>\n produce(state, (draft) => {\n const info = {\n duckdbFileName: fileName,\n pathname: fileName,\n file: undefined,\n size: undefined,\n };\n const index = draft.room.roomFiles.findIndex(\n (f) => f.pathname === fileName,\n );\n if (index >= 0) {\n draft.room.roomFiles[index] = info;\n } else {\n draft.room.roomFiles.push(info);\n }\n }),\n );\n setRoomFileProgress(fileName, {status: 'download'});\n });\n if (filesToDownload.length > 0) {\n updateTotalFileDownloadProgress();\n }\n\n const loadedFiles = await Promise.all(\n filesToDownload.map(async (ds) => {\n const fileName =\n ds.type === DataSourceTypes.Enum.file ? ds.fileName : ds.url;\n try {\n if (ds.type === DataSourceTypes.Enum.file) {\n throw new Error('File data source is not supported');\n }\n const url = ds.url;\n setRoomFileProgress(fileName, {status: 'download'});\n const downloadedFile = await downloadFile(url, {\n ...(ds.type === DataSourceTypes.Enum.url && {\n method: ds.httpMethod,\n headers: ds.headers,\n }),\n onProgress: (progress: ProgressInfo) => {\n setRoomFileProgress(fileName, {\n status: 'download',\n progress,\n });\n updateTotalFileDownloadProgress();\n },\n });\n setRoomFileProgress(fileName, {status: 'done'});\n updateTotalFileDownloadProgress();\n const {db} = get();\n await db.connector.loadFile(\n new File([downloadedFile], fileName),\n ds.tableName,\n ds.loadOptions,\n );\n setTableRowCount(\n ds.tableName,\n await db.getTableRowCount(ds.tableName),\n );\n } catch (err) {\n captureException(err);\n console.error(err);\n setRoomFileProgress(fileName, {\n status: 'error',\n message: 'Download failed',\n });\n // TODO: Make sure the errors are shown\n } finally {\n setTaskProgress(DOWNLOAD_DATA_SOURCES_TASK, undefined);\n }\n }),\n );\n if (loadedFiles.length) {\n await get().db.refreshTableSchemas();\n }\n }\n\n async function runDataSourceQueries(queries: SqlQueryDataSource[]) {\n for (const ds of queries) {\n try {\n const {tableName, sqlQuery} = ds;\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.FETCHING,\n };\n }),\n );\n const {rowCount} = await get().db.createTableFromQuery(\n tableName,\n sqlQuery,\n );\n get().db.setTableRowCount(tableName, rowCount);\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.READY,\n };\n }),\n );\n } catch (err) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[ds.tableName] = {\n status: DataSourceStatus.ERROR,\n message: `${err}`,\n };\n }),\n );\n // TODO: Make sure the errors are shown\n }\n }\n await get().db.refreshTableSchemas();\n await updateReadyDataSources();\n }\n\n function updateTotalFileDownloadProgress() {\n const {setTaskProgress, roomFilesProgress} = get().room;\n let total = 0,\n loaded = 0;\n for (const p of Object.values(roomFilesProgress)) {\n if (p.status === 'download' || p.status === 'done') {\n total += p.progress?.total || 0;\n loaded += p.progress?.loaded || 0;\n }\n }\n setTaskProgress(DOWNLOAD_DATA_SOURCES_TASK, {\n progress: total > 0 ? Math.round((loaded / total) * 100) : undefined,\n message: 'Downloading data…',\n });\n }\n\n return roomState;\n };\n\n return slice;\n}\n\nexport function useBaseRoomShellStore<\n PC extends BaseRoomConfig,\n PS extends RoomShellSliceState<PC>,\n T,\n>(selector: (state: RoomShellSliceState<PC>) => T): T {\n return useBaseRoomStore<PC, PS, T>(selector as (state: RoomState<PC>) => T);\n}\n\nexport function createSlice<PC extends BaseRoomConfig, S>(\n sliceCreator: (\n ...args: Parameters<StateCreator<S & RoomShellSliceState<PC>>>\n ) => S,\n): StateCreator<S> {\n return (set, get, store) =>\n sliceCreator(\n set,\n get as () => S & RoomShellSliceState<PC>,\n store as StoreApi<S & RoomShellSliceState<PC>>,\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RoomShellStore.js","sourceRoot":"","sources":["../src/RoomShellStore.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DataTable,\n DuckDbConnector,\n DuckDbSliceConfig,\n DuckDbSliceState,\n LoadFileOptions,\n createDefaultDuckDbConfig,\n createDuckDbSlice,\n} from '@sqlrooms/duckdb';\nimport {\n LayoutSliceConfig,\n LayoutSliceState,\n RoomPanelInfo,\n createDefaultLayoutConfig,\n createLayoutSlice,\n} from '@sqlrooms/layout';\nimport {DEFAULT_MOSAIC_LAYOUT} from '@sqlrooms/layout-config';\nimport {\n BaseRoomConfig,\n DataSource,\n DataSourceTypes,\n FileDataSource,\n SqlQueryDataSource,\n UrlDataSource,\n} from '@sqlrooms/room-config';\nimport {\n RoomState,\n RoomStateActions,\n RoomStateProps,\n createRoomSlice,\n isRoomSliceWithInitialize,\n useBaseRoomStore,\n} from '@sqlrooms/room-store';\nimport {ErrorBoundary} from '@sqlrooms/ui';\nimport {\n ProgressInfo,\n convertToUniqueColumnOrTableName,\n convertToValidColumnOrTableName,\n downloadFile,\n} from '@sqlrooms/utils';\nimport {castDraft, produce} from 'immer';\nimport {ReactNode} from 'react';\nimport {StateCreator, StoreApi} from 'zustand';\nimport {\n DataSourceState,\n DataSourceStatus,\n RoomFileInfo,\n RoomFileState,\n} from './types';\n\nexport type RoomShellStore<PC extends BaseRoomConfig> = StoreApi<\n RoomShellSliceState<PC>\n>;\n\nexport const INITIAL_BASE_ROOM_CONFIG: BaseRoomConfig &\n DuckDbSliceConfig &\n LayoutSliceConfig = {\n title: '',\n layout: DEFAULT_MOSAIC_LAYOUT,\n description: '',\n dataSources: [],\n ...createDefaultDuckDbConfig(),\n ...createDefaultLayoutConfig(),\n};\n\nexport type RoomShellSliceStateProps<PC extends BaseRoomConfig> =\n RoomStateProps<PC> & {\n roomFiles: RoomFileInfo[];\n roomFilesProgress: {[pathname: string]: RoomFileState};\n isDataAvailable: boolean; // Whether the data has been loaded (on initialization)\n dataSourceStates: {[tableName: string]: DataSourceState}; // TODO\n /**\n * Load a file data source. A fileDataSourceLoader implementation can be passed to\n * createRoomShellSlice to specify how file data sources should be loaded.\n *\n * @example\n * ```ts\n * ...createRoomShellSlice<RoomConfig>({\n * config: {\n * dataSources: [\n * { type: 'file', fileName: 'earthquakes.parquet', tableName: 'earthquakes' },\n * ],\n * },\n * room: {\n * fileDataSourceLoader: async ({fileName}, onProgress) =>\n * await downloadFile(`https://some.url/${fileName}`, {onProgress}),\n * },\n * })(set, get, store)\n * ```\n *\n * @param fileName - The name of the file to load.\n * @param onProgress - A callback to report the progress of the download.\n * @returns The loaded file.\n */\n fileDataSourceLoader?: (\n {fileName}: FileDataSource,\n onProgress: (progress: ProgressInfo) => void,\n ) => Promise<Uint8Array | File>;\n CustomErrorBoundary: React.ComponentType<{\n onRetry?: () => void;\n children?: ReactNode;\n }>;\n };\n\nexport type RoomShellSliceStateActions<PC extends BaseRoomConfig> =\n RoomStateActions<PC> & {\n setRoomTitle(title: string): void;\n setDescription(description: string): void;\n\n /**\n * Add or update a SQL query data source.\n * @param tableName - The name of the table to create or update.\n * @param query - The SQL query to execute.\n * @param oldTableName - The name of the table to replace (optional).\n */\n addOrUpdateSqlQueryDataSource(\n tableName: string,\n query: string,\n oldTableName?: string,\n ): Promise<void>;\n removeSqlQueryDataSource(tableName: string): Promise<void>;\n areDatasetsReady(): boolean;\n\n addRoomFile(\n file: File | string,\n tableName?: string,\n loadFileOptions?: LoadFileOptions,\n ): Promise<DataTable | undefined>;\n removeRoomFile(pathname: string): void;\n setRoomFiles(info: RoomFileInfo[]): void;\n setRoomFileProgress(pathname: string, fileState: RoomFileState): void;\n addDataSource: (\n dataSource: DataSource,\n status?: DataSourceStatus,\n ) => Promise<void>;\n };\n\nexport type RoomShellSliceState<PC extends BaseRoomConfig> = RoomState<PC> & {\n initialize?: () => Promise<void>;\n config: PC;\n room: RoomShellSliceStateProps<PC> & RoomShellSliceStateActions<PC>;\n} & DuckDbSliceState &\n LayoutSliceState;\n\n/**\n * \tThis type takes a union type U (for example, A | B) and transforms it into an intersection type (A & B). This is useful because if you pass in, say, two slices of type { a: number } and { b: string }, the union of the slice types would be { a: number } | { b: string }, but you really want an object that has both properties—i.e. { a: number } & { b: string }.\n */\ntype InitialState<PC extends BaseRoomConfig> = {\n connector?: DuckDbConnector;\n config: Partial<PC>;\n room: Partial<Omit<RoomShellSliceStateProps<PC>, 'config'>> & {\n panels?: Record<string, RoomPanelInfo>;\n };\n};\n\nconst DOWNLOAD_DATA_SOURCES_TASK = 'download-data-sources';\nconst INIT_DB_TASK = 'init-db';\nconst INIT_ROOM_TASK = 'init-room';\n\nexport function createRoomShellSlice<PC extends BaseRoomConfig>(\n props: InitialState<PC>,\n): StateCreator<RoomShellSliceState<PC>> {\n const slice: StateCreator<RoomShellSliceState<PC>> = (set, get, store) => {\n const {\n connector,\n config: configProps,\n room: roomStateProps,\n ...restState\n } = props;\n const initialConfig: PC = {\n ...INITIAL_BASE_ROOM_CONFIG,\n ...configProps,\n } as PC;\n const initialRoomState = {\n CustomErrorBoundary: ErrorBoundary,\n roomFiles: [],\n roomFilesProgress: {},\n isDataAvailable: false,\n dataSourceStates: {},\n ...roomStateProps,\n };\n const roomSliceState = createRoomSlice({\n config: initialConfig,\n room: initialRoomState,\n })(set, get, store);\n\n const roomState: RoomShellSliceState<PC> = {\n ...roomSliceState,\n ...createDuckDbSlice({connector})(set, get, store),\n ...createLayoutSlice({panels: roomStateProps.panels})(set, get, store),\n room: {\n ...initialRoomState,\n ...roomSliceState.room,\n async initialize() {\n await roomSliceState.room.initialize();\n\n const {setTaskProgress} = get().room;\n setTaskProgress(INIT_DB_TASK, {\n message: 'Initializing database…',\n progress: undefined,\n });\n await get().db.initialize();\n setTaskProgress(INIT_DB_TASK, undefined);\n\n setTaskProgress(INIT_ROOM_TASK, {\n message: 'Loading data sources…',\n progress: undefined,\n });\n await updateReadyDataSources();\n await maybeDownloadDataSources();\n\n // Call initialize on all other slices that have an initialize function\n const slices = Object.entries(store.getState()).filter(\n ([key, value]) =>\n key !== 'room' &&\n key !== 'db' &&\n isRoomSliceWithInitialize(value),\n );\n for (const [_, slice] of slices) {\n if (isRoomSliceWithInitialize(slice)) {\n await slice.initialize();\n }\n }\n const state = store.getState();\n if (isRoomSliceWithInitialize(state)) {\n await state.initialize();\n }\n\n setTaskProgress(INIT_ROOM_TASK, undefined);\n },\n\n setRoomConfig: (config) =>\n set((state) =>\n produce(state, (draft) => {\n draft.config = castDraft(config);\n }),\n ),\n setLastSavedConfig: (config) =>\n set((state) =>\n produce(state, (draft) => {\n draft.room.lastSavedConfig = castDraft(config);\n }),\n ),\n hasUnsavedChanges: () => {\n const {lastSavedConfig} = get().room;\n const {config} = get();\n return config !== lastSavedConfig;\n },\n\n setRoomTitle: (title) =>\n set((state) =>\n produce(state, (draft) => {\n draft.config.title = title;\n }),\n ),\n\n setDescription: (description) =>\n set((state) =>\n produce(state, (draft) => {\n draft.config.description = description;\n }),\n ),\n\n addDataSource: async (\n dataSource,\n status = DataSourceStatus.PENDING,\n ) => {\n set((state) =>\n produce(state, (draft) => {\n const dataSources = draft.config.dataSources;\n const tableName = dataSource.tableName;\n const index = dataSources.findIndex(\n (d) => d.tableName === tableName,\n );\n if (index >= 0) {\n dataSources[index] = dataSource;\n } else {\n dataSources.push(dataSource);\n }\n draft.room.dataSourceStates[tableName] = {status};\n }),\n );\n await maybeDownloadDataSources();\n },\n\n async addOrUpdateSqlQueryDataSource(tableName, query, oldTableName) {\n const {schema} = get().db;\n const {db} = get();\n const newTableName =\n tableName !== oldTableName\n ? convertToUniqueColumnOrTableName(\n tableName,\n await db.getTables(schema),\n )\n : tableName;\n const {rowCount} = await db.createTableFromQuery(newTableName, query);\n get().db.setTableRowCount(newTableName, rowCount);\n set((state) =>\n produce(state, (draft) => {\n const newDataSource = {\n type: DataSourceTypes.enum.sql,\n sqlQuery: query,\n tableName: newTableName,\n };\n if (oldTableName) {\n draft.config.dataSources = draft.config.dataSources.map(\n (dataSource) =>\n dataSource.tableName === oldTableName\n ? newDataSource\n : dataSource,\n );\n delete draft.room.dataSourceStates[oldTableName];\n } else {\n draft.config.dataSources.push(newDataSource);\n }\n draft.room.dataSourceStates[newTableName] = {\n status: DataSourceStatus.READY,\n };\n }),\n );\n await get().db.refreshTableSchemas();\n },\n\n removeSqlQueryDataSource: async (tableName) => {\n const {db} = get();\n await db.dropTable(tableName);\n set((state) =>\n produce(state, (draft) => {\n draft.config.dataSources = draft.config.dataSources.filter(\n (d) => d.tableName !== tableName,\n );\n delete draft.room.dataSourceStates[tableName];\n }),\n );\n await get().db.refreshTableSchemas();\n },\n\n setRoomFiles: (roomFiles) =>\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles = roomFiles;\n }),\n ),\n\n async addRoomFile(file, desiredTableName, loadOptions) {\n const {db} = get();\n\n const pathname = file instanceof File ? file.name : file;\n const tableName =\n desiredTableName ?? convertToValidColumnOrTableName(pathname);\n\n await db.connector.loadFile(file, tableName, loadOptions);\n\n // This must come before addDataSource, as addDataSource can trigger\n // download which also adds the file\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles.push({\n pathname,\n duckdbFileName: pathname,\n size: file instanceof File ? file.size : undefined,\n file: file instanceof File ? file : undefined,\n });\n }),\n );\n await get().room.addDataSource(\n {\n type: DataSourceTypes.enum.file,\n fileName: pathname,\n tableName,\n },\n // duckdbFileName ? DataSourceStatus.READY : DataSourceStatus.PENDING,\n DataSourceStatus.READY,\n );\n await get().db.refreshTableSchemas();\n set((state) =>\n produce(state, (draft) => {\n if (\n Object.values(get().room.dataSourceStates).every(\n (ds) => ds.status === DataSourceStatus.READY,\n )\n ) {\n draft.room.isDataAvailable = true;\n }\n }),\n );\n return get().db.findTableByName(tableName);\n },\n\n removeRoomFile(pathname) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles = draft.room.roomFiles.filter(\n (f) => f.pathname !== pathname,\n );\n draft.config.dataSources = draft.config.dataSources.filter(\n (d) =>\n d.type !== DataSourceTypes.Enum.file ||\n d.fileName !== pathname,\n );\n }),\n );\n },\n\n setRoomFileProgress(pathname, fileState) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFilesProgress[pathname] = fileState;\n // Update the file size in the room config from the progress info\n const fileInfo = draft.room.roomFiles.find(\n (f) => f.pathname === pathname,\n );\n if (fileInfo && fileInfo.size === undefined) {\n if (fileState.status !== 'error' && fileState.progress) {\n fileInfo.size = fileState.progress.total;\n }\n }\n }),\n );\n },\n\n areDatasetsReady: () => {\n const {dataSourceStates} = get().room;\n const {config} = get();\n const dataSources = config.dataSources;\n return dataSources.every(\n (ds) =>\n dataSourceStates[ds.tableName]?.status === DataSourceStatus.READY,\n );\n },\n },\n\n ...restState,\n };\n\n // If the tables have changed, update the data sources\n store.subscribe((state, prevState) => {\n if (state.db.tables !== prevState.db.tables) {\n updateReadyDataSources();\n }\n });\n\n async function updateReadyDataSources() {\n const {tables} = get().db;\n const {dataSourceStates} = get().room;\n const {config} = get();\n const {dataSources} = config;\n set((state) =>\n produce(state, (draft) => {\n for (const ds of dataSources) {\n const tableName = ds.tableName;\n const table = tables.find((t) => t.tableName === tableName);\n if (table) {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.READY,\n };\n } else {\n // Prev status could be ERROR or PENDING, don't change it then\n if (!dataSourceStates[tableName]?.status) {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.PENDING,\n };\n }\n }\n }\n }),\n );\n }\n\n async function maybeDownloadDataSources() {\n const {roomFilesProgress, dataSourceStates} = get().room;\n const {dataSources} = get().config;\n const pendingDataSources = dataSources.filter(\n (ds) =>\n !dataSourceStates[ds.tableName] ||\n dataSourceStates[ds.tableName]?.status === DataSourceStatus.PENDING,\n );\n\n const filesToDownload = pendingDataSources.filter((ds) => {\n switch (ds.type) {\n case DataSourceTypes.Enum.file:\n return !roomFilesProgress[ds.fileName];\n case DataSourceTypes.Enum.url:\n return !roomFilesProgress[ds.url];\n default:\n return false;\n }\n }) as (FileDataSource | UrlDataSource)[];\n\n if (filesToDownload.length > 0) {\n await downloadRoomFiles(filesToDownload);\n }\n\n const queriesToRun = pendingDataSources.filter(\n (ds) => ds.type === DataSourceTypes.Enum.sql,\n );\n\n if (queriesToRun.length > 0) {\n await runDataSourceQueries(queriesToRun);\n }\n\n if (get().config.dataSources.length > 0) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.isDataAvailable = true;\n }),\n );\n }\n }\n\n async function downloadRoomFiles(\n filesToDownload: (FileDataSource | UrlDataSource)[],\n ) {\n if (!filesToDownload.length) return;\n const {setTableRowCount} = get().db;\n const {captureException, setTaskProgress, setRoomFileProgress} =\n get().room;\n filesToDownload.forEach((ds) => {\n const fileName =\n ds.type === DataSourceTypes.Enum.file ? ds.fileName : ds.url;\n set((state) =>\n produce(state, (draft) => {\n const info = {\n duckdbFileName: fileName,\n pathname: fileName,\n file: undefined,\n size: undefined,\n };\n const index = draft.room.roomFiles.findIndex(\n (f) => f.pathname === fileName,\n );\n if (index >= 0) {\n draft.room.roomFiles[index] = info;\n } else {\n draft.room.roomFiles.push(info);\n }\n }),\n );\n setRoomFileProgress(fileName, {status: 'download'});\n });\n if (filesToDownload.length > 0) {\n updateTotalFileDownloadProgress();\n }\n\n const loadedFiles = await Promise.all(\n filesToDownload.map(async (ds) => {\n const fileName =\n ds.type === DataSourceTypes.Enum.file ? ds.fileName : ds.url;\n const onProgress = (progress: ProgressInfo) => {\n setRoomFileProgress(fileName, {\n status: 'download',\n progress,\n });\n updateTotalFileDownloadProgress();\n };\n try {\n let downloadedFile: Uint8Array | File;\n switch (ds.type) {\n case DataSourceTypes.Enum.file: {\n const {fileDataSourceLoader} = get().room;\n if (!fileDataSourceLoader) {\n throw new Error('fileDataSourceLoader is not defined');\n }\n downloadedFile = await fileDataSourceLoader(ds, onProgress);\n break;\n }\n case DataSourceTypes.Enum.url: {\n const url = ds.url;\n downloadedFile = await downloadFile(url, {\n ...(ds.type === DataSourceTypes.Enum.url && {\n method: ds.httpMethod,\n headers: ds.headers,\n }),\n onProgress,\n });\n break;\n }\n }\n setRoomFileProgress(fileName, {status: 'done'});\n updateTotalFileDownloadProgress();\n const {db} = get();\n await db.connector.loadFile(\n downloadedFile instanceof File\n ? downloadedFile\n : new File([downloadedFile], fileName),\n ds.tableName,\n ds.loadOptions,\n );\n setTableRowCount(\n ds.tableName,\n await db.getTableRowCount(ds.tableName),\n );\n } catch (err) {\n captureException(err);\n console.error(err);\n setRoomFileProgress(fileName, {\n status: 'error',\n message: 'Download failed',\n });\n // TODO: Make sure the errors are shown\n } finally {\n setTaskProgress(DOWNLOAD_DATA_SOURCES_TASK, undefined);\n }\n }),\n );\n if (loadedFiles.length) {\n await get().db.refreshTableSchemas();\n }\n }\n\n async function runDataSourceQueries(queries: SqlQueryDataSource[]) {\n for (const ds of queries) {\n try {\n const {tableName, sqlQuery} = ds;\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.FETCHING,\n };\n }),\n );\n const {rowCount} = await get().db.createTableFromQuery(\n tableName,\n sqlQuery,\n );\n get().db.setTableRowCount(tableName, rowCount);\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.READY,\n };\n }),\n );\n } catch (err) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[ds.tableName] = {\n status: DataSourceStatus.ERROR,\n message: `${err}`,\n };\n }),\n );\n // TODO: Make sure the errors are shown\n }\n }\n await get().db.refreshTableSchemas();\n await updateReadyDataSources();\n }\n\n function updateTotalFileDownloadProgress() {\n const {setTaskProgress, roomFilesProgress} = get().room;\n let total = 0,\n loaded = 0;\n for (const p of Object.values(roomFilesProgress)) {\n if (p.status === 'download' || p.status === 'done') {\n total += p.progress?.total || 0;\n loaded += p.progress?.loaded || 0;\n }\n }\n setTaskProgress(DOWNLOAD_DATA_SOURCES_TASK, {\n progress: total > 0 ? Math.round((loaded / total) * 100) : undefined,\n message: 'Downloading data…',\n });\n }\n\n return roomState;\n };\n\n return slice;\n}\n\nexport function useBaseRoomShellStore<\n PC extends BaseRoomConfig,\n PS extends RoomShellSliceState<PC>,\n T,\n>(selector: (state: RoomShellSliceState<PC>) => T): T {\n return useBaseRoomStore<PC, PS, T>(selector as (state: RoomState<PC>) => T);\n}\n\nexport function createSlice<PC extends BaseRoomConfig, S>(\n sliceCreator: (\n ...args: Parameters<StateCreator<S & RoomShellSliceState<PC>>>\n ) => S,\n): StateCreator<S> {\n return (set, get, store) =>\n sliceCreator(\n set,\n get as () => S & RoomShellSliceState<PC>,\n store as StoreApi<S & RoomShellSliceState<PC>>,\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqlrooms/room-shell",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.1",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -25,23 +25,23 @@
|
|
|
25
25
|
"typedoc": "typedoc"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@sqlrooms/data-table": "0.
|
|
29
|
-
"@sqlrooms/duckdb": "0.
|
|
30
|
-
"@sqlrooms/layout": "0.
|
|
31
|
-
"@sqlrooms/layout-config": "0.
|
|
32
|
-
"@sqlrooms/room-config": "0.
|
|
33
|
-
"@sqlrooms/room-store": "0.
|
|
34
|
-
"@sqlrooms/ui": "0.
|
|
35
|
-
"@sqlrooms/utils": "0.
|
|
28
|
+
"@sqlrooms/data-table": "0.24.1",
|
|
29
|
+
"@sqlrooms/duckdb": "0.24.1",
|
|
30
|
+
"@sqlrooms/layout": "0.24.1",
|
|
31
|
+
"@sqlrooms/layout-config": "0.24.1",
|
|
32
|
+
"@sqlrooms/room-config": "0.24.1",
|
|
33
|
+
"@sqlrooms/room-store": "0.24.1",
|
|
34
|
+
"@sqlrooms/ui": "0.24.1",
|
|
35
|
+
"@sqlrooms/utils": "0.24.1",
|
|
36
36
|
"apache-arrow": "17.0.0",
|
|
37
37
|
"immer": "^10.1.1",
|
|
38
38
|
"lucide-react": "^0.474.0",
|
|
39
39
|
"react-mosaic-component": "5.3.0",
|
|
40
|
-
"zod": "^3.25.
|
|
40
|
+
"zod": "^3.25.73",
|
|
41
41
|
"zustand": "^5.0.5"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"react": ">=18"
|
|
45
45
|
},
|
|
46
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "4e19f7348a545023fefba724b18fbbad8bf87c32"
|
|
47
47
|
}
|