@duckcodeailabs/dql-cli 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +62 -0
  2. package/dist/args.d.ts +9 -0
  3. package/dist/args.d.ts.map +1 -1
  4. package/dist/args.js +43 -1
  5. package/dist/args.js.map +1 -1
  6. package/dist/args.test.d.ts +2 -0
  7. package/dist/args.test.d.ts.map +1 -0
  8. package/dist/args.test.js +33 -0
  9. package/dist/args.test.js.map +1 -0
  10. package/dist/commands/build.d.ts +3 -0
  11. package/dist/commands/build.d.ts.map +1 -0
  12. package/dist/commands/build.js +41 -0
  13. package/dist/commands/build.js.map +1 -0
  14. package/dist/commands/build.test.d.ts +2 -0
  15. package/dist/commands/build.test.d.ts.map +1 -0
  16. package/dist/commands/build.test.js +42 -0
  17. package/dist/commands/build.test.js.map +1 -0
  18. package/dist/commands/doctor.d.ts +3 -0
  19. package/dist/commands/doctor.d.ts.map +1 -0
  20. package/dist/commands/doctor.js +127 -0
  21. package/dist/commands/doctor.js.map +1 -0
  22. package/dist/commands/doctor.test.d.ts +2 -0
  23. package/dist/commands/doctor.test.d.ts.map +1 -0
  24. package/dist/commands/doctor.test.js +41 -0
  25. package/dist/commands/doctor.test.js.map +1 -0
  26. package/dist/commands/init.d.ts +3 -0
  27. package/dist/commands/init.d.ts.map +1 -0
  28. package/dist/commands/init.js +115 -0
  29. package/dist/commands/init.js.map +1 -0
  30. package/dist/commands/init.test.d.ts +2 -0
  31. package/dist/commands/init.test.d.ts.map +1 -0
  32. package/dist/commands/init.test.js +38 -0
  33. package/dist/commands/init.test.js.map +1 -0
  34. package/dist/commands/migrate.js +4 -4
  35. package/dist/commands/migrate.js.map +1 -1
  36. package/dist/commands/new.d.ts +3 -0
  37. package/dist/commands/new.d.ts.map +1 -0
  38. package/dist/commands/new.js +405 -0
  39. package/dist/commands/new.js.map +1 -0
  40. package/dist/commands/new.test.d.ts +2 -0
  41. package/dist/commands/new.test.d.ts.map +1 -0
  42. package/dist/commands/new.test.js +177 -0
  43. package/dist/commands/new.test.js.map +1 -0
  44. package/dist/commands/notebook.d.ts +3 -0
  45. package/dist/commands/notebook.d.ts.map +1 -0
  46. package/dist/commands/notebook.js +28 -0
  47. package/dist/commands/notebook.js.map +1 -0
  48. package/dist/commands/preview.d.ts +3 -0
  49. package/dist/commands/preview.d.ts.map +1 -0
  50. package/dist/commands/preview.js +42 -0
  51. package/dist/commands/preview.js.map +1 -0
  52. package/dist/commands/serve.d.ts +3 -0
  53. package/dist/commands/serve.d.ts.map +1 -0
  54. package/dist/commands/serve.js +30 -0
  55. package/dist/commands/serve.js.map +1 -0
  56. package/dist/index.js +46 -2
  57. package/dist/index.js.map +1 -1
  58. package/dist/local-runtime.d.ts +25 -0
  59. package/dist/local-runtime.d.ts.map +1 -0
  60. package/dist/local-runtime.js +302 -0
  61. package/dist/local-runtime.js.map +1 -0
  62. package/dist/local-runtime.test.d.ts +2 -0
  63. package/dist/local-runtime.test.d.ts.map +1 -0
  64. package/dist/local-runtime.test.js +21 -0
  65. package/dist/local-runtime.test.js.map +1 -0
  66. package/dist/open-browser.d.ts +2 -0
  67. package/dist/open-browser.d.ts.map +1 -0
  68. package/dist/open-browser.js +29 -0
  69. package/dist/open-browser.js.map +1 -0
  70. package/package.json +7 -5
