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 +203 -198
- package/dist/builder/FilterBuilder.d.ts.map +1 -1
- package/dist/builder/FilterBuilder.js +22 -0
- package/dist/builder/FilterBuilder.js.map +1 -1
- package/dist/builder/types.d.ts +15 -3
- package/dist/builder/types.d.ts.map +1 -1
- package/dist/cli/crawler.d.ts.map +1 -1
- package/dist/cli/crawler.js +23 -0
- package/dist/cli/crawler.js.map +1 -1
- package/dist/client/SpintaClient.d.ts +60 -1
- package/dist/client/SpintaClient.d.ts.map +1 -1
- package/dist/client/SpintaClient.js +91 -0
- package/dist/client/SpintaClient.js.map +1 -1
- package/dist/client/types.d.ts +26 -0
- package/dist/client/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
# lt-open-data-sdk
|
|
2
2
|
|
|
3
|
-
TypeScript SDK for
|
|
3
|
+
A TypeScript SDK for accessing **Lithuania's Open Data Portal** ([data.gov.lt](https://data.gov.lt)).
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## What is this?
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
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
|
|
27
|
+
Requires Node.js ≥18.
|
|
19
28
|
|
|
20
|
-
## Quick
|
|
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
|
-
//
|
|
36
|
+
// Find municipalities with code greater than 30
|
|
28
37
|
const query = new QueryBuilder()
|
|
29
|
-
.
|
|
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
|
|
42
|
+
const municipalities = await client.getAll(
|
|
35
43
|
"datasets/gov/rc/ar/savivaldybe/Savivaldybe",
|
|
36
44
|
query
|
|
37
45
|
);
|
|
38
|
-
|
|
46
|
+
|
|
47
|
+
console.log(municipalities);
|
|
39
48
|
```
|
|
40
49
|
|
|
41
50
|
---
|
|
42
51
|
|
|
43
|
-
##
|
|
52
|
+
## API
|
|
44
53
|
|
|
45
|
-
|
|
54
|
+
The SDK provides a `SpintaClient` for making requests and a `QueryBuilder` for constructing queries.
|
|
46
55
|
|
|
47
|
-
|
|
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
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
// Output: a=1|b=2
|
|
61
|
+
const client = new SpintaClient();
|
|
62
|
+
// Connects to https://get.data.gov.lt by default
|
|
82
63
|
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
72
|
+
#### `getAll(model, query?)` — Fetch records
|
|
93
73
|
|
|
94
|
-
|
|
74
|
+
Returns an array of records from a dataset. Use with `QueryBuilder` to filter, sort, and limit.
|
|
95
75
|
|
|
96
|
-
|
|
97
|
-
const
|
|
98
|
-
|
|
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
|
-
|
|
84
|
+
#### `getOne(model, id)` — Fetch by ID
|
|
102
85
|
|
|
103
|
-
|
|
86
|
+
Returns a single record by its UUID.
|
|
104
87
|
|
|
105
88
|
```typescript
|
|
106
|
-
const
|
|
107
|
-
|
|
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
|
-
|
|
95
|
+
#### `getAllRaw(model, query?)` — Fetch with metadata
|
|
111
96
|
|
|
112
|
-
|
|
97
|
+
Returns the full API response including pagination info.
|
|
113
98
|
|
|
114
99
|
```typescript
|
|
115
|
-
const response = await client.getAllRaw("datasets/gov/
|
|
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
|
-
#### `
|
|
104
|
+
#### `count(model, query?)` — Count records
|
|
120
105
|
|
|
121
|
-
|
|
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/
|
|
109
|
+
const total = await client.count("datasets/gov/rc/ar/savivaldybe/Savivaldybe");
|
|
110
|
+
|
|
129
111
|
const filtered = await client.count(
|
|
130
|
-
"datasets/gov/
|
|
131
|
-
new QueryBuilder().filter((f) => f.field("
|
|
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?)`
|
|
117
|
+
#### `stream(model, query?)` — Iterate all records
|
|
118
|
+
|
|
119
|
+
Async iterator that automatically handles pagination.
|
|
136
120
|
|
|
137
121
|
```typescript
|
|
138
|
-
for await (const
|
|
139
|
-
|
|
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
|
-
|
|
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:
|
|
138
|
+
// Returns: [{ _id: "datasets/gov/rc/ar", _type: "ns" }, ...]
|
|
148
139
|
```
|
|
149
140
|
|
|
150
|
-
#### `discoverModels(namespace)`
|
|
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
|
-
|
|
166
|
-
|
|
167
|
-
---
|
|
151
|
+
### Changes API
|
|
168
152
|
|
|
169
|
-
|
|
153
|
+
Track data modifications for incremental sync.
|
|
170
154
|
|
|
171
|
-
|
|
155
|
+
#### `getLatestChange(model)` — Get most recent change
|
|
172
156
|
|
|
173
|
-
|
|
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
|
-
|
|
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
|
-
|
|
168
|
+
Returns changes since a given change ID.
|
|
180
169
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
179
|
+
#### `streamChanges(model, sinceId?, pageSize?)` — Stream all changes
|
|
186
180
|
|
|
187
|
-
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
The API uses cursor-based pagination with `_page.next` tokens.
|
|
202
|
-
|
|
203
|
-
### Automatic Pagination with `stream()`
|
|
194
|
+
### QueryBuilder
|
|
204
195
|
|
|
205
|
-
|
|
196
|
+
Build queries with a fluent API.
|
|
206
197
|
|
|
207
198
|
```typescript
|
|
208
|
-
|
|
199
|
+
import { QueryBuilder } from "lt-open-data-sdk";
|
|
209
200
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
-
|
|
210
|
+
#### Filter Operators
|
|
217
211
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
226
|
+
> ⚠️ `endswith`, `in`, `notin` are in the Spinta spec but not yet supported by the live API.
|
|
224
227
|
|
|
225
|
-
|
|
228
|
+
#### Combining Filters
|
|
226
229
|
|
|
227
230
|
```typescript
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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
|
-
|
|
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
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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
|
-
|
|
242
|
-
pageToken = response._page?.next;
|
|
246
|
+
#### Sorting
|
|
243
247
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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
|
-
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## CLI
|
|
250
258
|
|
|
251
|
-
|
|
259
|
+
Generate TypeScript interfaces from live API data.
|
|
252
260
|
|
|
253
|
-
|
|
261
|
+
### Basic Usage
|
|
254
262
|
|
|
255
263
|
```bash
|
|
256
|
-
#
|
|
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
|
-
#
|
|
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 };
|
|
276
|
-
sav_nuo?: string;
|
|
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
|
-
|
|
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
|
-
|
|
294
|
-
|
|
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
|
-
|
|
308
|
+
const client = new SpintaClient();
|
|
302
309
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
310
|
+
// Full autocomplete on fields!
|
|
311
|
+
const data = await client.getAll<GovRcArSavivaldybe_Savivaldybe>(
|
|
312
|
+
"datasets/gov/rc/ar/savivaldybe/Savivaldybe"
|
|
313
|
+
);
|
|
306
314
|
|
|
307
|
-
|
|
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("
|
|
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("
|
|
337
|
+
console.log("Invalid query:", error.message);
|
|
330
338
|
}
|
|
331
339
|
}
|
|
332
340
|
```
|
|
333
341
|
|
|
334
342
|
---
|
|
335
343
|
|
|
336
|
-
##
|
|
344
|
+
## Authentication
|
|
337
345
|
|
|
338
|
-
|
|
346
|
+
For write operations or private datasets, provide OAuth credentials:
|
|
339
347
|
|
|
340
348
|
```typescript
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
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,
|
|
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;
|
|
1
|
+
{"version":3,"file":"FilterBuilder.js","sourceRoot":"","sources":["../../src/builder/FilterBuilder.ts"],"names":[],"mappings":"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"}
|
package/dist/builder/types.d.ts
CHANGED
|
@@ -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;
|
|
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;
|
|
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"}
|
package/dist/cli/crawler.js
CHANGED
|
@@ -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';
|
package/dist/cli/crawler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crawler.js","sourceRoot":"","sources":["../../src/cli/crawler.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4BH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAoB,EACpB,SAAiB,EACjB,SAAS,GAAG,IAAI;IAEhB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,SAAS,EAAE,CAAC;YACrB,oDAAoD;YACpD,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAOD
|
|
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,
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;
|
|
1
|
+
{"version":3,"file":"SpintaClient.js","sourceRoot":"","sources":["../../src/client/SpintaClient.ts"],"names":[],"mappings":"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"}
|
package/dist/client/types.d.ts
CHANGED
|
@@ -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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"}
|