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

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 (113) hide show
  1. package/README.md +94 -0
  2. package/ROADMAP.md +282 -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 +138 -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 +29 -0
  7. package/dist-server/engine/connector/data-go-kr-connector.js +53 -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/hub.d.ts +12 -0
  16. package/dist-server/engine/spec/building-ledger/hub.js +138 -0
  17. package/dist-server/engine/spec/building-ledger/hub.js.map +1 -0
  18. package/dist-server/engine/spec/building-ledger/index.d.ts +7 -0
  19. package/dist-server/engine/spec/building-ledger/index.js +12 -0
  20. package/dist-server/engine/spec/building-ledger/index.js.map +1 -0
  21. package/dist-server/engine/spec/index.d.ts +17 -0
  22. package/dist-server/engine/spec/index.js +59 -0
  23. package/dist-server/engine/spec/index.js.map +1 -0
  24. package/dist-server/engine/spec/types.d.ts +79 -0
  25. package/dist-server/engine/spec/types.js +30 -0
  26. package/dist-server/engine/spec/types.js.map +1 -0
  27. package/dist-server/engine/spec/weather/asos.d.ts +2 -0
  28. package/dist-server/engine/spec/weather/asos.js +33 -0
  29. package/dist-server/engine/spec/weather/asos.js.map +1 -0
  30. package/dist-server/engine/spec/weather/aws.d.ts +2 -0
  31. package/dist-server/engine/spec/weather/aws.js +28 -0
  32. package/dist-server/engine/spec/weather/aws.js.map +1 -0
  33. package/dist-server/engine/spec/weather/index.d.ts +14 -0
  34. package/dist-server/engine/spec/weather/index.js +23 -0
  35. package/dist-server/engine/spec/weather/index.js.map +1 -0
  36. package/dist-server/engine/spec/weather/mid-term-forecast.d.ts +2 -0
  37. package/dist-server/engine/spec/weather/mid-term-forecast.js +56 -0
  38. package/dist-server/engine/spec/weather/mid-term-forecast.js.map +1 -0
  39. package/dist-server/engine/spec/weather/short-term-forecast.d.ts +2 -0
  40. package/dist-server/engine/spec/weather/short-term-forecast.js +71 -0
  41. package/dist-server/engine/spec/weather/short-term-forecast.js.map +1 -0
  42. package/dist-server/engine/spec/weather/warning.d.ts +2 -0
  43. package/dist-server/engine/spec/weather/warning.js +34 -0
  44. package/dist-server/engine/spec/weather/warning.js.map +1 -0
  45. package/dist-server/engine/task/building-ledger/general.d.ts +30 -0
  46. package/dist-server/engine/task/building-ledger/general.js +123 -0
  47. package/dist-server/engine/task/building-ledger/general.js.map +1 -0
  48. package/dist-server/engine/task/building-ledger/index.d.ts +13 -0
  49. package/dist-server/engine/task/building-ledger/index.js +16 -0
  50. package/dist-server/engine/task/building-ledger/index.js.map +1 -0
  51. package/dist-server/engine/task/building-ledger/summary.d.ts +95 -0
  52. package/dist-server/engine/task/building-ledger/summary.js +174 -0
  53. package/dist-server/engine/task/building-ledger/summary.js.map +1 -0
  54. package/dist-server/engine/task/call.d.ts +40 -0
  55. package/dist-server/engine/task/call.js +144 -0
  56. package/dist-server/engine/task/call.js.map +1 -0
  57. package/dist-server/engine/task/index.d.ts +20 -0
  58. package/dist-server/engine/task/index.js +23 -0
  59. package/dist-server/engine/task/index.js.map +1 -0
  60. package/dist-server/engine/task/weather/grid-converter.d.ts +24 -0
  61. package/dist-server/engine/task/weather/grid-converter.js +69 -0
  62. package/dist-server/engine/task/weather/grid-converter.js.map +1 -0
  63. package/dist-server/engine/task/weather/index.d.ts +13 -0
  64. package/dist-server/engine/task/weather/index.js +18 -0
  65. package/dist-server/engine/task/weather/index.js.map +1 -0
  66. package/dist-server/engine/task/weather/short-term-forecast.d.ts +38 -0
  67. package/dist-server/engine/task/weather/short-term-forecast.js +99 -0
  68. package/dist-server/engine/task/weather/short-term-forecast.js.map +1 -0
  69. package/dist-server/engine/types.d.ts +63 -0
  70. package/dist-server/engine/types.js +9 -0
  71. package/dist-server/engine/types.js.map +1 -0
  72. package/dist-server/index.d.ts +6 -0
  73. package/dist-server/index.js +13 -0
  74. package/dist-server/index.js.map +1 -0
  75. package/dist-server/tsconfig.tsbuildinfo +1 -0
  76. package/helps/integration/connector/data-go-kr-connector.md +38 -0
  77. package/helps/integration/services/building-ledger.md +110 -0
  78. package/helps/integration/services/weather.md +82 -0
  79. package/helps/integration/task/building-ledger.md +135 -0
  80. package/helps/integration/task/data-go-kr-call.md +114 -0
  81. package/helps/integration/task/weather-short-term-forecast.md +96 -0
  82. package/package.json +28 -0
  83. package/server/engine/connector/data-go-kr-client.ts +157 -0
  84. package/server/engine/connector/data-go-kr-connector.ts +72 -0
  85. package/server/engine/connector/index.ts +1 -0
  86. package/server/engine/index.ts +2 -0
  87. package/server/engine/spec/building-ledger/hub.ts +143 -0
  88. package/server/engine/spec/building-ledger/index.ts +7 -0
  89. package/server/engine/spec/index.ts +62 -0
  90. package/server/engine/spec/types.ts +84 -0
  91. package/server/engine/spec/weather/asos.ts +32 -0
  92. package/server/engine/spec/weather/aws.ts +27 -0
  93. package/server/engine/spec/weather/index.ts +14 -0
  94. package/server/engine/spec/weather/mid-term-forecast.ts +56 -0
  95. package/server/engine/spec/weather/short-term-forecast.ts +73 -0
  96. package/server/engine/spec/weather/warning.ts +33 -0
  97. package/server/engine/task/building-ledger/general.ts +141 -0
  98. package/server/engine/task/building-ledger/index.ts +13 -0
  99. package/server/engine/task/building-ledger/summary.ts +277 -0
  100. package/server/engine/task/call.ts +177 -0
  101. package/server/engine/task/index.ts +20 -0
  102. package/server/engine/task/weather/grid-converter.ts +79 -0
  103. package/server/engine/task/weather/index.ts +14 -0
  104. package/server/engine/task/weather/short-term-forecast.ts +110 -0
  105. package/server/engine/types.ts +64 -0
  106. package/server/index.ts +7 -0
  107. package/things-factory.config.js +1 -0
  108. package/translations/en.json +18 -0
  109. package/translations/ja.json +18 -0
  110. package/translations/ko.json +18 -0
  111. package/translations/ms.json +18 -0
  112. package/translations/zh.json +18 -0
  113. package/tsconfig.json +10 -0
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("./data-go-kr-connector");
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/connector/index.ts"],"names":[],"mappings":";;AAAA,kCAA+B","sourcesContent":["import './data-go-kr-connector'\n"]}
@@ -0,0 +1,2 @@
1
+ import './connector';
2
+ import './task';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("./connector");
4
+ require("./task");
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/engine/index.ts"],"names":[],"mappings":";;AAAA,uBAAoB;AACpB,kBAAe","sourcesContent":["import './connector'\nimport './task'\n"]}
@@ -0,0 +1,12 @@
1
+ import { ServiceSpec } from '../types';
2
+ /**
3
+ * 국토교통부_건축물대장 허브 서비스 (data.go.kr 데이터셋 15134735).
4
+ *
5
+ * 세움터(EAIS) DB 를 원천으로 하는 공공 건축물대장 통합 Hub Open API.
6
+ * 모든 오퍼레이션은 동일한 PNU(필지고유번호) 구성요소로 조회한다:
7
+ * - sigunguCd (5) + bjdongCd (5) + platGbCd (1) + bun (4) + ji (4)
8
+ *
9
+ * 구버전 `BldRgstService_v2` (`1613000/BldRgstService_v2/`) 는 본 허브 서비스로
10
+ * 사실상 통합·승격되었다. 신규 사용자는 허브 서비스 활용신청을 권장.
11
+ */
12
+ export declare const BldRgstHubService: ServiceSpec;
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BldRgstHubService = void 0;
4
+ /**
5
+ * PNU 5요소 파라미터 스펙 — BldRgstHubService 의 모든 오퍼레이션이 공유.
6
+ * 별도 배열 분리로 작성해두면 타 서비스(예: 건축물대장 허브) 도 재사용 가능.
7
+ */
8
+ const pnuParams = [
9
+ {
10
+ name: 'sigunguCd',
11
+ label: 'label.sigungu-cd',
12
+ required: true,
13
+ length: 5,
14
+ description: '시군구코드 5자리 (법정동코드 10자리의 앞 5자리).',
15
+ example: '11680'
16
+ },
17
+ {
18
+ name: 'bjdongCd',
19
+ label: 'label.bjdong-cd',
20
+ required: true,
21
+ length: 5,
22
+ description: '법정동코드 5자리 (법정동코드 10자리의 뒤 5자리).',
23
+ example: '10300'
24
+ },
25
+ {
26
+ name: 'platGbCd',
27
+ label: 'label.plat-gb-cd',
28
+ default: '0',
29
+ length: 1,
30
+ description: '대지구분 1자리. `0` 대지 / `1` 산 / `2` 블록.',
31
+ example: '0',
32
+ enum: [
33
+ { value: '0', label: '대지' },
34
+ { value: '1', label: '산' },
35
+ { value: '2', label: '블록' }
36
+ ]
37
+ },
38
+ {
39
+ name: 'bun',
40
+ label: 'label.bun',
41
+ required: true,
42
+ pad: 4,
43
+ description: '본번. 자동으로 4자리 zero-pad 됨 (예: `6` → `0006`). 하이픈 포함 지번은 본번/부번을 각각 입력.',
44
+ example: '223'
45
+ },
46
+ {
47
+ name: 'ji',
48
+ label: 'label.ji',
49
+ default: '0',
50
+ pad: 4,
51
+ description: '부번. 없으면 `0`. 자동 4자리 zero-pad.',
52
+ example: '0'
53
+ }
54
+ ];
55
+ /**
56
+ * 국토교통부_건축물대장 허브 서비스 (data.go.kr 데이터셋 15134735).
57
+ *
58
+ * 세움터(EAIS) DB 를 원천으로 하는 공공 건축물대장 통합 Hub Open API.
59
+ * 모든 오퍼레이션은 동일한 PNU(필지고유번호) 구성요소로 조회한다:
60
+ * - sigunguCd (5) + bjdongCd (5) + platGbCd (1) + bun (4) + ji (4)
61
+ *
62
+ * 구버전 `BldRgstService_v2` (`1613000/BldRgstService_v2/`) 는 본 허브 서비스로
63
+ * 사실상 통합·승격되었다. 신규 사용자는 허브 서비스 활용신청을 권장.
64
+ */
65
+ exports.BldRgstHubService = {
66
+ serviceId: '1613000/BldRgstHubService',
67
+ label: '국토교통부_건축물대장 허브 서비스',
68
+ description: '세움터(EAIS) 원천의 건축물대장 정보를 조회한다. 표제부·총괄표제부·층별개요·부속지번·전유공용면적·주택가격·소유자현황·기본개요 등 8개 오퍼레이션 제공.',
69
+ homepage: 'https://www.data.go.kr/data/15134735/openapi.do',
70
+ operations: {
71
+ getBrTitleInfo: {
72
+ operationId: 'getBrTitleInfo',
73
+ label: '표제부 조회',
74
+ description: '건축물대장 표제부 (건물 본문) 를 조회한다. 연면적·용적률·지상층수·지하층수·주구조·주용도 등 건물 개요를 반환. 한 필지에 동이 여러 개이면 복수 레코드로 내려온다.',
75
+ params: [...pnuParams],
76
+ responseNotes: '응답 `response.body.items.item` 이 배열 또는 단일 객체로 올 수 있음. 모든 숫자 필드가 문자열(`"114000.00"`)로 내려옴. 집합건축물은 `regstrKindCd=3`, 일반건축물은 `regstrKindCd=2`.',
77
+ externalDocsUrl: 'https://www.data.go.kr/data/15134735/openapi.do',
78
+ examples: [
79
+ {
80
+ label: '서울 강남구 역삼동 823',
81
+ params: { sigunguCd: '11680', bjdongCd: '10300', bun: '823', ji: '0' }
82
+ }
83
+ ]
84
+ },
85
+ getBrRecapTitleInfo: {
86
+ operationId: 'getBrRecapTitleInfo',
87
+ label: '총괄표제부 조회',
88
+ description: '집합건축물(아파트 단지 등) 의 총괄표제부를 조회한다. 단지 전체 연면적·대지면적·동 수·세대수 등을 반환. 일반건축물에는 없음.',
89
+ params: [...pnuParams],
90
+ responseNotes: '일반건축물대장(단동) 의 경우 레코드가 없음. 집합건축물일 때만 유효.',
91
+ examples: [
92
+ {
93
+ label: '아파트 단지 (예시)',
94
+ params: { sigunguCd: '11680', bjdongCd: '10300', bun: '823', ji: '0' }
95
+ }
96
+ ]
97
+ },
98
+ getBrFlrOulnInfo: {
99
+ operationId: 'getBrFlrOulnInfo',
100
+ label: '층별개요 조회',
101
+ description: '층별로 주용도·구조·면적을 조회. 지하 N층부터 지상 M층까지 각 층의 상세 구성을 반환. `regstrKindCd`, `regstrGbCd` 로 어느 대장의 층인지 구분.',
102
+ params: [...pnuParams],
103
+ responseNotes: '한 필지에 동이 여러 개이면 각 동의 각 층이 모두 나옴 → 결과 건수가 많을 수 있음.'
104
+ },
105
+ getBrExposPubuseAreaInfo: {
106
+ operationId: 'getBrExposPubuseAreaInfo',
107
+ label: '전유공용면적 조회',
108
+ description: '집합건축물의 호(세대) 별 전유면적·공용면적을 조회. 아파트 세대별 실제 면적 산출에 사용.',
109
+ params: [...pnuParams],
110
+ responseNotes: '집합건축물일 때만 레코드 존재. 일반건축물에는 해당 없음.'
111
+ },
112
+ getBrAtchJibunInfo: {
113
+ operationId: 'getBrAtchJibunInfo',
114
+ label: '부속지번 조회',
115
+ description: '대장에 연결된 부속지번(인접 필지 등) 목록을 조회.',
116
+ params: [...pnuParams]
117
+ },
118
+ getBrHsprcInfo: {
119
+ operationId: 'getBrHsprcInfo',
120
+ label: '주택가격 조회',
121
+ description: '공동주택/단독주택 공시가격 이력을 조회. 연도별 개별주택가격·공동주택가격 제공.',
122
+ params: [...pnuParams]
123
+ },
124
+ getBrBasisOulnInfo: {
125
+ operationId: 'getBrBasisOulnInfo',
126
+ label: '기본개요 조회',
127
+ description: '대장의 기본개요(대장 구분, 대장 종류, 변동일, 변동원인) 를 조회. 변동 이력 추적 용도.',
128
+ params: [...pnuParams]
129
+ },
130
+ getBrExposInfo: {
131
+ operationId: 'getBrExposInfo',
132
+ label: '전유부 조회',
133
+ description: '집합건축물의 호(세대) 목록과 호별 개요를 조회. 전유공용면적보다 상위 요약 수준.',
134
+ params: [...pnuParams]
135
+ }
136
+ }
137
+ };
138
+ //# sourceMappingURL=hub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub.js","sourceRoot":"","sources":["../../../../server/engine/spec/building-ledger/hub.ts"],"names":[],"mappings":"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","sourcesContent":["import { OperationParamSpec, ServiceSpec } from '../types'\n\n/**\n * PNU 5요소 파라미터 스펙 — BldRgstHubService 의 모든 오퍼레이션이 공유.\n * 별도 배열 분리로 작성해두면 타 서비스(예: 건축물대장 허브) 도 재사용 가능.\n */\nconst pnuParams: OperationParamSpec[] = [\n {\n name: 'sigunguCd',\n label: 'label.sigungu-cd',\n required: true,\n length: 5,\n description: '시군구코드 5자리 (법정동코드 10자리의 앞 5자리).',\n example: '11680'\n },\n {\n name: 'bjdongCd',\n label: 'label.bjdong-cd',\n required: true,\n length: 5,\n description: '법정동코드 5자리 (법정동코드 10자리의 뒤 5자리).',\n example: '10300'\n },\n {\n name: 'platGbCd',\n label: 'label.plat-gb-cd',\n default: '0',\n length: 1,\n description: '대지구분 1자리. `0` 대지 / `1` 산 / `2` 블록.',\n example: '0',\n enum: [\n { value: '0', label: '대지' },\n { value: '1', label: '산' },\n { value: '2', label: '블록' }\n ]\n },\n {\n name: 'bun',\n label: 'label.bun',\n required: true,\n pad: 4,\n description: '본번. 자동으로 4자리 zero-pad 됨 (예: `6` → `0006`). 하이픈 포함 지번은 본번/부번을 각각 입력.',\n example: '223'\n },\n {\n name: 'ji',\n label: 'label.ji',\n default: '0',\n pad: 4,\n description: '부번. 없으면 `0`. 자동 4자리 zero-pad.',\n example: '0'\n }\n]\n\n/**\n * 국토교통부_건축물대장 허브 서비스 (data.go.kr 데이터셋 15134735).\n *\n * 세움터(EAIS) DB 를 원천으로 하는 공공 건축물대장 통합 Hub Open API.\n * 모든 오퍼레이션은 동일한 PNU(필지고유번호) 구성요소로 조회한다:\n * - sigunguCd (5) + bjdongCd (5) + platGbCd (1) + bun (4) + ji (4)\n *\n * 구버전 `BldRgstService_v2` (`1613000/BldRgstService_v2/`) 는 본 허브 서비스로\n * 사실상 통합·승격되었다. 신규 사용자는 허브 서비스 활용신청을 권장.\n */\nexport const BldRgstHubService: ServiceSpec = {\n serviceId: '1613000/BldRgstHubService',\n label: '국토교통부_건축물대장 허브 서비스',\n description:\n '세움터(EAIS) 원천의 건축물대장 정보를 조회한다. 표제부·총괄표제부·층별개요·부속지번·전유공용면적·주택가격·소유자현황·기본개요 등 8개 오퍼레이션 제공.',\n homepage: 'https://www.data.go.kr/data/15134735/openapi.do',\n operations: {\n getBrTitleInfo: {\n operationId: 'getBrTitleInfo',\n label: '표제부 조회',\n description:\n '건축물대장 표제부 (건물 본문) 를 조회한다. 연면적·용적률·지상층수·지하층수·주구조·주용도 등 건물 개요를 반환. 한 필지에 동이 여러 개이면 복수 레코드로 내려온다.',\n params: [...pnuParams],\n responseNotes:\n '응답 `response.body.items.item` 이 배열 또는 단일 객체로 올 수 있음. 모든 숫자 필드가 문자열(`\"114000.00\"`)로 내려옴. 집합건축물은 `regstrKindCd=3`, 일반건축물은 `regstrKindCd=2`.',\n externalDocsUrl: 'https://www.data.go.kr/data/15134735/openapi.do',\n examples: [\n {\n label: '서울 강남구 역삼동 823',\n params: { sigunguCd: '11680', bjdongCd: '10300', bun: '823', ji: '0' }\n }\n ]\n },\n getBrRecapTitleInfo: {\n operationId: 'getBrRecapTitleInfo',\n label: '총괄표제부 조회',\n description:\n '집합건축물(아파트 단지 등) 의 총괄표제부를 조회한다. 단지 전체 연면적·대지면적·동 수·세대수 등을 반환. 일반건축물에는 없음.',\n params: [...pnuParams],\n responseNotes: '일반건축물대장(단동) 의 경우 레코드가 없음. 집합건축물일 때만 유효.',\n examples: [\n {\n label: '아파트 단지 (예시)',\n params: { sigunguCd: '11680', bjdongCd: '10300', bun: '823', ji: '0' }\n }\n ]\n },\n getBrFlrOulnInfo: {\n operationId: 'getBrFlrOulnInfo',\n label: '층별개요 조회',\n description:\n '층별로 주용도·구조·면적을 조회. 지하 N층부터 지상 M층까지 각 층의 상세 구성을 반환. `regstrKindCd`, `regstrGbCd` 로 어느 대장의 층인지 구분.',\n params: [...pnuParams],\n responseNotes: '한 필지에 동이 여러 개이면 각 동의 각 층이 모두 나옴 → 결과 건수가 많을 수 있음.'\n },\n getBrExposPubuseAreaInfo: {\n operationId: 'getBrExposPubuseAreaInfo',\n label: '전유공용면적 조회',\n description:\n '집합건축물의 호(세대) 별 전유면적·공용면적을 조회. 아파트 세대별 실제 면적 산출에 사용.',\n params: [...pnuParams],\n responseNotes: '집합건축물일 때만 레코드 존재. 일반건축물에는 해당 없음.'\n },\n getBrAtchJibunInfo: {\n operationId: 'getBrAtchJibunInfo',\n label: '부속지번 조회',\n description: '대장에 연결된 부속지번(인접 필지 등) 목록을 조회.',\n params: [...pnuParams]\n },\n getBrHsprcInfo: {\n operationId: 'getBrHsprcInfo',\n label: '주택가격 조회',\n description: '공동주택/단독주택 공시가격 이력을 조회. 연도별 개별주택가격·공동주택가격 제공.',\n params: [...pnuParams]\n },\n getBrBasisOulnInfo: {\n operationId: 'getBrBasisOulnInfo',\n label: '기본개요 조회',\n description: '대장의 기본개요(대장 구분, 대장 종류, 변동일, 변동원인) 를 조회. 변동 이력 추적 용도.',\n params: [...pnuParams]\n },\n getBrExposInfo: {\n operationId: 'getBrExposInfo',\n label: '전유부 조회',\n description: '집합건축물의 호(세대) 목록과 호별 개요를 조회. 전유공용면적보다 상위 요약 수준.',\n params: [...pnuParams]\n }\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 건축물대장 도메인 서비스 스펙 묶음.
3
+ *
4
+ * 새 변종(예: BldRgstService_v2 호환 유지, 멸실대장 서비스 등) 추가 시
5
+ * 이 폴더 안에 새 파일을 만들고 본 index 에 export + 아래로 SpecRegistry 에 등록.
6
+ */
7
+ export { BldRgstHubService } from './hub';
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BldRgstHubService = void 0;
4
+ /**
5
+ * 건축물대장 도메인 서비스 스펙 묶음.
6
+ *
7
+ * 새 변종(예: BldRgstService_v2 호환 유지, 멸실대장 서비스 등) 추가 시
8
+ * 이 폴더 안에 새 파일을 만들고 본 index 에 export + 아래로 SpecRegistry 에 등록.
9
+ */
10
+ var hub_1 = require("./hub");
11
+ Object.defineProperty(exports, "BldRgstHubService", { enumerable: true, get: function () { return hub_1.BldRgstHubService; } });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/engine/spec/building-ledger/index.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,6BAAyC;AAAhC,wGAAA,iBAAiB,OAAA","sourcesContent":["/**\n * 건축물대장 도메인 서비스 스펙 묶음.\n *\n * 새 변종(예: BldRgstService_v2 호환 유지, 멸실대장 서비스 등) 추가 시\n * 이 폴더 안에 새 파일을 만들고 본 index 에 export + 아래로 SpecRegistry 에 등록.\n */\nexport { BldRgstHubService } from './hub'\n"]}
@@ -0,0 +1,17 @@
1
+ import { OperationSpec, ServiceSpec } from './types';
2
+ export * from './types';
3
+ export * from './building-ledger';
4
+ export * from './weather';
5
+ export declare const SpecRegistry: {
6
+ /** 등록된 모든 서비스 스펙을 반환. */
7
+ listServices(): ServiceSpec[];
8
+ /** 서비스 ID 로 서비스 스펙 조회. */
9
+ getService(serviceId: string): ServiceSpec | undefined;
10
+ /** `<serviceId>.<operationId>` 참조 문자열로 오퍼레이션 스펙 조회. */
11
+ resolve(operationRef: string): {
12
+ service: ServiceSpec;
13
+ operation: OperationSpec;
14
+ } | undefined;
15
+ /** (확장용) 외부에서 서비스 스펙을 추가 등록. */
16
+ register(spec: ServiceSpec): void;
17
+ };
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SpecRegistry = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const types_1 = require("./types");
6
+ /* 도메인별 서비스 스펙 — 새 도메인 추가 시 폴더 추가 + 본 import 한 줄 */
7
+ const buildingLedger = tslib_1.__importStar(require("./building-ledger"));
8
+ const weather = tslib_1.__importStar(require("./weather"));
9
+ tslib_1.__exportStar(require("./types"), exports);
10
+ tslib_1.__exportStar(require("./building-ledger"), exports);
11
+ tslib_1.__exportStar(require("./weather"), exports);
12
+ const services = new Map();
13
+ function registerService(spec) {
14
+ services.set(spec.serviceId, spec);
15
+ }
16
+ /* 도메인 모듈에서 export 된 모든 ServiceSpec 인스턴스를 자동 등록.
17
+ 추가 도메인 import 만 늘리면 이하 코드는 그대로. */
18
+ function registerDomain(domain) {
19
+ for (const value of Object.values(domain)) {
20
+ if (isServiceSpec(value))
21
+ registerService(value);
22
+ }
23
+ }
24
+ function isServiceSpec(value) {
25
+ return (typeof value === 'object' &&
26
+ value !== null &&
27
+ typeof value.serviceId === 'string' &&
28
+ typeof value.operations === 'object');
29
+ }
30
+ registerDomain(buildingLedger);
31
+ registerDomain(weather);
32
+ exports.SpecRegistry = {
33
+ /** 등록된 모든 서비스 스펙을 반환. */
34
+ listServices() {
35
+ return Array.from(services.values());
36
+ },
37
+ /** 서비스 ID 로 서비스 스펙 조회. */
38
+ getService(serviceId) {
39
+ return services.get(serviceId);
40
+ },
41
+ /** `<serviceId>.<operationId>` 참조 문자열로 오퍼레이션 스펙 조회. */
42
+ resolve(operationRef) {
43
+ const parts = (0, types_1.parseOperationRef)(operationRef);
44
+ if (!parts)
45
+ return undefined;
46
+ const service = services.get(parts.serviceId);
47
+ if (!service)
48
+ return undefined;
49
+ const operation = service.operations[parts.operationId];
50
+ if (!operation)
51
+ return undefined;
52
+ return { service, operation };
53
+ },
54
+ /** (확장용) 외부에서 서비스 스펙을 추가 등록. */
55
+ register(spec) {
56
+ registerService(spec);
57
+ }
58
+ };
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/spec/index.ts"],"names":[],"mappings":";;;;AAAA,mCAAuE;AAEvE,mDAAmD;AACnD,0EAAmD;AACnD,2DAAoC;AAEpC,kDAAuB;AACvB,4DAAiC;AACjC,oDAAyB;AAEzB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAA;AAE/C,SAAS,eAAe,CAAC,IAAiB;IACxC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;AACpC,CAAC;AAED;qCACqC;AACrC,SAAS,cAAc,CAAC,MAA+B;IACrD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,aAAa,CAAC,KAAK,CAAC;YAAE,eAAe,CAAC,KAAK,CAAC,CAAA;IAClD,CAAC;AACH,CAAC;AACD,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAQ,KAAa,CAAC,SAAS,KAAK,QAAQ;QAC5C,OAAQ,KAAa,CAAC,UAAU,KAAK,QAAQ,CAC9C,CAAA;AACH,CAAC;AAED,cAAc,CAAC,cAAc,CAAC,CAAA;AAC9B,cAAc,CAAC,OAAO,CAAC,CAAA;AAEV,QAAA,YAAY,GAAG;IAC1B,yBAAyB;IACzB,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IACtC,CAAC;IAED,0BAA0B;IAC1B,UAAU,CAAC,SAAiB;QAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAChC,CAAC;IAED,uDAAuD;IACvD,OAAO,CAAC,YAAoB;QAC1B,MAAM,KAAK,GAAG,IAAA,yBAAiB,EAAC,YAAY,CAAC,CAAA;QAC7C,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAC7C,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAA;QAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QACvD,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAA;QAChC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA;IAC/B,CAAC;IAED,gCAAgC;IAChC,QAAQ,CAAC,IAAiB;QACxB,eAAe,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;CACF,CAAA","sourcesContent":["import { OperationSpec, ServiceSpec, parseOperationRef } from './types'\n\n/* 도메인별 서비스 스펙 — 새 도메인 추가 시 폴더 추가 + 본 import 한 줄 */\nimport * as buildingLedger from './building-ledger'\nimport * as weather from './weather'\n\nexport * from './types'\nexport * from './building-ledger'\nexport * from './weather'\n\nconst services = new Map<string, ServiceSpec>()\n\nfunction registerService(spec: ServiceSpec) {\n services.set(spec.serviceId, spec)\n}\n\n/* 도메인 모듈에서 export 된 모든 ServiceSpec 인스턴스를 자동 등록.\n 추가 도메인 import 만 늘리면 이하 코드는 그대로. */\nfunction registerDomain(domain: Record<string, unknown>) {\n for (const value of Object.values(domain)) {\n if (isServiceSpec(value)) registerService(value)\n }\n}\nfunction isServiceSpec(value: unknown): value is ServiceSpec {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as any).serviceId === 'string' &&\n typeof (value as any).operations === 'object'\n )\n}\n\nregisterDomain(buildingLedger)\nregisterDomain(weather)\n\nexport const SpecRegistry = {\n /** 등록된 모든 서비스 스펙을 반환. */\n listServices(): ServiceSpec[] {\n return Array.from(services.values())\n },\n\n /** 서비스 ID 로 서비스 스펙 조회. */\n getService(serviceId: string): ServiceSpec | undefined {\n return services.get(serviceId)\n },\n\n /** `<serviceId>.<operationId>` 참조 문자열로 오퍼레이션 스펙 조회. */\n resolve(operationRef: string): { service: ServiceSpec; operation: OperationSpec } | undefined {\n const parts = parseOperationRef(operationRef)\n if (!parts) return undefined\n const service = services.get(parts.serviceId)\n if (!service) return undefined\n const operation = service.operations[parts.operationId]\n if (!operation) return undefined\n return { service, operation }\n },\n\n /** (확장용) 외부에서 서비스 스펙을 추가 등록. */\n register(spec: ServiceSpec) {\n registerService(spec)\n }\n}\n"]}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * 공공데이터포털(data.go.kr) Open API 오퍼레이션 스펙 타입.
3
+ *
4
+ * "선언적 레지스트리 + 단일 범용 태스크" 패턴의 핵심.
5
+ *
6
+ * - 런타임에는 `data-go-kr-call` 태스크가 이 스펙으로 파라미터 검증·정규화
7
+ * - 빌드/CI 에서는 이 스펙으로부터 서비스 카탈로그 markdown 을 자동 생성 가능
8
+ * - (장기) 통합 UI 가 이 스펙을 읽어 오퍼레이션 선택 시 **동적 폼 + 인라인 도움말** 을 렌더
9
+ *
10
+ * 즉 스펙 하나가 검증·문서·UI 3가지의 진실의 원천(single source of truth) 이다.
11
+ */
12
+ /** 단일 파라미터 스펙 (도움말용 메타 포함). */
13
+ export interface OperationParamSpec {
14
+ /** 쿼리 파라미터 이름 (예: `sigunguCd`). */
15
+ name: string;
16
+ /** 화면 라벨 키 (i18n). 생략 시 `name` 사용. */
17
+ label?: string;
18
+ /** 필수 여부. */
19
+ required?: boolean;
20
+ /** 기본값 (입력 생략 시 적용). */
21
+ default?: string;
22
+ /** zero-pad 길이. 예: `bun=6` + pad=4 → `"0006"`. */
23
+ pad?: number;
24
+ /** 정확히 이 길이여야 함. 위반 시 태스크가 ValidationError 던짐. */
25
+ length?: number;
26
+ /** 사람이 읽는 파라미터 설명 (도움말·UI 툴팁). */
27
+ description: string;
28
+ /** 예시 값. */
29
+ example?: string | number;
30
+ /** enum 선택지. 제공 시 태스크가 해당 값만 허용. */
31
+ enum?: Array<{
32
+ value: string;
33
+ label: string;
34
+ }>;
35
+ }
36
+ /** 오퍼레이션(엔드포인트) 스펙. */
37
+ export interface OperationSpec {
38
+ /** 오퍼레이션 경로명 (예: `getBrTitleInfo`). */
39
+ operationId: string;
40
+ /** 화면 라벨 (예: '표제부 조회'). */
41
+ label: string;
42
+ /** 사람이 읽는 설명 — 이 오퍼레이션이 무엇을 돌려주는지. */
43
+ description: string;
44
+ /** 파라미터 목록 (검증 + 문서). */
45
+ params: OperationParamSpec[];
46
+ /** 응답 구조 주의사항 (예: 다동 필지는 items 복수, 숫자는 문자열 등). */
47
+ responseNotes?: string;
48
+ /** data.go.kr 원문 상세 페이지 URL. */
49
+ externalDocsUrl?: string;
50
+ /** 자주 쓰는 예시 호출. */
51
+ examples?: Array<{
52
+ label: string;
53
+ params: Record<string, any>;
54
+ comment?: string;
55
+ }>;
56
+ }
57
+ /** 서비스 스펙 (오퍼레이션 묶음). */
58
+ export interface ServiceSpec {
59
+ /** 서비스 경로 (예: `1613000/BldRgstHubService`). */
60
+ serviceId: string;
61
+ /** 화면 라벨 (예: '국토교통부_건축물대장 허브 서비스'). */
62
+ label: string;
63
+ /** 사람이 읽는 설명. */
64
+ description: string;
65
+ /** data.go.kr 활용신청 페이지 URL. */
66
+ homepage?: string;
67
+ /** 오퍼레이션 맵 (operationId → spec). */
68
+ operations: Record<string, OperationSpec>;
69
+ }
70
+ /**
71
+ * 오퍼레이션 참조 문자열 파서.
72
+ *
73
+ * 레지스트리 조회 키: `"<serviceId>.<operationId>"` — 점으로 구분.
74
+ * 예: `"1613000/BldRgstHubService.getBrTitleInfo"`
75
+ */
76
+ export declare function parseOperationRef(ref: string): {
77
+ serviceId: string;
78
+ operationId: string;
79
+ } | null;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ /**
3
+ * 공공데이터포털(data.go.kr) Open API 오퍼레이션 스펙 타입.
4
+ *
5
+ * "선언적 레지스트리 + 단일 범용 태스크" 패턴의 핵심.
6
+ *
7
+ * - 런타임에는 `data-go-kr-call` 태스크가 이 스펙으로 파라미터 검증·정규화
8
+ * - 빌드/CI 에서는 이 스펙으로부터 서비스 카탈로그 markdown 을 자동 생성 가능
9
+ * - (장기) 통합 UI 가 이 스펙을 읽어 오퍼레이션 선택 시 **동적 폼 + 인라인 도움말** 을 렌더
10
+ *
11
+ * 즉 스펙 하나가 검증·문서·UI 3가지의 진실의 원천(single source of truth) 이다.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.parseOperationRef = parseOperationRef;
15
+ /**
16
+ * 오퍼레이션 참조 문자열 파서.
17
+ *
18
+ * 레지스트리 조회 키: `"<serviceId>.<operationId>"` — 점으로 구분.
19
+ * 예: `"1613000/BldRgstHubService.getBrTitleInfo"`
20
+ */
21
+ function parseOperationRef(ref) {
22
+ const idx = ref.lastIndexOf('.');
23
+ if (idx < 0)
24
+ return null;
25
+ return {
26
+ serviceId: ref.substring(0, idx),
27
+ operationId: ref.substring(idx + 1)
28
+ };
29
+ }
30
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../server/engine/spec/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAkEH,8CAOC;AAbD;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,GAAW;IAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAChC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IACxB,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;QAChC,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;KACpC,CAAA;AACH,CAAC","sourcesContent":["/**\n * 공공데이터포털(data.go.kr) Open API 오퍼레이션 스펙 타입.\n *\n * \"선언적 레지스트리 + 단일 범용 태스크\" 패턴의 핵심.\n *\n * - 런타임에는 `data-go-kr-call` 태스크가 이 스펙으로 파라미터 검증·정규화\n * - 빌드/CI 에서는 이 스펙으로부터 서비스 카탈로그 markdown 을 자동 생성 가능\n * - (장기) 통합 UI 가 이 스펙을 읽어 오퍼레이션 선택 시 **동적 폼 + 인라인 도움말** 을 렌더\n *\n * 즉 스펙 하나가 검증·문서·UI 3가지의 진실의 원천(single source of truth) 이다.\n */\n\n/** 단일 파라미터 스펙 (도움말용 메타 포함). */\nexport interface OperationParamSpec {\n /** 쿼리 파라미터 이름 (예: `sigunguCd`). */\n name: string\n /** 화면 라벨 키 (i18n). 생략 시 `name` 사용. */\n label?: string\n /** 필수 여부. */\n required?: boolean\n /** 기본값 (입력 생략 시 적용). */\n default?: string\n /** zero-pad 길이. 예: `bun=6` + pad=4 → `\"0006\"`. */\n pad?: number\n /** 정확히 이 길이여야 함. 위반 시 태스크가 ValidationError 던짐. */\n length?: number\n /** 사람이 읽는 파라미터 설명 (도움말·UI 툴팁). */\n description: string\n /** 예시 값. */\n example?: string | number\n /** enum 선택지. 제공 시 태스크가 해당 값만 허용. */\n enum?: Array<{ value: string; label: string }>\n}\n\n/** 오퍼레이션(엔드포인트) 스펙. */\nexport interface OperationSpec {\n /** 오퍼레이션 경로명 (예: `getBrTitleInfo`). */\n operationId: string\n /** 화면 라벨 (예: '표제부 조회'). */\n label: string\n /** 사람이 읽는 설명 — 이 오퍼레이션이 무엇을 돌려주는지. */\n description: string\n /** 파라미터 목록 (검증 + 문서). */\n params: OperationParamSpec[]\n /** 응답 구조 주의사항 (예: 다동 필지는 items 복수, 숫자는 문자열 등). */\n responseNotes?: string\n /** data.go.kr 원문 상세 페이지 URL. */\n externalDocsUrl?: string\n /** 자주 쓰는 예시 호출. */\n examples?: Array<{\n label: string\n params: Record<string, any>\n comment?: string\n }>\n}\n\n/** 서비스 스펙 (오퍼레이션 묶음). */\nexport interface ServiceSpec {\n /** 서비스 경로 (예: `1613000/BldRgstHubService`). */\n serviceId: string\n /** 화면 라벨 (예: '국토교통부_건축물대장 허브 서비스'). */\n label: string\n /** 사람이 읽는 설명. */\n description: string\n /** data.go.kr 활용신청 페이지 URL. */\n homepage?: string\n /** 오퍼레이션 맵 (operationId → spec). */\n operations: Record<string, OperationSpec>\n}\n\n/**\n * 오퍼레이션 참조 문자열 파서.\n *\n * 레지스트리 조회 키: `\"<serviceId>.<operationId>\"` — 점으로 구분.\n * 예: `\"1613000/BldRgstHubService.getBrTitleInfo\"`\n */\nexport function parseOperationRef(ref: string): { serviceId: string; operationId: string } | null {\n const idx = ref.lastIndexOf('.')\n if (idx < 0) return null\n return {\n serviceId: ref.substring(0, idx),\n operationId: ref.substring(idx + 1)\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { ServiceSpec } from '../types';
2
+ export declare const KmaAsosHourlyService: ServiceSpec;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KmaAsosHourlyService = void 0;
4
+ /**
5
+ * 기상청_종관기상관측 시간자료 (ASOS) (data.go.kr 데이터셋 15057210).
6
+ *
7
+ * 지상 종관기상관측 (Automated Surface Observing System) 의 시간단위 관측 자료.
8
+ * 전국 약 100개 지점에서 표준화된 정밀 관측. 기온·강수량·풍향풍속·습도·기압 등.
9
+ */
10
+ const params = [
11
+ { name: 'dataCd', required: true, description: "자료 코드. 'ASOS' 고정.", example: 'ASOS' },
12
+ { name: 'dateCd', required: true, description: "자료 단위. 시간자료='HR'.", example: 'HR' },
13
+ { name: 'startDt', required: true, length: 8, description: '검색 시작일 YYYYMMDD', example: '20260420' },
14
+ { name: 'startHh', required: true, length: 2, description: '검색 시작시 HH', example: '00' },
15
+ { name: 'endDt', required: true, length: 8, description: '검색 종료일 YYYYMMDD', example: '20260425' },
16
+ { name: 'endHh', required: true, length: 2, description: '검색 종료시 HH', example: '23' },
17
+ { name: 'stnIds', required: true, description: 'KMA ASOS 지점 코드. 서울=108, 부산=159 등.', example: '108' }
18
+ ];
19
+ exports.KmaAsosHourlyService = {
20
+ serviceId: '1360000/AsosHourlyInfoService',
21
+ label: '기상청_종관기상관측 시간자료 (ASOS)',
22
+ description: '지상 종관기상관측(ASOS) 의 시간단위 관측 자료.',
23
+ homepage: 'https://www.data.go.kr/data/15057210/openapi.do',
24
+ operations: {
25
+ getWthrDataList: {
26
+ operationId: 'getWthrDataList',
27
+ label: '시간자료 조회',
28
+ description: '특정 지점·기간의 시간단위 관측 데이터.',
29
+ params
30
+ }
31
+ }
32
+ };
33
+ //# sourceMappingURL=asos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asos.js","sourceRoot":"","sources":["../../../../server/engine/spec/weather/asos.ts"],"names":[],"mappings":";;;AAEA;;;;;GAKG;AACH,MAAM,MAAM,GAAyB;IACnC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE;IACrF,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE;IACnF,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,EAAE;IACnG,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE;IACvF,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,EAAE;IACjG,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE;IACrF,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mCAAmC,EAAE,OAAO,EAAE,KAAK,EAAE;CACrG,CAAA;AAEY,QAAA,oBAAoB,GAAgB;IAC/C,SAAS,EAAE,+BAA+B;IAC1C,KAAK,EAAE,wBAAwB;IAC/B,WAAW,EAAE,+BAA+B;IAC5C,QAAQ,EAAE,iDAAiD;IAC3D,UAAU,EAAE;QACV,eAAe,EAAE;YACf,WAAW,EAAE,iBAAiB;YAC9B,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,wBAAwB;YACrC,MAAM;SACP;KACF;CACF,CAAA","sourcesContent":["import { OperationParamSpec, ServiceSpec } from '../types'\n\n/**\n * 기상청_종관기상관측 시간자료 (ASOS) (data.go.kr 데이터셋 15057210).\n *\n * 지상 종관기상관측 (Automated Surface Observing System) 의 시간단위 관측 자료.\n * 전국 약 100개 지점에서 표준화된 정밀 관측. 기온·강수량·풍향풍속·습도·기압 등.\n */\nconst params: OperationParamSpec[] = [\n { name: 'dataCd', required: true, description: \"자료 코드. 'ASOS' 고정.\", example: 'ASOS' },\n { name: 'dateCd', required: true, description: \"자료 단위. 시간자료='HR'.\", example: 'HR' },\n { name: 'startDt', required: true, length: 8, description: '검색 시작일 YYYYMMDD', example: '20260420' },\n { name: 'startHh', required: true, length: 2, description: '검색 시작시 HH', example: '00' },\n { name: 'endDt', required: true, length: 8, description: '검색 종료일 YYYYMMDD', example: '20260425' },\n { name: 'endHh', required: true, length: 2, description: '검색 종료시 HH', example: '23' },\n { name: 'stnIds', required: true, description: 'KMA ASOS 지점 코드. 서울=108, 부산=159 등.', example: '108' }\n]\n\nexport const KmaAsosHourlyService: ServiceSpec = {\n serviceId: '1360000/AsosHourlyInfoService',\n label: '기상청_종관기상관측 시간자료 (ASOS)',\n description: '지상 종관기상관측(ASOS) 의 시간단위 관측 자료.',\n homepage: 'https://www.data.go.kr/data/15057210/openapi.do',\n operations: {\n getWthrDataList: {\n operationId: 'getWthrDataList',\n label: '시간자료 조회',\n description: '특정 지점·기간의 시간단위 관측 데이터.',\n params\n }\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { ServiceSpec } from '../types';
2
+ export declare const KmaAwsHourlyService: ServiceSpec;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KmaAwsHourlyService = void 0;
4
+ /**
5
+ * 기상청_방재기상관측 시간자료 (AWS) (data.go.kr 데이터셋 15059093).
6
+ *
7
+ * 자동기상관측장비(AWS) 의 시간단위 관측 자료. ASOS 보다 조밀한 격자 (전국 500+ 지점).
8
+ * 강수·기온·풍향풍속·습도 등을 시간 단위로 제공.
9
+ */
10
+ const params = [
11
+ { name: 'tm', required: true, length: 12, description: '관측 시각 YYYYMMDDHHMM', example: '202604251200' },
12
+ { name: 'stn', description: '지점 번호 (생략 시 전국).', example: '108' }
13
+ ];
14
+ exports.KmaAwsHourlyService = {
15
+ serviceId: '1360000/AwsHrInfoService',
16
+ label: '기상청_방재기상관측 시간자료 (AWS)',
17
+ description: '자동기상관측장비(AWS) 의 시간단위 관측 자료. ASOS 대비 조밀한 격자.',
18
+ homepage: 'https://www.data.go.kr/data/15059093/openapi.do',
19
+ operations: {
20
+ getAwsRltmList: {
21
+ operationId: 'getAwsRltmList',
22
+ label: 'AWS 시간자료 조회',
23
+ description: 'AWS 지점의 시간단위 관측 자료. 강수·기온·풍향풍속·습도 등.',
24
+ params
25
+ }
26
+ }
27
+ };
28
+ //# sourceMappingURL=aws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws.js","sourceRoot":"","sources":["../../../../server/engine/spec/weather/aws.ts"],"names":[],"mappings":";;;AAEA;;;;;GAKG;AACH,MAAM,MAAM,GAAyB;IACnC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,cAAc,EAAE;IACtG,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE;CACjE,CAAA;AAEY,QAAA,mBAAmB,GAAgB;IAC9C,SAAS,EAAE,0BAA0B;IACrC,KAAK,EAAE,uBAAuB;IAC9B,WAAW,EAAE,6CAA6C;IAC1D,QAAQ,EAAE,iDAAiD;IAC3D,UAAU,EAAE;QACV,cAAc,EAAE;YACd,WAAW,EAAE,gBAAgB;YAC7B,KAAK,EAAE,aAAa;YACpB,WAAW,EAAE,sCAAsC;YACnD,MAAM;SACP;KACF;CACF,CAAA","sourcesContent":["import { OperationParamSpec, ServiceSpec } from '../types'\n\n/**\n * 기상청_방재기상관측 시간자료 (AWS) (data.go.kr 데이터셋 15059093).\n *\n * 자동기상관측장비(AWS) 의 시간단위 관측 자료. ASOS 보다 조밀한 격자 (전국 500+ 지점).\n * 강수·기온·풍향풍속·습도 등을 시간 단위로 제공.\n */\nconst params: OperationParamSpec[] = [\n { name: 'tm', required: true, length: 12, description: '관측 시각 YYYYMMDDHHMM', example: '202604251200' },\n { name: 'stn', description: '지점 번호 (생략 시 전국).', example: '108' }\n]\n\nexport const KmaAwsHourlyService: ServiceSpec = {\n serviceId: '1360000/AwsHrInfoService',\n label: '기상청_방재기상관측 시간자료 (AWS)',\n description: '자동기상관측장비(AWS) 의 시간단위 관측 자료. ASOS 대비 조밀한 격자.',\n homepage: 'https://www.data.go.kr/data/15059093/openapi.do',\n operations: {\n getAwsRltmList: {\n operationId: 'getAwsRltmList',\n label: 'AWS 시간자료 조회',\n description: 'AWS 지점의 시간단위 관측 자료. 강수·기온·풍향풍속·습도 등.',\n params\n }\n }\n}\n"]}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 기상청(KMA) 도메인 서비스 스펙 묶음.
3
+ *
4
+ * 새 KMA 서비스(예: 황사·자외선·미세먼지·해양 등) 추가 시:
5
+ * 1. 본 폴더에 `<service-slug>.ts` 파일을 만들어 ServiceSpec export
6
+ * 2. 본 index 의 export 와 (필요 시) 외부 SpecRegistry 등록만 추가
7
+ *
8
+ * 한 파일에 여러 서비스를 합치지 말 것 — 확장성 보호.
9
+ */
10
+ export { KmaShortTermForecastService } from './short-term-forecast';
11
+ export { KmaMidTermForecastService } from './mid-term-forecast';
12
+ export { KmaWeatherWarningService } from './warning';
13
+ export { KmaAsosHourlyService } from './asos';
14
+ export { KmaAwsHourlyService } from './aws';
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KmaAwsHourlyService = exports.KmaAsosHourlyService = exports.KmaWeatherWarningService = exports.KmaMidTermForecastService = exports.KmaShortTermForecastService = void 0;
4
+ /**
5
+ * 기상청(KMA) 도메인 서비스 스펙 묶음.
6
+ *
7
+ * 새 KMA 서비스(예: 황사·자외선·미세먼지·해양 등) 추가 시:
8
+ * 1. 본 폴더에 `<service-slug>.ts` 파일을 만들어 ServiceSpec export
9
+ * 2. 본 index 의 export 와 (필요 시) 외부 SpecRegistry 등록만 추가
10
+ *
11
+ * 한 파일에 여러 서비스를 합치지 말 것 — 확장성 보호.
12
+ */
13
+ var short_term_forecast_1 = require("./short-term-forecast");
14
+ Object.defineProperty(exports, "KmaShortTermForecastService", { enumerable: true, get: function () { return short_term_forecast_1.KmaShortTermForecastService; } });
15
+ var mid_term_forecast_1 = require("./mid-term-forecast");
16
+ Object.defineProperty(exports, "KmaMidTermForecastService", { enumerable: true, get: function () { return mid_term_forecast_1.KmaMidTermForecastService; } });
17
+ var warning_1 = require("./warning");
18
+ Object.defineProperty(exports, "KmaWeatherWarningService", { enumerable: true, get: function () { return warning_1.KmaWeatherWarningService; } });
19
+ var asos_1 = require("./asos");
20
+ Object.defineProperty(exports, "KmaAsosHourlyService", { enumerable: true, get: function () { return asos_1.KmaAsosHourlyService; } });
21
+ var aws_1 = require("./aws");
22
+ Object.defineProperty(exports, "KmaAwsHourlyService", { enumerable: true, get: function () { return aws_1.KmaAwsHourlyService; } });
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/engine/spec/weather/index.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;GAQG;AACH,6DAAmE;AAA1D,kIAAA,2BAA2B,OAAA;AACpC,yDAA+D;AAAtD,8HAAA,yBAAyB,OAAA;AAClC,qCAAoD;AAA3C,mHAAA,wBAAwB,OAAA;AACjC,+BAA6C;AAApC,4GAAA,oBAAoB,OAAA;AAC7B,6BAA2C;AAAlC,0GAAA,mBAAmB,OAAA","sourcesContent":["/**\n * 기상청(KMA) 도메인 서비스 스펙 묶음.\n *\n * 새 KMA 서비스(예: 황사·자외선·미세먼지·해양 등) 추가 시:\n * 1. 본 폴더에 `<service-slug>.ts` 파일을 만들어 ServiceSpec export\n * 2. 본 index 의 export 와 (필요 시) 외부 SpecRegistry 등록만 추가\n *\n * 한 파일에 여러 서비스를 합치지 말 것 — 확장성 보호.\n */\nexport { KmaShortTermForecastService } from './short-term-forecast'\nexport { KmaMidTermForecastService } from './mid-term-forecast'\nexport { KmaWeatherWarningService } from './warning'\nexport { KmaAsosHourlyService } from './asos'\nexport { KmaAwsHourlyService } from './aws'\n"]}
@@ -0,0 +1,2 @@
1
+ import { ServiceSpec } from '../types';
2
+ export declare const KmaMidTermForecastService: ServiceSpec;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KmaMidTermForecastService = void 0;
4
+ /**
5
+ * 기상청_중기예보 조회서비스 (data.go.kr 데이터셋 15059468).
6
+ *
7
+ * 3~10일 전망. 광역 권역(regId) 단위로 06·18시 발표.
8
+ */
9
+ const sharedParams = [
10
+ {
11
+ name: 'regId',
12
+ required: true,
13
+ description: '광역 권역 코드. 육상은 `11B00000`(서울/인천/경기) 등, 기온은 `11B10101`(서울) 등 더 세분화. KMA 권역 코드 표 참조.',
14
+ example: '11B00000'
15
+ },
16
+ {
17
+ name: 'tmFc',
18
+ required: true,
19
+ length: 12,
20
+ description: '발표시각 YYYYMMDDHHMM. 중기예보는 06·18시 발표.',
21
+ example: '202604250600'
22
+ }
23
+ ];
24
+ exports.KmaMidTermForecastService = {
25
+ serviceId: '1360000/MidFcstInfoService',
26
+ label: '기상청_중기예보 조회서비스',
27
+ description: '3~10일 중기예보. 육상·기온·해상 별 오퍼레이션.',
28
+ homepage: 'https://www.data.go.kr/data/15059468/openapi.do',
29
+ operations: {
30
+ getMidFcst: {
31
+ operationId: 'getMidFcst',
32
+ label: '중기예보 종합',
33
+ description: '중기 전망 텍스트 (해석본).',
34
+ params: sharedParams
35
+ },
36
+ getMidLandFcst: {
37
+ operationId: 'getMidLandFcst',
38
+ label: '육상 중기예보',
39
+ description: '육상 권역의 강수확률·하늘상태 (3~10일).',
40
+ params: sharedParams
41
+ },
42
+ getMidTa: {
43
+ operationId: 'getMidTa',
44
+ label: '중기 기온예보',
45
+ description: '아침 최저·낮 최고 기온 (3~10일).',
46
+ params: sharedParams
47
+ },
48
+ getMidSeaFcst: {
49
+ operationId: 'getMidSeaFcst',
50
+ label: '해상 중기예보',
51
+ description: '해상 권역의 풍향·풍속·파고.',
52
+ params: sharedParams
53
+ }
54
+ }
55
+ };
56
+ //# sourceMappingURL=mid-term-forecast.js.map