@sqlrooms/cells 0.29.0-rc.1 → 0.29.0-rc.2

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 (158) hide show
  1. package/dist/cellsSlice.d.ts.map +1 -1
  2. package/dist/cellsSlice.js +191 -73
  3. package/dist/cellsSlice.js.map +1 -1
  4. package/dist/components/AggregationSelector.d.ts +8 -0
  5. package/dist/components/AggregationSelector.d.ts.map +1 -0
  6. package/dist/components/AggregationSelector.js +13 -0
  7. package/dist/components/AggregationSelector.js.map +1 -0
  8. package/dist/components/CellSourceSelector.d.ts +11 -0
  9. package/dist/components/CellSourceSelector.d.ts.map +1 -0
  10. package/dist/components/CellSourceSelector.js +35 -0
  11. package/dist/components/CellSourceSelector.js.map +1 -0
  12. package/dist/components/ChartTypeSelector.d.ts +8 -0
  13. package/dist/components/ChartTypeSelector.d.ts.map +1 -0
  14. package/dist/components/ChartTypeSelector.js +13 -0
  15. package/dist/components/ChartTypeSelector.js.map +1 -0
  16. package/dist/components/CollapsibleSectionButton.d.ts +10 -0
  17. package/dist/components/CollapsibleSectionButton.d.ts.map +1 -0
  18. package/dist/components/CollapsibleSectionButton.js +10 -0
  19. package/dist/components/CollapsibleSectionButton.js.map +1 -0
  20. package/dist/components/ColorSelector.d.ts +24 -0
  21. package/dist/components/ColorSelector.d.ts.map +1 -0
  22. package/dist/components/ColorSelector.js +17 -0
  23. package/dist/components/ColorSelector.js.map +1 -0
  24. package/dist/components/FieldSelector.d.ts +11 -0
  25. package/dist/components/FieldSelector.d.ts.map +1 -0
  26. package/dist/components/FieldSelector.js +11 -0
  27. package/dist/components/FieldSelector.js.map +1 -0
  28. package/dist/components/FieldTypeIcon.d.ts +8 -0
  29. package/dist/components/FieldTypeIcon.d.ts.map +1 -0
  30. package/dist/components/FieldTypeIcon.js +27 -0
  31. package/dist/components/FieldTypeIcon.js.map +1 -0
  32. package/dist/components/InputCellContent.d.ts.map +1 -1
  33. package/dist/components/InputCellContent.js +3 -3
  34. package/dist/components/InputCellContent.js.map +1 -1
  35. package/dist/components/SelectionListener.d.ts +15 -0
  36. package/dist/components/SelectionListener.d.ts.map +1 -0
  37. package/dist/components/SelectionListener.js +74 -0
  38. package/dist/components/SelectionListener.js.map +1 -0
  39. package/dist/components/SheetsTabBar.d.ts.map +1 -1
  40. package/dist/components/SheetsTabBar.js +2 -1
  41. package/dist/components/SheetsTabBar.js.map +1 -1
  42. package/dist/components/SqlCellBody.d.ts +6 -0
  43. package/dist/components/SqlCellBody.d.ts.map +1 -0
  44. package/dist/components/SqlCellBody.js +12 -0
  45. package/dist/components/SqlCellBody.js.map +1 -0
  46. package/dist/components/SqlCellConnectionSelector.d.ts +9 -0
  47. package/dist/components/SqlCellConnectionSelector.d.ts.map +1 -0
  48. package/dist/components/SqlCellConnectionSelector.js +21 -0
  49. package/dist/components/SqlCellConnectionSelector.js.map +1 -0
  50. package/dist/components/SqlCellContent.d.ts.map +1 -1
  51. package/dist/components/SqlCellContent.js +29 -154
  52. package/dist/components/SqlCellContent.js.map +1 -1
  53. package/dist/components/SqlCellDependentsMenu.d.ts +11 -0
  54. package/dist/components/SqlCellDependentsMenu.d.ts.map +1 -0
  55. package/dist/components/SqlCellDependentsMenu.js +62 -0
  56. package/dist/components/SqlCellDependentsMenu.js.map +1 -0
  57. package/dist/components/SqlCellEditor.d.ts +14 -0
  58. package/dist/components/SqlCellEditor.d.ts.map +1 -0
  59. package/dist/components/SqlCellEditor.js +17 -0
  60. package/dist/components/SqlCellEditor.js.map +1 -0
  61. package/dist/components/SqlCellResultNameEditor.d.ts +8 -0
  62. package/dist/components/SqlCellResultNameEditor.d.ts.map +1 -0
  63. package/dist/components/SqlCellResultNameEditor.js +38 -0
  64. package/dist/components/SqlCellResultNameEditor.js.map +1 -0
  65. package/dist/components/SqlCellResults.d.ts +17 -0
  66. package/dist/components/SqlCellResults.d.ts.map +1 -0
  67. package/dist/components/SqlCellResults.js +45 -0
  68. package/dist/components/SqlCellResults.js.map +1 -0
  69. package/dist/components/SqlCellRunButton.d.ts +5 -6
  70. package/dist/components/SqlCellRunButton.d.ts.map +1 -1
  71. package/dist/components/SqlCellRunButton.js +11 -7
  72. package/dist/components/SqlCellRunButton.js.map +1 -1
  73. package/dist/components/SqlQueryPreview.d.ts +9 -0
  74. package/dist/components/SqlQueryPreview.d.ts.map +1 -0
  75. package/dist/components/SqlQueryPreview.js +14 -0
  76. package/dist/components/SqlQueryPreview.js.map +1 -0
  77. package/dist/components/TextCellContent.d.ts.map +1 -1
  78. package/dist/components/TextCellContent.js +24 -7
  79. package/dist/components/TextCellContent.js.map +1 -1
  80. package/dist/components/VegaCellContent.d.ts +0 -1
  81. package/dist/components/VegaCellContent.d.ts.map +1 -1
  82. package/dist/components/VegaCellContent.js +61 -47
  83. package/dist/components/VegaCellContent.js.map +1 -1
  84. package/dist/components/VegaCellHeader.d.ts +11 -0
  85. package/dist/components/VegaCellHeader.d.ts.map +1 -0
  86. package/dist/components/VegaCellHeader.js +31 -0
  87. package/dist/components/VegaCellHeader.js.map +1 -0
  88. package/dist/components/VegaConfigPanel.d.ts +5 -0
  89. package/dist/components/VegaConfigPanel.d.ts.map +1 -1
  90. package/dist/components/VegaConfigPanel.js +53 -63
  91. package/dist/components/VegaConfigPanel.js.map +1 -1
  92. package/dist/crdt.d.ts +61 -0
  93. package/dist/crdt.d.ts.map +1 -0
  94. package/dist/crdt.js +82 -0
  95. package/dist/crdt.js.map +1 -0
  96. package/dist/dagSlice.d.ts +3 -0
  97. package/dist/dagSlice.d.ts.map +1 -0
  98. package/dist/dagSlice.js +51 -0
  99. package/dist/dagSlice.js.map +1 -0
  100. package/dist/dagUtils.d.ts +2 -1
  101. package/dist/dagUtils.d.ts.map +1 -1
  102. package/dist/dagUtils.js +35 -11
  103. package/dist/dagUtils.js.map +1 -1
  104. package/dist/defaultCellRegistry.d.ts.map +1 -1
  105. package/dist/defaultCellRegistry.js +63 -24
  106. package/dist/defaultCellRegistry.js.map +1 -1
  107. package/dist/execution.d.ts.map +1 -1
  108. package/dist/execution.js +2 -1
  109. package/dist/execution.js.map +1 -1
  110. package/dist/helpers.d.ts +14 -2
  111. package/dist/helpers.d.ts.map +1 -1
  112. package/dist/helpers.js +56 -2
  113. package/dist/helpers.js.map +1 -1
  114. package/dist/hooks/useVegaCellDataSource.d.ts +18 -0
  115. package/dist/hooks/useVegaCellDataSource.d.ts.map +1 -0
  116. package/dist/hooks/useVegaCellDataSource.js +40 -0
  117. package/dist/hooks/useVegaCellDataSource.js.map +1 -0
  118. package/dist/hooks/useVegaCellQuery.d.ts +16 -0
  119. package/dist/hooks/useVegaCellQuery.d.ts.map +1 -0
  120. package/dist/hooks/useVegaCellQuery.js +25 -0
  121. package/dist/hooks/useVegaCellQuery.js.map +1 -0
  122. package/dist/index.d.ts +3 -2
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +3 -2
  125. package/dist/index.js.map +1 -1
  126. package/dist/sqlHelpers.d.ts +3 -3
  127. package/dist/sqlHelpers.d.ts.map +1 -1
  128. package/dist/sqlHelpers.js +9 -5
  129. package/dist/sqlHelpers.js.map +1 -1
  130. package/dist/typeGuards.d.ts +2 -0
  131. package/dist/typeGuards.d.ts.map +1 -0
  132. package/dist/typeGuards.js +4 -0
  133. package/dist/typeGuards.js.map +1 -0
  134. package/dist/types.d.ts +97 -26
  135. package/dist/types.d.ts.map +1 -1
  136. package/dist/types.js +17 -2
  137. package/dist/types.js.map +1 -1
  138. package/dist/useValidateResultName.d.ts +34 -0
  139. package/dist/useValidateResultName.d.ts.map +1 -0
  140. package/dist/useValidateResultName.js +111 -0
  141. package/dist/useValidateResultName.js.map +1 -0
  142. package/dist/utils.d.ts +8 -0
  143. package/dist/utils.d.ts.map +1 -1
  144. package/dist/utils.js +16 -0
  145. package/dist/utils.js.map +1 -1
  146. package/dist/validation.d.ts +16 -0
  147. package/dist/validation.d.ts.map +1 -0
  148. package/dist/validation.js +40 -0
  149. package/dist/validation.js.map +1 -0
  150. package/dist/vegaSelectionUtils.d.ts +14 -0
  151. package/dist/vegaSelectionUtils.d.ts.map +1 -0
  152. package/dist/vegaSelectionUtils.js +97 -0
  153. package/dist/vegaSelectionUtils.js.map +1 -0
  154. package/dist/vegaSpecBuilder.d.ts +34 -0
  155. package/dist/vegaSpecBuilder.d.ts.map +1 -0
  156. package/dist/vegaSpecBuilder.js +90 -0
  157. package/dist/vegaSpecBuilder.js.map +1 -0
  158. package/package.json +12 -13
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crdt.js","sourceRoot":"","sources":["../src/crdt.ts"],"names":[],"mappings":"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","sourcesContent":["import {schema} from 'loro-mirror';\nimport type {CrdtMirror} from '@sqlrooms/crdt';\nimport {CellsSliceConfig, type CellsSliceState} from './types';\n\n/**\n * Mirror schema for syncing the `@sqlrooms/cells` slice via `@sqlrooms/crdt`.\n *\n * Syncs: data (cells), sheets, sheetOrder, edges\n * Keeps local: status, currentSheetId, abortControllers\n */\nexport const cellsMirrorSchema = schema.LoroMap({\n config: schema.LoroMap({\n data: schema.LoroList(\n schema.LoroMap({\n id: schema.String(),\n type: schema.String(),\n data: schema.Any(), // Cell-specific data varies by type\n }),\n (cell) => cell.id,\n ),\n sheets: schema.LoroList(\n schema.LoroMap({\n id: schema.String(),\n type: schema.String(),\n title: schema.String(),\n cellIds: schema.LoroList(schema.String()),\n edges: schema.LoroList(\n schema.LoroMap({\n id: schema.String(),\n source: schema.String(),\n target: schema.String(),\n }),\n (edge) => edge.id,\n ),\n }),\n (sheet) => sheet.id,\n ),\n sheetOrder: schema.LoroList(schema.String()),\n }),\n});\n\nexport type CellsMirrorSchema = typeof cellsMirrorSchema;\n\n/**\n * Default initial mirror state for the cells CRDT schema.\n */\nexport const cellsMirrorInitialState = {\n config: {\n data: [],\n sheets: [],\n sheetOrder: [],\n },\n};\n\n/**\n * Creates a CRDT mirror bundle for the cells slice.\n */\nexport function createCellsCrdtMirror<\n S extends CellsSliceState = CellsSliceState,\n>(): CrdtMirror<S, typeof cellsMirrorSchema> {\n return {\n schema: cellsMirrorSchema,\n initialState: cellsMirrorInitialState,\n\n select: (state) => ({\n config: {\n data: Object.values(state.cells.config.data),\n sheets: Object.values(state.cells.config.sheets).map((sheet) => ({\n ...sheet,\n edges: sheet.edges || [],\n })),\n sheetOrder: state.cells.config.sheetOrder,\n },\n }),\n\n apply: (value, set, get) => {\n if (!value?.config) return;\n\n const configValue = value.config as {\n data?: Array<{id: string; type: string; data: unknown}>;\n sheets?: Array<{\n id: string;\n type: string;\n title: string;\n cellIds: string[];\n edges?: Array<{id: string; source: string; target: string}>;\n }>;\n sheetOrder?: string[];\n };\n\n const newData = Object.fromEntries(\n (configValue.data || []).map((c) => [c.id, c]),\n );\n const newSheets = Object.fromEntries(\n (configValue.sheets || []).map((s) => [s.id, s]),\n );\n\n set((state: S) => ({\n ...state,\n cells: {\n ...state.cells,\n config: CellsSliceConfig.parse({\n ...state.cells.config,\n data: newData,\n sheets: newSheets,\n sheetOrder: configValue.sheetOrder,\n }),\n },\n }));\n },\n };\n}\n\n/**\n * @deprecated Use `createCellsCrdtMirror` instead.\n */\nexport const createCellsCrdtModule = createCellsCrdtMirror;\n"]}
@@ -0,0 +1,3 @@
1
+ import type { CellsRootState, DagSliceState } from './types';
2
+ export declare function createDagSlice<TRootState extends CellsRootState>(): (set: any, get: () => TRootState) => DagSliceState;
3
+ //# sourceMappingURL=dagSlice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dagSlice.d.ts","sourceRoot":"","sources":["../src/dagSlice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,cAAc,EAAE,aAAa,EAAC,MAAM,SAAS,CAAC;AAO3D,wBAAgB,cAAc,CAAC,UAAU,SAAS,cAAc,KAAK,CACnE,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,MAAM,UAAU,KAClB,aAAa,CA0DjB"}
@@ -0,0 +1,51 @@
1
+ import { buildDependencyGraph, collectReachable, topologicalOrder, } from './dagUtils';
2
+ export function createDagSlice() {
3
+ return (set, get) => ({
4
+ dag: {
5
+ get currentDagId() {
6
+ return get().cells.config.currentSheetId;
7
+ },
8
+ getRootCells: (sheetId) => {
9
+ const { dependencies } = buildDependencyGraph(sheetId, get());
10
+ const ids = Object.keys(dependencies);
11
+ return ids.filter((id) => (dependencies[id]?.length ?? 0) === 0);
12
+ },
13
+ getDownstream: (sheetId, sourceCellId) => {
14
+ const { dependencies, dependents } = buildDependencyGraph(sheetId, get());
15
+ const reachable = collectReachable(sourceCellId, dependents);
16
+ if (!reachable.size)
17
+ return [];
18
+ reachable.delete(sourceCellId);
19
+ const rootsWithinScope = Array.from(reachable).filter((id) => {
20
+ const deps = dependencies[id] || [];
21
+ return deps.filter((d) => reachable.has(d)).length === 0;
22
+ });
23
+ return topologicalOrder(rootsWithinScope, dependencies, dependents, reachable);
24
+ },
25
+ runAllCellsCascade: async (sheetId) => {
26
+ const { dependencies, dependents } = buildDependencyGraph(sheetId, get());
27
+ const roots = Object.keys(dependencies).filter((id) => (dependencies[id]?.length ?? 0) === 0);
28
+ const order = topologicalOrder(roots, dependencies, dependents);
29
+ for (const cellId of order) {
30
+ await get().cells.runCell(cellId, { cascade: false });
31
+ }
32
+ },
33
+ runDownstreamCascade: async (sheetId, sourceCellId) => {
34
+ const { dependencies, dependents } = buildDependencyGraph(sheetId, get());
35
+ const reachable = collectReachable(sourceCellId, dependents);
36
+ if (!reachable.size)
37
+ return;
38
+ reachable.delete(sourceCellId);
39
+ const rootsWithinScope = Array.from(reachable).filter((id) => {
40
+ const deps = dependencies[id] || [];
41
+ return deps.filter((d) => reachable.has(d)).length === 0;
42
+ });
43
+ const order = topologicalOrder(rootsWithinScope, dependencies, dependents, reachable);
44
+ for (const cellId of order) {
45
+ await get().cells.runCell(cellId, { cascade: false });
46
+ }
47
+ },
48
+ },
49
+ });
50
+ }
51
+ //# sourceMappingURL=dagSlice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dagSlice.js","sourceRoot":"","sources":["../src/dagSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import type {CellsRootState, DagSliceState} from './types';\nimport {\n buildDependencyGraph,\n collectReachable,\n topologicalOrder,\n} from './dagUtils';\n\nexport function createDagSlice<TRootState extends CellsRootState>(): (\n set: any,\n get: () => TRootState,\n) => DagSliceState {\n return (set, get) => ({\n dag: {\n get currentDagId() {\n return get().cells.config.currentSheetId;\n },\n getRootCells: (sheetId: string) => {\n const {dependencies} = buildDependencyGraph(sheetId, get());\n const ids = Object.keys(dependencies);\n return ids.filter((id) => (dependencies[id]?.length ?? 0) === 0);\n },\n getDownstream: (sheetId: string, sourceCellId: string) => {\n const {dependencies, dependents} = buildDependencyGraph(sheetId, get());\n const reachable = collectReachable(sourceCellId, dependents);\n if (!reachable.size) return [];\n reachable.delete(sourceCellId);\n const rootsWithinScope = Array.from(reachable).filter((id) => {\n const deps = dependencies[id] || [];\n return deps.filter((d) => reachable.has(d)).length === 0;\n });\n return topologicalOrder(\n rootsWithinScope,\n dependencies,\n dependents,\n reachable,\n );\n },\n runAllCellsCascade: async (sheetId: string) => {\n const {dependencies, dependents} = buildDependencyGraph(sheetId, get());\n const roots = Object.keys(dependencies).filter(\n (id) => (dependencies[id]?.length ?? 0) === 0,\n );\n const order = topologicalOrder(roots, dependencies, dependents);\n for (const cellId of order) {\n await get().cells.runCell(cellId, {cascade: false});\n }\n },\n runDownstreamCascade: async (sheetId: string, sourceCellId: string) => {\n const {dependencies, dependents} = buildDependencyGraph(sheetId, get());\n const reachable = collectReachable(sourceCellId, dependents);\n if (!reachable.size) return;\n reachable.delete(sourceCellId);\n const rootsWithinScope = Array.from(reachable).filter((id) => {\n const deps = dependencies[id] || [];\n return deps.filter((d) => reachable.has(d)).length === 0;\n });\n const order = topologicalOrder(\n rootsWithinScope,\n dependencies,\n dependents,\n reachable,\n );\n for (const cellId of order) {\n await get().cells.runCell(cellId, {cascade: false});\n }\n },\n },\n });\n}\n"]}
@@ -2,12 +2,13 @@ import type { CellsRootState, Edge, Sheet, SheetGraphCache, SqlSelectToJsonFn }
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
7
  export declare function buildGraphCacheFromEdges(sheet: Sheet): SheetGraphCache;
7
8
  export declare function dependencyEdgesFromGraphCache(sheet: Sheet): Edge[];
8
9
  export declare function getRenderableDependencyEdges(sheet: Sheet): Edge[];
9
10
  export declare function ensureGraphCache(sheet: Sheet): SheetGraphCache;
10
- export declare function replaceCellDependenciesInCache(sheet: Sheet, cellId: string, deps: string[]): void;
11
+ export declare function replaceCellDependenciesInCache(sheet: Sheet, cellId: string, deps: string[], tableNames?: string[]): void;
11
12
  export declare function removeCellFromCache(sheet: Sheet, cellId: string): void;
12
13
  export declare function buildDependencyGraph(sheetId: string, state: CellsRootState): DependencyGraph;
13
14
  export declare function topologicalOrder(roots: string[], dependencies: Record<string, string[]>, dependents: Record<string, string[]>, scope?: Set<string>): string[];
@@ -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,IAAI,EAEJ,KAAK,EACL,eAAe,EACf,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,CAAC,KAAK,EAAE,KAAK,GAAG,eAAe,CA4BtE;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,EACd,UAAU,CAAC,EAAE,MAAM,EAAE,QA0BtB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAuB/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,CA+E1B"}
package/dist/dagUtils.js CHANGED
@@ -1,4 +1,5 @@
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
  }
@@ -34,6 +35,7 @@ export function buildGraphCacheFromEdges(sheet) {
34
35
  dependencies,
35
36
  dependents,
36
37
  contentHashByCell: sheet.graphCache?.contentHashByCell || {},
38
+ tableDependencies: sheet.graphCache?.tableDependencies || {},
37
39
  };
38
40
  }
39
41
  export function dependencyEdgesFromGraphCache(sheet) {
@@ -72,7 +74,7 @@ export function ensureGraphCache(sheet) {
72
74
  }
73
75
  return sheet.graphCache;
74
76
  }
75
- export function replaceCellDependenciesInCache(sheet, cellId, deps) {
77
+ export function replaceCellDependenciesInCache(sheet, cellId, deps, tableNames) {
76
78
  const cache = ensureGraphCache(sheet);
77
79
  const localCellIds = new Set(sheet.cellIds);
78
80
  const nextDeps = dedupe(deps).filter((depId) => localCellIds.has(depId) && depId !== cellId);
@@ -89,6 +91,10 @@ export function replaceCellDependenciesInCache(sheet, cellId, deps) {
89
91
  if (!children.includes(cellId))
90
92
  children.push(cellId);
91
93
  }
94
+ if (tableNames !== undefined) {
95
+ cache.tableDependencies = cache.tableDependencies || {};
96
+ cache.tableDependencies[cellId] = tableNames;
97
+ }
92
98
  }
93
99
  export function removeCellFromCache(sheet, cellId) {
94
100
  const cache = ensureGraphCache(sheet);
@@ -107,6 +113,9 @@ export function removeCellFromCache(sheet, cellId) {
107
113
  if (cache.contentHashByCell) {
108
114
  delete cache.contentHashByCell[cellId];
109
115
  }
116
+ if (cache.tableDependencies) {
117
+ delete cache.tableDependencies[cellId];
118
+ }
110
119
  }
111
120
  export function buildDependencyGraph(sheetId, state) {
112
121
  const sheet = state.cells.config.sheets[sheetId];
@@ -190,44 +199,59 @@ export async function buildDependencyGraphAsync(sheetId, state, sqlSelectToJson)
190
199
  return {
191
200
  dependencies: { ...cache.dependencies },
192
201
  dependents: { ...cache.dependents },
202
+ tableDependencies: cache.tableDependencies
203
+ ? { ...cache.tableDependencies }
204
+ : undefined,
193
205
  };
194
206
  }
195
207
  const dependencies = {};
196
208
  const dependents = {};
209
+ const tableDependencies = {};
197
210
  const sheetCellIds = new Set(sheet.cellIds);
198
211
  const scopedCells = Object.fromEntries(sheet.cellIds
199
212
  .map((id) => state.cells.config.data[id])
200
213
  .filter(isDefined)
201
214
  .map((cell) => [cell.id, cell]));
202
- // Process all cells in parallel
203
215
  const cellDeps = await Promise.all(sheet.cellIds.map(async (cellId) => {
204
216
  const cell = state.cells.config.data[cellId];
205
217
  if (!cell)
206
- return { cellId, deps: [] };
218
+ return {
219
+ cellId,
220
+ cellIds: [],
221
+ tableNames: undefined,
222
+ };
207
223
  const registryItem = registry[cell.type];
208
224
  if (!registryItem)
209
- return { cellId, deps: [] };
210
- const deps = await registryItem.findDependencies({
225
+ return {
226
+ cellId,
227
+ cellIds: [],
228
+ tableNames: undefined,
229
+ };
230
+ const raw = await registryItem.findDependencies({
211
231
  cell,
212
232
  cells: scopedCells,
213
233
  sheetId,
214
234
  sqlSelectToJson,
215
235
  });
236
+ const normalized = normalizeCellDependencies(raw);
216
237
  return {
217
238
  cellId,
218
- deps: Array.from(new Set(deps)).filter((depId) => sheetCellIds.has(depId)),
239
+ cellIds: Array.from(new Set(normalized.cellIds)).filter((depId) => sheetCellIds.has(depId)),
240
+ tableNames: normalized.tableNames,
219
241
  };
220
242
  }));
221
- // Build the graph from results
222
- for (const { cellId, deps } of cellDeps) {
223
- dependencies[cellId] = deps;
224
- for (const dep of deps) {
243
+ for (const { cellId, cellIds, tableNames } of cellDeps) {
244
+ dependencies[cellId] = cellIds;
245
+ for (const dep of cellIds) {
225
246
  const list = dependents[dep] || (dependents[dep] = []);
226
247
  if (!list.includes(cellId)) {
227
248
  list.push(cellId);
228
249
  }
229
250
  }
251
+ if (tableNames && tableNames.length > 0) {
252
+ tableDependencies[cellId] = tableNames;
253
+ }
230
254
  }
231
- return { dependencies, dependents };
255
+ return { dependencies, dependents, tableDependencies };
232
256
  }
233
257
  //# 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 Edge,\n EdgeKind,\n Sheet,\n SheetGraphCache,\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: 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 tableDependencies: sheet.graphCache?.tableDependencies || {},\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 tableNames?: 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 if (tableNames !== undefined) {\n cache.tableDependencies = cache.tableDependencies || {};\n cache.tableDependencies[cellId] = tableNames;\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 if (cache.tableDependencies) {\n delete cache.tableDependencies[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 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 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 const cellDeps = await Promise.all(\n sheet.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 sheetId,\n sqlSelectToJson,\n });\n const normalized = normalizeCellDependencies(raw);\n\n return {\n cellId,\n cellIds: Array.from(new Set(normalized.cellIds)).filter((depId) =>\n sheetCellIds.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,CAwPxD"}
@@ -8,16 +8,16 @@ import { TextCellContent } from './components/TextCellContent';
8
8
  import { VegaCellContent } from './components/VegaCellContent';
9
9
  import { executeSqlCell } from './execution';
10
10
  import { findSheetIdForCell, resolveSheetSchemaName } from './helpers';
11
+ import { dropResultRelation, renameResultRelation } from './resultRelationPolicy';
11
12
  import { findSqlDependenciesFromAst, qualifySheetLocalResultNames, renderSqlWithInputs, } from './sqlHelpers';
12
- import { renameResultRelation } from './resultRelationPolicy';
13
- import { isInputCell } from './types';
13
+ import { isInputCell, isSqlCell } from './types';
14
14
  import { getEffectiveResultName, isDefined } from './utils';
15
15
  export function createDefaultCellRegistry() {
16
16
  return {
17
17
  sql: {
18
18
  type: 'sql',
19
19
  title: 'SQL Query',
20
- createCell: (id) => ({
20
+ createCell: ({ id }) => ({
21
21
  id,
22
22
  type: 'sql',
23
23
  data: { title: 'Untitled Query', sql: '' },
@@ -30,11 +30,51 @@ export function createDefaultCellRegistry() {
30
30
  sqlSelectToJson,
31
31
  });
32
32
  },
33
+ createStatus: () => ({
34
+ type: 'sql',
35
+ status: 'idle',
36
+ referencedTables: [],
37
+ }),
38
+ onRemove: async ({ status, get }) => {
39
+ if (status?.type === 'sql' && status.resultView) {
40
+ try {
41
+ const connector = await get().db.getConnector();
42
+ await dropResultRelation({
43
+ connector,
44
+ relationName: status.resultView,
45
+ });
46
+ }
47
+ catch {
48
+ // best-effort
49
+ }
50
+ }
51
+ },
52
+ hasSemanticChange: (oldCell, newCell) => {
53
+ const oldSql = isSqlCell(oldCell) ? oldCell.data.sql : undefined;
54
+ const newSql = isSqlCell(newCell) ? newCell.data.sql : undefined;
55
+ return oldSql !== newSql;
56
+ },
57
+ invalidateStatus: (currentStatus) => ({
58
+ type: 'sql',
59
+ status: 'idle',
60
+ referencedTables: currentStatus.referencedTables || [],
61
+ }),
62
+ getRelationsToDrop: (status) => {
63
+ const sqlStatus = status;
64
+ return sqlStatus.resultView ? [sqlStatus.resultView] : [];
65
+ },
66
+ recordError: (currentStatus, message) => ({
67
+ ...currentStatus,
68
+ status: 'error',
69
+ lastError: message,
70
+ }),
71
+ getResultRelation: (status) => {
72
+ const sqlStatus = status;
73
+ return sqlStatus.resultView;
74
+ },
33
75
  runCell: async ({ id, opts, get, set }) => {
34
76
  const ownerSheetId = findSheetIdForCell(get(), id);
35
77
  if (ownerSheetId) {
36
- // Recompute this SQL cell's dependencies on explicit run so graph state
37
- // stays current without paying the cost on every keystroke.
38
78
  await get().cells.updateEdgesFromSql(ownerSheetId, id);
39
79
  }
40
80
  const controller = new AbortController();
@@ -47,7 +87,6 @@ export function createDefaultCellRegistry() {
47
87
  signal: controller.signal,
48
88
  setCellResult: get().cells.setCellResult,
49
89
  });
50
- // Refresh table schemas after execution (fire and forget)
51
90
  void get().db.refreshTableSchemas();
52
91
  },
53
92
  renameResult: async ({ id, oldResultView, get, set }) => {
@@ -56,8 +95,9 @@ export function createDefaultCellRegistry() {
56
95
  if (!cell || cell.type !== 'sql')
57
96
  return;
58
97
  const status = state.cells.status[id];
59
- const previousRelationType = (status?.type === 'sql' ? status.resultRelationType : undefined) ??
60
- 'view';
98
+ const previousRelationType = (status?.type === 'sql'
99
+ ? status.resultRelationType
100
+ : undefined) ?? 'view';
61
101
  const sheetId = findSheetIdForCell(state, id);
62
102
  const sheet = sheetId ? state.cells.config.sheets[sheetId] : undefined;
63
103
  const schemaName = sheet ? resolveSheetSchemaName(sheet) : 'main';
@@ -70,8 +110,6 @@ export function createDefaultCellRegistry() {
70
110
  if (newTableName === oldResultView) {
71
111
  return;
72
112
  }
73
- // Re-create the relation under the new name. For materialized results
74
- // keep table semantics, otherwise keep view semantics.
75
113
  const connector = await state.db.getConnector();
76
114
  const sql = cell.data.sql;
77
115
  const scopedCellIds = sheet?.cellIds ?? Object.keys(state.cells.config.data);
@@ -79,7 +117,6 @@ export function createDefaultCellRegistry() {
79
117
  .map((cellId) => state.cells.config.data[cellId])
80
118
  .filter(isDefined)
81
119
  .map((candidate) => [candidate.id, candidate]));
82
- // Gather inputs for SQL rendering
83
120
  const inputs = Object.values(scopedCells)
84
121
  .filter((c) => isInputCell(c))
85
122
  .map((c) => ({
@@ -100,8 +137,6 @@ export function createDefaultCellRegistry() {
100
137
  return undefined;
101
138
  },
102
139
  });
103
- // Rename must preserve whichever mode execution selected (view/table).
104
- // We clear any stale object at the destination name first.
105
140
  await renameResultRelation({
106
141
  connector,
107
142
  oldRelationName: oldResultView,
@@ -109,23 +144,22 @@ export function createDefaultCellRegistry() {
109
144
  relationType: previousRelationType,
110
145
  viewSql: rewrittenSql,
111
146
  });
112
- // Update status with new view name
113
147
  set((s) => produce(s, (draft) => {
114
- const status = draft.cells.status[id];
115
- if (status?.type === 'sql') {
116
- status.resultName = newTableName;
117
- status.resultView = newTableName;
118
- status.resultRelationType = previousRelationType;
148
+ const draftStatus = draft.cells.status[id];
149
+ if (draftStatus?.type === 'sql') {
150
+ draftStatus.resultName = newTableName;
151
+ draftStatus.resultView = newTableName;
152
+ draftStatus.resultRelationType =
153
+ previousRelationType;
119
154
  }
120
155
  }));
121
- // Refresh schema tree
122
156
  void get().db.refreshTableSchemas();
123
157
  },
124
158
  },
125
159
  text: {
126
160
  type: 'text',
127
161
  title: 'Text / Markdown',
128
- createCell: (id) => ({
162
+ createCell: ({ id }) => ({
129
163
  id,
130
164
  type: 'text',
131
165
  data: { title: 'Text', text: '' },
@@ -136,11 +170,12 @@ export function createDefaultCellRegistry() {
136
170
  vega: {
137
171
  type: 'vega',
138
172
  title: 'Visualization',
139
- createCell: (id) => ({
173
+ createCell: ({ id }) => ({
140
174
  id,
141
175
  type: 'vega',
142
176
  data: {
143
177
  title: 'Chart',
178
+ crossFilter: { enabled: true },
144
179
  vegaSpec: {
145
180
  data: { name: 'queryResult' },
146
181
  mark: 'bar',
@@ -151,13 +186,17 @@ export function createDefaultCellRegistry() {
151
186
  renderCell: ({ id, cell, renderContainer }) => (_jsx(VegaCellContent, { id: id, cell: cell, renderContainer: renderContainer })),
152
187
  findDependencies: async ({ cell }) => {
153
188
  const sqlId = cell.data.sqlId;
154
- return sqlId ? [sqlId] : [];
189
+ const tableRef = cell.data.tableRef;
190
+ return {
191
+ cellIds: sqlId ? [sqlId] : [],
192
+ tableNames: tableRef ? [tableRef] : [],
193
+ };
155
194
  },
156
195
  },
157
196
  input: {
158
197
  type: 'input',
159
198
  title: 'Input / Parameter',
160
- createCell: (id) => ({
199
+ createCell: ({ id }) => ({
161
200
  id,
162
201
  type: 'input',
163
202
  data: {
@@ -1 +1 @@
1
- {"version":3,"file":"defaultCellRegistry.js","sourceRoot":"","sources":["../src/defaultCellRegistry.tsx"],"names":[],"mappings":"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","sourcesContent":["import {makeQualifiedTableName} from '@sqlrooms/duckdb';\nimport {convertToValidColumnOrTableName} from '@sqlrooms/utils';\nimport {produce} from 'immer';\nimport {InputCellContent} from './components/InputCellContent';\nimport {SqlCellContent} from './components/SqlCellContent';\nimport {TextCellContent} from './components/TextCellContent';\nimport {VegaCellContent} from './components/VegaCellContent';\nimport {executeSqlCell} from './execution';\nimport {findSheetIdForCell, resolveSheetSchemaName} from './helpers';\nimport {\n findSqlDependenciesFromAst,\n qualifySheetLocalResultNames,\n renderSqlWithInputs,\n} from './sqlHelpers';\nimport {renameResultRelation} from './resultRelationPolicy';\nimport type {\n Cell,\n CellRegistry,\n InputCell,\n SqlCell,\n SqlCellData,\n TextCell,\n VegaCell,\n} from './types';\nimport {isInputCell} from './types';\nimport {getEffectiveResultName, isDefined} from './utils';\n\nexport function createDefaultCellRegistry(): CellRegistry {\n return {\n sql: {\n type: 'sql',\n title: 'SQL Query',\n createCell: (id: string): SqlCell => ({\n id,\n type: 'sql',\n data: {title: 'Untitled Query', sql: ''},\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <SqlCellContent\n id={id}\n cell={cell as SqlCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async ({cell, cells, sqlSelectToJson}) => {\n return findSqlDependenciesFromAst({\n sql: (cell as SqlCell).data.sql,\n cells,\n sqlSelectToJson,\n });\n },\n runCell: async ({id, opts, get, set}) => {\n const ownerSheetId = findSheetIdForCell(get(), id);\n if (ownerSheetId) {\n // Recompute this SQL cell's dependencies on explicit run so graph state\n // stays current without paying the cost on every keystroke.\n await get().cells.updateEdgesFromSql(ownerSheetId, id);\n }\n\n const controller = new AbortController();\n set((s) =>\n produce(s, (draft) => {\n draft.cells.activeAbortControllers[id] = controller;\n }),\n );\n\n await executeSqlCell(id, get, set, {\n schemaName: opts?.schemaName || 'main',\n cascade: opts?.cascade,\n signal: controller.signal,\n setCellResult: get().cells.setCellResult,\n });\n\n // Refresh table schemas after execution (fire and forget)\n void get().db.refreshTableSchemas();\n },\n renameResult: async ({id, oldResultView, get, set}) => {\n const state = get();\n const cell = state.cells.config.data[id];\n if (!cell || cell.type !== 'sql') return;\n const status = state.cells.status[id];\n const previousRelationType =\n (status?.type === 'sql' ? status.resultRelationType : undefined) ??\n 'view';\n\n const sheetId = findSheetIdForCell(state, id);\n const sheet = sheetId ? state.cells.config.sheets[sheetId] : undefined;\n const schemaName = sheet ? resolveSheetSchemaName(sheet) : 'main';\n\n const effectiveResultName = getEffectiveResultName(\n cell.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n const newTableName = makeQualifiedTableName({\n table: effectiveResultName,\n schema: schemaName,\n database: state.db.currentDatabase,\n }).toString();\n\n if (newTableName === oldResultView) {\n return;\n }\n\n // Re-create the relation under the new name. For materialized results\n // keep table semantics, otherwise keep view semantics.\n const connector = await state.db.getConnector();\n const sql = (cell.data as SqlCellData).sql;\n const scopedCellIds =\n sheet?.cellIds ?? Object.keys(state.cells.config.data);\n const scopedCells = Object.fromEntries(\n scopedCellIds\n .map((cellId) => state.cells.config.data[cellId])\n .filter(isDefined)\n .map((candidate) => [candidate.id, candidate]),\n ) as Record<string, Cell>;\n\n // Gather inputs for SQL rendering\n const inputs = Object.values(scopedCells)\n .filter((c) => isInputCell(c))\n .map((c) => ({\n varName: c.data.input.varName,\n value: c.data.input.value as string | number,\n }));\n const renderedSql = renderSqlWithInputs(sql, inputs);\n const rewrittenSql = qualifySheetLocalResultNames({\n sql: renderedSql,\n sheetSchema: schemaName,\n sheetCellIds: scopedCellIds,\n cells: state.cells.config.data,\n getSqlResultName: (cellId) => {\n const c = state.cells.config.data[cellId];\n if (c?.type === 'sql') {\n return getEffectiveResultName(\n c.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n }\n return undefined;\n },\n });\n\n // Rename must preserve whichever mode execution selected (view/table).\n // We clear any stale object at the destination name first.\n await renameResultRelation({\n connector,\n oldRelationName: oldResultView,\n newRelationName: newTableName,\n relationType: previousRelationType,\n viewSql: rewrittenSql,\n });\n\n // Update status with new view name\n set((s) =>\n produce(s, (draft) => {\n const status = draft.cells.status[id];\n if (status?.type === 'sql') {\n status.resultName = newTableName;\n status.resultView = newTableName;\n status.resultRelationType = previousRelationType;\n }\n }),\n );\n\n // Refresh schema tree\n void get().db.refreshTableSchemas();\n },\n },\n text: {\n type: 'text',\n title: 'Text / Markdown',\n createCell: (id: string): TextCell => ({\n id,\n type: 'text',\n data: {title: 'Text', text: ''},\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <TextCellContent\n id={id}\n cell={cell as TextCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async () => [],\n },\n vega: {\n type: 'vega',\n title: 'Visualization',\n createCell: (id: string): VegaCell => ({\n id,\n type: 'vega',\n data: {\n title: 'Chart',\n vegaSpec: {\n data: {name: 'queryResult'},\n mark: 'bar',\n padding: 20,\n },\n },\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <VegaCellContent\n id={id}\n cell={cell as VegaCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async ({cell}) => {\n const sqlId = (cell as VegaCell).data.sqlId;\n return sqlId ? [sqlId] : [];\n },\n },\n input: {\n type: 'input',\n title: 'Input / Parameter',\n createCell: (id: string): InputCell => ({\n id,\n type: 'input',\n data: {\n title: 'Input',\n input: {\n kind: 'text',\n varName: `param_${id.slice(0, 4)}`,\n value: '',\n },\n },\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <InputCellContent\n id={id}\n cell={cell as InputCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async () => [],\n },\n };\n}\n"]}
1
+ {"version":3,"file":"defaultCellRegistry.js","sourceRoot":"","sources":["../src/defaultCellRegistry.tsx"],"names":[],"mappings":"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","sourcesContent":["import {makeQualifiedTableName} from '@sqlrooms/duckdb';\nimport {convertToValidColumnOrTableName} from '@sqlrooms/utils';\nimport {produce} from 'immer';\nimport {InputCellContent} from './components/InputCellContent';\nimport {SqlCellContent} from './components/SqlCellContent';\nimport {TextCellContent} from './components/TextCellContent';\nimport {VegaCellContent} from './components/VegaCellContent';\nimport {executeSqlCell} from './execution';\nimport {findSheetIdForCell, resolveSheetSchemaName} from './helpers';\nimport {dropResultRelation, renameResultRelation} from './resultRelationPolicy';\nimport {\n findSqlDependenciesFromAst,\n qualifySheetLocalResultNames,\n renderSqlWithInputs,\n} from './sqlHelpers';\nimport type {\n Cell,\n CellRegistry,\n CellStatus,\n InputCell,\n SqlCell,\n SqlCellData,\n SqlCellStatus,\n TextCell,\n VegaCell,\n} from './types';\nimport {isInputCell, isSqlCell} from './types';\nimport {getEffectiveResultName, isDefined} from './utils';\n\nexport function createDefaultCellRegistry(): CellRegistry {\n return {\n sql: {\n type: 'sql',\n title: 'SQL Query',\n createCell: ({id}): SqlCell => ({\n id,\n type: 'sql',\n data: {title: 'Untitled Query', sql: ''},\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <SqlCellContent\n id={id}\n cell={cell as SqlCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async ({cell, cells, sqlSelectToJson}) => {\n return findSqlDependenciesFromAst({\n sql: (cell as SqlCell).data.sql,\n cells,\n sqlSelectToJson,\n });\n },\n createStatus: (): CellStatus => ({\n type: 'sql',\n status: 'idle',\n referencedTables: [],\n }),\n onRemove: async ({status, get}) => {\n if (status?.type === 'sql' && (status as SqlCellStatus).resultView) {\n try {\n const connector = await get().db.getConnector();\n await dropResultRelation({\n connector,\n relationName: (status as SqlCellStatus).resultView,\n });\n } catch {\n // best-effort\n }\n }\n },\n hasSemanticChange: (oldCell, newCell) => {\n const oldSql = isSqlCell(oldCell) ? oldCell.data.sql : undefined;\n const newSql = isSqlCell(newCell) ? newCell.data.sql : undefined;\n return oldSql !== newSql;\n },\n invalidateStatus: (currentStatus): CellStatus => ({\n type: 'sql',\n status: 'idle',\n referencedTables:\n (currentStatus as SqlCellStatus).referencedTables || [],\n }),\n getRelationsToDrop: (status): string[] => {\n const sqlStatus = status as SqlCellStatus;\n return sqlStatus.resultView ? [sqlStatus.resultView] : [];\n },\n recordError: (currentStatus, message): CellStatus => ({\n ...currentStatus,\n status: 'error',\n lastError: message,\n }),\n getResultRelation: (status): string | undefined => {\n const sqlStatus = status as SqlCellStatus;\n return sqlStatus.resultView;\n },\n runCell: async ({id, opts, get, set}) => {\n const ownerSheetId = findSheetIdForCell(get(), id);\n if (ownerSheetId) {\n await get().cells.updateEdgesFromSql(ownerSheetId, id);\n }\n\n const controller = new AbortController();\n set((s) =>\n produce(s, (draft) => {\n draft.cells.activeAbortControllers[id] = controller;\n }),\n );\n\n await executeSqlCell(id, get, set, {\n schemaName: opts?.schemaName || 'main',\n cascade: opts?.cascade,\n signal: controller.signal,\n setCellResult: get().cells.setCellResult,\n });\n\n void get().db.refreshTableSchemas();\n },\n renameResult: async ({id, oldResultView, get, set}) => {\n const state = get();\n const cell = state.cells.config.data[id];\n if (!cell || cell.type !== 'sql') return;\n const status = state.cells.status[id];\n const previousRelationType =\n (status?.type === 'sql'\n ? (status as SqlCellStatus).resultRelationType\n : undefined) ?? 'view';\n\n const sheetId = findSheetIdForCell(state, id);\n const sheet = sheetId ? state.cells.config.sheets[sheetId] : undefined;\n const schemaName = sheet ? resolveSheetSchemaName(sheet) : 'main';\n\n const effectiveResultName = getEffectiveResultName(\n cell.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n const newTableName = makeQualifiedTableName({\n table: effectiveResultName,\n schema: schemaName,\n database: state.db.currentDatabase,\n }).toString();\n\n if (newTableName === oldResultView) {\n return;\n }\n\n const connector = await state.db.getConnector();\n const sql = (cell.data as SqlCellData).sql;\n const scopedCellIds =\n sheet?.cellIds ?? Object.keys(state.cells.config.data);\n const scopedCells = Object.fromEntries(\n scopedCellIds\n .map((cellId) => state.cells.config.data[cellId])\n .filter(isDefined)\n .map((candidate) => [candidate.id, candidate]),\n ) as Record<string, Cell>;\n\n const inputs = Object.values(scopedCells)\n .filter((c) => isInputCell(c))\n .map((c) => ({\n varName: c.data.input.varName,\n value: c.data.input.value as string | number,\n }));\n const renderedSql = renderSqlWithInputs(sql, inputs);\n const rewrittenSql = qualifySheetLocalResultNames({\n sql: renderedSql,\n sheetSchema: schemaName,\n sheetCellIds: scopedCellIds,\n cells: state.cells.config.data,\n getSqlResultName: (cellId) => {\n const c = state.cells.config.data[cellId];\n if (c?.type === 'sql') {\n return getEffectiveResultName(\n c.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n }\n return undefined;\n },\n });\n\n await renameResultRelation({\n connector,\n oldRelationName: oldResultView,\n newRelationName: newTableName,\n relationType: previousRelationType,\n viewSql: rewrittenSql,\n });\n\n set((s) =>\n produce(s, (draft) => {\n const draftStatus = draft.cells.status[id];\n if (draftStatus?.type === 'sql') {\n (draftStatus as SqlCellStatus).resultName = newTableName;\n (draftStatus as SqlCellStatus).resultView = newTableName;\n (draftStatus as SqlCellStatus).resultRelationType =\n previousRelationType;\n }\n }),\n );\n\n void get().db.refreshTableSchemas();\n },\n },\n text: {\n type: 'text',\n title: 'Text / Markdown',\n createCell: ({id}): TextCell => ({\n id,\n type: 'text',\n data: {title: 'Text', text: ''},\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <TextCellContent\n id={id}\n cell={cell as TextCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async () => [],\n },\n vega: {\n type: 'vega',\n title: 'Visualization',\n createCell: ({id}): VegaCell => ({\n id,\n type: 'vega',\n data: {\n title: 'Chart',\n crossFilter: {enabled: true},\n vegaSpec: {\n data: {name: 'queryResult'},\n mark: 'bar',\n padding: 20,\n },\n },\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <VegaCellContent\n id={id}\n cell={cell as VegaCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async ({cell}) => {\n const sqlId = (cell as VegaCell).data.sqlId;\n const tableRef = (cell as VegaCell).data.tableRef;\n return {\n cellIds: sqlId ? [sqlId] : [],\n tableNames: tableRef ? [tableRef] : [],\n };\n },\n },\n input: {\n type: 'input',\n title: 'Input / Parameter',\n createCell: ({id}): InputCell => ({\n id,\n type: 'input',\n data: {\n title: 'Input',\n input: {\n kind: 'text',\n varName: `param_${id.slice(0, 4)}`,\n value: '',\n },\n },\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <InputCellContent\n id={id}\n cell={cell as InputCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async () => [],\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"AAkBA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,cAAc,EAGpB,MAAM,SAAS,CAAC;AAKjB,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;CAC5D,CAAC;AAEF,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,cAAc,EAC9B,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,cAAc,KAAK,IAAI,EACjE,OAAO,EAAE,qBAAqB,iBAmO/B"}
1
+ {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"AAkBA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,cAAc,EAGpB,MAAM,SAAS,CAAC;AAKjB,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;CAC5D,CAAC;AAEF,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,cAAc,EAC9B,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,cAAc,KAAK,IAAI,EACjE,OAAO,EAAE,qBAAqB,iBAoO/B"}
package/dist/execution.js CHANGED
@@ -136,7 +136,8 @@ export async function executeSqlCell(cellId, getState, set, options) {
136
136
  const s = getState().cells.status[id];
137
137
  if (s?.type !== 'sql')
138
138
  return undefined;
139
- const fromStatus = getUnqualifiedSqlIdentifier(s.resultName);
139
+ const sqlStatus = s;
140
+ const fromStatus = getUnqualifiedSqlIdentifier(sqlStatus.resultName);
140
141
  if (fromStatus)
141
142
  return fromStatus;
142
143
  const currentCell = getState().cells.config.data[id];