@portel/csv 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/CHANGELOG.md +25 -0
- package/FORMAT.md +199 -0
- package/LICENSE +21 -0
- package/README.md +408 -0
- package/dist/cells.d.ts +22 -0
- package/dist/cells.d.ts.map +1 -0
- package/dist/cells.js +69 -0
- package/dist/cells.js.map +1 -0
- package/dist/charts.d.ts +9 -0
- package/dist/charts.d.ts.map +1 -0
- package/dist/charts.js +41 -0
- package/dist/charts.js.map +1 -0
- package/dist/csv.d.ts +8 -0
- package/dist/csv.d.ts.map +1 -0
- package/dist/csv.js +38 -0
- package/dist/csv.js.map +1 -0
- package/dist/engine.d.ts +80 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +505 -0
- package/dist/engine.js.map +1 -0
- package/dist/format.d.ts +15 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +62 -0
- package/dist/format.js.map +1 -0
- package/dist/formulas.d.ts +33 -0
- package/dist/formulas.d.ts.map +1 -0
- package/dist/formulas.js +247 -0
- package/dist/formulas.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/query.d.ts +9 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +47 -0
- package/dist/query.js.map +1 -0
- package/dist/table.d.ts +16 -0
- package/dist/table.d.ts.map +1 -0
- package/dist/table.js +94 -0
- package/dist/table.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formula evaluation engine — SUM, AVG, IF, etc. with A1 cell references.
|
|
3
|
+
*
|
|
4
|
+
* Operates on a cell grid (string[][]) with headers for named column references.
|
|
5
|
+
* All functions are pure — they take the grid as a parameter, no class state.
|
|
6
|
+
*/
|
|
7
|
+
/** Context needed for formula evaluation. */
|
|
8
|
+
export interface FormulaContext {
|
|
9
|
+
cells: string[][];
|
|
10
|
+
headers: string[];
|
|
11
|
+
colCount: number;
|
|
12
|
+
evaluate: (row: number, col: number) => string;
|
|
13
|
+
}
|
|
14
|
+
/** Split formula arguments respecting nested parentheses. */
|
|
15
|
+
export declare function splitFormulaArgs(argsStr: string): string[];
|
|
16
|
+
/** Check if a formula string is a visual formula (PIE, BAR, LINE, etc.). */
|
|
17
|
+
export declare function isVisualFormula(formula: string): boolean;
|
|
18
|
+
/** Safely evaluate a mathematical expression string. */
|
|
19
|
+
export declare function safeEval(expression: string): any;
|
|
20
|
+
/** Evaluate built-in functions (SUM, AVG, MAX, etc.) in a formula string. */
|
|
21
|
+
export declare function evaluateFunctions(formula: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Evaluate a formula string against a cell grid.
|
|
24
|
+
*
|
|
25
|
+
* Resolves cell references (A1, B2), range references (A1:B5),
|
|
26
|
+
* header-based references (Name2), and built-in functions.
|
|
27
|
+
*/
|
|
28
|
+
export declare function evaluateFormula(formula: string, ctx: FormulaContext, _currentRow: number, _currentCol: number): string | number;
|
|
29
|
+
/** Resolve a range reference to string values using the evaluate function. */
|
|
30
|
+
export declare function resolveRangeToStrings(range: string, ctx: FormulaContext): string[];
|
|
31
|
+
/** Resolve a range reference to numeric values using the evaluate function. */
|
|
32
|
+
export declare function resolveRangeToNumbers(range: string, ctx: FormulaContext): number[];
|
|
33
|
+
//# sourceMappingURL=formulas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formulas.d.ts","sourceRoot":"","sources":["../src/formulas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,6CAA6C;AAC7C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CAChD;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB1D;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGxD;AAED,wDAAwD;AACxD,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAUhD;AAiCD,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA8CzD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAyD/H;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,MAAM,EAAE,CAuBlF;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,MAAM,EAAE,CAyBlF"}
|
package/dist/formulas.js
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formula evaluation engine — SUM, AVG, IF, etc. with A1 cell references.
|
|
3
|
+
*
|
|
4
|
+
* Operates on a cell grid (string[][]) with headers for named column references.
|
|
5
|
+
* All functions are pure — they take the grid as a parameter, no class state.
|
|
6
|
+
*/
|
|
7
|
+
import { columnNameToNumber, rangeToIndices } from './cells.js';
|
|
8
|
+
/** Known function names that should not be treated as cell references. */
|
|
9
|
+
const FUNCTION_NAMES = ['SUM', 'AVG', 'AVERAGE', 'MAX', 'MIN', 'COUNT', 'IF', 'LEN', 'CONCAT', 'ABS', 'ROUND'];
|
|
10
|
+
/** Visual formula names that render as charts. */
|
|
11
|
+
const VISUAL_FORMULAS = new Set(['PIE', 'BAR', 'LINE', 'SPARKLINE', 'GAUGE']);
|
|
12
|
+
/** Split formula arguments respecting nested parentheses. */
|
|
13
|
+
export function splitFormulaArgs(argsStr) {
|
|
14
|
+
const result = [];
|
|
15
|
+
let depth = 0;
|
|
16
|
+
let current = '';
|
|
17
|
+
for (const ch of argsStr) {
|
|
18
|
+
if (ch === '(')
|
|
19
|
+
depth++;
|
|
20
|
+
else if (ch === ')')
|
|
21
|
+
depth--;
|
|
22
|
+
if (ch === ',' && depth === 0) {
|
|
23
|
+
result.push(current);
|
|
24
|
+
current = '';
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
current += ch;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (current)
|
|
31
|
+
result.push(current);
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
/** Check if a formula string is a visual formula (PIE, BAR, LINE, etc.). */
|
|
35
|
+
export function isVisualFormula(formula) {
|
|
36
|
+
const match = formula.trim().match(/^([A-Z]+)\s*\(/i);
|
|
37
|
+
return match ? VISUAL_FORMULAS.has(match[1].toUpperCase()) : false;
|
|
38
|
+
}
|
|
39
|
+
/** Safely evaluate a mathematical expression string. */
|
|
40
|
+
export function safeEval(expression) {
|
|
41
|
+
const sanitized = String(expression)
|
|
42
|
+
.replace(/[^0-9+\-*/().,[\]<>!=\s&|"]/g, '')
|
|
43
|
+
.replace(/&&/g, '&&')
|
|
44
|
+
.replace(/\|\|/g, '||');
|
|
45
|
+
try {
|
|
46
|
+
return new Function('return ' + sanitized)();
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return '#ERROR';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Get range values as a bracketed string for substitution into formulas. */
|
|
53
|
+
function getRangeValues(ctx, startCol, startRow, endCol, endRow) {
|
|
54
|
+
const sc = columnNameToNumber(startCol);
|
|
55
|
+
const ec = columnNameToNumber(endCol);
|
|
56
|
+
const sr = startRow - 1;
|
|
57
|
+
const er = endRow - 1;
|
|
58
|
+
const values = [];
|
|
59
|
+
for (let r = sr; r <= er; r++) {
|
|
60
|
+
for (let c = sc; c <= ec; c++) {
|
|
61
|
+
if (r >= 0 && r < ctx.cells.length && c >= 0 && c < ctx.colCount) {
|
|
62
|
+
const val = parseFloat(ctx.evaluate(r, c));
|
|
63
|
+
if (!isNaN(val))
|
|
64
|
+
values.push(val);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return `[${values.join(',')}]`;
|
|
69
|
+
}
|
|
70
|
+
/** Parse a range value string (e.g., "[1,2,3]" or "42") into numeric array. */
|
|
71
|
+
function parseRangeValues(range) {
|
|
72
|
+
if (range.startsWith('[') && range.endsWith(']')) {
|
|
73
|
+
const content = range.slice(1, -1);
|
|
74
|
+
if (!content)
|
|
75
|
+
return [];
|
|
76
|
+
return content.split(',').filter(x => x !== '').map(Number).filter(n => !isNaN(n));
|
|
77
|
+
}
|
|
78
|
+
const num = parseFloat(range);
|
|
79
|
+
if (!isNaN(num))
|
|
80
|
+
return [num];
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
/** Evaluate built-in functions (SUM, AVG, MAX, etc.) in a formula string. */
|
|
84
|
+
export function evaluateFunctions(formula) {
|
|
85
|
+
formula = formula.replace(/SUM\(([^)]+)\)/gi, (_m, range) => {
|
|
86
|
+
const v = parseRangeValues(range);
|
|
87
|
+
return String(v.reduce((a, b) => a + b, 0));
|
|
88
|
+
});
|
|
89
|
+
formula = formula.replace(/(?:AVG|AVERAGE)\(([^)]+)\)/gi, (_m, range) => {
|
|
90
|
+
const v = parseRangeValues(range);
|
|
91
|
+
return String(v.length ? v.reduce((a, b) => a + b, 0) / v.length : 0);
|
|
92
|
+
});
|
|
93
|
+
formula = formula.replace(/MAX\(([^)]+)\)/gi, (_m, range) => {
|
|
94
|
+
const v = parseRangeValues(range);
|
|
95
|
+
return String(v.length ? Math.max(...v) : 0);
|
|
96
|
+
});
|
|
97
|
+
formula = formula.replace(/MIN\(([^)]+)\)/gi, (_m, range) => {
|
|
98
|
+
const v = parseRangeValues(range);
|
|
99
|
+
return String(v.length ? Math.min(...v) : 0);
|
|
100
|
+
});
|
|
101
|
+
formula = formula.replace(/COUNT\(([^)]+)\)/gi, (_m, range) => {
|
|
102
|
+
return String(parseRangeValues(range).length);
|
|
103
|
+
});
|
|
104
|
+
formula = formula.replace(/IF\(([^,]+),([^,]+),([^)]+)\)/gi, (_m, cond, t, f) => {
|
|
105
|
+
return safeEval(cond) ? t.trim() : f.trim();
|
|
106
|
+
});
|
|
107
|
+
formula = formula.replace(/LEN\(([^)]+)\)/gi, (_m, arg) => {
|
|
108
|
+
const trimmed = arg.trim();
|
|
109
|
+
if (trimmed.startsWith('"') && trimmed.endsWith('"')) {
|
|
110
|
+
return String(trimmed.slice(1, -1).length);
|
|
111
|
+
}
|
|
112
|
+
const val = String(safeEval(trimmed));
|
|
113
|
+
return String(val.replace(/"/g, '').length);
|
|
114
|
+
});
|
|
115
|
+
formula = formula.replace(/ABS\(([^)]+)\)/gi, (_m, arg) => {
|
|
116
|
+
return String(Math.abs(Number(safeEval(arg))));
|
|
117
|
+
});
|
|
118
|
+
formula = formula.replace(/ROUND\(([^,]+)(?:,([^)]+))?\)/gi, (_m, arg, dec) => {
|
|
119
|
+
const val = Number(safeEval(arg));
|
|
120
|
+
const d = dec ? Number(safeEval(dec)) : 0;
|
|
121
|
+
return String(Math.round(val * Math.pow(10, d)) / Math.pow(10, d));
|
|
122
|
+
});
|
|
123
|
+
formula = formula.replace(/CONCAT\(([^)]+)\)/gi, (_m, args) => {
|
|
124
|
+
const parts = args.split(',').map((a) => {
|
|
125
|
+
return String(safeEval(a.trim())).replace(/"/g, '');
|
|
126
|
+
});
|
|
127
|
+
return `"${parts.join('')}"`;
|
|
128
|
+
});
|
|
129
|
+
return formula;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Evaluate a formula string against a cell grid.
|
|
133
|
+
*
|
|
134
|
+
* Resolves cell references (A1, B2), range references (A1:B5),
|
|
135
|
+
* header-based references (Name2), and built-in functions.
|
|
136
|
+
*/
|
|
137
|
+
export function evaluateFormula(formula, ctx, _currentRow, _currentCol) {
|
|
138
|
+
try {
|
|
139
|
+
let processed = formula.trim();
|
|
140
|
+
// Visual formulas return a marker
|
|
141
|
+
if (isVisualFormula(processed)) {
|
|
142
|
+
const match = processed.match(/^([A-Z]+)/i);
|
|
143
|
+
return `[${match[1].toUpperCase()}]`;
|
|
144
|
+
}
|
|
145
|
+
// Step 1: Replace cell range references (A1:B2)
|
|
146
|
+
processed = processed.replace(/([A-Z]+)(\d+):([A-Z]+)(\d+)/gi, (_m, col, row, endCol, endRow) => {
|
|
147
|
+
return getRangeValues(ctx, col.toUpperCase(), parseInt(row), endCol.toUpperCase(), parseInt(endRow));
|
|
148
|
+
});
|
|
149
|
+
// Step 2: Replace single cell references and header-based references
|
|
150
|
+
processed = processed.replace(/([A-Za-z_][A-Za-z0-9_]*)(\d+)/g, (match, header, rowNum) => {
|
|
151
|
+
if (FUNCTION_NAMES.includes(header.toUpperCase()))
|
|
152
|
+
return match;
|
|
153
|
+
// Column letter reference (A1)
|
|
154
|
+
if (header === header.toUpperCase()) {
|
|
155
|
+
const colIndex = columnNameToNumber(header);
|
|
156
|
+
const rowIndex = parseInt(rowNum) - 1;
|
|
157
|
+
if (colIndex >= 0 && colIndex < ctx.colCount && rowIndex >= 0 && rowIndex < ctx.cells.length) {
|
|
158
|
+
const value = ctx.evaluate(rowIndex, colIndex);
|
|
159
|
+
if (value === '')
|
|
160
|
+
return '0';
|
|
161
|
+
return isNaN(Number(value)) ? `"${value}"` : value;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Header name reference (Name2)
|
|
165
|
+
const headerIdx = ctx.headers.indexOf(header);
|
|
166
|
+
if (headerIdx !== -1 && parseInt(rowNum) > 0 && parseInt(rowNum) <= ctx.cells.length) {
|
|
167
|
+
const value = ctx.evaluate(parseInt(rowNum) - 1, headerIdx);
|
|
168
|
+
if (value === '')
|
|
169
|
+
return '0';
|
|
170
|
+
return isNaN(Number(value)) ? `"${value}"` : value;
|
|
171
|
+
}
|
|
172
|
+
return match;
|
|
173
|
+
});
|
|
174
|
+
processed = evaluateFunctions(processed);
|
|
175
|
+
// If the result is a quoted string, return it directly
|
|
176
|
+
const trimmedResult = processed.trim();
|
|
177
|
+
if (trimmedResult.startsWith('"') && trimmedResult.endsWith('"')) {
|
|
178
|
+
return trimmedResult.slice(1, -1);
|
|
179
|
+
}
|
|
180
|
+
const result = safeEval(processed);
|
|
181
|
+
if (typeof result === 'number' && !isNaN(result)) {
|
|
182
|
+
return Math.round(result * 100000000) / 100000000;
|
|
183
|
+
}
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return '#ERROR';
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/** Resolve a range reference to string values using the evaluate function. */
|
|
191
|
+
export function resolveRangeToStrings(range, ctx) {
|
|
192
|
+
try {
|
|
193
|
+
const { startRow, startCol, endRow, endCol } = rangeToIndices(range, ctx.cells.length - 1);
|
|
194
|
+
const values = [];
|
|
195
|
+
for (let r = startRow; r <= endRow && r < ctx.cells.length; r++) {
|
|
196
|
+
for (let c = startCol; c <= endCol && c < ctx.colCount; c++) {
|
|
197
|
+
values.push(ctx.evaluate(r, c) || '');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return values;
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
try {
|
|
204
|
+
const match = range.match(/^([A-Za-z]+)(\d+)$/);
|
|
205
|
+
if (match) {
|
|
206
|
+
const col = columnNameToNumber(match[1]);
|
|
207
|
+
const row = parseInt(match[2]) - 1;
|
|
208
|
+
return [ctx.evaluate(row, col) || ''];
|
|
209
|
+
}
|
|
210
|
+
return [];
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/** Resolve a range reference to numeric values using the evaluate function. */
|
|
218
|
+
export function resolveRangeToNumbers(range, ctx) {
|
|
219
|
+
try {
|
|
220
|
+
const { startRow, startCol, endRow, endCol } = rangeToIndices(range, ctx.cells.length - 1);
|
|
221
|
+
const values = [];
|
|
222
|
+
for (let r = startRow; r <= endRow && r < ctx.cells.length; r++) {
|
|
223
|
+
for (let c = startCol; c <= endCol && c < ctx.colCount; c++) {
|
|
224
|
+
const val = parseFloat(ctx.evaluate(r, c));
|
|
225
|
+
if (!isNaN(val))
|
|
226
|
+
values.push(val);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return values;
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
try {
|
|
233
|
+
const match = range.match(/^([A-Za-z]+)(\d+)$/);
|
|
234
|
+
if (match) {
|
|
235
|
+
const col = columnNameToNumber(match[1]);
|
|
236
|
+
const row = parseInt(match[2]) - 1;
|
|
237
|
+
const val = parseFloat(ctx.evaluate(row, col));
|
|
238
|
+
return isNaN(val) ? [] : [val];
|
|
239
|
+
}
|
|
240
|
+
return [];
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
return [];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=formulas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formulas.js","sourceRoot":"","sources":["../src/formulas.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @portel/csv — CSV engine with formulas, format rows, and SQL queries.
|
|
3
|
+
*
|
|
4
|
+
* Implements the Photon CSV Format specification.
|
|
5
|
+
*/
|
|
6
|
+
export { CsvEngine } from './engine.js';
|
|
7
|
+
export { escapeCSV, parseCSVLine } from './csv.js';
|
|
8
|
+
export { numberToColumnName, columnNameToNumber, cellToIndex, rangeToIndices, resolveColumnIndex } from './cells.js';
|
|
9
|
+
export { isFormatRow, parseFormatCell, buildFormatCell, buildFormatRow, initDefaultMeta } from './format.js';
|
|
10
|
+
export { parseCondition, matchCondition } from './query.js';
|
|
11
|
+
export { evaluateFormula, evaluateFunctions, splitFormulaArgs, safeEval, isVisualFormula, resolveRangeToStrings, resolveRangeToNumbers } from './formulas.js';
|
|
12
|
+
export type { FormulaContext } from './formulas.js';
|
|
13
|
+
export { parseVisualFormula } from './charts.js';
|
|
14
|
+
export { formatTable, formatFilteredTable } from './table.js';
|
|
15
|
+
export type { ColumnMeta, ChartDescriptor, CellIndex, RangeBounds, ParsedCondition, QueryResult, SqlResult, SchemaColumn, EngineSnapshot, CsvEngineOptions, ToCsvOptions, } from './types.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGnD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGrH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG7G,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC9J,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAG9D,YAAY,EACV,UAAU,EACV,eAAe,EACf,SAAS,EACT,WAAW,EACX,eAAe,EACf,WAAW,EACX,SAAS,EACT,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,YAAY,GACb,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @portel/csv — CSV engine with formulas, format rows, and SQL queries.
|
|
3
|
+
*
|
|
4
|
+
* Implements the Photon CSV Format specification.
|
|
5
|
+
*/
|
|
6
|
+
// Main engine
|
|
7
|
+
export { CsvEngine } from './engine.js';
|
|
8
|
+
// CSV primitives
|
|
9
|
+
export { escapeCSV, parseCSVLine } from './csv.js';
|
|
10
|
+
// Cell addressing
|
|
11
|
+
export { numberToColumnName, columnNameToNumber, cellToIndex, rangeToIndices, resolveColumnIndex } from './cells.js';
|
|
12
|
+
// Format row
|
|
13
|
+
export { isFormatRow, parseFormatCell, buildFormatCell, buildFormatRow, initDefaultMeta } from './format.js';
|
|
14
|
+
// Query
|
|
15
|
+
export { parseCondition, matchCondition } from './query.js';
|
|
16
|
+
// Formulas
|
|
17
|
+
export { evaluateFormula, evaluateFunctions, splitFormulaArgs, safeEval, isVisualFormula, resolveRangeToStrings, resolveRangeToNumbers } from './formulas.js';
|
|
18
|
+
// Charts
|
|
19
|
+
export { parseVisualFormula } from './charts.js';
|
|
20
|
+
// Tables
|
|
21
|
+
export { formatTable, formatFilteredTable } from './table.js';
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,iBAAiB;AACjB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEnD,kBAAkB;AAClB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErH,aAAa;AACb,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7G,QAAQ;AACR,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5D,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAG9J,SAAS;AACT,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,SAAS;AACT,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/query.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple condition parsing and matching for the `query()` method.
|
|
3
|
+
*/
|
|
4
|
+
import type { ParsedCondition } from './types.js';
|
|
5
|
+
/** Parse a condition string like "Age > 25" or "Name contains Ali". */
|
|
6
|
+
export declare function parseCondition(where: string): ParsedCondition;
|
|
7
|
+
/** Test if a cell value matches a condition. Uses numeric comparison when both sides are numbers. */
|
|
8
|
+
export declare function matchCondition(cellVal: string, op: string, value: string): boolean;
|
|
9
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CA4B7D;AAED,qGAAqG;AACrG,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAelF"}
|
package/dist/query.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple condition parsing and matching for the `query()` method.
|
|
3
|
+
*/
|
|
4
|
+
/** Parse a condition string like "Age > 25" or "Name contains Ali". */
|
|
5
|
+
export function parseCondition(where) {
|
|
6
|
+
const ops = ['>=', '<=', '!=', '>', '<', '=', 'contains'];
|
|
7
|
+
// Try with spaces around operator
|
|
8
|
+
for (const op of ops) {
|
|
9
|
+
const spaced = where.toLowerCase().indexOf(` ${op} `);
|
|
10
|
+
if (spaced !== -1) {
|
|
11
|
+
return {
|
|
12
|
+
col: where.substring(0, spaced).trim(),
|
|
13
|
+
op,
|
|
14
|
+
value: where.substring(spaced + op.length + 2).trim(),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// Try without spaces for short operators
|
|
19
|
+
for (const op of ops.filter(o => o.length <= 2)) {
|
|
20
|
+
const idx = where.indexOf(op);
|
|
21
|
+
if (idx !== -1) {
|
|
22
|
+
return {
|
|
23
|
+
col: where.substring(0, idx).trim(),
|
|
24
|
+
op,
|
|
25
|
+
value: where.substring(idx + op.length).trim(),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
throw new Error(`Cannot parse condition: "${where}". Use: "COLUMN OP VALUE" (e.g., "Age > 25")`);
|
|
30
|
+
}
|
|
31
|
+
/** Test if a cell value matches a condition. Uses numeric comparison when both sides are numbers. */
|
|
32
|
+
export function matchCondition(cellVal, op, value) {
|
|
33
|
+
const numCell = Number(cellVal);
|
|
34
|
+
const numVal = Number(value);
|
|
35
|
+
const useNumeric = !isNaN(numCell) && !isNaN(numVal);
|
|
36
|
+
switch (op) {
|
|
37
|
+
case '=': return useNumeric ? numCell === numVal : cellVal === value;
|
|
38
|
+
case '!=': return useNumeric ? numCell !== numVal : cellVal !== value;
|
|
39
|
+
case '>': return useNumeric ? numCell > numVal : cellVal > value;
|
|
40
|
+
case '<': return useNumeric ? numCell < numVal : cellVal < value;
|
|
41
|
+
case '>=': return useNumeric ? numCell >= numVal : cellVal >= value;
|
|
42
|
+
case '<=': return useNumeric ? numCell <= numVal : cellVal <= value;
|
|
43
|
+
case 'contains': return cellVal.toLowerCase().includes(value.toLowerCase());
|
|
44
|
+
default: return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
package/dist/table.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ASCII markdown table formatting.
|
|
3
|
+
*/
|
|
4
|
+
import type { ColumnMeta } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Format evaluated data as an ASCII markdown table.
|
|
7
|
+
* Includes a "Row" column with 1-based row numbers.
|
|
8
|
+
* Skips rows that are entirely empty.
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatTable(evaluated: string[][], headers: string[], columnMeta: ColumnMeta[], colCount: number, startRow?: number, endRow?: number, startCol?: number, endCol?: number): string;
|
|
11
|
+
/**
|
|
12
|
+
* Format a filtered subset of rows as an ASCII markdown table.
|
|
13
|
+
* Row indices are 0-based.
|
|
14
|
+
*/
|
|
15
|
+
export declare function formatFilteredTable(evaluated: string[][], headers: string[], columnMeta: ColumnMeta[], colCount: number, rowIndices: number[]): string;
|
|
16
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAe7C;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EAAE,EAAE,EACrB,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,EAAE,UAAU,EAAE,EACxB,QAAQ,EAAE,MAAM,EAChB,QAAQ,SAAI,EACZ,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,SAAI,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CA2CR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EAAE,EAAE,EACrB,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,EAAE,UAAU,EAAE,EACxB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAAE,GACnB,MAAM,CA0BR"}
|
package/dist/table.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ASCII markdown table formatting.
|
|
3
|
+
*/
|
|
4
|
+
/** Pad a string to width, respecting alignment. */
|
|
5
|
+
function padAligned(s, w, align) {
|
|
6
|
+
const gap = Math.max(0, w - s.length);
|
|
7
|
+
if (align === 'right')
|
|
8
|
+
return ' '.repeat(gap) + s;
|
|
9
|
+
if (align === 'center')
|
|
10
|
+
return ' '.repeat(Math.floor(gap / 2)) + s + ' '.repeat(Math.ceil(gap / 2));
|
|
11
|
+
return s + ' '.repeat(gap);
|
|
12
|
+
}
|
|
13
|
+
/** Left-pad a string. */
|
|
14
|
+
function pad(s, w) {
|
|
15
|
+
return s + ' '.repeat(Math.max(0, w - s.length));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Format evaluated data as an ASCII markdown table.
|
|
19
|
+
* Includes a "Row" column with 1-based row numbers.
|
|
20
|
+
* Skips rows that are entirely empty.
|
|
21
|
+
*/
|
|
22
|
+
export function formatTable(evaluated, headers, columnMeta, colCount, startRow = 0, endRow, startCol = 0, endCol) {
|
|
23
|
+
const er = endRow ?? evaluated.length - 1;
|
|
24
|
+
const ec = endCol ?? colCount - 1;
|
|
25
|
+
const visibleHeaders = ['Row', ...headers.slice(startCol, ec + 1)];
|
|
26
|
+
const widths = visibleHeaders.map(h => h.length);
|
|
27
|
+
const rows = [];
|
|
28
|
+
for (let r = startRow; r <= er && r < evaluated.length; r++) {
|
|
29
|
+
if (evaluated[r].every(v => v === ''))
|
|
30
|
+
continue;
|
|
31
|
+
const row = [String(r + 1)];
|
|
32
|
+
for (let c = startCol; c <= ec; c++) {
|
|
33
|
+
const val = evaluated[r]?.[c] ?? '';
|
|
34
|
+
row.push(val);
|
|
35
|
+
if (val.length > (widths[c - startCol + 1] || 0)) {
|
|
36
|
+
widths[c - startCol + 1] = val.length;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
rows.push(row);
|
|
40
|
+
}
|
|
41
|
+
if (rows.length === 0)
|
|
42
|
+
return '(empty spreadsheet)';
|
|
43
|
+
for (const row of rows) {
|
|
44
|
+
if (row[0].length > widths[0])
|
|
45
|
+
widths[0] = row[0].length;
|
|
46
|
+
}
|
|
47
|
+
const header = '| ' + visibleHeaders.map((h, i) => pad(h, widths[i])).join(' | ') + ' |';
|
|
48
|
+
const sepCells = widths.map((w, i) => {
|
|
49
|
+
const meta = i === 0 ? null : columnMeta[i - 1 + startCol];
|
|
50
|
+
const align = meta?.align || 'left';
|
|
51
|
+
const dashes = '-'.repeat(w);
|
|
52
|
+
if (align === 'center')
|
|
53
|
+
return ':' + dashes + ':';
|
|
54
|
+
if (align === 'right')
|
|
55
|
+
return ' ' + dashes + ':';
|
|
56
|
+
return ':' + dashes + ' ';
|
|
57
|
+
});
|
|
58
|
+
const sep = '|' + sepCells.join('|') + '|';
|
|
59
|
+
const body = rows.map(row => '| ' + row.map((v, i) => {
|
|
60
|
+
const meta = i === 0 ? null : columnMeta[i - 1 + startCol];
|
|
61
|
+
return padAligned(v, widths[i], meta?.align || 'left');
|
|
62
|
+
}).join(' | ') + ' |');
|
|
63
|
+
return [header, sep, ...body].join('\n');
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Format a filtered subset of rows as an ASCII markdown table.
|
|
67
|
+
* Row indices are 0-based.
|
|
68
|
+
*/
|
|
69
|
+
export function formatFilteredTable(evaluated, headers, columnMeta, colCount, rowIndices) {
|
|
70
|
+
const visibleHeaders = ['Row', ...headers];
|
|
71
|
+
const widths = visibleHeaders.map(h => h.length);
|
|
72
|
+
const rows = [];
|
|
73
|
+
for (const r of rowIndices) {
|
|
74
|
+
const row = [String(r + 1)];
|
|
75
|
+
for (let c = 0; c < colCount; c++) {
|
|
76
|
+
const val = evaluated[r]?.[c] ?? '';
|
|
77
|
+
row.push(val);
|
|
78
|
+
if (val.length > (widths[c + 1] || 0))
|
|
79
|
+
widths[c + 1] = val.length;
|
|
80
|
+
}
|
|
81
|
+
rows.push(row);
|
|
82
|
+
}
|
|
83
|
+
if (rows.length === 0)
|
|
84
|
+
return '(no matching rows)';
|
|
85
|
+
for (const row of rows) {
|
|
86
|
+
if (row[0].length > widths[0])
|
|
87
|
+
widths[0] = row[0].length;
|
|
88
|
+
}
|
|
89
|
+
const header = '| ' + visibleHeaders.map((h, i) => pad(h, widths[i])).join(' | ') + ' |';
|
|
90
|
+
const sepLine = '|' + widths.map(w => '-'.repeat(w + 2)).join('|') + '|';
|
|
91
|
+
const body = rows.map(row => '| ' + row.map((v, i) => pad(v, widths[i])).join(' | ') + ' |');
|
|
92
|
+
return [header, sepLine, ...body].join('\n');
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/** Column metadata parsed from a format row cell */
|
|
2
|
+
export interface ColumnMeta {
|
|
3
|
+
align: string;
|
|
4
|
+
type: string;
|
|
5
|
+
width?: number;
|
|
6
|
+
required?: boolean;
|
|
7
|
+
sort?: string;
|
|
8
|
+
wrap?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** Resolved chart descriptor from a visual formula */
|
|
11
|
+
export interface ChartDescriptor {
|
|
12
|
+
cell: string;
|
|
13
|
+
type: 'pie' | 'bar' | 'line' | 'sparkline' | 'gauge';
|
|
14
|
+
labelRange?: string;
|
|
15
|
+
valueRange?: string;
|
|
16
|
+
resolvedLabels: string[];
|
|
17
|
+
resolvedValues: number[];
|
|
18
|
+
min?: number;
|
|
19
|
+
max?: number;
|
|
20
|
+
}
|
|
21
|
+
/** Row and column index from a cell reference */
|
|
22
|
+
export interface CellIndex {
|
|
23
|
+
row: number;
|
|
24
|
+
col: number;
|
|
25
|
+
}
|
|
26
|
+
/** Bounds of a range reference */
|
|
27
|
+
export interface RangeBounds {
|
|
28
|
+
startRow: number;
|
|
29
|
+
startCol: number;
|
|
30
|
+
endRow: number;
|
|
31
|
+
endCol: number;
|
|
32
|
+
}
|
|
33
|
+
/** Parsed condition from a query string */
|
|
34
|
+
export interface ParsedCondition {
|
|
35
|
+
col: string;
|
|
36
|
+
op: string;
|
|
37
|
+
value: string;
|
|
38
|
+
}
|
|
39
|
+
/** Result from a query operation */
|
|
40
|
+
export interface QueryResult {
|
|
41
|
+
table: string;
|
|
42
|
+
data: string[][];
|
|
43
|
+
headers: string[];
|
|
44
|
+
columnMeta: ColumnMeta[];
|
|
45
|
+
message: string;
|
|
46
|
+
matchCount: number;
|
|
47
|
+
}
|
|
48
|
+
/** Result from a SQL operation */
|
|
49
|
+
export interface SqlResult {
|
|
50
|
+
result: any;
|
|
51
|
+
columnMeta: ColumnMeta[];
|
|
52
|
+
count: number;
|
|
53
|
+
message: string;
|
|
54
|
+
}
|
|
55
|
+
/** Column schema information */
|
|
56
|
+
export interface SchemaColumn {
|
|
57
|
+
column: string;
|
|
58
|
+
type: string;
|
|
59
|
+
align: string;
|
|
60
|
+
nonEmpty: number;
|
|
61
|
+
total: number;
|
|
62
|
+
}
|
|
63
|
+
/** Full engine state snapshot for UI rendering */
|
|
64
|
+
export interface EngineSnapshot {
|
|
65
|
+
table: string;
|
|
66
|
+
data: string[][];
|
|
67
|
+
formulas: Record<string, string>;
|
|
68
|
+
headers: string[];
|
|
69
|
+
columnMeta: ColumnMeta[];
|
|
70
|
+
charts: ChartDescriptor[];
|
|
71
|
+
message: string;
|
|
72
|
+
rows: number;
|
|
73
|
+
cols: number;
|
|
74
|
+
}
|
|
75
|
+
/** Options for CsvEngine construction */
|
|
76
|
+
export interface CsvEngineOptions {
|
|
77
|
+
headers?: string[];
|
|
78
|
+
columnMeta?: ColumnMeta[];
|
|
79
|
+
defaultCols?: number;
|
|
80
|
+
}
|
|
81
|
+
/** Options for CSV serialization */
|
|
82
|
+
export interface ToCsvOptions {
|
|
83
|
+
formatRow?: boolean;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,iDAAiD;AACjD,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,GAAG,CAAC;IACZ,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,gCAAgC;AAChC,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,kDAAkD;AAClD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yCAAyC;AACzC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,oCAAoC;AACpC,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|