lt-open-data-sdk 1.0.1 → 1.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/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,274 @@ 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:
54
+ The SDK provides a `SpintaClient` for making requests and a `QueryBuilder` for constructing queries.
46
55
 
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 |
71
-
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, ... }, ...]
81
+
82
+ > ⚠️ Returns one page only (default 100 items). Use `stream()` for all records.
100
83
 
101
- ### Methods
84
+ #### `getOne(model, id)` — Fetch by ID
102
85
 
103
- #### `getAll(model, query?)` - Fetch one page
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 }[]`
166
-
167
- ---
151
+ ### Changes API
168
152
 
169
- ## Type Safety & Autocomplete
153
+ Track data modifications for incremental sync.
170
154
 
171
- The SDK provides full TypeScript support. The workflow is:
155
+ #### `getLatestChange(model)` Get most recent change
172
156
 
173
- 1. **Generate types** for your dataset:
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
+ ```
174
165
 
175
- ```bash
176
- npx lt-gen datasets/gov/rc/ar/savivaldybe -o ./types/savivaldybe.d.ts
177
- ```
166
+ #### `getChanges(model, sinceId?, limit?)` — Fetch changes
178
167
 
179
- 2. **Import and use** in your code:
168
+ Returns changes since a given change ID.
180
169
 
181
- ```typescript
182
- import { SpintaClient } from "lt-open-data-sdk";
183
- import type { GovRcArSavivaldybe_Savivaldybe } from "./types/savivaldybe";
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
+ ```
184
178
 
185
- const client = new SpintaClient();
179
+ #### `streamChanges(model, sinceId?, pageSize?)` — Stream all changes
186
180
 
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
- );
181
+ Async iterator for processing all changes with automatic pagination.
191
182
 
192
- // ✅ TypeScript knows these fields exist:
193
- console.log(data[0].pavadinimas); // string
194
- console.log(data[0].sav_kodas); // number
195
- ```
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
+ ```
196
191
 
197
192
  ---
198
193
 
199
- ## Pagination
200
-
201
- The API uses cursor-based pagination with `_page.next` tokens.
202
-
203
- ### Automatic Pagination with `stream()`
194
+ ### QueryBuilder
204
195
 
205
- Use `stream()` to iterate through all records automatically:
196
+ Build queries with a fluent API.
206
197
 
207
198
  ```typescript
208
- const query = new QueryBuilder().limit(100); // 100 items per page
199
+ import { QueryBuilder } from "lt-open-data-sdk";
209
200
 
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
- }
201
+ const query = new QueryBuilder()
202
+ .select("_id", "pavadinimas", "gyventoju_skaicius")
203
+ .filter((f) => f.field("gyventoju_skaicius").gt(10000))
204
+ .sort("pavadinimas")
205
+ .limit(50);
206
+
207
+ const data = await client.getAll("datasets/gov/example/Model", query);
214
208
  ```
215
209
 
216
- **How it works:**
210
+ #### Filter Operators
217
211
 
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
212
+ | Method | Query | Description |
213
+ | ------------------ | ------------------------- | --------------------- |
214
+ | `.eq(value)` | `field=value` | Equals |
215
+ | `.ne(value)` | `field!=value` | Not equals |
216
+ | `.lt(value)` | `field<value` | Less than |
217
+ | `.le(value)` | `field<=value` | Less than or equal |
218
+ | `.gt(value)` | `field>value` | Greater than |
219
+ | `.ge(value)` | `field>=value` | Greater than or equal |
220
+ | `.contains(str)` | `field.contains("str")` | Contains substring |
221
+ | `.startswith(str)` | `field.startswith("str")` | Starts with |
222
+ | `.endswith(str)` | `field.endswith("str")` | Ends with ⚠️ |
223
+ | `.in([...])` | `field.in(a,b,c)` | Value in list ⚠️ |
224
+ | `.notin([...])` | `field.notin(a,b,c)` | Value not in list ⚠️ |
222
225
 
223
- ### Manual Pagination with `getAllRaw()`
226
+ > ⚠️ `endswith`, `in`, `notin` are in the Spinta spec but not yet supported by the live API.
224
227
 
225
- For more control, handle pagination yourself:
228
+ #### Combining Filters
226
229
 
227
230
  ```typescript
228
- let pageToken: string | undefined;
229
-
230
- do {
231
- // Build query with page token
232
- let query = new QueryBuilder().limit(100);
231
+ // AND - both conditions must match
232
+ .filter(f => f.field('a').gt(10).and(f.field('b').lt(100)))
233
+ // Output: a>10&b<100
233
234
 
234
- const response = await client.getAllRaw("datasets/gov/example/City", query);
235
+ // OR - either condition matches
236
+ .filter(f => f.field('status').eq('active').or(f.field('status').eq('pending')))
237
+ // Output: status="active"|status="pending"
235
238
 
236
- // Process this page
237
- for (const item of response._data) {
238
- console.log(item);
239
- }
239
+ // Complex - parentheses added automatically
240
+ .filter(f => f.field('a').gt(10).and(
241
+ f.field('b').eq(1).or(f.field('b').eq(2))
242
+ ))
243
+ // Output: a>10&(b=1|b=2)
244
+ ```
240
245
 
241
- // Get next page token
242
- pageToken = response._page?.next;
246
+ #### Sorting
243
247
 
