@atmaticai/agent-tools-core 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.
- package/README.md +742 -0
- package/dist/archive/index.d.mts +1 -0
- package/dist/archive/index.d.ts +1 -0
- package/dist/archive/index.js +90 -0
- package/dist/archive/index.js.map +1 -0
- package/dist/archive/index.mjs +80 -0
- package/dist/archive/index.mjs.map +1 -0
- package/dist/color/index.d.mts +1 -0
- package/dist/color/index.d.ts +1 -0
- package/dist/color/index.js +347 -0
- package/dist/color/index.js.map +1 -0
- package/dist/color/index.mjs +336 -0
- package/dist/color/index.mjs.map +1 -0
- package/dist/crypto/index.d.mts +1 -0
- package/dist/crypto/index.d.ts +1 -0
- package/dist/crypto/index.js +116 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/index.mjs +108 -0
- package/dist/crypto/index.mjs.map +1 -0
- package/dist/csv/index.d.mts +1 -0
- package/dist/csv/index.d.ts +1 -0
- package/dist/csv/index.js +371 -0
- package/dist/csv/index.js.map +1 -0
- package/dist/csv/index.mjs +348 -0
- package/dist/csv/index.mjs.map +1 -0
- package/dist/datetime/index.d.mts +1 -0
- package/dist/datetime/index.d.ts +1 -0
- package/dist/datetime/index.js +234 -0
- package/dist/datetime/index.js.map +1 -0
- package/dist/datetime/index.mjs +224 -0
- package/dist/datetime/index.mjs.map +1 -0
- package/dist/diff/index.d.mts +2 -0
- package/dist/diff/index.d.ts +2 -0
- package/dist/diff/index.js +84 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/index.mjs +78 -0
- package/dist/diff/index.mjs.map +1 -0
- package/dist/excel/index.d.mts +1 -0
- package/dist/excel/index.d.ts +1 -0
- package/dist/excel/index.js +163 -0
- package/dist/excel/index.js.map +1 -0
- package/dist/excel/index.mjs +153 -0
- package/dist/excel/index.mjs.map +1 -0
- package/dist/image/index.d.mts +1 -0
- package/dist/image/index.d.ts +1 -0
- package/dist/image/index.js +123 -0
- package/dist/image/index.js.map +1 -0
- package/dist/image/index.mjs +107 -0
- package/dist/image/index.mjs.map +1 -0
- package/dist/index--vbnYfdE.d.mts +142 -0
- package/dist/index--vbnYfdE.d.ts +142 -0
- package/dist/index-7FZQloN-.d.mts +62 -0
- package/dist/index-7FZQloN-.d.ts +62 -0
- package/dist/index-7XgaTVH5.d.mts +93 -0
- package/dist/index-7XgaTVH5.d.ts +93 -0
- package/dist/index-7bvFmh45.d.mts +87 -0
- package/dist/index-7bvFmh45.d.ts +87 -0
- package/dist/index-BDZcIVCU.d.mts +53 -0
- package/dist/index-BDZcIVCU.d.ts +53 -0
- package/dist/index-BN00EnUU.d.mts +55 -0
- package/dist/index-BN00EnUU.d.ts +55 -0
- package/dist/index-CQ1EukC4.d.mts +59 -0
- package/dist/index-CQ1EukC4.d.ts +59 -0
- package/dist/index-CgRVnFOt.d.mts +91 -0
- package/dist/index-CgRVnFOt.d.ts +91 -0
- package/dist/index-DjBDZzuj.d.mts +54 -0
- package/dist/index-DjBDZzuj.d.ts +54 -0
- package/dist/index-FFrvmr-n.d.mts +50 -0
- package/dist/index-FFrvmr-n.d.ts +50 -0
- package/dist/index-QWC8yIgW.d.mts +106 -0
- package/dist/index-QWC8yIgW.d.ts +106 -0
- package/dist/index-RVqNunxE.d.mts +193 -0
- package/dist/index-RVqNunxE.d.ts +193 -0
- package/dist/index-fJD8SORm.d.mts +61 -0
- package/dist/index-fJD8SORm.d.ts +61 -0
- package/dist/index-pPy_XDQU.d.mts +56 -0
- package/dist/index-pPy_XDQU.d.ts +56 -0
- package/dist/index-rwh9hdD9.d.mts +68 -0
- package/dist/index-rwh9hdD9.d.ts +68 -0
- package/dist/index-uXdkAfea.d.mts +93 -0
- package/dist/index-uXdkAfea.d.ts +93 -0
- package/dist/index.d.mts +17 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +3744 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3694 -0
- package/dist/index.mjs.map +1 -0
- package/dist/json/index.d.mts +1 -0
- package/dist/json/index.d.ts +1 -0
- package/dist/json/index.js +599 -0
- package/dist/json/index.js.map +1 -0
- package/dist/json/index.mjs +552 -0
- package/dist/json/index.mjs.map +1 -0
- package/dist/markdown/index.d.mts +1 -0
- package/dist/markdown/index.d.ts +1 -0
- package/dist/markdown/index.js +151 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/markdown/index.mjs +139 -0
- package/dist/markdown/index.mjs.map +1 -0
- package/dist/math/index.d.mts +1 -0
- package/dist/math/index.d.ts +1 -0
- package/dist/math/index.js +247 -0
- package/dist/math/index.js.map +1 -0
- package/dist/math/index.mjs +240 -0
- package/dist/math/index.mjs.map +1 -0
- package/dist/pdf/index.d.mts +1 -0
- package/dist/pdf/index.d.ts +1 -0
- package/dist/pdf/index.js +546 -0
- package/dist/pdf/index.js.map +1 -0
- package/dist/pdf/index.mjs +518 -0
- package/dist/pdf/index.mjs.map +1 -0
- package/dist/regex/index.d.mts +1 -0
- package/dist/regex/index.d.ts +1 -0
- package/dist/regex/index.js +93 -0
- package/dist/regex/index.js.map +1 -0
- package/dist/regex/index.mjs +88 -0
- package/dist/regex/index.mjs.map +1 -0
- package/dist/settings/index.d.mts +41 -0
- package/dist/settings/index.d.ts +41 -0
- package/dist/settings/index.js +146 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/index.mjs +139 -0
- package/dist/settings/index.mjs.map +1 -0
- package/dist/sql/index.d.mts +1 -0
- package/dist/sql/index.d.ts +1 -0
- package/dist/sql/index.js +146 -0
- package/dist/sql/index.js.map +1 -0
- package/dist/sql/index.mjs +139 -0
- package/dist/sql/index.mjs.map +1 -0
- package/dist/text/index.d.mts +1 -0
- package/dist/text/index.d.ts +1 -0
- package/dist/text/index.js +250 -0
- package/dist/text/index.js.map +1 -0
- package/dist/text/index.mjs +242 -0
- package/dist/text/index.mjs.map +1 -0
- package/dist/xml/index.d.mts +1 -0
- package/dist/xml/index.d.ts +1 -0
- package/dist/xml/index.js +188 -0
- package/dist/xml/index.js.map +1 -0
- package/dist/xml/index.mjs +180 -0
- package/dist/xml/index.mjs.map +1 -0
- package/package.json +150 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import Papa from 'papaparse';
|
|
2
|
+
|
|
3
|
+
// src/csv/parse.ts
|
|
4
|
+
function parse(input, options = {}) {
|
|
5
|
+
const {
|
|
6
|
+
delimiter = ",",
|
|
7
|
+
header = true,
|
|
8
|
+
skipRows = 0,
|
|
9
|
+
trimFields = true,
|
|
10
|
+
dynamicTyping = true
|
|
11
|
+
} = options;
|
|
12
|
+
let processedInput = input;
|
|
13
|
+
if (skipRows > 0) {
|
|
14
|
+
const lines = input.split("\n");
|
|
15
|
+
processedInput = lines.slice(skipRows).join("\n");
|
|
16
|
+
}
|
|
17
|
+
const result = Papa.parse(processedInput, {
|
|
18
|
+
delimiter,
|
|
19
|
+
header,
|
|
20
|
+
skipEmptyLines: true,
|
|
21
|
+
transformHeader: trimFields ? (h) => h.trim() : void 0,
|
|
22
|
+
transform: trimFields ? (v) => v.trim() : void 0,
|
|
23
|
+
dynamicTyping
|
|
24
|
+
});
|
|
25
|
+
const errors = result.errors.map((e) => ({
|
|
26
|
+
row: e.row ?? -1,
|
|
27
|
+
message: e.message
|
|
28
|
+
}));
|
|
29
|
+
const headers = header ? result.meta.fields || [] : Array.from({ length: result.data[0]?.length || 0 }, (_, i) => `col_${i}`);
|
|
30
|
+
const data = header ? result.data : result.data.map((row) => {
|
|
31
|
+
const obj = {};
|
|
32
|
+
headers.forEach((h, i) => {
|
|
33
|
+
obj[h] = row[i];
|
|
34
|
+
});
|
|
35
|
+
return obj;
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
data,
|
|
39
|
+
headers,
|
|
40
|
+
rowCount: data.length,
|
|
41
|
+
errors
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function parseToArray(input, options = {}) {
|
|
45
|
+
const result = parse(input, { ...options, header: false });
|
|
46
|
+
return result.data.map((row) => Object.values(row));
|
|
47
|
+
}
|
|
48
|
+
function detectDelimiter(input) {
|
|
49
|
+
const delimiters = [",", " ", ";", "|"];
|
|
50
|
+
const firstLine = input.split("\n")[0];
|
|
51
|
+
let maxCount = 0;
|
|
52
|
+
let detected = ",";
|
|
53
|
+
for (const d of delimiters) {
|
|
54
|
+
const count = (firstLine.match(new RegExp(`\\${d}`, "g")) || []).length;
|
|
55
|
+
if (count > maxCount) {
|
|
56
|
+
maxCount = count;
|
|
57
|
+
detected = d;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return detected;
|
|
61
|
+
}
|
|
62
|
+
function getHeaders(input, delimiter) {
|
|
63
|
+
const d = delimiter || detectDelimiter(input);
|
|
64
|
+
const firstLine = input.split("\n")[0];
|
|
65
|
+
return Papa.parse(firstLine, { delimiter: d }).data[0];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// src/csv/filter.ts
|
|
69
|
+
function filter(input, filters) {
|
|
70
|
+
const result = parse(input);
|
|
71
|
+
const filteredData = filterData(result.data, filters);
|
|
72
|
+
return toCSV(filteredData, result.headers);
|
|
73
|
+
}
|
|
74
|
+
function filterData(data, filters) {
|
|
75
|
+
return data.filter((row) => {
|
|
76
|
+
return filters.every((f) => matchesFilter(row, f));
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function matchesFilter(row, filter2) {
|
|
80
|
+
const value = row[filter2.column];
|
|
81
|
+
const filterValue = filter2.value;
|
|
82
|
+
switch (filter2.operator) {
|
|
83
|
+
case "eq":
|
|
84
|
+
return value === filterValue;
|
|
85
|
+
case "neq":
|
|
86
|
+
return value !== filterValue;
|
|
87
|
+
case "gt":
|
|
88
|
+
return Number(value) > Number(filterValue);
|
|
89
|
+
case "gte":
|
|
90
|
+
return Number(value) >= Number(filterValue);
|
|
91
|
+
case "lt":
|
|
92
|
+
return Number(value) < Number(filterValue);
|
|
93
|
+
case "lte":
|
|
94
|
+
return Number(value) <= Number(filterValue);
|
|
95
|
+
case "contains":
|
|
96
|
+
return String(value).toLowerCase().includes(String(filterValue).toLowerCase());
|
|
97
|
+
case "startsWith":
|
|
98
|
+
return String(value).toLowerCase().startsWith(String(filterValue).toLowerCase());
|
|
99
|
+
case "endsWith":
|
|
100
|
+
return String(value).toLowerCase().endsWith(String(filterValue).toLowerCase());
|
|
101
|
+
case "matches":
|
|
102
|
+
return new RegExp(String(filterValue), "i").test(String(value));
|
|
103
|
+
case "isNull":
|
|
104
|
+
return value === null || value === void 0 || value === "";
|
|
105
|
+
case "isNotNull":
|
|
106
|
+
return value !== null && value !== void 0 && value !== "";
|
|
107
|
+
default:
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function toCSV(data, headers) {
|
|
112
|
+
const headerRow = headers.map(escapeCSVField).join(",");
|
|
113
|
+
const dataRows = data.map(
|
|
114
|
+
(row) => headers.map((h) => escapeCSVField(row[h])).join(",")
|
|
115
|
+
);
|
|
116
|
+
return [headerRow, ...dataRows].join("\n");
|
|
117
|
+
}
|
|
118
|
+
function escapeCSVField(value) {
|
|
119
|
+
if (value === null || value === void 0) {
|
|
120
|
+
return "";
|
|
121
|
+
}
|
|
122
|
+
const str = String(value);
|
|
123
|
+
if (str.includes(",") || str.includes('"') || str.includes("\n")) {
|
|
124
|
+
return `"${str.replace(/"/g, '""')}"`;
|
|
125
|
+
}
|
|
126
|
+
return str;
|
|
127
|
+
}
|
|
128
|
+
function filterByColumn(input, column, operator, value) {
|
|
129
|
+
return filter(input, [{ column, operator, value }]);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// src/csv/stats.ts
|
|
133
|
+
function getStats(input) {
|
|
134
|
+
const result = parse(input);
|
|
135
|
+
return getStatsFromData(result);
|
|
136
|
+
}
|
|
137
|
+
function getStatsFromData(result) {
|
|
138
|
+
const { data, headers } = result;
|
|
139
|
+
return headers.map((header) => {
|
|
140
|
+
const values = data.map((row) => row[header]);
|
|
141
|
+
return analyzeColumn(header, values);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
function analyzeColumn(name, values) {
|
|
145
|
+
const nonNullValues = values.filter(
|
|
146
|
+
(v) => v !== null && v !== void 0 && v !== ""
|
|
147
|
+
);
|
|
148
|
+
const nullCount = values.length - nonNullValues.length;
|
|
149
|
+
const type = detectType(nonNullValues);
|
|
150
|
+
const stats = {
|
|
151
|
+
name,
|
|
152
|
+
type,
|
|
153
|
+
count: values.length,
|
|
154
|
+
nullCount,
|
|
155
|
+
uniqueCount: new Set(nonNullValues.map(String)).size
|
|
156
|
+
};
|
|
157
|
+
if (type === "number") {
|
|
158
|
+
const numbers = nonNullValues.map(Number).filter((n) => !isNaN(n));
|
|
159
|
+
if (numbers.length > 0) {
|
|
160
|
+
stats.min = Math.min(...numbers);
|
|
161
|
+
stats.max = Math.max(...numbers);
|
|
162
|
+
stats.sum = numbers.reduce((a, b) => a + b, 0);
|
|
163
|
+
stats.mean = stats.sum / numbers.length;
|
|
164
|
+
}
|
|
165
|
+
} else if (type === "string" || type === "date") {
|
|
166
|
+
const sorted = [...nonNullValues].map(String).sort();
|
|
167
|
+
if (sorted.length > 0) {
|
|
168
|
+
stats.min = sorted[0];
|
|
169
|
+
stats.max = sorted[sorted.length - 1];
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
stats.topValues = getTopValues(nonNullValues, 5);
|
|
173
|
+
return stats;
|
|
174
|
+
}
|
|
175
|
+
function detectType(values) {
|
|
176
|
+
if (values.length === 0) return "empty";
|
|
177
|
+
const types = /* @__PURE__ */ new Set();
|
|
178
|
+
for (const value of values) {
|
|
179
|
+
if (typeof value === "number" || !isNaN(Number(value))) {
|
|
180
|
+
types.add("number");
|
|
181
|
+
} else if (typeof value === "boolean" || value === "true" || value === "false") {
|
|
182
|
+
types.add("boolean");
|
|
183
|
+
} else if (isDateLike(String(value))) {
|
|
184
|
+
types.add("date");
|
|
185
|
+
} else {
|
|
186
|
+
types.add("string");
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (types.size === 1) {
|
|
190
|
+
return types.values().next().value;
|
|
191
|
+
}
|
|
192
|
+
if (types.size === 2 && types.has("number") && types.has("string")) {
|
|
193
|
+
const numberRatio = values.filter((v) => !isNaN(Number(v))).length / values.length;
|
|
194
|
+
if (numberRatio > 0.9) return "number";
|
|
195
|
+
}
|
|
196
|
+
return "mixed";
|
|
197
|
+
}
|
|
198
|
+
function isDateLike(value) {
|
|
199
|
+
const datePatterns = [
|
|
200
|
+
/^\d{4}-\d{2}-\d{2}$/,
|
|
201
|
+
/^\d{2}\/\d{2}\/\d{4}$/,
|
|
202
|
+
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/
|
|
203
|
+
];
|
|
204
|
+
return datePatterns.some((p) => p.test(value));
|
|
205
|
+
}
|
|
206
|
+
function getTopValues(values, limit) {
|
|
207
|
+
const counts = /* @__PURE__ */ new Map();
|
|
208
|
+
for (const value of values) {
|
|
209
|
+
const key = String(value);
|
|
210
|
+
const existing = counts.get(key);
|
|
211
|
+
if (existing) {
|
|
212
|
+
existing.count++;
|
|
213
|
+
} else {
|
|
214
|
+
counts.set(key, { value, count: 1 });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return [...counts.values()].sort((a, b) => b.count - a.count).slice(0, limit);
|
|
218
|
+
}
|
|
219
|
+
function getColumnStats(input, column) {
|
|
220
|
+
const stats = getStats(input);
|
|
221
|
+
return stats.find((s) => s.name === column) || null;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// src/csv/transform.ts
|
|
225
|
+
function transform(input, options) {
|
|
226
|
+
const result = parse(input);
|
|
227
|
+
const transformed = transformData(result, options);
|
|
228
|
+
return toCSV2(transformed.data, transformed.headers);
|
|
229
|
+
}
|
|
230
|
+
function transformData(result, options) {
|
|
231
|
+
let { data, headers } = result;
|
|
232
|
+
if (options.select) {
|
|
233
|
+
headers = options.select.filter((h) => headers.includes(h));
|
|
234
|
+
}
|
|
235
|
+
if (options.exclude) {
|
|
236
|
+
headers = headers.filter((h) => !options.exclude.includes(h));
|
|
237
|
+
}
|
|
238
|
+
if (options.rename) {
|
|
239
|
+
headers = headers.map((h) => options.rename[h] || h);
|
|
240
|
+
}
|
|
241
|
+
data = data.map((row) => {
|
|
242
|
+
const newRow = {};
|
|
243
|
+
for (const header of result.headers) {
|
|
244
|
+
if (options.select && !options.select.includes(header)) continue;
|
|
245
|
+
if (options.exclude && options.exclude.includes(header)) continue;
|
|
246
|
+
const newKey = options.rename?.[header] || header;
|
|
247
|
+
newRow[newKey] = row[header];
|
|
248
|
+
}
|
|
249
|
+
if (options.derive) {
|
|
250
|
+
for (const [key, fn] of Object.entries(options.derive)) {
|
|
251
|
+
newRow[key] = fn(row);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return newRow;
|
|
255
|
+
});
|
|
256
|
+
if (options.derive) {
|
|
257
|
+
headers = [...headers, ...Object.keys(options.derive)];
|
|
258
|
+
}
|
|
259
|
+
return { data, headers, rowCount: data.length, errors: [] };
|
|
260
|
+
}
|
|
261
|
+
function toCSV2(data, headers) {
|
|
262
|
+
const headerRow = headers.map(escapeCSVField2).join(",");
|
|
263
|
+
const dataRows = data.map(
|
|
264
|
+
(row) => headers.map((h) => escapeCSVField2(row[h])).join(",")
|
|
265
|
+
);
|
|
266
|
+
return [headerRow, ...dataRows].join("\n");
|
|
267
|
+
}
|
|
268
|
+
function escapeCSVField2(value) {
|
|
269
|
+
if (value === null || value === void 0) {
|
|
270
|
+
return "";
|
|
271
|
+
}
|
|
272
|
+
const str = String(value);
|
|
273
|
+
if (str.includes(",") || str.includes('"') || str.includes("\n")) {
|
|
274
|
+
return `"${str.replace(/"/g, '""')}"`;
|
|
275
|
+
}
|
|
276
|
+
return str;
|
|
277
|
+
}
|
|
278
|
+
function sortData(data, column, direction = "asc") {
|
|
279
|
+
return [...data].sort((a, b) => {
|
|
280
|
+
const aVal = a[column];
|
|
281
|
+
const bVal = b[column];
|
|
282
|
+
if (aVal === bVal) return 0;
|
|
283
|
+
if (aVal === null || aVal === void 0) return 1;
|
|
284
|
+
if (bVal === null || bVal === void 0) return -1;
|
|
285
|
+
const comparison = typeof aVal === "number" && typeof bVal === "number" ? aVal - bVal : String(aVal).localeCompare(String(bVal));
|
|
286
|
+
return direction === "asc" ? comparison : -comparison;
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// src/csv/export.ts
|
|
291
|
+
function exportData(input, options) {
|
|
292
|
+
const result = parse(input);
|
|
293
|
+
return exportFromData(result, options);
|
|
294
|
+
}
|
|
295
|
+
function exportFromData(result, options) {
|
|
296
|
+
const { format, headers = true, delimiter } = options;
|
|
297
|
+
switch (format) {
|
|
298
|
+
case "csv":
|
|
299
|
+
return toCSV3(result.data, result.headers, delimiter || ",", headers);
|
|
300
|
+
case "tsv":
|
|
301
|
+
return toCSV3(result.data, result.headers, " ", headers);
|
|
302
|
+
case "json":
|
|
303
|
+
return JSON.stringify(result.data, null, 2);
|
|
304
|
+
case "jsonl":
|
|
305
|
+
return result.data.map((row) => JSON.stringify(row)).join("\n");
|
|
306
|
+
default:
|
|
307
|
+
throw new Error(`Unsupported export format: ${format}`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
function toCSV3(data, headers, delimiter, includeHeaders) {
|
|
311
|
+
const lines = [];
|
|
312
|
+
if (includeHeaders) {
|
|
313
|
+
lines.push(headers.map((h) => escapeField(h, delimiter)).join(delimiter));
|
|
314
|
+
}
|
|
315
|
+
for (const row of data) {
|
|
316
|
+
lines.push(
|
|
317
|
+
headers.map((h) => escapeField(row[h], delimiter)).join(delimiter)
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
return lines.join("\n");
|
|
321
|
+
}
|
|
322
|
+
function escapeField(value, delimiter) {
|
|
323
|
+
if (value === null || value === void 0) {
|
|
324
|
+
return "";
|
|
325
|
+
}
|
|
326
|
+
const str = String(value);
|
|
327
|
+
const needsQuoting = str.includes(delimiter) || str.includes('"') || str.includes("\n");
|
|
328
|
+
if (needsQuoting) {
|
|
329
|
+
return `"${str.replace(/"/g, '""')}"`;
|
|
330
|
+
}
|
|
331
|
+
return str;
|
|
332
|
+
}
|
|
333
|
+
function toJson(input, pretty = true) {
|
|
334
|
+
const result = parse(input);
|
|
335
|
+
return pretty ? JSON.stringify(result.data, null, 2) : JSON.stringify(result.data);
|
|
336
|
+
}
|
|
337
|
+
function toJsonLines(input) {
|
|
338
|
+
const result = parse(input);
|
|
339
|
+
return result.data.map((row) => JSON.stringify(row)).join("\n");
|
|
340
|
+
}
|
|
341
|
+
function toArray(input) {
|
|
342
|
+
const result = parse(input);
|
|
343
|
+
return result.data;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
export { detectDelimiter, exportData, exportFromData, filter, filterByColumn, filterData, getColumnStats, getHeaders, getStats, getStatsFromData, parse, parseToArray, sortData, toArray, toJson, toJsonLines, transform, transformData };
|
|
347
|
+
//# sourceMappingURL=index.mjs.map
|
|
348
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/csv/parse.ts","../../src/csv/filter.ts","../../src/csv/stats.ts","../../src/csv/transform.ts","../../src/csv/export.ts"],"names":["filter","toCSV","escapeCSVField"],"mappings":"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","file":"index.mjs","sourcesContent":["import Papa from 'papaparse';\nimport type { ParseOptions, ParseResult, ParseError } from './types';\n\nexport function parse(input: string, options: ParseOptions = {}): ParseResult {\n const {\n delimiter = ',',\n header = true,\n skipRows = 0,\n trimFields = true,\n dynamicTyping = true,\n } = options;\n\n let processedInput = input;\n if (skipRows > 0) {\n const lines = input.split('\\n');\n processedInput = lines.slice(skipRows).join('\\n');\n }\n\n const result = Papa.parse(processedInput, {\n delimiter,\n header,\n skipEmptyLines: true,\n transformHeader: trimFields ? (h) => h.trim() : undefined,\n transform: trimFields ? (v) => v.trim() : undefined,\n dynamicTyping,\n });\n\n const errors: ParseError[] = result.errors.map((e) => ({\n row: e.row ?? -1,\n message: e.message,\n }));\n\n const headers = header\n ? (result.meta.fields || [])\n : Array.from({ length: (result.data[0] as unknown[])?.length || 0 }, (_, i) => `col_${i}`);\n\n const data = header\n ? (result.data as Record<string, unknown>[])\n : (result.data as unknown[][]).map((row) => {\n const obj: Record<string, unknown> = {};\n headers.forEach((h, i) => {\n obj[h] = row[i];\n });\n return obj;\n });\n\n return {\n data,\n headers,\n rowCount: data.length,\n errors,\n };\n}\n\nexport function parseToArray(input: string, options: ParseOptions = {}): unknown[][] {\n const result = parse(input, { ...options, header: false });\n return result.data.map((row) => Object.values(row));\n}\n\nexport function detectDelimiter(input: string): string {\n const delimiters = [',', '\\t', ';', '|'];\n const firstLine = input.split('\\n')[0];\n\n let maxCount = 0;\n let detected = ',';\n\n for (const d of delimiters) {\n const count = (firstLine.match(new RegExp(`\\\\${d}`, 'g')) || []).length;\n if (count > maxCount) {\n maxCount = count;\n detected = d;\n }\n }\n\n return detected;\n}\n\nexport function getHeaders(input: string, delimiter?: string): string[] {\n const d = delimiter || detectDelimiter(input);\n const firstLine = input.split('\\n')[0];\n return Papa.parse(firstLine, { delimiter: d }).data[0] as string[];\n}\n","import type { Filter, FilterOperator } from './types';\nimport { parse } from './parse';\n\nexport function filter(input: string, filters: Filter[]): string {\n const result = parse(input);\n const filteredData = filterData(result.data, filters);\n return toCSV(filteredData, result.headers);\n}\n\nexport function filterData(\n data: Record<string, unknown>[],\n filters: Filter[]\n): Record<string, unknown>[] {\n return data.filter((row) => {\n return filters.every((f) => matchesFilter(row, f));\n });\n}\n\nfunction matchesFilter(row: Record<string, unknown>, filter: Filter): boolean {\n const value = row[filter.column];\n const filterValue = filter.value;\n\n switch (filter.operator) {\n case 'eq':\n return value === filterValue;\n case 'neq':\n return value !== filterValue;\n case 'gt':\n return Number(value) > Number(filterValue);\n case 'gte':\n return Number(value) >= Number(filterValue);\n case 'lt':\n return Number(value) < Number(filterValue);\n case 'lte':\n return Number(value) <= Number(filterValue);\n case 'contains':\n return String(value).toLowerCase().includes(String(filterValue).toLowerCase());\n case 'startsWith':\n return String(value).toLowerCase().startsWith(String(filterValue).toLowerCase());\n case 'endsWith':\n return String(value).toLowerCase().endsWith(String(filterValue).toLowerCase());\n case 'matches':\n return new RegExp(String(filterValue), 'i').test(String(value));\n case 'isNull':\n return value === null || value === undefined || value === '';\n case 'isNotNull':\n return value !== null && value !== undefined && value !== '';\n default:\n return true;\n }\n}\n\nfunction toCSV(data: Record<string, unknown>[], headers: string[]): string {\n const headerRow = headers.map(escapeCSVField).join(',');\n const dataRows = data.map((row) =>\n headers.map((h) => escapeCSVField(row[h])).join(',')\n );\n return [headerRow, ...dataRows].join('\\n');\n}\n\nfunction escapeCSVField(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const str = String(value);\n if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n}\n\nexport function filterByColumn(\n input: string,\n column: string,\n operator: FilterOperator,\n value?: unknown\n): string {\n return filter(input, [{ column, operator, value }]);\n}\n","import type { ColumnStats, ParseResult } from './types';\nimport { parse } from './parse';\n\nexport function getStats(input: string): ColumnStats[] {\n const result = parse(input);\n return getStatsFromData(result);\n}\n\nexport function getStatsFromData(result: ParseResult): ColumnStats[] {\n const { data, headers } = result;\n\n return headers.map((header) => {\n const values = data.map((row) => row[header]);\n return analyzeColumn(header, values);\n });\n}\n\nfunction analyzeColumn(name: string, values: unknown[]): ColumnStats {\n const nonNullValues = values.filter(\n (v) => v !== null && v !== undefined && v !== ''\n );\n\n const nullCount = values.length - nonNullValues.length;\n const type = detectType(nonNullValues);\n\n const stats: ColumnStats = {\n name,\n type,\n count: values.length,\n nullCount,\n uniqueCount: new Set(nonNullValues.map(String)).size,\n };\n\n if (type === 'number') {\n const numbers = nonNullValues.map(Number).filter((n) => !isNaN(n));\n if (numbers.length > 0) {\n stats.min = Math.min(...numbers);\n stats.max = Math.max(...numbers);\n stats.sum = numbers.reduce((a, b) => a + b, 0);\n stats.mean = stats.sum / numbers.length;\n }\n } else if (type === 'string' || type === 'date') {\n const sorted = [...nonNullValues].map(String).sort();\n if (sorted.length > 0) {\n stats.min = sorted[0];\n stats.max = sorted[sorted.length - 1];\n }\n }\n\n stats.topValues = getTopValues(nonNullValues, 5);\n\n return stats;\n}\n\nfunction detectType(\n values: unknown[]\n): 'string' | 'number' | 'boolean' | 'date' | 'mixed' | 'empty' {\n if (values.length === 0) return 'empty';\n\n const types = new Set<string>();\n\n for (const value of values) {\n if (typeof value === 'number' || !isNaN(Number(value))) {\n types.add('number');\n } else if (typeof value === 'boolean' || value === 'true' || value === 'false') {\n types.add('boolean');\n } else if (isDateLike(String(value))) {\n types.add('date');\n } else {\n types.add('string');\n }\n }\n\n if (types.size === 1) {\n return types.values().next().value as 'string' | 'number' | 'boolean' | 'date';\n }\n\n if (types.size === 2 && types.has('number') && types.has('string')) {\n const numberRatio =\n values.filter((v) => !isNaN(Number(v))).length / values.length;\n if (numberRatio > 0.9) return 'number';\n }\n\n return 'mixed';\n}\n\nfunction isDateLike(value: string): boolean {\n const datePatterns = [\n /^\\d{4}-\\d{2}-\\d{2}$/,\n /^\\d{2}\\/\\d{2}\\/\\d{4}$/,\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/,\n ];\n return datePatterns.some((p) => p.test(value));\n}\n\nfunction getTopValues(\n values: unknown[],\n limit: number\n): { value: unknown; count: number }[] {\n const counts = new Map<string, { value: unknown; count: number }>();\n\n for (const value of values) {\n const key = String(value);\n const existing = counts.get(key);\n if (existing) {\n existing.count++;\n } else {\n counts.set(key, { value, count: 1 });\n }\n }\n\n return [...counts.values()]\n .sort((a, b) => b.count - a.count)\n .slice(0, limit);\n}\n\nexport function getColumnStats(input: string, column: string): ColumnStats | null {\n const stats = getStats(input);\n return stats.find((s) => s.name === column) || null;\n}\n","import type { TransformOptions, ParseResult } from './types';\nimport { parse } from './parse';\n\nexport function transform(input: string, options: TransformOptions): string {\n const result = parse(input);\n const transformed = transformData(result, options);\n return toCSV(transformed.data, transformed.headers);\n}\n\nexport function transformData(\n result: ParseResult,\n options: TransformOptions\n): ParseResult {\n let { data, headers } = result;\n\n if (options.select) {\n headers = options.select.filter((h) => headers.includes(h));\n }\n\n if (options.exclude) {\n headers = headers.filter((h) => !options.exclude!.includes(h));\n }\n\n if (options.rename) {\n headers = headers.map((h) => options.rename![h] || h);\n }\n\n data = data.map((row) => {\n const newRow: Record<string, unknown> = {};\n\n for (const header of result.headers) {\n if (options.select && !options.select.includes(header)) continue;\n if (options.exclude && options.exclude.includes(header)) continue;\n\n const newKey = options.rename?.[header] || header;\n newRow[newKey] = row[header];\n }\n\n if (options.derive) {\n for (const [key, fn] of Object.entries(options.derive)) {\n newRow[key] = fn(row);\n }\n }\n\n return newRow;\n });\n\n if (options.derive) {\n headers = [...headers, ...Object.keys(options.derive)];\n }\n\n return { data, headers, rowCount: data.length, errors: [] };\n}\n\nfunction toCSV(data: Record<string, unknown>[], headers: string[]): string {\n const headerRow = headers.map(escapeCSVField).join(',');\n const dataRows = data.map((row) =>\n headers.map((h) => escapeCSVField(row[h])).join(',')\n );\n return [headerRow, ...dataRows].join('\\n');\n}\n\nfunction escapeCSVField(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const str = String(value);\n if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n}\n\nexport function sortData(\n data: Record<string, unknown>[],\n column: string,\n direction: 'asc' | 'desc' = 'asc'\n): Record<string, unknown>[] {\n return [...data].sort((a, b) => {\n const aVal = a[column];\n const bVal = b[column];\n\n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n\n const comparison =\n typeof aVal === 'number' && typeof bVal === 'number'\n ? aVal - bVal\n : String(aVal).localeCompare(String(bVal));\n\n return direction === 'asc' ? comparison : -comparison;\n });\n}\n","import type { ExportOptions, ParseResult } from './types';\nimport { parse } from './parse';\n\nexport function exportData(input: string, options: ExportOptions): string {\n const result = parse(input);\n return exportFromData(result, options);\n}\n\nexport function exportFromData(result: ParseResult, options: ExportOptions): string {\n const { format, headers = true, delimiter } = options;\n\n switch (format) {\n case 'csv':\n return toCSV(result.data, result.headers, delimiter || ',', headers);\n case 'tsv':\n return toCSV(result.data, result.headers, '\\t', headers);\n case 'json':\n return JSON.stringify(result.data, null, 2);\n case 'jsonl':\n return result.data.map((row) => JSON.stringify(row)).join('\\n');\n default:\n throw new Error(`Unsupported export format: ${format}`);\n }\n}\n\nfunction toCSV(\n data: Record<string, unknown>[],\n headers: string[],\n delimiter: string,\n includeHeaders: boolean\n): string {\n const lines: string[] = [];\n\n if (includeHeaders) {\n lines.push(headers.map((h) => escapeField(h, delimiter)).join(delimiter));\n }\n\n for (const row of data) {\n lines.push(\n headers.map((h) => escapeField(row[h], delimiter)).join(delimiter)\n );\n }\n\n return lines.join('\\n');\n}\n\nfunction escapeField(value: unknown, delimiter: string): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const str = String(value);\n const needsQuoting =\n str.includes(delimiter) || str.includes('\"') || str.includes('\\n');\n\n if (needsQuoting) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n\n return str;\n}\n\nexport function toJson(input: string, pretty = true): string {\n const result = parse(input);\n return pretty\n ? JSON.stringify(result.data, null, 2)\n : JSON.stringify(result.data);\n}\n\nexport function toJsonLines(input: string): string {\n const result = parse(input);\n return result.data.map((row) => JSON.stringify(row)).join('\\n');\n}\n\nexport function toArray(input: string): Record<string, unknown>[] {\n const result = parse(input);\n return result.data;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { C as CronParseResult, D as DateTimeAddOptions, a as DateTimeDiffResult, b as DateTimeFormatOptions, c as DateTimeInfo, T as TimezoneConvertResult, d as add, e as convertTimezone, f as diff, g as formatDate, l as listTimezones, n as now, p as parseCron, h as parseDate, s as subtract } from '../index-CgRVnFOt.mjs';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { C as CronParseResult, D as DateTimeAddOptions, a as DateTimeDiffResult, b as DateTimeFormatOptions, c as DateTimeInfo, T as TimezoneConvertResult, d as add, e as convertTimezone, f as diff, g as formatDate, l as listTimezones, n as now, p as parseCron, h as parseDate, s as subtract } from '../index-CgRVnFOt.js';
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var luxon = require('luxon');
|
|
4
|
+
|
|
5
|
+
// src/datetime/parse.ts
|
|
6
|
+
function parseDate(input, timezone) {
|
|
7
|
+
let dt;
|
|
8
|
+
const unixNum = Number(input);
|
|
9
|
+
if (!isNaN(unixNum) && String(unixNum) === input.trim()) {
|
|
10
|
+
dt = unixNum > 1e12 ? luxon.DateTime.fromMillis(unixNum, { zone: timezone ?? "utc" }) : luxon.DateTime.fromSeconds(unixNum, { zone: timezone ?? "utc" });
|
|
11
|
+
} else {
|
|
12
|
+
dt = luxon.DateTime.fromISO(input, { zone: timezone ?? "utc" });
|
|
13
|
+
if (!dt.isValid) {
|
|
14
|
+
dt = luxon.DateTime.fromRFC2822(input, { zone: timezone ?? "utc" });
|
|
15
|
+
}
|
|
16
|
+
if (!dt.isValid) {
|
|
17
|
+
dt = luxon.DateTime.fromSQL(input, { zone: timezone ?? "utc" });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (!dt.isValid) {
|
|
21
|
+
throw new Error(`Unable to parse date: ${input} (${dt.invalidReason})`);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
iso: dt.toISO(),
|
|
25
|
+
unix: Math.floor(dt.toSeconds()),
|
|
26
|
+
unixMs: dt.toMillis(),
|
|
27
|
+
year: dt.year,
|
|
28
|
+
month: dt.month,
|
|
29
|
+
day: dt.day,
|
|
30
|
+
hour: dt.hour,
|
|
31
|
+
minute: dt.minute,
|
|
32
|
+
second: dt.second,
|
|
33
|
+
dayOfWeek: dt.weekdayLong,
|
|
34
|
+
dayOfYear: dt.ordinal,
|
|
35
|
+
weekNumber: dt.weekNumber,
|
|
36
|
+
isLeapYear: dt.isInLeapYear,
|
|
37
|
+
timezone: dt.zoneName,
|
|
38
|
+
offset: dt.toFormat("ZZ")
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function formatDate(input, options = {}) {
|
|
42
|
+
const tz = options.timezone ?? "utc";
|
|
43
|
+
let dt = luxon.DateTime.fromISO(input, { zone: tz });
|
|
44
|
+
if (!dt.isValid) {
|
|
45
|
+
dt = luxon.DateTime.fromMillis(Number(input), { zone: tz });
|
|
46
|
+
}
|
|
47
|
+
if (!dt.isValid) {
|
|
48
|
+
throw new Error(`Unable to parse date: ${input}`);
|
|
49
|
+
}
|
|
50
|
+
if (options.format) {
|
|
51
|
+
return dt.toFormat(options.format);
|
|
52
|
+
}
|
|
53
|
+
return dt.toISO();
|
|
54
|
+
}
|
|
55
|
+
function now(timezone) {
|
|
56
|
+
const dt = luxon.DateTime.now().setZone(timezone ?? "utc");
|
|
57
|
+
return parseDate(dt.toISO(), timezone);
|
|
58
|
+
}
|
|
59
|
+
function add(input, amount, timezone) {
|
|
60
|
+
const dt = luxon.DateTime.fromISO(input, { zone: timezone ?? "utc" });
|
|
61
|
+
if (!dt.isValid) {
|
|
62
|
+
throw new Error(`Unable to parse date: ${input}`);
|
|
63
|
+
}
|
|
64
|
+
const result = dt.plus(amount);
|
|
65
|
+
return result.toISO();
|
|
66
|
+
}
|
|
67
|
+
function subtract(input, amount, timezone) {
|
|
68
|
+
const dt = luxon.DateTime.fromISO(input, { zone: timezone ?? "utc" });
|
|
69
|
+
if (!dt.isValid) {
|
|
70
|
+
throw new Error(`Unable to parse date: ${input}`);
|
|
71
|
+
}
|
|
72
|
+
const result = dt.minus(amount);
|
|
73
|
+
return result.toISO();
|
|
74
|
+
}
|
|
75
|
+
function diff(a, b) {
|
|
76
|
+
const dtA = luxon.DateTime.fromISO(a, { zone: "utc" });
|
|
77
|
+
const dtB = luxon.DateTime.fromISO(b, { zone: "utc" });
|
|
78
|
+
if (!dtA.isValid || !dtB.isValid) {
|
|
79
|
+
throw new Error("Unable to parse one or both dates");
|
|
80
|
+
}
|
|
81
|
+
const duration = dtB.diff(dtA, [
|
|
82
|
+
"years",
|
|
83
|
+
"months",
|
|
84
|
+
"days",
|
|
85
|
+
"hours",
|
|
86
|
+
"minutes",
|
|
87
|
+
"seconds"
|
|
88
|
+
]);
|
|
89
|
+
const totalMs = dtB.toMillis() - dtA.toMillis();
|
|
90
|
+
return {
|
|
91
|
+
years: Math.floor(duration.years),
|
|
92
|
+
months: Math.floor(duration.months),
|
|
93
|
+
days: Math.floor(duration.days),
|
|
94
|
+
hours: Math.floor(duration.hours),
|
|
95
|
+
minutes: Math.floor(duration.minutes),
|
|
96
|
+
seconds: Math.floor(duration.seconds),
|
|
97
|
+
totalDays: Math.floor(totalMs / 864e5),
|
|
98
|
+
totalHours: Math.floor(totalMs / 36e5),
|
|
99
|
+
totalMinutes: Math.floor(totalMs / 6e4),
|
|
100
|
+
totalSeconds: Math.floor(totalMs / 1e3),
|
|
101
|
+
totalMilliseconds: totalMs
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function convertTimezone(input, fromTimezone, toTimezone) {
|
|
105
|
+
const dtFrom = luxon.DateTime.fromISO(input, { zone: fromTimezone });
|
|
106
|
+
if (!dtFrom.isValid) {
|
|
107
|
+
throw new Error(`Unable to parse date: ${input} in timezone ${fromTimezone}`);
|
|
108
|
+
}
|
|
109
|
+
const dtTo = dtFrom.setZone(toTimezone);
|
|
110
|
+
if (!dtTo.isValid) {
|
|
111
|
+
throw new Error(`Invalid target timezone: ${toTimezone}`);
|
|
112
|
+
}
|
|
113
|
+
const offsetFrom = dtFrom.offset;
|
|
114
|
+
const offsetTo = dtTo.offset;
|
|
115
|
+
const diffMinutes = offsetTo - offsetFrom;
|
|
116
|
+
const sign = diffMinutes >= 0 ? "+" : "-";
|
|
117
|
+
const absMinutes = Math.abs(diffMinutes);
|
|
118
|
+
const hours = Math.floor(absMinutes / 60);
|
|
119
|
+
const minutes = absMinutes % 60;
|
|
120
|
+
return {
|
|
121
|
+
input: dtFrom.toISO(),
|
|
122
|
+
inputTimezone: fromTimezone,
|
|
123
|
+
output: dtTo.toISO(),
|
|
124
|
+
outputTimezone: toTimezone,
|
|
125
|
+
offsetDifference: `${sign}${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function listTimezones() {
|
|
129
|
+
return Intl.supportedValuesOf("timeZone");
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// src/datetime/cron.ts
|
|
133
|
+
var MONTH_NAMES = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
|
134
|
+
var DAY_NAMES = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
|
|
135
|
+
function parseCron(expression, count = 5) {
|
|
136
|
+
const parts = expression.trim().split(/\s+/);
|
|
137
|
+
if (parts.length !== 5) {
|
|
138
|
+
return {
|
|
139
|
+
valid: false,
|
|
140
|
+
description: "",
|
|
141
|
+
nextRuns: [],
|
|
142
|
+
error: `Expected 5 fields, got ${parts.length}`
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
const description = describeCron(parts);
|
|
147
|
+
const nextRuns = getNextRuns(parts, count);
|
|
148
|
+
return {
|
|
149
|
+
valid: true,
|
|
150
|
+
description,
|
|
151
|
+
nextRuns: nextRuns.map((d) => d.toISOString())
|
|
152
|
+
};
|
|
153
|
+
} catch (e) {
|
|
154
|
+
return {
|
|
155
|
+
valid: false,
|
|
156
|
+
description: "",
|
|
157
|
+
nextRuns: [],
|
|
158
|
+
error: e.message
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function describeCron(parts) {
|
|
163
|
+
const [min, hour, dom, month, dow] = parts;
|
|
164
|
+
const segments = [];
|
|
165
|
+
if (min === "*" && hour === "*" && dom === "*" && month === "*" && dow === "*") {
|
|
166
|
+
return "Every minute";
|
|
167
|
+
}
|
|
168
|
+
if (min !== "*") segments.push(`at minute ${min}`);
|
|
169
|
+
if (hour !== "*") segments.push(`at hour ${hour}`);
|
|
170
|
+
if (dom !== "*") segments.push(`on day ${dom} of the month`);
|
|
171
|
+
if (month !== "*") {
|
|
172
|
+
const m = parseInt(month);
|
|
173
|
+
segments.push(`in ${!isNaN(m) && m >= 1 && m <= 12 ? MONTH_NAMES[m] : month}`);
|
|
174
|
+
}
|
|
175
|
+
if (dow !== "*") {
|
|
176
|
+
const d = parseInt(dow);
|
|
177
|
+
segments.push(`on ${!isNaN(d) && d >= 0 && d <= 6 ? DAY_NAMES[d] : dow}`);
|
|
178
|
+
}
|
|
179
|
+
return segments.join(", ") || "Every minute";
|
|
180
|
+
}
|
|
181
|
+
function getNextRuns(parts, count) {
|
|
182
|
+
const runs = [];
|
|
183
|
+
const now2 = /* @__PURE__ */ new Date();
|
|
184
|
+
const current = new Date(now2);
|
|
185
|
+
current.setSeconds(0, 0);
|
|
186
|
+
current.setMinutes(current.getMinutes() + 1);
|
|
187
|
+
const maxIterations = 525600;
|
|
188
|
+
let iterations = 0;
|
|
189
|
+
while (runs.length < count && iterations < maxIterations) {
|
|
190
|
+
if (matchesCron(current, parts)) {
|
|
191
|
+
runs.push(new Date(current));
|
|
192
|
+
}
|
|
193
|
+
current.setMinutes(current.getMinutes() + 1);
|
|
194
|
+
iterations++;
|
|
195
|
+
}
|
|
196
|
+
return runs;
|
|
197
|
+
}
|
|
198
|
+
function matchesCron(date, parts) {
|
|
199
|
+
const [minExpr, hourExpr, domExpr, monthExpr, dowExpr] = parts;
|
|
200
|
+
return matchesField(date.getMinutes(), minExpr, 0, 59) && matchesField(date.getHours(), hourExpr, 0, 23) && matchesField(date.getDate(), domExpr, 1, 31) && matchesField(date.getMonth() + 1, monthExpr, 1, 12) && matchesField(date.getDay(), dowExpr, 0, 6);
|
|
201
|
+
}
|
|
202
|
+
function matchesField(value, expr, min, max) {
|
|
203
|
+
if (expr === "*") return true;
|
|
204
|
+
for (const part of expr.split(",")) {
|
|
205
|
+
if (part.includes("/")) {
|
|
206
|
+
const [range, stepStr] = part.split("/");
|
|
207
|
+
const step = parseInt(stepStr);
|
|
208
|
+
const start = range === "*" ? min : parseInt(range);
|
|
209
|
+
for (let i = start; i <= max; i += step) {
|
|
210
|
+
if (i === value) return true;
|
|
211
|
+
}
|
|
212
|
+
} else if (part.includes("-")) {
|
|
213
|
+
const [startStr, endStr] = part.split("-");
|
|
214
|
+
const start = parseInt(startStr);
|
|
215
|
+
const end = parseInt(endStr);
|
|
216
|
+
if (value >= start && value <= end) return true;
|
|
217
|
+
} else {
|
|
218
|
+
if (parseInt(part) === value) return true;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
exports.add = add;
|
|
225
|
+
exports.convertTimezone = convertTimezone;
|
|
226
|
+
exports.diff = diff;
|
|
227
|
+
exports.formatDate = formatDate;
|
|
228
|
+
exports.listTimezones = listTimezones;
|
|
229
|
+
exports.now = now;
|
|
230
|
+
exports.parseCron = parseCron;
|
|
231
|
+
exports.parseDate = parseDate;
|
|
232
|
+
exports.subtract = subtract;
|
|
233
|
+
//# sourceMappingURL=index.js.map
|
|
234
|
+
//# sourceMappingURL=index.js.map
|