rowpipe 1.1.0 → 1.2.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 (100) hide show
  1. package/README.md +302 -9
  2. package/dist/cli/commands/diff.d.ts +30 -0
  3. package/dist/cli/commands/diff.d.ts.map +1 -0
  4. package/dist/cli/commands/diff.js +143 -0
  5. package/dist/cli/commands/diff.js.map +1 -0
  6. package/dist/cli/commands/files.d.ts +35 -0
  7. package/dist/cli/commands/files.d.ts.map +1 -0
  8. package/dist/cli/commands/files.js +93 -0
  9. package/dist/cli/commands/files.js.map +1 -0
  10. package/dist/cli/index.js +85 -1
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/core/errors.d.ts +23 -0
  13. package/dist/core/errors.d.ts.map +1 -1
  14. package/dist/core/errors.js +38 -0
  15. package/dist/core/errors.js.map +1 -1
  16. package/dist/core/types.d.ts +2 -0
  17. package/dist/core/types.d.ts.map +1 -1
  18. package/dist/diff/comparator.d.ts +17 -0
  19. package/dist/diff/comparator.d.ts.map +1 -0
  20. package/dist/diff/comparator.js +158 -0
  21. package/dist/diff/comparator.js.map +1 -0
  22. package/dist/diff/engine.d.ts +10 -0
  23. package/dist/diff/engine.d.ts.map +1 -0
  24. package/dist/diff/engine.js +333 -0
  25. package/dist/diff/engine.js.map +1 -0
  26. package/dist/diff/hash.d.ts +6 -0
  27. package/dist/diff/hash.d.ts.map +1 -0
  28. package/dist/diff/hash.js +50 -0
  29. package/dist/diff/hash.js.map +1 -0
  30. package/dist/diff/key.d.ts +21 -0
  31. package/dist/diff/key.d.ts.map +1 -0
  32. package/dist/diff/key.js +107 -0
  33. package/dist/diff/key.js.map +1 -0
  34. package/dist/diff/reporter.d.ts +18 -0
  35. package/dist/diff/reporter.d.ts.map +1 -0
  36. package/dist/diff/reporter.js +133 -0
  37. package/dist/diff/reporter.js.map +1 -0
  38. package/dist/diff/schema.d.ts +7 -0
  39. package/dist/diff/schema.d.ts.map +1 -0
  40. package/dist/diff/schema.js +65 -0
  41. package/dist/diff/schema.js.map +1 -0
  42. package/dist/diff/storage/disk-index.d.ts +28 -0
  43. package/dist/diff/storage/disk-index.d.ts.map +1 -0
  44. package/dist/diff/storage/disk-index.js +105 -0
  45. package/dist/diff/storage/disk-index.js.map +1 -0
  46. package/dist/diff/storage/memory-index.d.ts +23 -0
  47. package/dist/diff/storage/memory-index.d.ts.map +1 -0
  48. package/dist/diff/storage/memory-index.js +69 -0
  49. package/dist/diff/storage/memory-index.js.map +1 -0
  50. package/dist/diff/storage/spillable-index.d.ts +30 -0
  51. package/dist/diff/storage/spillable-index.d.ts.map +1 -0
  52. package/dist/diff/storage/spillable-index.js +108 -0
  53. package/dist/diff/storage/spillable-index.js.map +1 -0
  54. package/dist/diff/types.d.ts +127 -0
  55. package/dist/diff/types.d.ts.map +1 -0
  56. package/dist/diff/types.js +2 -0
  57. package/dist/diff/types.js.map +1 -0
  58. package/dist/files/glob.d.ts +21 -0
  59. package/dist/files/glob.d.ts.map +1 -0
  60. package/dist/files/glob.js +132 -0
  61. package/dist/files/glob.js.map +1 -0
  62. package/dist/files/hash.d.ts +10 -0
  63. package/dist/files/hash.d.ts.map +1 -0
  64. package/dist/files/hash.js +67 -0
  65. package/dist/files/hash.js.map +1 -0
  66. package/dist/files/index.d.ts +6 -0
  67. package/dist/files/index.d.ts.map +1 -0
  68. package/dist/files/index.js +6 -0
  69. package/dist/files/index.js.map +1 -0
  70. package/dist/files/mime.d.ts +9 -0
  71. package/dist/files/mime.d.ts.map +1 -0
  72. package/dist/files/mime.js +128 -0
  73. package/dist/files/mime.js.map +1 -0
  74. package/dist/files/reader.d.ts +19 -0
  75. package/dist/files/reader.d.ts.map +1 -0
  76. package/dist/files/reader.js +344 -0
  77. package/dist/files/reader.js.map +1 -0
  78. package/dist/files/types.d.ts +47 -0
  79. package/dist/files/types.d.ts.map +1 -0
  80. package/dist/files/types.js +2 -0
  81. package/dist/files/types.js.map +1 -0
  82. package/dist/index.d.ts +16 -1
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +18 -1
  85. package/dist/index.js.map +1 -1
  86. package/dist/readers/csv.d.ts.map +1 -1
  87. package/dist/readers/csv.js +39 -19
  88. package/dist/readers/csv.js.map +1 -1
  89. package/dist/readers/index.d.ts +1 -0
  90. package/dist/readers/index.d.ts.map +1 -1
  91. package/dist/readers/index.js +28 -0
  92. package/dist/readers/index.js.map +1 -1
  93. package/dist/transforms/expression.d.ts.map +1 -1
  94. package/dist/transforms/expression.js +73 -7
  95. package/dist/transforms/expression.js.map +1 -1
  96. package/dist/writers/csv.d.ts.map +1 -1
  97. package/dist/writers/csv.js +21 -7
  98. package/dist/writers/csv.js.map +1 -1
  99. package/package.json +4 -2
  100. package/skills/rowpipe/SKILL.md +82 -0
