bps-mcp-server 0.1.0

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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +197 -0
  3. package/dist/auth/api-key.provider.d.ts +12 -0
  4. package/dist/auth/api-key.provider.d.ts.map +1 -0
  5. package/dist/auth/api-key.provider.js +28 -0
  6. package/dist/auth/api-key.provider.js.map +1 -0
  7. package/dist/auth/factory.d.ts +4 -0
  8. package/dist/auth/factory.d.ts.map +1 -0
  9. package/dist/auth/factory.js +13 -0
  10. package/dist/auth/factory.js.map +1 -0
  11. package/dist/auth/oauth2.provider.d.ts +22 -0
  12. package/dist/auth/oauth2.provider.d.ts.map +1 -0
  13. package/dist/auth/oauth2.provider.js +64 -0
  14. package/dist/auth/oauth2.provider.js.map +1 -0
  15. package/dist/auth/types.d.ts +13 -0
  16. package/dist/auth/types.d.ts.map +1 -0
  17. package/dist/auth/types.js +2 -0
  18. package/dist/auth/types.js.map +1 -0
  19. package/dist/client/bps-client.d.ts +93 -0
  20. package/dist/client/bps-client.d.ts.map +1 -0
  21. package/dist/client/bps-client.js +255 -0
  22. package/dist/client/bps-client.js.map +1 -0
  23. package/dist/client/endpoints.d.ts +57 -0
  24. package/dist/client/endpoints.d.ts.map +1 -0
  25. package/dist/client/endpoints.js +166 -0
  26. package/dist/client/endpoints.js.map +1 -0
  27. package/dist/client/types.d.ts +273 -0
  28. package/dist/client/types.d.ts.map +1 -0
  29. package/dist/client/types.js +2 -0
  30. package/dist/client/types.js.map +1 -0
  31. package/dist/config/defaults.d.ts +24 -0
  32. package/dist/config/defaults.d.ts.map +1 -0
  33. package/dist/config/defaults.js +26 -0
  34. package/dist/config/defaults.js.map +1 -0
  35. package/dist/config/domain-aliases.d.ts +6 -0
  36. package/dist/config/domain-aliases.d.ts.map +1 -0
  37. package/dist/config/domain-aliases.js +105 -0
  38. package/dist/config/domain-aliases.js.map +1 -0
  39. package/dist/config/index.d.ts +71 -0
  40. package/dist/config/index.d.ts.map +1 -0
  41. package/dist/config/index.js +52 -0
  42. package/dist/config/index.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +31 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/prompts/analysis.prompts.d.ts +3 -0
  48. package/dist/prompts/analysis.prompts.d.ts.map +1 -0
  49. package/dist/prompts/analysis.prompts.js +171 -0
  50. package/dist/prompts/analysis.prompts.js.map +1 -0
  51. package/dist/resources/domain.resources.d.ts +5 -0
  52. package/dist/resources/domain.resources.d.ts.map +1 -0
  53. package/dist/resources/domain.resources.js +62 -0
  54. package/dist/resources/domain.resources.js.map +1 -0
  55. package/dist/server.d.ts +12 -0
  56. package/dist/server.d.ts.map +1 -0
  57. package/dist/server.js +43 -0
  58. package/dist/server.js.map +1 -0
  59. package/dist/services/attribution.d.ts +3 -0
  60. package/dist/services/attribution.d.ts.map +1 -0
  61. package/dist/services/attribution.js +8 -0
  62. package/dist/services/attribution.js.map +1 -0
  63. package/dist/services/cache.d.ts +21 -0
  64. package/dist/services/cache.d.ts.map +1 -0
  65. package/dist/services/cache.js +47 -0
  66. package/dist/services/cache.js.map +1 -0
  67. package/dist/services/data-formatter.d.ts +13 -0
  68. package/dist/services/data-formatter.d.ts.map +1 -0
  69. package/dist/services/data-formatter.js +166 -0
  70. package/dist/services/data-formatter.js.map +1 -0
  71. package/dist/services/domain-resolver.d.ts +22 -0
  72. package/dist/services/domain-resolver.d.ts.map +1 -0
  73. package/dist/services/domain-resolver.js +101 -0
  74. package/dist/services/domain-resolver.js.map +1 -0
  75. package/dist/tools/census.tools.d.ts +4 -0
  76. package/dist/tools/census.tools.d.ts.map +1 -0
  77. package/dist/tools/census.tools.js +28 -0
  78. package/dist/tools/census.tools.js.map +1 -0
  79. package/dist/tools/csa.tools.d.ts +4 -0
  80. package/dist/tools/csa.tools.d.ts.map +1 -0
  81. package/dist/tools/csa.tools.js +77 -0
  82. package/dist/tools/csa.tools.js.map +1 -0
  83. package/dist/tools/domain.tools.d.ts +5 -0
  84. package/dist/tools/domain.tools.d.ts.map +1 -0
  85. package/dist/tools/domain.tools.js +44 -0
  86. package/dist/tools/domain.tools.js.map +1 -0
  87. package/dist/tools/dynamic-data.tools.d.ts +5 -0
  88. package/dist/tools/dynamic-data.tools.d.ts.map +1 -0
  89. package/dist/tools/dynamic-data.tools.js +136 -0
  90. package/dist/tools/dynamic-data.tools.js.map +1 -0
  91. package/dist/tools/glossary.tools.d.ts +4 -0
  92. package/dist/tools/glossary.tools.d.ts.map +1 -0
  93. package/dist/tools/glossary.tools.js +32 -0
  94. package/dist/tools/glossary.tools.js.map +1 -0
  95. package/dist/tools/infographic.tools.d.ts +4 -0
  96. package/dist/tools/infographic.tools.d.ts.map +1 -0
  97. package/dist/tools/infographic.tools.js +60 -0
  98. package/dist/tools/infographic.tools.js.map +1 -0
  99. package/dist/tools/news.tools.d.ts +4 -0
  100. package/dist/tools/news.tools.d.ts.map +1 -0
  101. package/dist/tools/news.tools.js +55 -0
  102. package/dist/tools/news.tools.js.map +1 -0
  103. package/dist/tools/publication.tools.d.ts +4 -0
  104. package/dist/tools/publication.tools.d.ts.map +1 -0
  105. package/dist/tools/publication.tools.js +101 -0
  106. package/dist/tools/publication.tools.js.map +1 -0
  107. package/dist/tools/reference.tools.d.ts +4 -0
  108. package/dist/tools/reference.tools.d.ts.map +1 -0
  109. package/dist/tools/reference.tools.js +20 -0
  110. package/dist/tools/reference.tools.js.map +1 -0
  111. package/dist/tools/search.tools.d.ts +4 -0
  112. package/dist/tools/search.tools.d.ts.map +1 -0
  113. package/dist/tools/search.tools.js +22 -0
  114. package/dist/tools/search.tools.js.map +1 -0
  115. package/dist/tools/static-table.tools.d.ts +4 -0
  116. package/dist/tools/static-table.tools.d.ts.map +1 -0
  117. package/dist/tools/static-table.tools.js +47 -0
  118. package/dist/tools/static-table.tools.js.map +1 -0
  119. package/dist/tools/trade.tools.d.ts +4 -0
  120. package/dist/tools/trade.tools.d.ts.map +1 -0
  121. package/dist/tools/trade.tools.js +25 -0
  122. package/dist/tools/trade.tools.js.map +1 -0
  123. package/dist/tools/utility.tools.d.ts +4 -0
  124. package/dist/tools/utility.tools.d.ts.map +1 -0
  125. package/dist/tools/utility.tools.js +10 -0
  126. package/dist/tools/utility.tools.js.map +1 -0
  127. package/dist/transport/stdio.d.ts +3 -0
  128. package/dist/transport/stdio.d.ts.map +1 -0
  129. package/dist/transport/stdio.js +9 -0
  130. package/dist/transport/stdio.js.map +1 -0
  131. package/dist/utils/error.d.ts +13 -0
  132. package/dist/utils/error.d.ts.map +1 -0
  133. package/dist/utils/error.js +38 -0
  134. package/dist/utils/error.js.map +1 -0
  135. package/dist/utils/logger.d.ts +12 -0
  136. package/dist/utils/logger.d.ts.map +1 -0
  137. package/dist/utils/logger.js +47 -0
  138. package/dist/utils/logger.js.map +1 -0
  139. package/dist/utils/pagination.d.ts +11 -0
  140. package/dist/utils/pagination.d.ts.map +1 -0
  141. package/dist/utils/pagination.js +19 -0
  142. package/dist/utils/pagination.js.map +1 -0
  143. package/package.json +60 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Murphi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,197 @@
