@uns-kit/core 2.0.43 → 2.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base-path.js.map +1 -1
- package/dist/config/project.config.extension.js.map +1 -1
- package/dist/config-file.js.map +1 -1
- package/dist/graphql/schema.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/logger.js.map +1 -1
- package/dist/tools/auth/auth-client.js.map +1 -1
- package/dist/tools/auth/index.js.map +1 -1
- package/dist/tools/auth/secure-store.js.map +1 -1
- package/dist/tools/base-path.js.map +1 -1
- package/dist/tools/file-utils.js.map +1 -1
- package/dist/tools/generate-config-schema.js.map +1 -1
- package/dist/tools/generate-uns-dictionary.js.map +1 -1
- package/dist/tools/generate-uns-measurements.js.map +1 -1
- package/dist/tools/generate-uns-reference.js.map +1 -1
- package/dist/tools/pull-request.js.map +1 -1
- package/dist/tools/refresh-uns.js.map +1 -1
- package/dist/tools/schema.js.map +1 -1
- package/dist/tools/sync-uns-schema.js.map +1 -1
- package/dist/uns/handover-manager-event-emitter.js.map +1 -1
- package/dist/uns/handover-manager.js.map +1 -1
- package/dist/uns/process-config.js.map +1 -1
- package/dist/uns/service-metadata.js.map +1 -1
- package/dist/uns/status-monitor.js.map +1 -1
- package/dist/uns/uns-asset.js.map +1 -1
- package/dist/uns/uns-attributes.js.map +1 -1
- package/dist/uns/uns-dictionary-registry.js.map +1 -1
- package/dist/uns/uns-dictionary.generated.js.map +1 -1
- package/dist/uns/uns-event-emitter.js.map +1 -1
- package/dist/uns/uns-interfaces.js.map +1 -1
- package/dist/uns/uns-measurements.generated.js.map +1 -1
- package/dist/uns/uns-measurements.js.map +1 -1
- package/dist/uns/uns-object.js.map +1 -1
- package/dist/uns/uns-packet.js.map +1 -1
- package/dist/uns/uns-path.js.map +1 -1
- package/dist/uns/uns-proxy-process.js.map +1 -1
- package/dist/uns/uns-proxy.js.map +1 -1
- package/dist/uns/uns-tags.js.map +1 -1
- package/dist/uns/uns-topic-matcher.js.map +1 -1
- package/dist/uns/uns-topics.js.map +1 -1
- package/dist/uns-config/config-schema.js.map +1 -1
- package/dist/uns-config/host-placeholders.js.map +1 -1
- package/dist/uns-config/schema-tolls.js.map +1 -1
- package/dist/uns-config/schema-tools.js.map +1 -1
- package/dist/uns-config/secret-placeholders.js.map +1 -1
- package/dist/uns-config/secret-resolver.js.map +1 -1
- package/dist/uns-grpc/uns-gateway-cli.js.map +1 -1
- package/dist/uns-grpc/uns-gateway-server.js.map +1 -1
- package/dist/uns-mqtt/mqtt-interfaces.js.map +1 -1
- package/dist/uns-mqtt/mqtt-proxy.js.map +1 -1
- package/dist/uns-mqtt/mqtt-topic-builder.js.map +1 -1
- package/dist/uns-mqtt/mqtt-worker-init.js.map +1 -1
- package/dist/uns-mqtt/mqtt-worker.js.map +1 -1
- package/dist/uns-mqtt/throttled-queue.js.map +1 -1
- package/dist/uns-mqtt/uns-mqtt-proxy.js.map +1 -1
- package/dist/uns-mqtt/ws-proxy.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull-request.js","sourceRoot":"","sources":["../../src/tools/pull-request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAC;AAI/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,YAAY,EAAa,SAAS,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC;AACzE,MAAM,GAAG,GAAc,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AACjE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AAE5D,IAAI,iBAAiB,GAAG,EAAE,CAAC;AAC3B,IAAI,YAAY,GAAG,EAAE,CAAC;AACtB,IAAI,CAAC;IACH,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC;IAC7C,iBAAiB,GAAG,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,iBAAiB,CAAC;IAChF,YAAY,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,YAAY,CAAC;AACnE,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,uDAAuD;AACzD,CAAC;AAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACvB,MAAM,IAAI,KAAK,CACb,8HAA8H,CAC/H,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,YAAY,EAAE,CAAC;IAClB,MAAM,IAAI,KAAK,CACb,oHAAoH,CACrH,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,WAAW,iBAAiB,kBAAkB,iBAAiB,EAAE,CAAC;AACjF,MAAM,UAAU,GAAG,yBAAyB,iBAAiB,EAAE,CAAC;AAChE,MAAM,SAAS,GAAG,GAAG,UAAU,wBAAwB,CAAC;AAExD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;AACxE,MAAM,QAAQ,GAAW,WAAW,CAAC,IAAI,CAAC;AAC1C,MAAM,OAAO,GAAW,WAAW,CAAC,OAAO,CAAC;AAE5C,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;AACzC,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC;AAEvC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;AAErC,IAAI,KAAK,GAAW,EAAE,CAAC;AACvB,IAAI,MAA8B,CAAC;AACnC,IAAI,WAAkC,CAAC;AAcvC,SAAS,YAAY,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACP,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SAC1B;QACD,MAAM,EAAE,KAAK;QACb,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,MAAM,cAAc,GAAG,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/F,OAAO;QACL,OAAO,EAAE,UAAU,IAAI,SAAS;QAChC,KAAK,EAAE,QAAQ,IAAI,SAAS;QAC5B,WAAW,EAAE,cAAc,IAAI,SAAS;QACxC,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI;KAC3B,CAAC;AACJ,CAAC;AAED,SAAS,WAAW;IAClB,OAAO;QACL,2FAA2F;QAC3F,EAAE;QACF,4CAA4C;QAC5C,+EAA+E;QAC/E,EAAE;QACF,cAAc;QACd,wDAAwD;KACzD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAmD,CAAC;IACxG,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;AAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,QAA8B,CAAC;AAEnC,IAAI,CAAC;IACH,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;AACtB,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC;QAAS,CAAC;IACT,QAAQ,EAAE,KAAK,EAAE,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,GAAY;IAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;IAChD,MAAM,oBAAoB,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;IAC5E,IAAI,oBAAoB,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CACb,+HAA+H,WAAW,EAAE,EAAE,CAC/I,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnD,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,4HAA4H,CAC7H,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACjC,KAAK,GAAG,MAAM,CAAC;YACf,MAAM,WAAW,GAAG,KAAK,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACzD,IAAI,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;gBACzD,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;gBAC3B,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;gBACnF,KAAK,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,QAAQ,KAAK,cAAc,EAAE,CAAC;YAC9B,KAAK;gBACH,CAAC,MAAM,QAAQ,CAAC,QAAQ,CACtB,+CAA+C,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,KAAK,CAAC,CACvF,CAAC,IAAI,EAAE,CAAC;YACX,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAErB,MAAM,WAAW,GAAG,KAAK,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;gBAC3B,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;gBACnF,KAAK,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACtD,WAAW,GAAG,SAAS,CAAC;QACtB,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,CAAC,oBAAoB,UAAU,EAAE,CAAC;KAC3C,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAE7B,MAAM,sBAAsB,EAAE,CAAC;IAE/B,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,mBAAmB,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAElE,MAAM,UAAU,CAAC,eAAe,CAAC,CAAC;IAClC,MAAM,aAAa,CAAC,eAAe,CAAC,CAAC;IACrC,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,iBAAiB,CAAC,eAAe,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAC;AAC/E,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,UAAmB;IAC3C,MAAM,gBAAgB,GAAG,kBAAkB,EAAE,CAAC;IAC9C,IAAI,aAAa,GAAG,IAAI,CAAC;IACzB,IAAI,UAAU,GAAG,UAAU,IAAI,EAAE,CAAC;IAClC,OAAO,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,QAAQ,KAAK,cAAc,EAAE,CAAC;YAC9B,UAAU;gBACR,CAAC,MAAM,QAAQ,CAAC,QAAQ,CACtB,sFAAsF,OAAO,KAAK,CACnG,CAAC,IAAI,OAAO,CAAC;YAChB,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC;QAC5C,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjE,IAAI,UAAU,CAAC,OAAO,CAAC,aAAa,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,UAAU,+BAA+B,CAAC,CAAC,CAAC;YAClF,IAAI,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CACb,WAAW,UAAU,iFAAiF,CACvG,CAAC;YACJ,CAAC;YACD,UAAU,GAAG,EAAE,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAA;YAC1C,aAAa,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,QAAiB;IACvC,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,iGAAiG,WAAW,EAAE,EAAE,CACjH,CAAC;IACJ,CAAC;IACD,QAAQ,KAAK,cAAc,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,cAAuB;IACnD,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,uGAAuG,WAAW,EAAE,EAAE,CACvH,CAAC;IACJ,CAAC;IACD,QAAQ,KAAK,cAAc,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,CAAC,oCAAoC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3F,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,QAAQ,CAAC,cAAc,CAAC,CAAC;AAC3B,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,UAAkB;IAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,aAAa,GAAG,CAAC,CAAC;IACnE,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,MAAM,GAAG,CAAC,MAAM,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,MAAM,gBAAgB,GAAG,kBAAkB,EAAE,CAAC;IAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,aAAa,GAAG,CAAC,CAAC;IACxE,MAAM,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,UAAkB;IAC1C,WAAW,CAAC,OAAO,GAAG,UAAU,CAAC;IACjC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE;QACnE,MAAM,EAAE,MAAM;KACf,CAAC,CAAC;IACH,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAEtD,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,KAAa,EAAE,WAAmB;IAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,aAAa,aAAa,CAAC,CAAC;IACjF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,WAAW,GAAG,KAAK,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,OAAO,GAAW,YAAY,CAAC;IACrC,MAAM,KAAK,GAAoB,MAAM,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,MAAM,sBAAsB,GAAmB;QAC7C,aAAa,EAAE,cAAc,aAAa,EAAE;QAC5C,aAAa,EAAE,mBAAmB;QAClC,KAAK;QACL,WAAW;QACX,MAAM,EAAE,CAAC,EAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,EAAC,CAAC;KACnC,CAAC;IACF,MAAM,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,IAAI,OAAO,SAAS,QAAQ,gBAAgB,CAAC,CAAC,CAAC;AACzH,CAAC;AAED,KAAK,UAAU,sBAAsB;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjE,MAAM,aAAa,GAAG,mBAAmB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAErE,IAAI,aAAa,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CACb,8DAA8D,aAAa,4CAA4C,CACxH,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;YACpC,MAAM,qBAAqB,GAAG,2DAA2D,CAAC;YAC1F,IAAI,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBAC9C,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,6CAA6C,OAAO,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,OAA2B;IACtD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC;IAC7B,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7E,CAAC;AAED,SAAS,2BAA2B,CAAC,mBAA2B;IAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1E,OAAO,wBAAwB,OAAO,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC","sourcesContent":["import * as azdev from \"azure-devops-node-api\";\r\nimport * as ga from \"azure-devops-node-api/GitApi.js\";\r\nimport { GitPullRequest } from \"azure-devops-node-api/interfaces/GitInterfaces.js\";\r\nimport { GitRepository } from \"azure-devops-node-api/interfaces/TfvcInterfaces.js\";\r\nimport chalk from \"chalk\";\r\nimport { execSync } from \"child_process\";\r\nimport fs from \"fs\";\r\nimport { readFile } from \"fs/promises\";\r\nimport { Buffer } from \"node:buffer\";\r\nimport readline from \"node:readline\";\r\nimport * as path from \"path\";\r\nimport * as prettier from \"prettier\";\r\nimport { CleanOptions, SimpleGit, simpleGit } from \"simple-git\";\r\nimport util from \"util\";\r\n\r\nimport { ConfigFile } from \"../config-file.js\";\r\nimport { basePath } from \"../base-path.js\";\r\n\r\nprocess.env.GIT_TERMINAL_PROMPT = process.env.GIT_TERMINAL_PROMPT ?? \"0\";\r\nconst git: SimpleGit = simpleGit(\"./\").clean(CleanOptions.FORCE);\r\nconst packageJsonPath = path.join(basePath, \"package.json\");\r\n\r\nlet azureOrganization = \"\";\r\nlet azureProject = \"\";\r\ntry {\r\n const appConfig = ConfigFile.loadRawConfig();\r\n azureOrganization = appConfig.devops?.organization?.trim() || azureOrganization;\r\n azureProject = appConfig.devops?.project?.trim() || azureProject;\r\n} catch (error) {\r\n // Use default organization when config.json is missing\r\n}\r\n\r\nif (!azureOrganization) {\r\n throw new Error(\r\n \"Azure DevOps organization is not configured. Please set devops.organization in config.json (run `uns-kit configure-devops`).\",\r\n );\r\n}\r\n\r\nif (!azureProject) {\r\n throw new Error(\r\n \"Azure DevOps project is not configured. Please set devops.project in config.json (run `uns-kit configure-devops`).\",\r\n );\r\n}\r\n\r\nconst orgUrl = `https://${azureOrganization}@dev.azure.com/${azureOrganization}`;\r\nconst orgBaseUrl = `https://dev.azure.com/${azureOrganization}`;\r\nconst tokensUrl = `${orgBaseUrl}/_usersSettings/tokens`;\r\n\r\nconst packageJson = JSON.parse(await readFile(packageJsonPath, \"utf8\"));\r\nconst repoName: string = packageJson.name;\r\nconst version: string = packageJson.version;\r\n\r\nconst branches = await git.branchLocal();\r\nconst currentBranch = branches.current;\r\n\r\nconst gitStatus = await git.status();\r\n\r\nlet token: string = \"\";\r\nlet gitApi: ga.IGitApi | undefined;\r\nlet gitWithAuth: SimpleGit | undefined;\r\n\r\ntype CliArgs = {\r\n version?: string;\r\n title?: string;\r\n description?: string;\r\n help?: boolean;\r\n};\r\n\r\ntype Prompter = {\r\n question: (prompt: string) => Promise<string>;\r\n close: () => void;\r\n};\r\n\r\nfunction parseCliArgs(argv = process.argv.slice(2)): CliArgs {\r\n const { values } = util.parseArgs({\r\n args: argv,\r\n options: {\r\n version: { type: \"string\" },\r\n title: { type: \"string\" },\r\n description: { type: \"string\" },\r\n help: { type: \"boolean\" },\r\n },\r\n strict: false,\r\n allowPositionals: true,\r\n });\r\n\r\n const versionArg = typeof values.version === \"string\" ? values.version.trim() : \"\";\r\n const titleArg = typeof values.title === \"string\" ? values.title.trim() : \"\";\r\n const descriptionArg = typeof values.description === \"string\" ? values.description.trim() : \"\";\r\n\r\n return {\r\n version: versionArg || undefined,\r\n title: titleArg || undefined,\r\n description: descriptionArg || undefined,\r\n help: values.help === true,\r\n };\r\n}\r\n\r\nfunction formatUsage(): string {\r\n return [\r\n \"Usage: pull-request [--version <version>] [--title <title>] [--description <description>]\",\r\n \"\",\r\n \"Non-interactive mode (stdin is not a TTY):\",\r\n \" You must provide --version, --title, and --description (and set AZURE_PAT).\",\r\n \"\",\r\n \"Environment:\",\r\n \" AZURE_PAT Azure DevOps Personal Access Token (PAT)\",\r\n ].join(\"\\n\");\r\n}\r\n\r\nfunction createPrompter(): Prompter {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n const question = util.promisify(rl.question).bind(rl) as unknown as (prompt: string) => Promise<string>;\r\n return { question, close: () => rl.close() };\r\n}\r\n\r\nconst cliArgs = parseCliArgs();\r\n\r\nif (cliArgs.help) {\r\n console.log(formatUsage());\r\n process.exit(0);\r\n}\r\n\r\nlet prompter: Prompter | undefined;\r\n\r\ntry {\r\n await main(cliArgs);\r\n} catch (error) {\r\n console.log(chalk.red.bold(`\\n${error}`));\r\n} finally {\r\n prompter?.close();\r\n}\r\n\r\nasync function main(cli: CliArgs) {\r\n const stdinIsTty = process.stdin.isTTY === true;\r\n const missingRequiredFlags = !cli.version || !cli.title || !cli.description;\r\n if (missingRequiredFlags && !stdinIsTty) {\r\n throw new Error(\r\n `Non-interactive mode detected (stdin is not a TTY). Provide --version, --title, and --description, or run interactively.\\n\\n${formatUsage()}`,\r\n );\r\n }\r\n\r\n if (!gitStatus.isClean()) {\r\n throw new Error(`Repository needs to be clean. Please commit or stash the changes.`);\r\n }\r\n\r\n const envPat = process.env.AZURE_PAT?.trim() || \"\";\r\n if (!envPat && !stdinIsTty) {\r\n throw new Error(\r\n `AZURE_PAT is not set and stdin is not a TTY, so an interactive prompt is not possible. Set AZURE_PAT or run interactively.`,\r\n );\r\n }\r\n\r\n while (!token) {\r\n if (envPat && envPat.length > 10) {\r\n token = envPat;\r\n const authHandler = azdev.getPersonalAccessTokenHandler(token);\r\n const connection = new azdev.WebApi(orgUrl, authHandler);\r\n try {\r\n console.log(\"Using PAT from your AZURE_PAT environment\");\r\n await connection.connect();\r\n gitApi = await connection.getGitApi();\r\n } catch (error) {\r\n console.log(\"The provided PAT is invalid or expired. Please provide a valid PAT.\");\r\n token = \"\";\r\n }\r\n }\r\n if (!token) {\r\n prompter ??= createPrompter();\r\n token =\r\n (await prompter.question(\r\n `Please enter your PAT, you can create one at ` + chalk.green.bold(`[${tokensUrl}]: `),\r\n )) || \"\";\r\n token = token.trim();\r\n\r\n const authHandler = azdev.getPersonalAccessTokenHandler(token);\r\n const connection = new azdev.WebApi(orgUrl, authHandler);\r\n try {\r\n await connection.connect();\r\n gitApi = await connection.getGitApi();\r\n } catch (error) {\r\n console.log(\"The provided PAT is invalid or expired. Please provide a valid PAT.\");\r\n token = \"\";\r\n }\r\n }\r\n }\r\n\r\n const authHeader = buildGitAuthorizationHeader(token);\r\n gitWithAuth = simpleGit({\r\n baseDir: \"./\",\r\n config: [`http.extraheader=${authHeader}`],\r\n }).clean(CleanOptions.FORCE);\r\n\r\n await assertNotDefaultBranch();\r\n\r\n const resolvedVersion = await getVersion(cli.version);\r\n const resolvedTitle = await getTitle(cli.title);\r\n const resolvedDescription = await getDescription(cli.description);\r\n\r\n await setVersion(resolvedVersion);\r\n await commitChanges(resolvedVersion);\r\n await pushChanges();\r\n await createPullRequest(resolvedVersion, resolvedTitle, resolvedDescription);\r\n}\r\n\r\nasync function getVersion(versionArg?: string): Promise<string> {\r\n const authenticatedGit = requireGitWithAuth();\r\n let versionExists = true;\r\n let newVersion = versionArg ?? \"\";\r\n while (versionExists) {\r\n if (!newVersion) {\r\n prompter ??= createPrompter();\r\n newVersion =\r\n (await prompter.question(\r\n `Every PR needs a unique version, please accept current version or enter a new one [${version}]: `,\r\n )) || version;\r\n newVersion = newVersion.trim() || version;\r\n }\r\n\r\n const remoteTags = await authenticatedGit.listRemote([\"--tags\"]);\r\n if (remoteTags.indexOf(`refs/tags/${newVersion}`) >= 0) {\r\n console.log(chalk.bold.red(`Version ${newVersion} already exists on the server`));\r\n if (versionArg && process.stdin.isTTY !== true) {\r\n throw new Error(\r\n `Version ${newVersion} already exists on the server. Provide a unique --version or run interactively.`,\r\n );\r\n }\r\n newVersion = \"\";\r\n } else {\r\n console.log(`Using version ${newVersion}`)\r\n versionExists = false;\r\n }\r\n }\r\n return newVersion;\r\n}\r\n\r\nasync function getTitle(titleArg?: string): Promise<string> {\r\n if (titleArg) {\r\n return titleArg;\r\n }\r\n if (process.stdin.isTTY !== true) {\r\n throw new Error(\r\n `Non-interactive mode detected (stdin is not a TTY). Provide --title, or run interactively.\\n\\n${formatUsage()}`,\r\n );\r\n }\r\n prompter ??= createPrompter();\r\n const title = (await prompter.question(`Title for the pull request: `)).trim();\r\n if (!title) {\r\n throw new Error(\"Pull request title can not be empty.\");\r\n }\r\n return title;\r\n}\r\n\r\nasync function getDescription(descriptionArg?: string): Promise<string> {\r\n if (descriptionArg) {\r\n return descriptionArg;\r\n }\r\n if (process.stdin.isTTY !== true) {\r\n throw new Error(\r\n `Non-interactive mode detected (stdin is not a TTY). Provide --description, or run interactively.\\n\\n${formatUsage()}`,\r\n );\r\n }\r\n prompter ??= createPrompter();\r\n const description = (await prompter.question(`Description for the pull request: `)).trim();\r\n if (!description) {\r\n throw new Error(\"Pull request description can not be empty.\");\r\n }\r\n return description;\r\n}\r\n\r\nasync function runMake() {\r\n execSync(\"npm run make\");\r\n}\r\n\r\nasync function commitChanges(newVersion: string) {\r\n process.stdout.write(`Commit changes to branch ${currentBranch} `);\r\n await git.add(\".\");\r\n await git.commit(`Set new production version: ${newVersion}`);\r\n console.log(chalk.green.bold(` ... OK`));\r\n}\r\n\r\nasync function pushChanges() {\r\n const authenticatedGit = requireGitWithAuth();\r\n process.stdout.write(`Push changes to remote branch ${currentBranch} `);\r\n await authenticatedGit.push(\"origin\", currentBranch);\r\n console.log(chalk.green.bold(` ... OK`));\r\n}\r\n\r\nasync function setVersion(newVersion: string) {\r\n packageJson.version = newVersion;\r\n const docString = await prettier.format(JSON.stringify(packageJson), {\r\n parser: \"json\",\r\n });\r\n fs.writeFileSync(\"package.json\", docString, \"utf8\");\r\n\r\n}\r\n\r\nasync function createPullRequest(tag: string, title: string, description: string) {\r\n process.stdout.write(`Create new pull request from ${currentBranch} to master `);\r\n if (!gitApi) {\r\n const authHandler = azdev.getPersonalAccessTokenHandler(token);\r\n const connection = new azdev.WebApi(orgUrl, authHandler);\r\n gitApi = await connection.getGitApi();\r\n }\r\n\r\n const project: string = azureProject;\r\n const repos: GitRepository[] = await gitApi.getRepositories(project);\r\n const repoId = repos.filter((x) => x.name == repoName)[0].id;\r\n const gitPullRequestToCreate: GitPullRequest = {\r\n sourceRefName: `refs/heads/${currentBranch}`,\r\n targetRefName: \"refs/heads/master\",\r\n title,\r\n description,\r\n labels: [{active: true, name:tag}]\r\n };\r\n await gitApi.createPullRequest(gitPullRequestToCreate, repoId, project);\r\n console.log(chalk.green.bold(` ... OK`));\r\n console.log(`Pull request created at ` + chalk.green.bold(`[${orgBaseUrl}/${project}/_git/${repoName}/pullrequests]`));\r\n}\r\n\r\nasync function assertNotDefaultBranch(): Promise<void> {\r\n if (!gitApi) {\r\n return;\r\n }\r\n\r\n const project = azureProject.trim();\r\n if (!project) {\r\n return;\r\n }\r\n\r\n try {\r\n const repository = await gitApi.getRepository(repoName, project);\r\n const defaultBranch = normalizeBranchName(repository?.defaultBranch);\r\n\r\n if (defaultBranch && defaultBranch === currentBranch) {\r\n throw new Error(\r\n `You can not create a pull request from the default branch (${defaultBranch}). Please create a feature branch instead.`,\r\n );\r\n }\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n const message = error.message || \"\";\r\n const protectedBranchPrefix = \"You can not create a pull request from the default branch\";\r\n if (message.startsWith(protectedBranchPrefix)) {\r\n throw error;\r\n }\r\n if (message) {\r\n console.log(`Warning: Unable to verify default branch: ${message}`);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction normalizeBranchName(refName: string | undefined): string | undefined {\r\n if (!refName) {\r\n return undefined;\r\n }\r\n\r\n const prefix = \"refs/heads/\";\r\n return refName.startsWith(prefix) ? refName.slice(prefix.length) : refName;\r\n}\r\n\r\nfunction buildGitAuthorizationHeader(personalAccessToken: string): string {\r\n const encoded = Buffer.from(`:${personalAccessToken}`).toString(\"base64\");\r\n return `Authorization: Basic ${encoded}`;\r\n}\r\n\r\nfunction requireGitWithAuth(): SimpleGit {\r\n if (!gitWithAuth) {\r\n throw new Error(\"Git authentication is not initialized.\");\r\n }\r\n return gitWithAuth;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"pull-request.js","sourceRoot":"","sources":["../../src/tools/pull-request.ts"],"names":[],"mappings":"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","sourcesContent":["import * as azdev from \"azure-devops-node-api\";\nimport * as ga from \"azure-devops-node-api/GitApi.js\";\nimport { GitPullRequest } from \"azure-devops-node-api/interfaces/GitInterfaces.js\";\nimport { GitRepository } from \"azure-devops-node-api/interfaces/TfvcInterfaces.js\";\nimport chalk from \"chalk\";\nimport { execSync } from \"child_process\";\nimport fs from \"fs\";\nimport { readFile } from \"fs/promises\";\nimport { Buffer } from \"node:buffer\";\nimport readline from \"node:readline\";\nimport * as path from \"path\";\nimport * as prettier from \"prettier\";\nimport { CleanOptions, SimpleGit, simpleGit } from \"simple-git\";\nimport util from \"util\";\n\nimport { ConfigFile } from \"../config-file.js\";\nimport { basePath } from \"../base-path.js\";\n\nprocess.env.GIT_TERMINAL_PROMPT = process.env.GIT_TERMINAL_PROMPT ?? \"0\";\nconst git: SimpleGit = simpleGit(\"./\").clean(CleanOptions.FORCE);\nconst packageJsonPath = path.join(basePath, \"package.json\");\n\nlet azureOrganization = \"\";\nlet azureProject = \"\";\ntry {\n const appConfig = ConfigFile.loadRawConfig();\n azureOrganization = appConfig.devops?.organization?.trim() || azureOrganization;\n azureProject = appConfig.devops?.project?.trim() || azureProject;\n} catch (error) {\n // Use default organization when config.json is missing\n}\n\nif (!azureOrganization) {\n throw new Error(\n \"Azure DevOps organization is not configured. Please set devops.organization in config.json (run `uns-kit configure-devops`).\",\n );\n}\n\nif (!azureProject) {\n throw new Error(\n \"Azure DevOps project is not configured. Please set devops.project in config.json (run `uns-kit configure-devops`).\",\n );\n}\n\nconst orgUrl = `https://${azureOrganization}@dev.azure.com/${azureOrganization}`;\nconst orgBaseUrl = `https://dev.azure.com/${azureOrganization}`;\nconst tokensUrl = `${orgBaseUrl}/_usersSettings/tokens`;\n\nconst packageJson = JSON.parse(await readFile(packageJsonPath, \"utf8\"));\nconst repoName: string = packageJson.name;\nconst version: string = packageJson.version;\n\nconst branches = await git.branchLocal();\nconst currentBranch = branches.current;\n\nconst gitStatus = await git.status();\n\nlet token: string = \"\";\nlet gitApi: ga.IGitApi | undefined;\nlet gitWithAuth: SimpleGit | undefined;\n\ntype CliArgs = {\n version?: string;\n title?: string;\n description?: string;\n help?: boolean;\n};\n\ntype Prompter = {\n question: (prompt: string) => Promise<string>;\n close: () => void;\n};\n\nfunction parseCliArgs(argv = process.argv.slice(2)): CliArgs {\n const { values } = util.parseArgs({\n args: argv,\n options: {\n version: { type: \"string\" },\n title: { type: \"string\" },\n description: { type: \"string\" },\n help: { type: \"boolean\" },\n },\n strict: false,\n allowPositionals: true,\n });\n\n const versionArg = typeof values.version === \"string\" ? values.version.trim() : \"\";\n const titleArg = typeof values.title === \"string\" ? values.title.trim() : \"\";\n const descriptionArg = typeof values.description === \"string\" ? values.description.trim() : \"\";\n\n return {\n version: versionArg || undefined,\n title: titleArg || undefined,\n description: descriptionArg || undefined,\n help: values.help === true,\n };\n}\n\nfunction formatUsage(): string {\n return [\n \"Usage: pull-request [--version <version>] [--title <title>] [--description <description>]\",\n \"\",\n \"Non-interactive mode (stdin is not a TTY):\",\n \" You must provide --version, --title, and --description (and set AZURE_PAT).\",\n \"\",\n \"Environment:\",\n \" AZURE_PAT Azure DevOps Personal Access Token (PAT)\",\n ].join(\"\\n\");\n}\n\nfunction createPrompter(): Prompter {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const question = util.promisify(rl.question).bind(rl) as unknown as (prompt: string) => Promise<string>;\n return { question, close: () => rl.close() };\n}\n\nconst cliArgs = parseCliArgs();\n\nif (cliArgs.help) {\n console.log(formatUsage());\n process.exit(0);\n}\n\nlet prompter: Prompter | undefined;\n\ntry {\n await main(cliArgs);\n} catch (error) {\n console.log(chalk.red.bold(`\\n${error}`));\n} finally {\n prompter?.close();\n}\n\nasync function main(cli: CliArgs) {\n const stdinIsTty = process.stdin.isTTY === true;\n const missingRequiredFlags = !cli.version || !cli.title || !cli.description;\n if (missingRequiredFlags && !stdinIsTty) {\n throw new Error(\n `Non-interactive mode detected (stdin is not a TTY). Provide --version, --title, and --description, or run interactively.\\n\\n${formatUsage()}`,\n );\n }\n\n if (!gitStatus.isClean()) {\n throw new Error(`Repository needs to be clean. Please commit or stash the changes.`);\n }\n\n const envPat = process.env.AZURE_PAT?.trim() || \"\";\n if (!envPat && !stdinIsTty) {\n throw new Error(\n `AZURE_PAT is not set and stdin is not a TTY, so an interactive prompt is not possible. Set AZURE_PAT or run interactively.`,\n );\n }\n\n while (!token) {\n if (envPat && envPat.length > 10) {\n token = envPat;\n const authHandler = azdev.getPersonalAccessTokenHandler(token);\n const connection = new azdev.WebApi(orgUrl, authHandler);\n try {\n console.log(\"Using PAT from your AZURE_PAT environment\");\n await connection.connect();\n gitApi = await connection.getGitApi();\n } catch (error) {\n console.log(\"The provided PAT is invalid or expired. Please provide a valid PAT.\");\n token = \"\";\n }\n }\n if (!token) {\n prompter ??= createPrompter();\n token =\n (await prompter.question(\n `Please enter your PAT, you can create one at ` + chalk.green.bold(`[${tokensUrl}]: `),\n )) || \"\";\n token = token.trim();\n\n const authHandler = azdev.getPersonalAccessTokenHandler(token);\n const connection = new azdev.WebApi(orgUrl, authHandler);\n try {\n await connection.connect();\n gitApi = await connection.getGitApi();\n } catch (error) {\n console.log(\"The provided PAT is invalid or expired. Please provide a valid PAT.\");\n token = \"\";\n }\n }\n }\n\n const authHeader = buildGitAuthorizationHeader(token);\n gitWithAuth = simpleGit({\n baseDir: \"./\",\n config: [`http.extraheader=${authHeader}`],\n }).clean(CleanOptions.FORCE);\n\n await assertNotDefaultBranch();\n\n const resolvedVersion = await getVersion(cli.version);\n const resolvedTitle = await getTitle(cli.title);\n const resolvedDescription = await getDescription(cli.description);\n\n await setVersion(resolvedVersion);\n await commitChanges(resolvedVersion);\n await pushChanges();\n await createPullRequest(resolvedVersion, resolvedTitle, resolvedDescription);\n}\n\nasync function getVersion(versionArg?: string): Promise<string> {\n const authenticatedGit = requireGitWithAuth();\n let versionExists = true;\n let newVersion = versionArg ?? \"\";\n while (versionExists) {\n if (!newVersion) {\n prompter ??= createPrompter();\n newVersion =\n (await prompter.question(\n `Every PR needs a unique version, please accept current version or enter a new one [${version}]: `,\n )) || version;\n newVersion = newVersion.trim() || version;\n }\n\n const remoteTags = await authenticatedGit.listRemote([\"--tags\"]);\n if (remoteTags.indexOf(`refs/tags/${newVersion}`) >= 0) {\n console.log(chalk.bold.red(`Version ${newVersion} already exists on the server`));\n if (versionArg && process.stdin.isTTY !== true) {\n throw new Error(\n `Version ${newVersion} already exists on the server. Provide a unique --version or run interactively.`,\n );\n }\n newVersion = \"\";\n } else {\n console.log(`Using version ${newVersion}`)\n versionExists = false;\n }\n }\n return newVersion;\n}\n\nasync function getTitle(titleArg?: string): Promise<string> {\n if (titleArg) {\n return titleArg;\n }\n if (process.stdin.isTTY !== true) {\n throw new Error(\n `Non-interactive mode detected (stdin is not a TTY). Provide --title, or run interactively.\\n\\n${formatUsage()}`,\n );\n }\n prompter ??= createPrompter();\n const title = (await prompter.question(`Title for the pull request: `)).trim();\n if (!title) {\n throw new Error(\"Pull request title can not be empty.\");\n }\n return title;\n}\n\nasync function getDescription(descriptionArg?: string): Promise<string> {\n if (descriptionArg) {\n return descriptionArg;\n }\n if (process.stdin.isTTY !== true) {\n throw new Error(\n `Non-interactive mode detected (stdin is not a TTY). Provide --description, or run interactively.\\n\\n${formatUsage()}`,\n );\n }\n prompter ??= createPrompter();\n const description = (await prompter.question(`Description for the pull request: `)).trim();\n if (!description) {\n throw new Error(\"Pull request description can not be empty.\");\n }\n return description;\n}\n\nasync function runMake() {\n execSync(\"npm run make\");\n}\n\nasync function commitChanges(newVersion: string) {\n process.stdout.write(`Commit changes to branch ${currentBranch} `);\n await git.add(\".\");\n await git.commit(`Set new production version: ${newVersion}`);\n console.log(chalk.green.bold(` ... OK`));\n}\n\nasync function pushChanges() {\n const authenticatedGit = requireGitWithAuth();\n process.stdout.write(`Push changes to remote branch ${currentBranch} `);\n await authenticatedGit.push(\"origin\", currentBranch);\n console.log(chalk.green.bold(` ... OK`));\n}\n\nasync function setVersion(newVersion: string) {\n packageJson.version = newVersion;\n const docString = await prettier.format(JSON.stringify(packageJson), {\n parser: \"json\",\n });\n fs.writeFileSync(\"package.json\", docString, \"utf8\");\n\n}\n\nasync function createPullRequest(tag: string, title: string, description: string) {\n process.stdout.write(`Create new pull request from ${currentBranch} to master `);\n if (!gitApi) {\n const authHandler = azdev.getPersonalAccessTokenHandler(token);\n const connection = new azdev.WebApi(orgUrl, authHandler);\n gitApi = await connection.getGitApi();\n }\n\n const project: string = azureProject;\n const repos: GitRepository[] = await gitApi.getRepositories(project);\n const repoId = repos.filter((x) => x.name == repoName)[0].id;\n const gitPullRequestToCreate: GitPullRequest = {\n sourceRefName: `refs/heads/${currentBranch}`,\n targetRefName: \"refs/heads/master\",\n title,\n description,\n labels: [{active: true, name:tag}]\n };\n await gitApi.createPullRequest(gitPullRequestToCreate, repoId, project);\n console.log(chalk.green.bold(` ... OK`));\n console.log(`Pull request created at ` + chalk.green.bold(`[${orgBaseUrl}/${project}/_git/${repoName}/pullrequests]`));\n}\n\nasync function assertNotDefaultBranch(): Promise<void> {\n if (!gitApi) {\n return;\n }\n\n const project = azureProject.trim();\n if (!project) {\n return;\n }\n\n try {\n const repository = await gitApi.getRepository(repoName, project);\n const defaultBranch = normalizeBranchName(repository?.defaultBranch);\n\n if (defaultBranch && defaultBranch === currentBranch) {\n throw new Error(\n `You can not create a pull request from the default branch (${defaultBranch}). Please create a feature branch instead.`,\n );\n }\n } catch (error) {\n if (error instanceof Error) {\n const message = error.message || \"\";\n const protectedBranchPrefix = \"You can not create a pull request from the default branch\";\n if (message.startsWith(protectedBranchPrefix)) {\n throw error;\n }\n if (message) {\n console.log(`Warning: Unable to verify default branch: ${message}`);\n }\n }\n }\n}\n\nfunction normalizeBranchName(refName: string | undefined): string | undefined {\n if (!refName) {\n return undefined;\n }\n\n const prefix = \"refs/heads/\";\n return refName.startsWith(prefix) ? refName.slice(prefix.length) : refName;\n}\n\nfunction buildGitAuthorizationHeader(personalAccessToken: string): string {\n const encoded = Buffer.from(`:${personalAccessToken}`).toString(\"base64\");\n return `Authorization: Basic ${encoded}`;\n}\n\nfunction requireGitWithAuth(): SimpleGit {\n if (!gitWithAuth) {\n throw new Error(\"Git authentication is not initialized.\");\n }\n return gitWithAuth;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh-uns.js","sourceRoot":"","sources":["../../src/tools/refresh-uns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAElE,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC;AAE7C,6CAA6C;AAC7C,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,OAAe;IAC1D,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,KAAmC,EAAE,EAAE;YACtE,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;gBAC5C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iDAAiD;AACjD,SAAS,iBAAiB,CAAC,IAAqB,EAAE,WAAmB;IACnE,OAAO,IAAI;SACR,GAAG,CAAC,OAAO,CAAC,EAAE;QACb,MAAM,OAAO,GAAG,GAAG,WAAW,GAAG,OAAO,CAAC,OAAO,GAAG,CAAC;QACpD,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,MAAM;YAC7C,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC;YAC9C,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,IAAI,OAAO,MAAM,cAAc,EAAE,CAAC;IAC3C,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,8DAA8D;AAC9D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;AACvC,IAAI,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;AAC9C,IAAI,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE;IACjD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE;CACpD,CAAC,CAAC;AAEH,KAAK,UAAU,eAAe,CAAI,QAAa;IAC7C,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,OAAO,CAAI,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG,GAAG,YAAY,WAAW,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC;QAC7G,IAAI,SAAS,EAAE,CAAC;YACd,+DAA+D;YAC/D,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1C,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,WAAW,EAAE,CAAC,CAAC;YAC3D,OAAO,MAAM,MAAM,CAAC,OAAO,CAAI,QAAQ,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,+BAA+B;AAC/B,KAAK,UAAU,gBAAgB;IAC7B,MAAM,QAAQ,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgClB,CAAC;IAEH,MAAM,KAAK,GAAQ,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,IAAI,GAAoB,KAAK,CAAC,gBAAgB,CAAC;IAErD,MAAM,OAAO,GAAG,2BAA2B,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC;IACzF,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAC;IACxE,MAAM,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAChD,MAAM,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,6BAA6B;AAC7B,KAAK,UAAU,cAAc;IAC3B,MAAM,QAAQ,GAAG,GAAG,CAAA;;;IAGlB,CAAC;IAEH,MAAM,KAAK,GAAQ,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,IAAI,GAAa,KAAK,CAAC,OAAO,CAAC;IAErC,MAAM,OAAO,GAAG,yBAAyB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC;IAClG,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,qBAAqB,CAAC,CAAC;IACtE,MAAM,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAChD,MAAM,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,sBAAsB,CAAC,SAAoC;IAClE,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC1B,OAAO,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAyD;IACtF,MAAM,OAAO,GAAG,IAAI,GAAG,EAOnB,CAAC;IAEL,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,IAAI,GAAG,sBAAsB,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtF,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;YAChB,IAAI;YACJ,WAAW,EAAE,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;YAC3E,aAAa,EAAE,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;YACjF,SAAS,EAAE,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YACrE,UAAU,EAAE,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;YACxE,QAAQ,EAAE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;SACnE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAiD;IAC1E,MAAM,OAAO,GAAG,IAAI,GAAG,EAGnB,CAAC;IAEL,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,SAAS;YAAE,SAAS;QACzB,MAAM,WAAW,GAAG,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;QACrF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,+BAA+B;AAC/B,KAAK,UAAU,gBAAgB;IAC7B,MAAM,QAAQ,GAAG,GAAG,CAAA;;;;;;;;;IASlB,CAAC;IAEH,MAAM,KAAK,GAAQ,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,MAAM,GAAG,wEAAwE,CAAC;IACxF,MAAM,OAAO,GAAG,MAAM;SACnB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,OAAO,GAAG,OAAO,MAAM,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,KAAK,IAAI,CAAC;IAC3D,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,OAAO,GAAG;;;;;;CAMjB,CAAC;IAEA,MAAM,OAAO,GAAG,GAAG,MAAM,qCAAqC,OAAO,0GAA0G,OAAO,EAAE,CAAC;IACzL,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAC;IACxE,MAAM,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAChD,MAAM,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,gCAAgC;AAChC,KAAK,UAAU,OAAO;IACpB,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,EAAE,cAAc,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC,CAAC;AAExE,KAAK,UAAU,eAAe,CAAC,OAAe;IAC5C,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC","sourcesContent":["import { GraphQLClient, gql, ClientError } from \"graphql-request\";\r\nimport { TreeStructure, UnsAttributeSummary, UnsAssetSummary } from \"./schema.js\";\r\nimport * as path from \"path\";\r\nimport * as fs from 'fs';\r\nimport { mkdir } from \"fs/promises\";\r\nimport { ConfigFile } from \"../config-file.js\";\r\nimport { AuthClient } from \"./auth/index.js\";\r\n\r\n\r\nconst config = await ConfigFile.loadConfig();\r\n\r\n// Helper function to write content to a file\r\nasync function writeToFile(filePath: string, content: string) {\r\n return new Promise<void>((resolve, reject) => {\r\n fs.writeFile(filePath, content, (error: NodeJS.ErrnoException | null) => {\r\n if (error) {\r\n console.error('Error writing file:', error);\r\n return reject(error);\r\n }\r\n console.log(`${path.basename(filePath)} updated.`);\r\n resolve();\r\n });\r\n });\r\n}\r\n\r\n// Function to process tree structure recursively\r\nfunction generateUnsTopics(tree: TreeStructure[], currentPath: string): string {\r\n return tree\r\n .map(element => {\r\n const newPath = `${currentPath}${element.unsNode}/`;\r\n const childrenTopics = element.children?.length\r\n ? generateUnsTopics(element.children, newPath)\r\n : '';\r\n return `\"${newPath}\" |${childrenTopics}`;\r\n })\r\n .join('');\r\n}\r\n\r\n// Prepare GraphQL client with Authorization from auth library\r\nconst auth = await AuthClient.create();\r\nlet accessToken = await auth.getAccessToken();\r\nlet client = new GraphQLClient(config.uns.graphql, {\r\n headers: { Authorization: `Bearer ${accessToken}` },\r\n});\r\n\r\nasync function requestWithAuth<T>(document: any): Promise<T> {\r\n try {\r\n return await client.request<T>(document);\r\n } catch (err: any) {\r\n const isAuthErr = err instanceof ClientError && (err.response.status === 401 || err.response.status === 403);\r\n if (isAuthErr) {\r\n // Attempt to get a fresh token (will try refresh, then prompt)\r\n accessToken = await auth.getAccessToken();\r\n client.setHeader('Authorization', `Bearer ${accessToken}`);\r\n return await client.request<T>(document);\r\n }\r\n throw err;\r\n }\r\n}\r\n\r\n// Fetch and generate UnsTopics\r\nasync function refreshUnsTopics() {\r\n const document = gql`\r\n query GetTreeStructure {\r\n GetTreeStructure {\r\n id\r\n parent\r\n unsNode\r\n children {\r\n id\r\n parent\r\n unsNode\r\n children {\r\n id\r\n parent\r\n unsNode\r\n children {\r\n id\r\n parent\r\n unsNode\r\n children {\r\n id\r\n parent\r\n unsNode\r\n children {\r\n id\r\n parent\r\n unsNode\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }`;\r\n\r\n const query: any = await requestWithAuth(document);\r\n const tree: TreeStructure[] = query.GetTreeStructure;\r\n\r\n const vsebina = `export type UnsTopics = ${generateUnsTopics(tree, '')}\\n(string & {});`;\r\n const outputPath = path.resolve(process.cwd(), \"src/uns/uns-topics.ts\");\r\n await ensureDirectory(path.dirname(outputPath));\r\n await writeToFile(outputPath, vsebina);\r\n}\r\n\r\n// Fetch and generate UnsTags\r\nasync function refreshUnsTags() {\r\n const document = gql`\r\n query Query {\r\n GetTags\r\n }`;\r\n\r\n const query: any = await requestWithAuth(document);\r\n const tags: string[] = query.GetTags;\r\n\r\n const vsebina = `export type UnsTags = ${tags.map(tag => `\"${tag}\" |`).join('')}\\n(string & {});`;\r\n const outputPath = path.resolve(process.cwd(), \"src/uns/uns-tags.ts\");\r\n await ensureDirectory(path.dirname(outputPath));\r\n await writeToFile(outputPath, vsebina);\r\n}\r\n\r\nfunction normalizeAttributePath(pathValue: string | null | undefined): string {\r\n if (!pathValue) return \"\";\r\n return pathValue.replace(/\\/+$/, \"\");\r\n}\r\n\r\nfunction buildAttributeEntries(attributes: Array<UnsAttributeSummary | null | undefined>) {\r\n const deduped = new Map<string, {\r\n path: string;\r\n description: string | null;\r\n attributeType: string | null;\r\n dataGroup: string | null;\r\n objectType: string | null;\r\n objectId: string | null;\r\n }>();\r\n\r\n for (const attr of attributes) {\r\n if (!attr) continue;\r\n const path = normalizeAttributePath(typeof attr.path === \"string\" ? attr.path : null);\r\n if (!path) continue;\r\n deduped.set(path, {\r\n path,\r\n description: typeof attr.description === \"string\" ? attr.description : null,\r\n attributeType: typeof attr.attributeType === \"string\" ? attr.attributeType : null,\r\n dataGroup: typeof attr.dataGroup === \"string\" ? attr.dataGroup : null,\r\n objectType: typeof attr.objectType === \"string\" ? attr.objectType : null,\r\n objectId: typeof attr.objectId === \"string\" ? attr.objectId : null,\r\n });\r\n }\r\n\r\n return Array.from(deduped.values()).sort((a, b) => a.path.localeCompare(b.path));\r\n}\r\n\r\nfunction buildAssetEntries(assets: Array<UnsAssetSummary | null | undefined>) {\r\n const deduped = new Map<string, {\r\n asset: string;\r\n description: string | null;\r\n }>();\r\n\r\n for (const entry of assets) {\r\n if (!entry) continue;\r\n const assetName = typeof entry.asset === \"string\" ? entry.asset.trim() : \"\";\r\n if (!assetName) continue;\r\n const description = typeof entry.description === \"string\" ? entry.description : null;\r\n if (!deduped.has(assetName)) {\r\n deduped.set(assetName, { asset: assetName, description });\r\n }\r\n }\r\n\r\n return Array.from(deduped.values()).sort((a, b) => a.asset.localeCompare(b.asset));\r\n}\r\n\r\n// Fetch and generate UnsAssets\r\nasync function refreshUnsAssets() {\r\n const document = gql`\r\n query GetAssets {\r\n GetAssets {\r\n path\r\n description\r\n asset\r\n objectType\r\n objectId\r\n }\r\n }`;\r\n\r\n const query: any = await requestWithAuth(document);\r\n let assets = buildAssetEntries(Array.isArray(query.GetAssets) ? query.GetAssets : []);\r\n if (!assets.length) {\r\n assets = [{ asset: \"asset\", description: null }];\r\n }\r\n\r\n const header = `// Generated UNS asset list. Run \\`pnpm run refresh-uns\\` to update.\\n`;\r\n const entries = assets\r\n .map((entry) => {\r\n const comment = entry.description ? ` /** ${sanitizeComment(entry.description)} */\\n` : \"\";\r\n return `${comment} \"${entry.asset}\": \"${entry.asset}\",`;\r\n })\r\n .join(\"\\n\");\r\n\r\n const helpers = `\r\nexport function resolveGeneratedAsset(name: keyof typeof GeneratedAssets): (typeof GeneratedAssets)[keyof typeof GeneratedAssets];\r\nexport function resolveGeneratedAsset<T extends string>(name: T): (typeof GeneratedAssets)[keyof typeof GeneratedAssets] | T;\r\nexport function resolveGeneratedAsset(name: string): string {\r\n return (GeneratedAssets as Record<string, string>)[name] ?? name;\r\n}\r\n`;\r\n\r\n const vsebina = `${header}export const GeneratedAssets = {\\n${entries}\\n} as const;\\nexport type GeneratedAssetName = typeof GeneratedAssets[keyof typeof GeneratedAssets];\\n${helpers}`;\r\n const outputPath = path.resolve(process.cwd(), \"src/uns/uns-assets.ts\");\r\n await ensureDirectory(path.dirname(outputPath));\r\n await writeToFile(outputPath, vsebina);\r\n}\r\n\r\n// Execute the refresh processes\r\nasync function refresh() {\r\n await Promise.all([refreshUnsTopics(), refreshUnsTags(), refreshUnsAssets()]);\r\n}\r\n\r\nrefresh().catch(error => console.error('Error during refresh:', error));\r\n\r\nasync function ensureDirectory(dirPath: string): Promise<void> {\r\n await mkdir(dirPath, { recursive: true });\r\n}\r\n\r\nfunction sanitizeComment(text: string): string {\r\n return text.replace(/\\*\\//g, \"*\\\\/\");\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"refresh-uns.js","sourceRoot":"","sources":["../../src/tools/refresh-uns.ts"],"names":[],"mappings":"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","sourcesContent":["import { GraphQLClient, gql, ClientError } from \"graphql-request\";\nimport { TreeStructure, UnsAttributeSummary, UnsAssetSummary } from \"./schema.js\";\nimport * as path from \"path\";\nimport * as fs from 'fs';\nimport { mkdir } from \"fs/promises\";\nimport { ConfigFile } from \"../config-file.js\";\nimport { AuthClient } from \"./auth/index.js\";\n\n\nconst config = await ConfigFile.loadConfig();\n\n// Helper function to write content to a file\nasync function writeToFile(filePath: string, content: string) {\n return new Promise<void>((resolve, reject) => {\n fs.writeFile(filePath, content, (error: NodeJS.ErrnoException | null) => {\n if (error) {\n console.error('Error writing file:', error);\n return reject(error);\n }\n console.log(`${path.basename(filePath)} updated.`);\n resolve();\n });\n });\n}\n\n// Function to process tree structure recursively\nfunction generateUnsTopics(tree: TreeStructure[], currentPath: string): string {\n return tree\n .map(element => {\n const newPath = `${currentPath}${element.unsNode}/`;\n const childrenTopics = element.children?.length\n ? generateUnsTopics(element.children, newPath)\n : '';\n return `\"${newPath}\" |${childrenTopics}`;\n })\n .join('');\n}\n\n// Prepare GraphQL client with Authorization from auth library\nconst auth = await AuthClient.create();\nlet accessToken = await auth.getAccessToken();\nlet client = new GraphQLClient(config.uns.graphql, {\n headers: { Authorization: `Bearer ${accessToken}` },\n});\n\nasync function requestWithAuth<T>(document: any): Promise<T> {\n try {\n return await client.request<T>(document);\n } catch (err: any) {\n const isAuthErr = err instanceof ClientError && (err.response.status === 401 || err.response.status === 403);\n if (isAuthErr) {\n // Attempt to get a fresh token (will try refresh, then prompt)\n accessToken = await auth.getAccessToken();\n client.setHeader('Authorization', `Bearer ${accessToken}`);\n return await client.request<T>(document);\n }\n throw err;\n }\n}\n\n// Fetch and generate UnsTopics\nasync function refreshUnsTopics() {\n const document = gql`\n query GetTreeStructure {\n GetTreeStructure {\n id\n parent\n unsNode\n children {\n id\n parent\n unsNode\n children {\n id\n parent\n unsNode\n children {\n id\n parent\n unsNode\n children {\n id\n parent\n unsNode\n children {\n id\n parent\n unsNode\n }\n }\n }\n }\n }\n }\n }`;\n\n const query: any = await requestWithAuth(document);\n const tree: TreeStructure[] = query.GetTreeStructure;\n\n const vsebina = `export type UnsTopics = ${generateUnsTopics(tree, '')}\\n(string & {});`;\n const outputPath = path.resolve(process.cwd(), \"src/uns/uns-topics.ts\");\n await ensureDirectory(path.dirname(outputPath));\n await writeToFile(outputPath, vsebina);\n}\n\n// Fetch and generate UnsTags\nasync function refreshUnsTags() {\n const document = gql`\n query Query {\n GetTags\n }`;\n\n const query: any = await requestWithAuth(document);\n const tags: string[] = query.GetTags;\n\n const vsebina = `export type UnsTags = ${tags.map(tag => `\"${tag}\" |`).join('')}\\n(string & {});`;\n const outputPath = path.resolve(process.cwd(), \"src/uns/uns-tags.ts\");\n await ensureDirectory(path.dirname(outputPath));\n await writeToFile(outputPath, vsebina);\n}\n\nfunction normalizeAttributePath(pathValue: string | null | undefined): string {\n if (!pathValue) return \"\";\n return pathValue.replace(/\\/+$/, \"\");\n}\n\nfunction buildAttributeEntries(attributes: Array<UnsAttributeSummary | null | undefined>) {\n const deduped = new Map<string, {\n path: string;\n description: string | null;\n attributeType: string | null;\n dataGroup: string | null;\n objectType: string | null;\n objectId: string | null;\n }>();\n\n for (const attr of attributes) {\n if (!attr) continue;\n const path = normalizeAttributePath(typeof attr.path === \"string\" ? attr.path : null);\n if (!path) continue;\n deduped.set(path, {\n path,\n description: typeof attr.description === \"string\" ? attr.description : null,\n attributeType: typeof attr.attributeType === \"string\" ? attr.attributeType : null,\n dataGroup: typeof attr.dataGroup === \"string\" ? attr.dataGroup : null,\n objectType: typeof attr.objectType === \"string\" ? attr.objectType : null,\n objectId: typeof attr.objectId === \"string\" ? attr.objectId : null,\n });\n }\n\n return Array.from(deduped.values()).sort((a, b) => a.path.localeCompare(b.path));\n}\n\nfunction buildAssetEntries(assets: Array<UnsAssetSummary | null | undefined>) {\n const deduped = new Map<string, {\n asset: string;\n description: string | null;\n }>();\n\n for (const entry of assets) {\n if (!entry) continue;\n const assetName = typeof entry.asset === \"string\" ? entry.asset.trim() : \"\";\n if (!assetName) continue;\n const description = typeof entry.description === \"string\" ? entry.description : null;\n if (!deduped.has(assetName)) {\n deduped.set(assetName, { asset: assetName, description });\n }\n }\n\n return Array.from(deduped.values()).sort((a, b) => a.asset.localeCompare(b.asset));\n}\n\n// Fetch and generate UnsAssets\nasync function refreshUnsAssets() {\n const document = gql`\n query GetAssets {\n GetAssets {\n path\n description\n asset\n objectType\n objectId\n }\n }`;\n\n const query: any = await requestWithAuth(document);\n let assets = buildAssetEntries(Array.isArray(query.GetAssets) ? query.GetAssets : []);\n if (!assets.length) {\n assets = [{ asset: \"asset\", description: null }];\n }\n\n const header = `// Generated UNS asset list. Run \\`pnpm run refresh-uns\\` to update.\\n`;\n const entries = assets\n .map((entry) => {\n const comment = entry.description ? ` /** ${sanitizeComment(entry.description)} */\\n` : \"\";\n return `${comment} \"${entry.asset}\": \"${entry.asset}\",`;\n })\n .join(\"\\n\");\n\n const helpers = `\nexport function resolveGeneratedAsset(name: keyof typeof GeneratedAssets): (typeof GeneratedAssets)[keyof typeof GeneratedAssets];\nexport function resolveGeneratedAsset<T extends string>(name: T): (typeof GeneratedAssets)[keyof typeof GeneratedAssets] | T;\nexport function resolveGeneratedAsset(name: string): string {\n return (GeneratedAssets as Record<string, string>)[name] ?? name;\n}\n`;\n\n const vsebina = `${header}export const GeneratedAssets = {\\n${entries}\\n} as const;\\nexport type GeneratedAssetName = typeof GeneratedAssets[keyof typeof GeneratedAssets];\\n${helpers}`;\n const outputPath = path.resolve(process.cwd(), \"src/uns/uns-assets.ts\");\n await ensureDirectory(path.dirname(outputPath));\n await writeToFile(outputPath, vsebina);\n}\n\n// Execute the refresh processes\nasync function refresh() {\n await Promise.all([refreshUnsTopics(), refreshUnsTags(), refreshUnsAssets()]);\n}\n\nrefresh().catch(error => console.error('Error during refresh:', error));\n\nasync function ensureDirectory(dirPath: string): Promise<void> {\n await mkdir(dirPath, { recursive: true });\n}\n\nfunction sanitizeComment(text: string): string {\n return text.replace(/\\*\\//g, \"*\\\\/\");\n}\n"]}
|
package/dist/tools/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/tools/schema.ts"],"names":[],"mappings":"","sourcesContent":["export type Maybe<T> = T | null;\
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/tools/schema.ts"],"names":[],"mappings":"","sourcesContent":["export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n ID: { input: string; output: string; }\n String: { input: string; output: string; }\n Boolean: { input: boolean; output: boolean; }\n Int: { input: number; output: number; }\n Float: { input: number; output: number; }\n Date: { input: any; output: any; }\n};\n\nexport type ActivateMqttTranslation = {\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n sourceTag?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** MQTT Translator object. */\nexport type AddMqttTranslation = {\n description?: InputMaybe<Scalars['String']['input']>;\n sourceTag?: InputMaybe<Scalars['String']['input']>;\n sourceTopic?: InputMaybe<Scalars['String']['input']>;\n targetTag?: InputMaybe<Scalars['String']['input']>;\n targetTopic?: InputMaybe<Scalars['String']['input']>;\n uom?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type AddMqttTranslatorTopic = {\n sourceTopic?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type DeleteMqttTranslation = {\n sourceTag?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type DeleteMqttTranslatorTopic = {\n sourceTopic?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type InitMqttTranslation = {\n sourceTag?: InputMaybe<Scalars['String']['input']>;\n sourceTopic?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type InsertUnsNode = {\n parent?: InputMaybe<Scalars['Int']['input']>;\n unsNode?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type ModifyMqttTranslation = {\n description?: InputMaybe<Scalars['String']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n sourceTag?: InputMaybe<Scalars['String']['input']>;\n targetTag?: InputMaybe<Scalars['String']['input']>;\n targetTopic?: InputMaybe<Scalars['String']['input']>;\n uom?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** MQTT Translator object. */\nexport type MqttTranslation = {\n __typename?: 'MqttTranslation';\n description?: Maybe<Scalars['String']['output']>;\n enabled?: Maybe<Scalars['Boolean']['output']>;\n sourceTag?: Maybe<Scalars['String']['output']>;\n sourceTopic?: Maybe<Scalars['String']['output']>;\n targetTag?: Maybe<Scalars['String']['output']>;\n targetTopic?: Maybe<Scalars['String']['output']>;\n uom?: Maybe<Scalars['String']['output']>;\n};\n\nexport type MqttTranslatorTopic = {\n __typename?: 'MqttTranslatorTopic';\n sourceTopic?: Maybe<Scalars['String']['output']>;\n};\n\nexport type Mutation = {\n __typename?: 'Mutation';\n ActivateMqttTranslation?: Maybe<Scalars['Boolean']['output']>;\n AddMqttTranslation?: Maybe<Scalars['Boolean']['output']>;\n /** Add MQTT topic to be translated. */\n AddMqttTranslatorTopic?: Maybe<Scalars['Boolean']['output']>;\n AddUnsNode?: Maybe<Scalars['Boolean']['output']>;\n /** Add MQTT translation. */\n DeleteMqttTranslation?: Maybe<Scalars['Boolean']['output']>;\n DeleteMqttTranslatorTopic?: Maybe<Scalars['Boolean']['output']>;\n DeleteRttNode?: Maybe<Scalars['Boolean']['output']>;\n DeleteUnsNode?: Maybe<Scalars['Boolean']['output']>;\n DeployRttNode?: Maybe<Scalars['Boolean']['output']>;\n /** Populate MQTT Translator table with sourceTag and sourceTopic. */\n InitMqttTranslation?: Maybe<Scalars['Boolean']['output']>;\n /** Update MQTT Translator table with defined targetTopic. */\n ModifyMqttTranslation?: Maybe<Scalars['Boolean']['output']>;\n ModifyUnsNode?: Maybe<Scalars['Boolean']['output']>;\n StartRttNode?: Maybe<Scalars['Boolean']['output']>;\n StopRttNode?: Maybe<Scalars['Boolean']['output']>;\n};\n\n\nexport type MutationActivateMqttTranslationArgs = {\n entry?: InputMaybe<ActivateMqttTranslation>;\n};\n\n\nexport type MutationAddMqttTranslationArgs = {\n entry?: InputMaybe<AddMqttTranslation>;\n};\n\n\nexport type MutationAddMqttTranslatorTopicArgs = {\n entry?: InputMaybe<AddMqttTranslatorTopic>;\n};\n\n\nexport type MutationAddUnsNodeArgs = {\n node?: InputMaybe<InsertUnsNode>;\n};\n\n\nexport type MutationDeleteMqttTranslationArgs = {\n entry?: InputMaybe<DeleteMqttTranslation>;\n};\n\n\nexport type MutationDeleteMqttTranslatorTopicArgs = {\n entry?: InputMaybe<DeleteMqttTranslatorTopic>;\n};\n\n\nexport type MutationDeleteRttNodeArgs = {\n rttNode?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type MutationDeleteUnsNodeArgs = {\n id?: InputMaybe<Scalars['Int']['input']>;\n};\n\n\nexport type MutationDeployRttNodeArgs = {\n rttNode?: InputMaybe<Scalars['String']['input']>;\n tag?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type MutationInitMqttTranslationArgs = {\n entry?: InputMaybe<InitMqttTranslation>;\n};\n\n\nexport type MutationModifyMqttTranslationArgs = {\n entry?: InputMaybe<ModifyMqttTranslation>;\n};\n\n\nexport type MutationModifyUnsNodeArgs = {\n id?: InputMaybe<Scalars['Int']['input']>;\n node?: InputMaybe<UpdateUnsNode>;\n};\n\n\nexport type MutationStartRttNodeArgs = {\n rttNode?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type MutationStopRttNodeArgs = {\n rttNode?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** name: uns-datahub */\nexport type Query = {\n __typename?: 'Query';\n GetAssets?: Maybe<Array<Maybe<UnsAssetSummary>>>;\n GetAttributes?: Maybe<Array<Maybe<UnsAttributeSummary>>>;\n GetTags?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n /** Get MQTT Translator translations. */\n GetMqttTranslations?: Maybe<Array<Maybe<MqttTranslation>>>;\n GetMqttTranslatorTopics?: Maybe<Array<Maybe<MqttTranslatorTopic>>>;\n GetRttNodes?: Maybe<Array<Maybe<RttNode>>>;\n GetTreeStructure?: Maybe<Array<Maybe<TreeStructure>>>;\n};\n\nexport type QueryGetAssetsArgs = {\n pathPrefix?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type QueryGetAttributesArgs = {\n pathPrefix?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type RttNode = {\n __typename?: 'RttNode';\n author?: Maybe<Scalars['String']['output']>;\n deployedVersions?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n description?: Maybe<Scalars['String']['output']>;\n lastLog?: Maybe<Scalars['String']['output']>;\n latestDeployedVersion?: Maybe<Scalars['String']['output']>;\n memory?: Maybe<Scalars['Int']['output']>;\n pid?: Maybe<Scalars['Int']['output']>;\n restarts?: Maybe<Scalars['Int']['output']>;\n rttNode?: Maybe<Scalars['String']['output']>;\n runningVersion?: Maybe<Scalars['String']['output']>;\n status?: Maybe<Scalars['String']['output']>;\n uptime?: Maybe<Scalars['Int']['output']>;\n version?: Maybe<Scalars['String']['output']>;\n};\n\nexport type TreeStructure = {\n __typename?: 'TreeStructure';\n children?: Maybe<Array<Maybe<TreeStructure>>>;\n id?: Maybe<Scalars['Int']['output']>;\n parent?: Maybe<Scalars['Int']['output']>;\n unsNode?: Maybe<Scalars['String']['output']>;\n};\n\nexport type UnsAssetSummary = {\n __typename?: 'UnsAssetSummary';\n asset?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Scalars['String']['output']>;\n objectId?: Maybe<Scalars['String']['output']>;\n objectType?: Maybe<Scalars['String']['output']>;\n path?: Maybe<Scalars['String']['output']>;\n};\n\nexport type UnsAttributeSummary = {\n __typename?: 'UnsAttributeSummary';\n attributeType?: Maybe<Scalars['String']['output']>;\n dataGroup?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Scalars['String']['output']>;\n objectId?: Maybe<Scalars['String']['output']>;\n objectType?: Maybe<Scalars['String']['output']>;\n path?: Maybe<Scalars['String']['output']>;\n};\n\nexport type UnsNode = {\n __typename?: 'UnsNode';\n id?: Maybe<Scalars['Int']['output']>;\n parent?: Maybe<Scalars['Int']['output']>;\n unsNode?: Maybe<Scalars['String']['output']>;\n};\n\nexport type UpdateUnsNode = {\n parent?: InputMaybe<Scalars['Int']['input']>;\n unsNode?: InputMaybe<Scalars['String']['input']>;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-uns-schema.js","sourceRoot":"","sources":["../../src/tools/sync-uns-schema.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\r\nimport { access, readFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport process from \"node:process\";\r\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\r\nimport { readTextFileIfExists, writeTextFileIfChanged } from \"./file-utils.js\";\r\nimport { renderDictionaryTs } from \"./generate-uns-dictionary.js\";\r\nimport { renderMeasurementsTs } from \"./generate-uns-measurements.js\";\r\n\r\ntype SchemaStatus = \"active\" | \"draft\" | \"deprecated\" | \"all\";\r\n\r\ntype DictionaryDocument = Parameters<typeof renderDictionaryTs>[0];\r\ntype MeasurementsDocument = Parameters<typeof renderMeasurementsTs>[0];\r\n\r\ntype CliArgs = {\r\n controllerUrl: string;\r\n token: string;\r\n status: SchemaStatus;\r\n projectRoot?: string;\r\n dryRun: boolean;\r\n dictionaryOnly: boolean;\r\n measurementsOnly: boolean;\r\n skipGenerate: boolean;\r\n help: boolean;\r\n};\r\n\r\ntype FileChangeResult = {\r\n changed: boolean;\r\n relativePath: string;\r\n};\r\n\r\ntype DictionarySummary = {\r\n objectTypeCount: number;\r\n attributeCount: number;\r\n jsonChanged: boolean;\r\n generatedChanged: FileChangeResult[];\r\n};\r\n\r\ntype MeasurementsSummary = {\r\n categoryCount: number;\r\n jsonChanged: boolean;\r\n generatedChanged: FileChangeResult[];\r\n};\r\n\r\ntype SyncTarget = {\r\n rootDir: string;\r\n label: string;\r\n dictionaryJson: string;\r\n measurementsJson: string;\r\n dictionaryGenerated: string[];\r\n measurementsGenerated: string[];\r\n};\r\n\r\nconst DEFAULT_STATUS: SchemaStatus = \"active\";\r\nconst GENERATOR_LANG = \"sl\";\r\nconst STATUS_VALUES: SchemaStatus[] = [\"active\", \"draft\", \"deprecated\", \"all\"];\r\n\r\nconst isDirectExecution = process.argv[1]\r\n ? path.resolve(process.argv[1]).endsWith(path.basename(fileURLToPath(import.meta.url)))\r\n : false;\r\n\r\nasync function main(): Promise<void> {\r\n const args = await parseArgs(process.argv.slice(2));\r\n\r\n if (args.help) {\r\n printHelp();\r\n return;\r\n }\r\n\r\n const target = await resolveSyncTarget(args);\r\n\r\n const shouldSyncDictionary = !args.measurementsOnly;\r\n const shouldSyncMeasurements = !args.dictionaryOnly;\r\n\r\n const [dictionaryDocument, measurementsDocument] = await Promise.all([\r\n shouldSyncDictionary ? fetchDictionaryDocument(args.controllerUrl, args.token, args.status) : Promise.resolve(undefined),\r\n shouldSyncMeasurements ? fetchMeasurementsDocument(args.controllerUrl, args.token) : Promise.resolve(undefined),\r\n ]);\r\n\r\n let dictionarySummary: DictionarySummary | undefined;\r\n let measurementsSummary: MeasurementsSummary | undefined;\r\n\r\n if (dictionaryDocument) {\r\n const content = formatJsonDocument(dictionaryDocument);\r\n const jsonResult = await updateFile(target.dictionaryJson, content, target.rootDir, args.dryRun);\r\n const generatedChanged = args.skipGenerate\r\n ? []\r\n : await updateGeneratedFiles(\r\n target.dictionaryGenerated,\r\n renderDictionaryTs(dictionaryDocument, GENERATOR_LANG),\r\n target.rootDir,\r\n args.dryRun,\r\n );\r\n\r\n dictionarySummary = {\r\n objectTypeCount: Object.keys(dictionaryDocument.objectTypes ?? {}).length,\r\n attributeCount: Object.keys(dictionaryDocument.attributes ?? {}).length,\r\n jsonChanged: jsonResult.changed,\r\n generatedChanged,\r\n };\r\n }\r\n\r\n if (measurementsDocument) {\r\n const content = formatJsonDocument(measurementsDocument);\r\n const jsonResult = await updateFile(target.measurementsJson, content, target.rootDir, args.dryRun);\r\n const generatedChanged = args.skipGenerate\r\n ? []\r\n : await updateGeneratedFiles(\r\n target.measurementsGenerated,\r\n renderMeasurementsTs(measurementsDocument, GENERATOR_LANG),\r\n target.rootDir,\r\n args.dryRun,\r\n );\r\n\r\n measurementsSummary = {\r\n categoryCount: countMeasurementCategories(measurementsDocument),\r\n jsonChanged: jsonResult.changed,\r\n generatedChanged,\r\n };\r\n }\r\n\r\n printSummary({\r\n controllerUrl: args.controllerUrl,\r\n targetLabel: target.label,\r\n targetRoot: target.rootDir,\r\n dryRun: args.dryRun,\r\n skipGenerate: args.skipGenerate,\r\n status: args.status,\r\n dictionary: dictionarySummary,\r\n measurements: measurementsSummary,\r\n });\r\n}\r\n\r\nasync function getControllerUrlFromConfig(): Promise<string | undefined> {\r\n const currentDir = process.cwd();\r\n const configPath = path.join(currentDir, \"config.json\");\r\n try {\r\n const raw = await readFile(configPath, \"utf8\");\r\n const config = JSON.parse(raw) as Record<string, unknown>;\r\n const unsConfig = config.uns as Record<string, unknown> | undefined;\r\n const restUrl = unsConfig?.rest as string | undefined;\r\n if (restUrl && typeof restUrl === \"string\") {\r\n // Remove trailing /api from the rest URL to get the base controller URL\r\n return restUrl.endsWith(\"/api\") ? restUrl.slice(0, -4) : restUrl;\r\n }\r\n } catch (error) {\r\n // Ignore missing or invalid config.json\r\n }\r\n return undefined;\r\n}\r\n\r\nasync function promptForToken(): Promise<string> {\r\n return new Promise((resolve) => {\r\n const stdin = process.stdin;\r\n const wasRaw = stdin.isRaw;\r\n\r\n stdin.setRawMode(true);\r\n stdin.resume();\r\n process.stderr.write(\"Enter controller token: \");\r\n\r\n let token = \"\";\r\n\r\n stdin.on(\"data\", onChar);\r\n\r\n function onChar(char: Buffer): void {\r\n const code = char[0];\r\n // Enter (13) or newline (10) — done\r\n if (code === 13 || code === 10) {\r\n stdin.removeListener(\"data\", onChar);\r\n stdin.setRawMode(wasRaw ?? false);\r\n stdin.pause();\r\n process.stderr.write(\"\\n\");\r\n resolve(token);\r\n return;\r\n }\r\n // Ctrl+C — abort\r\n if (code === 3) {\r\n stdin.removeListener(\"data\", onChar);\r\n stdin.setRawMode(wasRaw ?? false);\r\n process.stderr.write(\"\\n\");\r\n process.exit(1);\r\n }\r\n // Backspace (127) or Delete (8)\r\n if (code === 127 || code === 8) {\r\n token = token.slice(0, -1);\r\n } else if (code >= 32) {\r\n token += char.toString(\"utf8\");\r\n }\r\n }\r\n });\r\n}\r\n\r\nasync function parseArgs(argv: string[]): Promise<CliArgs> {\r\n let controllerUrl = process.env.UNS_CONTROLLER_URL?.trim() ?? \"\";\r\n let token = process.env.UNS_CONTROLLER_TOKEN?.trim() ?? \"\";\r\n let status = normalizeStatus(process.env.UNS_SCHEMA_STATUS, DEFAULT_STATUS);\r\n let projectRoot = process.env.UNS_SCHEMA_PROJECT_ROOT?.trim() || undefined;\r\n let dryRun = false;\r\n let dictionaryOnly = false;\r\n let measurementsOnly = false;\r\n let skipGenerate = false;\r\n let help = false;\r\n\r\n for (let index = 0; index < argv.length; index += 1) {\r\n const arg = argv[index];\r\n\r\n if (arg === \"--help\" || arg === \"-h\") {\r\n help = true;\r\n continue;\r\n }\r\n\r\n if (arg === \"--dry-run\") {\r\n dryRun = true;\r\n continue;\r\n }\r\n\r\n if (arg === \"--dictionary-only\") {\r\n dictionaryOnly = true;\r\n continue;\r\n }\r\n\r\n if (arg === \"--measurements-only\") {\r\n measurementsOnly = true;\r\n continue;\r\n }\r\n\r\n if (arg === \"--skip-generate\") {\r\n skipGenerate = true;\r\n continue;\r\n }\r\n\r\n if (arg === \"--project-root\") {\r\n projectRoot = readRequiredValue(argv, ++index, \"--project-root\");\r\n continue;\r\n }\r\n\r\n if (arg.startsWith(\"--project-root=\")) {\r\n projectRoot = arg.slice(\"--project-root=\".length);\r\n continue;\r\n }\r\n\r\n if (arg === \"--controller-url\") {\r\n controllerUrl = readRequiredValue(argv, ++index, \"--controller-url\");\r\n continue;\r\n }\r\n\r\n if (arg.startsWith(\"--controller-url=\")) {\r\n controllerUrl = arg.slice(\"--controller-url=\".length);\r\n continue;\r\n }\r\n\r\n if (arg === \"--token\") {\r\n token = readRequiredValue(argv, ++index, \"--token\");\r\n continue;\r\n }\r\n\r\n if (arg.startsWith(\"--token=\")) {\r\n token = arg.slice(\"--token=\".length);\r\n continue;\r\n }\r\n\r\n if (arg === \"--status\") {\r\n status = normalizeStatus(readRequiredValue(argv, ++index, \"--status\"), DEFAULT_STATUS);\r\n continue;\r\n }\r\n\r\n if (arg.startsWith(\"--status=\")) {\r\n status = normalizeStatus(arg.slice(\"--status=\".length), DEFAULT_STATUS);\r\n continue;\r\n }\r\n\r\n throw new Error(`Unknown argument: ${arg}`);\r\n }\r\n\r\n // Try to load controller URL from config.json if not provided\r\n if (!controllerUrl) {\r\n const configUrl = await getControllerUrlFromConfig();\r\n if (configUrl) {\r\n controllerUrl = configUrl;\r\n }\r\n }\r\n\r\n if (!help) {\r\n if (dictionaryOnly && measurementsOnly) {\r\n throw new Error(\"Choose either --dictionary-only or --measurements-only, not both.\");\r\n }\r\n if (!controllerUrl) {\r\n throw new Error(\"Missing controller URL. Use --controller-url, set UNS_CONTROLLER_URL, or provide config.json with uns.rest.\");\r\n }\r\n if (!token) {\r\n // Prompt for token if stdin is a TTY (interactive terminal)\r\n if (process.stdin.isTTY) {\r\n token = await promptForToken();\r\n }\r\n if (!token) {\r\n throw new Error(\"Missing controller token. Use --token, set UNS_CONTROLLER_TOKEN, or provide it interactively.\");\r\n }\r\n }\r\n // Strip \"Bearer \" prefix if the user included it\r\n if (token.toLowerCase().startsWith(\"bearer \")) {\r\n token = token.slice(7).trim();\r\n }\r\n assertValidUrl(controllerUrl);\r\n }\r\n\r\n return {\r\n controllerUrl,\r\n token,\r\n status,\r\n projectRoot,\r\n dryRun,\r\n dictionaryOnly,\r\n measurementsOnly,\r\n skipGenerate,\r\n help,\r\n };\r\n}\r\n\r\nfunction readRequiredValue(argv: string[], index: number, flag: string): string {\r\n const value = argv[index];\r\n if (!value) {\r\n throw new Error(`Missing value for ${flag}.`);\r\n }\r\n return value;\r\n}\r\n\r\nfunction normalizeStatus(value: string | undefined, fallback: SchemaStatus): SchemaStatus {\r\n if (!value) return fallback;\r\n const normalized = value.trim().toLowerCase();\r\n if (STATUS_VALUES.includes(normalized as SchemaStatus)) {\r\n return normalized as SchemaStatus;\r\n }\r\n throw new Error(`Invalid --status value \"${value}\". Expected one of: ${STATUS_VALUES.join(\", \")}.`);\r\n}\r\n\r\nfunction assertValidUrl(value: string): void {\r\n try {\r\n new URL(value);\r\n } catch (error) {\r\n throw new Error(`Invalid controller URL \"${value}\". Expected an absolute URL such as http://localhost:3200.`);\r\n }\r\n}\r\n\r\nfunction printHelp(): void {\r\n console.log(`Usage: tsx packages/uns-core/src/tools/sync-uns-schema.ts [options]\r\n\r\nPull the canonical UNS schema export from a controller and refresh the local\r\nJSON files plus generated TypeScript artifacts.\r\n\r\nOptions:\r\n --controller-url <url> Controller base URL (env: UNS_CONTROLLER_URL, or config.json > uns.rest)\r\n --token <token> Bearer token for REST export (env: UNS_CONTROLLER_TOKEN)\r\n --status <value> Dictionary status filter: ${STATUS_VALUES.join(\"|\")} (default: ${DEFAULT_STATUS}, env: UNS_SCHEMA_STATUS)\r\n --project-root <dir> Write into a generated microservice project root (env: UNS_SCHEMA_PROJECT_ROOT).\r\n When omitted, the tool auto-detects a generated project from the current working directory\r\n and otherwise updates the uns-kit repo templates.\r\n --dry-run Report file changes without writing anything\r\n --dictionary-only Sync only the UNS dictionary export\r\n --measurements-only Sync only the UNS measurements export\r\n --skip-generate Skip generated TypeScript refresh\r\n --help, -h Show this help\r\n`);\r\n}\r\n\r\nasync function findRepoRoot(): Promise<string> {\r\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\r\n let probeDir = currentDir;\r\n\r\n while (true) {\r\n const packageJsonPath = path.join(probeDir, \"package.json\");\r\n try {\r\n const raw = await readFile(packageJsonPath, \"utf8\");\r\n const pkg = JSON.parse(raw) as { name?: string };\r\n if (pkg.name === \"@uns-kit/core\") {\r\n return path.resolve(probeDir, \"../..\");\r\n }\r\n } catch (error) {\r\n // Ignore missing package.json and continue walking upward.\r\n }\r\n\r\n const parentDir = path.dirname(probeDir);\r\n if (parentDir === probeDir) {\r\n break;\r\n }\r\n probeDir = parentDir;\r\n }\r\n\r\n throw new Error(\"Could not locate the @uns-kit/core package directory from sync-uns-schema.ts.\");\r\n}\r\n\r\nasync function resolveSyncTarget(args: CliArgs): Promise<SyncTarget> {\r\n if (args.projectRoot) {\r\n return buildProjectTarget(path.resolve(process.cwd(), args.projectRoot));\r\n }\r\n\r\n const currentDir = process.cwd();\r\n if (await looksLikeGeneratedProjectRoot(currentDir)) {\r\n return buildProjectTarget(currentDir);\r\n }\r\n\r\n return buildRepoTarget(await findRepoRoot());\r\n}\r\n\r\nfunction buildRepoTarget(repoRoot: string): SyncTarget {\r\n return {\r\n rootDir: repoRoot,\r\n label: \"uns-kit repo templates\",\r\n dictionaryJson: path.join(repoRoot, \"packages/uns-cli/templates/uns-dictionary/uns-dictionary.json\"),\r\n measurementsJson: path.join(repoRoot, \"packages/uns-cli/templates/uns-measurements/uns-measurements.json\"),\r\n dictionaryGenerated: [\r\n path.join(repoRoot, \"packages/uns-core/src/uns/uns-dictionary.generated.ts\"),\r\n path.join(repoRoot, \"packages/uns-cli/templates/default/src/uns/uns-dictionary.generated.ts\"),\r\n ],\r\n measurementsGenerated: [\r\n path.join(repoRoot, \"packages/uns-core/src/uns/uns-measurements.generated.ts\"),\r\n path.join(repoRoot, \"packages/uns-cli/templates/default/src/uns/uns-measurements.generated.ts\"),\r\n ],\r\n };\r\n}\r\n\r\nfunction buildProjectTarget(projectRoot: string): SyncTarget {\r\n return {\r\n rootDir: projectRoot,\r\n label: \"generated microservice project\",\r\n dictionaryJson: path.join(projectRoot, \"uns-dictionary.json\"),\r\n measurementsJson: path.join(projectRoot, \"uns-measurements.json\"),\r\n dictionaryGenerated: [path.join(projectRoot, \"src/uns/uns-dictionary.generated.ts\")],\r\n measurementsGenerated: [path.join(projectRoot, \"src/uns/uns-measurements.generated.ts\")],\r\n };\r\n}\r\n\r\nasync function looksLikeGeneratedProjectRoot(rootDir: string): Promise<boolean> {\r\n const [hasPackageJson, hasConfigJson, hasUnsDir] = await Promise.all([\r\n pathExists(path.join(rootDir, \"package.json\")),\r\n pathExists(path.join(rootDir, \"config.json\")),\r\n pathExists(path.join(rootDir, \"src/uns\")),\r\n ]);\r\n\r\n return hasPackageJson && hasConfigJson && hasUnsDir;\r\n}\r\n\r\nasync function pathExists(targetPath: string): Promise<boolean> {\r\n try {\r\n await access(targetPath);\r\n return true;\r\n } catch (error) {\r\n return false;\r\n }\r\n}\r\n\r\nfunction buildControllerUrl(controllerUrl: string, relativePath: string): URL {\r\n const base = new URL(controllerUrl);\r\n if (!base.pathname.endsWith(\"/\")) {\r\n base.pathname = `${base.pathname}/`;\r\n }\r\n return new URL(relativePath, base);\r\n}\r\n\r\nasync function fetchDictionaryDocument(\r\n controllerUrl: string,\r\n token: string,\r\n status: SchemaStatus,\r\n): Promise<DictionaryDocument> {\r\n const url = buildControllerUrl(controllerUrl, `api/schema/export/uns-dictionary?status=${encodeURIComponent(status)}`);\r\n const document = await fetchJson(url, token, \"UNS dictionary\");\r\n if (!document || typeof document !== \"object\" || Array.isArray(document)) {\r\n throw new Error(`Controller returned an invalid UNS dictionary document from ${url.toString()}.`);\r\n }\r\n return document as DictionaryDocument;\r\n}\r\n\r\nasync function fetchMeasurementsDocument(controllerUrl: string, token: string): Promise<MeasurementsDocument> {\r\n const url = buildControllerUrl(controllerUrl, \"api/schema/export/uns-measurements\");\r\n const document = await fetchJson(url, token, \"UNS measurements\");\r\n if (!document || typeof document !== \"object\" || Array.isArray(document)) {\r\n throw new Error(`Controller returned an invalid UNS measurements document from ${url.toString()}.`);\r\n }\r\n return document as MeasurementsDocument;\r\n}\r\n\r\nasync function fetchJson(url: URL, token: string, label: string): Promise<unknown> {\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n headers: {\r\n Accept: \"application/json\",\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n } catch (error) {\r\n throw new Error(`Network failure while fetching ${label} export from ${url.toString()}: ${(error as Error).message}`);\r\n }\r\n\r\n const text = await response.text();\r\n\r\n if (!response.ok) {\r\n throw new Error(formatHttpError(response, url, label, text));\r\n }\r\n\r\n try {\r\n return JSON.parse(text);\r\n } catch (error) {\r\n throw new Error(`Controller returned invalid JSON for the ${label} export from ${url.toString()}.`);\r\n }\r\n}\r\n\r\nfunction formatHttpError(response: Response, url: URL, label: string, body: string): string {\r\n if (response.status === 401) {\r\n return `Token is invalid or expired (401). Provide a valid token via --token, UNS_CONTROLLER_TOKEN, or the interactive prompt.`;\r\n }\r\n\r\n if (response.status === 403) {\r\n return `Forbidden (403) while fetching ${label} export from ${url.toString()}. The token must have admin access.`;\r\n }\r\n\r\n const detail = extractErrorDetail(body);\r\n return `Failed to fetch ${label} export from ${url.toString()}: HTTP ${response.status}${detail ? ` - ${detail}` : \"\"}`;\r\n}\r\n\r\nfunction extractErrorDetail(body: string): string {\r\n const trimmed = body.trim();\r\n if (!trimmed) return \"\";\r\n\r\n try {\r\n const parsed = JSON.parse(trimmed) as { error?: unknown; message?: unknown };\r\n if (typeof parsed.error === \"string\" && parsed.error.trim().length > 0) {\r\n return parsed.error.trim();\r\n }\r\n if (typeof parsed.message === \"string\" && parsed.message.trim().length > 0) {\r\n return parsed.message.trim();\r\n }\r\n } catch (error) {\r\n // Fall back to plain text handling below.\r\n }\r\n\r\n return trimmed.replace(/\\s+/g, \" \").slice(0, 200);\r\n}\r\n\r\nfunction formatJsonDocument(document: unknown): string {\r\n return `${JSON.stringify(document, null, 2)}\\n`;\r\n}\r\n\r\nasync function updateGeneratedFiles(\r\n filePaths: string[],\r\n content: string,\r\n repoRoot: string,\r\n dryRun: boolean,\r\n): Promise<FileChangeResult[]> {\r\n return Promise.all(filePaths.map((filePath) => updateFile(filePath, content, repoRoot, dryRun)));\r\n}\r\n\r\nasync function updateFile(\r\n filePath: string,\r\n content: string,\r\n repoRoot: string,\r\n dryRun: boolean,\r\n): Promise<FileChangeResult> {\r\n const current = await readTextFileIfExists(filePath);\r\n const changed = current !== content;\r\n const relativePath = path.relative(repoRoot, filePath);\r\n\r\n if (dryRun) {\r\n console.log(`${changed ? \"Would update\" : \"No change\"} ${relativePath}`);\r\n return { changed, relativePath };\r\n }\r\n\r\n if (!changed) {\r\n console.log(`Unchanged ${relativePath}`);\r\n return { changed: false, relativePath };\r\n }\r\n\r\n await writeTextFileIfChanged(filePath, content);\r\n console.log(`Updated ${relativePath}`);\r\n return { changed: true, relativePath };\r\n}\r\n\r\nfunction countMeasurementCategories(document: MeasurementsDocument): number {\r\n return Object.entries(document).filter(([key, value]) => {\r\n if (key === \"schemaVersion\") return false;\r\n return !!value && typeof value === \"object\" && !Array.isArray(value);\r\n }).length;\r\n}\r\n\r\nfunction printSummary(summary: {\r\n controllerUrl: string;\r\n targetLabel: string;\r\n targetRoot: string;\r\n dryRun: boolean;\r\n skipGenerate: boolean;\r\n status: SchemaStatus;\r\n dictionary?: DictionarySummary;\r\n measurements?: MeasurementsSummary;\r\n}): void {\r\n console.log(\"\");\r\n console.log(summary.dryRun ? \"Dry-run summary\" : \"Sync summary\");\r\n console.log(` Controller: ${summary.controllerUrl}`);\r\n console.log(` Target: ${summary.targetLabel}`);\r\n console.log(` Root: ${summary.targetRoot}`);\r\n console.log(` Dictionary status: ${summary.status}`);\r\n\r\n if (summary.dictionary) {\r\n console.log(\r\n ` Dictionary: ${summary.dictionary.objectTypeCount} object types, ${summary.dictionary.attributeCount} attributes, JSON ${summary.dictionary.jsonChanged ? \"changed\" : \"unchanged\"}`,\r\n );\r\n if (summary.skipGenerate) {\r\n console.log(\" Dictionary TS: skipped\");\r\n } else {\r\n console.log(` Dictionary TS: ${renderGeneratedSummary(summary.dictionary.generatedChanged)}`);\r\n }\r\n }\r\n\r\n if (summary.measurements) {\r\n console.log(\r\n ` Measurements: ${summary.measurements.categoryCount} categories, JSON ${summary.measurements.jsonChanged ? \"changed\" : \"unchanged\"}`,\r\n );\r\n if (summary.skipGenerate) {\r\n console.log(\" Measurements TS: skipped\");\r\n } else {\r\n console.log(` Measurements TS: ${renderGeneratedSummary(summary.measurements.generatedChanged)}`);\r\n }\r\n }\r\n}\r\n\r\nfunction renderGeneratedSummary(results: FileChangeResult[]): string {\r\n if (!results.length) return \"none\";\r\n const changedCount = results.filter((result) => result.changed).length;\r\n return `${changedCount}/${results.length} file${results.length === 1 ? \"\" : \"s\"} changed`;\r\n}\r\n\r\nif (isDirectExecution) {\r\n main().catch((error) => {\r\n console.error(\"Failed to sync UNS schema:\", error instanceof Error ? error.message : error);\r\n process.exitCode = 1;\r\n });\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"sync-uns-schema.js","sourceRoot":"","sources":["../../src/tools/sync-uns-schema.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { access, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { readTextFileIfExists, writeTextFileIfChanged } from \"./file-utils.js\";\nimport { renderDictionaryTs } from \"./generate-uns-dictionary.js\";\nimport { renderMeasurementsTs } from \"./generate-uns-measurements.js\";\n\ntype SchemaStatus = \"active\" | \"draft\" | \"deprecated\" | \"all\";\n\ntype DictionaryDocument = Parameters<typeof renderDictionaryTs>[0];\ntype MeasurementsDocument = Parameters<typeof renderMeasurementsTs>[0];\n\ntype CliArgs = {\n controllerUrl: string;\n token: string;\n status: SchemaStatus;\n projectRoot?: string;\n dryRun: boolean;\n dictionaryOnly: boolean;\n measurementsOnly: boolean;\n skipGenerate: boolean;\n help: boolean;\n};\n\ntype FileChangeResult = {\n changed: boolean;\n relativePath: string;\n};\n\ntype DictionarySummary = {\n objectTypeCount: number;\n attributeCount: number;\n jsonChanged: boolean;\n generatedChanged: FileChangeResult[];\n};\n\ntype MeasurementsSummary = {\n categoryCount: number;\n jsonChanged: boolean;\n generatedChanged: FileChangeResult[];\n};\n\ntype SyncTarget = {\n rootDir: string;\n label: string;\n dictionaryJson: string;\n measurementsJson: string;\n dictionaryGenerated: string[];\n measurementsGenerated: string[];\n};\n\nconst DEFAULT_STATUS: SchemaStatus = \"active\";\nconst GENERATOR_LANG = \"sl\";\nconst STATUS_VALUES: SchemaStatus[] = [\"active\", \"draft\", \"deprecated\", \"all\"];\n\nconst isDirectExecution = process.argv[1]\n ? path.resolve(process.argv[1]).endsWith(path.basename(fileURLToPath(import.meta.url)))\n : false;\n\nasync function main(): Promise<void> {\n const args = await parseArgs(process.argv.slice(2));\n\n if (args.help) {\n printHelp();\n return;\n }\n\n const target = await resolveSyncTarget(args);\n\n const shouldSyncDictionary = !args.measurementsOnly;\n const shouldSyncMeasurements = !args.dictionaryOnly;\n\n const [dictionaryDocument, measurementsDocument] = await Promise.all([\n shouldSyncDictionary ? fetchDictionaryDocument(args.controllerUrl, args.token, args.status) : Promise.resolve(undefined),\n shouldSyncMeasurements ? fetchMeasurementsDocument(args.controllerUrl, args.token) : Promise.resolve(undefined),\n ]);\n\n let dictionarySummary: DictionarySummary | undefined;\n let measurementsSummary: MeasurementsSummary | undefined;\n\n if (dictionaryDocument) {\n const content = formatJsonDocument(dictionaryDocument);\n const jsonResult = await updateFile(target.dictionaryJson, content, target.rootDir, args.dryRun);\n const generatedChanged = args.skipGenerate\n ? []\n : await updateGeneratedFiles(\n target.dictionaryGenerated,\n renderDictionaryTs(dictionaryDocument, GENERATOR_LANG),\n target.rootDir,\n args.dryRun,\n );\n\n dictionarySummary = {\n objectTypeCount: Object.keys(dictionaryDocument.objectTypes ?? {}).length,\n attributeCount: Object.keys(dictionaryDocument.attributes ?? {}).length,\n jsonChanged: jsonResult.changed,\n generatedChanged,\n };\n }\n\n if (measurementsDocument) {\n const content = formatJsonDocument(measurementsDocument);\n const jsonResult = await updateFile(target.measurementsJson, content, target.rootDir, args.dryRun);\n const generatedChanged = args.skipGenerate\n ? []\n : await updateGeneratedFiles(\n target.measurementsGenerated,\n renderMeasurementsTs(measurementsDocument, GENERATOR_LANG),\n target.rootDir,\n args.dryRun,\n );\n\n measurementsSummary = {\n categoryCount: countMeasurementCategories(measurementsDocument),\n jsonChanged: jsonResult.changed,\n generatedChanged,\n };\n }\n\n printSummary({\n controllerUrl: args.controllerUrl,\n targetLabel: target.label,\n targetRoot: target.rootDir,\n dryRun: args.dryRun,\n skipGenerate: args.skipGenerate,\n status: args.status,\n dictionary: dictionarySummary,\n measurements: measurementsSummary,\n });\n}\n\nasync function getControllerUrlFromConfig(): Promise<string | undefined> {\n const currentDir = process.cwd();\n const configPath = path.join(currentDir, \"config.json\");\n try {\n const raw = await readFile(configPath, \"utf8\");\n const config = JSON.parse(raw) as Record<string, unknown>;\n const unsConfig = config.uns as Record<string, unknown> | undefined;\n const restUrl = unsConfig?.rest as string | undefined;\n if (restUrl && typeof restUrl === \"string\") {\n // Remove trailing /api from the rest URL to get the base controller URL\n return restUrl.endsWith(\"/api\") ? restUrl.slice(0, -4) : restUrl;\n }\n } catch (error) {\n // Ignore missing or invalid config.json\n }\n return undefined;\n}\n\nasync function promptForToken(): Promise<string> {\n return new Promise((resolve) => {\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n\n stdin.setRawMode(true);\n stdin.resume();\n process.stderr.write(\"Enter controller token: \");\n\n let token = \"\";\n\n stdin.on(\"data\", onChar);\n\n function onChar(char: Buffer): void {\n const code = char[0];\n // Enter (13) or newline (10) — done\n if (code === 13 || code === 10) {\n stdin.removeListener(\"data\", onChar);\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n process.stderr.write(\"\\n\");\n resolve(token);\n return;\n }\n // Ctrl+C — abort\n if (code === 3) {\n stdin.removeListener(\"data\", onChar);\n stdin.setRawMode(wasRaw ?? false);\n process.stderr.write(\"\\n\");\n process.exit(1);\n }\n // Backspace (127) or Delete (8)\n if (code === 127 || code === 8) {\n token = token.slice(0, -1);\n } else if (code >= 32) {\n token += char.toString(\"utf8\");\n }\n }\n });\n}\n\nasync function parseArgs(argv: string[]): Promise<CliArgs> {\n let controllerUrl = process.env.UNS_CONTROLLER_URL?.trim() ?? \"\";\n let token = process.env.UNS_CONTROLLER_TOKEN?.trim() ?? \"\";\n let status = normalizeStatus(process.env.UNS_SCHEMA_STATUS, DEFAULT_STATUS);\n let projectRoot = process.env.UNS_SCHEMA_PROJECT_ROOT?.trim() || undefined;\n let dryRun = false;\n let dictionaryOnly = false;\n let measurementsOnly = false;\n let skipGenerate = false;\n let help = false;\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n\n if (arg === \"--help\" || arg === \"-h\") {\n help = true;\n continue;\n }\n\n if (arg === \"--dry-run\") {\n dryRun = true;\n continue;\n }\n\n if (arg === \"--dictionary-only\") {\n dictionaryOnly = true;\n continue;\n }\n\n if (arg === \"--measurements-only\") {\n measurementsOnly = true;\n continue;\n }\n\n if (arg === \"--skip-generate\") {\n skipGenerate = true;\n continue;\n }\n\n if (arg === \"--project-root\") {\n projectRoot = readRequiredValue(argv, ++index, \"--project-root\");\n continue;\n }\n\n if (arg.startsWith(\"--project-root=\")) {\n projectRoot = arg.slice(\"--project-root=\".length);\n continue;\n }\n\n if (arg === \"--controller-url\") {\n controllerUrl = readRequiredValue(argv, ++index, \"--controller-url\");\n continue;\n }\n\n if (arg.startsWith(\"--controller-url=\")) {\n controllerUrl = arg.slice(\"--controller-url=\".length);\n continue;\n }\n\n if (arg === \"--token\") {\n token = readRequiredValue(argv, ++index, \"--token\");\n continue;\n }\n\n if (arg.startsWith(\"--token=\")) {\n token = arg.slice(\"--token=\".length);\n continue;\n }\n\n if (arg === \"--status\") {\n status = normalizeStatus(readRequiredValue(argv, ++index, \"--status\"), DEFAULT_STATUS);\n continue;\n }\n\n if (arg.startsWith(\"--status=\")) {\n status = normalizeStatus(arg.slice(\"--status=\".length), DEFAULT_STATUS);\n continue;\n }\n\n throw new Error(`Unknown argument: ${arg}`);\n }\n\n // Try to load controller URL from config.json if not provided\n if (!controllerUrl) {\n const configUrl = await getControllerUrlFromConfig();\n if (configUrl) {\n controllerUrl = configUrl;\n }\n }\n\n if (!help) {\n if (dictionaryOnly && measurementsOnly) {\n throw new Error(\"Choose either --dictionary-only or --measurements-only, not both.\");\n }\n if (!controllerUrl) {\n throw new Error(\"Missing controller URL. Use --controller-url, set UNS_CONTROLLER_URL, or provide config.json with uns.rest.\");\n }\n if (!token) {\n // Prompt for token if stdin is a TTY (interactive terminal)\n if (process.stdin.isTTY) {\n token = await promptForToken();\n }\n if (!token) {\n throw new Error(\"Missing controller token. Use --token, set UNS_CONTROLLER_TOKEN, or provide it interactively.\");\n }\n }\n // Strip \"Bearer \" prefix if the user included it\n if (token.toLowerCase().startsWith(\"bearer \")) {\n token = token.slice(7).trim();\n }\n assertValidUrl(controllerUrl);\n }\n\n return {\n controllerUrl,\n token,\n status,\n projectRoot,\n dryRun,\n dictionaryOnly,\n measurementsOnly,\n skipGenerate,\n help,\n };\n}\n\nfunction readRequiredValue(argv: string[], index: number, flag: string): string {\n const value = argv[index];\n if (!value) {\n throw new Error(`Missing value for ${flag}.`);\n }\n return value;\n}\n\nfunction normalizeStatus(value: string | undefined, fallback: SchemaStatus): SchemaStatus {\n if (!value) return fallback;\n const normalized = value.trim().toLowerCase();\n if (STATUS_VALUES.includes(normalized as SchemaStatus)) {\n return normalized as SchemaStatus;\n }\n throw new Error(`Invalid --status value \"${value}\". Expected one of: ${STATUS_VALUES.join(\", \")}.`);\n}\n\nfunction assertValidUrl(value: string): void {\n try {\n new URL(value);\n } catch (error) {\n throw new Error(`Invalid controller URL \"${value}\". Expected an absolute URL such as http://localhost:3200.`);\n }\n}\n\nfunction printHelp(): void {\n console.log(`Usage: tsx packages/uns-core/src/tools/sync-uns-schema.ts [options]\n\nPull the canonical UNS schema export from a controller and refresh the local\nJSON files plus generated TypeScript artifacts.\n\nOptions:\n --controller-url <url> Controller base URL (env: UNS_CONTROLLER_URL, or config.json > uns.rest)\n --token <token> Bearer token for REST export (env: UNS_CONTROLLER_TOKEN)\n --status <value> Dictionary status filter: ${STATUS_VALUES.join(\"|\")} (default: ${DEFAULT_STATUS}, env: UNS_SCHEMA_STATUS)\n --project-root <dir> Write into a generated microservice project root (env: UNS_SCHEMA_PROJECT_ROOT).\n When omitted, the tool auto-detects a generated project from the current working directory\n and otherwise updates the uns-kit repo templates.\n --dry-run Report file changes without writing anything\n --dictionary-only Sync only the UNS dictionary export\n --measurements-only Sync only the UNS measurements export\n --skip-generate Skip generated TypeScript refresh\n --help, -h Show this help\n`);\n}\n\nasync function findRepoRoot(): Promise<string> {\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n let probeDir = currentDir;\n\n while (true) {\n const packageJsonPath = path.join(probeDir, \"package.json\");\n try {\n const raw = await readFile(packageJsonPath, \"utf8\");\n const pkg = JSON.parse(raw) as { name?: string };\n if (pkg.name === \"@uns-kit/core\") {\n return path.resolve(probeDir, \"../..\");\n }\n } catch (error) {\n // Ignore missing package.json and continue walking upward.\n }\n\n const parentDir = path.dirname(probeDir);\n if (parentDir === probeDir) {\n break;\n }\n probeDir = parentDir;\n }\n\n throw new Error(\"Could not locate the @uns-kit/core package directory from sync-uns-schema.ts.\");\n}\n\nasync function resolveSyncTarget(args: CliArgs): Promise<SyncTarget> {\n if (args.projectRoot) {\n return buildProjectTarget(path.resolve(process.cwd(), args.projectRoot));\n }\n\n const currentDir = process.cwd();\n if (await looksLikeGeneratedProjectRoot(currentDir)) {\n return buildProjectTarget(currentDir);\n }\n\n return buildRepoTarget(await findRepoRoot());\n}\n\nfunction buildRepoTarget(repoRoot: string): SyncTarget {\n return {\n rootDir: repoRoot,\n label: \"uns-kit repo templates\",\n dictionaryJson: path.join(repoRoot, \"packages/uns-cli/templates/uns-dictionary/uns-dictionary.json\"),\n measurementsJson: path.join(repoRoot, \"packages/uns-cli/templates/uns-measurements/uns-measurements.json\"),\n dictionaryGenerated: [\n path.join(repoRoot, \"packages/uns-core/src/uns/uns-dictionary.generated.ts\"),\n path.join(repoRoot, \"packages/uns-cli/templates/default/src/uns/uns-dictionary.generated.ts\"),\n ],\n measurementsGenerated: [\n path.join(repoRoot, \"packages/uns-core/src/uns/uns-measurements.generated.ts\"),\n path.join(repoRoot, \"packages/uns-cli/templates/default/src/uns/uns-measurements.generated.ts\"),\n ],\n };\n}\n\nfunction buildProjectTarget(projectRoot: string): SyncTarget {\n return {\n rootDir: projectRoot,\n label: \"generated microservice project\",\n dictionaryJson: path.join(projectRoot, \"uns-dictionary.json\"),\n measurementsJson: path.join(projectRoot, \"uns-measurements.json\"),\n dictionaryGenerated: [path.join(projectRoot, \"src/uns/uns-dictionary.generated.ts\")],\n measurementsGenerated: [path.join(projectRoot, \"src/uns/uns-measurements.generated.ts\")],\n };\n}\n\nasync function looksLikeGeneratedProjectRoot(rootDir: string): Promise<boolean> {\n const [hasPackageJson, hasConfigJson, hasUnsDir] = await Promise.all([\n pathExists(path.join(rootDir, \"package.json\")),\n pathExists(path.join(rootDir, \"config.json\")),\n pathExists(path.join(rootDir, \"src/uns\")),\n ]);\n\n return hasPackageJson && hasConfigJson && hasUnsDir;\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await access(targetPath);\n return true;\n } catch (error) {\n return false;\n }\n}\n\nfunction buildControllerUrl(controllerUrl: string, relativePath: string): URL {\n const base = new URL(controllerUrl);\n if (!base.pathname.endsWith(\"/\")) {\n base.pathname = `${base.pathname}/`;\n }\n return new URL(relativePath, base);\n}\n\nasync function fetchDictionaryDocument(\n controllerUrl: string,\n token: string,\n status: SchemaStatus,\n): Promise<DictionaryDocument> {\n const url = buildControllerUrl(controllerUrl, `api/schema/export/uns-dictionary?status=${encodeURIComponent(status)}`);\n const document = await fetchJson(url, token, \"UNS dictionary\");\n if (!document || typeof document !== \"object\" || Array.isArray(document)) {\n throw new Error(`Controller returned an invalid UNS dictionary document from ${url.toString()}.`);\n }\n return document as DictionaryDocument;\n}\n\nasync function fetchMeasurementsDocument(controllerUrl: string, token: string): Promise<MeasurementsDocument> {\n const url = buildControllerUrl(controllerUrl, \"api/schema/export/uns-measurements\");\n const document = await fetchJson(url, token, \"UNS measurements\");\n if (!document || typeof document !== \"object\" || Array.isArray(document)) {\n throw new Error(`Controller returned an invalid UNS measurements document from ${url.toString()}.`);\n }\n return document as MeasurementsDocument;\n}\n\nasync function fetchJson(url: URL, token: string, label: string): Promise<unknown> {\n let response: Response;\n\n try {\n response = await fetch(url, {\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n });\n } catch (error) {\n throw new Error(`Network failure while fetching ${label} export from ${url.toString()}: ${(error as Error).message}`);\n }\n\n const text = await response.text();\n\n if (!response.ok) {\n throw new Error(formatHttpError(response, url, label, text));\n }\n\n try {\n return JSON.parse(text);\n } catch (error) {\n throw new Error(`Controller returned invalid JSON for the ${label} export from ${url.toString()}.`);\n }\n}\n\nfunction formatHttpError(response: Response, url: URL, label: string, body: string): string {\n if (response.status === 401) {\n return `Token is invalid or expired (401). Provide a valid token via --token, UNS_CONTROLLER_TOKEN, or the interactive prompt.`;\n }\n\n if (response.status === 403) {\n return `Forbidden (403) while fetching ${label} export from ${url.toString()}. The token must have admin access.`;\n }\n\n const detail = extractErrorDetail(body);\n return `Failed to fetch ${label} export from ${url.toString()}: HTTP ${response.status}${detail ? ` - ${detail}` : \"\"}`;\n}\n\nfunction extractErrorDetail(body: string): string {\n const trimmed = body.trim();\n if (!trimmed) return \"\";\n\n try {\n const parsed = JSON.parse(trimmed) as { error?: unknown; message?: unknown };\n if (typeof parsed.error === \"string\" && parsed.error.trim().length > 0) {\n return parsed.error.trim();\n }\n if (typeof parsed.message === \"string\" && parsed.message.trim().length > 0) {\n return parsed.message.trim();\n }\n } catch (error) {\n // Fall back to plain text handling below.\n }\n\n return trimmed.replace(/\\s+/g, \" \").slice(0, 200);\n}\n\nfunction formatJsonDocument(document: unknown): string {\n return `${JSON.stringify(document, null, 2)}\\n`;\n}\n\nasync function updateGeneratedFiles(\n filePaths: string[],\n content: string,\n repoRoot: string,\n dryRun: boolean,\n): Promise<FileChangeResult[]> {\n return Promise.all(filePaths.map((filePath) => updateFile(filePath, content, repoRoot, dryRun)));\n}\n\nasync function updateFile(\n filePath: string,\n content: string,\n repoRoot: string,\n dryRun: boolean,\n): Promise<FileChangeResult> {\n const current = await readTextFileIfExists(filePath);\n const changed = current !== content;\n const relativePath = path.relative(repoRoot, filePath);\n\n if (dryRun) {\n console.log(`${changed ? \"Would update\" : \"No change\"} ${relativePath}`);\n return { changed, relativePath };\n }\n\n if (!changed) {\n console.log(`Unchanged ${relativePath}`);\n return { changed: false, relativePath };\n }\n\n await writeTextFileIfChanged(filePath, content);\n console.log(`Updated ${relativePath}`);\n return { changed: true, relativePath };\n}\n\nfunction countMeasurementCategories(document: MeasurementsDocument): number {\n return Object.entries(document).filter(([key, value]) => {\n if (key === \"schemaVersion\") return false;\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n }).length;\n}\n\nfunction printSummary(summary: {\n controllerUrl: string;\n targetLabel: string;\n targetRoot: string;\n dryRun: boolean;\n skipGenerate: boolean;\n status: SchemaStatus;\n dictionary?: DictionarySummary;\n measurements?: MeasurementsSummary;\n}): void {\n console.log(\"\");\n console.log(summary.dryRun ? \"Dry-run summary\" : \"Sync summary\");\n console.log(` Controller: ${summary.controllerUrl}`);\n console.log(` Target: ${summary.targetLabel}`);\n console.log(` Root: ${summary.targetRoot}`);\n console.log(` Dictionary status: ${summary.status}`);\n\n if (summary.dictionary) {\n console.log(\n ` Dictionary: ${summary.dictionary.objectTypeCount} object types, ${summary.dictionary.attributeCount} attributes, JSON ${summary.dictionary.jsonChanged ? \"changed\" : \"unchanged\"}`,\n );\n if (summary.skipGenerate) {\n console.log(\" Dictionary TS: skipped\");\n } else {\n console.log(` Dictionary TS: ${renderGeneratedSummary(summary.dictionary.generatedChanged)}`);\n }\n }\n\n if (summary.measurements) {\n console.log(\n ` Measurements: ${summary.measurements.categoryCount} categories, JSON ${summary.measurements.jsonChanged ? \"changed\" : \"unchanged\"}`,\n );\n if (summary.skipGenerate) {\n console.log(\" Measurements TS: skipped\");\n } else {\n console.log(` Measurements TS: ${renderGeneratedSummary(summary.measurements.generatedChanged)}`);\n }\n }\n}\n\nfunction renderGeneratedSummary(results: FileChangeResult[]): string {\n if (!results.length) return \"none\";\n const changedCount = results.filter((result) => result.changed).length;\n return `${changedCount}/${results.length} file${results.length === 1 ? \"\" : \"s\"} changed`;\n}\n\nif (isDirectExecution) {\n main().catch((error) => {\n console.error(\"Failed to sync UNS schema:\", error instanceof Error ? error.message : error);\n process.exitCode = 1;\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handover-manager-event-emitter.js","sourceRoot":"","sources":["../../src/uns/handover-manager-event-emitter.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,2BAA2B;IAC9B,SAAS,GAEb,EAAE,CAAC;IAEP,EAAE,CACA,SAAY,EACZ,QAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG,CACD,SAAY,EACZ,QAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,MAAM,CAC3D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CACtB,CAAC;IACJ,CAAC;IAED,IAAI,CAAyB,SAAY,EAAE,KAAgB;QACzD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;CACF","sourcesContent":["export class HandoverManagerEventEmitter<Events extends Record<string, any>> {\
|
|
1
|
+
{"version":3,"file":"handover-manager-event-emitter.js","sourceRoot":"","sources":["../../src/uns/handover-manager-event-emitter.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,2BAA2B;IAC9B,SAAS,GAEb,EAAE,CAAC;IAEP,EAAE,CACA,SAAY,EACZ,QAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG,CACD,SAAY,EACZ,QAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,MAAM,CAC3D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CACtB,CAAC;IACJ,CAAC;IAED,IAAI,CAAyB,SAAY,EAAE,KAAgB;QACzD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;CACF","sourcesContent":["export class HandoverManagerEventEmitter<Events extends Record<string, any>> {\n private listeners: {\n [K in keyof Events]?: Array<(event: Events[K]) => void>;\n } = {};\n\n on<K extends keyof Events>(\n eventName: K,\n listener: (event: Events[K]) => void,\n ): void {\n if (!this.listeners[eventName]) {\n this.listeners[eventName] = [];\n }\n this.listeners[eventName]!.push(listener);\n }\n\n off<K extends keyof Events>(\n eventName: K,\n listener: (event: Events[K]) => void,\n ): void {\n if (!this.listeners[eventName]) return;\n this.listeners[eventName] = this.listeners[eventName]!.filter(\n (l) => l !== listener,\n );\n }\n\n emit<K extends keyof Events>(eventName: K, event: Events[K]): void {\n if (!this.listeners[eventName]) return;\n this.listeners[eventName]!.forEach((listener) => listener(event));\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handover-manager.js","sourceRoot":"","sources":["../../src/uns/handover-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { UnsEvents } from \"./uns-interfaces.js\";\r\nimport logger from \"../logger.js\";\r\nimport { HandoverManagerEventEmitter } from \"./handover-manager-event-emitter.js\";\r\nimport { HandoverManagerEvents } from \"../uns-mqtt/mqtt-interfaces.js\";\r\nimport MqttProxy from \"../uns-mqtt/mqtt-proxy.js\";\r\nimport { MqttTopicBuilder } from \"../uns-mqtt/mqtt-topic-builder.js\";\r\nimport { ACTIVE_TIMEOUT, PACKAGE_INFO } from \"./process-config.js\";\r\nimport UnsMqttProxy from \"../uns-mqtt/uns-mqtt-proxy.js\";\r\n\r\n/**\r\n * HandoverManager is responsible for all handover-related logic,\r\n * including handling incoming MQTT messages, issuing handover requests,\r\n * and processing handover responses.\r\n */\r\nexport class HandoverManager {\r\n public event: HandoverManagerEventEmitter<HandoverManagerEvents> = new HandoverManagerEventEmitter<HandoverManagerEvents>();\r\n private processName: string;\r\n private processId: string;\r\n private mqttProxy: MqttProxy;\r\n private unsMqttProxies: UnsMqttProxy[];\r\n private requestingHandover: boolean = false;\r\n private handoverInProgress: boolean = false;\r\n private topicBuilder: MqttTopicBuilder;\r\n private activeTimeout: NodeJS.Timeout | undefined;\r\n private active: boolean = false;\r\n public handoverRequestEnabled: boolean = false;\r\n public handoverEnabled: boolean = true;\r\n public forceStartEnabled: boolean = false;\r\n\r\n constructor(processName: string, processId: string, mqttProxy: MqttProxy, unsMqttProxies: UnsMqttProxy[], handoverRequestEnabled: boolean, handoverEnabled: boolean, forceStartEnabled: boolean) {\r\n this.processName = processName;\r\n this.processId = processId;\r\n this.mqttProxy = mqttProxy;\r\n this.unsMqttProxies = unsMqttProxies;\r\n this.handoverRequestEnabled = handoverRequestEnabled;\r\n this.handoverEnabled = handoverEnabled;\r\n this.forceStartEnabled = forceStartEnabled;\r\n\r\n // Instantiate the topic builder.\r\n const packageName = PACKAGE_INFO.name;\r\n const version = PACKAGE_INFO.version;\r\n this.topicBuilder = new MqttTopicBuilder(`uns-infra/${MqttTopicBuilder.sanitizeTopicPart(packageName)}/${MqttTopicBuilder.sanitizeTopicPart(version)}/${MqttTopicBuilder.sanitizeTopicPart(this.processName)}/`);\r\n\r\n // Set status as active after a timeout if no other active process are detected.\r\n this.activeTimeout = setTimeout(() => {\r\n logger.info(`${this.processName} - No active message received within timeout. Assuming no other process is running.`);\r\n this.active = true;\r\n this.event.emit(\"handoverManager\", { active: this.active });\r\n // Activate all UNS proxy instance publishers and subscribers.\r\n this.unsMqttProxies.forEach((unsProxy) => {\r\n unsProxy.setPublisherActive();\r\n unsProxy.setSubscriberActive();\r\n });\r\n }, ACTIVE_TIMEOUT);\r\n }\r\n\r\n private getUserProperties(): Record<string, string> {\r\n return {\r\n processName: this.processName,\r\n processId: this.processId,\r\n };\r\n }\r\n\r\n private getSourceProcessId(event: UnsEvents[\"input\"]): string | undefined {\r\n return event.packet?.properties?.userProperties?.processId;\r\n }\r\n\r\n private parseActiveValue(message: string): boolean | null {\r\n try {\r\n const parsed = JSON.parse(message);\r\n const value = parsed?.message?.data?.value ?? parsed?.data?.value;\r\n if (value === 1 || value === \"1\" || value === true || value === \"true\") {\r\n return true;\r\n }\r\n if (value === 0 || value === \"0\" || value === false || value === \"false\") {\r\n return false;\r\n }\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private isProcessActiveTopic(topic: string): boolean {\r\n const parts = topic.split(\"/\");\r\n if (parts.length !== 5) return false;\r\n const [root, pkg, , process, tail] = parts;\r\n if (root !== \"uns-infra\" || tail !== \"active\") return false;\r\n const expectedPackage = MqttTopicBuilder.sanitizeTopicPart(PACKAGE_INFO.name);\r\n const expectedProcess = MqttTopicBuilder.sanitizeTopicPart(this.processName);\r\n return pkg === expectedPackage && process === expectedProcess;\r\n }\r\n\r\n /**\r\n * Main entry point for handling incoming MQTT messages.\r\n * It checks the topic and delegates to the corresponding handler.\r\n */\r\n public async handleMqttMessage(event: UnsEvents[\"input\"]): Promise<void> {\r\n try {\r\n // Check if the packet is active messages from other processes and this process is not active.\r\n if (\r\n this.isProcessActiveTopic(event.topic) &&\r\n this.requestingHandover === false &&\r\n this.active === false &&\r\n this.handoverInProgress === false\r\n ) {\r\n const sourceProcessId = this.getSourceProcessId(event);\r\n if (sourceProcessId === this.processId) {\r\n return;\r\n }\r\n const activeValue = this.parseActiveValue(event.message.toString());\r\n if (activeValue !== true) {\r\n return;\r\n }\r\n const sourceInfo = sourceProcessId ? ` (processId=${sourceProcessId})` : \"\";\r\n logger.info(`${this.processName} - Another process is active${sourceInfo} on ${event.topic}.`);\r\n\r\n if (this.handoverRequestEnabled && this.handoverEnabled) {\r\n // Requester process\r\n // Publish a handover request message after 10 seconds to the handover topic.\r\n clearTimeout(this.activeTimeout); // Clear the active timeout if it exists - prevent this process from becoming active after a timeout.\r\n this.activeTimeout = undefined;\r\n this.event.emit(\"handoverManager\", { active: this.active });\r\n this.requestingHandover = true;\r\n const eventHandoverTopic = new MqttTopicBuilder(MqttTopicBuilder.extractBaseTopic(event.topic)).getHandoverTopic();\r\n await this.mqttProxy.publish(eventHandoverTopic, JSON.stringify({ type: \"handover_intent\" }), {\r\n retain: false,\r\n properties: {\r\n userProperties: this.getUserProperties(),\r\n },\r\n });\r\n logger.info(`${this.processName} - Requesting handover in 10 seconds.`);\r\n setTimeout(async () => {\r\n logger.info(`${this.processName} - Requesting handover ${eventHandoverTopic}.`);\r\n this.handoverInProgress = true;\r\n await this.mqttProxy.publish(eventHandoverTopic, JSON.stringify({ type: \"handover_request\" }), {\r\n retain: false,\r\n properties: {\r\n responseTopic: this.topicBuilder.getHandoverTopic(),\r\n userProperties: this.getUserProperties(),\r\n },\r\n });\r\n }, 10000);\r\n } else {\r\n if (this.forceStartEnabled) {\r\n // Force start the process even if another process is active.\r\n logger.info(`${this.processName} - Force starting the process.`);\r\n logger.warn(`${this.processName} - Warning: Source and destination being the same may lead to duplicate messages.`);\r\n clearTimeout(this.activeTimeout); // Clear the active timeout if it exists - prevent this process from becoming active after a timeout.\r\n this.activeTimeout = undefined;\r\n this.active = true;\r\n this.event.emit(\"handoverManager\", { active: this.active });\r\n // Activate all UNS proxy instance publishers and subscribers.\r\n this.unsMqttProxies.forEach((unsProxy) => {\r\n unsProxy.setPublisherActive();\r\n unsProxy.setSubscriberActive();\r\n }\r\n );\r\n }\r\n else {\r\n logger.info(`${this.processName} - Waiting for the other process on topic ${event.topic} to become passive.`);\r\n this.activeTimeout?.refresh();\r\n }\r\n }\r\n }\r\n\r\n // Check if the packet is an handover message, sent to a handover topic.\r\n if (event.topic === this.topicBuilder.getHandoverTopic() && this.handoverEnabled) {\r\n const sourceProcessId = this.getSourceProcessId(event);\r\n if (sourceProcessId !== this.processId) {\r\n await this.handleHandover(event);\r\n }\r\n }\r\n } catch (error) {\r\n logger.error(`${this.processName} - Error processing MQTT message: ${error.message}`);\r\n return;\r\n }\r\n }\r\n\r\n /**\r\n * Handles handovers.\r\n */\r\n private async handleHandover(event: UnsEvents[\"input\"]): Promise<void> {\r\n try {\r\n const response = JSON.parse(event.message.toString());\r\n // Responder process\r\n // Check if the message is a handover request and publish MULTIPLE handover_subscriber messages\r\n if (response.type === \"handover_request\") {\r\n logger.info(\r\n `${this.processName} - Received handover request from ${event.packet?.properties?.userProperties?.processName}. Accepting handover.`,\r\n );\r\n\r\n // Set all UNS proxy instance subscribers to passive and drain the queue.\r\n const mqttWorkerData: UnsEvents[\"mqttWorker\"][] = [];\r\n for (let i = 0; i < this.unsMqttProxies.length; i++) {\r\n const unsProxy = this.unsMqttProxies[i];\r\n const workerData = await unsProxy.setSubscriberPassiveAndDrainQueue();\r\n mqttWorkerData.push(workerData);\r\n }\r\n logger.info(`${this.processName} - Handover request accepted. Sending handover_subscriber messages.`);\r\n\r\n // Publish handover_subscriber messages for each instance that has processed some data.\r\n for (let i = 0; i < mqttWorkerData.length; i++) {\r\n const workerData = mqttWorkerData[i];\r\n if (workerData.batchSize > 0) {\r\n await this.mqttProxy.publish(\r\n event.packet.properties?.responseTopic ?? \"\",\r\n JSON.stringify({\r\n type: \"handover_subscriber\",\r\n batchSize: workerData.batchSize,\r\n referenceHash: workerData.referenceHash,\r\n instanceName: workerData.instanceName,\r\n }),\r\n {\r\n retain: false,\r\n properties: {\r\n responseTopic: this.topicBuilder.getHandoverTopic(),\r\n userProperties: this.getUserProperties(),\r\n },\r\n },\r\n );\r\n }\r\n }\r\n logger.info(`${this.processName} - Handover subscriber messages sent.`);\r\n\r\n // Publish a single handover acknowledgment only when all\r\n // handover_subscriber messages have been sent\r\n this.active = false;\r\n this.event.emit(\"handoverManager\", { active: this.active });\r\n await this.mqttProxy.publish(\r\n event.packet.properties?.responseTopic ?? \"\",\r\n JSON.stringify({\r\n type: \"handover_fin\",\r\n }),\r\n {\r\n retain: false,\r\n properties: {\r\n responseTopic: this.topicBuilder.getHandoverTopic(),\r\n userProperties: this.getUserProperties(),\r\n },\r\n },\r\n );\r\n logger.info(`${this.processName} - Handover fin message sent.`);\r\n\r\n this.handoverInProgress = false;\r\n this.requestingHandover = false;\r\n\r\n this.unsMqttProxies.forEach((unsProxy: UnsMqttProxy) => {\r\n unsProxy.stop();\r\n });\r\n }\r\n\r\n // Requestor process\r\n // Check if the message is one of the handover_subscriber message in response to handover_request\r\n // and publish a handover_ack message\r\n if (response.type === \"handover_subscriber\") {\r\n // Find correct unsProxy instance for handover_subscriber and set it active\r\n this.unsMqttProxies.forEach((unsProxy: UnsMqttProxy) => {\r\n if (unsProxy.instanceName === response.instanceName) {\r\n unsProxy.setSubscriberActive(response.batchSize, response.referenceHash);\r\n }\r\n });\r\n }\r\n\r\n // Requestor process\r\n // Check if the message is a handover_fin at the end of handover_subscriber messages\r\n if (response.type === \"handover_fin\") {\r\n logger.info(`${this.processName} - Received handover fin from ${event.packet?.properties?.userProperties?.processName}.`);\r\n\r\n // Maybe we should count the number of requests that were allrady made TODO\r\n // this.handoverInProgress = false;\r\n // this.requestingHandover = false;\r\n\r\n this.active = true;\r\n this.event.emit(\"handoverManager\", { active: this.active });\r\n logger.info(`${this.processName} - Handover completed.`);\r\n // Activate all UNS proxy instance publishers and subscribers.\r\n this.unsMqttProxies.forEach((unsProxy) => {\r\n unsProxy.setPublisherActive();\r\n unsProxy.setSubscriberActive();\r\n });\r\n\r\n // Maybe we should reply with handover_ack.\r\n await this.mqttProxy.publish(\r\n event.packet.properties?.responseTopic ?? \"\",\r\n JSON.stringify({\r\n type: \"handover_ack\",\r\n }),\r\n {\r\n retain: false,\r\n properties: {\r\n responseTopic: this.topicBuilder.getHandoverTopic(),\r\n userProperties: this.getUserProperties(),\r\n },\r\n },\r\n );\r\n logger.info(`${this.processName} - Handover ack message sent.`);\r\n }\r\n\r\n // Responder process\r\n // Check if the message is a handover_ack at the end of handover_fin messages\r\n if (response.type === \"handover_ack\") {\r\n logger.info(`${this.processName} - Received handover ack from ${event.packet?.properties?.userProperties?.processName}.`);\r\n this.handoverInProgress = false;\r\n this.requestingHandover = false;\r\n\r\n logger.info(`${this.processName} - Handover completed. Exiting process.`);\r\n process.exit(0);\r\n }\r\n } catch (error) {\r\n logger.error(`${this.processName} - Error processing handover response: ${error.message}`);\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"handover-manager.js","sourceRoot":"","sources":["../../src/uns/handover-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { UnsEvents } from \"./uns-interfaces.js\";\nimport logger from \"../logger.js\";\nimport { HandoverManagerEventEmitter } from \"./handover-manager-event-emitter.js\";\nimport { HandoverManagerEvents } from \"../uns-mqtt/mqtt-interfaces.js\";\nimport MqttProxy from \"../uns-mqtt/mqtt-proxy.js\";\nimport { MqttTopicBuilder } from \"../uns-mqtt/mqtt-topic-builder.js\";\nimport { ACTIVE_TIMEOUT, PACKAGE_INFO } from \"./process-config.js\";\nimport UnsMqttProxy from \"../uns-mqtt/uns-mqtt-proxy.js\";\n\n/**\n * HandoverManager is responsible for all handover-related logic,\n * including handling incoming MQTT messages, issuing handover requests,\n * and processing handover responses.\n */\nexport class HandoverManager {\n public event: HandoverManagerEventEmitter<HandoverManagerEvents> = new HandoverManagerEventEmitter<HandoverManagerEvents>();\n private processName: string;\n private processId: string;\n private mqttProxy: MqttProxy;\n private unsMqttProxies: UnsMqttProxy[];\n private requestingHandover: boolean = false;\n private handoverInProgress: boolean = false;\n private topicBuilder: MqttTopicBuilder;\n private activeTimeout: NodeJS.Timeout | undefined;\n private active: boolean = false;\n public handoverRequestEnabled: boolean = false;\n public handoverEnabled: boolean = true;\n public forceStartEnabled: boolean = false;\n\n constructor(processName: string, processId: string, mqttProxy: MqttProxy, unsMqttProxies: UnsMqttProxy[], handoverRequestEnabled: boolean, handoverEnabled: boolean, forceStartEnabled: boolean) {\n this.processName = processName;\n this.processId = processId;\n this.mqttProxy = mqttProxy;\n this.unsMqttProxies = unsMqttProxies;\n this.handoverRequestEnabled = handoverRequestEnabled;\n this.handoverEnabled = handoverEnabled;\n this.forceStartEnabled = forceStartEnabled;\n\n // Instantiate the topic builder.\n const packageName = PACKAGE_INFO.name;\n const version = PACKAGE_INFO.version;\n this.topicBuilder = new MqttTopicBuilder(`uns-infra/${MqttTopicBuilder.sanitizeTopicPart(packageName)}/${MqttTopicBuilder.sanitizeTopicPart(version)}/${MqttTopicBuilder.sanitizeTopicPart(this.processName)}/`);\n\n // Set status as active after a timeout if no other active process are detected.\n this.activeTimeout = setTimeout(() => {\n logger.info(`${this.processName} - No active message received within timeout. Assuming no other process is running.`);\n this.active = true;\n this.event.emit(\"handoverManager\", { active: this.active });\n // Activate all UNS proxy instance publishers and subscribers.\n this.unsMqttProxies.forEach((unsProxy) => {\n unsProxy.setPublisherActive();\n unsProxy.setSubscriberActive();\n });\n }, ACTIVE_TIMEOUT);\n }\n\n private getUserProperties(): Record<string, string> {\n return {\n processName: this.processName,\n processId: this.processId,\n };\n }\n\n private getSourceProcessId(event: UnsEvents[\"input\"]): string | undefined {\n return event.packet?.properties?.userProperties?.processId;\n }\n\n private parseActiveValue(message: string): boolean | null {\n try {\n const parsed = JSON.parse(message);\n const value = parsed?.message?.data?.value ?? parsed?.data?.value;\n if (value === 1 || value === \"1\" || value === true || value === \"true\") {\n return true;\n }\n if (value === 0 || value === \"0\" || value === false || value === \"false\") {\n return false;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n private isProcessActiveTopic(topic: string): boolean {\n const parts = topic.split(\"/\");\n if (parts.length !== 5) return false;\n const [root, pkg, , process, tail] = parts;\n if (root !== \"uns-infra\" || tail !== \"active\") return false;\n const expectedPackage = MqttTopicBuilder.sanitizeTopicPart(PACKAGE_INFO.name);\n const expectedProcess = MqttTopicBuilder.sanitizeTopicPart(this.processName);\n return pkg === expectedPackage && process === expectedProcess;\n }\n\n /**\n * Main entry point for handling incoming MQTT messages.\n * It checks the topic and delegates to the corresponding handler.\n */\n public async handleMqttMessage(event: UnsEvents[\"input\"]): Promise<void> {\n try {\n // Check if the packet is active messages from other processes and this process is not active.\n if (\n this.isProcessActiveTopic(event.topic) &&\n this.requestingHandover === false &&\n this.active === false &&\n this.handoverInProgress === false\n ) {\n const sourceProcessId = this.getSourceProcessId(event);\n if (sourceProcessId === this.processId) {\n return;\n }\n const activeValue = this.parseActiveValue(event.message.toString());\n if (activeValue !== true) {\n return;\n }\n const sourceInfo = sourceProcessId ? ` (processId=${sourceProcessId})` : \"\";\n logger.info(`${this.processName} - Another process is active${sourceInfo} on ${event.topic}.`);\n\n if (this.handoverRequestEnabled && this.handoverEnabled) {\n // Requester process\n // Publish a handover request message after 10 seconds to the handover topic.\n clearTimeout(this.activeTimeout); // Clear the active timeout if it exists - prevent this process from becoming active after a timeout.\n this.activeTimeout = undefined;\n this.event.emit(\"handoverManager\", { active: this.active });\n this.requestingHandover = true;\n const eventHandoverTopic = new MqttTopicBuilder(MqttTopicBuilder.extractBaseTopic(event.topic)).getHandoverTopic();\n await this.mqttProxy.publish(eventHandoverTopic, JSON.stringify({ type: \"handover_intent\" }), {\n retain: false,\n properties: {\n userProperties: this.getUserProperties(),\n },\n });\n logger.info(`${this.processName} - Requesting handover in 10 seconds.`);\n setTimeout(async () => {\n logger.info(`${this.processName} - Requesting handover ${eventHandoverTopic}.`);\n this.handoverInProgress = true;\n await this.mqttProxy.publish(eventHandoverTopic, JSON.stringify({ type: \"handover_request\" }), {\n retain: false,\n properties: {\n responseTopic: this.topicBuilder.getHandoverTopic(),\n userProperties: this.getUserProperties(),\n },\n });\n }, 10000);\n } else {\n if (this.forceStartEnabled) {\n // Force start the process even if another process is active.\n logger.info(`${this.processName} - Force starting the process.`);\n logger.warn(`${this.processName} - Warning: Source and destination being the same may lead to duplicate messages.`);\n clearTimeout(this.activeTimeout); // Clear the active timeout if it exists - prevent this process from becoming active after a timeout.\n this.activeTimeout = undefined;\n this.active = true;\n this.event.emit(\"handoverManager\", { active: this.active });\n // Activate all UNS proxy instance publishers and subscribers.\n this.unsMqttProxies.forEach((unsProxy) => {\n unsProxy.setPublisherActive();\n unsProxy.setSubscriberActive();\n }\n );\n }\n else {\n logger.info(`${this.processName} - Waiting for the other process on topic ${event.topic} to become passive.`);\n this.activeTimeout?.refresh();\n }\n }\n }\n\n // Check if the packet is an handover message, sent to a handover topic.\n if (event.topic === this.topicBuilder.getHandoverTopic() && this.handoverEnabled) {\n const sourceProcessId = this.getSourceProcessId(event);\n if (sourceProcessId !== this.processId) {\n await this.handleHandover(event);\n }\n }\n } catch (error) {\n logger.error(`${this.processName} - Error processing MQTT message: ${error.message}`);\n return;\n }\n }\n\n /**\n * Handles handovers.\n */\n private async handleHandover(event: UnsEvents[\"input\"]): Promise<void> {\n try {\n const response = JSON.parse(event.message.toString());\n // Responder process\n // Check if the message is a handover request and publish MULTIPLE handover_subscriber messages\n if (response.type === \"handover_request\") {\n logger.info(\n `${this.processName} - Received handover request from ${event.packet?.properties?.userProperties?.processName}. Accepting handover.`,\n );\n\n // Set all UNS proxy instance subscribers to passive and drain the queue.\n const mqttWorkerData: UnsEvents[\"mqttWorker\"][] = [];\n for (let i = 0; i < this.unsMqttProxies.length; i++) {\n const unsProxy = this.unsMqttProxies[i];\n const workerData = await unsProxy.setSubscriberPassiveAndDrainQueue();\n mqttWorkerData.push(workerData);\n }\n logger.info(`${this.processName} - Handover request accepted. Sending handover_subscriber messages.`);\n\n // Publish handover_subscriber messages for each instance that has processed some data.\n for (let i = 0; i < mqttWorkerData.length; i++) {\n const workerData = mqttWorkerData[i];\n if (workerData.batchSize > 0) {\n await this.mqttProxy.publish(\n event.packet.properties?.responseTopic ?? \"\",\n JSON.stringify({\n type: \"handover_subscriber\",\n batchSize: workerData.batchSize,\n referenceHash: workerData.referenceHash,\n instanceName: workerData.instanceName,\n }),\n {\n retain: false,\n properties: {\n responseTopic: this.topicBuilder.getHandoverTopic(),\n userProperties: this.getUserProperties(),\n },\n },\n );\n }\n }\n logger.info(`${this.processName} - Handover subscriber messages sent.`);\n\n // Publish a single handover acknowledgment only when all\n // handover_subscriber messages have been sent\n this.active = false;\n this.event.emit(\"handoverManager\", { active: this.active });\n await this.mqttProxy.publish(\n event.packet.properties?.responseTopic ?? \"\",\n JSON.stringify({\n type: \"handover_fin\",\n }),\n {\n retain: false,\n properties: {\n responseTopic: this.topicBuilder.getHandoverTopic(),\n userProperties: this.getUserProperties(),\n },\n },\n );\n logger.info(`${this.processName} - Handover fin message sent.`);\n\n this.handoverInProgress = false;\n this.requestingHandover = false;\n\n this.unsMqttProxies.forEach((unsProxy: UnsMqttProxy) => {\n unsProxy.stop();\n });\n }\n\n // Requestor process\n // Check if the message is one of the handover_subscriber message in response to handover_request\n // and publish a handover_ack message\n if (response.type === \"handover_subscriber\") {\n // Find correct unsProxy instance for handover_subscriber and set it active\n this.unsMqttProxies.forEach((unsProxy: UnsMqttProxy) => {\n if (unsProxy.instanceName === response.instanceName) {\n unsProxy.setSubscriberActive(response.batchSize, response.referenceHash);\n }\n });\n }\n\n // Requestor process\n // Check if the message is a handover_fin at the end of handover_subscriber messages\n if (response.type === \"handover_fin\") {\n logger.info(`${this.processName} - Received handover fin from ${event.packet?.properties?.userProperties?.processName}.`);\n\n // Maybe we should count the number of requests that were allrady made TODO\n // this.handoverInProgress = false;\n // this.requestingHandover = false;\n\n this.active = true;\n this.event.emit(\"handoverManager\", { active: this.active });\n logger.info(`${this.processName} - Handover completed.`);\n // Activate all UNS proxy instance publishers and subscribers.\n this.unsMqttProxies.forEach((unsProxy) => {\n unsProxy.setPublisherActive();\n unsProxy.setSubscriberActive();\n });\n\n // Maybe we should reply with handover_ack.\n await this.mqttProxy.publish(\n event.packet.properties?.responseTopic ?? \"\",\n JSON.stringify({\n type: \"handover_ack\",\n }),\n {\n retain: false,\n properties: {\n responseTopic: this.topicBuilder.getHandoverTopic(),\n userProperties: this.getUserProperties(),\n },\n },\n );\n logger.info(`${this.processName} - Handover ack message sent.`);\n }\n\n // Responder process\n // Check if the message is a handover_ack at the end of handover_fin messages\n if (response.type === \"handover_ack\") {\n logger.info(`${this.processName} - Received handover ack from ${event.packet?.properties?.userProperties?.processName}.`);\n this.handoverInProgress = false;\n this.requestingHandover = false;\n\n logger.info(`${this.processName} - Handover completed. Exiting process.`);\n process.exit(0);\n }\n } catch (error) {\n logger.error(`${this.processName} - Error processing handover response: ${error.message}`);\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-config.js","sourceRoot":"","sources":["../../src/uns/process-config.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,4DAA4D;AAC5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AAQrE,MAAM,cAAc,GAAgB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;AAExF,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,GAAG,cAAc;IACjB,IAAI,EAAE,cAAc,CAAC,IAAI;CAC1B,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,CAAC,kBAAkB;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,kBAAkB","sourcesContent":["// process-config.ts\
|
|
1
|
+
{"version":3,"file":"process-config.js","sourceRoot":"","sources":["../../src/uns/process-config.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,4DAA4D;AAC5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AAQrE,MAAM,cAAc,GAAgB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;AAExF,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,GAAG,cAAc;IACjB,IAAI,EAAE,cAAc,CAAC,IAAI;CAC1B,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,CAAC,kBAAkB;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,kBAAkB","sourcesContent":["// process-config.ts\nimport * as path from \"path\";\nimport { readFileSync } from \"fs\";\nimport { basePath } from \"../base-path.js\";\n\n// Path to package.json to retrieve package name and version\nexport const PACKAGE_JSON_PATH = path.join(basePath, \"package.json\");\n\n// Read package.json and export as an object\ninterface PackageInfo {\n name: string;\n version: string;\n}\n\nconst rawPackageInfo: PackageInfo = JSON.parse(readFileSync(PACKAGE_JSON_PATH, \"utf8\"));\n\nexport const PACKAGE_INFO: PackageInfo = {\n ...rawPackageInfo,\n name: rawPackageInfo.name\n};\n\n// Other configuration values (update intervals, timeouts, etc.)\nexport const MQTT_UPDATE_INTERVAL = 10000; // in milliseconds\nexport const ACTIVE_TIMEOUT = 10000; // in milliseconds\n"]}
|