@things-factory/integration-data-go-kr 10.0.0-beta.62

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 (67) hide show
  1. package/README.md +73 -0
  2. package/ROADMAP.md +271 -0
  3. package/dist-server/engine/connector/data-go-kr-client.d.ts +27 -0
  4. package/dist-server/engine/connector/data-go-kr-client.js +115 -0
  5. package/dist-server/engine/connector/data-go-kr-client.js.map +1 -0
  6. package/dist-server/engine/connector/data-go-kr-connector.d.ts +35 -0
  7. package/dist-server/engine/connector/data-go-kr-connector.js +59 -0
  8. package/dist-server/engine/connector/data-go-kr-connector.js.map +1 -0
  9. package/dist-server/engine/connector/index.d.ts +1 -0
  10. package/dist-server/engine/connector/index.js +4 -0
  11. package/dist-server/engine/connector/index.js.map +1 -0
  12. package/dist-server/engine/index.d.ts +2 -0
  13. package/dist-server/engine/index.js +5 -0
  14. package/dist-server/engine/index.js.map +1 -0
  15. package/dist-server/engine/spec/building-ledger.d.ts +9 -0
  16. package/dist-server/engine/spec/building-ledger.js +135 -0
  17. package/dist-server/engine/spec/building-ledger.js.map +1 -0
  18. package/dist-server/engine/spec/index.d.ts +16 -0
  19. package/dist-server/engine/spec/index.js +42 -0
  20. package/dist-server/engine/spec/index.js.map +1 -0
  21. package/dist-server/engine/spec/types.d.ts +79 -0
  22. package/dist-server/engine/spec/types.js +30 -0
  23. package/dist-server/engine/spec/types.js.map +1 -0
  24. package/dist-server/engine/task/building-ledger/general.d.ts +41 -0
  25. package/dist-server/engine/task/building-ledger/general.js +92 -0
  26. package/dist-server/engine/task/building-ledger/general.js.map +1 -0
  27. package/dist-server/engine/task/building-ledger/index.d.ts +12 -0
  28. package/dist-server/engine/task/building-ledger/index.js +15 -0
  29. package/dist-server/engine/task/building-ledger/index.js.map +1 -0
  30. package/dist-server/engine/task/call.d.ts +33 -0
  31. package/dist-server/engine/task/call.js +128 -0
  32. package/dist-server/engine/task/call.js.map +1 -0
  33. package/dist-server/engine/task/index.d.ts +19 -0
  34. package/dist-server/engine/task/index.js +22 -0
  35. package/dist-server/engine/task/index.js.map +1 -0
  36. package/dist-server/engine/types.d.ts +63 -0
  37. package/dist-server/engine/types.js +9 -0
  38. package/dist-server/engine/types.js.map +1 -0
  39. package/dist-server/index.d.ts +4 -0
  40. package/dist-server/index.js +10 -0
  41. package/dist-server/index.js.map +1 -0
  42. package/dist-server/tsconfig.tsbuildinfo +1 -0
  43. package/helps/integration/connector/data-go-kr-connector.md +39 -0
  44. package/helps/integration/services/building-ledger.md +109 -0
  45. package/helps/integration/task/building-ledger.md +111 -0
  46. package/helps/integration/task/data-go-kr-call.md +87 -0
  47. package/package.json +28 -0
  48. package/server/engine/connector/data-go-kr-client.ts +133 -0
  49. package/server/engine/connector/data-go-kr-connector.ts +75 -0
  50. package/server/engine/connector/index.ts +1 -0
  51. package/server/engine/index.ts +2 -0
  52. package/server/engine/spec/building-ledger.ts +140 -0
  53. package/server/engine/spec/index.ts +41 -0
  54. package/server/engine/spec/types.ts +84 -0
  55. package/server/engine/task/building-ledger/general.ts +109 -0
  56. package/server/engine/task/building-ledger/index.ts +12 -0
  57. package/server/engine/task/call.ts +157 -0
  58. package/server/engine/task/index.ts +19 -0
  59. package/server/engine/types.ts +64 -0
  60. package/server/index.ts +5 -0
  61. package/things-factory.config.js +1 -0
  62. package/translations/en.json +11 -0
  63. package/translations/ja.json +11 -0
  64. package/translations/ko.json +11 -0
  65. package/translations/ms.json +11 -0
  66. package/translations/zh.json +11 -0
  67. package/tsconfig.json +10 -0
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const integration_base_1 = require("@things-factory/integration-base");
4
+ const spec_1 = require("../spec");
5
+ /**
6
+ * 범용 공공데이터포털 호출 태스크.
7
+ *
8
+ * 하나의 태스크가 등록된 레지스트리의 **모든 오퍼레이션** 을 커버한다. TaskRegistry 가
9
+ * 수백 개 태스크로 폭발하는 것을 방지하는 핵심 설계.
10
+ *
11
+ * 입력:
12
+ * - `operationRef` : `"<serviceId>.<operationId>"` 형식 (예: `"1613000/BldRgstService_v2.getBrTitleInfo"`)
13
+ * - `params` : 오퍼레이션 파라미터 객체. 스펙 등록된 오퍼레이션이면 자동 검증·기본값·zero-pad 적용
14
+ *
15
+ * 레지스트리에 없는 오퍼레이션도 호출 가능 (스펙 없음 → 검증 스킵). 새 data.go.kr 서비스가
16
+ * 등장해도 스펙 추가 전까지 범용 호출로 즉시 사용 가능하다는 장점.
17
+ */
18
+ async function DataGoKrCall(step, context) {
19
+ const { connection: connectionName, params: stepParams } = step;
20
+ const { domain, user, data, variables, lng, logger } = context;
21
+ const instance = await integration_base_1.ConnectionManager.getConnectionInstanceByName(domain, connectionName);
22
+ if (!instance?.client) {
23
+ throw new Error(`data-go-kr connection '${connectionName}' is not established.`);
24
+ }
25
+ const operationRef = stepParams?.operationRef;
26
+ if (!operationRef || typeof operationRef !== 'string') {
27
+ throw new Error('data-go-kr-call: operationRef is required (format: "<serviceId>.<operationId>")');
28
+ }
29
+ const resolved = spec_1.SpecRegistry.resolve(operationRef);
30
+ const rawParams = stepParams?.params || {};
31
+ const scope = { domain, user, lng, data, variables, console };
32
+ const evalValue = (value) => {
33
+ if (value === undefined || value === null)
34
+ return value;
35
+ if (typeof value !== 'string')
36
+ return value;
37
+ try {
38
+ return (0, integration_base_1.evaluateTemplate)(value, scope);
39
+ }
40
+ catch (err) {
41
+ throw new Error(`data-go-kr-call: failed to evaluate parameter: ${err.message}`);
42
+ }
43
+ };
44
+ const evaluatedParams = {};
45
+ for (const [k, v] of Object.entries(rawParams)) {
46
+ evaluatedParams[k] = evalValue(v);
47
+ }
48
+ const { service, operation } = resolved || { service: null, operation: null };
49
+ const finalParams = operation
50
+ ? normalizeAndValidateParams(operation, evaluatedParams)
51
+ : evaluatedParams;
52
+ const servicePath = resolved
53
+ ? `${service.serviceId}/${operation.operationId}`
54
+ : operationRef.replace('.', '/');
55
+ logger?.info?.(`[data-go-kr] call ${servicePath} params=${JSON.stringify(finalParams)}`);
56
+ const response = await instance.client.get(servicePath, finalParams);
57
+ return { data: response };
58
+ }
59
+ /**
60
+ * 스펙 기반 파라미터 정규화·검증.
61
+ *
62
+ * 1. required 필수값 체크
63
+ * 2. default 기본값 주입
64
+ * 3. pad zero-padding (예: bun=6 → "0006")
65
+ * 4. length 정확 길이 검증
66
+ * 5. enum 허용 값 검증
67
+ */
68
+ function normalizeAndValidateParams(operation, input) {
69
+ const output = {};
70
+ const errors = [];
71
+ for (const p of operation.params) {
72
+ let value = input[p.name];
73
+ if (value === undefined || value === null || value === '') {
74
+ if (p.default !== undefined) {
75
+ value = p.default;
76
+ }
77
+ else if (p.required) {
78
+ errors.push(`'${p.name}' is required (${p.description})`);
79
+ continue;
80
+ }
81
+ else {
82
+ continue;
83
+ }
84
+ }
85
+ value = String(value);
86
+ if (p.pad && value.length < p.pad) {
87
+ value = '0'.repeat(p.pad - value.length) + value;
88
+ }
89
+ if (p.length !== undefined && value.length !== p.length) {
90
+ errors.push(`'${p.name}' must be exactly ${p.length} characters (got "${value}", length ${value.length})`);
91
+ continue;
92
+ }
93
+ if (p.enum && !p.enum.some(e => e.value === value)) {
94
+ errors.push(`'${p.name}' must be one of [${p.enum.map(e => e.value).join(', ')}] (got "${value}")`);
95
+ continue;
96
+ }
97
+ output[p.name] = value;
98
+ }
99
+ /* 스펙에 없는 파라미터도 pass-through (미등록 필드 허용) */
100
+ for (const [k, v] of Object.entries(input)) {
101
+ if (!(k in output) && !operation.params.find(p => p.name === k)) {
102
+ if (v !== undefined && v !== null && v !== '') {
103
+ output[k] = v;
104
+ }
105
+ }
106
+ }
107
+ if (errors.length > 0) {
108
+ throw new Error(`data-go-kr-call parameter validation failed for ${operation.operationId}:\n - ${errors.join('\n - ')}`);
109
+ }
110
+ return output;
111
+ }
112
+ DataGoKrCall.parameterSpec = [
113
+ {
114
+ type: 'string',
115
+ name: 'operationRef',
116
+ label: 'label.operation-ref',
117
+ placeholder: '<serviceId>.<operationId> (예: 1613000/BldRgstService_v2.getBrTitleInfo)'
118
+ },
119
+ {
120
+ type: 'scenario-step-input',
121
+ name: 'params',
122
+ label: 'label.operation-params'
123
+ }
124
+ ];
125
+ DataGoKrCall.help = 'integration/task/data-go-kr-call';
126
+ integration_base_1.TaskRegistry.registerTaskHandler('data-go-kr-call', DataGoKrCall);
127
+ exports.default = DataGoKrCall;
128
+ //# sourceMappingURL=call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.js","sourceRoot":"","sources":["../../../server/engine/task/call.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConnectionManager, Context, TaskRegistry, evaluateTemplate } from '@things-factory/integration-base'\n\nimport { DataGoKrConnectionInstance } from '../connector/data-go-kr-connector'\nimport { DataGoKrResponse } from '../types'\nimport { OperationSpec, SpecRegistry } from '../spec'\n\n/**\n * 범용 공공데이터포털 호출 태스크.\n *\n * 하나의 태스크가 등록된 레지스트리의 **모든 오퍼레이션** 을 커버한다. TaskRegistry 가\n * 수백 개 태스크로 폭발하는 것을 방지하는 핵심 설계.\n *\n * 입력:\n * - `operationRef` : `\"<serviceId>.<operationId>\"` 형식 (예: `\"1613000/BldRgstService_v2.getBrTitleInfo\"`)\n * - `params` : 오퍼레이션 파라미터 객체. 스펙 등록된 오퍼레이션이면 자동 검증·기본값·zero-pad 적용\n *\n * 레지스트리에 없는 오퍼레이션도 호출 가능 (스펙 없음 → 검증 스킵). 새 data.go.kr 서비스가\n * 등장해도 스펙 추가 전까지 범용 호출로 즉시 사용 가능하다는 장점.\n */\nasync function DataGoKrCall(step, context: Context): Promise<{ data: DataGoKrResponse<any> }> {\n const { connection: connectionName, params: stepParams } = step\n const { domain, user, data, variables, lng, logger } = context\n\n const instance: DataGoKrConnectionInstance = await ConnectionManager.getConnectionInstanceByName(\n domain,\n connectionName\n )\n if (!instance?.client) {\n throw new Error(`data-go-kr connection '${connectionName}' is not established.`)\n }\n\n const operationRef = stepParams?.operationRef\n if (!operationRef || typeof operationRef !== 'string') {\n throw new Error('data-go-kr-call: operationRef is required (format: \"<serviceId>.<operationId>\")')\n }\n\n const resolved = SpecRegistry.resolve(operationRef)\n const rawParams = stepParams?.params || {}\n\n const scope = { domain, user, lng, data, variables, console }\n const evalValue = (value: any) => {\n if (value === undefined || value === null) return value\n if (typeof value !== 'string') return value\n try {\n return evaluateTemplate(value, scope)\n } catch (err) {\n throw new Error(`data-go-kr-call: failed to evaluate parameter: ${(err as Error).message}`)\n }\n }\n\n const evaluatedParams: Record<string, any> = {}\n for (const [k, v] of Object.entries(rawParams)) {\n evaluatedParams[k] = evalValue(v)\n }\n\n const { service, operation } = resolved || { service: null, operation: null }\n const finalParams = operation\n ? normalizeAndValidateParams(operation, evaluatedParams)\n : evaluatedParams\n\n const servicePath = resolved\n ? `${service!.serviceId}/${operation!.operationId}`\n : operationRef.replace('.', '/')\n\n logger?.info?.(`[data-go-kr] call ${servicePath} params=${JSON.stringify(finalParams)}`)\n\n const response = await instance.client.get(servicePath, finalParams)\n return { data: response }\n}\n\n/**\n * 스펙 기반 파라미터 정규화·검증.\n *\n * 1. required 필수값 체크\n * 2. default 기본값 주입\n * 3. pad zero-padding (예: bun=6 → \"0006\")\n * 4. length 정확 길이 검증\n * 5. enum 허용 값 검증\n */\nfunction normalizeAndValidateParams(operation: OperationSpec, input: Record<string, any>): Record<string, any> {\n const output: Record<string, any> = {}\n const errors: string[] = []\n\n for (const p of operation.params) {\n let value = input[p.name]\n\n if (value === undefined || value === null || value === '') {\n if (p.default !== undefined) {\n value = p.default\n } else if (p.required) {\n errors.push(`'${p.name}' is required (${p.description})`)\n continue\n } else {\n continue\n }\n }\n\n value = String(value)\n\n if (p.pad && value.length < p.pad) {\n value = '0'.repeat(p.pad - value.length) + value\n }\n\n if (p.length !== undefined && value.length !== p.length) {\n errors.push(\n `'${p.name}' must be exactly ${p.length} characters (got \"${value}\", length ${value.length})`\n )\n continue\n }\n\n if (p.enum && !p.enum.some(e => e.value === value)) {\n errors.push(\n `'${p.name}' must be one of [${p.enum.map(e => e.value).join(', ')}] (got \"${value}\")`\n )\n continue\n }\n\n output[p.name] = value\n }\n\n /* 스펙에 없는 파라미터도 pass-through (미등록 필드 허용) */\n for (const [k, v] of Object.entries(input)) {\n if (!(k in output) && !operation.params.find(p => p.name === k)) {\n if (v !== undefined && v !== null && v !== '') {\n output[k] = v\n }\n }\n }\n\n if (errors.length > 0) {\n throw new Error(\n `data-go-kr-call parameter validation failed for ${operation.operationId}:\\n - ${errors.join('\\n - ')}`\n )\n }\n\n return output\n}\n\nDataGoKrCall.parameterSpec = [\n {\n type: 'string',\n name: 'operationRef',\n label: 'label.operation-ref',\n placeholder: '<serviceId>.<operationId> (예: 1613000/BldRgstService_v2.getBrTitleInfo)'\n },\n {\n type: 'scenario-step-input',\n name: 'params',\n label: 'label.operation-params'\n }\n]\n\nDataGoKrCall.help = 'integration/task/data-go-kr-call'\n\nTaskRegistry.registerTaskHandler('data-go-kr-call', DataGoKrCall)\n\nexport default DataGoKrCall\n"]}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 태스크 배럴.
3
+ *
4
+ * 구성 규약:
5
+ * - 범용 태스크 (여러 서비스에 공통 적용) 는 이 폴더 **최상단** 에 파일로 배치
6
+ * 예) call.ts → data-go-kr-call
7
+ *
8
+ * - 특정 도메인/서비스의 전용 태스크는 **도메인 이름 폴더** 아래 배치
9
+ * 예) building-ledger/ , (향후) property-trade/ , address/ ...
10
+ *
11
+ * 새 서비스 지원 우선순위:
12
+ * 1) 먼저 SpecRegistry 에 서비스 스펙을 등록 → `data-go-kr-call` 로 즉시 호출 가능
13
+ * 2) 그래도 불충분한 경우(입력 폼 필요, 응답 구조가 비표준, 도메인 가공 필수 등)만
14
+ * 도메인 폴더를 새로 만들고 전용 태스크 작성
15
+ *
16
+ * 즉 이 폴더에 새 파일/폴더가 추가되는 것은 "공통 경로로 풀 수 없는 예외" 뿐이다.
17
+ */
18
+ import './call';
19
+ import './building-ledger';
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * 태스크 배럴.
5
+ *
6
+ * 구성 규약:
7
+ * - 범용 태스크 (여러 서비스에 공통 적용) 는 이 폴더 **최상단** 에 파일로 배치
8
+ * 예) call.ts → data-go-kr-call
9
+ *
10
+ * - 특정 도메인/서비스의 전용 태스크는 **도메인 이름 폴더** 아래 배치
11
+ * 예) building-ledger/ , (향후) property-trade/ , address/ ...
12
+ *
13
+ * 새 서비스 지원 우선순위:
14
+ * 1) 먼저 SpecRegistry 에 서비스 스펙을 등록 → `data-go-kr-call` 로 즉시 호출 가능
15
+ * 2) 그래도 불충분한 경우(입력 폼 필요, 응답 구조가 비표준, 도메인 가공 필수 등)만
16
+ * 도메인 폴더를 새로 만들고 전용 태스크 작성
17
+ *
18
+ * 즉 이 폴더에 새 파일/폴더가 추가되는 것은 "공통 경로로 풀 수 없는 예외" 뿐이다.
19
+ */
20
+ require("./call");
21
+ require("./building-ledger");
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/task/index.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,kBAAe;AACf,6BAA0B","sourcesContent":["/**\n * 태스크 배럴.\n *\n * 구성 규약:\n * - 범용 태스크 (여러 서비스에 공통 적용) 는 이 폴더 **최상단** 에 파일로 배치\n * 예) call.ts → data-go-kr-call\n *\n * - 특정 도메인/서비스의 전용 태스크는 **도메인 이름 폴더** 아래 배치\n * 예) building-ledger/ , (향후) property-trade/ , address/ ...\n *\n * 새 서비스 지원 우선순위:\n * 1) 먼저 SpecRegistry 에 서비스 스펙을 등록 → `data-go-kr-call` 로 즉시 호출 가능\n * 2) 그래도 불충분한 경우(입력 폼 필요, 응답 구조가 비표준, 도메인 가공 필수 등)만\n * 도메인 폴더를 새로 만들고 전용 태스크 작성\n *\n * 즉 이 폴더에 새 파일/폴더가 추가되는 것은 \"공통 경로로 풀 수 없는 예외\" 뿐이다.\n */\nimport './call'\nimport './building-ledger'\n"]}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * 공공데이터포털(data.go.kr) 공용 응답 타입.
3
+ *
4
+ * 대부분의 data.go.kr 서비스가 동일한 봉투(envelope) 구조를 사용한다:
5
+ * { response: { header: { resultCode, resultMsg }, body: { items: { item[] }, numOfRows, pageNo, totalCount } } }
6
+ */
7
+ /** 공공데이터포털 공용 응답 봉투. */
8
+ export interface DataGoKrResponse<T> {
9
+ response: {
10
+ header: {
11
+ resultCode: string;
12
+ resultMsg: string;
13
+ };
14
+ body: {
15
+ items?: {
16
+ item?: T | T[];
17
+ } | '';
18
+ numOfRows: number;
19
+ pageNo: number;
20
+ totalCount: number;
21
+ };
22
+ };
23
+ }
24
+ /**
25
+ * 건축물대장 서비스 표제부(`getBrTitleInfo`) 레코드.
26
+ *
27
+ * 총 30+ 필드이지만 도메인에서 자주 쓰는 필드만 명시하고 나머지는 인덱스 시그니처.
28
+ */
29
+ export interface BrTitleItem {
30
+ mgmBldrgstPk: string;
31
+ platPlc?: string;
32
+ newPlatPlc?: string;
33
+ bldNm?: string;
34
+ dongNm?: string;
35
+ platArea?: string;
36
+ archArea?: string;
37
+ bcRat?: string;
38
+ totArea?: string;
39
+ vlRatEstmTotArea?: string;
40
+ vlRat?: string;
41
+ strctCd?: string;
42
+ strctCdNm?: string;
43
+ mainPurpsCd?: string;
44
+ mainPurpsCdNm?: string;
45
+ grndFlrCnt?: string;
46
+ ugrndFlrCnt?: string;
47
+ regstrKindCd?: string;
48
+ regstrGbCd?: string;
49
+ useAprDay?: string;
50
+ mainBldCnt?: string;
51
+ atchBldCnt?: string;
52
+ totPkngCnt?: string;
53
+ [key: string]: any;
54
+ }
55
+ /**
56
+ * 건축물대장 표제부(`getBrTitleInfo`) 조회 결과.
57
+ *
58
+ * 다동(多棟) 필지는 items 가 여러 건, 단동 필지는 1건.
59
+ * 집계·요약은 소비자 스텝(data-mapper / jsonata / 도메인 전용 태스크) 에서 수행한다.
60
+ */
61
+ export interface BuildingLedgerResult {
62
+ items: BrTitleItem[];
63
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * 공공데이터포털(data.go.kr) 공용 응답 타입.
4
+ *
5
+ * 대부분의 data.go.kr 서비스가 동일한 봉투(envelope) 구조를 사용한다:
6
+ * { response: { header: { resultCode, resultMsg }, body: { items: { item[] }, numOfRows, pageNo, totalCount } } }
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../server/engine/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG","sourcesContent":["/**\n * 공공데이터포털(data.go.kr) 공용 응답 타입.\n *\n * 대부분의 data.go.kr 서비스가 동일한 봉투(envelope) 구조를 사용한다:\n * { response: { header: { resultCode, resultMsg }, body: { items: { item[] }, numOfRows, pageNo, totalCount } } }\n */\n\n/** 공공데이터포털 공용 응답 봉투. */\nexport interface DataGoKrResponse<T> {\n response: {\n header: {\n resultCode: string /* '00' = 정상 */\n resultMsg: string\n }\n body: {\n items?: { item?: T | T[] } | ''\n numOfRows: number\n pageNo: number\n totalCount: number\n }\n }\n}\n\n/**\n * 건축물대장 서비스 표제부(`getBrTitleInfo`) 레코드.\n *\n * 총 30+ 필드이지만 도메인에서 자주 쓰는 필드만 명시하고 나머지는 인덱스 시그니처.\n */\nexport interface BrTitleItem {\n mgmBldrgstPk: string /* 관리건축물대장PK */\n platPlc?: string /* 대지위치 */\n newPlatPlc?: string /* 도로명대지위치 */\n bldNm?: string /* 건물명 */\n dongNm?: string /* 동명칭 */\n platArea?: string /* 대지면적 */\n archArea?: string /* 건축면적 */\n bcRat?: string /* 건폐율(%) */\n totArea?: string /* 연면적 ★ */\n vlRatEstmTotArea?: string\n vlRat?: string /* 용적률(%) ★ */\n strctCd?: string\n strctCdNm?: string\n mainPurpsCd?: string\n mainPurpsCdNm?: string\n grndFlrCnt?: string /* 지상층수 ★ */\n ugrndFlrCnt?: string /* 지하층수 ★ */\n regstrKindCd?: string /* 2=일반 / 3=집합 */\n regstrGbCd?: string\n useAprDay?: string\n mainBldCnt?: string\n atchBldCnt?: string\n totPkngCnt?: string\n [key: string]: any\n}\n\n/**\n * 건축물대장 표제부(`getBrTitleInfo`) 조회 결과.\n *\n * 다동(多棟) 필지는 items 가 여러 건, 단동 필지는 1건.\n * 집계·요약은 소비자 스텝(data-mapper / jsonata / 도메인 전용 태스크) 에서 수행한다.\n */\nexport interface BuildingLedgerResult {\n items: BrTitleItem[]\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import './engine';
2
+ export * from './engine/types';
3
+ export * from './engine/spec';
4
+ export { DataGoKrClient } from './engine/connector/data-go-kr-client';
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataGoKrClient = void 0;
4
+ const tslib_1 = require("tslib");
5
+ require("./engine");
6
+ tslib_1.__exportStar(require("./engine/types"), exports);
7
+ tslib_1.__exportStar(require("./engine/spec"), exports);
8
+ var data_go_kr_client_1 = require("./engine/connector/data-go-kr-client");
9
+ Object.defineProperty(exports, "DataGoKrClient", { enumerable: true, get: function () { return data_go_kr_client_1.DataGoKrClient; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;AAAA,oBAAiB;AAEjB,yDAA8B;AAC9B,wDAA6B;AAC7B,0EAAqE;AAA5D,mHAAA,cAAc,OAAA","sourcesContent":["import './engine'\n\nexport * from './engine/types'\nexport * from './engine/spec'\nexport { DataGoKrClient } from './engine/connector/data-go-kr-client'\n"]}