@uns-kit/core 2.0.70 → 2.0.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +304 -302
  3. package/dist/base-path.js.map +1 -1
  4. package/dist/config/app-config.js.map +1 -1
  5. package/dist/config/project.config.extension.js.map +1 -1
  6. package/dist/config-file.js.map +1 -1
  7. package/dist/examples/datahub-client.js.map +1 -1
  8. package/dist/graphql/schema.js.map +1 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/logger.js.map +1 -1
  11. package/dist/tools/auth/auth-client.js.map +1 -1
  12. package/dist/tools/auth/index.js.map +1 -1
  13. package/dist/tools/auth/secure-store.js.map +1 -1
  14. package/dist/tools/base-path.js.map +1 -1
  15. package/dist/tools/datahub/datahub-client.js.map +1 -1
  16. package/dist/tools/file-utils.js.map +1 -1
  17. package/dist/tools/generate-config-schema.js.map +1 -1
  18. package/dist/tools/generate-uns-dictionary.js +7 -7
  19. package/dist/tools/generate-uns-dictionary.js.map +1 -1
  20. package/dist/tools/generate-uns-measurements.js +7 -7
  21. package/dist/tools/generate-uns-measurements.js.map +1 -1
  22. package/dist/tools/generate-uns-reference.js +9 -9
  23. package/dist/tools/generate-uns-reference.js.map +1 -1
  24. package/dist/tools/pull-request.js.map +1 -1
  25. package/dist/tools/refresh-uns.js.map +1 -1
  26. package/dist/tools/schema.js.map +1 -1
  27. package/dist/tools/sync-uns-metadata.js +22 -22
  28. package/dist/tools/sync-uns-metadata.js.map +1 -1
  29. package/dist/tools/sync-uns-schema.js +17 -17
  30. package/dist/tools/sync-uns-schema.js.map +1 -1
  31. package/dist/uns/handover-manager-event-emitter.js.map +1 -1
  32. package/dist/uns/handover-manager.js.map +1 -1
  33. package/dist/uns/process-config.js.map +1 -1
  34. package/dist/uns/service-metadata.js.map +1 -1
  35. package/dist/uns/status-monitor.js.map +1 -1
  36. package/dist/uns/uns-asset.js.map +1 -1
  37. package/dist/uns/uns-attributes.js.map +1 -1
  38. package/dist/uns/uns-dictionary-registry.js.map +1 -1
  39. package/dist/uns/uns-dictionary.generated.js.map +1 -1
  40. package/dist/uns/uns-event-emitter.js.map +1 -1
  41. package/dist/uns/uns-interfaces.js.map +1 -1
  42. package/dist/uns/uns-measurements.generated.js.map +1 -1
  43. package/dist/uns/uns-measurements.js.map +1 -1
  44. package/dist/uns/uns-object.js.map +1 -1
  45. package/dist/uns/uns-packet.js.map +1 -1
  46. package/dist/uns/uns-path.js.map +1 -1
  47. package/dist/uns/uns-proxy-process.d.ts +2 -0
  48. package/dist/uns/uns-proxy-process.d.ts.map +1 -1
  49. package/dist/uns/uns-proxy-process.js +34 -9
  50. package/dist/uns/uns-proxy-process.js.map +1 -1
  51. package/dist/uns/uns-proxy.js.map +1 -1
  52. package/dist/uns/uns-tags.js.map +1 -1
  53. package/dist/uns/uns-topic-matcher.js.map +1 -1
  54. package/dist/uns/uns-topics.js.map +1 -1
  55. package/dist/uns-config/config-schema.js.map +1 -1
  56. package/dist/uns-config/host-placeholders.js.map +1 -1
  57. package/dist/uns-config/schema-tolls.js.map +1 -1
  58. package/dist/uns-config/schema-tools.js.map +1 -1
  59. package/dist/uns-config/secret-placeholders.js.map +1 -1
  60. package/dist/uns-config/secret-resolver.js.map +1 -1
  61. package/dist/uns-config/uns-core-schema.js.map +1 -1
  62. package/dist/uns-grpc/uns-gateway-cli.js.map +1 -1
  63. package/dist/uns-grpc/uns-gateway-server.d.ts.map +1 -1
  64. package/dist/uns-grpc/uns-gateway-server.js +11 -2
  65. package/dist/uns-grpc/uns-gateway-server.js.map +1 -1
  66. package/dist/uns-grpc/uns-gateway.proto +107 -107
  67. package/dist/uns-mqtt/mqtt-interfaces.js.map +1 -1
  68. package/dist/uns-mqtt/mqtt-proxy.d.ts +1 -1
  69. package/dist/uns-mqtt/mqtt-proxy.d.ts.map +1 -1
  70. package/dist/uns-mqtt/mqtt-proxy.js +33 -34
  71. package/dist/uns-mqtt/mqtt-proxy.js.map +1 -1
  72. package/dist/uns-mqtt/mqtt-topic-builder.js.map +1 -1
  73. package/dist/uns-mqtt/mqtt-worker-init.js.map +1 -1
  74. package/dist/uns-mqtt/mqtt-worker.js.map +1 -1
  75. package/dist/uns-mqtt/throttled-queue.d.ts.map +1 -1
  76. package/dist/uns-mqtt/throttled-queue.js +7 -2
  77. package/dist/uns-mqtt/throttled-queue.js.map +1 -1
  78. package/dist/uns-mqtt/uns-mqtt-proxy.d.ts +5 -0
  79. package/dist/uns-mqtt/uns-mqtt-proxy.d.ts.map +1 -1
  80. package/dist/uns-mqtt/uns-mqtt-proxy.js +78 -34
  81. package/dist/uns-mqtt/uns-mqtt-proxy.js.map +1 -1
  82. package/dist/uns-mqtt/ws-proxy.js.map +1 -1
  83. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"base-path.js","sourceRoot":"","sources":["../src/base-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEhE,MAAM,uBAAuB,GAAG,oBAAsF,CAAC;AAEvH,MAAM,YAAY,GAAG,CAAC,KAAa,EAAsB,EAAE;IACzD,IAAI,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAE7B,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,SAAkB,EAAsB,EAAE;IAClE,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAErC,IAAI,OAAO,uBAAuB,KAAK,UAAU,EAAE,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;QACrD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;AAC9C,CAAC,CAAC;AAQF,MAAM,UAAU,eAAe,CAAC,UAAkC,EAAE;IAClE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAErG,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,WAAW,IAAI,SAAS,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;IAE3E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC","sourcesContent":["import { fileURLToPath } from \"url\";\r\nimport { dirname, resolve, join } from \"path\";\r\nimport { existsSync } from \"fs\";\r\nimport { packageDirectorySync } from \"pkg-dir\";\r\n\r\nconst moduleDirectory = dirname(fileURLToPath(import.meta.url));\r\n\r\nconst packageDirectorySyncAny = packageDirectorySync as unknown as ((arg?: unknown) => string | undefined) | undefined;\r\n\r\nconst fallbackFind = (start: string): string | undefined => {\r\n let current = resolve(start);\r\n\r\n while (true) {\r\n if (existsSync(join(current, \"package.json\"))) {\r\n return current;\r\n }\r\n\r\n const parent = dirname(current);\r\n if (parent === current) {\r\n return undefined;\r\n }\r\n\r\n current = parent;\r\n }\r\n};\r\n\r\nconst resolveCandidate = (candidate?: string): string | undefined => {\r\n if (!candidate) return undefined;\r\n\r\n const directory = resolve(candidate);\r\n\r\n if (typeof packageDirectorySyncAny === \"function\") {\r\n try {\r\n const result = packageDirectorySyncAny({ cwd: directory });\r\n if (typeof result === \"string\") {\r\n return result;\r\n }\r\n } catch {\r\n // ignore – fall back to alternate invocation style\r\n }\r\n\r\n try {\r\n const result = packageDirectorySyncAny(directory);\r\n if (typeof result === \"string\") {\r\n return result;\r\n }\r\n } catch {\r\n // ignore – fall back to manual search\r\n }\r\n }\r\n\r\n return fallbackFind(directory) ?? directory;\r\n};\r\n\r\nexport interface ResolveBasePathOptions {\r\n start?: string;\r\n envBasePath?: string | null;\r\n cwd?: string;\r\n}\r\n\r\nexport function resolveBasePath(options: ResolveBasePathOptions = {}): string {\r\n const { start, envBasePath = process.env.UNS_BASE_PATH ?? undefined, cwd = process.cwd() } = options;\r\n\r\n const candidates = [start, envBasePath ?? undefined, cwd, moduleDirectory];\r\n\r\n for (const candidate of candidates) {\r\n const resolved = resolveCandidate(candidate);\r\n if (resolved) {\r\n return resolved;\r\n }\r\n }\r\n\r\n return resolve(moduleDirectory, \"..\");\r\n}\r\n\r\nexport const basePath = resolveBasePath();\r\n"]}