244
- // Note: You need to add page(token) to next request manually
245
- // This is handled automatically by stream()
246
- } while (pageToken);
248
+ ```typescript
249
+ new QueryBuilder()
250
+ .sort("name") // Ascending
251
+ .sortDesc("created_at"); // Descending
252
+ // Output: ?sort(name,-created_at)
247
253
  ```
248
254
 
249
- > **Tip**: Use `stream()` for most cases. Use `getAllRaw()` when you need access to page metadata or custom page handling.
255
+ ---
256
+
257
+ ## CLI
250
258
 
251
- ## CLI Type Generator
259
+ Generate TypeScript interfaces from live API data.
252
260
 
253
- Generate TypeScript interfaces from live API metadata:
261
+ ### Basic Usage
254
262
 
255
263
  ```bash
256
- # Install globally or use npx
264
+ # Generate types for a dataset (prints to stdout)
257
265
  npx lt-gen datasets/gov/rc/ar/savivaldybe
258
266
 
259
- # Save to file
267
+ # Save to a file
260
268
  npx lt-gen datasets/gov/rc/ar/savivaldybe -o ./types/savivaldybe.d.ts
261
269
 
262
- # Custom API URL
270
+ # Use a different API endpoint
263
271
  npx lt-gen datasets/gov/rc/ar/savivaldybe --base-url https://get-test.data.gov.lt
264
272
  ```
265
273
 
274
+ ### Options
275
+
276
+ | Option | Description |
277
+ | --------------------- | -------------------- |
278
+ | `-o, --output <file>` | Write output to file |
279
+ | `--base-url <url>` | Custom API base URL |
280
+ | `-h, --help` | Show help |
281
+
266
282
  ### Generated Output
267
283
 
268
284
  ```typescript
285
+ // Generated from datasets/gov/rc/ar/savivaldybe/Savivaldybe
286
+
269
287
  export interface GovRcArSavivaldybe_Savivaldybe {
270
288
  _id: string;
271
289
  _type: string;
272
290
  _revision?: string;
273
291
  sav_kodas?: number;
274
292
  pavadinimas?: string;
275
- apskritis?: string | { _id: string }; // ref type
276
- sav_nuo?: string; // date
293
+ apskritis?: string | { _id: string };
294
+ sav_nuo?: string;
277
295
  }
278
296
 
279
297
  export interface ModelMap {
@@ -281,30 +299,22 @@ export interface ModelMap {
281
299
  }
282
300
  ```
283
301
 
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:
302
+ ### Using Generated Types
291
303
 
292
304
  ```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
- ```
305
+ import { SpintaClient } from "lt-open-data-sdk";
306
+ import type { GovRcArSavivaldybe_Savivaldybe } from "./types/savivaldybe";
300
307
 
301
- The SDK handles:
308
+ const client = new SpintaClient();
302
309
 
303
- - OAuth client credentials flow
304
- - Automatic token caching
305
- - Token refresh before expiry (5-minute buffer)
310
+ // Full autocomplete on fields!
311
+ const data = await client.getAll<GovRcArSavivaldybe_Savivaldybe>(
312
+ "datasets/gov/rc/ar/savivaldybe/Savivaldybe"
313
+ );
306
314
 
307
- > ⚠️ **Note**: Authentication has been implemented but not tested against a live auth server.
315
+ console.log(data[0].pavadinimas); // TypeScript knows this is string
316
+ console.log(data[0].sav_kodas); // TypeScript knows this is number
317
+ ```
308
318
 
309
319
  ---
310
320
 
@@ -322,43 +332,38 @@ try {
322
332
  const data = await client.getOne("datasets/example", "invalid-id");
323
333
  } catch (error) {
324
334
  if (error instanceof NotFoundError) {
325
- console.log("Not found:", error.message);
326
- } else if (error instanceof AuthenticationError) {
327
- console.log("Auth failed:", error.status);
335
+ console.log("Record not found");
328
336
  } else if (error instanceof ValidationError) {
329
- console.log("Bad request:", error.body);
337
+ console.log("Invalid query:", error.message);
330
338
  }
331
339
  }
332
340
  ```
333
341
 
334
342
  ---
335
343
 
336
- ## API Reference
344
+ ## Authentication
337
345
 
338
- ### Exports
346
+ For write operations or private datasets, provide OAuth credentials:
339
347
 
340
348
  ```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";
349
+ const client = new SpintaClient({
350
+ clientId: "your-client-id",
351
+ clientSecret: "your-client-secret",
352
+ });
360
353
  ```
361
354
 
355
+ The SDK handles token caching and automatic refresh.
356
+
357
+ > ⚠️ Authentication is implemented but untested against the live auth server.
358
+
359
+ ---
360
+
361
+ ## Known Limitations
362
+
363
+ - **Boolean filtering** may not work on some datasets due to inconsistent data formats in the source
364
+ - **`in()`, `notin()`, `endswith()`** operators are implemented but not yet supported by the live API
365
+ - **Type inference** is based on data sampling, not schema (schema endpoints require auth)
366
+
362
367
  ---
363
368
 
364
369
  ## 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":"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"}
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 } 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,65 @@ 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>;
151
210
  }
152
211
  /** Discovered model from namespace traversal */
153
212
  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,EAEZ,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;CAmBnD;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,96 @@ 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
+ }
261
352
  }
262
353
  //# 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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"}
@@ -93,4 +93,30 @@ 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
+ }
96
122
  //# 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.0",
4
4
  "description": "TypeScript SDK for the Lithuanian Open Data platform (data.gov.lt)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",