@ricsam/formula-engine 0.0.21 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/cjs/core/commands/command-executor.cjs +3 -5
  2. package/dist/cjs/core/commands/command-executor.cjs.map +3 -3
  3. package/dist/cjs/core/commands/structure-commands.cjs.map +1 -1
  4. package/dist/cjs/core/commands/table-commands.cjs.map +1 -1
  5. package/dist/cjs/core/engine.cjs +56 -42
  6. package/dist/cjs/core/engine.cjs.map +3 -3
  7. package/dist/cjs/core/managers/{api-schema-manager.cjs → schema-manager.cjs} +67 -7
  8. package/dist/cjs/core/managers/schema-manager.cjs.map +10 -0
  9. package/dist/cjs/core/{api → schema}/cell-orm.cjs +9 -23
  10. package/dist/cjs/core/schema/cell-orm.cjs.map +10 -0
  11. package/dist/cjs/core/schema/grid-orm.cjs +115 -0
  12. package/dist/cjs/core/schema/grid-orm.cjs.map +10 -0
  13. package/dist/cjs/core/{api/api-builder.cjs → schema/schema-builder.cjs} +21 -14
  14. package/dist/cjs/core/schema/schema-builder.cjs.map +10 -0
  15. package/dist/cjs/core/{api/api-helpers.cjs → schema/schema-helpers.cjs} +12 -13
  16. package/dist/cjs/core/schema/schema-helpers.cjs.map +10 -0
  17. package/dist/cjs/core/{api/api.cjs → schema/schema.cjs} +31 -13
  18. package/dist/cjs/core/schema/schema.cjs.map +10 -0
  19. package/dist/cjs/core/{api → schema}/table-orm.cjs +27 -19
  20. package/dist/cjs/core/schema/table-orm.cjs.map +10 -0
  21. package/dist/cjs/lib.cjs +7 -8
  22. package/dist/cjs/lib.cjs.map +3 -3
  23. package/dist/cjs/package.json +1 -1
  24. package/dist/mjs/core/commands/command-executor.mjs +3 -5
  25. package/dist/mjs/core/commands/command-executor.mjs.map +3 -3
  26. package/dist/mjs/core/commands/structure-commands.mjs.map +1 -1
  27. package/dist/mjs/core/commands/table-commands.mjs.map +1 -1
  28. package/dist/mjs/core/engine.mjs +57 -43
  29. package/dist/mjs/core/engine.mjs.map +3 -3
  30. package/dist/mjs/core/managers/{api-schema-manager.mjs → schema-manager.mjs} +64 -4
  31. package/dist/mjs/core/managers/schema-manager.mjs.map +10 -0
  32. package/dist/mjs/core/schema/cell-orm.mjs +35 -0
  33. package/dist/mjs/core/schema/cell-orm.mjs.map +10 -0
  34. package/dist/mjs/core/schema/grid-orm.mjs +84 -0
  35. package/dist/mjs/core/schema/grid-orm.mjs.map +10 -0
  36. package/dist/mjs/core/schema/schema-builder.mjs +34 -0
  37. package/dist/mjs/core/schema/schema-builder.mjs.map +10 -0
  38. package/dist/mjs/core/{api/api-helpers.mjs → schema/schema-helpers.mjs} +9 -10
  39. package/dist/mjs/core/schema/schema-helpers.mjs.map +10 -0
  40. package/dist/mjs/core/schema/schema.mjs +51 -0
  41. package/dist/mjs/core/schema/schema.mjs.map +10 -0
  42. package/dist/mjs/core/{api → schema}/table-orm.mjs +13 -5
  43. package/dist/mjs/core/schema/table-orm.mjs.map +10 -0
  44. package/dist/mjs/lib.mjs +6 -7
  45. package/dist/mjs/lib.mjs.map +2 -2
  46. package/dist/mjs/package.json +1 -1
  47. package/dist/types/core/commands/command-executor.d.ts +1 -3
  48. package/dist/types/core/commands/structure-commands.d.ts +2 -2
  49. package/dist/types/core/commands/table-commands.d.ts +2 -2
  50. package/dist/types/core/engine.d.ts +34 -7
  51. package/dist/types/core/managers/{api-schema-manager.d.ts → schema-manager.d.ts} +26 -5
  52. package/dist/types/core/{api → schema}/cell-orm.d.ts +8 -4
  53. package/dist/types/core/schema/grid-orm.d.ts +63 -0
  54. package/dist/types/core/schema/schema-builder.d.ts +16 -0
  55. package/dist/types/core/{api/api-helpers.d.ts → schema/schema-helpers.d.ts} +16 -4
  56. package/dist/types/core/schema/schema.d.ts +167 -0
  57. package/dist/types/core/{api → schema}/table-orm.d.ts +1 -1
  58. package/dist/types/lib.d.ts +6 -6
  59. package/package.json +1 -1
  60. package/dist/cjs/core/api/api-builder.cjs.map +0 -10
  61. package/dist/cjs/core/api/api-helpers.cjs.map +0 -10
  62. package/dist/cjs/core/api/api.cjs.map +0 -10
  63. package/dist/cjs/core/api/cell-orm.cjs.map +0 -10
  64. package/dist/cjs/core/api/table-orm.cjs.map +0 -10
  65. package/dist/cjs/core/managers/api-schema-manager.cjs.map +0 -10
  66. package/dist/mjs/core/api/api-builder.mjs +0 -27
  67. package/dist/mjs/core/api/api-builder.mjs.map +0 -10
  68. package/dist/mjs/core/api/api-helpers.mjs.map +0 -10
  69. package/dist/mjs/core/api/api.mjs +0 -33
  70. package/dist/mjs/core/api/api.mjs.map +0 -10
  71. package/dist/mjs/core/api/cell-orm.mjs +0 -49
  72. package/dist/mjs/core/api/cell-orm.mjs.map +0 -10
  73. package/dist/mjs/core/api/table-orm.mjs.map +0 -10
  74. package/dist/mjs/core/managers/api-schema-manager.mjs.map +0 -10
  75. package/dist/types/core/api/api-builder.d.ts +0 -16
  76. package/dist/types/core/api/api.d.ts +0 -91
  77. /package/dist/types/core/{api/api.type-test.d.ts → schema/schema.type-test.d.ts} +0 -0
