@b2bc-devkit/sheetorm 1.1.0 → 1.2.3
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/package.json +171 -86
- package/readme.md +57 -17
- package/dist/npm/SheetOrm.d.ts +0 -41
- package/dist/npm/SheetOrm.d.ts.map +0 -1
- package/dist/npm/SheetOrm.js +0 -41
- package/dist/npm/SheetOrm.js.map +0 -1
- package/dist/npm/core/Decorators.d.ts +0 -145
- package/dist/npm/core/Decorators.d.ts.map +0 -1
- package/dist/npm/core/Decorators.js +0 -226
- package/dist/npm/core/Decorators.js.map +0 -1
- package/dist/npm/core/Record.d.ts +0 -178
- package/dist/npm/core/Record.d.ts.map +0 -1
- package/dist/npm/core/Record.js +0 -313
- package/dist/npm/core/Record.js.map +0 -1
- package/dist/npm/core/RecordConstructor.d.ts +0 -20
- package/dist/npm/core/RecordConstructor.d.ts.map +0 -1
- package/dist/npm/core/RecordConstructor.js +0 -2
- package/dist/npm/core/RecordConstructor.js.map +0 -1
- package/dist/npm/core/RecordStatic.d.ts +0 -23
- package/dist/npm/core/RecordStatic.d.ts.map +0 -1
- package/dist/npm/core/RecordStatic.js +0 -2
- package/dist/npm/core/RecordStatic.js.map +0 -1
- package/dist/npm/core/Registry.d.ts +0 -101
- package/dist/npm/core/Registry.d.ts.map +0 -1
- package/dist/npm/core/Registry.js +0 -226
- package/dist/npm/core/Registry.js.map +0 -1
- package/dist/npm/core/SheetRepository.d.ts +0 -331
- package/dist/npm/core/SheetRepository.d.ts.map +0 -1
- package/dist/npm/core/SheetRepository.js +0 -1041
- package/dist/npm/core/SheetRepository.js.map +0 -1
- package/dist/npm/core/cache/MemoryCache.d.ts +0 -67
- package/dist/npm/core/cache/MemoryCache.d.ts.map +0 -1
- package/dist/npm/core/cache/MemoryCache.js +0 -112
- package/dist/npm/core/cache/MemoryCache.js.map +0 -1
- package/dist/npm/core/types/Entity.d.ts +0 -21
- package/dist/npm/core/types/Entity.d.ts.map +0 -1
- package/dist/npm/core/types/Entity.js +0 -2
- package/dist/npm/core/types/Entity.js.map +0 -1
- package/dist/npm/core/types/FieldDefinition.d.ts +0 -21
- package/dist/npm/core/types/FieldDefinition.d.ts.map +0 -1
- package/dist/npm/core/types/FieldDefinition.js +0 -2
- package/dist/npm/core/types/FieldDefinition.js.map +0 -1
- package/dist/npm/core/types/FieldType.d.ts +0 -12
- package/dist/npm/core/types/FieldType.d.ts.map +0 -1
- package/dist/npm/core/types/FieldType.js +0 -2
- package/dist/npm/core/types/FieldType.js.map +0 -1
- package/dist/npm/core/types/Filter.d.ts +0 -16
- package/dist/npm/core/types/Filter.d.ts.map +0 -1
- package/dist/npm/core/types/Filter.js +0 -2
- package/dist/npm/core/types/Filter.js.map +0 -1
- package/dist/npm/core/types/FilterOperator.d.ts +0 -16
- package/dist/npm/core/types/FilterOperator.d.ts.map +0 -1
- package/dist/npm/core/types/FilterOperator.js +0 -2
- package/dist/npm/core/types/FilterOperator.js.map +0 -1
- package/dist/npm/core/types/GroupResult.d.ts +0 -14
- package/dist/npm/core/types/GroupResult.d.ts.map +0 -1
- package/dist/npm/core/types/GroupResult.js +0 -2
- package/dist/npm/core/types/GroupResult.js.map +0 -1
- package/dist/npm/core/types/ICacheProvider.d.ts +0 -20
- package/dist/npm/core/types/ICacheProvider.d.ts.map +0 -1
- package/dist/npm/core/types/ICacheProvider.js +0 -2
- package/dist/npm/core/types/ICacheProvider.js.map +0 -1
- package/dist/npm/core/types/ISheetAdapter.d.ts +0 -53
- package/dist/npm/core/types/ISheetAdapter.d.ts.map +0 -1
- package/dist/npm/core/types/ISheetAdapter.js +0 -2
- package/dist/npm/core/types/ISheetAdapter.js.map +0 -1
- package/dist/npm/core/types/ISpreadsheetAdapter.d.ts +0 -41
- package/dist/npm/core/types/ISpreadsheetAdapter.d.ts.map +0 -1
- package/dist/npm/core/types/ISpreadsheetAdapter.js +0 -2
- package/dist/npm/core/types/ISpreadsheetAdapter.js.map +0 -1
- package/dist/npm/core/types/IndexDefinition.d.ts +0 -16
- package/dist/npm/core/types/IndexDefinition.d.ts.map +0 -1
- package/dist/npm/core/types/IndexDefinition.js +0 -2
- package/dist/npm/core/types/IndexDefinition.js.map +0 -1
- package/dist/npm/core/types/LifecycleHooks.d.ts +0 -32
- package/dist/npm/core/types/LifecycleHooks.d.ts.map +0 -1
- package/dist/npm/core/types/LifecycleHooks.js +0 -2
- package/dist/npm/core/types/LifecycleHooks.js.map +0 -1
- package/dist/npm/core/types/PaginatedResult.d.ts +0 -18
- package/dist/npm/core/types/PaginatedResult.d.ts.map +0 -1
- package/dist/npm/core/types/PaginatedResult.js +0 -2
- package/dist/npm/core/types/PaginatedResult.js.map +0 -1
- package/dist/npm/core/types/QueryOptions.d.ts +0 -21
- package/dist/npm/core/types/QueryOptions.d.ts.map +0 -1
- package/dist/npm/core/types/QueryOptions.js +0 -2
- package/dist/npm/core/types/QueryOptions.js.map +0 -1
- package/dist/npm/core/types/SortClause.d.ts +0 -10
- package/dist/npm/core/types/SortClause.d.ts.map +0 -1
- package/dist/npm/core/types/SortClause.js +0 -2
- package/dist/npm/core/types/SortClause.js.map +0 -1
- package/dist/npm/core/types/SystemColumns.d.ts +0 -16
- package/dist/npm/core/types/SystemColumns.d.ts.map +0 -1
- package/dist/npm/core/types/SystemColumns.js +0 -16
- package/dist/npm/core/types/SystemColumns.js.map +0 -1
- package/dist/npm/core/types/TableSchema.d.ts +0 -24
- package/dist/npm/core/types/TableSchema.d.ts.map +0 -1
- package/dist/npm/core/types/TableSchema.js +0 -2
- package/dist/npm/core/types/TableSchema.js.map +0 -1
- package/dist/npm/index/IndexMeta.d.ts +0 -16
- package/dist/npm/index/IndexMeta.d.ts.map +0 -1
- package/dist/npm/index/IndexMeta.js +0 -2
- package/dist/npm/index/IndexMeta.js.map +0 -1
- package/dist/npm/index/IndexStore.d.ts +0 -397
- package/dist/npm/index/IndexStore.d.ts.map +0 -1
- package/dist/npm/index/IndexStore.js +0 -1102
- package/dist/npm/index/IndexStore.js.map +0 -1
- package/dist/npm/index.d.ts +0 -115
- package/dist/npm/index.d.ts.map +0 -1
- package/dist/npm/index.js +0 -367
- package/dist/npm/index.js.map +0 -1
- package/dist/npm/query/Query.d.ts +0 -176
- package/dist/npm/query/Query.d.ts.map +0 -1
- package/dist/npm/query/Query.js +0 -270
- package/dist/npm/query/Query.js.map +0 -1
- package/dist/npm/query/QueryEngine.d.ts +0 -140
- package/dist/npm/query/QueryEngine.d.ts.map +0 -1
- package/dist/npm/query/QueryEngine.js +0 -453
- package/dist/npm/query/QueryEngine.js.map +0 -1
- package/dist/npm/storage/GoogleSheetAdapter.d.ts +0 -119
- package/dist/npm/storage/GoogleSheetAdapter.d.ts.map +0 -1
- package/dist/npm/storage/GoogleSheetAdapter.js +0 -238
- package/dist/npm/storage/GoogleSheetAdapter.js.map +0 -1
- package/dist/npm/storage/GoogleSpreadsheetAdapter.d.ts +0 -65
- package/dist/npm/storage/GoogleSpreadsheetAdapter.d.ts.map +0 -1
- package/dist/npm/storage/GoogleSpreadsheetAdapter.js +0 -119
- package/dist/npm/storage/GoogleSpreadsheetAdapter.js.map +0 -1
- package/dist/npm/testing/ParityCatalog.d.ts +0 -38
- package/dist/npm/testing/ParityCatalog.d.ts.map +0 -1
- package/dist/npm/testing/ParityCatalog.js +0 -404
- package/dist/npm/testing/ParityCatalog.js.map +0 -1
- package/dist/npm/testing/RuntimeBenchmark.d.ts +0 -37
- package/dist/npm/testing/RuntimeBenchmark.d.ts.map +0 -1
- package/dist/npm/testing/RuntimeBenchmark.js +0 -449
- package/dist/npm/testing/RuntimeBenchmark.js.map +0 -1
- package/dist/npm/testing/RuntimeParity.d.ts +0 -62
- package/dist/npm/testing/RuntimeParity.d.ts.map +0 -1
- package/dist/npm/testing/RuntimeParity.js +0 -4126
- package/dist/npm/testing/RuntimeParity.js.map +0 -1
- package/dist/npm/utils/Serialization.d.ts +0 -111
- package/dist/npm/utils/Serialization.d.ts.map +0 -1
- package/dist/npm/utils/Serialization.js +0 -281
- package/dist/npm/utils/Serialization.js.map +0 -1
- package/dist/npm/utils/SheetOrmLogger.d.ts +0 -31
- package/dist/npm/utils/SheetOrmLogger.d.ts.map +0 -1
- package/dist/npm/utils/SheetOrmLogger.js +0 -42
- package/dist/npm/utils/SheetOrmLogger.js.map +0 -1
- package/dist/npm/utils/Uuid.d.ts +0 -29
- package/dist/npm/utils/Uuid.d.ts.map +0 -1
- package/dist/npm/utils/Uuid.js +0 -86
- package/dist/npm/utils/Uuid.js.map +0 -1
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Google Apps Script adapter implementing the ISheetAdapter interface.
|
|
3
|
-
*
|
|
4
|
-
* Wraps a single GAS `Sheet` object (one tab in a Spreadsheet) and
|
|
5
|
-
* translates 0-based data indexes used by the ORM into 1-based sheet
|
|
6
|
-
* rows required by the GAS Range API. Row 1 is always the header row;
|
|
7
|
-
* data rows start at row 2.
|
|
8
|
-
*
|
|
9
|
-
* All multi-cell reads/writes are performed with `getRange().getValues()`
|
|
10
|
-
* / `setValues()` to minimise GAS API calls (each call adds ~300 ms of
|
|
11
|
-
* latency in the Apps Script runtime).
|
|
12
|
-
*
|
|
13
|
-
* @module GoogleSheetAdapter
|
|
14
|
-
*/
|
|
15
|
-
import { SheetOrmLogger } from "../utils/SheetOrmLogger.js";
|
|
16
|
-
/**
|
|
17
|
-
* Production implementation of {@link ISheetAdapter} for Google Apps Script.
|
|
18
|
-
* Delegates every operation to the underlying `GoogleAppsScript.Spreadsheet.Sheet`.
|
|
19
|
-
*/
|
|
20
|
-
export class GoogleSheetAdapter {
|
|
21
|
-
/**
|
|
22
|
-
* @param sheet - A GAS Sheet object obtained via Spreadsheet.getSheetByName()
|
|
23
|
-
* or Spreadsheet.insertSheet().
|
|
24
|
-
*/
|
|
25
|
-
constructor(sheet) {
|
|
26
|
-
this.sheet = sheet;
|
|
27
|
-
}
|
|
28
|
-
/** Return the name of the underlying sheet tab. */
|
|
29
|
-
getName() {
|
|
30
|
-
return this.sheet.getName();
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Read the header row (row 1) and return the column names as strings.
|
|
34
|
-
* Returns an empty array if the sheet has no columns.
|
|
35
|
-
*/
|
|
36
|
-
getHeaders() {
|
|
37
|
-
const lastCol = this.sheet.getLastColumn();
|
|
38
|
-
if (lastCol === 0)
|
|
39
|
-
return [];
|
|
40
|
-
return this.sheet
|
|
41
|
-
.getRange(1, 1, 1, lastCol)
|
|
42
|
-
.getValues()[0]
|
|
43
|
-
.map((v) => String(v));
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Overwrite the header row (row 1) with the given column names.
|
|
47
|
-
* No-op if the headers array is empty.
|
|
48
|
-
*/
|
|
49
|
-
setHeaders(headers) {
|
|
50
|
-
if (headers.length === 0)
|
|
51
|
-
return;
|
|
52
|
-
this.sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Read all data rows (row 2+) as a 2D array.
|
|
56
|
-
* Returns an empty array if the sheet has no data rows.
|
|
57
|
-
*/
|
|
58
|
-
getAllData() {
|
|
59
|
-
const lastRow = this.sheet.getLastRow();
|
|
60
|
-
const lastCol = this.sheet.getLastColumn();
|
|
61
|
-
// If there is only a header row (or nothing at all), return empty
|
|
62
|
-
if (lastRow <= 1 || lastCol === 0) {
|
|
63
|
-
SheetOrmLogger.log(`[Sheet:${this.sheet.getName()}] getAllData → 0 rows (empty)`);
|
|
64
|
-
return [];
|
|
65
|
-
}
|
|
66
|
-
// Read from row 2 (first data row) to the last occupied row
|
|
67
|
-
const result = this.sheet.getRange(2, 1, lastRow - 1, lastCol).getValues();
|
|
68
|
-
SheetOrmLogger.log(`[Sheet:${this.sheet.getName()}] getAllData → ${result.length} rows × ${lastCol} cols`);
|
|
69
|
-
return result;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Return the number of data rows (excludes the header row).
|
|
73
|
-
* Computed as `lastRow - 1`, where lastRow includes the header.
|
|
74
|
-
*/
|
|
75
|
-
getRowCount() {
|
|
76
|
-
const lastRow = this.sheet.getLastRow();
|
|
77
|
-
const count = Math.max(0, lastRow - 1); // exclude header row
|
|
78
|
-
SheetOrmLogger.log(`[Sheet:${this.sheet.getName()}] getRowCount → ${count}`);
|
|
79
|
-
return count;
|
|
80
|
-
}
|
|
81
|
-
/** Append a single row after the last occupied row using GAS appendRow(). */
|
|
82
|
-
appendRow(values) {
|
|
83
|
-
this.sheet.appendRow(values);
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Append multiple rows in a single setValues() API call.
|
|
87
|
-
* Much faster than calling appendRow() in a loop (~300 ms per call saved).
|
|
88
|
-
*/
|
|
89
|
-
appendRows(rows) {
|
|
90
|
-
if (rows.length === 0)
|
|
91
|
-
return;
|
|
92
|
-
// Start writing immediately below the last occupied row
|
|
93
|
-
const startRow = this.sheet.getLastRow() + 1;
|
|
94
|
-
const numCols = rows[0].length;
|
|
95
|
-
SheetOrmLogger.log(`[Sheet:${this.sheet.getName()}] appendRows ${rows.length} rows × ${numCols} cols at sheetRow=${startRow}`);
|
|
96
|
-
this.sheet.getRange(startRow, 1, rows.length, numCols).setValues(rows);
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Write rows starting at the given 0-based data index.
|
|
100
|
-
* Overwrites existing cells — used for batch-update operations.
|
|
101
|
-
*
|
|
102
|
-
* @param startRowIndex - 0-based data index (sheet row = index + 2).
|
|
103
|
-
* @param rows - 2D array of values.
|
|
104
|
-
*/
|
|
105
|
-
writeRowsAt(startRowIndex, rows) {
|
|
106
|
-
if (rows.length === 0)
|
|
107
|
-
return;
|
|
108
|
-
// Convert 0-based data index to 1-based sheet row (header is row 1)
|
|
109
|
-
const sheetRow = startRowIndex + 2;
|
|
110
|
-
const numCols = rows[0].length;
|
|
111
|
-
SheetOrmLogger.log(`[Sheet:${this.sheet.getName()}] writeRowsAt dataIdx=${startRowIndex} sheetRow=${sheetRow} rows=${rows.length} cols=${numCols}`);
|
|
112
|
-
this.sheet.getRange(sheetRow, 1, rows.length, numCols).setValues(rows);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Overwrite a single data row.
|
|
116
|
-
*
|
|
117
|
-
* @param rowIndex - 0-based data index (sheet row = index + 2).
|
|
118
|
-
* @param values - Column values.
|
|
119
|
-
*/
|
|
120
|
-
updateRow(rowIndex, values) {
|
|
121
|
-
const sheetRow = rowIndex + 2; // +2: 1-based + header offset
|
|
122
|
-
SheetOrmLogger.log(`[Sheet:${this.sheet.getName()}] updateRow dataIdx=${rowIndex} sheetRow=${sheetRow}`);
|
|
123
|
-
this.sheet.getRange(sheetRow, 1, 1, values.length).setValues([values]);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Overwrite multiple rows, batching contiguous groups into single
|
|
127
|
-
* setValues() calls to minimise GAS API round-trips.
|
|
128
|
-
*
|
|
129
|
-
* Example: updating rows 3, 4, 5, 10, 11 produces two setValues() calls
|
|
130
|
-
* instead of five.
|
|
131
|
-
*/
|
|
132
|
-
updateRows(updates) {
|
|
133
|
-
if (updates.length === 0)
|
|
134
|
-
return;
|
|
135
|
-
// Sort by rowIndex so we can detect contiguous sequences
|
|
136
|
-
const sorted = [...updates].sort((a, b) => a.rowIndex - b.rowIndex);
|
|
137
|
-
// Accumulate contiguous groups and flush each as a single setValues()
|
|
138
|
-
let groupStart = sorted[0].rowIndex;
|
|
139
|
-
let groupRows = [sorted[0].values];
|
|
140
|
-
let groupCount = 0;
|
|
141
|
-
for (let i = 1; i < sorted.length; i++) {
|
|
142
|
-
if (sorted[i].rowIndex === sorted[i - 1].rowIndex + 1) {
|
|
143
|
-
// Contiguous — add to current group
|
|
144
|
-
groupRows.push(sorted[i].values);
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
// Non-contiguous — flush the current group and start a new one
|
|
148
|
-
SheetOrmLogger.log(`[Sheet:${this.sheet.getName()}] updateRows group#${groupCount} dataIdx=${groupStart} rows=${groupRows.length}`);
|
|
149
|
-
this.sheet.getRange(groupStart + 2, 1, groupRows.length, groupRows[0].length).setValues(groupRows);
|
|
150
|
-
groupStart = sorted[i].rowIndex;
|
|
151
|
-
groupRows = [sorted[i].values];
|
|
152
|
-
groupCount++;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
// Flush the final group
|
|
156
|
-
SheetOrmLogger.log(`[Sheet:${this.sheet.getName()}] updateRows group#${groupCount} dataIdx=${groupStart} rows=${groupRows.length} (final); total updates=${updates.length}`);
|
|
157
|
-
this.sheet.getRange(groupStart + 2, 1, groupRows.length, groupRows[0].length).setValues(groupRows);
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Delete a single data row. GAS deleteRow() shifts all rows below up by one.
|
|
161
|
-
* @param rowIndex - 0-based data index.
|
|
162
|
-
*/
|
|
163
|
-
deleteRow(rowIndex) {
|
|
164
|
-
const sheetRow = rowIndex + 2;
|
|
165
|
-
this.sheet.deleteRow(sheetRow);
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Delete multiple data rows by index.
|
|
169
|
-
* Rows are deleted from bottom to top so that earlier indexes remain valid.
|
|
170
|
-
*/
|
|
171
|
-
deleteRows(rowIndexes) {
|
|
172
|
-
// Sort descending to avoid index shift issues
|
|
173
|
-
const sorted = [...rowIndexes].sort((a, b) => b - a);
|
|
174
|
-
for (const idx of sorted) {
|
|
175
|
-
this.deleteRow(idx);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Read a single data row.
|
|
180
|
-
* @param rowIndex - 0-based data index.
|
|
181
|
-
* @returns Array of cell values.
|
|
182
|
-
*/
|
|
183
|
-
getRow(rowIndex) {
|
|
184
|
-
const sheetRow = rowIndex + 2;
|
|
185
|
-
const lastCol = this.sheet.getLastColumn();
|
|
186
|
-
if (lastCol === 0)
|
|
187
|
-
return [];
|
|
188
|
-
return this.sheet.getRange(sheetRow, 1, 1, lastCol).getValues()[0];
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Replace all data rows (row 2+) with the provided 2D array.
|
|
192
|
-
*
|
|
193
|
-
* If the new data has fewer rows than the old data, surplus old rows
|
|
194
|
-
* are cleared. If the new data is narrower (fewer columns), surplus
|
|
195
|
-
* columns in the written region are also cleared.
|
|
196
|
-
*/
|
|
197
|
-
replaceAllData(rows) {
|
|
198
|
-
const lastRow = this.sheet.getLastRow();
|
|
199
|
-
const lastCol = this.sheet.getLastColumn();
|
|
200
|
-
const oldDataRows = Math.max(0, lastRow - 1);
|
|
201
|
-
const newCols = rows.length > 0 ? rows[0].length : 0;
|
|
202
|
-
const clearCols = Math.max(lastCol, newCols);
|
|
203
|
-
// Write the new data
|
|
204
|
-
if (rows.length > 0) {
|
|
205
|
-
this.sheet.getRange(2, 1, rows.length, newCols).setValues(rows);
|
|
206
|
-
}
|
|
207
|
-
// Clear surplus columns in written rows if new data is narrower
|
|
208
|
-
if (rows.length > 0 && newCols < lastCol) {
|
|
209
|
-
this.sheet.getRange(2, newCols + 1, rows.length, lastCol - newCols).clearContent();
|
|
210
|
-
}
|
|
211
|
-
// Clear surplus old rows below the new data
|
|
212
|
-
if (oldDataRows > rows.length && clearCols > 0) {
|
|
213
|
-
this.sheet.getRange(rows.length + 2, 1, oldDataRows - rows.length, clearCols).clearContent();
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
/** Clear the entire sheet (headers + data). */
|
|
217
|
-
clear() {
|
|
218
|
-
this.sheet.clear();
|
|
219
|
-
}
|
|
220
|
-
/** Force-flush pending changes to the spreadsheet (calls SpreadsheetApp.flush()). */
|
|
221
|
-
flush() {
|
|
222
|
-
SpreadsheetApp.flush();
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Write the header row and all data rows in a single setValues() API call.
|
|
226
|
-
* Row 1 = headers, row 2+ = data.
|
|
227
|
-
*
|
|
228
|
-
* Used for newly-created sheets to avoid a separate setHeaders() round-trip.
|
|
229
|
-
*/
|
|
230
|
-
writeAllRowsWithHeaders(headers, rows) {
|
|
231
|
-
const numCols = headers.length;
|
|
232
|
-
// Combine headers and data into one contiguous 2D array
|
|
233
|
-
const allRows = [headers, ...rows];
|
|
234
|
-
SheetOrmLogger.log(`[Sheet:${this.sheet.getName()}] writeAllRowsWithHeaders ${rows.length} data rows + header (${allRows.length} total)`);
|
|
235
|
-
this.sheet.getRange(1, 1, allRows.length, numCols).setValues(allRows);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
//# sourceMappingURL=GoogleSheetAdapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GoogleSheetAdapter.js","sourceRoot":"","sources":["../../../src/storage/GoogleSheetAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Google Apps Script adapter implementing the ISpreadsheetAdapter interface.
|
|
3
|
-
*
|
|
4
|
-
* Wraps a GAS `Spreadsheet` object (the whole file) and provides
|
|
5
|
-
* operations for creating, listing, and deleting individual sheet tabs.
|
|
6
|
-
* Defaults to the active spreadsheet when no explicit Spreadsheet object
|
|
7
|
-
* is supplied.
|
|
8
|
-
*
|
|
9
|
-
* @module GoogleSpreadsheetAdapter
|
|
10
|
-
*/
|
|
11
|
-
import type { ISpreadsheetAdapter } from "../core/types/ISpreadsheetAdapter.js";
|
|
12
|
-
import type { ISheetAdapter } from "../core/types/ISheetAdapter.js";
|
|
13
|
-
/**
|
|
14
|
-
* Production implementation of {@link ISpreadsheetAdapter} for Google Apps Script.
|
|
15
|
-
* Each call that returns a sheet wraps it in a {@link GoogleSheetAdapter}.
|
|
16
|
-
*/
|
|
17
|
-
export declare class GoogleSpreadsheetAdapter implements ISpreadsheetAdapter {
|
|
18
|
-
/** The wrapped GAS Spreadsheet object. */
|
|
19
|
-
private spreadsheet;
|
|
20
|
-
/**
|
|
21
|
-
* @param spreadsheet - Optional explicit Spreadsheet object.
|
|
22
|
-
* Falls back to `SpreadsheetApp.getActiveSpreadsheet()`
|
|
23
|
-
* when omitted (the common GAS use-case).
|
|
24
|
-
*/
|
|
25
|
-
constructor(spreadsheet?: GoogleAppsScript.Spreadsheet.Spreadsheet);
|
|
26
|
-
/**
|
|
27
|
-
* Look up a sheet tab by name.
|
|
28
|
-
* @returns A wrapped adapter, or `null` if no sheet with that name exists.
|
|
29
|
-
*/
|
|
30
|
-
getSheetByName(name: string): ISheetAdapter | null;
|
|
31
|
-
/**
|
|
32
|
-
* Get or create a sheet tab. If a sheet with the given name already
|
|
33
|
-
* exists it is reused (idempotent). Otherwise a new tab is inserted.
|
|
34
|
-
*/
|
|
35
|
-
createSheet(name: string): ISheetAdapter;
|
|
36
|
-
/**
|
|
37
|
-
* Always insert a brand-new sheet tab (not idempotent).
|
|
38
|
-
* GAS throws if a sheet with the same name already exists.
|
|
39
|
-
*/
|
|
40
|
-
insertSheet(name: string): ISheetAdapter;
|
|
41
|
-
/** Delete a sheet tab by name. No-op if the sheet does not exist. */
|
|
42
|
-
deleteSheet(name: string): void;
|
|
43
|
-
/** Return an array of all sheet tab names in the spreadsheet. */
|
|
44
|
-
getSheetNames(): string[];
|
|
45
|
-
/** Return a Map of sheet name → adapter for every tab in the spreadsheet. */
|
|
46
|
-
getSheets(): Map<string, ISheetAdapter>;
|
|
47
|
-
/**
|
|
48
|
-
* Remove all sheets and leave a single empty "Sheet1" tab.
|
|
49
|
-
*
|
|
50
|
-
* GAS requires at least one sheet in a spreadsheet, so the first tab
|
|
51
|
-
* is kept, cleared, and renamed to "Sheet1" while all others are deleted.
|
|
52
|
-
*/
|
|
53
|
-
removeAllSheets(): void;
|
|
54
|
-
/**
|
|
55
|
-
* Protect a sheet tab and restrict editing to the given email addresses.
|
|
56
|
-
*
|
|
57
|
-
* Uses the GAS `Protection` API to add a sheet-level protection.
|
|
58
|
-
* Existing editors (except the owner) are removed, and only the
|
|
59
|
-
* specified `editors` are granted edit access.
|
|
60
|
-
*
|
|
61
|
-
* No-op if the sheet does not exist.
|
|
62
|
-
*/
|
|
63
|
-
protectSheet(name: string, editors: string[]): void;
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=GoogleSpreadsheetAdapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GoogleSpreadsheetAdapter.d.ts","sourceRoot":"","sources":["../../../src/storage/GoogleSpreadsheetAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAIpE;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,mBAAmB;IAClE,0CAA0C;IAC1C,OAAO,CAAC,WAAW,CAA2C;IAE9D;;;;OAIG;gBACS,WAAW,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,WAAW;IAIlE;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAMlD;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IAWxC;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IAMxC,sEAAsE;IACtE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ/B,iEAAiE;IACjE,aAAa,IAAI,MAAM,EAAE;IAIzB,6EAA6E;IAC7E,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC;IAQvC;;;;;OAKG;IACH,eAAe,IAAI,IAAI;IAcvB;;;;;;;;OAQG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;CAUpD"}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Google Apps Script adapter implementing the ISpreadsheetAdapter interface.
|
|
3
|
-
*
|
|
4
|
-
* Wraps a GAS `Spreadsheet` object (the whole file) and provides
|
|
5
|
-
* operations for creating, listing, and deleting individual sheet tabs.
|
|
6
|
-
* Defaults to the active spreadsheet when no explicit Spreadsheet object
|
|
7
|
-
* is supplied.
|
|
8
|
-
*
|
|
9
|
-
* @module GoogleSpreadsheetAdapter
|
|
10
|
-
*/
|
|
11
|
-
import { GoogleSheetAdapter } from "./GoogleSheetAdapter.js";
|
|
12
|
-
import { SheetOrmLogger } from "../utils/SheetOrmLogger.js";
|
|
13
|
-
/**
|
|
14
|
-
* Production implementation of {@link ISpreadsheetAdapter} for Google Apps Script.
|
|
15
|
-
* Each call that returns a sheet wraps it in a {@link GoogleSheetAdapter}.
|
|
16
|
-
*/
|
|
17
|
-
export class GoogleSpreadsheetAdapter {
|
|
18
|
-
/**
|
|
19
|
-
* @param spreadsheet - Optional explicit Spreadsheet object.
|
|
20
|
-
* Falls back to `SpreadsheetApp.getActiveSpreadsheet()`
|
|
21
|
-
* when omitted (the common GAS use-case).
|
|
22
|
-
*/
|
|
23
|
-
constructor(spreadsheet) {
|
|
24
|
-
this.spreadsheet = spreadsheet ?? SpreadsheetApp.getActiveSpreadsheet();
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Look up a sheet tab by name.
|
|
28
|
-
* @returns A wrapped adapter, or `null` if no sheet with that name exists.
|
|
29
|
-
*/
|
|
30
|
-
getSheetByName(name) {
|
|
31
|
-
const sheet = this.spreadsheet.getSheetByName(name);
|
|
32
|
-
SheetOrmLogger.log(`[Spreadsheet] getSheetByName("${name}") → ${sheet ? "found" : "null"}`);
|
|
33
|
-
return sheet ? new GoogleSheetAdapter(sheet) : null;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Get or create a sheet tab. If a sheet with the given name already
|
|
37
|
-
* exists it is reused (idempotent). Otherwise a new tab is inserted.
|
|
38
|
-
*/
|
|
39
|
-
createSheet(name) {
|
|
40
|
-
const existing = this.spreadsheet.getSheetByName(name);
|
|
41
|
-
if (existing) {
|
|
42
|
-
SheetOrmLogger.log(`[Spreadsheet] createSheet("${name}") → reusing existing sheet`);
|
|
43
|
-
return new GoogleSheetAdapter(existing);
|
|
44
|
-
}
|
|
45
|
-
SheetOrmLogger.log(`[Spreadsheet] createSheet("${name}") → inserting new sheet`);
|
|
46
|
-
const sheet = this.spreadsheet.insertSheet(name);
|
|
47
|
-
return new GoogleSheetAdapter(sheet);
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Always insert a brand-new sheet tab (not idempotent).
|
|
51
|
-
* GAS throws if a sheet with the same name already exists.
|
|
52
|
-
*/
|
|
53
|
-
insertSheet(name) {
|
|
54
|
-
SheetOrmLogger.log(`[Spreadsheet] insertSheet("${name}")`);
|
|
55
|
-
const sheet = this.spreadsheet.insertSheet(name);
|
|
56
|
-
return new GoogleSheetAdapter(sheet);
|
|
57
|
-
}
|
|
58
|
-
/** Delete a sheet tab by name. No-op if the sheet does not exist. */
|
|
59
|
-
deleteSheet(name) {
|
|
60
|
-
const sheet = this.spreadsheet.getSheetByName(name);
|
|
61
|
-
if (sheet) {
|
|
62
|
-
SheetOrmLogger.log(`[Spreadsheet] deleteSheet("${name}")`);
|
|
63
|
-
this.spreadsheet.deleteSheet(sheet);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/** Return an array of all sheet tab names in the spreadsheet. */
|
|
67
|
-
getSheetNames() {
|
|
68
|
-
return this.spreadsheet.getSheets().map((s) => s.getName());
|
|
69
|
-
}
|
|
70
|
-
/** Return a Map of sheet name → adapter for every tab in the spreadsheet. */
|
|
71
|
-
getSheets() {
|
|
72
|
-
const map = new Map();
|
|
73
|
-
for (const sheet of this.spreadsheet.getSheets()) {
|
|
74
|
-
map.set(sheet.getName(), new GoogleSheetAdapter(sheet));
|
|
75
|
-
}
|
|
76
|
-
return map;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Remove all sheets and leave a single empty "Sheet1" tab.
|
|
80
|
-
*
|
|
81
|
-
* GAS requires at least one sheet in a spreadsheet, so the first tab
|
|
82
|
-
* is kept, cleared, and renamed to "Sheet1" while all others are deleted.
|
|
83
|
-
*/
|
|
84
|
-
removeAllSheets() {
|
|
85
|
-
const sheets = this.spreadsheet.getSheets();
|
|
86
|
-
SheetOrmLogger.log(`[Spreadsheet] removeAllSheets() → deleting ${sheets.length} sheet(s)`);
|
|
87
|
-
if (sheets.length === 0)
|
|
88
|
-
return;
|
|
89
|
-
// Keep the first sheet to satisfy the GAS one-sheet minimum requirement
|
|
90
|
-
const keeper = sheets[0];
|
|
91
|
-
for (let i = 1; i < sheets.length; i++) {
|
|
92
|
-
this.spreadsheet.deleteSheet(sheets[i]);
|
|
93
|
-
}
|
|
94
|
-
// Clear all content and rename to default
|
|
95
|
-
keeper.clear();
|
|
96
|
-
keeper.setName("Sheet1");
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Protect a sheet tab and restrict editing to the given email addresses.
|
|
100
|
-
*
|
|
101
|
-
* Uses the GAS `Protection` API to add a sheet-level protection.
|
|
102
|
-
* Existing editors (except the owner) are removed, and only the
|
|
103
|
-
* specified `editors` are granted edit access.
|
|
104
|
-
*
|
|
105
|
-
* No-op if the sheet does not exist.
|
|
106
|
-
*/
|
|
107
|
-
protectSheet(name, editors) {
|
|
108
|
-
const sheet = this.spreadsheet.getSheetByName(name);
|
|
109
|
-
if (!sheet)
|
|
110
|
-
return;
|
|
111
|
-
SheetOrmLogger.log(`[Spreadsheet] protectSheet("${name}") → editors: [${editors.join(", ")}]`);
|
|
112
|
-
const protection = sheet.protect().setDescription("Protected by SheetORM");
|
|
113
|
-
protection.removeEditors(protection.getEditors());
|
|
114
|
-
if (editors.length > 0) {
|
|
115
|
-
protection.addEditors(editors);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
//# sourceMappingURL=GoogleSpreadsheetAdapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GoogleSpreadsheetAdapter.js","sourceRoot":"","sources":["../../../src/storage/GoogleSpreadsheetAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module ParityCatalog
|
|
3
|
-
*
|
|
4
|
-
* Canonical catalog of every Jest test case that must also have a
|
|
5
|
-
* corresponding runtime handler in {@link RuntimeParity}.
|
|
6
|
-
*
|
|
7
|
-
* The catalog is the single source of truth for parity validation:
|
|
8
|
-
* - `SUITES` lists each test file and its test names.
|
|
9
|
-
* - `CASE_IDS` is a flat array of composite IDs (`"file::testName"`).
|
|
10
|
-
* - `toCaseId()` builds a composite ID from file + test name.
|
|
11
|
-
*
|
|
12
|
-
* Both Jest tests (via `parity-validator.test.ts`) and GAS runtime
|
|
13
|
-
* tests (via `RuntimeParity.validate()`) cross-check against this
|
|
14
|
-
* catalog to detect drift.
|
|
15
|
-
*/
|
|
16
|
-
/** Describes a single Jest test file and its ordered list of test names. */
|
|
17
|
-
interface ParitySuite {
|
|
18
|
-
file: string;
|
|
19
|
-
tests: string[];
|
|
20
|
-
}
|
|
21
|
-
/** Build a composite parity case ID from a test file name and test name. */
|
|
22
|
-
declare function toParityCaseId(file: string, testName: string): string;
|
|
23
|
-
/**
|
|
24
|
-
* Public API for accessing the parity test catalog.
|
|
25
|
-
*
|
|
26
|
-
* Used by `parity-validator.test.ts` (Jest) and `RuntimeParity.validate()` (GAS)
|
|
27
|
-
* to ensure that both environments define the same set of test cases.
|
|
28
|
-
*/
|
|
29
|
-
export declare class ParityCatalog {
|
|
30
|
-
/** All suite definitions with test names. */
|
|
31
|
-
static readonly SUITES: ParitySuite[];
|
|
32
|
-
/** Flat array of composite case IDs. */
|
|
33
|
-
static readonly CASE_IDS: string[];
|
|
34
|
-
/** Utility to build a composite case ID. */
|
|
35
|
-
static toCaseId: typeof toParityCaseId;
|
|
36
|
-
}
|
|
37
|
-
export {};
|
|
38
|
-
//# sourceMappingURL=ParityCatalog.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ParityCatalog.d.ts","sourceRoot":"","sources":["../../../src/testing/ParityCatalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,4EAA4E;AAC5E,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAmXD,4EAA4E;AAC5E,iBAAS,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9D;AAOD;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,6CAA6C;IAC7C,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAiB;IACvC,wCAAwC;IACxC,MAAM,CAAC,QAAQ,CAAC,QAAQ,WAAmB;IAC3C,4CAA4C;IAC5C,MAAM,CAAC,QAAQ,wBAAkB;CAClC"}
|