rowpipe 1.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 (225) hide show
  1. package/README.md +401 -0
  2. package/benchmarks/memory-bench.ts +109 -0
  3. package/dist/analytics/reduce.d.ts +33 -0
  4. package/dist/analytics/reduce.d.ts.map +1 -0
  5. package/dist/analytics/reduce.js +318 -0
  6. package/dist/analytics/reduce.js.map +1 -0
  7. package/dist/analytics/schema-inference.d.ts +31 -0
  8. package/dist/analytics/schema-inference.d.ts.map +1 -0
  9. package/dist/analytics/schema-inference.js +166 -0
  10. package/dist/analytics/schema-inference.js.map +1 -0
  11. package/dist/analytics/semantic-types.d.ts +6 -0
  12. package/dist/analytics/semantic-types.d.ts.map +1 -0
  13. package/dist/analytics/semantic-types.js +40 -0
  14. package/dist/analytics/semantic-types.js.map +1 -0
  15. package/dist/analytics/stats.d.ts +102 -0
  16. package/dist/analytics/stats.d.ts.map +1 -0
  17. package/dist/analytics/stats.js +307 -0
  18. package/dist/analytics/stats.js.map +1 -0
  19. package/dist/analytics/validator.d.ts +32 -0
  20. package/dist/analytics/validator.d.ts.map +1 -0
  21. package/dist/analytics/validator.js +96 -0
  22. package/dist/analytics/validator.js.map +1 -0
  23. package/dist/cli/commands/cast.d.ts +13 -0
  24. package/dist/cli/commands/cast.d.ts.map +1 -0
  25. package/dist/cli/commands/cast.js +39 -0
  26. package/dist/cli/commands/cast.js.map +1 -0
  27. package/dist/cli/commands/convert.d.ts +15 -0
  28. package/dist/cli/commands/convert.d.ts.map +1 -0
  29. package/dist/cli/commands/convert.js +89 -0
  30. package/dist/cli/commands/convert.js.map +1 -0
  31. package/dist/cli/commands/filter.d.ts +11 -0
  32. package/dist/cli/commands/filter.d.ts.map +1 -0
  33. package/dist/cli/commands/filter.js +38 -0
  34. package/dist/cli/commands/filter.js.map +1 -0
  35. package/dist/cli/commands/inspect.d.ts +10 -0
  36. package/dist/cli/commands/inspect.d.ts.map +1 -0
  37. package/dist/cli/commands/inspect.js +134 -0
  38. package/dist/cli/commands/inspect.js.map +1 -0
  39. package/dist/cli/commands/map.d.ts +11 -0
  40. package/dist/cli/commands/map.d.ts.map +1 -0
  41. package/dist/cli/commands/map.js +43 -0
  42. package/dist/cli/commands/map.js.map +1 -0
  43. package/dist/cli/commands/reduce.d.ts +12 -0
  44. package/dist/cli/commands/reduce.d.ts.map +1 -0
  45. package/dist/cli/commands/reduce.js +49 -0
  46. package/dist/cli/commands/reduce.js.map +1 -0
  47. package/dist/cli/commands/rename.d.ts +11 -0
  48. package/dist/cli/commands/rename.d.ts.map +1 -0
  49. package/dist/cli/commands/rename.js +39 -0
  50. package/dist/cli/commands/rename.js.map +1 -0
  51. package/dist/cli/commands/sample.d.ts +13 -0
  52. package/dist/cli/commands/sample.d.ts.map +1 -0
  53. package/dist/cli/commands/sample.js +40 -0
  54. package/dist/cli/commands/sample.js.map +1 -0
  55. package/dist/cli/commands/schema.d.ts +13 -0
  56. package/dist/cli/commands/schema.d.ts.map +1 -0
  57. package/dist/cli/commands/schema.js +57 -0
  58. package/dist/cli/commands/schema.js.map +1 -0
  59. package/dist/cli/commands/select.d.ts +11 -0
  60. package/dist/cli/commands/select.d.ts.map +1 -0
  61. package/dist/cli/commands/select.js +39 -0
  62. package/dist/cli/commands/select.js.map +1 -0
  63. package/dist/cli/commands/stats.d.ts +15 -0
  64. package/dist/cli/commands/stats.d.ts.map +1 -0
  65. package/dist/cli/commands/stats.js +75 -0
  66. package/dist/cli/commands/stats.js.map +1 -0
  67. package/dist/cli/commands/validate.d.ts +12 -0
  68. package/dist/cli/commands/validate.d.ts.map +1 -0
  69. package/dist/cli/commands/validate.js +86 -0
  70. package/dist/cli/commands/validate.js.map +1 -0
  71. package/dist/cli/index.d.ts +3 -0
  72. package/dist/cli/index.d.ts.map +1 -0
  73. package/dist/cli/index.js +262 -0
  74. package/dist/cli/index.js.map +1 -0
  75. package/dist/core/batch.d.ts +15 -0
  76. package/dist/core/batch.d.ts.map +1 -0
  77. package/dist/core/batch.js +67 -0
  78. package/dist/core/batch.js.map +1 -0
  79. package/dist/core/errors.d.ts +35 -0
  80. package/dist/core/errors.d.ts.map +1 -0
  81. package/dist/core/errors.js +55 -0
  82. package/dist/core/errors.js.map +1 -0
  83. package/dist/core/pipeline.d.ts +40 -0
  84. package/dist/core/pipeline.d.ts.map +1 -0
  85. package/dist/core/pipeline.js +120 -0
  86. package/dist/core/pipeline.js.map +1 -0
  87. package/dist/core/types.d.ts +73 -0
  88. package/dist/core/types.d.ts.map +1 -0
  89. package/dist/core/types.js +2 -0
  90. package/dist/core/types.js.map +1 -0
  91. package/dist/index.d.ts +22 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +28 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/readers/csv.d.ts +24 -0
  96. package/dist/readers/csv.d.ts.map +1 -0
  97. package/dist/readers/csv.js +251 -0
  98. package/dist/readers/csv.js.map +1 -0
  99. package/dist/readers/index.d.ts +17 -0
  100. package/dist/readers/index.d.ts.map +1 -0
  101. package/dist/readers/index.js +74 -0
  102. package/dist/readers/index.js.map +1 -0
  103. package/dist/readers/json.d.ts +20 -0
  104. package/dist/readers/json.d.ts.map +1 -0
  105. package/dist/readers/json.js +219 -0
  106. package/dist/readers/json.js.map +1 -0
  107. package/dist/readers/jsonl.d.ts +14 -0
  108. package/dist/readers/jsonl.d.ts.map +1 -0
  109. package/dist/readers/jsonl.js +95 -0
  110. package/dist/readers/jsonl.js.map +1 -0
  111. package/dist/readers/xlsx.d.ts +18 -0
  112. package/dist/readers/xlsx.d.ts.map +1 -0
  113. package/dist/readers/xlsx.js +138 -0
  114. package/dist/readers/xlsx.js.map +1 -0
  115. package/dist/transforms/cast.d.ts +21 -0
  116. package/dist/transforms/cast.d.ts.map +1 -0
  117. package/dist/transforms/cast.js +182 -0
  118. package/dist/transforms/cast.js.map +1 -0
  119. package/dist/transforms/expression.d.ts +67 -0
  120. package/dist/transforms/expression.d.ts.map +1 -0
  121. package/dist/transforms/expression.js +943 -0
  122. package/dist/transforms/expression.js.map +1 -0
  123. package/dist/transforms/filter.d.ts +6 -0
  124. package/dist/transforms/filter.d.ts.map +1 -0
  125. package/dist/transforms/filter.js +31 -0
  126. package/dist/transforms/filter.js.map +1 -0
  127. package/dist/transforms/map.d.ts +12 -0
  128. package/dist/transforms/map.d.ts.map +1 -0
  129. package/dist/transforms/map.js +76 -0
  130. package/dist/transforms/map.js.map +1 -0
  131. package/dist/transforms/rename.d.ts +10 -0
  132. package/dist/transforms/rename.d.ts.map +1 -0
  133. package/dist/transforms/rename.js +39 -0
  134. package/dist/transforms/rename.js.map +1 -0
  135. package/dist/transforms/sample.d.ts +10 -0
  136. package/dist/transforms/sample.d.ts.map +1 -0
  137. package/dist/transforms/sample.js +47 -0
  138. package/dist/transforms/sample.js.map +1 -0
  139. package/dist/transforms/select.d.ts +6 -0
  140. package/dist/transforms/select.d.ts.map +1 -0
  141. package/dist/transforms/select.js +63 -0
  142. package/dist/transforms/select.js.map +1 -0
  143. package/dist/utils/compression.d.ts +14 -0
  144. package/dist/utils/compression.d.ts.map +1 -0
  145. package/dist/utils/compression.js +38 -0
  146. package/dist/utils/compression.js.map +1 -0
  147. package/dist/utils/formatting.d.ts +6 -0
  148. package/dist/utils/formatting.d.ts.map +1 -0
  149. package/dist/utils/formatting.js +56 -0
  150. package/dist/utils/formatting.js.map +1 -0
  151. package/dist/utils/progress.d.ts +13 -0
  152. package/dist/utils/progress.d.ts.map +1 -0
  153. package/dist/utils/progress.js +27 -0
  154. package/dist/utils/progress.js.map +1 -0
  155. package/dist/writers/csv.d.ts +18 -0
  156. package/dist/writers/csv.d.ts.map +1 -0
  157. package/dist/writers/csv.js +84 -0
  158. package/dist/writers/csv.js.map +1 -0
  159. package/dist/writers/index.d.ts +17 -0
  160. package/dist/writers/index.d.ts.map +1 -0
  161. package/dist/writers/index.js +73 -0
  162. package/dist/writers/index.js.map +1 -0
  163. package/dist/writers/json.d.ts +12 -0
  164. package/dist/writers/json.d.ts.map +1 -0
  165. package/dist/writers/json.js +42 -0
  166. package/dist/writers/json.js.map +1 -0
  167. package/dist/writers/jsonl.d.ts +12 -0
  168. package/dist/writers/jsonl.d.ts.map +1 -0
  169. package/dist/writers/jsonl.js +41 -0
  170. package/dist/writers/jsonl.js.map +1 -0
  171. package/dist/writers/xlsx.d.ts +13 -0
  172. package/dist/writers/xlsx.d.ts.map +1 -0
  173. package/dist/writers/xlsx.js +65 -0
  174. package/dist/writers/xlsx.js.map +1 -0
  175. package/package.json +44 -0
  176. package/src/analytics/reduce.ts +388 -0
  177. package/src/analytics/schema-inference.ts +217 -0
  178. package/src/analytics/semantic-types.ts +36 -0
  179. package/src/analytics/stats.ts +383 -0
  180. package/src/analytics/validator.ts +134 -0
  181. package/src/cli/commands/cast.ts +60 -0
  182. package/src/cli/commands/convert.ts +128 -0
  183. package/src/cli/commands/filter.ts +58 -0
  184. package/src/cli/commands/inspect.ts +193 -0
  185. package/src/cli/commands/map.ts +66 -0
  186. package/src/cli/commands/reduce.ts +74 -0
  187. package/src/cli/commands/rename.ts +59 -0
  188. package/src/cli/commands/sample.ts +61 -0
  189. package/src/cli/commands/schema.ts +86 -0
  190. package/src/cli/commands/select.ts +59 -0
  191. package/src/cli/commands/stats.ts +100 -0
  192. package/src/cli/commands/validate.ts +123 -0
  193. package/src/cli/index.ts +285 -0
  194. package/src/core/batch.ts +81 -0
  195. package/src/core/errors.ts +81 -0
  196. package/src/core/pipeline.ts +150 -0
  197. package/src/core/types.ts +110 -0
  198. package/src/index.ts +52 -0
  199. package/src/readers/csv.ts +302 -0
  200. package/src/readers/index.ts +88 -0
  201. package/src/readers/json.ts +256 -0
  202. package/src/readers/jsonl.ts +126 -0
  203. package/src/readers/xlsx.ts +182 -0
  204. package/src/transforms/cast.ts +212 -0
  205. package/src/transforms/expression.ts +1114 -0
  206. package/src/transforms/filter.ts +38 -0
  207. package/src/transforms/map.ts +99 -0
  208. package/src/transforms/rename.ts +47 -0
  209. package/src/transforms/sample.ts +57 -0
  210. package/src/transforms/select.ts +64 -0
  211. package/src/utils/compression.ts +43 -0
  212. package/src/utils/formatting.ts +75 -0
  213. package/src/utils/progress.ts +37 -0
  214. package/src/writers/csv.ts +106 -0
  215. package/src/writers/index.ts +87 -0
  216. package/src/writers/json.ts +52 -0
  217. package/src/writers/jsonl.ts +49 -0
  218. package/src/writers/xlsx.ts +87 -0
  219. package/tests/analytics.test.ts +119 -0
  220. package/tests/cli-integration.test.ts +187 -0
  221. package/tests/map-reduce.test.ts +223 -0
  222. package/tests/readers-writers.test.ts +189 -0
  223. package/tests/transforms.test.ts +199 -0
  224. package/tsconfig.json +21 -0
  225. package/vitest.config.ts +9 -0
