@bilig/workbook 0.42.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/dist/find.js ADDED
@@ -0,0 +1,353 @@
1
+ import { formatAddress, parseCellAddress } from '@bilig/formula';
2
+ import { isLiteralInput } from '@bilig/protocol';
3
+ const WORKBOOK_ROW_OPERATORS = ['eq', 'neq', 'contains', 'startsWith', 'gt', 'gte', 'lt', 'lte'];
4
+ const WORKBOOK_ROW_OPERATOR_SET = new Set(WORKBOOK_ROW_OPERATORS);
5
+ function hasOwnString(value, key) {
6
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
7
+ return descriptor !== undefined && typeof descriptor.value === 'string';
8
+ }
9
+ function hasOwnFunction(value, key) {
10
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
11
+ return descriptor !== undefined && typeof descriptor.value === 'function';
12
+ }
13
+ const WORKBOOK_REF_KINDS = new Set(['range', 'name', 'table', 'column', 'rows']);
14
+ function hasValidBaseRef(value) {
15
+ return hasOwnString(value, 'kind') && WORKBOOK_REF_KINDS.has(value.kind) && hasOwnString(value, 'id') && hasOwnString(value, 'label');
16
+ }
17
+ function hasOptionalString(value, key) {
18
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
19
+ return descriptor === undefined || typeof descriptor.value === 'string';
20
+ }
21
+ function hasOptionalStringArray(value, key) {
22
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
23
+ return descriptor === undefined || (Array.isArray(descriptor.value) && descriptor.value.every((entry) => typeof entry === 'string'));
24
+ }
25
+ function isCellRangeRef(value) {
26
+ return (typeof value === 'object' &&
27
+ value !== null &&
28
+ hasOwnString(value, 'sheetName') &&
29
+ hasOwnString(value, 'startAddress') &&
30
+ hasOwnString(value, 'endAddress'));
31
+ }
32
+ function isWorkbookTableRef(value) {
33
+ return (typeof value === 'object' &&
34
+ value !== null &&
35
+ hasValidBaseRef(value) &&
36
+ value.kind === 'table' &&
37
+ hasOptionalString(value, 'name') &&
38
+ hasOptionalString(value, 'sheetName') &&
39
+ hasOptionalStringArray(value, 'headers') &&
40
+ hasOwnFunction(value, 'column'));
41
+ }
42
+ function isWorkbookRowsRef(value) {
43
+ if (typeof value !== 'object' || value === null || !hasValidBaseRef(value) || value.kind !== 'rows' || !hasOwnFunction(value, 'column')) {
44
+ return false;
45
+ }
46
+ const where = Object.getOwnPropertyDescriptor(value, 'where')?.value;
47
+ if (typeof where !== 'object' ||
48
+ where === null ||
49
+ !hasOwnString(where, 'column') ||
50
+ !isWorkbookRowOperator(Object.getOwnPropertyDescriptor(where, 'op')?.value) ||
51
+ !isLiteralInput(Object.getOwnPropertyDescriptor(where, 'value')?.value)) {
52
+ return false;
53
+ }
54
+ const table = Object.getOwnPropertyDescriptor(value, 'table')?.value;
55
+ return hasOptionalString(value, 'sheetName') && (table === undefined || isWorkbookTableRef(table));
56
+ }
57
+ function isWorkbookColumnRef(value) {
58
+ if (typeof value !== 'object' || value === null || !hasValidBaseRef(value) || value.kind !== 'column' || !hasOwnString(value, 'name')) {
59
+ return false;
60
+ }
61
+ const table = Object.getOwnPropertyDescriptor(value, 'table')?.value;
62
+ const rows = Object.getOwnPropertyDescriptor(value, 'rows')?.value;
63
+ return isWorkbookTableRef(table) && (rows === undefined || isWorkbookRowsRef(rows));
64
+ }
65
+ export function isWorkbookRef(value) {
66
+ if (typeof value !== 'object' || value === null || !hasValidBaseRef(value)) {
67
+ return false;
68
+ }
69
+ switch (value.kind) {
70
+ case 'range':
71
+ return isCellRangeRef(Object.getOwnPropertyDescriptor(value, 'range')?.value);
72
+ case 'name':
73
+ return hasOwnString(value, 'name');
74
+ case 'table':
75
+ return isWorkbookTableRef(value);
76
+ case 'column':
77
+ return isWorkbookColumnRef(value);
78
+ case 'rows':
79
+ return isWorkbookRowsRef(value);
80
+ }
81
+ }
82
+ export function collectWorkbookRefs(value) {
83
+ const refs = [];
84
+ const seenRefs = new Set();
85
+ const seenObjects = new WeakSet();
86
+ function pushRef(ref) {
87
+ const key = `${ref.kind}:${ref.id}`;
88
+ if (!seenRefs.has(key)) {
89
+ seenRefs.add(key);
90
+ refs.push(ref);
91
+ }
92
+ }
93
+ function visit(current) {
94
+ if (current === null || current === undefined || typeof current !== 'object') {
95
+ return;
96
+ }
97
+ if (seenObjects.has(current)) {
98
+ return;
99
+ }
100
+ seenObjects.add(current);
101
+ if (isWorkbookRef(current)) {
102
+ pushRef(current);
103
+ if (current.kind === 'column') {
104
+ visit(current.rows);
105
+ visit(current.table);
106
+ }
107
+ if (current.kind === 'rows') {
108
+ visit(current.table);
109
+ }
110
+ return;
111
+ }
112
+ if (Array.isArray(current)) {
113
+ current.forEach(visit);
114
+ return;
115
+ }
116
+ Object.values(current).forEach(visit);
117
+ }
118
+ visit(value);
119
+ return refs;
120
+ }
121
+ function cleanIdPart(value) {
122
+ const cleaned = value
123
+ .trim()
124
+ .replaceAll(/[^A-Za-z0-9_]+/g, '_')
125
+ .replace(/^_+|_+$/g, '');
126
+ return cleaned === '' ? 'ref' : cleaned;
127
+ }
128
+ function requiredSelectorText(value, field) {
129
+ if (typeof value !== 'string') {
130
+ throw new Error(`Workbook selector ${field} must be a string`);
131
+ }
132
+ const trimmed = value.trim();
133
+ if (trimmed === '') {
134
+ throw new Error(`Workbook selector ${field} cannot be empty`);
135
+ }
136
+ return trimmed;
137
+ }
138
+ function optionalSelectorText(value, field) {
139
+ if (value === undefined) {
140
+ return undefined;
141
+ }
142
+ return requiredSelectorText(value, field);
143
+ }
144
+ function normalizeHeaders(headers) {
145
+ if (headers === undefined) {
146
+ return undefined;
147
+ }
148
+ if (!Array.isArray(headers)) {
149
+ throw new Error('Workbook table headers must be an array');
150
+ }
151
+ if (headers.length === 0) {
152
+ throw new Error('Workbook table headers cannot be empty');
153
+ }
154
+ return headers.map((header) => requiredSelectorText(header, 'table header'));
155
+ }
156
+ function normalizeCellAddress(value, field) {
157
+ const raw = requiredSelectorText(value, field);
158
+ try {
159
+ const parsed = parseCellAddress(raw);
160
+ if (parsed.sheetName !== undefined) {
161
+ throw new Error('qualified');
162
+ }
163
+ return {
164
+ row: parsed.row,
165
+ col: parsed.col,
166
+ text: formatAddress(parsed.row, parsed.col),
167
+ };
168
+ }
169
+ catch {
170
+ throw new Error(`Workbook range ${field} is invalid: ${raw}`);
171
+ }
172
+ }
173
+ function assertRangeOrder(start, end) {
174
+ if (end.row < start.row || end.col < start.col) {
175
+ throw new Error('Workbook range endAddress must not be before startAddress');
176
+ }
177
+ }
178
+ function isWorkbookRowOperator(value) {
179
+ return typeof value === 'string' && WORKBOOK_ROW_OPERATOR_SET.has(value);
180
+ }
181
+ function normalizeRowOperator(value) {
182
+ if (!isWorkbookRowOperator(value)) {
183
+ throw new Error(`Unsupported workbook row operator: ${String(value)}`);
184
+ }
185
+ return value;
186
+ }
187
+ function normalizeRowsValue(value) {
188
+ if (!isLiteralInput(value)) {
189
+ throw new Error('Workbook rows selector value must be a finite JSON literal');
190
+ }
191
+ return value;
192
+ }
193
+ function literalIdPart(value) {
194
+ const source = JSON.stringify(value) ?? 'null';
195
+ let encoded = '';
196
+ for (const char of source) {
197
+ encoded += /[A-Za-z0-9]/.test(char) ? char : `_${char.charCodeAt(0).toString(16)}`;
198
+ }
199
+ return cleanIdPart(`${typeof value}_${encoded}`);
200
+ }
201
+ function literalLabel(value) {
202
+ return JSON.stringify(value);
203
+ }
204
+ function hideHelper(target, key) {
205
+ Object.defineProperty(target, key, {
206
+ enumerable: false,
207
+ });
208
+ }
209
+ function rangeLabel(range) {
210
+ return range.startAddress === range.endAddress
211
+ ? `${range.sheetName}!${range.startAddress}`
212
+ : `${range.sheetName}!${range.startAddress}:${range.endAddress}`;
213
+ }
214
+ export function normalizeRangeRef(input) {
215
+ if ('startAddress' in input) {
216
+ const sheetName = requiredSelectorText(input.sheetName, 'sheet name');
217
+ const start = normalizeCellAddress(input.startAddress, 'startAddress');
218
+ const end = normalizeCellAddress(input.endAddress ?? input.startAddress, 'endAddress');
219
+ assertRangeOrder(start, end);
220
+ return {
221
+ sheetName,
222
+ startAddress: start.text,
223
+ endAddress: end.text,
224
+ };
225
+ }
226
+ if ('address' in input) {
227
+ const sheetName = requiredSelectorText(input.sheetName, 'sheet name');
228
+ const address = normalizeCellAddress(input.address, 'address');
229
+ return {
230
+ sheetName,
231
+ startAddress: address.text,
232
+ endAddress: address.text,
233
+ };
234
+ }
235
+ throw new Error('Workbook range selector must include address or startAddress');
236
+ }
237
+ export function createWorkbookTableRef(options) {
238
+ const tableName = optionalSelectorText(options.name, 'table name');
239
+ const sheetName = optionalSelectorText(options.sheetName, 'sheet name');
240
+ const headers = normalizeHeaders(options.headers);
241
+ if (tableName === undefined && sheetName === undefined && headers === undefined) {
242
+ throw new Error('Workbook table selector needs a name, sheet name, or headers');
243
+ }
244
+ const id = cleanIdPart(['table', sheetName, tableName, ...(headers ?? [])].filter(Boolean).join('_'));
245
+ const label = tableName ?? (headers ? `table with ${headers.join(', ')}` : `${sheetName} table`);
246
+ const table = {
247
+ kind: 'table',
248
+ id,
249
+ label,
250
+ ...(tableName !== undefined ? { name: tableName } : {}),
251
+ ...(sheetName !== undefined ? { sheetName } : {}),
252
+ ...(headers !== undefined ? { headers: Object.freeze([...headers]) } : {}),
253
+ column(name) {
254
+ return createWorkbookColumnRef({ table, name });
255
+ },
256
+ };
257
+ hideHelper(table, 'column');
258
+ return Object.freeze(table);
259
+ }
260
+ export function createWorkbookColumnRef(options) {
261
+ const name = requiredSelectorText(options.name, 'column name');
262
+ const ownerId = options.rows?.id ?? options.table.id;
263
+ const ownerLabel = options.rows?.label ?? options.table.label;
264
+ const column = {
265
+ kind: 'column',
266
+ id: cleanIdPart(`${ownerId}_${name}`),
267
+ label: `${ownerLabel}.${name}`,
268
+ table: options.table,
269
+ ...(options.rows !== undefined ? { rows: options.rows } : {}),
270
+ name,
271
+ };
272
+ return Object.freeze(column);
273
+ }
274
+ export function createWorkbookRangeRef(input) {
275
+ const range = normalizeRangeRef(input);
276
+ return Object.freeze({
277
+ kind: 'range',
278
+ id: cleanIdPart(`range_${range.sheetName}_${range.startAddress}_${range.endAddress}`),
279
+ label: rangeLabel(range),
280
+ range: Object.freeze(range),
281
+ });
282
+ }
283
+ export function createWorkbookNameRef(name) {
284
+ const normalizedName = requiredSelectorText(name, 'name');
285
+ return Object.freeze({
286
+ kind: 'name',
287
+ id: cleanIdPart(`name_${normalizedName}`),
288
+ label: normalizedName,
289
+ name: normalizedName,
290
+ });
291
+ }
292
+ export function createWorkbookRowsRef(options) {
293
+ const sheetName = optionalSelectorText(options.sheetName, 'sheet name');
294
+ if (options.table === undefined && sheetName === undefined) {
295
+ throw new Error('Workbook rows selector requires a table or sheet name');
296
+ }
297
+ const where = {
298
+ column: requiredSelectorText(options.where.column, 'row column'),
299
+ op: normalizeRowOperator(options.where.op),
300
+ value: normalizeRowsValue(options.where.value),
301
+ };
302
+ const ownerId = options.table?.id ?? sheetName;
303
+ const ownerLabel = options.table?.label ?? sheetName;
304
+ const rows = {
305
+ kind: 'rows',
306
+ id: cleanIdPart(`${ownerId}_${where.column}_${where.op}_${literalIdPart(where.value)}`),
307
+ label: `${ownerLabel} rows where ${where.column} ${where.op} ${literalLabel(where.value)}`,
308
+ ...(sheetName !== undefined ? { sheetName } : {}),
309
+ ...(options.table !== undefined ? { table: options.table } : {}),
310
+ where: Object.freeze(where),
311
+ column(name) {
312
+ if (rows.table === undefined) {
313
+ throw new Error('Rows column selection requires a table-backed row selector');
314
+ }
315
+ return createWorkbookColumnRef({ table: rows.table, rows, name });
316
+ },
317
+ };
318
+ hideHelper(rows, 'column');
319
+ return Object.freeze(rows);
320
+ }
321
+ export function findTable(options) {
322
+ return createWorkbookTableRef(options);
323
+ }
324
+ export function findColumn(options) {
325
+ return createWorkbookColumnRef(options);
326
+ }
327
+ export function findRange(input) {
328
+ return createWorkbookRangeRef(input);
329
+ }
330
+ export function findName(name) {
331
+ return createWorkbookNameRef(name);
332
+ }
333
+ export function findRows(options) {
334
+ return createWorkbookRowsRef(options);
335
+ }
336
+ export function createWorkbookFindApi() {
337
+ return {
338
+ findTable,
339
+ findColumn,
340
+ findRange,
341
+ findName,
342
+ findRows,
343
+ };
344
+ }
345
+ export const find = Object.freeze({
346
+ ...createWorkbookFindApi(),
347
+ table: findTable,
348
+ column: findColumn,
349
+ range: findRange,
350
+ name: findName,
351
+ rows: findRows,
352
+ });
353
+ //# sourceMappingURL=find.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../src/find.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { WorkbookRef } from './find.js';
2
+ export interface WorkbookFormulaExpression {
3
+ readonly kind: 'formula';
4
+ readonly source: string;
5
+ readonly inputs: readonly WorkbookRef[];
6
+ }
7
+ export interface WorkbookRawFormulaOptions {
8
+ readonly inputs?: readonly WorkbookRef[];
9
+ }
10
+ export type WorkbookFormulaOperand = WorkbookFormulaExpression | WorkbookRef | string | number | boolean;
11
+ declare function call(name: string, args: readonly WorkbookFormulaOperand[]): WorkbookFormulaExpression;
12
+ export declare const formula: {
13
+ readonly raw: (source: string, options?: WorkbookRawFormulaOptions) => WorkbookFormulaExpression;
14
+ readonly source: (expression: WorkbookFormulaOperand) => string;
15
+ readonly inputs: (expression: WorkbookFormulaOperand) => readonly WorkbookRef[];
16
+ readonly ref: (ref: WorkbookRef) => WorkbookFormulaExpression;
17
+ readonly text: (value: string) => WorkbookFormulaExpression;
18
+ readonly call: typeof call;
19
+ readonly add: (left: WorkbookFormulaOperand, right: WorkbookFormulaOperand) => WorkbookFormulaExpression;
20
+ readonly subtract: (left: WorkbookFormulaOperand, right: WorkbookFormulaOperand) => WorkbookFormulaExpression;
21
+ readonly multiply: (left: WorkbookFormulaOperand, right: WorkbookFormulaOperand) => WorkbookFormulaExpression;
22
+ readonly divide: (left: WorkbookFormulaOperand, right: WorkbookFormulaOperand) => WorkbookFormulaExpression;
23
+ readonly sum: (...args: readonly WorkbookFormulaOperand[]) => WorkbookFormulaExpression;
24
+ };
25
+ export {};
@@ -0,0 +1,135 @@
1
+ import { normalizeFormulaFunctionName, parseFormula } from '@bilig/formula';
2
+ function normalizeFormulaSource(source) {
3
+ const trimmed = source.trim();
4
+ if (trimmed === '') {
5
+ throw new Error('Formula source cannot be empty');
6
+ }
7
+ const normalized = trimmed.startsWith('=') ? trimmed.slice(1) : trimmed;
8
+ parseFormula(normalized);
9
+ return normalized;
10
+ }
11
+ function uniqueRefs(refs) {
12
+ const seen = new Set();
13
+ const unique = [];
14
+ for (const ref of refs) {
15
+ const key = `${ref.kind}:${ref.id}`;
16
+ if (seen.has(key)) {
17
+ continue;
18
+ }
19
+ seen.add(key);
20
+ unique.push(ref);
21
+ }
22
+ return unique;
23
+ }
24
+ function createFormulaExpression(source, inputs = []) {
25
+ return {
26
+ kind: 'formula',
27
+ source: normalizeFormulaSource(source),
28
+ inputs: uniqueRefs(inputs),
29
+ };
30
+ }
31
+ function isFormulaExpression(value) {
32
+ return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'formula';
33
+ }
34
+ function isWorkbookRef(value) {
35
+ return (typeof value === 'object' &&
36
+ value !== null &&
37
+ 'kind' in value &&
38
+ typeof value.kind === 'string' &&
39
+ value.kind !== 'formula' &&
40
+ 'id' in value &&
41
+ typeof value.id === 'string');
42
+ }
43
+ function quoteSheetName(sheetName) {
44
+ return /^[A-Za-z_][A-Za-z0-9_]*$/.test(sheetName) ? sheetName : `'${sheetName.replaceAll("'", "''")}'`;
45
+ }
46
+ function formatRangeRef(range) {
47
+ const sheet = quoteSheetName(range.sheetName);
48
+ return range.startAddress === range.endAddress ? `${sheet}!${range.startAddress}` : `${sheet}!${range.startAddress}:${range.endAddress}`;
49
+ }
50
+ function placeholderRefSource(ref) {
51
+ return `__bilig_ref_${ref.id.replaceAll(/[^A-Za-z0-9_]+/g, '_')}`;
52
+ }
53
+ function refSource(ref) {
54
+ if (ref.kind === 'range') {
55
+ return formatRangeRef(ref.range);
56
+ }
57
+ if (ref.kind === 'name') {
58
+ return ref.name;
59
+ }
60
+ if (ref.kind === 'column' && ref.rows === undefined && ref.table.name) {
61
+ return `${ref.table.name}[${ref.name}]`;
62
+ }
63
+ return placeholderRefSource(ref);
64
+ }
65
+ function operandSource(operand) {
66
+ if (isFormulaExpression(operand)) {
67
+ return operand.source;
68
+ }
69
+ if (isWorkbookRef(operand)) {
70
+ return refSource(operand);
71
+ }
72
+ if (typeof operand === 'number') {
73
+ if (!Number.isFinite(operand)) {
74
+ throw new Error('Formula numbers must be finite');
75
+ }
76
+ return String(operand);
77
+ }
78
+ if (typeof operand === 'boolean') {
79
+ return operand ? 'TRUE()' : 'FALSE()';
80
+ }
81
+ return operand;
82
+ }
83
+ function operandInputs(operand) {
84
+ if (isFormulaExpression(operand)) {
85
+ return operand.inputs;
86
+ }
87
+ if (isWorkbookRef(operand)) {
88
+ return [operand];
89
+ }
90
+ return [];
91
+ }
92
+ function collectInputs(args) {
93
+ return uniqueRefs(args.flatMap((arg) => operandInputs(arg)));
94
+ }
95
+ function binary(left, operator, right) {
96
+ return createFormulaExpression(`(${operandSource(left)})${operator}(${operandSource(right)})`, collectInputs([left, right]));
97
+ }
98
+ function call(name, args) {
99
+ const callee = normalizeFormulaFunctionName(name);
100
+ return createFormulaExpression(`${callee}(${args.map(operandSource).join(',')})`, collectInputs(args));
101
+ }
102
+ export const formula = {
103
+ raw(source, options = {}) {
104
+ return createFormulaExpression(source, options.inputs ?? []);
105
+ },
106
+ source(expression) {
107
+ return normalizeFormulaSource(operandSource(expression));
108
+ },
109
+ inputs(expression) {
110
+ return operandInputs(expression);
111
+ },
112
+ ref(ref) {
113
+ return createFormulaExpression(refSource(ref), [ref]);
114
+ },
115
+ text(value) {
116
+ return createFormulaExpression(`"${value.replaceAll('"', '""')}"`);
117
+ },
118
+ call,
119
+ add(left, right) {
120
+ return binary(left, '+', right);
121
+ },
122
+ subtract(left, right) {
123
+ return binary(left, '-', right);
124
+ },
125
+ multiply(left, right) {
126
+ return binary(left, '*', right);
127
+ },
128
+ divide(left, right) {
129
+ return binary(left, '/', right);
130
+ },
131
+ sum(...args) {
132
+ return call('SUM', args);
133
+ },
134
+ };
135
+ //# sourceMappingURL=formula.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formula.js","sourceRoot":"","sources":["../src/formula.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { EngineOp, EngineOpBatch, WorkbookOp } from './ops.js';
2
+ export declare function isWorkbookOp(value: unknown): value is WorkbookOp;
3
+ export declare function isEngineOp(value: unknown): value is EngineOp;
4
+ export declare function isEngineOps(value: unknown): value is EngineOp[];
5
+ export declare function isEngineOpBatch(value: unknown): value is EngineOpBatch;