@things-factory/integration-base 10.0.0-beta.92 → 10.0.0-beta.95

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 (48) hide show
  1. package/dist-server/engine/connection-manager.d.ts +19 -0
  2. package/dist-server/engine/connection-manager.js +148 -16
  3. package/dist-server/engine/connection-manager.js.map +1 -1
  4. package/dist-server/engine/connector/headless-connector.d.ts +12 -0
  5. package/dist-server/engine/connector/headless-connector.js +74 -31
  6. package/dist-server/engine/connector/headless-connector.js.map +1 -1
  7. package/dist-server/engine/evaluate-template.d.ts +22 -3
  8. package/dist-server/engine/evaluate-template.js +43 -4
  9. package/dist-server/engine/evaluate-template.js.map +1 -1
  10. package/dist-server/engine/task/script.js +25 -17
  11. package/dist-server/engine/task/script.js.map +1 -1
  12. package/dist-server/engine/types.d.ts +32 -0
  13. package/dist-server/engine/types.js.map +1 -1
  14. package/dist-server/service/connection/connection-mutation.d.ts +3 -0
  15. package/dist-server/service/connection/connection-type.d.ts +4 -1
  16. package/dist-server/service/connection/connection-type.js +21 -0
  17. package/dist-server/service/connection/connection-type.js.map +1 -1
  18. package/dist-server/service/connection/connection.d.ts +80 -2
  19. package/dist-server/service/connection/connection.js +59 -15
  20. package/dist-server/service/connection/connection.js.map +1 -1
  21. package/dist-server/service/domain-attribute/domain-attribute-query.d.ts +17 -0
  22. package/dist-server/service/domain-attribute/domain-attribute-query.js +76 -0
  23. package/dist-server/service/domain-attribute/domain-attribute-query.js.map +1 -0
  24. package/dist-server/service/domain-attribute/domain-attribute-type.d.ts +15 -0
  25. package/dist-server/service/domain-attribute/domain-attribute-type.js +46 -0
  26. package/dist-server/service/domain-attribute/domain-attribute-type.js.map +1 -0
  27. package/dist-server/service/domain-attribute/index.d.ts +3 -0
  28. package/dist-server/service/domain-attribute/index.js +8 -0
  29. package/dist-server/service/domain-attribute/index.js.map +1 -0
  30. package/dist-server/service/index.d.ts +1 -1
  31. package/dist-server/service/index.js +3 -1
  32. package/dist-server/service/index.js.map +1 -1
  33. package/dist-server/service/scenario/scenario-mutation.js +10 -0
  34. package/dist-server/service/scenario/scenario-mutation.js.map +1 -1
  35. package/dist-server/service/scenario/scenario-query.d.ts +3 -3
  36. package/dist-server/service/scenario/scenario-query.js +9 -9
  37. package/dist-server/service/scenario/scenario-query.js.map +1 -1
  38. package/dist-server/service/scenario-instance/scenario-instance-type.js +79 -0
  39. package/dist-server/service/scenario-instance/scenario-instance-type.js.map +1 -1
  40. package/dist-server/service/step/step-mutation.js +15 -0
  41. package/dist-server/service/step/step-mutation.js.map +1 -1
  42. package/dist-server/service/step/step-query.js +11 -2
  43. package/dist-server/service/step/step-query.js.map +1 -1
  44. package/dist-server/tsconfig.tsbuildinfo +1 -1
  45. package/dist-server/utils/domain-inheritance.d.ts +27 -0
  46. package/dist-server/utils/domain-inheritance.js +67 -0
  47. package/dist-server/utils/domain-inheritance.js.map +1 -1
  48. package/package.json +2 -2
@@ -1,2 +1,29 @@
1
1
  import { Domain } from '@things-factory/shell';
2
2
  export declare function getDomainIdsWithAncestors(domain: Domain): Promise<string[]>;
