@datamagik/cli 0.1.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.
Files changed (86) hide show
  1. package/LICENSE +21 -0
  2. package/assets/dm-script-globals.d.ts +181 -0
  3. package/dist/api.d.ts +247 -0
  4. package/dist/api.js +200 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/commands/add.d.ts +28 -0
  7. package/dist/commands/add.js +260 -0
  8. package/dist/commands/add.js.map +1 -0
  9. package/dist/commands/dev.d.ts +25 -0
  10. package/dist/commands/dev.js +113 -0
  11. package/dist/commands/dev.js.map +1 -0
  12. package/dist/commands/init.d.ts +23 -0
  13. package/dist/commands/init.js +136 -0
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/login.d.ts +16 -0
  16. package/dist/commands/login.js +42 -0
  17. package/dist/commands/login.js.map +1 -0
  18. package/dist/commands/publish.d.ts +23 -0
  19. package/dist/commands/publish.js +113 -0
  20. package/dist/commands/publish.js.map +1 -0
  21. package/dist/commands/script.d.ts +69 -0
  22. package/dist/commands/script.js +289 -0
  23. package/dist/commands/script.js.map +1 -0
  24. package/dist/commands/sql.d.ts +28 -0
  25. package/dist/commands/sql.js +124 -0
  26. package/dist/commands/sql.js.map +1 -0
  27. package/dist/commands/typegen.d.ts +13 -0
  28. package/dist/commands/typegen.js +50 -0
  29. package/dist/commands/typegen.js.map +1 -0
  30. package/dist/config.d.ts +45 -0
  31. package/dist/config.js +118 -0
  32. package/dist/config.js.map +1 -0
  33. package/dist/credentials.d.ts +17 -0
  34. package/dist/credentials.js +49 -0
  35. package/dist/credentials.js.map +1 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.js +268 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/scriptfile.d.ts +10 -0
  40. package/dist/scriptfile.js +91 -0
  41. package/dist/scriptfile.js.map +1 -0
  42. package/dist/sqlfile.d.ts +9 -0
  43. package/dist/sqlfile.js +75 -0
  44. package/dist/sqlfile.js.map +1 -0
  45. package/dist/typegen/emit.d.ts +22 -0
  46. package/dist/typegen/emit.js +255 -0
  47. package/dist/typegen/emit.js.map +1 -0
  48. package/dist/typegen/meta.d.ts +84 -0
  49. package/dist/typegen/meta.js +209 -0
  50. package/dist/typegen/meta.js.map +1 -0
  51. package/package.json +35 -0
  52. package/templates/showcase/README.md +55 -0
  53. package/templates/showcase/_gitignore +4 -0
  54. package/templates/showcase/dm.config.json +16 -0
  55. package/templates/showcase/env.d.ts +7 -0
  56. package/templates/showcase/index.html +12 -0
  57. package/templates/showcase/package.json +25 -0
  58. package/templates/showcase/src/App.vue +67 -0
  59. package/templates/showcase/src/assets/datamagik-logo.png +0 -0
  60. package/templates/showcase/src/components/ShowcasePanel.vue +47 -0
  61. package/templates/showcase/src/components/panels/ContextPanel.vue +35 -0
  62. package/templates/showcase/src/components/panels/NavigatePanel.vue +38 -0
  63. package/templates/showcase/src/components/panels/OutputPanel.vue +50 -0
  64. package/templates/showcase/src/components/panels/PrintPanel.vue +68 -0
  65. package/templates/showcase/src/components/panels/QueryPanel.vue +52 -0
  66. package/templates/showcase/src/components/panels/ScriptPanel.vue +55 -0
  67. package/templates/showcase/src/components/panels/SerialPanel.vue +64 -0
  68. package/templates/showcase/src/dm-script-types.d.ts +13 -0
  69. package/templates/showcase/src/dm.generated.ts +65 -0
  70. package/templates/showcase/src/format.ts +13 -0
  71. package/templates/showcase/src/main.ts +5 -0
  72. package/templates/showcase/src/style.css +134 -0
  73. package/templates/showcase/tsconfig.json +17 -0
  74. package/templates/showcase/vite.config.ts +9 -0
  75. package/templates/simple/README.md +37 -0
  76. package/templates/simple/_gitignore +4 -0
  77. package/templates/simple/dm.config.json +10 -0
  78. package/templates/simple/env.d.ts +7 -0
  79. package/templates/simple/index.html +12 -0
  80. package/templates/simple/package.json +25 -0
  81. package/templates/simple/src/App.vue +71 -0
  82. package/templates/simple/src/dm.generated.ts +32 -0
  83. package/templates/simple/src/main.ts +5 -0
  84. package/templates/simple/src/style.css +63 -0
  85. package/templates/simple/tsconfig.json +17 -0
  86. package/templates/simple/vite.config.ts +9 -0