1
+ # BPS MCP Server
2
+
3
+ [![CI](https://github.com/murphi/bps-mcp-server/actions/workflows/ci.yml/badge.svg)](https://github.com/murphi/bps-mcp-server/actions/workflows/ci.yml)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
5
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](https://nodejs.org)
6
+
7
+ MCP (Model Context Protocol) server untuk data statistik BPS (Badan Pusat Statistik) Indonesia. Memungkinkan AI clients seperti Claude Desktop, Claude Code, Cursor, dan lainnya untuk mengakses data statistik resmi Indonesia melalui natural language.
8
+
9
+ ## Fitur
10
+
11
+ - **32 tools** mencakup seluruh endpoint BPS API v1
12
+ - **3 MCP Resources** — domain list, kabupaten per provinsi, subjek per domain
13
+ - **5 MCP Prompts** — template analisis data siap pakai
14
+ - **Domain resolver** dengan fuzzy matching (ketik "Jatim" → Jawa Timur)
15
+ - **Data formatter** yang mengubah raw BPS data menjadi format mudah dibaca
16
+ - **In-memory cache** dengan TTL per tipe data
17
+ - **Bilingual** — mendukung bahasa Indonesia dan Inggris
18
+ - **Atribusi BPS** otomatis di setiap response (sesuai ToU)
19
+ - **BYOK** (Bring Your Own Key) — setiap user menggunakan API key BPS sendiri
20
+
21
+ ## Prasyarat
22
+
23
+ - Node.js ≥ 18
24
+ - API key BPS (gratis, daftar di [webapi.bps.go.id](https://webapi.bps.go.id))
25
+
26
+ ## Instalasi & Penggunaan
27
+
28
+ ### Via npx (recommended)
29
+
30
+ ```bash
31
+ BPS_API_KEY=your_key npx bps-mcp-server
32
+ ```
33
+
34
+ ### Clone & Run
35
+
36
+ ```bash
37
+ git clone https://github.com/murphi/bps-mcp-server
38
+ cd bps-mcp-server
39
+ npm install
40
+ npm run build
41
+ BPS_API_KEY=your_key npm start
42
+ ```
43
+
44
+ ## Konfigurasi MCP Client
45
+
46
+ ### Claude Desktop
47
+
48
+ File: `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
49
+
50
+ ```json
51
+ {
52
+ "mcpServers": {
53
+ "bps-statistics": {
54
+ "command": "npx",
55
+ "args": ["-y", "bps-mcp-server"],
56
+ "env": {
57
+ "BPS_API_KEY": "your_api_key_here"
58
+ }
59
+ }
60
+ }
61
+ }
62
+ ```
63
+
64
+ ### Claude Code
65
+
66
+ ```bash
67
+ claude mcp add bps -- npx -y bps-mcp-server
68
+ ```
69
+
70
+ Atau file `.mcp.json` di project root:
71
+
72
+ ```json
73
+ {
74
+ "mcpServers": {
75
+ "bps": {
76
+ "command": "npx",
77
+ "args": ["-y", "bps-mcp-server"],
78
+ "env": {
79
+ "BPS_API_KEY": "${BPS_API_KEY}"
80
+ }
81
+ }
82
+ }
83
+ }
84
+ ```
85
+
86
+ ### Cursor / VS Code
87
+
88
+ File `~/.cursor/mcp.json` atau `.vscode/mcp.json`:
89
+
90
+ ```json
91
+ {
92
+ "mcpServers": {
93
+ "bps-statistics": {
94
+ "command": "npx",
95
+ "args": ["-y", "bps-mcp-server"],
96
+ "env": {
97
+ "BPS_API_KEY": "your_api_key_here"
98
+ }
99
+ }
100
+ }
101
+ }
102
+ ```
103
+
104
+ ## Tools (32)
105
+
106
+ | Tool | Deskripsi |
107
+ |------|-----------|
108
+ | `list_domains` | Daftar wilayah (provinsi, kab/kota) |
109
+ | `resolve_domain` | Konversi nama wilayah → kode domain (fuzzy matching) |
110
+ | `list_subjects` | Daftar subjek data statistik |
111
+ | `list_subject_categories` | Kategori subjek |
112
+ | `list_variables` | Daftar variabel tabel dinamis |
113
+ | `list_vertical_variables` | Variabel vertikal (disagregasi) |
114
+ | `list_derived_variables` | Turunan variabel |
115
+ | `list_periods` | Periode data tersedia |
116
+ | `list_derived_periods` | Turunan periode |
117
+ | `list_units` | Satuan data |
118
+ | `get_dynamic_data` | **Core** — Ambil data tabel dinamis |
119
+ | `list_static_tables` | Daftar tabel statis |
120
+ | `get_static_table` | Detail tabel statis (HTML) |
121
+ | `list_press_releases` | Daftar Berita Resmi Statistik (BRS) |
122
+ | `get_press_release` | Detail BRS |
123
+ | `list_publications` | Daftar publikasi |
124
+ | `get_publication` | Detail publikasi |
125
+ | `list_strategic_indicators` | Indikator strategis |
126
+ | `get_trade_data` | Data ekspor/impor berdasarkan kode HS |
127
+ | `list_infographics` | Daftar infografis BPS |
128
+ | `get_infographic` | Detail infografis |
129
+ | `list_news` | Daftar berita BPS |
130
+ | `get_news` | Detail berita |
131
+ | `list_census_events` | Daftar kegiatan sensus |
132
+ | `list_census_topics` | Topik data per kegiatan sensus |
133
+ | `list_csa_categories` | Kategori CSA |
134
+ | `list_csa_subjects` | Subjek CSA per domain |
135
+ | `list_csa_tables` | Tabel CSA per subjek |
136
+ | `get_csa_table` | Detail tabel CSA (HTML) |
137
+ | `list_glossary` | Glosarium istilah statistik |
138
+ | `search` | Pencarian lintas tipe |
139
+ | `cache_clear` | Bersihkan cache |
140
+
141
+ ## Resources (3)
142
+
143
+ | URI | Deskripsi |
144
+ |-----|-----------|
145
+ | `bps://domains/provinces` | Daftar seluruh provinsi Indonesia (cached) |
146
+ | `bps://domains/regencies/{prov_id}` | Kabupaten/kota per provinsi |
147
+ | `bps://subjects/{domain}` | Subjek statistik per domain |
148
+
149
+ ## Prompts (5)
150
+
151
+ | Prompt | Deskripsi |
152
+ |--------|-----------|
153
+ | `compare_regions` | Bandingkan data antara dua wilayah |
154
+ | `trend_analysis` | Analisis tren data multi-tahun |
155
+ | `poverty_profile` | Profil kemiskinan suatu wilayah |
156
+ | `economic_overview` | Ringkasan ekonomi wilayah |
157
+ | `population_stats` | Statistik kependudukan |
158
+
159
+ ## Contoh Query
160
+
161
+ ```
162
+ "Berapa jumlah penduduk Indonesia tahun 2023?"
163
+ "Bandingkan angka kemiskinan Jawa Timur vs Jawa Barat 2020-2023"
164
+ "Cari BRS terbaru tentang inflasi"
165
+ "Data ekspor kopi Indonesia tahun 2024"
166
+ ```
167
+
168
+ ## Environment Variables
169
+
170
+ | Variable | Default | Deskripsi |
171
+ |----------|---------|-----------|
172
+ | `BPS_API_KEY` | (required) | API key dari webapi.bps.go.id |
173
+ | `BPS_API_BASE_URL` | `https://webapi.bps.go.id/v1` | Base URL API |
174
+ | `BPS_DEFAULT_LANG` | `ind` | Bahasa default: `ind` / `eng` |
175
+ | `BPS_DEFAULT_DOMAIN` | `0000` | Domain default (0000 = Nasional) |
176
+ | `BPS_CACHE_ENABLED` | `true` | Aktifkan cache |
177
+ | `BPS_CACHE_MAX_ENTRIES` | `500` | Maks entri cache |
178
+ | `BPS_LOG_LEVEL` | `info` | Level log: debug/info/warn/error |
179
+
180
+ ## Development
181
+
182
+ ```bash
183
+ git clone https://github.com/murphi/bps-mcp-server
184
+ cd bps-mcp-server
185
+ npm install
186
+ npm run build
187
+ npm run test:unit
188
+ ```
189
+
190
+ ## Atribusi
191
+
192
+ Sumber: Badan Pusat Statistik (BPS) — https://www.bps.go.id
193
+ Layanan ini menggunakan API Badan Pusat Statistik (BPS).
194
+
195
+ ## Lisensi
196
+
197
+ MIT
@@ -0,0 +1,12 @@
1
+ import type { AuthResult, IAuthProvider } from "./types.js";
2
+ export declare class ApiKeyProvider implements IAuthProvider {
3
+ private readonly apiKey;
4
+ constructor(apiKey: string);
5
+ authenticate(): Promise<AuthResult>;
6
+ getHeaders(): Promise<Record<string, string>>;
7
+ getQueryParams(): Promise<Record<string, string>>;
8
+ isExpired(): boolean;
9
+ refresh(): Promise<void>;
10
+ getType(): "api-key";
11
+ }
12
+ //# sourceMappingURL=api-key.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key.provider.d.ts","sourceRoot":"","sources":["../../src/auth/api-key.provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5D,qBAAa,cAAe,YAAW,aAAa;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM;IAOpB,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC;IAInC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI7C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIvD,SAAS,IAAI,OAAO;IAId,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,OAAO,IAAI,SAAS;CAGrB"}
@@ -0,0 +1,28 @@
1
+ export class ApiKeyProvider {
2
+ apiKey;
3
+ constructor(apiKey) {
4
+ if (!apiKey) {
5
+ throw new Error("BPS_API_KEY is required for api-key auth type");
6
+ }
7
+ this.apiKey = apiKey;
8
+ }
9
+ async authenticate() {
10
+ return { authenticated: true, type: "api-key" };
11
+ }
12
+ async getHeaders() {
13
+ return {};
14
+ }
15
+ async getQueryParams() {
16
+ return { key: this.apiKey };
17
+ }
18
+ isExpired() {
19
+ return false;
20
+ }
21
+ async refresh() {
22
+ // API keys don't expire
23
+ }
24
+ getType() {
25
+ return "api-key";
26
+ }
27
+ }
28
+ //# sourceMappingURL=api-key.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key.provider.js","sourceRoot":"","sources":["../../src/auth/api-key.provider.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IACR,MAAM,CAAS;IAEhC,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,SAAS;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO;QACX,wBAAwB;IAC1B,CAAC;IAED,OAAO;QACL,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { Config } from "../config/index.js";
2
+ import type { IAuthProvider } from "./types.js";
3
+ export declare function createAuthProvider(config: Config): IAuthProvider;
4
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/auth/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAchE"}
@@ -0,0 +1,13 @@
1
+ import { ApiKeyProvider } from "./api-key.provider.js";
2
+ import { OAuth2Provider } from "./oauth2.provider.js";
3
+ export function createAuthProvider(config) {
4
+ switch (config.authType) {
5
+ case "api-key":
6
+ return new ApiKeyProvider(config.apiKey);
7
+ case "oauth2":
8
+ return new OAuth2Provider(config.oauthClientId, config.oauthClientSecret, config.oauthTokenEndpoint, config.oauthScopes);
9
+ default:
10
+ throw new Error(`Unknown auth type: ${config.authType}`);
11
+ }
12
+ }
13
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/auth/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,SAAS;YACZ,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,MAAO,CAAC,CAAC;QAC5C,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CACvB,MAAM,CAAC,aAAc,EACrB,MAAM,CAAC,iBAAkB,EACzB,MAAM,CAAC,kBAAmB,EAC1B,MAAM,CAAC,WAAW,CACnB,CAAC;QACJ;YACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { AuthResult, IAuthProvider } from "./types.js";
2
+ /**
3
+ * OAuth2 provider for future WSO2 BPS API v2.
4
+ * Placeholder implementation — will be completed when BPS releases v2.
5
+ */
6
+ export declare class OAuth2Provider implements IAuthProvider {
7
+ private readonly clientId;
8
+ private readonly clientSecret;
9
+ private readonly tokenEndpoint;
10
+ private readonly scopes?;
11
+ private accessToken;
12
+ private expiresAt;
13
+ constructor(clientId: string, clientSecret: string, tokenEndpoint: string, scopes?: string | undefined);
14
+ authenticate(): Promise<AuthResult>;
15
+ getHeaders(): Promise<Record<string, string>>;
16
+ getQueryParams(): Promise<Record<string, string>>;
17
+ isExpired(): boolean;
18
+ refresh(): Promise<void>;
19
+ getType(): "oauth2";
20
+ private fetchToken;
21
+ }
22
+ //# sourceMappingURL=oauth2.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth2.provider.d.ts","sourceRoot":"","sources":["../../src/auth/oauth2.provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5D;;;GAGG;AACH,qBAAa,cAAe,YAAW,aAAa;IAKhD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAP1B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,SAAS,CAAa;gBAGX,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,YAAA;IAG5B,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC;IAKnC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAS7C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIvD,SAAS,IAAI,OAAO;IAId,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,OAAO,IAAI,QAAQ;YAIL,UAAU;CAwBzB"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * OAuth2 provider for future WSO2 BPS API v2.
3
+ * Placeholder implementation — will be completed when BPS releases v2.
4
+ */
5
+ export class OAuth2Provider {
6
+ clientId;
7
+ clientSecret;
8
+ tokenEndpoint;
9
+ scopes;
10
+ accessToken = null;
11
+ expiresAt = 0;
12
+ constructor(clientId, clientSecret, tokenEndpoint, scopes) {
13
+ this.clientId = clientId;
14
+ this.clientSecret = clientSecret;
15
+ this.tokenEndpoint = tokenEndpoint;
16
+ this.scopes = scopes;
17
+ }
18
+ async authenticate() {
19
+ await this.fetchToken();
20
+ return { authenticated: true, type: "oauth2" };
21
+ }
22
+ async getHeaders() {
23
+ if (this.isExpired()) {
24
+ await this.refresh();
25
+ }
26
+ return {
27
+ Authorization: `Bearer ${this.accessToken}`,
28
+ };
29
+ }
30
+ async getQueryParams() {
31
+ return {};
32
+ }
33
+ isExpired() {
34
+ return Date.now() >= this.expiresAt - 60_000;
35
+ }
36
+ async refresh() {
37
+ await this.fetchToken();
38
+ }
39
+ getType() {
40
+ return "oauth2";
41
+ }
42
+ async fetchToken() {
43
+ const body = new URLSearchParams({
44
+ grant_type: "client_credentials",
45
+ client_id: this.clientId,
46
+ client_secret: this.clientSecret,
47
+ });
48
+ if (this.scopes) {
49
+ body.set("scope", this.scopes);
50
+ }
51
+ const res = await fetch(this.tokenEndpoint, {
52
+ method: "POST",
53
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
54
+ body,
55
+ });
56
+ if (!res.ok) {
57
+ throw new Error(`OAuth2 token request failed: ${res.status} ${res.statusText}`);
58
+ }
59
+ const data = (await res.json());
60
+ this.accessToken = data.access_token;
61
+ this.expiresAt = Date.now() + data.expires_in * 1000;
62
+ }
63
+ }
64
+ //# sourceMappingURL=oauth2.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth2.provider.js","sourceRoot":"","sources":["../../src/auth/oauth2.provider.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,cAAc;IAKN;IACA;IACA;IACA;IAPX,WAAW,GAAkB,IAAI,CAAC;IAClC,SAAS,GAAW,CAAC,CAAC;IAE9B,YACmB,QAAgB,EAChB,YAAoB,EACpB,aAAqB,EACrB,MAAe;QAHf,aAAQ,GAAR,QAAQ,CAAQ;QAChB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,kBAAa,GAAb,aAAa,CAAQ;QACrB,WAAM,GAAN,MAAM,CAAS;IAC/B,CAAC;IAEJ,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QACD,OAAO;YACL,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;SAC5C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO;QACL,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;YAC/B,UAAU,EAAE,oBAAoB;YAChC,SAAS,EAAE,IAAI,CAAC,QAAQ;YACxB,aAAa,EAAE,IAAI,CAAC,YAAY;SACjC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI;SACL,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiD,CAAC;QAChF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACvD,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ export interface AuthResult {
2
+ authenticated: boolean;
3
+ type: "api-key" | "oauth2";
4
+ }
5
+ export interface IAuthProvider {
6
+ authenticate(): Promise<AuthResult>;
7
+ getHeaders(): Promise<Record<string, string>>;
8
+ getQueryParams(): Promise<Record<string, string>>;
9
+ isExpired(): boolean;
10
+ refresh(): Promise<void>;
11
+ getType(): "api-key" | "oauth2";
12
+ }
13
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IACpC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,SAAS,IAAI,OAAO,CAAC;IACrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,IAAI,SAAS,GAAG,QAAQ,CAAC;CACjC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ import type { IAuthProvider } from "../auth/types.js";
2
+ import type { ICacheProvider } from "../services/cache.js";
3
+ import type { Config } from "../config/index.js";
4
+ import type { BpsDomain, BpsSubject, BpsSubjectCategory, BpsVariable, BpsVerticalVariable, BpsDerivedVariable, BpsPeriod, BpsDerivedPeriod, BpsUnit, BpsDynamicDataResponse, BpsStaticTable, BpsStaticTableDetail, BpsPressRelease, BpsPublication, BpsStrategicIndicator, BpsInfographic, BpsInfographicDetail, BpsNews, BpsNewsDetail, BpsGlossaryTerm, BpsCsaSubjectCategory, BpsCsaSubject, BpsCsaTable, BpsCsaTableDetail, BpsCensusEvent, BpsCensusTopic, PageInfo } from "./types.js";
5
+ export declare class BpsClient {
6
+ private readonly auth;
7
+ private readonly cache;
8
+ private readonly baseUrl;
9
+ private readonly defaultLang;
10
+ private readonly defaultDomain;
11
+ constructor(auth: IAuthProvider, cache: ICacheProvider | null, config: Config);
12
+ private fetchJson;
13
+ private authParams;
14
+ /**
15
+ * Perform a list request: /api/list/model/{model}/...
16
+ */
17
+ private listRequest;
18
+ /**
19
+ * Perform a view request: /api/view/model/{model}/...
20
+ */
21
+ private viewRequest;
22
+ private extractPaginated;
23
+ listDomains(type?: "all" | "prov" | "kab" | "kabbyprov", provId?: string): Promise<{
24
+ data: BpsDomain[];
25
+ page?: PageInfo;
26
+ }>;
27
+ listSubjects(domain?: string, subcat?: number): Promise<{
28
+ data: BpsSubject[];
29
+ page?: PageInfo;
30
+ }>;
31
+ listSubjectCategories(domain?: string): Promise<BpsSubjectCategory[]>;
32
+ listVariables(domain?: string, subject?: number, year?: number, page?: number, perPage?: number): Promise<{
33
+ data: BpsVariable[];
34
+ page?: PageInfo;
35
+ }>;
36
+ listVerticalVariables(domain?: string, varId?: number): Promise<BpsVerticalVariable[]>;
37
+ listDerivedVariables(domain?: string, varId?: number): Promise<BpsDerivedVariable[]>;
38
+ listPeriods(domain?: string, varId?: number): Promise<BpsPeriod[]>;
39
+ listDerivedPeriods(domain?: string, varId?: number): Promise<BpsDerivedPeriod[]>;
40
+ listUnits(domain?: string): Promise<BpsUnit[]>;
41
+ getDynamicData(domain: string, varId: string, th?: string, turvar?: string, vervar?: string, turth?: string): Promise<BpsDynamicDataResponse>;
42
+ listStaticTables(domain?: string, keyword?: string, year?: number, month?: number, page?: number): Promise<{
43
+ data: BpsStaticTable[];
44
+ page?: PageInfo;
45
+ }>;
46
+ getStaticTable(domain: string, id: number): Promise<BpsStaticTableDetail>;
47
+ listPressReleases(domain?: string, keyword?: string, year?: number, month?: number, page?: number): Promise<{
48
+ data: BpsPressRelease[];
49
+ page?: PageInfo;
50
+ }>;
51
+ getPressRelease(domain: string, id: number): Promise<BpsPressRelease>;
52
+ listPublications(domain?: string, keyword?: string, year?: number, month?: number, page?: number): Promise<{
53
+ data: BpsPublication[];
54
+ page?: PageInfo;
55
+ }>;
56
+ getPublication(domain: string, id: string): Promise<BpsPublication>;
57
+ listStrategicIndicators(domain?: string, varId?: number, page?: number): Promise<{
58
+ data: BpsStrategicIndicator[];
59
+ page?: PageInfo;
60
+ }>;
61
+ getTradeData(source: 1 | 2, hsCode: string, hsType: string, year: string, period: string): Promise<unknown>;
62
+ listInfographics(domain?: string, keyword?: string, page?: number): Promise<{
63
+ data: BpsInfographic[];
64
+ page?: PageInfo;
65
+ }>;
66
+ getInfographic(domain: string, id: number): Promise<BpsInfographicDetail>;
67
+ listNews(domain?: string, keyword?: string, page?: number): Promise<{
68
+ data: BpsNews[];
69
+ page?: PageInfo;
70
+ }>;
71
+ getNews(domain: string, id: number): Promise<BpsNewsDetail>;
72
+ listGlossary(domain?: string, keyword?: string, page?: number): Promise<{
73
+ data: BpsGlossaryTerm[];
74
+ page?: PageInfo;
75
+ }>;
76
+ listCsaSubjectCategories(domain?: string): Promise<BpsCsaSubjectCategory[]>;
77
+ listCsaSubjects(domain?: string, subcat?: number): Promise<{
78
+ data: BpsCsaSubject[];
79
+ page?: PageInfo;
80
+ }>;
81
+ listCsaTables(domain?: string, subject?: number, page?: number): Promise<{
82
+ data: BpsCsaTable[];
83
+ page?: PageInfo;
84
+ }>;
85
+ getCsaTable(domain: string, id: string): Promise<BpsCsaTableDetail>;
86
+ listCensusEvents(): Promise<BpsCensusEvent[]>;
87
+ listCensusTopics(kegiatan: string): Promise<BpsCensusTopic[]>;
88
+ search(domain: string, keyword: string, model?: string, page?: number): Promise<{
89
+ data: unknown[];
90
+ page?: PageInfo;
91
+ }>;
92
+ }
93
+ //# sourceMappingURL=bps-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bps-client.d.ts","sourceRoot":"","sources":["../../src/client/bps-client.ts"],"names":[],"mappings":"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"}