@duckcodeailabs/dql-core 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lineage/sql-parser.d.ts.map +1 -1
- package/dist/lineage/sql-parser.js +16 -0
- package/dist/lineage/sql-parser.js.map +1 -1
- package/dist/manifest/builder.d.ts +22 -0
- package/dist/manifest/builder.d.ts.map +1 -0
- package/dist/manifest/builder.js +538 -0
- package/dist/manifest/builder.js.map +1 -0
- package/dist/manifest/index.d.ts +3 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +3 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/types.d.ts +168 -0
- package/dist/manifest/types.d.ts.map +1 -0
- package/dist/manifest/types.js +10 -0
- package/dist/manifest/types.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,wCAAwC;AAExC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,wCAAwC;AAExC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-parser.d.ts","sourceRoot":"","sources":["../../src/lineage/sql-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sCAAsC;IACtC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mCAAmC;IACnC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"sql-parser.d.ts","sourceRoot":"","sources":["../../src/lineage/sql-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sCAAsC;IACtC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mCAAmC;IACnC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CA4DhE"}
|
|
@@ -15,6 +15,9 @@ export function extractTablesFromSql(sql) {
|
|
|
15
15
|
const ctes = extractCteNames(sql);
|
|
16
16
|
// Strip comments first (refs inside comments should be ignored)
|
|
17
17
|
const noComments = stripComments(sql);
|
|
18
|
+
// Extract DuckDB reader functions BEFORE stripping string literals
|
|
19
|
+
// (because the file path is inside quotes that would be stripped)
|
|
20
|
+
const readerTables = extractReaderFunctions(noComments);
|
|
18
21
|
// Strip non-ref string literals, then extract refs from the result.
|
|
19
22
|
// This ensures ref("block") and ref('block') are preserved, but
|
|
20
23
|
// 'ref("fake")' (a string literal containing ref) is stripped.
|
|
@@ -38,6 +41,10 @@ export function extractTablesFromSql(sql) {
|
|
|
38
41
|
for (const match of cleaned.matchAll(intoPattern)) {
|
|
39
42
|
addTableRef(rawTables, match[1]);
|
|
40
43
|
}
|
|
44
|
+
// Add DuckDB reader function references (extracted before string stripping)
|
|
45
|
+
for (const rt of readerTables) {
|
|
46
|
+
rawTables.add(rt);
|
|
47
|
+
}
|
|
41
48
|
// Filter out CTEs, SQL keywords that might match, and DuckDB functions
|
|
42
49
|
const sqlKeywords = new Set([
|
|
43
50
|
'select', 'where', 'group', 'order', 'having', 'limit', 'offset',
|
|
@@ -68,6 +75,15 @@ function extractCteNames(sql) {
|
|
|
68
75
|
}
|
|
69
76
|
return ctes;
|
|
70
77
|
}
|
|
78
|
+
/** Extract DuckDB reader function calls (e.g., read_csv_auto('./data/file.csv')) */
|
|
79
|
+
function extractReaderFunctions(sql) {
|
|
80
|
+
const results = [];
|
|
81
|
+
const pattern = /\b(read_csv_auto|read_csv|read_parquet|read_json|read_json_auto)\s*\(\s*['"]([^'"]+)['"]\s*(?:,\s*[^)]*?)?\)/gi;
|
|
82
|
+
for (const match of sql.matchAll(pattern)) {
|
|
83
|
+
results.push(`${match[1]}('${match[2]}')`);
|
|
84
|
+
}
|
|
85
|
+
return results;
|
|
86
|
+
}
|
|
71
87
|
/** Extract ref("block_name") calls from SQL */
|
|
72
88
|
function extractRefs(sql) {
|
|
73
89
|
const refs = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-parser.js","sourceRoot":"","sources":["../../src/lineage/sql-parser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sql-parser.js","sourceRoot":"","sources":["../../src/lineage/sql-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest Builder — scans a DQL project and produces a DQLManifest.
|
|
3
|
+
*
|
|
4
|
+
* This is the core compilation step: discovers all blocks, notebooks,
|
|
5
|
+
* semantic layer definitions, extracts dependencies, builds lineage,
|
|
6
|
+
* and optionally imports dbt manifest data.
|
|
7
|
+
*/
|
|
8
|
+
import type { DQLManifest } from './types.js';
|
|
9
|
+
export interface ManifestBuildOptions {
|
|
10
|
+
/** Project root directory (must contain dql.config.json) */
|
|
11
|
+
projectRoot: string;
|
|
12
|
+
/** DQL CLI version string */
|
|
13
|
+
dqlVersion?: string;
|
|
14
|
+
/** Path to dbt manifest.json for import */
|
|
15
|
+
dbtManifestPath?: string;
|
|
16
|
+
/** Additional directories to scan for .dql files */
|
|
17
|
+
extraBlockDirs?: string[];
|
|
18
|
+
/** Additional directories to scan for .dqlnb files */
|
|
19
|
+
extraNotebookDirs?: string[];
|
|
20
|
+
}
|
|
21
|
+
export declare function buildManifest(options: ManifestBuildOptions): DQLManifest;
|
|
22
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/manifest/builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,OAAO,KAAK,EACV,WAAW,EASZ,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,oBAAoB;IACnC,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,WAAW,CAmDxE"}
|
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest Builder — scans a DQL project and produces a DQLManifest.
|
|
3
|
+
*
|
|
4
|
+
* This is the core compilation step: discovers all blocks, notebooks,
|
|
5
|
+
* semantic layer definitions, extracts dependencies, builds lineage,
|
|
6
|
+
* and optionally imports dbt manifest data.
|
|
7
|
+
*/
|
|
8
|
+
import { readdirSync, readFileSync, existsSync } from 'node:fs';
|
|
9
|
+
import { join, extname, relative } from 'node:path';
|
|
10
|
+
import { Parser } from '../parser/index.js';
|
|
11
|
+
import { extractTablesFromSql } from '../lineage/sql-parser.js';
|
|
12
|
+
import { buildLineageGraph } from '../lineage/builder.js';
|
|
13
|
+
import { detectDomainFlows, getDomainTrustOverview } from '../lineage/domain-lineage.js';
|
|
14
|
+
import { loadSemanticLayerFromDir } from '../semantic/index.js';
|
|
15
|
+
export function buildManifest(options) {
|
|
16
|
+
const { projectRoot, dqlVersion = '0.6.0' } = options;
|
|
17
|
+
// Load project config
|
|
18
|
+
const config = loadProjectConfig(projectRoot);
|
|
19
|
+
const projectName = config.project ?? 'dql-project';
|
|
20
|
+
// Scan blocks
|
|
21
|
+
const blockDirs = ['blocks', 'dashboards', 'workbooks', ...(options.extraBlockDirs ?? [])];
|
|
22
|
+
const blocks = scanBlocks(projectRoot, blockDirs);
|
|
23
|
+
// Scan notebooks
|
|
24
|
+
const notebookDirs = ['notebooks', 'blocks', 'dashboards', 'workbooks', ...(options.extraNotebookDirs ?? [])];
|
|
25
|
+
const notebooks = scanNotebooks(projectRoot, notebookDirs);
|
|
26
|
+
// Extract blocks declared inside notebook DQL cells
|
|
27
|
+
const notebookBlocks = extractNotebookBlocks(notebooks, projectRoot);
|
|
28
|
+
for (const [name, block] of Object.entries(notebookBlocks)) {
|
|
29
|
+
if (!blocks[name])
|
|
30
|
+
blocks[name] = block;
|
|
31
|
+
}
|
|
32
|
+
// Load semantic layer
|
|
33
|
+
const semanticDir = resolveSemanticPath(projectRoot, config);
|
|
34
|
+
const { metrics, dimensions } = loadSemanticDefinitions(projectRoot, semanticDir);
|
|
35
|
+
// Collect all source tables
|
|
36
|
+
const sources = collectSources(blocks, notebooks, metrics, dimensions);
|
|
37
|
+
// Import dbt manifest if provided
|
|
38
|
+
let dbtImport;
|
|
39
|
+
if (options.dbtManifestPath) {
|
|
40
|
+
dbtImport = importDbtManifest(options.dbtManifestPath, sources);
|
|
41
|
+
}
|
|
42
|
+
// Build lineage
|
|
43
|
+
const lineage = buildManifestLineage(blocks, metrics, dimensions);
|
|
44
|
+
return {
|
|
45
|
+
manifestVersion: 1,
|
|
46
|
+
dqlVersion,
|
|
47
|
+
generatedAt: new Date().toISOString(),
|
|
48
|
+
project: projectName,
|
|
49
|
+
projectRoot,
|
|
50
|
+
blocks,
|
|
51
|
+
notebooks,
|
|
52
|
+
metrics,
|
|
53
|
+
dimensions,
|
|
54
|
+
sources,
|
|
55
|
+
lineage,
|
|
56
|
+
dbtImport,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function loadProjectConfig(projectRoot) {
|
|
60
|
+
const configPath = join(projectRoot, 'dql.config.json');
|
|
61
|
+
if (!existsSync(configPath))
|
|
62
|
+
return {};
|
|
63
|
+
try {
|
|
64
|
+
return JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function resolveSemanticPath(projectRoot, config) {
|
|
71
|
+
const customPath = config.semanticLayer?.path;
|
|
72
|
+
if (customPath)
|
|
73
|
+
return join(projectRoot, customPath);
|
|
74
|
+
return join(projectRoot, 'semantic-layer');
|
|
75
|
+
}
|
|
76
|
+
// ---- Recursive File Scanner ----
|
|
77
|
+
function scanFilesRecursive(dir, extensions) {
|
|
78
|
+
const results = [];
|
|
79
|
+
if (!existsSync(dir))
|
|
80
|
+
return results;
|
|
81
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
const fullPath = join(dir, entry.name);
|
|
84
|
+
if (entry.isDirectory()) {
|
|
85
|
+
// Skip hidden dirs and node_modules
|
|
86
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules')
|
|
87
|
+
continue;
|
|
88
|
+
results.push(...scanFilesRecursive(fullPath, extensions));
|
|
89
|
+
}
|
|
90
|
+
else if (entry.isFile() && extensions.includes(extname(entry.name))) {
|
|
91
|
+
results.push(fullPath);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return results;
|
|
95
|
+
}
|
|
96
|
+
// ---- Block Scanning ----
|
|
97
|
+
function scanBlocks(projectRoot, dirs) {
|
|
98
|
+
const blocks = {};
|
|
99
|
+
for (const dir of dirs) {
|
|
100
|
+
const dirPath = join(projectRoot, dir);
|
|
101
|
+
const files = scanFilesRecursive(dirPath, ['.dql']);
|
|
102
|
+
for (const filePath of files) {
|
|
103
|
+
try {
|
|
104
|
+
const source = readFileSync(filePath, 'utf-8');
|
|
105
|
+
const relPath = relative(projectRoot, filePath);
|
|
106
|
+
const parser = new Parser(source, relPath);
|
|
107
|
+
const ast = parser.parse();
|
|
108
|
+
for (const stmt of ast.statements) {
|
|
109
|
+
const block = stmt;
|
|
110
|
+
if (block.kind !== 'BlockDecl')
|
|
111
|
+
continue;
|
|
112
|
+
const sql = block.query?.rawSQL ?? '';
|
|
113
|
+
const parseResult = extractTablesFromSql(sql);
|
|
114
|
+
const domain = extractProp(block, 'domain');
|
|
115
|
+
const owner = extractProp(block, 'owner');
|
|
116
|
+
const description = extractProp(block, 'description');
|
|
117
|
+
const tags = extractTags(block);
|
|
118
|
+
const tests = extractTests(block);
|
|
119
|
+
blocks[block.name] = {
|
|
120
|
+
name: block.name,
|
|
121
|
+
filePath: relPath,
|
|
122
|
+
domain,
|
|
123
|
+
owner,
|
|
124
|
+
status: extractProp(block, 'status'),
|
|
125
|
+
blockType: block.blockType,
|
|
126
|
+
sql,
|
|
127
|
+
rawTableRefs: parseResult.tables,
|
|
128
|
+
tableDependencies: parseResult.tables.map(normalizeTableName),
|
|
129
|
+
refDependencies: parseResult.refs,
|
|
130
|
+
allDependencies: [
|
|
131
|
+
...parseResult.refs,
|
|
132
|
+
...parseResult.tables.map(normalizeTableName),
|
|
133
|
+
],
|
|
134
|
+
chartType: extractVisualizationChart(block),
|
|
135
|
+
metricRef: block.metricRef,
|
|
136
|
+
tests,
|
|
137
|
+
tags,
|
|
138
|
+
description,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Skip unparseable files
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return blocks;
|
|
148
|
+
}
|
|
149
|
+
// ---- Notebook Scanning ----
|
|
150
|
+
function scanNotebooks(projectRoot, dirs) {
|
|
151
|
+
const notebooks = {};
|
|
152
|
+
const seen = new Set();
|
|
153
|
+
for (const dir of dirs) {
|
|
154
|
+
const dirPath = join(projectRoot, dir);
|
|
155
|
+
const files = scanFilesRecursive(dirPath, ['.dqlnb']);
|
|
156
|
+
for (const filePath of files) {
|
|
157
|
+
if (seen.has(filePath))
|
|
158
|
+
continue;
|
|
159
|
+
seen.add(filePath);
|
|
160
|
+
try {
|
|
161
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
162
|
+
const relPath = relative(projectRoot, filePath);
|
|
163
|
+
const doc = JSON.parse(raw);
|
|
164
|
+
if (doc.version !== 1 || !Array.isArray(doc.cells))
|
|
165
|
+
continue;
|
|
166
|
+
const cells = [];
|
|
167
|
+
for (const cell of doc.cells) {
|
|
168
|
+
const type = cell.type;
|
|
169
|
+
if (type !== 'sql' && type !== 'dql')
|
|
170
|
+
continue;
|
|
171
|
+
const source = cell.source ?? cell.content ?? '';
|
|
172
|
+
if (!source.trim())
|
|
173
|
+
continue;
|
|
174
|
+
let sqlToAnalyze = source;
|
|
175
|
+
let blockName;
|
|
176
|
+
// For DQL cells, try to extract the block's SQL
|
|
177
|
+
if (type === 'dql') {
|
|
178
|
+
try {
|
|
179
|
+
const parser = new Parser(source, `${relPath}:${cell.id}`);
|
|
180
|
+
const ast = parser.parse();
|
|
181
|
+
for (const stmt of ast.statements) {
|
|
182
|
+
if (stmt.kind === 'BlockDecl') {
|
|
183
|
+
blockName = stmt.name;
|
|
184
|
+
sqlToAnalyze = stmt.query?.rawSQL ?? source;
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// Fall back to analyzing the raw source as SQL
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const parseResult = extractTablesFromSql(sqlToAnalyze);
|
|
194
|
+
// Find if any chart cell references this cell
|
|
195
|
+
const chartCell = doc.cells.find((c) => c.type === 'chart' && c.config?.sourceCellId === cell.id);
|
|
196
|
+
cells.push({
|
|
197
|
+
id: cell.id ?? `cell-${cells.length}`,
|
|
198
|
+
type,
|
|
199
|
+
title: cell.title ?? cell.name,
|
|
200
|
+
source,
|
|
201
|
+
tableDependencies: parseResult.tables.map(normalizeTableName),
|
|
202
|
+
refDependencies: parseResult.refs,
|
|
203
|
+
blockName,
|
|
204
|
+
chartType: chartCell?.config?.chart,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
if (cells.length > 0) {
|
|
208
|
+
notebooks[relPath] = {
|
|
209
|
+
title: doc.metadata?.title ?? doc.title ?? relPath,
|
|
210
|
+
filePath: relPath,
|
|
211
|
+
cells,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// Skip invalid notebooks
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return notebooks;
|
|
221
|
+
}
|
|
222
|
+
/** Extract blocks declared inside notebook DQL cells into the blocks map. */
|
|
223
|
+
function extractNotebookBlocks(notebooks, projectRoot) {
|
|
224
|
+
const blocks = {};
|
|
225
|
+
for (const [nbPath, nb] of Object.entries(notebooks)) {
|
|
226
|
+
for (const cell of nb.cells) {
|
|
227
|
+
if (cell.type !== 'dql' || !cell.blockName)
|
|
228
|
+
continue;
|
|
229
|
+
// Only add if not already found as a standalone block file
|
|
230
|
+
if (!blocks[cell.blockName]) {
|
|
231
|
+
const parseResult = extractTablesFromSql(cell.source);
|
|
232
|
+
blocks[cell.blockName] = {
|
|
233
|
+
name: cell.blockName,
|
|
234
|
+
filePath: `${nbPath}#${cell.id}`,
|
|
235
|
+
sql: cell.source,
|
|
236
|
+
rawTableRefs: parseResult.tables,
|
|
237
|
+
tableDependencies: parseResult.tables.map(normalizeTableName),
|
|
238
|
+
refDependencies: parseResult.refs,
|
|
239
|
+
allDependencies: [...parseResult.refs, ...parseResult.tables.map(normalizeTableName)],
|
|
240
|
+
tests: [],
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return blocks;
|
|
246
|
+
}
|
|
247
|
+
// ---- Semantic Layer ----
|
|
248
|
+
function loadSemanticDefinitions(projectRoot, semanticDir) {
|
|
249
|
+
const metrics = {};
|
|
250
|
+
const dimensions = {};
|
|
251
|
+
if (!existsSync(semanticDir))
|
|
252
|
+
return { metrics, dimensions };
|
|
253
|
+
try {
|
|
254
|
+
const layer = loadSemanticLayerFromDir(semanticDir);
|
|
255
|
+
for (const m of layer.listMetrics()) {
|
|
256
|
+
metrics[m.name] = {
|
|
257
|
+
name: m.name,
|
|
258
|
+
type: m.type,
|
|
259
|
+
table: m.table,
|
|
260
|
+
domain: m.domain,
|
|
261
|
+
description: m.description,
|
|
262
|
+
sql: m.sql,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
for (const d of layer.listDimensions()) {
|
|
266
|
+
dimensions[d.name] = {
|
|
267
|
+
name: d.name,
|
|
268
|
+
table: d.table,
|
|
269
|
+
type: d.type,
|
|
270
|
+
description: d.description,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
// Try to find file paths for metrics and dimensions
|
|
274
|
+
const metricFiles = scanFilesRecursive(join(semanticDir, 'metrics'), ['.yaml', '.yml']);
|
|
275
|
+
for (const f of metricFiles) {
|
|
276
|
+
try {
|
|
277
|
+
const content = JSON.parse(JSON.stringify(
|
|
278
|
+
// Simple YAML-like parse for name field
|
|
279
|
+
Object.fromEntries(readFileSync(f, 'utf-8')
|
|
280
|
+
.split('\n')
|
|
281
|
+
.filter((l) => l.includes(':') && !l.startsWith('#'))
|
|
282
|
+
.map((l) => {
|
|
283
|
+
const [k, ...v] = l.split(':');
|
|
284
|
+
return [k.trim(), v.join(':').trim()];
|
|
285
|
+
}))));
|
|
286
|
+
if (content.name && metrics[content.name]) {
|
|
287
|
+
metrics[content.name].filePath = relative(projectRoot, f);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
catch { /* skip */ }
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
// Non-fatal — semantic layer may not exist or be misconfigured
|
|
295
|
+
}
|
|
296
|
+
return { metrics, dimensions };
|
|
297
|
+
}
|
|
298
|
+
// ---- Source Collection ----
|
|
299
|
+
function collectSources(blocks, notebooks, metrics, dimensions) {
|
|
300
|
+
const sources = {};
|
|
301
|
+
function ensureSource(name, origin, rawRef) {
|
|
302
|
+
if (!sources[name]) {
|
|
303
|
+
sources[name] = { name, origin, rawRef, referencedBy: [] };
|
|
304
|
+
}
|
|
305
|
+
return sources[name];
|
|
306
|
+
}
|
|
307
|
+
// From blocks
|
|
308
|
+
for (const block of Object.values(blocks)) {
|
|
309
|
+
for (let i = 0; i < block.tableDependencies.length; i++) {
|
|
310
|
+
const tableName = block.tableDependencies[i];
|
|
311
|
+
// Skip if it's actually a ref to another block
|
|
312
|
+
if (blocks[tableName])
|
|
313
|
+
continue;
|
|
314
|
+
const source = ensureSource(tableName, 'sql', block.rawTableRefs[i]);
|
|
315
|
+
source.referencedBy.push(`block:${block.name}`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// From notebooks
|
|
319
|
+
for (const nb of Object.values(notebooks)) {
|
|
320
|
+
for (const cell of nb.cells) {
|
|
321
|
+
for (const tableName of cell.tableDependencies) {
|
|
322
|
+
if (blocks[tableName])
|
|
323
|
+
continue;
|
|
324
|
+
const source = ensureSource(tableName, 'sql');
|
|
325
|
+
source.referencedBy.push(`notebook:${nb.filePath}#${cell.id}`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
// From semantic layer
|
|
330
|
+
for (const metric of Object.values(metrics)) {
|
|
331
|
+
const source = ensureSource(metric.table, 'semantic');
|
|
332
|
+
if (!source.referencedBy.includes(`metric:${metric.name}`)) {
|
|
333
|
+
source.referencedBy.push(`metric:${metric.name}`);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
for (const dim of Object.values(dimensions)) {
|
|
337
|
+
const source = ensureSource(dim.table, 'semantic');
|
|
338
|
+
if (!source.referencedBy.includes(`dimension:${dim.name}`)) {
|
|
339
|
+
source.referencedBy.push(`dimension:${dim.name}`);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return sources;
|
|
343
|
+
}
|
|
344
|
+
// ---- dbt Manifest Import ----
|
|
345
|
+
function importDbtManifest(manifestPath, sources) {
|
|
346
|
+
const raw = readFileSync(manifestPath, 'utf-8');
|
|
347
|
+
const manifest = JSON.parse(raw);
|
|
348
|
+
let modelsImported = 0;
|
|
349
|
+
let sourcesImported = 0;
|
|
350
|
+
const projectName = manifest.metadata?.project_name;
|
|
351
|
+
// Import models as source tables
|
|
352
|
+
const nodes = manifest.nodes ?? {};
|
|
353
|
+
for (const [uniqueId, node] of Object.entries(nodes)) {
|
|
354
|
+
if (node.resource_type !== 'model')
|
|
355
|
+
continue;
|
|
356
|
+
const tableName = node.alias ?? node.name;
|
|
357
|
+
if (!tableName)
|
|
358
|
+
continue;
|
|
359
|
+
// Create or update source entry
|
|
360
|
+
if (!sources[tableName]) {
|
|
361
|
+
sources[tableName] = {
|
|
362
|
+
name: tableName,
|
|
363
|
+
origin: 'dbt',
|
|
364
|
+
referencedBy: [],
|
|
365
|
+
};
|
|
366
|
+
sourcesImported++;
|
|
367
|
+
}
|
|
368
|
+
sources[tableName].dbtModel = {
|
|
369
|
+
uniqueId,
|
|
370
|
+
database: node.database,
|
|
371
|
+
schema: node.schema,
|
|
372
|
+
materializedAs: node.config?.materialized,
|
|
373
|
+
description: node.description,
|
|
374
|
+
columns: node.columns
|
|
375
|
+
? Object.fromEntries(Object.entries(node.columns).map(([k, v]) => [
|
|
376
|
+
k,
|
|
377
|
+
{ name: v.name, description: v.description, type: v.data_type },
|
|
378
|
+
]))
|
|
379
|
+
: undefined,
|
|
380
|
+
};
|
|
381
|
+
if (sources[tableName].origin === 'sql') {
|
|
382
|
+
sources[tableName].origin = 'dbt';
|
|
383
|
+
}
|
|
384
|
+
modelsImported++;
|
|
385
|
+
}
|
|
386
|
+
// Import dbt sources
|
|
387
|
+
const dbtSources = manifest.sources ?? {};
|
|
388
|
+
for (const [uniqueId, src] of Object.entries(dbtSources)) {
|
|
389
|
+
const tableName = src.identifier ?? src.name;
|
|
390
|
+
if (!tableName)
|
|
391
|
+
continue;
|
|
392
|
+
if (!sources[tableName]) {
|
|
393
|
+
sources[tableName] = {
|
|
394
|
+
name: tableName,
|
|
395
|
+
origin: 'dbt',
|
|
396
|
+
referencedBy: [],
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
sources[tableName].dbtModel = {
|
|
400
|
+
uniqueId,
|
|
401
|
+
database: src.database,
|
|
402
|
+
schema: src.schema,
|
|
403
|
+
description: src.description,
|
|
404
|
+
};
|
|
405
|
+
sourcesImported++;
|
|
406
|
+
}
|
|
407
|
+
return {
|
|
408
|
+
manifestPath,
|
|
409
|
+
projectName,
|
|
410
|
+
modelsImported,
|
|
411
|
+
sourcesImported,
|
|
412
|
+
importedAt: new Date().toISOString(),
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
// ---- Lineage Builder ----
|
|
416
|
+
function buildManifestLineage(blocks, metrics, dimensions) {
|
|
417
|
+
// Convert to lineage builder input format
|
|
418
|
+
const lineageBlocks = Object.values(blocks).map((b) => ({
|
|
419
|
+
name: b.name,
|
|
420
|
+
sql: b.sql,
|
|
421
|
+
domain: b.domain,
|
|
422
|
+
owner: b.owner,
|
|
423
|
+
status: b.status,
|
|
424
|
+
blockType: b.blockType,
|
|
425
|
+
metricRef: b.metricRef,
|
|
426
|
+
chartType: b.chartType,
|
|
427
|
+
}));
|
|
428
|
+
const lineageMetrics = Object.values(metrics).map((m) => ({
|
|
429
|
+
name: m.name,
|
|
430
|
+
table: m.table,
|
|
431
|
+
domain: m.domain ?? '',
|
|
432
|
+
type: m.type,
|
|
433
|
+
}));
|
|
434
|
+
const lineageDimensions = Object.values(dimensions).map((d) => ({
|
|
435
|
+
name: d.name,
|
|
436
|
+
table: d.table,
|
|
437
|
+
}));
|
|
438
|
+
const graph = buildLineageGraph(lineageBlocks, lineageMetrics, lineageDimensions);
|
|
439
|
+
// Serialize to manifest format
|
|
440
|
+
const graphJson = graph.toJSON();
|
|
441
|
+
const domains = graph.getDomains();
|
|
442
|
+
const flows = detectDomainFlows(graph);
|
|
443
|
+
const domainTrust = {};
|
|
444
|
+
for (const domain of domains) {
|
|
445
|
+
const overview = getDomainTrustOverview(graph, domain);
|
|
446
|
+
domainTrust[domain] = {
|
|
447
|
+
total: overview.totalBlocks,
|
|
448
|
+
certified: overview.certified,
|
|
449
|
+
score: overview.trustScore,
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
return {
|
|
453
|
+
nodes: graphJson.nodes.map((n) => ({
|
|
454
|
+
id: n.id,
|
|
455
|
+
type: n.type,
|
|
456
|
+
name: n.name,
|
|
457
|
+
domain: n.domain,
|
|
458
|
+
owner: n.owner,
|
|
459
|
+
status: n.status,
|
|
460
|
+
filePath: blocks[n.name]?.filePath,
|
|
461
|
+
})),
|
|
462
|
+
edges: graphJson.edges.map((e) => ({
|
|
463
|
+
source: e.source,
|
|
464
|
+
target: e.target,
|
|
465
|
+
type: e.type,
|
|
466
|
+
sourceDomain: e.sourceDomain,
|
|
467
|
+
targetDomain: e.targetDomain,
|
|
468
|
+
})),
|
|
469
|
+
domains,
|
|
470
|
+
crossDomainFlows: flows.map((f) => ({
|
|
471
|
+
from: f.from,
|
|
472
|
+
to: f.to,
|
|
473
|
+
edgeCount: f.edges.length,
|
|
474
|
+
})),
|
|
475
|
+
domainTrust,
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
// ---- AST Helpers ----
|
|
479
|
+
function extractProp(block, propName) {
|
|
480
|
+
if (block[propName] !== undefined && block[propName] !== null) {
|
|
481
|
+
return String(block[propName]);
|
|
482
|
+
}
|
|
483
|
+
if (!block.properties)
|
|
484
|
+
return undefined;
|
|
485
|
+
for (const prop of block.properties) {
|
|
486
|
+
if (prop.key === propName && prop.value?.kind === 'Literal') {
|
|
487
|
+
return String(prop.value.value);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
return undefined;
|
|
491
|
+
}
|
|
492
|
+
function extractVisualizationChart(block) {
|
|
493
|
+
if (!block.visualization)
|
|
494
|
+
return undefined;
|
|
495
|
+
for (const prop of block.visualization.properties ?? []) {
|
|
496
|
+
if (prop.key === 'chart' && prop.value?.kind === 'Literal') {
|
|
497
|
+
return String(prop.value.value);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
return undefined;
|
|
501
|
+
}
|
|
502
|
+
function extractTags(block) {
|
|
503
|
+
if (Array.isArray(block.tags))
|
|
504
|
+
return block.tags;
|
|
505
|
+
if (!block.properties)
|
|
506
|
+
return undefined;
|
|
507
|
+
for (const prop of block.properties) {
|
|
508
|
+
if (prop.key === 'tags' && prop.value?.kind === 'ArrayLiteral') {
|
|
509
|
+
return prop.value.elements
|
|
510
|
+
?.map((e) => (e.kind === 'Literal' ? String(e.value) : null))
|
|
511
|
+
.filter(Boolean);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
return undefined;
|
|
515
|
+
}
|
|
516
|
+
function extractTests(block) {
|
|
517
|
+
if (!block.tests?.assertions)
|
|
518
|
+
return [];
|
|
519
|
+
return block.tests.assertions.map((a) => {
|
|
520
|
+
if (typeof a === 'string')
|
|
521
|
+
return a;
|
|
522
|
+
return `${a.field ?? ''} ${a.operator ?? ''} ${a.expected ?? ''}`.trim();
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Normalize DuckDB reader function calls to plain table names.
|
|
527
|
+
* e.g., "read_csv_auto('./data/revenue.csv')" → "revenue"
|
|
528
|
+
*/
|
|
529
|
+
function normalizeTableName(name) {
|
|
530
|
+
const readerMatch = name.match(/^(?:read_csv_auto|read_csv|read_parquet|read_json|read_json_auto)\s*\(\s*['"]([^'"]+)['"]\s*\)$/i);
|
|
531
|
+
if (readerMatch) {
|
|
532
|
+
const path = readerMatch[1];
|
|
533
|
+
const filename = path.split('/').pop() ?? path;
|
|
534
|
+
return filename.replace(/\.(csv|parquet|json)$/i, '');
|
|
535
|
+
}
|
|
536
|
+
return name;
|
|
537
|
+
}
|
|
538
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/manifest/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { buildManifest, type ManifestBuildOptions } from './builder.js';
|
|
2
|
+
export type { DQLManifest, ManifestBlock, ManifestNotebook, ManifestNotebookCell, ManifestMetric, ManifestDimension, ManifestSource, ManifestLineage, ManifestLineageNode, ManifestLineageEdge, ManifestDbtImport, } from './types.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAExE,YAAY,EACV,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,OAAO,EAAE,aAAa,EAA6B,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DQL Manifest — the compiled project artifact.
|
|
3
|
+
*
|
|
4
|
+
* Similar to dbt's manifest.json, this is the single source of truth
|
|
5
|
+
* for a DQL project's structure, dependencies, and lineage.
|
|
6
|
+
* Generated by `dql compile`, consumed by `dql lineage`, notebook panel,
|
|
7
|
+
* and external tools (DataHub, Atlan, etc.).
|
|
8
|
+
*/
|
|
9
|
+
export interface DQLManifest {
|
|
10
|
+
/** Manifest schema version */
|
|
11
|
+
manifestVersion: 1;
|
|
12
|
+
/** DQL CLI version that generated this manifest */
|
|
13
|
+
dqlVersion: string;
|
|
14
|
+
/** ISO 8601 timestamp */
|
|
15
|
+
generatedAt: string;
|
|
16
|
+
/** Project name from dql.config.json */
|
|
17
|
+
project: string;
|
|
18
|
+
/** Absolute path to project root */
|
|
19
|
+
projectRoot: string;
|
|
20
|
+
/** All blocks discovered in the project */
|
|
21
|
+
blocks: Record<string, ManifestBlock>;
|
|
22
|
+
/** All notebook SQL/DQL cells */
|
|
23
|
+
notebooks: Record<string, ManifestNotebook>;
|
|
24
|
+
/** Semantic layer definitions */
|
|
25
|
+
metrics: Record<string, ManifestMetric>;
|
|
26
|
+
dimensions: Record<string, ManifestDimension>;
|
|
27
|
+
/** External source tables (from SQL extraction + dbt import) */
|
|
28
|
+
sources: Record<string, ManifestSource>;
|
|
29
|
+
/** Pre-computed lineage graph */
|
|
30
|
+
lineage: ManifestLineage;
|
|
31
|
+
/** dbt manifest import metadata (if --dbt-manifest was used) */
|
|
32
|
+
dbtImport?: ManifestDbtImport;
|
|
33
|
+
}
|
|
34
|
+
export interface ManifestBlock {
|
|
35
|
+
name: string;
|
|
36
|
+
/** Relative path from project root */
|
|
37
|
+
filePath: string;
|
|
38
|
+
domain?: string;
|
|
39
|
+
owner?: string;
|
|
40
|
+
status?: string;
|
|
41
|
+
blockType?: string;
|
|
42
|
+
/** Raw SQL from the block's query */
|
|
43
|
+
sql: string;
|
|
44
|
+
/** Tables extracted from SQL (before normalization) */
|
|
45
|
+
rawTableRefs: string[];
|
|
46
|
+
/** Normalized table dependencies */
|
|
47
|
+
tableDependencies: string[];
|
|
48
|
+
/** Block dependencies via ref() */
|
|
49
|
+
refDependencies: string[];
|
|
50
|
+
/** All upstream dependencies (tables + refs combined) */
|
|
51
|
+
allDependencies: string[];
|
|
52
|
+
/** Visualization chart type */
|
|
53
|
+
chartType?: string;
|
|
54
|
+
/** Metric reference for semantic blocks */
|
|
55
|
+
metricRef?: string;
|
|
56
|
+
/** Test assertions defined in the block */
|
|
57
|
+
tests: string[];
|
|
58
|
+
/** Tags from block metadata */
|
|
59
|
+
tags?: string[];
|
|
60
|
+
description?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface ManifestNotebook {
|
|
63
|
+
/** Notebook title */
|
|
64
|
+
title: string;
|
|
65
|
+
/** Relative path from project root */
|
|
66
|
+
filePath: string;
|
|
67
|
+
/** SQL/DQL cells with lineage-relevant content */
|
|
68
|
+
cells: ManifestNotebookCell[];
|
|
69
|
+
}
|
|
70
|
+
export interface ManifestNotebookCell {
|
|
71
|
+
id: string;
|
|
72
|
+
type: 'sql' | 'dql';
|
|
73
|
+
title?: string;
|
|
74
|
+
/** Raw SQL/DQL source */
|
|
75
|
+
source: string;
|
|
76
|
+
/** Tables extracted from SQL */
|
|
77
|
+
tableDependencies: string[];
|
|
78
|
+
/** ref() dependencies */
|
|
79
|
+
refDependencies: string[];
|
|
80
|
+
/** Block name (for DQL cells that declare a block) */
|
|
81
|
+
blockName?: string;
|
|
82
|
+
/** Chart config (if a chart cell references this cell) */
|
|
83
|
+
chartType?: string;
|
|
84
|
+
}
|
|
85
|
+
export interface ManifestMetric {
|
|
86
|
+
name: string;
|
|
87
|
+
type: string;
|
|
88
|
+
table: string;
|
|
89
|
+
domain?: string;
|
|
90
|
+
description?: string;
|
|
91
|
+
sql?: string;
|
|
92
|
+
/** Relative path to the YAML file */
|
|
93
|
+
filePath?: string;
|
|
94
|
+
}
|
|
95
|
+
export interface ManifestDimension {
|
|
96
|
+
name: string;
|
|
97
|
+
table: string;
|
|
98
|
+
type?: string;
|
|
99
|
+
description?: string;
|
|
100
|
+
filePath?: string;
|
|
101
|
+
}
|
|
102
|
+
export interface ManifestSource {
|
|
103
|
+
/** Normalized table name */
|
|
104
|
+
name: string;
|
|
105
|
+
/** Raw reference as found in SQL (e.g., "read_csv_auto('./data/file.csv')") */
|
|
106
|
+
rawRef?: string;
|
|
107
|
+
/** Origin: 'sql' = extracted from SQL, 'semantic' = from YAML, 'dbt' = from dbt manifest */
|
|
108
|
+
origin: 'sql' | 'semantic' | 'dbt';
|
|
109
|
+
/** Which blocks/cells reference this source */
|
|
110
|
+
referencedBy: string[];
|
|
111
|
+
/** dbt model metadata (if imported from dbt manifest) */
|
|
112
|
+
dbtModel?: {
|
|
113
|
+
uniqueId: string;
|
|
114
|
+
database?: string;
|
|
115
|
+
schema?: string;
|
|
116
|
+
materializedAs?: string;
|
|
117
|
+
description?: string;
|
|
118
|
+
columns?: Record<string, {
|
|
119
|
+
name: string;
|
|
120
|
+
description?: string;
|
|
121
|
+
type?: string;
|
|
122
|
+
}>;
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
export interface ManifestLineage {
|
|
126
|
+
nodes: ManifestLineageNode[];
|
|
127
|
+
edges: ManifestLineageEdge[];
|
|
128
|
+
domains: string[];
|
|
129
|
+
crossDomainFlows: Array<{
|
|
130
|
+
from: string;
|
|
131
|
+
to: string;
|
|
132
|
+
edgeCount: number;
|
|
133
|
+
}>;
|
|
134
|
+
domainTrust: Record<string, {
|
|
135
|
+
total: number;
|
|
136
|
+
certified: number;
|
|
137
|
+
score: number;
|
|
138
|
+
}>;
|
|
139
|
+
}
|
|
140
|
+
export interface ManifestLineageNode {
|
|
141
|
+
id: string;
|
|
142
|
+
type: string;
|
|
143
|
+
name: string;
|
|
144
|
+
domain?: string;
|
|
145
|
+
owner?: string;
|
|
146
|
+
status?: string;
|
|
147
|
+
filePath?: string;
|
|
148
|
+
}
|
|
149
|
+
export interface ManifestLineageEdge {
|
|
150
|
+
source: string;
|
|
151
|
+
target: string;
|
|
152
|
+
type: string;
|
|
153
|
+
sourceDomain?: string;
|
|
154
|
+
targetDomain?: string;
|
|
155
|
+
}
|
|
156
|
+
export interface ManifestDbtImport {
|
|
157
|
+
/** Path to the dbt manifest.json that was imported */
|
|
158
|
+
manifestPath: string;
|
|
159
|
+
/** dbt project name */
|
|
160
|
+
projectName?: string;
|
|
161
|
+
/** Number of models imported */
|
|
162
|
+
modelsImported: number;
|
|
163
|
+
/** Number of sources imported */
|
|
164
|
+
sourcesImported: number;
|
|
165
|
+
/** Timestamp of import */
|
|
166
|
+
importedAt: string;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/manifest/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DQL Manifest — the compiled project artifact.
|
|
3
|
+
*
|
|
4
|
+
* Similar to dbt's manifest.json, this is the single source of truth
|
|
5
|
+
* for a DQL project's structure, dependencies, and lineage.
|
|
6
|
+
* Generated by `dql compile`, consumed by `dql lineage`, notebook panel,
|
|
7
|
+
* and external tools (DataHub, Atlan, etc.).
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/manifest/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|