@@ -0,0 +1,42 @@
1
+ import { createInterface } from 'node:readline/promises';
2
+ import { saveCredentials } from '../credentials.js';
3
+ /**
4
+ * `dm login [--url <platform>] [--token <dcp_...>]`
5
+ *
6
+ * Stores `{ url, token }` in `~/.config/datamagik/credentials.json` (0600).
7
+ * When `--token` is omitted, prompts on stdin for an API key created in the
8
+ * platform UI (Settings → API Keys).
9
+ *
10
+ * TODO(browser OAuth): the design (§7.2) calls for a browser flow where the
11
+ * server mints a builder bearer via `CreateSystemAPIKey` and delivers it to a
12
+ * localhost callback. Until that endpoint ships, paste a `dcp_` API key.
13
+ */
14
+ export async function loginCommand(opts) {
15
+ const url = (opts.url ?? 'https://data-magik.com').replace(/\/$/, '');
16
+ // Prefer --token, then DM_TOKEN (lets callers pass the secret via env so it
17
+ // never lands in argv or shell history), else prompt.
18
+ let token = opts.token ?? process.env['DM_TOKEN'];
19
+ if (!token) {
20
+ console.log(`Log in to ${url}`);
21
+ console.log('Create an API key in the platform UI (Settings → API Keys), then paste it below.');
22
+ console.log('(A browser-based login flow is planned; for now paste a dcp_ API key.)');
23
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
24
+ try {
25
+ token = (await rl.question('API key (dcp_...): ')).trim();
26
+ }
27
+ finally {
28
+ rl.close();
29
+ }
30
+ }
31
+ if (!token) {
32
+ console.error('No token provided; aborting.');
33
+ process.exitCode = 1;
34
+ return;
35
+ }
36
+ if (!token.startsWith('dcp_')) {
37
+ console.warn("Warning: token does not start with 'dcp_' — double-check you pasted a platform API key.");
38
+ }
39
+ const file = saveCredentials({ url, token });
40
+ console.log(`Credentials saved to ${file} (mode 0600).`);
41
+ }
42
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOpD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAkB;IACnD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,wBAAwB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEtE,4EAA4E;IAC5E,sDAAsD;IACtD,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC;QAChG,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;QACtF,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC;YACH,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,eAAe,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type DmConfig } from '../config.js';
2
+ export interface PublishOptions {
3
+ app?: string;
4
+ message?: string;
5
+ /** Skip `vite build` (use the existing dist/) — mainly for debugging. */
6
+ skipBuild?: boolean;
7
+ }
8
+ /**
9
+ * `dm publish [--app <id>] [--message "..."]`
10
+ *
11
+ * 1. Validates `dm.config.json`.
12
+ * 2. Runs `vite build` in the user's project (their Vite, via child process).
13
+ * 3. Zips `dist/`.
14
+ * 4. Multipart-POSTs to `POST {url}/api/app-designer/apps/{id}/spa-versions`
15
+ * with fields `bundle` (zip), `manifest` (JSON: entry, sources,
16
+ * serialSeries, printers, appContract), and `change_description`.
17
+ * 5. Prints the version number the server assigned.
18
+ */
19
+ export declare function publishCommand(opts: PublishOptions): Promise<void>;
20
+ /** Manifest fields per design §3 (the server builds bundle.assets itself). */
21
+ export declare function buildManifest(config: DmConfig): Record<string, unknown>;
22
+ /** Zips a directory (deflate) and resolves with the zip bytes. */
23
+ export declare function zipDirectory(dir: string): Promise<Buffer>;
@@ -0,0 +1,113 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { createRequire } from 'node:module';
3
+ import { existsSync } from 'node:fs';
4
+ import path from 'node:path';
5
+ import archiver from 'archiver';
6
+ import { loadDmConfig } from '../config.js';
7
+ import { requireCredentials } from '../credentials.js';
8
+ /**
9
+ * `dm publish [--app <id>] [--message "..."]`
10
+ *
11
+ * 1. Validates `dm.config.json`.
12
+ * 2. Runs `vite build` in the user's project (their Vite, via child process).
13
+ * 3. Zips `dist/`.
14
+ * 4. Multipart-POSTs to `POST {url}/api/app-designer/apps/{id}/spa-versions`
15
+ * with fields `bundle` (zip), `manifest` (JSON: entry, sources,
16
+ * serialSeries, printers, appContract), and `change_description`.
17
+ * 5. Prints the version number the server assigned.
18
+ */
19
+ export async function publishCommand(opts) {
20
+ const cwd = process.cwd();
21
+ const config = loadDmConfig(cwd);
22
+ const creds = requireCredentials();
23
+ const appId = opts.app ? Number(opts.app) : config.appId;
24
+ if (!Number.isInteger(appId) || appId <= 0) {
25
+ console.error(`Invalid app id: ${opts.app ?? config.appId}`);
26
+ process.exit(1);
27
+ }
28
+ if (!opts.skipBuild) {
29
+ console.log('Running vite build...');
30
+ await runViteBuild(cwd);
31
+ }
32
+ const distDir = path.join(cwd, 'dist');
33
+ if (!existsSync(distDir)) {
34
+ console.error('No dist/ directory found after build.');
35
+ process.exit(1);
36
+ }
37
+ if (!existsSync(path.join(distDir, config.entry))) {
38
+ console.error(`Entry file '${config.entry}' not found in dist/ — the platform requires it at the bundle root.`);
39
+ process.exit(1);
40
+ }
41
+ console.log('Zipping dist/...');
42
+ const zip = await zipDirectory(distDir);
43
+ console.log(`Bundle: ${(zip.length / 1024).toFixed(1)} KiB`);
44
+ const manifest = buildManifest(config);
45
+ const form = new FormData();
46
+ form.append('bundle', new Blob([new Uint8Array(zip)], { type: 'application/zip' }), 'bundle.zip');
47
+ form.append('manifest', JSON.stringify(manifest));
48
+ form.append('change_description', opts.message ?? '');
49
+ const url = `${creds.url}/api/app-designer/apps/${appId}/spa-versions`;
50
+ console.log(`Publishing to ${url} ...`);
51
+ const res = await fetch(url, {
52
+ method: 'POST',
53
+ headers: { Authorization: `Bearer ${creds.token}` },
54
+ body: form,
55
+ });
56
+ if (!res.ok) {
57
+ let detail = '';
58
+ try {
59
+ detail = await res.text();
60
+ }
61
+ catch {
62
+ /* ignore */
63
+ }
64
+ console.error(`Publish failed: HTTP ${res.status}\n${detail}`);
65
+ process.exit(1);
66
+ }
67
+ const body = (await res.json().catch(() => ({})));
68
+ const version = body['version_number'] ?? body['versionNumber'] ?? body['version'];
69
+ console.log(`Published app ${appId} version ${String(version ?? '(unknown)')}.`);
70
+ }
71
+ /** Manifest fields per design §3 (the server builds bundle.assets itself). */
72
+ export function buildManifest(config) {
73
+ return {
74
+ entry: config.entry,
75
+ sources: config.sources,
76
+ serialSeries: config.serialSeries,
77
+ printers: config.printers,
78
+ appContract: config.appContract,
79
+ };
80
+ }
81
+ function runViteBuild(cwd) {
82
+ let viteBin;
83
+ try {
84
+ const require = createRequire(`${cwd}/package.json`);
85
+ viteBin = require.resolve('vite/bin/vite.js');
86
+ }
87
+ catch {
88
+ return Promise.reject(new Error('Could not resolve `vite` from this project — install it first: npm install -D vite'));
89
+ }
90
+ return new Promise((resolve, reject) => {
91
+ const child = spawn(process.execPath, [viteBin, 'build'], { cwd, stdio: 'inherit' });
92
+ child.on('error', reject);
93
+ child.on('exit', (code) => {
94
+ if (code === 0)
95
+ resolve();
96
+ else
97
+ reject(new Error(`vite build exited with code ${code}`));
98
+ });
99
+ });
100
+ }
101
+ /** Zips a directory (deflate) and resolves with the zip bytes. */
102
+ export function zipDirectory(dir) {
103
+ return new Promise((resolve, reject) => {
104
+ const archive = archiver('zip', { zlib: { level: 9 } });
105
+ const chunks = [];
106
+ archive.on('data', (chunk) => chunks.push(chunk));
107
+ archive.on('error', reject);
108
+ archive.on('end', () => resolve(Buffer.concat(chunks)));
109
+ archive.directory(dir, false);
110
+ void archive.finalize();
111
+ });
112
+ }
113
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { type PlatformScriptClient } from '../api.js';
2
+ export interface PullOptions {
3
+ /** Script id to pull; pulls all scripts when omitted. */
4
+ id?: string;
5
+ /** Output directory (default: scripts/). */
6
+ dir?: string;
7
+ }
8
+ export interface RunOptions {
9
+ /** Override the scriptId from the file's frontmatter. */
10
+ id?: string;
11
+ /** Simulated context params (`key=val`, repeatable). */
12
+ context?: string[];
13
+ }
14
+ /**
15
+ * `dm script pull [id]`
16
+ *
17
+ * Writes each script to `<dir>/<slug>.js` with a `@dm-script` frontmatter block
18
+ * carrying its full attribute set, and drops the ambient types + jsconfig so the
19
+ * V8 globals (plex, odbc, context, …) autocomplete. Requires `dm login`.
20
+ */
21
+ export declare function pullCommand(opts: PullOptions, deps?: {
22
+ client?: PlatformScriptClient & {
23
+ listScripts(): Promise<{
24
+ script_id: number;
25
+ }[]>;
26
+ };
27
+ cwd?: string;
28
+ }): Promise<void>;
29
+ /**
30
+ * `dm script run <file> [--context k=v ...]`
31
+ *
32
+ * Sends the local code to the engine's read-only test-run with a simulated
33
+ * context, then prints console logs + output (never persists). Requires `dm login`.
34
+ */
35
+ export declare function runCommand(file: string, opts: RunOptions, deps?: {
36
+ client?: PlatformScriptClient;
37
+ cwd?: string;
38
+ }): Promise<void>;
39
+ /**
40
+ * `dm script push <file>` — save metadata only (PUT) for an existing script.
41
+ * Code is deployed via `dm script commit`. Requires a scriptId in frontmatter.
42
+ */
43
+ export declare function pushCommand(file: string, opts: {
44
+ id?: string;
45
+ }, deps?: {
46
+ client?: PlatformScriptClient;
47
+ cwd?: string;
48
+ }): Promise<void>;
49
+ /**
50
+ * `dm script commit <file> -m "notes"` — deploy: create the script if needed,
51
+ * sync metadata, and save the code as a NEW version (the current/live version).
52
+ */
53
+ export declare function commitCommand(file: string, opts: {
54
+ id?: string;
55
+ message?: string;
56
+ }, deps?: {
57
+ client?: PlatformScriptClient;
58
+ cwd?: string;
59
+ }): Promise<void>;
60
+ /**
61
+ * `dm script status <file>` — show how the local file differs from the engine
62
+ * (changed attributes + whether the code differs from the current version).
63
+ */
64
+ export declare function statusCommand(file: string, opts: {
65
+ id?: string;
66
+ }, deps?: {
67
+ client?: PlatformScriptClient;
68
+ cwd?: string;
69
+ }): Promise<void>;
@@ -0,0 +1,289 @@
1
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { requireCredentials } from '../credentials.js';
5
+ import { PlatformClient } from '../api.js';
6
+ import { parseScriptFile, serializeScriptFile } from '../scriptfile.js';
7
+ /** Maps a full script record onto the frontmatter attribute set. */
8
+ function detailToMeta(d) {
9
+ const meta = { name: d.script_name };
10
+ if (d.description)
11
+ meta['description'] = d.description;
12
+ if (d.category)
13
+ meta['category'] = d.category;
14
+ if (d.tags && d.tags.length)
15
+ meta['tags'] = d.tags;
16
+ meta['active'] = d.is_active !== false;
17
+ if (d.timeout_seconds)
18
+ meta['timeoutSeconds'] = d.timeout_seconds;
19
+ if (d.max_memory_mb)
20
+ meta['maxMemoryMB'] = d.max_memory_mb;
21
+ if (d.priority)
22
+ meta['priority'] = d.priority;
23
+ if (d.is_report_generator)
24
+ meta['isReportGenerator'] = true;
25
+ if (d.report_type)
26
+ meta['reportType'] = d.report_type;
27
+ if (d.generate_documents)
28
+ meta['generateDocuments'] = true;
29
+ if (d.output_format)
30
+ meta['outputFormat'] = d.output_format;
31
+ if (d.title_jsonpath)
32
+ meta['titleJsonPath'] = d.title_jsonpath;
33
+ if (d.summary_jsonpath)
34
+ meta['summaryJsonPath'] = d.summary_jsonpath;
35
+ if (d.wait_for_generation)
36
+ meta['waitForGeneration'] = true;
37
+ meta['scriptId'] = d.script_id;
38
+ return meta;
39
+ }
40
+ /** Current version's code (or the highest-numbered version as a fallback). */
41
+ function pickCode(versions) {
42
+ if (versions.length === 0)
43
+ return 'function main(context) {\n // TODO\n}\n';
44
+ const current = versions.find((v) => v.is_current);
45
+ if (current)
46
+ return current.script_code;
47
+ return [...versions].sort((a, b) => b.version_number - a.version_number)[0].script_code;
48
+ }
49
+ /** `Milton AR Daily` → `milton-ar-daily`. */
50
+ function fileSlug(name) {
51
+ const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
52
+ return slug || 'script';
53
+ }
54
+ /** Path to the bundled ambient-types file (works from src/ and dist/). */
55
+ function globalsDtsPath() {
56
+ const here = path.dirname(fileURLToPath(import.meta.url));
57
+ return path.resolve(here, '..', '..', 'assets', 'dm-script-globals.d.ts');
58
+ }
59
+ /** Drops the ambient `.d.ts` + a jsconfig so editors autocomplete the V8 globals. */
60
+ function ensureEditorSupport(dir) {
61
+ const dts = globalsDtsPath();
62
+ if (existsSync(dts))
63
+ copyFileSync(dts, path.join(dir, 'dm-script-globals.d.ts'));
64
+ const jsconfig = path.join(dir, 'jsconfig.json');
65
+ if (!existsSync(jsconfig)) {
66
+ writeFileSync(jsconfig, JSON.stringify({
67
+ compilerOptions: { target: 'ES2022', module: 'ESNext', lib: ['ES2022'], checkJs: true, allowJs: true, noEmit: true },
68
+ include: ['*.js', 'dm-script-globals.d.ts'],
69
+ }, null, 2) + '\n');
70
+ }
71
+ }
72
+ /**
73
+ * `dm script pull [id]`
74
+ *
75
+ * Writes each script to `<dir>/<slug>.js` with a `@dm-script` frontmatter block
76
+ * carrying its full attribute set, and drops the ambient types + jsconfig so the
77
+ * V8 globals (plex, odbc, context, …) autocomplete. Requires `dm login`.
78
+ */
79
+ export async function pullCommand(opts, deps = {}) {
80
+ const cwd = deps.cwd ?? process.cwd();
81
+ const creds = requireCredentials();
82
+ const client = deps.client ?? new PlatformClient(creds.url, creds.token);
83
+ const outDir = path.resolve(cwd, opts.dir ?? 'scripts');
84
+ mkdirSync(outDir, { recursive: true });
85
+ let ids;
86
+ if (opts.id !== undefined) {
87
+ ids = [Number(opts.id)];
88
+ }
89
+ else {
90
+ ids = (await client.listScripts()).map((s) => s.script_id);
91
+ }
92
+ if (ids.length === 0) {
93
+ console.log(`No scripts found in this tenant (${creds.url}).`);
94
+ return;
95
+ }
96
+ for (const id of ids) {
97
+ const detail = await client.getScriptDetail(id);
98
+ const versions = await client.getScriptVersions(id);
99
+ const file = path.join(outDir, `${fileSlug(detail.script_name)}.js`);
100
+ writeFileSync(file, serializeScriptFile(detailToMeta(detail), pickCode(versions)));
101
+ console.log(`Pulled [#${id}] ${detail.script_name} → ${path.relative(cwd, file)}`);
102
+ }
103
+ ensureEditorSupport(outDir);
104
+ console.log(`\nTypes + jsconfig written to ${path.relative(cwd, outDir)}/ — open a .js file for autocomplete.`);
105
+ console.log('Edit, then: dm script run <file> (read-only dry run against the engine).');
106
+ }
107
+ /**
108
+ * `dm script run <file> [--context k=v ...]`
109
+ *
110
+ * Sends the local code to the engine's read-only test-run with a simulated
111
+ * context, then prints console logs + output (never persists). Requires `dm login`.
112
+ */
113
+ export async function runCommand(file, opts, deps = {}) {
114
+ const cwd = deps.cwd ?? process.cwd();
115
+ const creds = requireCredentials();
116
+ const client = deps.client ?? new PlatformClient(creds.url, creds.token);
117
+ const filePath = path.resolve(cwd, file);
118
+ if (!existsSync(filePath))
119
+ throw new Error(`File not found: ${file}`);
120
+ const { meta, code } = parseScriptFile(readFileSync(filePath, 'utf8'));
121
+ const scriptId = opts.id !== undefined ? Number(opts.id) : typeof meta['scriptId'] === 'number' ? meta['scriptId'] : undefined;
122
+ if (scriptId === undefined || !Number.isInteger(scriptId) || scriptId <= 0) {
123
+ throw new Error('No scriptId — add it to the @dm-script frontmatter (pull an existing script) or pass --id <n>.');
124
+ }
125
+ const context = {};
126
+ for (const kv of opts.context ?? []) {
127
+ const eq = kv.indexOf('=');
128
+ if (eq === -1)
129
+ throw new Error(`--context expects key=value (got "${kv}")`);
130
+ context[kv.slice(0, eq)] = kv.slice(eq + 1);
131
+ }
132
+ console.log(`Running [#${scriptId}] against ${creds.url} (test-run, no version saved)…`);
133
+ const result = await client.testRunScript(scriptId, code, context);
134
+ if (!result.completed || !result.execution) {
135
+ console.log(`Queued as execution ${result.execution_id} (still running). Check status in the platform.`);
136
+ return;
137
+ }
138
+ const ex = result.execution;
139
+ for (const line of ex.console_logs ?? [])
140
+ console.log(` ${line}`);
141
+ if (ex.status === 'completed') {
142
+ console.log(`\n✓ completed in ${ex.execution_time_ms ?? '?'}ms`);
143
+ if (ex.output_data !== undefined)
144
+ console.log(`output: ${JSON.stringify(ex.output_data, null, 2)}`);
145
+ }
146
+ else {
147
+ console.log(`\n✗ ${ex.status}: ${ex.error_message ?? 'unknown error'}${ex.error_code ? ` (${ex.error_code})` : ''}`);
148
+ process.exitCode = 1;
149
+ }
150
+ }
151
+ // --- meta accessors + mappers --------------------------------------------
152
+ const mstr = (m, k) => (typeof m[k] === 'string' ? m[k] : undefined);
153
+ const mnum = (m, k) => (typeof m[k] === 'number' ? m[k] : undefined);
154
+ const mbool = (m, k) => (typeof m[k] === 'boolean' ? m[k] : undefined);
155
+ const marr = (m, k) => (Array.isArray(m[k]) ? m[k] : undefined);
156
+ function metaToUpdateBody(m) {
157
+ const b = {};
158
+ const name = mstr(m, 'name');
159
+ if (name)
160
+ b.script_name = name;
161
+ if ('description' in m)
162
+ b.description = mstr(m, 'description') ?? null;
163
+ if ('category' in m)
164
+ b.category = mstr(m, 'category') ?? null;
165
+ if ('isReportGenerator' in m)
166
+ b.is_report_generator = mbool(m, 'isReportGenerator');
167
+ if ('reportType' in m)
168
+ b.report_type = mstr(m, 'reportType') ?? null;
169
+ if ('tags' in m)
170
+ b.tags = marr(m, 'tags');
171
+ if ('timeoutSeconds' in m)
172
+ b.timeout_seconds = mnum(m, 'timeoutSeconds');
173
+ if ('maxMemoryMB' in m)
174
+ b.max_memory_mb = mnum(m, 'maxMemoryMB');
175
+ if ('priority' in m)
176
+ b.priority = mnum(m, 'priority');
177
+ if ('active' in m)
178
+ b.is_active = mbool(m, 'active');
179
+ return b;
180
+ }
181
+ function metaToCreateBody(m) {
182
+ const name = mstr(m, 'name');
183
+ if (!name)
184
+ throw new Error('frontmatter is missing "name" — required to create a script.');
185
+ return {
186
+ script_name: name,
187
+ description: mstr(m, 'description') ?? null,
188
+ category: mstr(m, 'category') ?? null,
189
+ is_report_generator: mbool(m, 'isReportGenerator') ?? false,
190
+ report_type: mstr(m, 'reportType') ?? null,
191
+ tags: marr(m, 'tags') ?? [],
192
+ timeout_seconds: mnum(m, 'timeoutSeconds') ?? 30,
193
+ max_memory_mb: mnum(m, 'maxMemoryMB') ?? 128,
194
+ priority: mnum(m, 'priority') ?? 0,
195
+ };
196
+ }
197
+ function scriptIdOf(m, override) {
198
+ if (override !== undefined)
199
+ return Number(override);
200
+ return typeof m['scriptId'] === 'number' ? m['scriptId'] : undefined;
201
+ }
202
+ /**
203
+ * `dm script push <file>` — save metadata only (PUT) for an existing script.
204
+ * Code is deployed via `dm script commit`. Requires a scriptId in frontmatter.
205
+ */
206
+ export async function pushCommand(file, opts, deps = {}) {
207
+ const cwd = deps.cwd ?? process.cwd();
208
+ const creds = requireCredentials();
209
+ const client = deps.client ?? new PlatformClient(creds.url, creds.token);
210
+ const filePath = path.resolve(cwd, file);
211
+ if (!existsSync(filePath))
212
+ throw new Error(`File not found: ${file}`);
213
+ const { meta } = parseScriptFile(readFileSync(filePath, 'utf8'));
214
+ const id = scriptIdOf(meta, opts.id);
215
+ if (id === undefined || !Number.isInteger(id) || id <= 0) {
216
+ throw new Error('No scriptId — push updates an existing script. Use `dm script commit` to create one.');
217
+ }
218
+ await client.updateScript(id, metaToUpdateBody(meta));
219
+ console.log(`Updated metadata for script [#${id}] on ${creds.url} (no code version saved — use commit for code).`);
220
+ }
221
+ /**
222
+ * `dm script commit <file> -m "notes"` — deploy: create the script if needed,
223
+ * sync metadata, and save the code as a NEW version (the current/live version).
224
+ */
225
+ export async function commitCommand(file, opts, deps = {}) {
226
+ const cwd = deps.cwd ?? process.cwd();
227
+ const creds = requireCredentials();
228
+ const client = deps.client ?? new PlatformClient(creds.url, creds.token);
229
+ const filePath = path.resolve(cwd, file);
230
+ if (!existsSync(filePath))
231
+ throw new Error(`File not found: ${file}`);
232
+ const { meta, code } = parseScriptFile(readFileSync(filePath, 'utf8'));
233
+ let id = scriptIdOf(meta, opts.id);
234
+ let created = false;
235
+ if (id === undefined || !Number.isInteger(id) || id <= 0) {
236
+ id = await client.createScript(metaToCreateBody(meta));
237
+ created = true;
238
+ // Persist the new id back into the file so future commits update in place.
239
+ meta['scriptId'] = id;
240
+ writeFileSync(filePath, serializeScriptFile(meta, code));
241
+ }
242
+ else {
243
+ await client.updateScript(id, metaToUpdateBody(meta));
244
+ }
245
+ await client.createScriptVersion(id, code, opts.message);
246
+ console.log(`${created ? 'Created' : 'Committed'} script [#${id}] on ${creds.url} — new version saved${opts.message ? `: "${opts.message}"` : ''}.`);
247
+ }
248
+ /**
249
+ * `dm script status <file>` — show how the local file differs from the engine
250
+ * (changed attributes + whether the code differs from the current version).
251
+ */
252
+ export async function statusCommand(file, opts, deps = {}) {
253
+ const cwd = deps.cwd ?? process.cwd();
254
+ const creds = requireCredentials();
255
+ const client = deps.client ?? new PlatformClient(creds.url, creds.token);
256
+ const filePath = path.resolve(cwd, file);
257
+ if (!existsSync(filePath))
258
+ throw new Error(`File not found: ${file}`);
259
+ const { meta, code } = parseScriptFile(readFileSync(filePath, 'utf8'));
260
+ const id = scriptIdOf(meta, opts.id);
261
+ if (id === undefined || !Number.isInteger(id) || id <= 0) {
262
+ console.log('No scriptId in frontmatter — this is a new script (commit to create).');
263
+ return;
264
+ }
265
+ const detail = await client.getScriptDetail(id);
266
+ const remoteCode = pickCode(await client.getScriptVersions(id));
267
+ const fields = [
268
+ ['name', mstr(meta, 'name'), detail.script_name],
269
+ ['description', mstr(meta, 'description'), detail.description ?? undefined],
270
+ ['category', mstr(meta, 'category'), detail.category ?? undefined],
271
+ ['active', mbool(meta, 'active'), detail.is_active],
272
+ ['timeoutSeconds', mnum(meta, 'timeoutSeconds'), detail.timeout_seconds],
273
+ ['priority', mnum(meta, 'priority'), detail.priority],
274
+ ['tags', marr(meta, 'tags'), detail.tags ?? undefined],
275
+ ];
276
+ const changed = fields.filter(([, l, r]) => l !== undefined && JSON.stringify(l) !== JSON.stringify(r));
277
+ const codeDiffers = code.trim() !== remoteCode.trim();
278
+ console.log(`Script [#${id}] "${detail.script_name}" vs ${creds.url}`);
279
+ if (changed.length === 0 && !codeDiffers) {
280
+ console.log(' in sync — no local changes.');
281
+ return;
282
+ }
283
+ for (const [field, local, remote] of changed) {
284
+ console.log(` ~ ${field}: local=${JSON.stringify(local)} remote=${JSON.stringify(remote)}`);
285
+ }
286
+ if (codeDiffers)
287
+ console.log(' ~ code differs from the current version (commit to deploy).');
288
+ }
289
+ //# sourceMappingURL=script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script.js","sourceRoot":"","sources":["../../src/commands/script.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type PlatformSqlClient } from '../api.js';
2
+ export interface SqlPullOptions {
3
+ id?: string;
4
+ dir?: string;
5
+ }
6
+ export interface SqlRunOptions {
7
+ id?: string;
8
+ credentialId?: string;
9
+ param?: string[];
10
+ }
11
+ export interface SqlPushOptions {
12
+ id?: string;
13
+ }
14
+ /** `dm sql pull [id]` — write ODBC queries to <dir>/<slug>.sql with frontmatter. */
15
+ export declare function pullSqlCommand(opts: SqlPullOptions, deps?: {
16
+ client?: PlatformSqlClient;
17
+ cwd?: string;
18
+ }): Promise<void>;
19
+ /** `dm sql run <file> --param k=v` — read-only test-run against the engine. */
20
+ export declare function runSqlCommand(file: string, opts: SqlRunOptions, deps?: {
21
+ client?: PlatformSqlClient;
22
+ cwd?: string;
23
+ }): Promise<void>;
24
+ /** `dm sql push <file>` — create or update the query in place (ODBC has no versions). */
25
+ export declare function pushSqlCommand(file: string, opts: SqlPushOptions, deps?: {
26
+ client?: PlatformSqlClient;
27
+ cwd?: string;
28
+ }): Promise<void>;