@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.
Files changed (144) hide show
  1. package/LICENSE.md +2 -1
  2. package/README.md +8 -8
  3. package/dist/cellsSlice.d.ts.map +1 -1
  4. package/dist/cellsSlice.js +305 -264
  5. package/dist/cellsSlice.js.map +1 -1
  6. package/dist/components/AggregationSelector.d.ts +8 -0
  7. package/dist/components/AggregationSelector.d.ts.map +1 -0
  8. package/dist/components/AggregationSelector.js +13 -0
  9. package/dist/components/AggregationSelector.js.map +1 -0
  10. package/dist/components/CellSourceSelector.d.ts +12 -0
  11. package/dist/components/CellSourceSelector.d.ts.map +1 -0
  12. package/dist/components/CellSourceSelector.js +34 -0
  13. package/dist/components/CellSourceSelector.js.map +1 -0
  14. package/dist/components/ChartTypeSelector.d.ts +8 -0
  15. package/dist/components/ChartTypeSelector.d.ts.map +1 -0
  16. package/dist/components/ChartTypeSelector.js +13 -0
  17. package/dist/components/ChartTypeSelector.js.map +1 -0
  18. package/dist/components/CollapsibleSectionButton.d.ts +10 -0
  19. package/dist/components/CollapsibleSectionButton.d.ts.map +1 -0
  20. package/dist/components/CollapsibleSectionButton.js +10 -0
  21. package/dist/components/CollapsibleSectionButton.js.map +1 -0
  22. package/dist/components/ColorSelector.d.ts +24 -0
  23. package/dist/components/ColorSelector.d.ts.map +1 -0
  24. package/dist/components/ColorSelector.js +17 -0
  25. package/dist/components/ColorSelector.js.map +1 -0
  26. package/dist/components/FieldSelector.d.ts +11 -0
  27. package/dist/components/FieldSelector.d.ts.map +1 -0
  28. package/dist/components/FieldSelector.js +11 -0
  29. package/dist/components/FieldSelector.js.map +1 -0
  30. package/dist/components/FieldTypeIcon.d.ts +8 -0
  31. package/dist/components/FieldTypeIcon.d.ts.map +1 -0
  32. package/dist/components/FieldTypeIcon.js +27 -0
  33. package/dist/components/FieldTypeIcon.js.map +1 -0
  34. package/dist/components/InputCellContent.d.ts.map +1 -1
  35. package/dist/components/InputCellContent.js +3 -3
  36. package/dist/components/InputCellContent.js.map +1 -1
  37. package/dist/components/SqlCellConnectionSelector.d.ts +9 -0
  38. package/dist/components/SqlCellConnectionSelector.d.ts.map +1 -0
  39. package/dist/components/SqlCellConnectionSelector.js +21 -0
  40. package/dist/components/SqlCellConnectionSelector.js.map +1 -0
  41. package/dist/components/SqlCellContent.d.ts.map +1 -1
  42. package/dist/components/SqlCellContent.js +31 -160
  43. package/dist/components/SqlCellContent.js.map +1 -1
  44. package/dist/components/SqlCellDependentsMenu.d.ts +11 -0
  45. package/dist/components/SqlCellDependentsMenu.d.ts.map +1 -0
  46. package/dist/components/SqlCellDependentsMenu.js +62 -0
  47. package/dist/components/SqlCellDependentsMenu.js.map +1 -0
  48. package/dist/components/SqlCellEditor.d.ts +14 -0
  49. package/dist/components/SqlCellEditor.d.ts.map +1 -0
  50. package/dist/components/SqlCellEditor.js +17 -0
  51. package/dist/components/SqlCellEditor.js.map +1 -0
  52. package/dist/components/SqlCellResultNameEditor.d.ts +8 -0
  53. package/dist/components/SqlCellResultNameEditor.d.ts.map +1 -0
  54. package/dist/components/SqlCellResultNameEditor.js +38 -0
  55. package/dist/components/SqlCellResultNameEditor.js.map +1 -0
  56. package/dist/components/SqlCellResults.d.ts +17 -0
  57. package/dist/components/SqlCellResults.d.ts.map +1 -0
  58. package/dist/components/SqlCellResults.js +44 -0
  59. package/dist/components/SqlCellResults.js.map +1 -0
  60. package/dist/components/SqlCellRunButton.d.ts +5 -6
  61. package/dist/components/SqlCellRunButton.d.ts.map +1 -1
  62. package/dist/components/SqlCellRunButton.js +11 -7
  63. package/dist/components/SqlCellRunButton.js.map +1 -1
  64. package/dist/components/SqlQueryPreview.d.ts +9 -0
  65. package/dist/components/SqlQueryPreview.d.ts.map +1 -0
  66. package/dist/components/SqlQueryPreview.js +14 -0
  67. package/dist/components/SqlQueryPreview.js.map +1 -0
  68. package/dist/components/TextCellContent.d.ts.map +1 -1
  69. package/dist/components/TextCellContent.js +24 -7
  70. package/dist/components/TextCellContent.js.map +1 -1
  71. package/dist/components/VegaCellContent.d.ts +0 -1
  72. package/dist/components/VegaCellContent.d.ts.map +1 -1
  73. package/dist/components/VegaCellContent.js +28 -49
  74. package/dist/components/VegaCellContent.js.map +1 -1
  75. package/dist/components/VegaCellHeader.d.ts +8 -0
  76. package/dist/components/VegaCellHeader.d.ts.map +1 -0
  77. package/dist/components/VegaCellHeader.js +30 -0
  78. package/dist/components/VegaCellHeader.js.map +1 -0
  79. package/dist/components/VegaConfigPanel.d.ts.map +1 -1
  80. package/dist/components/VegaConfigPanel.js +23 -64
  81. package/dist/components/VegaConfigPanel.js.map +1 -1
  82. package/dist/dagUtils.d.ts +10 -9
  83. package/dist/dagUtils.d.ts.map +1 -1
  84. package/dist/dagUtils.js +76 -50
  85. package/dist/dagUtils.js.map +1 -1
  86. package/dist/defaultCellRegistry.d.ts.map +1 -1
  87. package/dist/defaultCellRegistry.js +82 -39
  88. package/dist/defaultCellRegistry.js.map +1 -1
  89. package/dist/execution.d.ts.map +1 -1
  90. package/dist/execution.js +27 -20
  91. package/dist/execution.js.map +1 -1
  92. package/dist/helpers.d.ts +21 -28
  93. package/dist/helpers.d.ts.map +1 -1
  94. package/dist/helpers.js +77 -90
  95. package/dist/helpers.js.map +1 -1
  96. package/dist/hooks/useVegaCellDataSource.d.ts +18 -0
  97. package/dist/hooks/useVegaCellDataSource.d.ts.map +1 -0
  98. package/dist/hooks/useVegaCellDataSource.js +40 -0
  99. package/dist/hooks/useVegaCellDataSource.js.map +1 -0
  100. package/dist/hooks/useVegaCellQuery.d.ts +12 -0
  101. package/dist/hooks/useVegaCellQuery.d.ts.map +1 -0
  102. package/dist/hooks/useVegaCellQuery.js +12 -0
  103. package/dist/hooks/useVegaCellQuery.js.map +1 -0
  104. package/dist/index.d.ts +2 -3
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +2 -3
  107. package/dist/index.js.map +1 -1
  108. package/dist/resultRelationPolicy.d.ts +2 -2
  109. package/dist/resultRelationPolicy.d.ts.map +1 -1
  110. package/dist/resultRelationPolicy.js +9 -1
  111. package/dist/resultRelationPolicy.js.map +1 -1
  112. package/dist/sqlHelpers.d.ts +8 -8
  113. package/dist/sqlHelpers.d.ts.map +1 -1
  114. package/dist/sqlHelpers.js +16 -12
  115. package/dist/sqlHelpers.js.map +1 -1
  116. package/dist/types.d.ts +113 -70
  117. package/dist/types.d.ts.map +1 -1
  118. package/dist/types.js +22 -13
  119. package/dist/types.js.map +1 -1
  120. package/dist/useValidateResultName.d.ts +34 -0
  121. package/dist/useValidateResultName.d.ts.map +1 -0
  122. package/dist/useValidateResultName.js +111 -0
  123. package/dist/useValidateResultName.js.map +1 -0
  124. package/dist/utils.d.ts +10 -2
  125. package/dist/utils.d.ts.map +1 -1
  126. package/dist/utils.js +20 -4
  127. package/dist/utils.js.map +1 -1
  128. package/dist/vegaSelectionUtils.d.ts +14 -0
  129. package/dist/vegaSelectionUtils.d.ts.map +1 -0
  130. package/dist/vegaSelectionUtils.js +97 -0
  131. package/dist/vegaSelectionUtils.js.map +1 -0
  132. package/dist/vegaSpecBuilder.d.ts +34 -0
  133. package/dist/vegaSpecBuilder.d.ts.map +1 -0
  134. package/dist/vegaSpecBuilder.js +90 -0
  135. package/dist/vegaSpecBuilder.js.map +1 -0
  136. package/package.json +20 -21
  137. package/dist/components/DeleteSheetModal.d.ts +0 -9
  138. package/dist/components/DeleteSheetModal.d.ts.map +0 -1
  139. package/dist/components/DeleteSheetModal.js +0 -6
  140. package/dist/components/DeleteSheetModal.js.map +0 -1
  141. package/dist/components/SheetsTabBar.d.ts +0 -6
  142. package/dist/components/SheetsTabBar.d.ts.map +0 -1
  143. package/dist/components/SheetsTabBar.js +0 -57
  144. 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;AAmC1B,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,CA6KA,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 { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Tabs, TabsContent, TabsList, TabsTrigger, Label, Separator, } from '@sqlrooms/ui';
