rowpipe 1.0.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 (185) hide show
  1. package/README.md +327 -41
  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 +89 -5
  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 +4 -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 +17 -2
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +19 -2
  85. package/dist/index.js.map +1 -1
  86. package/dist/readers/csv.d.ts.map +1 -1
  87. package/dist/readers/csv.js +59 -27
  88. package/dist/readers/csv.js.map +1 -1
  89. package/dist/readers/index.d.ts +2 -0
  90. package/dist/readers/index.d.ts.map +1 -1
  91. package/dist/readers/index.js +57 -3
  92. package/dist/readers/index.js.map +1 -1
  93. package/dist/readers/json.d.ts.map +1 -1
  94. package/dist/readers/json.js +6 -8
  95. package/dist/readers/json.js.map +1 -1
  96. package/dist/readers/jsonl.d.ts.map +1 -1
  97. package/dist/readers/jsonl.js +5 -7
  98. package/dist/readers/jsonl.js.map +1 -1
  99. package/dist/readers/parquet.d.ts +17 -0
  100. package/dist/readers/parquet.d.ts.map +1 -0
  101. package/dist/readers/parquet.js +146 -0
  102. package/dist/readers/parquet.js.map +1 -0
  103. package/dist/transforms/expression.d.ts.map +1 -1
  104. package/dist/transforms/expression.js +73 -7
  105. package/dist/transforms/expression.js.map +1 -1
  106. package/dist/utils/compression.d.ts +30 -6
  107. package/dist/utils/compression.d.ts.map +1 -1
  108. package/dist/utils/compression.js +95 -18
  109. package/dist/utils/compression.js.map +1 -1
  110. package/dist/writers/csv.d.ts.map +1 -1
  111. package/dist/writers/csv.js +29 -17
  112. package/dist/writers/csv.js.map +1 -1
  113. package/dist/writers/index.d.ts +2 -0
  114. package/dist/writers/index.d.ts.map +1 -1
  115. package/dist/writers/index.js +49 -4
  116. package/dist/writers/index.js.map +1 -1
  117. package/dist/writers/json.d.ts +1 -1
  118. package/dist/writers/json.d.ts.map +1 -1
  119. package/dist/writers/json.js +9 -11
  120. package/dist/writers/json.js.map +1 -1
  121. package/dist/writers/jsonl.d.ts +1 -1
  122. package/dist/writers/jsonl.d.ts.map +1 -1
  123. package/dist/writers/jsonl.js +9 -11
  124. package/dist/writers/jsonl.js.map +1 -1
  125. package/dist/writers/markdown.d.ts +21 -0
  126. package/dist/writers/markdown.d.ts.map +1 -0
  127. package/dist/writers/markdown.js +82 -0
  128. package/dist/writers/markdown.js.map +1 -0
  129. package/dist/writers/parquet.d.ts +19 -0
  130. package/dist/writers/parquet.d.ts.map +1 -0
  131. package/dist/writers/parquet.js +129 -0
  132. package/dist/writers/parquet.js.map +1 -0
  133. package/package.json +16 -3
  134. package/skills/rowpipe/SKILL.md +263 -0
  135. package/benchmarks/memory-bench.ts +0 -109
  136. package/src/analytics/reduce.ts +0 -388
  137. package/src/analytics/schema-inference.ts +0 -217
  138. package/src/analytics/semantic-types.ts +0 -36
  139. package/src/analytics/stats.ts +0 -383
  140. package/src/analytics/validator.ts +0 -134
  141. package/src/cli/commands/cast.ts +0 -60
  142. package/src/cli/commands/convert.ts +0 -128
  143. package/src/cli/commands/filter.ts +0 -58
  144. package/src/cli/commands/inspect.ts +0 -193
  145. package/src/cli/commands/map.ts +0 -66
  146. package/src/cli/commands/reduce.ts +0 -74
  147. package/src/cli/commands/rename.ts +0 -59
  148. package/src/cli/commands/sample.ts +0 -61
  149. package/src/cli/commands/schema.ts +0 -86
  150. package/src/cli/commands/select.ts +0 -59
  151. package/src/cli/commands/stats.ts +0 -100
  152. package/src/cli/commands/validate.ts +0 -123
  153. package/src/cli/index.ts +0 -285
  154. package/src/core/batch.ts +0 -81
  155. package/src/core/errors.ts +0 -81
  156. package/src/core/pipeline.ts +0 -150
  157. package/src/core/types.ts +0 -110
  158. package/src/index.ts +0 -52
  159. package/src/readers/csv.ts +0 -302
  160. package/src/readers/index.ts +0 -88
  161. package/src/readers/json.ts +0 -256
  162. package/src/readers/jsonl.ts +0 -126
  163. package/src/readers/xlsx.ts +0 -182
  164. package/src/transforms/cast.ts +0 -212
  165. package/src/transforms/expression.ts +0 -1114
  166. package/src/transforms/filter.ts +0 -38
  167. package/src/transforms/map.ts +0 -99
  168. package/src/transforms/rename.ts +0 -47
  169. package/src/transforms/sample.ts +0 -57
  170. package/src/transforms/select.ts +0 -64
  171. package/src/utils/compression.ts +0 -43
  172. package/src/utils/formatting.ts +0 -75
  173. package/src/utils/progress.ts +0 -37
  174. package/src/writers/csv.ts +0 -106
  175. package/src/writers/index.ts +0 -87
  176. package/src/writers/json.ts +0 -52
  177. package/src/writers/jsonl.ts +0 -49
  178. package/src/writers/xlsx.ts +0 -87
  179. package/tests/analytics.test.ts +0 -119
  180. package/tests/cli-integration.test.ts +0 -187
  181. package/tests/map-reduce.test.ts +0 -223
  182. package/tests/readers-writers.test.ts +0 -189
  183. package/tests/transforms.test.ts +0 -199
  184. package/tsconfig.json +0 -21
  185. package/vitest.config.ts +0 -9
