@sqlrooms/cells 0.29.0-rc.2 → 0.29.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/dist/cellsSlice.d.ts.map +1 -1
- package/dist/cellsSlice.js +121 -198
- package/dist/cellsSlice.js.map +1 -1
- package/dist/components/CellSourceSelector.d.ts +1 -0
- package/dist/components/CellSourceSelector.d.ts.map +1 -1
- package/dist/components/CellSourceSelector.js +8 -9
- package/dist/components/CellSourceSelector.js.map +1 -1
- package/dist/components/SqlCellContent.js +3 -3
- package/dist/components/SqlCellContent.js.map +1 -1
- package/dist/components/SqlCellDependentsMenu.d.ts +3 -3
- package/dist/components/SqlCellDependentsMenu.d.ts.map +1 -1
- package/dist/components/SqlCellDependentsMenu.js +4 -4
- package/dist/components/SqlCellDependentsMenu.js.map +1 -1
- package/dist/components/VegaCellHeader.d.ts.map +1 -1
- package/dist/components/VegaCellHeader.js +2 -1
- package/dist/components/VegaCellHeader.js.map +1 -1
- package/dist/dagUtils.d.ts +9 -9
- package/dist/dagUtils.d.ts.map +1 -1
- package/dist/dagUtils.js +44 -42
- package/dist/dagUtils.js.map +1 -1
- package/dist/defaultCellRegistry.d.ts.map +1 -1
- package/dist/defaultCellRegistry.js +16 -12
- package/dist/defaultCellRegistry.js.map +1 -1
- package/dist/execution.d.ts.map +1 -1
- package/dist/execution.js +22 -16
- package/dist/execution.js.map +1 -1
- package/dist/helpers.d.ts +9 -17
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +24 -43
- package/dist/helpers.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/sqlHelpers.d.ts +5 -5
- package/dist/sqlHelpers.d.ts.map +1 -1
- package/dist/sqlHelpers.js +7 -7
- package/dist/sqlHelpers.js.map +1 -1
- package/dist/types.d.ts +19 -47
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -12
- package/dist/types.js.map +1 -1
- package/dist/useValidateResultName.js +5 -5
- package/dist/useValidateResultName.js.map +1 -1
- package/dist/utils.d.ts +2 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -4
- package/dist/utils.js.map +1 -1
- package/package.json +10 -10
- package/dist/components/DeleteSheetModal.d.ts +0 -9
- package/dist/components/DeleteSheetModal.d.ts.map +0 -1
- package/dist/components/DeleteSheetModal.js +0 -6
- package/dist/components/DeleteSheetModal.js.map +0 -1
- package/dist/components/SheetsTabBar.d.ts +0 -6
- package/dist/components/SheetsTabBar.d.ts.map +0 -1
- package/dist/components/SheetsTabBar.js +0 -58
- package/dist/components/SheetsTabBar.js.map +0 -1
- package/dist/components/SqlCellBody.d.ts +0 -6
- package/dist/components/SqlCellBody.d.ts.map +0 -1
- package/dist/components/SqlCellBody.js +0 -12
- package/dist/components/SqlCellBody.js.map +0 -1
- package/dist/crdt.d.ts +0 -61
- package/dist/crdt.d.ts.map +0 -1
- package/dist/crdt.js +0 -82
- package/dist/crdt.js.map +0 -1
- package/dist/dagSlice.d.ts +0 -3
- package/dist/dagSlice.d.ts.map +0 -1
- package/dist/dagSlice.js +0 -51
- package/dist/dagSlice.js.map +0 -1
- package/dist/typeGuards.d.ts +0 -2
- package/dist/typeGuards.d.ts.map +0 -1
- package/dist/typeGuards.js +0 -4
- package/dist/typeGuards.js.map +0 -1
- package/dist/validation.d.ts +0 -16
- package/dist/validation.d.ts.map +0 -1
- package/dist/validation.js +0 -40
- package/dist/validation.js.map +0 -1
package/dist/execution.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import {escapeId, makeQualifiedTableName} from '@sqlrooms/duckdb';\nimport {convertToValidColumnOrTableName} from '@sqlrooms/utils';\nimport {produce} from 'immer';\nimport {\n findSheetIdForCell,\n getUnqualifiedSqlIdentifier,\n resolveSheetSchemaName,\n} from './helpers';\nimport {\n findSqlDependencies,\n qualifySheetLocalResultNames,\n renderSqlWithInputs,\n} from './sqlHelpers';\nimport {\n chooseAdaptiveRelationType,\n createOrReplaceResultRelation,\n type ResultRelationType,\n} from './resultRelationPolicy';\nimport {\n isInputCell,\n isSqlCell,\n type CellResultData,\n type CellsRootState,\n type SqlCellData,\n type SqlCellStatus,\n} from './types';\nimport {getEffectiveResultName, isDefined} from './utils';\n\nconst DEFAULT_PAGE_SIZE = 10;\n\nexport type ExecuteSqlCellOptions = {\n schemaName: string;\n cascade?: boolean;\n signal?: AbortSignal;\n setCellResult?: (id: string, data: CellResultData) => void;\n};\n\nexport async function executeSqlCell(\n cellId: string,\n getState: () => CellsRootState,\n set: (updater: (state: CellsRootState) => CellsRootState) => void,\n options: ExecuteSqlCellOptions,\n) {\n // Intentionally snapshot state/cell at trigger time so this run is stable.\n // Later store mutations do not alter this execution; re-read with getState()\n // explicitly if you need live data after awaits.\n const state = getState();\n const cell = state.cells.config.data[cellId];\n if (!cell || cell.type !== 'sql') return;\n const previousStatus =\n state.cells.status[cellId]?.type === 'sql'\n ? (state.cells.status[cellId] as SqlCellStatus)\n : undefined;\n\n const {schemaName, cascade = true, signal, setCellResult} = options;\n const sqlRaw = cell.data.sql || '';\n const sheetId = findSheetIdForCell(state, cellId);\n const sheet = sheetId ? state.cells.config.sheets[sheetId] : undefined;\n const finalSchemaName = sheet ? resolveSheetSchemaName(sheet) : schemaName;\n const finalDatabaseName =\n state.db.config.coreMaterialization.strategy === 'attached_ephemeral'\n ? state.db.config.coreMaterialization.attachedDatabaseName\n : undefined;\n const sheetCellIds = sheet?.cellIds ?? [];\n\n // 1. Gather inputs for SQL rendering\n const cellsInScope = (\n sheetCellIds.length ? sheetCellIds : Object.keys(state.cells.config.data)\n )\n .map((id) => state.cells.config.data[id])\n .filter(isDefined);\n const inputs = cellsInScope\n .filter((c) => isInputCell(c))\n .map((c) => ({\n varName: c.data.input.varName,\n value: c.data.input.value,\n }));\n\n const renderedSql = renderSqlWithInputs(sqlRaw, inputs);\n const sql = qualifySheetLocalResultNames({\n sql: renderedSql,\n sheetSchema: finalSchemaName,\n sheetDatabase: finalDatabaseName,\n sheetCellIds,\n cells: state.cells.config.data,\n getSqlResultName: (id) => {\n const target = state.cells.config.data[id];\n if (!target || target.type !== 'sql') return undefined;\n return getEffectiveResultName(\n target.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n },\n });\n\n // 2. Update status to running\n set((s) =>\n produce(s, (draft) => {\n const previousStatus = draft.cells.status[cellId] as\n | SqlCellStatus\n | undefined;\n draft.cells.status[cellId] = {\n type: 'sql',\n status: 'running',\n // Keep previous result metadata so the table remains mounted while\n // a fresh query is running.\n resultName: previousStatus?.resultName,\n resultView: previousStatus?.resultView,\n resultRelationType: previousStatus?.resultRelationType,\n lastRunTime: previousStatus?.lastRunTime,\n referencedTables: previousStatus?.referencedTables || [],\n };\n }),\n );\n\n try {\n const db = state.db;\n const dbConnectors = state.db.connectors;\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n const effectiveResultName = getEffectiveResultName(\n cell.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n const selectedConnectorId = (cell.data as SqlCellData).connectorId;\n let tableName = '';\n let relationType: ResultRelationType = 'view';\n const connector = await db.getConnector();\n if (dbConnectors?.runQuery) {\n const routed = await dbConnectors.runQuery({\n connectionId: selectedConnectorId,\n sql,\n queryType: 'arrow',\n materialize: true,\n materializedName: effectiveResultName,\n materializedSchema: finalSchemaName,\n materializedDatabase: finalDatabaseName,\n signal,\n });\n if (!routed.relationName) {\n throw new Error('Query did not return a materialized relation');\n }\n tableName = routed.relationName;\n relationType = 'table';\n } else {\n const parsed = await db.sqlSelectToJson(sql);\n if (parsed.error) {\n throw new Error(parsed.error_message || 'Not a valid SELECT statement');\n }\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n await connector.query(\n `CREATE SCHEMA IF NOT EXISTS ${escapeId(finalSchemaName)}`,\n {signal},\n );\n\n tableName = makeQualifiedTableName({\n table: effectiveResultName,\n schema: finalSchemaName,\n database: db.currentDatabase,\n }).toString();\n // Adaptive policy:\n // - first run: choose table when there are downstream dependents,\n // otherwise keep a lightweight view.\n // - subsequent runs: preserve the previously selected relation type.\n const hasDownstream =\n Boolean(sheetId) &&\n getState().cells.getDownstream(sheetId as string, cellId).length > 0;\n relationType = chooseAdaptiveRelationType({\n previousRelationType: previousStatus?.resultRelationType,\n hasDownstream,\n });\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n await createOrReplaceResultRelation({\n connector,\n relationName: tableName,\n relationType,\n sql,\n signal,\n });\n }\n\n // Find dependencies for referenced tables\n const referenced = findSqlDependencies({\n targetCell: cell,\n cells: Object.fromEntries(cellsInScope.map((c) => [c.id, c])),\n getSqlText: (c) => (isSqlCell(c) ? c.data.sql : undefined),\n getInputVarName: (c) =>\n isInputCell(c) ? c.data.input.varName : undefined,\n getSqlResultName: (id) => {\n const s = getState().cells.status[id];\n if (s?.type !== 'sql') return undefined;\n const sqlStatus = s as SqlCellStatus;\n const fromStatus = getUnqualifiedSqlIdentifier(sqlStatus.resultName);\n if (fromStatus) return fromStatus;\n\n const currentCell = getState().cells.config.data[id];\n if (currentCell?.type !== 'sql') return undefined;\n return getEffectiveResultName(\n currentCell.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n },\n });\n\n // 3. Update status to success\n set((s) =>\n produce(s, (draft) => {\n draft.cells.status[cellId] = {\n type: 'sql',\n status: 'success',\n resultName: tableName,\n resultView: tableName,\n resultRelationType: relationType,\n referencedTables: referenced,\n lastRunTime: Date.now(),\n };\n }),\n );\n\n // 4. Fetch count + first page and store result\n if (setCellResult) {\n if (signal?.aborted) throw new Error('Query cancelled');\n\n const countResult = await connector.query(\n `SELECT COUNT(*)::int AS count FROM ${tableName}`,\n {signal},\n );\n const totalRows = countResult.toArray()[0]?.count ?? 0;\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n const pageResult = await connector.query(\n `SELECT * FROM ${tableName} LIMIT ${DEFAULT_PAGE_SIZE}`,\n {signal},\n );\n\n setCellResult(cellId, {arrowTable: pageResult, totalRows});\n }\n\n // 5. Cascade if needed\n if (cascade) {\n const ownerSheetId = findSheetIdForCell(getState(), cellId);\n if (ownerSheetId) {\n await state.cells.runDownstreamCascade(ownerSheetId, cellId);\n }\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n set((s) =>\n produce(s, (draft) => {\n const status = draft.cells.status[cellId];\n if (status?.type === 'sql') {\n status.status = signal?.aborted ? 'cancel' : 'error';\n status.lastError = message;\n }\n }),\n );\n } finally {\n set((s) =>\n produce(s, (draft) => {\n delete draft.cells.activeAbortControllers[cellId];\n }),\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import {escapeId, makeQualifiedTableName} from '@sqlrooms/duckdb';\nimport {convertToValidColumnOrTableName} from '@sqlrooms/utils';\nimport {produce} from 'immer';\nimport {\n findArtifactIdForCell,\n getUnqualifiedSqlIdentifier,\n resolveArtifactSchemaName,\n} from './helpers';\nimport {\n findSqlDependencies,\n qualifyArtifactLocalResultNames,\n renderSqlWithInputs,\n} from './sqlHelpers';\nimport {\n chooseAdaptiveRelationType,\n createOrReplaceResultRelation,\n type ResultRelationType,\n} from './resultRelationPolicy';\nimport {\n isInputCell,\n isSqlCell,\n type CellResultData,\n type CellsRootState,\n type SqlCellData,\n type SqlCellStatus,\n} from './types';\nimport {getEffectiveResultName, isDefined} from './utils';\n\nconst DEFAULT_PAGE_SIZE = 10;\n\nexport type ExecuteSqlCellOptions = {\n schemaName: string;\n cascade?: boolean;\n signal?: AbortSignal;\n setCellResult?: (id: string, data: CellResultData) => void;\n};\n\nexport async function executeSqlCell(\n cellId: string,\n getState: () => CellsRootState,\n set: (updater: (state: CellsRootState) => CellsRootState) => void,\n options: ExecuteSqlCellOptions,\n) {\n // Intentionally snapshot state/cell at trigger time so this run is stable.\n // Later store mutations do not alter this execution; re-read with getState()\n // explicitly if you need live data after awaits.\n const state = getState();\n const cell = state.cells.config.data[cellId];\n if (!cell || cell.type !== 'sql') return;\n const previousStatus =\n state.cells.status[cellId]?.type === 'sql'\n ? (state.cells.status[cellId] as SqlCellStatus)\n : undefined;\n\n const {schemaName, cascade = true, signal, setCellResult} = options;\n const sqlRaw = cell.data.sql || '';\n const artifactId = findArtifactIdForCell(state, cellId);\n const artifact = artifactId\n ? state.cells.config.artifacts[artifactId]\n : undefined;\n const finalSchemaName = artifact\n ? resolveArtifactSchemaName(artifact)\n : schemaName;\n const finalDatabaseName =\n state.db.config.coreMaterialization.strategy === 'attached_ephemeral'\n ? state.db.config.coreMaterialization.attachedDatabaseName\n : undefined;\n const artifactCellIds = artifact?.cellIds ?? [];\n\n // 1. Gather inputs for SQL rendering\n const cellsInScope = (\n artifactCellIds.length\n ? artifactCellIds\n : Object.keys(state.cells.config.data)\n )\n .map((id) => state.cells.config.data[id])\n .filter(isDefined);\n const inputs = cellsInScope\n .filter((c) => isInputCell(c))\n .map((c) => ({\n varName: c.data.input.varName,\n value: c.data.input.value,\n }));\n\n const renderedSql = renderSqlWithInputs(sqlRaw, inputs);\n const sql = qualifyArtifactLocalResultNames({\n sql: renderedSql,\n artifactSchema: finalSchemaName,\n artifactDatabase: finalDatabaseName,\n artifactCellIds,\n cells: state.cells.config.data,\n getSqlResultName: (id) => {\n const target = state.cells.config.data[id];\n if (!target || target.type !== 'sql') return undefined;\n return getEffectiveResultName(\n target.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n },\n });\n\n // 2. Update status to running\n set((s) =>\n produce(s, (draft) => {\n const previousStatus = draft.cells.status[cellId] as\n | SqlCellStatus\n | undefined;\n draft.cells.status[cellId] = {\n type: 'sql',\n status: 'running',\n // Keep previous result metadata so the table remains mounted while\n // a fresh query is running.\n resultName: previousStatus?.resultName,\n resultView: previousStatus?.resultView,\n resultRelationType: previousStatus?.resultRelationType,\n lastRunTime: previousStatus?.lastRunTime,\n referencedTables: previousStatus?.referencedTables || [],\n };\n }),\n );\n\n try {\n const db = state.db;\n const dbConnectors = state.db.connectors;\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n const effectiveResultName = getEffectiveResultName(\n cell.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n const selectedConnectorId = (cell.data as SqlCellData).connectorId;\n let tableName = '';\n let relationType: ResultRelationType = 'view';\n const connector = await db.getConnector();\n if (dbConnectors?.runQuery) {\n const routed = await dbConnectors.runQuery({\n connectionId: selectedConnectorId,\n sql,\n queryType: 'arrow',\n materialize: true,\n materializedName: effectiveResultName,\n materializedSchema: finalSchemaName,\n materializedDatabase: finalDatabaseName,\n signal,\n });\n if (!routed.relationName) {\n throw new Error('Query did not return a materialized relation');\n }\n tableName = routed.relationName;\n relationType = 'table';\n } else {\n const parsed = await db.sqlSelectToJson(sql);\n if (parsed.error) {\n throw new Error(parsed.error_message || 'Not a valid SELECT statement');\n }\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n await connector.query(\n `CREATE SCHEMA IF NOT EXISTS ${escapeId(finalSchemaName)}`,\n {signal},\n );\n\n tableName = makeQualifiedTableName({\n table: effectiveResultName,\n schema: finalSchemaName,\n database: db.currentDatabase,\n }).toString();\n // Adaptive policy:\n // - first run: choose table when there are downstream dependents,\n // otherwise keep a lightweight view.\n // - subsequent runs: preserve the previously selected relation type.\n const hasDownstream =\n Boolean(artifactId) &&\n getState().cells.getDownstream(artifactId as string, cellId).length > 0;\n relationType = chooseAdaptiveRelationType({\n previousRelationType: previousStatus?.resultRelationType,\n hasDownstream,\n });\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n await createOrReplaceResultRelation({\n connector,\n relationName: tableName,\n relationType,\n sql,\n signal,\n });\n }\n\n // Find dependencies for referenced tables\n const referenced = findSqlDependencies({\n targetCell: cell,\n cells: Object.fromEntries(cellsInScope.map((c) => [c.id, c])),\n getSqlText: (c) => (isSqlCell(c) ? c.data.sql : undefined),\n getInputVarName: (c) =>\n isInputCell(c) ? c.data.input.varName : undefined,\n getSqlResultName: (id) => {\n const s = getState().cells.status[id];\n if (s?.type !== 'sql') return undefined;\n const sqlStatus = s as SqlCellStatus;\n const fromStatus = getUnqualifiedSqlIdentifier(sqlStatus.resultName);\n if (fromStatus) return fromStatus;\n\n const currentCell = getState().cells.config.data[id];\n if (currentCell?.type !== 'sql') return undefined;\n return getEffectiveResultName(\n currentCell.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n },\n });\n\n // 3. Update status to success\n set((s) =>\n produce(s, (draft) => {\n draft.cells.status[cellId] = {\n type: 'sql',\n status: 'success',\n resultName: tableName,\n resultView: tableName,\n resultRelationType: relationType,\n referencedTables: referenced,\n lastRunTime: Date.now(),\n };\n }),\n );\n\n // 4. Fetch count + first page and store result\n if (setCellResult) {\n if (signal?.aborted) throw new Error('Query cancelled');\n\n const countResult = await connector.query(\n `SELECT COUNT(*)::int AS count FROM ${tableName}`,\n {signal},\n );\n const totalRows = countResult.toArray()[0]?.count ?? 0;\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n const pageResult = await connector.query(\n `SELECT * FROM ${tableName} LIMIT ${DEFAULT_PAGE_SIZE}`,\n {signal},\n );\n\n setCellResult(cellId, {arrowTable: pageResult, totalRows});\n }\n\n // 5. Cascade if needed\n if (cascade) {\n const ownerArtifactId = findArtifactIdForCell(getState(), cellId);\n if (ownerArtifactId) {\n await state.cells.runDownstreamCascade(ownerArtifactId, cellId);\n }\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n set((s) =>\n produce(s, (draft) => {\n const status = draft.cells.status[cellId];\n if (status?.type === 'sql') {\n status.status = signal?.aborted ? 'cancel' : 'error';\n status.lastError = message;\n }\n }),\n );\n } finally {\n set((s) =>\n produce(s, (draft) => {\n delete draft.cells.activeAbortControllers[cellId];\n }),\n );\n }\n}\n"]}
|
package/dist/helpers.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { QualifiedTableName } from '@sqlrooms/db';
|
|
2
|
-
import { Cell, CellDependencies, CellRegistry, CellsRootState, CellsSliceConfig,
|
|
2
|
+
import { Cell, CellDependencies, CellRegistry, CellsRootState, CellsSliceConfig, SqlCell, SqlSelectToJsonFn, CellArtifactRuntime } from './types';
|
|
3
3
|
/**
|
|
4
4
|
* Normalizes the result of `findDependencies` to a `CellDependencies` object.
|
|
5
5
|
* Accepts either the legacy `string[]` (cell IDs only) or the new `CellDependencies` shape.
|
|
@@ -8,30 +8,22 @@ export declare function normalizeCellDependencies(result: string[] | CellDepende
|
|
|
8
8
|
/**
|
|
9
9
|
* Helper to resolve dependencies using the registry's async AST-based resolver.
|
|
10
10
|
*/
|
|
11
|
-
export declare function resolveDependencies(cell: Cell, cells: Record<string, Cell>,
|
|
11
|
+
export declare function resolveDependencies(cell: Cell, cells: Record<string, Cell>, artifactId: string, registry: CellRegistry, sqlSelectToJson: SqlSelectToJsonFn): Promise<CellDependencies>;
|
|
12
12
|
/**
|
|
13
|
-
* Finds the
|
|
13
|
+
* Finds the artifact ID that contains the given cell ID.
|
|
14
14
|
*/
|
|
15
|
-
export declare function
|
|
16
|
-
/**
|
|
17
|
-
* Gets all sheets of a specific type.
|
|
18
|
-
*/
|
|
19
|
-
export declare function getSheetsByType(state: CellsRootState, type: SheetType): Record<string, Sheet>;
|
|
15
|
+
export declare function findArtifactIdForCell(state: Pick<CellsRootState, 'cells'>, cellId: string): string | undefined;
|
|
20
16
|
/**
|
|
21
17
|
* Required accessor for SQL AST parser used in dependency derivation.
|
|
22
18
|
*/
|
|
23
19
|
export declare function getRequiredSqlSelectToJson(state: CellsRootState): SqlSelectToJsonFn;
|
|
24
20
|
/**
|
|
25
|
-
* Normalizes
|
|
21
|
+
* Normalizes artifact runtime entries in a partial cells config.
|
|
26
22
|
*
|
|
27
23
|
* This enforces internal invariants before the config is applied:
|
|
28
|
-
* - `
|
|
29
|
-
* - `sheetOrder` only contains existing sheet ids and includes every sheet.
|
|
30
|
-
* - `currentSheetId` always points to an existing sheet.
|
|
31
|
-
*
|
|
32
|
-
* Non-structural fields are preserved by the caller when merging.
|
|
24
|
+
* - `artifacts` always has stable ids that match the record keys.
|
|
33
25
|
*/
|
|
34
|
-
export declare function normalizeCellsConfigStructure(config: Partial<CellsSliceConfig
|
|
26
|
+
export declare function normalizeCellsConfigStructure(config: Partial<CellsSliceConfig>): Pick<CellsSliceConfig, 'artifacts'>;
|
|
35
27
|
/**
|
|
36
28
|
* Returns the final identifier segment from a possibly-qualified SQL name.
|
|
37
29
|
*
|
|
@@ -45,9 +37,9 @@ export declare function normalizeCellsConfigStructure(config: Partial<CellsSlice
|
|
|
45
37
|
*/
|
|
46
38
|
export declare function getUnqualifiedSqlIdentifier(qualifiedName: string | undefined): string | undefined;
|
|
47
39
|
/**
|
|
48
|
-
* Resolves the schema name for
|
|
40
|
+
* Resolves the schema name for an artifact runtime, falling back to a stable id-based name.
|
|
49
41
|
*/
|
|
50
|
-
export declare function
|
|
42
|
+
export declare function resolveArtifactSchemaName(artifact: Pick<CellArtifactRuntime, 'id' | 'schemaName'>): string;
|
|
51
43
|
export declare function toDataSourceCell(cell: SqlCell | string): string;
|
|
52
44
|
export declare function toDataSourceTable(table: QualifiedTableName | string): string;
|
|
53
45
|
export declare function isDataSourceCell(value: string): boolean;
|
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,IAAI,EACJ,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,IAAI,EACJ,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,OAAO,EACP,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAGjB;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,GAClC,gBAAgB,CAKlB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAC3B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,YAAY,EACtB,eAAe,EAAE,iBAAiB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAU3B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,EACpC,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CASpB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,cAAc,GACpB,iBAAiB,CAQnB;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAChC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAcrC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,MAAM,GAAG,SAAS,CAuCpB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,YAAY,CAAC,UAGzD;AAKD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAI/D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,GAAG,MAAM,CAgB5E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKpE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKrE"}
|
package/dist/helpers.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getArtifactSchemaName } from './utils';
|
|
2
2
|
/**
|
|
3
3
|
* Normalizes the result of `findDependencies` to a `CellDependencies` object.
|
|
4
4
|
* Accepts either the legacy `string[]` (cell IDs only) or the new `CellDependencies` shape.
|
|
@@ -12,41 +12,29 @@ export function normalizeCellDependencies(result) {
|
|
|
12
12
|
/**
|
|
13
13
|
* Helper to resolve dependencies using the registry's async AST-based resolver.
|
|
14
14
|
*/
|
|
15
|
-
export async function resolveDependencies(cell, cells,
|
|
15
|
+
export async function resolveDependencies(cell, cells, artifactId, registry, sqlSelectToJson) {
|
|
16
16
|
const item = registry[cell.type];
|
|
17
17
|
if (!item)
|
|
18
18
|
return { cellIds: [] };
|
|
19
19
|
const raw = await item.findDependencies({
|
|
20
20
|
cell,
|
|
21
21
|
cells,
|
|
22
|
-
|
|
22
|
+
artifactId,
|
|
23
23
|
sqlSelectToJson,
|
|
24
24
|
});
|
|
25
25
|
return normalizeCellDependencies(raw);
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
|
-
* Finds the
|
|
28
|
+
* Finds the artifact ID that contains the given cell ID.
|
|
29
29
|
*/
|
|
30
|
-
export function
|
|
31
|
-
for (const [
|
|
32
|
-
if (
|
|
33
|
-
return
|
|
30
|
+
export function findArtifactIdForCell(state, cellId) {
|
|
31
|
+
for (const [artifactId, artifact] of Object.entries(state.cells.config.artifacts)) {
|
|
32
|
+
if (artifact.cellIds.includes(cellId)) {
|
|
33
|
+
return artifactId;
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
return undefined;
|
|
37
37
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Gets all sheets of a specific type.
|
|
40
|
-
*/
|
|
41
|
-
export function getSheetsByType(state, type) {
|
|
42
|
-
const sheets = {};
|
|
43
|
-
for (const [id, sheet] of Object.entries(state.cells.config.sheets)) {
|
|
44
|
-
if (sheet.type === type) {
|
|
45
|
-
sheets[id] = sheet;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return sheets;
|
|
49
|
-
}
|
|
50
38
|
/**
|
|
51
39
|
* Required accessor for SQL AST parser used in dependency derivation.
|
|
52
40
|
*/
|
|
@@ -58,29 +46,22 @@ export function getRequiredSqlSelectToJson(state) {
|
|
|
58
46
|
return parser;
|
|
59
47
|
}
|
|
60
48
|
/**
|
|
61
|
-
* Normalizes
|
|
49
|
+
* Normalizes artifact runtime entries in a partial cells config.
|
|
62
50
|
*
|
|
63
51
|
* This enforces internal invariants before the config is applied:
|
|
64
|
-
* - `
|
|
65
|
-
* - `sheetOrder` only contains existing sheet ids and includes every sheet.
|
|
66
|
-
* - `currentSheetId` always points to an existing sheet.
|
|
67
|
-
*
|
|
68
|
-
* Non-structural fields are preserved by the caller when merging.
|
|
52
|
+
* - `artifacts` always has stable ids that match the record keys.
|
|
69
53
|
*/
|
|
70
|
-
export function normalizeCellsConfigStructure(config
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
? config.currentSheetId
|
|
82
|
-
: sheetOrder[0]) ?? sheetIds[0];
|
|
83
|
-
return { sheets, sheetOrder, currentSheetId };
|
|
54
|
+
export function normalizeCellsConfigStructure(config) {
|
|
55
|
+
const artifacts = Object.fromEntries(Object.entries(config.artifacts ?? {}).map(([artifactId, artifact]) => [
|
|
56
|
+
artifactId,
|
|
57
|
+
{
|
|
58
|
+
...artifact,
|
|
59
|
+
id: artifactId,
|
|
60
|
+
cellIds: artifact.cellIds ?? [],
|
|
61
|
+
edges: artifact.edges ?? [],
|
|
62
|
+
},
|
|
63
|
+
]));
|
|
64
|
+
return { artifacts };
|
|
84
65
|
}
|
|
85
66
|
/**
|
|
86
67
|
* Returns the final identifier segment from a possibly-qualified SQL name.
|
|
@@ -132,10 +113,10 @@ export function getUnqualifiedSqlIdentifier(qualifiedName) {
|
|
|
132
113
|
return last;
|
|
133
114
|
}
|
|
134
115
|
/**
|
|
135
|
-
* Resolves the schema name for
|
|
116
|
+
* Resolves the schema name for an artifact runtime, falling back to a stable id-based name.
|
|
136
117
|
*/
|
|
137
|
-
export function
|
|
138
|
-
return
|
|
118
|
+
export function resolveArtifactSchemaName(artifact) {
|
|
119
|
+
return artifact.schemaName || getArtifactSchemaName(artifact.id);
|
|
139
120
|
}
|
|
140
121
|
const DATA_SOURCE_CELL_PREFIX = 'cell:';
|
|
141
122
|
const DATA_SOURCE_TABLE_PREFIX = 'table:';
|
package/dist/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {QualifiedTableName} from '@sqlrooms/db';\nimport {\n Cell,\n CellDependencies,\n CellRegistry,\n CellsRootState,\n CellsSliceConfig,\n Sheet,\n SheetType,\n SqlCell,\n SqlSelectToJsonFn,\n} from './types';\nimport {getSheetSchemaName} from './utils';\n\n/**\n * Normalizes the result of `findDependencies` to a `CellDependencies` object.\n * Accepts either the legacy `string[]` (cell IDs only) or the new `CellDependencies` shape.\n */\nexport function normalizeCellDependencies(\n result: string[] | CellDependencies,\n): CellDependencies {\n if (Array.isArray(result)) {\n return {cellIds: result};\n }\n return result;\n}\n\n/**\n * Helper to resolve dependencies using the registry's async AST-based resolver.\n */\nexport async function resolveDependencies(\n cell: Cell,\n cells: Record<string, Cell>,\n sheetId: string,\n registry: CellRegistry,\n sqlSelectToJson: SqlSelectToJsonFn,\n): Promise<CellDependencies> {\n const item = registry[cell.type];\n if (!item) return {cellIds: []};\n const raw = await item.findDependencies({\n cell,\n cells,\n sheetId,\n sqlSelectToJson,\n });\n return normalizeCellDependencies(raw);\n}\n\n/**\n * Finds the sheet ID that contains the given cell ID.\n */\nexport function findSheetIdForCell(\n state: CellsRootState,\n cellId: string,\n): string | undefined {\n for (const [id, sheet] of Object.entries(state.cells.config.sheets)) {\n if (sheet.cellIds.includes(cellId)) {\n return id;\n }\n }\n return undefined;\n}\n\n/**\n * Gets all sheets of a specific type.\n */\nexport function getSheetsByType(\n state: CellsRootState,\n type: SheetType,\n): Record<string, Sheet> {\n const sheets: Record<string, Sheet> = {};\n for (const [id, sheet] of Object.entries(state.cells.config.sheets)) {\n if (sheet.type === type) {\n sheets[id] = sheet;\n }\n }\n return sheets;\n}\n\n/**\n * Required accessor for SQL AST parser used in dependency derivation.\n */\nexport function getRequiredSqlSelectToJson(\n state: CellsRootState,\n): SqlSelectToJsonFn {\n const parser = state.db?.sqlSelectToJson;\n if (!parser) {\n throw new Error(\n 'cells dependency derivation requires db.sqlSelectToJson. Ensure the DuckDB slice is mounted and initialized before running cell dependency operations.',\n );\n }\n return parser;\n}\n\n/**\n * Normalizes structural sheet fields in a partial cells config.\n *\n * This enforces internal invariants before the config is applied:\n * - `sheets` always contains at least one entry (falls back to defaults).\n * - `sheetOrder` only contains existing sheet ids and includes every sheet.\n * - `currentSheetId` always points to an existing sheet.\n *\n * Non-structural fields are preserved by the caller when merging.\n */\nexport function normalizeCellsConfigStructure(\n config: Partial<CellsSliceConfig>,\n defaultConfig: CellsSliceConfig,\n): Pick<CellsSliceConfig, 'sheets' | 'sheetOrder' | 'currentSheetId'> {\n const sheets =\n config.sheets && Object.keys(config.sheets).length > 0\n ? config.sheets\n : defaultConfig.sheets;\n const sheetIds = Object.keys(sheets);\n const normalizedSheetOrder =\n config.sheetOrder?.filter((id) => id in sheets) ?? [];\n const missingSheetIds = sheetIds.filter(\n (id) => !normalizedSheetOrder.includes(id),\n );\n const sheetOrder =\n normalizedSheetOrder.length > 0\n ? [...normalizedSheetOrder, ...missingSheetIds]\n : sheetIds;\n const currentSheetId =\n (config.currentSheetId && config.currentSheetId in sheets\n ? config.currentSheetId\n : sheetOrder[0]) ?? sheetIds[0];\n\n return {sheets, sheetOrder, currentSheetId};\n}\n\n/**\n * Returns the final identifier segment from a possibly-qualified SQL name.\n *\n * The parser is quote-aware: dots inside double-quoted identifiers are treated\n * as part of the identifier rather than as qualification separators.\n *\n * Examples:\n * - `schema.table` -> `table`\n * - `db.schema.table` -> `table`\n * - `schema.\"my.funny.table\"` -> `my.funny.table`\n */\nexport function getUnqualifiedSqlIdentifier(\n qualifiedName: string | undefined,\n): string | undefined {\n if (!qualifiedName) return undefined;\n const input = qualifiedName.trim();\n if (!input) return undefined;\n\n const parts: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let i = 0; i < input.length; i += 1) {\n const ch = input[i];\n if (ch === '\"') {\n // In SQL identifiers, escaped quotes inside quoted identifiers are doubled.\n if (inQuotes && input[i + 1] === '\"') {\n current += '\"';\n i += 1;\n continue;\n }\n inQuotes = !inQuotes;\n current += ch;\n continue;\n }\n\n if (ch === '.' && !inQuotes) {\n parts.push(current);\n current = '';\n continue;\n }\n\n current += ch;\n }\n parts.push(current);\n\n const last = parts[parts.length - 1]?.trim();\n if (!last) return undefined;\n if (last.startsWith('\"') && last.endsWith('\"') && last.length >= 2) {\n return last.slice(1, -1).replaceAll('\"\"', '\"');\n }\n return last;\n}\n\n/**\n * Resolves the schema name for a sheet, falling back to a stable id-based name.\n */\nexport function resolveSheetSchemaName(\n sheet: Pick<Sheet, 'id' | 'schemaName'>,\n) {\n return sheet.schemaName || getSheetSchemaName(sheet.id);\n}\n\nconst DATA_SOURCE_CELL_PREFIX = 'cell:';\nconst DATA_SOURCE_TABLE_PREFIX = 'table:';\n\nexport function toDataSourceCell(cell: SqlCell | string): string {\n const id = typeof cell === 'string' ? cell : cell.id;\n\n return `${DATA_SOURCE_CELL_PREFIX}${id}`;\n}\n\nexport function toDataSourceTable(table: QualifiedTableName | string): string {\n if (typeof table === 'string') {\n return `${DATA_SOURCE_TABLE_PREFIX}${table}`;\n }\n\n // Escape each identifier segment: double any internal quotes, then wrap in quotes\n const escapeIdentifier = (id: string) => `\"${id.replace(/\"/g, '\"\"')}\"`;\n\n const qualifiedName = [\n table.schema ? escapeIdentifier(table.schema) : null,\n escapeIdentifier(table.table),\n ]\n .filter(Boolean)\n .join('.');\n\n return `${DATA_SOURCE_TABLE_PREFIX}${qualifiedName}`;\n}\n\nexport function isDataSourceCell(value: string): boolean {\n return value.startsWith(DATA_SOURCE_CELL_PREFIX);\n}\n\nexport function isDataSourceTable(value: string): boolean {\n return value.startsWith(DATA_SOURCE_TABLE_PREFIX);\n}\n\nexport function fromDataSourceCell(value: string): string | undefined {\n if (isDataSourceCell(value)) {\n return value.slice(DATA_SOURCE_CELL_PREFIX.length);\n }\n return undefined;\n}\n\nexport function fromDataSourceTable(value: string): string | undefined {\n if (isDataSourceTable(value)) {\n return value.slice(DATA_SOURCE_TABLE_PREFIX.length);\n }\n return undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {QualifiedTableName} from '@sqlrooms/db';\nimport {\n Cell,\n CellDependencies,\n CellRegistry,\n CellsRootState,\n CellsSliceConfig,\n SqlCell,\n SqlSelectToJsonFn,\n CellArtifactRuntime,\n} from './types';\nimport {getArtifactSchemaName} from './utils';\n\n/**\n * Normalizes the result of `findDependencies` to a `CellDependencies` object.\n * Accepts either the legacy `string[]` (cell IDs only) or the new `CellDependencies` shape.\n */\nexport function normalizeCellDependencies(\n result: string[] | CellDependencies,\n): CellDependencies {\n if (Array.isArray(result)) {\n return {cellIds: result};\n }\n return result;\n}\n\n/**\n * Helper to resolve dependencies using the registry's async AST-based resolver.\n */\nexport async function resolveDependencies(\n cell: Cell,\n cells: Record<string, Cell>,\n artifactId: string,\n registry: CellRegistry,\n sqlSelectToJson: SqlSelectToJsonFn,\n): Promise<CellDependencies> {\n const item = registry[cell.type];\n if (!item) return {cellIds: []};\n const raw = await item.findDependencies({\n cell,\n cells,\n artifactId,\n sqlSelectToJson,\n });\n return normalizeCellDependencies(raw);\n}\n\n/**\n * Finds the artifact ID that contains the given cell ID.\n */\nexport function findArtifactIdForCell(\n state: Pick<CellsRootState, 'cells'>,\n cellId: string,\n): string | undefined {\n for (const [artifactId, artifact] of Object.entries(\n state.cells.config.artifacts,\n )) {\n if (artifact.cellIds.includes(cellId)) {\n return artifactId;\n }\n }\n return undefined;\n}\n\n/**\n * Required accessor for SQL AST parser used in dependency derivation.\n */\nexport function getRequiredSqlSelectToJson(\n state: CellsRootState,\n): SqlSelectToJsonFn {\n const parser = state.db?.sqlSelectToJson;\n if (!parser) {\n throw new Error(\n 'cells dependency derivation requires db.sqlSelectToJson. Ensure the DuckDB slice is mounted and initialized before running cell dependency operations.',\n );\n }\n return parser;\n}\n\n/**\n * Normalizes artifact runtime entries in a partial cells config.\n *\n * This enforces internal invariants before the config is applied:\n * - `artifacts` always has stable ids that match the record keys.\n */\nexport function normalizeCellsConfigStructure(\n config: Partial<CellsSliceConfig>,\n): Pick<CellsSliceConfig, 'artifacts'> {\n const artifacts = Object.fromEntries(\n Object.entries(config.artifacts ?? {}).map(([artifactId, artifact]) => [\n artifactId,\n {\n ...artifact,\n id: artifactId,\n cellIds: artifact.cellIds ?? [],\n edges: artifact.edges ?? [],\n },\n ]),\n ) as Record<string, CellArtifactRuntime>;\n\n return {artifacts};\n}\n\n/**\n * Returns the final identifier segment from a possibly-qualified SQL name.\n *\n * The parser is quote-aware: dots inside double-quoted identifiers are treated\n * as part of the identifier rather than as qualification separators.\n *\n * Examples:\n * - `schema.table` -> `table`\n * - `db.schema.table` -> `table`\n * - `schema.\"my.funny.table\"` -> `my.funny.table`\n */\nexport function getUnqualifiedSqlIdentifier(\n qualifiedName: string | undefined,\n): string | undefined {\n if (!qualifiedName) return undefined;\n const input = qualifiedName.trim();\n if (!input) return undefined;\n\n const parts: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let i = 0; i < input.length; i += 1) {\n const ch = input[i];\n if (ch === '\"') {\n // In SQL identifiers, escaped quotes inside quoted identifiers are doubled.\n if (inQuotes && input[i + 1] === '\"') {\n current += '\"';\n i += 1;\n continue;\n }\n inQuotes = !inQuotes;\n current += ch;\n continue;\n }\n\n if (ch === '.' && !inQuotes) {\n parts.push(current);\n current = '';\n continue;\n }\n\n current += ch;\n }\n parts.push(current);\n\n const last = parts[parts.length - 1]?.trim();\n if (!last) return undefined;\n if (last.startsWith('\"') && last.endsWith('\"') && last.length >= 2) {\n return last.slice(1, -1).replaceAll('\"\"', '\"');\n }\n return last;\n}\n\n/**\n * Resolves the schema name for an artifact runtime, falling back to a stable id-based name.\n */\nexport function resolveArtifactSchemaName(\n artifact: Pick<CellArtifactRuntime, 'id' | 'schemaName'>,\n) {\n return artifact.schemaName || getArtifactSchemaName(artifact.id);\n}\n\nconst DATA_SOURCE_CELL_PREFIX = 'cell:';\nconst DATA_SOURCE_TABLE_PREFIX = 'table:';\n\nexport function toDataSourceCell(cell: SqlCell | string): string {\n const id = typeof cell === 'string' ? cell : cell.id;\n\n return `${DATA_SOURCE_CELL_PREFIX}${id}`;\n}\n\nexport function toDataSourceTable(table: QualifiedTableName | string): string {\n if (typeof table === 'string') {\n return `${DATA_SOURCE_TABLE_PREFIX}${table}`;\n }\n\n // Escape each identifier segment: double any internal quotes, then wrap in quotes\n const escapeIdentifier = (id: string) => `\"${id.replace(/\"/g, '\"\"')}\"`;\n\n const qualifiedName = [\n table.schema ? escapeIdentifier(table.schema) : null,\n escapeIdentifier(table.table),\n ]\n .filter(Boolean)\n .join('.');\n\n return `${DATA_SOURCE_TABLE_PREFIX}${qualifiedName}`;\n}\n\nexport function isDataSourceCell(value: string): boolean {\n return value.startsWith(DATA_SOURCE_CELL_PREFIX);\n}\n\nexport function isDataSourceTable(value: string): boolean {\n return value.startsWith(DATA_SOURCE_TABLE_PREFIX);\n}\n\nexport function fromDataSourceCell(value: string): string | undefined {\n if (isDataSourceCell(value)) {\n return value.slice(DATA_SOURCE_CELL_PREFIX.length);\n }\n return undefined;\n}\n\nexport function fromDataSourceTable(value: string): string | undefined {\n if (isDataSourceTable(value)) {\n return value.slice(DATA_SOURCE_TABLE_PREFIX.length);\n }\n return undefined;\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,7 +8,6 @@ export { createCellsSlice } from './cellsSlice';
|
|
|
8
8
|
export type { CellsRootState } from './types';
|
|
9
9
|
export { initializeInput } from './components/Input/helpers';
|
|
10
10
|
export { InputCellContent } from './components/InputCellContent';
|
|
11
|
-
export { SheetsTabBar } from './components/SheetsTabBar';
|
|
12
11
|
export { SqlCellContentComponent as SqlCellContent };
|
|
13
12
|
export { SqlCellRunButtonComponent as SqlCellRunButton };
|
|
14
13
|
export { TextCellContent } from './components/TextCellContent';
|
|
@@ -16,7 +15,7 @@ export { VegaCellContent } from './components/VegaCellContent';
|
|
|
16
15
|
export { CellSourceSelector } from './components/CellSourceSelector';
|
|
17
16
|
export { createDefaultCellRegistry } from './defaultCellRegistry';
|
|
18
17
|
export { getRenderableDependencyEdges } from './dagUtils';
|
|
19
|
-
export {
|
|
18
|
+
export { findArtifactIdForCell, normalizeCellDependencies, resolveArtifactSchemaName, toDataSourceCell, toDataSourceTable, isDataSourceCell, isDataSourceTable, fromDataSourceCell, fromDataSourceTable, } from './helpers';
|
|
20
19
|
export { useCellsStore } from './hooks';
|
|
21
20
|
export { findSqlDependencies, findSqlDependenciesFromAst, renderSqlWithInputs, runSqlWithCallbacks, } from './sqlHelpers';
|
|
22
21
|
export { buildCrossFilterPredicate, BRUSH_PARAM_NAME, } from './vegaSelectionUtils';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,cAAc,IAAI,uBAAuB,EAAC,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAC,gBAAgB,IAAI,yBAAyB,EAAC,MAAM,+BAA+B,CAAC;AAE5F,OAAO,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAC,cAAc,EAAC,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAC,gBAAgB,EAAC,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,cAAc,IAAI,uBAAuB,EAAC,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAC,gBAAgB,IAAI,yBAAyB,EAAC,MAAM,+BAA+B,CAAC;AAE5F,OAAO,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAC,cAAc,EAAC,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAC,gBAAgB,EAAC,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAC,uBAAuB,IAAI,cAAc,EAAC,CAAC;AACnD,OAAO,EAAC,yBAAyB,IAAI,gBAAgB,EAAC,CAAC;AACvD,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAC,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAC,yBAAyB,EAAC,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAC,4BAA4B,EAAC,MAAM,YAAY,CAAC;AACxD,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;AACtC,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,cAAc,SAAS,CAAC;AAExB,eAAO,MAAM,OAAO;;;CAGnB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,6 @@ import { SqlCellRunButton as SqlCellRunButtonComponent } from './components/SqlC
|
|
|
7
7
|
export { createCellsSlice } from './cellsSlice';
|
|
8
8
|
export { initializeInput } from './components/Input/helpers';
|
|
9
9
|
export { InputCellContent } from './components/InputCellContent';
|
|
10
|
-
export { SheetsTabBar } from './components/SheetsTabBar';
|
|
11
10
|
export { SqlCellContentComponent as SqlCellContent };
|
|
12
11
|
export { SqlCellRunButtonComponent as SqlCellRunButton };
|
|
13
12
|
export { TextCellContent } from './components/TextCellContent';
|
|
@@ -15,7 +14,7 @@ export { VegaCellContent } from './components/VegaCellContent';
|
|
|
15
14
|
export { CellSourceSelector } from './components/CellSourceSelector';
|
|
16
15
|
export { createDefaultCellRegistry } from './defaultCellRegistry';
|
|
17
16
|
export { getRenderableDependencyEdges } from './dagUtils';
|
|
18
|
-
export {
|
|
17
|
+
export { findArtifactIdForCell, normalizeCellDependencies, resolveArtifactSchemaName, toDataSourceCell, toDataSourceTable, isDataSourceCell, isDataSourceTable, fromDataSourceCell, fromDataSourceTable, } from './helpers';
|
|
19
18
|
export { useCellsStore } from './hooks';
|
|
20
19
|
export { findSqlDependencies, findSqlDependenciesFromAst, renderSqlWithInputs, runSqlWithCallbacks, } from './sqlHelpers';
|
|
21
20
|
export { buildCrossFilterPredicate, BRUSH_PARAM_NAME, } from './vegaSelectionUtils';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,cAAc,IAAI,uBAAuB,EAAC,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAC,gBAAgB,IAAI,yBAAyB,EAAC,MAAM,+BAA+B,CAAC;AAE5F,OAAO,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAC,gBAAgB,EAAC,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,cAAc,IAAI,uBAAuB,EAAC,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAC,gBAAgB,IAAI,yBAAyB,EAAC,MAAM,+BAA+B,CAAC;AAE5F,OAAO,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAC,gBAAgB,EAAC,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAC,uBAAuB,IAAI,cAAc,EAAC,CAAC;AACnD,OAAO,EAAC,yBAAyB,IAAI,gBAAgB,EAAC,CAAC;AACvD,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAC,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAC,yBAAyB,EAAC,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAC,4BAA4B,EAAC,MAAM,YAAY,CAAC;AACxD,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;AACtC,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,cAAc,SAAS,CAAC;AAExB,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,SAAS,EAAE,yBAAyB;IACpC,OAAO,EAAE,uBAAuB;CACjC,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nimport {SqlCellContent as SqlCellContentComponent} from './components/SqlCellContent';\nimport {SqlCellRunButton as SqlCellRunButtonComponent} from './components/SqlCellRunButton';\n\nexport {createCellsSlice} from './cellsSlice';\nexport type {CellsRootState} from './types';\nexport {initializeInput} from './components/Input/helpers';\nexport {InputCellContent} from './components/InputCellContent';\nexport {SqlCellContentComponent as SqlCellContent};\nexport {SqlCellRunButtonComponent as SqlCellRunButton};\nexport {TextCellContent} from './components/TextCellContent';\nexport {VegaCellContent} from './components/VegaCellContent';\nexport {CellSourceSelector} from './components/CellSourceSelector';\nexport {createDefaultCellRegistry} from './defaultCellRegistry';\nexport {getRenderableDependencyEdges} from './dagUtils';\nexport {\n findArtifactIdForCell,\n normalizeCellDependencies,\n resolveArtifactSchemaName,\n toDataSourceCell,\n toDataSourceTable,\n isDataSourceCell,\n isDataSourceTable,\n fromDataSourceCell,\n fromDataSourceTable,\n} from './helpers';\nexport {useCellsStore} from './hooks';\nexport {\n findSqlDependencies,\n findSqlDependenciesFromAst,\n renderSqlWithInputs,\n runSqlWithCallbacks,\n} from './sqlHelpers';\nexport {\n buildCrossFilterPredicate,\n BRUSH_PARAM_NAME,\n} from './vegaSelectionUtils';\nexport * from './types';\n\nexport const SqlCell = {\n RunButton: SqlCellRunButtonComponent,\n Content: SqlCellContentComponent,\n};\n"]}
|
package/dist/sqlHelpers.d.ts
CHANGED
|
@@ -26,15 +26,15 @@ export declare function findSqlDependenciesFromAst(opts: {
|
|
|
26
26
|
}>;
|
|
27
27
|
}): Promise<CellDependencies>;
|
|
28
28
|
/**
|
|
29
|
-
* Rewrites unqualified references to known
|
|
29
|
+
* Rewrites unqualified references to known artifact-local result names as
|
|
30
30
|
* schema-qualified references. This keeps SQL ergonomic without mutable
|
|
31
31
|
* connector-level current schema state.
|
|
32
32
|
*/
|
|
33
|
-
export declare function
|
|
33
|
+
export declare function qualifyArtifactLocalResultNames(opts: {
|
|
34
34
|
sql: string;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
artifactSchema: string;
|
|
36
|
+
artifactDatabase?: string;
|
|
37
|
+
artifactCellIds: string[];
|
|
38
38
|
cells: Record<string, Cell>;
|
|
39
39
|
getSqlResultName: (cellId: string) => string | undefined;
|
|
40
40
|
}): string;
|
package/dist/sqlHelpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlHelpers.d.ts","sourceRoot":"","sources":["../src/sqlHelpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,IAAI,EACJ,gBAAgB,EAChB,IAAI,EAEJ,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,YAAY,EACb,MAAM,SAAS,CAAC;AAIjB,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAC7B,IAAI,EAAE,CA2BR;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,EAAE,GACvB,MAAM,CAcR;AAED,wBAAgB,mBAAmB,CACjC,KAAK,SAAS;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,EACxC,IAAI,EAAE;IACN,UAAU,EAAE,KAAK,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7B,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,GAAG,SAAS,CAAC;IAChD,eAAe,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,GAAG,SAAS,CAAC;IACrD,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACzD,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC,GAAG,MAAM,EAAE,CAyCX;AAeD,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,EAChC,SAAS,GAAE,eAAoB,iBAYhC;AAsCD;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QACxC,KAAK,EAAE,OAAO,CAAC;QACf,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;KACxB,CAAC,CAAC;CACJ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwC5B;AAED;;;;GAIG;AACH,wBAAgB,
|
|
1
|
+
{"version":3,"file":"sqlHelpers.d.ts","sourceRoot":"","sources":["../src/sqlHelpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,IAAI,EACJ,gBAAgB,EAChB,IAAI,EAEJ,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,YAAY,EACb,MAAM,SAAS,CAAC;AAIjB,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAC7B,IAAI,EAAE,CA2BR;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,EAAE,GACvB,MAAM,CAcR;AAED,wBAAgB,mBAAmB,CACjC,KAAK,SAAS;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,EACxC,IAAI,EAAE;IACN,UAAU,EAAE,KAAK,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7B,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,GAAG,SAAS,CAAC;IAChD,eAAe,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,GAAG,SAAS,CAAC;IACrD,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACzD,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC,GAAG,MAAM,EAAE,CAyCX;AAeD,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,EAChC,SAAS,GAAE,eAAoB,iBAYhC;AAsCD;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QACxC,KAAK,EAAE,OAAO,CAAC;QACf,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;KACxB,CAAC,CAAC;CACJ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwC5B;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC1D,GAAG,MAAM,CAqCT"}
|
package/dist/sqlHelpers.js
CHANGED
|
@@ -164,14 +164,14 @@ export async function findSqlDependenciesFromAst(opts) {
|
|
|
164
164
|
}
|
|
165
165
|
}
|
|
166
166
|
/**
|
|
167
|
-
* Rewrites unqualified references to known
|
|
167
|
+
* Rewrites unqualified references to known artifact-local result names as
|
|
168
168
|
* schema-qualified references. This keeps SQL ergonomic without mutable
|
|
169
169
|
* connector-level current schema state.
|
|
170
170
|
*/
|
|
171
|
-
export function
|
|
172
|
-
const { sql,
|
|
171
|
+
export function qualifyArtifactLocalResultNames(opts) {
|
|
172
|
+
const { sql, artifactSchema, artifactDatabase, artifactCellIds, cells, getSqlResultName, } = opts;
|
|
173
173
|
let rewritten = sql;
|
|
174
|
-
const names = Array.from(new Set(
|
|
174
|
+
const names = Array.from(new Set(artifactCellIds
|
|
175
175
|
.map((cellId) => {
|
|
176
176
|
const cell = cells[cellId];
|
|
177
177
|
if (!cell || cell.type !== 'sql')
|
|
@@ -183,9 +183,9 @@ export function qualifySheetLocalResultNames(opts) {
|
|
|
183
183
|
})
|
|
184
184
|
.filter((v) => Boolean(v)))).sort((a, b) => b.length - a.length);
|
|
185
185
|
for (const name of names) {
|
|
186
|
-
const qualified =
|
|
187
|
-
? `${
|
|
188
|
-
: `${
|
|
186
|
+
const qualified = artifactDatabase
|
|
187
|
+
? `${artifactDatabase}.${artifactSchema}.${name}`
|
|
188
|
+
: `${artifactSchema}.${name}`;
|
|
189
189
|
const pattern = new RegExp(`(?<![a-zA-Z0-9_.])${escapeRegExp(name)}(?![a-zA-Z0-9_])`, 'g');
|
|
190
190
|
rewritten = rewritten.replace(pattern, qualified);
|
|
191
191
|
}
|
package/dist/sqlHelpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlHelpers.js","sourceRoot":"","sources":["../src/sqlHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {convertToValidColumnOrTableName} from '@sqlrooms/utils';\nimport type {\n Cell,\n CellDependencies,\n Edge,\n SqlCellData,\n SqlDependencyOptions,\n SqlRenderInput,\n SqlRunCallbacks,\n SqlRunResult,\n} from './types';\nimport {isInputCell, isSqlCell} from './types';\nimport {getEffectiveResultName} from './utils';\n\nexport function deriveEdgesFromSql(\n cellId: string,\n sql: string,\n allCells: Record<string, Cell>,\n): Edge[] {\n const targetCell = allCells[cellId];\n if (!targetCell) return [];\n\n const deps = findSqlDependencies<Cell>({\n targetCell,\n cells: allCells,\n getSqlText: () => sql,\n getInputVarName: (cell) =>\n isInputCell(cell) ? cell.data.input.varName : undefined,\n getSqlResultName: (cid) => {\n const cell = allCells[cid];\n if (cell && isSqlCell(cell)) {\n return getEffectiveResultName(\n cell.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n }\n return undefined;\n },\n });\n\n return deps.map((sourceId) => ({\n id: `${sourceId}-${cellId}`,\n source: sourceId,\n target: cellId,\n }));\n}\n\nexport function renderSqlWithInputs(\n rawSql: string,\n inputs: SqlRenderInput[],\n): string {\n const varMap: Record<string, string | number> = {};\n for (const {varName, value} of inputs) {\n varMap[varName] = value;\n }\n return (rawSql || '').replace(\n /\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\}\\}/g,\n (_m: string, v: string) => {\n const val = varMap[v];\n return typeof val === 'number'\n ? String(val)\n : `'${String(val ?? '')?.replace(/'/g, \"''\")}'`;\n },\n );\n}\n\nexport function findSqlDependencies<\n TCell extends {id: string; type: string},\n>(opts: {\n targetCell: TCell;\n cells: Record<string, TCell>;\n getSqlText: (cell: TCell) => string | undefined;\n getInputVarName: (cell: TCell) => string | undefined;\n getSqlResultName: (cellId: string) => string | undefined;\n options?: SqlDependencyOptions;\n}): string[] {\n const {\n targetCell,\n cells,\n getSqlText,\n getInputVarName,\n getSqlResultName,\n options,\n } = opts;\n const sql = getSqlText(targetCell) || '';\n const sqlLower = sql.toLowerCase();\n const deps: string[] = [];\n const inputTypes = options?.inputTypes ?? ['input'];\n const sqlTypes = options?.sqlTypes ?? ['sql'];\n\n for (const otherId in cells) {\n if (otherId === targetCell.id) continue;\n const other = cells[otherId];\n if (!other) continue;\n if (inputTypes.includes(other.type)) {\n const vn = getInputVarName(other);\n if (!vn) continue;\n if (sql.includes(`{{${vn}}}`) || sql.includes(`:${vn}`)) {\n deps.push(other.id);\n }\n } else if (sqlTypes.includes(other.type)) {\n const resultName = getSqlResultName(other.id);\n const title =\n typeof (other as {data?: {title?: unknown}}).data?.title === 'string'\n ? ((other as {data?: {title?: string}}).data?.title as string)\n : undefined;\n // Match on title (case-insensitive) with identifier boundaries\n const titleMatch =\n title && containsIdentifier(sqlLower, title.toLowerCase());\n // Match on effective result name (case-insensitive)\n const resultMatch =\n resultName && containsIdentifier(sqlLower, resultName.toLowerCase());\n if (titleMatch || resultMatch) deps.push(other.id);\n }\n }\n return Array.from(new Set(deps));\n}\n\nfunction escapeRegExp(input: string): string {\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction containsIdentifier(sqlLower: string, candidateLower: string): boolean {\n if (!candidateLower.trim()) return false;\n const pattern = new RegExp(\n `(?<![a-zA-Z0-9_.])${escapeRegExp(candidateLower)}(?![a-zA-Z0-9_])`,\n 'i',\n );\n return pattern.test(sqlLower);\n}\n\nexport async function runSqlWithCallbacks(\n run: () => Promise<SqlRunResult>,\n callbacks: SqlRunCallbacks = {},\n) {\n callbacks.onStart?.();\n try {\n const res = await run();\n callbacks.onSuccess?.(res);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n callbacks.onError?.(message);\n } finally {\n callbacks.onFinally?.();\n }\n}\n\n/**\n * Recursively extract table names from a parsed SQL AST.\n */\nfunction extractTablesFromAst(statements: unknown[]): Set<string> {\n const tables = new Set<string>();\n\n const walk = (node: unknown): void => {\n if (!node || typeof node !== 'object') return;\n const obj = node as Record<string, unknown>;\n\n // DuckDB AST uses table_name for table references\n if (typeof obj.table_name === 'string') {\n tables.add(obj.table_name.toLowerCase());\n }\n\n for (const value of Object.values(obj)) {\n if (Array.isArray(value)) {\n value.forEach(walk);\n } else if (value && typeof value === 'object') {\n walk(value);\n }\n }\n };\n\n for (const stmt of statements) {\n const stmtObj = stmt as Record<string, unknown>;\n if (stmtObj.node) {\n walk(stmtObj.node);\n } else {\n walk(stmt);\n }\n }\n\n return tables;\n}\n\n/**\n * Find SQL cell dependencies using AST-based parsing.\n * Returns cell dependencies and unmatched table references.\n */\nexport async function findSqlDependenciesFromAst(opts: {\n sql: string;\n cells: Record<string, Cell>;\n sqlSelectToJson: (sql: string) => Promise<{\n error: boolean;\n statements?: unknown[];\n }>;\n}): Promise<CellDependencies> {\n const {sql, cells, sqlSelectToJson} = opts;\n\n try {\n const parsed = await sqlSelectToJson(sql);\n if (parsed.error || !parsed.statements) {\n return {cellIds: []};\n }\n\n const referencedTables = extractTablesFromAst(parsed.statements);\n const deps: string[] = [];\n const matchedNames = new Set<string>();\n\n for (const [id, cell] of Object.entries(cells)) {\n if (cell.type === 'sql') {\n const cellData = cell.data as SqlCellData;\n const title = cellData.title?.toLowerCase();\n const effectiveName = getEffectiveResultName(\n cellData,\n convertToValidColumnOrTableName,\n ).toLowerCase();\n if (\n (title && referencedTables.has(title)) ||\n referencedTables.has(effectiveName)\n ) {\n deps.push(id);\n if (title) matchedNames.add(title);\n matchedNames.add(effectiveName);\n }\n }\n }\n\n const tableNames = Array.from(referencedTables).filter(\n (t) => !matchedNames.has(t),\n );\n\n return {cellIds: deps, tableNames};\n } catch {\n return {cellIds: []};\n }\n}\n\n/**\n * Rewrites unqualified references to known sheet-local result names as\n * schema-qualified references. This keeps SQL ergonomic without mutable\n * connector-level current schema state.\n */\nexport function qualifySheetLocalResultNames(opts: {\n sql: string;\n sheetSchema: string;\n sheetDatabase?: string;\n sheetCellIds: string[];\n cells: Record<string, Cell>;\n getSqlResultName: (cellId: string) => string | undefined;\n}): string {\n const {\n sql,\n sheetSchema,\n sheetDatabase,\n sheetCellIds,\n cells,\n getSqlResultName,\n } = opts;\n let rewritten = sql;\n\n const names = Array.from(\n new Set(\n sheetCellIds\n .map((cellId) => {\n const cell = cells[cellId];\n if (!cell || cell.type !== 'sql') return undefined;\n const resultName = getSqlResultName(cellId);\n if (!resultName || resultName.includes('.')) return undefined;\n return resultName;\n })\n .filter((v): v is string => Boolean(v)),\n ),\n ).sort((a, b) => b.length - a.length);\n\n for (const name of names) {\n const qualified = sheetDatabase\n ? `${sheetDatabase}.${sheetSchema}.${name}`\n : `${sheetSchema}.${name}`;\n const pattern = new RegExp(\n `(?<![a-zA-Z0-9_.])${escapeRegExp(name)}(?![a-zA-Z0-9_])`,\n 'g',\n );\n rewritten = rewritten.replace(pattern, qualified);\n }\n\n return rewritten;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sqlHelpers.js","sourceRoot":"","sources":["../src/sqlHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {convertToValidColumnOrTableName} from '@sqlrooms/utils';\nimport type {\n Cell,\n CellDependencies,\n Edge,\n SqlCellData,\n SqlDependencyOptions,\n SqlRenderInput,\n SqlRunCallbacks,\n SqlRunResult,\n} from './types';\nimport {isInputCell, isSqlCell} from './types';\nimport {getEffectiveResultName} from './utils';\n\nexport function deriveEdgesFromSql(\n cellId: string,\n sql: string,\n allCells: Record<string, Cell>,\n): Edge[] {\n const targetCell = allCells[cellId];\n if (!targetCell) return [];\n\n const deps = findSqlDependencies<Cell>({\n targetCell,\n cells: allCells,\n getSqlText: () => sql,\n getInputVarName: (cell) =>\n isInputCell(cell) ? cell.data.input.varName : undefined,\n getSqlResultName: (cid) => {\n const cell = allCells[cid];\n if (cell && isSqlCell(cell)) {\n return getEffectiveResultName(\n cell.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n }\n return undefined;\n },\n });\n\n return deps.map((sourceId) => ({\n id: `${sourceId}-${cellId}`,\n source: sourceId,\n target: cellId,\n }));\n}\n\nexport function renderSqlWithInputs(\n rawSql: string,\n inputs: SqlRenderInput[],\n): string {\n const varMap: Record<string, string | number> = {};\n for (const {varName, value} of inputs) {\n varMap[varName] = value;\n }\n return (rawSql || '').replace(\n /\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\}\\}/g,\n (_m: string, v: string) => {\n const val = varMap[v];\n return typeof val === 'number'\n ? String(val)\n : `'${String(val ?? '')?.replace(/'/g, \"''\")}'`;\n },\n );\n}\n\nexport function findSqlDependencies<\n TCell extends {id: string; type: string},\n>(opts: {\n targetCell: TCell;\n cells: Record<string, TCell>;\n getSqlText: (cell: TCell) => string | undefined;\n getInputVarName: (cell: TCell) => string | undefined;\n getSqlResultName: (cellId: string) => string | undefined;\n options?: SqlDependencyOptions;\n}): string[] {\n const {\n targetCell,\n cells,\n getSqlText,\n getInputVarName,\n getSqlResultName,\n options,\n } = opts;\n const sql = getSqlText(targetCell) || '';\n const sqlLower = sql.toLowerCase();\n const deps: string[] = [];\n const inputTypes = options?.inputTypes ?? ['input'];\n const sqlTypes = options?.sqlTypes ?? ['sql'];\n\n for (const otherId in cells) {\n if (otherId === targetCell.id) continue;\n const other = cells[otherId];\n if (!other) continue;\n if (inputTypes.includes(other.type)) {\n const vn = getInputVarName(other);\n if (!vn) continue;\n if (sql.includes(`{{${vn}}}`) || sql.includes(`:${vn}`)) {\n deps.push(other.id);\n }\n } else if (sqlTypes.includes(other.type)) {\n const resultName = getSqlResultName(other.id);\n const title =\n typeof (other as {data?: {title?: unknown}}).data?.title === 'string'\n ? ((other as {data?: {title?: string}}).data?.title as string)\n : undefined;\n // Match on title (case-insensitive) with identifier boundaries\n const titleMatch =\n title && containsIdentifier(sqlLower, title.toLowerCase());\n // Match on effective result name (case-insensitive)\n const resultMatch =\n resultName && containsIdentifier(sqlLower, resultName.toLowerCase());\n if (titleMatch || resultMatch) deps.push(other.id);\n }\n }\n return Array.from(new Set(deps));\n}\n\nfunction escapeRegExp(input: string): string {\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction containsIdentifier(sqlLower: string, candidateLower: string): boolean {\n if (!candidateLower.trim()) return false;\n const pattern = new RegExp(\n `(?<![a-zA-Z0-9_.])${escapeRegExp(candidateLower)}(?![a-zA-Z0-9_])`,\n 'i',\n );\n return pattern.test(sqlLower);\n}\n\nexport async function runSqlWithCallbacks(\n run: () => Promise<SqlRunResult>,\n callbacks: SqlRunCallbacks = {},\n) {\n callbacks.onStart?.();\n try {\n const res = await run();\n callbacks.onSuccess?.(res);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n callbacks.onError?.(message);\n } finally {\n callbacks.onFinally?.();\n }\n}\n\n/**\n * Recursively extract table names from a parsed SQL AST.\n */\nfunction extractTablesFromAst(statements: unknown[]): Set<string> {\n const tables = new Set<string>();\n\n const walk = (node: unknown): void => {\n if (!node || typeof node !== 'object') return;\n const obj = node as Record<string, unknown>;\n\n // DuckDB AST uses table_name for table references\n if (typeof obj.table_name === 'string') {\n tables.add(obj.table_name.toLowerCase());\n }\n\n for (const value of Object.values(obj)) {\n if (Array.isArray(value)) {\n value.forEach(walk);\n } else if (value && typeof value === 'object') {\n walk(value);\n }\n }\n };\n\n for (const stmt of statements) {\n const stmtObj = stmt as Record<string, unknown>;\n if (stmtObj.node) {\n walk(stmtObj.node);\n } else {\n walk(stmt);\n }\n }\n\n return tables;\n}\n\n/**\n * Find SQL cell dependencies using AST-based parsing.\n * Returns cell dependencies and unmatched table references.\n */\nexport async function findSqlDependenciesFromAst(opts: {\n sql: string;\n cells: Record<string, Cell>;\n sqlSelectToJson: (sql: string) => Promise<{\n error: boolean;\n statements?: unknown[];\n }>;\n}): Promise<CellDependencies> {\n const {sql, cells, sqlSelectToJson} = opts;\n\n try {\n const parsed = await sqlSelectToJson(sql);\n if (parsed.error || !parsed.statements) {\n return {cellIds: []};\n }\n\n const referencedTables = extractTablesFromAst(parsed.statements);\n const deps: string[] = [];\n const matchedNames = new Set<string>();\n\n for (const [id, cell] of Object.entries(cells)) {\n if (cell.type === 'sql') {\n const cellData = cell.data as SqlCellData;\n const title = cellData.title?.toLowerCase();\n const effectiveName = getEffectiveResultName(\n cellData,\n convertToValidColumnOrTableName,\n ).toLowerCase();\n if (\n (title && referencedTables.has(title)) ||\n referencedTables.has(effectiveName)\n ) {\n deps.push(id);\n if (title) matchedNames.add(title);\n matchedNames.add(effectiveName);\n }\n }\n }\n\n const tableNames = Array.from(referencedTables).filter(\n (t) => !matchedNames.has(t),\n );\n\n return {cellIds: deps, tableNames};\n } catch {\n return {cellIds: []};\n }\n}\n\n/**\n * Rewrites unqualified references to known artifact-local result names as\n * schema-qualified references. This keeps SQL ergonomic without mutable\n * connector-level current schema state.\n */\nexport function qualifyArtifactLocalResultNames(opts: {\n sql: string;\n artifactSchema: string;\n artifactDatabase?: string;\n artifactCellIds: string[];\n cells: Record<string, Cell>;\n getSqlResultName: (cellId: string) => string | undefined;\n}): string {\n const {\n sql,\n artifactSchema,\n artifactDatabase,\n artifactCellIds,\n cells,\n getSqlResultName,\n } = opts;\n let rewritten = sql;\n\n const names = Array.from(\n new Set(\n artifactCellIds\n .map((cellId) => {\n const cell = cells[cellId];\n if (!cell || cell.type !== 'sql') return undefined;\n const resultName = getSqlResultName(cellId);\n if (!resultName || resultName.includes('.')) return undefined;\n return resultName;\n })\n .filter((v): v is string => Boolean(v)),\n ),\n ).sort((a, b) => b.length - a.length);\n\n for (const name of names) {\n const qualified = artifactDatabase\n ? `${artifactDatabase}.${artifactSchema}.${name}`\n : `${artifactSchema}.${name}`;\n const pattern = new RegExp(\n `(?<![a-zA-Z0-9_.])${escapeRegExp(name)}(?![a-zA-Z0-9_])`,\n 'g',\n );\n rewritten = rewritten.replace(pattern, qualified);\n }\n\n return rewritten;\n}\n"]}
|