3
+ /**
4
+ * 도메인 속성(EnvVar) 을 ancestor 상속 + closest-wins 로 조회.
5
+ *
6
+ * 동작:
7
+ * 1. 현재 도메인부터 루트까지 ancestor id 배열을 closest-first 로 얻는다.
8
+ * 2. 같은 이름의 active EnvVar 중 가장 가까운 도메인의 값을 반환.
9
+ *
10
+ * 자식 도메인이 같은 키를 갖고 있으면 자식 값이 부모를 덮어쓴다 (closest-wins).
11
+ * 어디에도 없으면 undefined.
12
+ *
13
+ * @param domain 조회 시작 도메인 (보통 현재 컨텍스트 도메인)
14
+ * @param name EnvVar.name (예: 'Connection::kiscon-conn::password', 'Task::allbaro-fetch::siteName')
15
+ */
16
+ export declare function lookupDomainEnvVar(domain: Domain, name: string): Promise<string | undefined>;
17
+ /**
18
+ * 도메인 속성(EnvVar) 들을 ancestor 상속 + closest-wins 로 dict 머지하여 반환.
19
+ *
20
+ * 자식 도메인에 이미 키가 있으면 부모 값을 덮어쓰지 않음. 동일 키에 대해 가장
21
+ * 가까운 도메인 값이 dict 에 들어간다.
22
+ *
23
+ * Task step params 처럼 도메인 전체 속성을 한꺼번에 template scope 로
24
+ * 노출하고 싶을 때 사용한다.
25
+ *
26
+ * @param domain 조회 시작 도메인
27
+ * @param prefix 선택 — 이 prefix 로 시작하는 키만 가져옴 (예: 'Task::' 또는 'Project::')
28
+ */
29
+ export declare function loadDomainAttributes(domain: Domain, prefix?: string): Promise<Record<string, string>>;
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getDomainIdsWithAncestors = getDomainIdsWithAncestors;
4
+ exports.lookupDomainEnvVar = lookupDomainEnvVar;
5
+ exports.loadDomainAttributes = loadDomainAttributes;
6
+ const typeorm_1 = require("typeorm");
4
7
  const shell_1 = require("@things-factory/shell");
