@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.
- package/dist-server/engine/connector/index.d.ts +1 -0
- package/dist-server/engine/connector/index.js +1 -0
- package/dist-server/engine/connector/index.js.map +1 -1
- package/dist-server/engine/connector/pyrun-connector.d.ts +16 -0
- package/dist-server/engine/connector/pyrun-connector.js +56 -0
- package/dist-server/engine/connector/pyrun-connector.js.map +1 -0
- package/dist-server/engine/task/index.d.ts +1 -0
- package/dist-server/engine/task/index.js +1 -0
- package/dist-server/engine/task/index.js.map +1 -1
- package/dist-server/engine/task/publish.js +4 -1
- package/dist-server/engine/task/publish.js.map +1 -1
- package/dist-server/engine/task/pyrun-execute.d.ts +1 -0
- package/dist-server/engine/task/pyrun-execute.js +43 -0
- package/dist-server/engine/task/pyrun-execute.js.map +1 -0
- package/dist-server/engine/task/state-read.js +4 -1
- package/dist-server/engine/task/state-read.js.map +1 -1
- package/dist-server/engine/task/state-write.js +4 -1
- package/dist-server/engine/task/state-write.js.map +1 -1
- package/dist-server/engine/task/utils/substitute-multi.d.ts +7 -0
- package/dist-server/engine/task/utils/substitute-multi.js +37 -0
- package/dist-server/engine/task/utils/substitute-multi.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/integration/connector/pyrun-connector.ja.md +55 -0
- package/helps/integration/connector/pyrun-connector.ko.md +55 -0
- package/helps/integration/connector/pyrun-connector.md +55 -0
- package/helps/integration/connector/pyrun-connector.ms.md +55 -0
- package/helps/integration/connector/pyrun-connector.zh.md +55 -0
- package/helps/integration/task/publish.ja.md +46 -8
- package/helps/integration/task/publish.ko.md +40 -2
- package/helps/integration/task/publish.md +42 -4
- package/helps/integration/task/publish.ms.md +42 -4
- package/helps/integration/task/publish.zh.md +45 -4
- package/helps/integration/task/pyrun-execute.ja.md +36 -0
- package/helps/integration/task/pyrun-execute.ko.md +36 -0
- package/helps/integration/task/pyrun-execute.md +36 -0
- package/helps/integration/task/pyrun-execute.ms.md +36 -0
- package/helps/integration/task/pyrun-execute.zh.md +36 -0
- package/helps/integration/task/state-read.ja.md +42 -2
- package/helps/integration/task/state-read.ko.md +42 -2
- package/helps/integration/task/state-read.md +42 -2
- package/helps/integration/task/state-read.ms.md +42 -2
- package/helps/integration/task/state-read.zh.md +42 -2
- package/helps/integration/task/state-write.ja.md +43 -0
- package/helps/integration/task/state-write.ko.md +43 -0
- package/helps/integration/task/state-write.md +46 -3
- package/helps/integration/task/state-write.ms.md +43 -0
- package/helps/integration/task/state-write.zh.md +44 -1
- package/package.json +2 -2
- package/translations/en.json +1 -0
- package/translations/ja.json +1 -0
- package/translations/ko.json +1 -0
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
@@ -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"]}
|
@@ -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(
|
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;
|
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;
|
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;
|
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"]}
|