@sqlrooms/cells 0.29.0-rc.1 → 0.29.0-rc.10
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/LICENSE.md +2 -1
- package/README.md +8 -8
- package/dist/cellsSlice.d.ts.map +1 -1
- package/dist/cellsSlice.js +305 -264
- package/dist/cellsSlice.js.map +1 -1
- package/dist/components/AggregationSelector.d.ts +8 -0
- package/dist/components/AggregationSelector.d.ts.map +1 -0
- package/dist/components/AggregationSelector.js +13 -0
- package/dist/components/AggregationSelector.js.map +1 -0
- package/dist/components/CellSourceSelector.d.ts +12 -0
- package/dist/components/CellSourceSelector.d.ts.map +1 -0
- package/dist/components/CellSourceSelector.js +34 -0
- package/dist/components/CellSourceSelector.js.map +1 -0
- package/dist/components/ChartTypeSelector.d.ts +8 -0
- package/dist/components/ChartTypeSelector.d.ts.map +1 -0
- package/dist/components/ChartTypeSelector.js +13 -0
- package/dist/components/ChartTypeSelector.js.map +1 -0
- package/dist/components/CollapsibleSectionButton.d.ts +10 -0
- package/dist/components/CollapsibleSectionButton.d.ts.map +1 -0
- package/dist/components/CollapsibleSectionButton.js +10 -0
- package/dist/components/CollapsibleSectionButton.js.map +1 -0
- package/dist/components/ColorSelector.d.ts +24 -0
- package/dist/components/ColorSelector.d.ts.map +1 -0
- package/dist/components/ColorSelector.js +17 -0
- package/dist/components/ColorSelector.js.map +1 -0
- package/dist/components/FieldSelector.d.ts +11 -0
- package/dist/components/FieldSelector.d.ts.map +1 -0
- package/dist/components/FieldSelector.js +11 -0
- package/dist/components/FieldSelector.js.map +1 -0
- package/dist/components/FieldTypeIcon.d.ts +8 -0
- package/dist/components/FieldTypeIcon.d.ts.map +1 -0
- package/dist/components/FieldTypeIcon.js +27 -0
- package/dist/components/FieldTypeIcon.js.map +1 -0
- package/dist/components/InputCellContent.d.ts.map +1 -1
- package/dist/components/InputCellContent.js +3 -3
- package/dist/components/InputCellContent.js.map +1 -1
- package/dist/components/SqlCellConnectionSelector.d.ts +9 -0
- package/dist/components/SqlCellConnectionSelector.d.ts.map +1 -0
- package/dist/components/SqlCellConnectionSelector.js +21 -0
- package/dist/components/SqlCellConnectionSelector.js.map +1 -0
- package/dist/components/SqlCellContent.d.ts.map +1 -1
- package/dist/components/SqlCellContent.js +31 -160
- package/dist/components/SqlCellContent.js.map +1 -1
- package/dist/components/SqlCellDependentsMenu.d.ts +11 -0
- package/dist/components/SqlCellDependentsMenu.d.ts.map +1 -0
- package/dist/components/SqlCellDependentsMenu.js +62 -0
- package/dist/components/SqlCellDependentsMenu.js.map +1 -0
- package/dist/components/SqlCellEditor.d.ts +14 -0
- package/dist/components/SqlCellEditor.d.ts.map +1 -0
- package/dist/components/SqlCellEditor.js +17 -0
- package/dist/components/SqlCellEditor.js.map +1 -0
- package/dist/components/SqlCellResultNameEditor.d.ts +8 -0
- package/dist/components/SqlCellResultNameEditor.d.ts.map +1 -0
- package/dist/components/SqlCellResultNameEditor.js +38 -0
- package/dist/components/SqlCellResultNameEditor.js.map +1 -0
- package/dist/components/SqlCellResults.d.ts +17 -0
- package/dist/components/SqlCellResults.d.ts.map +1 -0
- package/dist/components/SqlCellResults.js +44 -0
- package/dist/components/SqlCellResults.js.map +1 -0
- package/dist/components/SqlCellRunButton.d.ts +5 -6
- package/dist/components/SqlCellRunButton.d.ts.map +1 -1
- package/dist/components/SqlCellRunButton.js +11 -7
- package/dist/components/SqlCellRunButton.js.map +1 -1
- package/dist/components/SqlQueryPreview.d.ts +9 -0
- package/dist/components/SqlQueryPreview.d.ts.map +1 -0
- package/dist/components/SqlQueryPreview.js +14 -0
- package/dist/components/SqlQueryPreview.js.map +1 -0
- package/dist/components/TextCellContent.d.ts.map +1 -1
- package/dist/components/TextCellContent.js +24 -7
- package/dist/components/TextCellContent.js.map +1 -1
- package/dist/components/VegaCellContent.d.ts +0 -1
- package/dist/components/VegaCellContent.d.ts.map +1 -1
- package/dist/components/VegaCellContent.js +28 -49
- package/dist/components/VegaCellContent.js.map +1 -1
- package/dist/components/VegaCellHeader.d.ts +8 -0
- package/dist/components/VegaCellHeader.d.ts.map +1 -0
- package/dist/components/VegaCellHeader.js +30 -0
- package/dist/components/VegaCellHeader.js.map +1 -0
- package/dist/components/VegaConfigPanel.d.ts.map +1 -1
- package/dist/components/VegaConfigPanel.js +23 -64
- package/dist/components/VegaConfigPanel.js.map +1 -1
- package/dist/dagUtils.d.ts +10 -9
- package/dist/dagUtils.d.ts.map +1 -1
- package/dist/dagUtils.js +76 -50
- package/dist/dagUtils.js.map +1 -1
- package/dist/defaultCellRegistry.d.ts.map +1 -1
- package/dist/defaultCellRegistry.js +82 -39
- package/dist/defaultCellRegistry.js.map +1 -1
- package/dist/execution.d.ts.map +1 -1
- package/dist/execution.js +27 -20
- package/dist/execution.js.map +1 -1
- package/dist/helpers.d.ts +21 -28
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +77 -90
- package/dist/helpers.js.map +1 -1
- package/dist/hooks/useVegaCellDataSource.d.ts +18 -0
- package/dist/hooks/useVegaCellDataSource.d.ts.map +1 -0
- package/dist/hooks/useVegaCellDataSource.js +40 -0
- package/dist/hooks/useVegaCellDataSource.js.map +1 -0
- package/dist/hooks/useVegaCellQuery.d.ts +12 -0
- package/dist/hooks/useVegaCellQuery.d.ts.map +1 -0
- package/dist/hooks/useVegaCellQuery.js +12 -0
- package/dist/hooks/useVegaCellQuery.js.map +1 -0
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/resultRelationPolicy.d.ts +2 -2
- package/dist/resultRelationPolicy.d.ts.map +1 -1
- package/dist/resultRelationPolicy.js +9 -1
- package/dist/resultRelationPolicy.js.map +1 -1
- package/dist/sqlHelpers.d.ts +8 -8
- package/dist/sqlHelpers.d.ts.map +1 -1
- package/dist/sqlHelpers.js +16 -12
- package/dist/sqlHelpers.js.map +1 -1
- package/dist/types.d.ts +113 -70
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +22 -13
- package/dist/types.js.map +1 -1
- package/dist/useValidateResultName.d.ts +34 -0
- package/dist/useValidateResultName.d.ts.map +1 -0
- package/dist/useValidateResultName.js +111 -0
- package/dist/useValidateResultName.js.map +1 -0
- package/dist/utils.d.ts +10 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +20 -4
- package/dist/utils.js.map +1 -1
- package/dist/vegaSelectionUtils.d.ts +14 -0
- package/dist/vegaSelectionUtils.d.ts.map +1 -0
- package/dist/vegaSelectionUtils.js +97 -0
- package/dist/vegaSelectionUtils.js.map +1 -0
- package/dist/vegaSpecBuilder.d.ts +34 -0
- package/dist/vegaSpecBuilder.d.ts.map +1 -0
- package/dist/vegaSpecBuilder.js +90 -0
- package/dist/vegaSpecBuilder.js.map +1 -0
- package/package.json +20 -21
- package/dist/components/DeleteSheetModal.d.ts +0 -9
- package/dist/components/DeleteSheetModal.d.ts.map +0 -1
- package/dist/components/DeleteSheetModal.js +0 -6
- package/dist/components/DeleteSheetModal.js.map +0 -1
- package/dist/components/SheetsTabBar.d.ts +0 -6
- package/dist/components/SheetsTabBar.d.ts.map +0 -1
- package/dist/components/SheetsTabBar.js +0 -57
- package/dist/components/SheetsTabBar.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VegaCellHeader.js","sourceRoot":"","sources":["../../src/components/VegaCellHeader.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AACpC,OAAO,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAC,QAAQ,EAAC,MAAM,cAAc,CAAC;AACtC,OAAO,EAAC,kBAAkB,EAAE,mBAAmB,EAAC,MAAM,YAAY,CAAC;AACnE,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,aAAa,EAAC,MAAM,UAAU,CAAC;AASvC,MAAM,CAAC,MAAM,cAAc,GAAkC,CAAC,EAC5D,MAAM,EACN,WAAW,EACX,YAAY,EACZ,aAAa,GACd,EAAE,EAAE;IACH,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9E,MAAM,sBAAsB,GAAG,CAAC,KAAa,EAAE,EAAE;QAC/C,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CACvB,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;YACnB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,MAAM,eAAe,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAE5C,IAAI,eAAe,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC;gBACnC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC7B,CAAC;iBAAM,IAAI,QAAQ,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,kBAAkB,IACjB,UAAU,EAAE,UAAU,IAAI,EAAE,EAC5B,KAAK,EAAE,WAAW,EAClB,aAAa,EAAE,sBAAsB,GACrC,EACF,KAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,OAAO,EAAC,WAAW,EACnB,SAAS,EAAC,KAAK,EACf,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,CAAC,aAAa,YAExB,KAAC,QAAQ,IAAC,SAAS,EAAC,SAAS,GAAG,GACzB,IACL,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {Button} from '@sqlrooms/ui';\nimport {produce} from 'immer';\nimport {Settings} from 'lucide-react';\nimport {fromDataSourceCell, fromDataSourceTable} from '../helpers';\nimport {CellSourceSelector} from './CellSourceSelector';\nimport {useCellsStore} from '../hooks';\n\nexport type VegaCellHeaderProps = {\n cellId: string;\n selectValue: string | undefined;\n onEditToggle: () => void;\n hasDataSource: boolean;\n};\n\nexport const VegaCellHeader: React.FC<VegaCellHeaderProps> = ({\n cellId,\n selectValue,\n onEditToggle,\n hasDataSource,\n}) => {\n const updateCell = useCellsStore((s) => s.cells.updateCell);\n const artifactId = useCellsStore((s) => s.cells.getArtifactIdForCell(cellId));\n\n const handleDataSourceChange = (value: string) => {\n updateCell(cellId, (c) =>\n produce(c, (draft) => {\n if (draft.type !== 'vega') {\n return;\n }\n\n const cellIdFromValue = fromDataSourceCell(value);\n const tableRef = fromDataSourceTable(value);\n\n if (cellIdFromValue) {\n draft.data.sqlId = cellIdFromValue;\n delete draft.data.tableRef;\n } else if (tableRef) {\n draft.data.tableRef = tableRef;\n delete draft.data.sqlId;\n }\n }),\n );\n };\n\n return (\n <div className=\"flex items-center gap-2\">\n <CellSourceSelector\n artifactId={artifactId ?? ''}\n value={selectValue}\n onValueChange={handleDataSourceChange}\n />\n <Button\n size=\"xs\"\n variant=\"secondary\"\n className=\"h-6\"\n onClick={onEditToggle}\n disabled={!hasDataSource}\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VegaConfigPanel.d.ts","sourceRoot":"","sources":["../../src/components/VegaConfigPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"VegaConfigPanel.d.ts","sourceRoot":"","sources":["../../src/components/VegaConfigPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAgB1B,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;IACrC,IAAI,EAAE,GAAG,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CACnC,CA2FA,CAAC"}
|
|
@@ -1,72 +1,31 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { Tabs, TabsContent, TabsList, TabsTrigger, Label, Separator, } from '@sqlrooms/ui';
|
|
3
3
|
import { useSql } from '@sqlrooms/duckdb';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
{ value: '#077A9D', label: 'Blue' },
|
|
10
|
-
{ value: '#FFAB00', label: 'Orange' },
|
|
11
|
-
{ value: '#00A972', label: 'Green' },
|
|
12
|
-
{ value: '#85b6b2', label: 'Teal' },
|
|
13
|
-
{ value: '#919191', label: 'Gray' },
|
|
14
|
-
];
|
|
15
|
-
const aggregationOptions = [
|
|
16
|
-
{ value: 'sum', label: 'Sum' },
|
|
17
|
-
{ value: 'mean', label: 'Mean' },
|
|
18
|
-
{ value: 'count', label: 'Count' },
|
|
19
|
-
];
|
|
4
|
+
import { readSpecValues, buildFlatSpec } from '../vegaSpecBuilder';
|
|
5
|
+
import { FieldSelector } from './FieldSelector';
|
|
6
|
+
import { ColorSelector, colorOptions } from './ColorSelector';
|
|
7
|
+
import { ChartTypeSelector } from './ChartTypeSelector';
|
|
8
|
+
import { AggregationSelector } from './AggregationSelector';
|
|
20
9
|
export const VegaConfigPanel = ({ sqlQuery, lastRunTime, spec, onSpecChange }) => {
|
|
21
10
|
const result = useSql({ query: sqlQuery, version: lastRunTime });
|
|
22
11
|
const arrowTable = result.data?.arrowTable;
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
12
|
+
const fields = arrowTable?.schema?.fields || [];
|
|
13
|
+
const current = readSpecValues(spec);
|
|
14
|
+
const rebuild = (overrides) => {
|
|
15
|
+
const merged = { ...current, ...overrides };
|
|
16
|
+
onSpecChange(buildFlatSpec({
|
|
17
|
+
mark: merged.mark ?? 'bar',
|
|
18
|
+
xField: merged.xField,
|
|
19
|
+
yField: merged.yField,
|
|
20
|
+
yAggregate: merged.yAggregate,
|
|
21
|
+
color: merged.color ?? colorOptions[0]?.value,
|
|
22
|
+
}));
|
|
29
23
|
};
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
};
|
|
39
|
-
const handleYFieldChange = (field) => {
|
|
40
|
-
onSpecChange({
|
|
41
|
-
...spec,
|
|
42
|
-
encoding: {
|
|
43
|
-
...spec?.encoding,
|
|
44
|
-
y: {
|
|
45
|
-
...spec?.encoding?.y,
|
|
46
|
-
field,
|
|
47
|
-
aggregate: spec?.encoding?.y?.aggregate ?? 'sum',
|
|
48
|
-
},
|
|
49
|
-
},
|
|
50
|
-
});
|
|
51
|
-
};
|
|
52
|
-
const handleYAggregationChange = (aggregate) => {
|
|
53
|
-
onSpecChange({
|
|
54
|
-
...spec,
|
|
55
|
-
encoding: {
|
|
56
|
-
...spec?.encoding,
|
|
57
|
-
y: { ...spec?.encoding?.y, aggregate },
|
|
58
|
-
},
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
const handleColorChange = (color) => {
|
|
62
|
-
onSpecChange({
|
|
63
|
-
...spec,
|
|
64
|
-
encoding: {
|
|
65
|
-
...spec?.encoding,
|
|
66
|
-
color: { value: color },
|
|
67
|
-
},
|
|
68
|
-
});
|
|
69
|
-
};
|
|
70
|
-
return (_jsx("div", { className: "w-80 border-r p-4 text-xs", children: _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Label, { className: "text-xs font-medium text-gray-400", children: "Type" }), _jsxs(Select, { value: spec?.mark, onValueChange: handleMarkChange, children: [_jsx(SelectTrigger, { className: "h-8 text-xs", children: _jsx(SelectValue, { placeholder: "Select chart type" }) }), _jsx(SelectContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: markOptions.map((option) => (_jsx(SelectItem, { value: option.value, children: option.label }, option.value))) })] })] }), _jsx(Separator, {}), _jsxs(Tabs, { defaultValue: "general", className: "w-full", children: [_jsxs(TabsList, { className: "grid w-full grid-cols-2", children: [_jsx(TabsTrigger, { value: "general", className: "text-xs", children: "General" }), _jsx(TabsTrigger, { value: "styles", className: "text-xs", children: "Styles" })] }), _jsxs(TabsContent, { value: "general", className: "mt-4 space-y-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs font-medium text-gray-400", children: "X-Axis" }), _jsxs(Select, { value: spec?.encoding?.x?.field || '', onValueChange: handleXFieldChange, children: [_jsx(SelectTrigger, { className: "h-8 text-xs", children: _jsx(SelectValue, { placeholder: "Select field" }) }), _jsx(SelectContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: fieldNames.map((field) => (_jsx(SelectItem, { value: field, children: field }, field))) })] })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs font-medium text-gray-400", children: "Y-Axis" }), _jsxs("div", { className: "grid grid-cols-[2fr_1fr] gap-2", children: [_jsxs(Select, { value: spec?.encoding?.y?.field || '', onValueChange: handleYFieldChange, children: [_jsx(SelectTrigger, { className: "h-8 text-xs", children: _jsx(SelectValue, { placeholder: "Select field" }) }), _jsx(SelectContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: fieldNames.map((field) => (_jsx(SelectItem, { value: field, children: field }, field))) })] }), _jsxs(Select, { value: spec?.encoding?.y?.aggregate, onValueChange: handleYAggregationChange, children: [_jsx(SelectTrigger, { className: "h-8 text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: aggregationOptions.map((option) => (_jsx(SelectItem, { value: option.value, children: option.label }, option.value))) })] })] })] })] }), _jsx(TabsContent, { value: "styles", className: "mt-4 space-y-4", children: _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "font-medium", children: "Color" }), _jsxs(Select, { value: spec?.encoding?.color?.value, onValueChange: handleColorChange, children: [_jsx(SelectTrigger, { className: "h-8 text-xs", children: _jsx(SelectValue, { placeholder: "Select color" }) }), _jsx(SelectContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: colorOptions.map((option) => (_jsx(SelectItem, { value: option.value, children: option.label }, option.value))) })] })] }) })] })] }) }));
|
|
24
|
+
const handleMarkChange = (mark) => rebuild({ mark });
|
|
25
|
+
const handleXFieldChange = (field) => rebuild({ xField: field });
|
|
26
|
+
const handleYFieldChange = (field) => rebuild({ yField: field, yAggregate: current.yAggregate ?? 'sum' });
|
|
27
|
+
const handleYAggregationChange = (aggregate) => rebuild({ yAggregate: aggregate });
|
|
28
|
+
const handleColorChange = (color) => rebuild({ color });
|
|
29
|
+
return (_jsx("div", { className: "w-80 border-r p-4 text-xs", children: _jsxs("div", { className: "space-y-3", children: [_jsx(ChartTypeSelector, { value: current.mark, onValueChange: handleMarkChange }), _jsx(Separator, {}), _jsxs(Tabs, { defaultValue: "general", className: "w-full", children: [_jsxs(TabsList, { className: "grid w-full grid-cols-2", children: [_jsx(TabsTrigger, { value: "general", className: "text-xs", children: "General" }), _jsx(TabsTrigger, { value: "styles", className: "text-xs", children: "Styles" })] }), _jsxs(TabsContent, { value: "general", className: "mt-4 space-y-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs font-medium text-gray-400", children: "X-Axis" }), _jsx(FieldSelector, { value: current.xField, fields: fields, onValueChange: handleXFieldChange })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs font-medium text-gray-400", children: "Y-Axis" }), _jsxs("div", { className: "grid grid-cols-[2fr_1fr] gap-2", children: [_jsx(FieldSelector, { value: current.yField, fields: fields, onValueChange: handleYFieldChange }), _jsx(AggregationSelector, { value: current.yAggregate, onValueChange: handleYAggregationChange })] })] })] }), _jsx(TabsContent, { value: "styles", className: "mt-4 space-y-4", children: _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs font-medium text-gray-400", children: "Color" }), _jsx(ColorSelector, { value: current.color, onValueChange: handleColorChange })] }) })] })] }) }));
|
|
71
30
|
};
|
|
72
31
|
//# sourceMappingURL=VegaConfigPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VegaConfigPanel.js","sourceRoot":"","sources":["../../src/components/VegaConfigPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Label,\n Separator,\n} from '@sqlrooms/ui';\nimport {useSql} from '@sqlrooms/duckdb';\n\nconst markOptions = [\n {value: 'bar', label: 'Bar'},\n {value: 'line', label: 'Line'},\n];\n\nconst colorOptions = [\n {value: '#077A9D', label: 'Blue'},\n {value: '#FFAB00', label: 'Orange'},\n {value: '#00A972', label: 'Green'},\n {value: '#85b6b2', label: 'Teal'},\n {value: '#919191', label: 'Gray'},\n];\n\nconst aggregationOptions = [\n {value: 'sum', label: 'Sum'},\n {value: 'mean', label: 'Mean'},\n {value: 'count', label: 'Count'},\n];\n\nexport const VegaConfigPanel: React.FC<{\n spec: any;\n sqlQuery: string;\n lastRunTime?: number;\n onSpecChange: (spec: any) => void;\n}> = ({sqlQuery, lastRunTime, spec, onSpecChange}) => {\n const result = useSql({query: sqlQuery, version: lastRunTime});\n const arrowTable = result.data?.arrowTable;\n const fieldNames =\n arrowTable?.schema?.fields?.map((field: any) => field.name) || [];\n\n const handleMarkChange = (mark: string) => {\n onSpecChange({\n ...spec,\n mark,\n });\n };\n\n const handleXFieldChange = (field: string) => {\n onSpecChange({\n ...spec,\n encoding: {\n ...spec?.encoding,\n x: {...spec?.encoding?.x, field},\n },\n });\n };\n\n const handleYFieldChange = (field: string) => {\n onSpecChange({\n ...spec,\n encoding: {\n ...spec?.encoding,\n y: {\n ...spec?.encoding?.y,\n field,\n aggregate: spec?.encoding?.y?.aggregate ?? 'sum',\n },\n },\n });\n };\n\n const handleYAggregationChange = (aggregate: string) => {\n onSpecChange({\n ...spec,\n encoding: {\n ...spec?.encoding,\n y: {...spec?.encoding?.y, aggregate},\n },\n });\n };\n\n const handleColorChange = (color: string) => {\n onSpecChange({\n ...spec,\n encoding: {\n ...spec?.encoding,\n color: {value: color},\n },\n });\n };\n\n return (\n <div className=\"w-80 border-r p-4 text-xs\">\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <Label className=\"text-xs font-medium text-gray-400\">Type</Label>\n <Select value={spec?.mark} onValueChange={handleMarkChange}>\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"Select chart type\" />\n </SelectTrigger>\n <SelectContent onCloseAutoFocus={(e) => e.preventDefault()}>\n {markOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <Separator />\n\n <Tabs defaultValue=\"general\" className=\"w-full\">\n <TabsList className=\"grid w-full grid-cols-2\">\n <TabsTrigger value=\"general\" className=\"text-xs\">\n General\n </TabsTrigger>\n <TabsTrigger value=\"styles\" className=\"text-xs\">\n Styles\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"general\" className=\"mt-4 space-y-4\">\n <div className=\"space-y-1\">\n <Label className=\"text-xs font-medium text-gray-400\">\n X-Axis\n </Label>\n <Select\n value={spec?.encoding?.x?.field || ''}\n onValueChange={handleXFieldChange}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"Select field\" />\n </SelectTrigger>\n <SelectContent onCloseAutoFocus={(e) => e.preventDefault()}>\n {fieldNames.map((field: string) => (\n <SelectItem key={field} value={field}>\n {field}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1\">\n <Label className=\"text-xs font-medium text-gray-400\">\n Y-Axis\n </Label>\n <div className=\"grid grid-cols-[2fr_1fr] gap-2\">\n <Select\n value={spec?.encoding?.y?.field || ''}\n onValueChange={handleYFieldChange}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"Select field\" />\n </SelectTrigger>\n <SelectContent onCloseAutoFocus={(e) => e.preventDefault()}>\n {fieldNames.map((field: string) => (\n <SelectItem key={field} value={field}>\n {field}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n <Select\n value={spec?.encoding?.y?.aggregate}\n onValueChange={handleYAggregationChange}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent onCloseAutoFocus={(e) => e.preventDefault()}>\n {aggregationOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n </TabsContent>\n\n <TabsContent value=\"styles\" className=\"mt-4 space-y-4\">\n <div className=\"space-y-1\">\n <Label className=\"font-medium\">Color</Label>\n <Select\n value={spec?.encoding?.color?.value}\n onValueChange={handleColorChange}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"Select color\" />\n </SelectTrigger>\n <SelectContent onCloseAutoFocus={(e) => e.preventDefault()}>\n {colorOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </TabsContent>\n </Tabs>\n </div>\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"VegaConfigPanel.js","sourceRoot":"","sources":["../../src/components/VegaConfigPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Label,\n Separator,\n} from '@sqlrooms/ui';\nimport {useSql} from '@sqlrooms/duckdb';\nimport {readSpecValues, buildFlatSpec} from '../vegaSpecBuilder';\nimport {FieldSelector} from './FieldSelector';\nimport {ColorSelector, colorOptions} from './ColorSelector';\nimport {ChartTypeSelector} from './ChartTypeSelector';\nimport {AggregationSelector} from './AggregationSelector';\n\nexport const VegaConfigPanel: React.FC<{\n spec: any;\n sqlQuery: string;\n lastRunTime?: number;\n onSpecChange: (spec: any) => void;\n}> = ({sqlQuery, lastRunTime, spec, onSpecChange}) => {\n const result = useSql({query: sqlQuery, version: lastRunTime});\n const arrowTable = result.data?.arrowTable;\n const fields = arrowTable?.schema?.fields || [];\n\n const current = readSpecValues(spec);\n\n const rebuild = (overrides: Partial<ReturnType<typeof readSpecValues>>) => {\n const merged = {...current, ...overrides};\n onSpecChange(\n buildFlatSpec({\n mark: merged.mark ?? 'bar',\n xField: merged.xField,\n yField: merged.yField,\n yAggregate: merged.yAggregate,\n color: merged.color ?? colorOptions[0]?.value,\n }),\n );\n };\n\n const handleMarkChange = (mark: string) => rebuild({mark});\n const handleXFieldChange = (field: string) => rebuild({xField: field});\n const handleYFieldChange = (field: string) =>\n rebuild({yField: field, yAggregate: current.yAggregate ?? 'sum'});\n const handleYAggregationChange = (aggregate: string) =>\n rebuild({yAggregate: aggregate});\n const handleColorChange = (color: string) => rebuild({color});\n\n return (\n <div className=\"w-80 border-r p-4 text-xs\">\n <div className=\"space-y-3\">\n <ChartTypeSelector\n value={current.mark}\n onValueChange={handleMarkChange}\n />\n\n <Separator />\n\n <Tabs defaultValue=\"general\" className=\"w-full\">\n <TabsList className=\"grid w-full grid-cols-2\">\n <TabsTrigger value=\"general\" className=\"text-xs\">\n General\n </TabsTrigger>\n <TabsTrigger value=\"styles\" className=\"text-xs\">\n Styles\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"general\" className=\"mt-4 space-y-4\">\n <div className=\"space-y-1\">\n <Label className=\"text-xs font-medium text-gray-400\">\n X-Axis\n </Label>\n <FieldSelector\n value={current.xField}\n fields={fields}\n onValueChange={handleXFieldChange}\n />\n </div>\n <div className=\"space-y-1\">\n <Label className=\"text-xs font-medium text-gray-400\">\n Y-Axis\n </Label>\n <div className=\"grid grid-cols-[2fr_1fr] gap-2\">\n <FieldSelector\n value={current.yField}\n fields={fields}\n onValueChange={handleYFieldChange}\n />\n\n <AggregationSelector\n value={current.yAggregate}\n onValueChange={handleYAggregationChange}\n />\n </div>\n </div>\n </TabsContent>\n\n <TabsContent value=\"styles\" className=\"mt-4 space-y-4\">\n <div className=\"space-y-1\">\n <Label className=\"text-xs font-medium text-gray-400\">Color</Label>\n <ColorSelector\n value={current.color}\n onValueChange={handleColorChange}\n />\n </div>\n </TabsContent>\n </Tabs>\n </div>\n </div>\n );\n};\n"]}
|
package/dist/dagUtils.d.ts
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
import type { CellsRootState,
|
|
1
|
+
import type { CellsRootState, CellArtifactRuntime, CellArtifactGraphCache, Edge, SqlSelectToJsonFn } from './types';
|
|
2
2
|
export type DependencyGraph = {
|
|
3
3
|
dependencies: Record<string, string[]>;
|
|
4
4
|
dependents: Record<string, string[]>;
|
|
5
|
+
tableDependencies?: Record<string, string[]>;
|
|
5
6
|
};
|
|
6
|
-
export declare function buildGraphCacheFromEdges(
|
|
7
|
-
export declare function dependencyEdgesFromGraphCache(
|
|
8
|
-
export declare function getRenderableDependencyEdges(
|
|
9
|
-
export declare function ensureGraphCache(
|
|
10
|
-
export declare function replaceCellDependenciesInCache(
|
|
11
|
-
export declare function removeCellFromCache(
|
|
12
|
-
export declare function buildDependencyGraph(
|
|
7
|
+
export declare function buildGraphCacheFromEdges(artifact: CellArtifactRuntime): CellArtifactGraphCache;
|
|
8
|
+
export declare function dependencyEdgesFromGraphCache(artifact: CellArtifactRuntime): Edge[];
|
|
9
|
+
export declare function getRenderableDependencyEdges(artifact: CellArtifactRuntime): Edge[];
|
|
10
|
+
export declare function ensureGraphCache(artifact: CellArtifactRuntime): CellArtifactGraphCache;
|
|
11
|
+
export declare function replaceCellDependenciesInCache(artifact: CellArtifactRuntime, cellId: string, deps: string[], tableNames?: string[]): void;
|
|
12
|
+
export declare function removeCellFromCache(artifact: CellArtifactRuntime, cellId: string): void;
|
|
13
|
+
export declare function buildDependencyGraph(artifactId: string, state: CellsRootState): DependencyGraph;
|
|
13
14
|
export declare function topologicalOrder(roots: string[], dependencies: Record<string, string[]>, dependents: Record<string, string[]>, scope?: Set<string>): string[];
|
|
14
15
|
export declare function collectReachable(startId: string, dependents: Record<string, string[]>): Set<string>;
|
|
15
16
|
/**
|
|
16
17
|
* Async version of dependency graph build that always uses AST-enabled
|
|
17
18
|
* registry dependency derivation.
|
|
18
19
|
*/
|
|
19
|
-
export declare function buildDependencyGraphAsync(
|
|
20
|
+
export declare function buildDependencyGraphAsync(artifactId: string, state: CellsRootState, sqlSelectToJson: SqlSelectToJsonFn): Promise<DependencyGraph>;
|
|
20
21
|
//# sourceMappingURL=dagUtils.d.ts.map
|
package/dist/dagUtils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dagUtils.d.ts","sourceRoot":"","sources":["../src/dagUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"dagUtils.d.ts","sourceRoot":"","sources":["../src/dagUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,IAAI,EAEJ,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAIjB,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC9C,CAAC;AAoBF,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,mBAAmB,GAC5B,sBAAsB,CA4BxB;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,mBAAmB,GAC5B,IAAI,EAAE,CAqBR;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,mBAAmB,GAC5B,IAAI,EAAE,CAYR;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,mBAAmB,GAC5B,sBAAsB,CAQxB;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,mBAAmB,EAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,CAAC,EAAE,MAAM,EAAE,QA0BtB;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,mBAAmB,EAC7B,MAAM,EAAE,MAAM,QAwBf;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,cAAc,GACpB,eAAe,CAYjB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACtC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACpC,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAClB,MAAM,EAAE,CAoCV;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACnC,GAAG,CAAC,MAAM,CAAC,CAYb;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,cAAc,EACrB,eAAe,EAAE,iBAAiB,GACjC,OAAO,CAAC,eAAe,CAAC,CA+E1B"}
|
package/dist/dagUtils.js
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
import { isDefined } from './utils';
|
|
2
|
+
import { normalizeCellDependencies } from './helpers';
|
|
2
3
|
function dedupe(values) {
|
|
3
4
|
return Array.from(new Set(values));
|
|
4
5
|
}
|
|
5
6
|
function getEdgeKind(edge) {
|
|
6
7
|
return edge.kind ?? 'dependency';
|
|
7
8
|
}
|
|
8
|
-
function isGraphCacheComplete(cache,
|
|
9
|
+
function isGraphCacheComplete(cache, artifact) {
|
|
9
10
|
if (!cache)
|
|
10
11
|
return false;
|
|
11
|
-
return
|
|
12
|
+
return artifact.cellIds.every((cellId) => Array.isArray(cache.dependencies[cellId]));
|
|
12
13
|
}
|
|
13
|
-
export function buildGraphCacheFromEdges(
|
|
14
|
+
export function buildGraphCacheFromEdges(artifact) {
|
|
14
15
|
const dependencies = {};
|
|
15
16
|
const dependents = {};
|
|
16
|
-
const localCellIds = new Set(
|
|
17
|
-
for (const cellId of
|
|
17
|
+
const localCellIds = new Set(artifact.cellIds);
|
|
18
|
+
for (const cellId of artifact.cellIds) {
|
|
18
19
|
dependencies[cellId] = [];
|
|
19
20
|
}
|
|
20
|
-
for (const edge of
|
|
21
|
+
for (const edge of artifact.edges) {
|
|
21
22
|
// Cascades only consume dependency edges.
|
|
22
23
|
if (getEdgeKind(edge) !== 'dependency')
|
|
23
24
|
continue;
|
|
@@ -33,16 +34,17 @@ export function buildGraphCacheFromEdges(sheet) {
|
|
|
33
34
|
return {
|
|
34
35
|
dependencies,
|
|
35
36
|
dependents,
|
|
36
|
-
contentHashByCell:
|
|
37
|
+
contentHashByCell: artifact.graphCache?.contentHashByCell || {},
|
|
38
|
+
tableDependencies: artifact.graphCache?.tableDependencies || {},
|
|
37
39
|
};
|
|
38
40
|
}
|
|
39
|
-
export function dependencyEdgesFromGraphCache(
|
|
40
|
-
if (!isGraphCacheComplete(
|
|
41
|
+
export function dependencyEdgesFromGraphCache(artifact) {
|
|
42
|
+
if (!isGraphCacheComplete(artifact.graphCache, artifact))
|
|
41
43
|
return [];
|
|
42
|
-
const cache =
|
|
43
|
-
const localCellIds = new Set(
|
|
44
|
+
const cache = artifact.graphCache;
|
|
45
|
+
const localCellIds = new Set(artifact.cellIds);
|
|
44
46
|
const edges = [];
|
|
45
|
-
for (const target of
|
|
47
|
+
for (const target of artifact.cellIds) {
|
|
46
48
|
const deps = dedupe(cache.dependencies[target] || []);
|
|
47
49
|
for (const source of deps) {
|
|
48
50
|
if (!localCellIds.has(source) || source === target)
|
|
@@ -57,24 +59,26 @@ export function dependencyEdgesFromGraphCache(sheet) {
|
|
|
57
59
|
}
|
|
58
60
|
return edges;
|
|
59
61
|
}
|
|
60
|
-
export function getRenderableDependencyEdges(
|
|
61
|
-
const cacheEdges = dependencyEdgesFromGraphCache(
|
|
62
|
-
if (cacheEdges.length > 0 ||
|
|
62
|
+
export function getRenderableDependencyEdges(artifact) {
|
|
63
|
+
const cacheEdges = dependencyEdgesFromGraphCache(artifact);
|
|
64
|
+
if (cacheEdges.length > 0 ||
|
|
65
|
+
isGraphCacheComplete(artifact.graphCache, artifact)) {
|
|
63
66
|
return cacheEdges;
|
|
64
67
|
}
|
|
65
68
|
// Compatibility fallback while legacy edge persistence still exists.
|
|
66
69
|
// TODO(edge-kinds): merge sheet-local manual edges here once manual editing is enabled.
|
|
67
|
-
return
|
|
70
|
+
return artifact.edges.filter((edge) => getEdgeKind(edge) === 'dependency');
|
|
68
71
|
}
|
|
69
|
-
export function ensureGraphCache(
|
|
70
|
-
if (!
|
|
71
|
-
|
|
72
|
+
export function ensureGraphCache(artifact) {
|
|
73
|
+
if (!artifact.graphCache ||
|
|
74
|
+
!isGraphCacheComplete(artifact.graphCache, artifact)) {
|
|
75
|
+
artifact.graphCache = buildGraphCacheFromEdges(artifact);
|
|
72
76
|
}
|
|
73
|
-
return
|
|
77
|
+
return artifact.graphCache;
|
|
74
78
|
}
|
|
75
|
-
export function replaceCellDependenciesInCache(
|
|
76
|
-
const cache = ensureGraphCache(
|
|
77
|
-
const localCellIds = new Set(
|
|
79
|
+
export function replaceCellDependenciesInCache(artifact, cellId, deps, tableNames) {
|
|
80
|
+
const cache = ensureGraphCache(artifact);
|
|
81
|
+
const localCellIds = new Set(artifact.cellIds);
|
|
78
82
|
const nextDeps = dedupe(deps).filter((depId) => localCellIds.has(depId) && depId !== cellId);
|
|
79
83
|
const previousDeps = cache.dependencies[cellId] || [];
|
|
80
84
|
for (const oldDep of previousDeps) {
|
|
@@ -89,9 +93,13 @@ export function replaceCellDependenciesInCache(sheet, cellId, deps) {
|
|
|
89
93
|
if (!children.includes(cellId))
|
|
90
94
|
children.push(cellId);
|
|
91
95
|
}
|
|
96
|
+
if (tableNames !== undefined) {
|
|
97
|
+
cache.tableDependencies = cache.tableDependencies || {};
|
|
98
|
+
cache.tableDependencies[cellId] = tableNames;
|
|
99
|
+
}
|
|
92
100
|
}
|
|
93
|
-
export function removeCellFromCache(
|
|
94
|
-
const cache = ensureGraphCache(
|
|
101
|
+
export function removeCellFromCache(artifact, cellId) {
|
|
102
|
+
const cache = ensureGraphCache(artifact);
|
|
95
103
|
const previousDeps = cache.dependencies[cellId] || [];
|
|
96
104
|
for (const depId of previousDeps) {
|
|
97
105
|
const children = cache.dependents[depId] || [];
|
|
@@ -107,14 +115,17 @@ export function removeCellFromCache(sheet, cellId) {
|
|
|
107
115
|
if (cache.contentHashByCell) {
|
|
108
116
|
delete cache.contentHashByCell[cellId];
|
|
109
117
|
}
|
|
118
|
+
if (cache.tableDependencies) {
|
|
119
|
+
delete cache.tableDependencies[cellId];
|
|
120
|
+
}
|
|
110
121
|
}
|
|
111
|
-
export function buildDependencyGraph(
|
|
112
|
-
const
|
|
113
|
-
if (!
|
|
122
|
+
export function buildDependencyGraph(artifactId, state) {
|
|
123
|
+
const artifact = state.cells.config.artifacts[artifactId];
|
|
124
|
+
if (!artifact)
|
|
114
125
|
return { dependencies: {}, dependents: {} };
|
|
115
|
-
const cache = isGraphCacheComplete(
|
|
116
|
-
?
|
|
117
|
-
: buildGraphCacheFromEdges(
|
|
126
|
+
const cache = isGraphCacheComplete(artifact.graphCache, artifact)
|
|
127
|
+
? artifact.graphCache
|
|
128
|
+
: buildGraphCacheFromEdges(artifact);
|
|
118
129
|
return {
|
|
119
130
|
dependencies: { ...cache.dependencies },
|
|
120
131
|
dependents: { ...cache.dependents },
|
|
@@ -179,55 +190,70 @@ export function collectReachable(startId, dependents) {
|
|
|
179
190
|
* Async version of dependency graph build that always uses AST-enabled
|
|
180
191
|
* registry dependency derivation.
|
|
181
192
|
*/
|
|
182
|
-
export async function buildDependencyGraphAsync(
|
|
183
|
-
const
|
|
193
|
+
export async function buildDependencyGraphAsync(artifactId, state, sqlSelectToJson) {
|
|
194
|
+
const artifact = state.cells.config.artifacts[artifactId];
|
|
184
195
|
const registry = state.cells.cellRegistry;
|
|
185
|
-
if (!
|
|
196
|
+
if (!artifact) {
|
|
186
197
|
return { dependencies: {}, dependents: {} };
|
|
187
198
|
}
|
|
188
|
-
if (isGraphCacheComplete(
|
|
189
|
-
const cache =
|
|
199
|
+
if (isGraphCacheComplete(artifact.graphCache, artifact)) {
|
|
200
|
+
const cache = artifact.graphCache;
|
|
190
201
|
return {
|
|
191
202
|
dependencies: { ...cache.dependencies },
|
|
192
203
|
dependents: { ...cache.dependents },
|
|
204
|
+
tableDependencies: cache.tableDependencies
|
|
205
|
+
? { ...cache.tableDependencies }
|
|
206
|
+
: undefined,
|
|
193
207
|
};
|
|
194
208
|
}
|
|
195
209
|
const dependencies = {};
|
|
196
210
|
const dependents = {};
|
|
197
|
-
const
|
|
198
|
-
const
|
|
211
|
+
const tableDependencies = {};
|
|
212
|
+
const artifactCellIds = new Set(artifact.cellIds);
|
|
213
|
+
const scopedCells = Object.fromEntries(artifact.cellIds
|
|
199
214
|
.map((id) => state.cells.config.data[id])
|
|
200
215
|
.filter(isDefined)
|
|
201
216
|
.map((cell) => [cell.id, cell]));
|
|
202
|
-
|
|
203
|
-
const cellDeps = await Promise.all(sheet.cellIds.map(async (cellId) => {
|
|
217
|
+
const cellDeps = await Promise.all(artifact.cellIds.map(async (cellId) => {
|
|
204
218
|
const cell = state.cells.config.data[cellId];
|
|
205
219
|
if (!cell)
|
|
206
|
-
return {
|
|
220
|
+
return {
|
|
221
|
+
cellId,
|
|
222
|
+
cellIds: [],
|
|
223
|
+
tableNames: undefined,
|
|
224
|
+
};
|
|
207
225
|
const registryItem = registry[cell.type];
|
|
208
226
|
if (!registryItem)
|
|
209
|
-
return {
|
|
210
|
-
|
|
227
|
+
return {
|
|
228
|
+
cellId,
|
|
229
|
+
cellIds: [],
|
|
230
|
+
tableNames: undefined,
|
|
231
|
+
};
|
|
232
|
+
const raw = await registryItem.findDependencies({
|
|
211
233
|
cell,
|
|
212
234
|
cells: scopedCells,
|
|
213
|
-
|
|
235
|
+
artifactId,
|
|
214
236
|
sqlSelectToJson,
|
|
215
237
|
});
|
|
238
|
+
const normalized = normalizeCellDependencies(raw);
|
|
216
239
|
return {
|
|
217
240
|
cellId,
|
|
218
|
-
|
|
241
|
+
cellIds: Array.from(new Set(normalized.cellIds)).filter((depId) => artifactCellIds.has(depId)),
|
|
242
|
+
tableNames: normalized.tableNames,
|
|
219
243
|
};
|
|
220
244
|
}));
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
for (const dep of deps) {
|
|
245
|
+
for (const { cellId, cellIds, tableNames } of cellDeps) {
|
|
246
|
+
dependencies[cellId] = cellIds;
|
|
247
|
+
for (const dep of cellIds) {
|
|
225
248
|
const list = dependents[dep] || (dependents[dep] = []);
|
|
226
249
|
if (!list.includes(cellId)) {
|
|
227
250
|
list.push(cellId);
|
|
228
251
|
}
|
|
229
252
|
}
|
|
253
|
+
if (tableNames && tableNames.length > 0) {
|
|
254
|
+
tableDependencies[cellId] = tableNames;
|
|
255
|
+
}
|
|
230
256
|
}
|
|
231
|
-
return { dependencies, dependents };
|
|
257
|
+
return { dependencies, dependents, tableDependencies };
|
|
232
258
|
}
|
|
233
259
|
//# sourceMappingURL=dagUtils.js.map
|
package/dist/dagUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dagUtils.js","sourceRoot":"","sources":["../src/dagUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Cell,\n CellsRootState,\n Edge,\n EdgeKind,\n Sheet,\n SheetGraphCache,\n SqlSelectToJsonFn,\n} from './types';\nimport {isDefined} from './utils';\n\nexport type DependencyGraph = {\n dependencies: Record<string, string[]>;\n dependents: Record<string, string[]>;\n};\n\nfunction dedupe(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n\nfunction getEdgeKind(edge: Edge): EdgeKind {\n return edge.kind ?? 'dependency';\n}\n\nfunction isGraphCacheComplete(\n cache: SheetGraphCache | undefined,\n sheet: Sheet,\n): boolean {\n if (!cache) return false;\n return sheet.cellIds.every((cellId) =>\n Array.isArray(cache.dependencies[cellId]),\n );\n}\n\nexport function buildGraphCacheFromEdges(sheet: Sheet): SheetGraphCache {\n const dependencies: Record<string, string[]> = {};\n const dependents: Record<string, string[]> = {};\n const localCellIds = new Set(sheet.cellIds);\n\n for (const cellId of sheet.cellIds) {\n dependencies[cellId] = [];\n }\n\n for (const edge of sheet.edges) {\n // Cascades only consume dependency edges.\n if (getEdgeKind(edge) !== 'dependency') continue;\n if (!localCellIds.has(edge.source) || !localCellIds.has(edge.target))\n continue;\n\n const deps = dependencies[edge.target] || (dependencies[edge.target] = []);\n if (!deps.includes(edge.source)) deps.push(edge.source);\n\n const children = dependents[edge.source] || (dependents[edge.source] = []);\n if (!children.includes(edge.target)) children.push(edge.target);\n }\n\n return {\n dependencies,\n dependents,\n contentHashByCell: sheet.graphCache?.contentHashByCell || {},\n };\n}\n\nexport function dependencyEdgesFromGraphCache(sheet: Sheet): Edge[] {\n if (!isGraphCacheComplete(sheet.graphCache, sheet)) return [];\n\n const cache = sheet.graphCache as SheetGraphCache;\n const localCellIds = new Set(sheet.cellIds);\n const edges: Edge[] = [];\n\n for (const target of sheet.cellIds) {\n const deps = dedupe(cache.dependencies[target] || []);\n for (const source of deps) {\n if (!localCellIds.has(source) || source === target) continue;\n edges.push({\n id: `${source}-${target}`,\n source,\n target,\n kind: 'dependency',\n });\n }\n }\n\n return edges;\n}\n\nexport function getRenderableDependencyEdges(sheet: Sheet): Edge[] {\n const cacheEdges = dependencyEdgesFromGraphCache(sheet);\n if (cacheEdges.length > 0 || isGraphCacheComplete(sheet.graphCache, sheet)) {\n return cacheEdges;\n }\n\n // Compatibility fallback while legacy edge persistence still exists.\n // TODO(edge-kinds): merge sheet-local manual edges here once manual editing is enabled.\n return sheet.edges.filter((edge) => getEdgeKind(edge) === 'dependency');\n}\n\nexport function ensureGraphCache(sheet: Sheet): SheetGraphCache {\n if (!sheet.graphCache || !isGraphCacheComplete(sheet.graphCache, sheet)) {\n sheet.graphCache = buildGraphCacheFromEdges(sheet);\n }\n return sheet.graphCache;\n}\n\nexport function replaceCellDependenciesInCache(\n sheet: Sheet,\n cellId: string,\n deps: string[],\n) {\n const cache = ensureGraphCache(sheet);\n const localCellIds = new Set(sheet.cellIds);\n const nextDeps = dedupe(deps).filter(\n (depId) => localCellIds.has(depId) && depId !== cellId,\n );\n const previousDeps = cache.dependencies[cellId] || [];\n\n for (const oldDep of previousDeps) {\n if (nextDeps.includes(oldDep)) continue;\n const currentDependents = cache.dependents[oldDep] || [];\n cache.dependents[oldDep] = currentDependents.filter((id) => id !== cellId);\n }\n\n cache.dependencies[cellId] = nextDeps;\n\n for (const depId of nextDeps) {\n const children = cache.dependents[depId] || (cache.dependents[depId] = []);\n if (!children.includes(cellId)) children.push(cellId);\n }\n}\n\nexport function removeCellFromCache(sheet: Sheet, cellId: string) {\n const cache = ensureGraphCache(sheet);\n const previousDeps = cache.dependencies[cellId] || [];\n\n for (const depId of previousDeps) {\n const children = cache.dependents[depId] || [];\n cache.dependents[depId] = children.filter((id) => id !== cellId);\n }\n\n const downstream = cache.dependents[cellId] || [];\n for (const dependentId of downstream) {\n const deps = cache.dependencies[dependentId] || [];\n cache.dependencies[dependentId] = deps.filter((id) => id !== cellId);\n }\n\n delete cache.dependencies[cellId];\n delete cache.dependents[cellId];\n if (cache.contentHashByCell) {\n delete cache.contentHashByCell[cellId];\n }\n}\n\nexport function buildDependencyGraph(\n sheetId: string,\n state: CellsRootState,\n): DependencyGraph {\n const sheet = state.cells.config.sheets[sheetId];\n if (!sheet) return {dependencies: {}, dependents: {}};\n\n const cache = isGraphCacheComplete(sheet.graphCache, sheet)\n ? (sheet.graphCache as SheetGraphCache)\n : buildGraphCacheFromEdges(sheet);\n\n return {\n dependencies: {...cache.dependencies},\n dependents: {...cache.dependents},\n };\n}\n\nexport function topologicalOrder(\n roots: string[],\n dependencies: Record<string, string[]>,\n dependents: Record<string, string[]>,\n scope?: Set<string>,\n): string[] {\n const inDegree: Record<string, number> = {};\n const queue: string[] = [];\n\n const addNode = (id: string) => {\n if (scope && !scope.has(id)) return;\n if (!(id in inDegree)) inDegree[id] = 0;\n };\n\n for (const [cellId, deps] of Object.entries(dependencies)) {\n addNode(cellId);\n if (scope && !scope.has(cellId)) continue;\n for (const dep of deps) {\n if (scope && !scope.has(dep)) continue;\n inDegree[cellId] = (inDegree[cellId] ?? 0) + 1;\n addNode(dep);\n }\n }\n\n for (const root of roots) {\n if (scope && !scope.has(root)) continue;\n queue.push(root);\n }\n\n const order: string[] = [];\n while (queue.length) {\n const current = queue.shift() as string;\n if (scope && !scope.has(current)) continue;\n order.push(current);\n for (const child of dependents[current] || []) {\n if (scope && !scope.has(child)) continue;\n inDegree[child] = (inDegree[child] ?? 0) - 1;\n if (inDegree[child] === 0) queue.push(child);\n }\n }\n return order;\n}\n\nexport function collectReachable(\n startId: string,\n dependents: Record<string, string[]>,\n): Set<string> {\n const reachable = new Set<string>();\n const queue = [...(dependents[startId] || [])];\n while (queue.length) {\n const next = queue.shift() as string;\n if (reachable.has(next)) continue;\n reachable.add(next);\n for (const child of dependents[next] || []) {\n queue.push(child);\n }\n }\n return reachable;\n}\n\n/**\n * Async version of dependency graph build that always uses AST-enabled\n * registry dependency derivation.\n */\nexport async function buildDependencyGraphAsync(\n sheetId: string,\n state: CellsRootState,\n sqlSelectToJson: SqlSelectToJsonFn,\n): Promise<DependencyGraph> {\n const sheet = state.cells.config.sheets[sheetId];\n const registry = state.cells.cellRegistry;\n if (!sheet) {\n return {dependencies: {}, dependents: {}};\n }\n\n if (isGraphCacheComplete(sheet.graphCache, sheet)) {\n const cache = sheet.graphCache as SheetGraphCache;\n return {\n dependencies: {...cache.dependencies},\n dependents: {...cache.dependents},\n };\n }\n\n const dependencies: Record<string, string[]> = {};\n const dependents: Record<string, string[]> = {};\n const sheetCellIds = new Set(sheet.cellIds);\n const scopedCells = Object.fromEntries(\n sheet.cellIds\n .map((id) => state.cells.config.data[id])\n .filter(isDefined)\n .map((cell) => [cell.id, cell]),\n ) as Record<string, Cell>;\n\n // Process all cells in parallel\n const cellDeps = await Promise.all(\n sheet.cellIds.map(async (cellId) => {\n const cell = state.cells.config.data[cellId];\n if (!cell) return {cellId, deps: []};\n\n const registryItem = registry[cell.type];\n if (!registryItem) return {cellId, deps: []};\n\n const deps = await registryItem.findDependencies({\n cell,\n cells: scopedCells,\n sheetId,\n sqlSelectToJson,\n });\n\n return {\n cellId,\n deps: Array.from(new Set(deps)).filter((depId) =>\n sheetCellIds.has(depId),\n ),\n };\n }),\n );\n\n // Build the graph from results\n for (const {cellId, deps} of cellDeps) {\n dependencies[cellId] = deps;\n for (const dep of deps) {\n const list = dependents[dep] || (dependents[dep] = []);\n if (!list.includes(cellId)) {\n list.push(cellId);\n }\n }\n }\n\n return {dependencies, dependents};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dagUtils.js","sourceRoot":"","sources":["../src/dagUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Cell,\n CellDependencies,\n CellsRootState,\n CellArtifactRuntime,\n CellArtifactGraphCache,\n Edge,\n EdgeKind,\n SqlSelectToJsonFn,\n} from './types';\nimport {isDefined} from './utils';\nimport {normalizeCellDependencies} from './helpers';\n\nexport type DependencyGraph = {\n dependencies: Record<string, string[]>;\n dependents: Record<string, string[]>;\n tableDependencies?: Record<string, string[]>;\n};\n\nfunction dedupe(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n\nfunction getEdgeKind(edge: Edge): EdgeKind {\n return edge.kind ?? 'dependency';\n}\n\nfunction isGraphCacheComplete(\n cache: CellArtifactGraphCache | undefined,\n artifact: CellArtifactRuntime,\n): boolean {\n if (!cache) return false;\n return artifact.cellIds.every((cellId) =>\n Array.isArray(cache.dependencies[cellId]),\n );\n}\n\nexport function buildGraphCacheFromEdges(\n artifact: CellArtifactRuntime,\n): CellArtifactGraphCache {\n const dependencies: Record<string, string[]> = {};\n const dependents: Record<string, string[]> = {};\n const localCellIds = new Set(artifact.cellIds);\n\n for (const cellId of artifact.cellIds) {\n dependencies[cellId] = [];\n }\n\n for (const edge of artifact.edges) {\n // Cascades only consume dependency edges.\n if (getEdgeKind(edge) !== 'dependency') continue;\n if (!localCellIds.has(edge.source) || !localCellIds.has(edge.target))\n continue;\n\n const deps = dependencies[edge.target] || (dependencies[edge.target] = []);\n if (!deps.includes(edge.source)) deps.push(edge.source);\n\n const children = dependents[edge.source] || (dependents[edge.source] = []);\n if (!children.includes(edge.target)) children.push(edge.target);\n }\n\n return {\n dependencies,\n dependents,\n contentHashByCell: artifact.graphCache?.contentHashByCell || {},\n tableDependencies: artifact.graphCache?.tableDependencies || {},\n };\n}\n\nexport function dependencyEdgesFromGraphCache(\n artifact: CellArtifactRuntime,\n): Edge[] {\n if (!isGraphCacheComplete(artifact.graphCache, artifact)) return [];\n\n const cache = artifact.graphCache as CellArtifactGraphCache;\n const localCellIds = new Set(artifact.cellIds);\n const edges: Edge[] = [];\n\n for (const target of artifact.cellIds) {\n const deps = dedupe(cache.dependencies[target] || []);\n for (const source of deps) {\n if (!localCellIds.has(source) || source === target) continue;\n edges.push({\n id: `${source}-${target}`,\n source,\n target,\n kind: 'dependency',\n });\n }\n }\n\n return edges;\n}\n\nexport function getRenderableDependencyEdges(\n artifact: CellArtifactRuntime,\n): Edge[] {\n const cacheEdges = dependencyEdgesFromGraphCache(artifact);\n if (\n cacheEdges.length > 0 ||\n isGraphCacheComplete(artifact.graphCache, artifact)\n ) {\n return cacheEdges;\n }\n\n // Compatibility fallback while legacy edge persistence still exists.\n // TODO(edge-kinds): merge sheet-local manual edges here once manual editing is enabled.\n return artifact.edges.filter((edge) => getEdgeKind(edge) === 'dependency');\n}\n\nexport function ensureGraphCache(\n artifact: CellArtifactRuntime,\n): CellArtifactGraphCache {\n if (\n !artifact.graphCache ||\n !isGraphCacheComplete(artifact.graphCache, artifact)\n ) {\n artifact.graphCache = buildGraphCacheFromEdges(artifact);\n }\n return artifact.graphCache;\n}\n\nexport function replaceCellDependenciesInCache(\n artifact: CellArtifactRuntime,\n cellId: string,\n deps: string[],\n tableNames?: string[],\n) {\n const cache = ensureGraphCache(artifact);\n const localCellIds = new Set(artifact.cellIds);\n const nextDeps = dedupe(deps).filter(\n (depId) => localCellIds.has(depId) && depId !== cellId,\n );\n const previousDeps = cache.dependencies[cellId] || [];\n\n for (const oldDep of previousDeps) {\n if (nextDeps.includes(oldDep)) continue;\n const currentDependents = cache.dependents[oldDep] || [];\n cache.dependents[oldDep] = currentDependents.filter((id) => id !== cellId);\n }\n\n cache.dependencies[cellId] = nextDeps;\n\n for (const depId of nextDeps) {\n const children = cache.dependents[depId] || (cache.dependents[depId] = []);\n if (!children.includes(cellId)) children.push(cellId);\n }\n\n if (tableNames !== undefined) {\n cache.tableDependencies = cache.tableDependencies || {};\n cache.tableDependencies[cellId] = tableNames;\n }\n}\n\nexport function removeCellFromCache(\n artifact: CellArtifactRuntime,\n cellId: string,\n) {\n const cache = ensureGraphCache(artifact);\n const previousDeps = cache.dependencies[cellId] || [];\n\n for (const depId of previousDeps) {\n const children = cache.dependents[depId] || [];\n cache.dependents[depId] = children.filter((id) => id !== cellId);\n }\n\n const downstream = cache.dependents[cellId] || [];\n for (const dependentId of downstream) {\n const deps = cache.dependencies[dependentId] || [];\n cache.dependencies[dependentId] = deps.filter((id) => id !== cellId);\n }\n\n delete cache.dependencies[cellId];\n delete cache.dependents[cellId];\n if (cache.contentHashByCell) {\n delete cache.contentHashByCell[cellId];\n }\n if (cache.tableDependencies) {\n delete cache.tableDependencies[cellId];\n }\n}\n\nexport function buildDependencyGraph(\n artifactId: string,\n state: CellsRootState,\n): DependencyGraph {\n const artifact = state.cells.config.artifacts[artifactId];\n if (!artifact) return {dependencies: {}, dependents: {}};\n\n const cache = isGraphCacheComplete(artifact.graphCache, artifact)\n ? (artifact.graphCache as CellArtifactGraphCache)\n : buildGraphCacheFromEdges(artifact);\n\n return {\n dependencies: {...cache.dependencies},\n dependents: {...cache.dependents},\n };\n}\n\nexport function topologicalOrder(\n roots: string[],\n dependencies: Record<string, string[]>,\n dependents: Record<string, string[]>,\n scope?: Set<string>,\n): string[] {\n const inDegree: Record<string, number> = {};\n const queue: string[] = [];\n\n const addNode = (id: string) => {\n if (scope && !scope.has(id)) return;\n if (!(id in inDegree)) inDegree[id] = 0;\n };\n\n for (const [cellId, deps] of Object.entries(dependencies)) {\n addNode(cellId);\n if (scope && !scope.has(cellId)) continue;\n for (const dep of deps) {\n if (scope && !scope.has(dep)) continue;\n inDegree[cellId] = (inDegree[cellId] ?? 0) + 1;\n addNode(dep);\n }\n }\n\n for (const root of roots) {\n if (scope && !scope.has(root)) continue;\n queue.push(root);\n }\n\n const order: string[] = [];\n while (queue.length) {\n const current = queue.shift() as string;\n if (scope && !scope.has(current)) continue;\n order.push(current);\n for (const child of dependents[current] || []) {\n if (scope && !scope.has(child)) continue;\n inDegree[child] = (inDegree[child] ?? 0) - 1;\n if (inDegree[child] === 0) queue.push(child);\n }\n }\n return order;\n}\n\nexport function collectReachable(\n startId: string,\n dependents: Record<string, string[]>,\n): Set<string> {\n const reachable = new Set<string>();\n const queue = [...(dependents[startId] || [])];\n while (queue.length) {\n const next = queue.shift() as string;\n if (reachable.has(next)) continue;\n reachable.add(next);\n for (const child of dependents[next] || []) {\n queue.push(child);\n }\n }\n return reachable;\n}\n\n/**\n * Async version of dependency graph build that always uses AST-enabled\n * registry dependency derivation.\n */\nexport async function buildDependencyGraphAsync(\n artifactId: string,\n state: CellsRootState,\n sqlSelectToJson: SqlSelectToJsonFn,\n): Promise<DependencyGraph> {\n const artifact = state.cells.config.artifacts[artifactId];\n const registry = state.cells.cellRegistry;\n if (!artifact) {\n return {dependencies: {}, dependents: {}};\n }\n\n if (isGraphCacheComplete(artifact.graphCache, artifact)) {\n const cache = artifact.graphCache as CellArtifactGraphCache;\n return {\n dependencies: {...cache.dependencies},\n dependents: {...cache.dependents},\n tableDependencies: cache.tableDependencies\n ? {...cache.tableDependencies}\n : undefined,\n };\n }\n\n const dependencies: Record<string, string[]> = {};\n const dependents: Record<string, string[]> = {};\n const tableDependencies: Record<string, string[]> = {};\n const artifactCellIds = new Set(artifact.cellIds);\n const scopedCells = Object.fromEntries(\n artifact.cellIds\n .map((id) => state.cells.config.data[id])\n .filter(isDefined)\n .map((cell) => [cell.id, cell]),\n ) as Record<string, Cell>;\n\n const cellDeps = await Promise.all(\n artifact.cellIds.map(async (cellId) => {\n const cell = state.cells.config.data[cellId];\n if (!cell)\n return {\n cellId,\n cellIds: [] as string[],\n tableNames: undefined as string[] | undefined,\n };\n\n const registryItem = registry[cell.type];\n if (!registryItem)\n return {\n cellId,\n cellIds: [] as string[],\n tableNames: undefined as string[] | undefined,\n };\n\n const raw = await registryItem.findDependencies({\n cell,\n cells: scopedCells,\n artifactId,\n sqlSelectToJson,\n });\n const normalized = normalizeCellDependencies(raw);\n\n return {\n cellId,\n cellIds: Array.from(new Set(normalized.cellIds)).filter((depId) =>\n artifactCellIds.has(depId),\n ),\n tableNames: normalized.tableNames,\n };\n }),\n );\n\n for (const {cellId, cellIds, tableNames} of cellDeps) {\n dependencies[cellId] = cellIds;\n for (const dep of cellIds) {\n const list = dependents[dep] || (dependents[dep] = []);\n if (!list.includes(cellId)) {\n list.push(cellId);\n }\n }\n if (tableNames && tableNames.length > 0) {\n tableDependencies[cellId] = tableNames;\n }\n }\n\n return {dependencies, dependents, tableDependencies};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultCellRegistry.d.ts","sourceRoot":"","sources":["../src/defaultCellRegistry.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAEV,YAAY,
|
|
1
|
+
{"version":3,"file":"defaultCellRegistry.d.ts","sourceRoot":"","sources":["../src/defaultCellRegistry.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAEV,YAAY,EAQb,MAAM,SAAS,CAAC;AAIjB,wBAAgB,yBAAyB,IAAI,YAAY,CA8PxD"}
|