@jackchuka/gql-ingest 2.2.1 → 3.0.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.
Files changed (60) hide show
  1. package/README.md +181 -1
  2. package/dist/cli/index.d.ts +2 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +237 -0
  5. package/dist/index.d.ts +16 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +1379 -0
  8. package/dist/index.js.map +7 -0
  9. package/dist/{config.d.ts → lib/config.d.ts} +3 -2
  10. package/dist/lib/config.d.ts.map +1 -0
  11. package/dist/lib/dependency-resolver.d.ts.map +1 -0
  12. package/dist/lib/events.d.ts +167 -0
  13. package/dist/lib/events.d.ts.map +1 -0
  14. package/dist/lib/gql-ingest.d.ts +155 -0
  15. package/dist/lib/gql-ingest.d.ts.map +1 -0
  16. package/dist/{graphql-client.d.ts → lib/graphql-client.d.ts} +8 -4
  17. package/dist/lib/graphql-client.d.ts.map +1 -0
  18. package/dist/lib/index.d.ts +8 -0
  19. package/dist/lib/index.d.ts.map +1 -0
  20. package/dist/lib/logger.d.ts +27 -0
  21. package/dist/lib/logger.d.ts.map +1 -0
  22. package/dist/lib/mapper.d.ts +49 -0
  23. package/dist/lib/mapper.d.ts.map +1 -0
  24. package/dist/{metrics.d.ts → lib/metrics.d.ts} +22 -8
  25. package/dist/lib/metrics.d.ts.map +1 -0
  26. package/dist/readers/csv.d.ts +0 -4
  27. package/dist/readers/csv.d.ts.map +1 -1
  28. package/dist/readers/index.d.ts +1 -1
  29. package/dist/readers/index.d.ts.map +1 -1
  30. package/package.json +17 -7
  31. package/dist/cli.d.ts +0 -2
  32. package/dist/cli.d.ts.map +0 -1
  33. package/dist/cli.js +0 -237
  34. package/dist/config.d.ts.map +0 -1
  35. package/dist/config.test.d.ts +0 -2
  36. package/dist/config.test.d.ts.map +0 -1
  37. package/dist/dependency-resolver.d.ts.map +0 -1
  38. package/dist/dependency-resolver.test.d.ts +0 -2
  39. package/dist/dependency-resolver.test.d.ts.map +0 -1
  40. package/dist/graphql-client.d.ts.map +0 -1
  41. package/dist/graphql-client.test.d.ts +0 -2
  42. package/dist/graphql-client.test.d.ts.map +0 -1
  43. package/dist/mapper.d.ts +0 -31
  44. package/dist/mapper.d.ts.map +0 -1
  45. package/dist/mapper.test.d.ts +0 -2
  46. package/dist/mapper.test.d.ts.map +0 -1
  47. package/dist/metrics.d.ts.map +0 -1
  48. package/dist/metrics.test.d.ts +0 -2
  49. package/dist/metrics.test.d.ts.map +0 -1
  50. package/dist/readers/csv.test.d.ts +0 -2
  51. package/dist/readers/csv.test.d.ts.map +0 -1
  52. package/dist/readers/data-reader.test.d.ts +0 -2
  53. package/dist/readers/data-reader.test.d.ts.map +0 -1
  54. package/dist/readers/json.test.d.ts +0 -2
  55. package/dist/readers/json.test.d.ts.map +0 -1
  56. package/dist/readers/jsonl.test.d.ts +0 -2
  57. package/dist/readers/jsonl.test.d.ts.map +0 -1
  58. package/dist/readers/yaml.test.d.ts +0 -2
  59. package/dist/readers/yaml.test.d.ts.map +0 -1
  60. /package/dist/{dependency-resolver.d.ts → lib/dependency-resolver.d.ts} +0 -0
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![npm version](https://badge.fury.io/js/%40jackchuka%2Fgql-ingest.svg)](https://badge.fury.io/js/%40jackchuka%2Fgql-ingest)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
5
 
6
- A TypeScript CLI tool that reads data from multiple formats (CSV, JSON, YAML, JSONL) and ingests it into GraphQL APIs through configurable mutations.
6
+ A TypeScript library and CLI tool that reads data from multiple formats (CSV, JSON, YAML, JSONL) and ingests it into GraphQL APIs through configurable mutations.
7
7
 
8
8
  ## Features
9
9
 
@@ -16,6 +16,8 @@ A TypeScript CLI tool that reads data from multiple formats (CSV, JSON, YAML, JS
16
16
  - ✅ Entity-level and row-level concurrency control
17
17
  - ✅ **Retry capabilities** with exponential backoff and configurable error handling
18
18
  - ✅ Comprehensive metrics and progress tracking
19
+ - ✅ **Event-based progress monitoring** with real-time callbacks
20
+ - ✅ **Cancellation support** via AbortController pattern
19
21
 
20
22
  ## Installation
21
23
 
@@ -40,6 +42,184 @@ pnpm run build
40
42
 
41
43
  ## Usage
42
44
 
45
+ ### Programmatic API
46
+
47
+ GQL Ingest provides a full programmatic API for integration into your Node.js applications.
48
+
49
+ #### Installation for API Usage
50
+
51
+ ```bash
52
+ npm install @jackchuka/gql-ingest
53
+ ```
54
+
55
+ #### Basic API Usage
56
+
57
+ ```typescript
58
+ import { GQLIngest, createConsoleLogger } from "@jackchuka/gql-ingest";
59
+
60
+ // Initialize the client
61
+ const client = new GQLIngest({
62
+ endpoint: "https://your-graphql-api.com/graphql",
63
+ headers: {
64
+ Authorization: "Bearer YOUR_TOKEN",
65
+ },
66
+ logger: createConsoleLogger(), // Optional: enable console logging
67
+ });
68
+
69
+ // Ingest all data from a configuration
70
+ const result = await client.ingest("./config");
71
+
72
+ // Check if ingestion was successful
73
+ if (result.success) {
74
+ console.log("Ingestion completed successfully");
75
+ console.log("Metrics:", result.metrics);
76
+ } else {
77
+ console.error("Ingestion failed:", result.errors);
78
+ }
79
+ ```
80
+
81
+ #### Processing Specific Entities
82
+
83
+ ```typescript
84
+ // Process only specific entities
85
+ const result = await client.ingestEntities("./config", ["users", "products"]);
86
+
87
+ // Or using the ingest method with options
88
+ const result = await client.ingest("./config", {
89
+ entities: ["users", "products"],
90
+ format: "csv", // Optional: override format detection
91
+ });
92
+ ```
93
+
94
+ #### Advanced API Usage
95
+
96
+ For more control, you can access the underlying components directly:
97
+
98
+ ```typescript
99
+ import {
100
+ GraphQLClientWrapper,
101
+ DataMapper,
102
+ DependencyResolver,
103
+ MetricsCollector,
104
+ loadConfig,
105
+ createConsoleLogger,
106
+ } from "@jackchuka/gql-ingest";
107
+
108
+ // Create your own custom workflow
109
+ const logger = createConsoleLogger();
110
+ const metrics = new MetricsCollector();
111
+ const client = new GraphQLClientWrapper(endpoint, headers, metrics, logger);
112
+ const mapper = new DataMapper(client, basePath, metrics, logger);
113
+
114
+ // Load configuration
115
+ const config = loadConfig("./config");
116
+
117
+ // Process entities with custom logic
118
+ // ... your custom implementation
119
+ ```
120
+
121
+ #### API Methods
122
+
123
+ **GQLIngest Class Methods:**
124
+
125
+ - `constructor(options: GQLIngestOptions)` - Initialize the client
126
+ - `ingest(configPath: string, options?: IngestOptions)` - Ingest data from a configuration
127
+ - `ingestEntities(configPath: string, entities: string[])` - Process specific entities
128
+ - `getMetrics()` - Get current processing metrics
129
+ - `getMetricsSummary()` - Get formatted metrics summary
130
+ - `setLogger(logger: Logger)` - Set custom logger
131
+ - `setHeaders(headers: Record<string, string>)` - Update request headers
132
+ - `cancel(reason?: string)` - Cancel in-progress ingestion
133
+ - `processing` - Property indicating if ingestion is in progress
134
+
135
+ #### Event-Based Progress Monitoring
136
+
137
+ GQLIngest extends EventEmitter, enabling real-time progress tracking and cancellation:
138
+
139
+ ```typescript
140
+ import { GQLIngest } from "@jackchuka/gql-ingest";
141
+
142
+ const client = new GQLIngest({
143
+ endpoint: "https://your-api.com/graphql",
144
+ eventOptions: {
145
+ emitRowEvents: true, // Emit events for each row
146
+ emitProgressEvents: true, // Emit periodic progress
147
+ progressInterval: 1000, // Progress every 1 second
148
+ },
149
+ });
150
+
151
+ // Listen for events
152
+ client.on("started", (p) => console.log(`Starting ${p.totalEntities} entities`));
153
+ client.on("progress", (p) => console.log(`${p.progressPercent.toFixed(1)}% complete`));
154
+ client.on("entityStart", (p) => console.log(`Processing ${p.entityName}`));
155
+ client.on("entityComplete", (p) => console.log(`${p.entityName}: ${p.metrics.successfulRows} rows`));
156
+ client.on("rowSuccess", (p) => console.log(`Row ${p.rowIndex} OK`));
157
+ client.on("rowFailure", (p) => console.error(`Row ${p.rowIndex} failed: ${p.error.message}`));
158
+ client.on("finished", (p) => console.log(`Done in ${p.durationMs}ms`));
159
+ client.on("errored", (p) => console.error(`Error: ${p.error.message}`));
160
+ client.on("cancelled", (p) => console.log(`Cancelled: ${p.reason}`));
161
+
162
+ // Handle graceful shutdown
163
+ process.on("SIGINT", () => client.cancel("User interrupted"));
164
+
165
+ await client.ingest("./config");
166
+ ```
167
+
168
+ **Available Events:**
169
+
170
+ | Event | When Emitted | Key Payload Fields |
171
+ | ---------------- | ------------------------ | ------------------------------------------------- |
172
+ | `started` | Ingestion begins | `configPath`, `entityNames`, `totalWaves` |
173
+ | `progress` | Periodic interval | `progressPercent`, `successfulRows`, `failedRows` |
174
+ | `entityStart` | Entity processing begins | `entityName`, `totalRows`, `waveIndex` |
175
+ | `entityComplete` | Entity processing ends | `entityName`, `metrics`, `success` |
176
+ | `rowSuccess` | Row mutation succeeds | `entityName`, `rowIndex`, `row`, `result` |
177
+ | `rowFailure` | Row mutation fails | `entityName`, `rowIndex`, `error` |
178
+ | `cancelled` | Processing cancelled | `reason`, `metrics`, `elapsedMs` |
179
+ | `finished` | Processing completes | `metrics`, `durationMs`, `allSuccessful` |
180
+ | `errored` | Fatal error occurs | `error`, `metrics`, `elapsedMs` |
181
+
182
+ #### Cancellation Support
183
+
184
+ Cancel in-progress ingestion using the `cancel()` method or external AbortController:
185
+
186
+ ```typescript
187
+ // Method 1: Using cancel()
188
+ const client = new GQLIngest({ endpoint: "..." });
189
+ process.on("SIGINT", () => client.cancel("User interrupted"));
190
+ await client.ingest("./config");
191
+
192
+ // Method 2: Using external AbortController
193
+ const controller = new AbortController();
194
+ setTimeout(() => controller.abort("Timeout"), 60000);
195
+ await client.ingest("./config", { signal: controller.signal });
196
+ ```
197
+
198
+ #### TypeScript Support
199
+
200
+ Full TypeScript support is included with comprehensive type definitions:
201
+
202
+ ```typescript
203
+ import type {
204
+ GQLIngestOptions,
205
+ IngestOptions,
206
+ IngestResult,
207
+ ProcessingMetrics,
208
+ EntityMetrics,
209
+ // Event types
210
+ EventOptions,
211
+ StartedEventPayload,
212
+ ProgressEventPayload,
213
+ EntityStartEventPayload,
214
+ EntityCompleteEventPayload,
215
+ RowSuccessEventPayload,
216
+ RowFailureEventPayload,
217
+ CancelledEventPayload,
218
+ FinishedEventPayload,
219
+ ErroredEventPayload,
220
+ } from "@jackchuka/gql-ingest";
221
+ ```
222
+
43
223
  ### CLI Options
44
224
 
45
225
  ```bash
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}