@sqlrooms/room-shell 0.25.0-rc.0 → 0.26.0-rc.0
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/dist/RoomShellStore.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DataTable, DuckDbConnector,
|
|
2
|
-
import {
|
|
1
|
+
import { DataTable, DuckDbConnector, DuckDbSliceState, LoadFileOptions } from '@sqlrooms/duckdb';
|
|
2
|
+
import { LayoutSliceState, RoomPanelInfo } from '@sqlrooms/layout';
|
|
3
3
|
import { BaseRoomConfig, DataSource, FileDataSource } from '@sqlrooms/room-config';
|
|
4
4
|
import { RoomState, RoomStateActions, RoomStateProps } from '@sqlrooms/room-store';
|
|
5
5
|
import { ProgressInfo } from '@sqlrooms/utils';
|
|
@@ -7,7 +7,6 @@ import { ReactNode } from 'react';
|
|
|
7
7
|
import { StateCreator, StoreApi } from 'zustand';
|
|
8
8
|
import { DataSourceState, DataSourceStatus, RoomFileInfo, RoomFileState } from './types';
|
|
9
9
|
export type RoomShellStore<PC extends BaseRoomConfig> = StoreApi<RoomShellSliceState<PC>>;
|
|
10
|
-
export declare const INITIAL_BASE_ROOM_CONFIG: BaseRoomConfig & DuckDbSliceConfig & LayoutSliceConfig;
|
|
11
10
|
export type RoomShellSliceStateProps<PC extends BaseRoomConfig> = RoomStateProps<PC> & {
|
|
12
11
|
roomFiles: RoomFileInfo[];
|
|
13
12
|
roomFilesProgress: {
|
|
@@ -76,7 +75,7 @@ export type RoomShellSliceStateActions<PC extends BaseRoomConfig> = RoomStateAct
|
|
|
76
75
|
setRoomFileProgress(pathname: string, fileState: RoomFileState): void;
|
|
77
76
|
addDataSource: (dataSource: DataSource, status?: DataSourceStatus) => Promise<void>;
|
|
78
77
|
};
|
|
79
|
-
export type RoomShellSliceState<PC extends BaseRoomConfig> = RoomState<PC> & {
|
|
78
|
+
export type RoomShellSliceState<PC extends BaseRoomConfig = BaseRoomConfig> = RoomState<PC> & {
|
|
80
79
|
initialize?: () => Promise<void>;
|
|
81
80
|
config: PC;
|
|
82
81
|
room: RoomShellSliceStateProps<PC> & RoomShellSliceStateActions<PC>;
|
|
@@ -91,7 +90,7 @@ type InitialState<PC extends BaseRoomConfig> = {
|
|
|
91
90
|
panels?: Record<string, RoomPanelInfo>;
|
|
92
91
|
};
|
|
93
92
|
};
|
|
94
|
-
export declare function createRoomShellSlice<PC extends BaseRoomConfig>(props: InitialState<PC>): StateCreator<RoomShellSliceState<PC>>;
|
|
93
|
+
export declare function createRoomShellSlice<PC extends BaseRoomConfig = BaseRoomConfig>(props: InitialState<PC>): StateCreator<RoomShellSliceState<PC>>;
|
|
95
94
|
export declare function useBaseRoomShellStore<PC extends BaseRoomConfig, PS extends RoomShellSliceState<PC>, T>(selector: (state: RoomShellSliceState<PC>) => T): T;
|
|
96
95
|
export declare function createSlice<PC extends BaseRoomConfig, S>(sliceCreator: (...args: Parameters<StateCreator<S & RoomShellSliceState<PC>>>) => S): StateCreator<S>;
|
|
97
96
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoomShellStore.d.ts","sourceRoot":"","sources":["../src/RoomShellStore.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,
|
|
1
|
+
{"version":3,"file":"RoomShellStore.d.ts","sourceRoot":"","sources":["../src/RoomShellStore.ts"],"names":[],"mappings":"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"}
|
package/dist/RoomShellStore.js
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import { createDefaultDuckDbConfig, createDuckDbSlice, } from '@sqlrooms/duckdb';
|
|
2
2
|
import { createDefaultLayoutConfig, createLayoutSlice, } from '@sqlrooms/layout';
|
|
3
|
-
import { DEFAULT_MOSAIC_LAYOUT } from '@sqlrooms/layout-config';
|
|
4
3
|
import { DataSourceTypes, } from '@sqlrooms/room-config';
|
|
5
4
|
import { createRoomSlice, isRoomSliceWithInitialize, useBaseRoomStore, } from '@sqlrooms/room-store';
|
|
6
5
|
import { ErrorBoundary } from '@sqlrooms/ui';
|
|
7
6
|
import { convertToUniqueColumnOrTableName, convertToValidColumnOrTableName, downloadFile, } from '@sqlrooms/utils';
|
|
8
7
|
import { castDraft, produce } from 'immer';
|
|
8
|
+
import { createDefaultBaseRoomConfig } from '@sqlrooms/room-config';
|
|
9
9
|
import { DataSourceStatus, } from './types';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
layout: DEFAULT_MOSAIC_LAYOUT,
|
|
13
|
-
description: '',
|
|
14
|
-
dataSources: [],
|
|
10
|
+
const INITIAL_BASE_ROOM_CONFIG = {
|
|
11
|
+
...createDefaultBaseRoomConfig(),
|
|
15
12
|
...createDefaultDuckDbConfig(),
|
|
16
13
|
...createDefaultLayoutConfig(),
|
|
17
14
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoomShellStore.js","sourceRoot":"","sources":["../src/RoomShellStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAIL,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAGL,eAAe,GAIhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAIL,eAAe,EACf,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAC3C,OAAO,EAEL,gCAAgC,EAChC,+BAA+B,EAC/B,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,SAAS,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;AAGzC,OAAO,EAEL,gBAAgB,GAGjB,MAAM,SAAS,CAAC;AAMjB,MAAM,CAAC,MAAM,wBAAwB,GAEf;IACpB,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,qBAAqB;IAC7B,WAAW,EAAE,EAAE;IACf,WAAW,EAAE,EAAE;IACf,GAAG,yBAAyB,EAAE;IAC9B,GAAG,yBAAyB,EAAE;CAC/B,CAAC;AAwGF,MAAM,0BAA0B,GAAG,uBAAuB,CAAC;AAC3D,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B,MAAM,cAAc,GAAG,WAAW,CAAC;AAEnC,MAAM,UAAU,oBAAoB,CAClC,KAAuB;IAEvB,MAAM,KAAK,GAA0C,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACvE,MAAM,EACJ,SAAS,EACT,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,cAAc,EACpB,GAAG,SAAS,EACb,GAAG,KAAK,CAAC;QACV,MAAM,aAAa,GAAO;YACxB,GAAG,wBAAwB;YAC3B,GAAG,WAAW;SACT,CAAC;QACR,MAAM,gBAAgB,GAAG;YACvB,mBAAmB,EAAE,aAAa;YAClC,SAAS,EAAE,EAAE;YACb,iBAAiB,EAAE,EAAE;YACrB,eAAe,EAAE,KAAK;YACtB,gBAAgB,EAAE,EAAE;YACpB,GAAG,cAAc;SAClB,CAAC;QACF,MAAM,cAAc,GAAG,eAAe,CAAC;YACrC,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,gBAAgB;SACvB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAEpB,MAAM,SAAS,GAA4B;YACzC,GAAG,cAAc;YACjB,GAAG,iBAAiB,CAAC,EAAC,SAAS,EAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;YAClD,GAAG,iBAAiB,CAAC,EAAC,MAAM,EAAE,cAAc,CAAC,MAAM,EAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;YACtE,IAAI,EAAE;gBACJ,GAAG,gBAAgB;gBACnB,GAAG,cAAc,CAAC,IAAI;gBACtB,KAAK,CAAC,UAAU;oBACd,MAAM,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;oBAEvC,MAAM,EAAC,eAAe,EAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;oBACrC,eAAe,CAAC,YAAY,EAAE;wBAC5B,OAAO,EAAE,wBAAwB;wBACjC,QAAQ,EAAE,SAAS;qBACpB,CAAC,CAAC;oBACH,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;oBAC5B,eAAe,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;oBAEzC,eAAe,CAAC,cAAc,EAAE;wBAC9B,OAAO,EAAE,uBAAuB;wBAChC,QAAQ,EAAE,SAAS;qBACpB,CAAC,CAAC;oBACH,MAAM,sBAAsB,EAAE,CAAC;oBAC/B,MAAM,wBAAwB,EAAE,CAAC;oBAEjC,uEAAuE;oBACvE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CACpD,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CACf,GAAG,KAAK,MAAM;wBACd,GAAG,KAAK,IAAI;wBACZ,yBAAyB,CAAC,KAAK,CAAC,CACnC,CAAC;oBACF,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;wBAChC,IAAI,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC;4BACrC,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;wBAC3B,CAAC;oBACH,CAAC;oBACD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAC/B,IAAI,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC;wBACrC,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;oBAC3B,CAAC;oBAED,eAAe,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;gBAC7C,CAAC;gBAED,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CACxB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;gBACnC,CAAC,CAAC,CACH;gBACH,kBAAkB,EAAE,CAAC,MAAM,EAAE,EAAE,CAC7B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;gBACjD,CAAC,CAAC,CACH;gBACH,iBAAiB,EAAE,GAAG,EAAE;oBACtB,MAAM,EAAC,eAAe,EAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;oBACrC,MAAM,EAAC,MAAM,EAAC,GAAG,GAAG,EAAE,CAAC;oBACvB,OAAO,MAAM,KAAK,eAAe,CAAC;gBACpC,CAAC;gBAED,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CACtB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;gBAC7B,CAAC,CAAC,CACH;gBAEH,cAAc,EAAE,CAAC,WAAW,EAAE,EAAE,CAC9B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;gBACzC,CAAC,CAAC,CACH;gBAEH,aAAa,EAAE,KAAK,EAClB,UAAU,EACV,MAAM,GAAG,gBAAgB,CAAC,OAAO,EACjC,EAAE;oBACF,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC;wBAC7C,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;wBACvC,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CACjC,CAAC;wBACF,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;4BACf,WAAW,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;wBAClC,CAAC;6BAAM,CAAC;4BACN,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;wBAC/B,CAAC;wBACD,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG,EAAC,MAAM,EAAC,CAAC;oBACpD,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,wBAAwB,EAAE,CAAC;gBACnC,CAAC;gBAED,KAAK,CAAC,6BAA6B,CAAC,SAAS,EAAE,KAAK,EAAE,YAAY;oBAChE,MAAM,EAAC,MAAM,EAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;oBAC1B,MAAM,EAAC,EAAE,EAAC,GAAG,GAAG,EAAE,CAAC;oBACnB,MAAM,YAAY,GAChB,SAAS,KAAK,YAAY;wBACxB,CAAC,CAAC,gCAAgC,CAC9B,SAAS,EACT,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAC3B;wBACH,CAAC,CAAC,SAAS,CAAC;oBAChB,MAAM,EAAC,QAAQ,EAAC,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;oBACtE,GAAG,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;oBAClD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,MAAM,aAAa,GAAG;4BACpB,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,GAAG;4BAC9B,QAAQ,EAAE,KAAK;4BACf,SAAS,EAAE,YAAY;yBACxB,CAAC;wBACF,IAAI,YAAY,EAAE,CAAC;4BACjB,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CACrD,CAAC,UAAU,EAAE,EAAE,CACb,UAAU,CAAC,SAAS,KAAK,YAAY;gCACnC,CAAC,CAAC,aAAa;gCACf,CAAC,CAAC,UAAU,CACjB,CAAC;4BACF,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;wBACnD,CAAC;6BAAM,CAAC;4BACN,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;wBAC/C,CAAC;wBACD,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,GAAG;4BAC1C,MAAM,EAAE,gBAAgB,CAAC,KAAK;yBAC/B,CAAC;oBACJ,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC;gBACvC,CAAC;gBAED,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAC1B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;gBACnC,CAAC,CAAC,CACH;gBAEH,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,WAAW;oBACnD,MAAM,EAAC,EAAE,EAAC,GAAG,GAAG,EAAE,CAAC;oBAEnB,MAAM,QAAQ,GAAG,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;oBACzD,MAAM,SAAS,GACb,gBAAgB,IAAI,+BAA+B,CAAC,QAAQ,CAAC,CAAC;oBAEhE,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;oBAE1D,oEAAoE;oBACpE,oCAAoC;oBACpC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;4BACxB,QAAQ;4BACR,cAAc,EAAE,QAAQ;4BACxB,IAAI,EAAE,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;4BAClD,IAAI,EAAE,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;yBAC9C,CAAC,CAAC;oBACL,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAC5B;wBACE,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI;wBAC/B,QAAQ,EAAE,QAAQ;wBAClB,SAAS;qBACV;oBACD,sEAAsE;oBACtE,gBAAgB,CAAC,KAAK,CACvB,CAAC;oBACF,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC;oBACrC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,IACE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAC9C,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,gBAAgB,CAAC,KAAK,CAC7C,EACD,CAAC;4BACD,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;wBACpC,CAAC;oBACH,CAAC,CAAC,CACH,CAAC;oBACF,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;gBAC7C,CAAC;gBACD,wBAAwB,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;oBAC5C,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBAC/C,CAAC;gBACD,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;oBACpC,MAAM,EAAC,EAAE,EAAC,GAAG,GAAG,EAAE,CAAC;oBACnB,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CACjC,CAAC;oBACF,IAAI,UAAU,EAAE,CAAC;wBACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;4BACvB,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CACxD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CACjC,CAAC;4BACF,IAAI,UAAU,EAAE,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gCACnD,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAChD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ,CAC1C,CAAC;4BACJ,CAAC;4BACD,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;wBAChD,CAAC,CAAC,CACH,CAAC;wBACF,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;wBAC9B,MAAM,EAAE,CAAC,mBAAmB,EAAE,CAAC;oBACjC,CAAC;gBACH,CAAC;gBAED,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;oBACjC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAClE,CAAC;oBACF,IAAI,UAAU,EAAE,CAAC;wBACf,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;oBAC1D,CAAC;gBACH,CAAC;gBAED,mBAAmB,CAAC,QAAQ,EAAE,SAAS;oBACrC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;wBACnD,iEAAiE;wBACjE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAC/B,CAAC;wBACF,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;4BAC5C,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gCACvD,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;4BAC3C,CAAC;wBACH,CAAC;oBACH,CAAC,CAAC,CACH,CAAC;gBACJ,CAAC;gBAED,gBAAgB,EAAE,GAAG,EAAE;oBACrB,MAAM,EAAC,gBAAgB,EAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;oBACtC,MAAM,EAAC,MAAM,EAAC,GAAG,GAAG,EAAE,CAAC;oBACvB,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;oBACvC,OAAO,WAAW,CAAC,KAAK,CACtB,CAAC,EAAE,EAAE,EAAE,CACL,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,gBAAgB,CAAC,KAAK,CACpE,CAAC;gBACJ,CAAC;aACF;YAED,GAAG,SAAS;SACb,CAAC;QAEF,sDAAsD;QACtD,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YACnC,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;gBAC5C,sBAAsB,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,UAAU,sBAAsB;YACnC,MAAM,EAAC,MAAM,EAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;YAC1B,MAAM,EAAC,gBAAgB,EAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;YACtC,MAAM,EAAC,MAAM,EAAC,GAAG,GAAG,EAAE,CAAC;YACvB,MAAM,EAAC,WAAW,EAAC,GAAG,MAAM,CAAC;YAC7B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvB,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;oBAC7B,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC;oBAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;oBAC5D,IAAI,KAAK,EAAE,CAAC;wBACV,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG;4BACvC,MAAM,EAAE,gBAAgB,CAAC,KAAK;yBAC/B,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,8DAA8D;wBAC9D,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;4BACzC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG;gCACvC,MAAM,EAAE,gBAAgB,CAAC,OAAO;6BACjC,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;QAED,KAAK,UAAU,wBAAwB;YACrC,MAAM,EAAC,iBAAiB,EAAE,gBAAgB,EAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;YACzD,MAAM,EAAC,WAAW,EAAC,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC;YACnC,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAC3C,CAAC,EAAE,EAAE,EAAE,CACL,CAAC,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC;gBAC/B,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,gBAAgB,CAAC,OAAO,CACtE,CAAC;YAEF,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;gBACvD,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;oBAChB,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI;wBAC5B,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;oBACzC,KAAK,eAAe,CAAC,IAAI,CAAC,GAAG;wBAC3B,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;oBACpC;wBACE,OAAO,KAAK,CAAC;gBACjB,CAAC;YACH,CAAC,CAAuC,CAAC;YAEzC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,iBAAiB,CAAC,eAAe,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAC5C,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,GAAG,CAC7C,CAAC;YAEF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAC3C,CAAC;YAED,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBACpC,CAAC,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;QAED,KAAK,UAAU,iBAAiB,CAC9B,eAAmD;YAEnD,IAAI,CAAC,eAAe,CAAC,MAAM;gBAAE,OAAO;YACpC,MAAM,EAAC,gBAAgB,EAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;YACpC,MAAM,EAAC,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EAAC,GAC5D,GAAG,EAAE,CAAC,IAAI,CAAC;YACb,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;gBAC7B,MAAM,QAAQ,GACZ,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;gBAC/D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,MAAM,IAAI,GAAG;wBACX,cAAc,EAAE,QAAQ;wBACxB,QAAQ,EAAE,QAAQ;wBAClB,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,SAAS;qBAChB,CAAC;oBACF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAC/B,CAAC;oBACF,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;wBACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;oBACrC,CAAC;yBAAM,CAAC;wBACN,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC,CAAC,CACH,CAAC;gBACF,mBAAmB,CAAC,QAAQ,EAAE,EAAC,MAAM,EAAE,UAAU,EAAC,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;YACH,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,+BAA+B,EAAE,CAAC;YACpC,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CACnC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAC/B,MAAM,QAAQ,GACZ,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;gBAC/D,MAAM,UAAU,GAAG,CAAC,QAAsB,EAAE,EAAE;oBAC5C,mBAAmB,CAAC,QAAQ,EAAE;wBAC5B,MAAM,EAAE,UAAU;wBAClB,QAAQ;qBACT,CAAC,CAAC;oBACH,+BAA+B,EAAE,CAAC;gBACpC,CAAC,CAAC;gBACF,IAAI,CAAC;oBACH,IAAI,cAAiC,CAAC;oBACtC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;wBAChB,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;4BAC/B,MAAM,EAAC,oBAAoB,EAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;4BAC1C,IAAI,CAAC,oBAAoB,EAAE,CAAC;gCAC1B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;4BACzD,CAAC;4BACD,cAAc,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;4BAC5D,MAAM;wBACR,CAAC;wBACD,KAAK,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;4BAC9B,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;4BACnB,cAAc,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE;gCACvC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI;oCAC1C,MAAM,EAAE,EAAE,CAAC,UAAU;oCACrB,OAAO,EAAE,EAAE,CAAC,OAAO;iCACpB,CAAC;gCACF,UAAU;6BACX,CAAC,CAAC;4BACH,MAAM;wBACR,CAAC;oBACH,CAAC;oBACD,mBAAmB,CAAC,QAAQ,EAAE,EAAC,MAAM,EAAE,MAAM,EAAC,CAAC,CAAC;oBAChD,+BAA+B,EAAE,CAAC;oBAClC,MAAM,EAAC,EAAE,EAAC,GAAG,GAAG,EAAE,CAAC;oBACnB,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,CACzB,cAAc,YAAY,IAAI;wBAC5B,CAAC,CAAC,cAAc;wBAChB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,EACxC,EAAE,CAAC,SAAS,EACZ,EAAE,CAAC,WAAW,CACf,CAAC;oBACF,gBAAgB,CACd,EAAE,CAAC,SAAS,EACZ,MAAM,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC,CACxC,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,gBAAgB,CAAC,GAAG,CAAC,CAAC;oBACtB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACnB,mBAAmB,CAAC,QAAQ,EAAE;wBAC5B,MAAM,EAAE,OAAO;wBACf,OAAO,EAAE,iBAAiB;qBAC3B,CAAC,CAAC;oBACH,uCAAuC;gBACzC,CAAC;wBAAS,CAAC;oBACT,eAAe,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC,CAAC,CACH,CAAC;YACF,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;gBACvB,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC;YACvC,CAAC;QACH,CAAC;QAED,KAAK,UAAU,oBAAoB,CAAC,OAA6B;YAC/D,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,EAAC,SAAS,EAAE,QAAQ,EAAC,GAAG,EAAE,CAAC;oBACjC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG;4BACvC,MAAM,EAAE,gBAAgB,CAAC,QAAQ;yBAClC,CAAC;oBACJ,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,EAAC,QAAQ,EAAC,GAAG,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,oBAAoB,CACpD,SAAS,EACT,QAAQ,CACT,CAAC;oBACF,GAAG,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAC/C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG;4BACvC,MAAM,EAAE,gBAAgB,CAAC,KAAK;yBAC/B,CAAC;oBACJ,CAAC,CAAC,CACH,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG;4BAC1C,MAAM,EAAE,gBAAgB,CAAC,KAAK;4BAC9B,OAAO,EAAE,GAAG,GAAG,EAAE;yBAClB,CAAC;oBACJ,CAAC,CAAC,CACH,CAAC;oBACF,uCAAuC;gBACzC,CAAC;YACH,CAAC;YACD,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC;YACrC,MAAM,sBAAsB,EAAE,CAAC;QACjC,CAAC;QAED,SAAS,+BAA+B;YACtC,MAAM,EAAC,eAAe,EAAE,iBAAiB,EAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;YACxD,IAAI,KAAK,GAAG,CAAC,EACX,MAAM,GAAG,CAAC,CAAC;YACb,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBACnD,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC;oBAChC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;YACD,eAAe,CAAC,0BAA0B,EAAE;gBAC1C,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;gBACpE,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CAInC,QAA+C;IAC/C,OAAO,gBAAgB,CAAY,QAAuC,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,YAEM;IAEN,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CACzB,YAAY,CACV,GAAG,EACH,GAAwC,EACxC,KAA8C,CAC/C,CAAC;AACN,CAAC","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 areDatasetsReady(): boolean;\n\n addRoomFile(\n file: File | string,\n tableName?: string,\n loadFileOptions?: LoadFileOptions,\n ): Promise<DataTable | undefined>;\n /**\n * @deprecated Use removeDataSource or removeRoomFile instead\n */\n removeSqlQueryDataSource(tableName: string): Promise<void>;\n /**\n * Removes a data source from the room by tableName.\n * @param tableName - The name of the table of the data source to remove.\n */\n removeDataSource(tableName: string): Promise<void>;\n /**\n * Removes a file data source from the room by pathname.\n * @param pathname - The pathname of the file to remove.\n */\n removeRoomFile(pathname: string): Promise<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 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 removeSqlQueryDataSource: async (tableName) => {\n await get().room.removeDataSource(tableName);\n },\n removeDataSource: async (tableName) => {\n const {db} = get();\n const dataSource = get().config.dataSources.find(\n (d) => d.tableName === tableName,\n );\n if (dataSource) {\n set((state) =>\n produce(state, (draft) => {\n draft.config.dataSources = draft.config.dataSources.filter(\n (d) => d.tableName !== tableName,\n );\n if (dataSource?.type === DataSourceTypes.Enum.file) {\n draft.room.roomFiles = draft.room.roomFiles.filter(\n (f) => f.pathname !== dataSource.fileName,\n );\n }\n delete draft.room.dataSourceStates[tableName];\n }),\n );\n await db.dropTable(tableName);\n await db.refreshTableSchemas();\n }\n },\n\n removeRoomFile: async (pathname) => {\n const dataSource = get().config.dataSources.find(\n (d) =>\n d.type === DataSourceTypes.Enum.file && d.fileName === pathname,\n );\n if (dataSource) {\n await get().room.removeDataSource(dataSource.tableName);\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"]}
|
|
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 {createDefaultBaseRoomConfig} from '@sqlrooms/room-config';\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\nconst INITIAL_BASE_ROOM_CONFIG: BaseRoomConfig &\n DuckDbSliceConfig &\n LayoutSliceConfig = {\n ...createDefaultBaseRoomConfig(),\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 areDatasetsReady(): boolean;\n\n addRoomFile(\n file: File | string,\n tableName?: string,\n loadFileOptions?: LoadFileOptions,\n ): Promise<DataTable | undefined>;\n /**\n * @deprecated Use removeDataSource or removeRoomFile instead\n */\n removeSqlQueryDataSource(tableName: string): Promise<void>;\n /**\n * Removes a data source from the room by tableName.\n * @param tableName - The name of the table of the data source to remove.\n */\n removeDataSource(tableName: string): Promise<void>;\n /**\n * Removes a file data source from the room by pathname.\n * @param pathname - The pathname of the file to remove.\n */\n removeRoomFile(pathname: string): Promise<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 = BaseRoomConfig> =\n 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<\n PC extends BaseRoomConfig = BaseRoomConfig,\n>(props: InitialState<PC>): 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 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 removeSqlQueryDataSource: async (tableName) => {\n await get().room.removeDataSource(tableName);\n },\n removeDataSource: async (tableName) => {\n const {db} = get();\n const dataSource = get().config.dataSources.find(\n (d) => d.tableName === tableName,\n );\n if (dataSource) {\n set((state) =>\n produce(state, (draft) => {\n draft.config.dataSources = draft.config.dataSources.filter(\n (d) => d.tableName !== tableName,\n );\n if (dataSource?.type === DataSourceTypes.Enum.file) {\n draft.room.roomFiles = draft.room.roomFiles.filter(\n (f) => f.pathname !== dataSource.fileName,\n );\n }\n delete draft.room.dataSourceStates[tableName];\n }),\n );\n await db.dropTable(tableName);\n await db.refreshTableSchemas();\n }\n },\n\n removeRoomFile: async (pathname) => {\n const dataSource = get().config.dataSources.find(\n (d) =>\n d.type === DataSourceTypes.Enum.file && d.fileName === pathname,\n );\n if (dataSource) {\n await get().room.removeDataSource(dataSource.tableName);\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.26.0-rc.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -25,14 +25,14 @@
|
|
|
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.26.0-rc.0",
|
|
29
|
+
"@sqlrooms/duckdb": "0.26.0-rc.0",
|
|
30
|
+
"@sqlrooms/layout": "0.26.0-rc.0",
|
|
31
|
+
"@sqlrooms/layout-config": "0.26.0-rc.0",
|
|
32
|
+
"@sqlrooms/room-config": "0.26.0-rc.0",
|
|
33
|
+
"@sqlrooms/room-store": "0.26.0-rc.0",
|
|
34
|
+
"@sqlrooms/ui": "0.26.0-rc.0",
|
|
35
|
+
"@sqlrooms/utils": "0.26.0-rc.0",
|
|
36
36
|
"apache-arrow": "17.0.0",
|
|
37
37
|
"immer": "^10.1.1",
|
|
38
38
|
"lucide-react": "^0.474.0",
|
|
@@ -43,5 +43,5 @@
|
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"react": ">=18"
|
|
45
45
|
},
|
|
46
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "05d355acee6ea65b33b09c6e49d7746ffacb866e"
|
|
47
47
|
}
|