@things-factory/integration-base 9.0.5 → 9.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist-server/engine/connector/index.d.ts +1 -0
  2. package/dist-server/engine/connector/index.js +1 -0
  3. package/dist-server/engine/connector/index.js.map +1 -1
  4. package/dist-server/engine/connector/pyrun-connector.d.ts +16 -0
  5. package/dist-server/engine/connector/pyrun-connector.js +56 -0
  6. package/dist-server/engine/connector/pyrun-connector.js.map +1 -0
  7. package/dist-server/engine/task/index.d.ts +1 -0
  8. package/dist-server/engine/task/index.js +1 -0
  9. package/dist-server/engine/task/index.js.map +1 -1
  10. package/dist-server/engine/task/publish.js +4 -1
  11. package/dist-server/engine/task/publish.js.map +1 -1
  12. package/dist-server/engine/task/pyrun-execute.d.ts +1 -0
  13. package/dist-server/engine/task/pyrun-execute.js +43 -0
  14. package/dist-server/engine/task/pyrun-execute.js.map +1 -0
  15. package/dist-server/engine/task/state-read.js +4 -1
  16. package/dist-server/engine/task/state-read.js.map +1 -1
  17. package/dist-server/engine/task/state-write.js +4 -1
  18. package/dist-server/engine/task/state-write.js.map +1 -1
  19. package/dist-server/engine/task/utils/substitute-multi.d.ts +7 -0
  20. package/dist-server/engine/task/utils/substitute-multi.js +37 -0
  21. package/dist-server/engine/task/utils/substitute-multi.js.map +1 -0
  22. package/dist-server/tsconfig.tsbuildinfo +1 -1
  23. package/helps/integration/connector/pyrun-connector.ja.md +55 -0
  24. package/helps/integration/connector/pyrun-connector.ko.md +55 -0
  25. package/helps/integration/connector/pyrun-connector.md +55 -0
  26. package/helps/integration/connector/pyrun-connector.ms.md +55 -0
  27. package/helps/integration/connector/pyrun-connector.zh.md +55 -0
  28. package/helps/integration/task/publish.ja.md +46 -8
  29. package/helps/integration/task/publish.ko.md +40 -2
  30. package/helps/integration/task/publish.md +42 -4
  31. package/helps/integration/task/publish.ms.md +42 -4
  32. package/helps/integration/task/publish.zh.md +45 -4
  33. package/helps/integration/task/pyrun-execute.ja.md +36 -0
  34. package/helps/integration/task/pyrun-execute.ko.md +36 -0
  35. package/helps/integration/task/pyrun-execute.md +36 -0
  36. package/helps/integration/task/pyrun-execute.ms.md +36 -0
  37. package/helps/integration/task/pyrun-execute.zh.md +36 -0
  38. package/helps/integration/task/state-read.ja.md +42 -2
  39. package/helps/integration/task/state-read.ko.md +42 -2
  40. package/helps/integration/task/state-read.md +42 -2
  41. package/helps/integration/task/state-read.ms.md +42 -2
  42. package/helps/integration/task/state-read.zh.md +42 -2
  43. package/helps/integration/task/state-write.ja.md +43 -0
  44. package/helps/integration/task/state-write.ko.md +43 -0
  45. package/helps/integration/task/state-write.md +46 -3
  46. package/helps/integration/task/state-write.ms.md +43 -0
  47. package/helps/integration/task/state-write.zh.md +44 -1
  48. package/package.json +2 -2
  49. package/translations/en.json +1 -0
  50. package/translations/ja.json +1 -0
  51. package/translations/ko.json +1 -0
  52. package/translations/ms.json +1 -0
  53. package/translations/zh.json +1 -0
@@ -11,3 +11,4 @@ import './mysql-connector';
11
11
  import './socket-server';
12
12
  import './operato-connector';
13
13
  import './headless-connector';
14
+ import './pyrun-connector';
@@ -13,4 +13,5 @@ require("./mysql-connector");
13
13
  require("./socket-server");
14
14
  require("./operato-connector");
15
15
  require("./headless-connector");