5
8
  /**
6
9
  * 멀티테넌트 도메인 다단계 상속 헬퍼.
@@ -28,4 +31,68 @@ async function getDomainIdsWithAncestors(domain) {
28
31
  }
29
32
  return ids;
30
33
  }
34
+ /**
35
+ * 도메인 속성(EnvVar) 을 ancestor 상속 + closest-wins 로 조회.
36
+ *
37
+ * 동작:
38
+ * 1. 현재 도메인부터 루트까지 ancestor id 배열을 closest-first 로 얻는다.
39
+ * 2. 같은 이름의 active EnvVar 중 가장 가까운 도메인의 값을 반환.
40
+ *
41
+ * 자식 도메인이 같은 키를 갖고 있으면 자식 값이 부모를 덮어쓴다 (closest-wins).
42
+ * 어디에도 없으면 undefined.
43
+ *
44
+ * @param domain 조회 시작 도메인 (보통 현재 컨텍스트 도메인)
45
+ * @param name EnvVar.name (예: 'Connection::kiscon-conn::password', 'Task::allbaro-fetch::siteName')
46
+ */
47
+ async function lookupDomainEnvVar(domain, name) {
48
+ if (!domain)
49
+ return undefined;
50
+ const ids = await getDomainIdsWithAncestors(domain);
51
+ const candidates = await (0, shell_1.getRepository)(shell_1.EnvVar).find({
52
+ where: { domain: { id: (0, typeorm_1.In)(ids) }, name, active: true }
53
+ });
54
+ if (candidates.length === 0)
55
+ return undefined;
56
+ // closest-wins: ids 배열 앞 (작은 인덱스) = 더 가까운 도메인
57
+ const rank = (e) => {
58
+ const idx = ids.indexOf(e.domainId);
59
+ return idx < 0 ? Number.MAX_SAFE_INTEGER : idx;
60
+ };
61
+ const closest = candidates.reduce((best, e) => (rank(e) < rank(best) ? e : best));
62
+ return closest.value;
63
+ }
64
+ /**
65
+ * 도메인 속성(EnvVar) 들을 ancestor 상속 + closest-wins 로 dict 머지하여 반환.
66
+ *
67
+ * 자식 도메인에 이미 키가 있으면 부모 값을 덮어쓰지 않음. 동일 키에 대해 가장
68
+ * 가까운 도메인 값이 dict 에 들어간다.
69
+ *
70
+ * Task step params 처럼 도메인 전체 속성을 한꺼번에 template scope 로
71
+ * 노출하고 싶을 때 사용한다.
72
+ *
73
+ * @param domain 조회 시작 도메인
74
+ * @param prefix 선택 — 이 prefix 로 시작하는 키만 가져옴 (예: 'Task::' 또는 'Project::')
75
+ */
76
+ async function loadDomainAttributes(domain, prefix) {
77
+ if (!domain)
78
+ return {};
79
+ const ids = await getDomainIdsWithAncestors(domain);
80
+ const all = await (0, shell_1.getRepository)(shell_1.EnvVar).find({
81
+ where: { domain: { id: (0, typeorm_1.In)(ids) }, active: true }
82
+ });
83
+ const result = {};
84
+ // closest-first 순회 — 이미 채워진 키는 건너뛰어 자식 우선 유지
85
+ for (const id of ids) {
86
+ for (const e of all) {
87
+ if (e.domainId !== id)
88
+ continue;
89
+ if (prefix && !e.name.startsWith(prefix))
90
+ continue;
91
+ if (result[e.name] !== undefined)
92
+ continue;
93
+ result[e.name] = e.value;
94
+ }
95
+ }
96
+ return result;
97
+ }
31
98
  //# sourceMappingURL=domain-inheritance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"domain-inheritance.js","sourceRoot":"","sources":["../../server/utils/domain-inheritance.ts"],"names":[],"mappings":";;AAeA,8DAiBC;AAhCD,iDAA6D;AAE7D;;;;;;;;;;GAUG;AACH,MAAM,kBAAkB,GAAG,EAAE,CAAA;AAEtB,KAAK,UAAU,yBAAyB,CAAC,MAAc;IAC5D,MAAM,GAAG,GAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IAEzC,IAAI,QAAQ,GAAuB,MAAM,CAAC,QAAQ,CAAA;IAClD,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,OAAO,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,kBAAkB,EAAE,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAClB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAElB,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAAC,cAAM,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;QAC/E,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAA;QAC3B,KAAK,EAAE,CAAA;IACT,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC","sourcesContent":["import { Domain, getRepository } from '@things-factory/shell'\n\n/**\n * 멀티테넌트 도메인 다단계 상속 헬퍼.\n *\n * 현재 도메인부터 루트까지의 ancestor id 를 closest-first 순서로 반환.\n * 사용처:\n * - list 쿼리: `andWhere('alias.domain IN (:...ids)')`\n * - 단건 fetch: `In([...ids])` + 결과 중 가장 가까운 도메인 선택\n * - fallback chain: ids 를 순서대로 조회하여 first hit 사용\n *\n * 순환 가드 + 최대 깊이 10 안전장치.\n */\nconst MAX_ANCESTOR_DEPTH = 10\n\nexport async function getDomainIdsWithAncestors(domain: Domain): Promise<string[]> {\n const ids: string[] = [domain.id]\n const seen = new Set<string>([domain.id])\n\n let parentId: string | undefined = domain.parentId\n let depth = 0\n\n while (parentId && !seen.has(parentId) && depth < MAX_ANCESTOR_DEPTH) {\n seen.add(parentId)\n ids.push(parentId)\n\n const parent = await getRepository(Domain).findOne({ where: { id: parentId } })\n parentId = parent?.parentId\n depth++\n }\n\n return ids\n}\n"]}