@@ -0,0 +1,115 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
6
+ var __toCommonJS = (from) => {
7
+ var entry = __moduleCache.get(from), desc;
8
+ if (entry)
9
+ return entry;
10
+ entry = __defProp({}, "__esModule", { value: true });
11
+ if (from && typeof from === "object" || typeof from === "function")
12
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
+ get: () => from[key],
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ }));
16
+ __moduleCache.set(from, entry);
17
+ return entry;
18
+ };
19
+ var __export = (target, all) => {
20
+ for (var name in all)
21
+ __defProp(target, name, {
22
+ get: all[name],
23
+ enumerable: true,
24
+ configurable: true,
25
+ set: (newValue) => all[name] = () => newValue
26
+ });
27
+ };
28
+
29
+ // src/core/schema/grid-orm.ts
30
+ var exports_grid_orm = {};
31
+ __export(exports_grid_orm, {
32
+ GridOrm: () => GridOrm
33
+ });
34
+ module.exports = __toCommonJS(exports_grid_orm);
35
+
36
+ class GridOrm {
37
+ engine;
38
+ workbookName;
39
+ sheetName;
40
+ range;
41
+ parser;
42
+ writer;
43
+ namespace;
44
+ numCols;
45
+ numRows;
46
+ constructor(engine, workbookName, sheetName, range, parser, writer, namespace) {
47
+ this.engine = engine;
48
+ this.workbookName = workbookName;
49
+ this.sheetName = sheetName;
50
+ this.range = range;
51
+ this.parser = parser;
52
+ this.writer = writer;
53
+ this.namespace = namespace;
54
+ this.numCols = range.end.col - range.start.col + 1;
55
+ this.numRows = range.end.row - range.start.row + 1;
56
+ }
57
+ getCellAddress(colIndex, rowIndex) {
58
+ return {
59
+ workbookName: this.workbookName,
60
+ sheetName: this.sheetName,
61
+ colIndex: this.range.start.col + colIndex,
62
+ rowIndex: this.range.start.row + rowIndex
63
+ };
64
+ }
65
+ readCell(colIndex, rowIndex) {
66
+ const cellAddress = this.getCellAddress(colIndex, rowIndex);
67
+ const value = this.engine.getCellValue(cellAddress);
68
+ const metadata = this.engine.getCellMetadata(cellAddress);
69
+ return this.parser(value, metadata);
70
+ }
71
+ writeCell(colIndex, rowIndex, value) {
72
+ const cellAddress = this.getCellAddress(colIndex, rowIndex);
73
+ const { value: serializedValue, metadata } = this.writer(value);
74
+ this.engine.setCellContent(cellAddress, serializedValue);
75
+ if (metadata !== undefined) {
76
+ this.engine.setCellMetadata(cellAddress, metadata);
77
+ }
78
+ }
79
+ get columns() {
80
+ const result = [];
81
+ for (let col = 0;col < this.numCols; col++) {
82
+ const column = [];
83
+ for (let row = 0;row < this.numRows; row++) {
84
+ column.push(this.readCell(col, row));
85
+ }
86
+ result.push(column);
87
+ }
88
+ return result;
89
+ }
90
+ get rows() {
91
+ const result = [];
92
+ for (let row = 0;row < this.numRows; row++) {
93
+ const rowData = [];
94
+ for (let col = 0;col < this.numCols; col++) {
95
+ rowData.push(this.readCell(col, row));
96
+ }
97
+ result.push(rowData);
98
+ }
99
+ return result;
100
+ }
101
+ setValue(value, position) {
102
+ if (position.col < 0 || position.col >= this.numCols || position.row < 0 || position.row >= this.numRows) {
103
+ throw new Error(`Grid schema "${this.namespace}": Position (${position.col}, ${position.row}) is out of bounds. Grid is ${this.numCols}x${this.numRows}.`);
104
+ }
105
+ this.writeCell(position.col, position.row, value);
106
+ }
107
+ getValue(position) {
108
+ if (position.col < 0 || position.col >= this.numCols || position.row < 0 || position.row >= this.numRows) {
109
+ throw new Error(`Grid schema "${this.namespace}": Position (${position.col}, ${position.row}) is out of bounds. Grid is ${this.numCols}x${this.numRows}.`);
110
+ }
111
+ return this.readCell(position.col, position.row);
112
+ }
113
+ }
114
+
115
+ //# debugId=9DFA8A8B57E0C11764756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/schema/grid-orm.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * GridOrm - Object-Relational Mapping for grid/range data\n *\n * Provides read/write operations for a 2D range of cells with type-safe access.\n * Supports both column-major and row-major array access patterns.\n */\n\nimport type {\n CellAddress,\n FiniteSpreadsheetRange,\n SerializedCellValue,\n} from \"../types.cjs\";\nimport type { FormulaEngine } from \"../engine.cjs\";\n\nexport type GridParseFunction<TCellMetadata, TValue> = (\n value: unknown,\n metadata: TCellMetadata\n) => TValue;\n\nexport type GridWriteFunction<TCellMetadata, TValue> = (value: TValue) => {\n value: SerializedCellValue;\n metadata?: TCellMetadata;\n};\n\nexport class GridOrm<TValue, TCellMetadata = unknown> {\n private numCols: number;\n private numRows: number;\n\n constructor(\n private engine: FormulaEngine<any, any>,\n private workbookName: string,\n private sheetName: string,\n private range: FiniteSpreadsheetRange,\n private parser: GridParseFunction<TCellMetadata, TValue>,\n private writer: GridWriteFunction<TCellMetadata, TValue>,\n private namespace: string\n ) {\n this.numCols = range.end.col - range.start.col + 1;\n this.numRows = range.end.row - range.start.row + 1;\n }\n\n /**\n * Get the cell address for a given column and row index within the grid\n */\n private getCellAddress(colIndex: number, rowIndex: number): CellAddress {\n return {\n workbookName: this.workbookName,\n sheetName: this.sheetName,\n colIndex: this.range.start.col + colIndex,\n rowIndex: this.range.start.row + rowIndex,\n };\n }\n\n /**\n * Read a single cell and parse it\n */\n private readCell(colIndex: number, rowIndex: number): TValue {\n const cellAddress = this.getCellAddress(colIndex, rowIndex);\n const value = this.engine.getCellValue(cellAddress);\n const metadata = this.engine.getCellMetadata(cellAddress) as TCellMetadata;\n return this.parser(value, metadata);\n }\n\n /**\n * Write a single cell using the write function\n */\n private writeCell(colIndex: number, rowIndex: number, value: TValue): void {\n const cellAddress = this.getCellAddress(colIndex, rowIndex);\n const { value: serializedValue, metadata } = this.writer(value);\n this.engine.setCellContent(cellAddress, serializedValue);\n if (metadata !== undefined) {\n this.engine.setCellMetadata(cellAddress, metadata);\n }\n }\n\n /**\n * Get all cells as a column-major 2D array (readonly)\n * columns[colIndex][rowIndex]\n */\n get columns(): readonly (readonly TValue[])[] {\n const result: TValue[][] = [];\n for (let col = 0; col < this.numCols; col++) {\n const column: TValue[] = [];\n for (let row = 0; row < this.numRows; row++) {\n column.push(this.readCell(col, row));\n }\n result.push(column);\n }\n return result;\n }\n\n /**\n * Get all cells as a row-major 2D array (readonly)\n * rows[rowIndex][colIndex]\n */\n get rows(): readonly (readonly TValue[])[] {\n const result: TValue[][] = [];\n for (let row = 0; row < this.numRows; row++) {\n const rowData: TValue[] = [];\n for (let col = 0; col < this.numCols; col++) {\n rowData.push(this.readCell(col, row));\n }\n result.push(rowData);\n }\n return result;\n }\n\n /**\n * Set a single value at the specified position\n * Position is relative to the grid (0-indexed)\n */\n setValue(value: TValue, position: { col: number; row: number }): void {\n if (\n position.col < 0 ||\n position.col >= this.numCols ||\n position.row < 0 ||\n position.row >= this.numRows\n ) {\n throw new Error(\n `Grid schema \"${this.namespace}\": Position (${position.col}, ${position.row}) is out of bounds. Grid is ${this.numCols}x${this.numRows}.`\n );\n }\n this.writeCell(position.col, position.row, value);\n }\n\n /**\n * Get a single value at the specified position\n * Position is relative to the grid (0-indexed)\n */\n getValue(position: { col: number; row: number }): TValue {\n if (\n position.col < 0 ||\n position.col >= this.numCols ||\n position.row < 0 ||\n position.row >= this.numRows\n ) {\n throw new Error(\n `Grid schema \"${this.namespace}\": Position (${position.col}, ${position.row}) is out of bounds. Grid is ${this.numCols}x${this.numRows}.`\n );\n }\n return this.readCell(position.col, position.row);\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "9DFA8A8B57E0C11764756E2164756E21",
9
+ "names": []
10
+ }
@@ -26,32 +26,39 @@ var __export = (target, all) => {
26
26
  });
27
27
  };
28
28
 
