@uns-kit/core 2.0.27 → 2.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +137 -137
- package/dist/base-path.js.map +1 -1
- package/dist/config/project.config.extension.js.map +1 -1
- package/dist/config-file.js.map +1 -1
- package/dist/graphql/schema.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/logger.js.map +1 -1
- package/dist/tools/auth/auth-client.js.map +1 -1
- package/dist/tools/auth/index.js.map +1 -1
- package/dist/tools/auth/secure-store.js.map +1 -1
- package/dist/tools/base-path.js.map +1 -1
- package/dist/tools/file-utils.js.map +1 -1
- package/dist/tools/generate-config-schema.js.map +1 -1
- package/dist/tools/generate-uns-dictionary.js +7 -7
- package/dist/tools/generate-uns-dictionary.js.map +1 -1
- package/dist/tools/generate-uns-measurements.js +7 -7
- package/dist/tools/generate-uns-measurements.js.map +1 -1
- package/dist/tools/generate-uns-reference.js +9 -9
- package/dist/tools/generate-uns-reference.js.map +1 -1
- package/dist/tools/pull-request.js.map +1 -1
- package/dist/tools/refresh-uns.js +50 -50
- package/dist/tools/refresh-uns.js.map +1 -1
- package/dist/tools/schema.js.map +1 -1
- package/dist/tools/sync-uns-schema.js +96 -24
- package/dist/tools/sync-uns-schema.js.map +1 -1
- package/dist/uns/handover-manager-event-emitter.js.map +1 -1
- package/dist/uns/handover-manager.js.map +1 -1
- package/dist/uns/process-config.js.map +1 -1
- package/dist/uns/process-name-service.js.map +1 -1
- package/dist/uns/status-monitor.js.map +1 -1
- package/dist/uns/uns-asset.js.map +1 -1
- package/dist/uns/uns-attributes.js.map +1 -1
- package/dist/uns/uns-dictionary-registry.js.map +1 -1
- package/dist/uns/uns-dictionary.generated.js.map +1 -1
- package/dist/uns/uns-event-emitter.js.map +1 -1
- package/dist/uns/uns-interfaces.js.map +1 -1
- package/dist/uns/uns-measurements.generated.js.map +1 -1
- package/dist/uns/uns-measurements.js.map +1 -1
- package/dist/uns/uns-object.js.map +1 -1
- package/dist/uns/uns-packet.js.map +1 -1
- package/dist/uns/uns-path.js.map +1 -1
- package/dist/uns/uns-proxy-process.js.map +1 -1
- package/dist/uns/uns-proxy.js.map +1 -1
- package/dist/uns/uns-tags.js.map +1 -1
- package/dist/uns/uns-topic-matcher.js.map +1 -1
- package/dist/uns/uns-topics.js.map +1 -1
- package/dist/uns-config/config-schema.js.map +1 -1
- package/dist/uns-config/host-placeholders.js.map +1 -1
- package/dist/uns-config/schema-tolls.js.map +1 -1
- package/dist/uns-config/schema-tools.js.map +1 -1
- package/dist/uns-config/secret-placeholders.js.map +1 -1
- package/dist/uns-config/secret-resolver.js.map +1 -1
- package/dist/uns-config/uns-core-schema.js.map +1 -1
- package/dist/uns-grpc/uns-gateway-cli.js.map +1 -1
- package/dist/uns-grpc/uns-gateway-server.js.map +1 -1
- package/dist/uns-grpc/uns-gateway.proto +104 -104
- package/dist/uns-mqtt/mqtt-interfaces.js.map +1 -1
- package/dist/uns-mqtt/mqtt-proxy.js.map +1 -1
- package/dist/uns-mqtt/mqtt-topic-builder.js.map +1 -1
- package/dist/uns-mqtt/mqtt-worker-init.js.map +1 -1
- package/dist/uns-mqtt/mqtt-worker.js.map +1 -1
- package/dist/uns-mqtt/throttled-queue.js.map +1 -1
- package/dist/uns-mqtt/uns-mqtt-proxy.js.map +1 -1
- package/dist/uns-mqtt/ws-proxy.js.map +1 -1
- package/package.json +1 -1
- package/dist/app-config.d.ts.map +0 -1
- package/dist/app-config.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh-uns.js","sourceRoot":"","sources":["../../src/tools/refresh-uns.ts"],"names":[],"mappings":"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","sourcesContent":["import { GraphQLClient, gql, ClientError } from \"graphql-request\";\r\nimport { TreeStructure, UnsAttributeSummary, UnsAssetSummary } from \"./schema.js\";\r\nimport * as path from \"path\";\r\nimport * as fs from 'fs';\r\nimport { mkdir } from \"fs/promises\";\r\nimport { ConfigFile } from \"../config-file.js\";\r\nimport { AuthClient } from \"./auth/index.js\";\r\n\r\n\r\nconst config = await ConfigFile.loadConfig();\r\n\r\n// Helper function to write content to a file\r\nasync function writeToFile(filePath: string, content: string) {\r\n return new Promise<void>((resolve, reject) => {\r\n fs.writeFile(filePath, content, (error: NodeJS.ErrnoException | null) => {\r\n if (error) {\r\n console.error('Error writing file:', error);\r\n return reject(error);\r\n }\r\n console.log(`${path.basename(filePath)} updated.`);\r\n resolve();\r\n });\r\n });\r\n}\r\n\r\n// Function to process tree structure recursively\r\nfunction generateUnsTopics(tree: TreeStructure[], currentPath: string): string {\r\n return tree\r\n .map(element => {\r\n const newPath = `${currentPath}${element.unsNode}/`;\r\n const childrenTopics = element.children?.length\r\n ? generateUnsTopics(element.children, newPath)\r\n : '';\r\n return `\"${newPath}\" |${childrenTopics}`;\r\n })\r\n .join('');\r\n}\r\n\r\n// Prepare GraphQL client with Authorization from auth library\r\nconst auth = await AuthClient.create();\r\nlet accessToken = await auth.getAccessToken();\r\nlet client = new GraphQLClient(config.uns.graphql, {\r\n headers: { Authorization: `Bearer ${accessToken}` },\r\n});\r\n\r\nasync function requestWithAuth<T>(document: any): Promise<T> {\r\n try {\r\n return await client.request<T>(document);\r\n } catch (err: any) {\r\n const isAuthErr = err instanceof ClientError && (err.response.status === 401 || err.response.status === 403);\r\n if (isAuthErr) {\r\n // Attempt to get a fresh token (will try refresh, then prompt)\r\n accessToken = await auth.getAccessToken();\r\n client.setHeader('Authorization', `Bearer ${accessToken}`);\r\n return await client.request<T>(document);\r\n }\r\n throw err;\r\n }\r\n}\r\n\r\n// Fetch and generate UnsTopics\r\nasync function refreshUnsTopics() {\r\n const document = gql`\r\n query GetTreeStructure {\r\n GetTreeStructure {\r\n id\r\n parent\r\n unsNode\r\n children {\r\n id\r\n parent\r\n unsNode\r\n children {\r\n id\r\n parent\r\n unsNode\r\n children {\r\n id\r\n parent\r\n unsNode\r\n children {\r\n id\r\n parent\r\n unsNode\r\n children {\r\n id\r\n parent\r\n unsNode\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }`;\r\n\r\n const query: any = await requestWithAuth(document);\r\n const tree: TreeStructure[] = query.GetTreeStructure;\r\n\r\n const vsebina = `export type UnsTopics = ${generateUnsTopics(tree, '')}\\n(string & {});`;\r\n const outputPath = path.resolve(process.cwd(), \"src/uns/uns-topics.ts\");\r\n await ensureDirectory(path.dirname(outputPath));\r\n await writeToFile(outputPath, vsebina);\r\n}\r\n\r\n// Fetch and generate UnsTags\r\nasync function refreshUnsTags() {\r\n const document = gql`\r\n query Query {\r\n GetTags\r\n }`;\r\n\r\n const query: any = await requestWithAuth(document);\r\n const tags: string[] = query.GetTags;\r\n\r\n const vsebina = `export type UnsTags = ${tags.map(tag => `\"${tag}\" |`).join('')}\\n(string & {});`;\r\n const outputPath = path.resolve(process.cwd(), \"src/uns/uns-tags.ts\");\r\n await ensureDirectory(path.dirname(outputPath));\r\n await writeToFile(outputPath, vsebina);\r\n}\r\n\r\nfunction normalizeAttributePath(pathValue: string | null | undefined): string {\r\n if (!pathValue) return \"\";\r\n return pathValue.replace(/\\/+$/, \"\");\r\n}\r\n\r\nfunction buildAttributeEntries(attributes: Array<UnsAttributeSummary | null | undefined>) {\r\n const deduped = new Map<string, {\r\n path: string;\r\n description: string | null;\r\n attributeType: string | null;\r\n dataGroup: string | null;\r\n objectType: string | null;\r\n objectId: string | null;\r\n }>();\r\n\r\n for (const attr of attributes) {\r\n if (!attr) continue;\r\n const path = normalizeAttributePath(typeof attr.path === \"string\" ? attr.path : null);\r\n if (!path) continue;\r\n deduped.set(path, {\r\n path,\r\n description: typeof attr.description === \"string\" ? attr.description : null,\r\n attributeType: typeof attr.attributeType === \"string\" ? attr.attributeType : null,\r\n dataGroup: typeof attr.dataGroup === \"string\" ? attr.dataGroup : null,\r\n objectType: typeof attr.objectType === \"string\" ? attr.objectType : null,\r\n objectId: typeof attr.objectId === \"string\" ? attr.objectId : null,\r\n });\r\n }\r\n\r\n return Array.from(deduped.values()).sort((a, b) => a.path.localeCompare(b.path));\r\n}\r\n\r\nfunction buildAssetEntries(assets: Array<UnsAssetSummary | null | undefined>) {\r\n const deduped = new Map<string, {\r\n asset: string;\r\n description: string | null;\r\n }>();\r\n\r\n for (const entry of assets) {\r\n if (!entry) continue;\r\n const assetName = typeof entry.asset === \"string\" ? entry.asset.trim() : \"\";\r\n if (!assetName) continue;\r\n const description = typeof entry.description === \"string\" ? entry.description : null;\r\n if (!deduped.has(assetName)) {\r\n deduped.set(assetName, { asset: assetName, description });\r\n }\r\n }\r\n\r\n return Array.from(deduped.values()).sort((a, b) => a.asset.localeCompare(b.asset));\r\n}\r\n\r\n// Fetch and generate UnsAssets\r\nasync function refreshUnsAssets() {\r\n const document = gql`\r\n query GetAssets {\r\n GetAssets {\r\n path\r\n description\r\n asset\r\n objectType\r\n objectId\r\n }\r\n }`;\r\n\r\n const query: any = await requestWithAuth(document);\r\n let assets = buildAssetEntries(Array.isArray(query.GetAssets) ? query.GetAssets : []);\r\n if (!assets.length) {\r\n assets = [{ asset: \"asset\", description: null }];\r\n }\r\n\r\n const header = `// Generated UNS asset list. Run \\`pnpm run refresh-uns\\` to update.\\n`;\r\n const entries = assets\r\n .map((entry) => {\r\n const comment = entry.description ? ` /** ${sanitizeComment(entry.description)} */\\n` : \"\";\r\n return `${comment} \"${entry.asset}\": \"${entry.asset}\",`;\r\n })\r\n .join(\"\\n\");\r\n\r\n const helpers = `\r\nexport function resolveGeneratedAsset(name: keyof typeof GeneratedAssets): (typeof GeneratedAssets)[keyof typeof GeneratedAssets];\r\nexport function resolveGeneratedAsset<T extends string>(name: T): (typeof GeneratedAssets)[keyof typeof GeneratedAssets] | T;\r\nexport function resolveGeneratedAsset(name: string): string {\r\n return (GeneratedAssets as Record<string, string>)[name] ?? name;\r\n}\r\n`;\r\n\r\n const vsebina = `${header}export const GeneratedAssets = {\\n${entries}\\n} as const;\\nexport type GeneratedAssetName = typeof GeneratedAssets[keyof typeof GeneratedAssets];\\n${helpers}`;\r\n const outputPath = path.resolve(process.cwd(), \"src/uns/uns-assets.ts\");\r\n await ensureDirectory(path.dirname(outputPath));\r\n await writeToFile(outputPath, vsebina);\r\n}\r\n\r\n// Execute the refresh processes\r\nasync function refresh() {\r\n await Promise.all([refreshUnsTopics(), refreshUnsTags(), refreshUnsAssets()]);\r\n}\r\n\r\nrefresh().catch(error => console.error('Error during refresh:', error));\r\n\r\nasync function ensureDirectory(dirPath: string): Promise<void> {\r\n await mkdir(dirPath, { recursive: true });\r\n}\r\n\r\nfunction sanitizeComment(text: string): string {\r\n return text.replace(/\\*\\//g, \"*\\\\/\");\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"refresh-uns.js","sourceRoot":"","sources":["../../src/tools/refresh-uns.ts"],"names":[],"mappings":"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","sourcesContent":["import { GraphQLClient, gql, ClientError } from \"graphql-request\";\nimport { TreeStructure, UnsAttributeSummary, UnsAssetSummary } from \"./schema.js\";\nimport * as path from \"path\";\nimport * as fs from 'fs';\nimport { mkdir } from \"fs/promises\";\nimport { ConfigFile } from \"../config-file.js\";\nimport { AuthClient } from \"./auth/index.js\";\n\n\nconst config = await ConfigFile.loadConfig();\n\n// Helper function to write content to a file\nasync function writeToFile(filePath: string, content: string) {\n return new Promise<void>((resolve, reject) => {\n fs.writeFile(filePath, content, (error: NodeJS.ErrnoException | null) => {\n if (error) {\n console.error('Error writing file:', error);\n return reject(error);\n }\n console.log(`${path.basename(filePath)} updated.`);\n resolve();\n });\n });\n}\n\n// Function to process tree structure recursively\nfunction generateUnsTopics(tree: TreeStructure[], currentPath: string): string {\n return tree\n .map(element => {\n const newPath = `${currentPath}${element.unsNode}/`;\n const childrenTopics = element.children?.length\n ? generateUnsTopics(element.children, newPath)\n : '';\n return `\"${newPath}\" |${childrenTopics}`;\n })\n .join('');\n}\n\n// Prepare GraphQL client with Authorization from auth library\nconst auth = await AuthClient.create();\nlet accessToken = await auth.getAccessToken();\nlet client = new GraphQLClient(config.uns.graphql, {\n headers: { Authorization: `Bearer ${accessToken}` },\n});\n\nasync function requestWithAuth<T>(document: any): Promise<T> {\n try {\n return await client.request<T>(document);\n } catch (err: any) {\n const isAuthErr = err instanceof ClientError && (err.response.status === 401 || err.response.status === 403);\n if (isAuthErr) {\n // Attempt to get a fresh token (will try refresh, then prompt)\n accessToken = await auth.getAccessToken();\n client.setHeader('Authorization', `Bearer ${accessToken}`);\n return await client.request<T>(document);\n }\n throw err;\n }\n}\n\n// Fetch and generate UnsTopics\nasync function refreshUnsTopics() {\n const document = gql`\n query GetTreeStructure {\n GetTreeStructure {\n id\n parent\n unsNode\n children {\n id\n parent\n unsNode\n children {\n id\n parent\n unsNode\n children {\n id\n parent\n unsNode\n children {\n id\n parent\n unsNode\n children {\n id\n parent\n unsNode\n }\n }\n }\n }\n }\n }\n }`;\n\n const query: any = await requestWithAuth(document);\n const tree: TreeStructure[] = query.GetTreeStructure;\n\n const vsebina = `export type UnsTopics = ${generateUnsTopics(tree, '')}\\n(string & {});`;\n const outputPath = path.resolve(process.cwd(), \"src/uns/uns-topics.ts\");\n await ensureDirectory(path.dirname(outputPath));\n await writeToFile(outputPath, vsebina);\n}\n\n// Fetch and generate UnsTags\nasync function refreshUnsTags() {\n const document = gql`\n query Query {\n GetTags\n }`;\n\n const query: any = await requestWithAuth(document);\n const tags: string[] = query.GetTags;\n\n const vsebina = `export type UnsTags = ${tags.map(tag => `\"${tag}\" |`).join('')}\\n(string & {});`;\n const outputPath = path.resolve(process.cwd(), \"src/uns/uns-tags.ts\");\n await ensureDirectory(path.dirname(outputPath));\n await writeToFile(outputPath, vsebina);\n}\n\nfunction normalizeAttributePath(pathValue: string | null | undefined): string {\n if (!pathValue) return \"\";\n return pathValue.replace(/\\/+$/, \"\");\n}\n\nfunction buildAttributeEntries(attributes: Array<UnsAttributeSummary | null | undefined>) {\n const deduped = new Map<string, {\n path: string;\n description: string | null;\n attributeType: string | null;\n dataGroup: string | null;\n objectType: string | null;\n objectId: string | null;\n }>();\n\n for (const attr of attributes) {\n if (!attr) continue;\n const path = normalizeAttributePath(typeof attr.path === \"string\" ? attr.path : null);\n if (!path) continue;\n deduped.set(path, {\n path,\n description: typeof attr.description === \"string\" ? attr.description : null,\n attributeType: typeof attr.attributeType === \"string\" ? attr.attributeType : null,\n dataGroup: typeof attr.dataGroup === \"string\" ? attr.dataGroup : null,\n objectType: typeof attr.objectType === \"string\" ? attr.objectType : null,\n objectId: typeof attr.objectId === \"string\" ? attr.objectId : null,\n });\n }\n\n return Array.from(deduped.values()).sort((a, b) => a.path.localeCompare(b.path));\n}\n\nfunction buildAssetEntries(assets: Array<UnsAssetSummary | null | undefined>) {\n const deduped = new Map<string, {\n asset: string;\n description: string | null;\n }>();\n\n for (const entry of assets) {\n if (!entry) continue;\n const assetName = typeof entry.asset === \"string\" ? entry.asset.trim() : \"\";\n if (!assetName) continue;\n const description = typeof entry.description === \"string\" ? entry.description : null;\n if (!deduped.has(assetName)) {\n deduped.set(assetName, { asset: assetName, description });\n }\n }\n\n return Array.from(deduped.values()).sort((a, b) => a.asset.localeCompare(b.asset));\n}\n\n// Fetch and generate UnsAssets\nasync function refreshUnsAssets() {\n const document = gql`\n query GetAssets {\n GetAssets {\n path\n description\n asset\n objectType\n objectId\n }\n }`;\n\n const query: any = await requestWithAuth(document);\n let assets = buildAssetEntries(Array.isArray(query.GetAssets) ? query.GetAssets : []);\n if (!assets.length) {\n assets = [{ asset: \"asset\", description: null }];\n }\n\n const header = `// Generated UNS asset list. Run \\`pnpm run refresh-uns\\` to update.\\n`;\n const entries = assets\n .map((entry) => {\n const comment = entry.description ? ` /** ${sanitizeComment(entry.description)} */\\n` : \"\";\n return `${comment} \"${entry.asset}\": \"${entry.asset}\",`;\n })\n .join(\"\\n\");\n\n const helpers = `\nexport function resolveGeneratedAsset(name: keyof typeof GeneratedAssets): (typeof GeneratedAssets)[keyof typeof GeneratedAssets];\nexport function resolveGeneratedAsset<T extends string>(name: T): (typeof GeneratedAssets)[keyof typeof GeneratedAssets] | T;\nexport function resolveGeneratedAsset(name: string): string {\n return (GeneratedAssets as Record<string, string>)[name] ?? name;\n}\n`;\n\n const vsebina = `${header}export const GeneratedAssets = {\\n${entries}\\n} as const;\\nexport type GeneratedAssetName = typeof GeneratedAssets[keyof typeof GeneratedAssets];\\n${helpers}`;\n const outputPath = path.resolve(process.cwd(), \"src/uns/uns-assets.ts\");\n await ensureDirectory(path.dirname(outputPath));\n await writeToFile(outputPath, vsebina);\n}\n\n// Execute the refresh processes\nasync function refresh() {\n await Promise.all([refreshUnsTopics(), refreshUnsTags(), refreshUnsAssets()]);\n}\n\nrefresh().catch(error => console.error('Error during refresh:', error));\n\nasync function ensureDirectory(dirPath: string): Promise<void> {\n await mkdir(dirPath, { recursive: true });\n}\n\nfunction sanitizeComment(text: string): string {\n return text.replace(/\\*\\//g, \"*\\\\/\");\n}\n"]}
|
package/dist/tools/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/tools/schema.ts"],"names":[],"mappings":"","sourcesContent":["export type Maybe<T> = T | null;\
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/tools/schema.ts"],"names":[],"mappings":"","sourcesContent":["export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n ID: { input: string; output: string; }\n String: { input: string; output: string; }\n Boolean: { input: boolean; output: boolean; }\n Int: { input: number; output: number; }\n Float: { input: number; output: number; }\n Date: { input: any; output: any; }\n};\n\nexport type ActivateMqttTranslation = {\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n sourceTag?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** MQTT Translator object. */\nexport type AddMqttTranslation = {\n description?: InputMaybe<Scalars['String']['input']>;\n sourceTag?: InputMaybe<Scalars['String']['input']>;\n sourceTopic?: InputMaybe<Scalars['String']['input']>;\n targetTag?: InputMaybe<Scalars['String']['input']>;\n targetTopic?: InputMaybe<Scalars['String']['input']>;\n uom?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type AddMqttTranslatorTopic = {\n sourceTopic?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type DeleteMqttTranslation = {\n sourceTag?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type DeleteMqttTranslatorTopic = {\n sourceTopic?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type InitMqttTranslation = {\n sourceTag?: InputMaybe<Scalars['String']['input']>;\n sourceTopic?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type InsertUnsNode = {\n parent?: InputMaybe<Scalars['Int']['input']>;\n unsNode?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type ModifyMqttTranslation = {\n description?: InputMaybe<Scalars['String']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n sourceTag?: InputMaybe<Scalars['String']['input']>;\n targetTag?: InputMaybe<Scalars['String']['input']>;\n targetTopic?: InputMaybe<Scalars['String']['input']>;\n uom?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** MQTT Translator object. */\nexport type MqttTranslation = {\n __typename?: 'MqttTranslation';\n description?: Maybe<Scalars['String']['output']>;\n enabled?: Maybe<Scalars['Boolean']['output']>;\n sourceTag?: Maybe<Scalars['String']['output']>;\n sourceTopic?: Maybe<Scalars['String']['output']>;\n targetTag?: Maybe<Scalars['String']['output']>;\n targetTopic?: Maybe<Scalars['String']['output']>;\n uom?: Maybe<Scalars['String']['output']>;\n};\n\nexport type MqttTranslatorTopic = {\n __typename?: 'MqttTranslatorTopic';\n sourceTopic?: Maybe<Scalars['String']['output']>;\n};\n\nexport type Mutation = {\n __typename?: 'Mutation';\n ActivateMqttTranslation?: Maybe<Scalars['Boolean']['output']>;\n AddMqttTranslation?: Maybe<Scalars['Boolean']['output']>;\n /** Add MQTT topic to be translated. */\n AddMqttTranslatorTopic?: Maybe<Scalars['Boolean']['output']>;\n AddUnsNode?: Maybe<Scalars['Boolean']['output']>;\n /** Add MQTT translation. */\n DeleteMqttTranslation?: Maybe<Scalars['Boolean']['output']>;\n DeleteMqttTranslatorTopic?: Maybe<Scalars['Boolean']['output']>;\n DeleteRttNode?: Maybe<Scalars['Boolean']['output']>;\n DeleteUnsNode?: Maybe<Scalars['Boolean']['output']>;\n DeployRttNode?: Maybe<Scalars['Boolean']['output']>;\n /** Populate MQTT Translator table with sourceTag and sourceTopic. */\n InitMqttTranslation?: Maybe<Scalars['Boolean']['output']>;\n /** Update MQTT Translator table with defined targetTopic. */\n ModifyMqttTranslation?: Maybe<Scalars['Boolean']['output']>;\n ModifyUnsNode?: Maybe<Scalars['Boolean']['output']>;\n StartRttNode?: Maybe<Scalars['Boolean']['output']>;\n StopRttNode?: Maybe<Scalars['Boolean']['output']>;\n};\n\n\nexport type MutationActivateMqttTranslationArgs = {\n entry?: InputMaybe<ActivateMqttTranslation>;\n};\n\n\nexport type MutationAddMqttTranslationArgs = {\n entry?: InputMaybe<AddMqttTranslation>;\n};\n\n\nexport type MutationAddMqttTranslatorTopicArgs = {\n entry?: InputMaybe<AddMqttTranslatorTopic>;\n};\n\n\nexport type MutationAddUnsNodeArgs = {\n node?: InputMaybe<InsertUnsNode>;\n};\n\n\nexport type MutationDeleteMqttTranslationArgs = {\n entry?: InputMaybe<DeleteMqttTranslation>;\n};\n\n\nexport type MutationDeleteMqttTranslatorTopicArgs = {\n entry?: InputMaybe<DeleteMqttTranslatorTopic>;\n};\n\n\nexport type MutationDeleteRttNodeArgs = {\n rttNode?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type MutationDeleteUnsNodeArgs = {\n id?: InputMaybe<Scalars['Int']['input']>;\n};\n\n\nexport type MutationDeployRttNodeArgs = {\n rttNode?: InputMaybe<Scalars['String']['input']>;\n tag?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type MutationInitMqttTranslationArgs = {\n entry?: InputMaybe<InitMqttTranslation>;\n};\n\n\nexport type MutationModifyMqttTranslationArgs = {\n entry?: InputMaybe<ModifyMqttTranslation>;\n};\n\n\nexport type MutationModifyUnsNodeArgs = {\n id?: InputMaybe<Scalars['Int']['input']>;\n node?: InputMaybe<UpdateUnsNode>;\n};\n\n\nexport type MutationStartRttNodeArgs = {\n rttNode?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type MutationStopRttNodeArgs = {\n rttNode?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** name: uns-datahub */\nexport type Query = {\n __typename?: 'Query';\n GetAssets?: Maybe<Array<Maybe<UnsAssetSummary>>>;\n GetAttributes?: Maybe<Array<Maybe<UnsAttributeSummary>>>;\n GetTags?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n /** Get MQTT Translator translations. */\n GetMqttTranslations?: Maybe<Array<Maybe<MqttTranslation>>>;\n GetMqttTranslatorTopics?: Maybe<Array<Maybe<MqttTranslatorTopic>>>;\n GetRttNodes?: Maybe<Array<Maybe<RttNode>>>;\n GetTreeStructure?: Maybe<Array<Maybe<TreeStructure>>>;\n};\n\nexport type QueryGetAssetsArgs = {\n pathPrefix?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type QueryGetAttributesArgs = {\n pathPrefix?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type RttNode = {\n __typename?: 'RttNode';\n author?: Maybe<Scalars['String']['output']>;\n deployedVersions?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n description?: Maybe<Scalars['String']['output']>;\n lastLog?: Maybe<Scalars['String']['output']>;\n latestDeployedVersion?: Maybe<Scalars['String']['output']>;\n memory?: Maybe<Scalars['Int']['output']>;\n pid?: Maybe<Scalars['Int']['output']>;\n restarts?: Maybe<Scalars['Int']['output']>;\n rttNode?: Maybe<Scalars['String']['output']>;\n runningVersion?: Maybe<Scalars['String']['output']>;\n status?: Maybe<Scalars['String']['output']>;\n uptime?: Maybe<Scalars['Int']['output']>;\n version?: Maybe<Scalars['String']['output']>;\n};\n\nexport type TreeStructure = {\n __typename?: 'TreeStructure';\n children?: Maybe<Array<Maybe<TreeStructure>>>;\n id?: Maybe<Scalars['Int']['output']>;\n parent?: Maybe<Scalars['Int']['output']>;\n unsNode?: Maybe<Scalars['String']['output']>;\n};\n\nexport type UnsAssetSummary = {\n __typename?: 'UnsAssetSummary';\n asset?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Scalars['String']['output']>;\n objectId?: Maybe<Scalars['String']['output']>;\n objectType?: Maybe<Scalars['String']['output']>;\n path?: Maybe<Scalars['String']['output']>;\n};\n\nexport type UnsAttributeSummary = {\n __typename?: 'UnsAttributeSummary';\n attributeType?: Maybe<Scalars['String']['output']>;\n dataGroup?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Scalars['String']['output']>;\n objectId?: Maybe<Scalars['String']['output']>;\n objectType?: Maybe<Scalars['String']['output']>;\n path?: Maybe<Scalars['String']['output']>;\n};\n\nexport type UnsNode = {\n __typename?: 'UnsNode';\n id?: Maybe<Scalars['Int']['output']>;\n parent?: Maybe<Scalars['Int']['output']>;\n unsNode?: Maybe<Scalars['String']['output']>;\n};\n\nexport type UpdateUnsNode = {\n parent?: InputMaybe<Scalars['Int']['input']>;\n unsNode?: InputMaybe<Scalars['String']['input']>;\n};\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { access, readFile } from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import process from "node:process";
|
|
5
|
-
import { fileURLToPath
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
6
|
import { readTextFileIfExists, writeTextFileIfChanged } from "./file-utils.js";
|
|
7
7
|
import { renderDictionaryTs } from "./generate-uns-dictionary.js";
|
|
8
8
|
import { renderMeasurementsTs } from "./generate-uns-measurements.js";
|
|
@@ -10,10 +10,10 @@ const DEFAULT_STATUS = "active";
|
|
|
10
10
|
const GENERATOR_LANG = "sl";
|
|
11
11
|
const STATUS_VALUES = ["active", "draft", "deprecated", "all"];
|
|
12
12
|
const isDirectExecution = process.argv[1]
|
|
13
|
-
?
|
|
13
|
+
? path.resolve(process.argv[1]).endsWith(path.basename(fileURLToPath(import.meta.url)))
|
|
14
14
|
: false;
|
|
15
15
|
async function main() {
|
|
16
|
-
const args = parseArgs(process.argv.slice(2));
|
|
16
|
+
const args = await parseArgs(process.argv.slice(2));
|
|
17
17
|
if (args.help) {
|
|
18
18
|
printHelp();
|
|
19
19
|
return;
|
|
@@ -63,7 +63,62 @@ async function main() {
|
|
|
63
63
|
measurements: measurementsSummary,
|
|
64
64
|
});
|
|
65
65
|
}
|
|
66
|
-
function
|
|
66
|
+
async function getControllerUrlFromConfig() {
|
|
67
|
+
const currentDir = process.cwd();
|
|
68
|
+
const configPath = path.join(currentDir, "config.json");
|
|
69
|
+
try {
|
|
70
|
+
const raw = await readFile(configPath, "utf8");
|
|
71
|
+
const config = JSON.parse(raw);
|
|
72
|
+
const unsConfig = config.uns;
|
|
73
|
+
const restUrl = unsConfig?.rest;
|
|
74
|
+
if (restUrl && typeof restUrl === "string") {
|
|
75
|
+
// Remove trailing /api from the rest URL to get the base controller URL
|
|
76
|
+
return restUrl.endsWith("/api") ? restUrl.slice(0, -4) : restUrl;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
// Ignore missing or invalid config.json
|
|
81
|
+
}
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
async function promptForToken() {
|
|
85
|
+
return new Promise((resolve) => {
|
|
86
|
+
const stdin = process.stdin;
|
|
87
|
+
const wasRaw = stdin.isRaw;
|
|
88
|
+
stdin.setRawMode(true);
|
|
89
|
+
stdin.resume();
|
|
90
|
+
process.stderr.write("Enter controller token: ");
|
|
91
|
+
let token = "";
|
|
92
|
+
stdin.on("data", onChar);
|
|
93
|
+
function onChar(char) {
|
|
94
|
+
const code = char[0];
|
|
95
|
+
// Enter (13) or newline (10) — done
|
|
96
|
+
if (code === 13 || code === 10) {
|
|
97
|
+
stdin.removeListener("data", onChar);
|
|
98
|
+
stdin.setRawMode(wasRaw ?? false);
|
|
99
|
+
stdin.pause();
|
|
100
|
+
process.stderr.write("\n");
|
|
101
|
+
resolve(token);
|
|
102
|
+
return;
|
|
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
|
+
// Backspace (127) or Delete (8)
|
|
112
|
+
if (code === 127 || code === 8) {
|
|
113
|
+
token = token.slice(0, -1);
|
|
114
|
+
}
|
|
115
|
+
else if (code >= 32) {
|
|
116
|
+
token += char.toString("utf8");
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
async function parseArgs(argv) {
|
|
67
122
|
let controllerUrl = process.env.UNS_CONTROLLER_URL?.trim() ?? "";
|
|
68
123
|
let token = process.env.UNS_CONTROLLER_TOKEN?.trim() ?? "";
|
|
69
124
|
let status = normalizeStatus(process.env.UNS_SCHEMA_STATUS, DEFAULT_STATUS);
|
|
@@ -129,15 +184,32 @@ function parseArgs(argv) {
|
|
|
129
184
|
}
|
|
130
185
|
throw new Error(`Unknown argument: ${arg}`);
|
|
131
186
|
}
|
|
187
|
+
// Try to load controller URL from config.json if not provided
|
|
188
|
+
if (!controllerUrl) {
|
|
189
|
+
const configUrl = await getControllerUrlFromConfig();
|
|
190
|
+
if (configUrl) {
|
|
191
|
+
controllerUrl = configUrl;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
132
194
|
if (!help) {
|
|
133
195
|
if (dictionaryOnly && measurementsOnly) {
|
|
134
196
|
throw new Error("Choose either --dictionary-only or --measurements-only, not both.");
|
|
135
197
|
}
|
|
136
198
|
if (!controllerUrl) {
|
|
137
|
-
throw new Error("Missing controller URL. Use --controller-url or
|
|
199
|
+
throw new Error("Missing controller URL. Use --controller-url, set UNS_CONTROLLER_URL, or provide config.json with uns.rest.");
|
|
138
200
|
}
|
|
139
201
|
if (!token) {
|
|
140
|
-
|
|
202
|
+
// Prompt for token if stdin is a TTY (interactive terminal)
|
|
203
|
+
if (process.stdin.isTTY) {
|
|
204
|
+
token = await promptForToken();
|
|
205
|
+
}
|
|
206
|
+
if (!token) {
|
|
207
|
+
throw new Error("Missing controller token. Use --token, set UNS_CONTROLLER_TOKEN, or provide it interactively.");
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Strip "Bearer " prefix if the user included it
|
|
211
|
+
if (token.toLowerCase().startsWith("bearer ")) {
|
|
212
|
+
token = token.slice(7).trim();
|
|
141
213
|
}
|
|
142
214
|
assertValidUrl(controllerUrl);
|
|
143
215
|
}
|
|
@@ -178,23 +250,23 @@ function assertValidUrl(value) {
|
|
|
178
250
|
}
|
|
179
251
|
}
|
|
180
252
|
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 files 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
|
-
--project-root <dir> Write into a generated microservice project root (env: UNS_SCHEMA_PROJECT_ROOT).
|
|
191
|
-
When omitted, the tool auto-detects a generated project from the current working directory
|
|
192
|
-
and otherwise updates the uns-kit repo templates.
|
|
193
|
-
--dry-run Report file changes without writing anything
|
|
194
|
-
--dictionary-only Sync only the UNS dictionary export
|
|
195
|
-
--measurements-only Sync only the UNS measurements export
|
|
196
|
-
--skip-generate Skip generated TypeScript refresh
|
|
197
|
-
--help, -h Show this help
|
|
253
|
+
console.log(`Usage: tsx packages/uns-core/src/tools/sync-uns-schema.ts [options]
|
|
254
|
+
|
|
255
|
+
Pull the canonical UNS schema export from a controller and refresh the local
|
|
256
|
+
JSON files plus generated TypeScript artifacts.
|
|
257
|
+
|
|
258
|
+
Options:
|
|
259
|
+
--controller-url <url> Controller base URL (env: UNS_CONTROLLER_URL, or config.json > uns.rest)
|
|
260
|
+
--token <token> Bearer token for REST export (env: UNS_CONTROLLER_TOKEN)
|
|
261
|
+
--status <value> Dictionary status filter: ${STATUS_VALUES.join("|")} (default: ${DEFAULT_STATUS}, env: UNS_SCHEMA_STATUS)
|
|
262
|
+
--project-root <dir> Write into a generated microservice project root (env: UNS_SCHEMA_PROJECT_ROOT).
|
|
263
|
+
When omitted, the tool auto-detects a generated project from the current working directory
|
|
264
|
+
and otherwise updates the uns-kit repo templates.
|
|
265
|
+
--dry-run Report file changes without writing anything
|
|
266
|
+
--dictionary-only Sync only the UNS dictionary export
|
|
267
|
+
--measurements-only Sync only the UNS measurements export
|
|
268
|
+
--skip-generate Skip generated TypeScript refresh
|
|
269
|
+
--help, -h Show this help
|
|
198
270
|
`);
|
|
199
271
|
}
|
|
200
272
|
async function findRepoRoot() {
|
|
@@ -322,7 +394,7 @@ async function fetchJson(url, token, label) {
|
|
|
322
394
|
}
|
|
323
395
|
function formatHttpError(response, url, label, body) {
|
|
324
396
|
if (response.status === 401) {
|
|
325
|
-
return `
|
|
397
|
+
return `Token is invalid or expired (401). Provide a valid token via --token, UNS_CONTROLLER_TOKEN, or the interactive prompt.`;
|
|
326
398
|
}
|
|
327
399
|
if (response.status === 403) {
|
|
328
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\r\nimport { access, readFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport process from \"node:process\";\r\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\r\nimport { readTextFileIfExists, writeTextFileIfChanged } from \"./file-utils.js\";\r\nimport { renderDictionaryTs } from \"./generate-uns-dictionary.js\";\r\nimport { renderMeasurementsTs } from \"./generate-uns-measurements.js\";\r\n\r\ntype SchemaStatus = \"active\" | \"draft\" | \"deprecated\" | \"all\";\r\n\r\ntype DictionaryDocument = Parameters<typeof renderDictionaryTs>[0];\r\ntype MeasurementsDocument = Parameters<typeof renderMeasurementsTs>[0];\r\n\r\ntype CliArgs = {\r\n controllerUrl: string;\r\n token: string;\r\n status: SchemaStatus;\r\n projectRoot?: string;\r\n dryRun: boolean;\r\n dictionaryOnly: boolean;\r\n measurementsOnly: boolean;\r\n skipGenerate: boolean;\r\n help: boolean;\r\n};\r\n\r\ntype FileChangeResult = {\r\n changed: boolean;\r\n relativePath: string;\r\n};\r\n\r\ntype DictionarySummary = {\r\n objectTypeCount: number;\r\n attributeCount: number;\r\n jsonChanged: boolean;\r\n generatedChanged: FileChangeResult[];\r\n};\r\n\r\ntype MeasurementsSummary = {\r\n categoryCount: number;\r\n jsonChanged: boolean;\r\n generatedChanged: FileChangeResult[];\r\n};\r\n\r\ntype SyncTarget = {\r\n rootDir: string;\r\n label: string;\r\n dictionaryJson: string;\r\n measurementsJson: string;\r\n dictionaryGenerated: string[];\r\n measurementsGenerated: string[];\r\n};\r\n\r\nconst DEFAULT_STATUS: SchemaStatus = \"active\";\r\nconst GENERATOR_LANG = \"sl\";\r\nconst STATUS_VALUES: SchemaStatus[] = [\"active\", \"draft\", \"deprecated\", \"all\"];\r\n\r\nconst isDirectExecution = process.argv[1]\r\n ? import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href\r\n : false;\r\n\r\nasync function main(): Promise<void> {\r\n const args = parseArgs(process.argv.slice(2));\r\n\r\n if (args.help) {\r\n printHelp();\r\n return;\r\n }\r\n\r\n const target = await resolveSyncTarget(args);\r\n\r\n const shouldSyncDictionary = !args.measurementsOnly;\r\n const shouldSyncMeasurements = !args.dictionaryOnly;\r\n\r\n const [dictionaryDocument, measurementsDocument] = await Promise.all([\r\n shouldSyncDictionary ? fetchDictionaryDocument(args.controllerUrl, args.token, args.status) : Promise.resolve(undefined),\r\n shouldSyncMeasurements ? fetchMeasurementsDocument(args.controllerUrl, args.token) : Promise.resolve(undefined),\r\n ]);\r\n\r\n let dictionarySummary: DictionarySummary | undefined;\r\n let measurementsSummary: MeasurementsSummary | undefined;\r\n\r\n if (dictionaryDocument) {\r\n const content = formatJsonDocument(dictionaryDocument);\r\n const jsonResult = await updateFile(target.dictionaryJson, content, target.rootDir, args.dryRun);\r\n const generatedChanged = args.skipGenerate\r\n ? []\r\n : await updateGeneratedFiles(\r\n target.dictionaryGenerated,\r\n renderDictionaryTs(dictionaryDocument, GENERATOR_LANG),\r\n target.rootDir,\r\n args.dryRun,\r\n );\r\n\r\n dictionarySummary = {\r\n objectTypeCount: Object.keys(dictionaryDocument.objectTypes ?? {}).length,\r\n attributeCount: Object.keys(dictionaryDocument.attributes ?? {}).length,\r\n jsonChanged: jsonResult.changed,\r\n generatedChanged,\r\n };\r\n }\r\n\r\n if (measurementsDocument) {\r\n const content = formatJsonDocument(measurementsDocument);\r\n const jsonResult = await updateFile(target.measurementsJson, content, target.rootDir, args.dryRun);\r\n const generatedChanged = args.skipGenerate\r\n ? []\r\n : await updateGeneratedFiles(\r\n target.measurementsGenerated,\r\n renderMeasurementsTs(measurementsDocument, GENERATOR_LANG),\r\n target.rootDir,\r\n args.dryRun,\r\n );\r\n\r\n measurementsSummary = {\r\n categoryCount: countMeasurementCategories(measurementsDocument),\r\n jsonChanged: jsonResult.changed,\r\n generatedChanged,\r\n };\r\n }\r\n\r\n printSummary({\r\n controllerUrl: args.controllerUrl,\r\n targetLabel: target.label,\r\n targetRoot: target.rootDir,\r\n dryRun: args.dryRun,\r\n skipGenerate: args.skipGenerate,\r\n status: args.status,\r\n dictionary: dictionarySummary,\r\n measurements: measurementsSummary,\r\n });\r\n}\r\n\r\nfunction parseArgs(argv: string[]): CliArgs {\r\n let controllerUrl = process.env.UNS_CONTROLLER_URL?.trim() ?? \"\";\r\n let token = process.env.UNS_CONTROLLER_TOKEN?.trim() ?? \"\";\r\n let status = normalizeStatus(process.env.UNS_SCHEMA_STATUS, DEFAULT_STATUS);\r\n let projectRoot = process.env.UNS_SCHEMA_PROJECT_ROOT?.trim() || undefined;\r\n let dryRun = false;\r\n let dictionaryOnly = false;\r\n let measurementsOnly = false;\r\n let skipGenerate = false;\r\n let help = false;\r\n\r\n for (let index = 0; index < argv.length; index += 1) {\r\n const arg = argv[index];\r\n\r\n if (arg === \"--help\" || arg === \"-h\") {\r\n help = true;\r\n continue;\r\n }\r\n\r\n if (arg === \"--dry-run\") {\r\n dryRun = true;\r\n continue;\r\n }\r\n\r\n if (arg === \"--dictionary-only\") {\r\n dictionaryOnly = true;\r\n continue;\r\n }\r\n\r\n if (arg === \"--measurements-only\") {\r\n measurementsOnly = true;\r\n continue;\r\n }\r\n\r\n if (arg === \"--skip-generate\") {\r\n skipGenerate = true;\r\n continue;\r\n }\r\n\r\n if (arg === \"--project-root\") {\r\n projectRoot = readRequiredValue(argv, ++index, \"--project-root\");\r\n continue;\r\n }\r\n\r\n if (arg.startsWith(\"--project-root=\")) {\r\n projectRoot = arg.slice(\"--project-root=\".length);\r\n continue;\r\n }\r\n\r\n if (arg === \"--controller-url\") {\r\n controllerUrl = readRequiredValue(argv, ++index, \"--controller-url\");\r\n continue;\r\n }\r\n\r\n if (arg.startsWith(\"--controller-url=\")) {\r\n controllerUrl = arg.slice(\"--controller-url=\".length);\r\n continue;\r\n }\r\n\r\n if (arg === \"--token\") {\r\n token = readRequiredValue(argv, ++index, \"--token\");\r\n continue;\r\n }\r\n\r\n if (arg.startsWith(\"--token=\")) {\r\n token = arg.slice(\"--token=\".length);\r\n continue;\r\n }\r\n\r\n if (arg === \"--status\") {\r\n status = normalizeStatus(readRequiredValue(argv, ++index, \"--status\"), DEFAULT_STATUS);\r\n continue;\r\n }\r\n\r\n if (arg.startsWith(\"--status=\")) {\r\n status = normalizeStatus(arg.slice(\"--status=\".length), DEFAULT_STATUS);\r\n continue;\r\n }\r\n\r\n throw new Error(`Unknown argument: ${arg}`);\r\n }\r\n\r\n if (!help) {\r\n if (dictionaryOnly && measurementsOnly) {\r\n throw new Error(\"Choose either --dictionary-only or --measurements-only, not both.\");\r\n }\r\n if (!controllerUrl) {\r\n throw new Error(\"Missing controller URL. Use --controller-url or set UNS_CONTROLLER_URL.\");\r\n }\r\n if (!token) {\r\n throw new Error(\"Missing controller token. Use --token or set UNS_CONTROLLER_TOKEN.\");\r\n }\r\n assertValidUrl(controllerUrl);\r\n }\r\n\r\n return {\r\n controllerUrl,\r\n token,\r\n status,\r\n projectRoot,\r\n dryRun,\r\n dictionaryOnly,\r\n measurementsOnly,\r\n skipGenerate,\r\n help,\r\n };\r\n}\r\n\r\nfunction readRequiredValue(argv: string[], index: number, flag: string): string {\r\n const value = argv[index];\r\n if (!value) {\r\n throw new Error(`Missing value for ${flag}.`);\r\n }\r\n return value;\r\n}\r\n\r\nfunction normalizeStatus(value: string | undefined, fallback: SchemaStatus): SchemaStatus {\r\n if (!value) return fallback;\r\n const normalized = value.trim().toLowerCase();\r\n if (STATUS_VALUES.includes(normalized as SchemaStatus)) {\r\n return normalized as SchemaStatus;\r\n }\r\n throw new Error(`Invalid --status value \"${value}\". Expected one of: ${STATUS_VALUES.join(\", \")}.`);\r\n}\r\n\r\nfunction assertValidUrl(value: string): void {\r\n try {\r\n new URL(value);\r\n } catch (error) {\r\n throw new Error(`Invalid controller URL \"${value}\". Expected an absolute URL such as http://localhost:3200.`);\r\n }\r\n}\r\n\r\nfunction printHelp(): void {\r\n console.log(`Usage: tsx packages/uns-core/src/tools/sync-uns-schema.ts [options]\r\n\r\nPull the canonical UNS schema export from a controller and refresh the local\r\nJSON files plus generated TypeScript artifacts.\r\n\r\nOptions:\r\n --controller-url <url> Controller base URL (env: UNS_CONTROLLER_URL)\r\n --token <token> Bearer token for REST export (env: UNS_CONTROLLER_TOKEN)\r\n --status <value> Dictionary status filter: ${STATUS_VALUES.join(\"|\")} (default: ${DEFAULT_STATUS}, env: UNS_SCHEMA_STATUS)\r\n --project-root <dir> Write into a generated microservice project root (env: UNS_SCHEMA_PROJECT_ROOT).\r\n When omitted, the tool auto-detects a generated project from the current working directory\r\n and otherwise updates the uns-kit repo templates.\r\n --dry-run Report file changes without writing anything\r\n --dictionary-only Sync only the UNS dictionary export\r\n --measurements-only Sync only the UNS measurements export\r\n --skip-generate Skip generated TypeScript refresh\r\n --help, -h Show this help\r\n`);\r\n}\r\n\r\nasync function findRepoRoot(): Promise<string> {\r\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\r\n let probeDir = currentDir;\r\n\r\n while (true) {\r\n const packageJsonPath = path.join(probeDir, \"package.json\");\r\n try {\r\n const raw = await readFile(packageJsonPath, \"utf8\");\r\n const pkg = JSON.parse(raw) as { name?: string };\r\n if (pkg.name === \"@uns-kit/core\") {\r\n return path.resolve(probeDir, \"../..\");\r\n }\r\n } catch (error) {\r\n // Ignore missing package.json and continue walking upward.\r\n }\r\n\r\n const parentDir = path.dirname(probeDir);\r\n if (parentDir === probeDir) {\r\n break;\r\n }\r\n probeDir = parentDir;\r\n }\r\n\r\n throw new Error(\"Could not locate the @uns-kit/core package directory from sync-uns-schema.ts.\");\r\n}\r\n\r\nasync function resolveSyncTarget(args: CliArgs): Promise<SyncTarget> {\r\n if (args.projectRoot) {\r\n return buildProjectTarget(path.resolve(process.cwd(), args.projectRoot));\r\n }\r\n\r\n const currentDir = process.cwd();\r\n if (await looksLikeGeneratedProjectRoot(currentDir)) {\r\n return buildProjectTarget(currentDir);\r\n }\r\n\r\n return buildRepoTarget(await findRepoRoot());\r\n}\r\n\r\nfunction buildRepoTarget(repoRoot: string): SyncTarget {\r\n return {\r\n rootDir: repoRoot,\r\n label: \"uns-kit repo templates\",\r\n dictionaryJson: path.join(repoRoot, \"packages/uns-cli/templates/uns-dictionary/uns-dictionary.json\"),\r\n measurementsJson: path.join(repoRoot, \"packages/uns-cli/templates/uns-measurements/uns-measurements.json\"),\r\n dictionaryGenerated: [\r\n path.join(repoRoot, \"packages/uns-core/src/uns/uns-dictionary.generated.ts\"),\r\n path.join(repoRoot, \"packages/uns-cli/templates/default/src/uns/uns-dictionary.generated.ts\"),\r\n ],\r\n measurementsGenerated: [\r\n path.join(repoRoot, \"packages/uns-core/src/uns/uns-measurements.generated.ts\"),\r\n path.join(repoRoot, \"packages/uns-cli/templates/default/src/uns/uns-measurements.generated.ts\"),\r\n ],\r\n };\r\n}\r\n\r\nfunction buildProjectTarget(projectRoot: string): SyncTarget {\r\n return {\r\n rootDir: projectRoot,\r\n label: \"generated microservice project\",\r\n dictionaryJson: path.join(projectRoot, \"uns-dictionary.json\"),\r\n measurementsJson: path.join(projectRoot, \"uns-measurements.json\"),\r\n dictionaryGenerated: [path.join(projectRoot, \"src/uns/uns-dictionary.generated.ts\")],\r\n measurementsGenerated: [path.join(projectRoot, \"src/uns/uns-measurements.generated.ts\")],\r\n };\r\n}\r\n\r\nasync function looksLikeGeneratedProjectRoot(rootDir: string): Promise<boolean> {\r\n const [hasPackageJson, hasConfigJson, hasUnsDir] = await Promise.all([\r\n pathExists(path.join(rootDir, \"package.json\")),\r\n pathExists(path.join(rootDir, \"config.json\")),\r\n pathExists(path.join(rootDir, \"src/uns\")),\r\n ]);\r\n\r\n return hasPackageJson && hasConfigJson && hasUnsDir;\r\n}\r\n\r\nasync function pathExists(targetPath: string): Promise<boolean> {\r\n try {\r\n await access(targetPath);\r\n return true;\r\n } catch (error) {\r\n return false;\r\n }\r\n}\r\n\r\nfunction buildControllerUrl(controllerUrl: string, relativePath: string): URL {\r\n const base = new URL(controllerUrl);\r\n if (!base.pathname.endsWith(\"/\")) {\r\n base.pathname = `${base.pathname}/`;\r\n }\r\n return new URL(relativePath, base);\r\n}\r\n\r\nasync function fetchDictionaryDocument(\r\n controllerUrl: string,\r\n token: string,\r\n status: SchemaStatus,\r\n): Promise<DictionaryDocument> {\r\n const url = buildControllerUrl(controllerUrl, `api/schema/export/uns-dictionary?status=${encodeURIComponent(status)}`);\r\n const document = await fetchJson(url, token, \"UNS dictionary\");\r\n if (!document || typeof document !== \"object\" || Array.isArray(document)) {\r\n throw new Error(`Controller returned an invalid UNS dictionary document from ${url.toString()}.`);\r\n }\r\n return document as DictionaryDocument;\r\n}\r\n\r\nasync function fetchMeasurementsDocument(controllerUrl: string, token: string): Promise<MeasurementsDocument> {\r\n const url = buildControllerUrl(controllerUrl, \"api/schema/export/uns-measurements\");\r\n const document = await fetchJson(url, token, \"UNS measurements\");\r\n if (!document || typeof document !== \"object\" || Array.isArray(document)) {\r\n throw new Error(`Controller returned an invalid UNS measurements document from ${url.toString()}.`);\r\n }\r\n return document as MeasurementsDocument;\r\n}\r\n\r\nasync function fetchJson(url: URL, token: string, label: string): Promise<unknown> {\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n headers: {\r\n Accept: \"application/json\",\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n } catch (error) {\r\n throw new Error(`Network failure while fetching ${label} export from ${url.toString()}: ${(error as Error).message}`);\r\n }\r\n\r\n const text = await response.text();\r\n\r\n if (!response.ok) {\r\n throw new Error(formatHttpError(response, url, label, text));\r\n }\r\n\r\n try {\r\n return JSON.parse(text);\r\n } catch (error) {\r\n throw new Error(`Controller returned invalid JSON for the ${label} export from ${url.toString()}.`);\r\n }\r\n}\r\n\r\nfunction formatHttpError(response: Response, url: URL, label: string, body: string): string {\r\n if (response.status === 401) {\r\n return `Unauthorized (401) while fetching ${label} export from ${url.toString()}. Check --token or UNS_CONTROLLER_TOKEN.`;\r\n }\r\n\r\n if (response.status === 403) {\r\n return `Forbidden (403) while fetching ${label} export from ${url.toString()}. The token must have admin access.`;\r\n }\r\n\r\n const detail = extractErrorDetail(body);\r\n return `Failed to fetch ${label} export from ${url.toString()}: HTTP ${response.status}${detail ? ` - ${detail}` : \"\"}`;\r\n}\r\n\r\nfunction extractErrorDetail(body: string): string {\r\n const trimmed = body.trim();\r\n if (!trimmed) return \"\";\r\n\r\n try {\r\n const parsed = JSON.parse(trimmed) as { error?: unknown; message?: unknown };\r\n if (typeof parsed.error === \"string\" && parsed.error.trim().length > 0) {\r\n return parsed.error.trim();\r\n }\r\n if (typeof parsed.message === \"string\" && parsed.message.trim().length > 0) {\r\n return parsed.message.trim();\r\n }\r\n } catch (error) {\r\n // Fall back to plain text handling below.\r\n }\r\n\r\n return trimmed.replace(/\\s+/g, \" \").slice(0, 200);\r\n}\r\n\r\nfunction formatJsonDocument(document: unknown): string {\r\n return `${JSON.stringify(document, null, 2)}\\n`;\r\n}\r\n\r\nasync function updateGeneratedFiles(\r\n filePaths: string[],\r\n content: string,\r\n repoRoot: string,\r\n dryRun: boolean,\r\n): Promise<FileChangeResult[]> {\r\n return Promise.all(filePaths.map((filePath) => updateFile(filePath, content, repoRoot, dryRun)));\r\n}\r\n\r\nasync function updateFile(\r\n filePath: string,\r\n content: string,\r\n repoRoot: string,\r\n dryRun: boolean,\r\n): Promise<FileChangeResult> {\r\n const current = await readTextFileIfExists(filePath);\r\n const changed = current !== content;\r\n const relativePath = path.relative(repoRoot, filePath);\r\n\r\n if (dryRun) {\r\n console.log(`${changed ? \"Would update\" : \"No change\"} ${relativePath}`);\r\n return { changed, relativePath };\r\n }\r\n\r\n if (!changed) {\r\n console.log(`Unchanged ${relativePath}`);\r\n return { changed: false, relativePath };\r\n }\r\n\r\n await writeTextFileIfChanged(filePath, content);\r\n console.log(`Updated ${relativePath}`);\r\n return { changed: true, relativePath };\r\n}\r\n\r\nfunction countMeasurementCategories(document: MeasurementsDocument): number {\r\n return Object.entries(document).filter(([key, value]) => {\r\n if (key === \"schemaVersion\") return false;\r\n return !!value && typeof value === \"object\" && !Array.isArray(value);\r\n }).length;\r\n}\r\n\r\nfunction printSummary(summary: {\r\n controllerUrl: string;\r\n targetLabel: string;\r\n targetRoot: string;\r\n dryRun: boolean;\r\n skipGenerate: boolean;\r\n status: SchemaStatus;\r\n dictionary?: DictionarySummary;\r\n measurements?: MeasurementsSummary;\r\n}): void {\r\n console.log(\"\");\r\n console.log(summary.dryRun ? \"Dry-run summary\" : \"Sync summary\");\r\n console.log(` Controller: ${summary.controllerUrl}`);\r\n console.log(` Target: ${summary.targetLabel}`);\r\n console.log(` Root: ${summary.targetRoot}`);\r\n console.log(` Dictionary status: ${summary.status}`);\r\n\r\n if (summary.dictionary) {\r\n console.log(\r\n ` Dictionary: ${summary.dictionary.objectTypeCount} object types, ${summary.dictionary.attributeCount} attributes, JSON ${summary.dictionary.jsonChanged ? \"changed\" : \"unchanged\"}`,\r\n );\r\n if (summary.skipGenerate) {\r\n console.log(\" Dictionary TS: skipped\");\r\n } else {\r\n console.log(` Dictionary TS: ${renderGeneratedSummary(summary.dictionary.generatedChanged)}`);\r\n }\r\n }\r\n\r\n if (summary.measurements) {\r\n console.log(\r\n ` Measurements: ${summary.measurements.categoryCount} categories, JSON ${summary.measurements.jsonChanged ? \"changed\" : \"unchanged\"}`,\r\n );\r\n if (summary.skipGenerate) {\r\n console.log(\" Measurements TS: skipped\");\r\n } else {\r\n console.log(` Measurements TS: ${renderGeneratedSummary(summary.measurements.generatedChanged)}`);\r\n }\r\n }\r\n}\r\n\r\nfunction renderGeneratedSummary(results: FileChangeResult[]): string {\r\n if (!results.length) return \"none\";\r\n const changedCount = results.filter((result) => result.changed).length;\r\n return `${changedCount}/${results.length} file${results.length === 1 ? \"\" : \"s\"} changed`;\r\n}\r\n\r\nif (isDirectExecution) {\r\n main().catch((error) => {\r\n console.error(\"Failed to sync UNS schema:\", error instanceof Error ? error.message : error);\r\n process.exitCode = 1;\r\n });\r\n}\r\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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handover-manager-event-emitter.js","sourceRoot":"","sources":["../../src/uns/handover-manager-event-emitter.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,2BAA2B;IAC9B,SAAS,GAEb,EAAE,CAAC;IAEP,EAAE,CACA,SAAY,EACZ,QAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG,CACD,SAAY,EACZ,QAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,MAAM,CAC3D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CACtB,CAAC;IACJ,CAAC;IAED,IAAI,CAAyB,SAAY,EAAE,KAAgB;QACzD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;CACF","sourcesContent":["export class HandoverManagerEventEmitter<Events extends Record<string, any>> {\
|
|
1
|
+
{"version":3,"file":"handover-manager-event-emitter.js","sourceRoot":"","sources":["../../src/uns/handover-manager-event-emitter.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,2BAA2B;IAC9B,SAAS,GAEb,EAAE,CAAC;IAEP,EAAE,CACA,SAAY,EACZ,QAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG,CACD,SAAY,EACZ,QAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,MAAM,CAC3D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CACtB,CAAC;IACJ,CAAC;IAED,IAAI,CAAyB,SAAY,EAAE,KAAgB;QACzD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;CACF","sourcesContent":["export class HandoverManagerEventEmitter<Events extends Record<string, any>> {\n private listeners: {\n [K in keyof Events]?: Array<(event: Events[K]) => void>;\n } = {};\n\n on<K extends keyof Events>(\n eventName: K,\n listener: (event: Events[K]) => void,\n ): void {\n if (!this.listeners[eventName]) {\n this.listeners[eventName] = [];\n }\n this.listeners[eventName]!.push(listener);\n }\n\n off<K extends keyof Events>(\n eventName: K,\n listener: (event: Events[K]) => void,\n ): void {\n if (!this.listeners[eventName]) return;\n this.listeners[eventName] = this.listeners[eventName]!.filter(\n (l) => l !== listener,\n );\n }\n\n emit<K extends keyof Events>(eventName: K, event: Events[K]): void {\n if (!this.listeners[eventName]) return;\n this.listeners[eventName]!.forEach((listener) => listener(event));\n }\n}"]}
|