16
+ require("./pyrun-connector");
16
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/connector/index.ts"],"names":[],"mappings":";;AAAA,8BAA2B;AAC3B,iCAA8B;AAC9B,4BAAyB;AACzB,+BAA4B;AAC5B,8BAA2B;AAC3B,kCAA+B;AAC/B,4BAAyB;AACzB,6BAA0B;AAC1B,8BAA2B;AAC3B,6BAA0B;AAC1B,2BAAwB;AACxB,+BAA4B;AAC5B,gCAA6B","sourcesContent":["import './echo-back-server'\nimport './echo-back-connector'\nimport './http-connector'\nimport './graphql-connector'\nimport './sqlite-connector'\nimport './postgresql-connector'\nimport './mqtt-connector'\nimport './mssql-connector'\nimport './oracle-connector'\nimport './mysql-connector'\nimport './socket-server'\nimport './operato-connector'\nimport './headless-connector'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/connector/index.ts"],"names":[],"mappings":";;AAAA,8BAA2B;AAC3B,iCAA8B;AAC9B,4BAAyB;AACzB,+BAA4B;AAC5B,8BAA2B;AAC3B,kCAA+B;AAC/B,4BAAyB;AACzB,6BAA0B;AAC1B,8BAA2B;AAC3B,6BAA0B;AAC1B,2BAAwB;AACxB,+BAA4B;AAC5B,gCAA6B;AAC7B,6BAA0B","sourcesContent":["import './echo-back-server'\nimport './echo-back-connector'\nimport './http-connector'\nimport './graphql-connector'\nimport './sqlite-connector'\nimport './postgresql-connector'\nimport './mqtt-connector'\nimport './mssql-connector'\nimport './oracle-connector'\nimport './mysql-connector'\nimport './socket-server'\nimport './operato-connector'\nimport './headless-connector'\nimport './pyrun-connector'\n"]}
@@ -0,0 +1,16 @@
1
+ import { Connector } from '../types';
2
+ import { InputConnection } from '../../service/connection/connection-type';
3
+ export declare class PyrunConnector implements Connector {
4
+ ready(connectionConfigs: InputConnection[]): Promise<void>;
5
+ connect(connection: InputConnection): Promise<void>;
6
+ disconnect(connection: InputConnection): Promise<void>;
7
+ get parameterSpec(): {
8
+ type: string;
9
+ name: string;
10
+ label: string;
11
+ required: boolean;
12
+ }[];
13
+ get taskPrefixes(): string[];
14
+ get description(): string;
15
+ get help(): string;
16
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PyrunConnector = void 0;
4
+ const connection_manager_1 = require("../connection-manager");
5
+ class PyrunConnector {
6
+ async ready(connectionConfigs) {
7
+ await Promise.all(connectionConfigs.map(this.connect.bind(this)));
8
+ connection_manager_1.ConnectionManager.logger.info('pyrun-connector connections are ready');
9
+ }
10
+ async connect(connection) {
11
+ var { username, password, token } = connection.params;
12
+ if (!token && username && password) {
13
+ // /auth/login 엔드포인트로 로그인하여 토큰 발급 시도
14
+ const loginUrl = `${connection.endpoint}/auth/login`;
15
+ const res = await fetch(loginUrl, {
16
+ method: 'POST',
17
+ headers: { 'Content-Type': 'application/json' },
18
+ body: JSON.stringify({ username, password })
19
+ });
20
+ if (!res.ok) {
21
+ const error = await res.text();
22
+ throw new Error(`pyrun-connector 인증 실패: ${res.status} ${error}`);
23
+ }
24
+ var data = await res.json();
25
+ token = data.access_token;
26
+ }
27
+ connection_manager_1.ConnectionManager.addConnectionInstance(connection, {
28
+ ...connection,
29
+ token
30
+ });
31
+ connection_manager_1.ConnectionManager.logger.info(`pyrun-connector connection(${connection.name}:${connection.endpoint}) is connected`);
32
+ }
33
+ async disconnect(connection) {
34
+ connection_manager_1.ConnectionManager.removeConnectionInstance(connection);
35
+ connection_manager_1.ConnectionManager.logger.info(`pyrun-connector connection(${connection.name}) is disconnected`);
36
+ }
37
+ get parameterSpec() {
38
+ return [
39
+ { type: 'string', name: 'username', label: 'username', required: false },
40
+ { type: 'password', name: 'password', label: 'password', required: false },
41
+ { type: 'string', name: 'token', label: 'token', required: false }
42
+ ];
43
+ }
44
+ get taskPrefixes() {
45
+ return ['pyrun'];
46
+ }
47
+ get description() {
48
+ return 'Python Runner(pyrun) REST API Connector';
49
+ }
50
+ get help() {
51
+ return 'integration/connector/pyrun-connector';
52
+ }
53
+ }
54
+ exports.PyrunConnector = PyrunConnector;
55
+ connection_manager_1.ConnectionManager.registerConnector('pyrun-connector', new PyrunConnector());
56
+ //# sourceMappingURL=pyrun-connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pyrun-connector.js","sourceRoot":"","sources":["../../../server/engine/connector/pyrun-connector.ts"],"names":[],"mappings":";;;AACA,8DAAyD;AAGzD,MAAa,cAAc;IACzB,KAAK,CAAC,KAAK,CAAC,iBAAoC;QAC9C,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjE,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;IACxE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAA2B;QACvC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,MAAM,CAAA;QAErD,IAAI,CAAC,KAAK,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;YACnC,oCAAoC;YACpC,MAAM,QAAQ,GAAG,GAAG,UAAU,CAAC,QAAQ,aAAa,CAAA;YACpD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;aAC7C,CAAC,CAAA;YACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;gBAC9B,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAA;YAClE,CAAC;YAED,IAAI,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;YAC3B,KAAK,GAAG,IAAI,CAAC,YAAY,CAAA;QAC3B,CAAC;QAED,sCAAiB,CAAC,qBAAqB,CAAC,UAAU,EAAE;YAClD,GAAG,UAAU;YACb,KAAK;SACN,CAAC,CAAA;QACF,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,gBAAgB,CAAC,CAAA;IACrH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAA2B;QAC1C,sCAAiB,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAA;QACtD,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,UAAU,CAAC,IAAI,mBAAmB,CAAC,CAAA;IACjG,CAAC;IAED,IAAI,aAAa;QACf,OAAO;YACL,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE;YACxE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC1E,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE;SACnE,CAAA;IACH,CAAC;IAED,IAAI,YAAY;QACd,OAAO,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,yCAAyC,CAAA;IAClD,CAAC;IAED,IAAI,IAAI;QACN,OAAO,uCAAuC,CAAA;IAChD,CAAC;CACF;AAzDD,wCAyDC;AAED,sCAAiB,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,IAAI,cAAc,EAAE,CAAC,CAAA","sourcesContent":["import { Connector } from '../types'\nimport { ConnectionManager } from '../connection-manager'\nimport { InputConnection } from '../../service/connection/connection-type'\n\nexport class PyrunConnector implements Connector {\n async ready(connectionConfigs: InputConnection[]) {\n await Promise.all(connectionConfigs.map(this.connect.bind(this)))\n ConnectionManager.logger.info('pyrun-connector connections are ready')\n }\n\n async connect(connection: InputConnection) {\n var { username, password, token } = connection.params\n\n if (!token && username && password) {\n // /auth/login 엔드포인트로 로그인하여 토큰 발급 시도\n const loginUrl = `${connection.endpoint}/auth/login`\n const res = await fetch(loginUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ username, password })\n })\n if (!res.ok) {\n const error = await res.text()\n throw new Error(`pyrun-connector 인증 실패: ${res.status} ${error}`)\n }\n\n var data = await res.json()\n token = data.access_token\n }\n\n ConnectionManager.addConnectionInstance(connection, {\n ...connection,\n token\n })\n ConnectionManager.logger.info(`pyrun-connector connection(${connection.name}:${connection.endpoint}) is connected`)\n }\n\n async disconnect(connection: InputConnection) {\n ConnectionManager.removeConnectionInstance(connection)\n ConnectionManager.logger.info(`pyrun-connector connection(${connection.name}) is disconnected`)\n }\n\n get parameterSpec() {\n return [\n { type: 'string', name: 'username', label: 'username', required: false },\n { type: 'password', name: 'password', label: 'password', required: false },\n { type: 'string', name: 'token', label: 'token', required: false }\n ]\n }\n\n get taskPrefixes() {\n return ['pyrun']\n }\n\n get description() {\n return 'Python Runner(pyrun) REST API Connector'\n }\n\n get help() {\n return 'integration/connector/pyrun-connector'\n }\n}\n\nConnectionManager.registerConnector('pyrun-connector', new PyrunConnector())\n"]}
@@ -43,3 +43,4 @@ import './jsonata';
43
43
  import './state-read';
44
44
  import './state-write';
45
45
  import './state-group-read';
46
+ import './pyrun-execute';
@@ -45,4 +45,5 @@ require("./jsonata");
45
45
  require("./state-read");
46
46
  require("./state-write");
47
47
  require("./state-group-read");
48
+ require("./pyrun-execute");
48
49
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/task/index.ts"],"names":[],"mappings":";;AAAA,uBAAoB;AACpB,0BAAuB;AACvB,mBAAgB;AAChB,iBAAc;AACd,qBAAkB;AAClB,sBAAmB;AACnB,uBAAoB;AACpB,2BAAwB;AACxB,4BAAyB;AACzB,iCAA8B;AAC9B,kCAA+B;AAC/B,0BAAuB;AACvB,2BAAwB;AACxB,8BAA2B;AAC3B,mCAAgC;AAChC,iCAA8B;AAC9B,yBAAsB;AACtB,kBAAe;AACf,iBAAc;AACd,yBAAsB;AACtB,+BAA4B;AAC5B,6BAA0B;AAC1B,mCAAgC;AAChC,wBAAqB;AACrB,8BAA2B;AAC3B,oBAAiB;AACjB,4BAAyB;AACzB,4BAAyB;AACzB,0BAAuB;AACvB,mBAAgB;AAChB,uBAAoB;AACpB,4BAAyB;AACzB,6BAA0B;AAC1B,oBAAiB;AACjB,0BAAuB;AACvB,yBAAsB;AACtB,2BAAwB;AACxB,4BAAyB;AACzB,wBAAqB;AACrB,6BAA0B;AAC1B,8BAA2B;AAC3B,qBAAkB;AAClB,wBAAqB;AACrB,yBAAsB;AACtB,8BAA2B","sourcesContent":["import './echo-send'\nimport './echo-receive'\nimport './sleep'\nimport './log'\nimport './publish'\nimport './http-get'\nimport './http-post'\nimport './graphql-query'\nimport './graphql-mutate'\nimport './local-graphql-query'\nimport './local-graphql-mutate'\nimport './sub-scenario'\nimport './stop-scenario'\nimport './book-up-scenario'\nimport './pick-pending-scenario'\nimport './reset-pending-queue'\nimport './empty-check'\nimport './goto'\nimport './end'\nimport './switch-goto'\nimport './switch-range-goto'\nimport './switch-scenario'\nimport './switch-range-scenario'\nimport './switch-set'\nimport './switch-range-set'\nimport './script'\nimport './database-query'\nimport './mqtt-subscribe'\nimport './mqtt-publish'\nimport './throw'\nimport './variables'\nimport './floating-point'\nimport './socket-listener'\nimport './random'\nimport './csv-readline'\nimport './data-mapper'\nimport './headless-post'\nimport './headless-scrap'\nimport './set-domain'\nimport './mssql-procedure'\nimport './oracle-procedure'\nimport './jsonata'\nimport './state-read'\nimport './state-write'\nimport './state-group-read'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/task/index.ts"],"names":[],"mappings":";;AAAA,uBAAoB;AACpB,0BAAuB;AACvB,mBAAgB;AAChB,iBAAc;AACd,qBAAkB;AAClB,sBAAmB;AACnB,uBAAoB;AACpB,2BAAwB;AACxB,4BAAyB;AACzB,iCAA8B;AAC9B,kCAA+B;AAC/B,0BAAuB;AACvB,2BAAwB;AACxB,8BAA2B;AAC3B,mCAAgC;AAChC,iCAA8B;AAC9B,yBAAsB;AACtB,kBAAe;AACf,iBAAc;AACd,yBAAsB;AACtB,+BAA4B;AAC5B,6BAA0B;AAC1B,mCAAgC;AAChC,wBAAqB;AACrB,8BAA2B;AAC3B,oBAAiB;AACjB,4BAAyB;AACzB,4BAAyB;AACzB,0BAAuB;AACvB,mBAAgB;AAChB,uBAAoB;AACpB,4BAAyB;AACzB,6BAA0B;AAC1B,oBAAiB;AACjB,0BAAuB;AACvB,yBAAsB;AACtB,2BAAwB;AACxB,4BAAyB;AACzB,wBAAqB;AACrB,6BAA0B;AAC1B,8BAA2B;AAC3B,qBAAkB;AAClB,wBAAqB;AACrB,yBAAsB;AACtB,8BAA2B;AAC3B,2BAAwB","sourcesContent":["import './echo-send'\nimport './echo-receive'\nimport './sleep'\nimport './log'\nimport './publish'\nimport './http-get'\nimport './http-post'\nimport './graphql-query'\nimport './graphql-mutate'\nimport './local-graphql-query'\nimport './local-graphql-mutate'\nimport './sub-scenario'\nimport './stop-scenario'\nimport './book-up-scenario'\nimport './pick-pending-scenario'\nimport './reset-pending-queue'\nimport './empty-check'\nimport './goto'\nimport './end'\nimport './switch-goto'\nimport './switch-range-goto'\nimport './switch-scenario'\nimport './switch-range-scenario'\nimport './switch-set'\nimport './switch-range-set'\nimport './script'\nimport './database-query'\nimport './mqtt-subscribe'\nimport './mqtt-publish'\nimport './throw'\nimport './variables'\nimport './floating-point'\nimport './socket-listener'\nimport './random'\nimport './csv-readline'\nimport './data-mapper'\nimport './headless-post'\nimport './headless-scrap'\nimport './set-domain'\nimport './mssql-procedure'\nimport './oracle-procedure'\nimport './jsonata'\nimport './state-read'\nimport './state-write'\nimport './state-group-read'\nimport './pyrun-execute'\n"]}
@@ -2,13 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const utils_1 = require("@things-factory/utils");
4
4
  const task_registry_1 = require("../task-registry");
5
+ const substitute_multi_1 = require("./utils/substitute-multi");
5
6
  async function Publish(step, { logger, publish, data }) {
6
7
  var { params: { tag, accessor } } = step;
7
8
  if (!tag || !accessor) {
8
9
  throw Error(`tag and accessor should be defined: tag - '${tag}', accessor - '${accessor}'`);
9
10
  }
11
+ // Support dynamic tag substitution using #{...}, ${...}, {{...}} patterns
12
+ const dynamicTag = (0, substitute_multi_1.substituteMulti)(tag, data);
10
13
  var value = (0, utils_1.access)(accessor, data);
11
- publish(tag, value);
14
+ publish(dynamicTag, value);
12
15
  return {
13
16
  data: value
14
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../server/engine/task/publish.ts"],"names":[],"mappings":";;AAAA,iDAA8C;AAC9C,oDAA+C;AAI/C,KAAK,UAAU,OAAO,CAAC,IAAe,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAW;IACxE,IAAI,EACF,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAC1B,GAAG,IAAI,CAAA;IAER,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC,8CAA8C,GAAG,kBAAkB,QAAQ,GAAG,CAAC,CAAA;IAC7F,CAAC;IAED,IAAI,KAAK,GAAG,IAAA,cAAM,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAElC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAEnB,OAAO;QACL,IAAI,EAAE,KAAK;KACZ,CAAA;AACH,CAAC;AAED,OAAO,CAAC,aAAa,GAAG;IACtB;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;KACb;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;KAClB;CACF,CAAA;AAED,OAAO,CAAC,aAAa,GAAG,IAAI,CAAA;AAC5B,OAAO,CAAC,IAAI,GAAG,0BAA0B,CAAA;AAEzC,4BAAY,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA","sourcesContent":["import { access } from '@things-factory/utils'\nimport { TaskRegistry } from '../task-registry'\nimport { InputStep } from '../../service/step/step-type'\nimport { Context } from '../types'\n\nasync function Publish(step: InputStep, { logger, publish, data }: Context) {\n var {\n params: { tag, accessor }\n } = step\n\n if (!tag || !accessor) {\n throw Error(`tag and accessor should be defined: tag - '${tag}', accessor - '${accessor}'`)\n }\n\n var value = access(accessor, data)\n\n publish(tag, value)\n\n return {\n data: value\n }\n}\n\nPublish.parameterSpec = [\n {\n type: 'string',\n name: 'tag',\n label: 'tag'\n },\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor'\n }\n]\n\nPublish.connectorFree = true\nPublish.help = 'integration/task/publish'\n\nTaskRegistry.registerTaskHandler('publish', Publish)\n"]}
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../server/engine/task/publish.ts"],"names":[],"mappings":";;AAAA,iDAA8C;AAC9C,oDAA+C;AAG/C,+DAA0D;AAE1D,KAAK,UAAU,OAAO,CAAC,IAAe,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAW;IACxE,IAAI,EACF,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAC1B,GAAG,IAAI,CAAA;IAER,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC,8CAA8C,GAAG,kBAAkB,QAAQ,GAAG,CAAC,CAAA;IAC7F,CAAC;IAED,0EAA0E;IAC1E,MAAM,UAAU,GAAG,IAAA,kCAAe,EAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAE7C,IAAI,KAAK,GAAG,IAAA,cAAM,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAElC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAE1B,OAAO;QACL,IAAI,EAAE,KAAK;KACZ,CAAA;AACH,CAAC;AAED,OAAO,CAAC,aAAa,GAAG;IACtB;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;KACb;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;KAClB;CACF,CAAA;AAED,OAAO,CAAC,aAAa,GAAG,IAAI,CAAA;AAC5B,OAAO,CAAC,IAAI,GAAG,0BAA0B,CAAA;AAEzC,4BAAY,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA","sourcesContent":["import { access } from '@things-factory/utils'\nimport { TaskRegistry } from '../task-registry'\nimport { InputStep } from '../../service/step/step-type'\nimport { Context } from '../types'\nimport { substituteMulti } from './utils/substitute-multi'\n\nasync function Publish(step: InputStep, { logger, publish, data }: Context) {\n var {\n params: { tag, accessor }\n } = step\n\n if (!tag || !accessor) {\n throw Error(`tag and accessor should be defined: tag - '${tag}', accessor - '${accessor}'`)\n }\n\n // Support dynamic tag substitution using #{...}, ${...}, {{...}} patterns\n const dynamicTag = substituteMulti(tag, data)\n\n var value = access(accessor, data)\n\n publish(dynamicTag, value)\n\n return {\n data: value\n }\n}\n\nPublish.parameterSpec = [\n {\n type: 'string',\n name: 'tag',\n label: 'tag'\n },\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor'\n }\n]\n\nPublish.connectorFree = true\nPublish.help = 'integration/task/publish'\n\nTaskRegistry.registerTaskHandler('publish', Publish)\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const task_registry_1 = require("../task-registry");
4
+ const connection_manager_1 = require("../connection-manager");
5
+ async function PyrunExecute(step, { logger, data, domain }) {
6
+ const { connection: connectionName, params } = step;
7
+ const pyrun = connection_manager_1.ConnectionManager.getConnectionInstanceByName(domain, connectionName);
8
+ if (!pyrun)
9
+ throw Error(`pyrun connection not found: ${connectionName}`);
10
+ const module = params.module;
11
+ const input = params.input || {};
12
+ const url = `${pyrun.endpoint}/api/run/${encodeURIComponent(module)}`;
13
+ const headers = { 'Content-Type': 'application/json' };
14
+ if (pyrun.token)
15
+ headers['Authorization'] = `Bearer ${pyrun.token}`;
16
+ const response = await fetch(url, {
17
+ method: 'POST',
18
+ headers,
19
+ body: JSON.stringify({ input })
20
+ });
21
+ if (!response.ok) {
22
+ const error = await response.text();
23
+ throw new Error(`pyrun-execute failed: ${response.status} ${error}`);
24
+ }
25
+ const { result, exit_code, stderr, stdout, duration } = await response.json();
26
+ if (stdout) {
27
+ logger.info(`pyrun-execute stdout: ${stdout}`);
28
+ }
29
+ if (stderr) {
30
+ logger.error(`pyrun-execute stderr: ${stderr}`);
31
+ }
32
+ if (exit_code !== 0) {
33
+ throw new Error(`pyrun-execute failed: ${exit_code}`);
34
+ }
35
+ return { data: result?.result };
36
+ }
37
+ PyrunExecute.parameterSpec = [
38
+ { type: 'string', name: 'module', label: 'module', required: true },
39
+ { type: 'key-values', name: 'input', label: 'input-params', required: false }
40
+ ];
41
+ PyrunExecute.help = 'integration/task/pyrun-execute';
42
+ task_registry_1.TaskRegistry.registerTaskHandler('pyrun-execute', PyrunExecute);
43
+ //# sourceMappingURL=pyrun-execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pyrun-execute.js","sourceRoot":"","sources":["../../../server/engine/task/pyrun-execute.ts"],"names":[],"mappings":";;AAAA,oDAA+C;AAC/C,8DAAyD;AAIzD,KAAK,UAAU,YAAY,CAAC,IAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IACnE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAEnD,MAAM,KAAK,GAAG,sCAAiB,CAAC,2BAA2B,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACnF,IAAI,CAAC,KAAK;QAAE,MAAM,KAAK,CAAC,+BAA+B,cAAc,EAAE,CAAC,CAAA;IAExE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAA;IAEhC,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,QAAQ,YAAY,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAA;IACrE,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAS,CAAA;IAC7D,IAAI,KAAK,CAAC,KAAK;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,CAAC,KAAK,EAAE,CAAA;IAEnE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;KAChC,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QACnC,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAA;IACtE,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAE7E,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAA;IACjD,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;AACjC,CAAC;AAED,YAAY,CAAC,aAAa,GAAG;IAC3B,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;IACnE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE;CAC9E,CAAA;AACD,YAAY,CAAC,IAAI,GAAG,gCAAgC,CAAA;AAEpD,4BAAY,CAAC,mBAAmB,CAAC,eAAe,EAAE,YAAY,CAAC,CAAA","sourcesContent":["import { TaskRegistry } from '../task-registry'\nimport { ConnectionManager } from '../connection-manager'\nimport { InputStep } from '../../service/step/step-type'\nimport { Context } from '../types'\n\nasync function PyrunExecute(step: InputStep, { logger, data, domain }) {\n const { connection: connectionName, params } = step\n\n const pyrun = ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n if (!pyrun) throw Error(`pyrun connection not found: ${connectionName}`)\n\n const module = params.module\n const input = params.input || {}\n\n const url = `${pyrun.endpoint}/api/run/${encodeURIComponent(module)}`\n const headers = { 'Content-Type': 'application/json' } as any\n if (pyrun.token) headers['Authorization'] = `Bearer ${pyrun.token}`\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ input })\n })\n\n if (!response.ok) {\n const error = await response.text()\n throw new Error(`pyrun-execute failed: ${response.status} ${error}`)\n }\n\n const { result, exit_code, stderr, stdout, duration } = await response.json()\n\n if (stdout) {\n logger.info(`pyrun-execute stdout: ${stdout}`)\n }\n\n if (stderr) {\n logger.error(`pyrun-execute stderr: ${stderr}`)\n }\n\n if (exit_code !== 0) {\n throw new Error(`pyrun-execute failed: ${exit_code}`)\n }\n\n return { data: result?.result }\n}\n\nPyrunExecute.parameterSpec = [\n { type: 'string', name: 'module', label: 'module', required: true },\n { type: 'key-values', name: 'input', label: 'input-params', required: false }\n]\nPyrunExecute.help = 'integration/task/pyrun-execute'\n\nTaskRegistry.registerTaskHandler('pyrun-execute', PyrunExecute)\n"]}
@@ -3,11 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const graphql_tag_1 = tslib_1.__importDefault(require("graphql-tag"));
5
5
  const task_registry_1 = require("../task-registry");
6
+ const substitute_multi_1 = require("./utils/substitute-multi");
6
7
  async function StateRead(step, { logger, publish, data, domain, user, client }) {
7
8
  var { params: { name } } = step;
8
9
  if (!name) {
9
10
  throw Error(`name should be defined: name - '${name}'`);
10
11
  }
12
+ // Support dynamic name substitution using #{...}, ${...}, {{...}} patterns
13
+ const dynamicName = (0, substitute_multi_1.substituteMulti)(name, data);
11
14
  var { data: queryResult, errors } = await client.query({
12
15
  query: (0, graphql_tag_1.default) `
13
16
  query ($name: String!) {
@@ -17,7 +20,7 @@ async function StateRead(step, { logger, publish, data, domain, user, client })
17
20
  }
18
21
  `,
19
22
  variables: {
20
- name
23
+ name: dynamicName
21
24
  },
22
25
  context: {
23
26
  state: {
@@ -1 +1 @@
1
- {"version":3,"file":"state-read.js","sourceRoot":"","sources":["../../../server/engine/task/state-read.ts"],"names":[],"mappings":";;;AAAA,sEAA6B;AAC7B,oDAA+C;AAI/C,KAAK,UAAU,SAAS,CAAC,IAAe,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAW;IAChG,IAAI,EACF,MAAM,EAAE,EAAE,IAAI,EAAE,EACjB,GAAG,IAAI,CAAA;IAER,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,KAAK,CAAC,mCAAmC,IAAI,GAAG,CAAC,CAAA;IACzD,CAAC;IAED,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;QACrD,KAAK,EAAE,IAAA,qBAAG,EAAA;;;;;;KAMT;QACD,SAAS,EAAE;YACT,IAAI;SACL;QACD,OAAO,EAAE;YACP,KAAK,EAAE;gBACL,MAAM;gBACN,IAAI;aACL;SACF;KACF,CAAC,CAAA;IAEF,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE,KAAK;KAC9C,CAAA;AACH,CAAC;AAED,SAAS,CAAC,aAAa,GAAG;IACxB;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;KACd;CACF,CAAA;AAED,SAAS,CAAC,aAAa,GAAG,IAAI,CAAA;AAC9B,SAAS,CAAC,IAAI,GAAG,6BAA6B,CAAA;AAE9C,4BAAY,CAAC,mBAAmB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA","sourcesContent":["import gql from 'graphql-tag'\nimport { TaskRegistry } from '../task-registry'\nimport { InputStep } from '../../service/step/step-type'\nimport { Context } from '../types'\n\nasync function StateRead(step: InputStep, { logger, publish, data, domain, user, client }: Context) {\n var {\n params: { name }\n } = step\n\n if (!name) {\n throw Error(`name should be defined: name - '${name}'`)\n }\n\n var { data: queryResult, errors } = await client.query({\n query: gql`\n query ($name: String!) {\n stateRegisterByName(name: $name) {\n state\n }\n }\n `,\n variables: {\n name\n },\n context: {\n state: {\n domain,\n user\n }\n }\n })\n\n if (errors) {\n errors.forEach(error => {\n logger.error('GraphQL Error: %s', error)\n })\n }\n\n return {\n data: queryResult?.stateRegisterByName?.state\n }\n}\n\nStateRead.parameterSpec = [\n {\n type: 'string',\n name: 'name',\n label: 'name'\n }\n]\n\nStateRead.connectorFree = true\nStateRead.help = 'integration/task/state-read'\n\nTaskRegistry.registerTaskHandler('state-read', StateRead)\n"]}
1
+ {"version":3,"file":"state-read.js","sourceRoot":"","sources":["../../../server/engine/task/state-read.ts"],"names":[],"mappings":";;;AAAA,sEAA6B;AAC7B,oDAA+C;AAG/C,+DAA0D;AAE1D,KAAK,UAAU,SAAS,CAAC,IAAe,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAW;IAChG,IAAI,EACF,MAAM,EAAE,EAAE,IAAI,EAAE,EACjB,GAAG,IAAI,CAAA;IAER,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,KAAK,CAAC,mCAAmC,IAAI,GAAG,CAAC,CAAA;IACzD,CAAC;IAED,2EAA2E;IAC3E,MAAM,WAAW,GAAG,IAAA,kCAAe,EAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAE/C,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;QACrD,KAAK,EAAE,IAAA,qBAAG,EAAA;;;;;;KAMT;QACD,SAAS,EAAE;YACT,IAAI,EAAE,WAAW;SAClB;QACD,OAAO,EAAE;YACP,KAAK,EAAE;gBACL,MAAM;gBACN,IAAI;aACL;SACF;KACF,CAAC,CAAA;IAEF,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE,KAAK;KAC9C,CAAA;AACH,CAAC;AAED,SAAS,CAAC,aAAa,GAAG;IACxB;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;KACd;CACF,CAAA;AAED,SAAS,CAAC,aAAa,GAAG,IAAI,CAAA;AAC9B,SAAS,CAAC,IAAI,GAAG,6BAA6B,CAAA;AAE9C,4BAAY,CAAC,mBAAmB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA","sourcesContent":["import gql from 'graphql-tag'\nimport { TaskRegistry } from '../task-registry'\nimport { InputStep } from '../../service/step/step-type'\nimport { Context } from '../types'\nimport { substituteMulti } from './utils/substitute-multi'\n\nasync function StateRead(step: InputStep, { logger, publish, data, domain, user, client }: Context) {\n var {\n params: { name }\n } = step\n\n if (!name) {\n throw Error(`name should be defined: name - '${name}'`)\n }\n\n // Support dynamic name substitution using #{...}, ${...}, {{...}} patterns\n const dynamicName = substituteMulti(name, data)\n\n var { data: queryResult, errors } = await client.query({\n query: gql`\n query ($name: String!) {\n stateRegisterByName(name: $name) {\n state\n }\n }\n `,\n variables: {\n name: dynamicName\n },\n context: {\n state: {\n domain,\n user\n }\n }\n })\n\n if (errors) {\n errors.forEach(error => {\n logger.error('GraphQL Error: %s', error)\n })\n }\n\n return {\n data: queryResult?.stateRegisterByName?.state\n }\n}\n\nStateRead.parameterSpec = [\n {\n type: 'string',\n name: 'name',\n label: 'name'\n }\n]\n\nStateRead.connectorFree = true\nStateRead.help = 'integration/task/state-read'\n\nTaskRegistry.registerTaskHandler('state-read', StateRead)\n"]}
@@ -4,11 +4,14 @@ const tslib_1 = require("tslib");
4
4
  const graphql_tag_1 = tslib_1.__importDefault(require("graphql-tag"));
5
5
  const utils_1 = require("@things-factory/utils");
6
6
  const task_registry_1 = require("../task-registry");
7
+ const substitute_multi_1 = require("./utils/substitute-multi");
7
8
  async function StateWrite(step, { logger, publish, data, domain, user, client }) {
8
9
  var { params: { name, accessor } } = step;
9
10
  if (!name || !accessor) {
10
11
  throw Error(`name and accessor should be defined: name - '${name}', accessor - '${accessor}'`);
11
12
  }
13
+ // Support dynamic name substitution using #{...}, ${...}, {{...}} patterns
14
+ const dynamicName = (0, substitute_multi_1.substituteMulti)(name, data);
12
15
  var state = (0, utils_1.access)(accessor, data);
13
16
  var { data: mutateResult, errors } = await client.mutate({
14
17
  mutation: (0, graphql_tag_1.default) `
@@ -19,7 +22,7 @@ async function StateWrite(step, { logger, publish, data, domain, user, client })
19
22
  }
20
23
  `,
21
24
  variables: {
22
- name,
25
+ name: dynamicName,
23
26
  state
24
27
  },
25
28
  context: {
@@ -1 +1 @@
1
- {"version":3,"file":"state-write.js","sourceRoot":"","sources":["../../../server/engine/task/state-write.ts"],"names":[],"mappings":";;;AAAA,sEAA6B;AAC7B,iDAA8C;AAC9C,oDAA+C;AAI/C,KAAK,UAAU,UAAU,CAAC,IAAe,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAW;IACjG,IAAI,EACF,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAC3B,GAAG,IAAI,CAAA;IAER,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC,gDAAgD,IAAI,kBAAkB,QAAQ,GAAG,CAAC,CAAA;IAChG,CAAC;IAED,IAAI,KAAK,GAAG,IAAA,cAAM,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAElC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;QACvD,QAAQ,EAAE,IAAA,qBAAG,EAAA;;;;;;KAMZ;QACD,SAAS,EAAE;YACT,IAAI;YACJ,KAAK;SACN;QACD,OAAO,EAAE;YACP,KAAK,EAAE;gBACL,MAAM;gBACN,IAAI;aACL;SACF;KACF,CAAC,CAAA;IAEF,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,YAAY,EAAE,yBAAyB,EAAE,KAAK;KACrD,CAAA;AACH,CAAC;AAED,UAAU,CAAC,aAAa,GAAG;IACzB;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;KACd;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;KAClB;CACF,CAAA;AAED,UAAU,CAAC,aAAa,GAAG,IAAI,CAAA;AAC/B,UAAU,CAAC,IAAI,GAAG,8BAA8B,CAAA;AAEhD,4BAAY,CAAC,mBAAmB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA","sourcesContent":["import gql from 'graphql-tag'\nimport { access } from '@things-factory/utils'\nimport { TaskRegistry } from '../task-registry'\nimport { InputStep } from '../../service/step/step-type'\nimport { Context } from '../types'\n\nasync function StateWrite(step: InputStep, { logger, publish, data, domain, user, client }: Context) {\n var {\n params: { name, accessor }\n } = step\n\n if (!name || !accessor) {\n throw Error(`name and accessor should be defined: name - '${name}', accessor - '${accessor}'`)\n }\n\n var state = access(accessor, data)\n\n var { data: mutateResult, errors } = await client.mutate({\n mutation: gql`\n mutation ($state: Object!, $name: String!) {\n updateStateRegisterByName(state: $state, name: $name) {\n state\n }\n }\n `,\n variables: {\n name,\n state\n },\n context: {\n state: {\n domain,\n user\n }\n }\n })\n\n if (errors) {\n errors.forEach(error => {\n logger.error('GraphQL Error: %s', error)\n })\n }\n\n return {\n data: mutateResult?.updateStateRegisterByName?.state\n }\n}\n\nStateWrite.parameterSpec = [\n {\n type: 'string',\n name: 'name',\n label: 'name'\n },\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor'\n }\n]\n\nStateWrite.connectorFree = true\nStateWrite.help = 'integration/task/state-write'\n\nTaskRegistry.registerTaskHandler('state-write', StateWrite)\n"]}
1
+ {"version":3,"file":"state-write.js","sourceRoot":"","sources":["../../../server/engine/task/state-write.ts"],"names":[],"mappings":";;;AAAA,sEAA6B;AAC7B,iDAA8C;AAC9C,oDAA+C;AAG/C,+DAA0D;AAE1D,KAAK,UAAU,UAAU,CAAC,IAAe,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAW;IACjG,IAAI,EACF,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAC3B,GAAG,IAAI,CAAA;IAER,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC,gDAAgD,IAAI,kBAAkB,QAAQ,GAAG,CAAC,CAAA;IAChG,CAAC;IAED,2EAA2E;IAC3E,MAAM,WAAW,GAAG,IAAA,kCAAe,EAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAE/C,IAAI,KAAK,GAAG,IAAA,cAAM,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAElC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;QACvD,QAAQ,EAAE,IAAA,qBAAG,EAAA;;;;;;KAMZ;QACD,SAAS,EAAE;YACT,IAAI,EAAE,WAAW;YACjB,KAAK;SACN;QACD,OAAO,EAAE;YACP,KAAK,EAAE;gBACL,MAAM;gBACN,IAAI;aACL;SACF;KACF,CAAC,CAAA;IAEF,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,YAAY,EAAE,yBAAyB,EAAE,KAAK;KACrD,CAAA;AACH,CAAC;AAED,UAAU,CAAC,aAAa,GAAG;IACzB;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;KACd;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;KAClB;CACF,CAAA;AAED,UAAU,CAAC,aAAa,GAAG,IAAI,CAAA;AAC/B,UAAU,CAAC,IAAI,GAAG,8BAA8B,CAAA;AAEhD,4BAAY,CAAC,mBAAmB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA","sourcesContent":["import gql from 'graphql-tag'\nimport { access } from '@things-factory/utils'\nimport { TaskRegistry } from '../task-registry'\nimport { InputStep } from '../../service/step/step-type'\nimport { Context } from '../types'\nimport { substituteMulti } from './utils/substitute-multi'\n\nasync function StateWrite(step: InputStep, { logger, publish, data, domain, user, client }: Context) {\n var {\n params: { name, accessor }\n } = step\n\n if (!name || !accessor) {\n throw Error(`name and accessor should be defined: name - '${name}', accessor - '${accessor}'`)\n }\n\n // Support dynamic name substitution using #{...}, ${...}, {{...}} patterns\n const dynamicName = substituteMulti(name, data)\n\n var state = access(accessor, data)\n\n var { data: mutateResult, errors } = await client.mutate({\n mutation: gql`\n mutation ($state: Object!, $name: String!) {\n updateStateRegisterByName(state: $state, name: $name) {\n state\n }\n }\n `,\n variables: {\n name: dynamicName,\n state\n },\n context: {\n state: {\n domain,\n user\n }\n }\n })\n\n if (errors) {\n errors.forEach(error => {\n logger.error('GraphQL Error: %s', error)\n })\n }\n\n return {\n data: mutateResult?.updateStateRegisterByName?.state\n }\n}\n\nStateWrite.parameterSpec = [\n {\n type: 'string',\n name: 'name',\n label: 'name'\n },\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor'\n }\n]\n\nStateWrite.connectorFree = true\nStateWrite.help = 'integration/task/state-write'\n\nTaskRegistry.registerTaskHandler('state-write', StateWrite)\n"]}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Multi-pattern substitution utility that supports #{...}, ${...}, and {{...}} patterns
3
+ * @param value - The string containing substitution patterns
4
+ * @param data - The data object to extract values from
5
+ * @returns The string with all patterns substituted
6
+ */
7
+ export declare function substituteMulti(value: any, data: any): string;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.substituteMulti = substituteMulti;
4
+ const utils_1 = require("@things-factory/utils");
5
+ /**
6
+ * Multi-pattern substitution utility that supports #{...}, ${...}, and {{...}} patterns
7
+ * @param value - The string containing substitution patterns
8
+ * @param data - The data object to extract values from
9
+ * @returns The string with all patterns substituted
10
+ */
11
+ function substituteMulti(value, data) {
12
+ let text = String(value);
13
+ // Define patterns for different substitution styles
14
+ const patterns = [
15
+ { regex: /#\{([^}]*)\}/gi, prefix: '#{', suffix: '}' },
16
+ { regex: /\$\{([^}]*)\}/gi, prefix: '${', suffix: '}' },
17
+ { regex: /\{\{([^}]*)\}\}/gi, prefix: '{{', suffix: '}}' }
18
+ ];
19
+ patterns.forEach(pattern => {
20
+ const matches = text.match(pattern.regex);
21
+ if (matches) {
22
+ matches.forEach(match => {
23
+ const accessor = match.slice(2, -2); // Remove prefix and suffix
24
+ // Validate accessor pattern (only allow dot notation)
25
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)*$/.test(accessor)) {
26
+ throw new Error(`Invalid accessor pattern: ${accessor}`);
27
+ }
28
+ // Safely access data using the accessor
29
+ const value = (0, utils_1.access)(accessor, data);
30
+ const sanitizedValue = String(value || '').replace(/[^a-zA-Z0-9._-]/g, '_');
31
+ text = text.replace(match, sanitizedValue);
32
+ });
33
+ }
34
+ });
35
+ return text;
36
+ }
37
+ //# sourceMappingURL=substitute-multi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"substitute-multi.js","sourceRoot":"","sources":["../../../../server/engine/task/utils/substitute-multi.ts"],"names":[],"mappings":";;AAQA,0CA+BC;AAvCD,iDAA8C;AAE9C;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,KAAU,EAAE,IAAS;IACnD,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAExB,oDAAoD;IACpD,MAAM,QAAQ,GAAG;QACf,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;QACtD,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;QACvD,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;KAC3D,CAAA;IAED,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACzC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,2BAA2B;gBAE/D,sDAAsD;gBACtD,IAAI,CAAC,qDAAqD,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1E,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAA;gBAC1D,CAAC;gBAED,wCAAwC;gBACxC,MAAM,KAAK,GAAG,IAAA,cAAM,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBACpC,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA;gBAE3E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAA;YAC5C,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,IAAI,CAAA;AACb,CAAC","sourcesContent":["import { access } from '@things-factory/utils'\n\n/**\n * Multi-pattern substitution utility that supports #{...}, ${...}, and {{...}} patterns\n * @param value - The string containing substitution patterns\n * @param data - The data object to extract values from\n * @returns The string with all patterns substituted\n */\nexport function substituteMulti(value: any, data: any): string {\n let text = String(value)\n\n // Define patterns for different substitution styles\n const patterns = [\n { regex: /#\\{([^}]*)\\}/gi, prefix: '#{', suffix: '}' },\n { regex: /\\$\\{([^}]*)\\}/gi, prefix: '${', suffix: '}' },\n { regex: /\\{\\{([^}]*)\\}\\}/gi, prefix: '{{', suffix: '}}' }\n ]\n\n patterns.forEach(pattern => {\n const matches = text.match(pattern.regex)\n if (matches) {\n matches.forEach(match => {\n const accessor = match.slice(2, -2) // Remove prefix and suffix\n\n // Validate accessor pattern (only allow dot notation)\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)*$/.test(accessor)) {\n throw new Error(`Invalid accessor pattern: ${accessor}`)\n }\n\n // Safely access data using the accessor\n const value = access(accessor, data)\n const sanitizedValue = String(value || '').replace(/[^a-zA-Z0-9._-]/g, '_')\n\n text = text.replace(match, sanitizedValue)\n })\n }\n })\n\n return text\n}\n"]}