package/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # `@duckcodeailabs/dql-cli`
2
+
3
+ Official command-line interface for DQL.
4
+
5
+ Use the CLI to scaffold projects, validate blocks, preview charts locally, and build static bundles without DuckCode Studio.
6
+
7
+ ## Install
8
+
9
+ For local preview with file/DuckDB-backed starter data, use Node 18, 20, or 22 LTS. If you change Node versions after installing dependencies, rerun `pnpm install` so native modules are rebuilt for the active runtime.
10
+
11
+ ```bash
12
+ npm install -g @duckcodeailabs/dql-cli
13
+ ```
14
+
15
+ Or run it without a global install:
16
+
17
+ ```bash
18
+ npx @duckcodeailabs/dql-cli --help
19
+ ```
20
+
21
+ From this repo, you can also run:
22
+
23
+ ```bash
24
+ pnpm exec dql --help
25
+ ```
26
+
27
+ ## Quick Start
28
+
29
+ These commands assume `dql` is installed globally. From a source checkout, use `pnpm exec dql` from the repo root or `../node_modules/.bin/dql` from the generated project.
30
+
31
+ ```bash
32
+ dql init my-dql-project
33
+ cd my-dql-project
34
+ dql new block "Pipeline Health"
35
+ dql new semantic-block "ARR Growth"
36
+ dql new dashboard "Revenue Overview"
37
+ dql doctor
38
+ dql preview blocks/pipeline_health.dql --open
39
+ ```
40
+
41
+ ## Core Commands
42
+
43
+ - `dql init [directory]` — create a starter DQL project
44
+ - `dql new block <name>` — scaffold a new DQL block in the current project
45
+ - `dql new semantic-block <name>` — scaffold a semantic block plus companion YAML files
46
+ - `dql new dashboard <name>` — scaffold a new dashboard in `dashboards/`
47
+ - `dql new workbook <name>` — scaffold a new workbook in `workbooks/`
48
+ - `dql doctor [path]` — check local setup, config, and starter folders
49
+ - `dql parse <file.dql>` — parse and validate a DQL block
50
+ - `dql fmt <file.dql>` — format a DQL file
51
+ - `dql test <file.dql>` — run DQL assertions
52
+ - `dql certify <file.dql>` — run certification checks
53
+ - `dql preview <file.dql>` — preview a block in the browser
54
+ - `dql build <file.dql>` — build a static bundle in `dist/`
55
+ - `dql serve [directory]` — serve a built bundle locally
56
+
57
+ ## Learn More
58
+
59
+ - Root docs: [`../../README.md`](../../README.md)
60
+ - Getting started: [`../../docs/getting-started.md`](../../docs/getting-started.md)
61
+ - CLI reference: [`../../docs/cli-reference.md`](../../docs/cli-reference.md)
62
+ - Project config: [`../../docs/project-config.md`](../../docs/project-config.md)
package/dist/args.d.ts CHANGED
@@ -3,11 +3,20 @@ export interface CLIFlags {
3
3
  verbose: boolean;
4
4
  help: boolean;
5
5
  check: boolean;
6
+ open: boolean | null;
6
7
  input: string;
8
+ outDir: string;
9
+ port: number | null;
10
+ chart: string;
11
+ domain: string;
12
+ owner: string;
13
+ queryOnly: boolean;
14
+ template: string;
7
15
  }
8
16
  export interface ParsedArgs {
9
17
  command: string | null;
10
18
  file: string | null;
19
+ rest: string[];
11
20
  flags: CLIFlags;
12
21
  }
13
22
  export declare function parseArgs(argv: string[]): ParsedArgs;