@@ -25,6 +25,8 @@ Rowpipe is a high-performance, stream-first command-line toolkit and Node.js lib
25
25
  | **Cast** | `rowpipe cast <file> <col1:type> [--on-error null]` | Stream cast types (`integer`, `number`, `boolean`, `date`) |
26
26
  | **Sample** | `rowpipe sample <file> --rows <n> [--seed <s>]` | Reservoir sampling with bounded memory |
27
27
  | **Validate** | `rowpipe validate <file> --schema <schema.json>` | Validate stream against JSON schema definition |
28
+ | **Diff** | `rowpipe diff <left> <right> --key <cols> [opts]` | Stream compare datasets by key across formats with bounded RAM and disk spilling |
29
+ | **Files** | `rowpipe files <path> [--include <glob>] [opts]` | Stream filesystem directory as tabular records with bounded memory, globs, hashes, and MIME |
28
30
 
29
31
  ---
30
32
 
@@ -138,6 +140,57 @@ cat transactions.csv.gz | \
138
140
  rowpipe convert - --to markdown
139
141
  ```
140
142
 
143
+ ### 7. Dataset Diffing & Change Feeds (`diff`)
144
+ Compare two datasets by key across formats with bounded memory ($O(1)$) and automatic disk spilling:
145
+
146
+ ```bash
147
+ # 1. Basic Keyed Diff
148
+ rowpipe diff yesterday.csv today.csv --key id
149
+
150
+ # 2. Composite Key & Cross-Format (CSV vs Parquet)
151
+ rowpipe diff old.csv new.parquet --key country,user_id
152
+
153
+ # 3. Multi-Sheet Excel Workbook Diff
154
+ rowpipe diff old.xlsx new.xlsx --sheet Users --key id
155
+
156
+ # 4. Filter Columns & String Normalization
157
+ rowpipe diff old.csv new.csv \
158
+ --key id \
159
+ --ignore updated_at,last_seen \
160
+ --trim \
161
+ --ignore-case \
162
+ --epsilon 0.001
163
+
164
+ # 5. Output Modes: Rows, JSONL Patch, and JSON
165
+ rowpipe diff old.csv new.csv --key id --format rows --only changed --limit 50
166
+ rowpipe diff old.csv new.csv --key id --format patch > changes.jsonl
167
+ rowpipe diff old.csv new.csv --key id --json
168
+
169
+ # 6. CI/CD Validation (Fails with exit code 1 if differences found)
170
+ rowpipe diff expected.csv actual.csv --key id --fail-on-diff
171
+ ```
172
+
173
+ ### 8. Filesystem as Streaming Tabular Records (`files`)
174
+ Stream files and directory trees with bounded memory, globs, streaming hashes, and MIME detection:
175
+
176
+ ```bash
177
+ # 1. Stream directory records
178
+ rowpipe files ./src --include "**/*.ts"
179
+
180
+ # 2. Filter large files and select columns via Unix pipe
181
+ rowpipe files ./uploads | rowpipe filter - 'size > 1000000' | rowpipe select - relative_path,size
182
+
183
+ # 3. Stream SHA-256 or fast hashes
184
+ rowpipe files ./assets --hash sha256 --to jsonl
185
+ rowpipe files ./dataset --hash fast
186
+
187
+ # 4. Generate deterministic build snapshot
188
+ rowpipe files snapshot ./dist --hash sha256 --to jsonl > dist.snapshot.jsonl
189
+
190
+ # 5. Direct directory diffing
191
+ rowpipe files diff ./dist-v1 ./dist-v2 --hash sha256
192
+ ```
193
+
141
194
  ---
142
195
 
143
196
  ## 💻 Node.js Library API
@@ -153,9 +206,12 @@ import {
153
206
  ParquetWriter,
154
207
  MarkdownWriter,
155
208
  XLSXReader,
209
+ FileSystemReader,
156
210
  mapRows,
157
211
  filterRows,
158
212
  reduceRows,
213
+ diffRows,
214
+ computeDiff,
159
215
  } from "rowpipe";
160
216
  import { createReadStream, createWriteStream } from "node:fs";
161
217
 
@@ -178,4 +234,30 @@ await createPipeline(reader)
178
234
  ],
179
235
  }))
180
236
  .to(writer);
237
+
238
+ // 2. Stream Filesystem Directory as Tabular Rows
239
+ const fsReader = new FileSystemReader({
240
+ root: "./src",
241
+ include: ["**/*.ts"],
242
+ hash: "sha256",
243
+ mime: true,
244
+ });
245
+
246
+ for await (const batch of fsReader.read()) {
247
+ for (const file of batch.rows) {
248
+ console.log(`${file.relative_path} (${file.size} bytes) - Hash: ${file.hash}`);
249
+ }
250
+ }
251
+
252
+ // 3. Streaming Diff Events
253
+ for await (const event of diffRows({
254
+ leftPath: "old.csv",
255
+ rightPath: "new.parquet",
256
+ keys: ["id"],
257
+ ignore: ["updated_at"],
258
+ })) {
259
+ if (event.type === "changed") {
260
+ console.log(`Row ${JSON.stringify(event.key)} changed:`, event.changes);
261
+ }
262
+ }
181
263
  ```