@@ -0,0 +1,95 @@
1
+ import { createReadStream } from "node:fs";
2
+ import { createInterface } from "node:readline";
3
+ import { ParseError } from "../core/errors.js";
4
+ export class JSONLReader {
5
+ input;
6
+ options;
7
+ constructor(input, options = {}) {
8
+ this.input = input;
9
+ this.options = { ...options };
10
+ if (typeof input === "string") {
11
+ this.options.filePath = input;
12
+ }
13
+ }
14
+ getInputStream() {
15
+ if (typeof this.input === "string") {
16
+ return createReadStream(this.input);
17
+ }
18
+ return this.input;
19
+ }
20
+ async *read(options) {
21
+ const mergedOptions = {
22
+ ...this.options,
23
+ ...options,
24
+ };
25
+ const batchSize = Math.max(1, mergedOptions.batchSize ?? 1000);
26
+ const stream = this.getInputStream();
27
+ const rl = createInterface({
28
+ input: stream,
29
+ crlfDelay: Infinity,
30
+ });
31
+ let lineNumber = 0;
32
+ let rowsInCurrentBatch = [];
33
+ let globalOffset = 0;
34
+ for await (const line of rl) {
35
+ lineNumber++;
36
+ const trimmed = line.trim();
37
+ if (!trimmed)
38
+ continue;
39
+ let parsed;
40
+ try {
41
+ parsed = JSON.parse(trimmed);
42
+ }
43
+ catch (err) {
44
+ throw new ParseError(`Invalid JSON on line ${lineNumber}: ${err.message}`, {
45
+ file: mergedOptions.filePath,
46
+ line: lineNumber,
47
+ row: lineNumber,
48
+ });
49
+ }
50
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
51
+ throw new ParseError(`Expected JSON object on line ${lineNumber}, got ${Array.isArray(parsed) ? "array" : typeof parsed}`, {
52
+ file: mergedOptions.filePath,
53
+ line: lineNumber,
54
+ row: lineNumber,
55
+ });
56
+ }
57
+ rowsInCurrentBatch.push(parsed);
58
+ if (rowsInCurrentBatch.length >= batchSize) {
59
+ yield {
60
+ rows: rowsInCurrentBatch,
61
+ offset: globalOffset,
62
+ };
63
+ globalOffset += rowsInCurrentBatch.length;
64
+ rowsInCurrentBatch = [];
65
+ }
66
+ }
67
+ if (rowsInCurrentBatch.length > 0) {
68
+ yield {
69
+ rows: rowsInCurrentBatch,
70
+ offset: globalOffset,
71
+ };
72
+ }
73
+ }
74
+ async inspect(options) {
75
+ let rowCount = 0;
76
+ let columnNames = [];
77
+ for await (const batch of this.read({ ...options, batchSize: 5000 })) {
78
+ if (columnNames.length === 0 && batch.rows.length > 0 && batch.rows[0]) {
79
+ columnNames = Object.keys(batch.rows[0]);
80
+ }
81
+ rowCount += batch.rows.length;
82
+ }
83
+ return {
84
+ format: "JSONL",
85
+ rowCount,
86
+ columnCount: columnNames.length,
87
+ columns: columnNames.map((name) => ({
88
+ name,
89
+ type: "string",
90
+ nullPercentage: 0,
91
+ })),
92
+ };
93
+ }
94
+ }
95
+ //# sourceMappingURL=jsonl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../src/readers/jsonl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Readable } from "node:stream";
2
+ import type { DataStream, InspectionMetadata, ReaderOptions, TabularReader } from "../core/types.js";
3
+ export interface XLSXReaderOptions extends ReaderOptions {
4
+ sheet?: string | number;
5
+ filePath?: string;
6
+ }
7
+ export declare class XLSXReader implements TabularReader {
8
+ private input;
9
+ private options;
10
+ constructor(input: Readable | string, options?: XLSXReaderOptions);
11
+ getParsedSheets(): Promise<Array<{
12
+ sheet: string;
13
+ data: unknown[][];
14
+ }>>;
15
+ read(options?: ReaderOptions): DataStream;
16
+ inspect(options?: ReaderOptions): Promise<InspectionMetadata>;
17
+ }
18
+ //# sourceMappingURL=xlsx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xlsx.d.ts","sourceRoot":"","sources":["../../src/readers/xlsx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAEV,UAAU,EACV,kBAAkB,EAClB,aAAa,EAGb,aAAa,EACd,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,UAAW,YAAW,aAAa;IAC9C,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,OAAO,CAAoB;gBAEvB,KAAK,EAAE,QAAQ,GAAG,MAAM,EAAE,OAAO,GAAE,iBAAsB;IAQ/D,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAA;KAAE,CAAC,CAAC;IAoBtE,IAAI,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,UAAU;IA+E1C,OAAO,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAoDpE"}
@@ -0,0 +1,138 @@
1
+ import readXlsxFile from "read-excel-file/node";
2
+ import { InvalidArgumentError, ParseError } from "../core/errors.js";
3
+ export class XLSXReader {
4
+ input;
5
+ options;
6
+ constructor(input, options = {}) {
7
+ this.input = input;
8
+ this.options = { ...options };
9
+ if (typeof input === "string") {
10
+ this.options.filePath = input;
11
+ }
12
+ }
13
+ async getParsedSheets() {
14
+ try {
15
+ const result = await readXlsxFile(this.input, { getSheets: true });
16
+ if (Array.isArray(result)) {
17
+ if (result.length > 0 && typeof result[0] === "object" && result[0] !== null && "sheet" in result[0]) {
18
+ return result;
19
+ }
20
+ return [{ sheet: "Sheet1", data: result }];
21
+ }
22
+ return [];
23
+ }
24
+ catch (err) {
25
+ throw new ParseError(`Failed to parse XLSX: ${err.message}`, {
26
+ file: this.options.filePath,
27
+ });
28
+ }
29
+ }
30
+ async *read(options) {
31
+ const mergedOptions = {
32
+ ...this.options,
33
+ ...options,
34
+ };
35
+ const batchSize = Math.max(1, mergedOptions.batchSize ?? 1000);
36
+ const targetSheet = mergedOptions.sheet;
37
+ const sheets = await this.getParsedSheets();
38
+ if (sheets.length === 0) {
39
+ return;
40
+ }
41
+ let selectedSheet;
42
+ if (targetSheet === undefined || targetSheet === null) {
43
+ selectedSheet = sheets[0];
44
+ }
45
+ else if (typeof targetSheet === "number") {
46
+ selectedSheet = sheets[targetSheet - 1];
47
+ }
48
+ else {
49
+ selectedSheet = sheets.find((s) => s.sheet.toLowerCase() === String(targetSheet).toLowerCase());
50
+ }
51
+ if (!selectedSheet) {
52
+ throw new InvalidArgumentError(`Sheet "${targetSheet}" was not found in the workbook. Available sheets: ${sheets.map((s) => s.sheet).join(", ")}`);
53
+ }
54
+ const grid = selectedSheet.data;
55
+ if (grid.length === 0)
56
+ return;
57
+ let headers = null;
58
+ let rowsInCurrentBatch = [];
59
+ let globalOffset = 0;
60
+ for (let r = 0; r < grid.length; r++) {
61
+ const rowCells = grid[r] || [];
62
+ if (rowCells.length === 0 || rowCells.every((c) => c === null || c === undefined || c === "")) {
63
+ continue;
64
+ }
65
+ if (headers === null) {
66
+ headers = rowCells.map((c, i) => {
67
+ const str = c !== null && c !== undefined ? String(c).trim() : "";
68
+ return str.length > 0 ? str : `col_${i + 1}`;
69
+ });
70
+ continue;
71
+ }
72
+ const rowObj = {};
73
+ for (let i = 0; i < headers.length; i++) {
74
+ const key = headers[i] || `col_${i + 1}`;
75
+ const cellVal = rowCells[i];
76
+ rowObj[key] = cellVal !== null && cellVal !== undefined ? cellVal : "";
77
+ }
78
+ rowsInCurrentBatch.push(rowObj);
79
+ if (rowsInCurrentBatch.length >= batchSize) {
80
+ yield {
81
+ rows: rowsInCurrentBatch,
82
+ offset: globalOffset,
83
+ };
84
+ globalOffset += rowsInCurrentBatch.length;
85
+ rowsInCurrentBatch = [];
86
+ }
87
+ }
88
+ if (rowsInCurrentBatch.length > 0) {
89
+ yield {
90
+ rows: rowsInCurrentBatch,
91
+ offset: globalOffset,
92
+ };
93
+ }
94
+ }
95
+ async inspect(options) {
96
+ const sheets = await this.getParsedSheets();
97
+ const targetSheet = options?.sheet ?? this.options.sheet;
98
+ const sheetSummaries = sheets.map((s) => {
99
+ const nonHeaderRows = Math.max(0, s.data.length - 1);
100
+ const headerRow = s.data[0] || [];
101
+ const colHeaders = headerRow.map((c, i) => c !== null && c !== undefined ? String(c).trim() : `col_${i + 1}`);
102
+ return {
103
+ name: s.sheet,
104
+ rowCount: nonHeaderRows,
105
+ columnCount: colHeaders.length,
106
+ columns: colHeaders,
107
+ };
108
+ });
109
+ let selectedSheet = sheets[0];
110
+ if (targetSheet !== undefined && targetSheet !== null) {
111
+ selectedSheet =
112
+ typeof targetSheet === "number"
113
+ ? sheets[targetSheet - 1]
114
+ : sheets.find((s) => s.sheet.toLowerCase() === String(targetSheet).toLowerCase());
115
+ }
116
+ let columns = [];
117
+ let rowCount = 0;
118
+ if (selectedSheet && selectedSheet.data.length > 0) {
119
+ const headerRow = selectedSheet.data[0] || [];
120
+ const colHeaders = headerRow.map((c, i) => c !== null && c !== undefined ? String(c).trim() : `col_${i + 1}`);
121
+ rowCount = Math.max(0, selectedSheet.data.length - 1);
122
+ columns = colHeaders.map((name) => ({
123
+ name,
124
+ type: "string",
125
+ nullPercentage: 0,
126
+ }));
127
+ }
128
+ return {
129
+ format: "XLSX",
130
+ rowCount,
131
+ columnCount: columns.length,
132
+ columns,
133
+ sheetsCount: sheets.length,
134
+ sheets: sheetSummaries,
135
+ };
136
+ }
137
+ }
138
+ //# sourceMappingURL=xlsx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xlsx.js","sourceRoot":"","sources":["../../src/readers/xlsx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { TransformFunction } from "../core/types.js";
2
+ export type CastOnError = "fail" | "null" | "keep" | "skip-row";
3
+ export interface CastOptions {
4
+ onError?: CastOnError;
5
+ }
6
+ /**
7
+ * Casts a single value to the target type.
8
+ */
9
+ export declare function castValue(value: unknown, targetType: string, onError?: CastOnError): {
10
+ value: unknown;
11
+ success: boolean;
12
+ };
13
+ /**
14
+ * Creates a transform that casts specified columns to target types.
15
+ */
16
+ export declare function castColumns(typeSpecs: Record<string, string>, options?: CastOptions): TransformFunction;
17
+ /**
18
+ * Parses command line cast specs like ["age:integer", "revenue:number"].
19
+ */
20
+ export declare function parseCastSpecs(specs: string[]): Record<string, string>;
21
+ //# sourceMappingURL=cast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cast.d.ts","sourceRoot":"","sources":["../../src/transforms/cast.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,WAAoB,GAC5B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAmFtC;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,OAAO,GAAE,WAAgB,GACxB,iBAAiB,CA0FnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAStE"}
@@ -0,0 +1,182 @@
1
+ import { InvalidArgumentError } from "../core/errors.js";
2
+ /**
3
+ * Casts a single value to the target type.
4
+ */
5
+ export function castValue(value, targetType, onError = "null") {
6
+ if (value === null || value === undefined || value === "") {
7
+ return { value: null, success: true };
8
+ }
9
+ const str = String(value).trim();
10
+ const lowerType = targetType.toLowerCase();
11
+ try {
12
+ switch (lowerType) {
13
+ case "string":
14
+ return { value: String(value), success: true };
15
+ case "integer":
16
+ case "int": {
17
+ if (!/^-?\d+$/.test(str)) {
18
+ throw new Error(`Cannot cast "${str}" to integer`);
19
+ }
20
+ const parsedInt = Number.parseInt(str, 10);
21
+ if (Number.isNaN(parsedInt)) {
22
+ throw new Error(`Cannot cast "${str}" to integer`);
23
+ }
24
+ return { value: parsedInt, success: true };
25
+ }
26
+ case "number":
27
+ case "float":
28
+ case "double": {
29
+ const parsedNum = Number.parseFloat(str);
30
+ if (Number.isNaN(parsedNum)) {
31
+ throw new Error(`Cannot cast "${str}" to number`);
32
+ }
33
+ return { value: parsedNum, success: true };
34
+ }
35
+ case "boolean":
36
+ case "bool": {
37
+ const lower = str.toLowerCase();
38
+ if (["true", "1", "yes", "t", "y"].includes(lower)) {
39
+ return { value: true, success: true };
40
+ }
41
+ if (["false", "0", "no", "f", "n"].includes(lower)) {
42
+ return { value: false, success: true };
43
+ }
44
+ throw new Error(`Cannot cast "${str}" to boolean`);
45
+ }
46
+ case "date": {
47
+ const d = new Date(str);
48
+ if (Number.isNaN(d.getTime())) {
49
+ throw new Error(`Cannot cast "${str}" to date`);
50
+ }
51
+ return { value: d.toISOString().split("T")[0], success: true };
52
+ }
53
+ case "datetime": {
54
+ const d = new Date(str);
55
+ if (Number.isNaN(d.getTime())) {
56
+ throw new Error(`Cannot cast "${str}" to datetime`);
57
+ }
58
+ return { value: d.toISOString(), success: true };
59
+ }
60
+ case "json": {
61
+ const parsed = JSON.parse(str);
62
+ return { value: parsed, success: true };
63
+ }
64
+ default:
65
+ throw new Error(`Unknown target type "${targetType}"`);
66
+ }
67
+ }
68
+ catch (err) {
69
+ if (onError === "fail") {
70
+ throw new InvalidArgumentError(`Failed to cast value "${str}" to type "${targetType}": ${err.message}`);
71
+ }
72
+ if (onError === "keep") {
73
+ return { value, success: false };
74
+ }
75
+ // "null" or "skip-row"
76
+ return { value: null, success: false };
77
+ }
78
+ }
79
+ /**
80
+ * Creates a transform that casts specified columns to target types.
81
+ */
82
+ export function castColumns(typeSpecs, options = {}) {
83
+ const onError = options.onError || "null";
84
+ const compiled = Object.entries(typeSpecs).map(([col, targetType]) => {
85
+ const lower = targetType.toLowerCase();
86
+ // Fast-path specialized caster functions
87
+ if (lower === "number" || lower === "float" || lower === "double") {
88
+ return {
89
+ col,
90
+ cast: (val) => {
91
+ if (val === null || val === undefined || val === "")
92
+ return { value: null, success: true };
93
+ const num = typeof val === "number" ? val : Number(val);
94
+ if (!Number.isNaN(num))
95
+ return { value: num, success: true };
96
+ if (onError === "fail")
97
+ throw new InvalidArgumentError(`Cannot cast "${String(val)}" to number`);
98
+ if (onError === "keep")
99
+ return { value: val, success: false };
100
+ return { value: null, success: false };
101
+ },
102
+ };
103
+ }
104
+ if (lower === "integer" || lower === "int") {
105
+ return {
106
+ col,
107
+ cast: (val) => {
108
+ if (val === null || val === undefined || val === "")
109
+ return { value: null, success: true };
110
+ const str = String(val).trim();
111
+ if (!/^-?\d+$/.test(str)) {
112
+ if (onError === "fail")
113
+ throw new InvalidArgumentError(`Cannot cast "${str}" to integer`);
114
+ if (onError === "keep")
115
+ return { value: val, success: false };
116
+ return { value: null, success: false };
117
+ }
118
+ const num = Number.parseInt(str, 10);
119
+ return { value: num, success: true };
120
+ },
121
+ };
122
+ }
123
+ if (lower === "string") {
124
+ return {
125
+ col,
126
+ cast: (val) => ({ value: val !== null && val !== undefined ? String(val) : "", success: true }),
127
+ };
128
+ }
129
+ return {
130
+ col,
131
+ cast: (val) => castValue(val, targetType, onError),
132
+ };
133
+ });
134
+ const compiledLen = compiled.length;
135
+ return function (stream) {
136
+ return (async function* () {
137
+ for await (const batch of stream) {
138
+ const rows = batch.rows;
139
+ const rowCount = rows.length;
140
+ const transformedRows = [];
141
+ for (let i = 0; i < rowCount; i++) {
142
+ const row = rows[i];
143
+ let skipRow = false;
144
+ const newRow = { ...row };
145
+ for (let j = 0; j < compiledLen; j++) {
146
+ const entry = compiled[j];
147
+ const col = entry.col;
148
+ if (col in newRow) {
149
+ const res = entry.cast(newRow[col]);
150
+ if (!res.success && onError === "skip-row") {
151
+ skipRow = true;
152
+ break;
153
+ }
154
+ newRow[col] = res.value;
155
+ }
156
+ }
157
+ if (!skipRow) {
158
+ transformedRows.push(newRow);
159
+ }
160
+ }
161
+ yield {
162
+ rows: transformedRows,
163
+ offset: batch.offset,
164
+ };
165
+ }
166
+ })();
167
+ };
168
+ }
169
+ /**
170
+ * Parses command line cast specs like ["age:integer", "revenue:number"].
171
+ */
172
+ export function parseCastSpecs(specs) {
173
+ const mapping = {};
174
+ for (const spec of specs) {
175
+ const parts = spec.split(":");
176
+ if (parts.length === 2 && parts[0] && parts[1]) {
177
+ mapping[parts[0].trim()] = parts[1].trim();
178
+ }
179
+ }
180
+ return mapping;
181
+ }
182
+ //# sourceMappingURL=cast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cast.js","sourceRoot":"","sources":["../../src/transforms/cast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { Row } from "../core/types.js";
2
+ type TokenType = "NUMBER" | "STRING" | "BOOLEAN" | "NULL" | "IDENTIFIER" | "OP" | "PIPE" | "LPAREN" | "RPAREN" | "COMMA" | "EOF";
3
+ interface Token {
4
+ type: TokenType;
5
+ value: string | number | boolean | null;
6
+ pos: number;
7
+ }
8
+ export declare class Lexer {
9
+ private input;
10
+ private cursor;
11
+ constructor(input: string);
12
+ private isWhitespace;
13
+ private isDigit;
14
+ private isAlpha;
15
+ tokenize(): Token[];
16
+ }
17
+ export type ASTNode = {
18
+ type: "Literal";
19
+ value: unknown;
20
+ } | {
21
+ type: "Identifier";
22
+ name: string;
23
+ } | {
24
+ type: "UnaryOp";
25
+ operator: string;
26
+ argument: ASTNode;
27
+ } | {
28
+ type: "BinaryOp";
29
+ operator: string;
30
+ left: ASTNode;
31
+ right: ASTNode;
32
+ } | {
33
+ type: "CallExpr";
34
+ callee: string;
35
+ args: ASTNode[];
36
+ };
37
+ export declare class Parser {
38
+ private tokens;
39
+ private current;
40
+ constructor(tokens: Token[]);
41
+ private peek;
42
+ private advance;
43
+ private match;
44
+ parse(): ASTNode;
45
+ private parseLogicalOr;
46
+ private parseLogicalAnd;
47
+ private parseEquality;
48
+ private parseRelational;
49
+ private parseAdditive;
50
+ private parseMultiplicative;
51
+ /**
52
+ * Parses pipe expressions e.g. email | trim | lower | startsWith("admin")
53
+ */
54
+ private parsePipe;
55
+ private parseUnary;
56
+ private parsePrimary;
57
+ }
58
+ /**
59
+ * Compiles a filter expression string into an optimized predicate function.
60
+ */
61
+ export declare function compileExpression(expressionStr: string): (row: Row) => boolean;
62
+ /**
63
+ * Compiles an expression string into an optimized value evaluator returning computed result (number, string, etc.).
64
+ */
65
+ export declare function compileValueExpression(expressionStr: string): (row: Row) => unknown;
66
+ export {};
67
+ //# sourceMappingURL=expression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../../src/transforms/expression.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAI5C,KAAK,SAAS,GACV,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,YAAY,GACZ,IAAI,GACJ,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,KAAK,CAAC;AAEV,UAAU,KAAK;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IACxC,GAAG,EAAE,MAAM,CAAC;CACb;AAGD,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAK;gBAEP,KAAK,EAAE,MAAM;IAIzB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,OAAO;IAUf,QAAQ,IAAI,KAAK,EAAE;CAyJpB;AAGD,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC;AAE1D,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,OAAO,CAAK;gBAER,MAAM,EAAE,KAAK,EAAE;IAI3B,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,KAAK;IASb,KAAK,IAAI,OAAO;IAUhB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,OAAO,CAAC,SAAS;IAwCjB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,YAAY;CAqDrB;AAmoBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAc9E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAWnF"}