@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.
- package/LICENSE +21 -0
- package/assets/dm-script-globals.d.ts +181 -0
- package/dist/api.d.ts +247 -0
- package/dist/api.js +200 -0
- package/dist/api.js.map +1 -0
- package/dist/commands/add.d.ts +28 -0
- package/dist/commands/add.js +260 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/dev.d.ts +25 -0
- package/dist/commands/dev.js +113 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/init.d.ts +23 -0
- package/dist/commands/init.js +136 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +16 -0
- package/dist/commands/login.js +42 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/publish.d.ts +23 -0
- package/dist/commands/publish.js +113 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/script.d.ts +69 -0
- package/dist/commands/script.js +289 -0
- package/dist/commands/script.js.map +1 -0
- package/dist/commands/sql.d.ts +28 -0
- package/dist/commands/sql.js +124 -0
- package/dist/commands/sql.js.map +1 -0
- package/dist/commands/typegen.d.ts +13 -0
- package/dist/commands/typegen.js +50 -0
- package/dist/commands/typegen.js.map +1 -0
- package/dist/config.d.ts +45 -0
- package/dist/config.js +118 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.d.ts +17 -0
- package/dist/credentials.js +49 -0
- package/dist/credentials.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +268 -0
- package/dist/index.js.map +1 -0
- package/dist/scriptfile.d.ts +10 -0
- package/dist/scriptfile.js +91 -0
- package/dist/scriptfile.js.map +1 -0
- package/dist/sqlfile.d.ts +9 -0
- package/dist/sqlfile.js +75 -0
- package/dist/sqlfile.js.map +1 -0
- package/dist/typegen/emit.d.ts +22 -0
- package/dist/typegen/emit.js +255 -0
- package/dist/typegen/emit.js.map +1 -0
- package/dist/typegen/meta.d.ts +84 -0
- package/dist/typegen/meta.js +209 -0
- package/dist/typegen/meta.js.map +1 -0
- package/package.json +35 -0
- package/templates/showcase/README.md +55 -0
- package/templates/showcase/_gitignore +4 -0
- package/templates/showcase/dm.config.json +16 -0
- package/templates/showcase/env.d.ts +7 -0
- package/templates/showcase/index.html +12 -0
- package/templates/showcase/package.json +25 -0
- package/templates/showcase/src/App.vue +67 -0
- package/templates/showcase/src/assets/datamagik-logo.png +0 -0
- package/templates/showcase/src/components/ShowcasePanel.vue +47 -0
- package/templates/showcase/src/components/panels/ContextPanel.vue +35 -0
- package/templates/showcase/src/components/panels/NavigatePanel.vue +38 -0
- package/templates/showcase/src/components/panels/OutputPanel.vue +50 -0
- package/templates/showcase/src/components/panels/PrintPanel.vue +68 -0
- package/templates/showcase/src/components/panels/QueryPanel.vue +52 -0
- package/templates/showcase/src/components/panels/ScriptPanel.vue +55 -0
- package/templates/showcase/src/components/panels/SerialPanel.vue +64 -0
- package/templates/showcase/src/dm-script-types.d.ts +13 -0
- package/templates/showcase/src/dm.generated.ts +65 -0
- package/templates/showcase/src/format.ts +13 -0
- package/templates/showcase/src/main.ts +5 -0
- package/templates/showcase/src/style.css +134 -0
- package/templates/showcase/tsconfig.json +17 -0
- package/templates/showcase/vite.config.ts +9 -0
- package/templates/simple/README.md +37 -0
- package/templates/simple/_gitignore +4 -0
- package/templates/simple/dm.config.json +10 -0
- package/templates/simple/env.d.ts +7 -0
- package/templates/simple/index.html +12 -0
- package/templates/simple/package.json +25 -0
- package/templates/simple/src/App.vue +71 -0
- package/templates/simple/src/dm.generated.ts +32 -0
- package/templates/simple/src/main.ts +5 -0
- package/templates/simple/src/style.css +63 -0
- package/templates/simple/tsconfig.json +17 -0
- package/templates/simple/vite.config.ts +9 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 DataMagik
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
// ----------------------------------------------------------------------------
|
|
2
|
+
// GENERATED by scripts/gen-script-globals.mjs — DO NOT EDIT.
|
|
3
|
+
// Ambient types for the DataMagik script-engine V8 sandbox. Globals + method
|
|
4
|
+
// names are scraped from services/v8_script_context.go; signatures come from a
|
|
5
|
+
// curated overlay. Re-run the generator after changing the engine globals.
|
|
6
|
+
// ----------------------------------------------------------------------------
|
|
7
|
+
export {};
|
|
8
|
+
|
|
9
|
+
declare global {
|
|
10
|
+
/** Caller-supplied input for this run (augment per script as needed). */
|
|
11
|
+
interface DmContext { [key: string]: unknown }
|
|
12
|
+
const context: DmContext;
|
|
13
|
+
|
|
14
|
+
const console: {
|
|
15
|
+
log(...args: unknown[]): void;
|
|
16
|
+
error(...args: unknown[]): void;
|
|
17
|
+
warn(...args: unknown[]): void;
|
|
18
|
+
info(...args: unknown[]): void;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** Fetch a whitelisted external URL (auth via credentials.get). */
|
|
22
|
+
function fetch(url: string, opts?: Record<string, unknown>): Promise<{ ok: boolean; status: number; json(): Promise<any>; text(): Promise<string> }>;
|
|
23
|
+
function fetchAsync(url: string, opts?: Record<string, unknown>): Promise<any>;
|
|
24
|
+
|
|
25
|
+
/** Printers, sites, and connector file I/O. */
|
|
26
|
+
const connectors: {
|
|
27
|
+
copyFile(...args: any[]): Promise<any>;
|
|
28
|
+
deleteFile(...args: any[]): Promise<any>;
|
|
29
|
+
fileExists(...args: any[]): Promise<any>;
|
|
30
|
+
getConnectors(...args: any[]): Promise<any>;
|
|
31
|
+
getConnectorsBySite(...args: any[]): Promise<any>;
|
|
32
|
+
getPrinter(...args: any[]): Promise<any>;
|
|
33
|
+
getPrinterById(...args: any[]): Promise<any>;
|
|
34
|
+
getPrinters(...args: any[]): Promise<any>;
|
|
35
|
+
getSites(...args: any[]): Promise<any>;
|
|
36
|
+
listFiles(...args: any[]): Promise<any>;
|
|
37
|
+
mkdir(...args: any[]): Promise<any>;
|
|
38
|
+
moveFile(...args: any[]): Promise<any>;
|
|
39
|
+
printBatch(...args: any[]): Promise<any>;
|
|
40
|
+
printFromTemplate(...args: any[]): Promise<any>;
|
|
41
|
+
printLabel(...args: any[]): Promise<any>;
|
|
42
|
+
readFile(...args: any[]): Promise<any>;
|
|
43
|
+
writeFile(...args: any[]): Promise<any>;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/** Secret values configured for this script (never logged). */
|
|
47
|
+
const credentials: {
|
|
48
|
+
get(name: string): string;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/** Document generation. */
|
|
52
|
+
const documents: {
|
|
53
|
+
generate(templateId: number | string, data: Record<string, unknown>, opts?: Record<string, unknown>): Promise<{ requestId: string }>;
|
|
54
|
+
generateBatch(...args: any[]): Promise<any>;
|
|
55
|
+
generateSync(...args: any[]): Promise<any>;
|
|
56
|
+
getStatus(requestId: string): Promise<{ status: string; url?: string }>;
|
|
57
|
+
getTemplateId(...args: any[]): Promise<any>;
|
|
58
|
+
mergePdf(...args: any[]): Promise<any>;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/** Send email. */
|
|
62
|
+
const email: {
|
|
63
|
+
send(...args: any[]): Promise<any>;
|
|
64
|
+
sendWithTemplate(...args: any[]): Promise<any>;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/** Pure utility helpers (synchronous). */
|
|
68
|
+
const helpers: {
|
|
69
|
+
deepClone<T>(obj: T): T;
|
|
70
|
+
deepGet(obj: unknown, path: string): unknown;
|
|
71
|
+
format(...args: any[]): Promise<any>;
|
|
72
|
+
formatCurrency(value: number, currency?: string): string;
|
|
73
|
+
formatDate(date: string | number | Date, format?: string): string;
|
|
74
|
+
formatNumber(value: number, opts?: Record<string, unknown>): string;
|
|
75
|
+
getOrDefault<T>(value: T | null | undefined, fallback: T): T;
|
|
76
|
+
hash(input: string, algo?: string): string;
|
|
77
|
+
pad(value: string | number, length: number, char?: string): string;
|
|
78
|
+
parseCSV(csv: string): Record<string, string>[];
|
|
79
|
+
parseDate(value: string): Date;
|
|
80
|
+
parseExcel(...args: any[]): Promise<any>;
|
|
81
|
+
require(...args: any[]): Promise<any>;
|
|
82
|
+
truncate(text: string, length: number): string;
|
|
83
|
+
uuid(): string;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
/** HTTP helpers (whitelisted hosts). */
|
|
87
|
+
const http: {
|
|
88
|
+
get(url: string, opts?: Record<string, unknown>): Promise<any>;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/** Pre-configured SQL/ODBC queries. */
|
|
92
|
+
const odbc: {
|
|
93
|
+
execute(...args: any[]): Promise<any>;
|
|
94
|
+
executeAsync(...args: any[]): Promise<any>;
|
|
95
|
+
/** Run a saved ODBC query by name. */
|
|
96
|
+
executeQuery(queryName: string, params?: Record<string, unknown>): Promise<{ rows: any[]; rowCount?: number; columns?: string[] }>;
|
|
97
|
+
executeQueryAsync(...args: any[]): Promise<any>;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
/** Plex ERP data sources (handles URL routing, basic-auth, retry/backoff, size cap). */
|
|
101
|
+
const plex: {
|
|
102
|
+
/** Call a Plex data source. */
|
|
103
|
+
execute(opts: { companyCode?: string; credentialName?: string; dataSourceId: number; isTest?: boolean; body?: Record<string, unknown> }): Promise<{ rows?: any[]; outputs?: Record<string, unknown>; [k: string]: unknown }>;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/** Role administration. */
|
|
107
|
+
const roles: {
|
|
108
|
+
create(...args: any[]): Promise<any>;
|
|
109
|
+
delete(...args: any[]): Promise<any>;
|
|
110
|
+
get(...args: any[]): Promise<any>;
|
|
111
|
+
list(...args: any[]): Promise<any>;
|
|
112
|
+
update(...args: any[]): Promise<any>;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/** Call other scripts. */
|
|
116
|
+
const scripts: {
|
|
117
|
+
include(name: string): unknown;
|
|
118
|
+
run(name: string, inputs?: Record<string, unknown>): Promise<unknown>;
|
|
119
|
+
runAsync(name: string, inputs?: Record<string, unknown>): Promise<{ executionId: string }>;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
/** Traceability serial-number series. */
|
|
123
|
+
const serial: {
|
|
124
|
+
batch(series: string, count: number, context?: Record<string, unknown>): Promise<Array<{ serialNumber: string; recordId: string }>>;
|
|
125
|
+
info(...args: any[]): Promise<any>;
|
|
126
|
+
list(...args: any[]): Promise<any>;
|
|
127
|
+
next(series: string, context?: Record<string, unknown>): Promise<{ serialNumber: string; recordId: string }>;
|
|
128
|
+
preview(series: string): Promise<string>;
|
|
129
|
+
register(...args: any[]): Promise<any>;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
/** Shipping rates, labels, and tracking. */
|
|
133
|
+
const shipping: {
|
|
134
|
+
bookLTLQuote(...args: any[]): Promise<any>;
|
|
135
|
+
createLabel(...args: any[]): Promise<any>;
|
|
136
|
+
estimateRates(...args: any[]): Promise<any>;
|
|
137
|
+
getCarrier(...args: any[]): Promise<any>;
|
|
138
|
+
getLTLQuote(...args: any[]): Promise<any>;
|
|
139
|
+
getLTLSpotQuote(...args: any[]): Promise<any>;
|
|
140
|
+
getLabel(...args: any[]): Promise<any>;
|
|
141
|
+
getRates(...args: any[]): Promise<any>;
|
|
142
|
+
listCarrierServices(...args: any[]): Promise<any>;
|
|
143
|
+
listCarriers(...args: any[]): Promise<any>;
|
|
144
|
+
listLTLCarriers(...args: any[]): Promise<any>;
|
|
145
|
+
listPackageTypes(...args: any[]): Promise<any>;
|
|
146
|
+
trackByLabelId(...args: any[]): Promise<any>;
|
|
147
|
+
trackShipment(...args: any[]): Promise<any>;
|
|
148
|
+
validateAddress(...args: any[]): Promise<any>;
|
|
149
|
+
voidLabel(...args: any[]): Promise<any>;
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
/** Lookup tables (key/value). */
|
|
153
|
+
const tables: {
|
|
154
|
+
clear(...args: any[]): Promise<any>;
|
|
155
|
+
exists(table: string, key: string): Promise<boolean>;
|
|
156
|
+
get(table: string, key: string): Promise<unknown>;
|
|
157
|
+
getAll(table: string): Promise<Record<string, unknown>>;
|
|
158
|
+
getValue(table: string, key: string): Promise<unknown>;
|
|
159
|
+
list(...args: any[]): Promise<any>;
|
|
160
|
+
listTables(...args: any[]): Promise<any>;
|
|
161
|
+
set(table: string, key: string, value: unknown): Promise<void>;
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
/** User administration. */
|
|
165
|
+
const users: {
|
|
166
|
+
assignRole(...args: any[]): Promise<any>;
|
|
167
|
+
assignRoles(...args: any[]): Promise<any>;
|
|
168
|
+
getRoles(...args: any[]): Promise<any>;
|
|
169
|
+
list(...args: any[]): Promise<any>;
|
|
170
|
+
removeRole(...args: any[]): Promise<any>;
|
|
171
|
+
removeRoles(...args: any[]): Promise<any>;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
/** ZPL label helpers. */
|
|
175
|
+
const zpl: {
|
|
176
|
+
fromTemplate(...args: any[]): Promise<any>;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
/** Script entry point. */
|
|
180
|
+
function main(context: DmContext): unknown | Promise<unknown>;
|
|
181
|
+
}
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin platform API client for the CLI (metadata fetch + publish).
|
|
3
|
+
*
|
|
4
|
+
* Endpoint paths and response field names verified against the Go handlers:
|
|
5
|
+
* - `GET /api/script-engine/lookup-tables/:id` → `{ success, table, data }`
|
|
6
|
+
* (`internal/infrastructure/scriptEngineLookupHandlers.go:490`); the table's
|
|
7
|
+
* `value_schema` is `[]SchemaField{ name, type, lookup_table_id?, description? }`
|
|
8
|
+
* (`internal/models/script_engine_lookup.go:1151`).
|
|
9
|
+
* - `GET /api/odbc/queries/:id` → bare `ODBCQuery` object with
|
|
10
|
+
* `parameters: [{ name, type, default }]` (`internal/infrastructure/odbcHandlers.go:91`,
|
|
11
|
+
* `internal/models/odbc_query.go:17`). NOTE: the design doc said
|
|
12
|
+
* `/api/sql/queries/:id`; the real route is `/api/odbc/queries/:id`
|
|
13
|
+
* (`internal/infrastructure/scriptEngineRoutes.go:122`).
|
|
14
|
+
* - `GET /api/script-engine/scripts/:id` → `{ success, script }` with
|
|
15
|
+
* `script.script_name` (`internal/infrastructure/scriptEngineHandlers.go:338`).
|
|
16
|
+
* - `GET /api/traceability/series/:id` → bare `TraceabilitySeries` (camelCase:
|
|
17
|
+
* `name`, `formatString`, `contextSchema`; ids serialize as strings)
|
|
18
|
+
* (`internal/infrastructure/traceabilityHandlers.go:211`,
|
|
19
|
+
* `internal/models/manufacturing_printing.go:148`).
|
|
20
|
+
* - `GET /api/printers` → `{ printers: [...] }` (camelCase `Printer`,
|
|
21
|
+
* `printerId` serialized as string) (`internal/infrastructure/connectorHandlers.go:704`).
|
|
22
|
+
*/
|
|
23
|
+
export interface SchemaField {
|
|
24
|
+
name: string;
|
|
25
|
+
type: string;
|
|
26
|
+
lookup_table_id?: number;
|
|
27
|
+
display_field?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface LookupTableMeta {
|
|
31
|
+
lookup_table_id: number;
|
|
32
|
+
table_name: string;
|
|
33
|
+
description?: string | null;
|
|
34
|
+
value_schema?: SchemaField[] | null;
|
|
35
|
+
}
|
|
36
|
+
/** Lookup-table list item (`GET /api/script-engine/lookup-tables` → `tables`). */
|
|
37
|
+
export interface LookupTableListItem {
|
|
38
|
+
lookup_table_id: number;
|
|
39
|
+
table_name: string;
|
|
40
|
+
description?: string | null;
|
|
41
|
+
}
|
|
42
|
+
export interface OdbcQueryParameter {
|
|
43
|
+
name: string;
|
|
44
|
+
type: string;
|
|
45
|
+
default?: string | null;
|
|
46
|
+
}
|
|
47
|
+
export interface OdbcQueryMeta {
|
|
48
|
+
query_id: string;
|
|
49
|
+
query_name: string;
|
|
50
|
+
description?: string | null;
|
|
51
|
+
parameters?: OdbcQueryParameter[] | null;
|
|
52
|
+
}
|
|
53
|
+
export interface ScriptMeta {
|
|
54
|
+
script_id: number;
|
|
55
|
+
script_name: string;
|
|
56
|
+
description?: string | null;
|
|
57
|
+
}
|
|
58
|
+
/** Full script record (`GET /scripts/:id` → `script`) — the attributes dm pulls. */
|
|
59
|
+
export interface ScriptDetail {
|
|
60
|
+
script_id: number;
|
|
61
|
+
script_name: string;
|
|
62
|
+
description?: string | null;
|
|
63
|
+
category?: string | null;
|
|
64
|
+
tags?: string[] | null;
|
|
65
|
+
is_active?: boolean;
|
|
66
|
+
timeout_seconds?: number;
|
|
67
|
+
max_memory_mb?: number;
|
|
68
|
+
priority?: number;
|
|
69
|
+
is_report_generator?: boolean;
|
|
70
|
+
report_type?: string | null;
|
|
71
|
+
generate_documents?: boolean;
|
|
72
|
+
output_format?: string | null;
|
|
73
|
+
title_jsonpath?: string | null;
|
|
74
|
+
summary_jsonpath?: string | null;
|
|
75
|
+
wait_for_generation?: boolean;
|
|
76
|
+
}
|
|
77
|
+
/** Script version row (`GET /scripts/:id/versions` → `versions`). */
|
|
78
|
+
export interface ScriptVersionRow {
|
|
79
|
+
version_id: string;
|
|
80
|
+
version_number: number;
|
|
81
|
+
script_code: string;
|
|
82
|
+
change_description?: string | null;
|
|
83
|
+
is_current: boolean;
|
|
84
|
+
}
|
|
85
|
+
/** Outcome of `POST /scripts/:id/test-run` (engine waits for completion). */
|
|
86
|
+
export interface ScriptTestRunResult {
|
|
87
|
+
execution_id: string;
|
|
88
|
+
completed: boolean;
|
|
89
|
+
execution?: {
|
|
90
|
+
status: string;
|
|
91
|
+
output_data?: unknown;
|
|
92
|
+
error_message?: string | null;
|
|
93
|
+
error_code?: string | null;
|
|
94
|
+
execution_time_ms?: number;
|
|
95
|
+
console_logs?: string[];
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** Metadata fields accepted by `PUT /scripts/:id` (code goes via a version). */
|
|
99
|
+
export interface ScriptUpdateBody {
|
|
100
|
+
script_name?: string;
|
|
101
|
+
description?: string | null;
|
|
102
|
+
category?: string | null;
|
|
103
|
+
is_report_generator?: boolean;
|
|
104
|
+
report_type?: string | null;
|
|
105
|
+
tags?: string[];
|
|
106
|
+
timeout_seconds?: number;
|
|
107
|
+
max_memory_mb?: number;
|
|
108
|
+
priority?: number;
|
|
109
|
+
is_active?: boolean;
|
|
110
|
+
}
|
|
111
|
+
/** Fields accepted by `POST /scripts` (create). */
|
|
112
|
+
export interface ScriptCreateBody {
|
|
113
|
+
script_name: string;
|
|
114
|
+
description?: string | null;
|
|
115
|
+
category?: string | null;
|
|
116
|
+
is_report_generator?: boolean;
|
|
117
|
+
report_type?: string | null;
|
|
118
|
+
tags?: string[];
|
|
119
|
+
timeout_seconds?: number;
|
|
120
|
+
max_memory_mb?: number;
|
|
121
|
+
priority?: number;
|
|
122
|
+
}
|
|
123
|
+
/** Full ODBC query record (`GET /odbc/queries/:id`). */
|
|
124
|
+
export interface OdbcQueryDetail {
|
|
125
|
+
query_id: string;
|
|
126
|
+
query_name: string;
|
|
127
|
+
query_text: string;
|
|
128
|
+
description?: string | null;
|
|
129
|
+
parameters?: OdbcQueryParameter[] | null;
|
|
130
|
+
timeout_seconds?: number;
|
|
131
|
+
credential_id?: number | null;
|
|
132
|
+
credential_name?: string | null;
|
|
133
|
+
}
|
|
134
|
+
/** Body for `POST`/`PUT /odbc/queries`. */
|
|
135
|
+
export interface OdbcQueryBody {
|
|
136
|
+
query_name: string;
|
|
137
|
+
query_text: string;
|
|
138
|
+
description: string;
|
|
139
|
+
parameters: OdbcQueryParameter[];
|
|
140
|
+
timeout_seconds: number;
|
|
141
|
+
credential_id?: number | null;
|
|
142
|
+
}
|
|
143
|
+
/** Outcome of `POST /odbc/test-run` (engine waits for the worker result). */
|
|
144
|
+
export interface OdbcTestRunResult {
|
|
145
|
+
execution_id: string;
|
|
146
|
+
status: string;
|
|
147
|
+
duration_ms?: number;
|
|
148
|
+
row_count?: number;
|
|
149
|
+
rows?: Record<string, unknown>[];
|
|
150
|
+
columns?: string[];
|
|
151
|
+
error?: string;
|
|
152
|
+
}
|
|
153
|
+
/** Script authoring client used by `dm script`. */
|
|
154
|
+
export interface PlatformScriptClient {
|
|
155
|
+
getScriptDetail(id: number): Promise<ScriptDetail>;
|
|
156
|
+
getScriptVersions(id: number): Promise<ScriptVersionRow[]>;
|
|
157
|
+
testRunScript(id: number, scriptCode: string, inputContext: Record<string, unknown>): Promise<ScriptTestRunResult>;
|
|
158
|
+
updateScript(id: number, body: ScriptUpdateBody): Promise<void>;
|
|
159
|
+
createScript(body: ScriptCreateBody): Promise<number>;
|
|
160
|
+
createScriptVersion(id: number, scriptCode: string, versionNotes?: string): Promise<void>;
|
|
161
|
+
}
|
|
162
|
+
/** ODBC/SQL query client used by `dm sql`. */
|
|
163
|
+
export interface PlatformSqlClient {
|
|
164
|
+
listOdbcQueries(): Promise<OdbcQueryMeta[]>;
|
|
165
|
+
getOdbcQueryDetail(id: number): Promise<OdbcQueryDetail>;
|
|
166
|
+
createOdbcQuery(body: OdbcQueryBody): Promise<number>;
|
|
167
|
+
updateOdbcQuery(id: number, body: OdbcQueryBody): Promise<void>;
|
|
168
|
+
testRunOdbc(body: {
|
|
169
|
+
query_id?: string;
|
|
170
|
+
query_text: string;
|
|
171
|
+
credential_id: number;
|
|
172
|
+
parameters: Record<string, unknown>;
|
|
173
|
+
timeout_seconds: number;
|
|
174
|
+
}): Promise<OdbcTestRunResult>;
|
|
175
|
+
}
|
|
176
|
+
export interface SeriesMeta {
|
|
177
|
+
seriesId: string;
|
|
178
|
+
name: string;
|
|
179
|
+
formatString: string;
|
|
180
|
+
contextSchema?: unknown;
|
|
181
|
+
}
|
|
182
|
+
export interface PrinterMeta {
|
|
183
|
+
printerId: string;
|
|
184
|
+
name: string;
|
|
185
|
+
type: string;
|
|
186
|
+
protocol?: string;
|
|
187
|
+
dpi?: number;
|
|
188
|
+
isZplCompatible?: boolean;
|
|
189
|
+
}
|
|
190
|
+
/** Abstract metadata client — stubbed in tests. */
|
|
191
|
+
export interface PlatformMetadataClient {
|
|
192
|
+
getLookupTable(id: number): Promise<LookupTableMeta>;
|
|
193
|
+
getOdbcQuery(id: number): Promise<OdbcQueryMeta>;
|
|
194
|
+
getScript(id: number): Promise<ScriptMeta>;
|
|
195
|
+
getSeries(id: number): Promise<SeriesMeta>;
|
|
196
|
+
listPrinters(): Promise<PrinterMeta[]>;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Resource-listing client used by `dm add` to browse a tenant's resources.
|
|
200
|
+
* Each method maps to a company-scoped `GET` list endpoint (verified against
|
|
201
|
+
* the Go handlers — see the file header).
|
|
202
|
+
*/
|
|
203
|
+
export interface PlatformListClient {
|
|
204
|
+
listLookupTables(): Promise<LookupTableListItem[]>;
|
|
205
|
+
listOdbcQueries(): Promise<OdbcQueryMeta[]>;
|
|
206
|
+
listScripts(): Promise<ScriptMeta[]>;
|
|
207
|
+
listSeries(): Promise<SeriesMeta[]>;
|
|
208
|
+
listPrinters(): Promise<PrinterMeta[]>;
|
|
209
|
+
}
|
|
210
|
+
export declare class PlatformApiError extends Error {
|
|
211
|
+
readonly status: number;
|
|
212
|
+
readonly path: string;
|
|
213
|
+
constructor(status: number, path: string, message: string);
|
|
214
|
+
}
|
|
215
|
+
export declare class PlatformClient implements PlatformMetadataClient, PlatformListClient, PlatformScriptClient, PlatformSqlClient {
|
|
216
|
+
private readonly baseUrl;
|
|
217
|
+
private readonly token;
|
|
218
|
+
private readonly fetchImpl;
|
|
219
|
+
constructor(baseUrl: string, token: string, fetchImpl?: typeof fetch);
|
|
220
|
+
private getJson;
|
|
221
|
+
private sendJson;
|
|
222
|
+
getLookupTable(id: number): Promise<LookupTableMeta>;
|
|
223
|
+
getOdbcQuery(id: number): Promise<OdbcQueryMeta>;
|
|
224
|
+
getScript(id: number): Promise<ScriptMeta>;
|
|
225
|
+
getSeries(id: number): Promise<SeriesMeta>;
|
|
226
|
+
listPrinters(): Promise<PrinterMeta[]>;
|
|
227
|
+
listLookupTables(): Promise<LookupTableListItem[]>;
|
|
228
|
+
listOdbcQueries(): Promise<OdbcQueryMeta[]>;
|
|
229
|
+
listScripts(): Promise<ScriptMeta[]>;
|
|
230
|
+
listSeries(): Promise<SeriesMeta[]>;
|
|
231
|
+
getScriptDetail(id: number): Promise<ScriptDetail>;
|
|
232
|
+
getScriptVersions(id: number): Promise<ScriptVersionRow[]>;
|
|
233
|
+
testRunScript(id: number, scriptCode: string, inputContext: Record<string, unknown>): Promise<ScriptTestRunResult>;
|
|
234
|
+
updateScript(id: number, body: ScriptUpdateBody): Promise<void>;
|
|
235
|
+
createScript(body: ScriptCreateBody): Promise<number>;
|
|
236
|
+
createScriptVersion(id: number, scriptCode: string, versionNotes?: string): Promise<void>;
|
|
237
|
+
getOdbcQueryDetail(id: number): Promise<OdbcQueryDetail>;
|
|
238
|
+
createOdbcQuery(body: OdbcQueryBody): Promise<number>;
|
|
239
|
+
updateOdbcQuery(id: number, body: OdbcQueryBody): Promise<void>;
|
|
240
|
+
testRunOdbc(body: {
|
|
241
|
+
query_id?: string;
|
|
242
|
+
query_text: string;
|
|
243
|
+
credential_id: number;
|
|
244
|
+
parameters: Record<string, unknown>;
|
|
245
|
+
timeout_seconds: number;
|
|
246
|
+
}): Promise<OdbcTestRunResult>;
|
|
247
|
+
}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin platform API client for the CLI (metadata fetch + publish).
|
|
3
|
+
*
|
|
4
|
+
* Endpoint paths and response field names verified against the Go handlers:
|
|
5
|
+
* - `GET /api/script-engine/lookup-tables/:id` → `{ success, table, data }`
|
|
6
|
+
* (`internal/infrastructure/scriptEngineLookupHandlers.go:490`); the table's
|
|
7
|
+
* `value_schema` is `[]SchemaField{ name, type, lookup_table_id?, description? }`
|
|
8
|
+
* (`internal/models/script_engine_lookup.go:1151`).
|
|
9
|
+
* - `GET /api/odbc/queries/:id` → bare `ODBCQuery` object with
|
|
10
|
+
* `parameters: [{ name, type, default }]` (`internal/infrastructure/odbcHandlers.go:91`,
|
|
11
|
+
* `internal/models/odbc_query.go:17`). NOTE: the design doc said
|
|
12
|
+
* `/api/sql/queries/:id`; the real route is `/api/odbc/queries/:id`
|
|
13
|
+
* (`internal/infrastructure/scriptEngineRoutes.go:122`).
|
|
14
|
+
* - `GET /api/script-engine/scripts/:id` → `{ success, script }` with
|
|
15
|
+
* `script.script_name` (`internal/infrastructure/scriptEngineHandlers.go:338`).
|
|
16
|
+
* - `GET /api/traceability/series/:id` → bare `TraceabilitySeries` (camelCase:
|
|
17
|
+
* `name`, `formatString`, `contextSchema`; ids serialize as strings)
|
|
18
|
+
* (`internal/infrastructure/traceabilityHandlers.go:211`,
|
|
19
|
+
* `internal/models/manufacturing_printing.go:148`).
|
|
20
|
+
* - `GET /api/printers` → `{ printers: [...] }` (camelCase `Printer`,
|
|
21
|
+
* `printerId` serialized as string) (`internal/infrastructure/connectorHandlers.go:704`).
|
|
22
|
+
*/
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// HTTP implementation
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
export class PlatformApiError extends Error {
|
|
27
|
+
status;
|
|
28
|
+
path;
|
|
29
|
+
constructor(status, path, message) {
|
|
30
|
+
super(`${path}: ${message} (HTTP ${status})`);
|
|
31
|
+
this.status = status;
|
|
32
|
+
this.path = path;
|
|
33
|
+
this.name = 'PlatformApiError';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class PlatformClient {
|
|
37
|
+
baseUrl;
|
|
38
|
+
token;
|
|
39
|
+
fetchImpl;
|
|
40
|
+
constructor(baseUrl, token, fetchImpl = fetch) {
|
|
41
|
+
this.baseUrl = baseUrl;
|
|
42
|
+
this.token = token;
|
|
43
|
+
this.fetchImpl = fetchImpl;
|
|
44
|
+
this.baseUrl = baseUrl.replace(/\/$/, '');
|
|
45
|
+
}
|
|
46
|
+
async getJson(path) {
|
|
47
|
+
const res = await this.fetchImpl(`${this.baseUrl}${path}`, {
|
|
48
|
+
headers: { Authorization: `Bearer ${this.token}`, Accept: 'application/json' },
|
|
49
|
+
});
|
|
50
|
+
if (!res.ok) {
|
|
51
|
+
let message = res.statusText || 'request failed';
|
|
52
|
+
try {
|
|
53
|
+
const body = (await res.json());
|
|
54
|
+
const m = body['error'] ?? body['message'];
|
|
55
|
+
if (typeof m === 'string')
|
|
56
|
+
message = m;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
/* non-JSON body */
|
|
60
|
+
}
|
|
61
|
+
throw new PlatformApiError(res.status, path, message);
|
|
62
|
+
}
|
|
63
|
+
return res.json();
|
|
64
|
+
}
|
|
65
|
+
async sendJson(method, path, body) {
|
|
66
|
+
const res = await this.fetchImpl(`${this.baseUrl}${path}`, {
|
|
67
|
+
method,
|
|
68
|
+
headers: {
|
|
69
|
+
Authorization: `Bearer ${this.token}`,
|
|
70
|
+
Accept: 'application/json',
|
|
71
|
+
'Content-Type': 'application/json',
|
|
72
|
+
},
|
|
73
|
+
body: JSON.stringify(body),
|
|
74
|
+
});
|
|
75
|
+
if (!res.ok) {
|
|
76
|
+
let message = res.statusText || 'request failed';
|
|
77
|
+
try {
|
|
78
|
+
const errBody = (await res.json());
|
|
79
|
+
const m = errBody['error'] ?? errBody['message'];
|
|
80
|
+
if (typeof m === 'string')
|
|
81
|
+
message = m;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
/* non-JSON body */
|
|
85
|
+
}
|
|
86
|
+
throw new PlatformApiError(res.status, path, message);
|
|
87
|
+
}
|
|
88
|
+
return res.json();
|
|
89
|
+
}
|
|
90
|
+
async getLookupTable(id) {
|
|
91
|
+
const body = (await this.getJson(`/api/script-engine/lookup-tables/${id}`));
|
|
92
|
+
if (!body.table) {
|
|
93
|
+
throw new PlatformApiError(200, `/api/script-engine/lookup-tables/${id}`, 'response missing "table"');
|
|
94
|
+
}
|
|
95
|
+
const table = body.table;
|
|
96
|
+
// value_schema is JSONB (json.RawMessage): may arrive as array, null, or string.
|
|
97
|
+
let schema = [];
|
|
98
|
+
const vs = table.value_schema;
|
|
99
|
+
if (Array.isArray(vs))
|
|
100
|
+
schema = vs;
|
|
101
|
+
else if (typeof vs === 'string' && vs.trim() !== '') {
|
|
102
|
+
try {
|
|
103
|
+
const parsed = JSON.parse(vs);
|
|
104
|
+
if (Array.isArray(parsed))
|
|
105
|
+
schema = parsed;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
/* leave empty */
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return { ...table, value_schema: schema };
|
|
112
|
+
}
|
|
113
|
+
async getOdbcQuery(id) {
|
|
114
|
+
return (await this.getJson(`/api/odbc/queries/${id}`));
|
|
115
|
+
}
|
|
116
|
+
async getScript(id) {
|
|
117
|
+
const body = (await this.getJson(`/api/script-engine/scripts/${id}`));
|
|
118
|
+
if (!body.script) {
|
|
119
|
+
throw new PlatformApiError(200, `/api/script-engine/scripts/${id}`, 'response missing "script"');
|
|
120
|
+
}
|
|
121
|
+
return body.script;
|
|
122
|
+
}
|
|
123
|
+
async getSeries(id) {
|
|
124
|
+
return (await this.getJson(`/api/traceability/series/${id}`));
|
|
125
|
+
}
|
|
126
|
+
async listPrinters() {
|
|
127
|
+
const body = (await this.getJson('/api/printers'));
|
|
128
|
+
return Array.isArray(body.printers) ? body.printers : [];
|
|
129
|
+
}
|
|
130
|
+
// --- Resource listing (dm add) -------------------------------------------
|
|
131
|
+
async listLookupTables() {
|
|
132
|
+
const body = (await this.getJson('/api/script-engine/lookup-tables'));
|
|
133
|
+
return Array.isArray(body.tables) ? body.tables : [];
|
|
134
|
+
}
|
|
135
|
+
async listOdbcQueries() {
|
|
136
|
+
const body = (await this.getJson('/api/odbc/queries'));
|
|
137
|
+
return Array.isArray(body.queries) ? body.queries : [];
|
|
138
|
+
}
|
|
139
|
+
async listScripts() {
|
|
140
|
+
const body = (await this.getJson('/api/script-engine/scripts'));
|
|
141
|
+
return Array.isArray(body.scripts) ? body.scripts : [];
|
|
142
|
+
}
|
|
143
|
+
async listSeries() {
|
|
144
|
+
const body = (await this.getJson('/api/traceability/series'));
|
|
145
|
+
return Array.isArray(body.series) ? body.series : [];
|
|
146
|
+
}
|
|
147
|
+
// --- Script authoring (dm script) ----------------------------------------
|
|
148
|
+
async getScriptDetail(id) {
|
|
149
|
+
const body = (await this.getJson(`/api/script-engine/scripts/${id}`));
|
|
150
|
+
if (!body.script) {
|
|
151
|
+
throw new PlatformApiError(200, `/api/script-engine/scripts/${id}`, 'response missing "script"');
|
|
152
|
+
}
|
|
153
|
+
return body.script;
|
|
154
|
+
}
|
|
155
|
+
async getScriptVersions(id) {
|
|
156
|
+
const body = (await this.getJson(`/api/script-engine/scripts/${id}/versions`));
|
|
157
|
+
return Array.isArray(body.versions) ? body.versions : [];
|
|
158
|
+
}
|
|
159
|
+
async testRunScript(id, scriptCode, inputContext) {
|
|
160
|
+
return (await this.sendJson('POST', `/api/script-engine/scripts/${id}/test-run`, {
|
|
161
|
+
script_code: scriptCode,
|
|
162
|
+
input_context: inputContext,
|
|
163
|
+
}));
|
|
164
|
+
}
|
|
165
|
+
async updateScript(id, body) {
|
|
166
|
+
await this.sendJson('PUT', `/api/script-engine/scripts/${id}`, body);
|
|
167
|
+
}
|
|
168
|
+
async createScript(body) {
|
|
169
|
+
const res = (await this.sendJson('POST', '/api/script-engine/scripts', body));
|
|
170
|
+
if (typeof res.script_id !== 'number') {
|
|
171
|
+
throw new PlatformApiError(200, '/api/script-engine/scripts', 'response missing "script_id"');
|
|
172
|
+
}
|
|
173
|
+
return res.script_id;
|
|
174
|
+
}
|
|
175
|
+
async createScriptVersion(id, scriptCode, versionNotes) {
|
|
176
|
+
await this.sendJson('POST', `/api/script-engine/scripts/${id}/versions`, {
|
|
177
|
+
script_code: scriptCode,
|
|
178
|
+
version_notes: versionNotes ?? null,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
// --- SQL/ODBC authoring (dm sql) -----------------------------------------
|
|
182
|
+
async getOdbcQueryDetail(id) {
|
|
183
|
+
return (await this.getJson(`/api/odbc/queries/${id}`));
|
|
184
|
+
}
|
|
185
|
+
async createOdbcQuery(body) {
|
|
186
|
+
const res = (await this.sendJson('POST', '/api/odbc/queries', body));
|
|
187
|
+
const id = Number(res.query_id);
|
|
188
|
+
if (!Number.isInteger(id) || id <= 0) {
|
|
189
|
+
throw new PlatformApiError(200, '/api/odbc/queries', 'response missing "query_id"');
|
|
190
|
+
}
|
|
191
|
+
return id;
|
|
192
|
+
}
|
|
193
|
+
async updateOdbcQuery(id, body) {
|
|
194
|
+
await this.sendJson('PUT', `/api/odbc/queries/${id}`, body);
|
|
195
|
+
}
|
|
196
|
+
async testRunOdbc(body) {
|
|
197
|
+
return (await this.sendJson('POST', '/api/odbc/test-run', body));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|