1
+ {"version":3,"file":"base-path.js","sourceRoot":"","sources":["../src/base-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEhE,MAAM,uBAAuB,GAAG,oBAAsF,CAAC;AAEvH,MAAM,YAAY,GAAG,CAAC,KAAa,EAAsB,EAAE;IACzD,IAAI,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAE7B,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,SAAkB,EAAsB,EAAE;IAClE,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAErC,IAAI,OAAO,uBAAuB,KAAK,UAAU,EAAE,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;QACrD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;AAC9C,CAAC,CAAC;AAQF,MAAM,UAAU,eAAe,CAAC,UAAkC,EAAE;IAClE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAErG,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,WAAW,IAAI,SAAS,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;IAE3E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC","sourcesContent":["import { fileURLToPath } from \"url\";\nimport { dirname, resolve, join } from \"path\";\nimport { existsSync } from \"fs\";\nimport { packageDirectorySync } from \"pkg-dir\";\n\nconst moduleDirectory = dirname(fileURLToPath(import.meta.url));\n\nconst packageDirectorySyncAny = packageDirectorySync as unknown as ((arg?: unknown) => string | undefined) | undefined;\n\nconst fallbackFind = (start: string): string | undefined => {\n let current = resolve(start);\n\n while (true) {\n if (existsSync(join(current, \"package.json\"))) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return undefined;\n }\n\n current = parent;\n }\n};\n\nconst resolveCandidate = (candidate?: string): string | undefined => {\n if (!candidate) return undefined;\n\n const directory = resolve(candidate);\n\n if (typeof packageDirectorySyncAny === \"function\") {\n try {\n const result = packageDirectorySyncAny({ cwd: directory });\n if (typeof result === \"string\") {\n return result;\n }\n } catch {\n // ignore – fall back to alternate invocation style\n }\n\n try {\n const result = packageDirectorySyncAny(directory);\n if (typeof result === \"string\") {\n return result;\n }\n } catch {\n // ignore – fall back to manual search\n }\n }\n\n return fallbackFind(directory) ?? directory;\n};\n\nexport interface ResolveBasePathOptions {\n start?: string;\n envBasePath?: string | null;\n cwd?: string;\n}\n\nexport function resolveBasePath(options: ResolveBasePathOptions = {}): string {\n const { start, envBasePath = process.env.UNS_BASE_PATH ?? undefined, cwd = process.cwd() } = options;\n\n const candidates = [start, envBasePath ?? undefined, cwd, moduleDirectory];\n\n for (const candidate of candidates) {\n const resolved = resolveCandidate(candidate);\n if (resolved) {\n return resolved;\n }\n }\n\n return resolve(moduleDirectory, \"..\");\n}\n\nexport const basePath = resolveBasePath();\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"app-config.js","sourceRoot":"","sources":["../../src/config/app-config.ts"],"names":[],"mappings":"","sourcesContent":["/* Auto-generated. Do not edit by hand. */\r\nexport interface ProjectAppConfig {\r\n uns: {\r\n graphql: string;\r\n rest: string;\r\n /** Bearer token used for service-to-service access to the UNS instance. */\r\n token?: string | undefined;\r\n /** Email used when authenticating to graphql endpoint of the UNS instance. */\r\n email?: string | undefined;\r\n /** Password or secret value paired with the UNS email. */\r\n password?: string | undefined;\r\n instanceMode?: \"wait\" | \"force\" | \"handover\";\r\n /** Process name used in MQTT topics and logs. */\r\n processName: string;\r\n handover?: boolean;\r\n /** Optional PM2/controller supervisor guard settings for this RTT instance. */\r\n supervisor?: {\r\n /** Enable controller/PM2 supervisor handling for this RTT instance. */\r\n enabled?: boolean;\r\n /** Let PM2 restart the process when it exits unexpectedly. */\r\n restartOnExit?: boolean;\r\n /** Optional PM2 memory restart limit in megabytes. */\r\n maxMemoryMb?: number | undefined;\r\n /** Let the controller auto-start this instance when required system-service runtime signals are absent. */\r\n restartOnUnhealthy?: boolean;\r\n /** How long runtime signals must stay unhealthy before the controller supervisor can act. */\r\n unhealthyAfterMs?: number;\r\n /** Minimum time between controller supervisor restart attempts for this instance. */\r\n restartCooldownMs?: number;\r\n } | undefined;\r\n jwksWellKnownUrl?: string | undefined;\r\n kidWellKnownUrl?: string | undefined;\r\n env?: \"dev\" | \"staging\" | \"test\" | \"prod\";\r\n };\r\n logging?: {\r\n adapter?: string;\r\n host: string;\r\n port?: number;\r\n level?: \"error\" | \"warn\" | \"info\" | \"http\" | \"verbose\" | \"debug\" | \"silly\";\r\n } | undefined;\r\n input?: {\r\n host?: string | undefined;\r\n hosts?: string[] | undefined;\r\n servers?: {\r\n host: string;\r\n port?: number | undefined;\r\n protocol?: (\"mqtt\" | \"mqtts\" | \"ws\" | \"wss\" | \"tcp\" | \"ssl\") | undefined;\r\n }[] | undefined;\r\n port?: number | undefined;\r\n protocol?: (\"mqtt\" | \"mqtts\" | \"ws\" | \"wss\" | \"tcp\" | \"ssl\") | undefined;\r\n username?: string | undefined;\r\n password?: string | undefined;\r\n clientId?: string | undefined;\r\n clean?: boolean | undefined;\r\n keepalive?: number | undefined;\r\n connectTimeout?: number | undefined;\r\n reconnectPeriod?: number | undefined;\r\n reconnectOnConnackError?: boolean | undefined;\r\n resubscribe?: boolean | undefined;\r\n queueQoSZero?: boolean | undefined;\r\n rejectUnauthorized?: boolean | undefined;\r\n properties?: {\r\n sessionExpiryInterval?: number | undefined;\r\n receiveMaximum?: number | undefined;\r\n maximumPacketSize?: number | undefined;\r\n topicAliasMaximum?: number | undefined;\r\n requestResponseInformation?: boolean | undefined;\r\n requestProblemInformation?: boolean | undefined;\r\n userProperties?: {\r\n [x: string]: string;\r\n } | undefined;\r\n } | undefined;\r\n ca?: string | undefined;\r\n cert?: string | undefined;\r\n key?: string | undefined;\r\n servername?: string | undefined;\r\n } | undefined;\r\n output?: {\r\n host?: string | undefined;\r\n hosts?: string[] | undefined;\r\n servers?: {\r\n host: string;\r\n port?: number | undefined;\r\n protocol?: (\"mqtt\" | \"mqtts\" | \"ws\" | \"wss\" | \"tcp\" | \"ssl\") | undefined;\r\n }[] | undefined;\r\n port?: number | undefined;\r\n protocol?: (\"mqtt\" | \"mqtts\" | \"ws\" | \"wss\" | \"tcp\" | \"ssl\") | undefined;\r\n username?: string | undefined;\r\n password?: string | undefined;\r\n clientId?: string | undefined;\r\n clean?: boolean | undefined;\r\n keepalive?: number | undefined;\r\n connectTimeout?: number | undefined;\r\n reconnectPeriod?: number | undefined;\r\n reconnectOnConnackError?: boolean | undefined;\r\n resubscribe?: boolean | undefined;\r\n queueQoSZero?: boolean | undefined;\r\n rejectUnauthorized?: boolean | undefined;\r\n properties?: {\r\n sessionExpiryInterval?: number | undefined;\r\n receiveMaximum?: number | undefined;\r\n maximumPacketSize?: number | undefined;\r\n topicAliasMaximum?: number | undefined;\r\n requestResponseInformation?: boolean | undefined;\r\n requestProblemInformation?: boolean | undefined;\r\n userProperties?: {\r\n [x: string]: string;\r\n } | undefined;\r\n } | undefined;\r\n ca?: string | undefined;\r\n cert?: string | undefined;\r\n key?: string | undefined;\r\n servername?: string | undefined;\r\n } | undefined;\r\n infra: {\r\n host?: string | undefined;\r\n hosts?: string[] | undefined;\r\n servers?: {\r\n host: string;\r\n port?: number | undefined;\r\n protocol?: (\"mqtt\" | \"mqtts\" | \"ws\" | \"wss\" | \"tcp\" | \"ssl\") | undefined;\r\n }[] | undefined;\r\n port?: number | undefined;\r\n protocol?: (\"mqtt\" | \"mqtts\" | \"ws\" | \"wss\" | \"tcp\" | \"ssl\") | undefined;\r\n username?: string | undefined;\r\n password?: string | undefined;\r\n clientId?: string | undefined;\r\n clean?: boolean | undefined;\r\n keepalive?: number | undefined;\r\n connectTimeout?: number | undefined;\r\n reconnectPeriod?: number | undefined;\r\n reconnectOnConnackError?: boolean | undefined;\r\n resubscribe?: boolean | undefined;\r\n queueQoSZero?: boolean | undefined;\r\n rejectUnauthorized?: boolean | undefined;\r\n properties?: {\r\n sessionExpiryInterval?: number | undefined;\r\n receiveMaximum?: number | undefined;\r\n maximumPacketSize?: number | undefined;\r\n topicAliasMaximum?: number | undefined;\r\n requestResponseInformation?: boolean | undefined;\r\n requestProblemInformation?: boolean | undefined;\r\n userProperties?: {\r\n [x: string]: string;\r\n } | undefined;\r\n } | undefined;\r\n ca?: string | undefined;\r\n cert?: string | undefined;\r\n key?: string | undefined;\r\n servername?: string | undefined;\r\n };\r\n devops?: {\r\n provider?: \"azure-devops\";\r\n organization: string;\r\n project?: string | undefined;\r\n } | undefined;\r\n}\r\n\r\nexport interface AppConfig extends ProjectAppConfig {}\r\n"]}
1
+ {"version":3,"file":"app-config.js","sourceRoot":"","sources":["../../src/config/app-config.ts"],"names":[],"mappings":"","sourcesContent":["/* Auto-generated. Do not edit by hand. */\nexport interface ProjectAppConfig {\n uns: {\n graphql: string;\n rest: string;\n /** Bearer token used for service-to-service access to the UNS instance. */\n token?: string | undefined;\n /** Email used when authenticating to graphql endpoint of the UNS instance. */\n email?: string | undefined;\n /** Password or secret value paired with the UNS email. */\n password?: string | undefined;\n instanceMode?: \"wait\" | \"force\" | \"handover\";\n /** Process name used in MQTT topics and logs. */\n processName: string;\n handover?: boolean;\n /** Optional PM2/controller supervisor guard settings for this RTT instance. */\n supervisor?: {\n /** Enable controller/PM2 supervisor handling for this RTT instance. */\n enabled?: boolean;\n /** Let PM2 restart the process when it exits unexpectedly. */\n restartOnExit?: boolean;\n /** Optional PM2 memory restart limit in megabytes. */\n maxMemoryMb?: number | undefined;\n /** Let the controller auto-start this instance when required system-service runtime signals are absent. */\n restartOnUnhealthy?: boolean;\n /** How long runtime signals must stay unhealthy before the controller supervisor can act. */\n unhealthyAfterMs?: number;\n /** Minimum time between controller supervisor restart attempts for this instance. */\n restartCooldownMs?: number;\n } | undefined;\n jwksWellKnownUrl?: string | undefined;\n kidWellKnownUrl?: string | undefined;\n env?: \"dev\" | \"staging\" | \"test\" | \"prod\";\n };\n logging?: {\n adapter?: string;\n host: string;\n port?: number;\n level?: \"error\" | \"warn\" | \"info\" | \"http\" | \"verbose\" | \"debug\" | \"silly\";\n } | undefined;\n input?: {\n host?: string | undefined;\n hosts?: string[] | undefined;\n servers?: {\n host: string;\n port?: number | undefined;\n protocol?: (\"mqtt\" | \"mqtts\" | \"ws\" | \"wss\" | \"tcp\" | \"ssl\") | undefined;\n }[] | undefined;\n port?: number | undefined;\n protocol?: (\"mqtt\" | \"mqtts\" | \"ws\" | \"wss\" | \"tcp\" | \"ssl\") | undefined;\n username?: string | undefined;\n password?: string | undefined;\n clientId?: string | undefined;\n clean?: boolean | undefined;\n keepalive?: number | undefined;\n connectTimeout?: number | undefined;\n reconnectPeriod?: number | undefined;\n reconnectOnConnackError?: boolean | undefined;\n resubscribe?: boolean | undefined;\n queueQoSZero?: boolean | undefined;\n rejectUnauthorized?: boolean | undefined;\n properties?: {\n sessionExpiryInterval?: number | undefined;\n receiveMaximum?: number | undefined;\n maximumPacketSize?: number | undefined;\n topicAliasMaximum?: number | undefined;\n requestResponseInformation?: boolean | undefined;\n requestProblemInformation?: boolean | undefined;\n userProperties?: {\n [x: string]: string;\n } | undefined;\n } | undefined;\n ca?: string | undefined;\n cert?: string | undefined;\n key?: string | undefined;\n servername?: string | undefined;\n } | undefined;\n output?: {\n host?: string | undefined;\n hosts?: string[] | undefined;\n servers?: {\n host: string;\n port?: number | undefined;\n protocol?: (\"mqtt\" | \"mqtts\" | \"ws\" | \"wss\" | \"tcp\" | \"ssl\") | undefined;\n }[] | undefined;\n port?: number | undefined;\n protocol?: (\"mqtt\" | \"mqtts\" | \"ws\" | \"wss\" | \"tcp\" | \"ssl\") | undefined;\n username?: string | undefined;\n password?: string | undefined;\n clientId?: string | undefined;\n clean?: boolean | undefined;\n keepalive?: number | undefined;\n connectTimeout?: number | undefined;\n reconnectPeriod?: number | undefined;\n reconnectOnConnackError?: boolean | undefined;\n resubscribe?: boolean | undefined;\n queueQoSZero?: boolean | undefined;\n rejectUnauthorized?: boolean | undefined;\n properties?: {\n sessionExpiryInterval?: number | undefined;\n receiveMaximum?: number | undefined;\n maximumPacketSize?: number | undefined;\n topicAliasMaximum?: number | undefined;\n requestResponseInformation?: boolean | undefined;\n requestProblemInformation?: boolean | undefined;\n userProperties?: {\n [x: string]: string;\n } | undefined;\n } | undefined;\n ca?: string | undefined;\n cert?: string | undefined;\n key?: string | undefined;\n servername?: string | undefined;\n } | undefined;\n infra: {\n host?: string | undefined;\n hosts?: string[] | undefined;\n servers?: {\n host: string;\n port?: number | undefined;\n protocol?: (\"mqtt\" | \"mqtts\" | \"ws\" | \"wss\" | \"tcp\" | \"ssl\") | undefined;\n }[] | undefined;\n port?: number | undefined;\n protocol?: (\"mqtt\" | \"mqtts\" | \"ws\" | \"wss\" | \"tcp\" | \"ssl\") | undefined;\n username?: string | undefined;\n password?: string | undefined;\n clientId?: string | undefined;\n clean?: boolean | undefined;\n keepalive?: number | undefined;\n connectTimeout?: number | undefined;\n reconnectPeriod?: number | undefined;\n reconnectOnConnackError?: boolean | undefined;\n resubscribe?: boolean | undefined;\n queueQoSZero?: boolean | undefined;\n rejectUnauthorized?: boolean | undefined;\n properties?: {\n sessionExpiryInterval?: number | undefined;\n receiveMaximum?: number | undefined;\n maximumPacketSize?: number | undefined;\n topicAliasMaximum?: number | undefined;\n requestResponseInformation?: boolean | undefined;\n requestProblemInformation?: boolean | undefined;\n userProperties?: {\n [x: string]: string;\n } | undefined;\n } | undefined;\n ca?: string | undefined;\n cert?: string | undefined;\n key?: string | undefined;\n servername?: string | undefined;\n };\n devops?: {\n provider?: \"azure-devops\";\n organization: string;\n project?: string | undefined;\n } | undefined;\n}\n\nexport interface AppConfig extends ProjectAppConfig {}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"project.config.extension.js","sourceRoot":"","sources":["../../src/config/project.config.extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,kCAAkC;AAClC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC","sourcesContent":["import { z } from \"zod\";\r\n\r\n// Exported constant in PascalCase\r\nexport const projectExtrasSchema = z.object({});\r\n\r\nexport type ProjectExtras = z.infer<typeof projectExtrasSchema>;\r\n"]}
1
+ {"version":3,"file":"project.config.extension.js","sourceRoot":"","sources":["../../src/config/project.config.extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,kCAAkC;AAClC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC","sourcesContent":["import { z } from \"zod\";\n\n// Exported constant in PascalCase\nexport const projectExtrasSchema = z.object({});\n\nexport type ProjectExtras = z.infer<typeof projectExtrasSchema>;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"config-file.js","sourceRoot":"","sources":["../src/config-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GAGrB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,UAAU,GAAG,CAAC,OAA+B,EAAW,EAAE,CAC9D,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;AAEzE,MAAM,OAAO,UAAU;IACb,MAAM,CAAC,QAAQ,CAAa;IAC5B,MAAM,CAAC,OAAO,CAAU;IACxB,MAAM,CAAC,aAAa,CAAqB;IAEjD,MAAM,CAAC,aAAa,CAAC,UAAmB;QACtC,MAAM,CAAC,GAAG,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC,CAAC,wBAAwB;YACtE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YACjB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,GAAG;QACR,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,UAAU,CACrB,UAAmB,EACnB,OAA+B;QAE/B,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAE3C,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAC7B,OAA+B;QAE/B,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,UAAU;QACf,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,yBAAyB,EAAE,CAAC;IAC9B,CAAC;CACF","sourcesContent":["import fs from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport type { AppConfig } from \"./config/app-config.js\";\r\nimport {\r\n clearSecretResolverCaches,\r\n resolveConfigSecrets,\r\n type ResolvedAppConfig,\r\n type SecretResolverOptions,\r\n} from \"./uns-config/secret-resolver.js\";\r\n\r\nconst hasOptions = (options?: SecretResolverOptions): boolean =>\r\n !!options && Object.values(options).some(value => value !== undefined);\r\n\r\nexport class ConfigFile {\r\n private static rawCache?: AppConfig;\r\n private static rawPath?: string;\r\n private static resolvedCache?: ResolvedAppConfig;\r\n\r\n static loadRawConfig(configPath?: string): AppConfig {\r\n const p = configPath ?? path.resolve(process.cwd(), \"config.json\");\r\n if (!this.rawCache || this.rawPath !== p) {\r\n const raw = fs.readFileSync(p, \"utf8\");\r\n this.rawCache = JSON.parse(raw) as AppConfig; // no runtime validation\r\n this.rawPath = p;\r\n this.resolvedCache = undefined;\r\n }\r\n return this.rawCache;\r\n }\r\n\r\n static get(): AppConfig {\r\n if (!this.rawCache) {\r\n throw new Error(\"Config not loaded. Call ConfigFile.loadConfig() first.\");\r\n }\r\n return this.rawCache;\r\n }\r\n\r\n static async loadConfig(\r\n configPath?: string,\r\n options?: SecretResolverOptions\r\n ): Promise<ResolvedAppConfig> {\r\n const raw = this.loadRawConfig(configPath);\r\n\r\n if (!this.resolvedCache) {\r\n this.resolvedCache = await resolveConfigSecrets(raw, options);\r\n }\r\n\r\n return this.resolvedCache;\r\n }\r\n\r\n static async loadResolvedConfig(\r\n options?: SecretResolverOptions\r\n ): Promise<ResolvedAppConfig> {\r\n return this.loadConfig(undefined, options);\r\n }\r\n\r\n static clearCache(): void {\r\n this.rawCache = undefined;\r\n this.resolvedCache = undefined;\r\n this.rawPath = undefined;\r\n clearSecretResolverCaches();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"config-file.js","sourceRoot":"","sources":["../src/config-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GAGrB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,UAAU,GAAG,CAAC,OAA+B,EAAW,EAAE,CAC9D,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;AAEzE,MAAM,OAAO,UAAU;IACb,MAAM,CAAC,QAAQ,CAAa;IAC5B,MAAM,CAAC,OAAO,CAAU;IACxB,MAAM,CAAC,aAAa,CAAqB;IAEjD,MAAM,CAAC,aAAa,CAAC,UAAmB;QACtC,MAAM,CAAC,GAAG,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC,CAAC,wBAAwB;YACtE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YACjB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,GAAG;QACR,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,UAAU,CACrB,UAAmB,EACnB,OAA+B;QAE/B,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAE3C,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAC7B,OAA+B;QAE/B,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,UAAU;QACf,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,yBAAyB,EAAE,CAAC;IAC9B,CAAC;CACF","sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { AppConfig } from \"./config/app-config.js\";\nimport {\n clearSecretResolverCaches,\n resolveConfigSecrets,\n type ResolvedAppConfig,\n type SecretResolverOptions,\n} from \"./uns-config/secret-resolver.js\";\n\nconst hasOptions = (options?: SecretResolverOptions): boolean =>\n !!options && Object.values(options).some(value => value !== undefined);\n\nexport class ConfigFile {\n private static rawCache?: AppConfig;\n private static rawPath?: string;\n private static resolvedCache?: ResolvedAppConfig;\n\n static loadRawConfig(configPath?: string): AppConfig {\n const p = configPath ?? path.resolve(process.cwd(), \"config.json\");\n if (!this.rawCache || this.rawPath !== p) {\n const raw = fs.readFileSync(p, \"utf8\");\n this.rawCache = JSON.parse(raw) as AppConfig; // no runtime validation\n this.rawPath = p;\n this.resolvedCache = undefined;\n }\n return this.rawCache;\n }\n\n static get(): AppConfig {\n if (!this.rawCache) {\n throw new Error(\"Config not loaded. Call ConfigFile.loadConfig() first.\");\n }\n return this.rawCache;\n }\n\n static async loadConfig(\n configPath?: string,\n options?: SecretResolverOptions\n ): Promise<ResolvedAppConfig> {\n const raw = this.loadRawConfig(configPath);\n\n if (!this.resolvedCache) {\n this.resolvedCache = await resolveConfigSecrets(raw, options);\n }\n\n return this.resolvedCache;\n }\n\n static async loadResolvedConfig(\n options?: SecretResolverOptions\n ): Promise<ResolvedAppConfig> {\n return this.loadConfig(undefined, options);\n }\n\n static clearCache(): void {\n this.rawCache = undefined;\n this.resolvedCache = undefined;\n this.rawPath = undefined;\n clearSecretResolverCaches();\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"datahub-client.js","sourceRoot":"","sources":["../../src/examples/datahub-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConfigFile, UnsClient } from \"../index.js\";\r\nimport { AuthClient } from \"../tools/auth/auth-client.js\";\r\n\r\nasync function main(): Promise<void> {\r\n const config = await ConfigFile.loadConfig();\r\n const configToken = typeof config.uns.token === \"string\" ? config.uns.token : undefined;\r\n const serviceToken = process.env.UNS_SERVICE_TOKEN ?? configToken;\r\n const authClient = serviceToken ? undefined : await AuthClient.create();\r\n const client = new UnsClient(config.uns.rest, {\r\n token: serviceToken,\r\n authClient,\r\n });\r\n\r\n const valueTopic = \"sij/acroni/vv/hrm-furnace/equipment/pusher/output-quantity\";\r\n const tableTopic = \"sij/acroni/vv/hrm-furnace/process-segment/slab-001/trend-data\";\r\n\r\n const to = new Date();\r\n const from = new Date(to.getTime() - 7 * 24 * 60 * 60 * 1000);\r\n\r\n const lastValue = await client.lastValue(valueTopic);\r\n console.log(\"lastValue:\");\r\n console.dir(lastValue, { depth: null });\r\n console.log();\r\n\r\n const data = await client.getAttributeData(tableTopic, {\r\n from: from.toISOString(),\r\n to: to.toISOString(),\r\n table: \"uns_hrm_furnace_trend_data_table\",\r\n dedupe: false,\r\n summaryOnly: false,\r\n });\r\n console.log(\"getData:\");\r\n if (data === null) {\r\n console.log(null);\r\n } else {\r\n console.dir(data.toRecords().slice(0, 3), { depth: null });\r\n }\r\n console.log();\r\n\r\n const customData = await client.getData(\"/projects/project-name/path-to-data/data\", {\r\n fromDate: \"20260325\",\r\n });\r\n console.log(\"getData:\");\r\n console.dir(await customData.json(), { depth: null });\r\n console.log();\r\n\r\n const history = await client.history([valueTopic, tableTopic], {\r\n from: from.toISOString(),\r\n to: to.toISOString(),\r\n limit: 500,\r\n dedupe: false,\r\n summaryOnly: false,\r\n });\r\n console.log(\"history:\");\r\n if (history === null) {\r\n console.log(null);\r\n } else {\r\n console.dir(history.byTopic, { depth: null });\r\n }\r\n}\r\n\r\nvoid main().catch((error) => {\r\n console.error(error);\r\n process.exitCode = 1;\r\n});\r\n"]}
1
+ {"version":3,"file":"datahub-client.js","sourceRoot":"","sources":["../../src/examples/datahub-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConfigFile, UnsClient } from \"../index.js\";\nimport { AuthClient } from \"../tools/auth/auth-client.js\";\n\nasync function main(): Promise<void> {\n const config = await ConfigFile.loadConfig();\n const configToken = typeof config.uns.token === \"string\" ? config.uns.token : undefined;\n const serviceToken = process.env.UNS_SERVICE_TOKEN ?? configToken;\n const authClient = serviceToken ? undefined : await AuthClient.create();\n const client = new UnsClient(config.uns.rest, {\n token: serviceToken,\n authClient,\n });\n\n const valueTopic = \"sij/acroni/vv/hrm-furnace/equipment/pusher/output-quantity\";\n const tableTopic = \"sij/acroni/vv/hrm-furnace/process-segment/slab-001/trend-data\";\n\n const to = new Date();\n const from = new Date(to.getTime() - 7 * 24 * 60 * 60 * 1000);\n\n const lastValue = await client.lastValue(valueTopic);\n console.log(\"lastValue:\");\n console.dir(lastValue, { depth: null });\n console.log();\n\n const data = await client.getAttributeData(tableTopic, {\n from: from.toISOString(),\n to: to.toISOString(),\n table: \"uns_hrm_furnace_trend_data_table\",\n dedupe: false,\n summaryOnly: false,\n });\n console.log(\"getData:\");\n if (data === null) {\n console.log(null);\n } else {\n console.dir(data.toRecords().slice(0, 3), { depth: null });\n }\n console.log();\n\n const customData = await client.getData(\"/projects/project-name/path-to-data/data\", {\n fromDate: \"20260325\",\n });\n console.log(\"getData:\");\n console.dir(await customData.json(), { depth: null });\n console.log();\n\n const history = await client.history([valueTopic, tableTopic], {\n from: from.toISOString(),\n to: to.toISOString(),\n limit: 500,\n dedupe: false,\n summaryOnly: false,\n });\n console.log(\"history:\");\n if (history === null) {\n console.log(null);\n } else {\n console.dir(history.byTopic, { depth: null });\n }\n}\n\nvoid main().catch((error) => {\n console.error(error);\n process.exitCode = 1;\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/graphql/schema.ts"],"names":[],"mappings":"AA0KA,MAAM,CAAN,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,+BAAW,CAAA;IACX,iCAAa,CAAA;IACb,mCAAe,CAAA;AACjB,CAAC,EAJW,gBAAgB,KAAhB,gBAAgB,QAI3B;AAqBD,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,sCAAuB,CAAA;IACvB,4CAA6B,CAAA;IAC7B,8BAAe,CAAA;AACjB,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB","sourcesContent":["import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql';\r\nexport type Maybe<T> = T | null;\r\nexport type InputMaybe<T> = Maybe<T>;\r\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\r\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\r\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\r\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\r\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\r\n/** All built-in and custom scalars, mapped to their actual values */\r\nexport type Scalars = {\r\n ID: { input: string; output: string; }\r\n String: { input: string; output: string; }\r\n Boolean: { input: boolean; output: boolean; }\r\n Int: { input: number; output: number; }\r\n Float: { input: number; output: number; }\r\n Date: { input: any; output: any; }\r\n Timestamp: { input: any; output: any; }\r\n};\r\n\r\nexport type InitUnsTopic = {\r\n topic?: InputMaybe<Scalars['String']['input']>;\r\n};\r\n\r\nexport type InsertUnsNode = {\r\n apiDescription?: InputMaybe<Scalars['String']['input']>;\r\n apiEndpoint?: InputMaybe<Scalars['String']['input']>;\r\n apiMethod?: InputMaybe<Scalars['String']['input']>;\r\n attributeNeedsPersistance?: InputMaybe<Scalars['Boolean']['input']>;\r\n attributeTags?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;\r\n attributeTimestamp?: InputMaybe<Scalars['Timestamp']['input']>;\r\n attributeType?: InputMaybe<UnsAttributeType>;\r\n description?: InputMaybe<Scalars['String']['input']>;\r\n fullTopic?: InputMaybe<Scalars['String']['input']>;\r\n parent: Scalars['Int']['input'];\r\n processName?: InputMaybe<Scalars['String']['input']>;\r\n processVersion?: InputMaybe<Scalars['String']['input']>;\r\n type?: InputMaybe<UnsNodeType>;\r\n unsNode?: InputMaybe<Scalars['String']['input']>;\r\n};\r\n\r\nexport type Mutation = {\r\n __typename?: 'Mutation';\r\n AddUnsNode?: Maybe<Scalars['Int']['output']>;\r\n DeleteRttNode?: Maybe<Scalars['Boolean']['output']>;\r\n DeleteUnsNode?: Maybe<Scalars['Boolean']['output']>;\r\n DeployRttNode?: Maybe<Scalars['Boolean']['output']>;\r\n ModifyUnsNode?: Maybe<Scalars['Boolean']['output']>;\r\n /** Purge all nodes that are older the maxAge in hours */\r\n PurgeOldNodes?: Maybe<Scalars['Boolean']['output']>;\r\n SetRttNodeConfig?: Maybe<Scalars['Boolean']['output']>;\r\n StartRttNode?: Maybe<Scalars['Boolean']['output']>;\r\n StopRttNode?: Maybe<Scalars['Boolean']['output']>;\r\n};\r\n\r\n\r\nexport type MutationAddUnsNodeArgs = {\r\n node?: InputMaybe<InsertUnsNode>;\r\n};\r\n\r\n\r\nexport type MutationDeleteRttNodeArgs = {\r\n rttNode?: InputMaybe<Scalars['String']['input']>;\r\n};\r\n\r\n\r\nexport type MutationDeleteUnsNodeArgs = {\r\n id?: InputMaybe<Scalars['Int']['input']>;\r\n};\r\n\r\n\r\nexport type MutationDeployRttNodeArgs = {\r\n rttNode?: InputMaybe<Scalars['String']['input']>;\r\n tag?: InputMaybe<Scalars['String']['input']>;\r\n};\r\n\r\n\r\nexport type MutationModifyUnsNodeArgs = {\r\n id?: InputMaybe<Scalars['Int']['input']>;\r\n node?: InputMaybe<UpdateUnsNode>;\r\n};\r\n\r\n\r\nexport type MutationPurgeOldNodesArgs = {\r\n maxAge?: InputMaybe<Scalars['Int']['input']>;\r\n};\r\n\r\n\r\nexport type MutationSetRttNodeConfigArgs = {\r\n configuration?: InputMaybe<Scalars['String']['input']>;\r\n rttNode?: InputMaybe<Scalars['String']['input']>;\r\n};\r\n\r\n\r\nexport type MutationStartRttNodeArgs = {\r\n rttNode?: InputMaybe<Scalars['String']['input']>;\r\n};\r\n\r\n\r\nexport type MutationStopRttNodeArgs = {\r\n rttNode?: InputMaybe<Scalars['String']['input']>;\r\n};\r\n\r\n/** name: uns-datahub */\r\nexport type Query = {\r\n __typename?: 'Query';\r\n GetRepositories?: Maybe<Array<Maybe<Repository>>>;\r\n GetRttNodeConfig?: Maybe<Scalars['String']['output']>;\r\n GetRttNodes?: Maybe<Array<Maybe<RttNode>>>;\r\n GetTags?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\r\n GetTreeStructure?: Maybe<Array<Maybe<TreeStructure>>>;\r\n GetUnsNodes?: Maybe<Array<Maybe<UnsNode>>>;\r\n};\r\n\r\n\r\n/** name: uns-datahub */\r\nexport type QueryGetRttNodeConfigArgs = {\r\n rttNode?: InputMaybe<Scalars['String']['input']>;\r\n};\r\n\r\n\r\n/** name: uns-datahub */\r\nexport type QueryGetTreeStructureArgs = {\r\n attributeTags?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;\r\n};\r\n\r\nexport type Repository = {\r\n __typename?: 'Repository';\r\n name?: Maybe<Scalars['String']['output']>;\r\n tags?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\r\n};\r\n\r\nexport type RttNode = {\r\n __typename?: 'RttNode';\r\n author?: Maybe<Scalars['String']['output']>;\r\n deployedVersions?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\r\n description?: Maybe<Scalars['String']['output']>;\r\n lastErrLog?: Maybe<Scalars['String']['output']>;\r\n lastLog?: Maybe<Scalars['String']['output']>;\r\n latestDeployedVersion?: Maybe<Scalars['String']['output']>;\r\n memory?: Maybe<Scalars['Int']['output']>;\r\n pid?: Maybe<Scalars['Int']['output']>;\r\n restarts?: Maybe<Scalars['Int']['output']>;\r\n rttNode?: Maybe<Scalars['String']['output']>;\r\n runningVersion?: Maybe<Scalars['String']['output']>;\r\n status?: Maybe<Scalars['String']['output']>;\r\n topics?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\r\n uptime?: Maybe<Scalars['Int']['output']>;\r\n version?: Maybe<Scalars['String']['output']>;\r\n};\r\n\r\nexport type TreeStructure = {\r\n __typename?: 'TreeStructure';\r\n apiDescription?: Maybe<Scalars['String']['output']>;\r\n apiEndpoint?: Maybe<Scalars['String']['output']>;\r\n apiMethod?: Maybe<Scalars['String']['output']>;\r\n attributeNeedsPersistance?: Maybe<Scalars['Boolean']['output']>;\r\n attributeTags?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\r\n attributeTimestamp?: Maybe<Scalars['Timestamp']['output']>;\r\n attributeType?: Maybe<UnsAttributeType>;\r\n children?: Maybe<Array<Maybe<TreeStructure>>>;\r\n description?: Maybe<Scalars['String']['output']>;\r\n fullTopic?: Maybe<Scalars['String']['output']>;\r\n id?: Maybe<Scalars['Int']['output']>;\r\n parent?: Maybe<Scalars['Int']['output']>;\r\n processName?: Maybe<Scalars['String']['output']>;\r\n processVersion?: Maybe<Scalars['String']['output']>;\r\n type?: Maybe<UnsNodeType>;\r\n unsNode?: Maybe<Scalars['String']['output']>;\r\n};\r\n\r\nexport enum UnsAttributeType {\r\n Api = 'Api',\r\n Data = 'Data',\r\n Table = 'Table'\r\n}\r\n\r\nexport type UnsNode = {\r\n __typename?: 'UnsNode';\r\n apiDescription?: Maybe<Scalars['String']['output']>;\r\n apiEndpoint?: Maybe<Scalars['String']['output']>;\r\n apiMethod?: Maybe<Scalars['String']['output']>;\r\n attributeNeedsPersistance?: Maybe<Scalars['Boolean']['output']>;\r\n attributeTags?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\r\n attributeTimestamp?: Maybe<Scalars['Timestamp']['output']>;\r\n attributeType?: Maybe<UnsAttributeType>;\r\n description?: Maybe<Scalars['String']['output']>;\r\n fullTopic?: Maybe<Scalars['String']['output']>;\r\n id?: Maybe<Scalars['Int']['output']>;\r\n parent?: Maybe<Scalars['Int']['output']>;\r\n processName?: Maybe<Scalars['String']['output']>;\r\n processVersion?: Maybe<Scalars['String']['output']>;\r\n type?: Maybe<UnsNodeType>;\r\n unsNode?: Maybe<Scalars['String']['output']>;\r\n};\r\n\r\nexport enum UnsNodeType {\r\n Attribute = 'Attribute',\r\n DynamicTopic = 'DynamicTopic',\r\n Topic = 'Topic'\r\n}\r\n\r\nexport type UpdateUnsNode = {\r\n apiDescription?: InputMaybe<Scalars['String']['input']>;\r\n apiEndpoint?: InputMaybe<Scalars['String']['input']>;\r\n apiMethod?: InputMaybe<Scalars['String']['input']>;\r\n attributeNeedsPersistance?: InputMaybe<Scalars['Boolean']['input']>;\r\n attributeTags?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;\r\n attributeTimestamp?: InputMaybe<Scalars['Timestamp']['input']>;\r\n attributeType?: InputMaybe<UnsAttributeType>;\r\n description?: InputMaybe<Scalars['String']['input']>;\r\n fullTopic?: InputMaybe<Scalars['String']['input']>;\r\n parent?: InputMaybe<Scalars['Int']['input']>;\r\n processName?: InputMaybe<Scalars['String']['input']>;\r\n processVersion?: InputMaybe<Scalars['String']['input']>;\r\n type?: InputMaybe<UnsNodeType>;\r\n unsNode?: InputMaybe<Scalars['String']['input']>;\r\n};\r\n\r\n\r\n\r\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\r\n\r\n\r\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\r\n resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\r\n};\r\nexport type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\r\n\r\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\r\n parent: TParent,\r\n args: TArgs,\r\n context: TContext,\r\n info: GraphQLResolveInfo\r\n) => Promise<TResult> | TResult;\r\n\r\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\r\n parent: TParent,\r\n args: TArgs,\r\n context: TContext,\r\n info: GraphQLResolveInfo\r\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\r\n\r\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\r\n parent: TParent,\r\n args: TArgs,\r\n context: TContext,\r\n info: GraphQLResolveInfo\r\n) => TResult | Promise<TResult>;\r\n\r\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\r\n subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\r\n resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\r\n}\r\n\r\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\r\n subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\r\n resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\r\n}\r\n\r\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\r\n | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\r\n | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\r\n\r\nexport type SubscriptionResolver<TResult, TKey extends string, TParent = {}, TContext = {}, TArgs = {}> =\r\n | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\r\n | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\r\n\r\nexport type TypeResolveFn<TTypes, TParent = {}, TContext = {}> = (\r\n parent: TParent,\r\n context: TContext,\r\n info: GraphQLResolveInfo\r\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\r\n\r\nexport type IsTypeOfResolverFn<T = {}, TContext = {}> = (obj: T, context: TContext, info: GraphQLResolveInfo) => boolean | Promise<boolean>;\r\n\r\nexport type NextResolverFn<T> = () => Promise<T>;\r\n\r\nexport type DirectiveResolverFn<TResult = {}, TParent = {}, TContext = {}, TArgs = {}> = (\r\n next: NextResolverFn<TResult>,\r\n parent: TParent,\r\n args: TArgs,\r\n context: TContext,\r\n info: GraphQLResolveInfo\r\n) => TResult | Promise<TResult>;\r\n\r\n\r\n\r\n/** Mapping between all available schema types and the resolvers types */\r\nexport type ResolversTypes = {\r\n Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\r\n Date: ResolverTypeWrapper<Scalars['Date']['output']>;\r\n InitUnsTopic: InitUnsTopic;\r\n InsertUnsNode: InsertUnsNode;\r\n Int: ResolverTypeWrapper<Scalars['Int']['output']>;\r\n Mutation: ResolverTypeWrapper<{}>;\r\n Query: ResolverTypeWrapper<{}>;\r\n Repository: ResolverTypeWrapper<Repository>;\r\n RttNode: ResolverTypeWrapper<RttNode>;\r\n String: ResolverTypeWrapper<Scalars['String']['output']>;\r\n Timestamp: ResolverTypeWrapper<Scalars['Timestamp']['output']>;\r\n TreeStructure: ResolverTypeWrapper<TreeStructure>;\r\n UnsAttributeType: UnsAttributeType;\r\n UnsNode: ResolverTypeWrapper<UnsNode>;\r\n UnsNodeType: UnsNodeType;\r\n UpdateUnsNode: UpdateUnsNode;\r\n};\r\n\r\n/** Mapping between all available schema types and the resolvers parents */\r\nexport type ResolversParentTypes = {\r\n Boolean: Scalars['Boolean']['output'];\r\n Date: Scalars['Date']['output'];\r\n InitUnsTopic: InitUnsTopic;\r\n InsertUnsNode: InsertUnsNode;\r\n Int: Scalars['Int']['output'];\r\n Mutation: {};\r\n Query: {};\r\n Repository: Repository;\r\n RttNode: RttNode;\r\n String: Scalars['String']['output'];\r\n Timestamp: Scalars['Timestamp']['output'];\r\n TreeStructure: TreeStructure;\r\n UnsNode: UnsNode;\r\n UpdateUnsNode: UpdateUnsNode;\r\n};\r\n\r\nexport interface DateScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['Date'], any> {\r\n name: 'Date';\r\n}\r\n\r\nexport type MutationResolvers<ContextType = any, ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation']> = {\r\n AddUnsNode?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType, Partial<MutationAddUnsNodeArgs>>;\r\n DeleteRttNode?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationDeleteRttNodeArgs>>;\r\n DeleteUnsNode?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationDeleteUnsNodeArgs>>;\r\n DeployRttNode?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationDeployRttNodeArgs>>;\r\n ModifyUnsNode?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationModifyUnsNodeArgs>>;\r\n PurgeOldNodes?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationPurgeOldNodesArgs>>;\r\n SetRttNodeConfig?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationSetRttNodeConfigArgs>>;\r\n StartRttNode?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationStartRttNodeArgs>>;\r\n StopRttNode?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationStopRttNodeArgs>>;\r\n};\r\n\r\nexport type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\r\n GetRepositories?: Resolver<Maybe<Array<Maybe<ResolversTypes['Repository']>>>, ParentType, ContextType>;\r\n GetRttNodeConfig?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, Partial<QueryGetRttNodeConfigArgs>>;\r\n GetRttNodes?: Resolver<Maybe<Array<Maybe<ResolversTypes['RttNode']>>>, ParentType, ContextType>;\r\n GetTags?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;\r\n GetTreeStructure?: Resolver<Maybe<Array<Maybe<ResolversTypes['TreeStructure']>>>, ParentType, ContextType, Partial<QueryGetTreeStructureArgs>>;\r\n GetUnsNodes?: Resolver<Maybe<Array<Maybe<ResolversTypes['UnsNode']>>>, ParentType, ContextType>;\r\n};\r\n\r\nexport type RepositoryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Repository'] = ResolversParentTypes['Repository']> = {\r\n name?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n tags?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;\r\n __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\r\n};\r\n\r\nexport type RttNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['RttNode'] = ResolversParentTypes['RttNode']> = {\r\n author?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n deployedVersions?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;\r\n description?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n lastErrLog?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n lastLog?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n latestDeployedVersion?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n memory?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\r\n pid?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\r\n restarts?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\r\n rttNode?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n runningVersion?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n status?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n topics?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;\r\n uptime?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\r\n version?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\r\n};\r\n\r\nexport interface TimestampScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['Timestamp'], any> {\r\n name: 'Timestamp';\r\n}\r\n\r\nexport type TreeStructureResolvers<ContextType = any, ParentType extends ResolversParentTypes['TreeStructure'] = ResolversParentTypes['TreeStructure']> = {\r\n apiDescription?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n apiEndpoint?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n apiMethod?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n attributeNeedsPersistance?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;\r\n attributeTags?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;\r\n attributeTimestamp?: Resolver<Maybe<ResolversTypes['Timestamp']>, ParentType, ContextType>;\r\n attributeType?: Resolver<Maybe<ResolversTypes['UnsAttributeType']>, ParentType, ContextType>;\r\n children?: Resolver<Maybe<Array<Maybe<ResolversTypes['TreeStructure']>>>, ParentType, ContextType>;\r\n description?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n fullTopic?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n id?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\r\n parent?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\r\n processName?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n processVersion?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n type?: Resolver<Maybe<ResolversTypes['UnsNodeType']>, ParentType, ContextType>;\r\n unsNode?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\r\n};\r\n\r\nexport type UnsNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['UnsNode'] = ResolversParentTypes['UnsNode']> = {\r\n apiDescription?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n apiEndpoint?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n apiMethod?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n attributeNeedsPersistance?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;\r\n attributeTags?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;\r\n attributeTimestamp?: Resolver<Maybe<ResolversTypes['Timestamp']>, ParentType, ContextType>;\r\n attributeType?: Resolver<Maybe<ResolversTypes['UnsAttributeType']>, ParentType, ContextType>;\r\n description?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n fullTopic?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n id?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\r\n parent?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\r\n processName?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n processVersion?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n type?: Resolver<Maybe<ResolversTypes['UnsNodeType']>, ParentType, ContextType>;\r\n unsNode?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\r\n __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\r\n};\r\n\r\nexport type Resolvers<ContextType = any> = {\r\n Date?: GraphQLScalarType;\r\n Mutation?: MutationResolvers<ContextType>;\r\n Query?: QueryResolvers<ContextType>;\r\n Repository?: RepositoryResolvers<ContextType>;\r\n RttNode?: RttNodeResolvers<ContextType>;\r\n Timestamp?: GraphQLScalarType;\r\n TreeStructure?: TreeStructureResolvers<ContextType>;\r\n UnsNode?: UnsNodeResolvers<ContextType>;\r\n};\r\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/graphql/schema.ts"],"names":[],"mappings":"AA0KA,MAAM,CAAN,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,+BAAW,CAAA;IACX,iCAAa,CAAA;IACb,mCAAe,CAAA;AACjB,CAAC,EAJW,gBAAgB,KAAhB,gBAAgB,QAI3B;AAqBD,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,sCAAuB,CAAA;IACvB,4CAA6B,CAAA;IAC7B,8BAAe,CAAA;AACjB,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB","sourcesContent":["import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql';\nexport 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 Timestamp: { input: any; output: any; }\n};\n\nexport type InitUnsTopic = {\n topic?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type InsertUnsNode = {\n apiDescription?: InputMaybe<Scalars['String']['input']>;\n apiEndpoint?: InputMaybe<Scalars['String']['input']>;\n apiMethod?: InputMaybe<Scalars['String']['input']>;\n attributeNeedsPersistance?: InputMaybe<Scalars['Boolean']['input']>;\n attributeTags?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;\n attributeTimestamp?: InputMaybe<Scalars['Timestamp']['input']>;\n attributeType?: InputMaybe<UnsAttributeType>;\n description?: InputMaybe<Scalars['String']['input']>;\n fullTopic?: InputMaybe<Scalars['String']['input']>;\n parent: Scalars['Int']['input'];\n processName?: InputMaybe<Scalars['String']['input']>;\n processVersion?: InputMaybe<Scalars['String']['input']>;\n type?: InputMaybe<UnsNodeType>;\n unsNode?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type Mutation = {\n __typename?: 'Mutation';\n AddUnsNode?: Maybe<Scalars['Int']['output']>;\n DeleteRttNode?: Maybe<Scalars['Boolean']['output']>;\n DeleteUnsNode?: Maybe<Scalars['Boolean']['output']>;\n DeployRttNode?: Maybe<Scalars['Boolean']['output']>;\n ModifyUnsNode?: Maybe<Scalars['Boolean']['output']>;\n /** Purge all nodes that are older the maxAge in hours */\n PurgeOldNodes?: Maybe<Scalars['Boolean']['output']>;\n SetRttNodeConfig?: Maybe<Scalars['Boolean']['output']>;\n StartRttNode?: Maybe<Scalars['Boolean']['output']>;\n StopRttNode?: Maybe<Scalars['Boolean']['output']>;\n};\n\n\nexport type MutationAddUnsNodeArgs = {\n node?: InputMaybe<InsertUnsNode>;\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 MutationModifyUnsNodeArgs = {\n id?: InputMaybe<Scalars['Int']['input']>;\n node?: InputMaybe<UpdateUnsNode>;\n};\n\n\nexport type MutationPurgeOldNodesArgs = {\n maxAge?: InputMaybe<Scalars['Int']['input']>;\n};\n\n\nexport type MutationSetRttNodeConfigArgs = {\n configuration?: InputMaybe<Scalars['String']['input']>;\n rttNode?: InputMaybe<Scalars['String']['input']>;\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 GetRepositories?: Maybe<Array<Maybe<Repository>>>;\n GetRttNodeConfig?: Maybe<Scalars['String']['output']>;\n GetRttNodes?: Maybe<Array<Maybe<RttNode>>>;\n GetTags?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n GetTreeStructure?: Maybe<Array<Maybe<TreeStructure>>>;\n GetUnsNodes?: Maybe<Array<Maybe<UnsNode>>>;\n};\n\n\n/** name: uns-datahub */\nexport type QueryGetRttNodeConfigArgs = {\n rttNode?: InputMaybe<Scalars['String']['input']>;\n};\n\n\n/** name: uns-datahub */\nexport type QueryGetTreeStructureArgs = {\n attributeTags?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;\n};\n\nexport type Repository = {\n __typename?: 'Repository';\n name?: Maybe<Scalars['String']['output']>;\n tags?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\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 lastErrLog?: 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 topics?: Maybe<Array<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 apiDescription?: Maybe<Scalars['String']['output']>;\n apiEndpoint?: Maybe<Scalars['String']['output']>;\n apiMethod?: Maybe<Scalars['String']['output']>;\n attributeNeedsPersistance?: Maybe<Scalars['Boolean']['output']>;\n attributeTags?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n attributeTimestamp?: Maybe<Scalars['Timestamp']['output']>;\n attributeType?: Maybe<UnsAttributeType>;\n children?: Maybe<Array<Maybe<TreeStructure>>>;\n description?: Maybe<Scalars['String']['output']>;\n fullTopic?: Maybe<Scalars['String']['output']>;\n id?: Maybe<Scalars['Int']['output']>;\n parent?: Maybe<Scalars['Int']['output']>;\n processName?: Maybe<Scalars['String']['output']>;\n processVersion?: Maybe<Scalars['String']['output']>;\n type?: Maybe<UnsNodeType>;\n unsNode?: Maybe<Scalars['String']['output']>;\n};\n\nexport enum UnsAttributeType {\n Api = 'Api',\n Data = 'Data',\n Table = 'Table'\n}\n\nexport type UnsNode = {\n __typename?: 'UnsNode';\n apiDescription?: Maybe<Scalars['String']['output']>;\n apiEndpoint?: Maybe<Scalars['String']['output']>;\n apiMethod?: Maybe<Scalars['String']['output']>;\n attributeNeedsPersistance?: Maybe<Scalars['Boolean']['output']>;\n attributeTags?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n attributeTimestamp?: Maybe<Scalars['Timestamp']['output']>;\n attributeType?: Maybe<UnsAttributeType>;\n description?: Maybe<Scalars['String']['output']>;\n fullTopic?: Maybe<Scalars['String']['output']>;\n id?: Maybe<Scalars['Int']['output']>;\n parent?: Maybe<Scalars['Int']['output']>;\n processName?: Maybe<Scalars['String']['output']>;\n processVersion?: Maybe<Scalars['String']['output']>;\n type?: Maybe<UnsNodeType>;\n unsNode?: Maybe<Scalars['String']['output']>;\n};\n\nexport enum UnsNodeType {\n Attribute = 'Attribute',\n DynamicTopic = 'DynamicTopic',\n Topic = 'Topic'\n}\n\nexport type UpdateUnsNode = {\n apiDescription?: InputMaybe<Scalars['String']['input']>;\n apiEndpoint?: InputMaybe<Scalars['String']['input']>;\n apiMethod?: InputMaybe<Scalars['String']['input']>;\n attributeNeedsPersistance?: InputMaybe<Scalars['Boolean']['input']>;\n attributeTags?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;\n attributeTimestamp?: InputMaybe<Scalars['Timestamp']['input']>;\n attributeType?: InputMaybe<UnsAttributeType>;\n description?: InputMaybe<Scalars['String']['input']>;\n fullTopic?: InputMaybe<Scalars['String']['input']>;\n parent?: InputMaybe<Scalars['Int']['input']>;\n processName?: InputMaybe<Scalars['String']['input']>;\n processVersion?: InputMaybe<Scalars['String']['input']>;\n type?: InputMaybe<UnsNodeType>;\n unsNode?: InputMaybe<Scalars['String']['input']>;\n};\n\n\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n parent: TParent,\n args: TArgs,\n context: TContext,\n info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n parent: TParent,\n args: TArgs,\n context: TContext,\n info: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n parent: TParent,\n args: TArgs,\n context: TContext,\n info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<TResult, TKey extends string, TParent = {}, TContext = {}, TArgs = {}> =\n | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = {}, TContext = {}> = (\n parent: TParent,\n context: TContext,\n info: GraphQLResolveInfo\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = {}, TContext = {}> = (obj: T, context: TContext, info: GraphQLResolveInfo) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<TResult = {}, TParent = {}, TContext = {}, TArgs = {}> = (\n next: NextResolverFn<TResult>,\n parent: TParent,\n args: TArgs,\n context: TContext,\n info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\n\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = {\n Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n Date: ResolverTypeWrapper<Scalars['Date']['output']>;\n InitUnsTopic: InitUnsTopic;\n InsertUnsNode: InsertUnsNode;\n Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n Mutation: ResolverTypeWrapper<{}>;\n Query: ResolverTypeWrapper<{}>;\n Repository: ResolverTypeWrapper<Repository>;\n RttNode: ResolverTypeWrapper<RttNode>;\n String: ResolverTypeWrapper<Scalars['String']['output']>;\n Timestamp: ResolverTypeWrapper<Scalars['Timestamp']['output']>;\n TreeStructure: ResolverTypeWrapper<TreeStructure>;\n UnsAttributeType: UnsAttributeType;\n UnsNode: ResolverTypeWrapper<UnsNode>;\n UnsNodeType: UnsNodeType;\n UpdateUnsNode: UpdateUnsNode;\n};\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = {\n Boolean: Scalars['Boolean']['output'];\n Date: Scalars['Date']['output'];\n InitUnsTopic: InitUnsTopic;\n InsertUnsNode: InsertUnsNode;\n Int: Scalars['Int']['output'];\n Mutation: {};\n Query: {};\n Repository: Repository;\n RttNode: RttNode;\n String: Scalars['String']['output'];\n Timestamp: Scalars['Timestamp']['output'];\n TreeStructure: TreeStructure;\n UnsNode: UnsNode;\n UpdateUnsNode: UpdateUnsNode;\n};\n\nexport interface DateScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['Date'], any> {\n name: 'Date';\n}\n\nexport type MutationResolvers<ContextType = any, ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation']> = {\n AddUnsNode?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType, Partial<MutationAddUnsNodeArgs>>;\n DeleteRttNode?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationDeleteRttNodeArgs>>;\n DeleteUnsNode?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationDeleteUnsNodeArgs>>;\n DeployRttNode?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationDeployRttNodeArgs>>;\n ModifyUnsNode?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationModifyUnsNodeArgs>>;\n PurgeOldNodes?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationPurgeOldNodesArgs>>;\n SetRttNodeConfig?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationSetRttNodeConfigArgs>>;\n StartRttNode?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationStartRttNodeArgs>>;\n StopRttNode?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType, Partial<MutationStopRttNodeArgs>>;\n};\n\nexport type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n GetRepositories?: Resolver<Maybe<Array<Maybe<ResolversTypes['Repository']>>>, ParentType, ContextType>;\n GetRttNodeConfig?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, Partial<QueryGetRttNodeConfigArgs>>;\n GetRttNodes?: Resolver<Maybe<Array<Maybe<ResolversTypes['RttNode']>>>, ParentType, ContextType>;\n GetTags?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;\n GetTreeStructure?: Resolver<Maybe<Array<Maybe<ResolversTypes['TreeStructure']>>>, ParentType, ContextType, Partial<QueryGetTreeStructureArgs>>;\n GetUnsNodes?: Resolver<Maybe<Array<Maybe<ResolversTypes['UnsNode']>>>, ParentType, ContextType>;\n};\n\nexport type RepositoryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Repository'] = ResolversParentTypes['Repository']> = {\n name?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n tags?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;\n __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n};\n\nexport type RttNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['RttNode'] = ResolversParentTypes['RttNode']> = {\n author?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n deployedVersions?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;\n description?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n lastErrLog?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n lastLog?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n latestDeployedVersion?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n memory?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\n pid?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\n restarts?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\n rttNode?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n runningVersion?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n status?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n topics?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;\n uptime?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\n version?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n};\n\nexport interface TimestampScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['Timestamp'], any> {\n name: 'Timestamp';\n}\n\nexport type TreeStructureResolvers<ContextType = any, ParentType extends ResolversParentTypes['TreeStructure'] = ResolversParentTypes['TreeStructure']> = {\n apiDescription?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n apiEndpoint?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n apiMethod?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n attributeNeedsPersistance?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;\n attributeTags?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;\n attributeTimestamp?: Resolver<Maybe<ResolversTypes['Timestamp']>, ParentType, ContextType>;\n attributeType?: Resolver<Maybe<ResolversTypes['UnsAttributeType']>, ParentType, ContextType>;\n children?: Resolver<Maybe<Array<Maybe<ResolversTypes['TreeStructure']>>>, ParentType, ContextType>;\n description?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n fullTopic?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n id?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\n parent?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\n processName?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n processVersion?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n type?: Resolver<Maybe<ResolversTypes['UnsNodeType']>, ParentType, ContextType>;\n unsNode?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n};\n\nexport type UnsNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['UnsNode'] = ResolversParentTypes['UnsNode']> = {\n apiDescription?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n apiEndpoint?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n apiMethod?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n attributeNeedsPersistance?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;\n attributeTags?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;\n attributeTimestamp?: Resolver<Maybe<ResolversTypes['Timestamp']>, ParentType, ContextType>;\n attributeType?: Resolver<Maybe<ResolversTypes['UnsAttributeType']>, ParentType, ContextType>;\n description?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n fullTopic?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n id?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\n parent?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\n processName?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n processVersion?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n type?: Resolver<Maybe<ResolversTypes['UnsNodeType']>, ParentType, ContextType>;\n unsNode?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n};\n\nexport type Resolvers<ContextType = any> = {\n Date?: GraphQLScalarType;\n Mutation?: MutationResolvers<ContextType>;\n Query?: QueryResolvers<ContextType>;\n Repository?: RepositoryResolvers<ContextType>;\n RttNode?: RttNodeResolvers<ContextType>;\n Timestamp?: GraphQLScalarType;\n TreeStructure?: TreeStructureResolvers<ContextType>;\n UnsNode?: UnsNodeResolvers<ContextType>;\n};\n"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAOxE,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EACL,SAAS,EACT,eAAe,EACf,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,mCAAmC,CAAC","sourcesContent":["export { default as UnsProxyProcess } from \"./uns/uns-proxy-process.js\";\r\nexport type {\r\n UnsProxyProcessPlugin,\r\n UnsProxyProcessPluginApi,\r\n UnsProxyProcessPluginMethod,\r\n UnsProxyProcessPluginMethods,\r\n} from \"./uns/uns-proxy-process.js\";\r\nexport * from \"./uns/uns-interfaces.js\";\r\nexport * from \"./uns/service-metadata.js\";\r\nexport { ConfigFile } from \"./config-file.js\";\nexport { default as logger } from \"./logger.js\";\nexport { getLogger } from \"./logger.js\";\nexport { resolveInfisicalConfig } from \"./uns-config/secret-resolver.js\";\nexport {\n UnsClient,\n LastValueResult,\n ClientError,\n RangeResult,\n BatchRangeTopicResult,\n BatchRangeResponse,\n} from \"./tools/datahub/datahub-client.js\";\nexport type {\n LastValuePayload,\n CatchAllTimeField,\n CatchAllAggregate,\n RangeQueryOptions,\n RangeColumn,\n RangeStats,\n RangePayload,\n BatchRangeTopicPayload,\n BatchRangeResponsePayload,\n} from \"./tools/datahub/datahub-client.js\";\n\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAOxE,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EACL,SAAS,EACT,eAAe,EACf,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,mCAAmC,CAAC","sourcesContent":["export { default as UnsProxyProcess } from \"./uns/uns-proxy-process.js\";\nexport type {\n UnsProxyProcessPlugin,\n UnsProxyProcessPluginApi,\n UnsProxyProcessPluginMethod,\n UnsProxyProcessPluginMethods,\n} from \"./uns/uns-proxy-process.js\";\nexport * from \"./uns/uns-interfaces.js\";\nexport * from \"./uns/service-metadata.js\";\nexport { ConfigFile } from \"./config-file.js\";\nexport { default as logger } from \"./logger.js\";\nexport { getLogger } from \"./logger.js\";\nexport { resolveInfisicalConfig } from \"./uns-config/secret-resolver.js\";\nexport {\n UnsClient,\n LastValueResult,\n ClientError,\n RangeResult,\n BatchRangeTopicResult,\n BatchRangeResponse,\n} from \"./tools/datahub/datahub-client.js\";\nexport type {\n LastValuePayload,\n CatchAllTimeField,\n CatchAllAggregate,\n RangeQueryOptions,\n RangeColumn,\n RangeStats,\n RangePayload,\n BatchRangeTopicPayload,\n BatchRangeResponsePayload,\n} from \"./tools/datahub/datahub-client.js\";\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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","sourcesContent":["import { createLogger, format, transports } from 'winston';\r\nimport GelfTransport from 'winston-gelf'\r\nimport os from 'os'\r\nimport path from 'path'\r\nimport fs from 'fs'\r\nimport { fileURLToPath } from 'url';\r\nimport { ConfigFile } from './config-file.js'\r\n\r\nfunction loadPackageMeta(): { name?: string; version?: string } {\r\n const packageJsonPath = path.join(process.cwd(), 'package.json')\r\n\r\n try {\r\n const raw = fs.readFileSync(packageJsonPath, 'utf8')\r\n const packageMeta = JSON.parse(raw) as { name?: string; version?: string }\r\n if (packageMeta.name || packageMeta.version) {\r\n return packageMeta\r\n }\r\n } catch {\r\n // Use unknown values when the application package metadata is unavailable.\r\n }\r\n\r\n return {}\r\n}\r\n\r\nfunction loadLoggingConfig() {\r\n try {\r\n return ConfigFile.loadRawConfig().logging\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n\r\nconst packageMeta = loadPackageMeta()\r\nconst loggingConfig = loadLoggingConfig()\r\nconst gelfMeta = {\r\n service: packageMeta.name ?? 'unknown-service',\r\n version: packageMeta.version ?? 'unknown',\r\n environment: process.env.NODE_ENV || 'unknown',\r\n hostname: os.hostname()\r\n}\r\nconst consoleFormat = format.combine(\r\n format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n format.errors({ stack: true }),\r\n format.splat(),\r\n format.json()\r\n)\r\n\r\nconst loggerTransports = [\r\n new transports.Console({\r\n format: consoleFormat\r\n })\r\n]\r\n\r\nif (loggingConfig) {\r\n loggerTransports.push(\r\n new GelfTransport({\r\n format: format((info) => ({\r\n ...info,\r\n ...gelfMeta\r\n }))(),\r\n gelfPro: {\r\n adapterName: loggingConfig.adapter,\r\n adapterOptions: {\r\n host: loggingConfig.host,\r\n port: loggingConfig.port\r\n }\r\n }\r\n })\r\n )\r\n}\r\n\r\nconst logger = createLogger({\r\n level: loggingConfig?.level ?? 'info',\r\n\r\n format: format.combine(\r\n format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n format.errors({ stack: true }), // Include stack trace\r\n format.splat(),\r\n format.json()\r\n ),\r\n transports: loggerTransports,\r\n exceptionHandlers: [\r\n new transports.Console({\r\n format: consoleFormat\r\n }), // Log exceptions to console\r\n // Remove exception logging to file\r\n // new transports.File({ filename: 'logs/exceptions.log' })\r\n ]\r\n});\r\n\r\nexport function getLogger(modulePath: string) {\r\n const normalizedModulePath = modulePath.startsWith('file:')\r\n ? fileURLToPath(modulePath)\r\n : modulePath\r\n\r\n const relativePath = path.relative(process.cwd(), normalizedModulePath)\r\n const withoutExt = relativePath.replace(/\\.[^/.]+$/, '')\r\n const dotted = withoutExt.split(path.sep).join('.')\r\n\r\n return logger.child({\r\n facility: dotted\r\n })\r\n}\r\n\r\nexport default logger\r\n"]}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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","sourcesContent":["import { createLogger, format, transports } from 'winston';\nimport GelfTransport from 'winston-gelf'\nimport os from 'os'\nimport path from 'path'\nimport fs from 'fs'\nimport { fileURLToPath } from 'url';\nimport { ConfigFile } from './config-file.js'\n\nfunction loadPackageMeta(): { name?: string; version?: string } {\n const packageJsonPath = path.join(process.cwd(), 'package.json')\n\n try {\n const raw = fs.readFileSync(packageJsonPath, 'utf8')\n const packageMeta = JSON.parse(raw) as { name?: string; version?: string }\n if (packageMeta.name || packageMeta.version) {\n return packageMeta\n }\n } catch {\n // Use unknown values when the application package metadata is unavailable.\n }\n\n return {}\n}\n\nfunction loadLoggingConfig() {\n try {\n return ConfigFile.loadRawConfig().logging\n } catch {\n return undefined\n }\n}\n\nconst packageMeta = loadPackageMeta()\nconst loggingConfig = loadLoggingConfig()\nconst gelfMeta = {\n service: packageMeta.name ?? 'unknown-service',\n version: packageMeta.version ?? 'unknown',\n environment: process.env.NODE_ENV || 'unknown',\n hostname: os.hostname()\n}\nconst consoleFormat = format.combine(\n format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\n format.errors({ stack: true }),\n format.splat(),\n format.json()\n)\n\nconst loggerTransports = [\n new transports.Console({\n format: consoleFormat\n })\n]\n\nif (loggingConfig) {\n loggerTransports.push(\n new GelfTransport({\n format: format((info) => ({\n ...info,\n ...gelfMeta\n }))(),\n gelfPro: {\n adapterName: loggingConfig.adapter,\n adapterOptions: {\n host: loggingConfig.host,\n port: loggingConfig.port\n }\n }\n })\n )\n}\n\nconst logger = createLogger({\n level: loggingConfig?.level ?? 'info',\n\n format: format.combine(\n format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\n format.errors({ stack: true }), // Include stack trace\n format.splat(),\n format.json()\n ),\n transports: loggerTransports,\n exceptionHandlers: [\n new transports.Console({\n format: consoleFormat\n }), // Log exceptions to console\n // Remove exception logging to file\n // new transports.File({ filename: 'logs/exceptions.log' })\n ]\n});\n\nexport function getLogger(modulePath: string) {\n const normalizedModulePath = modulePath.startsWith('file:')\n ? fileURLToPath(modulePath)\n : modulePath\n\n const relativePath = path.relative(process.cwd(), normalizedModulePath)\n const withoutExt = relativePath.replace(/\\.[^/.]+$/, '')\n const dotted = withoutExt.split(path.sep).join('.')\n\n return logger.child({\n facility: dotted\n })\n}\n\nexport default logger\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"auth-client.js","sourceRoot":"","sources":["../../../src/tools/auth/auth-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConfigFile } from \"../../config-file.js\";\nimport { SecureStoreFactory, ISecureStore } from \"./secure-store.js\";\nimport jwt from \"jsonwebtoken\";\n\r\nconst cfg = await ConfigFile.loadConfig();\r\n\r\ntype LoginResponse = {\r\n accessToken: string;\r\n};\r\n\r\n/**\r\n * AuthClient handles acquiring and refreshing JWT access tokens\r\n * using the configured REST base URL.\r\n */\r\nexport class AuthClient {\r\n private readonly restBase: string;\r\n private readonly namespace: string;\r\n private store!: ISecureStore;\r\n\r\n private constructor(restBase: string) {\r\n this.restBase = restBase.replace(/\\/$/, \"\");\r\n // namespace store by rest base to allow multiple environments\r\n this.namespace = `uns-auth:${this.restBase}`;\r\n }\r\n\r\n static async create(): Promise<AuthClient> {\r\n const restBase: string = cfg?.uns?.rest;\r\n if (!restBase) throw new Error(\"config.uns.rest is not set\");\r\n const client = new AuthClient(restBase);\r\n client.store = await SecureStoreFactory.create(client.namespace);\r\n return client;\r\n }\r\n\r\n async getAccessToken(): Promise<string> {\n const accessToken = await this.store.get(\"accessToken\");\n const refreshToken = await this.store.get(\"refreshToken\");\n\r\n if (accessToken && !AuthClient.isExpired(accessToken)) {\r\n return accessToken;\r\n }\r\n\r\n // Try refresh if we have refresh token\r\n if (refreshToken) {\r\n try {\r\n const refreshed = await this.refresh(refreshToken);\r\n await this.persistTokens(refreshed.accessToken, refreshed.refreshToken);\r\n return refreshed.accessToken;\r\n } catch {\r\n // ignore, fallback to login\r\n }\r\n }\r\n\r\n // First try to get email and password from config\r\n const configEmail = cfg?.uns?.email;\n const configPassword = cfg?.uns?.password;\n if (typeof configEmail === \"string\" && typeof configPassword === \"string\") {\n try {\n const loggedIn = await this.login(configEmail, configPassword);\n await this.persistTokens(loggedIn.accessToken, loggedIn.refreshToken);\n return loggedIn.accessToken;\n } catch (error) {\n throw new Error(\n `Authentication failed using config.json credentials from uns.email/uns.password: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n throw new Error(\n \"No access token available. AuthClient reads config.json and expected valid uns.email and uns.password.\",\n );\n }\n\n private static isExpired(token: string, skewSeconds = 30): boolean {\n try {\r\n const decoded: any = jwt.decode(token);\r\n if (!decoded || typeof decoded !== \"object\" || !decoded.exp) return true;\r\n const now = Math.floor(Date.now() / 1000);\r\n return decoded.exp <= now + skewSeconds;\r\n } catch {\r\n return true;\r\n }\r\n }\r\n\r\n private static endpoint(base: string, tail: string): string {\r\n // base ends without trailing slash; tail must not start with slash\r\n const b = base.replace(/\\/$/, \"\");\r\n const t = tail.replace(/^\\//, \"\");\r\n return `${b}/${t}`;\r\n }\r\n\r\n private static async fetchWithTimeout(url: string, init: RequestInit = {}, timeoutMs = 10_000): Promise<Response> {\r\n const controller = new AbortController();\r\n const id = setTimeout(() => controller.abort(), timeoutMs);\r\n try {\r\n const resp = await fetch(url, { ...init, signal: controller.signal });\r\n return resp;\r\n } finally {\r\n clearTimeout(id);\r\n }\r\n }\r\n\r\n private static extractRefreshCookie(resp: Response): string | null {\r\n const anyHeaders: any = resp.headers as any;\r\n const getSetCookie = typeof anyHeaders.getSetCookie === \"function\" ? anyHeaders.getSetCookie.bind(anyHeaders) : null;\n const candidates: string[] = getSetCookie ? getSetCookie() : (resp.headers.get(\"set-cookie\") ? [resp.headers.get(\"set-cookie\") as string] : []);\n for (const header of candidates) {\n const match = header.match(/(?:^|;\\s*)(?:RefreshToken|rt)=([^;]+)/i);\n if (match) return match[1];\n }\n return null;\n }\n\r\n private async login(email: string, password: string): Promise<{ accessToken: string; refreshToken: string; }> {\r\n const url = AuthClient.endpoint(this.restBase, \"auth/login\");\r\n const resp = await AuthClient.fetchWithTimeout(url, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ email, password }),\r\n }, 12_000);\r\n\r\n if (!resp.ok) {\r\n throw new Error(`Login failed: ${resp.status} ${resp.statusText}`);\r\n }\r\n const data = (await resp.json()) as LoginResponse;\r\n const refreshToken = AuthClient.extractRefreshCookie(resp);\r\n if (!data?.accessToken || !refreshToken) {\r\n throw new Error(\"Login response missing tokens\");\r\n }\r\n return { accessToken: data.accessToken, refreshToken };\r\n }\r\n\r\n private async refresh(refreshToken: string): Promise<{ accessToken: string; refreshToken: string; }> {\n const url = AuthClient.endpoint(this.restBase, \"auth/refresh\");\n let lastError: Error | undefined;\n for (const cookieName of [\"RefreshToken\", \"rt\"]) {\n const resp = await AuthClient.fetchWithTimeout(url, {\n method: \"POST\",\n headers: {\n \"Cookie\": `${cookieName}=${refreshToken}`,\n },\n }, 8_000);\n\n if (!resp.ok) {\n lastError = new Error(`Refresh failed: ${resp.status} ${resp.statusText}`);\n continue;\n }\n const data = (await resp.json()) as LoginResponse;\n const newRefreshToken = AuthClient.extractRefreshCookie(resp) || refreshToken;\n if (!data?.accessToken) throw new Error(\"Refresh response missing accessToken\");\n return { accessToken: data.accessToken, refreshToken: newRefreshToken };\n }\n\n throw lastError ?? new Error(\"Refresh failed.\");\n }\n\r\n private async persistTokens(accessToken: string, refreshToken: string): Promise<void> {\r\n await this.store.set(\"accessToken\", accessToken);\r\n await this.store.set(\"refreshToken\", refreshToken);\r\n }\r\n}\n"]}
1
+ {"version":3,"file":"auth-client.js","sourceRoot":"","sources":["../../../src/tools/auth/auth-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConfigFile } from \"../../config-file.js\";\nimport { SecureStoreFactory, ISecureStore } from \"./secure-store.js\";\nimport jwt from \"jsonwebtoken\";\n\nconst cfg = await ConfigFile.loadConfig();\n\ntype LoginResponse = {\n accessToken: string;\n};\n\n/**\n * AuthClient handles acquiring and refreshing JWT access tokens\n * using the configured REST base URL.\n */\nexport class AuthClient {\n private readonly restBase: string;\n private readonly namespace: string;\n private store!: ISecureStore;\n\n private constructor(restBase: string) {\n this.restBase = restBase.replace(/\\/$/, \"\");\n // namespace store by rest base to allow multiple environments\n this.namespace = `uns-auth:${this.restBase}`;\n }\n\n static async create(): Promise<AuthClient> {\n const restBase: string = cfg?.uns?.rest;\n if (!restBase) throw new Error(\"config.uns.rest is not set\");\n const client = new AuthClient(restBase);\n client.store = await SecureStoreFactory.create(client.namespace);\n return client;\n }\n\n async getAccessToken(): Promise<string> {\n const accessToken = await this.store.get(\"accessToken\");\n const refreshToken = await this.store.get(\"refreshToken\");\n\n if (accessToken && !AuthClient.isExpired(accessToken)) {\n return accessToken;\n }\n\n // Try refresh if we have refresh token\n if (refreshToken) {\n try {\n const refreshed = await this.refresh(refreshToken);\n await this.persistTokens(refreshed.accessToken, refreshed.refreshToken);\n return refreshed.accessToken;\n } catch {\n // ignore, fallback to login\n }\n }\n\n // First try to get email and password from config\n const configEmail = cfg?.uns?.email;\n const configPassword = cfg?.uns?.password;\n if (typeof configEmail === \"string\" && typeof configPassword === \"string\") {\n try {\n const loggedIn = await this.login(configEmail, configPassword);\n await this.persistTokens(loggedIn.accessToken, loggedIn.refreshToken);\n return loggedIn.accessToken;\n } catch (error) {\n throw new Error(\n `Authentication failed using config.json credentials from uns.email/uns.password: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n throw new Error(\n \"No access token available. AuthClient reads config.json and expected valid uns.email and uns.password.\",\n );\n }\n\n private static isExpired(token: string, skewSeconds = 30): boolean {\n try {\n const decoded: any = jwt.decode(token);\n if (!decoded || typeof decoded !== \"object\" || !decoded.exp) return true;\n const now = Math.floor(Date.now() / 1000);\n return decoded.exp <= now + skewSeconds;\n } catch {\n return true;\n }\n }\n\n private static endpoint(base: string, tail: string): string {\n // base ends without trailing slash; tail must not start with slash\n const b = base.replace(/\\/$/, \"\");\n const t = tail.replace(/^\\//, \"\");\n return `${b}/${t}`;\n }\n\n private static async fetchWithTimeout(url: string, init: RequestInit = {}, timeoutMs = 10_000): Promise<Response> {\n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const resp = await fetch(url, { ...init, signal: controller.signal });\n return resp;\n } finally {\n clearTimeout(id);\n }\n }\n\n private static extractRefreshCookie(resp: Response): string | null {\n const anyHeaders: any = resp.headers as any;\n const getSetCookie = typeof anyHeaders.getSetCookie === \"function\" ? anyHeaders.getSetCookie.bind(anyHeaders) : null;\n const candidates: string[] = getSetCookie ? getSetCookie() : (resp.headers.get(\"set-cookie\") ? [resp.headers.get(\"set-cookie\") as string] : []);\n for (const header of candidates) {\n const match = header.match(/(?:^|;\\s*)(?:RefreshToken|rt)=([^;]+)/i);\n if (match) return match[1];\n }\n return null;\n }\n\n private async login(email: string, password: string): Promise<{ accessToken: string; refreshToken: string; }> {\n const url = AuthClient.endpoint(this.restBase, \"auth/login\");\n const resp = await AuthClient.fetchWithTimeout(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email, password }),\n }, 12_000);\n\n if (!resp.ok) {\n throw new Error(`Login failed: ${resp.status} ${resp.statusText}`);\n }\n const data = (await resp.json()) as LoginResponse;\n const refreshToken = AuthClient.extractRefreshCookie(resp);\n if (!data?.accessToken || !refreshToken) {\n throw new Error(\"Login response missing tokens\");\n }\n return { accessToken: data.accessToken, refreshToken };\n }\n\n private async refresh(refreshToken: string): Promise<{ accessToken: string; refreshToken: string; }> {\n const url = AuthClient.endpoint(this.restBase, \"auth/refresh\");\n let lastError: Error | undefined;\n for (const cookieName of [\"RefreshToken\", \"rt\"]) {\n const resp = await AuthClient.fetchWithTimeout(url, {\n method: \"POST\",\n headers: {\n \"Cookie\": `${cookieName}=${refreshToken}`,\n },\n }, 8_000);\n\n if (!resp.ok) {\n lastError = new Error(`Refresh failed: ${resp.status} ${resp.statusText}`);\n continue;\n }\n const data = (await resp.json()) as LoginResponse;\n const newRefreshToken = AuthClient.extractRefreshCookie(resp) || refreshToken;\n if (!data?.accessToken) throw new Error(\"Refresh response missing accessToken\");\n return { accessToken: data.accessToken, refreshToken: newRefreshToken };\n }\n\n throw lastError ?? new Error(\"Refresh failed.\");\n }\n\n private async persistTokens(accessToken: string, refreshToken: string): Promise<void> {\n await this.store.set(\"accessToken\", accessToken);\n await this.store.set(\"refreshToken\", refreshToken);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { AuthClient } from \"./auth-client.js\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { AuthClient } from \"./auth-client.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"secure-store.js","sourceRoot":"","sources":["../../../src/tools/auth/secure-store.ts"],"names":[],"mappings":"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","sourcesContent":["import os from \"os\";\r\nimport path from \"path\";\r\nimport fs from \"fs\";\r\n\r\n/**\r\n * Abstraction over secure storage for tokens.\r\n *\r\n * Prefers OS keychain via `keytar` if available at runtime.\r\n * Falls back to a local file store with restricted permissions.\r\n */\r\nexport interface ISecureStore {\r\n get(key: string): Promise<string | null>;\r\n set(key: string, value: string): Promise<void>;\r\n del(key: string): Promise<void>;\r\n}\r\n\r\n/**\r\n * Try to lazily import keytar without making it a hard dependency.\r\n */\r\nasync function tryLoadKeytar(): Promise<any | null> {\r\n try {\r\n // Avoid static import to prevent type resolution errors when not installed\r\n const dynamicImport = new Function(\"m\", \"return import(m)\") as (m: string) => Promise<any>;\r\n const mod = await dynamicImport(\"keytar\");\r\n return (mod && (mod.default || mod)) ?? null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nclass KeytarStore implements ISecureStore {\r\n private service: string;\r\n private keytar: any;\r\n constructor(service: string, keytar: any) {\r\n this.service = service;\r\n this.keytar = keytar;\r\n }\r\n async get(key: string): Promise<string | null> {\r\n return (await this.keytar.getPassword(this.service, key)) ?? null;\r\n }\r\n async set(key: string, value: string): Promise<void> {\r\n await this.keytar.setPassword(this.service, key, value);\r\n }\r\n async del(key: string): Promise<void> {\r\n await this.keytar.deletePassword(this.service, key);\r\n }\r\n}\r\n\r\nclass FileStore implements ISecureStore {\r\n private filePath: string;\r\n\r\n constructor(namespace: string) {\r\n const baseDir = FileStore.resolveBaseDir();\r\n const folder = path.join(baseDir, \"uns-auth\");\r\n if (!fs.existsSync(folder)) {\r\n fs.mkdirSync(folder, { recursive: true, mode: 0o700 });\r\n }\r\n this.filePath = path.join(folder, `${FileStore.sanitize(namespace)}.json`);\r\n if (!fs.existsSync(this.filePath)) {\r\n fs.writeFileSync(this.filePath, \"{}\", { mode: 0o600 });\r\n }\r\n try {\r\n // tighten permissions if possible (no-op on Windows)\r\n fs.chmodSync(this.filePath, 0o600);\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n\r\n private static resolveBaseDir(): string {\r\n if (process.platform === \"win32\") {\r\n return process.env.APPDATA || path.join(os.homedir(), \"AppData\", \"Roaming\");\r\n }\r\n // Linux and macOS default to XDG_CONFIG_HOME or ~/.config\r\n return process.env.XDG_CONFIG_HOME || path.join(os.homedir(), \".config\");\r\n }\r\n\r\n private static sanitize(name: string): string {\r\n return name.replace(/[^a-zA-Z0-9_.-]/g, \"_\");\r\n }\r\n\r\n private async load(): Promise<Record<string, string>> {\r\n try {\r\n const raw = await fs.promises.readFile(this.filePath, \"utf-8\");\r\n return JSON.parse(raw || \"{}\");\r\n } catch {\r\n return {};\r\n }\r\n }\r\n\r\n private async save(data: Record<string, string>): Promise<void> {\r\n const json = JSON.stringify(data, null, 2);\r\n await fs.promises.writeFile(this.filePath, json, { mode: 0o600 });\r\n try {\r\n fs.chmodSync(this.filePath, 0o600);\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n\r\n async get(key: string): Promise<string | null> {\r\n const data = await this.load();\r\n return data[key] ?? null;\r\n }\r\n\r\n async set(key: string, value: string): Promise<void> {\r\n const data = await this.load();\r\n data[key] = value;\r\n await this.save(data);\r\n }\r\n\r\n async del(key: string): Promise<void> {\r\n const data = await this.load();\r\n delete data[key];\r\n await this.save(data);\r\n }\r\n}\r\n\r\nexport class SecureStoreFactory {\r\n /**\r\n * Creates a secure store for a namespace. Tries keytar first; falls back to file store.\r\n */\r\n static async create(namespace: string): Promise<ISecureStore> {\r\n const keytar = await tryLoadKeytar();\r\n if (keytar) {\r\n return new KeytarStore(namespace, keytar);\r\n }\r\n return new FileStore(namespace);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"secure-store.js","sourceRoot":"","sources":["../../../src/tools/auth/secure-store.ts"],"names":[],"mappings":"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","sourcesContent":["import os from \"os\";\nimport path from \"path\";\nimport fs from \"fs\";\n\n/**\n * Abstraction over secure storage for tokens.\n *\n * Prefers OS keychain via `keytar` if available at runtime.\n * Falls back to a local file store with restricted permissions.\n */\nexport interface ISecureStore {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n del(key: string): Promise<void>;\n}\n\n/**\n * Try to lazily import keytar without making it a hard dependency.\n */\nasync function tryLoadKeytar(): Promise<any | null> {\n try {\n // Avoid static import to prevent type resolution errors when not installed\n const dynamicImport = new Function(\"m\", \"return import(m)\") as (m: string) => Promise<any>;\n const mod = await dynamicImport(\"keytar\");\n return (mod && (mod.default || mod)) ?? null;\n } catch {\n return null;\n }\n}\n\nclass KeytarStore implements ISecureStore {\n private service: string;\n private keytar: any;\n constructor(service: string, keytar: any) {\n this.service = service;\n this.keytar = keytar;\n }\n async get(key: string): Promise<string | null> {\n return (await this.keytar.getPassword(this.service, key)) ?? null;\n }\n async set(key: string, value: string): Promise<void> {\n await this.keytar.setPassword(this.service, key, value);\n }\n async del(key: string): Promise<void> {\n await this.keytar.deletePassword(this.service, key);\n }\n}\n\nclass FileStore implements ISecureStore {\n private filePath: string;\n\n constructor(namespace: string) {\n const baseDir = FileStore.resolveBaseDir();\n const folder = path.join(baseDir, \"uns-auth\");\n if (!fs.existsSync(folder)) {\n fs.mkdirSync(folder, { recursive: true, mode: 0o700 });\n }\n this.filePath = path.join(folder, `${FileStore.sanitize(namespace)}.json`);\n if (!fs.existsSync(this.filePath)) {\n fs.writeFileSync(this.filePath, \"{}\", { mode: 0o600 });\n }\n try {\n // tighten permissions if possible (no-op on Windows)\n fs.chmodSync(this.filePath, 0o600);\n } catch {\n // ignore\n }\n }\n\n private static resolveBaseDir(): string {\n if (process.platform === \"win32\") {\n return process.env.APPDATA || path.join(os.homedir(), \"AppData\", \"Roaming\");\n }\n // Linux and macOS default to XDG_CONFIG_HOME or ~/.config\n return process.env.XDG_CONFIG_HOME || path.join(os.homedir(), \".config\");\n }\n\n private static sanitize(name: string): string {\n return name.replace(/[^a-zA-Z0-9_.-]/g, \"_\");\n }\n\n private async load(): Promise<Record<string, string>> {\n try {\n const raw = await fs.promises.readFile(this.filePath, \"utf-8\");\n return JSON.parse(raw || \"{}\");\n } catch {\n return {};\n }\n }\n\n private async save(data: Record<string, string>): Promise<void> {\n const json = JSON.stringify(data, null, 2);\n await fs.promises.writeFile(this.filePath, json, { mode: 0o600 });\n try {\n fs.chmodSync(this.filePath, 0o600);\n } catch {\n // ignore\n }\n }\n\n async get(key: string): Promise<string | null> {\n const data = await this.load();\n return data[key] ?? null;\n }\n\n async set(key: string, value: string): Promise<void> {\n const data = await this.load();\n data[key] = value;\n await this.save(data);\n }\n\n async del(key: string): Promise<void> {\n const data = await this.load();\n delete data[key];\n await this.save(data);\n }\n}\n\nexport class SecureStoreFactory {\n /**\n * Creates a secure store for a namespace. Tries keytar first; falls back to file store.\n */\n static async create(namespace: string): Promise<ISecureStore> {\n const keytar = await tryLoadKeytar();\n if (keytar) {\n return new KeytarStore(namespace, keytar);\n }\n return new FileStore(namespace);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"base-path.js","sourceRoot":"","sources":["../../src/tools/base-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,CAAC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC","sourcesContent":["import { resolveBasePath } from \"../base-path.js\";\r\n\r\nexport const basePath = resolveBasePath();\r\n"]}
1
+ {"version":3,"file":"base-path.js","sourceRoot":"","sources":["../../src/tools/base-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,CAAC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC","sourcesContent":["import { resolveBasePath } from \"../base-path.js\";\n\nexport const basePath = resolveBasePath();\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"datahub-client.js","sourceRoot":"","sources":["../../../src/tools/datahub/datahub-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { AuthClient } from \"../auth/auth-client.js\";\r\n\r\nexport type LastValuePayload = {\n topic: string;\n value: unknown;\n values?: Record<string, unknown> | null;\n uom?: string | null;\r\n timestamp?: string | null;\r\n dataGroup?: string | null;\r\n ageMs?: number | null;\r\n source: string;\n};\n\nexport type CatchAllTimeField = \"auto\" | \"timestamp\" | \"interval\";\nexport type CatchAllAggregate = \"avg\" | \"min\" | \"max\" | \"last\" | \"sum\" | \"count\";\n\nexport type RangeQueryOptions = {\n table?: string;\n from?: string;\n to?: string;\n timeField?: CatchAllTimeField;\n limit?: number;\n maxPoints?: number;\n bucketMs?: number;\n aggregate?: CatchAllAggregate;\n column?: string;\n summaryOnly?: boolean;\n dedupe?: boolean;\n};\n\nexport type RangeColumn = {\n name: string;\n type?: string;\n};\n\nexport type RangeStats = Record<string, unknown> & {\n raw?: {\n columns?: RangeColumn[];\n };\n};\n\nexport type RangePayload<Row extends unknown[] = unknown[]> = {\n data: Row[];\n stats?: RangeStats | null;\n};\n\nexport type BatchRangeTopicPayload<Row extends unknown[] = unknown[]> = {\n topic: string;\n error?: string | null;\n data: Row[];\n stats?: RangeStats | null;\n};\n\nexport type BatchRangeResponsePayload<Row extends unknown[] = unknown[]> = {\n results: BatchRangeTopicPayload<Row>[];\n stats?: Record<string, unknown> | null;\n};\n\nexport class RangeResult<Row extends unknown[] = unknown[]> {\n readonly data: Row[];\n readonly stats?: RangeStats | null;\n\n constructor(payload: RangePayload<Row>) {\n this.data = payload.data;\n this.stats = payload.stats ?? null;\n }\n\n static fromMapping<Row extends unknown[] = unknown[]>(value: Record<string, unknown>): RangeResult<Row> {\n return new RangeResult<Row>({\n data: Array.isArray(value.data) ? (value.data.filter(Array.isArray) as Row[]) : [],\n stats: value.stats && typeof value.stats === \"object\" && !Array.isArray(value.stats) ? (value.stats as RangeStats) : null,\n });\n }\n\n get columns(): RangeColumn[] {\n const columns = this.stats?.raw?.columns;\n return Array.isArray(columns) ? columns : [];\n }\n\n toRecords(): Array<Record<string, unknown>> {\n const columns = this.columns;\n if (!columns.length) {\n return this.data.map((row) => Object.fromEntries(row.map((value, index) => [String(index), value])));\n }\n return this.data.map((row) =>\n Object.fromEntries(row.map((value, index) => [columns[index]?.name ?? String(index), value])),\n );\n }\n\n toObject(): RangePayload<Row> {\n return {\n data: this.data,\n stats: this.stats ?? null,\n };\n }\n}\n\nexport class BatchRangeTopicResult<Row extends unknown[] = unknown[]> extends RangeResult<Row> {\n readonly topic: string;\n readonly error?: string | null;\n\n constructor(payload: BatchRangeTopicPayload<Row>) {\n super({\n data: payload.data ?? [],\n stats: payload.stats ?? null,\n });\n this.topic = payload.topic;\n this.error = payload.error ?? null;\n }\n\n static fromMapping<Row extends unknown[] = unknown[]>(value: Record<string, unknown>): BatchRangeTopicResult<Row> {\n return new BatchRangeTopicResult<Row>({\n topic: typeof value.topic === \"string\" ? value.topic : \"\",\n error: typeof value.error === \"string\" ? value.error : null,\n data: Array.isArray(value.data) ? (value.data.filter(Array.isArray) as Row[]) : [],\n stats: value.stats && typeof value.stats === \"object\" && !Array.isArray(value.stats) ? (value.stats as RangeStats) : null,\n });\n }\n\n override toObject(): BatchRangeTopicPayload<Row> {\n return {\n topic: this.topic,\n error: this.error ?? null,\n data: this.data,\n stats: this.stats ?? null,\n };\n }\n}\n\nexport class BatchRangeResponse<Row extends unknown[] = unknown[]> {\n readonly results: BatchRangeTopicResult<Row>[];\n readonly stats?: Record<string, unknown> | null;\n\n constructor(payload: BatchRangeResponsePayload<Row>) {\n this.results = payload.results.map((item) => new BatchRangeTopicResult<Row>(item));\n this.stats = payload.stats ?? null;\n }\n\n static fromMapping<Row extends unknown[] = unknown[]>(value: Record<string, unknown>): BatchRangeResponse<Row> {\n const rawResults = Array.isArray(value.results)\n ? value.results.filter((item): item is Record<string, unknown> => !!item && typeof item === \"object\" && !Array.isArray(item))\n : [];\n return new BatchRangeResponse<Row>({\n results: rawResults.map((item) => BatchRangeTopicResult.fromMapping<Row>(item).toObject()),\n stats: value.stats && typeof value.stats === \"object\" && !Array.isArray(value.stats) ? (value.stats as Record<string, unknown>) : null,\n });\n }\n\n get byTopic(): Record<string, BatchRangeTopicPayload<Row>> {\n return Object.fromEntries(this.results.map((result) => [result.topic, result.toObject()]));\n }\n\n toObject(): BatchRangeResponsePayload<Row> {\n return {\n results: this.results.map((result) => result.toObject()),\n stats: this.stats ?? null,\n };\n }\n}\n\r\nexport class LastValueResult {\r\n readonly topic: string;\r\n readonly value: unknown;\r\n readonly values?: Record<string, unknown> | null;\r\n readonly uom?: string | null;\r\n readonly timestamp?: string | null;\r\n readonly dataGroup?: string | null;\r\n readonly ageMs?: number | null;\r\n readonly source: string;\r\n\r\n constructor(payload: LastValuePayload) {\r\n this.topic = payload.topic;\r\n this.value = payload.value;\r\n this.values = payload.values ?? null;\r\n this.uom = payload.uom ?? null;\r\n this.timestamp = payload.timestamp ?? null;\r\n this.dataGroup = payload.dataGroup ?? null;\r\n this.ageMs = payload.ageMs ?? null;\r\n this.source = payload.source;\r\n }\r\n\r\n static fromMapping(value: Record<string, unknown>): LastValueResult {\r\n const rawValues = value.values;\r\n return new LastValueResult({\r\n topic: typeof value.topic === \"string\" ? value.topic : \"\",\r\n value: value.value,\r\n values: rawValues && typeof rawValues === \"object\" && !Array.isArray(rawValues) ? (rawValues as Record<string, unknown>) : null,\r\n uom: typeof value.uom === \"string\" ? value.uom : null,\r\n timestamp: typeof value.timestamp === \"string\" ? value.timestamp : null,\r\n dataGroup: typeof value.dataGroup === \"string\" ? value.dataGroup : null,\r\n ageMs: typeof value.ageMs === \"number\" ? value.ageMs : null,\r\n source: typeof value.source === \"string\" ? value.source : \"miss\",\r\n });\r\n }\r\n\r\n get hit(): boolean {\r\n return this.source === \"cache\";\r\n }\r\n\r\n toObject(): LastValuePayload {\r\n return {\r\n topic: this.topic,\r\n value: this.value,\r\n values: this.values ?? null,\r\n uom: this.uom ?? null,\r\n timestamp: this.timestamp ?? null,\r\n dataGroup: this.dataGroup ?? null,\r\n ageMs: this.ageMs ?? null,\r\n source: this.source,\r\n };\r\n }\r\n}\r\n\r\nexport class ClientError extends Error {\r\n readonly statusCode?: number;\r\n\r\n constructor(message: string, statusCode?: number) {\r\n super(message);\r\n this.statusCode = statusCode;\r\n }\r\n}\r\n\r\nexport type UnsClientOptions = {\n apiBasePath?: string;\r\n token?: string;\r\n timeoutMs?: number;\r\n authClient?: AuthClient;\r\n};\n\nexport type RequestOptions = {\n baseUrl?: string;\n authorize?: boolean;\n};\n\nexport class UnsClient {\n private readonly apiBasePath: string;\r\n private readonly baseUrl: string;\r\n private readonly apiUrl: string;\r\n private readonly timeoutMs: number;\r\n private readonly authClient?: AuthClient;\r\n private manualAccessToken?: string;\n\r\n constructor(baseUrl: string, options: UnsClientOptions = {}) {\r\n const apiBasePath = UnsClient.normalizeBasePath(options.apiBasePath ?? \"/api\");\r\n const strippedBase = baseUrl.replace(/\\/$/, \"\");\r\n if (apiBasePath && strippedBase.endsWith(apiBasePath)) {\r\n this.apiUrl = strippedBase;\r\n this.baseUrl = strippedBase.slice(0, -apiBasePath.length).replace(/\\/$/, \"\");\r\n } else {\r\n this.baseUrl = strippedBase;\r\n this.apiUrl = `${strippedBase}${apiBasePath}`;\r\n }\r\n this.apiBasePath = apiBasePath;\r\n this.timeoutMs = options.timeoutMs ?? 10_000;\r\n this.authClient = options.authClient;\r\n this.manualAccessToken = options.token;\n }\r\n\r\n setToken(token?: string): void {\r\n this.manualAccessToken = token;\n }\r\n\r\n async ensureToken(): Promise<string | undefined> {\r\n if (this.manualAccessToken) return this.manualAccessToken;\n if (!this.authClient) return undefined;\n return this.authClient.getAccessToken();\n }\n\r\n async get(endpoint: string, params?: Record<string, string | number | boolean>, options: RequestOptions = {}): Promise<Response> {\n const authorize = options.authorize ?? true;\n const token = authorize ? await this.ensureToken() : undefined;\n const search = params ? `?${new URLSearchParams(this.stringifyQueryParams(params))}` : \"\";\n return this.request(\"GET\", `${this.buildUrl(endpoint, options.baseUrl)}${search}`, undefined, token);\n }\n\n async getData(\n endpoint: string,\n params?: Record<string, string | number | boolean>,\n options: RequestOptions = {},\n ): Promise<Response> {\n return this.get(endpoint, params, options);\n }\n\n async post(endpoint: string, body?: Record<string, unknown>, options: RequestOptions = {}): Promise<Record<string, unknown>> {\n const authorize = options.authorize ?? true;\n const token = authorize ? await this.ensureToken() : undefined;\n return this.requestJson(\"POST\", this.buildUrl(endpoint, options.baseUrl), body ?? {}, token);\n }\r\n\r\n async lastValue(topics: string | string[], options: { token?: string } = {}): Promise<Record<string, LastValuePayload> | null> {\n const topicList = Array.isArray(topics) ? topics : [topics];\r\n if (!topicList.length) {\r\n throw new Error(\"topics must contain at least one topic.\");\r\n }\r\n if (topicList.length > 500) {\r\n throw new Error(\"Maximum 500 topics per request.\");\r\n }\n const token = options.token ?? (await this.ensureToken());\n try {\n const payload = await this.requestJson(\"POST\", this.buildUrl(\"catchall/batch/last\"), { topics: topicList }, token);\n const rawResults = payload.results;\n if (!Array.isArray(rawResults)) {\n throw new ClientError(\"Last-value response did not include a results array.\");\n }\r\n const results = rawResults\r\n .filter((item): item is Record<string, unknown> => !!item && typeof item === \"object\" && !Array.isArray(item))\r\n .map((item) => LastValueResult.fromMapping(item));\r\n return Object.fromEntries(results.map((result) => [result.topic, result.toObject()]));\r\n } catch (error) {\r\n if (error instanceof ClientError && error.statusCode === 404) {\r\n return null;\r\n }\n throw error;\n }\n }\n\n async getAttributeData<Row extends unknown[] = unknown[]>(\n topicPath: string,\n options: RangeQueryOptions & { token?: string } = {},\n ): Promise<RangeResult<Row> | null> {\n const token = options.token ?? (await this.ensureToken());\n const { token: _token, ...query } = options;\n try {\n const payload = await this.requestJson(\n \"GET\",\n this.buildUrl(`catchall/${encodeURIComponent(topicPath)}`) + this.buildQuerySuffix(query),\n undefined,\n token,\n );\n return RangeResult.fromMapping<Row>(payload);\n } catch (error) {\n if (error instanceof ClientError && error.statusCode === 404) {\n return null;\n }\n throw error;\n }\n }\n\n async history<Row extends unknown[] = unknown[]>(\n topics: string | string[],\n options: RangeQueryOptions & { token?: string } = {},\n ): Promise<BatchRangeResponse<Row> | null> {\n const topicList = Array.isArray(topics) ? topics : [topics];\n if (!topicList.length) {\n throw new Error(\"topics must contain at least one topic.\");\n }\n if (topicList.length > 500) {\n throw new Error(\"Maximum 500 topics per request.\");\n }\n const token = options.token ?? (await this.ensureToken());\n const { token: _token, ...body } = options;\n try {\n const payload = await this.requestJson(\n \"POST\",\n this.buildUrl(\"catchall/batch/range\"),\n { topics: topicList, ...body },\n token,\n );\n const rawResults = payload.results;\n if (!Array.isArray(rawResults)) {\n throw new ClientError(\"Batch-range response did not include a results array.\");\n }\n return BatchRangeResponse.fromMapping<Row>(payload);\n } catch (error) {\n if (error instanceof ClientError && error.statusCode === 404) {\n return null;\n }\n throw error;\n }\n }\n\n private async requestJson(\n method: \"GET\" | \"POST\",\n url: string,\n body?: Record<string, unknown>,\n token?: string,\n ): Promise<Record<string, unknown>> {\n try {\n const resp = await this.request(method, url, body, token);\n const text = await resp.text();\n if (!text) return {};\n const parsed = JSON.parse(text);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new ClientError(\"UNS response must be a JSON object.\");\r\n }\r\n return parsed as Record<string, unknown>;\r\n } catch (error: any) {\r\n if (error instanceof ClientError) {\r\n throw error;\r\n }\r\n if (error?.name === \"AbortError\") {\n throw new ClientError(\"UNS request timed out.\");\n }\n throw new ClientError(`UNS request failed: ${error?.message ?? String(error)}`);\n }\n }\n\n private async request(\n method: \"GET\" | \"POST\",\n url: string,\n body?: Record<string, unknown>,\n token?: string,\n ): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const resp = await fetch(url, {\n method,\n headers: {\n \"Accept\": \"*/*\",\n ...(body ? { \"Content-Type\": \"application/json\" } : {}),\n ...(token ? { \"Authorization\": `Bearer ${token}` } : {}),\n },\n ...(body ? { body: JSON.stringify(body) } : {}),\n signal: controller.signal,\n });\n if (!resp.ok) {\n const text = await resp.text();\n throw new ClientError(\n `UNS request failed with HTTP ${resp.status}: ${text || resp.statusText}`,\n resp.status,\n );\n }\n return resp;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private buildUrl(endpoint: string, baseUrl?: string): string {\n if (endpoint.startsWith(\"http://\") || endpoint.startsWith(\"https://\")) {\r\n return endpoint;\r\n }\r\n const root = (baseUrl ?? this.apiUrl).replace(/\\/$/, \"\");\r\n let path = endpoint.startsWith(\"/\") ? endpoint : `/${endpoint}`;\r\n if (!baseUrl && this.apiBasePath && (path === this.apiBasePath || path.startsWith(`${this.apiBasePath}/`))) {\r\n path = path.slice(this.apiBasePath.length) || \"/\";\r\n }\r\n return `${root}${path}`;\r\n }\r\n\r\n private stringifyQueryParams(params: Record<string, string | number | boolean>): Record<string, string> {\n return Object.fromEntries(Object.entries(params).map(([key, value]) => [key, String(value)]));\n }\n\n private buildQuerySuffix(params: Record<string, unknown>): string {\n const filteredEntries = Object.entries(params).filter(([, value]) => value !== undefined && value !== null);\n if (!filteredEntries.length) {\n return \"\";\n }\n const search = new URLSearchParams(\n Object.fromEntries(filteredEntries.map(([key, value]) => [key, String(value)])),\n );\n return `?${search.toString()}`;\n }\n\r\n private static normalizeBasePath(value: string): string {\r\n const stripped = value.trim();\r\n if (!stripped) return \"\";\r\n return stripped.startsWith(\"/\") ? stripped : `/${stripped}`;\r\n }\r\n}\r\n\r\n"]}
1
+ {"version":3,"file":"datahub-client.js","sourceRoot":"","sources":["../../../src/tools/datahub/datahub-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { AuthClient } from \"../auth/auth-client.js\";\n\nexport type LastValuePayload = {\n topic: string;\n value: unknown;\n values?: Record<string, unknown> | null;\n uom?: string | null;\n timestamp?: string | null;\n dataGroup?: string | null;\n ageMs?: number | null;\n source: string;\n};\n\nexport type CatchAllTimeField = \"auto\" | \"timestamp\" | \"interval\";\nexport type CatchAllAggregate = \"avg\" | \"min\" | \"max\" | \"last\" | \"sum\" | \"count\";\n\nexport type RangeQueryOptions = {\n table?: string;\n from?: string;\n to?: string;\n timeField?: CatchAllTimeField;\n limit?: number;\n maxPoints?: number;\n bucketMs?: number;\n aggregate?: CatchAllAggregate;\n column?: string;\n summaryOnly?: boolean;\n dedupe?: boolean;\n};\n\nexport type RangeColumn = {\n name: string;\n type?: string;\n};\n\nexport type RangeStats = Record<string, unknown> & {\n raw?: {\n columns?: RangeColumn[];\n };\n};\n\nexport type RangePayload<Row extends unknown[] = unknown[]> = {\n data: Row[];\n stats?: RangeStats | null;\n};\n\nexport type BatchRangeTopicPayload<Row extends unknown[] = unknown[]> = {\n topic: string;\n error?: string | null;\n data: Row[];\n stats?: RangeStats | null;\n};\n\nexport type BatchRangeResponsePayload<Row extends unknown[] = unknown[]> = {\n results: BatchRangeTopicPayload<Row>[];\n stats?: Record<string, unknown> | null;\n};\n\nexport class RangeResult<Row extends unknown[] = unknown[]> {\n readonly data: Row[];\n readonly stats?: RangeStats | null;\n\n constructor(payload: RangePayload<Row>) {\n this.data = payload.data;\n this.stats = payload.stats ?? null;\n }\n\n static fromMapping<Row extends unknown[] = unknown[]>(value: Record<string, unknown>): RangeResult<Row> {\n return new RangeResult<Row>({\n data: Array.isArray(value.data) ? (value.data.filter(Array.isArray) as Row[]) : [],\n stats: value.stats && typeof value.stats === \"object\" && !Array.isArray(value.stats) ? (value.stats as RangeStats) : null,\n });\n }\n\n get columns(): RangeColumn[] {\n const columns = this.stats?.raw?.columns;\n return Array.isArray(columns) ? columns : [];\n }\n\n toRecords(): Array<Record<string, unknown>> {\n const columns = this.columns;\n if (!columns.length) {\n return this.data.map((row) => Object.fromEntries(row.map((value, index) => [String(index), value])));\n }\n return this.data.map((row) =>\n Object.fromEntries(row.map((value, index) => [columns[index]?.name ?? String(index), value])),\n );\n }\n\n toObject(): RangePayload<Row> {\n return {\n data: this.data,\n stats: this.stats ?? null,\n };\n }\n}\n\nexport class BatchRangeTopicResult<Row extends unknown[] = unknown[]> extends RangeResult<Row> {\n readonly topic: string;\n readonly error?: string | null;\n\n constructor(payload: BatchRangeTopicPayload<Row>) {\n super({\n data: payload.data ?? [],\n stats: payload.stats ?? null,\n });\n this.topic = payload.topic;\n this.error = payload.error ?? null;\n }\n\n static fromMapping<Row extends unknown[] = unknown[]>(value: Record<string, unknown>): BatchRangeTopicResult<Row> {\n return new BatchRangeTopicResult<Row>({\n topic: typeof value.topic === \"string\" ? value.topic : \"\",\n error: typeof value.error === \"string\" ? value.error : null,\n data: Array.isArray(value.data) ? (value.data.filter(Array.isArray) as Row[]) : [],\n stats: value.stats && typeof value.stats === \"object\" && !Array.isArray(value.stats) ? (value.stats as RangeStats) : null,\n });\n }\n\n override toObject(): BatchRangeTopicPayload<Row> {\n return {\n topic: this.topic,\n error: this.error ?? null,\n data: this.data,\n stats: this.stats ?? null,\n };\n }\n}\n\nexport class BatchRangeResponse<Row extends unknown[] = unknown[]> {\n readonly results: BatchRangeTopicResult<Row>[];\n readonly stats?: Record<string, unknown> | null;\n\n constructor(payload: BatchRangeResponsePayload<Row>) {\n this.results = payload.results.map((item) => new BatchRangeTopicResult<Row>(item));\n this.stats = payload.stats ?? null;\n }\n\n static fromMapping<Row extends unknown[] = unknown[]>(value: Record<string, unknown>): BatchRangeResponse<Row> {\n const rawResults = Array.isArray(value.results)\n ? value.results.filter((item): item is Record<string, unknown> => !!item && typeof item === \"object\" && !Array.isArray(item))\n : [];\n return new BatchRangeResponse<Row>({\n results: rawResults.map((item) => BatchRangeTopicResult.fromMapping<Row>(item).toObject()),\n stats: value.stats && typeof value.stats === \"object\" && !Array.isArray(value.stats) ? (value.stats as Record<string, unknown>) : null,\n });\n }\n\n get byTopic(): Record<string, BatchRangeTopicPayload<Row>> {\n return Object.fromEntries(this.results.map((result) => [result.topic, result.toObject()]));\n }\n\n toObject(): BatchRangeResponsePayload<Row> {\n return {\n results: this.results.map((result) => result.toObject()),\n stats: this.stats ?? null,\n };\n }\n}\n\nexport class LastValueResult {\n readonly topic: string;\n readonly value: unknown;\n readonly values?: Record<string, unknown> | null;\n readonly uom?: string | null;\n readonly timestamp?: string | null;\n readonly dataGroup?: string | null;\n readonly ageMs?: number | null;\n readonly source: string;\n\n constructor(payload: LastValuePayload) {\n this.topic = payload.topic;\n this.value = payload.value;\n this.values = payload.values ?? null;\n this.uom = payload.uom ?? null;\n this.timestamp = payload.timestamp ?? null;\n this.dataGroup = payload.dataGroup ?? null;\n this.ageMs = payload.ageMs ?? null;\n this.source = payload.source;\n }\n\n static fromMapping(value: Record<string, unknown>): LastValueResult {\n const rawValues = value.values;\n return new LastValueResult({\n topic: typeof value.topic === \"string\" ? value.topic : \"\",\n value: value.value,\n values: rawValues && typeof rawValues === \"object\" && !Array.isArray(rawValues) ? (rawValues as Record<string, unknown>) : null,\n uom: typeof value.uom === \"string\" ? value.uom : null,\n timestamp: typeof value.timestamp === \"string\" ? value.timestamp : null,\n dataGroup: typeof value.dataGroup === \"string\" ? value.dataGroup : null,\n ageMs: typeof value.ageMs === \"number\" ? value.ageMs : null,\n source: typeof value.source === \"string\" ? value.source : \"miss\",\n });\n }\n\n get hit(): boolean {\n return this.source === \"cache\";\n }\n\n toObject(): LastValuePayload {\n return {\n topic: this.topic,\n value: this.value,\n values: this.values ?? null,\n uom: this.uom ?? null,\n timestamp: this.timestamp ?? null,\n dataGroup: this.dataGroup ?? null,\n ageMs: this.ageMs ?? null,\n source: this.source,\n };\n }\n}\n\nexport class ClientError extends Error {\n readonly statusCode?: number;\n\n constructor(message: string, statusCode?: number) {\n super(message);\n this.statusCode = statusCode;\n }\n}\n\nexport type UnsClientOptions = {\n apiBasePath?: string;\n token?: string;\n timeoutMs?: number;\n authClient?: AuthClient;\n};\n\nexport type RequestOptions = {\n baseUrl?: string;\n authorize?: boolean;\n};\n\nexport class UnsClient {\n private readonly apiBasePath: string;\n private readonly baseUrl: string;\n private readonly apiUrl: string;\n private readonly timeoutMs: number;\n private readonly authClient?: AuthClient;\n private manualAccessToken?: string;\n\n constructor(baseUrl: string, options: UnsClientOptions = {}) {\n const apiBasePath = UnsClient.normalizeBasePath(options.apiBasePath ?? \"/api\");\n const strippedBase = baseUrl.replace(/\\/$/, \"\");\n if (apiBasePath && strippedBase.endsWith(apiBasePath)) {\n this.apiUrl = strippedBase;\n this.baseUrl = strippedBase.slice(0, -apiBasePath.length).replace(/\\/$/, \"\");\n } else {\n this.baseUrl = strippedBase;\n this.apiUrl = `${strippedBase}${apiBasePath}`;\n }\n this.apiBasePath = apiBasePath;\n this.timeoutMs = options.timeoutMs ?? 10_000;\n this.authClient = options.authClient;\n this.manualAccessToken = options.token;\n }\n\n setToken(token?: string): void {\n this.manualAccessToken = token;\n }\n\n async ensureToken(): Promise<string | undefined> {\n if (this.manualAccessToken) return this.manualAccessToken;\n if (!this.authClient) return undefined;\n return this.authClient.getAccessToken();\n }\n\n async get(endpoint: string, params?: Record<string, string | number | boolean>, options: RequestOptions = {}): Promise<Response> {\n const authorize = options.authorize ?? true;\n const token = authorize ? await this.ensureToken() : undefined;\n const search = params ? `?${new URLSearchParams(this.stringifyQueryParams(params))}` : \"\";\n return this.request(\"GET\", `${this.buildUrl(endpoint, options.baseUrl)}${search}`, undefined, token);\n }\n\n async getData(\n endpoint: string,\n params?: Record<string, string | number | boolean>,\n options: RequestOptions = {},\n ): Promise<Response> {\n return this.get(endpoint, params, options);\n }\n\n async post(endpoint: string, body?: Record<string, unknown>, options: RequestOptions = {}): Promise<Record<string, unknown>> {\n const authorize = options.authorize ?? true;\n const token = authorize ? await this.ensureToken() : undefined;\n return this.requestJson(\"POST\", this.buildUrl(endpoint, options.baseUrl), body ?? {}, token);\n }\n\n async lastValue(topics: string | string[], options: { token?: string } = {}): Promise<Record<string, LastValuePayload> | null> {\n const topicList = Array.isArray(topics) ? topics : [topics];\n if (!topicList.length) {\n throw new Error(\"topics must contain at least one topic.\");\n }\n if (topicList.length > 500) {\n throw new Error(\"Maximum 500 topics per request.\");\n }\n const token = options.token ?? (await this.ensureToken());\n try {\n const payload = await this.requestJson(\"POST\", this.buildUrl(\"catchall/batch/last\"), { topics: topicList }, token);\n const rawResults = payload.results;\n if (!Array.isArray(rawResults)) {\n throw new ClientError(\"Last-value response did not include a results array.\");\n }\n const results = rawResults\n .filter((item): item is Record<string, unknown> => !!item && typeof item === \"object\" && !Array.isArray(item))\n .map((item) => LastValueResult.fromMapping(item));\n return Object.fromEntries(results.map((result) => [result.topic, result.toObject()]));\n } catch (error) {\n if (error instanceof ClientError && error.statusCode === 404) {\n return null;\n }\n throw error;\n }\n }\n\n async getAttributeData<Row extends unknown[] = unknown[]>(\n topicPath: string,\n options: RangeQueryOptions & { token?: string } = {},\n ): Promise<RangeResult<Row> | null> {\n const token = options.token ?? (await this.ensureToken());\n const { token: _token, ...query } = options;\n try {\n const payload = await this.requestJson(\n \"GET\",\n this.buildUrl(`catchall/${encodeURIComponent(topicPath)}`) + this.buildQuerySuffix(query),\n undefined,\n token,\n );\n return RangeResult.fromMapping<Row>(payload);\n } catch (error) {\n if (error instanceof ClientError && error.statusCode === 404) {\n return null;\n }\n throw error;\n }\n }\n\n async history<Row extends unknown[] = unknown[]>(\n topics: string | string[],\n options: RangeQueryOptions & { token?: string } = {},\n ): Promise<BatchRangeResponse<Row> | null> {\n const topicList = Array.isArray(topics) ? topics : [topics];\n if (!topicList.length) {\n throw new Error(\"topics must contain at least one topic.\");\n }\n if (topicList.length > 500) {\n throw new Error(\"Maximum 500 topics per request.\");\n }\n const token = options.token ?? (await this.ensureToken());\n const { token: _token, ...body } = options;\n try {\n const payload = await this.requestJson(\n \"POST\",\n this.buildUrl(\"catchall/batch/range\"),\n { topics: topicList, ...body },\n token,\n );\n const rawResults = payload.results;\n if (!Array.isArray(rawResults)) {\n throw new ClientError(\"Batch-range response did not include a results array.\");\n }\n return BatchRangeResponse.fromMapping<Row>(payload);\n } catch (error) {\n if (error instanceof ClientError && error.statusCode === 404) {\n return null;\n }\n throw error;\n }\n }\n\n private async requestJson(\n method: \"GET\" | \"POST\",\n url: string,\n body?: Record<string, unknown>,\n token?: string,\n ): Promise<Record<string, unknown>> {\n try {\n const resp = await this.request(method, url, body, token);\n const text = await resp.text();\n if (!text) return {};\n const parsed = JSON.parse(text);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new ClientError(\"UNS response must be a JSON object.\");\n }\n return parsed as Record<string, unknown>;\n } catch (error: any) {\n if (error instanceof ClientError) {\n throw error;\n }\n if (error?.name === \"AbortError\") {\n throw new ClientError(\"UNS request timed out.\");\n }\n throw new ClientError(`UNS request failed: ${error?.message ?? String(error)}`);\n }\n }\n\n private async request(\n method: \"GET\" | \"POST\",\n url: string,\n body?: Record<string, unknown>,\n token?: string,\n ): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const resp = await fetch(url, {\n method,\n headers: {\n \"Accept\": \"*/*\",\n ...(body ? { \"Content-Type\": \"application/json\" } : {}),\n ...(token ? { \"Authorization\": `Bearer ${token}` } : {}),\n },\n ...(body ? { body: JSON.stringify(body) } : {}),\n signal: controller.signal,\n });\n if (!resp.ok) {\n const text = await resp.text();\n throw new ClientError(\n `UNS request failed with HTTP ${resp.status}: ${text || resp.statusText}`,\n resp.status,\n );\n }\n return resp;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private buildUrl(endpoint: string, baseUrl?: string): string {\n if (endpoint.startsWith(\"http://\") || endpoint.startsWith(\"https://\")) {\n return endpoint;\n }\n const root = (baseUrl ?? this.apiUrl).replace(/\\/$/, \"\");\n let path = endpoint.startsWith(\"/\") ? endpoint : `/${endpoint}`;\n if (!baseUrl && this.apiBasePath && (path === this.apiBasePath || path.startsWith(`${this.apiBasePath}/`))) {\n path = path.slice(this.apiBasePath.length) || \"/\";\n }\n return `${root}${path}`;\n }\n\n private stringifyQueryParams(params: Record<string, string | number | boolean>): Record<string, string> {\n return Object.fromEntries(Object.entries(params).map(([key, value]) => [key, String(value)]));\n }\n\n private buildQuerySuffix(params: Record<string, unknown>): string {\n const filteredEntries = Object.entries(params).filter(([, value]) => value !== undefined && value !== null);\n if (!filteredEntries.length) {\n return \"\";\n }\n const search = new URLSearchParams(\n Object.fromEntries(filteredEntries.map(([key, value]) => [key, String(value)])),\n );\n return `?${search.toString()}`;\n }\n\n private static normalizeBasePath(value: string): string {\n const stripped = value.trim();\n if (!stripped) return \"\";\n return stripped.startsWith(\"/\") ? stripped : `/${stripped}`;\n }\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/tools/file-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IACzD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IAE3D,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAgB,EAAE,OAAe;IAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAEzD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nexport async function readTextFileIfExists(filePath: string): Promise<string | undefined> {\r\n const absolutePath = path.resolve(process.cwd(), filePath);\r\n\r\n try {\r\n return await readFile(absolutePath, \"utf8\");\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return undefined;\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function writeTextFileIfChanged(filePath: string, content: string): Promise<boolean> {\r\n const absolutePath = path.resolve(process.cwd(), filePath);\r\n const current = await readTextFileIfExists(absolutePath);\r\n\r\n if (current === content) {\r\n return false;\r\n }\r\n\r\n await mkdir(path.dirname(absolutePath), { recursive: true });\r\n await writeFile(absolutePath, content, \"utf8\");\r\n return true;\r\n}\r\n"]}
1
+ {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/tools/file-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IACzD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IAE3D,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAgB,EAAE,OAAe;IAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAEzD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function readTextFileIfExists(filePath: string): Promise<string | undefined> {\n const absolutePath = path.resolve(process.cwd(), filePath);\n\n try {\n return await readFile(absolutePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function writeTextFileIfChanged(filePath: string, content: string): Promise<boolean> {\n const absolutePath = path.resolve(process.cwd(), filePath);\n const current = await readTextFileIfExists(absolutePath);\n\n if (current === content) {\n return false;\n }\n\n await mkdir(path.dirname(absolutePath), { recursive: true });\n await writeFile(absolutePath, content, \"utf8\");\n return true;\n}\n"]}