2
+ import { Tabs, TabsContent, TabsList, TabsTrigger, Label, Separator, } from '@sqlrooms/ui';
3
3
  import { useSql } from '@sqlrooms/duckdb';
4
- const markOptions = [
5
- { value: 'bar', label: 'Bar' },
6
- { value: 'line', label: 'Line' },
7
- ];
8
- const colorOptions = [
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 fieldNames = arrowTable?.schema?.fields?.map((field) => field.name) || [];
24
- const handleMarkChange = (mark) => {
25
- onSpecChange({
26
- ...spec,
27
- mark,
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 handleXFieldChange = (field) => {
31
- onSpecChange({
32
- ...spec,
33
- encoding: {
34
- ...spec?.encoding,
35
- x: { ...spec?.encoding?.x, field },
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"]}
@@ -1,20 +1,21 @@
1
- import type { CellsRootState, Edge, Sheet, SheetGraphCache, SqlSelectToJsonFn } from './types';
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(sheet: Sheet): SheetGraphCache;
7
- export declare function dependencyEdgesFromGraphCache(sheet: Sheet): Edge[];
8
- export declare function getRenderableDependencyEdges(sheet: Sheet): Edge[];
9
- export declare function ensureGraphCache(sheet: Sheet): SheetGraphCache;
10
- export declare function replaceCellDependenciesInCache(sheet: Sheet, cellId: string, deps: string[]): void;
11
- export declare function removeCellFromCache(sheet: Sheet, cellId: string): void;
12
- export declare function buildDependencyGraph(sheetId: string, state: CellsRootState): DependencyGraph;
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(sheetId: string, state: CellsRootState, sqlSelectToJson: SqlSelectToJsonFn): Promise<DependencyGraph>;
20
+ export declare function buildDependencyGraphAsync(artifactId: string, state: CellsRootState, sqlSelectToJson: SqlSelectToJsonFn): Promise<DependencyGraph>;
20
21
  //# sourceMappingURL=dagUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dagUtils.d.ts","sourceRoot":"","sources":["../src/dagUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,cAAc,EACd,IAAI,EAEJ,KAAK,EACL,eAAe,EACf,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAGjB,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;CACtC,CAAC;AAoBF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,eAAe,CA2BtE;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,CAqBlE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,CASjE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,eAAe,CAK9D;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,QAqBf;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAoB/D;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,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,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,cAAc,EACrB,eAAe,EAAE,iBAAiB,GACjC,OAAO,CAAC,eAAe,CAAC,CA8D1B"}
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, sheet) {
9
+ function isGraphCacheComplete(cache, artifact) {
9
10
  if (!cache)
10
11
  return false;
11
- return sheet.cellIds.every((cellId) => Array.isArray(cache.dependencies[cellId]));
12
+ return artifact.cellIds.every((cellId) => Array.isArray(cache.dependencies[cellId]));
12
13
  }
13
- export function buildGraphCacheFromEdges(sheet) {
14
+ export function buildGraphCacheFromEdges(artifact) {
14
15
  const dependencies = {};
15
16
  const dependents = {};
16
- const localCellIds = new Set(sheet.cellIds);
17
- for (const cellId of sheet.cellIds) {
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 sheet.edges) {
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: sheet.graphCache?.contentHashByCell || {},
37
+ contentHashByCell: artifact.graphCache?.contentHashByCell || {},
38
+ tableDependencies: artifact.graphCache?.tableDependencies || {},
37
39
  };
38
40
  }
39
- export function dependencyEdgesFromGraphCache(sheet) {
40
- if (!isGraphCacheComplete(sheet.graphCache, sheet))
41
+ export function dependencyEdgesFromGraphCache(artifact) {
42
+ if (!isGraphCacheComplete(artifact.graphCache, artifact))
41
43
  return [];
42
- const cache = sheet.graphCache;
43
- const localCellIds = new Set(sheet.cellIds);
44
+ const cache = artifact.graphCache;
45
+ const localCellIds = new Set(artifact.cellIds);
44
46
  const edges = [];
45
- for (const target of sheet.cellIds) {
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(sheet) {
61
- const cacheEdges = dependencyEdgesFromGraphCache(sheet);
62
- if (cacheEdges.length > 0 || isGraphCacheComplete(sheet.graphCache, sheet)) {
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 sheet.edges.filter((edge) => getEdgeKind(edge) === 'dependency');
70
+ return artifact.edges.filter((edge) => getEdgeKind(edge) === 'dependency');
68
71
  }
69
- export function ensureGraphCache(sheet) {
70
- if (!sheet.graphCache || !isGraphCacheComplete(sheet.graphCache, sheet)) {
71
- sheet.graphCache = buildGraphCacheFromEdges(sheet);
72
+ export function ensureGraphCache(artifact) {
73
+ if (!artifact.graphCache ||
74
+ !isGraphCacheComplete(artifact.graphCache, artifact)) {
75
+ artifact.graphCache = buildGraphCacheFromEdges(artifact);
72
76
  }
73
- return sheet.graphCache;
77
+ return artifact.graphCache;
74
78
  }
75
- export function replaceCellDependenciesInCache(sheet, cellId, deps) {
76
- const cache = ensureGraphCache(sheet);
77
- const localCellIds = new Set(sheet.cellIds);
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(sheet, cellId) {
94
- const cache = ensureGraphCache(sheet);
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(sheetId, state) {
112
- const sheet = state.cells.config.sheets[sheetId];
113
- if (!sheet)
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(sheet.graphCache, sheet)
116
- ? sheet.graphCache
117
- : buildGraphCacheFromEdges(sheet);
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(sheetId, state, sqlSelectToJson) {
183
- const sheet = state.cells.config.sheets[sheetId];
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 (!sheet) {
196
+ if (!artifact) {
186
197
  return { dependencies: {}, dependents: {} };
187
198
  }
188
- if (isGraphCacheComplete(sheet.graphCache, sheet)) {
189
- const cache = sheet.graphCache;
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 sheetCellIds = new Set(sheet.cellIds);
198
- const scopedCells = Object.fromEntries(sheet.cellIds
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
- // Process all cells in parallel
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 { cellId, deps: [] };
220
+ return {
221
+ cellId,
222
+ cellIds: [],
223
+ tableNames: undefined,
224
+ };
207
225
  const registryItem = registry[cell.type];
208
226
  if (!registryItem)
209
- return { cellId, deps: [] };
210
- const deps = await registryItem.findDependencies({
227
+ return {
228
+ cellId,
229
+ cellIds: [],
230
+ tableNames: undefined,
231
+ };
232
+ const raw = await registryItem.findDependencies({
211
233
  cell,
212
234
  cells: scopedCells,
213
- sheetId,
235
+ artifactId,
214
236
  sqlSelectToJson,
215
237
  });
238
+ const normalized = normalizeCellDependencies(raw);
216
239
  return {
217
240
  cellId,
218
- deps: Array.from(new Set(deps)).filter((depId) => sheetCellIds.has(depId)),
241
+ cellIds: Array.from(new Set(normalized.cellIds)).filter((depId) => artifactCellIds.has(depId)),
242
+ tableNames: normalized.tableNames,
219
243
  };
220
244
  }));
221
- // Build the graph from results
222
- for (const { cellId, deps } of cellDeps) {
223
- dependencies[cellId] = deps;
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
@@ -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,EAMb,MAAM,SAAS,CAAC;AAIjB,wBAAgB,yBAAyB,IAAI,YAAY,CAiNxD"}
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"}