29
- // src/core/api/api-builder.ts
30
- var exports_api_builder = {};
31
- __export(exports_api_builder, {
32
- buildApiFromDeclaration: () => buildApiFromDeclaration
29
+ // src/core/schema/schema-builder.ts
30
+ var exports_schema_builder = {};
31
+ __export(exports_schema_builder, {
32
+ buildSchemaFromDeclaration: () => buildSchemaFromDeclaration
33
33
  });
34
- module.exports = __toCommonJS(exports_api_builder);
34
+ module.exports = __toCommonJS(exports_schema_builder);
35
35
  var import_table_orm = require("./table-orm.cjs");
36
36
  var import_cell_orm = require("./cell-orm.cjs");
37
- function buildApiFromDeclaration(engine, declaration, schemaManager) {
38
- const api = {};
37
+ var import_grid_orm = require("./grid-orm.cjs");
38
+ function buildSchemaFromDeclaration(engine, declaration, schemaManager) {
39
+ const schema = {};
39
40
  for (const [namespace, def] of Object.entries(declaration)) {
40
41
  if (def.type === "table") {
41
- api[namespace] = buildTableApi(engine, namespace, def, schemaManager);
42
+ schema[namespace] = buildTableSchema(engine, namespace, def, schemaManager);
42
43
  } else if (def.type === "cell") {
43
- api[namespace] = buildCellApi(engine, namespace, def, schemaManager);
44
+ schema[namespace] = buildCellSchema(engine, namespace, def, schemaManager);
45
+ } else if (def.type === "grid") {
46
+ schema[namespace] = buildGridSchema(engine, namespace, def, schemaManager);
44
47
  }
45
48
  }
46
- return api;
49
+ return schema;
47
50
  }
48
- function buildTableApi(engine, namespace, def, schemaManager) {
51
+ function buildTableSchema(engine, namespace, def, schemaManager) {
49
52
  schemaManager.registerTableSchema(namespace, def.workbookName, def.tableName, def.headers);
50
53
  return new import_table_orm.TableOrm(engine, def.workbookName, def.tableName, def.headers, namespace);
51
54
  }
52
- function buildCellApi(engine, namespace, def, schemaManager) {
55
+ function buildCellSchema(engine, namespace, def, schemaManager) {
53
56
  schemaManager.registerCellSchema(namespace, def.cellAddress, def.parse);
54
- return new import_cell_orm.CellOrm(engine, def.cellAddress, def.parse, namespace);
57
+ return new import_cell_orm.CellOrm(engine, def.cellAddress, def.parse, def.write, namespace);
58
+ }
59
+ function buildGridSchema(engine, namespace, def, schemaManager) {
60
+ schemaManager.registerGridSchema(namespace, def.workbookName, def.sheetName, def.range, def.parse);
61
+ return new import_grid_orm.GridOrm(engine, def.workbookName, def.sheetName, def.range, def.parse, def.write, namespace);
55
62
  }
56
63
 
57
- //# debugId=EDDFC14633608D2364756E2164756E21
64
+ //# debugId=15B25C9179A5FA3364756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/schema/schema-builder.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Schema Builder - Constructs the working schema from declarations\n *\n * This module is responsible for creating the actual working schema\n * from the schema declarations when attached to a FormulaEngine.\n */\n\nimport type { FormulaEngine } from \"../engine.cjs\";\nimport type { SchemaDeclaration, TableSchemaDefinition, CellSchemaDefinition, GridSchemaDefinition, Schema } from \"./schema.cjs\";\nimport { TableOrm } from \"./table-orm.cjs\";\nimport { CellOrm } from \"./cell-orm.cjs\";\nimport { GridOrm } from \"./grid-orm.cjs\";\nimport type { SchemaManager } from \"../managers/schema-manager.cjs\";\n\n/**\n * Build the working schema surface from declarations\n *\n * This creates TableOrm, CellOrm, and GridOrm instances for each declared schema\n * and returns them directly.\n */\nexport function buildSchemaFromDeclaration(\n engine: FormulaEngine<any, any>,\n declaration: SchemaDeclaration,\n schemaManager: SchemaManager\n): Schema {\n const schema: Schema = {};\n\n for (const [namespace, def] of Object.entries(declaration)) {\n if (def.type === \"table\") {\n schema[namespace] = buildTableSchema(engine, namespace, def, schemaManager);\n } else if (def.type === \"cell\") {\n schema[namespace] = buildCellSchema(engine, namespace, def, schemaManager);\n } else if (def.type === \"grid\") {\n schema[namespace] = buildGridSchema(engine, namespace, def, schemaManager);\n }\n }\n\n return schema;\n}\n\n/**\n * Build schema for a table schema - returns TableOrm instance directly\n */\nfunction buildTableSchema(\n engine: FormulaEngine<any, any>,\n namespace: string,\n def: TableSchemaDefinition,\n schemaManager: SchemaManager\n): TableOrm<any> {\n // Register the schema with the schema manager\n schemaManager.registerTableSchema(\n namespace,\n def.workbookName,\n def.tableName,\n def.headers\n );\n\n // Create and return the ORM instance directly\n return new TableOrm(\n engine,\n def.workbookName,\n def.tableName,\n def.headers,\n namespace\n );\n}\n\n/**\n * Build schema for a cell schema - returns CellOrm instance directly\n */\nfunction buildCellSchema(\n engine: FormulaEngine<any, any>,\n namespace: string,\n def: CellSchemaDefinition,\n schemaManager: SchemaManager\n): CellOrm<any> {\n // Register the schema with the schema manager\n schemaManager.registerCellSchema(namespace, def.cellAddress, def.parse);\n\n // Create and return the ORM instance directly\n return new CellOrm(engine, def.cellAddress, def.parse, def.write, namespace);\n}\n\n/**\n * Build schema for a grid schema - returns GridOrm instance directly\n */\nfunction buildGridSchema(\n engine: FormulaEngine<any, any>,\n namespace: string,\n def: GridSchemaDefinition,\n schemaManager: SchemaManager\n): GridOrm<any> {\n // Register the schema with the schema manager\n schemaManager.registerGridSchema(\n namespace,\n def.workbookName,\n def.sheetName,\n def.range,\n def.parse\n );\n\n // Create and return the ORM instance directly\n return new GridOrm(\n engine,\n def.workbookName,\n def.sheetName,\n def.range,\n def.parse,\n def.write,\n namespace\n );\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASyB,IAAzB;AACwB,IAAxB;AACwB,IAAxB;AASO,SAAS,0BAA0B,CACxC,QACA,aACA,eACQ;AAAA,EACR,MAAM,SAAiB,CAAC;AAAA,EAExB,YAAY,WAAW,QAAQ,OAAO,QAAQ,WAAW,GAAG;AAAA,IAC1D,IAAI,IAAI,SAAS,SAAS;AAAA,MACxB,OAAO,aAAa,iBAAiB,QAAQ,WAAW,KAAK,aAAa;AAAA,IAC5E,EAAO,SAAI,IAAI,SAAS,QAAQ;AAAA,MAC9B,OAAO,aAAa,gBAAgB,QAAQ,WAAW,KAAK,aAAa;AAAA,IAC3E,EAAO,SAAI,IAAI,SAAS,QAAQ;AAAA,MAC9B,OAAO,aAAa,gBAAgB,QAAQ,WAAW,KAAK,aAAa;AAAA,IAC3E;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,gBAAgB,CACvB,QACA,WACA,KACA,eACe;AAAA,EAEf,cAAc,oBACZ,WACA,IAAI,cACJ,IAAI,WACJ,IAAI,OACN;AAAA,EAGA,OAAO,IAAI,0BACT,QACA,IAAI,cACJ,IAAI,WACJ,IAAI,SACJ,SACF;AAAA;AAMF,SAAS,eAAe,CACtB,QACA,WACA,KACA,eACc;AAAA,EAEd,cAAc,mBAAmB,WAAW,IAAI,aAAa,IAAI,KAAK;AAAA,EAGtE,OAAO,IAAI,wBAAQ,QAAQ,IAAI,aAAa,IAAI,OAAO,IAAI,OAAO,SAAS;AAAA;AAM7E,SAAS,eAAe,CACtB,QACA,WACA,KACA,eACc;AAAA,EAEd,cAAc,mBACZ,WACA,IAAI,cACJ,IAAI,WACJ,IAAI,OACJ,IAAI,KACN;AAAA,EAGA,OAAO,IAAI,wBACT,QACA,IAAI,cACJ,IAAI,WACJ,IAAI,OACJ,IAAI,OACJ,IAAI,OACJ,SACF;AAAA;",
8
+ "debugId": "15B25C9179A5FA3364756E2164756E21",
9
+ "names": []
10
+ }
@@ -26,9 +26,9 @@ var __export = (target, all) => {
26
26
  });
27
27
  };
28
28
 
29
- // src/core/api/api-helpers.ts
30
- var exports_api_helpers = {};
31
- __export(exports_api_helpers, {
29
+ // src/core/schema/schema-helpers.ts
30
+ var exports_schema_helpers = {};
31
+ __export(exports_schema_helpers, {
32
32
  rowToObject: () => rowToObject,
33
33
  objectToRowValues: () => objectToRowValues,
34
34
  matchesFilter: () => matchesFilter,
@@ -36,7 +36,7 @@ __export(exports_api_helpers, {
36
36
  getTableRowCount: () => getTableRowCount,
37
37
  getNextEmptyRow: () => getNextEmptyRow
38
38
  });
39
- module.exports = __toCommonJS(exports_api_helpers);
39
+ module.exports = __toCommonJS(exports_schema_helpers);
40
40
  function rowToObject(engine, table, rowIndex, headers, getCellMetadata) {
41
41
  const result = {};
42
42
  for (const [columnName, header] of Object.entries(headers)) {
@@ -54,19 +54,18 @@ function rowToObject(engine, table, rowIndex, headers, getCellMetadata) {
54
54
  }
55
55
  function objectToRowValues(obj, headers) {
56
56
  const values = new Map;
57
+ const metadata = new Map;
57
58
  for (const [columnName, header] of Object.entries(headers)) {
58
59
  if (columnName in obj) {
59
- const value = obj[columnName];
60
- if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
61
- values.set(header.index, value);
62
- } else if (value === null || value === undefined) {
63
- values.set(header.index, undefined);
64
- } else {
65
- values.set(header.index, String(value));
60
+ const columnValue = obj[columnName];
61
+ const { value, metadata: cellMetadata } = header.write(columnValue);
62
+ values.set(header.index, value);
63
+ if (cellMetadata !== undefined) {
64
+ metadata.set(header.index, cellMetadata);
66
65
  }
67
66
  }
68
67
  }
69
- return values;
68
+ return { values, metadata };
70
69
  }
71
70
  function matchesFilter(item, filter) {
72
71
  for (const [key, value] of Object.entries(filter)) {
@@ -188,4 +187,4 @@ function* iterateTableRows(engine, table) {
188
187
  }
189
188
  }
190
189
 
191
- //# debugId=3AEF0EFABA7782E064756E2164756E21
190
+ //# debugId=631CD8D4D858EB5464756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/schema/schema-helpers.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Schema Helper utilities for row/object conversion and filtering\n */\n\nimport type { CellAddress, SerializedCellValue, TableDefinition } from \"../types.cjs\";\nimport type { FormulaEngine } from \"../engine.cjs\";\n\nexport type ParseFunction<TCellMetadata = unknown> = (\n value: SerializedCellValue,\n metadata: TCellMetadata\n) => unknown;\n\nexport type WriteFunction<TCellMetadata = unknown> = (value: unknown) => {\n value: SerializedCellValue;\n metadata?: TCellMetadata;\n};\n\nexport type TableSchemaHeaders<TCellMetadata = unknown> = Record<\n string,\n {\n parse: ParseFunction<TCellMetadata>;\n write: WriteFunction<TCellMetadata>;\n index: number;\n }\n>;\n\n/**\n * Convert a spreadsheet row to a typed object using header parsers\n */\nexport function rowToObject<TItem extends Record<string, unknown>>(\n engine: FormulaEngine<any, any>,\n table: TableDefinition,\n rowIndex: number,\n headers: TableSchemaHeaders,\n getCellMetadata?: (cell: CellAddress) => unknown\n): TItem {\n const result: Record<string, unknown> = {};\n\n for (const [columnName, header] of Object.entries(headers)) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + header.index,\n rowIndex,\n };\n\n const value = engine.getCellValue(cellAddress);\n const metadata = getCellMetadata ? getCellMetadata(cellAddress) : undefined;\n\n // Parse the value using the column's parse function\n result[columnName] = header.parse(value, metadata);\n }\n\n return result as TItem;\n}\n\n/**\n * Result from objectToRowValues including both values and optional metadata\n */\nexport type RowValuesResult<TCellMetadata = unknown> = {\n values: Map<number, SerializedCellValue>;\n metadata: Map<number, TCellMetadata>;\n};\n\n/**\n * Convert a typed object to cell values based on headers using write functions\n */\nexport function objectToRowValues<TItem extends Record<string, unknown>, TCellMetadata = unknown>(\n obj: TItem,\n headers: TableSchemaHeaders<TCellMetadata>\n): RowValuesResult<TCellMetadata> {\n const values = new Map<number, SerializedCellValue>();\n const metadata = new Map<number, TCellMetadata>();\n\n for (const [columnName, header] of Object.entries(headers)) {\n if (columnName in obj) {\n const columnValue = obj[columnName];\n const { value, metadata: cellMetadata } = header.write(columnValue);\n values.set(header.index, value);\n if (cellMetadata !== undefined) {\n metadata.set(header.index, cellMetadata);\n }\n }\n }\n\n return { values, metadata };\n}\n\n/**\n * Check if an object matches a filter predicate\n */\nexport function matchesFilter<TItem extends Record<string, unknown>>(\n item: TItem,\n filter: Partial<TItem>\n): boolean {\n for (const [key, value] of Object.entries(filter)) {\n if (item[key] !== value) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Get the number of data rows in a table (excluding header)\n */\nexport function getTableRowCount(\n engine: FormulaEngine<any, any>,\n table: TableDefinition\n): number {\n if (table.endRow.type === \"infinity\") {\n // For infinite tables, count non-empty rows\n // Start from data row (after header)\n let count = 0;\n let emptyRowStreak = 0;\n const maxEmptyRows = 10; // Stop after 10 consecutive empty rows\n\n for (let row = table.start.rowIndex + 1; emptyRowStreak < maxEmptyRows; row++) {\n let hasContent = false;\n\n for (let col = 0; col < table.headers.size; col++) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + col,\n rowIndex: row,\n };\n\n const value = engine.getCellValue(cellAddress);\n if (value !== \"\" && value !== undefined) {\n hasContent = true;\n break;\n }\n }\n\n if (hasContent) {\n count++;\n emptyRowStreak = 0;\n } else {\n emptyRowStreak++;\n }\n }\n\n return count;\n } else {\n // For finite tables, calculate from endRow\n return table.endRow.value - table.start.rowIndex;\n }\n}\n\n/**\n * Get the next empty row index for appending data\n */\nexport function getNextEmptyRow(\n engine: FormulaEngine<any, any>,\n table: TableDefinition\n): number {\n const dataStartRow = table.start.rowIndex + 1;\n\n if (table.endRow.type === \"infinity\") {\n // Find first empty row\n let emptyRowStreak = 0;\n const maxEmptyRows = 10;\n\n for (let row = dataStartRow; ; row++) {\n let hasContent = false;\n\n for (let col = 0; col < table.headers.size; col++) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + col,\n rowIndex: row,\n };\n\n const value = engine.getCellValue(cellAddress);\n if (value !== \"\" && value !== undefined) {\n hasContent = true;\n break;\n }\n }\n\n if (!hasContent) {\n return row;\n }\n\n emptyRowStreak = hasContent ? 0 : emptyRowStreak + 1;\n if (emptyRowStreak >= maxEmptyRows) {\n return row - maxEmptyRows + 1;\n }\n }\n } else {\n // For finite tables, return the row after the last data row\n return table.endRow.value + 1;\n }\n}\n\n/**\n * Iterate over all data rows in a table\n */\nexport function* iterateTableRows(\n engine: FormulaEngine<any, any>,\n table: TableDefinition\n): Generator<{ rowIndex: number; isEmpty: boolean }> {\n const dataStartRow = table.start.rowIndex + 1;\n\n if (table.endRow.type === \"infinity\") {\n let emptyRowStreak = 0;\n const maxEmptyRows = 10;\n\n for (let row = dataStartRow; emptyRowStreak < maxEmptyRows; row++) {\n let hasContent = false;\n\n for (let col = 0; col < table.headers.size; col++) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + col,\n rowIndex: row,\n };\n\n const value = engine.getCellValue(cellAddress);\n if (value !== \"\" && value !== undefined) {\n hasContent = true;\n break;\n }\n }\n\n if (hasContent) {\n emptyRowStreak = 0;\n yield { rowIndex: row, isEmpty: false };\n } else {\n emptyRowStreak++;\n // Don't yield empty rows at the end\n }\n }\n } else {\n for (let row = dataStartRow; row <= table.endRow.value; row++) {\n let hasContent = false;\n\n for (let col = 0; col < table.headers.size; col++) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + col,\n rowIndex: row,\n };\n\n const value = engine.getCellValue(cellAddress);\n if (value !== \"\" && value !== undefined) {\n hasContent = true;\n break;\n }\n }\n\n yield { rowIndex: row, isEmpty: !hasContent };\n }\n }\n}\n\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "631CD8D4D858EB5464756E2164756E21",
9
+ "names": []
10
+ }
@@ -26,17 +26,17 @@ var __export = (target, all) => {
26
26
  });
27
27
  };
28
28
 
29
- // src/core/api/api.ts
30
- var exports_api = {};
31
- __export(exports_api, {
32
- defineApi: () => defineApi,
33
- createApi: () => createApi
29
+ // src/core/schema/schema.ts
30
+ var exports_schema = {};
31
+ __export(exports_schema, {
32
+ defineSchema: () => defineSchema,
33
+ createHeader: () => createHeader
34
34
  });
35
- module.exports = __toCommonJS(exports_api);
36
- function defineApi() {
35
+ module.exports = __toCommonJS(exports_schema);
36
+ function defineSchema() {
37
37
  const declaration = {};
38
38
  const builder = {
39
- addTableApi(namespace, address, headers) {
39
+ addTableSchema(namespace, address, headers) {
40
40
  declaration[namespace] = {
41
41
  type: "table",
42
42
  tableName: address.tableName,
@@ -45,19 +45,37 @@ function defineApi() {
45
45
  };
46
46
  return builder;
47
47
  },
48
- addCellApi(namespace, cellAddress, parse) {
48
+ addCellSchema(namespace, cellAddress, parse, write) {
49
49
  declaration[namespace] = {
50
50
  type: "cell",
51
51
  cellAddress,
52
- parse
52
+ parse,
53
+ write: write ?? ((value) => ({ value }))
53
54
  };
54
55
  return builder;
55
56
  },
56
- api: undefined,
57
+ addGridSchema(namespace, address, range, parse, write) {
58
+ declaration[namespace] = {
59
+ type: "grid",
60
+ workbookName: address.workbookName,
61
+ sheetName: address.sheetName,
62
+ range,
63
+ parse,
64
+ write: write ?? ((value) => ({ value }))
65
+ };
66
+ return builder;
67
+ },
68
+ schema: undefined,
57
69
  declaration
58
70
  };
59
71
  return builder;
60
72
  }
61
- var createApi = defineApi;
73
+ var createHeader = (index, parse, write) => {
74
+ return {
75
+ parse,
76
+ write: write ?? ((value) => ({ value })),
77
+ index
78
+ };
79
+ };
62
80
 
63
- //# debugId=071184DEA6DB276964756E2164756E21
81
+ //# debugId=FD12878AE32EA1DA64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/schema/schema.ts"],
4
+ "sourcesContent": [
5
+ "import type {\n CellAddress,\n FiniteSpreadsheetRange,\n SerializedCellValue,\n} from \"../types.cjs\";\n\n/**\n * Define a schema for the FormulaEngine.\n *\n * The returned object contains:\n * - `declaration`: The schema definitions for tables and cells\n * - `schema`: A type-only placeholder (undefined at runtime) for TypeScript inference\n *\n * The actual working schema is only available through `engine.schema` after\n * attaching the definition to a FormulaEngine instance.\n *\n * @example\n * ```typescript\n * const mySchema = defineSchema<CellMetadata>()\n * .addTableSchema(\"users\", { workbookName: \"wb1\", tableName: \"users\" }, headers)\n * .addCellSchema(\"config\", cellAddress, parse);\n *\n * const engine = new FormulaEngine(mySchema);\n * engine.schema.users.findWhere({ id: 1 }); // Works!\n * engine.schema.config.read(); // Works!\n * mySchema.schema.users.findWhere({ id: 1 }); // Error: schema is undefined at runtime\n * ```\n */\nexport function defineSchema<\n TCellMetadata = unknown,\n TCurrentSchema extends Record<string, object> = Record<string, object>,\n TCurrentDeclaration extends Record<\n string,\n TableSchemaDefinition | CellSchemaDefinition | GridSchemaDefinition\n > = Record<\n string,\n TableSchemaDefinition | CellSchemaDefinition | GridSchemaDefinition\n >\n>(): CreateSchema<TCellMetadata, TCurrentSchema, TCurrentDeclaration> {\n const declaration: Record<\n string,\n TableSchemaDefinition | CellSchemaDefinition | GridSchemaDefinition\n > = {};\n\n const builder: CreateSchema<\n TCellMetadata,\n TCurrentSchema,\n TCurrentDeclaration\n > = {\n addTableSchema(namespace, address, headers) {\n declaration[namespace] = {\n type: \"table\",\n tableName: address.tableName,\n workbookName: address.workbookName,\n headers: headers as any,\n };\n return builder as any;\n },\n\n addCellSchema(\n namespace: string,\n cellAddress: CellAddress,\n parse: any,\n write?: any\n ) {\n declaration[namespace] = {\n type: \"cell\",\n cellAddress,\n parse,\n write: write ?? ((value: unknown) => ({ value: value as SerializedCellValue })),\n };\n return builder as any;\n },\n\n addGridSchema(\n namespace: string,\n address: { workbookName: string; sheetName: string },\n range: FiniteSpreadsheetRange,\n parse: any,\n write?: any\n ) {\n declaration[namespace] = {\n type: \"grid\",\n workbookName: address.workbookName,\n sheetName: address.sheetName,\n range,\n parse,\n write: write ?? ((value: unknown) => ({ value: value as SerializedCellValue })),\n };\n return builder as any;\n },\n\n // schema is undefined at runtime - it only exists for TypeScript type inference\n // The actual working schema is built by the FormulaEngine constructor\n schema: undefined as any as TCurrentSchema,\n\n declaration: declaration as TCurrentDeclaration,\n };\n\n return builder;\n}\n\nexport interface TableSchemaDefinition {\n type: \"table\";\n headers: Headers<unknown>;\n tableName: string;\n workbookName: string;\n}\n\nexport interface CellSchemaDefinition {\n type: \"cell\";\n cellAddress: CellAddress;\n parse: (value: unknown, metadata: unknown) => unknown;\n write: (value: unknown) => {\n value: SerializedCellValue;\n metadata?: unknown;\n };\n}\n\nexport interface GridSchemaDefinition {\n type: \"grid\";\n workbookName: string;\n sheetName: string;\n range: FiniteSpreadsheetRange;\n parse: (value: unknown, metadata: unknown) => unknown;\n write: (value: unknown) => {\n value: SerializedCellValue;\n metadata?: unknown;\n };\n}\n\ntype Headers<TCellMetadata> = Record<\n string,\n {\n parse: (value: SerializedCellValue, metadata: TCellMetadata) => unknown;\n write: (value: any) => {\n value: SerializedCellValue;\n metadata?: TCellMetadata;\n };\n index: number;\n }\n>;\n\n/**\n * Type representing the TableOrm methods exposed on the schema\n */\nexport type TableOrmSchema<TItem extends Record<string, unknown>> = {\n findWhere(filter: Partial<TItem>): TItem | undefined;\n findAllWhere(filter: Partial<TItem>): TItem[];\n append(item: TItem): TItem;\n updateWhere(filter: Partial<TItem>, update: Partial<TItem>): number;\n removeWhere(filter: Partial<TItem>): number;\n count(): number;\n};\n\n/**\n * Type representing the CellOrm methods exposed on the schema\n */\nexport type CellOrmSchema<TValue> = {\n read(): TValue;\n write(value: TValue): void;\n getAddress(): CellAddress;\n};\n\n/**\n * Type representing the GridOrm methods exposed on the schema\n */\nexport type GridOrmSchema<TValue> = {\n columns: readonly TValue[][];\n rows: readonly TValue[][];\n setValue(value: TValue, position: { col: number; row: number }): void;\n getValue(position: { col: number; row: number }): TValue;\n};\n\nexport type SchemaDeclaration = Record<\n string,\n TableSchemaDefinition | CellSchemaDefinition | GridSchemaDefinition\n>;\nexport type Schema = Record<string, object>;\n\n/**\n * Write function type for converting parsed values back to serializable form\n */\ntype WriteFunction<TValue, TCellMetadata> = (value: TValue) => {\n value: SerializedCellValue;\n metadata?: TCellMetadata;\n};\n\n/**\n * Helper type to create the return type for addCellSchema/addGridSchema\n */\ntype AddCellSchemaResult<\n TCellMetadata,\n TCurrentSchema extends Schema,\n TCurrentDeclaration extends SchemaDeclaration,\n T extends string,\n TValue\n> = CreateSchema<\n TCellMetadata,\n TCurrentSchema & {\n [K in T]: CellOrmSchema<TValue>;\n },\n TCurrentDeclaration & {\n [K in T]: {\n type: \"cell\";\n cellAddress: CellAddress;\n parse: (value: unknown, metadata: unknown) => unknown;\n };\n }\n>;\n\ntype AddGridSchemaResult<\n TCellMetadata,\n TCurrentSchema extends Schema,\n TCurrentDeclaration extends SchemaDeclaration,\n T extends string,\n TValue\n> = CreateSchema<\n TCellMetadata,\n TCurrentSchema & {\n [K in T]: GridOrmSchema<TValue>;\n },\n TCurrentDeclaration & {\n [K in T]: {\n type: \"grid\";\n workbookName: string;\n sheetName: string;\n range: FiniteSpreadsheetRange;\n parse: (value: unknown, metadata: unknown) => unknown;\n };\n }\n>;\n\nexport type CreateSchema<\n TCellMetadata,\n TCurrentSchema extends Schema,\n TCurrentDeclaration extends SchemaDeclaration\n> = {\n addTableSchema<T extends string, THeaders extends Headers<TCellMetadata>>(\n namespace: T,\n address: { workbookName: string; tableName: string },\n headers: THeaders\n ): CreateSchema<\n TCellMetadata,\n TCurrentSchema & {\n [K in T]: TableOrmSchema<{\n [H in keyof THeaders]: ReturnType<THeaders[H][\"parse\"]>;\n }>;\n },\n TCurrentDeclaration & {\n [K in T]: {\n type: \"table\";\n tableName: string;\n workbookName: string;\n headers: THeaders;\n };\n }\n >;\n\n // Overload 1: TValue is any type - write is required\n addCellSchema<T extends string, TValue>(\n namespace: T,\n cellAddress: CellAddress,\n parse: (value: unknown, metadata: TCellMetadata) => TValue,\n write: WriteFunction<TValue, TCellMetadata>\n ): AddCellSchemaResult<TCellMetadata, TCurrentSchema, TCurrentDeclaration, T, TValue>;\n\n // Overload 2: TValue extends SerializedCellValue - write is optional\n addCellSchema<T extends string, TValue extends SerializedCellValue>(\n namespace: T,\n cellAddress: CellAddress,\n parse: (value: unknown, metadata: TCellMetadata) => TValue,\n write?: WriteFunction<TValue, TCellMetadata>\n ): AddCellSchemaResult<TCellMetadata, TCurrentSchema, TCurrentDeclaration, T, TValue>;\n\n // Overload 1: TValue is any type - write is required\n addGridSchema<T extends string, TValue>(\n namespace: T,\n address: { workbookName: string; sheetName: string },\n range: FiniteSpreadsheetRange,\n parse: (value: unknown, metadata: TCellMetadata) => TValue,\n write: WriteFunction<TValue, TCellMetadata>\n ): AddGridSchemaResult<TCellMetadata, TCurrentSchema, TCurrentDeclaration, T, TValue>;\n\n // Overload 2: TValue extends SerializedCellValue - write is optional\n addGridSchema<T extends string, TValue extends SerializedCellValue>(\n namespace: T,\n address: { workbookName: string; sheetName: string },\n range: FiniteSpreadsheetRange,\n parse: (value: unknown, metadata: TCellMetadata) => TValue,\n write?: WriteFunction<TValue, TCellMetadata>\n ): AddGridSchemaResult<TCellMetadata, TCurrentSchema, TCurrentDeclaration, T, TValue>;\n\n schema: TCurrentSchema;\n declaration: TCurrentDeclaration;\n};\n\nexport const createHeader = <TValue, TMetadata>(\n index: number,\n parse: (value: SerializedCellValue, metadata: TMetadata) => TValue,\n write?: (value: TValue) => {\n value: SerializedCellValue;\n metadata?: TMetadata;\n }\n) => {\n return {\n parse,\n write: write ?? ((value) => ({ value })),\n index,\n };\n};\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BO,SAAS,YAUf,GAAqE;AAAA,EACpE,MAAM,cAGF,CAAC;AAAA,EAEL,MAAM,UAIF;AAAA,IACF,cAAc,CAAC,WAAW,SAAS,SAAS;AAAA,MAC1C,YAAY,aAAa;AAAA,QACvB,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB,cAAc,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,MACA,OAAO;AAAA;AAAA,IAGT,aAAa,CACX,WACA,aACA,OACA,OACA;AAAA,MACA,YAAY,aAAa;AAAA,QACvB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,OAAO,UAAU,CAAC,WAAoB,EAAE,MAAoC;AAAA,MAC9E;AAAA,MACA,OAAO;AAAA;AAAA,IAGT,aAAa,CACX,WACA,SACA,OACA,OACA,OACA;AAAA,MACA,YAAY,aAAa;AAAA,QACvB,MAAM;AAAA,QACN,cAAc,QAAQ;AAAA,QACtB,WAAW,QAAQ;AAAA,QACnB;AAAA,QACA;AAAA,QACA,OAAO,UAAU,CAAC,WAAoB,EAAE,MAAoC;AAAA,MAC9E;AAAA,MACA,OAAO;AAAA;AAAA,IAKT,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAsMF,IAAM,eAAe,CAC1B,OACA,OACA,UAIG;AAAA,EACH,OAAO;AAAA,IACL;AAAA,IACA,OAAO,UAAU,CAAC,WAAW,EAAE,MAAM;AAAA,IACrC;AAAA,EACF;AAAA;",
8
+ "debugId": "FD12878AE32EA1DA64756E2164756E21",
9
+ "names": []
10
+ }
@@ -26,13 +26,13 @@ var __export = (target, all) => {
26
26
  });
27
27
  };
28
28
 
29
- // src/core/api/table-orm.ts
29
+ // src/core/schema/table-orm.ts
30
30
  var exports_table_orm = {};
31
31
  __export(exports_table_orm, {
32
32
  TableOrm: () => TableOrm
33
33
  });
34
34
  module.exports = __toCommonJS(exports_table_orm);
35
- var import_api_helpers = require("./api-helpers.cjs");
35
+ var import_schema_helpers = require("./schema-helpers.cjs");
36
36
 
37
37
  class TableOrm {
38
38
  engine;
@@ -59,12 +59,12 @@ class TableOrm {
59
59
  }
60
60
  findWhere(filter) {
61
61
  const table = this.getTable();
62
- for (const { rowIndex, isEmpty } of import_api_helpers.iterateTableRows(this.engine, table)) {
62
+ for (const { rowIndex, isEmpty } of import_schema_helpers.iterateTableRows(this.engine, table)) {
63
63
  if (isEmpty)
64
64
  continue;
65
65
  try {
66
- const item = import_api_helpers.rowToObject(this.engine, table, rowIndex, this.headers, (cell) => this.engine.getCellMetadata(cell));
67
- if (import_api_helpers.matchesFilter(item, filter)) {
66
+ const item = import_schema_helpers.rowToObject(this.engine, table, rowIndex, this.headers, (cell) => this.engine.getCellMetadata(cell));
67
+ if (import_schema_helpers.matchesFilter(item, filter)) {
68
68
  return item;
69
69
  }
70
70
  } catch {
@@ -76,12 +76,12 @@ class TableOrm {
76
76
  findAllWhere(filter) {
77
77
  const table = this.getTable();
78
78
  const results = [];
79
- for (const { rowIndex, isEmpty } of import_api_helpers.iterateTableRows(this.engine, table)) {
79
+ for (const { rowIndex, isEmpty } of import_schema_helpers.iterateTableRows(this.engine, table)) {
80
80
  if (isEmpty)
81
81
  continue;
82
82
  try {
83
- const item = import_api_helpers.rowToObject(this.engine, table, rowIndex, this.headers, (cell) => this.engine.getCellMetadata(cell));
84
- if (import_api_helpers.matchesFilter(item, filter)) {
83
+ const item = import_schema_helpers.rowToObject(this.engine, table, rowIndex, this.headers, (cell) => this.engine.getCellMetadata(cell));
84
+ if (import_schema_helpers.matchesFilter(item, filter)) {
85
85
  results.push(item);
86
86
  }
87
87
  } catch {
@@ -92,8 +92,8 @@ class TableOrm {
92
92
  }
93
93
  append(item) {
94
94
  const table = this.getTable();
95
- const nextRow = import_api_helpers.getNextEmptyRow(this.engine, table);
96
- const values = import_api_helpers.objectToRowValues(item, this.headers);
95
+ const nextRow = import_schema_helpers.getNextEmptyRow(this.engine, table);
96
+ const { values, metadata } = import_schema_helpers.objectToRowValues(item, this.headers);
97
97
  for (const [colOffset, value] of values) {
98
98
  const cellAddress = {
99
99
  workbookName: table.workbookName,
@@ -102,19 +102,23 @@ class TableOrm {
102
102
  rowIndex: nextRow
103
103
  };
104
104
  this.engine.setCellContent(cellAddress, value);
105
+ const cellMetadata = metadata.get(colOffset);
106
+ if (cellMetadata !== undefined) {
107
+ this.engine.setCellMetadata(cellAddress, cellMetadata);
108
+ }
105
109
  }
106
110
  return item;
107
111
  }
108
112
  updateWhere(filter, update) {
109
113
  const table = this.getTable();
110
114
  let updatedCount = 0;
111
- for (const { rowIndex, isEmpty } of import_api_helpers.iterateTableRows(this.engine, table)) {
115
+ for (const { rowIndex, isEmpty } of import_schema_helpers.iterateTableRows(this.engine, table)) {
112
116
  if (isEmpty)
113
117
  continue;
114
118
  try {
115
- const item = import_api_helpers.rowToObject(this.engine, table, rowIndex, this.headers, (cell) => this.engine.getCellMetadata(cell));
116
- if (import_api_helpers.matchesFilter(item, filter)) {
117
- const values = import_api_helpers.objectToRowValues(update, this.headers);
119
+ const item = import_schema_helpers.rowToObject(this.engine, table, rowIndex, this.headers, (cell) => this.engine.getCellMetadata(cell));
120
+ if (import_schema_helpers.matchesFilter(item, filter)) {
121
+ const { values, metadata } = import_schema_helpers.objectToRowValues(update, this.headers);
118
122
  for (const [colOffset, value] of values) {
119
123
  const cellAddress = {
120
124
  workbookName: table.workbookName,
@@ -123,6 +127,10 @@ class TableOrm {
123
127
  rowIndex
124
128
  };
125
129
  this.engine.setCellContent(cellAddress, value);
130
+ const cellMetadata = metadata.get(colOffset);
131
+ if (cellMetadata !== undefined) {
132
+ this.engine.setCellMetadata(cellAddress, cellMetadata);
133
+ }
126
134
  }
127
135
  updatedCount++;
128
136
  }
@@ -136,12 +144,12 @@ class TableOrm {
136
144
  const table = this.getTable();
137
145
  let removedCount = 0;
138
146
  const rowsToRemove = [];
139
- for (const { rowIndex, isEmpty } of import_api_helpers.iterateTableRows(this.engine, table)) {
147
+ for (const { rowIndex, isEmpty } of import_schema_helpers.iterateTableRows(this.engine, table)) {
140
148
  if (isEmpty)
141
149
  continue;
142
150
  try {
143
- const item = import_api_helpers.rowToObject(this.engine, table, rowIndex, this.headers, (cell) => this.engine.getCellMetadata(cell));
144
- if (import_api_helpers.matchesFilter(item, filter)) {
151
+ const item = import_schema_helpers.rowToObject(this.engine, table, rowIndex, this.headers, (cell) => this.engine.getCellMetadata(cell));
152
+ if (import_schema_helpers.matchesFilter(item, filter)) {
145
153
  rowsToRemove.push(rowIndex);
146
154
  }
147
155
  } catch {
@@ -164,8 +172,8 @@ class TableOrm {
164
172
  }
165
173
  count() {
166
174
  const table = this.getTable();
167
- return import_api_helpers.getTableRowCount(this.engine, table);
175
+ return import_schema_helpers.getTableRowCount(this.engine, table);
168
176
  }
169
177
  }
170
178
 
171
- //# debugId=EAD2C30DE3B432C664756E2164756E21
179
+ //# debugId=E445B024AB5DF50264756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/schema/table-orm.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * TableOrm - Object-Relational Mapping for table data\n *\n * Provides CRUD operations for table data with type-safe access.\n * Used as the `this` context for custom table API methods.\n */\n\nimport type { CellAddress, SerializedCellValue, TableDefinition } from \"../types.cjs\";\nimport type { FormulaEngine } from \"../engine.cjs\";\nimport {\n rowToObject,\n objectToRowValues,\n matchesFilter,\n getTableRowCount,\n getNextEmptyRow,\n iterateTableRows,\n type TableSchemaHeaders,\n} from \"./schema-helpers.cjs\";\n\nexport class TableOrm<TItem extends Record<string, unknown>> {\n constructor(\n private engine: FormulaEngine<any, any>,\n private workbookName: string,\n private tableName: string,\n private headers: TableSchemaHeaders,\n private namespace: string\n ) {}\n\n /**\n * Get the table definition from the engine\n */\n private getTable(): TableDefinition {\n const table = this.engine._tableManager.getTable({\n workbookName: this.workbookName,\n name: this.tableName,\n });\n\n if (!table) {\n throw new Error(\n `Table \"${this.tableName}\" not found in workbook \"${this.workbookName}\"`\n );\n }\n\n return table;\n }\n\n /**\n * Find the first row matching the filter\n */\n findWhere(filter: Partial<TItem>): TItem | undefined {\n const table = this.getTable();\n\n for (const { rowIndex, isEmpty } of iterateTableRows(this.engine, table)) {\n if (isEmpty) continue;\n\n try {\n const item = rowToObject<TItem>(\n this.engine,\n table,\n rowIndex,\n this.headers,\n (cell) => this.engine.getCellMetadata(cell)\n );\n\n if (matchesFilter(item, filter)) {\n return item;\n }\n } catch {\n // Skip rows that fail parsing\n continue;\n }\n }\n\n return undefined;\n }\n\n /**\n * Find all rows matching the filter\n */\n findAllWhere(filter: Partial<TItem>): TItem[] {\n const table = this.getTable();\n const results: TItem[] = [];\n\n for (const { rowIndex, isEmpty } of iterateTableRows(this.engine, table)) {\n if (isEmpty) continue;\n\n try {\n const item = rowToObject<TItem>(\n this.engine,\n table,\n rowIndex,\n this.headers,\n (cell) => this.engine.getCellMetadata(cell)\n );\n\n if (matchesFilter(item, filter)) {\n results.push(item);\n }\n } catch {\n // Skip rows that fail parsing\n continue;\n }\n }\n\n return results;\n }\n\n /**\n * Append a new row to the table\n */\n append(item: TItem): TItem {\n const table = this.getTable();\n const nextRow = getNextEmptyRow(this.engine, table);\n const { values, metadata } = objectToRowValues(item, this.headers);\n\n // Write each cell value and metadata\n for (const [colOffset, value] of values) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + colOffset,\n rowIndex: nextRow,\n };\n\n this.engine.setCellContent(cellAddress, value);\n const cellMetadata = metadata.get(colOffset);\n if (cellMetadata !== undefined) {\n this.engine.setCellMetadata(cellAddress, cellMetadata);\n }\n }\n\n return item;\n }\n\n /**\n * Update all rows matching the filter\n * Returns the number of rows updated\n */\n updateWhere(filter: Partial<TItem>, update: Partial<TItem>): number {\n const table = this.getTable();\n let updatedCount = 0;\n\n for (const { rowIndex, isEmpty } of iterateTableRows(this.engine, table)) {\n if (isEmpty) continue;\n\n try {\n const item = rowToObject<TItem>(\n this.engine,\n table,\n rowIndex,\n this.headers,\n (cell) => this.engine.getCellMetadata(cell)\n );\n\n if (matchesFilter(item, filter)) {\n // Apply updates\n const { values, metadata } = objectToRowValues(update as TItem, this.headers);\n\n for (const [colOffset, value] of values) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + colOffset,\n rowIndex,\n };\n\n this.engine.setCellContent(cellAddress, value);\n const cellMetadata = metadata.get(colOffset);\n if (cellMetadata !== undefined) {\n this.engine.setCellMetadata(cellAddress, cellMetadata);\n }\n }\n\n updatedCount++;\n }\n } catch {\n // Skip rows that fail parsing\n continue;\n }\n }\n\n return updatedCount;\n }\n\n /**\n * Remove all rows matching the filter\n * Returns the number of rows removed\n */\n removeWhere(filter: Partial<TItem>): number {\n const table = this.getTable();\n let removedCount = 0;\n\n // Collect rows to remove (in reverse order to avoid index shifting issues)\n const rowsToRemove: number[] = [];\n\n for (const { rowIndex, isEmpty } of iterateTableRows(this.engine, table)) {\n if (isEmpty) continue;\n\n try {\n const item = rowToObject<TItem>(\n this.engine,\n table,\n rowIndex,\n this.headers,\n (cell) => this.engine.getCellMetadata(cell)\n );\n\n if (matchesFilter(item, filter)) {\n rowsToRemove.push(rowIndex);\n }\n } catch {\n // Skip rows that fail parsing\n continue;\n }\n }\n\n // Remove rows in reverse order\n for (const rowIndex of rowsToRemove.reverse()) {\n // Clear all cells in the row\n for (const header of Object.values(this.headers)) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + header.index,\n rowIndex,\n };\n\n this.engine.setCellContent(cellAddress, undefined);\n }\n\n removedCount++;\n }\n\n return removedCount;\n }\n\n /**\n * Get the count of data rows in the table\n */\n count(): number {\n const table = this.getTable();\n return getTableRowCount(this.engine, table);\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "E445B024AB5DF50264756E2164756E21",
9
+ "names": []
10
+ }
package/dist/cjs/lib.cjs CHANGED
@@ -46,10 +46,9 @@ var __export = (target, all) => {
46
46
  // src/lib.ts
47
47
  var exports_lib = {};
48
48
  __export(exports_lib, {
49
- defineApi: () => import_api.defineApi,
50
- createApi: () => import_api.createApi,
49
+ defineSchema: () => import_schema.defineSchema,
51
50
  TableOrm: () => import_table_orm.TableOrm,
52
- SchemaValidationError: () => import_api_schema_manager.SchemaValidationError,
51
+ SchemaValidationError: () => import_schema_manager.SchemaValidationError,
53
52
  SchemaIntegrityError: () => import_command_executor.SchemaIntegrityError,
54
53
  FormulaEngine: () => import_engine.FormulaEngine,
55
54
  CellOrm: () => import_cell_orm.CellOrm
@@ -59,10 +58,10 @@ var import_engine = require("./core/engine.cjs");
59
58
  __reExport(exports_lib, require("./core/types.cjs"), module.exports);
60
59
  __reExport(exports_lib, require("./core/utils.cjs"), module.exports);
61
60
  __reExport(exports_lib, require("./core/utils/color-utils.cjs"), module.exports);
62
- var import_api = require("./core/api/api.cjs");
63
- var import_table_orm = require("./core/api/table-orm.cjs");
64
- var import_cell_orm = require("./core/api/cell-orm.cjs");
65
- var import_api_schema_manager = require("./core/managers/api-schema-manager.cjs");
61
+ var import_schema = require("./core/schema/schema.cjs");
62
+ var import_table_orm = require("./core/schema/table-orm.cjs");
63
+ var import_cell_orm = require("./core/schema/cell-orm.cjs");
64
+ var import_schema_manager = require("./core/managers/schema-manager.cjs");
66
65
  var import_command_executor = require("./core/commands/command-executor.cjs");
67
66
 
68
- //# debugId=D4C7FF28839214A564756E2164756E21
67
+ //# debugId=0F275ACDD498695964756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib.ts"],
4
4
  "sourcesContent": [
5
- "export { FormulaEngine } from \"./core/engine.cjs\";\nexport * from \"./core/types.cjs\";\nexport * from \"./core/utils.cjs\";\nexport * from \"./core/utils/color-utils.cjs\";\n\n// API Schema exports\nexport { defineApi, createApi } from \"./core/api/api.cjs\";\nexport type { CreateApi, Declaration, Api, TableApi, CellApi } from \"./core/api/api.cjs\";\nexport { TableOrm } from \"./core/api/table-orm.cjs\";\nexport { CellOrm } from \"./core/api/cell-orm.cjs\";\nexport { SchemaValidationError } from \"./core/managers/api-schema-manager.cjs\";\nexport type { ValidationResult } from \"./core/managers/api-schema-manager.cjs\";\n\n// Command Pattern exports\nexport { SchemaIntegrityError } from \"./core/commands/command-executor.cjs\";\nexport type { EngineAction, EngineCommand } from \"./core/commands/types.cjs\";\n"
5
+ "export { FormulaEngine } from \"./core/engine.cjs\";\nexport * from \"./core/types.cjs\";\nexport * from \"./core/utils.cjs\";\nexport * from \"./core/utils/color-utils.cjs\";\n\n// Schema exports\nexport { defineSchema } from \"./core/schema/schema.cjs\";\nexport type { CreateSchema, SchemaDeclaration, Schema, TableSchemaDefinition, CellSchemaDefinition, TableOrmSchema, CellOrmSchema } from \"./core/schema/schema.cjs\";\nexport { TableOrm } from \"./core/schema/table-orm.cjs\";\nexport { CellOrm } from \"./core/schema/cell-orm.cjs\";\nexport { SchemaValidationError } from \"./core/managers/schema-manager.cjs\";\nexport type { ValidationResult } from \"./core/managers/schema-manager.cjs\";\n\n// Command Pattern exports\nexport { SchemaIntegrityError } from \"./core/commands/command-executor.cjs\";\nexport type { EngineAction, EngineCommand } from \"./core/commands/types.cjs\";\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAA8B,IAA9B;AACA;AACA;AACA;AAGqC,IAArC;AAEyB,IAAzB;AACwB,IAAxB;AACsC,IAAtC;AAIqC,IAArC;",
8
- "debugId": "D4C7FF28839214A564756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAA8B,IAA9B;AACA;AACA;AACA;AAG6B,IAA7B;AAEyB,IAAzB;AACwB,IAAxB;AACsC,IAAtC;AAIqC,IAArC;",
8
+ "debugId": "0F275ACDD498695964756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/formula-engine",
3
- "version": "0.0.21",
3
+ "version": "0.1.0",
4
4
  "type": "commonjs"
5
5
  }