hikoutei 0.5.0 → 0.5.2

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 (73) hide show
  1. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.d.ts +5 -15
  2. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.d.ts.map +1 -1
  3. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.js +33 -945
  4. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.js.map +1 -1
  5. package/dist/adapter/sheets/providers/google-sheets-api/model/planner.d.ts +14 -20
  6. package/dist/adapter/sheets/providers/google-sheets-api/model/planner.d.ts.map +1 -1
  7. package/dist/adapter/sheets/providers/google-sheets-api/model/planner.js +16 -200
  8. package/dist/adapter/sheets/providers/google-sheets-api/model/planner.js.map +1 -1
  9. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerDeletion.d.ts +14 -0
  10. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerDeletion.d.ts.map +1 -0
  11. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerDeletion.js +37 -0
  12. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerDeletion.js.map +1 -0
  13. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerReceipt.d.ts +19 -0
  14. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerReceipt.d.ts.map +1 -0
  15. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerReceipt.js +76 -0
  16. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerReceipt.js.map +1 -0
  17. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerWorkingRow.d.ts +23 -0
  18. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerWorkingRow.d.ts.map +1 -0
  19. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerWorkingRow.js +122 -0
  20. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerWorkingRow.js.map +1 -0
  21. package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.d.ts +15 -222
  22. package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.d.ts.map +1 -1
  23. package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.js +14 -687
  24. package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.js.map +1 -1
  25. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightContext.d.ts +125 -0
  26. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightContext.d.ts.map +1 -0
  27. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightContext.js +161 -0
  28. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightContext.js.map +1 -0
  29. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightFields.d.ts +67 -0
  30. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightFields.d.ts.map +1 -0
  31. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightFields.js +94 -0
  32. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightFields.js.map +1 -0
  33. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightHeaders.d.ts +24 -0
  34. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightHeaders.d.ts.map +1 -0
  35. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightHeaders.js +52 -0
  36. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightHeaders.js.map +1 -0
  37. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightParsing.d.ts +23 -0
  38. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightParsing.d.ts.map +1 -0
  39. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightParsing.js +239 -0
  40. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightParsing.js.map +1 -0
  41. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightRows.d.ts +53 -0
  42. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightRows.d.ts.map +1 -0
  43. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightRows.js +198 -0
  44. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightRows.js.map +1 -0
  45. package/dist/adapter/sheets/providers/google-sheets-api/operations/anchors.d.ts +21 -0
  46. package/dist/adapter/sheets/providers/google-sheets-api/operations/anchors.d.ts.map +1 -0
  47. package/dist/adapter/sheets/providers/google-sheets-api/operations/anchors.js +57 -0
  48. package/dist/adapter/sheets/providers/google-sheets-api/operations/anchors.js.map +1 -0
  49. package/dist/adapter/sheets/providers/google-sheets-api/operations/applyEffects.d.ts +19 -0
  50. package/dist/adapter/sheets/providers/google-sheets-api/operations/applyEffects.d.ts.map +1 -0
  51. package/dist/adapter/sheets/providers/google-sheets-api/operations/applyEffects.js +188 -0
  52. package/dist/adapter/sheets/providers/google-sheets-api/operations/applyEffects.js.map +1 -0
  53. package/dist/adapter/sheets/providers/google-sheets-api/operations/fastAppend.d.ts +13 -0
  54. package/dist/adapter/sheets/providers/google-sheets-api/operations/fastAppend.d.ts.map +1 -0
  55. package/dist/adapter/sheets/providers/google-sheets-api/operations/fastAppend.js +229 -0
  56. package/dist/adapter/sheets/providers/google-sheets-api/operations/fastAppend.js.map +1 -0
  57. package/dist/adapter/sheets/providers/google-sheets-api/operations/preflightOp.d.ts +27 -0
  58. package/dist/adapter/sheets/providers/google-sheets-api/operations/preflightOp.d.ts.map +1 -0
  59. package/dist/adapter/sheets/providers/google-sheets-api/operations/preflightOp.js +54 -0
  60. package/dist/adapter/sheets/providers/google-sheets-api/operations/preflightOp.js.map +1 -0
  61. package/dist/adapter/sheets/providers/google-sheets-api/operations/provisioning.d.ts +28 -0
  62. package/dist/adapter/sheets/providers/google-sheets-api/operations/provisioning.d.ts.map +1 -0
  63. package/dist/adapter/sheets/providers/google-sheets-api/operations/provisioning.js +256 -0
  64. package/dist/adapter/sheets/providers/google-sheets-api/operations/provisioning.js.map +1 -0
  65. package/dist/adapter/sheets/providers/google-sheets-api/operations/readRows.d.ts +40 -0
  66. package/dist/adapter/sheets/providers/google-sheets-api/operations/readRows.d.ts.map +1 -0
  67. package/dist/adapter/sheets/providers/google-sheets-api/operations/readRows.js +186 -0
  68. package/dist/adapter/sheets/providers/google-sheets-api/operations/readRows.js.map +1 -0
  69. package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.d.ts +57 -0
  70. package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.d.ts.map +1 -0
  71. package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.js +130 -0
  72. package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.js.map +1 -0
  73. package/package.json +1 -1
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Runtime guards that promote untrusted `spreadsheets.get` payloads into
3
+ * typed internal structures.
4
+ *
5
+ * Every SDK response arrives at this boundary as `unknown`; each parser
6
+ * validates shape field by field and fails closed through
7
+ * `invalidProviderState` before any planner, builder, or repository logic
8
+ * runs. The exported cell-value helpers (`apiStringValue`/`apiNumberValue`)
9
+ * are shared by the header and receipt readers.
10
+ */
11
+ import type { ParsedSheet, ParsedSpreadsheetDocument } from "./preflightContext.js";
12
+ /** Promotes an untrusted `spreadsheets.get` body with runtime guards. */
13
+ export declare function parseSpreadsheetDocument(value: unknown, label: string): ParsedSpreadsheetDocument;
14
+ /**
15
+ * Promotes an enumeration-only `spreadsheets.get` body (sheet properties,
16
+ * no grid data) with runtime guards.
17
+ */
18
+ export declare function parseSheetPropertiesDocument(value: unknown, label: string): readonly ParsedSheet[];
19
+ /** Reads the userEnteredValue.stringValue of one API cell with guards. */
20
+ export declare function apiStringValue(value: unknown): string | undefined;
21
+ /** Reads the userEnteredValue.numberValue of one API cell with guards. */
22
+ export declare function apiNumberValue(value: unknown): number | undefined;
23
+ //# sourceMappingURL=preflightParsing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflightParsing.d.ts","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/google-sheets-api/model/preflightParsing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAKV,WAAW,EACX,yBAAyB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,yEAAyE;AACzE,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,yBAAyB,CA0B3B;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,SAAS,WAAW,EAAE,CAWxB;AAyMD,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAOjE;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAOjE"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Runtime guards that promote untrusted `spreadsheets.get` payloads into
3
+ * typed internal structures.
4
+ *
5
+ * Every SDK response arrives at this boundary as `unknown`; each parser
6
+ * validates shape field by field and fails closed through
7
+ * `invalidProviderState` before any planner, builder, or repository logic
8
+ * runs. The exported cell-value helpers (`apiStringValue`/`apiNumberValue`)
9
+ * are shared by the header and receipt readers.
10
+ */
11
+ import { invalidProviderState } from "../errors.js";
12
+ /** Promotes an untrusted `spreadsheets.get` body with runtime guards. */
13
+ export function parseSpreadsheetDocument(value, label) {
14
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
15
+ invalidProviderState(`${label} response must be an object`);
16
+ }
17
+ const record = value;
18
+ if (!Array.isArray(record.sheets)) {
19
+ invalidProviderState(`${label} response must contain a sheets array`);
20
+ }
21
+ const grids = new Map();
22
+ const sheets = record.sheets.map((entry, index) => {
23
+ const sheet = parseSheetEntry(entry, `${label} sheets[${index}]`);
24
+ // Grid data is nested under each sheet entry in the API response and is
25
+ // identified by the parent sheet's properties.sheetId (GridData itself
26
+ // carries no sheetId).
27
+ if (entry !== null && typeof entry === "object" && !Array.isArray(entry) &&
28
+ entry.data !== undefined) {
29
+ parseGridDataArray(entry.data, sheet.sheetId, `${label} sheets[${index}].data`, grids);
30
+ }
31
+ return sheet;
32
+ });
33
+ return { sheets, grids };
34
+ }
35
+ /**
36
+ * Promotes an enumeration-only `spreadsheets.get` body (sheet properties,
37
+ * no grid data) with runtime guards.
38
+ */
39
+ export function parseSheetPropertiesDocument(value, label) {
40
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
41
+ invalidProviderState(`${label} response must be an object`);
42
+ }
43
+ const record = value;
44
+ if (!Array.isArray(record.sheets)) {
45
+ invalidProviderState(`${label} response must contain a sheets array`);
46
+ }
47
+ return record.sheets.map((entry, index) => parseSheetEntry(entry, `${label} sheets[${index}]`));
48
+ }
49
+ /** Validates one REST sheet entry's properties (sheetId, title, hidden). */
50
+ function parseSheetEntry(value, label) {
51
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
52
+ invalidProviderState(`${label} must be an object`);
53
+ }
54
+ const sheet = value;
55
+ const properties = sheet.properties;
56
+ if (properties === null || typeof properties !== "object" || Array.isArray(properties)) {
57
+ invalidProviderState(`${label}.properties must be an object`);
58
+ }
59
+ const propertyRecord = properties;
60
+ const sheetId = propertyRecord.sheetId;
61
+ const title = propertyRecord.title;
62
+ if (typeof sheetId !== "number" || !Number.isSafeInteger(sheetId)) {
63
+ invalidProviderState(`${label}.properties.sheetId is invalid`);
64
+ }
65
+ if (typeof title !== "string" || title.length === 0) {
66
+ invalidProviderState(`${label}.properties.title is invalid`);
67
+ }
68
+ const hidden = propertyRecord.hidden;
69
+ if (hidden !== undefined && typeof hidden !== "boolean") {
70
+ invalidProviderState(`${label}.properties.hidden is invalid`);
71
+ }
72
+ const gridProperties = propertyRecord.gridProperties;
73
+ const grid = gridProperties === undefined
74
+ ? undefined
75
+ : (() => {
76
+ if (gridProperties === null || typeof gridProperties !== "object" || Array.isArray(gridProperties)) {
77
+ invalidProviderState(`${label}.properties.gridProperties is invalid`);
78
+ }
79
+ const gridRecord = gridProperties;
80
+ return {
81
+ rowCount: optionalPositiveInteger(gridRecord.rowCount, `${label}.properties.gridProperties.rowCount`),
82
+ columnCount: optionalPositiveInteger(gridRecord.columnCount, `${label}.properties.gridProperties.columnCount`),
83
+ };
84
+ })();
85
+ // Merged regions are a sheet-level `merges` GridRange array in the API
86
+ // response (GridData carries no mergedCells field), requested only by the
87
+ // observation mask; other masks omit the field entirely.
88
+ const merges = parseMergedCells(sheet.merges, `${label}.merges`);
89
+ return {
90
+ sheetId,
91
+ title,
92
+ hidden: hidden === true,
93
+ ...(grid === undefined ? {} : { gridProperties: grid }),
94
+ ...(merges === undefined ? {} : { merges }),
95
+ };
96
+ }
97
+ function optionalPositiveInteger(value, label) {
98
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 1) {
99
+ invalidProviderState(`${label} is invalid`);
100
+ }
101
+ return value;
102
+ }
103
+ function parseGridDataArray(value, sheetId, label, grids) {
104
+ if (!Array.isArray(value)) {
105
+ invalidProviderState(`${label} must be an array`);
106
+ }
107
+ if (grids.has(sheetId)) {
108
+ invalidProviderState(`${label} contains a duplicate grid for one sheet`);
109
+ }
110
+ value.forEach((entry, index) => {
111
+ if (entry === null || typeof entry !== "object" || Array.isArray(entry)) {
112
+ invalidProviderState(`${label}[${index}] must be an object`);
113
+ }
114
+ const data = entry;
115
+ const startRow = optionalNonNegativeInteger(data.startRow, `${label}[${index}].startRow`);
116
+ const startColumn = optionalNonNegativeInteger(data.startColumn, `${label}[${index}].startColumn`);
117
+ const rowData = parseRowData(data.rowData, `${label}[${index}].rowData`);
118
+ const rowMetadata = parseRowMetadata(data.rowMetadata, `${label}[${index}].rowMetadata`);
119
+ grids.set(sheetId, { startRow, startColumn, rowData, rowMetadata });
120
+ });
121
+ }
122
+ /** Parses one sheet-level `merges` GridRange array with runtime guards. */
123
+ function parseMergedCells(value, label) {
124
+ if (value === undefined)
125
+ return undefined;
126
+ if (!Array.isArray(value))
127
+ invalidProviderState(`${label} must be an array`);
128
+ return value.map((entry, index) => {
129
+ if (entry === null || typeof entry !== "object" || Array.isArray(entry)) {
130
+ invalidProviderState(`${label}[${index}] must be an object`);
131
+ }
132
+ const range = entry;
133
+ const startRowIndex = optionalNonNegativeInteger(range.startRowIndex, `${label}[${index}].startRowIndex`);
134
+ const endRowIndex = optionalNonNegativeInteger(range.endRowIndex, `${label}[${index}].endRowIndex`);
135
+ const startColumnIndex = optionalNonNegativeInteger(range.startColumnIndex, `${label}[${index}].startColumnIndex`);
136
+ const endColumnIndex = optionalNonNegativeInteger(range.endColumnIndex, `${label}[${index}].endColumnIndex`);
137
+ if (endRowIndex <= startRowIndex || endColumnIndex <= startColumnIndex) {
138
+ invalidProviderState(`${label}[${index}] is not a valid cell range`);
139
+ }
140
+ const sheetIdValue = range.sheetId;
141
+ if (sheetIdValue !== undefined &&
142
+ (typeof sheetIdValue !== "number" || !Number.isSafeInteger(sheetIdValue))) {
143
+ invalidProviderState(`${label}[${index}].sheetId is invalid`);
144
+ }
145
+ return {
146
+ ...(sheetIdValue === undefined ? {} : { sheetId: sheetIdValue }),
147
+ startRowIndex,
148
+ endRowIndex,
149
+ startColumnIndex,
150
+ endColumnIndex,
151
+ };
152
+ });
153
+ }
154
+ function parseRowData(value, label) {
155
+ if (value === undefined)
156
+ return [];
157
+ if (!Array.isArray(value))
158
+ invalidProviderState(`${label} must be an array`);
159
+ return value.map((entry, index) => {
160
+ if (entry === null || typeof entry !== "object" || Array.isArray(entry)) {
161
+ invalidProviderState(`${label}[${index}] must be an object`);
162
+ }
163
+ const row = entry;
164
+ if (row.values === undefined)
165
+ return { values: [] };
166
+ if (!Array.isArray(row.values)) {
167
+ invalidProviderState(`${label}[${index}].values must be an array`);
168
+ }
169
+ return { values: row.values };
170
+ });
171
+ }
172
+ function parseRowMetadata(value, label) {
173
+ if (value === undefined)
174
+ return [];
175
+ if (!Array.isArray(value))
176
+ invalidProviderState(`${label} must be an array`);
177
+ return value.map((entry, index) => {
178
+ if (entry === null || typeof entry !== "object" || Array.isArray(entry)) {
179
+ invalidProviderState(`${label}[${index}] must be an object`);
180
+ }
181
+ const metadata = entry;
182
+ if (metadata.developerMetadata === undefined)
183
+ return { developerMetadata: [] };
184
+ if (!Array.isArray(metadata.developerMetadata)) {
185
+ invalidProviderState(`${label}[${index}].developerMetadata must be an array`);
186
+ }
187
+ return {
188
+ developerMetadata: metadata.developerMetadata.map((item, itemIndex) => {
189
+ if (item === null || typeof item !== "object" || Array.isArray(item)) {
190
+ invalidProviderState(`${label}[${index}].developerMetadata[${itemIndex}] must be an object`);
191
+ }
192
+ const itemRecord = item;
193
+ if (typeof itemRecord.metadataKey !== "string" ||
194
+ itemRecord.metadataKey.length === 0) {
195
+ invalidProviderState(`${label}[${index}].developerMetadata[${itemIndex}].metadataKey is invalid`);
196
+ }
197
+ if (itemRecord.metadataValue !== undefined &&
198
+ typeof itemRecord.metadataValue !== "string") {
199
+ invalidProviderState(`${label}[${index}].developerMetadata[${itemIndex}].metadataValue is invalid`);
200
+ }
201
+ return {
202
+ metadataKey: itemRecord.metadataKey,
203
+ metadataValue: itemRecord.metadataValue === undefined ? "" : itemRecord.metadataValue,
204
+ };
205
+ }),
206
+ };
207
+ });
208
+ }
209
+ function optionalNonNegativeInteger(value, label) {
210
+ if (value === undefined)
211
+ return 0;
212
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0) {
213
+ invalidProviderState(`${label} is invalid`);
214
+ }
215
+ return value;
216
+ }
217
+ /** Reads the userEnteredValue.stringValue of one API cell with guards. */
218
+ export function apiStringValue(value) {
219
+ if (value === null || typeof value !== "object")
220
+ return undefined;
221
+ const record = value;
222
+ const entered = record.userEnteredValue;
223
+ if (entered === null || typeof entered !== "object")
224
+ return undefined;
225
+ const raw = entered.stringValue;
226
+ return typeof raw === "string" ? raw : undefined;
227
+ }
228
+ /** Reads the userEnteredValue.numberValue of one API cell with guards. */
229
+ export function apiNumberValue(value) {
230
+ if (value === null || typeof value !== "object")
231
+ return undefined;
232
+ const record = value;
233
+ const entered = record.userEnteredValue;
234
+ if (entered === null || typeof entered !== "object")
235
+ return undefined;
236
+ const raw = entered.numberValue;
237
+ return typeof raw === "number" && Number.isFinite(raw) ? raw : undefined;
238
+ }
239
+ //# sourceMappingURL=preflightParsing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflightParsing.js","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/google-sheets-api/model/preflightParsing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Preflight row normalization, indexes, and sheet/grid lookup.
3
+ *
4
+ * Nonblank target rows are normalized into typed `PreflightRow` values with
5
+ * their anchor evidence and visible identity; the anchor/identity indexes
6
+ * fail closed on duplicates and derive the next append row. Sheet and grid
7
+ * lookup helpers resolve titles to validated grids for the preflight data
8
+ * read and the observation/provisioning readers.
9
+ */
10
+ import type { Presence } from "../../../../../shared/state/index.js";
11
+ import type { ParsedCellNumberFormat, ParsedGridData, ParsedSheet, ParsedSpreadsheetDocument, PreflightRow } from "./preflightContext.js";
12
+ export declare function requireSheetByTitle(sheets: readonly ParsedSheet[], title: string): ParsedSheet;
13
+ export declare function findSheetByTitle(sheets: readonly ParsedSheet[], title: string): ParsedSheet | undefined;
14
+ export declare function requireGridDataForSheet(document: ParsedSpreadsheetDocument, sheetId: number): ParsedGridData;
15
+ /** Returns the parsed grid for one sheet by title, failing closed when absent. */
16
+ export declare function requireGridDataByTitle(document: ParsedSpreadsheetDocument, sheets: readonly ParsedSheet[], title: string): {
17
+ readonly sheet: ParsedSheet;
18
+ readonly grid: ParsedGridData;
19
+ };
20
+ /** Normalizes nonblank grid rows into typed preflight rows. */
21
+ export declare function readRows(data: ParsedGridData, range: {
22
+ readonly startColumn: number;
23
+ readonly columnCount: number;
24
+ }, headers: readonly string[], identityField: Presence<string>): readonly PreflightRow[];
25
+ /**
26
+ * Builds the row -> anchor-list index from one grid's row metadata.
27
+ *
28
+ * Row metadata is index-aligned with rowData; only the shared anchor key
29
+ * counts, and a row may legitimately carry several metadata entries (the
30
+ * caller decides whether multiple anchors are an error).
31
+ */
32
+ export declare function readAnchorIndex(data: ParsedGridData): ReadonlyMap<number, readonly string[]>;
33
+ export declare function indexRows(rows: readonly PreflightRow[], data: ParsedGridData): {
34
+ readonly byAnchor: ReadonlyMap<string, PreflightRow>;
35
+ readonly byIdentity: ReadonlyMap<string, PreflightRow>;
36
+ readonly nextAppendRow: number;
37
+ };
38
+ /**
39
+ * Reads the visible cells of one 1-based row over the registered range.
40
+ *
41
+ * `null` entries mark blank cells, matching the sparse values arrays the API
42
+ * returns (a row's values array may be narrower than the requested range).
43
+ */
44
+ export declare function gridRowCells(data: ParsedGridData, rowNumber: number, startColumn: number, columnCount: number): readonly unknown[];
45
+ /**
46
+ * Extracts the number format of one API cell, if any.
47
+ *
48
+ * The REST API models `CellFormat.numberFormat` as a `{ type, pattern }`
49
+ * object, never a bare string; the user-entered format wins over the
50
+ * effective format when both are present.
51
+ */
52
+ export declare function apiCellNumberFormat(value: unknown): ParsedCellNumberFormat | undefined;
53
+ //# sourceMappingURL=preflightRows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflightRows.d.ts","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/google-sheets-api/model/preflightRows.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AASrE,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EACd,WAAW,EACX,yBAAyB,EACzB,YAAY,EACb,MAAM,uBAAuB,CAAC;AAE/B,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAM9F;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,KAAK,EAAE,MAAM,GACZ,WAAW,GAAG,SAAS,CAEzB;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,yBAAyB,EACnC,OAAO,EAAE,MAAM,GACd,cAAc,CAMhB;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,yBAAyB,EACnC,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,KAAK,EAAE,MAAM,GACZ;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,CAUhE;AAED,+DAA+D;AAC/D,wBAAgB,QAAQ,CACtB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EACrE,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,GAC9B,SAAS,YAAY,EAAE,CA2CzB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAU5F;AAED,wBAAgB,SAAS,CACvB,IAAI,EAAE,SAAS,YAAY,EAAE,EAC7B,IAAI,EAAE,cAAc,GACnB;IACD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACrD,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACvD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,CAgCA;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,SAAS,OAAO,EAAE,CAcpB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,GAAG,SAAS,CAkBtF"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Preflight row normalization, indexes, and sheet/grid lookup.
3
+ *
4
+ * Nonblank target rows are normalized into typed `PreflightRow` values with
5
+ * their anchor evidence and visible identity; the anchor/identity indexes
6
+ * fail closed on duplicates and derive the next append row. Sheet and grid
7
+ * lookup helpers resolve titles to validated grids for the preflight data
8
+ * read and the observation/provisioning readers.
9
+ */
10
+ import { presentValue, absentValue } from "../../../../../shared/state/index.js";
11
+ import { GOOGLE_SHEETS_API_ANCHOR_KEY } from "../constants.js";
12
+ import { invalidProviderState } from "../errors.js";
13
+ import { identityFromNormalizedCell, isBlankApiCell, normalizedCellFromApiValue, } from "./valueNormalization.js";
14
+ export function requireSheetByTitle(sheets, title) {
15
+ const sheet = findSheetByTitle(sheets, title);
16
+ if (sheet === undefined) {
17
+ invalidProviderState(`Registered sync sheet does not exist: ${title}`);
18
+ }
19
+ return sheet;
20
+ }
21
+ export function findSheetByTitle(sheets, title) {
22
+ return sheets.find((sheet) => sheet.title === title);
23
+ }
24
+ export function requireGridDataForSheet(document, sheetId) {
25
+ const grid = document.grids.get(sheetId);
26
+ if (grid === undefined) {
27
+ invalidProviderState(`grid data is missing for sheet ${sheetId}`);
28
+ }
29
+ return grid;
30
+ }
31
+ /** Returns the parsed grid for one sheet by title, failing closed when absent. */
32
+ export function requireGridDataByTitle(document, sheets, title) {
33
+ const sheet = findSheetByTitle(sheets, title);
34
+ if (sheet === undefined) {
35
+ invalidProviderState(`Registered sync sheet does not exist: ${title}`);
36
+ }
37
+ const grid = document.grids.get(sheet.sheetId);
38
+ if (grid === undefined) {
39
+ invalidProviderState(`grid data is missing for sheet ${sheet.sheetId}`);
40
+ }
41
+ return { sheet, grid };
42
+ }
43
+ /** Normalizes nonblank grid rows into typed preflight rows. */
44
+ export function readRows(data, range, headers, identityField) {
45
+ const anchorsByRow = readAnchorIndex(data);
46
+ const rows = [];
47
+ for (let rowIndex = 0; rowIndex < data.rowData.length; rowIndex += 1) {
48
+ const rowNumber = data.startRow + 1 + rowIndex;
49
+ if (rowNumber < 2)
50
+ continue;
51
+ const rawRow = data.rowData[rowIndex];
52
+ if (rawRow === undefined)
53
+ continue;
54
+ const values = gridRowCells(data, rowNumber, range.startColumn, range.columnCount);
55
+ if (values.every((value) => isBlankApiCell(value)))
56
+ continue;
57
+ const cells = {};
58
+ headers.forEach((header, columnIndex) => {
59
+ const value = values[columnIndex];
60
+ const numberFormat = apiCellNumberFormat(value);
61
+ cells[header] = normalizedCellFromApiValue(value === null || value === undefined
62
+ ? undefined
63
+ : value.userEnteredValue, numberFormat);
64
+ });
65
+ const anchors = anchorsByRow.get(rowNumber);
66
+ if (anchors !== undefined && anchors.length > 1) {
67
+ invalidProviderState(`row has multiple sync anchors: ${rowNumber}`);
68
+ }
69
+ const firstAnchor = anchors === undefined || anchors.length === 0
70
+ ? undefined
71
+ : (anchors[0] ?? undefined);
72
+ const physicalAnchor = firstAnchor === undefined
73
+ ? absentValue()
74
+ : presentValue(firstAnchor);
75
+ let identity = absentValue();
76
+ if (identityField.kind === "present") {
77
+ const identityCell = cells[identityField.value];
78
+ const value = identityFromNormalizedCell(identityCell ?? null);
79
+ if (value !== null)
80
+ identity = presentValue(value);
81
+ }
82
+ rows.push({ rowNumber, physicalAnchor, cells, identity });
83
+ }
84
+ return rows;
85
+ }
86
+ /**
87
+ * Builds the row -> anchor-list index from one grid's row metadata.
88
+ *
89
+ * Row metadata is index-aligned with rowData; only the shared anchor key
90
+ * counts, and a row may legitimately carry several metadata entries (the
91
+ * caller decides whether multiple anchors are an error).
92
+ */
93
+ export function readAnchorIndex(data) {
94
+ const byRow = new Map();
95
+ data.rowMetadata.forEach((metadata, index) => {
96
+ const rowNumber = data.startRow + 1 + index;
97
+ const anchors = metadata.developerMetadata
98
+ .filter((item) => item.metadataKey === GOOGLE_SHEETS_API_ANCHOR_KEY)
99
+ .map((item) => item.metadataValue);
100
+ if (anchors.length > 0)
101
+ byRow.set(rowNumber, anchors);
102
+ });
103
+ return byRow;
104
+ }
105
+ export function indexRows(rows, data) {
106
+ const byAnchor = new Map();
107
+ const byIdentity = new Map();
108
+ for (const row of rows) {
109
+ if (row.physicalAnchor.kind === "present") {
110
+ const existing = byAnchor.get(row.physicalAnchor.value);
111
+ if (existing !== undefined) {
112
+ invalidProviderState(`sync anchor is duplicated: ${row.physicalAnchor.value} at rows ${existing.rowNumber} and ${row.rowNumber}`);
113
+ }
114
+ byAnchor.set(row.physicalAnchor.value, row);
115
+ }
116
+ if (row.identity.kind === "present") {
117
+ const existing = byIdentity.get(row.identity.value);
118
+ if (existing !== undefined) {
119
+ invalidProviderState(`sync identity is duplicated: ${row.identity.value} at rows ${existing.rowNumber} and ${row.rowNumber}`);
120
+ }
121
+ byIdentity.set(row.identity.value, row);
122
+ }
123
+ }
124
+ // The API omits trailing empty rows from grid data, so the last data row is
125
+ // the sheet's last content row; appends start one row below it (min row 2,
126
+ // matching the Apps Script nextAppendRow = max(lastRow + 1, 2)).
127
+ const lastContentRow = data.startRow + data.rowData.length;
128
+ return {
129
+ byAnchor,
130
+ byIdentity,
131
+ nextAppendRow: Math.max(lastContentRow + 1, 2),
132
+ };
133
+ }
134
+ /**
135
+ * Reads the visible cells of one 1-based row over the registered range.
136
+ *
137
+ * `null` entries mark blank cells, matching the sparse values arrays the API
138
+ * returns (a row's values array may be narrower than the requested range).
139
+ */
140
+ export function gridRowCells(data, rowNumber, startColumn, columnCount) {
141
+ const rowIndex = rowNumber - data.startRow - 1;
142
+ const rawRow = data.rowData[rowIndex];
143
+ if (rawRow === undefined) {
144
+ return Array.from({ length: columnCount }, () => null);
145
+ }
146
+ const values = rawRow.values;
147
+ const cells = [];
148
+ for (let offset = 0; offset < columnCount; offset += 1) {
149
+ const column = startColumn - 1 + offset - data.startColumn;
150
+ const value = values[column];
151
+ cells.push(value === undefined ? null : value);
152
+ }
153
+ return cells;
154
+ }
155
+ /**
156
+ * Extracts the number format of one API cell, if any.
157
+ *
158
+ * The REST API models `CellFormat.numberFormat` as a `{ type, pattern }`
159
+ * object, never a bare string; the user-entered format wins over the
160
+ * effective format when both are present.
161
+ */
162
+ export function apiCellNumberFormat(value) {
163
+ if (value === null || typeof value !== "object")
164
+ return undefined;
165
+ const cell = value;
166
+ const entered = cell.userEnteredFormat;
167
+ if (entered !== null && typeof entered === "object") {
168
+ const format = parseCellNumberFormat(entered.numberFormat);
169
+ if (format !== undefined)
170
+ return format;
171
+ }
172
+ const effective = cell.effectiveFormat;
173
+ if (effective !== null && typeof effective === "object") {
174
+ const format = parseCellNumberFormat(effective.numberFormat);
175
+ if (format !== undefined)
176
+ return format;
177
+ }
178
+ return undefined;
179
+ }
180
+ /** Validates one SDK `numberFormat` object (type plus optional pattern). */
181
+ function parseCellNumberFormat(value) {
182
+ if (value === null || value === undefined)
183
+ return undefined;
184
+ if (typeof value !== "object" || Array.isArray(value)) {
185
+ invalidProviderState("cell numberFormat must be an object");
186
+ }
187
+ const record = value;
188
+ const type = record.type;
189
+ if (typeof type !== "string" || type.length === 0) {
190
+ invalidProviderState("cell numberFormat.type is invalid");
191
+ }
192
+ const pattern = record.pattern;
193
+ if (pattern !== undefined && typeof pattern !== "string") {
194
+ invalidProviderState("cell numberFormat.pattern is invalid");
195
+ }
196
+ return { type, pattern };
197
+ }
198
+ //# sourceMappingURL=preflightRows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflightRows.js","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/google-sheets-api/model/preflightRows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Row-anchor assignment for the Google Sheets API sync provider.
3
+ *
4
+ * Ensures every nonblank row of one registered tab carries a
5
+ * developer-metadata anchor, writing all planned anchors in ONE atomic
6
+ * batchUpdate. Rows with more than one anchor fail closed; duplicate anchors
7
+ * across rows are reported as evidence. No re-read is performed.
8
+ */
9
+ import type { EnsureSyncRowAnchorsRequest, EnsureSyncRowAnchorsResult } from "../../../../../application/sync/sheets/syncSheets.js";
10
+ import { type AnchorPlanResult, type ObservedTab } from "../model/observation.js";
11
+ import { type GoogleSheetsApiProviderDeps } from "./shared.js";
12
+ /**
13
+ * Ensures every nonblank row of one registered tab carries a
14
+ * developer-metadata anchor, writing all planned anchors in ONE atomic
15
+ * batchUpdate. Rows with more than one anchor fail closed; duplicate
16
+ * anchors across rows are reported as evidence. No re-read is performed.
17
+ */
18
+ export declare function ensureRowAnchors(deps: GoogleSheetsApiProviderDeps, request: EnsureSyncRowAnchorsRequest): Promise<EnsureSyncRowAnchorsResult>;
19
+ /** Writes every planned anchor of one tab in one atomic batch. */
20
+ export declare function writeAnchors(deps: GoogleSheetsApiProviderDeps, tab: ObservedTab, plan: AnchorPlanResult): Promise<void>;
21
+ //# sourceMappingURL=anchors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchors.d.ts","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/google-sheets-api/operations/anchors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,2BAA2B,EAC3B,0BAA0B,EAC3B,MAAM,sDAAsD,CAAC;AAI9D,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAKL,KAAK,2BAA2B,EACjC,MAAM,aAAa,CAAC;AAGrB;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,2BAA2B,EACjC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAqBrC;AAED,kEAAkE;AAClE,wBAAsB,YAAY,CAChC,IAAI,EAAE,2BAA2B,EACjC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CAcf"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Row-anchor assignment for the Google Sheets API sync provider.
3
+ *
4
+ * Ensures every nonblank row of one registered tab carries a
5
+ * developer-metadata anchor, writing all planned anchors in ONE atomic
6
+ * batchUpdate. Rows with more than one anchor fail closed; duplicate anchors
7
+ * across rows are reported as evidence. No re-read is performed.
8
+ */
9
+ import { GOOGLE_SHEETS_API_ANCHOR_KEY } from "../constants.js";
10
+ import { invalidProviderState } from "../errors.js";
11
+ import { planRowAnchors, } from "../model/observation.js";
12
+ import { definitionForPhysicalSheet, requireValidBatchUpdateReply, runWrite, validateRoute, } from "./shared.js";
13
+ import { readObservedTabs } from "./readRows.js";
14
+ /**
15
+ * Ensures every nonblank row of one registered tab carries a
16
+ * developer-metadata anchor, writing all planned anchors in ONE atomic
17
+ * batchUpdate. Rows with more than one anchor fail closed; duplicate
18
+ * anchors across rows are reported as evidence. No re-read is performed.
19
+ */
20
+ export async function ensureRowAnchors(deps, request) {
21
+ const definition = definitionForPhysicalSheet(deps, request.physicalSheetId);
22
+ validateRoute(request, definition);
23
+ const tabs = await readObservedTabs(deps, [request]);
24
+ const tab = tabs.get(request.sheetName);
25
+ if (tab === undefined) {
26
+ invalidProviderState(`Registered sync sheet does not exist: ${request.sheetName}`);
27
+ }
28
+ const plan = planRowAnchors(tab, {
29
+ registeredRange: request.registeredRange,
30
+ headers: definition.headers,
31
+ checkboxHeaders: definition.checkboxHeaders ?? [],
32
+ });
33
+ if (plan.planned.length > 0) {
34
+ await writeAnchors(deps, tab, plan);
35
+ }
36
+ return {
37
+ assigned: plan.assigned,
38
+ existing: plan.existing,
39
+ duplicateAnchors: plan.duplicateAnchors,
40
+ };
41
+ }
42
+ /** Writes every planned anchor of one tab in one atomic batch. */
43
+ export async function writeAnchors(deps, tab, plan) {
44
+ const requests = plan.planned.map((planned) => ({
45
+ kind: "createDeveloperMetadata",
46
+ sheetId: tab.sheetId,
47
+ rowIndex: planned.rowIndex,
48
+ key: GOOGLE_SHEETS_API_ANCHOR_KEY,
49
+ value: planned.anchor,
50
+ }));
51
+ const response = await runWrite(deps, () => deps.transport.batchUpdate({
52
+ spreadsheetId: deps.spreadsheetId,
53
+ requests,
54
+ }));
55
+ requireValidBatchUpdateReply(response, requests.length);
56
+ }
57
+ //# sourceMappingURL=anchors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchors.js","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/google-sheets-api/operations/anchors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EACL,cAAc,GAGf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,QAAQ,EACR,aAAa,GAEd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAiC,EACjC,OAAoC;IAEpC,MAAM,UAAU,GAAG,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7E,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,oBAAoB,CAAC,yCAAyC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE;QAC/B,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,eAAe,EAAE,UAAU,CAAC,eAAe,IAAI,EAAE;KAClD,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KACxC,CAAC;AACJ,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAiC,EACjC,GAAgB,EAChB,IAAsB;IAEtB,MAAM,QAAQ,GAAkC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7E,IAAI,EAAE,yBAAyB;QAC/B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,EAAE,4BAA4B;QACjC,KAAK,EAAE,OAAO,CAAC,MAAM;KACtB,CAAC,CAAC,CAAC;IACJ,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CACzC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;QACzB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,QAAQ;KACT,CAAC,CAAC,CAAC;IACN,4BAA4B,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC1D,CAAC"}