meadow-integration 1.0.5 → 1.0.7

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.
Files changed (67) hide show
  1. package/.dockerignore +11 -0
  2. package/Docker-Build.sh +2 -0
  3. package/Docker-Compose.sh +2 -0
  4. package/Docker-Push.sh +2 -0
  5. package/Docker-Tag.sh +2 -0
  6. package/Dockerfile +28 -0
  7. package/Dockerfile_LUXURYCode +23 -0
  8. package/README.md +139 -25
  9. package/docker-compose.yml +16 -0
  10. package/docs/README.md +65 -18
  11. package/docs/_cover.md +3 -2
  12. package/docs/_sidebar.md +52 -7
  13. package/docs/_topbar.md +2 -0
  14. package/docs/api/clone-rest-client.md +278 -0
  15. package/docs/api/connection-manager.md +179 -0
  16. package/docs/api/guid-map.md +234 -0
  17. package/docs/api/integration-adapter.md +283 -0
  18. package/docs/api/operation.md +241 -0
  19. package/docs/api/sync-entity-initial.md +227 -0
  20. package/docs/api/sync-entity-ongoing.md +244 -0
  21. package/docs/api/sync.md +213 -0
  22. package/docs/api/tabular-check.md +213 -0
  23. package/docs/api/tabular-transform.md +316 -0
  24. package/docs/architecture.md +423 -0
  25. package/docs/cli/comprehensionarray.md +111 -0
  26. package/docs/cli/comprehensionintersect.md +132 -0
  27. package/docs/cli/csvcheck.md +111 -0
  28. package/docs/cli/csvtransform.md +170 -0
  29. package/docs/cli/data-clone.md +277 -0
  30. package/docs/cli/jsonarraytransform.md +166 -0
  31. package/docs/cli/load-comprehension.md +129 -0
  32. package/docs/cli/objectarraytocsv.md +159 -0
  33. package/docs/cli/overview.md +96 -0
  34. package/docs/cli/serve.md +102 -0
  35. package/docs/cli/tsvtransform.md +144 -0
  36. package/docs/data-clone/configuration.md +357 -0
  37. package/docs/data-clone/connection-manager.md +206 -0
  38. package/docs/data-clone/docker.md +290 -0
  39. package/docs/data-clone/overview.md +173 -0
  40. package/docs/data-clone/sync-modes.md +186 -0
  41. package/docs/implementation-reference.md +311 -0
  42. package/docs/overview.md +156 -0
  43. package/docs/quickstart.md +233 -0
  44. package/docs/rest/comprehension-push.md +209 -0
  45. package/docs/rest/comprehension.md +506 -0
  46. package/docs/rest/csv.md +255 -0
  47. package/docs/rest/entity-generation.md +158 -0
  48. package/docs/rest/json-array.md +243 -0
  49. package/docs/rest/overview.md +120 -0
  50. package/docs/rest/status.md +63 -0
  51. package/docs/rest/tsv.md +241 -0
  52. package/docs/retold-catalog.json +93 -3
  53. package/docs/retold-keyword-index.json +23683 -1901
  54. package/package.json +6 -3
  55. package/scripts/run.sh +18 -0
  56. package/source/Meadow-Integration.js +15 -1
  57. package/source/cli/Default-Meadow-Integration-Configuration.json +37 -2
  58. package/source/cli/Meadow-Integration-CLI-Program.js +4 -1
  59. package/source/cli/commands/Meadow-Integration-Command-DataClone.js +284 -0
  60. package/source/services/clone/Meadow-Service-ConnectionManager.js +251 -0
  61. package/source/services/clone/Meadow-Service-Operation.js +196 -0
  62. package/source/services/clone/Meadow-Service-RestClient.js +364 -0
  63. package/source/services/clone/Meadow-Service-Sync-Entity-Initial.js +502 -0
  64. package/source/services/clone/Meadow-Service-Sync-Entity-Ongoing.js +592 -0
  65. package/source/services/clone/Meadow-Service-Sync.js +154 -0
  66. /package/docs/examples/bookstore/{mapping_books_Author.json → mapping_books_author.json} +0 -0
  67. /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
+ ```
@@ -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
+ ```
@@ -1,5 +1,5 @@
1
1
  {
2
- "Generated": "2026-02-18T03:35:30.874Z",
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",