@uns-kit/core 2.0.28 → 2.0.30
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
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
# @uns-kit/core
|
|
2
2
|
|
|
3
|
-
Core utilities and runtime building blocks for
|
|
3
|
+
Core utilities and runtime building blocks for Unified Namespace (UNS) applications. The package bundles the process lifecycle manager, MQTT integrations, gRPC gateway helpers, configuration tooling, and shared type definitions that power the UNS ecosystem.
|
|
4
4
|
|
|
5
5
|
Note: Apps built with uns-kit are intended to be managed by the **UNS Datahub controller**.
|
|
6
6
|
|
|
7
7
|
## uns-kit in context
|
|
8
8
|
|
|
9
|
-
uns-kit is a batteries-included toolkit for Unified Namespace applications. It standardizes MQTT wiring, auth, config schemas, and scaffolding so teams can focus on domain logic instead of boilerplate. This package is the foundation; the full toolkit includes:
|
|
10
|
-
|
|
11
9
|
| Package | Description |
|
|
12
10
|
| --- | --- |
|
|
13
|
-
| [`@uns-kit/core`](https://github.com/uns-datahub/uns-kit/tree/main/packages/uns-core) | Base runtime
|
|
14
|
-
| [`@uns-kit/api`](https://github.com/uns-datahub/uns-kit/tree/main/packages/uns-api) | Express plugin
|
|
11
|
+
| [`@uns-kit/core`](https://github.com/uns-datahub/uns-kit/tree/main/packages/uns-core) | Base runtime (UnsProxyProcess, MQTT helpers, config tooling, gRPC gateway). |
|
|
12
|
+
| [`@uns-kit/api`](https://github.com/uns-datahub/uns-kit/tree/main/packages/uns-api) | Express plugin — HTTP endpoints, JWT/JWKS auth, Swagger, UNS metadata. |
|
|
15
13
|
| [`@uns-kit/cron`](https://github.com/uns-datahub/uns-kit/tree/main/packages/uns-cron) | Cron-driven scheduler that emits UNS events on a fixed cadence. |
|
|
16
|
-
| [`@uns-kit/
|
|
17
|
-
| [`@uns-kit/cli`](https://github.com/uns-datahub/uns-kit/tree/main/packages/uns-cli) | Command line tool for scaffolding new UNS applications. |
|
|
14
|
+
| [`@uns-kit/cli`](https://github.com/uns-datahub/uns-kit/tree/main/packages/uns-cli) | CLI for scaffolding new UNS applications. |
|
|
18
15
|
|
|
19
16
|
## Installation
|
|
20
17
|
|
|
@@ -24,112 +21,100 @@ pnpm add @uns-kit/core
|
|
|
24
21
|
npm install @uns-kit/core
|
|
25
22
|
```
|
|
26
23
|
|
|
27
|
-
## Key
|
|
28
|
-
|
|
29
|
-
- **UnsProxyProcess** – plugin-ready runtime for managing UNS proxy instances and MQTT wiring.
|
|
30
|
-
- **MQTT helpers** – resilient publishers, topic builders, throttled queues, and handover support.
|
|
31
|
-
- **Configuration utilities** – Zod-powered config schema generation and secret resolution helpers.
|
|
32
|
-
- **gRPC gateway helpers** – infrastructure to bridge Python workers into the UNS message fabric.
|
|
33
|
-
- **GraphQL tooling** – utilities such as `refresh-uns` that rebuild UNS topic/tag unions from your environment.
|
|
24
|
+
## Key concepts
|
|
34
25
|
|
|
35
|
-
|
|
26
|
+
- **UnsProxyProcess** — the central runtime class. It manages the MQTT connection, plugin lifecycle, and the instance status topic. Plugins (`@uns-kit/api`, `@uns-kit/cron`) augment it with domain-specific proxy factories.
|
|
27
|
+
- **UnsProxy** — base class extended by all plugin proxies. Tracks produced topics, API endpoints, and catch-all mappings; re-publishes them to the controller on a 60-second cadence.
|
|
28
|
+
- **ConfigFile** — loads and validates `config.json` at startup. On a real server this file is provided by the UNS Datahub controller; in development you maintain it yourself.
|
|
29
|
+
- **MQTT helpers** — resilient publishers, topic builders, throttled queues, and handover support.
|
|
30
|
+
- **gRPC gateway** — infrastructure to bridge Python workers into the UNS message fabric.
|
|
36
31
|
|
|
37
|
-
|
|
32
|
+
## Basic usage
|
|
38
33
|
|
|
39
34
|
```ts
|
|
40
35
|
import UnsProxyProcess from "@uns-kit/core/uns/uns-proxy-process";
|
|
36
|
+
import { ConfigFile } from "@uns-kit/core";
|
|
41
37
|
|
|
42
|
-
const
|
|
38
|
+
const config = await ConfigFile.loadConfig();
|
|
39
|
+
|
|
40
|
+
// Connect to MQTT broker; processName identifies this service in the controller.
|
|
41
|
+
const proc = new UnsProxyProcess(config.infra.host!, { processName: config.uns.processName });
|
|
43
42
|
```
|
|
44
43
|
|
|
45
|
-
|
|
46
|
-
For a list of topics published by core (and the API plugin), see `../../docs/uns-topics.md`.
|
|
44
|
+
Extend it with plugins:
|
|
47
45
|
|
|
48
|
-
|
|
46
|
+
```ts
|
|
47
|
+
import "@uns-kit/api";
|
|
48
|
+
import "@uns-kit/cron";
|
|
49
|
+
import { type UnsProxyProcessWithApi } from "@uns-kit/api";
|
|
50
|
+
import { type UnsProxyProcessWithCron } from "@uns-kit/cron";
|
|
49
51
|
|
|
50
|
-
|
|
52
|
+
const proc = new UnsProxyProcess(config.infra.host!, { processName: config.uns.processName })
|
|
53
|
+
as UnsProxyProcessWithApi & UnsProxyProcessWithCron;
|
|
51
54
|
|
|
52
|
-
|
|
53
|
-
|
|
55
|
+
const api = await proc.createApiProxy("my-service", { jwtSecret: "CHANGEME" });
|
|
56
|
+
const cron = await proc.createCrontabProxy("*/5 * * * *", { event: "tick" });
|
|
54
57
|
```
|
|
55
58
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
### Generate UNS dictionary (object types & attributes with descriptions)
|
|
59
|
+
## Sync UNS schema from the controller
|
|
59
60
|
|
|
60
|
-
|
|
61
|
+
`sync-uns-schema` fetches the canonical UNS dictionary and measurements from the controller REST API and refreshes local JSON files and generated TypeScript artifacts.
|
|
61
62
|
|
|
62
63
|
```bash
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
--output src/uns/uns-dictionary.generated.ts \
|
|
66
|
-
--lang sl # pick language code from descriptions
|
|
67
|
-
```
|
|
64
|
+
# Run inside a generated microservice project:
|
|
65
|
+
pnpm run sync-uns-schema
|
|
68
66
|
|
|
69
|
-
|
|
67
|
+
# The controller URL is read from config.json (uns.rest) automatically.
|
|
68
|
+
# You will be prompted for the bearer token if not set via env var.
|
|
69
|
+
```
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
Or with explicit options:
|
|
72
72
|
|
|
73
73
|
```bash
|
|
74
|
-
pnpm
|
|
75
|
-
--dictionary uns-dictionary.json \
|
|
76
|
-
--dictionary-output src/uns/uns-dictionary.generated.ts \
|
|
77
|
-
--measurements uns-measurements.json \
|
|
78
|
-
--measurements-output src/uns/uns-measurements.generated.ts \
|
|
79
|
-
--lang sl
|
|
74
|
+
pnpm run sync-uns-schema --controller-url http://localhost:3200 --token <bearer-token>
|
|
80
75
|
```
|
|
81
76
|
|
|
82
|
-
|
|
77
|
+
**What it updates (inside a generated project):**
|
|
78
|
+
- `uns-dictionary.json`
|
|
79
|
+
- `uns-measurements.json`
|
|
80
|
+
- `src/uns/uns-dictionary.generated.ts`
|
|
81
|
+
- `src/uns/uns-measurements.generated.ts`
|
|
83
82
|
|
|
84
|
-
|
|
85
|
-
- the repo-maintained schema files inside `uns-kit`, or
|
|
86
|
-
- a generated microservice project that keeps `uns-dictionary.json` / `uns-measurements.json` locally.
|
|
83
|
+
**Options:**
|
|
87
84
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
85
|
+
| Flag | Default | Description |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| `--controller-url` | from `config.json` `uns.rest` or `UNS_CONTROLLER_URL` | Controller base URL |
|
|
88
|
+
| `--token` | interactive prompt or `UNS_CONTROLLER_TOKEN` | Admin bearer token |
|
|
89
|
+
| `--status` | `active` | Dictionary filter: `active`, `draft`, `deprecated`, `all` |
|
|
90
|
+
| `--dry-run` | — | Report changes without writing |
|
|
91
|
+
| `--dictionary-only` | — | Skip measurements sync |
|
|
92
|
+
| `--measurements-only` | — | Skip dictionary sync |
|
|
93
|
+
| `--skip-generate` | — | Skip TS regeneration |
|
|
94
|
+
| `--project-root <dir>` | auto-detect | Target project root |
|
|
93
95
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
- When run inside a generated project root (or with `--project-root <dir>`), updates:
|
|
98
|
-
- `uns-dictionary.json`
|
|
99
|
-
- `uns-measurements.json`
|
|
100
|
-
- `src/uns/uns-dictionary.generated.ts`
|
|
101
|
-
- `src/uns/uns-measurements.generated.ts`
|
|
102
|
-
- Otherwise it preserves the full exported JSON document when updating the `uns-kit` repo-maintained files:
|
|
103
|
-
- `packages/uns-cli/templates/uns-dictionary/uns-dictionary.json`
|
|
104
|
-
- `packages/uns-cli/templates/uns-measurements/uns-measurements.json`
|
|
105
|
-
- Regenerates the target TS artifacts unless you pass `--skip-generate`.
|
|
106
|
-
- Defaults dictionary sync to `--status active`.
|
|
107
|
-
- Supports environment fallbacks: `UNS_CONTROLLER_URL`, `UNS_CONTROLLER_TOKEN`, `UNS_SCHEMA_STATUS`, `UNS_SCHEMA_PROJECT_ROOT`.
|
|
108
|
-
|
|
109
|
-
Useful variants:
|
|
96
|
+
## Config schema generation
|
|
97
|
+
|
|
98
|
+
Edit `src/config/project.config.extension.ts` inside your project and run:
|
|
110
99
|
|
|
111
100
|
```bash
|
|
112
|
-
pnpm run
|
|
113
|
-
pnpm run sync-uns-schema -- --dictionary-only
|
|
114
|
-
pnpm run sync-uns-schema -- --measurements-only --skip-generate
|
|
101
|
+
pnpm run generate-config-schema
|
|
115
102
|
```
|
|
116
103
|
|
|
117
|
-
|
|
104
|
+
This regenerates `config.schema.json` and `src/config/app-config.ts`, keeping editor completions and runtime types in sync with your config extensions.
|
|
105
|
+
|
|
106
|
+
## Infisical secret resolution
|
|
118
107
|
|
|
119
|
-
-
|
|
120
|
-
- If
|
|
121
|
-
-
|
|
122
|
-
-
|
|
123
|
-
- Use this to run locally without Infisical: mark dev-only secrets as `optional` or give `default` values, and provide real tokens only in production.
|
|
108
|
+
- Looks for `INFISICAL_TOKEN` / `INFISICAL_PERSONAL_TOKEN`, then `/run/secrets/infisical_token`.
|
|
109
|
+
- If unavailable, logs a warning and returns `default` (or `undefined` for `optional: true` secrets).
|
|
110
|
+
- Required secrets throw with the original error message when Infisical is unreachable.
|
|
111
|
+
- Call `resolveInfisicalConfig()` to inspect the resolved token/projectId/siteUrl.
|
|
124
112
|
|
|
125
113
|
## Development
|
|
126
114
|
|
|
127
115
|
```bash
|
|
128
|
-
|
|
129
|
-
pnpm run
|
|
130
|
-
|
|
131
|
-
# Emit JavaScript and declaration files to dist/
|
|
132
|
-
pnpm run build
|
|
116
|
+
pnpm run typecheck # type-check sources
|
|
117
|
+
pnpm run build # emit JS + declarations to dist/
|
|
133
118
|
```
|
|
134
119
|
|
|
135
120
|
## License
|
|
@@ -3,7 +3,6 @@ import { access, readFile } from "node:fs/promises";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import process from "node:process";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
|
-
import readline from "node:readline";
|
|
7
6
|
import { readTextFileIfExists, writeTextFileIfChanged } from "./file-utils.js";
|
|
8
7
|
import { renderDictionaryTs } from "./generate-uns-dictionary.js";
|
|
9
8
|
import { renderMeasurementsTs } from "./generate-uns-measurements.js";
|
|
@@ -84,38 +83,38 @@ async function getControllerUrlFromConfig() {
|
|
|
84
83
|
}
|
|
85
84
|
async function promptForToken() {
|
|
86
85
|
return new Promise((resolve) => {
|
|
87
|
-
const rl = readline.createInterface({
|
|
88
|
-
input: process.stdin,
|
|
89
|
-
output: process.stderr,
|
|
90
|
-
});
|
|
91
86
|
const stdin = process.stdin;
|
|
92
87
|
const wasRaw = stdin.isRaw;
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
stdin.setRawMode(true);
|
|
96
|
-
}
|
|
88
|
+
stdin.setRawMode(true);
|
|
89
|
+
stdin.resume();
|
|
97
90
|
process.stderr.write("Enter controller token: ");
|
|
98
91
|
let token = "";
|
|
99
|
-
stdin.
|
|
92
|
+
stdin.on("data", onChar);
|
|
100
93
|
function onChar(char) {
|
|
101
94
|
const code = char[0];
|
|
102
|
-
// Enter
|
|
95
|
+
// Enter (13) or newline (10) — done
|
|
103
96
|
if (code === 13 || code === 10) {
|
|
104
|
-
stdin.setRawMode(wasRaw ?? false);
|
|
105
97
|
stdin.removeListener("data", onChar);
|
|
106
|
-
|
|
98
|
+
stdin.setRawMode(wasRaw ?? false);
|
|
99
|
+
stdin.pause();
|
|
107
100
|
process.stderr.write("\n");
|
|
108
101
|
resolve(token);
|
|
109
102
|
return;
|
|
110
103
|
}
|
|
104
|
+
// Ctrl+C — abort
|
|
105
|
+
if (code === 3) {
|
|
106
|
+
stdin.removeListener("data", onChar);
|
|
107
|
+
stdin.setRawMode(wasRaw ?? false);
|
|
108
|
+
process.stderr.write("\n");
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
111
|
// Backspace (127) or Delete (8)
|
|
112
112
|
if (code === 127 || code === 8) {
|
|
113
113
|
token = token.slice(0, -1);
|
|
114
114
|
}
|
|
115
115
|
else if (code >= 32) {
|
|
116
|
-
token +=
|
|
116
|
+
token += char.toString("utf8");
|
|
117
117
|
}
|
|
118
|
-
stdin.once("data", onChar);
|
|
119
118
|
}
|
|
120
119
|
});
|
|
121
120
|
}
|
|
@@ -208,6 +207,10 @@ async function parseArgs(argv) {
|
|
|
208
207
|
throw new Error("Missing controller token. Use --token, set UNS_CONTROLLER_TOKEN, or provide it interactively.");
|
|
209
208
|
}
|
|
210
209
|
}
|
|
210
|
+
// Strip "Bearer " prefix if the user included it
|
|
211
|
+
if (token.toLowerCase().startsWith("bearer ")) {
|
|
212
|
+
token = token.slice(7).trim();
|
|
213
|
+
}
|
|
211
214
|
assertValidUrl(controllerUrl);
|
|
212
215
|
}
|
|
213
216
|
return {
|
|
@@ -391,7 +394,7 @@ async function fetchJson(url, token, label) {
|
|
|
391
394
|
}
|
|
392
395
|
function formatHttpError(response, url, label, body) {
|
|
393
396
|
if (response.status === 401) {
|
|
394
|
-
return `
|
|
397
|
+
return `Token is invalid or expired (401). Provide a valid token via --token, UNS_CONTROLLER_TOKEN, or the interactive prompt.`;
|
|
395
398
|
}
|
|
396
399
|
if (response.status === 403) {
|
|
397
400
|
return `Forbidden (403) while fetching ${label} export from ${url.toString()}. The token must have admin access.`;
|
|
@@ -1 +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 { access, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport readline from \"node:readline\";\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 projectRoot?: string;\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\ntype SyncTarget = {\n rootDir: string;\n label: string;\n dictionaryJson: string;\n measurementsJson: string;\n dictionaryGenerated: string[];\n measurementsGenerated: string[];\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 ? path.resolve(process.argv[1]).endsWith(path.basename(fileURLToPath(import.meta.url)))\n : false;\n\nasync function main(): Promise<void> {\n const args = await parseArgs(process.argv.slice(2));\n\n if (args.help) {\n printHelp();\n return;\n }\n\n const target = await resolveSyncTarget(args);\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(target.dictionaryJson, content, target.rootDir, args.dryRun);\n const generatedChanged = args.skipGenerate\n ? []\n : await updateGeneratedFiles(\n target.dictionaryGenerated,\n renderDictionaryTs(dictionaryDocument, GENERATOR_LANG),\n target.rootDir,\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(target.measurementsJson, content, target.rootDir, args.dryRun);\n const generatedChanged = args.skipGenerate\n ? []\n : await updateGeneratedFiles(\n target.measurementsGenerated,\n renderMeasurementsTs(measurementsDocument, GENERATOR_LANG),\n target.rootDir,\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 targetLabel: target.label,\n targetRoot: target.rootDir,\n dryRun: args.dryRun,\n skipGenerate: args.skipGenerate,\n status: args.status,\n dictionary: dictionarySummary,\n measurements: measurementsSummary,\n });\n}\n\nasync function getControllerUrlFromConfig(): Promise<string | undefined> {\n const currentDir = process.cwd();\n const configPath = path.join(currentDir, \"config.json\");\n try {\n const raw = await readFile(configPath, \"utf8\");\n const config = JSON.parse(raw) as Record<string, unknown>;\n const unsConfig = config.uns as Record<string, unknown> | undefined;\n const restUrl = unsConfig?.rest as string | undefined;\n if (restUrl && typeof restUrl === \"string\") {\n // Remove trailing /api from the rest URL to get the base controller URL\n return restUrl.endsWith(\"/api\") ? restUrl.slice(0, -4) : restUrl;\n }\n } catch (error) {\n // Ignore missing or invalid config.json\n }\n return undefined;\n}\n\nasync function promptForToken(): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n\n // Hide input by putting stdin in raw mode\n if (stdin.isTTY) {\n stdin.setRawMode(true);\n }\n\n process.stderr.write(\"Enter controller token: \");\n\n let token = \"\";\n\n stdin.once(\"data\", onChar);\n\n function onChar(char: Buffer): void {\n const code = char[0];\n // Enter key (13) or newline (10)\n if (code === 13 || code === 10) {\n stdin.setRawMode(wasRaw ?? false);\n stdin.removeListener(\"data\", onChar);\n rl.close();\n process.stderr.write(\"\\n\");\n resolve(token);\n return;\n }\n // Backspace (127) or Delete (8)\n if (code === 127 || code === 8) {\n token = token.slice(0, -1);\n } else if (code >= 32) {\n token += String.fromCharCode(code);\n }\n\n stdin.once(\"data\", onChar);\n }\n });\n}\n\nasync function parseArgs(argv: string[]): Promise<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 projectRoot = process.env.UNS_SCHEMA_PROJECT_ROOT?.trim() || undefined;\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 === \"--project-root\") {\n projectRoot = readRequiredValue(argv, ++index, \"--project-root\");\n continue;\n }\n\n if (arg.startsWith(\"--project-root=\")) {\n projectRoot = arg.slice(\"--project-root=\".length);\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 // Try to load controller URL from config.json if not provided\n if (!controllerUrl) {\n const configUrl = await getControllerUrlFromConfig();\n if (configUrl) {\n controllerUrl = configUrl;\n }\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, set UNS_CONTROLLER_URL, or provide config.json with uns.rest.\");\n }\n if (!token) {\n // Prompt for token if stdin is a TTY (interactive terminal)\n if (process.stdin.isTTY) {\n token = await promptForToken();\n }\n if (!token) {\n throw new Error(\"Missing controller token. Use --token, set UNS_CONTROLLER_TOKEN, or provide it interactively.\");\n }\n }\n assertValidUrl(controllerUrl);\n }\n\n return {\n controllerUrl,\n token,\n status,\n projectRoot,\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 files plus generated TypeScript artifacts.\n\nOptions:\n --controller-url <url> Controller base URL (env: UNS_CONTROLLER_URL, or config.json > uns.rest)\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 --project-root <dir> Write into a generated microservice project root (env: UNS_SCHEMA_PROJECT_ROOT).\n When omitted, the tool auto-detects a generated project from the current working directory\n and otherwise updates the uns-kit repo templates.\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\nasync function resolveSyncTarget(args: CliArgs): Promise<SyncTarget> {\n if (args.projectRoot) {\n return buildProjectTarget(path.resolve(process.cwd(), args.projectRoot));\n }\n\n const currentDir = process.cwd();\n if (await looksLikeGeneratedProjectRoot(currentDir)) {\n return buildProjectTarget(currentDir);\n }\n\n return buildRepoTarget(await findRepoRoot());\n}\n\nfunction buildRepoTarget(repoRoot: string): SyncTarget {\n return {\n rootDir: repoRoot,\n label: \"uns-kit repo templates\",\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\nfunction buildProjectTarget(projectRoot: string): SyncTarget {\n return {\n rootDir: projectRoot,\n label: \"generated microservice project\",\n dictionaryJson: path.join(projectRoot, \"uns-dictionary.json\"),\n measurementsJson: path.join(projectRoot, \"uns-measurements.json\"),\n dictionaryGenerated: [path.join(projectRoot, \"src/uns/uns-dictionary.generated.ts\")],\n measurementsGenerated: [path.join(projectRoot, \"src/uns/uns-measurements.generated.ts\")],\n };\n}\n\nasync function looksLikeGeneratedProjectRoot(rootDir: string): Promise<boolean> {\n const [hasPackageJson, hasConfigJson, hasUnsDir] = await Promise.all([\n pathExists(path.join(rootDir, \"package.json\")),\n pathExists(path.join(rootDir, \"config.json\")),\n pathExists(path.join(rootDir, \"src/uns\")),\n ]);\n\n return hasPackageJson && hasConfigJson && hasUnsDir;\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await access(targetPath);\n return true;\n } catch (error) {\n return false;\n }\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 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 targetLabel: string;\n targetRoot: 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(` Target: ${summary.targetLabel}`);\n console.log(` Root: ${summary.targetRoot}`);\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
|
+
{"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 { access, 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 projectRoot?: string;\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\ntype SyncTarget = {\n rootDir: string;\n label: string;\n dictionaryJson: string;\n measurementsJson: string;\n dictionaryGenerated: string[];\n measurementsGenerated: string[];\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 ? path.resolve(process.argv[1]).endsWith(path.basename(fileURLToPath(import.meta.url)))\n : false;\n\nasync function main(): Promise<void> {\n const args = await parseArgs(process.argv.slice(2));\n\n if (args.help) {\n printHelp();\n return;\n }\n\n const target = await resolveSyncTarget(args);\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(target.dictionaryJson, content, target.rootDir, args.dryRun);\n const generatedChanged = args.skipGenerate\n ? []\n : await updateGeneratedFiles(\n target.dictionaryGenerated,\n renderDictionaryTs(dictionaryDocument, GENERATOR_LANG),\n target.rootDir,\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(target.measurementsJson, content, target.rootDir, args.dryRun);\n const generatedChanged = args.skipGenerate\n ? []\n : await updateGeneratedFiles(\n target.measurementsGenerated,\n renderMeasurementsTs(measurementsDocument, GENERATOR_LANG),\n target.rootDir,\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 targetLabel: target.label,\n targetRoot: target.rootDir,\n dryRun: args.dryRun,\n skipGenerate: args.skipGenerate,\n status: args.status,\n dictionary: dictionarySummary,\n measurements: measurementsSummary,\n });\n}\n\nasync function getControllerUrlFromConfig(): Promise<string | undefined> {\n const currentDir = process.cwd();\n const configPath = path.join(currentDir, \"config.json\");\n try {\n const raw = await readFile(configPath, \"utf8\");\n const config = JSON.parse(raw) as Record<string, unknown>;\n const unsConfig = config.uns as Record<string, unknown> | undefined;\n const restUrl = unsConfig?.rest as string | undefined;\n if (restUrl && typeof restUrl === \"string\") {\n // Remove trailing /api from the rest URL to get the base controller URL\n return restUrl.endsWith(\"/api\") ? restUrl.slice(0, -4) : restUrl;\n }\n } catch (error) {\n // Ignore missing or invalid config.json\n }\n return undefined;\n}\n\nasync function promptForToken(): Promise<string> {\n return new Promise((resolve) => {\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n\n stdin.setRawMode(true);\n stdin.resume();\n process.stderr.write(\"Enter controller token: \");\n\n let token = \"\";\n\n stdin.on(\"data\", onChar);\n\n function onChar(char: Buffer): void {\n const code = char[0];\n // Enter (13) or newline (10) — done\n if (code === 13 || code === 10) {\n stdin.removeListener(\"data\", onChar);\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n process.stderr.write(\"\\n\");\n resolve(token);\n return;\n }\n // Ctrl+C — abort\n if (code === 3) {\n stdin.removeListener(\"data\", onChar);\n stdin.setRawMode(wasRaw ?? false);\n process.stderr.write(\"\\n\");\n process.exit(1);\n }\n // Backspace (127) or Delete (8)\n if (code === 127 || code === 8) {\n token = token.slice(0, -1);\n } else if (code >= 32) {\n token += char.toString(\"utf8\");\n }\n }\n });\n}\n\nasync function parseArgs(argv: string[]): Promise<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 projectRoot = process.env.UNS_SCHEMA_PROJECT_ROOT?.trim() || undefined;\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 === \"--project-root\") {\n projectRoot = readRequiredValue(argv, ++index, \"--project-root\");\n continue;\n }\n\n if (arg.startsWith(\"--project-root=\")) {\n projectRoot = arg.slice(\"--project-root=\".length);\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 // Try to load controller URL from config.json if not provided\n if (!controllerUrl) {\n const configUrl = await getControllerUrlFromConfig();\n if (configUrl) {\n controllerUrl = configUrl;\n }\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, set UNS_CONTROLLER_URL, or provide config.json with uns.rest.\");\n }\n if (!token) {\n // Prompt for token if stdin is a TTY (interactive terminal)\n if (process.stdin.isTTY) {\n token = await promptForToken();\n }\n if (!token) {\n throw new Error(\"Missing controller token. Use --token, set UNS_CONTROLLER_TOKEN, or provide it interactively.\");\n }\n }\n // Strip \"Bearer \" prefix if the user included it\n if (token.toLowerCase().startsWith(\"bearer \")) {\n token = token.slice(7).trim();\n }\n assertValidUrl(controllerUrl);\n }\n\n return {\n controllerUrl,\n token,\n status,\n projectRoot,\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 files plus generated TypeScript artifacts.\n\nOptions:\n --controller-url <url> Controller base URL (env: UNS_CONTROLLER_URL, or config.json > uns.rest)\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 --project-root <dir> Write into a generated microservice project root (env: UNS_SCHEMA_PROJECT_ROOT).\n When omitted, the tool auto-detects a generated project from the current working directory\n and otherwise updates the uns-kit repo templates.\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\nasync function resolveSyncTarget(args: CliArgs): Promise<SyncTarget> {\n if (args.projectRoot) {\n return buildProjectTarget(path.resolve(process.cwd(), args.projectRoot));\n }\n\n const currentDir = process.cwd();\n if (await looksLikeGeneratedProjectRoot(currentDir)) {\n return buildProjectTarget(currentDir);\n }\n\n return buildRepoTarget(await findRepoRoot());\n}\n\nfunction buildRepoTarget(repoRoot: string): SyncTarget {\n return {\n rootDir: repoRoot,\n label: \"uns-kit repo templates\",\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\nfunction buildProjectTarget(projectRoot: string): SyncTarget {\n return {\n rootDir: projectRoot,\n label: \"generated microservice project\",\n dictionaryJson: path.join(projectRoot, \"uns-dictionary.json\"),\n measurementsJson: path.join(projectRoot, \"uns-measurements.json\"),\n dictionaryGenerated: [path.join(projectRoot, \"src/uns/uns-dictionary.generated.ts\")],\n measurementsGenerated: [path.join(projectRoot, \"src/uns/uns-measurements.generated.ts\")],\n };\n}\n\nasync function looksLikeGeneratedProjectRoot(rootDir: string): Promise<boolean> {\n const [hasPackageJson, hasConfigJson, hasUnsDir] = await Promise.all([\n pathExists(path.join(rootDir, \"package.json\")),\n pathExists(path.join(rootDir, \"config.json\")),\n pathExists(path.join(rootDir, \"src/uns\")),\n ]);\n\n return hasPackageJson && hasConfigJson && hasUnsDir;\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await access(targetPath);\n return true;\n } catch (error) {\n return false;\n }\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 `Token is invalid or expired (401). Provide a valid token via --token, UNS_CONTROLLER_TOKEN, or the interactive prompt.`;\n }\n\n if (response.status === 403) {\n return `Forbidden (403) while fetching ${label} export from ${url.toString()}. The token must have 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 targetLabel: string;\n targetRoot: 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(` Target: ${summary.targetLabel}`);\n console.log(` Root: ${summary.targetRoot}`);\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"]}
|
|
@@ -102,6 +102,10 @@ export interface UnsEvents {
|
|
|
102
102
|
req: any;
|
|
103
103
|
res: any;
|
|
104
104
|
};
|
|
105
|
+
apiPostEvent: {
|
|
106
|
+
req: any;
|
|
107
|
+
res: any;
|
|
108
|
+
};
|
|
105
109
|
unsProxyProducedTopics: {
|
|
106
110
|
producedTopics: ITopicObject[];
|
|
107
111
|
statusTopic: string;
|
|
@@ -297,5 +301,14 @@ export interface IGetEndpointOptions {
|
|
|
297
301
|
*/
|
|
298
302
|
chatDefaults?: ApiChatDefaults;
|
|
299
303
|
}
|
|
304
|
+
export interface IPostEndpointOptions {
|
|
305
|
+
apiDescription?: string;
|
|
306
|
+
tags?: string[];
|
|
307
|
+
requestBody?: {
|
|
308
|
+
description?: string;
|
|
309
|
+
required?: boolean;
|
|
310
|
+
schema?: Record<string, unknown>;
|
|
311
|
+
};
|
|
312
|
+
}
|
|
300
313
|
export {};
|
|
301
314
|
//# sourceMappingURL=uns-interfaces.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uns-interfaces.d.ts","sourceRoot":"","sources":["../../src/uns/uns-interfaces.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"uns-interfaces.d.ts","sourceRoot":"","sources":["../../src/uns/uns-interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uns-interfaces.js","sourceRoot":"","sources":["../../src/uns/uns-interfaces.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,YAAY,GAAG,+CAA+C,CAAC;IACrE,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAID,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAIxD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,MAAM;IACN,MAAM;IACN,WAAW;IACX,cAAc;IACd,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,SAAS;CACD,CAAC;AAEX,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAS,qBAAqB,CAAC,CAAC;AACvE,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AACnD,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AACnD,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAW3C,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CACL,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/B,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/B,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAC9B,CAAC;AACJ,CAAC","sourcesContent":["import { UnsAttributeType } from \"../graphql/schema.js\";\nimport { MeasurementUnit } from \"./uns-measurements.js\";\nimport { UnsTags } from \"./uns-tags.js\";\nimport type { UnsObjectId, UnsObjectType } from \"./uns-object.js\";\nimport type { UnsAsset } from \"./uns-asset.js\";\nimport type { IMqttConnectProperties, IMqttPublishOptions, IMqttServerConfig, MqttProtocol } from \"../uns-mqtt/mqtt-interfaces.js\";\nimport { UnsTopics } from \"./uns-topics.js\";\nimport { knownUnsAttributes, type KnownUnsAttributeName } from \"./uns-attributes.js\";\n\nexport type ISO8601 = `${number}-${string}-${string}T${string}:${string}:${string}.${string}Z`;\nexport function isIOS8601Type(value: string): value is ISO8601 {\n const iso8601Regex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\n return iso8601Regex.test(value);\n}\n// Known attribute names (with IntelliSense) while still allowing arbitrary strings.\nexport type UnsAttribute = KnownUnsAttributeName | (string & {});\n\nexport const valueTypes = [\"string\", \"number\"] as const;\nexport type ValueTypeString = (typeof valueTypes)[number];\nexport type ValueType = string | number;\n\nexport const questDbPrimitiveTypes = [\n \"boolean\",\n \"ipv4\",\n \"byte\",\n \"short\",\n \"char\",\n \"int\",\n \"float\",\n \"symbol\",\n \"varchar\",\n \"string\",\n \"long\",\n \"date\",\n \"timestamp\",\n \"timestamp_ns\",\n \"double\",\n \"uuid\",\n \"binary\",\n \"long256\",\n] as const;\n\nconst questDbPrimitiveTypeSet = new Set<string>(questDbPrimitiveTypes);\nconst questDbGeohashRegex = /^geohash\\(\\d+[bc]\\)$/;\nconst questDbDecimalRegex = /^decimal\\(\\d+,\\d+\\)$/;\nconst questDbArrayRegex = /^array<[^>]+>$/;\n\nexport type QuestDbPrimitiveType = (typeof questDbPrimitiveTypes)[number];\n\n// Supported QuestDB column types for UNS tables.\nexport type QuestDbType =\n | QuestDbPrimitiveType\n | `geohash(${number}${\"b\" | \"c\"})`\n | `decimal(${number},${number})`\n | `array<${string}>`;\n\nexport function isQuestDbType(value: unknown): value is QuestDbType {\n if (typeof value !== \"string\") {\n return false;\n }\n if (questDbPrimitiveTypeSet.has(value)) {\n return true;\n }\n return (\n questDbGeohashRegex.test(value) ||\n questDbDecimalRegex.test(value) ||\n questDbArrayRegex.test(value)\n );\n}\n\nexport interface IUnsParameters {\n mqttSubToTopics?: string | string[];\n username?: string;\n password?: string;\n mqttSSL?: boolean;\n publishThrottlingDelay?: number; // Delay in milliseconds; default is 1ms\n subscribeThrottlingDelay?: number; // Delay in milliseconds; default is 1ms\n rejectUnauthorized?: boolean;\n clientId?: string;\n hosts?: string[];\n servers?: IMqttServerConfig[];\n port?: number;\n protocol?: MqttProtocol;\n keepalive?: number;\n clean?: boolean;\n connectTimeout?: number;\n reconnectPeriod?: number;\n reconnectOnConnackError?: boolean;\n resubscribe?: boolean;\n queueQoSZero?: boolean;\n properties?: IMqttConnectProperties;\n ca?: string;\n cert?: string;\n key?: string;\n servername?: string;\n /**\n * Default MQTT publish options applied to all outgoing messages\n * (e.g., qos, retain, messageExpiryInterval).\n */\n defaultPublishOptions?: IMqttPublishOptions;\n}\n\nexport interface IUnsProcessParameters {\n processName: string;\n mqttSubToTopics?: string | string[];\n username?: string;\n password?: string;\n mqttSSL?: boolean;\n clientId?: string;\n hosts?: string[];\n servers?: IMqttServerConfig[];\n port?: number;\n protocol?: MqttProtocol;\n keepalive?: number;\n clean?: boolean;\n connectTimeout?: number;\n reconnectPeriod?: number;\n reconnectOnConnackError?: boolean;\n resubscribe?: boolean;\n queueQoSZero?: boolean;\n rejectUnauthorized?: boolean;\n properties?: IMqttConnectProperties;\n ca?: string;\n cert?: string;\n key?: string;\n servername?: string;\n}\n\nexport interface UnsEvents {\n // Emitters in MqttProxy, UnsMqttProxy\n input: { topic: string; message: string, packet: any };\n mqttProxyStatus: { event: string, value: number, uom: MeasurementUnit, statusTopic: string };\n \n // Emitters in MqttProxy\n error: { code: number; message: string };\n \n // Emitters in UnsMqttProxy\n mqttWorker: { command: string, instanceName: string; batchSize: number, referenceHash: string };\n\n // Emitter in UnsCronProxy\n cronEvent: { event?: string; cronExpression?: string };\n\n // Emitters in UnsApiProxy\n apiGetEvent: {req: any, res: any};\n\n // Emitters in UnsProxy\n unsProxyProducedTopics: { producedTopics: ITopicObject[], statusTopic: string };\n\n // Emitters in UnsProxy\n unsProxyProducedApiEndpoints: { producedApiEndpoints: IApiObject[], statusTopic: string };\n\n // Emitters in UnsProxy\n unsProxyProducedApiCatchAll: { producedCatchall: IApiCatchallMapping[], statusTopic: string };\n}\n\nexport interface IUnsExtendedData extends IUnsData {\n valueType: ValueTypeString;\n}\n\nexport interface IUnsData {\n time: ISO8601;\n value: ValueType;\n dataGroup?: string;\n uom?: MeasurementUnit;\n foreignEventKey?: string;\n intervalStart?: ISO8601 | number;\n intervalEnd?: ISO8601 | number;\n windowStart?: ISO8601 | number;\n windowEnd?: ISO8601 | number;\n eventId?: string;\n deleted?: boolean;\n deletedAt?: ISO8601 | number;\n lastSeen?: ISO8601 | number;\n}\n\nexport interface IUnsTableColumn {\n name: string;\n type: QuestDbType;\n value: string | number | boolean | null;\n uom?: MeasurementUnit;\n}\n\nexport interface IUnsTable {\n time: ISO8601;\n dataGroup?: string;\n columns: IUnsTableColumn[];\n intervalStart?: ISO8601 | number;\n intervalEnd?: ISO8601 | number;\n windowStart?: ISO8601 | number;\n windowEnd?: ISO8601 | number;\n eventId?: string;\n deleted?: boolean;\n deletedAt?: ISO8601 | number;\n lastSeen?: ISO8601 | number;\n}\n\nexport interface IMqttAttributeMessage {\n attribute: UnsAttribute;\n description?: string;\n tags?: UnsTags[];\n attributeNeedsPersistence?: boolean | null;\n}\n\ntype AttributePayload =\n | { message: IUnsMessage; data?: never; table?: never; createdAt?: never; expiresAt?: never }\n | { message?: never; data: IUnsData; table?: never; createdAt?: ISO8601; expiresAt?: ISO8601 }\n | { message?: never; data?: never; table: IUnsTable; createdAt?: ISO8601; expiresAt?: ISO8601 };\n\nexport type IMqttAttributeEntry = IMqttAttributeMessage & AttributePayload;\n\nexport interface IMqttPublishRequest {\n topic: UnsTopics;\n asset: UnsAsset;\n assetDescription?: string;\n objectType: UnsObjectType;\n objectTypeDescription?: string;\n objectId: UnsObjectId;\n attributes: IMqttAttributeEntry | IMqttAttributeEntry[];\n}\n\n// This interface represents a packet for a UNS system\nexport interface IUnsPacket {\n // The message object of the packet\n message: IUnsExtendedMessage;\n \n // The HMAC signature of the message\n messageSignature?: string;\n\n // Automatically calculated interval between two packets in ms\n interval?: number;\n\n // Current library version\n readonly version: string;\n\n // Autogenerated sequence number\n sequenceId?: number;\n}\n\nexport interface IUnsPackatParameters {\n\n}\n\nexport interface IUnsMessage {\n data?: IUnsData;\n table?: IUnsTable;\n expiresAt?: ISO8601;\n createdAt?: ISO8601;\n}\n\nexport interface IUnsExtendedMessage extends IUnsMessage {\n data?: IUnsExtendedData;\n}\n\nexport interface ITopicObject {\n timestamp: string;\n attribute:string;\n attributeType: UnsAttributeType;\n topic:string;\n description:string;\n dataGroup:string;\n tags:string[] | null;\n attributeNeedsPersistence: boolean | null;\n asset: UnsAsset;\n assetDescription?: string;\n objectType: UnsObjectType;\n objectTypeDescription?: string;\n objectId: UnsObjectId;\n}\n\n// API Interfaces below\nexport interface IApiObject {\n timestamp: string;\n attribute:string;\n topic:string;\n attributeType: UnsAttributeType;\n apiDescription?: string; // Optional description for the API endpoint\n apiHost: string; // Hostname of the service\n apiEndpoint: string; // API endpoint for virtual topics\n apiSwaggerEndpoint: string; // Swagger endpoint for API documentation\n apiMethod: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\"; // HTTP method for API endpoint\n apiQueryParams: QueryParamDef[]; // query parameters for the API endpoint\n asset: UnsAsset;\n objectType: UnsObjectType;\n objectId: UnsObjectId;\n controllerName?: string;\n controllerHost?: string;\n controllerPort?: string;\n controllerPublicBase?: string;\n}\n\nexport interface IApiCatchallMapping {\n topic: string;\n apiBase: string;\n apiBasePath: string;\n swaggerPath: string;\n}\n\nexport interface QueryParamDef {\n name: string;\n type: \"string\" | \"number\" | \"boolean\";\n required?: boolean;\n description?: string;\n /**\n * Optional canonical chat alias used by assistant tooling.\n * Typical values: from, to, limit, topic, timezone, summaryOnly.\n */\n chatCanonical?: string;\n /**\n * Optional default query value. Included in generated OpenAPI metadata.\n */\n defaultValue?: string | number | boolean;\n}\n\nexport interface ApiChatDefaults {\n from?: string;\n to?: string;\n limit?: number;\n topic?: string;\n timezone?: string;\n summaryOnly?: boolean;\n [key: string]: string | number | boolean | undefined;\n}\n\nexport interface IApiProxyOptions {\n jwtSecret?: string;\n jwks?: {\n wellKnownJwksUrl: string;\n activeKidUrl?: string;\n cacheTtlMs?: number;\n algorithms?: (\"RS256\" | \"RS384\" | \"RS512\")[];\n };\n /**\n * Optional base prefixes to mount the API and swagger JSON under (e.g. \"/archiver-3\").\n * Defaults to \"/api\" when not provided.\n */\n apiBasePath?: string;\n swaggerBasePath?: string;\n /**\n * Skip mounting the default \"/api\" route. Useful when rebasing entirely under a custom prefix.\n */\n disableDefaultApiMount?: boolean;\n}\n\nexport interface IGetEndpointOptions {\n apiDescription?: string;\n tags?: string[];\n queryParams?: QueryParamDef[];\n /**\n * Optional defaults consumed by chat tooling (published as OpenAPI vendor extension x-uns-chat.defaults).\n */\n chatDefaults?: ApiChatDefaults;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"uns-interfaces.js","sourceRoot":"","sources":["../../src/uns/uns-interfaces.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,YAAY,GAAG,+CAA+C,CAAC;IACrE,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAID,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAIxD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,MAAM;IACN,MAAM;IACN,WAAW;IACX,cAAc;IACd,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,SAAS;CACD,CAAC;AAEX,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAS,qBAAqB,CAAC,CAAC;AACvE,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AACnD,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AACnD,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAW3C,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CACL,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/B,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/B,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAC9B,CAAC;AACJ,CAAC","sourcesContent":["import { UnsAttributeType } from \"../graphql/schema.js\";\nimport { MeasurementUnit } from \"./uns-measurements.js\";\nimport { UnsTags } from \"./uns-tags.js\";\nimport type { UnsObjectId, UnsObjectType } from \"./uns-object.js\";\nimport type { UnsAsset } from \"./uns-asset.js\";\nimport type { IMqttConnectProperties, IMqttPublishOptions, IMqttServerConfig, MqttProtocol } from \"../uns-mqtt/mqtt-interfaces.js\";\nimport { UnsTopics } from \"./uns-topics.js\";\nimport { knownUnsAttributes, type KnownUnsAttributeName } from \"./uns-attributes.js\";\n\nexport type ISO8601 = `${number}-${string}-${string}T${string}:${string}:${string}.${string}Z`;\nexport function isIOS8601Type(value: string): value is ISO8601 {\n const iso8601Regex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\n return iso8601Regex.test(value);\n}\n// Known attribute names (with IntelliSense) while still allowing arbitrary strings.\nexport type UnsAttribute = KnownUnsAttributeName | (string & {});\n\nexport const valueTypes = [\"string\", \"number\"] as const;\nexport type ValueTypeString = (typeof valueTypes)[number];\nexport type ValueType = string | number;\n\nexport const questDbPrimitiveTypes = [\n \"boolean\",\n \"ipv4\",\n \"byte\",\n \"short\",\n \"char\",\n \"int\",\n \"float\",\n \"symbol\",\n \"varchar\",\n \"string\",\n \"long\",\n \"date\",\n \"timestamp\",\n \"timestamp_ns\",\n \"double\",\n \"uuid\",\n \"binary\",\n \"long256\",\n] as const;\n\nconst questDbPrimitiveTypeSet = new Set<string>(questDbPrimitiveTypes);\nconst questDbGeohashRegex = /^geohash\\(\\d+[bc]\\)$/;\nconst questDbDecimalRegex = /^decimal\\(\\d+,\\d+\\)$/;\nconst questDbArrayRegex = /^array<[^>]+>$/;\n\nexport type QuestDbPrimitiveType = (typeof questDbPrimitiveTypes)[number];\n\n// Supported QuestDB column types for UNS tables.\nexport type QuestDbType =\n | QuestDbPrimitiveType\n | `geohash(${number}${\"b\" | \"c\"})`\n | `decimal(${number},${number})`\n | `array<${string}>`;\n\nexport function isQuestDbType(value: unknown): value is QuestDbType {\n if (typeof value !== \"string\") {\n return false;\n }\n if (questDbPrimitiveTypeSet.has(value)) {\n return true;\n }\n return (\n questDbGeohashRegex.test(value) ||\n questDbDecimalRegex.test(value) ||\n questDbArrayRegex.test(value)\n );\n}\n\nexport interface IUnsParameters {\n mqttSubToTopics?: string | string[];\n username?: string;\n password?: string;\n mqttSSL?: boolean;\n publishThrottlingDelay?: number; // Delay in milliseconds; default is 1ms\n subscribeThrottlingDelay?: number; // Delay in milliseconds; default is 1ms\n rejectUnauthorized?: boolean;\n clientId?: string;\n hosts?: string[];\n servers?: IMqttServerConfig[];\n port?: number;\n protocol?: MqttProtocol;\n keepalive?: number;\n clean?: boolean;\n connectTimeout?: number;\n reconnectPeriod?: number;\n reconnectOnConnackError?: boolean;\n resubscribe?: boolean;\n queueQoSZero?: boolean;\n properties?: IMqttConnectProperties;\n ca?: string;\n cert?: string;\n key?: string;\n servername?: string;\n /**\n * Default MQTT publish options applied to all outgoing messages\n * (e.g., qos, retain, messageExpiryInterval).\n */\n defaultPublishOptions?: IMqttPublishOptions;\n}\n\nexport interface IUnsProcessParameters {\n processName: string;\n mqttSubToTopics?: string | string[];\n username?: string;\n password?: string;\n mqttSSL?: boolean;\n clientId?: string;\n hosts?: string[];\n servers?: IMqttServerConfig[];\n port?: number;\n protocol?: MqttProtocol;\n keepalive?: number;\n clean?: boolean;\n connectTimeout?: number;\n reconnectPeriod?: number;\n reconnectOnConnackError?: boolean;\n resubscribe?: boolean;\n queueQoSZero?: boolean;\n rejectUnauthorized?: boolean;\n properties?: IMqttConnectProperties;\n ca?: string;\n cert?: string;\n key?: string;\n servername?: string;\n}\n\nexport interface UnsEvents {\n // Emitters in MqttProxy, UnsMqttProxy\n input: { topic: string; message: string, packet: any };\n mqttProxyStatus: { event: string, value: number, uom: MeasurementUnit, statusTopic: string };\n \n // Emitters in MqttProxy\n error: { code: number; message: string };\n \n // Emitters in UnsMqttProxy\n mqttWorker: { command: string, instanceName: string; batchSize: number, referenceHash: string };\n\n // Emitter in UnsCronProxy\n cronEvent: { event?: string; cronExpression?: string };\n\n // Emitters in UnsApiProxy\n apiGetEvent: {req: any, res: any};\n apiPostEvent: {req: any, res: any};\n\n // Emitters in UnsProxy\n unsProxyProducedTopics: { producedTopics: ITopicObject[], statusTopic: string };\n\n // Emitters in UnsProxy\n unsProxyProducedApiEndpoints: { producedApiEndpoints: IApiObject[], statusTopic: string };\n\n // Emitters in UnsProxy\n unsProxyProducedApiCatchAll: { producedCatchall: IApiCatchallMapping[], statusTopic: string };\n}\n\nexport interface IUnsExtendedData extends IUnsData {\n valueType: ValueTypeString;\n}\n\nexport interface IUnsData {\n time: ISO8601;\n value: ValueType;\n dataGroup?: string;\n uom?: MeasurementUnit;\n foreignEventKey?: string;\n intervalStart?: ISO8601 | number;\n intervalEnd?: ISO8601 | number;\n windowStart?: ISO8601 | number;\n windowEnd?: ISO8601 | number;\n eventId?: string;\n deleted?: boolean;\n deletedAt?: ISO8601 | number;\n lastSeen?: ISO8601 | number;\n}\n\nexport interface IUnsTableColumn {\n name: string;\n type: QuestDbType;\n value: string | number | boolean | null;\n uom?: MeasurementUnit;\n}\n\nexport interface IUnsTable {\n time: ISO8601;\n dataGroup?: string;\n columns: IUnsTableColumn[];\n intervalStart?: ISO8601 | number;\n intervalEnd?: ISO8601 | number;\n windowStart?: ISO8601 | number;\n windowEnd?: ISO8601 | number;\n eventId?: string;\n deleted?: boolean;\n deletedAt?: ISO8601 | number;\n lastSeen?: ISO8601 | number;\n}\n\nexport interface IMqttAttributeMessage {\n attribute: UnsAttribute;\n description?: string;\n tags?: UnsTags[];\n attributeNeedsPersistence?: boolean | null;\n}\n\ntype AttributePayload =\n | { message: IUnsMessage; data?: never; table?: never; createdAt?: never; expiresAt?: never }\n | { message?: never; data: IUnsData; table?: never; createdAt?: ISO8601; expiresAt?: ISO8601 }\n | { message?: never; data?: never; table: IUnsTable; createdAt?: ISO8601; expiresAt?: ISO8601 };\n\nexport type IMqttAttributeEntry = IMqttAttributeMessage & AttributePayload;\n\nexport interface IMqttPublishRequest {\n topic: UnsTopics;\n asset: UnsAsset;\n assetDescription?: string;\n objectType: UnsObjectType;\n objectTypeDescription?: string;\n objectId: UnsObjectId;\n attributes: IMqttAttributeEntry | IMqttAttributeEntry[];\n}\n\n// This interface represents a packet for a UNS system\nexport interface IUnsPacket {\n // The message object of the packet\n message: IUnsExtendedMessage;\n \n // The HMAC signature of the message\n messageSignature?: string;\n\n // Automatically calculated interval between two packets in ms\n interval?: number;\n\n // Current library version\n readonly version: string;\n\n // Autogenerated sequence number\n sequenceId?: number;\n}\n\nexport interface IUnsPackatParameters {\n\n}\n\nexport interface IUnsMessage {\n data?: IUnsData;\n table?: IUnsTable;\n expiresAt?: ISO8601;\n createdAt?: ISO8601;\n}\n\nexport interface IUnsExtendedMessage extends IUnsMessage {\n data?: IUnsExtendedData;\n}\n\nexport interface ITopicObject {\n timestamp: string;\n attribute:string;\n attributeType: UnsAttributeType;\n topic:string;\n description:string;\n dataGroup:string;\n tags:string[] | null;\n attributeNeedsPersistence: boolean | null;\n asset: UnsAsset;\n assetDescription?: string;\n objectType: UnsObjectType;\n objectTypeDescription?: string;\n objectId: UnsObjectId;\n}\n\n// API Interfaces below\nexport interface IApiObject {\n timestamp: string;\n attribute:string;\n topic:string;\n attributeType: UnsAttributeType;\n apiDescription?: string; // Optional description for the API endpoint\n apiHost: string; // Hostname of the service\n apiEndpoint: string; // API endpoint for virtual topics\n apiSwaggerEndpoint: string; // Swagger endpoint for API documentation\n apiMethod: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\"; // HTTP method for API endpoint\n apiQueryParams: QueryParamDef[]; // query parameters for the API endpoint\n asset: UnsAsset;\n objectType: UnsObjectType;\n objectId: UnsObjectId;\n controllerName?: string;\n controllerHost?: string;\n controllerPort?: string;\n controllerPublicBase?: string;\n}\n\nexport interface IApiCatchallMapping {\n topic: string;\n apiBase: string;\n apiBasePath: string;\n swaggerPath: string;\n}\n\nexport interface QueryParamDef {\n name: string;\n type: \"string\" | \"number\" | \"boolean\";\n required?: boolean;\n description?: string;\n /**\n * Optional canonical chat alias used by assistant tooling.\n * Typical values: from, to, limit, topic, timezone, summaryOnly.\n */\n chatCanonical?: string;\n /**\n * Optional default query value. Included in generated OpenAPI metadata.\n */\n defaultValue?: string | number | boolean;\n}\n\nexport interface ApiChatDefaults {\n from?: string;\n to?: string;\n limit?: number;\n topic?: string;\n timezone?: string;\n summaryOnly?: boolean;\n [key: string]: string | number | boolean | undefined;\n}\n\nexport interface IApiProxyOptions {\n jwtSecret?: string;\n jwks?: {\n wellKnownJwksUrl: string;\n activeKidUrl?: string;\n cacheTtlMs?: number;\n algorithms?: (\"RS256\" | \"RS384\" | \"RS512\")[];\n };\n /**\n * Optional base prefixes to mount the API and swagger JSON under (e.g. \"/archiver-3\").\n * Defaults to \"/api\" when not provided.\n */\n apiBasePath?: string;\n swaggerBasePath?: string;\n /**\n * Skip mounting the default \"/api\" route. Useful when rebasing entirely under a custom prefix.\n */\n disableDefaultApiMount?: boolean;\n}\n\nexport interface IGetEndpointOptions {\n apiDescription?: string;\n tags?: string[];\n queryParams?: QueryParamDef[];\n /**\n * Optional defaults consumed by chat tooling (published as OpenAPI vendor extension x-uns-chat.defaults).\n */\n chatDefaults?: ApiChatDefaults;\n}\n\nexport interface IPostEndpointOptions {\n apiDescription?: string;\n tags?: string[];\n requestBody?: {\n description?: string;\n required?: boolean;\n schema?: Record<string, unknown>;\n };\n}\n"]}
|