meadow-integration 1.0.4 → 1.0.6
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/.dockerignore +11 -0
- package/Docker-Build.sh +2 -0
- package/Docker-Compose.sh +2 -0
- package/Docker-Push.sh +2 -0
- package/Docker-Tag.sh +2 -0
- package/Dockerfile +28 -0
- package/Dockerfile_LUXURYCode +23 -0
- package/README.md +139 -25
- package/docker-compose.yml +16 -0
- package/docs/README.md +65 -18
- package/docs/{cover.md → _cover.md} +3 -2
- package/docs/_sidebar.md +52 -7
- package/docs/_topbar.md +2 -0
- package/docs/api/clone-rest-client.md +278 -0
- package/docs/api/connection-manager.md +179 -0
- package/docs/api/guid-map.md +234 -0
- package/docs/api/integration-adapter.md +283 -0
- package/docs/api/operation.md +241 -0
- package/docs/api/sync-entity-initial.md +227 -0
- package/docs/api/sync-entity-ongoing.md +244 -0
- package/docs/api/sync.md +213 -0
- package/docs/api/tabular-check.md +213 -0
- package/docs/api/tabular-transform.md +316 -0
- package/docs/architecture.md +423 -0
- package/docs/cli/comprehensionarray.md +111 -0
- package/docs/cli/comprehensionintersect.md +132 -0
- package/docs/cli/csvcheck.md +111 -0
- package/docs/cli/csvtransform.md +170 -0
- package/docs/cli/data-clone.md +277 -0
- package/docs/cli/jsonarraytransform.md +166 -0
- package/docs/cli/load-comprehension.md +129 -0
- package/docs/cli/objectarraytocsv.md +159 -0
- package/docs/cli/overview.md +96 -0
- package/docs/cli/serve.md +102 -0
- package/docs/cli/tsvtransform.md +144 -0
- package/docs/data-clone/configuration.md +357 -0
- package/docs/data-clone/connection-manager.md +206 -0
- package/docs/data-clone/docker.md +290 -0
- package/docs/data-clone/overview.md +173 -0
- package/docs/data-clone/sync-modes.md +186 -0
- package/docs/implementation-reference.md +311 -0
- package/docs/overview.md +156 -0
- package/docs/quickstart.md +233 -0
- package/docs/rest/comprehension-push.md +209 -0
- package/docs/rest/comprehension.md +506 -0
- package/docs/rest/csv.md +255 -0
- package/docs/rest/entity-generation.md +158 -0
- package/docs/rest/json-array.md +243 -0
- package/docs/rest/overview.md +120 -0
- package/docs/rest/status.md +63 -0
- package/docs/rest/tsv.md +241 -0
- package/docs/retold-catalog.json +93 -3
- package/docs/retold-keyword-index.json +23683 -1901
- package/package.json +13 -10
- package/scripts/run.sh +18 -0
- package/source/Meadow-Integration.js +15 -1
- package/source/cli/Default-Meadow-Integration-Configuration.json +37 -2
- package/source/cli/Meadow-Integration-CLI-Program.js +4 -1
- package/source/cli/commands/Meadow-Integration-Command-DataClone.js +284 -0
- package/source/services/clone/Meadow-Service-ConnectionManager.js +251 -0
- package/source/services/clone/Meadow-Service-Operation.js +196 -0
- package/source/services/clone/Meadow-Service-RestClient.js +364 -0
- package/source/services/clone/Meadow-Service-Sync-Entity-Initial.js +367 -0
- package/source/services/clone/Meadow-Service-Sync-Entity-Ongoing.js +457 -0
- package/source/services/clone/Meadow-Service-Sync.js +142 -0
- /package/docs/examples/bookstore/{mapping_books_Author.json → mapping_books_author.json} +0 -0
- /package/docs/examples/bookstore/{mapping_books_Book.json → mapping_books_book.json} +0 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Meadow Integration REST API Overview
|
|
2
|
+
|
|
3
|
+
The Meadow Integration REST API server provides HTTP endpoints for data transformation, comprehension operations, and entity generation. It is built on the Orator/Restify service stack.
|
|
4
|
+
|
|
5
|
+
## Starting the Server
|
|
6
|
+
|
|
7
|
+
### Via the CLI
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Start on the default port (8086)
|
|
11
|
+
mdwint serve
|
|
12
|
+
|
|
13
|
+
# Start on a custom port
|
|
14
|
+
mdwint serve --port 9000
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Via Environment Variable
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
MEADOW_INTEGRATION_PORT=9000 mdwint serve
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Programmatically
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
const MeadowIntegrationServer = require('meadow-integration').IntegrationServer;
|
|
27
|
+
|
|
28
|
+
const server = new MeadowIntegrationServer({ APIServerPort: 8086 });
|
|
29
|
+
|
|
30
|
+
server.start((pError) =>
|
|
31
|
+
{
|
|
32
|
+
if (pError)
|
|
33
|
+
{
|
|
34
|
+
console.error('Failed to start server:', pError);
|
|
35
|
+
}
|
|
36
|
+
else
|
|
37
|
+
{
|
|
38
|
+
console.log('Server is running.');
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Base URL
|
|
44
|
+
|
|
45
|
+
All endpoints are versioned under `/1.0/`. When the server runs on the default port, the base URL is:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
http://localhost:8086/1.0/
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Content-Type
|
|
52
|
+
|
|
53
|
+
- **Requests**: All POST endpoints expect `Content-Type: application/json`.
|
|
54
|
+
- **Responses**: All endpoints return `application/json` unless otherwise noted (the `ToCSV` endpoints return `text/csv`).
|
|
55
|
+
|
|
56
|
+
## Available Endpoints
|
|
57
|
+
|
|
58
|
+
| Method | Path | Description |
|
|
59
|
+
|--------|------|-------------|
|
|
60
|
+
| GET | `/1.0/Status` | Server status and endpoint list |
|
|
61
|
+
| POST | `/1.0/CSV/Check` | Analyze a CSV file for statistics |
|
|
62
|
+
| POST | `/1.0/CSV/Transform` | Transform a CSV file into a comprehension |
|
|
63
|
+
| POST | `/1.0/TSV/Check` | Analyze a TSV file for statistics |
|
|
64
|
+
| POST | `/1.0/TSV/Transform` | Transform a TSV file into a comprehension |
|
|
65
|
+
| POST | `/1.0/JSONArray/Transform` | Transform a JSON array file into a comprehension |
|
|
66
|
+
| POST | `/1.0/JSONArray/TransformRecords` | Transform an in-memory JSON array into a comprehension |
|
|
67
|
+
| POST | `/1.0/Comprehension/Intersect` | Merge two comprehension objects (in-memory) |
|
|
68
|
+
| POST | `/1.0/Comprehension/IntersectFiles` | Merge two comprehension files |
|
|
69
|
+
| POST | `/1.0/Comprehension/ToArray` | Convert a comprehension to an array (in-memory) |
|
|
70
|
+
| POST | `/1.0/Comprehension/ToArrayFromFile` | Convert a comprehension file to an array |
|
|
71
|
+
| POST | `/1.0/Comprehension/ToCSV` | Convert a comprehension or array to CSV (in-memory) |
|
|
72
|
+
| POST | `/1.0/Comprehension/ToCSVFromFile` | Convert a comprehension or array file to CSV |
|
|
73
|
+
| POST | `/1.0/Comprehension/Push` | Push a comprehension to Meadow REST APIs (in-memory) |
|
|
74
|
+
| POST | `/1.0/Comprehension/PushFile` | Push a comprehension file to Meadow REST APIs |
|
|
75
|
+
| POST | `/1.0/Entity/FromTabularFolder` | Generate comprehensions from a folder of tabular files |
|
|
76
|
+
|
|
77
|
+
## Status Endpoint
|
|
78
|
+
|
|
79
|
+
A quick way to verify the server is running:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
curl http://localhost:8086/1.0/Status
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
See `status.md` for full details.
|
|
86
|
+
|
|
87
|
+
## Error Handling
|
|
88
|
+
|
|
89
|
+
All endpoints return structured error responses with an `Error` property:
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"Error": "No valid File path provided in request body."
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Common HTTP status codes:
|
|
98
|
+
|
|
99
|
+
| Code | Meaning |
|
|
100
|
+
|------|---------|
|
|
101
|
+
| 200 | Success |
|
|
102
|
+
| 400 | Bad request (missing or invalid parameters) |
|
|
103
|
+
| 404 | File or resource not found |
|
|
104
|
+
| 500 | Internal server error |
|
|
105
|
+
|
|
106
|
+
## File Paths
|
|
107
|
+
|
|
108
|
+
Endpoints that accept file paths (the `File` or `Folder` properties) expect absolute paths on the server filesystem. Relative paths are resolved from the server's working directory.
|
|
109
|
+
|
|
110
|
+
## Detailed Documentation
|
|
111
|
+
|
|
112
|
+
Each endpoint group has its own documentation file:
|
|
113
|
+
|
|
114
|
+
- [Status](status.md)
|
|
115
|
+
- [CSV Operations](csv.md)
|
|
116
|
+
- [TSV Operations](tsv.md)
|
|
117
|
+
- [JSON Array Operations](json-array.md)
|
|
118
|
+
- [Comprehension Operations](comprehension.md)
|
|
119
|
+
- [Comprehension Push](comprehension-push.md)
|
|
120
|
+
- [Entity Generation](entity-generation.md)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# GET /1.0/Status
|
|
2
|
+
|
|
3
|
+
Returns the server status, product version, and a list of all available endpoints.
|
|
4
|
+
|
|
5
|
+
## Request
|
|
6
|
+
|
|
7
|
+
- **Method**: GET
|
|
8
|
+
- **Path**: `/1.0/Status`
|
|
9
|
+
- **Body**: None
|
|
10
|
+
|
|
11
|
+
## Response
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"Product": "Meadow-Integration-Server",
|
|
16
|
+
"Version": "1.0.5",
|
|
17
|
+
"Status": "Running",
|
|
18
|
+
"Endpoints": [
|
|
19
|
+
"POST /1.0/CSV/Check",
|
|
20
|
+
"POST /1.0/CSV/Transform",
|
|
21
|
+
"POST /1.0/TSV/Check",
|
|
22
|
+
"POST /1.0/TSV/Transform",
|
|
23
|
+
"POST /1.0/JSONArray/Transform",
|
|
24
|
+
"POST /1.0/JSONArray/TransformRecords",
|
|
25
|
+
"POST /1.0/Comprehension/Intersect",
|
|
26
|
+
"POST /1.0/Comprehension/IntersectFiles",
|
|
27
|
+
"POST /1.0/Comprehension/ToArray",
|
|
28
|
+
"POST /1.0/Comprehension/ToArrayFromFile",
|
|
29
|
+
"POST /1.0/Comprehension/ToCSV",
|
|
30
|
+
"POST /1.0/Comprehension/ToCSVFromFile",
|
|
31
|
+
"POST /1.0/Comprehension/Push",
|
|
32
|
+
"POST /1.0/Comprehension/PushFile",
|
|
33
|
+
"POST /1.0/Entity/FromTabularFolder"
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## curl Example
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
curl -s http://localhost:8086/1.0/Status
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## JavaScript Example (dependency-free)
|
|
45
|
+
|
|
46
|
+
```javascript
|
|
47
|
+
const http = require('http');
|
|
48
|
+
|
|
49
|
+
const options = {
|
|
50
|
+
hostname: 'localhost',
|
|
51
|
+
port: 8086,
|
|
52
|
+
path: '/1.0/Status',
|
|
53
|
+
method: 'GET'
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const req = http.request(options, (res) => {
|
|
57
|
+
let data = '';
|
|
58
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
59
|
+
res.on('end', () => { console.log(JSON.parse(data)); });
|
|
60
|
+
});
|
|
61
|
+
req.on('error', (err) => { console.error('Request error:', err.message); });
|
|
62
|
+
req.end();
|
|
63
|
+
```
|
package/docs/rest/tsv.md
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# TSV Endpoints
|
|
2
|
+
|
|
3
|
+
The TSV endpoints are functionally identical to the CSV endpoints but operate on tab-separated value files. The parser delimiter is automatically set to `\t`.
|
|
4
|
+
|
|
5
|
+
## POST /1.0/TSV/Check
|
|
6
|
+
|
|
7
|
+
Analyze a TSV file and return statistics about its structure and content.
|
|
8
|
+
|
|
9
|
+
### Request Body
|
|
10
|
+
|
|
11
|
+
| Property | Type | Required | Default | Description |
|
|
12
|
+
|----------|------|----------|---------|-------------|
|
|
13
|
+
| `File` | string | Yes | - | Absolute path to the TSV file to analyze |
|
|
14
|
+
| `Records` | boolean | No | `false` | When `true`, include all parsed records in the response |
|
|
15
|
+
| `QuoteDelimiter` | string | No | `"` | Character used for quoting fields |
|
|
16
|
+
|
|
17
|
+
### Response
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"File": "/data/products.tsv",
|
|
22
|
+
"RowCount": 150,
|
|
23
|
+
"ColumnCount": 4,
|
|
24
|
+
"Columns": ["sku", "name", "price", "category"]
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Error Responses
|
|
29
|
+
|
|
30
|
+
| Status | Condition |
|
|
31
|
+
|--------|-----------|
|
|
32
|
+
| 400 | No valid `File` path provided |
|
|
33
|
+
| 404 | File does not exist |
|
|
34
|
+
| 500 | Error reading the TSV file |
|
|
35
|
+
|
|
36
|
+
### curl Example
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
curl -s -X POST http://localhost:8086/1.0/TSV/Check \
|
|
40
|
+
-H "Content-Type: application/json" \
|
|
41
|
+
-d '{
|
|
42
|
+
"File": "/data/products.tsv"
|
|
43
|
+
}'
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
With records:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
curl -s -X POST http://localhost:8086/1.0/TSV/Check \
|
|
50
|
+
-H "Content-Type: application/json" \
|
|
51
|
+
-d '{
|
|
52
|
+
"File": "/data/products.tsv",
|
|
53
|
+
"Records": true
|
|
54
|
+
}'
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### JavaScript Example (dependency-free)
|
|
58
|
+
|
|
59
|
+
```javascript
|
|
60
|
+
const http = require('http');
|
|
61
|
+
|
|
62
|
+
const requestBody = JSON.stringify({
|
|
63
|
+
File: '/data/products.tsv'
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const options = {
|
|
67
|
+
hostname: 'localhost',
|
|
68
|
+
port: 8086,
|
|
69
|
+
path: '/1.0/TSV/Check',
|
|
70
|
+
method: 'POST',
|
|
71
|
+
headers: {
|
|
72
|
+
'Content-Type': 'application/json',
|
|
73
|
+
'Content-Length': Buffer.byteLength(requestBody)
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const req = http.request(options, (res) => {
|
|
78
|
+
let data = '';
|
|
79
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
80
|
+
res.on('end', () => {
|
|
81
|
+
const stats = JSON.parse(data);
|
|
82
|
+
console.log(`Rows: ${stats.RowCount}, Columns: ${stats.ColumnCount}`);
|
|
83
|
+
console.log('Column names:', stats.Columns);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
req.on('error', (err) => { console.error('Request error:', err.message); });
|
|
87
|
+
req.write(requestBody);
|
|
88
|
+
req.end();
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## POST /1.0/TSV/Transform
|
|
94
|
+
|
|
95
|
+
Transform a TSV file into a comprehension object.
|
|
96
|
+
|
|
97
|
+
### Request Body
|
|
98
|
+
|
|
99
|
+
| Property | Type | Required | Default | Description |
|
|
100
|
+
|----------|------|----------|---------|-------------|
|
|
101
|
+
| `File` | string | Yes | - | Absolute path to the TSV file to transform |
|
|
102
|
+
| `Entity` | string | No | Derived from filename | Entity name for the comprehension |
|
|
103
|
+
| `GUIDName` | string | No | `GUID{Entity}` | Name of the GUID column in the output |
|
|
104
|
+
| `GUIDTemplate` | string | No | Auto-generated | Pict template expression for generating GUIDs |
|
|
105
|
+
| `Mappings` | object | No | - | Column-level mapping overrides |
|
|
106
|
+
| `MappingConfiguration` | object | No | - | Full explicit mapping configuration object |
|
|
107
|
+
| `IncomingComprehension` | object | No | `{}` | Existing comprehension to merge new records into |
|
|
108
|
+
| `Extended` | boolean | No | `false` | Return full mapping outcome state |
|
|
109
|
+
| `QuoteDelimiter` | string | No | `"` | Character used for quoting fields |
|
|
110
|
+
|
|
111
|
+
### Response
|
|
112
|
+
|
|
113
|
+
Returns a comprehension object (same structure as CSV/Transform):
|
|
114
|
+
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"Product": {
|
|
118
|
+
"SKU-001": {
|
|
119
|
+
"GUIDProduct": "SKU-001",
|
|
120
|
+
"sku": "SKU-001",
|
|
121
|
+
"name": "Widget",
|
|
122
|
+
"price": "9.99",
|
|
123
|
+
"category": "Hardware"
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
When `Extended` is `true`, returns the full mapping outcome.
|
|
130
|
+
|
|
131
|
+
### Error Responses
|
|
132
|
+
|
|
133
|
+
| Status | Condition |
|
|
134
|
+
|--------|-----------|
|
|
135
|
+
| 400 | No valid `File` path provided |
|
|
136
|
+
| 404 | File does not exist |
|
|
137
|
+
| 500 | Error reading the TSV file |
|
|
138
|
+
|
|
139
|
+
### curl Example
|
|
140
|
+
|
|
141
|
+
Basic transform:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
curl -s -X POST http://localhost:8086/1.0/TSV/Transform \
|
|
145
|
+
-H "Content-Type: application/json" \
|
|
146
|
+
-d '{
|
|
147
|
+
"File": "/data/products.tsv"
|
|
148
|
+
}'
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
With entity name and GUID template:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
curl -s -X POST http://localhost:8086/1.0/TSV/Transform \
|
|
155
|
+
-H "Content-Type: application/json" \
|
|
156
|
+
-d '{
|
|
157
|
+
"File": "/data/products.tsv",
|
|
158
|
+
"Entity": "Product",
|
|
159
|
+
"GUIDTemplate": "{~D:Record.sku~}"
|
|
160
|
+
}'
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### JavaScript Example (dependency-free)
|
|
164
|
+
|
|
165
|
+
```javascript
|
|
166
|
+
const http = require('http');
|
|
167
|
+
|
|
168
|
+
const requestBody = JSON.stringify({
|
|
169
|
+
File: '/data/products.tsv',
|
|
170
|
+
Entity: 'Product',
|
|
171
|
+
GUIDTemplate: '{~D:Record.sku~}'
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
const options = {
|
|
175
|
+
hostname: 'localhost',
|
|
176
|
+
port: 8086,
|
|
177
|
+
path: '/1.0/TSV/Transform',
|
|
178
|
+
method: 'POST',
|
|
179
|
+
headers: {
|
|
180
|
+
'Content-Type': 'application/json',
|
|
181
|
+
'Content-Length': Buffer.byteLength(requestBody)
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
const req = http.request(options, (res) => {
|
|
186
|
+
let data = '';
|
|
187
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
188
|
+
res.on('end', () => {
|
|
189
|
+
const comprehension = JSON.parse(data);
|
|
190
|
+
const entityKeys = Object.keys(comprehension);
|
|
191
|
+
console.log('Entities:', entityKeys);
|
|
192
|
+
entityKeys.forEach((entity) => {
|
|
193
|
+
const recordCount = Object.keys(comprehension[entity]).length;
|
|
194
|
+
console.log(` ${entity}: ${recordCount} records`);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
req.on('error', (err) => { console.error('Request error:', err.message); });
|
|
199
|
+
req.write(requestBody);
|
|
200
|
+
req.end();
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Merging into an Existing Comprehension
|
|
204
|
+
|
|
205
|
+
```javascript
|
|
206
|
+
const http = require('http');
|
|
207
|
+
|
|
208
|
+
const requestBody = JSON.stringify({
|
|
209
|
+
File: '/data/products_update.tsv',
|
|
210
|
+
Entity: 'Product',
|
|
211
|
+
GUIDTemplate: '{~D:Record.sku~}',
|
|
212
|
+
IncomingComprehension: {
|
|
213
|
+
Product: {
|
|
214
|
+
'SKU-001': { GUIDProduct: 'SKU-001', sku: 'SKU-001', name: 'Widget', price: '9.99' }
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
const options = {
|
|
220
|
+
hostname: 'localhost',
|
|
221
|
+
port: 8086,
|
|
222
|
+
path: '/1.0/TSV/Transform',
|
|
223
|
+
method: 'POST',
|
|
224
|
+
headers: {
|
|
225
|
+
'Content-Type': 'application/json',
|
|
226
|
+
'Content-Length': Buffer.byteLength(requestBody)
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
const req = http.request(options, (res) => {
|
|
231
|
+
let data = '';
|
|
232
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
233
|
+
res.on('end', () => {
|
|
234
|
+
const merged = JSON.parse(data);
|
|
235
|
+
console.log('Merged record count:', Object.keys(merged.Product).length);
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
req.on('error', (err) => { console.error('Request error:', err.message); });
|
|
239
|
+
req.write(requestBody);
|
|
240
|
+
req.end();
|
|
241
|
+
```
|
package/docs/retold-catalog.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"Generated": "2026-
|
|
2
|
+
"Generated": "2026-03-04T15:46:38.412Z",
|
|
3
3
|
"GitHubOrg": "stevenvelozo",
|
|
4
4
|
"DefaultBranch": "master",
|
|
5
5
|
"Groups": [
|
|
@@ -25,6 +25,77 @@
|
|
|
25
25
|
"Key": "docs",
|
|
26
26
|
"Description": "",
|
|
27
27
|
"Modules": [
|
|
28
|
+
{
|
|
29
|
+
"Name": "api",
|
|
30
|
+
"Repo": "api",
|
|
31
|
+
"Group": "docs",
|
|
32
|
+
"Branch": "master",
|
|
33
|
+
"HasDocs": true,
|
|
34
|
+
"HasCover": false,
|
|
35
|
+
"Sidebar": [],
|
|
36
|
+
"DocFiles": [
|
|
37
|
+
"api/clone-rest-client.md",
|
|
38
|
+
"api/connection-manager.md",
|
|
39
|
+
"api/guid-map.md",
|
|
40
|
+
"api/integration-adapter.md",
|
|
41
|
+
"api/operation.md",
|
|
42
|
+
"api/sync-entity-initial.md",
|
|
43
|
+
"api/sync-entity-ongoing.md",
|
|
44
|
+
"api/sync.md",
|
|
45
|
+
"api/tabular-check.md",
|
|
46
|
+
"api/tabular-transform.md"
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"Name": "cli",
|
|
51
|
+
"Repo": "cli",
|
|
52
|
+
"Group": "docs",
|
|
53
|
+
"Branch": "master",
|
|
54
|
+
"HasDocs": true,
|
|
55
|
+
"HasCover": false,
|
|
56
|
+
"Sidebar": [],
|
|
57
|
+
"DocFiles": [
|
|
58
|
+
"cli/comprehensionarray.md",
|
|
59
|
+
"cli/comprehensionintersect.md",
|
|
60
|
+
"cli/csvcheck.md",
|
|
61
|
+
"cli/csvtransform.md",
|
|
62
|
+
"cli/data-clone.md",
|
|
63
|
+
"cli/jsonarraytransform.md",
|
|
64
|
+
"cli/load-comprehension.md",
|
|
65
|
+
"cli/objectarraytocsv.md",
|
|
66
|
+
"cli/overview.md",
|
|
67
|
+
"cli/serve.md",
|
|
68
|
+
"cli/tsvtransform.md"
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"Name": "css",
|
|
73
|
+
"Repo": "css",
|
|
74
|
+
"Group": "docs",
|
|
75
|
+
"Branch": "master",
|
|
76
|
+
"HasDocs": true,
|
|
77
|
+
"HasCover": false,
|
|
78
|
+
"Sidebar": [],
|
|
79
|
+
"DocFiles": [
|
|
80
|
+
"css/docuserve.css"
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"Name": "data-clone",
|
|
85
|
+
"Repo": "data-clone",
|
|
86
|
+
"Group": "docs",
|
|
87
|
+
"Branch": "master",
|
|
88
|
+
"HasDocs": true,
|
|
89
|
+
"HasCover": false,
|
|
90
|
+
"Sidebar": [],
|
|
91
|
+
"DocFiles": [
|
|
92
|
+
"data-clone/configuration.md",
|
|
93
|
+
"data-clone/connection-manager.md",
|
|
94
|
+
"data-clone/docker.md",
|
|
95
|
+
"data-clone/overview.md",
|
|
96
|
+
"data-clone/sync-modes.md"
|
|
97
|
+
]
|
|
98
|
+
},
|
|
28
99
|
{
|
|
29
100
|
"Name": "examples",
|
|
30
101
|
"Repo": "examples",
|
|
@@ -37,9 +108,9 @@
|
|
|
37
108
|
"examples/bookstore/.gitignore",
|
|
38
109
|
"examples/bookstore/BookData.md",
|
|
39
110
|
"examples/bookstore/Generate_Bookstore_Comprehension.sh",
|
|
40
|
-
"examples/bookstore/mapping_books_Author.json",
|
|
41
|
-
"examples/bookstore/mapping_books_Book.json",
|
|
42
111
|
"examples/bookstore/mapping_books_BookAuthorJoin.json",
|
|
112
|
+
"examples/bookstore/mapping_books_author.json",
|
|
113
|
+
"examples/bookstore/mapping_books_book.json",
|
|
43
114
|
"examples/data/books.csv",
|
|
44
115
|
"examples/data/seattle_neighborhoods/Seattle_Data_Information.md",
|
|
45
116
|
"examples/data/seattle_neighborhoods/housing_characteristics_Neighborhoods.csv",
|
|
@@ -50,6 +121,25 @@
|
|
|
50
121
|
"examples/multi_set_integration/part_1_getting_data.md"
|
|
51
122
|
]
|
|
52
123
|
},
|
|
124
|
+
{
|
|
125
|
+
"Name": "rest",
|
|
126
|
+
"Repo": "rest",
|
|
127
|
+
"Group": "docs",
|
|
128
|
+
"Branch": "master",
|
|
129
|
+
"HasDocs": true,
|
|
130
|
+
"HasCover": false,
|
|
131
|
+
"Sidebar": [],
|
|
132
|
+
"DocFiles": [
|
|
133
|
+
"rest/comprehension-push.md",
|
|
134
|
+
"rest/comprehension.md",
|
|
135
|
+
"rest/csv.md",
|
|
136
|
+
"rest/entity-generation.md",
|
|
137
|
+
"rest/json-array.md",
|
|
138
|
+
"rest/overview.md",
|
|
139
|
+
"rest/status.md",
|
|
140
|
+
"rest/tsv.md"
|
|
141
|
+
]
|
|
142
|
+
},
|
|
53
143
|
{
|
|
54
144
|
"Name": "vocabulary",
|
|
55
145
|
"Repo": "vocabulary",
|