1
+ {"version":3,"file":"domain-inheritance.js","sourceRoot":"","sources":["../../server/utils/domain-inheritance.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\n\nimport { Domain, EnvVar, getRepository } from '@things-factory/shell'\n\n/**\n * 멀티테넌트 도메인 다단계 상속 헬퍼.\n *\n * 현재 도메인부터 루트까지의 ancestor id 를 closest-first 순서로 반환.\n * 사용처:\n * - list 쿼리: `andWhere('alias.domain IN (:...ids)')`\n * - 단건 fetch: `In([...ids])` + 결과 중 가장 가까운 도메인 선택\n * - fallback chain: ids 를 순서대로 조회하여 first hit 사용\n *\n * 순환 가드 + 최대 깊이 10 안전장치.\n */\nconst MAX_ANCESTOR_DEPTH = 10\n\nexport async function getDomainIdsWithAncestors(domain: Domain): Promise<string[]> {\n const ids: string[] = [domain.id]\n const seen = new Set<string>([domain.id])\n\n let parentId: string | undefined = domain.parentId\n let depth = 0\n\n while (parentId && !seen.has(parentId) && depth < MAX_ANCESTOR_DEPTH) {\n seen.add(parentId)\n ids.push(parentId)\n\n const parent = await getRepository(Domain).findOne({ where: { id: parentId } })\n parentId = parent?.parentId\n depth++\n }\n\n return ids\n}\n\n/**\n * 도메인 속성(EnvVar) 을 ancestor 상속 + closest-wins 로 조회.\n *\n * 동작:\n * 1. 현재 도메인부터 루트까지 ancestor id 배열을 closest-first 로 얻는다.\n * 2. 같은 이름의 active EnvVar 중 가장 가까운 도메인의 값을 반환.\n *\n * 자식 도메인이 같은 키를 갖고 있으면 자식 값이 부모를 덮어쓴다 (closest-wins).\n * 어디에도 없으면 undefined.\n *\n * @param domain 조회 시작 도메인 (보통 현재 컨텍스트 도메인)\n * @param name EnvVar.name (예: 'Connection::kiscon-conn::password', 'Task::allbaro-fetch::siteName')\n */\nexport async function lookupDomainEnvVar(domain: Domain, name: string): Promise<string | undefined> {\n if (!domain) return undefined\n const ids = await getDomainIdsWithAncestors(domain)\n const candidates = await getRepository(EnvVar).find({\n where: { domain: { id: In(ids) }, name, active: true }\n })\n if (candidates.length === 0) return undefined\n // closest-wins: ids 배열 앞 (작은 인덱스) = 더 가까운 도메인\n const rank = (e: EnvVar): number => {\n const idx = ids.indexOf(e.domainId)\n return idx < 0 ? Number.MAX_SAFE_INTEGER : idx\n }\n const closest = candidates.reduce((best, e) => (rank(e) < rank(best) ? e : best))\n return closest.value\n}\n\n/**\n * 도메인 속성(EnvVar) 들을 ancestor 상속 + closest-wins 로 dict 머지하여 반환.\n *\n * 자식 도메인에 이미 키가 있으면 부모 값을 덮어쓰지 않음. 동일 키에 대해 가장\n * 가까운 도메인 값이 dict 에 들어간다.\n *\n * Task step params 처럼 도메인 전체 속성을 한꺼번에 template scope 로\n * 노출하고 싶을 때 사용한다.\n *\n * @param domain 조회 시작 도메인\n * @param prefix 선택 — 이 prefix 로 시작하는 키만 가져옴 (예: 'Task::' 또는 'Project::')\n */\nexport async function loadDomainAttributes(\n domain: Domain,\n prefix?: string\n): Promise<Record<string, string>> {\n if (!domain) return {}\n const ids = await getDomainIdsWithAncestors(domain)\n const all = await getRepository(EnvVar).find({\n where: { domain: { id: In(ids) }, active: true }\n })\n const result: Record<string, string> = {}\n // closest-first 순회 — 이미 채워진 키는 건너뛰어 자식 우선 유지\n for (const id of ids) {\n for (const e of all) {\n if (e.domainId !== id) continue\n if (prefix && !e.name.startsWith(prefix)) continue\n if (result[e.name] !== undefined) continue\n result[e.name] = e.value\n }\n }\n return result\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/integration-base",
3
- "version": "10.0.0-beta.92",
3
+ "version": "10.0.0-beta.95",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.ts",
6
6
  "things-factory": true,
@@ -48,5 +48,5 @@
48
48
  "promise-socket": "^7.0.0",
49
49
  "readline": "^1.3.0"
50
50
  },
51
- "gitHead": "e1143534691790a7006213e06d93051528b93bf4"
51
+ "gitHead": "17291189a406eb17709411200d0dc4acb54d92a2"
52
52
  }