@duckcodeailabs/dql-cli 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -0
- package/dist/args.d.ts +9 -0
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +43 -1
- package/dist/args.js.map +1 -1
- package/dist/args.test.d.ts +2 -0
- package/dist/args.test.d.ts.map +1 -0
- package/dist/args.test.js +33 -0
- package/dist/args.test.js.map +1 -0
- package/dist/assets/notebook-browser/app.js +537 -0
- package/dist/assets/notebook-browser/index.html +83 -0
- package/dist/assets/notebook-browser/styles.css +336 -0
- package/dist/assets/templates/ecommerce/README.md +27 -0
- package/dist/assets/templates/ecommerce/blocks/repeat_rate.dql +26 -0
- package/dist/assets/templates/ecommerce/blocks/revenue_by_segment.dql +24 -0
- package/dist/assets/templates/ecommerce/dashboards/revenue_command_center.dql +25 -0
- package/dist/assets/templates/ecommerce/data/customers.csv +11 -0
- package/dist/assets/templates/ecommerce/data/funnel.csv +6 -0
- package/dist/assets/templates/ecommerce/data/orders.csv +16 -0
- package/dist/assets/templates/ecommerce/dql.config.json +13 -0
- package/dist/assets/templates/ecommerce/semantic-layer/dimensions/channel.yaml +4 -0
- package/dist/assets/templates/ecommerce/semantic-layer/metrics/gmv.yaml +4 -0
- package/dist/assets/templates/ecommerce/workbooks/.gitkeep +1 -0
- package/dist/assets/templates/saas/README.md +20 -0
- package/dist/assets/templates/saas/blocks/churn_pressure.dql +25 -0
- package/dist/assets/templates/saas/blocks/revenue_by_segment.dql +25 -0
- package/dist/assets/templates/saas/dashboards/growth_scorecard.dql +25 -0
- package/dist/assets/templates/saas/data/cohorts.csv +7 -0
- package/dist/assets/templates/saas/data/subscriptions.csv +13 -0
- package/dist/assets/templates/saas/dql.config.json +13 -0
- package/dist/assets/templates/saas/semantic-layer/metrics/mrr.yaml +4 -0
- package/dist/assets/templates/saas/workbooks/.gitkeep +1 -0
- package/dist/assets/templates/starter/README.md +54 -0
- package/dist/assets/templates/starter/blocks/revenue_by_segment.dql +29 -0
- package/dist/assets/templates/starter/blocks/revenue_trend_query_only.dql +20 -0
- package/dist/assets/templates/starter/dashboards/.gitkeep +1 -0
- package/dist/assets/templates/starter/data/revenue.csv +13 -0
- package/dist/assets/templates/starter/dql.config.json +13 -0
- package/dist/assets/templates/starter/semantic-layer/blocks/revenue_by_segment.yaml +11 -0
- package/dist/assets/templates/starter/semantic-layer/dimensions/segment_tier.yaml +6 -0
- package/dist/assets/templates/starter/semantic-layer/hierarchies/revenue_time.yaml +12 -0
- package/dist/assets/templates/starter/semantic-layer/metrics/revenue.yaml +7 -0
- package/dist/assets/templates/starter/workbooks/.gitkeep +1 -0
- package/dist/assets/templates/taxi/README.md +19 -0
- package/dist/assets/templates/taxi/blocks/airport_mix.dql +25 -0
- package/dist/assets/templates/taxi/blocks/revenue_by_segment.dql +24 -0
- package/dist/assets/templates/taxi/dashboards/city_operations.dql +25 -0
- package/dist/assets/templates/taxi/data/trips.csv +13 -0
- package/dist/assets/templates/taxi/dql.config.json +13 -0
- package/dist/assets/templates/taxi/semantic-layer/.gitkeep +1 -0
- package/dist/assets/templates/taxi/workbooks/.gitkeep +1 -0
- package/dist/commands/build.d.ts +3 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +41 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/build.test.d.ts +2 -0
- package/dist/commands/build.test.d.ts.map +1 -0
- package/dist/commands/build.test.js +42 -0
- package/dist/commands/build.test.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +127 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/doctor.test.d.ts +2 -0
- package/dist/commands/doctor.test.d.ts.map +1 -0
- package/dist/commands/doctor.test.js +41 -0
- package/dist/commands/doctor.test.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +117 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/init.test.d.ts +2 -0
- package/dist/commands/init.test.d.ts.map +1 -0
- package/dist/commands/init.test.js +38 -0
- package/dist/commands/init.test.js.map +1 -0
- package/dist/commands/migrate.js +4 -4
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/new.d.ts +3 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +405 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/new.test.d.ts +2 -0
- package/dist/commands/new.test.d.ts.map +1 -0
- package/dist/commands/new.test.js +177 -0
- package/dist/commands/new.test.js.map +1 -0
- package/dist/commands/notebook.d.ts +3 -0
- package/dist/commands/notebook.d.ts.map +1 -0
- package/dist/commands/notebook.js +31 -0
- package/dist/commands/notebook.js.map +1 -0
- package/dist/commands/preview.d.ts +3 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +42 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/serve.d.ts +3 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +30 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/index.js +46 -2
- package/dist/index.js.map +1 -1
- package/dist/local-runtime.d.ts +25 -0
- package/dist/local-runtime.d.ts.map +1 -0
- package/dist/local-runtime.js +302 -0
- package/dist/local-runtime.js.map +1 -0
- package/dist/local-runtime.test.d.ts +2 -0
- package/dist/local-runtime.test.d.ts.map +1 -0
- package/dist/local-runtime.test.js +21 -0
- package/dist/local-runtime.test.js.map +1 -0
- package/dist/open-browser.d.ts +2 -0
- package/dist/open-browser.d.ts.map +1 -0
- package/dist/open-browser.js +29 -0
- package/dist/open-browser.js.map +1 -0
- package/package.json +8 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.test.d.ts","sourceRoot":"","sources":["../../src/commands/new.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { existsSync, mkdtempSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { runInit } from './init.js';
|
|
6
|
+
import { runNew } from './new.js';
|
|
7
|
+
describe('runNew', () => {
|
|
8
|
+
it('creates a previewable block inside a starter project', async () => {
|
|
9
|
+
const originalCwd = process.cwd();
|
|
10
|
+
const targetDir = mkdtempSync(join(tmpdir(), 'dql-new-'));
|
|
11
|
+
const projectDir = join(targetDir, 'demo-project');
|
|
12
|
+
await runInit(projectDir, {
|
|
13
|
+
check: false,
|
|
14
|
+
chart: '',
|
|
15
|
+
domain: '',
|
|
16
|
+
format: 'json',
|
|
17
|
+
help: false,
|
|
18
|
+
open: null,
|
|
19
|
+
input: '',
|
|
20
|
+
outDir: '',
|
|
21
|
+
owner: '',
|
|
22
|
+
port: null,
|
|
23
|
+
queryOnly: false,
|
|
24
|
+
template: 'starter',
|
|
25
|
+
verbose: false,
|
|
26
|
+
});
|
|
27
|
+
try {
|
|
28
|
+
process.chdir(projectDir);
|
|
29
|
+
await runNew('block', ['Pipeline Health'], {
|
|
30
|
+
check: false,
|
|
31
|
+
chart: 'bar',
|
|
32
|
+
domain: 'sales',
|
|
33
|
+
format: 'json',
|
|
34
|
+
help: false,
|
|
35
|
+
open: null,
|
|
36
|
+
input: '',
|
|
37
|
+
outDir: '',
|
|
38
|
+
owner: 'tester',
|
|
39
|
+
port: null,
|
|
40
|
+
queryOnly: false,
|
|
41
|
+
template: 'starter',
|
|
42
|
+
verbose: false,
|
|
43
|
+
});
|
|
44
|
+
const blockPath = join(projectDir, 'blocks', 'pipeline_health.dql');
|
|
45
|
+
expect(existsSync(blockPath)).toBe(true);
|
|
46
|
+
const block = readFileSync(blockPath, 'utf-8');
|
|
47
|
+
expect(block).toContain('block "Pipeline Health"');
|
|
48
|
+
expect(block).toContain('domain = "sales"');
|
|
49
|
+
expect(block).toContain('owner = "tester"');
|
|
50
|
+
expect(block).toContain("read_csv_auto('./data/revenue.csv')");
|
|
51
|
+
expect(block).toContain('chart = "bar"');
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
process.chdir(originalCwd);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
it('creates dashboard and workbook scaffolds in their default folders', async () => {
|
|
58
|
+
const originalCwd = process.cwd();
|
|
59
|
+
const targetDir = mkdtempSync(join(tmpdir(), 'dql-new-multi-'));
|
|
60
|
+
const projectDir = join(targetDir, 'demo-project');
|
|
61
|
+
await runInit(projectDir, {
|
|
62
|
+
check: false,
|
|
63
|
+
chart: '',
|
|
64
|
+
domain: '',
|
|
65
|
+
format: 'json',
|
|
66
|
+
help: false,
|
|
67
|
+
open: null,
|
|
68
|
+
input: '',
|
|
69
|
+
outDir: '',
|
|
70
|
+
owner: '',
|
|
71
|
+
port: null,
|
|
72
|
+
queryOnly: false,
|
|
73
|
+
template: 'starter',
|
|
74
|
+
verbose: false,
|
|
75
|
+
});
|
|
76
|
+
try {
|
|
77
|
+
process.chdir(projectDir);
|
|
78
|
+
await runNew('dashboard', ['Revenue Overview'], {
|
|
79
|
+
check: false,
|
|
80
|
+
chart: 'line',
|
|
81
|
+
domain: 'finance',
|
|
82
|
+
format: 'json',
|
|
83
|
+
help: false,
|
|
84
|
+
open: null,
|
|
85
|
+
input: '',
|
|
86
|
+
outDir: '',
|
|
87
|
+
owner: 'tester',
|
|
88
|
+
port: null,
|
|
89
|
+
queryOnly: false,
|
|
90
|
+
template: 'starter',
|
|
91
|
+
verbose: false,
|
|
92
|
+
});
|
|
93
|
+
await runNew('workbook', ['Quarterly Review'], {
|
|
94
|
+
check: false,
|
|
95
|
+
chart: 'bar',
|
|
96
|
+
domain: 'finance',
|
|
97
|
+
format: 'json',
|
|
98
|
+
help: false,
|
|
99
|
+
open: null,
|
|
100
|
+
input: '',
|
|
101
|
+
outDir: '',
|
|
102
|
+
owner: 'tester',
|
|
103
|
+
port: null,
|
|
104
|
+
queryOnly: false,
|
|
105
|
+
template: 'starter',
|
|
106
|
+
verbose: false,
|
|
107
|
+
});
|
|
108
|
+
const dashboardPath = join(projectDir, 'dashboards', 'revenue_overview.dql');
|
|
109
|
+
const workbookPath = join(projectDir, 'workbooks', 'quarterly_review.dql');
|
|
110
|
+
expect(existsSync(dashboardPath)).toBe(true);
|
|
111
|
+
expect(existsSync(workbookPath)).toBe(true);
|
|
112
|
+
const dashboard = readFileSync(dashboardPath, 'utf-8');
|
|
113
|
+
const workbook = readFileSync(workbookPath, 'utf-8');
|
|
114
|
+
expect(dashboard).toContain('dashboard "Revenue Overview"');
|
|
115
|
+
expect(dashboard).toContain('chart.line(');
|
|
116
|
+
expect(workbook).toContain('workbook "Quarterly Review"');
|
|
117
|
+
expect(workbook).toContain('page "Summary"');
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
process.chdir(originalCwd);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
it('creates a semantic block plus companion semantic-layer files', async () => {
|
|
124
|
+
const originalCwd = process.cwd();
|
|
125
|
+
const targetDir = mkdtempSync(join(tmpdir(), 'dql-new-semantic-'));
|
|
126
|
+
const projectDir = join(targetDir, 'demo-project');
|
|
127
|
+
await runInit(projectDir, {
|
|
128
|
+
check: false,
|
|
129
|
+
chart: '',
|
|
130
|
+
domain: '',
|
|
131
|
+
format: 'json',
|
|
132
|
+
help: false,
|
|
133
|
+
open: null,
|
|
134
|
+
input: '',
|
|
135
|
+
outDir: '',
|
|
136
|
+
owner: '',
|
|
137
|
+
port: null,
|
|
138
|
+
queryOnly: false,
|
|
139
|
+
template: 'starter',
|
|
140
|
+
verbose: false,
|
|
141
|
+
});
|
|
142
|
+
try {
|
|
143
|
+
process.chdir(projectDir);
|
|
144
|
+
await runNew('semantic-block', ['ARR Growth'], {
|
|
145
|
+
check: false,
|
|
146
|
+
chart: 'bar',
|
|
147
|
+
domain: 'finance',
|
|
148
|
+
format: 'json',
|
|
149
|
+
help: false,
|
|
150
|
+
open: null,
|
|
151
|
+
input: '',
|
|
152
|
+
outDir: '',
|
|
153
|
+
owner: 'tester',
|
|
154
|
+
port: null,
|
|
155
|
+
queryOnly: false,
|
|
156
|
+
template: 'starter',
|
|
157
|
+
verbose: false,
|
|
158
|
+
});
|
|
159
|
+
const blockPath = join(projectDir, 'blocks', 'arr_growth.dql');
|
|
160
|
+
const metricPath = join(projectDir, 'semantic-layer', 'metrics', 'arr_growth_metric.yaml');
|
|
161
|
+
const companionPath = join(projectDir, 'semantic-layer', 'blocks', 'arr_growth.yaml');
|
|
162
|
+
expect(existsSync(blockPath)).toBe(true);
|
|
163
|
+
expect(existsSync(metricPath)).toBe(true);
|
|
164
|
+
expect(existsSync(companionPath)).toBe(true);
|
|
165
|
+
const block = readFileSync(blockPath, 'utf-8');
|
|
166
|
+
const metric = readFileSync(metricPath, 'utf-8');
|
|
167
|
+
expect(block).toContain('type = "semantic"');
|
|
168
|
+
expect(block).toContain('metric = "arr_growth_metric"');
|
|
169
|
+
expect(metric).toContain('name: arr_growth_metric');
|
|
170
|
+
expect(metric).toContain('domain: finance');
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
process.chdir(originalCwd);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=new.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.test.js","sourceRoot":"","sources":["../../src/commands/new.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook.d.ts","sourceRoot":"","sources":["../../src/commands/notebook.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAc3C,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB1F"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { QueryExecutor } from '@duckcodeailabs/dql-connectors';
|
|
5
|
+
import { assertLocalQueryRuntimeReady, findProjectRoot, loadProjectConfig, startLocalServer, } from '../local-runtime.js';
|
|
6
|
+
import { maybeOpenBrowser } from '../open-browser.js';
|
|
7
|
+
const COMMAND_DIR = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const PACKAGED_NOTEBOOK_APP_DIR = resolve(COMMAND_DIR, '../assets/notebook-browser');
|
|
9
|
+
const REPO_NOTEBOOK_APP_DIR = resolve(COMMAND_DIR, '../../../../apps/notebook-browser');
|
|
10
|
+
const NOTEBOOK_APP_DIR = existsSync(PACKAGED_NOTEBOOK_APP_DIR) ? PACKAGED_NOTEBOOK_APP_DIR : REPO_NOTEBOOK_APP_DIR;
|
|
11
|
+
export async function runNotebook(targetArg, flags) {
|
|
12
|
+
const baseDir = resolve(targetArg ?? '.');
|
|
13
|
+
const projectRoot = findProjectRoot(baseDir);
|
|
14
|
+
const config = loadProjectConfig(projectRoot);
|
|
15
|
+
const executor = new QueryExecutor();
|
|
16
|
+
const connection = config.defaultConnection ?? { driver: 'file', filepath: ':memory:' };
|
|
17
|
+
await assertLocalQueryRuntimeReady(executor, connection);
|
|
18
|
+
const port = await startLocalServer({
|
|
19
|
+
rootDir: NOTEBOOK_APP_DIR,
|
|
20
|
+
projectRoot,
|
|
21
|
+
executor,
|
|
22
|
+
connection,
|
|
23
|
+
preferredPort: flags.port ?? config.preview?.port ?? 3474,
|
|
24
|
+
});
|
|
25
|
+
const url = `http://127.0.0.1:${port}`;
|
|
26
|
+
maybeOpenBrowser(url, flags.open ?? config.preview?.open ?? true);
|
|
27
|
+
console.log(`\n ✓ Notebook ready: ${url}`);
|
|
28
|
+
console.log(' Press Ctrl+C to stop.');
|
|
29
|
+
console.log('');
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=notebook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook.js","sourceRoot":"","sources":["../../src/commands/notebook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EACL,4BAA4B,EAC5B,eAAe,EACf,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,MAAM,yBAAyB,GAAG,OAAO,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;AACrF,MAAM,qBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,mCAAmC,CAAC,CAAC;AACxF,MAAM,gBAAgB,GAAG,UAAU,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,qBAAqB,CAAC;AAEnH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAwB,EAAE,KAAe;IACzE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,IAAI,EAAE,MAAM,EAAE,MAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAEjG,MAAM,4BAA4B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAEzD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC;QAClC,OAAO,EAAE,gBAAgB;QACzB,WAAW;QACX,QAAQ;QACR,UAAU;QACV,aAAa,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI;KAC1D,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAC;IACvC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCjF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { dirname, join, resolve } from 'node:path';
|
|
4
|
+
import { compile, writeBundle } from '@duckcodeailabs/dql-compiler';
|
|
5
|
+
import { QueryExecutor } from '@duckcodeailabs/dql-connectors';
|
|
6
|
+
import { assertLocalQueryRuntimeReady, findProjectRoot, loadProjectConfig, startLocalServer } from '../local-runtime.js';
|
|
7
|
+
import { maybeOpenBrowser } from '../open-browser.js';
|
|
8
|
+
export async function runPreview(filePath, flags) {
|
|
9
|
+
const absoluteFile = resolve(filePath);
|
|
10
|
+
const projectRoot = findProjectRoot(dirname(absoluteFile));
|
|
11
|
+
const config = loadProjectConfig(projectRoot);
|
|
12
|
+
const source = readFileSync(absoluteFile, 'utf-8');
|
|
13
|
+
const result = compile(source, {
|
|
14
|
+
file: absoluteFile,
|
|
15
|
+
theme: config.preview?.theme ?? 'light',
|
|
16
|
+
});
|
|
17
|
+
if (result.errors.length > 0) {
|
|
18
|
+
throw new Error(`Preview compilation failed:\n${result.errors.map((e) => `- ${e}`).join('\n')}`);
|
|
19
|
+
}
|
|
20
|
+
if (result.dashboards.length === 0) {
|
|
21
|
+
throw new Error('Preview requires a charted block, dashboard, or workbook that compiles to HTML output.');
|
|
22
|
+
}
|
|
23
|
+
const previewDir = join(tmpdir(), 'dql-preview', `${Date.now()}`);
|
|
24
|
+
mkdirSync(previewDir, { recursive: true });
|
|
25
|
+
writeBundle(result.dashboards[0], previewDir);
|
|
26
|
+
const executor = new QueryExecutor();
|
|
27
|
+
const connection = config.defaultConnection ?? { driver: 'file', filepath: ':memory:' };
|
|
28
|
+
process.chdir(projectRoot);
|
|
29
|
+
await assertLocalQueryRuntimeReady(executor, connection);
|
|
30
|
+
const port = await startLocalServer({
|
|
31
|
+
rootDir: previewDir,
|
|
32
|
+
executor,
|
|
33
|
+
connection,
|
|
34
|
+
preferredPort: flags.port ?? config.preview?.port ?? 3474,
|
|
35
|
+
});
|
|
36
|
+
const url = `http://127.0.0.1:${port}`;
|
|
37
|
+
maybeOpenBrowser(url, flags.open ?? config.preview?.open ?? true);
|
|
38
|
+
console.log(`\n ✓ Preview ready: ${url}`);
|
|
39
|
+
console.log(' Press Ctrl+C to stop.');
|
|
40
|
+
console.log('');
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,4BAA4B,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,KAAe;IAChE,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE;QAC7B,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,OAAO;KACxC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;IAC5G,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAClE,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IACxF,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3B,MAAM,4BAA4B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC;QAClC,OAAO,EAAE,UAAU;QACnB,QAAQ;QACR,UAAU;QACV,aAAa,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI;KAC1D,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAC;IACvC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,wBAAsB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBvF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { QueryExecutor } from '@duckcodeailabs/dql-connectors';
|
|
4
|
+
import { assertLocalQueryRuntimeReady, findProjectRoot, loadProjectConfig, startLocalServer } from '../local-runtime.js';
|
|
5
|
+
import { maybeOpenBrowser } from '../open-browser.js';
|
|
6
|
+
export async function runServe(targetDir, flags) {
|
|
7
|
+
const rootDir = resolve(targetDir || 'dist');
|
|
8
|
+
if (!existsSync(join(rootDir, 'index.html'))) {
|
|
9
|
+
throw new Error(`No built DQL bundle found at ${rootDir}. Run "dql build <file.dql>" first or pass a directory containing index.html.`);
|
|
10
|
+
}
|
|
11
|
+
const projectRoot = findProjectRoot(rootDir);
|
|
12
|
+
const config = loadProjectConfig(projectRoot);
|
|
13
|
+
const executor = new QueryExecutor();
|
|
14
|
+
const connection = config.defaultConnection ?? { driver: 'file', filepath: ':memory:' };
|
|
15
|
+
process.chdir(projectRoot);
|
|
16
|
+
await assertLocalQueryRuntimeReady(executor, connection);
|
|
17
|
+
const port = await startLocalServer({
|
|
18
|
+
rootDir,
|
|
19
|
+
executor,
|
|
20
|
+
connection,
|
|
21
|
+
preferredPort: flags.port ?? config.preview?.port ?? 3474,
|
|
22
|
+
});
|
|
23
|
+
const url = `http://127.0.0.1:${port}`;
|
|
24
|
+
maybeOpenBrowser(url, flags.open ?? config.preview?.open ?? true);
|
|
25
|
+
console.log(`\n ✓ Serving DQL bundle: ${url}`);
|
|
26
|
+
console.log(` Root: ${rootDir}`);
|
|
27
|
+
console.log(' Press Ctrl+C to stop.');
|
|
28
|
+
console.log('');
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,4BAA4B,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,SAAwB,EAAE,KAAe;IACtE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,+EAA+E,CAAC,CAAC;IAC1I,CAAC;IACD,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,IAAI,EAAE,MAAM,EAAE,MAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAEjG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3B,MAAM,4BAA4B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC;QAClC,OAAO;QACP,QAAQ;QACR,UAAU;QACV,aAAa,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI;KAC1D,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAC;IACvC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,44 +1,85 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { parseArgs } from './args.js';
|
|
3
|
+
import { runInit } from './commands/init.js';
|
|
4
|
+
import { runNew } from './commands/new.js';
|
|
5
|
+
import { runBuild } from './commands/build.js';
|
|
6
|
+
import { runDoctor } from './commands/doctor.js';
|
|
7
|
+
import { runPreview } from './commands/preview.js';
|
|
8
|
+
import { runServe } from './commands/serve.js';
|
|
3
9
|
import { runParse } from './commands/parse.js';
|
|
4
10
|
import { runTest } from './commands/test.js';
|
|
5
11
|
import { runCertify } from './commands/certify.js';
|
|
6
12
|
import { runInfo } from './commands/info.js';
|
|
7
13
|
import { runMigrate } from './commands/migrate.js';
|
|
8
14
|
import { runFmt } from './commands/fmt.js';
|
|
15
|
+
import { runNotebook } from './commands/notebook.js';
|
|
9
16
|
const HELP = `
|
|
10
17
|
dql — DQL CLI
|
|
11
18
|
|
|
12
19
|
Usage:
|
|
20
|
+
dql init [directory] Scaffold a local DQL project
|
|
21
|
+
dql new <type> <name> Create a new block, semantic block, dashboard, or workbook
|
|
22
|
+
dql build <file.dql> Compile a DQL file to a static HTML bundle
|
|
23
|
+
dql doctor [path] Run local setup checks for a DQL project
|
|
24
|
+
dql preview <file.dql> Render a local browser preview for a DQL file
|
|
25
|
+
dql serve [directory] Serve a built DQL bundle locally
|
|
13
26
|
dql parse <file.dql> Parse and analyze a DQL file
|
|
14
27
|
dql test <file.dql> Inspect block tests
|
|
15
28
|
dql certify <file.dql> Evaluate certification rules
|
|
16
29
|
dql info <file.dql> Show block metadata
|
|
17
30
|
dql migrate <source> Scaffold migration from looker/tableau/dbt/metabase/raw-sql
|
|
18
31
|
dql fmt <file.dql> Format DQL file in place
|
|
32
|
+
dql notebook [path] Launch the browser-first notebook for a project
|
|
19
33
|
dql --help Show this help
|
|
20
34
|
|
|
21
35
|
Options:
|
|
22
36
|
--format json|text Output format (default: text)
|
|
23
37
|
--verbose Show detailed output
|
|
38
|
+
--open Open the preview or served bundle in a browser
|
|
39
|
+
--no-open Do not open the browser automatically
|
|
24
40
|
--check For "fmt": check-only and exit 1 if changes needed
|
|
25
41
|
--input <path> Source path for scaffold-style migration commands
|
|
42
|
+
--out-dir <path> Output directory for "build"
|
|
43
|
+
--port <number> Preferred local port for "preview" or "serve"
|
|
44
|
+
--chart <type> Primary chart type for "new" scaffolds (default: bar)
|
|
45
|
+
--domain <name> Domain for new block scaffolds (default: general)
|
|
46
|
+
--owner <name> Owner for new block scaffolds (default: current user)
|
|
47
|
+
--query-only Create a query-only block without visualization
|
|
48
|
+
--template <name> Template to use for "init" (default: starter)
|
|
26
49
|
`;
|
|
27
50
|
async function main() {
|
|
28
|
-
const { command, file, flags } = parseArgs(process.argv.slice(2));
|
|
51
|
+
const { command, file, rest, flags } = parseArgs(process.argv.slice(2));
|
|
29
52
|
if (flags.help || !command) {
|
|
30
53
|
console.log(HELP.trim());
|
|
31
54
|
process.exit(0);
|
|
32
55
|
}
|
|
33
|
-
if (!file) {
|
|
56
|
+
if (!file && command !== 'init' && command !== 'serve' && command !== 'doctor' && command !== 'notebook') {
|
|
34
57
|
console.error('Error: No file/argument specified. Run "dql --help" for usage.');
|
|
35
58
|
process.exit(1);
|
|
36
59
|
}
|
|
37
60
|
try {
|
|
38
61
|
switch (command) {
|
|
62
|
+
case 'init':
|
|
63
|
+
await runInit(file, flags);
|
|
64
|
+
break;
|
|
65
|
+
case 'new':
|
|
66
|
+
await runNew(file, rest, flags);
|
|
67
|
+
break;
|
|
68
|
+
case 'build':
|
|
69
|
+
await runBuild(file, flags);
|
|
70
|
+
break;
|
|
71
|
+
case 'doctor':
|
|
72
|
+
await runDoctor(file, flags);
|
|
73
|
+
break;
|
|
39
74
|
case 'parse':
|
|
40
75
|
await runParse(file, flags);
|
|
41
76
|
break;
|
|
77
|
+
case 'preview':
|
|
78
|
+
await runPreview(file, flags);
|
|
79
|
+
break;
|
|
80
|
+
case 'serve':
|
|
81
|
+
await runServe(file, flags);
|
|
82
|
+
break;
|
|
42
83
|
case 'test':
|
|
43
84
|
await runTest(file, flags);
|
|
44
85
|
break;
|
|
@@ -54,6 +95,9 @@ async function main() {
|
|
|
54
95
|
case 'fmt':
|
|
55
96
|
await runFmt(file, flags);
|
|
56
97
|
break;
|
|
98
|
+
case 'notebook':
|
|
99
|
+
await runNotebook(file, flags);
|
|
100
|
+
break;
|
|
57
101
|
default:
|
|
58
102
|
console.error(`Unknown command: ${command}. Run "dql --help" for usage.`);
|
|
59
103
|
process.exit(1);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { QueryExecutor, type ConnectionConfig } from '@duckcodeailabs/dql-connectors';
|
|
2
|
+
export interface ProjectConfig {
|
|
3
|
+
project?: string;
|
|
4
|
+
defaultConnection?: ConnectionConfig;
|
|
5
|
+
dataDir?: string;
|
|
6
|
+
preview?: {
|
|
7
|
+
port?: number;
|
|
8
|
+
theme?: string;
|
|
9
|
+
open?: boolean;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export interface LocalServerOptions {
|
|
13
|
+
rootDir: string;
|
|
14
|
+
projectRoot?: string;
|
|
15
|
+
executor: QueryExecutor;
|
|
16
|
+
connection: ConnectionConfig;
|
|
17
|
+
preferredPort: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function startLocalServer(opts: LocalServerOptions): Promise<number>;
|
|
20
|
+
export declare function assertLocalQueryRuntimeReady(executor: QueryExecutor, connection: ConnectionConfig): Promise<void>;
|
|
21
|
+
export declare function formatLocalQueryRuntimeError(connection: ConnectionConfig, error: unknown): string;
|
|
22
|
+
export declare function serializeJSON(value: unknown): string;
|
|
23
|
+
export declare function findProjectRoot(startDir: string): string;
|
|
24
|
+
export declare function loadProjectConfig(projectRoot: string): ProjectConfig;
|
|
25
|
+
//# sourceMappingURL=local-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-runtime.d.ts","sourceRoot":"","sources":["../src/local-runtime.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAStF,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,gBAAgB,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;IACxB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqJhF;AAED,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,gBAAgB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE,OAAO,GACb,MAAM,CAaR;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQpD;AA8BD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYxD;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAOpE"}
|