@@ -1 +1 @@
1
- {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAiCpD"}
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAiEpD"}
package/dist/args.js CHANGED
@@ -4,10 +4,19 @@ export function parseArgs(argv) {
4
4
  verbose: false,
5
5
  help: false,
6
6
  check: false,
7
+ open: null,
7
8
  input: '',
9
+ outDir: '',
10
+ port: null,
11
+ chart: '',
12
+ domain: '',
13
+ owner: '',
14
+ queryOnly: false,
15
+ template: 'starter',
8
16
  };
9
17
  let command = null;
10
18
  let file = null;
19
+ const rest = [];
11
20
  for (let i = 0; i < argv.length; i++) {
12
21
  const arg = argv[i];
13
22
  if (arg === '--help' || arg === '-h') {
@@ -16,6 +25,12 @@ export function parseArgs(argv) {
16
25
  else if (arg === '--verbose' || arg === '-v') {
17
26
  flags.verbose = true;
18
27
  }
28
+ else if (arg === '--open') {
29
+ flags.open = true;
30
+ }
31
+ else if (arg === '--no-open') {
32
+ flags.open = false;
33
+ }
19
34
  else if (arg === '--check') {
20
35
  flags.check = true;
21
36
  }
@@ -27,13 +42,40 @@ export function parseArgs(argv) {
27
42
  else if (arg === '--input' && i + 1 < argv.length) {
28
43
  flags.input = argv[++i];
29
44
  }
45
+ else if (arg === '--out-dir' && i + 1 < argv.length) {
46
+ flags.outDir = argv[++i];
47
+ }
48
+ else if (arg === '--port' && i + 1 < argv.length) {
49
+ const value = Number(argv[++i]);
50
+ if (Number.isFinite(value) && value > 0) {
51
+ flags.port = value;
52
+ }
53
+ }
54
+ else if (arg === '--chart' && i + 1 < argv.length) {
55
+ flags.chart = argv[++i];
56
+ }
57
+ else if (arg === '--domain' && i + 1 < argv.length) {
58
+ flags.domain = argv[++i];
59
+ }
60
+ else if (arg === '--owner' && i + 1 < argv.length) {
61
+ flags.owner = argv[++i];
62
+ }
63
+ else if (arg === '--template' && i + 1 < argv.length) {
64
+ flags.template = argv[++i];
65
+ }
66
+ else if (arg === '--query-only') {
67
+ flags.queryOnly = true;
68
+ }
30
69
  else if (!command) {
31
70
  command = arg;
32
71
  }
33
72
  else if (!file) {
34
73
  file = arg;
35
74
  }
75
+ else {
76
+ rest.push(arg);
77
+ }
36
78
  }
37
- return { command, file, flags };
79
+ return { command, file, rest, flags };
38
80
  }
39
81
  //# sourceMappingURL=args.js.map
package/dist/args.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,KAAK,GAAa;QACtB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,EAAE;KACV,CAAC;IAEF,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,IAAI,GAAkB,IAAI,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QACpB,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC/C,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC7B,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM;gBAAE,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;QAC3D,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACpD,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,GAAG,GAAG,CAAC;QAChB,CAAC;aAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,GAAG,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=args.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.test.d.ts","sourceRoot":"","sources":["../src/args.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { parseArgs } from './args.js';
3
+ describe('parseArgs', () => {
4
+ it('parses open and no-open flags plus port and out-dir', () => {
5
+ const parsed = parseArgs(['preview', 'blocks/demo.dql', '--open', '--port', '4488', '--out-dir', 'out']);
6
+ expect(parsed.command).toBe('preview');
7
+ expect(parsed.file).toBe('blocks/demo.dql');
8
+ expect(parsed.flags.open).toBe(true);
9
+ expect(parsed.flags.port).toBe(4488);
10
+ expect(parsed.flags.outDir).toBe('out');
11
+ });
12
+ it('collects extra positionals and new-block flags', () => {
13
+ const parsed = parseArgs(['new', 'block', 'Revenue', 'by', 'Segment', '--chart', 'line', '--domain', 'finance', '--owner', 'demo', '--query-only']);
14
+ expect(parsed.command).toBe('new');
15
+ expect(parsed.file).toBe('block');
16
+ expect(parsed.rest).toEqual(['Revenue', 'by', 'Segment']);
17
+ expect(parsed.flags.chart).toBe('line');
18
+ expect(parsed.flags.domain).toBe('finance');
19
+ expect(parsed.flags.owner).toBe('demo');
20
+ expect(parsed.flags.queryOnly).toBe(true);
21
+ });
22
+ it('lets no-open override browser launching', () => {
23
+ const parsed = parseArgs(['serve', 'dist/demo', '--open', '--no-open']);
24
+ expect(parsed.flags.open).toBe(false);
25
+ });
26
+ it('parses notebook init template selection', () => {
27
+ const parsed = parseArgs(['init', 'demo', '--template', 'ecommerce']);
28
+ expect(parsed.command).toBe('init');
29
+ expect(parsed.file).toBe('demo');
30
+ expect(parsed.flags.template).toBe('ecommerce');
31
+ });
32
+ });
33
+ //# sourceMappingURL=args.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.test.js","sourceRoot":"","sources":["../src/args.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CLIFlags } from '../args.js';
2
+ export declare function runBuild(filePath: string, flags: CLIFlags): Promise<void>;
3
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC/E"}
@@ -0,0 +1,41 @@
1
+ import { mkdirSync, readFileSync } from 'node:fs';
2
+ import { basename, dirname, extname, join, resolve } from 'node:path';
3
+ import { compile, writeBundle } from '@duckcodeailabs/dql-compiler';
4
+ import { findProjectRoot, loadProjectConfig } from '../local-runtime.js';
5
+ export async function runBuild(filePath, flags) {
6
+ const absoluteFile = resolve(filePath);
7
+ const projectRoot = findProjectRoot(dirname(absoluteFile));
8
+ const config = loadProjectConfig(projectRoot);
9
+ const source = readFileSync(absoluteFile, 'utf-8');
10
+ const result = compile(source, {
11
+ file: absoluteFile,
12
+ theme: config.preview?.theme ?? 'light',
13
+ });
14
+ if (result.errors.length > 0) {
15
+ throw new Error(`Build failed:\n${result.errors.map((e) => `- ${e}`).join('\n')}`);
16
+ }
17
+ if (result.dashboards.length === 0) {
18
+ throw new Error('Build requires a charted block, dashboard, or workbook that compiles to HTML output.');
19
+ }
20
+ const name = basename(absoluteFile, extname(absoluteFile));
21
+ const outDir = resolve(flags.outDir || join(projectRoot, 'dist', name));
22
+ mkdirSync(outDir, { recursive: true });
23
+ writeBundle(result.dashboards[0], outDir);
24
+ if (flags.format === 'json') {
25
+ console.log(JSON.stringify({
26
+ source: absoluteFile,
27
+ outDir,
28
+ built: true,
29
+ files: ['index.html', 'dql-metadata.json', 'specs/'],
30
+ }, null, 2));
31
+ return;
32
+ }
33
+ console.log(`\n ✓ Built DQL bundle`);
34
+ console.log(` Source: ${absoluteFile}`);
35
+ console.log(` Output: ${outDir}`);
36
+ console.log('');
37
+ console.log(' Next step:');
38
+ console.log(` dql serve ${outDir}`);
39
+ console.log('');
40
+ }
41
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB,EAAE,KAAe;IAC9D,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,kBAAkB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IACxE,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAE1C,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,MAAM,EAAE,YAAY;YACpB,MAAM;YACN,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,CAAC,YAAY,EAAE,mBAAmB,EAAE,QAAQ,CAAC;SACrD,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACb,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,eAAe,YAAY,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=build.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.test.d.ts","sourceRoot":"","sources":["../../src/commands/build.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ import { mkdtempSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { tmpdir } from 'node:os';
4
+ import { describe, expect, it } from 'vitest';
5
+ import { runBuild } from './build.js';
6
+ describe('runBuild', () => {
7
+ it('writes an HTML bundle and metadata for a standalone block', async () => {
8
+ const projectDir = mkdtempSync(join(tmpdir(), 'dql-build-'));
9
+ const sourcePath = join(projectDir, 'sample.dql');
10
+ const outDir = join(projectDir, 'out');
11
+ writeFileSync(sourcePath, `block "Revenue Preview" {
12
+ domain = "revenue"
13
+ type = "custom"
14
+ query = """
15
+ SELECT 'Enterprise' AS segment, 100 AS revenue
16
+ """
17
+ visualization {
18
+ chart = "bar"
19
+ x = segment
20
+ y = revenue
21
+ }
22
+ }`);
23
+ await runBuild(sourcePath, {
24
+ check: false,
25
+ chart: '',
26
+ domain: '',
27
+ format: 'json',
28
+ help: false,
29
+ open: null,
30
+ input: '',
31
+ outDir,
32
+ owner: '',
33
+ port: null,
34
+ queryOnly: false,
35
+ template: 'starter',
36
+ verbose: false,
37
+ });
38
+ expect(readFileSync(join(outDir, 'index.html'), 'utf-8')).toContain('Revenue Preview');
39
+ expect(readFileSync(join(outDir, 'dql-metadata.json'), 'utf-8')).toContain('Revenue Preview');
40
+ });
41
+ });
42
+ //# sourceMappingURL=build.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.test.js","sourceRoot":"","sources":["../../src/commands/build.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAEvC,aAAa,CAAC,UAAU,EAAE;;;;;;;;;;;EAW5B,CAAC,CAAC;QAEA,MAAM,QAAQ,CAAC,UAAU,EAAE;YACzB,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,EAAE;YACT,MAAM;YACN,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACvF,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CLIFlags } from '../args.js';
2
+ export declare function runDoctor(targetPath: string | null, flags: CLIFlags): Promise<void>;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAS3C,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmEzF"}
@@ -0,0 +1,127 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { QueryExecutor } from '@duckcodeailabs/dql-connectors';
4
+ import { assertLocalQueryRuntimeReady, findProjectRoot, loadProjectConfig } from '../local-runtime.js';
5
+ export async function runDoctor(targetPath, flags) {
6
+ const cwd = resolve(targetPath || '.');
7
+ const projectRoot = findProjectRoot(cwd);
8
+ const config = loadProjectConfig(projectRoot);
9
+ const checks = [
10
+ checkNodeVersion(),
11
+ {
12
+ name: 'Project root',
13
+ ok: existsSync(projectRoot),
14
+ detail: projectRoot,
15
+ },
16
+ {
17
+ name: 'dql.config.json',
18
+ ok: existsSync(join(projectRoot, 'dql.config.json')),
19
+ detail: existsSync(join(projectRoot, 'dql.config.json')) ? 'found' : 'missing',
20
+ },
21
+ {
22
+ name: 'blocks/',
23
+ ok: existsSync(join(projectRoot, 'blocks')),
24
+ detail: existsSync(join(projectRoot, 'blocks')) ? 'found' : 'missing',
25
+ },
26
+ {
27
+ name: 'semantic-layer/',
28
+ ok: existsSync(join(projectRoot, 'semantic-layer')),
29
+ detail: existsSync(join(projectRoot, 'semantic-layer')) ? 'found' : 'missing',
30
+ },
31
+ {
32
+ name: 'data/',
33
+ ok: existsSync(join(projectRoot, 'data')),
34
+ detail: existsSync(join(projectRoot, 'data')) ? 'found' : 'missing',
35
+ },
36
+ {
37
+ name: 'Default connection',
38
+ ok: Boolean(config.defaultConnection?.driver),
39
+ detail: config.defaultConnection?.driver ? `driver=${config.defaultConnection.driver}` : 'not configured',
40
+ },
41
+ ];
42
+ if (config.defaultConnection?.driver === 'file' || config.defaultConnection?.driver === 'duckdb') {
43
+ checks.push(checkDuckDBDependency(projectRoot));
44
+ }
45
+ if (config.defaultConnection?.driver) {
46
+ checks.push(await checkLocalQueryRuntime(projectRoot, config.defaultConnection));
47
+ }
48
+ const passed = checks.filter((check) => check.ok).length;
49
+ if (flags.format === 'json') {
50
+ console.log(JSON.stringify({
51
+ ok: passed === checks.length,
52
+ projectRoot,
53
+ checks,
54
+ }, null, 2));
55
+ return;
56
+ }
57
+ console.log(`\n DQL Doctor`);
58
+ console.log(` Project: ${projectRoot}`);
59
+ console.log('');
60
+ for (const check of checks) {
61
+ console.log(` ${check.ok ? '✓' : '✗'} ${check.name}`);
62
+ console.log(` ${check.detail}`);
63
+ }
64
+ console.log('');
65
+ console.log(` Summary: ${passed}/${checks.length} checks passed`);
66
+ console.log('');
67
+ }
68
+ function checkNodeVersion() {
69
+ const match = process.versions.node.match(/^(\d+)/);
70
+ const major = match ? Number(match[1]) : 0;
71
+ return {
72
+ name: 'Node.js',
73
+ ok: major >= 18,
74
+ detail: `version=${process.versions.node} (requires >= 18)`,
75
+ };
76
+ }
77
+ function checkDuckDBDependency(projectRoot) {
78
+ const packageJsonPath = join(projectRoot, 'package.json');
79
+ if (!existsSync(packageJsonPath)) {
80
+ return {
81
+ name: 'duckdb dependency',
82
+ ok: true,
83
+ detail: 'no project package.json; skipping dependency check',
84
+ };
85
+ }
86
+ try {
87
+ const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
88
+ const hasDuckDB = Boolean(pkg.dependencies?.duckdb || pkg.devDependencies?.duckdb);
89
+ return {
90
+ name: 'duckdb dependency',
91
+ ok: hasDuckDB,
92
+ detail: hasDuckDB ? 'duckdb listed in package.json' : 'add duckdb for file/duckdb local preview support',
93
+ };
94
+ }
95
+ catch {
96
+ return {
97
+ name: 'duckdb dependency',
98
+ ok: false,
99
+ detail: 'failed to parse package.json',
100
+ };
101
+ }
102
+ }
103
+ async function checkLocalQueryRuntime(projectRoot, connection) {
104
+ const previousCwd = process.cwd();
105
+ const executor = new QueryExecutor();
106
+ try {
107
+ process.chdir(projectRoot);
108
+ await assertLocalQueryRuntimeReady(executor, connection);
109
+ return {
110
+ name: 'Local query runtime',
111
+ ok: true,
112
+ detail: `driver=${connection.driver} is available`,
113
+ };
114
+ }
115
+ catch (error) {
116
+ return {
117
+ name: 'Local query runtime',
118
+ ok: false,
119
+ detail: error instanceof Error ? error.message : String(error),
120
+ };
121
+ }
122
+ finally {
123
+ process.chdir(previousCwd);
124
+ await executor.disconnect().catch(() => { });
125
+ }
126
+ }
127
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,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,MAAM,qBAAqB,CAAC;AAQvG,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAyB,EAAE,KAAe;IACxE,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAY;QACtB,gBAAgB,EAAE;QAClB;YACE,IAAI,EAAE,cAAc;YACpB,EAAE,EAAE,UAAU,CAAC,WAAW,CAAC;YAC3B,MAAM,EAAE,WAAW;SACpB;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;YACpD,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SAC/E;QACD;YACE,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC3C,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SACtE;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;YACnD,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SAC9E;QACD;YACE,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACzC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SACpE;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC;YAC7C,MAAM,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,gBAAgB;SAC1G;KACF,CAAC;IAEF,IAAI,MAAM,CAAC,iBAAiB,EAAE,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,iBAAiB,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;QACjG,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,MAAM,sBAAsB,CAAC,WAAW,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IAEzD,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM;YAC5B,WAAW;YACX,MAAM;SACP,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACb,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,IAAI,MAAM,CAAC,MAAM,gBAAgB,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO;QACL,IAAI,EAAE,SAAS;QACf,EAAE,EAAE,KAAK,IAAI,EAAE;QACf,MAAM,EAAE,WAAW,OAAO,CAAC,QAAQ,CAAC,IAAI,mBAAmB;KAC5D,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,WAAmB;IAChD,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,oDAAoD;SAC7D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAG5D,CAAC;QACF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,IAAI,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACnF,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,EAAE,EAAE,SAAS;YACb,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,kDAAkD;SACzG,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,8BAA8B;SACvC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,WAAmB,EAAE,UAAkF;IAC3I,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IAErC,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3B,MAAM,4BAA4B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACzD,OAAO;YACL,IAAI,EAAE,qBAAqB;YAC3B,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,UAAU,UAAU,CAAC,MAAM,eAAe;SACnD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,qBAAqB;YAC3B,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC/D,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3B,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=doctor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.test.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import { mkdtempSync, mkdirSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { tmpdir } from 'node:os';
4
+ import { describe, expect, it, vi } from 'vitest';
5
+ import { runDoctor } from './doctor.js';
6
+ describe('runDoctor', () => {
7
+ it('reports health for a starter-like project', async () => {
8
+ const projectDir = mkdtempSync(join(tmpdir(), 'dql-doctor-'));
9
+ mkdirSync(join(projectDir, 'blocks'));
10
+ mkdirSync(join(projectDir, 'semantic-layer'));
11
+ mkdirSync(join(projectDir, 'data'));
12
+ writeFileSync(join(projectDir, 'dql.config.json'), JSON.stringify({
13
+ defaultConnection: { driver: 'file', filepath: ':memory:' },
14
+ }, null, 2));
15
+ writeFileSync(join(projectDir, 'package.json'), JSON.stringify({
16
+ dependencies: { duckdb: '^1.1.0' },
17
+ }, null, 2));
18
+ const spy = vi.spyOn(console, 'log').mockImplementation(() => { });
19
+ await runDoctor(projectDir, {
20
+ check: false,
21
+ chart: '',
22
+ domain: '',
23
+ format: 'text',
24
+ help: false,
25
+ open: null,
26
+ input: '',
27
+ outDir: '',
28
+ owner: '',
29
+ port: null,
30
+ queryOnly: false,
31
+ template: 'starter',
32
+ verbose: false,
33
+ });
34
+ expect(spy).toHaveBeenCalled();
35
+ const output = spy.mock.calls.flat().join('\n');
36
+ expect(output).toContain('DQL Doctor');
37
+ expect(output).toContain('blocks/');
38
+ spy.mockRestore();
39
+ });
40
+ });
41
+ //# sourceMappingURL=doctor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../src/commands/doctor.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;QAC9D,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC9C,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QACpC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;YAChE,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE;SAC5D,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACb,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;YAC7D,YAAY,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;SACnC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEb,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAElE,MAAM,SAAS,CAAC,UAAU,EAAE;YAC1B,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACpC,GAAG,CAAC,WAAW,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CLIFlags } from '../args.js';
2
+ export declare function runInit(targetArg: string | null, flags: CLIFlags): Promise<void>;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAgB3C,wBAAsB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DtF"}