@@ -1,212 +0,0 @@
1
- import { InvalidArgumentError } from "../core/errors.js";
2
- import type { DataStream, Row, TransformFunction } from "../core/types.js";
3
-
4
- export type CastOnError = "fail" | "null" | "keep" | "skip-row";
5
-
6
- export interface CastOptions {
7
- onError?: CastOnError;
8
- }
9
-
10
- /**
11
- * Casts a single value to the target type.
12
- */
13
- export function castValue(
14
- value: unknown,
15
- targetType: string,
16
- onError: CastOnError = "null"
17
- ): { value: unknown; success: boolean } {
18
- if (value === null || value === undefined || value === "") {
19
- return { value: null, success: true };
20
- }
21
-
22
- const str = String(value).trim();
23
- const lowerType = targetType.toLowerCase();
24
-
25
- try {
26
- switch (lowerType) {
27
- case "string":
28
- return { value: String(value), success: true };
29
-
30
- case "integer":
31
- case "int": {
32
- if (!/^-?\d+$/.test(str)) {
33
- throw new Error(`Cannot cast "${str}" to integer`);
34
- }
35
- const parsedInt = Number.parseInt(str, 10);
36
- if (Number.isNaN(parsedInt)) {
37
- throw new Error(`Cannot cast "${str}" to integer`);
38
- }
39
- return { value: parsedInt, success: true };
40
- }
41
-
42
- case "number":
43
- case "float":
44
- case "double": {
45
- const parsedNum = Number.parseFloat(str);
46
- if (Number.isNaN(parsedNum)) {
47
- throw new Error(`Cannot cast "${str}" to number`);
48
- }
49
- return { value: parsedNum, success: true };
50
- }
51
-
52
- case "boolean":
53
- case "bool": {
54
- const lower = str.toLowerCase();
55
- if (["true", "1", "yes", "t", "y"].includes(lower)) {
56
- return { value: true, success: true };
57
- }
58
- if (["false", "0", "no", "f", "n"].includes(lower)) {
59
- return { value: false, success: true };
60
- }
61
- throw new Error(`Cannot cast "${str}" to boolean`);
62
- }
63
-
64
- case "date": {
65
- const d = new Date(str);
66
- if (Number.isNaN(d.getTime())) {
67
- throw new Error(`Cannot cast "${str}" to date`);
68
- }
69
- return { value: d.toISOString().split("T")[0], success: true };
70
- }
71
-
72
- case "datetime": {
73
- const d = new Date(str);
74
- if (Number.isNaN(d.getTime())) {
75
- throw new Error(`Cannot cast "${str}" to datetime`);
76
- }
77
- return { value: d.toISOString(), success: true };
78
- }
79
-
80
- case "json": {
81
- const parsed = JSON.parse(str);
82
- return { value: parsed, success: true };
83
- }
84
-
85
- default:
86
- throw new Error(`Unknown target type "${targetType}"`);
87
- }
88
- } catch (err) {
89
- if (onError === "fail") {
90
- throw new InvalidArgumentError(
91
- `Failed to cast value "${str}" to type "${targetType}": ${(err as Error).message}`
92
- );
93
- }
94
- if (onError === "keep") {
95
- return { value, success: false };
96
- }
97
- // "null" or "skip-row"
98
- return { value: null, success: false };
99
- }
100
- }
101
-
102
- /**
103
- * Creates a transform that casts specified columns to target types.
104
- */
105
- export function castColumns(
106
- typeSpecs: Record<string, string>,
107
- options: CastOptions = {}
108
- ): TransformFunction {
109
- const onError = options.onError || "null";
110
-
111
- const compiled = Object.entries(typeSpecs).map(([col, targetType]) => {
112
- const lower = targetType.toLowerCase();
113
-
114
- // Fast-path specialized caster functions
115
- if (lower === "number" || lower === "float" || lower === "double") {
116
- return {
117
- col,
118
- cast: (val: unknown) => {
119
- if (val === null || val === undefined || val === "") return { value: null, success: true };
120
- const num = typeof val === "number" ? val : Number(val);
121
- if (!Number.isNaN(num)) return { value: num, success: true };
122
- if (onError === "fail") throw new InvalidArgumentError(`Cannot cast "${String(val)}" to number`);
123
- if (onError === "keep") return { value: val, success: false };
124
- return { value: null, success: false };
125
- },
126
- };
127
- }
128
-
129
- if (lower === "integer" || lower === "int") {
130
- return {
131
- col,
132
- cast: (val: unknown) => {
133
- if (val === null || val === undefined || val === "") return { value: null, success: true };
134
- const str = String(val).trim();
135
- if (!/^-?\d+$/.test(str)) {
136
- if (onError === "fail") throw new InvalidArgumentError(`Cannot cast "${str}" to integer`);
137
- if (onError === "keep") return { value: val, success: false };
138
- return { value: null, success: false };
139
- }
140
- const num = Number.parseInt(str, 10);
141
- return { value: num, success: true };
142
- },
143
- };
144
- }
145
-
146
- if (lower === "string") {
147
- return {
148
- col,
149
- cast: (val: unknown) => ({ value: val !== null && val !== undefined ? String(val) : "", success: true }),
150
- };
151
- }
152
-
153
- return {
154
- col,
155
- cast: (val: unknown) => castValue(val, targetType, onError),
156
- };
157
- });
158
-
159
- const compiledLen = compiled.length;
160
-
161
- return function (stream: DataStream): DataStream {
162
- return (async function* () {
163
- for await (const batch of stream) {
164
- const rows = batch.rows;
165
- const rowCount = rows.length;
166
- const transformedRows: Row[] = [];
167
-
168
- for (let i = 0; i < rowCount; i++) {
169
- const row = rows[i]!;
170
- let skipRow = false;
171
- const newRow: Row = { ...row };
172
-
173
- for (let j = 0; j < compiledLen; j++) {
174
- const entry = compiled[j]!;
175
- const col = entry.col;
176
- if (col in newRow) {
177
- const res = entry.cast(newRow[col]);
178
- if (!res.success && onError === "skip-row") {
179
- skipRow = true;
180
- break;
181
- }
182
- newRow[col] = res.value;
183
- }
184
- }
185
-
186
- if (!skipRow) {
187
- transformedRows.push(newRow);
188
- }
189
- }
190
-
191
- yield {
192
- rows: transformedRows,
193
- offset: batch.offset,
194
- };
195
- }
196
- })();
197
- };
198
- }
199
-
200
- /**
201
- * Parses command line cast specs like ["age:integer", "revenue:number"].
202
- */
203
- export function parseCastSpecs(specs: string[]): Record<string, string> {
204
- const mapping: Record<string, string> = {};
205
- for (const spec of specs) {
206
- const parts = spec.split(":");
207
- if (parts.length === 2 && parts[0] && parts[1]) {
208
- mapping[parts[0].trim()] = parts[1].trim();
209
- }
210
- }
211
- return mapping;
212
- }