lt-open-data-sdk 1.0.1 → 1.1.1

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/README.md CHANGED
@@ -1,13 +1,22 @@
1
1
  # lt-open-data-sdk
2
2
 
3
- TypeScript SDK for the **Lithuanian Open Data platform** ([data.gov.lt](https://data.gov.lt)) powered by the Spinta engine.
3
+ A TypeScript SDK for accessing **Lithuania's Open Data Portal** ([data.gov.lt](https://data.gov.lt)).
4
4
 
5
- ## Features
5
+ ## What is this?
6
6
 
7
- - 🔍 **QueryBuilder** - Fluent API for constructing DSQL queries
8
- - 🌐 **SpintaClient** - HTTP client with automatic pagination
9
- - 🛠️ **CLI Type Generator** - Generate TypeScript interfaces from live API
10
- - 🔐 **OAuth Support** - Client credentials authentication _(untested)_
7
+ Lithuania publishes thousands of government datasets through its Open Data Portal, powered by the [Spinta](https://docs.data.gov.lt/projects/atviriduomenys/latest/api/) API engine. This SDK makes it easy to:
8
+
9
+ - **Query data** with a fluent, type-safe API instead of crafting raw URL parameters
10
+ - **Generate TypeScript types** from live datasets for full autocomplete support
11
+ - **Paginate automatically** through large datasets with async iterators
12
+ - **Track changes** for incremental data synchronization
13
+
14
+ ### Quick Links
15
+
16
+ - [📡 API Reference](#api) - Client methods and query builder
17
+ - [⌨️ CLI Reference](#cli) - Type generation commands
18
+
19
+ ---
11
20
 
12
21
  ## Installation
13
22
 
@@ -15,265 +24,289 @@ TypeScript SDK for the **Lithuanian Open Data platform** ([data.gov.lt](https://
15
24
  npm install lt-open-data-sdk
16
25
  ```
17
26
 
18
- Requires Node.js ≥18 (uses native `fetch`).
27
+ Requires Node.js ≥18.
19
28
 
20
- ## Quick Start
29
+ ## Quick Example
21
30
 
22
31
  ```typescript
23
32
  import { SpintaClient, QueryBuilder } from "lt-open-data-sdk";
24
33
 
25
34
  const client = new SpintaClient();
26
35
 
27
- // Fetch data with a query
36
+ // Find municipalities with code greater than 30
28
37
  const query = new QueryBuilder()
29
- .select("_id", "pavadinimas")
30
- .filter((f) => f.field("sav_kodas").gt(10))
38
+ .filter((f) => f.field("sav_kodas").gt(30))
31
39
  .sort("pavadinimas")
32
40
  .limit(10);
33
41
 
34
- const data = await client.getAll(
42
+ const municipalities = await client.getAll(
35
43
  "datasets/gov/rc/ar/savivaldybe/Savivaldybe",
36
44
  query
37
45
  );
38
- console.log(data);
46
+
47
+ console.log(municipalities);
39
48
  ```
40
49
 
41
50
  ---
42
51
 
43
- ## QueryBuilder
52
+ ## API
44
53
 
45
- Build type-safe queries with a fluent API:
46
-
47
- ```typescript
48
- const query = new QueryBuilder<MyType>()
49
- .select("field1", "field2") // Select specific fields
50
- .filter((f) => f.field("x").eq(1)) // Add filters
51
- .sort("field1") // Sort ascending
52
- .sortDesc("field2") // Sort descending
53
- .limit(100); // Limit results
54
-
55
- const queryString = query.toQueryString();
56
- // Returns: ?select(field1,field2)&x=1&sort(field1,-field2)&limit(100)
57
- ```
58
-
59
- ### Filter Operators
60
-
61
- | Method | Query | Description |
62
- | ------------------ | ------------------------- | --------------------- |
63
- | `.eq(value)` | `field=value` | Equals |
64
- | `.ne(value)` | `field!=value` | Not equals |
65
- | `.lt(value)` | `field<value` | Less than |
66
- | `.le(value)` | `field<=value` | Less than or equal |
67
- | `.gt(value)` | `field>value` | Greater than |
68
- | `.ge(value)` | `field>=value` | Greater than or equal |
69
- | `.contains(str)` | `field.contains("str")` | Contains substring |
70
- | `.startswith(str)` | `field.startswith("str")` | Starts with |
54
+ The SDK provides a `SpintaClient` for making requests and a `QueryBuilder` for constructing queries.
71
55
 
72
- ### Combining Filters
56
+ ### Client Setup
73
57
 
74
58
  ```typescript
75
- // AND
76
- .filter(f => f.field('a').eq(1).and(f.field('b').eq(2)))
77
- // Output: a=1&b=2
59
+ import { SpintaClient } from "lt-open-data-sdk";
78
60
 
79
- // OR
80
- .filter(f => f.field('a').eq(1).or(f.field('b').eq(2)))
81
- // Output: a=1|b=2
61
+ const client = new SpintaClient();
62
+ // Connects to https://get.data.gov.lt by default
82
63
 
83
- // Complex (OR inside AND - auto-wrapped in parentheses)
84
- .filter(f => f.field('a').gt(10).and(
85
- f.field('b').eq(1).or(f.field('b').eq(2))
86
- ))
87
- // Output: a>10&(b=1|b=2)
64
+ // Or specify a custom base URL:
65
+ const client = new SpintaClient({
66
+ baseUrl: "https://get-test.data.gov.lt",
67
+ });
88
68
  ```
89
69
 
90
- ---
70
+ ### Data Retrieval
91
71
 
92
- ## SpintaClient
72
+ #### `getAll(model, query?)` — Fetch records
93
73
 
94
- ### Basic Usage
74
+ Returns an array of records from a dataset. Use with `QueryBuilder` to filter, sort, and limit.
95
75
 
96
- ```typescript
97
- const client = new SpintaClient();
98
- // Uses https://get.data.gov.lt by default
99
- ```
76
+ ````typescript
77
+ const localities = await client.getAll(
78
+ "datasets/gov/rc/ar/gyvenamojivietove/GyvenamojiVietove"
79
+ );
80
+ // Returns: [{ _id, _type, pavadinimas, tipas, ... }, ...]
100
81
 
101
- ### Methods
82
+ > ⚠️ Returns one page only (default 100 items). Use `stream()` for all records.
102
83
 
103
- #### `getAll(model, query?)` - Fetch one page
84
+ #### `getOne(model, id)` Fetch by ID
85
+
86
+ Returns a single record by its UUID.
104
87
 
105
88
  ```typescript
106
- const cities = await client.getAll("datasets/gov/example/City", query);
107
- // Returns: Array of objects (unwrapped from _data)
108
- ```
89
+ const locality = await client.getOne(
90
+ "datasets/gov/rc/ar/gyvenamojivietove/GyvenamojiVietove",
91
+ "b19e801d-95d9-401f-8b00-b70b5f971f0e"
92
+ );
93
+ ````
109
94
 
110
- > ⚠️ **Note**: Returns ONE page only. Use `stream()` for all records.
95
+ #### `getAllRaw(model, query?)` Fetch with metadata
111
96
 
112
- #### `getAllRaw(model, query?)` - Fetch with metadata
97
+ Returns the full API response including pagination info.
113
98
 
114
99
  ```typescript
115
- const response = await client.getAllRaw("datasets/gov/example/City", query);
116
- // Returns: { _type, _data: [...], _page: { next } }
100
+ const response = await client.getAllRaw("datasets/gov/rc/ar/miestas/Miestas");
101
+ // Returns: { _type, _data: [...], _page: { next: "token" } }
117
102
  ```
118
103
 
119
- #### `getOne(model, id)` - Fetch by UUID
104
+ #### `count(model, query?)` Count records
120
105
 
121
- ```typescript
122
- const city = await client.getOne("datasets/gov/example/City", "uuid-here");
123
- ```
124
-
125
- #### `count(model, query?)` - Count records
106
+ Returns the total number of records matching the query.
126
107
 
127
108
  ```typescript
128
- const total = await client.count("datasets/gov/example/City");
109
+ const total = await client.count("datasets/gov/rc/ar/savivaldybe/Savivaldybe");
110
+
129
111
  const filtered = await client.count(
130
- "datasets/gov/example/City",
131
- new QueryBuilder().filter((f) => f.field("population").gt(100000))
112
+ "datasets/gov/rc/ar/savivaldybe/Savivaldybe",
113
+ new QueryBuilder().filter((f) => f.field("pavadinimas").contains("Vilni"))
132
114
  );
133
115
  ```
134
116
 
135
- #### `stream(model, query?)` - Paginated iteration
117
+ #### `stream(model, query?)` Iterate all records
118
+
119
+ Async iterator that automatically handles pagination.
136
120
 
137
121
  ```typescript
138
- for await (const city of client.stream("datasets/gov/example/City")) {
139
- console.log(city.pavadinimas);
122
+ for await (const municipality of client.stream(
123
+ "datasets/gov/rc/ar/savivaldybe/Savivaldybe"
124
+ )) {
125
+ console.log(municipality.pavadinimas);
126
+ // Automatically fetches next pages
140
127
  }
141
128
  ```
142
129
 
143
- #### `listNamespace(namespace)` - List namespace contents
130
+ ### Discovery
131
+
132
+ #### `listNamespace(namespace)` — Browse datasets
133
+
134
+ Lists namespaces and models within a path.
144
135
 
145
136
  ```typescript
146
137
  const items = await client.listNamespace("datasets/gov/rc");
147
- // Returns: [{ _id: 'path', _type: 'ns' | 'model', title? }]
138
+ // Returns: [{ _id: "datasets/gov/rc/ar", _type: "ns" }, ...]
148
139
  ```
149
140
 
150
- #### `discoverModels(namespace)` - Find all models recursively
141
+ #### `discoverModels(namespace)` Find all models
142
+
143
+ Recursively discovers all data models in a namespace.
151
144
 
152
145
  ```typescript
153
- // Discover all available models in a namespace
154
146
  const models = await client.discoverModels("datasets/gov/rc/ar");
155
147
  console.log(`Found ${models.length} models`);
156
-
157
- for (const model of models) {
158
- console.log(`${model.path} - ${model.title}`);
159
- }
160
-
161
- // Then generate types for a specific model:
162
- // npx lt-gen datasets/gov/rc/ar/savivaldybe -o ./types/savivaldybe.d.ts
148
+ // Returns: [{ path, title, namespace }, ...]
163
149
  ```
164
150
 
165
- Returns: `{ path, title?, namespace }[]`
151
+ ### Changes API
166
152
 
167
- ---
153
+ Track data modifications for incremental sync.
168
154
 
169
- ## Type Safety & Autocomplete
155
+ #### `getLatestChange(model)` Get most recent change
170
156
 
171
- The SDK provides full TypeScript support. The workflow is:
157
+ ```typescript
158
+ const latest = await client.getLatestChange("datasets/gov/uzt/ldv/Vieta");
159
+ if (latest) {
160
+ console.log(`Last change: ${latest._op} at ${latest._created}`);
161
+ console.log(`Change ID: ${latest._cid}`);
162
+ }
163
+ // Returns: ChangeEntry | null
164
+ ```
172
165
 
173
- 1. **Generate types** for your dataset:
166
+ #### `getChanges(model, sinceId?, limit?)` Fetch changes
174
167
 
175
- ```bash
176
- npx lt-gen datasets/gov/rc/ar/savivaldybe -o ./types/savivaldybe.d.ts
177
- ```
168
+ Returns changes since a given change ID.
178
169
 
179
- 2. **Import and use** in your code:
170
+ ```typescript
171
+ const changes = await client.getChanges(
172
+ "datasets/gov/uzt/ldv/Vieta",
173
+ 0, // Start from beginning
174
+ 100 // Max 100 changes
175
+ );
176
+ // Returns: [{ _cid, _created, _op, _id, _data }, ...]
177
+ ```
180
178
 
181
- ```typescript
182
- import { SpintaClient } from "lt-open-data-sdk";
183
- import type { GovRcArSavivaldybe_Savivaldybe } from "./types/savivaldybe";
179
+ #### `streamChanges(model, sinceId?, pageSize?)` — Stream all changes
184
180
 
185
- const client = new SpintaClient();
181
+ Async iterator for processing all changes with automatic pagination.
186
182
 
187
- // Pass the type to the method to get full autocomplete!
188
- const data = await client.getAll<GovRcArSavivaldybe_Savivaldybe>(
189
- "datasets/gov/rc/ar/savivaldybe/Savivaldybe"
190
- );
183
+ ```typescript
184
+ for await (const change of client.streamChanges(
185
+ "datasets/gov/uzt/ldv/Vieta",
186
+ lastKnownCid
187
+ )) {
188
+ console.log(`${change._op}: ${change._id}`);
189
+ }
190
+ ```
191
191
 
192
- // TypeScript knows these fields exist:
193
- console.log(data[0].pavadinimas); // string
194
- console.log(data[0].sav_kodas); // number
195
- ```
192
+ #### `getSummary(model, field)` Get histogram data
196
193
 
197
- ---
194
+ Returns binned distribution for a numeric field. Useful for data profiling and visualization.
198
195
 
199
- ## Pagination
196
+ ```typescript
197
+ const histogram = await client.getSummary(
198
+ "datasets/gov/rc/ar/savivaldybe/Savivaldybe",
199
+ "sav_kodas"
200
+ );
201
+ for (const bin of histogram) {
202
+ console.log(`Value ~${bin.bin}: ${bin.count} records`);
203
+ }
204
+ // Returns: [{ bin, count, _type, _id? }, ...]
205
+ ```
200
206
 
201
- The API uses cursor-based pagination with `_page.next` tokens.
207
+ ---
202
208
 
203
- ### Automatic Pagination with `stream()`
209
+ ### QueryBuilder
204
210
 
205
- Use `stream()` to iterate through all records automatically:
211
+ Build queries with a fluent API.
206
212
 
207
213
  ```typescript
208
- const query = new QueryBuilder().limit(100); // 100 items per page
214
+ import { QueryBuilder } from "lt-open-data-sdk";
209
215
 
210
- for await (const item of client.stream("datasets/gov/example/City", query)) {
211
- console.log(item.pavadinimas);
212
- // Automatically fetches next page when current page is exhausted
213
- }
216
+ const query = new QueryBuilder()
217
+ .select("_id", "pavadinimas", "gyventoju_skaicius")
218
+ .filter((f) => f.field("gyventoju_skaicius").gt(10000))
219
+ .sort("pavadinimas")
220
+ .limit(50);
221
+
222
+ const data = await client.getAll("datasets/gov/example/Model", query);
214
223
  ```
215
224
 
216
- **How it works:**
225
+ #### Filter Operators
217
226
 
218
- 1. Fetches first page with your query
219
- 2. Yields items one by one
220
- 3. When page exhausted, uses `_page.next` token to fetch next page
221
- 4. Continues until no more pages
227
+ | Method | Query | Description |
228
+ | ------------------ | ------------------------- | --------------------- |
229
+ | `.eq(value)` | `field=value` | Equals |
230
+ | `.ne(value)` | `field!=value` | Not equals |
231
+ | `.lt(value)` | `field<value` | Less than |
232
+ | `.le(value)` | `field<=value` | Less than or equal |
233
+ | `.gt(value)` | `field>value` | Greater than |
234
+ | `.ge(value)` | `field>=value` | Greater than or equal |
235
+ | `.contains(str)` | `field.contains("str")` | Contains substring |
236
+ | `.startswith(str)` | `field.startswith("str")` | Starts with |
237
+ | `.endswith(str)` | `field.endswith("str")` | Ends with ⚠️ |
238
+ | `.in([...])` | `field.in(a,b,c)` | Value in list ⚠️ |
239
+ | `.notin([...])` | `field.notin(a,b,c)` | Value not in list ⚠️ |
222
240
 
223
- ### Manual Pagination with `getAllRaw()`
241
+ > ⚠️ `endswith`, `in`, `notin` are in the Spinta spec but not yet supported by the live API.
224
242
 
225
- For more control, handle pagination yourself:
243
+ #### Combining Filters
226
244
 
227
245
  ```typescript
228
- let pageToken: string | undefined;
229
-
230
- do {
231
- // Build query with page token
232
- let query = new QueryBuilder().limit(100);
246
+ // AND - both conditions must match
247
+ .filter(f => f.field('a').gt(10).and(f.field('b').lt(100)))
248
+ // Output: a>10&b<100
233
249
 
234
- const response = await client.getAllRaw("datasets/gov/example/City", query);
250
+ // OR - either condition matches
251
+ .filter(f => f.field('status').eq('active').or(f.field('status').eq('pending')))
252
+ // Output: status="active"|status="pending"
235
253
 
236
- // Process this page
237
- for (const item of response._data) {
238
- console.log(item);
239
- }
254
+ // Complex - parentheses added automatically
255
+ .filter(f => f.field('a').gt(10).and(
256
+ f.field('b').eq(1).or(f.field('b').eq(2))
257
+ ))
258
+ // Output: a>10&(b=1|b=2)
259
+ ```
240
260
 
241
- // Get next page token
242
- pageToken = response._page?.next;
261
+ #### Sorting
243
262
 
244
- // Note: You need to add page(token) to next request manually
245
- // This is handled automatically by stream()
246
- } while (pageToken);
263
+ ```typescript
264
+ new QueryBuilder()
265
+ .sort("name") // Ascending
266
+ .sortDesc("created_at"); // Descending
267
+ // Output: ?sort(name,-created_at)
247
268
  ```
248
269
 
249
- > **Tip**: Use `stream()` for most cases. Use `getAllRaw()` when you need access to page metadata or custom page handling.
270
+ ---
271
+
272
+ ## CLI
250
273
 
251
- ## CLI Type Generator
274
+ Generate TypeScript interfaces from live API data.
252
275
 
253
- Generate TypeScript interfaces from live API metadata:
276
+ ### Basic Usage
254
277
 
255
278
  ```bash
256
- # Install globally or use npx
279
+ # Generate types for a dataset (prints to stdout)
257
280
  npx lt-gen datasets/gov/rc/ar/savivaldybe
258
281
 
259
- # Save to file
282
+ # Save to a file
260
283
  npx lt-gen datasets/gov/rc/ar/savivaldybe -o ./types/savivaldybe.d.ts
261
284
 
262
- # Custom API URL
285
+ # Use a different API endpoint
263
286
  npx lt-gen datasets/gov/rc/ar/savivaldybe --base-url https://get-test.data.gov.lt
264
287
  ```
265
288
 
289
+ ### Options
290
+
291
+ | Option | Description |
292
+ | --------------------- | -------------------- |
293
+ | `-o, --output <file>` | Write output to file |
294
+ | `--base-url <url>` | Custom API base URL |
295
+ | `-h, --help` | Show help |
296
+
266
297
  ### Generated Output
267
298
 
268
299
  ```typescript
300
+ // Generated from datasets/gov/rc/ar/savivaldybe/Savivaldybe
301
+
269
302
  export interface GovRcArSavivaldybe_Savivaldybe {
270
303
  _id: string;
271
304
  _type: string;
272
305
  _revision?: string;
273
306
  sav_kodas?: number;
274
307
  pavadinimas?: string;
275
- apskritis?: string | { _id: string }; // ref type
276
- sav_nuo?: string; // date
308
+ apskritis?: string | { _id: string };
309
+ sav_nuo?: string;
277
310
  }
278
311
 
279
312
  export interface ModelMap {
@@ -281,30 +314,22 @@ export interface ModelMap {
281
314
  }
282
315
  ```
283
316
 
284
- > **Note**: Types are inferred from data samples since schema endpoints require authentication.
285
-
286
- ---
287
-
288
- ## Authentication _(Untested)_
289
-
290
- For write operations or private data, provide OAuth credentials:
317
+ ### Using Generated Types
291
318
 
292
319
  ```typescript
293
- const client = new SpintaClient({
294
- clientId: "your-client-id",
295
- clientSecret: "your-client-secret",
296
- authUrl: "https://put.data.gov.lt", // optional, default
297
- scopes: ["spinta_getone", "spinta_getall"], // optional
298
- });
299
- ```
320
+ import { SpintaClient } from "lt-open-data-sdk";
321
+ import type { GovRcArSavivaldybe_Savivaldybe } from "./types/savivaldybe";
300
322
 
301
- The SDK handles:
323
+ const client = new SpintaClient();
302
324
 
303
- - OAuth client credentials flow
304
- - Automatic token caching
305
- - Token refresh before expiry (5-minute buffer)
325
+ // Full autocomplete on fields!
326
+ const data = await client.getAll<GovRcArSavivaldybe_Savivaldybe>(
327
+ "datasets/gov/rc/ar/savivaldybe/Savivaldybe"
328
+ );
306
329
 
307
- > ⚠️ **Note**: Authentication has been implemented but not tested against a live auth server.
330
+ console.log(data[0].pavadinimas); // TypeScript knows this is string
331
+ console.log(data[0].sav_kodas); // TypeScript knows this is number
332
+ ```
308
333
 
309
334
  ---
310
335
 
@@ -322,43 +347,38 @@ try {
322
347
  const data = await client.getOne("datasets/example", "invalid-id");
323
348
  } catch (error) {
324
349
  if (error instanceof NotFoundError) {
325
- console.log("Not found:", error.message);
326
- } else if (error instanceof AuthenticationError) {
327
- console.log("Auth failed:", error.status);
350
+ console.log("Record not found");
328
351
  } else if (error instanceof ValidationError) {
329
- console.log("Bad request:", error.body);
352
+ console.log("Invalid query:", error.message);
330
353
  }
331
354
  }
332
355
  ```
333
356
 
334
357
  ---
335
358
 
336
- ## API Reference
359
+ ## Authentication
337
360
 
338
- ### Exports
361
+ For write operations or private datasets, provide OAuth credentials:
339
362
 
340
363
  ```typescript
341
- // Client
342
- export { SpintaClient } from "./client/SpintaClient";
343
- export {
344
- SpintaError,
345
- AuthenticationError,
346
- NotFoundError,
347
- ValidationError,
348
- } from "./client/errors";
349
-
350
- // Query Builder
351
- export { QueryBuilder } from "./builder/QueryBuilder";
352
- export { FilterBuilder } from "./builder/FilterBuilder";
353
-
354
- // Types
355
- export type {
356
- ClientConfig,
357
- SpintaResponse,
358
- SpintaObject,
359
- } from "./client/types";
364
+ const client = new SpintaClient({
365
+ clientId: "your-client-id",
366
+ clientSecret: "your-client-secret",
367
+ });
360
368
  ```
361
369
 
370
+ The SDK handles token caching and automatic refresh.
371
+
372
+ > ⚠️ Authentication is implemented but untested against the live auth server.
373
+
374
+ ---
375
+
376
+ ## Known Limitations
377
+
378
+ - **Boolean filtering** may not work on some datasets due to inconsistent data formats in the source
379
+ - **`in()`, `notin()`, `endswith()`** operators are implemented but not yet supported by the live API
380
+ - **Type inference** is based on data sampling, not schema (schema endpoints require auth)
381
+
362
382
  ---
363
383
 
364
384
  ## License
@@ -1 +1 @@
1
- {"version":3,"file":"FilterBuilder.d.ts","sourceRoot":"","sources":["../../src/builder/FilterBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EAEpB,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAsFpB;;GAEG;AACH,qBAAa,aAAa,CAAC,CAAC,CAAE,YAAW,sBAAsB,CAAC,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,oBAAoB;CAGpD;AA6CD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAkD7D"}
1
+ {"version":3,"file":"FilterBuilder.d.ts","sourceRoot":"","sources":["../../src/builder/FilterBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EAEpB,gBAAgB,EAIjB,MAAM,YAAY,CAAC;AA2GpB;;GAEG;AACH,qBAAa,aAAa,CAAC,CAAC,CAAE,YAAW,sBAAsB,CAAC,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,oBAAoB;CAGpD;AA6CD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAwD7D"}
@@ -75,6 +75,23 @@ class FieldFilter {
75
75
  startswith(value) {
76
76
  return this.stringOp('startswith', value);
77
77
  }
78
+ endswith(value) {
79
+ return this.stringOp('endswith', value);
80
+ }
81
+ arrayOp(operator, values) {
82
+ return createExpressionBuilder({
83
+ type: 'array_op',
84
+ field: this.fieldName,
85
+ operator,
86
+ values,
87
+ });
88
+ }
89
+ in(values) {
90
+ return this.arrayOp('in', values);
91
+ }
92
+ notin(values) {
93
+ return this.arrayOp('notin', values);
94
+ }
78
95
  }
79
96
  /**
80
97
  * FilterBuilder - Entry point for constructing filter expressions
@@ -154,6 +171,11 @@ export function filterToString(expr) {
154
171
  // Use method syntax: field.contains(value)
155
172
  return `${expr.field}.${expr.operator}(${value})`;
156
173
  }
174
+ case 'array_op': {
175
+ const values = expr.values.map(formatValue).join(',');
176
+ // Use method syntax: field.in(val1,val2) or field.notin(val1,val2)
177
+ return `${expr.field}.${expr.operator}(${values})`;
178
+ }
157
179
  case 'and': {
158
180
  const leftStr = needsParens(expr.left, 'and')
159
181
  ? `(${filterToString(expr.left)})`
@@ -1 +1 @@
1
- {"version":3,"file":"FilterBuilder.js","sourceRoot":"","sources":["../../src/builder/FilterBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH;;GAEG;AACH,SAAS,uBAAuB,CAAC,IAAsB;IACrD,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,KAA8B;YAChC,OAAO,uBAAuB,CAAC;gBAC7B,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,KAAK,CAAC,IAAI;aAClB,CAAC,CAAC;QACL,CAAC;QACD,EAAE,CAAC,KAA8B;YAC/B,OAAO,uBAAuB,CAAC;gBAC7B,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,KAAK,CAAC,IAAI;aAClB,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,WAAW;IACE,SAAS,CAAS;IAEnC,YAAY,SAAiB;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAEO,UAAU,CAAC,QAA4B,EAAE,KAAc;QAC7D,OAAO,uBAAuB,CAAC;YAC7B,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,QAAQ;YACR,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,QAAwB,EAAE,KAAa;QACtD,OAAO,uBAAuB,CAAC;YAC7B,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,QAAQ;YACR,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,KAAc;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,EAAE,CAAC,KAAc;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,EAAE,CAAC,KAAc;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,EAAE,CAAC,KAAc;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,EAAE,CAAC,KAAc;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,EAAE,CAAC,KAAc;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,UAAU,CAAC,KAAa;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,aAAa;IACxB,KAAK,CAAC,IAAsB;QAC1B,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,4BAA4B;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3C,oBAAoB;QACpB,MAAM,MAAM,GAAG,IAAI,OAAO,GAAG,CAAC;QAC9B,yDAAyD;QACzD,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,wCAAwC;QACxC,OAAO,kBAAkB,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IACD,mDAAmD;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,4DAA4D;IAC5D,OAAO,kBAAkB,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;AAC7F,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,KAAuB,EAAE,UAAwB;IACpE,oEAAoE;IACpE,OAAO,UAAU,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAsB;IACnD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,uDAAuD;YACvD,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACtB,KAAK,IAAI;oBACP,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;gBAClC,KAAK,IAAI;oBACP,OAAO,GAAG,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBACnC,KAAK,IAAI;oBACP,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;gBAClC,KAAK,IAAI;oBACP,OAAO,GAAG,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBACnC,KAAK,IAAI;oBACP,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;gBAClC,KAAK,IAAI;oBACP,OAAO,GAAG,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACrC,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,2CAA2C;YAC3C,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,GAAG,CAAC;QACpD,CAAC;QAED,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;gBAC3C,CAAC,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBAClC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;gBAC7C,CAAC,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG;gBACnC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,GAAG,OAAO,IAAI,QAAQ,EAAE,CAAC;QAClC,CAAC;QAED,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;gBAC1C,CAAC,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBAClC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;gBAC5C,CAAC,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG;gBACnC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,GAAG,OAAO,IAAI,QAAQ,EAAE,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"FilterBuilder.js","sourceRoot":"","sources":["../../src/builder/FilterBuilder.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,9 @@
4
4
  /** Comparison operators for filtering */
5
5
  export type ComparisonOperator = 'eq' | 'ne' | 'lt' | 'le' | 'gt' | 'ge';
6
6
  /** String-specific operators */
7
- export type StringOperator = 'contains' | 'startswith';
7
+ export type StringOperator = 'contains' | 'startswith' | 'endswith';
8
+ /** Array/list operators */
9
+ export type ArrayOperator = 'in' | 'notin';
8
10
  /** Sort direction */
9
11
  export type SortDirection = 'asc' | 'desc';
10
12
  /** Sort specification for a field */
@@ -14,7 +16,7 @@ export interface SortSpec {
14
16
  }
15
17
  /** Base filter expression node */
16
18
  export interface FilterNode {
17
- type: 'comparison' | 'string_op' | 'and' | 'or';
19
+ type: 'comparison' | 'string_op' | 'array_op' | 'and' | 'or';
18
20
  }
19
21
  /** Comparison filter expression */
20
22
  export interface ComparisonNode extends FilterNode {
@@ -30,6 +32,13 @@ export interface StringOpNode extends FilterNode {
30
32
  operator: StringOperator;
31
33
  value: string;
32
34
  }
35
+ /** Array operation filter expression (in, notin) */
36
+ export interface ArrayOpNode extends FilterNode {
37
+ type: 'array_op';
38
+ field: string;
39
+ operator: ArrayOperator;
40
+ values: unknown[];
41
+ }
33
42
  /** AND combination of filters */
34
43
  export interface AndNode extends FilterNode {
35
44
  type: 'and';
@@ -43,7 +52,7 @@ export interface OrNode extends FilterNode {
43
52
  right: FilterExpression;
44
53
  }
45
54
  /** Union of all filter expression types */
46
- export type FilterExpression = ComparisonNode | StringOpNode | AndNode | OrNode;
55
+ export type FilterExpression = ComparisonNode | StringOpNode | ArrayOpNode | AndNode | OrNode;
47
56
  /** Callback type for building filter expressions */
48
57
  export type FilterCallback<T> = (builder: FilterBuilderInterface<T>) => FilterExpressionBuilder;
49
58
  /** Interface for field filter operations */
@@ -56,6 +65,9 @@ export interface FieldFilterInterface {
56
65
  ge(value: unknown): FilterExpressionBuilder;
57
66
  contains(value: string): FilterExpressionBuilder;
58
67
  startswith(value: string): FilterExpressionBuilder;
68
+ endswith(value: string): FilterExpressionBuilder;
69
+ in(values: unknown[]): FilterExpressionBuilder;
70
+ notin(values: unknown[]): FilterExpressionBuilder;
59
71
  }
60
72
  /** Interface for building filter expressions */
61
73
  export interface FilterBuilderInterface<T> {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/builder/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yCAAyC;AACzC,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzE,gCAAgC;AAChC,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC;AAEvD,qBAAqB;AACrB,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAE3C,qCAAqC;AACrC,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,kCAAkC;AAClC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,GAAG,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;CACjD;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,yCAAyC;AACzC,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,iCAAiC;AACjC,MAAM,WAAW,OAAQ,SAAQ,UAAU;IACzC,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,gCAAgC;AAChC,MAAM,WAAW,MAAO,SAAQ,UAAU;IACxC,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,2CAA2C;AAC3C,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhF,oDAAoD;AACpD,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,uBAAuB,CAAC;AAEhG,4CAA4C;AAC5C,MAAM,WAAW,oBAAoB;IACnC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAAC;IAC5C,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAAC;IAC5C,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAAC;IAC5C,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAAC;IAC5C,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAAC;IAC5C,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,uBAAuB,CAAC;IACjD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,uBAAuB,CAAC;CACpD;AAED,gDAAgD;AAChD,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,oBAAoB,CAAC;CACrD;AAED,wDAAwD;AACxD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,GAAG,CAAC,KAAK,EAAE,uBAAuB,GAAG,uBAAuB,CAAC;IAC7D,EAAE,CAAC,KAAK,EAAE,uBAAuB,GAAG,uBAAuB,CAAC;CAC7D"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/builder/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"crawler.d.ts","sourceRoot":"","sources":["../../src/cli/crawler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,8BAA8B;AAC9B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAED,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,sBAAsB;AACtB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,SAAS,UAAO,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CAenB;AA4CD;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CA6ExB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAAC,aAAa,EAAE,CAAC,CAS1B"}
1
+ {"version":3,"file":"crawler.d.ts","sourceRoot":"","sources":["../../src/cli/crawler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,8BAA8B;AAC9B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAED,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,sBAAsB;AACtB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,SAAS,UAAO,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CAenB;AAmED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CA6ExB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAAC,aAAa,EAAE,CAAC,CAS1B"}
@@ -26,12 +26,22 @@ export async function crawlNamespace(client, namespace, recursive = true) {
26
26
  }
27
27
  /**
28
28
  * Infer type from a JavaScript value
29
+ * Enhanced to detect geometry (WKT), files, and external URLs
29
30
  */
30
31
  function inferType(value) {
31
32
  if (value === null) {
32
33
  return 'unknown';
33
34
  }
34
35
  if (typeof value === 'string') {
36
+ // Check for WKT geometry formats (common in Lithuanian open data)
37
+ // WKT format: POINT(...), LINESTRING(...), POLYGON(...), etc.
38
+ if (/^(POINT|LINESTRING|POLYGON|MULTIPOINT|MULTILINESTRING|MULTIPOLYGON|GEOMETRYCOLLECTION)\s*\(/i.test(value)) {
39
+ return 'geometry';
40
+ }
41
+ // Check for SRID-prefixed WKT: SRID=4326;POINT(...)
42
+ if (/^SRID=\d+;/i.test(value)) {
43
+ return 'geometry';
44
+ }
35
45
  // Check for ISO date format
36
46
  if (/^\d{4}-\d{2}-\d{2}/.test(value)) {
37
47
  return value.includes('T') ? 'datetime' : 'date';
@@ -40,6 +50,14 @@ function inferType(value) {
40
50
  if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)) {
41
51
  return 'ref';
42
52
  }
53
+ // Check for URL (file or external link)
54
+ if (/^https?:\/\//i.test(value)) {
55
+ // Files often have extensions like .pdf, .jpg, .doc, etc.
56
+ if (/\.\w{2,5}($|\?)/i.test(value)) {
57
+ return 'file';
58
+ }
59
+ return 'url';
60
+ }
43
61
  return 'string';
44
62
  }
45
63
  if (typeof value === 'number') {
@@ -52,6 +70,11 @@ function inferType(value) {
52
70
  return 'array';
53
71
  }
54
72
  if (typeof value === 'object') {
73
+ // Check for file object structure FIRST (has _content_type or _size)
74
+ // This must come before ref check since files also have _id
75
+ if ('_content_type' in value || '_size' in value) {
76
+ return 'file';
77
+ }
55
78
  // Check for ref object with _id
56
79
  if ('_id' in value && typeof value._id === 'string') {
57
80
  return 'ref';
@@ -1 +1 @@
1
- {"version":3,"file":"crawler.js","sourceRoot":"","sources":["../../src/cli/crawler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crawler.js","sourceRoot":"","sources":["../../src/cli/crawler.ts"],"names":[],"mappings":"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"}
@@ -24,7 +24,7 @@
24
24
  * const largeCities = await client.getAll('datasets/gov/example/City', query);
25
25
  * ```
26
26
  */
27
- import type { ClientConfig, SpintaObject, SpintaResponse } from './types.js';
27
+ import type { ClientConfig, SpintaObject, SpintaResponse, ChangeEntry, SummaryBin } from './types.js';
28
28
  import type { QueryBuilder } from '../builder/QueryBuilder.js';
29
29
  export declare class SpintaClient {
30
30
  private readonly baseUrl;
@@ -148,6 +148,85 @@ export declare class SpintaClient {
148
148
  * ```
149
149
  */
150
150
  discoverModels(namespace: string): Promise<DiscoveredModel[]>;
151
+ /**
152
+ * Get the latest change ID for a model
153
+ *
154
+ * Useful for initializing sync - get the current position before starting.
155
+ *
156
+ * @param model - Full model path (e.g., 'datasets/gov/example/City')
157
+ * @returns The most recent change entry, or null if no changes exist
158
+ *
159
+ * @example
160
+ * const latest = await client.getLatestChange('datasets/gov/example/City');
161
+ * if (latest) {
162
+ * console.log('Last change ID:', latest._cid);
163
+ * }
164
+ */
165
+ getLatestChange<T>(model: string): Promise<(ChangeEntry<T>) | null>;
166
+ /**
167
+ * Get changes since a specific change ID
168
+ *
169
+ * Returns a log of all data modifications (insert, update, delete) since
170
+ * the given change ID. Use for incremental data synchronization.
171
+ *
172
+ * @param model - Full model path
173
+ * @param sinceId - Change ID to start from (exclusive). Pass 0 or omit to get all changes.
174
+ * @param limit - Maximum number of changes to return (default: 100)
175
+ * @returns Array of change entries with operation type and data
176
+ *
177
+ * @example
178
+ * // Initial sync: get current position
179
+ * const latest = await client.getLatestChange('datasets/gov/example/City');
180
+ * let lastId = latest?._cid ?? 0;
181
+ *
182
+ * // Incremental sync: get changes since last sync
183
+ * const changes = await client.getChanges('datasets/gov/example/City', lastId);
184
+ * for (const change of changes) {
185
+ * if (change._op === 'insert') {
186
+ * // Handle new record
187
+ * } else if (change._op === 'update' || change._op === 'patch') {
188
+ * // Handle modification
189
+ * } else if (change._op === 'delete') {
190
+ * // Handle deletion
191
+ * }
192
+ * lastId = change._cid;
193
+ * }
194
+ */
195
+ getChanges<T>(model: string, sinceId?: number, limit?: number): Promise<ChangeEntry<T>[]>;
196
+ /**
197
+ * Stream all changes since a specific ID with automatic pagination
198
+ *
199
+ * @param model - Full model path
200
+ * @param sinceId - Change ID to start from (exclusive)
201
+ * @param pageSize - Number of changes per page (default: 100)
202
+ * @yields Change entries one at a time
203
+ *
204
+ * @example
205
+ * for await (const change of client.streamChanges('datasets/gov/example/City', 0)) {
206
+ * console.log(change._op, change._id);
207
+ * }
208
+ */
209
+ streamChanges<T>(model: string, sinceId?: number, pageSize?: number): AsyncGenerator<ChangeEntry<T>, void, undefined>;
210
+ /**
211
+ * Get histogram/distribution summary for a numeric field
212
+ *
213
+ * Returns binned counts showing the distribution of values for a field.
214
+ * Useful for data exploration, profiling, and visualization.
215
+ *
216
+ * @param model - Full model path (e.g., 'datasets/gov/example/City')
217
+ * @param field - Numeric field to summarize (e.g., 'population')
218
+ * @returns Array of bins with value ranges and counts
219
+ *
220
+ * @example
221
+ * const histogram = await client.getSummary(
222
+ * 'datasets/gov/rc/ar/savivaldybe/Savivaldybe',
223
+ * 'sav_kodas'
224
+ * );
225
+ * for (const bin of histogram) {
226
+ * console.log(`Value ~${bin.bin}: ${bin.count} records`);
227
+ * }
228
+ */
229
+ getSummary(model: string, field: string): Promise<SummaryBin[]>;
151
230
  }
152
231
  /** Discovered model from namespace traversal */
153
232
  export interface DiscoveredModel {
@@ -1 +1 @@
1
- {"version":3,"file":"SpintaClient.d.ts","sourceRoot":"","sources":["../../src/client/SpintaClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EAEf,MAAM,YAAY,CAAC;AAGpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAY/D,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;gBAEnC,MAAM,GAAE,YAAiB;IAgBrC;;;OAGG;YACW,UAAU;IAaxB;;OAEG;YACW,OAAO;IAarB;;;;;;;;;OASG;IACG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC;IAKrE;;;;;;;;;;;;;;;OAeG;IACG,MAAM,CAAC,CAAC,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;IAKhC;;;;;;;;OAQG;IACG,SAAS,CAAC,CAAC,EACf,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAM7B;;;;;;;;;;;;;;;;;;;;OAoBG;IACI,MAAM,CAAC,CAAC,EACb,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,cAAc,CAAC,CAAC,GAAG,YAAY,EAAE,IAAI,EAAE,SAAS,CAAC;IA0BpD;;;;;;;;;;OAUG;IACG,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAcvE;;;;;;;;;;;;;;;OAeG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAoBhE;;;;;;;;;;;;;;;;;;OAkBG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAuBpE;AAED,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD,wCAAwC;AACxC,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"SpintaClient.d.ts","sourceRoot":"","sources":["../../src/client/SpintaClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EAEd,WAAW,EAEX,UAAU,EAEX,MAAM,YAAY,CAAC;AAGpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAY/D,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;gBAEnC,MAAM,GAAE,YAAiB;IAgBrC;;;OAGG;YACW,UAAU;IAaxB;;OAEG;YACW,OAAO;IAarB;;;;;;;;;OASG;IACG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC;IAKrE;;;;;;;;;;;;;;;OAeG;IACG,MAAM,CAAC,CAAC,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;IAKhC;;;;;;;;OAQG;IACG,SAAS,CAAC,CAAC,EACf,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAM7B;;;;;;;;;;;;;;;;;;;;OAoBG;IACI,MAAM,CAAC,CAAC,EACb,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,cAAc,CAAC,CAAC,GAAG,YAAY,EAAE,IAAI,EAAE,SAAS,CAAC;IA0BpD;;;;;;;;;;OAUG;IACG,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAcvE;;;;;;;;;;;;;;;OAeG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAoBhE;;;;;;;;;;;;;;;;;;OAkBG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAwBnE;;;;;;;;;;;;;OAaG;IACG,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAYzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACG,UAAU,CAAC,CAAC,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,SAAM,GACV,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAQ5B;;;;;;;;;;;;OAYG;IACI,aAAa,CAAC,CAAC,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,SAAI,EACX,QAAQ,SAAM,GACb,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC;IAoBlD;;;;;;;;;;;;;;;;;;OAkBG;IACG,UAAU,CACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,EAAE,CAAC;CAKzB;AAED,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD,wCAAwC;AACxC,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -258,5 +258,120 @@ export class SpintaClient {
258
258
  await traverse(namespace);
259
259
  return models;
260
260
  }
261
+ /**
262
+ * Get the latest change ID for a model
263
+ *
264
+ * Useful for initializing sync - get the current position before starting.
265
+ *
266
+ * @param model - Full model path (e.g., 'datasets/gov/example/City')
267
+ * @returns The most recent change entry, or null if no changes exist
268
+ *
269
+ * @example
270
+ * const latest = await client.getLatestChange('datasets/gov/example/City');
271
+ * if (latest) {
272
+ * console.log('Last change ID:', latest._cid);
273
+ * }
274
+ */
275
+ async getLatestChange(model) {
276
+ // Use -1 to get the most recent change (negative numbers count from end)
277
+ const path = `/${model}/:changes/-1`;
278
+ try {
279
+ const response = await this.request(path);
280
+ return response._data[0] ?? null;
281
+ }
282
+ catch {
283
+ // No changes exist yet
284
+ return null;
285
+ }
286
+ }
287
+ /**
288
+ * Get changes since a specific change ID
289
+ *
290
+ * Returns a log of all data modifications (insert, update, delete) since
291
+ * the given change ID. Use for incremental data synchronization.
292
+ *
293
+ * @param model - Full model path
294
+ * @param sinceId - Change ID to start from (exclusive). Pass 0 or omit to get all changes.
295
+ * @param limit - Maximum number of changes to return (default: 100)
296
+ * @returns Array of change entries with operation type and data
297
+ *
298
+ * @example
299
+ * // Initial sync: get current position
300
+ * const latest = await client.getLatestChange('datasets/gov/example/City');
301
+ * let lastId = latest?._cid ?? 0;
302
+ *
303
+ * // Incremental sync: get changes since last sync
304
+ * const changes = await client.getChanges('datasets/gov/example/City', lastId);
305
+ * for (const change of changes) {
306
+ * if (change._op === 'insert') {
307
+ * // Handle new record
308
+ * } else if (change._op === 'update' || change._op === 'patch') {
309
+ * // Handle modification
310
+ * } else if (change._op === 'delete') {
311
+ * // Handle deletion
312
+ * }
313
+ * lastId = change._cid;
314
+ * }
315
+ */
316
+ async getChanges(model, sinceId, limit = 100) {
317
+ const changeId = sinceId ?? 0;
318
+ const path = `/${model}/:changes/${String(changeId)}`;
319
+ const queryString = `?limit(${String(limit)})`;
320
+ const response = await this.request(path, queryString);
321
+ return response._data;
322
+ }
323
+ /**
324
+ * Stream all changes since a specific ID with automatic pagination
325
+ *
326
+ * @param model - Full model path
327
+ * @param sinceId - Change ID to start from (exclusive)
328
+ * @param pageSize - Number of changes per page (default: 100)
329
+ * @yields Change entries one at a time
330
+ *
331
+ * @example
332
+ * for await (const change of client.streamChanges('datasets/gov/example/City', 0)) {
333
+ * console.log(change._op, change._id);
334
+ * }
335
+ */
336
+ async *streamChanges(model, sinceId = 0, pageSize = 100) {
337
+ let lastId = sinceId;
338
+ let hasMore = true;
339
+ while (hasMore) {
340
+ const changes = await this.getChanges(model, lastId, pageSize);
341
+ if (changes.length === 0) {
342
+ break;
343
+ }
344
+ for (const change of changes) {
345
+ yield change;
346
+ lastId = change._cid;
347
+ }
348
+ // If we got fewer than requested, we've reached the end
349
+ hasMore = changes.length >= pageSize;
350
+ }
351
+ }
352
+ /**
353
+ * Get histogram/distribution summary for a numeric field
354
+ *
355
+ * Returns binned counts showing the distribution of values for a field.
356
+ * Useful for data exploration, profiling, and visualization.
357
+ *
358
+ * @param model - Full model path (e.g., 'datasets/gov/example/City')
359
+ * @param field - Numeric field to summarize (e.g., 'population')
360
+ * @returns Array of bins with value ranges and counts
361
+ *
362
+ * @example
363
+ * const histogram = await client.getSummary(
364
+ * 'datasets/gov/rc/ar/savivaldybe/Savivaldybe',
365
+ * 'sav_kodas'
366
+ * );
367
+ * for (const bin of histogram) {
368
+ * console.log(`Value ~${bin.bin}: ${bin.count} records`);
369
+ * }
370
+ */
371
+ async getSummary(model, field) {
372
+ const path = `/${model}/:summary/${field}`;
373
+ const response = await this.request(path);
374
+ return response._data;
375
+ }
261
376
  }
262
377
  //# sourceMappingURL=SpintaClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SpintaClient.js","sourceRoot":"","sources":["../../src/client/SpintaClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SpintaClient.js","sourceRoot":"","sources":["../../src/client/SpintaClient.ts"],"names":[],"mappings":"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"}
@@ -4,5 +4,5 @@
4
4
  export { SpintaClient } from './SpintaClient.js';
5
5
  export type { DiscoveredModel } from './SpintaClient.js';
6
6
  export { SpintaError, AuthenticationError, NotFoundError, ValidationError, } from './errors.js';
7
- export type { ClientConfig, SpintaObject, SpintaResponse, PageInfo, TokenResponse, CachedToken, CountResponse, SpintaErrorResponse, NamespaceItem, NamespaceResponse, } from './types.js';
7
+ export type { ClientConfig, SpintaObject, SpintaResponse, PageInfo, TokenResponse, CachedToken, CountResponse, SpintaErrorResponse, NamespaceItem, NamespaceResponse, SummaryBin, } from './types.js';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,aAAa,EACb,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,aAAa,EACb,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,UAAU,GACX,MAAM,YAAY,CAAC"}
@@ -93,4 +93,48 @@ export interface NamespaceItem {
93
93
  export interface NamespaceResponse {
94
94
  _data: NamespaceItem[];
95
95
  }
96
+ /** Operation types for change entries */
97
+ export type ChangeOperation = 'insert' | 'update' | 'patch' | 'delete';
98
+ /**
99
+ * Change entry from the /:changes endpoint
100
+ * Represents a single data modification event
101
+ */
102
+ export interface ChangeEntry<T> {
103
+ /** Change ID - monotonically increasing, use for pagination */
104
+ _cid: number;
105
+ /** Timestamp of the change (ISO 8601) */
106
+ _created: string;
107
+ /** Type of operation performed */
108
+ _op: ChangeOperation;
109
+ /** Transaction ID */
110
+ _txn: string;
111
+ /** Revision after the change */
112
+ _revision: string;
113
+ /** ID of the modified object */
114
+ _id: string;
115
+ /** The data after modification (not present for delete) */
116
+ _data?: T;
117
+ }
118
+ /** Response wrapper for changes endpoint */
119
+ export interface ChangesResponse<T> {
120
+ _data: ChangeEntry<T>[];
121
+ }
122
+ /**
123
+ * A bin from the /:summary endpoint histogram
124
+ * Represents a value range and the count of records in that range
125
+ */
126
+ export interface SummaryBin {
127
+ /** The bin value (center or start of range) */
128
+ bin: number;
129
+ /** Number of records in this bin */
130
+ count: number;
131
+ /** Type of the model */
132
+ _type: string;
133
+ /** ID of a sample record in this bin (if count > 0) */
134
+ _id?: string;
135
+ }
136
+ /** Response wrapper for summary endpoint */
137
+ export interface SummaryResponse {
138
+ _data: SummaryBin[];
139
+ }
96
140
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qDAAqD;AACrD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wCAAwC;AACxC,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,kCAAkC;AAClC,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,sCAAsC;AACtC,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC;CAClB;AAED,kCAAkC;AAClC,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChC;AAED,sCAAsC;AACtC,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,EAAE,CAAC;CACL;AAED,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lt-open-data-sdk",
3
- "version": "1.0.1",
3
+ "version": "1.1.1",
4
4
  "description": "TypeScript SDK for the Lithuanian Open Data platform (data.gov.lt)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",