@omnizoek/sdk 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.
package/dist/index.js ADDED
@@ -0,0 +1,446 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __esm = (fn, res) => function __init() {
4
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
5
+ };
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+
11
+ // src/errors.ts
12
+ var errors_exports = {};
13
+ __export(errors_exports, {
14
+ OmniAuthError: () => OmniAuthError,
15
+ OmniError: () => OmniError,
16
+ OmniNetworkError: () => OmniNetworkError,
17
+ OmniNotFoundError: () => OmniNotFoundError,
18
+ OmniRateLimitError: () => OmniRateLimitError,
19
+ OmniUpstreamError: () => OmniUpstreamError,
20
+ OmniValidationError: () => OmniValidationError
21
+ });
22
+ var OmniError, OmniAuthError, OmniNotFoundError, OmniValidationError, OmniRateLimitError, OmniUpstreamError, OmniNetworkError;
23
+ var init_errors = __esm({
24
+ "src/errors.ts"() {
25
+ OmniError = class extends Error {
26
+ constructor(message, status, code, detail) {
27
+ super(message);
28
+ this.status = status;
29
+ this.code = code;
30
+ this.detail = detail;
31
+ this.name = "OmniError";
32
+ }
33
+ };
34
+ OmniAuthError = class extends OmniError {
35
+ constructor(detail) {
36
+ super(`Authentication failed: ${detail}`, 401, "auth_error", detail);
37
+ this.name = "OmniAuthError";
38
+ }
39
+ };
40
+ OmniNotFoundError = class extends OmniError {
41
+ constructor(detail) {
42
+ super(`Not found: ${detail}`, 404, "not_found", detail);
43
+ this.name = "OmniNotFoundError";
44
+ }
45
+ };
46
+ OmniValidationError = class extends OmniError {
47
+ constructor(detail) {
48
+ super(`Validation error: ${detail}`, 422, "validation_error", detail);
49
+ this.name = "OmniValidationError";
50
+ }
51
+ };
52
+ OmniRateLimitError = class extends OmniError {
53
+ constructor(retryAfterMs) {
54
+ super(
55
+ `Rate limit exceeded. Retry after ${retryAfterMs}ms.`,
56
+ 429,
57
+ "rate_limit",
58
+ `Retry after ${retryAfterMs}ms`
59
+ );
60
+ this.retryAfterMs = retryAfterMs;
61
+ this.name = "OmniRateLimitError";
62
+ }
63
+ };
64
+ OmniUpstreamError = class extends OmniError {
65
+ constructor(detail) {
66
+ super(`Upstream error: ${detail}`, 503, "upstream_error", detail);
67
+ this.name = "OmniUpstreamError";
68
+ }
69
+ };
70
+ OmniNetworkError = class extends Error {
71
+ constructor(cause) {
72
+ super(`Network error: ${cause instanceof Error ? cause.message : String(cause)}`);
73
+ this.name = "OmniNetworkError";
74
+ if (cause instanceof Error) this.cause = cause;
75
+ }
76
+ };
77
+ }
78
+ });
79
+
80
+ // src/client.ts
81
+ init_errors();
82
+ var DEFAULT_BASE_URL = "https://api.omnizoek.nl";
83
+ var DEFAULT_MAX_RETRIES = 3;
84
+ var DEFAULT_RETRY_DELAY_MS = 500;
85
+ var DEFAULT_TIMEOUT_MS = 2e4;
86
+ function sleep(ms) {
87
+ return new Promise((resolve) => setTimeout(resolve, ms));
88
+ }
89
+ var HttpClient = class {
90
+ constructor(options) {
91
+ this.apiKey = options.apiKey;
92
+ this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, "");
93
+ this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;
94
+ this.retryDelayMs = options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;
95
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
96
+ }
97
+ async get(path, params) {
98
+ const url = new URL(this.baseUrl + path);
99
+ if (params) {
100
+ for (const [key, value] of Object.entries(params)) {
101
+ if (value !== void 0) {
102
+ url.searchParams.set(key, String(value));
103
+ }
104
+ }
105
+ }
106
+ let attempt = 0;
107
+ while (true) {
108
+ let response;
109
+ try {
110
+ const controller = new AbortController();
111
+ const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
112
+ response = await fetch(url.toString(), {
113
+ method: "GET",
114
+ headers: {
115
+ "X-API-Key": this.apiKey,
116
+ "Accept": "application/json",
117
+ "User-Agent": "@omnizoek/sdk/0.1.0"
118
+ },
119
+ signal: controller.signal
120
+ });
121
+ clearTimeout(timeoutId);
122
+ } catch (err) {
123
+ throw new OmniNetworkError(err);
124
+ }
125
+ if (response.status === 429 && attempt < this.maxRetries) {
126
+ const retryAfter = Number(response.headers.get("Retry-After") ?? 0);
127
+ const delay = retryAfter > 0 ? retryAfter * 1e3 : this.retryDelayMs * Math.pow(2, attempt);
128
+ attempt++;
129
+ await sleep(delay);
130
+ continue;
131
+ }
132
+ if (!response.ok) {
133
+ await this._throwFromResponse(response);
134
+ }
135
+ return response.json();
136
+ }
137
+ }
138
+ async post(path, body) {
139
+ let response;
140
+ try {
141
+ const controller = new AbortController();
142
+ const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
143
+ response = await fetch(this.baseUrl + path, {
144
+ method: "POST",
145
+ headers: {
146
+ "X-API-Key": this.apiKey,
147
+ "Accept": "application/json",
148
+ "Content-Type": "application/json",
149
+ "User-Agent": "@omnizoek/sdk/0.1.0"
150
+ },
151
+ body: body !== void 0 ? JSON.stringify(body) : void 0,
152
+ signal: controller.signal
153
+ });
154
+ clearTimeout(timeoutId);
155
+ } catch (err) {
156
+ throw new OmniNetworkError(err);
157
+ }
158
+ if (!response.ok) {
159
+ await this._throwFromResponse(response);
160
+ }
161
+ return response.json();
162
+ }
163
+ async delete(path) {
164
+ let response;
165
+ try {
166
+ const controller = new AbortController();
167
+ const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
168
+ response = await fetch(this.baseUrl + path, {
169
+ method: "DELETE",
170
+ headers: {
171
+ "X-API-Key": this.apiKey,
172
+ "User-Agent": "@omnizoek/sdk/0.1.0"
173
+ },
174
+ signal: controller.signal
175
+ });
176
+ clearTimeout(timeoutId);
177
+ } catch (err) {
178
+ throw new OmniNetworkError(err);
179
+ }
180
+ if (!response.ok) {
181
+ await this._throwFromResponse(response);
182
+ }
183
+ }
184
+ async _throwFromResponse(response) {
185
+ let detail = response.statusText;
186
+ try {
187
+ const body = await response.json();
188
+ detail = body.detail ?? body.error ?? detail;
189
+ } catch {
190
+ }
191
+ switch (response.status) {
192
+ case 401:
193
+ throw new OmniAuthError(detail);
194
+ case 404:
195
+ throw new OmniNotFoundError(detail);
196
+ case 422:
197
+ throw new OmniValidationError(detail);
198
+ case 429:
199
+ throw new OmniRateLimitError(0);
200
+ case 503:
201
+ throw new OmniUpstreamError(detail);
202
+ default: {
203
+ const { OmniError: OmniError2 } = await Promise.resolve().then(() => (init_errors(), errors_exports));
204
+ throw new OmniError2(
205
+ `API error ${response.status}: ${detail}`,
206
+ response.status,
207
+ "api_error",
208
+ detail
209
+ );
210
+ }
211
+ }
212
+ }
213
+ };
214
+
215
+ // src/geo.ts
216
+ var GeoModule = class {
217
+ constructor(http) {
218
+ this.http = http;
219
+ }
220
+ /**
221
+ * Enrich a Dutch address with BAG data, coordinates, neighbourhood
222
+ * statistics, energy labels and more.
223
+ *
224
+ * @example
225
+ * const result = await omni.geo.enrichAddress({ postcode: "1012LG", houseNumber: 1 });
226
+ */
227
+ async enrichAddress(params) {
228
+ return this.http.get("/v1/geo/enrich-address", {
229
+ postcode: params.postcode,
230
+ house_number: params.houseNumber
231
+ });
232
+ }
233
+ };
234
+
235
+ // src/finance.ts
236
+ var FinanceModule = class {
237
+ constructor(http) {
238
+ this.http = http;
239
+ }
240
+ /**
241
+ * Resolve an IBAN to its BIC/SWIFT code and bank name.
242
+ *
243
+ * @example
244
+ * const result = await omni.finance.ibanToBic({ iban: "NL91ABNA0417164300" });
245
+ */
246
+ async ibanToBic(params) {
247
+ return this.http.get("/v1/finance/iban-to-bic", {
248
+ iban: params.iban
249
+ });
250
+ }
251
+ /**
252
+ * Verify a Dutch BTW (VAT) number via the EU VIES service and return
253
+ * company metadata.
254
+ *
255
+ * @example
256
+ * const result = await omni.finance.vatVerify({ vatNumber: "NL123456782B01" });
257
+ */
258
+ async vatVerify(params) {
259
+ return this.http.get("/v1/finance/vat-verify", {
260
+ vat_number: params.vatNumber
261
+ });
262
+ }
263
+ };
264
+
265
+ // src/compliance.ts
266
+ var ComplianceModule = class {
267
+ constructor(http) {
268
+ this.http = http;
269
+ }
270
+ /**
271
+ * Validate a Dutch BSN or IBAN number using checksum algorithms.
272
+ *
273
+ * @example
274
+ * const result = await omni.compliance.validateFinance({ type: "iban", number: "NL91ABNA0417164300" });
275
+ */
276
+ async validateFinance(params) {
277
+ return this.http.get("/v1/compliance/validate-finance", {
278
+ type: params.type,
279
+ number: params.number
280
+ });
281
+ }
282
+ };
283
+
284
+ // src/hr.ts
285
+ var HrModule = class {
286
+ constructor(http) {
287
+ this.http = http;
288
+ }
289
+ /**
290
+ * Look up the current Dutch statutory minimum wage for a given age.
291
+ *
292
+ * @example
293
+ * const result = await omni.hr.minimumWage({ age: 21 });
294
+ */
295
+ async minimumWage(params) {
296
+ return this.http.get("/v1/hr/minimum-wage", {
297
+ age: params.age
298
+ });
299
+ }
300
+ /**
301
+ * Check whether a given date is a public holiday (and get the applicable
302
+ * surcharge multiplier for a given industry).
303
+ *
304
+ * @example
305
+ * const result = await omni.hr.holidaySurcharge({ date: "2024-12-25", industry: "retail" });
306
+ */
307
+ async holidaySurcharge(params) {
308
+ return this.http.get("/v1/hr/holiday-surcharge", {
309
+ date: params.date,
310
+ industry: params.industry
311
+ });
312
+ }
313
+ };
314
+
315
+ // src/realEstate.ts
316
+ var RealEstateModule = class {
317
+ constructor(http) {
318
+ this.http = http;
319
+ }
320
+ /**
321
+ * Retrieve the official EP-Online energy label for a Dutch address.
322
+ *
323
+ * @example
324
+ * const result = await omni.realEstate.energyLabel({ postcode: "1012LG", houseNumber: 1 });
325
+ */
326
+ async energyLabel(params) {
327
+ return this.http.get("/v1/real-estate/energy-label", {
328
+ postcode: params.postcode,
329
+ house_number: params.houseNumber
330
+ });
331
+ }
332
+ };
333
+
334
+ // src/logistics.ts
335
+ var LogisticsModule = class {
336
+ constructor(http) {
337
+ this.http = http;
338
+ }
339
+ /**
340
+ * Check whether a vehicle (by Dutch licence plate / kenteken) is allowed
341
+ * in a zero-emission zone (ZE-zone).
342
+ *
343
+ * @example
344
+ * const result = await omni.logistics.emissionZone({ kenteken: "AB123C" });
345
+ */
346
+ async emissionZone(params) {
347
+ return this.http.get("/v1/logistics/emission-zone", {
348
+ kenteken: params.kenteken
349
+ });
350
+ }
351
+ /**
352
+ * Retrieve current and upcoming NS train disruptions, optionally filtered
353
+ * by station code.
354
+ *
355
+ * @example
356
+ * const result = await omni.logistics.transitDisruptions({ stationCode: "ASD" });
357
+ */
358
+ async transitDisruptions(params) {
359
+ return this.http.get("/v1/logistics/transit-disruptions", {
360
+ station_code: params?.stationCode
361
+ });
362
+ }
363
+ };
364
+
365
+ // src/energy.ts
366
+ var EnergyModule = class {
367
+ constructor(http) {
368
+ this.http = http;
369
+ }
370
+ /**
371
+ * Retrieve the current Dutch electricity grid congestion status for a
372
+ * given postal code / province.
373
+ *
374
+ * @example
375
+ * const result = await omni.energy.gridTrigger();
376
+ * const result = await omni.energy.gridTrigger({ countryCode: "NL" });
377
+ */
378
+ async gridTrigger(params) {
379
+ return this.http.get("/v1/energy/grid-trigger", {
380
+ country_code: params?.countryCode
381
+ });
382
+ }
383
+ };
384
+
385
+ // src/webhooks.ts
386
+ var WebhooksModule = class {
387
+ constructor(http) {
388
+ this.http = http;
389
+ }
390
+ /**
391
+ * Register a new outbound webhook. OmniZoek will POST to `url` whenever
392
+ * any of the specified `events` fire.
393
+ *
394
+ * @example
395
+ * const wh = await omni.webhooks.register({
396
+ * url: "https://example.com/hook",
397
+ * events: ["quota.warning"],
398
+ * });
399
+ */
400
+ async register(params) {
401
+ return this.http.post("/v1/webhooks", {
402
+ url: params.url,
403
+ events: params.events
404
+ });
405
+ }
406
+ /**
407
+ * List all registered webhooks for this API key.
408
+ *
409
+ * @example
410
+ * const { webhooks } = await omni.webhooks.list();
411
+ */
412
+ async list() {
413
+ return this.http.get("/v1/webhooks");
414
+ }
415
+ /**
416
+ * Delete a webhook by its ID.
417
+ *
418
+ * @example
419
+ * await omni.webhooks.delete("wh_abc123");
420
+ */
421
+ async delete(webhookId) {
422
+ return this.http.delete(`/v1/webhooks/${encodeURIComponent(webhookId)}`);
423
+ }
424
+ };
425
+
426
+ // src/OmniClient.ts
427
+ var OmniClient = class {
428
+ constructor(options) {
429
+ const http = new HttpClient(options);
430
+ this.geo = new GeoModule(http);
431
+ this.finance = new FinanceModule(http);
432
+ this.compliance = new ComplianceModule(http);
433
+ this.hr = new HrModule(http);
434
+ this.realEstate = new RealEstateModule(http);
435
+ this.logistics = new LogisticsModule(http);
436
+ this.energy = new EnergyModule(http);
437
+ this.webhooks = new WebhooksModule(http);
438
+ }
439
+ };
440
+
441
+ // src/index.ts
442
+ init_errors();
443
+
444
+ export { OmniAuthError, OmniClient, OmniError, OmniNetworkError, OmniNotFoundError, OmniRateLimitError, OmniUpstreamError, OmniValidationError };
445
+ //# sourceMappingURL=index.js.map
446
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/geo.ts","../src/finance.ts","../src/compliance.ts","../src/hr.ts","../src/realEstate.ts","../src/logistics.ts","../src/energy.ts","../src/webhooks.ts","../src/OmniClient.ts","../src/index.ts"],"names":["OmniError"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * errors.ts — Typed error classes for the OmniZoek SDK.\n */\n\nexport class OmniError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code: string,\n public readonly detail: string,\n ) {\n super(message);\n this.name = \"OmniError\";\n }\n}\n\n/** 401 — API key missing or invalid. */\nexport class OmniAuthError extends OmniError {\n constructor(detail: string) {\n super(`Authentication failed: ${detail}`, 401, \"auth_error\", detail);\n this.name = \"OmniAuthError\";\n }\n}\n\n/** 404 — Requested resource not found (address, label, etc.). */\nexport class OmniNotFoundError extends OmniError {\n constructor(detail: string) {\n super(`Not found: ${detail}`, 404, \"not_found\", detail);\n this.name = \"OmniNotFoundError\";\n }\n}\n\n/** 422 — Request parameters failed validation. */\nexport class OmniValidationError extends OmniError {\n constructor(detail: string) {\n super(`Validation error: ${detail}`, 422, \"validation_error\", detail);\n this.name = \"OmniValidationError\";\n }\n}\n\n/** 429 — Rate limit exceeded. Retried automatically by the client. */\nexport class OmniRateLimitError extends OmniError {\n constructor(public readonly retryAfterMs: number) {\n super(\n `Rate limit exceeded. Retry after ${retryAfterMs}ms.`,\n 429,\n \"rate_limit\",\n `Retry after ${retryAfterMs}ms`,\n );\n this.name = \"OmniRateLimitError\";\n }\n}\n\n/** 503 — Upstream data source unavailable (BAG, EP-Online, RDW, etc.). */\nexport class OmniUpstreamError extends OmniError {\n constructor(detail: string) {\n super(`Upstream error: ${detail}`, 503, \"upstream_error\", detail);\n this.name = \"OmniUpstreamError\";\n }\n}\n\n/** Network-level failure (DNS, timeout, no internet). */\nexport class OmniNetworkError extends Error {\n readonly cause?: Error;\n\n constructor(cause: unknown) {\n super(`Network error: ${cause instanceof Error ? cause.message : String(cause)}`);\n this.name = \"OmniNetworkError\";\n if (cause instanceof Error) this.cause = cause;\n }\n}\n","/**\n * client.ts — Core HTTP client with automatic retry and error mapping.\n */\n\nimport {\n OmniAuthError,\n OmniNetworkError,\n OmniNotFoundError,\n OmniRateLimitError,\n OmniUpstreamError,\n OmniValidationError,\n} from \"./errors.js\";\n\nexport interface OmniClientOptions {\n /** Your OmniZoek API key (omni_live_… or omni_test_…) */\n apiKey: string;\n /** Override the base URL — useful for testing. Default: https://api.omnizoek.nl */\n baseUrl?: string;\n /** Max retries on 429 rate-limit responses. Default: 3 */\n maxRetries?: number;\n /** Base delay in ms for exponential backoff. Default: 500 */\n retryDelayMs?: number;\n /** Request timeout in ms. Default: 20000 */\n timeoutMs?: number;\n}\n\nconst DEFAULT_BASE_URL = \"https://api.omnizoek.nl\";\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_RETRY_DELAY_MS = 500;\nconst DEFAULT_TIMEOUT_MS = 20_000;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly maxRetries: number;\n private readonly retryDelayMs: number;\n private readonly timeoutMs: number;\n\n constructor(options: OmniClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.retryDelayMs = options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n }\n\n async get<T>(path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T> {\n const url = new URL(this.baseUrl + path);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n let attempt = 0;\n\n while (true) {\n let response: Response;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"X-API-Key\": this.apiKey,\n \"Accept\": \"application/json\",\n \"User-Agent\": \"@omnizoek/sdk/0.1.0\",\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n } catch (err) {\n throw new OmniNetworkError(err);\n }\n\n // 429 — retry with exponential backoff\n if (response.status === 429 && attempt < this.maxRetries) {\n const retryAfter = Number(response.headers.get(\"Retry-After\") ?? 0);\n const delay = retryAfter > 0\n ? retryAfter * 1000\n : this.retryDelayMs * Math.pow(2, attempt);\n\n attempt++;\n await sleep(delay);\n continue;\n }\n\n if (!response.ok) {\n await this._throwFromResponse(response);\n }\n\n return response.json() as Promise<T>;\n }\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n let response: Response;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n response = await fetch(this.baseUrl + path, {\n method: \"POST\",\n headers: {\n \"X-API-Key\": this.apiKey,\n \"Accept\": \"application/json\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"@omnizoek/sdk/0.1.0\",\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n } catch (err) {\n throw new OmniNetworkError(err);\n }\n\n if (!response.ok) {\n await this._throwFromResponse(response);\n }\n\n return response.json() as Promise<T>;\n }\n\n async delete(path: string): Promise<void> {\n let response: Response;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n response = await fetch(this.baseUrl + path, {\n method: \"DELETE\",\n headers: {\n \"X-API-Key\": this.apiKey,\n \"User-Agent\": \"@omnizoek/sdk/0.1.0\",\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n } catch (err) {\n throw new OmniNetworkError(err);\n }\n\n if (!response.ok) {\n await this._throwFromResponse(response);\n }\n }\n\n private async _throwFromResponse(response: Response): Promise<never> {\n let detail = response.statusText;\n try {\n const body = await response.json() as { detail?: string; error?: string };\n detail = body.detail ?? body.error ?? detail;\n } catch {\n // non-JSON body\n }\n\n switch (response.status) {\n case 401: throw new OmniAuthError(detail);\n case 404: throw new OmniNotFoundError(detail);\n case 422: throw new OmniValidationError(detail);\n case 429: throw new OmniRateLimitError(0);\n case 503: throw new OmniUpstreamError(detail);\n default: {\n const { OmniError } = await import(\"./errors.js\");\n throw new OmniError(\n `API error ${response.status}: ${detail}`,\n response.status,\n \"api_error\",\n detail,\n );\n }\n }\n }\n}\n","import type { HttpClient } from \"./client.js\";\nimport type { AddressEnrichParams, AddressEnrichResponse } from \"./types.js\";\n\nexport class GeoModule {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Enrich a Dutch address with BAG data, coordinates, neighbourhood\n * statistics, energy labels and more.\n *\n * @example\n * const result = await omni.geo.enrichAddress({ postcode: \"1012LG\", houseNumber: 1 });\n */\n async enrichAddress(params: AddressEnrichParams): Promise<AddressEnrichResponse> {\n return this.http.get<AddressEnrichResponse>(\"/v1/geo/enrich-address\", {\n postcode: params.postcode,\n house_number: params.houseNumber,\n });\n }\n}\n","import type { HttpClient } from \"./client.js\";\nimport type {\n IbanToBicParams,\n IbanToBicResponse,\n VatVerifyParams,\n VatVerifyResponse,\n} from \"./types.js\";\n\nexport class FinanceModule {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Resolve an IBAN to its BIC/SWIFT code and bank name.\n *\n * @example\n * const result = await omni.finance.ibanToBic({ iban: \"NL91ABNA0417164300\" });\n */\n async ibanToBic(params: IbanToBicParams): Promise<IbanToBicResponse> {\n return this.http.get<IbanToBicResponse>(\"/v1/finance/iban-to-bic\", {\n iban: params.iban,\n });\n }\n\n /**\n * Verify a Dutch BTW (VAT) number via the EU VIES service and return\n * company metadata.\n *\n * @example\n * const result = await omni.finance.vatVerify({ vatNumber: \"NL123456782B01\" });\n */\n async vatVerify(params: VatVerifyParams): Promise<VatVerifyResponse> {\n return this.http.get<VatVerifyResponse>(\"/v1/finance/vat-verify\", {\n vat_number: params.vatNumber,\n });\n }\n}\n","import type { HttpClient } from \"./client.js\";\nimport type { ValidateFinanceParams, FinanceValidationResponse } from \"./types.js\";\n\nexport class ComplianceModule {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Validate a Dutch BSN or IBAN number using checksum algorithms.\n *\n * @example\n * const result = await omni.compliance.validateFinance({ type: \"iban\", number: \"NL91ABNA0417164300\" });\n */\n async validateFinance(params: ValidateFinanceParams): Promise<FinanceValidationResponse> {\n return this.http.get<FinanceValidationResponse>(\"/v1/compliance/validate-finance\", {\n type: params.type,\n number: params.number,\n });\n }\n}\n","import type { HttpClient } from \"./client.js\";\nimport type {\n MinimumWageParams,\n MinimumWageResponse,\n HolidaySurchargeParams,\n HolidaySurchargeResponse,\n} from \"./types.js\";\n\nexport class HrModule {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up the current Dutch statutory minimum wage for a given age.\n *\n * @example\n * const result = await omni.hr.minimumWage({ age: 21 });\n */\n async minimumWage(params: MinimumWageParams): Promise<MinimumWageResponse> {\n return this.http.get<MinimumWageResponse>(\"/v1/hr/minimum-wage\", {\n age: params.age,\n });\n }\n\n /**\n * Check whether a given date is a public holiday (and get the applicable\n * surcharge multiplier for a given industry).\n *\n * @example\n * const result = await omni.hr.holidaySurcharge({ date: \"2024-12-25\", industry: \"retail\" });\n */\n async holidaySurcharge(params: HolidaySurchargeParams): Promise<HolidaySurchargeResponse> {\n return this.http.get<HolidaySurchargeResponse>(\"/v1/hr/holiday-surcharge\", {\n date: params.date,\n industry: params.industry,\n });\n }\n}\n","import type { HttpClient } from \"./client.js\";\nimport type { EnergyLabelParams, EnergyLabelResponse } from \"./types.js\";\n\nexport class RealEstateModule {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Retrieve the official EP-Online energy label for a Dutch address.\n *\n * @example\n * const result = await omni.realEstate.energyLabel({ postcode: \"1012LG\", houseNumber: 1 });\n */\n async energyLabel(params: EnergyLabelParams): Promise<EnergyLabelResponse> {\n return this.http.get<EnergyLabelResponse>(\"/v1/real-estate/energy-label\", {\n postcode: params.postcode,\n house_number: params.houseNumber,\n });\n }\n}\n","import type { HttpClient } from \"./client.js\";\nimport type {\n EmissionZoneParams,\n EmissionZoneResponse,\n TransitDisruptionsParams,\n TransitDisruptionsResponse,\n} from \"./types.js\";\n\nexport class LogisticsModule {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Check whether a vehicle (by Dutch licence plate / kenteken) is allowed\n * in a zero-emission zone (ZE-zone).\n *\n * @example\n * const result = await omni.logistics.emissionZone({ kenteken: \"AB123C\" });\n */\n async emissionZone(params: EmissionZoneParams): Promise<EmissionZoneResponse> {\n return this.http.get<EmissionZoneResponse>(\"/v1/logistics/emission-zone\", {\n kenteken: params.kenteken,\n });\n }\n\n /**\n * Retrieve current and upcoming NS train disruptions, optionally filtered\n * by station code.\n *\n * @example\n * const result = await omni.logistics.transitDisruptions({ stationCode: \"ASD\" });\n */\n async transitDisruptions(params?: TransitDisruptionsParams): Promise<TransitDisruptionsResponse> {\n return this.http.get<TransitDisruptionsResponse>(\"/v1/logistics/transit-disruptions\", {\n station_code: params?.stationCode,\n });\n }\n}\n","import type { HttpClient } from \"./client.js\";\nimport type { GridTriggerParams, GridTriggerResponse } from \"./types.js\";\n\nexport class EnergyModule {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Retrieve the current Dutch electricity grid congestion status for a\n * given postal code / province.\n *\n * @example\n * const result = await omni.energy.gridTrigger();\n * const result = await omni.energy.gridTrigger({ countryCode: \"NL\" });\n */\n async gridTrigger(params?: GridTriggerParams): Promise<GridTriggerResponse> {\n return this.http.get<GridTriggerResponse>(\"/v1/energy/grid-trigger\", {\n country_code: params?.countryCode,\n });\n }\n}\n","import type { HttpClient } from \"./client.js\";\nimport type {\n RegisterWebhookParams,\n WebhookCreatedResponse,\n WebhookListResponse,\n} from \"./types.js\";\n\nexport class WebhooksModule {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Register a new outbound webhook. OmniZoek will POST to `url` whenever\n * any of the specified `events` fire.\n *\n * @example\n * const wh = await omni.webhooks.register({\n * url: \"https://example.com/hook\",\n * events: [\"quota.warning\"],\n * });\n */\n async register(params: RegisterWebhookParams): Promise<WebhookCreatedResponse> {\n return this.http.post<WebhookCreatedResponse>(\"/v1/webhooks\", {\n url: params.url,\n events: params.events,\n });\n }\n\n /**\n * List all registered webhooks for this API key.\n *\n * @example\n * const { webhooks } = await omni.webhooks.list();\n */\n async list(): Promise<WebhookListResponse> {\n return this.http.get<WebhookListResponse>(\"/v1/webhooks\");\n }\n\n /**\n * Delete a webhook by its ID.\n *\n * @example\n * await omni.webhooks.delete(\"wh_abc123\");\n */\n async delete(webhookId: string): Promise<void> {\n return this.http.delete(`/v1/webhooks/${encodeURIComponent(webhookId)}`);\n }\n}\n","import { HttpClient, type OmniClientOptions } from \"./client.js\";\nimport { GeoModule } from \"./geo.js\";\nimport { FinanceModule } from \"./finance.js\";\nimport { ComplianceModule } from \"./compliance.js\";\nimport { HrModule } from \"./hr.js\";\nimport { RealEstateModule } from \"./realEstate.js\";\nimport { LogisticsModule } from \"./logistics.js\";\nimport { EnergyModule } from \"./energy.js\";\nimport { WebhooksModule } from \"./webhooks.js\";\n\nexport { type OmniClientOptions };\n\n/**\n * The main entry point for the OmniZoek SDK.\n *\n * @example\n * ```ts\n * import { OmniClient } from \"@omnizoek/sdk\";\n *\n * const omni = new OmniClient({ apiKey: \"omni_live_…\" });\n *\n * const address = await omni.geo.enrichAddress({ postcode: \"1012LG\", houseNumber: 1 });\n * const wage = await omni.hr.minimumWage({ age: 21 });\n * ```\n */\nexport class OmniClient {\n /** Geographic address enrichment (BAG, CBS, energy labels) */\n readonly geo: GeoModule;\n /** Financial utilities (IBAN → BIC, VAT verification) */\n readonly finance: FinanceModule;\n /** Compliance checks (financial institution registers) */\n readonly compliance: ComplianceModule;\n /** HR calculations (minimum wage, holiday surcharge) */\n readonly hr: HrModule;\n /** Real-estate data (EP-Online energy labels) */\n readonly realEstate: RealEstateModule;\n /** Logistics (ZE-zones, NS disruptions) */\n readonly logistics: LogisticsModule;\n /** Energy (grid congestion triggers) */\n readonly energy: EnergyModule;\n /** Outbound webhooks (register, list, delete) */\n readonly webhooks: WebhooksModule;\n\n constructor(options: OmniClientOptions) {\n const http = new HttpClient(options);\n this.geo = new GeoModule(http);\n this.finance = new FinanceModule(http);\n this.compliance = new ComplianceModule(http);\n this.hr = new HrModule(http);\n this.realEstate = new RealEstateModule(http);\n this.logistics = new LogisticsModule(http);\n this.energy = new EnergyModule(http);\n this.webhooks = new WebhooksModule(http);\n }\n}\n","// Main entry point\nexport { OmniClient } from \"./OmniClient.js\";\nexport type { OmniClientOptions } from \"./OmniClient.js\";\n\n// Typed error classes\nexport {\n OmniError,\n OmniAuthError,\n OmniNotFoundError,\n OmniValidationError,\n OmniRateLimitError,\n OmniUpstreamError,\n OmniNetworkError,\n} from \"./errors.js\";\n\n// All request/response types\nexport type {\n AddressEnrichParams,\n AddressEnrichResponse,\n IbanToBicParams,\n IbanToBicResponse,\n VatVerifyParams,\n VatVerifyResponse,\n ValidateFinanceParams,\n FinanceValidationResponse,\n MinimumWageParams,\n MinimumWageResponse,\n HolidaySurchargeParams,\n HolidaySurchargeResponse,\n EnergyLabelParams,\n EnergyLabelResponse,\n EmissionZoneParams,\n EmissionZoneResponse,\n TransitDisruptionsParams,\n TransitDisruptionsResponse,\n GridTriggerParams,\n GridTriggerResponse,\n RegisterWebhookParams,\n WebhookCreatedResponse,\n WebhookSummary,\n WebhookListResponse,\n} from \"./types.js\";\n"]}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@omnizoek/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Official TypeScript/JavaScript SDK for the OmniZoek API — Dutch government data APIs (BAG, EP-Online, RDW, VIES, NS, WML, ENTSO-E).",
5
+ "author": "OmniZoek <support@omnizoek.nl>",
6
+ "license": "MIT",
7
+ "homepage": "https://omnizoek.nl/docs",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/JakoRens/searchworks-nl.git",
11
+ "directory": "omni-sdk-js"
12
+ },
13
+ "keywords": [
14
+ "omnizoek",
15
+ "netherlands",
16
+ "bag",
17
+ "postcode",
18
+ "iban",
19
+ "kvk",
20
+ "rdw",
21
+ "ep-online",
22
+ "energielabel",
23
+ "ns",
24
+ "api",
25
+ "sdk",
26
+ "dutch"
27
+ ],
28
+ "type": "module",
29
+ "main": "./dist/index.cjs",
30
+ "module": "./dist/index.js",
31
+ "types": "./dist/index.d.ts",
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/index.d.ts",
35
+ "import": "./dist/index.js",
36
+ "require": "./dist/index.cjs"
37
+ }
38
+ },
39
+ "files": [
40
+ "dist"
41
+ ],
42
+ "scripts": {
43
+ "build": "tsup",
44
+ "dev": "tsup --watch",
45
+ "test": "vitest run",
46
+ "test:watch": "vitest",
47
+ "typecheck": "tsc --noEmit",
48
+ "prepublishOnly": "npm run build"
49
+ },
50
+ "devDependencies": {
51
+ "tsup": "^8.0.0",
52
+ "typescript": "^5.4.0",
53
+ "vitest": "^1.6.0"
54
+ },
55
+ "engines": {
56
+ "node": ">=18"
57
+ }
58
+ }