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 +216 -196
- 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 +80 -1
- package/dist/client/SpintaClient.d.ts.map +1 -1
- package/dist/client/SpintaClient.js +115 -0
- package/dist/client/SpintaClient.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/types.d.ts +44 -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,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
|
|
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
|
-
|
|
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
|
-
###
|
|
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, ... }, ...]
|
|
100
81
|
|
|
101
|
-
|
|
82
|
+
> ⚠️ Returns one page only (default 100 items). Use `stream()` for all records.
|
|
102
83
|
|
|
103
|
-
#### `
|
|
84
|
+
#### `getOne(model, id)` — Fetch by ID
|
|
85
|
+
|
|
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
|
-
|
|
151
|
+
### Changes API
|
|
166
152
|
|
|
167
|
-
|
|
153
|
+
Track data modifications for incremental sync.
|
|
168
154
|
|
|
169
|
-
|
|
155
|
+
#### `getLatestChange(model)` — Get most recent change
|
|
170
156
|
|
|
171
|
-
|
|
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
|
-
|
|
166
|
+
#### `getChanges(model, sinceId?, limit?)` — Fetch changes
|
|
174
167
|
|
|
175
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
181
|
+
Async iterator for processing all changes with automatic pagination.
|
|
186
182
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
207
|
+
---
|
|
202
208
|
|
|
203
|
-
###
|
|
209
|
+
### QueryBuilder
|
|
204
210
|
|
|
205
|
-
|
|
211
|
+
Build queries with a fluent API.
|
|
206
212
|
|
|
207
213
|
```typescript
|
|
208
|
-
|
|
214
|
+
import { QueryBuilder } from "lt-open-data-sdk";
|
|
209
215
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
-
|
|
225
|
+
#### Filter Operators
|
|
217
226
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
241
|
+
> ⚠️ `endswith`, `in`, `notin` are in the Spinta spec but not yet supported by the live API.
|
|
224
242
|
|
|
225
|
-
|
|
243
|
+
#### Combining Filters
|
|
226
244
|
|
|
227
245
|
```typescript
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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
|
-
|
|
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
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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
|
-
|
|
242
|
-
pageToken = response._page?.next;
|
|
261
|
+
#### Sorting
|
|
243
262
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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
|
-
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## CLI
|
|
250
273
|
|
|
251
|
-
|
|
274
|
+
Generate TypeScript interfaces from live API data.
|
|
252
275
|
|
|
253
|
-
|
|
276
|
+
### Basic Usage
|
|
254
277
|
|
|
255
278
|
```bash
|
|
256
|
-
#
|
|
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
|
-
#
|
|
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 };
|
|
276
|
-
sav_nuo?: string;
|
|
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
|
-
|
|
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
|
-
|
|
294
|
-
|
|
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
|
-
|
|
323
|
+
const client = new SpintaClient();
|
|
302
324
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
325
|
+
// Full autocomplete on fields!
|
|
326
|
+
const data = await client.getAll<GovRcArSavivaldybe_Savivaldybe>(
|
|
327
|
+
"datasets/gov/rc/ar/savivaldybe/Savivaldybe"
|
|
328
|
+
);
|
|
306
329
|
|
|
307
|
-
|
|
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("
|
|
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("
|
|
352
|
+
console.log("Invalid query:", error.message);
|
|
330
353
|
}
|
|
331
354
|
}
|
|
332
355
|
```
|
|
333
356
|
|
|
334
357
|
---
|
|
335
358
|
|
|
336
|
-
##
|
|
359
|
+
## Authentication
|
|
337
360
|
|
|
338
|
-
|
|
361
|
+
For write operations or private datasets, provide OAuth credentials:
|
|
339
362
|
|
|
340
363
|
```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";
|
|
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,
|
|
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, 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,
|
|
1
|
+
{"version":3,"file":"SpintaClient.d.ts","sourceRoot":"","sources":["../../src/client/SpintaClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;
|
|
1
|
+
{"version":3,"file":"SpintaClient.js","sourceRoot":"","sources":["../../src/client/SpintaClient.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/client/types.d.ts
CHANGED
|
@@ -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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"}
|