@uns-kit/core 2.0.15 → 2.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -0
- package/dist/tools/file-utils.d.ts +3 -0
- package/dist/tools/file-utils.d.ts.map +1 -0
- package/dist/tools/file-utils.js +25 -0
- package/dist/tools/file-utils.js.map +1 -0
- package/dist/tools/generate-uns-dictionary.d.ts +15 -0
- package/dist/tools/generate-uns-dictionary.d.ts.map +1 -1
- package/dist/tools/generate-uns-dictionary.js +35 -17
- package/dist/tools/generate-uns-dictionary.js.map +1 -1
- package/dist/tools/generate-uns-measurements.d.ts +15 -0
- package/dist/tools/generate-uns-measurements.d.ts.map +1 -1
- package/dist/tools/generate-uns-measurements.js +28 -11
- package/dist/tools/generate-uns-measurements.js.map +1 -1
- package/dist/tools/generate-uns-reference.js +10 -4
- package/dist/tools/generate-uns-reference.js.map +1 -1
- package/dist/tools/sync-uns-schema.d.ts +3 -0
- package/dist/tools/sync-uns-schema.d.ts.map +1 -0
- package/dist/tools/sync-uns-schema.js +360 -0
- package/dist/tools/sync-uns-schema.js.map +1 -0
- package/dist/uns/uns-attributes.d.ts +2 -2
- package/dist/uns/uns-attributes.d.ts.map +1 -1
- package/dist/uns/uns-dictionary.generated.d.ts +636 -129
- package/dist/uns/uns-dictionary.generated.d.ts.map +1 -1
- package/dist/uns/uns-dictionary.generated.js +696 -183
- package/dist/uns/uns-dictionary.generated.js.map +1 -1
- package/dist/uns/uns-interfaces.d.ts +22 -0
- package/dist/uns/uns-interfaces.d.ts.map +1 -1
- package/dist/uns/uns-interfaces.js.map +1 -1
- package/dist/uns/uns-measurements.d.ts +65 -65
- package/dist/uns/uns-measurements.generated.d.ts +329 -65
- package/dist/uns/uns-measurements.generated.d.ts.map +1 -1
- package/dist/uns/uns-measurements.generated.js +330 -66
- package/dist/uns/uns-measurements.generated.js.map +1 -1
- package/dist/uns/uns-object.d.ts +5 -4
- package/dist/uns/uns-object.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import process from "node:process";
|
|
5
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
6
|
+
import { readTextFileIfExists, writeTextFileIfChanged } from "./file-utils.js";
|
|
7
|
+
import { renderDictionaryTs } from "./generate-uns-dictionary.js";
|
|
8
|
+
import { renderMeasurementsTs } from "./generate-uns-measurements.js";
|
|
9
|
+
const DEFAULT_STATUS = "active";
|
|
10
|
+
const GENERATOR_LANG = "sl";
|
|
11
|
+
const STATUS_VALUES = ["active", "draft", "deprecated", "all"];
|
|
12
|
+
const isDirectExecution = process.argv[1]
|
|
13
|
+
? import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href
|
|
14
|
+
: false;
|
|
15
|
+
async function main() {
|
|
16
|
+
const args = parseArgs(process.argv.slice(2));
|
|
17
|
+
if (args.help) {
|
|
18
|
+
printHelp();
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const repoRoot = await findRepoRoot();
|
|
22
|
+
const files = {
|
|
23
|
+
dictionaryJson: path.join(repoRoot, "packages/uns-cli/templates/uns-dictionary/uns-dictionary.json"),
|
|
24
|
+
measurementsJson: path.join(repoRoot, "packages/uns-cli/templates/uns-measurements/uns-measurements.json"),
|
|
25
|
+
dictionaryGenerated: [
|
|
26
|
+
path.join(repoRoot, "packages/uns-core/src/uns/uns-dictionary.generated.ts"),
|
|
27
|
+
path.join(repoRoot, "packages/uns-cli/templates/default/src/uns/uns-dictionary.generated.ts"),
|
|
28
|
+
],
|
|
29
|
+
measurementsGenerated: [
|
|
30
|
+
path.join(repoRoot, "packages/uns-core/src/uns/uns-measurements.generated.ts"),
|
|
31
|
+
path.join(repoRoot, "packages/uns-cli/templates/default/src/uns/uns-measurements.generated.ts"),
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
const shouldSyncDictionary = !args.measurementsOnly;
|
|
35
|
+
const shouldSyncMeasurements = !args.dictionaryOnly;
|
|
36
|
+
const [dictionaryDocument, measurementsDocument] = await Promise.all([
|
|
37
|
+
shouldSyncDictionary ? fetchDictionaryDocument(args.controllerUrl, args.token, args.status) : Promise.resolve(undefined),
|
|
38
|
+
shouldSyncMeasurements ? fetchMeasurementsDocument(args.controllerUrl, args.token) : Promise.resolve(undefined),
|
|
39
|
+
]);
|
|
40
|
+
let dictionarySummary;
|
|
41
|
+
let measurementsSummary;
|
|
42
|
+
if (dictionaryDocument) {
|
|
43
|
+
const content = formatJsonDocument(dictionaryDocument);
|
|
44
|
+
const jsonResult = await updateFile(files.dictionaryJson, content, repoRoot, args.dryRun);
|
|
45
|
+
const generatedChanged = args.skipGenerate
|
|
46
|
+
? []
|
|
47
|
+
: await updateGeneratedFiles(files.dictionaryGenerated, renderDictionaryTs(dictionaryDocument, GENERATOR_LANG), repoRoot, args.dryRun);
|
|
48
|
+
dictionarySummary = {
|
|
49
|
+
objectTypeCount: Object.keys(dictionaryDocument.objectTypes ?? {}).length,
|
|
50
|
+
attributeCount: Object.keys(dictionaryDocument.attributes ?? {}).length,
|
|
51
|
+
jsonChanged: jsonResult.changed,
|
|
52
|
+
generatedChanged,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (measurementsDocument) {
|
|
56
|
+
const content = formatJsonDocument(measurementsDocument);
|
|
57
|
+
const jsonResult = await updateFile(files.measurementsJson, content, repoRoot, args.dryRun);
|
|
58
|
+
const generatedChanged = args.skipGenerate
|
|
59
|
+
? []
|
|
60
|
+
: await updateGeneratedFiles(files.measurementsGenerated, renderMeasurementsTs(measurementsDocument, GENERATOR_LANG), repoRoot, args.dryRun);
|
|
61
|
+
measurementsSummary = {
|
|
62
|
+
categoryCount: countMeasurementCategories(measurementsDocument),
|
|
63
|
+
jsonChanged: jsonResult.changed,
|
|
64
|
+
generatedChanged,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
printSummary({
|
|
68
|
+
controllerUrl: args.controllerUrl,
|
|
69
|
+
dryRun: args.dryRun,
|
|
70
|
+
skipGenerate: args.skipGenerate,
|
|
71
|
+
status: args.status,
|
|
72
|
+
dictionary: dictionarySummary,
|
|
73
|
+
measurements: measurementsSummary,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function parseArgs(argv) {
|
|
77
|
+
let controllerUrl = process.env.UNS_CONTROLLER_URL?.trim() ?? "";
|
|
78
|
+
let token = process.env.UNS_CONTROLLER_TOKEN?.trim() ?? "";
|
|
79
|
+
let status = normalizeStatus(process.env.UNS_SCHEMA_STATUS, DEFAULT_STATUS);
|
|
80
|
+
let dryRun = false;
|
|
81
|
+
let dictionaryOnly = false;
|
|
82
|
+
let measurementsOnly = false;
|
|
83
|
+
let skipGenerate = false;
|
|
84
|
+
let help = false;
|
|
85
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
86
|
+
const arg = argv[index];
|
|
87
|
+
if (arg === "--help" || arg === "-h") {
|
|
88
|
+
help = true;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (arg === "--dry-run") {
|
|
92
|
+
dryRun = true;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (arg === "--dictionary-only") {
|
|
96
|
+
dictionaryOnly = true;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (arg === "--measurements-only") {
|
|
100
|
+
measurementsOnly = true;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (arg === "--skip-generate") {
|
|
104
|
+
skipGenerate = true;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (arg === "--controller-url") {
|
|
108
|
+
controllerUrl = readRequiredValue(argv, ++index, "--controller-url");
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (arg.startsWith("--controller-url=")) {
|
|
112
|
+
controllerUrl = arg.slice("--controller-url=".length);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (arg === "--token") {
|
|
116
|
+
token = readRequiredValue(argv, ++index, "--token");
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (arg.startsWith("--token=")) {
|
|
120
|
+
token = arg.slice("--token=".length);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (arg === "--status") {
|
|
124
|
+
status = normalizeStatus(readRequiredValue(argv, ++index, "--status"), DEFAULT_STATUS);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (arg.startsWith("--status=")) {
|
|
128
|
+
status = normalizeStatus(arg.slice("--status=".length), DEFAULT_STATUS);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
throw new Error(`Unknown argument: ${arg}`);
|
|
132
|
+
}
|
|
133
|
+
if (!help) {
|
|
134
|
+
if (dictionaryOnly && measurementsOnly) {
|
|
135
|
+
throw new Error("Choose either --dictionary-only or --measurements-only, not both.");
|
|
136
|
+
}
|
|
137
|
+
if (!controllerUrl) {
|
|
138
|
+
throw new Error("Missing controller URL. Use --controller-url or set UNS_CONTROLLER_URL.");
|
|
139
|
+
}
|
|
140
|
+
if (!token) {
|
|
141
|
+
throw new Error("Missing controller token. Use --token or set UNS_CONTROLLER_TOKEN.");
|
|
142
|
+
}
|
|
143
|
+
assertValidUrl(controllerUrl);
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
controllerUrl,
|
|
147
|
+
token,
|
|
148
|
+
status,
|
|
149
|
+
dryRun,
|
|
150
|
+
dictionaryOnly,
|
|
151
|
+
measurementsOnly,
|
|
152
|
+
skipGenerate,
|
|
153
|
+
help,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function readRequiredValue(argv, index, flag) {
|
|
157
|
+
const value = argv[index];
|
|
158
|
+
if (!value) {
|
|
159
|
+
throw new Error(`Missing value for ${flag}.`);
|
|
160
|
+
}
|
|
161
|
+
return value;
|
|
162
|
+
}
|
|
163
|
+
function normalizeStatus(value, fallback) {
|
|
164
|
+
if (!value)
|
|
165
|
+
return fallback;
|
|
166
|
+
const normalized = value.trim().toLowerCase();
|
|
167
|
+
if (STATUS_VALUES.includes(normalized)) {
|
|
168
|
+
return normalized;
|
|
169
|
+
}
|
|
170
|
+
throw new Error(`Invalid --status value "${value}". Expected one of: ${STATUS_VALUES.join(", ")}.`);
|
|
171
|
+
}
|
|
172
|
+
function assertValidUrl(value) {
|
|
173
|
+
try {
|
|
174
|
+
new URL(value);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
throw new Error(`Invalid controller URL "${value}". Expected an absolute URL such as http://localhost:3200.`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function printHelp() {
|
|
181
|
+
console.log(`Usage: tsx packages/uns-core/src/tools/sync-uns-schema.ts [options]
|
|
182
|
+
|
|
183
|
+
Pull the canonical UNS schema export from a controller and refresh the local
|
|
184
|
+
JSON templates plus generated TypeScript artifacts.
|
|
185
|
+
|
|
186
|
+
Options:
|
|
187
|
+
--controller-url <url> Controller base URL (env: UNS_CONTROLLER_URL)
|
|
188
|
+
--token <token> Bearer token for REST export (env: UNS_CONTROLLER_TOKEN)
|
|
189
|
+
--status <value> Dictionary status filter: ${STATUS_VALUES.join("|")} (default: ${DEFAULT_STATUS}, env: UNS_SCHEMA_STATUS)
|
|
190
|
+
--dry-run Report file changes without writing anything
|
|
191
|
+
--dictionary-only Sync only the UNS dictionary export
|
|
192
|
+
--measurements-only Sync only the UNS measurements export
|
|
193
|
+
--skip-generate Skip generated TypeScript refresh
|
|
194
|
+
--help, -h Show this help
|
|
195
|
+
`);
|
|
196
|
+
}
|
|
197
|
+
async function findRepoRoot() {
|
|
198
|
+
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
199
|
+
let probeDir = currentDir;
|
|
200
|
+
while (true) {
|
|
201
|
+
const packageJsonPath = path.join(probeDir, "package.json");
|
|
202
|
+
try {
|
|
203
|
+
const raw = await readFile(packageJsonPath, "utf8");
|
|
204
|
+
const pkg = JSON.parse(raw);
|
|
205
|
+
if (pkg.name === "@uns-kit/core") {
|
|
206
|
+
return path.resolve(probeDir, "../..");
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
// Ignore missing package.json and continue walking upward.
|
|
211
|
+
}
|
|
212
|
+
const parentDir = path.dirname(probeDir);
|
|
213
|
+
if (parentDir === probeDir) {
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
probeDir = parentDir;
|
|
217
|
+
}
|
|
218
|
+
throw new Error("Could not locate the @uns-kit/core package directory from sync-uns-schema.ts.");
|
|
219
|
+
}
|
|
220
|
+
function buildControllerUrl(controllerUrl, relativePath) {
|
|
221
|
+
const base = new URL(controllerUrl);
|
|
222
|
+
if (!base.pathname.endsWith("/")) {
|
|
223
|
+
base.pathname = `${base.pathname}/`;
|
|
224
|
+
}
|
|
225
|
+
return new URL(relativePath, base);
|
|
226
|
+
}
|
|
227
|
+
async function fetchDictionaryDocument(controllerUrl, token, status) {
|
|
228
|
+
const url = buildControllerUrl(controllerUrl, `api/schema/export/uns-dictionary?status=${encodeURIComponent(status)}`);
|
|
229
|
+
const document = await fetchJson(url, token, "UNS dictionary");
|
|
230
|
+
if (!document || typeof document !== "object" || Array.isArray(document)) {
|
|
231
|
+
throw new Error(`Controller returned an invalid UNS dictionary document from ${url.toString()}.`);
|
|
232
|
+
}
|
|
233
|
+
return document;
|
|
234
|
+
}
|
|
235
|
+
async function fetchMeasurementsDocument(controllerUrl, token) {
|
|
236
|
+
const url = buildControllerUrl(controllerUrl, "api/schema/export/uns-measurements");
|
|
237
|
+
const document = await fetchJson(url, token, "UNS measurements");
|
|
238
|
+
if (!document || typeof document !== "object" || Array.isArray(document)) {
|
|
239
|
+
throw new Error(`Controller returned an invalid UNS measurements document from ${url.toString()}.`);
|
|
240
|
+
}
|
|
241
|
+
return document;
|
|
242
|
+
}
|
|
243
|
+
async function fetchJson(url, token, label) {
|
|
244
|
+
let response;
|
|
245
|
+
try {
|
|
246
|
+
response = await fetch(url, {
|
|
247
|
+
headers: {
|
|
248
|
+
Accept: "application/json",
|
|
249
|
+
Authorization: `Bearer ${token}`,
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
throw new Error(`Network failure while fetching ${label} export from ${url.toString()}: ${error.message}`);
|
|
255
|
+
}
|
|
256
|
+
const text = await response.text();
|
|
257
|
+
if (!response.ok) {
|
|
258
|
+
throw new Error(formatHttpError(response, url, label, text));
|
|
259
|
+
}
|
|
260
|
+
try {
|
|
261
|
+
return JSON.parse(text);
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
throw new Error(`Controller returned invalid JSON for the ${label} export from ${url.toString()}.`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function formatHttpError(response, url, label, body) {
|
|
268
|
+
if (response.status === 401) {
|
|
269
|
+
return `Unauthorized (401) while fetching ${label} export from ${url.toString()}. Check --token or UNS_CONTROLLER_TOKEN.`;
|
|
270
|
+
}
|
|
271
|
+
if (response.status === 403) {
|
|
272
|
+
return `Forbidden (403) while fetching ${label} export from ${url.toString()}. The token must have operator or admin access.`;
|
|
273
|
+
}
|
|
274
|
+
const detail = extractErrorDetail(body);
|
|
275
|
+
return `Failed to fetch ${label} export from ${url.toString()}: HTTP ${response.status}${detail ? ` - ${detail}` : ""}`;
|
|
276
|
+
}
|
|
277
|
+
function extractErrorDetail(body) {
|
|
278
|
+
const trimmed = body.trim();
|
|
279
|
+
if (!trimmed)
|
|
280
|
+
return "";
|
|
281
|
+
try {
|
|
282
|
+
const parsed = JSON.parse(trimmed);
|
|
283
|
+
if (typeof parsed.error === "string" && parsed.error.trim().length > 0) {
|
|
284
|
+
return parsed.error.trim();
|
|
285
|
+
}
|
|
286
|
+
if (typeof parsed.message === "string" && parsed.message.trim().length > 0) {
|
|
287
|
+
return parsed.message.trim();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
// Fall back to plain text handling below.
|
|
292
|
+
}
|
|
293
|
+
return trimmed.replace(/\s+/g, " ").slice(0, 200);
|
|
294
|
+
}
|
|
295
|
+
function formatJsonDocument(document) {
|
|
296
|
+
return `${JSON.stringify(document, null, 2)}\n`;
|
|
297
|
+
}
|
|
298
|
+
async function updateGeneratedFiles(filePaths, content, repoRoot, dryRun) {
|
|
299
|
+
return Promise.all(filePaths.map((filePath) => updateFile(filePath, content, repoRoot, dryRun)));
|
|
300
|
+
}
|
|
301
|
+
async function updateFile(filePath, content, repoRoot, dryRun) {
|
|
302
|
+
const current = await readTextFileIfExists(filePath);
|
|
303
|
+
const changed = current !== content;
|
|
304
|
+
const relativePath = path.relative(repoRoot, filePath);
|
|
305
|
+
if (dryRun) {
|
|
306
|
+
console.log(`${changed ? "Would update" : "No change"} ${relativePath}`);
|
|
307
|
+
return { changed, relativePath };
|
|
308
|
+
}
|
|
309
|
+
if (!changed) {
|
|
310
|
+
console.log(`Unchanged ${relativePath}`);
|
|
311
|
+
return { changed: false, relativePath };
|
|
312
|
+
}
|
|
313
|
+
await writeTextFileIfChanged(filePath, content);
|
|
314
|
+
console.log(`Updated ${relativePath}`);
|
|
315
|
+
return { changed: true, relativePath };
|
|
316
|
+
}
|
|
317
|
+
function countMeasurementCategories(document) {
|
|
318
|
+
return Object.entries(document).filter(([key, value]) => {
|
|
319
|
+
if (key === "schemaVersion")
|
|
320
|
+
return false;
|
|
321
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
322
|
+
}).length;
|
|
323
|
+
}
|
|
324
|
+
function printSummary(summary) {
|
|
325
|
+
console.log("");
|
|
326
|
+
console.log(summary.dryRun ? "Dry-run summary" : "Sync summary");
|
|
327
|
+
console.log(` Controller: ${summary.controllerUrl}`);
|
|
328
|
+
console.log(` Dictionary status: ${summary.status}`);
|
|
329
|
+
if (summary.dictionary) {
|
|
330
|
+
console.log(` Dictionary: ${summary.dictionary.objectTypeCount} object types, ${summary.dictionary.attributeCount} attributes, JSON ${summary.dictionary.jsonChanged ? "changed" : "unchanged"}`);
|
|
331
|
+
if (summary.skipGenerate) {
|
|
332
|
+
console.log(" Dictionary TS: skipped");
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
console.log(` Dictionary TS: ${renderGeneratedSummary(summary.dictionary.generatedChanged)}`);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
if (summary.measurements) {
|
|
339
|
+
console.log(` Measurements: ${summary.measurements.categoryCount} categories, JSON ${summary.measurements.jsonChanged ? "changed" : "unchanged"}`);
|
|
340
|
+
if (summary.skipGenerate) {
|
|
341
|
+
console.log(" Measurements TS: skipped");
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
console.log(` Measurements TS: ${renderGeneratedSummary(summary.measurements.generatedChanged)}`);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
function renderGeneratedSummary(results) {
|
|
349
|
+
if (!results.length)
|
|
350
|
+
return "none";
|
|
351
|
+
const changedCount = results.filter((result) => result.changed).length;
|
|
352
|
+
return `${changedCount}/${results.length} file${results.length === 1 ? "" : "s"} changed`;
|
|
353
|
+
}
|
|
354
|
+
if (isDirectExecution) {
|
|
355
|
+
main().catch((error) => {
|
|
356
|
+
console.error("Failed to sync UNS schema:", error instanceof Error ? error.message : error);
|
|
357
|
+
process.exitCode = 1;
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=sync-uns-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-uns-schema.js","sourceRoot":"","sources":["../../src/tools/sync-uns-schema.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { readTextFileIfExists, writeTextFileIfChanged } from \"./file-utils.js\";\nimport { renderDictionaryTs } from \"./generate-uns-dictionary.js\";\nimport { renderMeasurementsTs } from \"./generate-uns-measurements.js\";\n\ntype SchemaStatus = \"active\" | \"draft\" | \"deprecated\" | \"all\";\n\ntype DictionaryDocument = Parameters<typeof renderDictionaryTs>[0];\ntype MeasurementsDocument = Parameters<typeof renderMeasurementsTs>[0];\n\ntype CliArgs = {\n controllerUrl: string;\n token: string;\n status: SchemaStatus;\n dryRun: boolean;\n dictionaryOnly: boolean;\n measurementsOnly: boolean;\n skipGenerate: boolean;\n help: boolean;\n};\n\ntype FileChangeResult = {\n changed: boolean;\n relativePath: string;\n};\n\ntype DictionarySummary = {\n objectTypeCount: number;\n attributeCount: number;\n jsonChanged: boolean;\n generatedChanged: FileChangeResult[];\n};\n\ntype MeasurementsSummary = {\n categoryCount: number;\n jsonChanged: boolean;\n generatedChanged: FileChangeResult[];\n};\n\nconst DEFAULT_STATUS: SchemaStatus = \"active\";\nconst GENERATOR_LANG = \"sl\";\nconst STATUS_VALUES: SchemaStatus[] = [\"active\", \"draft\", \"deprecated\", \"all\"];\n\nconst isDirectExecution = process.argv[1]\n ? import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href\n : false;\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv.slice(2));\n\n if (args.help) {\n printHelp();\n return;\n }\n\n const repoRoot = await findRepoRoot();\n const files = {\n dictionaryJson: path.join(repoRoot, \"packages/uns-cli/templates/uns-dictionary/uns-dictionary.json\"),\n measurementsJson: path.join(repoRoot, \"packages/uns-cli/templates/uns-measurements/uns-measurements.json\"),\n dictionaryGenerated: [\n path.join(repoRoot, \"packages/uns-core/src/uns/uns-dictionary.generated.ts\"),\n path.join(repoRoot, \"packages/uns-cli/templates/default/src/uns/uns-dictionary.generated.ts\"),\n ],\n measurementsGenerated: [\n path.join(repoRoot, \"packages/uns-core/src/uns/uns-measurements.generated.ts\"),\n path.join(repoRoot, \"packages/uns-cli/templates/default/src/uns/uns-measurements.generated.ts\"),\n ],\n };\n\n const shouldSyncDictionary = !args.measurementsOnly;\n const shouldSyncMeasurements = !args.dictionaryOnly;\n\n const [dictionaryDocument, measurementsDocument] = await Promise.all([\n shouldSyncDictionary ? fetchDictionaryDocument(args.controllerUrl, args.token, args.status) : Promise.resolve(undefined),\n shouldSyncMeasurements ? fetchMeasurementsDocument(args.controllerUrl, args.token) : Promise.resolve(undefined),\n ]);\n\n let dictionarySummary: DictionarySummary | undefined;\n let measurementsSummary: MeasurementsSummary | undefined;\n\n if (dictionaryDocument) {\n const content = formatJsonDocument(dictionaryDocument);\n const jsonResult = await updateFile(files.dictionaryJson, content, repoRoot, args.dryRun);\n const generatedChanged = args.skipGenerate\n ? []\n : await updateGeneratedFiles(\n files.dictionaryGenerated,\n renderDictionaryTs(dictionaryDocument, GENERATOR_LANG),\n repoRoot,\n args.dryRun,\n );\n\n dictionarySummary = {\n objectTypeCount: Object.keys(dictionaryDocument.objectTypes ?? {}).length,\n attributeCount: Object.keys(dictionaryDocument.attributes ?? {}).length,\n jsonChanged: jsonResult.changed,\n generatedChanged,\n };\n }\n\n if (measurementsDocument) {\n const content = formatJsonDocument(measurementsDocument);\n const jsonResult = await updateFile(files.measurementsJson, content, repoRoot, args.dryRun);\n const generatedChanged = args.skipGenerate\n ? []\n : await updateGeneratedFiles(\n files.measurementsGenerated,\n renderMeasurementsTs(measurementsDocument, GENERATOR_LANG),\n repoRoot,\n args.dryRun,\n );\n\n measurementsSummary = {\n categoryCount: countMeasurementCategories(measurementsDocument),\n jsonChanged: jsonResult.changed,\n generatedChanged,\n };\n }\n\n printSummary({\n controllerUrl: args.controllerUrl,\n dryRun: args.dryRun,\n skipGenerate: args.skipGenerate,\n status: args.status,\n dictionary: dictionarySummary,\n measurements: measurementsSummary,\n });\n}\n\nfunction parseArgs(argv: string[]): CliArgs {\n let controllerUrl = process.env.UNS_CONTROLLER_URL?.trim() ?? \"\";\n let token = process.env.UNS_CONTROLLER_TOKEN?.trim() ?? \"\";\n let status = normalizeStatus(process.env.UNS_SCHEMA_STATUS, DEFAULT_STATUS);\n let dryRun = false;\n let dictionaryOnly = false;\n let measurementsOnly = false;\n let skipGenerate = false;\n let help = false;\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n\n if (arg === \"--help\" || arg === \"-h\") {\n help = true;\n continue;\n }\n\n if (arg === \"--dry-run\") {\n dryRun = true;\n continue;\n }\n\n if (arg === \"--dictionary-only\") {\n dictionaryOnly = true;\n continue;\n }\n\n if (arg === \"--measurements-only\") {\n measurementsOnly = true;\n continue;\n }\n\n if (arg === \"--skip-generate\") {\n skipGenerate = true;\n continue;\n }\n\n if (arg === \"--controller-url\") {\n controllerUrl = readRequiredValue(argv, ++index, \"--controller-url\");\n continue;\n }\n\n if (arg.startsWith(\"--controller-url=\")) {\n controllerUrl = arg.slice(\"--controller-url=\".length);\n continue;\n }\n\n if (arg === \"--token\") {\n token = readRequiredValue(argv, ++index, \"--token\");\n continue;\n }\n\n if (arg.startsWith(\"--token=\")) {\n token = arg.slice(\"--token=\".length);\n continue;\n }\n\n if (arg === \"--status\") {\n status = normalizeStatus(readRequiredValue(argv, ++index, \"--status\"), DEFAULT_STATUS);\n continue;\n }\n\n if (arg.startsWith(\"--status=\")) {\n status = normalizeStatus(arg.slice(\"--status=\".length), DEFAULT_STATUS);\n continue;\n }\n\n throw new Error(`Unknown argument: ${arg}`);\n }\n\n if (!help) {\n if (dictionaryOnly && measurementsOnly) {\n throw new Error(\"Choose either --dictionary-only or --measurements-only, not both.\");\n }\n if (!controllerUrl) {\n throw new Error(\"Missing controller URL. Use --controller-url or set UNS_CONTROLLER_URL.\");\n }\n if (!token) {\n throw new Error(\"Missing controller token. Use --token or set UNS_CONTROLLER_TOKEN.\");\n }\n assertValidUrl(controllerUrl);\n }\n\n return {\n controllerUrl,\n token,\n status,\n dryRun,\n dictionaryOnly,\n measurementsOnly,\n skipGenerate,\n help,\n };\n}\n\nfunction readRequiredValue(argv: string[], index: number, flag: string): string {\n const value = argv[index];\n if (!value) {\n throw new Error(`Missing value for ${flag}.`);\n }\n return value;\n}\n\nfunction normalizeStatus(value: string | undefined, fallback: SchemaStatus): SchemaStatus {\n if (!value) return fallback;\n const normalized = value.trim().toLowerCase();\n if (STATUS_VALUES.includes(normalized as SchemaStatus)) {\n return normalized as SchemaStatus;\n }\n throw new Error(`Invalid --status value \"${value}\". Expected one of: ${STATUS_VALUES.join(\", \")}.`);\n}\n\nfunction assertValidUrl(value: string): void {\n try {\n new URL(value);\n } catch (error) {\n throw new Error(`Invalid controller URL \"${value}\". Expected an absolute URL such as http://localhost:3200.`);\n }\n}\n\nfunction printHelp(): void {\n console.log(`Usage: tsx packages/uns-core/src/tools/sync-uns-schema.ts [options]\n\nPull the canonical UNS schema export from a controller and refresh the local\nJSON templates plus generated TypeScript artifacts.\n\nOptions:\n --controller-url <url> Controller base URL (env: UNS_CONTROLLER_URL)\n --token <token> Bearer token for REST export (env: UNS_CONTROLLER_TOKEN)\n --status <value> Dictionary status filter: ${STATUS_VALUES.join(\"|\")} (default: ${DEFAULT_STATUS}, env: UNS_SCHEMA_STATUS)\n --dry-run Report file changes without writing anything\n --dictionary-only Sync only the UNS dictionary export\n --measurements-only Sync only the UNS measurements export\n --skip-generate Skip generated TypeScript refresh\n --help, -h Show this help\n`);\n}\n\nasync function findRepoRoot(): Promise<string> {\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n let probeDir = currentDir;\n\n while (true) {\n const packageJsonPath = path.join(probeDir, \"package.json\");\n try {\n const raw = await readFile(packageJsonPath, \"utf8\");\n const pkg = JSON.parse(raw) as { name?: string };\n if (pkg.name === \"@uns-kit/core\") {\n return path.resolve(probeDir, \"../..\");\n }\n } catch (error) {\n // Ignore missing package.json and continue walking upward.\n }\n\n const parentDir = path.dirname(probeDir);\n if (parentDir === probeDir) {\n break;\n }\n probeDir = parentDir;\n }\n\n throw new Error(\"Could not locate the @uns-kit/core package directory from sync-uns-schema.ts.\");\n}\n\nfunction buildControllerUrl(controllerUrl: string, relativePath: string): URL {\n const base = new URL(controllerUrl);\n if (!base.pathname.endsWith(\"/\")) {\n base.pathname = `${base.pathname}/`;\n }\n return new URL(relativePath, base);\n}\n\nasync function fetchDictionaryDocument(\n controllerUrl: string,\n token: string,\n status: SchemaStatus,\n): Promise<DictionaryDocument> {\n const url = buildControllerUrl(controllerUrl, `api/schema/export/uns-dictionary?status=${encodeURIComponent(status)}`);\n const document = await fetchJson(url, token, \"UNS dictionary\");\n if (!document || typeof document !== \"object\" || Array.isArray(document)) {\n throw new Error(`Controller returned an invalid UNS dictionary document from ${url.toString()}.`);\n }\n return document as DictionaryDocument;\n}\n\nasync function fetchMeasurementsDocument(controllerUrl: string, token: string): Promise<MeasurementsDocument> {\n const url = buildControllerUrl(controllerUrl, \"api/schema/export/uns-measurements\");\n const document = await fetchJson(url, token, \"UNS measurements\");\n if (!document || typeof document !== \"object\" || Array.isArray(document)) {\n throw new Error(`Controller returned an invalid UNS measurements document from ${url.toString()}.`);\n }\n return document as MeasurementsDocument;\n}\n\nasync function fetchJson(url: URL, token: string, label: string): Promise<unknown> {\n let response: Response;\n\n try {\n response = await fetch(url, {\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n });\n } catch (error) {\n throw new Error(`Network failure while fetching ${label} export from ${url.toString()}: ${(error as Error).message}`);\n }\n\n const text = await response.text();\n\n if (!response.ok) {\n throw new Error(formatHttpError(response, url, label, text));\n }\n\n try {\n return JSON.parse(text);\n } catch (error) {\n throw new Error(`Controller returned invalid JSON for the ${label} export from ${url.toString()}.`);\n }\n}\n\nfunction formatHttpError(response: Response, url: URL, label: string, body: string): string {\n if (response.status === 401) {\n return `Unauthorized (401) while fetching ${label} export from ${url.toString()}. Check --token or UNS_CONTROLLER_TOKEN.`;\n }\n\n if (response.status === 403) {\n return `Forbidden (403) while fetching ${label} export from ${url.toString()}. The token must have operator or admin access.`;\n }\n\n const detail = extractErrorDetail(body);\n return `Failed to fetch ${label} export from ${url.toString()}: HTTP ${response.status}${detail ? ` - ${detail}` : \"\"}`;\n}\n\nfunction extractErrorDetail(body: string): string {\n const trimmed = body.trim();\n if (!trimmed) return \"\";\n\n try {\n const parsed = JSON.parse(trimmed) as { error?: unknown; message?: unknown };\n if (typeof parsed.error === \"string\" && parsed.error.trim().length > 0) {\n return parsed.error.trim();\n }\n if (typeof parsed.message === \"string\" && parsed.message.trim().length > 0) {\n return parsed.message.trim();\n }\n } catch (error) {\n // Fall back to plain text handling below.\n }\n\n return trimmed.replace(/\\s+/g, \" \").slice(0, 200);\n}\n\nfunction formatJsonDocument(document: unknown): string {\n return `${JSON.stringify(document, null, 2)}\\n`;\n}\n\nasync function updateGeneratedFiles(\n filePaths: string[],\n content: string,\n repoRoot: string,\n dryRun: boolean,\n): Promise<FileChangeResult[]> {\n return Promise.all(filePaths.map((filePath) => updateFile(filePath, content, repoRoot, dryRun)));\n}\n\nasync function updateFile(\n filePath: string,\n content: string,\n repoRoot: string,\n dryRun: boolean,\n): Promise<FileChangeResult> {\n const current = await readTextFileIfExists(filePath);\n const changed = current !== content;\n const relativePath = path.relative(repoRoot, filePath);\n\n if (dryRun) {\n console.log(`${changed ? \"Would update\" : \"No change\"} ${relativePath}`);\n return { changed, relativePath };\n }\n\n if (!changed) {\n console.log(`Unchanged ${relativePath}`);\n return { changed: false, relativePath };\n }\n\n await writeTextFileIfChanged(filePath, content);\n console.log(`Updated ${relativePath}`);\n return { changed: true, relativePath };\n}\n\nfunction countMeasurementCategories(document: MeasurementsDocument): number {\n return Object.entries(document).filter(([key, value]) => {\n if (key === \"schemaVersion\") return false;\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n }).length;\n}\n\nfunction printSummary(summary: {\n controllerUrl: string;\n dryRun: boolean;\n skipGenerate: boolean;\n status: SchemaStatus;\n dictionary?: DictionarySummary;\n measurements?: MeasurementsSummary;\n}): void {\n console.log(\"\");\n console.log(summary.dryRun ? \"Dry-run summary\" : \"Sync summary\");\n console.log(` Controller: ${summary.controllerUrl}`);\n console.log(` Dictionary status: ${summary.status}`);\n\n if (summary.dictionary) {\n console.log(\n ` Dictionary: ${summary.dictionary.objectTypeCount} object types, ${summary.dictionary.attributeCount} attributes, JSON ${summary.dictionary.jsonChanged ? \"changed\" : \"unchanged\"}`,\n );\n if (summary.skipGenerate) {\n console.log(\" Dictionary TS: skipped\");\n } else {\n console.log(` Dictionary TS: ${renderGeneratedSummary(summary.dictionary.generatedChanged)}`);\n }\n }\n\n if (summary.measurements) {\n console.log(\n ` Measurements: ${summary.measurements.categoryCount} categories, JSON ${summary.measurements.jsonChanged ? \"changed\" : \"unchanged\"}`,\n );\n if (summary.skipGenerate) {\n console.log(\" Measurements TS: skipped\");\n } else {\n console.log(` Measurements TS: ${renderGeneratedSummary(summary.measurements.generatedChanged)}`);\n }\n }\n}\n\nfunction renderGeneratedSummary(results: FileChangeResult[]): string {\n if (!results.length) return \"none\";\n const changedCount = results.filter((result) => result.changed).length;\n return `${changedCount}/${results.length} file${results.length === 1 ? \"\" : \"s\"} changed`;\n}\n\nif (isDirectExecution) {\n main().catch((error) => {\n console.error(\"Failed to sync UNS schema:\", error instanceof Error ? error.message : error);\n process.exitCode = 1;\n });\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { GeneratedAttributes } from "./uns-dictionary.generated.js";
|
|
2
|
-
export declare const knownUnsAttributes: ("status" | "
|
|
2
|
+
export declare const knownUnsAttributes: ("status" | "active-energy-delivered" | "active-energy-received" | "alarm" | "assigned-to" | "authorization-level" | "availability" | "batch-number" | "conductivity" | "consumption" | "consumption-rate" | "cost" | "current" | "deviation" | "downtime" | "duration" | "end-time" | "energy" | "energy-consumption" | "fault-code" | "flow" | "frequency" | "hardness" | "inspection-result" | "instruction-url" | "last-refill" | "level" | "location" | "lot-id" | "maintenance-status" | "material-composition" | "material-type" | "operating-hours" | "operator-id" | "output-quantity" | "pass-fail" | "ph" | "planned-end" | "planned-start" | "power" | "presence" | "pressure" | "product-code" | "quantity" | "reactive-energy-delivered" | "reactive-energy-received" | "refill-required" | "revision" | "role" | "specification" | "speed" | "start-time" | "surface-defect" | "target-parameters" | "task-id" | "task-list" | "temperature" | "tensile-strength" | "total-flow" | "utilization" | "version-history" | "vibration" | "voltage" | "work-order-id")[];
|
|
3
3
|
export type KnownUnsAttributeName = typeof GeneratedAttributes[keyof typeof GeneratedAttributes];
|
|
4
4
|
export type UnsAttribute = "" | KnownUnsAttributeName | (string & {});
|
|
5
|
-
export declare const AttributeDescriptions: Record<"status" | "
|
|
5
|
+
export declare const AttributeDescriptions: Record<"status" | "active-energy-delivered" | "active-energy-received" | "alarm" | "assigned-to" | "authorization-level" | "availability" | "batch-number" | "conductivity" | "consumption" | "consumption-rate" | "cost" | "current" | "deviation" | "downtime" | "duration" | "end-time" | "energy" | "energy-consumption" | "fault-code" | "flow" | "frequency" | "hardness" | "inspection-result" | "instruction-url" | "last-refill" | "level" | "location" | "lot-id" | "maintenance-status" | "material-composition" | "material-type" | "operating-hours" | "operator-id" | "output-quantity" | "pass-fail" | "ph" | "planned-end" | "planned-start" | "power" | "presence" | "pressure" | "product-code" | "quantity" | "reactive-energy-delivered" | "reactive-energy-received" | "refill-required" | "revision" | "role" | "specification" | "speed" | "start-time" | "surface-defect" | "target-parameters" | "task-id" | "task-list" | "temperature" | "tensile-strength" | "total-flow" | "utilization" | "version-history" | "vibration" | "voltage" | "work-order-id", string>;
|
|
6
6
|
export declare function getAttributeDescription(name: string): string | undefined;
|
|
7
7
|
//# sourceMappingURL=uns-attributes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uns-attributes.d.ts","sourceRoot":"","sources":["../../src/uns/uns-attributes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAkC,MAAM,+BAA+B,CAAC;AAGpG,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"uns-attributes.d.ts","sourceRoot":"","sources":["../../src/uns/uns-attributes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAkC,MAAM,+BAA+B,CAAC;AAGpG,eAAO,MAAM,kBAAkB,ohCAAqC,CAAC;AAErE,MAAM,MAAM,qBAAqB,GAAG,OAAO,mBAAmB,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAGjG,MAAM,MAAM,YAAY,GAAG,EAAE,GAAG,qBAAqB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAEtE,eAAO,MAAM,qBAAqB,giCAAiC,CAAC;AAEpE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKxE"}
|