@mcp-z/mcp-sheets 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +181 -0
  3. package/bin/server.js +5 -0
  4. package/dist/cjs/constants.d.cts +7 -0
  5. package/dist/cjs/constants.d.ts +7 -0
  6. package/dist/cjs/constants.js +18 -0
  7. package/dist/cjs/constants.js.map +1 -0
  8. package/dist/cjs/index.d.cts +8 -0
  9. package/dist/cjs/index.d.ts +8 -0
  10. package/dist/cjs/index.js +314 -0
  11. package/dist/cjs/index.js.map +1 -0
  12. package/dist/cjs/lib/create-store.d.cts +2 -0
  13. package/dist/cjs/lib/create-store.d.ts +2 -0
  14. package/dist/cjs/lib/create-store.js +166 -0
  15. package/dist/cjs/lib/create-store.js.map +1 -0
  16. package/dist/cjs/mcp/index.d.cts +3 -0
  17. package/dist/cjs/mcp/index.d.ts +3 -0
  18. package/dist/cjs/mcp/index.js +66 -0
  19. package/dist/cjs/mcp/index.js.map +1 -0
  20. package/dist/cjs/mcp/prompts/a1-notation.d.cts +19 -0
  21. package/dist/cjs/mcp/prompts/a1-notation.d.ts +19 -0
  22. package/dist/cjs/mcp/prompts/a1-notation.js +169 -0
  23. package/dist/cjs/mcp/prompts/a1-notation.js.map +1 -0
  24. package/dist/cjs/mcp/prompts/index.d.cts +1 -0
  25. package/dist/cjs/mcp/prompts/index.d.ts +1 -0
  26. package/dist/cjs/mcp/prompts/index.js +17 -0
  27. package/dist/cjs/mcp/prompts/index.js.map +1 -0
  28. package/dist/cjs/mcp/resources/index.d.cts +1 -0
  29. package/dist/cjs/mcp/resources/index.d.ts +1 -0
  30. package/dist/cjs/mcp/resources/index.js +17 -0
  31. package/dist/cjs/mcp/resources/index.js.map +1 -0
  32. package/dist/cjs/mcp/resources/spreadsheet.d.cts +2 -0
  33. package/dist/cjs/mcp/resources/spreadsheet.d.ts +2 -0
  34. package/dist/cjs/mcp/resources/spreadsheet.js +258 -0
  35. package/dist/cjs/mcp/resources/spreadsheet.js.map +1 -0
  36. package/dist/cjs/mcp/tools/cells-format.d.cts +144 -0
  37. package/dist/cjs/mcp/tools/cells-format.d.ts +144 -0
  38. package/dist/cjs/mcp/tools/cells-format.js +484 -0
  39. package/dist/cjs/mcp/tools/cells-format.js.map +1 -0
  40. package/dist/cjs/mcp/tools/chart-create.d.cts +94 -0
  41. package/dist/cjs/mcp/tools/chart-create.d.ts +94 -0
  42. package/dist/cjs/mcp/tools/chart-create.js +575 -0
  43. package/dist/cjs/mcp/tools/chart-create.js.map +1 -0
  44. package/dist/cjs/mcp/tools/columns-get.d.cts +55 -0
  45. package/dist/cjs/mcp/tools/columns-get.d.ts +55 -0
  46. package/dist/cjs/mcp/tools/columns-get.js +289 -0
  47. package/dist/cjs/mcp/tools/columns-get.js.map +1 -0
  48. package/dist/cjs/mcp/tools/columns-update.d.cts +86 -0
  49. package/dist/cjs/mcp/tools/columns-update.d.ts +86 -0
  50. package/dist/cjs/mcp/tools/columns-update.js +482 -0
  51. package/dist/cjs/mcp/tools/columns-update.js.map +1 -0
  52. package/dist/cjs/mcp/tools/csv-get-columns.d.cts +43 -0
  53. package/dist/cjs/mcp/tools/csv-get-columns.d.ts +43 -0
  54. package/dist/cjs/mcp/tools/csv-get-columns.js +386 -0
  55. package/dist/cjs/mcp/tools/csv-get-columns.js.map +1 -0
  56. package/dist/cjs/mcp/tools/dimensions-batch-update.d.cts +118 -0
  57. package/dist/cjs/mcp/tools/dimensions-batch-update.d.ts +118 -0
  58. package/dist/cjs/mcp/tools/dimensions-batch-update.js +504 -0
  59. package/dist/cjs/mcp/tools/dimensions-batch-update.js.map +1 -0
  60. package/dist/cjs/mcp/tools/dimensions-move.d.cts +86 -0
  61. package/dist/cjs/mcp/tools/dimensions-move.d.ts +86 -0
  62. package/dist/cjs/mcp/tools/dimensions-move.js +359 -0
  63. package/dist/cjs/mcp/tools/dimensions-move.js.map +1 -0
  64. package/dist/cjs/mcp/tools/index.d.cts +26 -0
  65. package/dist/cjs/mcp/tools/index.d.ts +26 -0
  66. package/dist/cjs/mcp/tools/index.js +122 -0
  67. package/dist/cjs/mcp/tools/index.js.map +1 -0
  68. package/dist/cjs/mcp/tools/lib/dimension-operations.d.cts +48 -0
  69. package/dist/cjs/mcp/tools/lib/dimension-operations.d.ts +48 -0
  70. package/dist/cjs/mcp/tools/lib/dimension-operations.js +177 -0
  71. package/dist/cjs/mcp/tools/lib/dimension-operations.js.map +1 -0
  72. package/dist/cjs/mcp/tools/rows-append.d.cts +58 -0
  73. package/dist/cjs/mcp/tools/rows-append.d.ts +58 -0
  74. package/dist/cjs/mcp/tools/rows-append.js +335 -0
  75. package/dist/cjs/mcp/tools/rows-append.js.map +1 -0
  76. package/dist/cjs/mcp/tools/rows-csv-append.d.cts +67 -0
  77. package/dist/cjs/mcp/tools/rows-csv-append.d.ts +67 -0
  78. package/dist/cjs/mcp/tools/rows-csv-append.js +859 -0
  79. package/dist/cjs/mcp/tools/rows-csv-append.js.map +1 -0
  80. package/dist/cjs/mcp/tools/rows-get.d.cts +56 -0
  81. package/dist/cjs/mcp/tools/rows-get.d.ts +56 -0
  82. package/dist/cjs/mcp/tools/rows-get.js +292 -0
  83. package/dist/cjs/mcp/tools/rows-get.js.map +1 -0
  84. package/dist/cjs/mcp/tools/sheet-copy-to.d.cts +68 -0
  85. package/dist/cjs/mcp/tools/sheet-copy-to.d.ts +68 -0
  86. package/dist/cjs/mcp/tools/sheet-copy-to.js +341 -0
  87. package/dist/cjs/mcp/tools/sheet-copy-to.js.map +1 -0
  88. package/dist/cjs/mcp/tools/sheet-copy.d.cts +80 -0
  89. package/dist/cjs/mcp/tools/sheet-copy.d.ts +80 -0
  90. package/dist/cjs/mcp/tools/sheet-copy.js +394 -0
  91. package/dist/cjs/mcp/tools/sheet-copy.js.map +1 -0
  92. package/dist/cjs/mcp/tools/sheet-create.d.cts +56 -0
  93. package/dist/cjs/mcp/tools/sheet-create.d.ts +56 -0
  94. package/dist/cjs/mcp/tools/sheet-create.js +283 -0
  95. package/dist/cjs/mcp/tools/sheet-create.js.map +1 -0
  96. package/dist/cjs/mcp/tools/sheet-delete.d.cts +62 -0
  97. package/dist/cjs/mcp/tools/sheet-delete.d.ts +62 -0
  98. package/dist/cjs/mcp/tools/sheet-delete.js +341 -0
  99. package/dist/cjs/mcp/tools/sheet-delete.js.map +1 -0
  100. package/dist/cjs/mcp/tools/sheet-find.d.cts +48 -0
  101. package/dist/cjs/mcp/tools/sheet-find.d.ts +48 -0
  102. package/dist/cjs/mcp/tools/sheet-find.js +261 -0
  103. package/dist/cjs/mcp/tools/sheet-find.js.map +1 -0
  104. package/dist/cjs/mcp/tools/sheet-rename.d.cts +60 -0
  105. package/dist/cjs/mcp/tools/sheet-rename.d.ts +60 -0
  106. package/dist/cjs/mcp/tools/sheet-rename.js +305 -0
  107. package/dist/cjs/mcp/tools/sheet-rename.js.map +1 -0
  108. package/dist/cjs/mcp/tools/spreadsheet-copy.d.cts +58 -0
  109. package/dist/cjs/mcp/tools/spreadsheet-copy.d.ts +58 -0
  110. package/dist/cjs/mcp/tools/spreadsheet-copy.js +319 -0
  111. package/dist/cjs/mcp/tools/spreadsheet-copy.js.map +1 -0
  112. package/dist/cjs/mcp/tools/spreadsheet-create.d.cts +52 -0
  113. package/dist/cjs/mcp/tools/spreadsheet-create.d.ts +52 -0
  114. package/dist/cjs/mcp/tools/spreadsheet-create.js +270 -0
  115. package/dist/cjs/mcp/tools/spreadsheet-create.js.map +1 -0
  116. package/dist/cjs/mcp/tools/spreadsheet-find.d.cts +58 -0
  117. package/dist/cjs/mcp/tools/spreadsheet-find.d.ts +58 -0
  118. package/dist/cjs/mcp/tools/spreadsheet-find.js +334 -0
  119. package/dist/cjs/mcp/tools/spreadsheet-find.js.map +1 -0
  120. package/dist/cjs/mcp/tools/spreadsheet-rename.d.cts +56 -0
  121. package/dist/cjs/mcp/tools/spreadsheet-rename.d.ts +56 -0
  122. package/dist/cjs/mcp/tools/spreadsheet-rename.js +289 -0
  123. package/dist/cjs/mcp/tools/spreadsheet-rename.js.map +1 -0
  124. package/dist/cjs/mcp/tools/validation-set.d.cts +144 -0
  125. package/dist/cjs/mcp/tools/validation-set.d.ts +144 -0
  126. package/dist/cjs/mcp/tools/validation-set.js +564 -0
  127. package/dist/cjs/mcp/tools/validation-set.js.map +1 -0
  128. package/dist/cjs/mcp/tools/values-batch-update.d.cts +102 -0
  129. package/dist/cjs/mcp/tools/values-batch-update.d.ts +102 -0
  130. package/dist/cjs/mcp/tools/values-batch-update.js +409 -0
  131. package/dist/cjs/mcp/tools/values-batch-update.js.map +1 -0
  132. package/dist/cjs/mcp/tools/values-clear.d.cts +56 -0
  133. package/dist/cjs/mcp/tools/values-clear.d.ts +56 -0
  134. package/dist/cjs/mcp/tools/values-clear.js +308 -0
  135. package/dist/cjs/mcp/tools/values-clear.js.map +1 -0
  136. package/dist/cjs/mcp/tools/values-csv-update.d.cts +75 -0
  137. package/dist/cjs/mcp/tools/values-csv-update.d.ts +75 -0
  138. package/dist/cjs/mcp/tools/values-csv-update.js +500 -0
  139. package/dist/cjs/mcp/tools/values-csv-update.js.map +1 -0
  140. package/dist/cjs/mcp/tools/values-replace.d.cts +68 -0
  141. package/dist/cjs/mcp/tools/values-replace.d.ts +68 -0
  142. package/dist/cjs/mcp/tools/values-replace.js +378 -0
  143. package/dist/cjs/mcp/tools/values-replace.js.map +1 -0
  144. package/dist/cjs/mcp/tools/values-search.d.cts +74 -0
  145. package/dist/cjs/mcp/tools/values-search.d.ts +74 -0
  146. package/dist/cjs/mcp/tools/values-search.js +470 -0
  147. package/dist/cjs/mcp/tools/values-search.js.map +1 -0
  148. package/dist/cjs/package.json +1 -0
  149. package/dist/cjs/schemas/index.d.cts +14 -0
  150. package/dist/cjs/schemas/index.d.ts +14 -0
  151. package/dist/cjs/schemas/index.js +64 -0
  152. package/dist/cjs/schemas/index.js.map +1 -0
  153. package/dist/cjs/setup/config.d.cts +44 -0
  154. package/dist/cjs/setup/config.d.ts +44 -0
  155. package/dist/cjs/setup/config.js +201 -0
  156. package/dist/cjs/setup/config.js.map +1 -0
  157. package/dist/cjs/setup/http.d.cts +8 -0
  158. package/dist/cjs/setup/http.d.ts +8 -0
  159. package/dist/cjs/setup/http.js +260 -0
  160. package/dist/cjs/setup/http.js.map +1 -0
  161. package/dist/cjs/setup/index.d.cts +5 -0
  162. package/dist/cjs/setup/index.d.ts +5 -0
  163. package/dist/cjs/setup/index.js +46 -0
  164. package/dist/cjs/setup/index.js.map +1 -0
  165. package/dist/cjs/setup/oauth-google.d.cts +54 -0
  166. package/dist/cjs/setup/oauth-google.d.ts +54 -0
  167. package/dist/cjs/setup/oauth-google.js +332 -0
  168. package/dist/cjs/setup/oauth-google.js.map +1 -0
  169. package/dist/cjs/setup/runtime.d.cts +10 -0
  170. package/dist/cjs/setup/runtime.d.ts +10 -0
  171. package/dist/cjs/setup/runtime.js +353 -0
  172. package/dist/cjs/setup/runtime.js.map +1 -0
  173. package/dist/cjs/setup/stdio.d.cts +7 -0
  174. package/dist/cjs/setup/stdio.d.ts +7 -0
  175. package/dist/cjs/setup/stdio.js +239 -0
  176. package/dist/cjs/setup/stdio.js.map +1 -0
  177. package/dist/cjs/spreadsheet/column-utilities.d.cts +1 -0
  178. package/dist/cjs/spreadsheet/column-utilities.d.ts +1 -0
  179. package/dist/cjs/spreadsheet/column-utilities.js +21 -0
  180. package/dist/cjs/spreadsheet/column-utilities.js.map +1 -0
  181. package/dist/cjs/spreadsheet/csv-streaming.d.cts +19 -0
  182. package/dist/cjs/spreadsheet/csv-streaming.d.ts +19 -0
  183. package/dist/cjs/spreadsheet/csv-streaming.js +188 -0
  184. package/dist/cjs/spreadsheet/csv-streaming.js.map +1 -0
  185. package/dist/cjs/spreadsheet/data-operations.d.cts +115 -0
  186. package/dist/cjs/spreadsheet/data-operations.d.ts +115 -0
  187. package/dist/cjs/spreadsheet/data-operations.js +1515 -0
  188. package/dist/cjs/spreadsheet/data-operations.js.map +1 -0
  189. package/dist/cjs/spreadsheet/deduplication-utils.d.cts +31 -0
  190. package/dist/cjs/spreadsheet/deduplication-utils.d.ts +31 -0
  191. package/dist/cjs/spreadsheet/deduplication-utils.js +65 -0
  192. package/dist/cjs/spreadsheet/deduplication-utils.js.map +1 -0
  193. package/dist/cjs/spreadsheet/range-operations.d.cts +184 -0
  194. package/dist/cjs/spreadsheet/range-operations.d.ts +184 -0
  195. package/dist/cjs/spreadsheet/range-operations.js +672 -0
  196. package/dist/cjs/spreadsheet/range-operations.js.map +1 -0
  197. package/dist/cjs/spreadsheet/sheet-operations.d.cts +30 -0
  198. package/dist/cjs/spreadsheet/sheet-operations.d.ts +30 -0
  199. package/dist/cjs/spreadsheet/sheet-operations.js +811 -0
  200. package/dist/cjs/spreadsheet/sheet-operations.js.map +1 -0
  201. package/dist/cjs/spreadsheet/spreadsheet-management.d.cts +21 -0
  202. package/dist/cjs/spreadsheet/spreadsheet-management.d.ts +21 -0
  203. package/dist/cjs/spreadsheet/spreadsheet-management.js +310 -0
  204. package/dist/cjs/spreadsheet/spreadsheet-management.js.map +1 -0
  205. package/dist/cjs/types.d.cts +53 -0
  206. package/dist/cjs/types.d.ts +53 -0
  207. package/dist/cjs/types.js +5 -0
  208. package/dist/cjs/types.js.map +1 -0
  209. package/dist/esm/constants.d.ts +7 -0
  210. package/dist/esm/constants.js +7 -0
  211. package/dist/esm/constants.js.map +1 -0
  212. package/dist/esm/index.d.ts +8 -0
  213. package/dist/esm/index.js +34 -0
  214. package/dist/esm/index.js.map +1 -0
  215. package/dist/esm/lib/create-store.d.ts +2 -0
  216. package/dist/esm/lib/create-store.js +6 -0
  217. package/dist/esm/lib/create-store.js.map +1 -0
  218. package/dist/esm/mcp/index.d.ts +3 -0
  219. package/dist/esm/mcp/index.js +6 -0
  220. package/dist/esm/mcp/index.js.map +1 -0
  221. package/dist/esm/mcp/prompts/a1-notation.d.ts +19 -0
  222. package/dist/esm/mcp/prompts/a1-notation.js +49 -0
  223. package/dist/esm/mcp/prompts/a1-notation.js.map +1 -0
  224. package/dist/esm/mcp/prompts/index.d.ts +1 -0
  225. package/dist/esm/mcp/prompts/index.js +1 -0
  226. package/dist/esm/mcp/prompts/index.js.map +1 -0
  227. package/dist/esm/mcp/resources/index.d.ts +1 -0
  228. package/dist/esm/mcp/resources/index.js +1 -0
  229. package/dist/esm/mcp/resources/index.js.map +1 -0
  230. package/dist/esm/mcp/resources/spreadsheet.d.ts +2 -0
  231. package/dist/esm/mcp/resources/spreadsheet.js +88 -0
  232. package/dist/esm/mcp/resources/spreadsheet.js.map +1 -0
  233. package/dist/esm/mcp/tools/cells-format.d.ts +144 -0
  234. package/dist/esm/mcp/tools/cells-format.js +288 -0
  235. package/dist/esm/mcp/tools/cells-format.js.map +1 -0
  236. package/dist/esm/mcp/tools/chart-create.d.ts +94 -0
  237. package/dist/esm/mcp/tools/chart-create.js +408 -0
  238. package/dist/esm/mcp/tools/chart-create.js.map +1 -0
  239. package/dist/esm/mcp/tools/columns-get.d.ts +55 -0
  240. package/dist/esm/mcp/tools/columns-get.js +113 -0
  241. package/dist/esm/mcp/tools/columns-get.js.map +1 -0
  242. package/dist/esm/mcp/tools/columns-update.d.ts +86 -0
  243. package/dist/esm/mcp/tools/columns-update.js +296 -0
  244. package/dist/esm/mcp/tools/columns-update.js.map +1 -0
  245. package/dist/esm/mcp/tools/csv-get-columns.d.ts +43 -0
  246. package/dist/esm/mcp/tools/csv-get-columns.js +95 -0
  247. package/dist/esm/mcp/tools/csv-get-columns.js.map +1 -0
  248. package/dist/esm/mcp/tools/dimensions-batch-update.d.ts +118 -0
  249. package/dist/esm/mcp/tools/dimensions-batch-update.js +321 -0
  250. package/dist/esm/mcp/tools/dimensions-batch-update.js.map +1 -0
  251. package/dist/esm/mcp/tools/dimensions-move.d.ts +86 -0
  252. package/dist/esm/mcp/tools/dimensions-move.js +183 -0
  253. package/dist/esm/mcp/tools/dimensions-move.js.map +1 -0
  254. package/dist/esm/mcp/tools/index.d.ts +26 -0
  255. package/dist/esm/mcp/tools/index.js +26 -0
  256. package/dist/esm/mcp/tools/index.js.map +1 -0
  257. package/dist/esm/mcp/tools/lib/dimension-operations.d.ts +48 -0
  258. package/dist/esm/mcp/tools/lib/dimension-operations.js +93 -0
  259. package/dist/esm/mcp/tools/lib/dimension-operations.js.map +1 -0
  260. package/dist/esm/mcp/tools/rows-append.d.ts +58 -0
  261. package/dist/esm/mcp/tools/rows-append.js +151 -0
  262. package/dist/esm/mcp/tools/rows-append.js.map +1 -0
  263. package/dist/esm/mcp/tools/rows-csv-append.d.ts +67 -0
  264. package/dist/esm/mcp/tools/rows-csv-append.js +342 -0
  265. package/dist/esm/mcp/tools/rows-csv-append.js.map +1 -0
  266. package/dist/esm/mcp/tools/rows-get.d.ts +56 -0
  267. package/dist/esm/mcp/tools/rows-get.js +116 -0
  268. package/dist/esm/mcp/tools/rows-get.js.map +1 -0
  269. package/dist/esm/mcp/tools/sheet-copy-to.d.ts +68 -0
  270. package/dist/esm/mcp/tools/sheet-copy-to.js +156 -0
  271. package/dist/esm/mcp/tools/sheet-copy-to.js.map +1 -0
  272. package/dist/esm/mcp/tools/sheet-copy.d.ts +80 -0
  273. package/dist/esm/mcp/tools/sheet-copy.js +177 -0
  274. package/dist/esm/mcp/tools/sheet-copy.js.map +1 -0
  275. package/dist/esm/mcp/tools/sheet-create.d.ts +56 -0
  276. package/dist/esm/mcp/tools/sheet-create.js +110 -0
  277. package/dist/esm/mcp/tools/sheet-create.js.map +1 -0
  278. package/dist/esm/mcp/tools/sheet-delete.d.ts +62 -0
  279. package/dist/esm/mcp/tools/sheet-delete.js +125 -0
  280. package/dist/esm/mcp/tools/sheet-delete.js.map +1 -0
  281. package/dist/esm/mcp/tools/sheet-find.d.ts +48 -0
  282. package/dist/esm/mcp/tools/sheet-find.js +90 -0
  283. package/dist/esm/mcp/tools/sheet-find.js.map +1 -0
  284. package/dist/esm/mcp/tools/sheet-rename.d.ts +60 -0
  285. package/dist/esm/mcp/tools/sheet-rename.js +128 -0
  286. package/dist/esm/mcp/tools/sheet-rename.js.map +1 -0
  287. package/dist/esm/mcp/tools/spreadsheet-copy.d.ts +58 -0
  288. package/dist/esm/mcp/tools/spreadsheet-copy.js +117 -0
  289. package/dist/esm/mcp/tools/spreadsheet-copy.js.map +1 -0
  290. package/dist/esm/mcp/tools/spreadsheet-create.d.ts +52 -0
  291. package/dist/esm/mcp/tools/spreadsheet-create.js +97 -0
  292. package/dist/esm/mcp/tools/spreadsheet-create.js.map +1 -0
  293. package/dist/esm/mcp/tools/spreadsheet-find.d.ts +58 -0
  294. package/dist/esm/mcp/tools/spreadsheet-find.js +113 -0
  295. package/dist/esm/mcp/tools/spreadsheet-find.js.map +1 -0
  296. package/dist/esm/mcp/tools/spreadsheet-rename.d.ts +56 -0
  297. package/dist/esm/mcp/tools/spreadsheet-rename.js +112 -0
  298. package/dist/esm/mcp/tools/spreadsheet-rename.js.map +1 -0
  299. package/dist/esm/mcp/tools/validation-set.d.ts +144 -0
  300. package/dist/esm/mcp/tools/validation-set.js +366 -0
  301. package/dist/esm/mcp/tools/validation-set.js.map +1 -0
  302. package/dist/esm/mcp/tools/values-batch-update.d.ts +102 -0
  303. package/dist/esm/mcp/tools/values-batch-update.js +224 -0
  304. package/dist/esm/mcp/tools/values-batch-update.js.map +1 -0
  305. package/dist/esm/mcp/tools/values-clear.d.ts +56 -0
  306. package/dist/esm/mcp/tools/values-clear.js +131 -0
  307. package/dist/esm/mcp/tools/values-clear.js.map +1 -0
  308. package/dist/esm/mcp/tools/values-csv-update.d.ts +75 -0
  309. package/dist/esm/mcp/tools/values-csv-update.js +202 -0
  310. package/dist/esm/mcp/tools/values-csv-update.js.map +1 -0
  311. package/dist/esm/mcp/tools/values-replace.d.ts +68 -0
  312. package/dist/esm/mcp/tools/values-replace.js +171 -0
  313. package/dist/esm/mcp/tools/values-replace.js.map +1 -0
  314. package/dist/esm/mcp/tools/values-search.d.ts +74 -0
  315. package/dist/esm/mcp/tools/values-search.js +229 -0
  316. package/dist/esm/mcp/tools/values-search.js.map +1 -0
  317. package/dist/esm/package.json +1 -0
  318. package/dist/esm/schemas/index.d.ts +14 -0
  319. package/dist/esm/schemas/index.js +35 -0
  320. package/dist/esm/schemas/index.js.map +1 -0
  321. package/dist/esm/setup/config.d.ts +44 -0
  322. package/dist/esm/setup/config.js +151 -0
  323. package/dist/esm/setup/config.js.map +1 -0
  324. package/dist/esm/setup/http.d.ts +8 -0
  325. package/dist/esm/setup/http.js +54 -0
  326. package/dist/esm/setup/http.js.map +1 -0
  327. package/dist/esm/setup/index.d.ts +5 -0
  328. package/dist/esm/setup/index.js +5 -0
  329. package/dist/esm/setup/index.js.map +1 -0
  330. package/dist/esm/setup/oauth-google.d.ts +54 -0
  331. package/dist/esm/setup/oauth-google.js +142 -0
  332. package/dist/esm/setup/oauth-google.js.map +1 -0
  333. package/dist/esm/setup/runtime.d.ts +10 -0
  334. package/dist/esm/setup/runtime.js +84 -0
  335. package/dist/esm/setup/runtime.js.map +1 -0
  336. package/dist/esm/setup/stdio.d.ts +7 -0
  337. package/dist/esm/setup/stdio.js +38 -0
  338. package/dist/esm/setup/stdio.js.map +1 -0
  339. package/dist/esm/spreadsheet/column-utilities.d.ts +1 -0
  340. package/dist/esm/spreadsheet/column-utilities.js +10 -0
  341. package/dist/esm/spreadsheet/column-utilities.js.map +1 -0
  342. package/dist/esm/spreadsheet/csv-streaming.d.ts +19 -0
  343. package/dist/esm/spreadsheet/csv-streaming.js +43 -0
  344. package/dist/esm/spreadsheet/csv-streaming.js.map +1 -0
  345. package/dist/esm/spreadsheet/data-operations.d.ts +115 -0
  346. package/dist/esm/spreadsheet/data-operations.js +712 -0
  347. package/dist/esm/spreadsheet/data-operations.js.map +1 -0
  348. package/dist/esm/spreadsheet/deduplication-utils.d.ts +31 -0
  349. package/dist/esm/spreadsheet/deduplication-utils.js +54 -0
  350. package/dist/esm/spreadsheet/deduplication-utils.js.map +1 -0
  351. package/dist/esm/spreadsheet/range-operations.d.ts +184 -0
  352. package/dist/esm/spreadsheet/range-operations.js +591 -0
  353. package/dist/esm/spreadsheet/range-operations.js.map +1 -0
  354. package/dist/esm/spreadsheet/sheet-operations.d.ts +30 -0
  355. package/dist/esm/spreadsheet/sheet-operations.js +359 -0
  356. package/dist/esm/spreadsheet/sheet-operations.js.map +1 -0
  357. package/dist/esm/spreadsheet/spreadsheet-management.d.ts +21 -0
  358. package/dist/esm/spreadsheet/spreadsheet-management.js +73 -0
  359. package/dist/esm/spreadsheet/spreadsheet-management.js.map +1 -0
  360. package/dist/esm/types.d.ts +53 -0
  361. package/dist/esm/types.js +1 -0
  362. package/dist/esm/types.js.map +1 -0
  363. package/package.json +108 -0
@@ -0,0 +1,1515 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get appendRows () {
13
+ return appendRows;
14
+ },
15
+ get discoverHeader () {
16
+ return discoverHeader;
17
+ },
18
+ get generateRowKey () {
19
+ return generateRowKey;
20
+ },
21
+ get mapRowsToHeader () {
22
+ return mapRowsToHeader;
23
+ },
24
+ get partitionDataForUpsert () {
25
+ return partitionDataForUpsert;
26
+ },
27
+ get performBatchUpdates () {
28
+ return performBatchUpdates;
29
+ },
30
+ get snapshotHeaderAndKeys () {
31
+ return snapshotHeaderAndKeys;
32
+ },
33
+ get snapshotHeaderKeysAndPositions () {
34
+ return snapshotHeaderKeysAndPositions;
35
+ },
36
+ get upsertByKey () {
37
+ return upsertByKey;
38
+ },
39
+ get validateAndMapHeaders () {
40
+ return validateAndMapHeaders;
41
+ },
42
+ get validateRowKeys () {
43
+ return validateRowKeys;
44
+ }
45
+ });
46
+ var _columnutilities = require("./column-utilities.js");
47
+ var _sheetoperations = require("./sheet-operations.js");
48
+ function _array_like_to_array(arr, len) {
49
+ if (len == null || len > arr.length) len = arr.length;
50
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
51
+ return arr2;
52
+ }
53
+ function _array_without_holes(arr) {
54
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
55
+ }
56
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
57
+ try {
58
+ var info = gen[key](arg);
59
+ var value = info.value;
60
+ } catch (error) {
61
+ reject(error);
62
+ return;
63
+ }
64
+ if (info.done) {
65
+ resolve(value);
66
+ } else {
67
+ Promise.resolve(value).then(_next, _throw);
68
+ }
69
+ }
70
+ function _async_to_generator(fn) {
71
+ return function() {
72
+ var self = this, args = arguments;
73
+ return new Promise(function(resolve, reject) {
74
+ var gen = fn.apply(self, args);
75
+ function _next(value) {
76
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
77
+ }
78
+ function _throw(err) {
79
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
80
+ }
81
+ _next(undefined);
82
+ });
83
+ };
84
+ }
85
+ function _instanceof(left, right) {
86
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
87
+ return !!right[Symbol.hasInstance](left);
88
+ } else {
89
+ return left instanceof right;
90
+ }
91
+ }
92
+ function _iterable_to_array(iter) {
93
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
94
+ }
95
+ function _non_iterable_spread() {
96
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
97
+ }
98
+ function _to_consumable_array(arr) {
99
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
100
+ }
101
+ function _unsupported_iterable_to_array(o, minLen) {
102
+ if (!o) return;
103
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
104
+ var n = Object.prototype.toString.call(o).slice(8, -1);
105
+ if (n === "Object" && o.constructor) n = o.constructor.name;
106
+ if (n === "Map" || n === "Set") return Array.from(n);
107
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
108
+ }
109
+ function _ts_generator(thisArg, body) {
110
+ var f, y, t, _ = {
111
+ label: 0,
112
+ sent: function() {
113
+ if (t[0] & 1) throw t[1];
114
+ return t[1];
115
+ },
116
+ trys: [],
117
+ ops: []
118
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
119
+ return d(g, "next", {
120
+ value: verb(0)
121
+ }), d(g, "throw", {
122
+ value: verb(1)
123
+ }), d(g, "return", {
124
+ value: verb(2)
125
+ }), typeof Symbol === "function" && d(g, Symbol.iterator, {
126
+ value: function() {
127
+ return this;
128
+ }
129
+ }), g;
130
+ function verb(n) {
131
+ return function(v) {
132
+ return step([
133
+ n,
134
+ v
135
+ ]);
136
+ };
137
+ }
138
+ function step(op) {
139
+ if (f) throw new TypeError("Generator is already executing.");
140
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
141
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
142
+ if (y = 0, t) op = [
143
+ op[0] & 2,
144
+ t.value
145
+ ];
146
+ switch(op[0]){
147
+ case 0:
148
+ case 1:
149
+ t = op;
150
+ break;
151
+ case 4:
152
+ _.label++;
153
+ return {
154
+ value: op[1],
155
+ done: false
156
+ };
157
+ case 5:
158
+ _.label++;
159
+ y = op[1];
160
+ op = [
161
+ 0
162
+ ];
163
+ continue;
164
+ case 7:
165
+ op = _.ops.pop();
166
+ _.trys.pop();
167
+ continue;
168
+ default:
169
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
170
+ _ = 0;
171
+ continue;
172
+ }
173
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
174
+ _.label = op[1];
175
+ break;
176
+ }
177
+ if (op[0] === 6 && _.label < t[1]) {
178
+ _.label = t[1];
179
+ t = op;
180
+ break;
181
+ }
182
+ if (t && _.label < t[2]) {
183
+ _.label = t[2];
184
+ _.ops.push(op);
185
+ break;
186
+ }
187
+ if (t[2]) _.ops.pop();
188
+ _.trys.pop();
189
+ continue;
190
+ }
191
+ op = body.call(thisArg, _);
192
+ } catch (e) {
193
+ op = [
194
+ 6,
195
+ e
196
+ ];
197
+ y = 0;
198
+ } finally{
199
+ f = t = 0;
200
+ }
201
+ if (op[0] & 5) throw op[1];
202
+ return {
203
+ value: op[0] ? op[1] : void 0,
204
+ done: true
205
+ };
206
+ }
207
+ }
208
+ function discoverHeader(sheets, spreadsheetId, sheetTitle) {
209
+ return _async_to_generator(function() {
210
+ var _response_data, response, unused;
211
+ return _ts_generator(this, function(_state) {
212
+ switch(_state.label){
213
+ case 0:
214
+ _state.trys.push([
215
+ 0,
216
+ 2,
217
+ ,
218
+ 3
219
+ ]);
220
+ return [
221
+ 4,
222
+ sheets.spreadsheets.values.get({
223
+ spreadsheetId: spreadsheetId,
224
+ range: "".concat(sheetTitle, "!1:1"),
225
+ majorDimension: 'ROWS'
226
+ })
227
+ ];
228
+ case 1:
229
+ response = _state.sent();
230
+ return [
231
+ 2,
232
+ (((_response_data = response.data) === null || _response_data === void 0 ? void 0 : _response_data.values) || [])[0] || []
233
+ ];
234
+ case 2:
235
+ unused = _state.sent();
236
+ return [
237
+ 2,
238
+ []
239
+ ];
240
+ case 3:
241
+ return [
242
+ 2
243
+ ];
244
+ }
245
+ });
246
+ })();
247
+ }
248
+ function validateAndMapHeaders(sheetHeaders, canonicalHeaders) {
249
+ var requiredColumns = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [];
250
+ var normalizeColumn = function(col) {
251
+ return String(col !== null && col !== void 0 ? col : '').toLowerCase().replace(/[^a-z0-9]/g, '');
252
+ };
253
+ var sheetNormalized = sheetHeaders.map(normalizeColumn);
254
+ var canonicalNormalized = canonicalHeaders.map(normalizeColumn);
255
+ var requiredNormalized = requiredColumns.map(normalizeColumn);
256
+ var mappings = [];
257
+ var missingColumns = [];
258
+ var extraColumns = _to_consumable_array(sheetHeaders);
259
+ // Create mappings for canonical columns
260
+ canonicalHeaders.forEach(function(canonical, canonicalIndex) {
261
+ var canonicalNorm = canonicalNormalized[canonicalIndex];
262
+ if (!canonicalNorm) return; // Skip if normalization resulted in empty string
263
+ var sheetIndex = sheetNormalized.indexOf(canonicalNorm);
264
+ // Special handling for 'id' -> 'messageid' mapping
265
+ if (sheetIndex === -1 && canonicalNorm === 'id') {
266
+ sheetIndex = sheetNormalized.indexOf('messageid');
267
+ }
268
+ if (sheetIndex !== -1) {
269
+ var sheetHeader = sheetHeaders[sheetIndex];
270
+ if (sheetHeader !== undefined) {
271
+ mappings.push({
272
+ canonical: canonical,
273
+ sheet: sheetHeader,
274
+ index: sheetIndex
275
+ });
276
+ // Remove from extra columns
277
+ var extraIndex = extraColumns.indexOf(sheetHeader);
278
+ if (extraIndex !== -1) {
279
+ extraColumns.splice(extraIndex, 1);
280
+ }
281
+ }
282
+ } else if (requiredNormalized.includes(canonicalNorm)) {
283
+ missingColumns.push(canonical);
284
+ }
285
+ });
286
+ return {
287
+ valid: missingColumns.length === 0,
288
+ missingColumns: missingColumns,
289
+ extraColumns: extraColumns,
290
+ mappings: mappings
291
+ };
292
+ }
293
+ function generateRowKey(row, header, strategy) {
294
+ var keyColumns = strategy.keyColumns, useProviderIdLogic = strategy.useProviderIdLogic, _strategy_separator = strategy.separator, separator = _strategy_separator === void 0 ? '\\' : _strategy_separator;
295
+ // Normalize header for consistent lookups
296
+ var lowerHeader = header.map(function(h) {
297
+ return String(h !== null && h !== void 0 ? h : '').toLowerCase();
298
+ });
299
+ if (useProviderIdLogic) {
300
+ var providerIndex = lowerHeader.indexOf('provider');
301
+ var idIndex = lowerHeader.indexOf('messageid');
302
+ if (idIndex === -1) idIndex = lowerHeader.indexOf('id');
303
+ if (providerIndex >= 0 && idIndex >= 0) {
304
+ var _row_providerIndex, _row_idIndex;
305
+ var providerVal = String((_row_providerIndex = row[providerIndex]) !== null && _row_providerIndex !== void 0 ? _row_providerIndex : '').trim();
306
+ var idVal = String((_row_idIndex = row[idIndex]) !== null && _row_idIndex !== void 0 ? _row_idIndex : '').trim();
307
+ if (providerVal || idVal) {
308
+ // Only return key if at least one component exists
309
+ return [
310
+ providerVal,
311
+ idVal
312
+ ].join(separator);
313
+ }
314
+ }
315
+ }
316
+ // Standard key generation using specified columns
317
+ var keyIndices = keyColumns.map(function(name) {
318
+ var normalizedName = String(name !== null && name !== void 0 ? name : '').toLowerCase();
319
+ var index = lowerHeader.indexOf(normalizedName);
320
+ // Consistent fallback: id -> messageid
321
+ if (index === -1 && normalizedName === 'id') {
322
+ index = lowerHeader.indexOf('messageid');
323
+ }
324
+ return index;
325
+ }).filter(function(index) {
326
+ return index >= 0;
327
+ });
328
+ if (keyIndices.length === 0) {
329
+ return ''; // Return empty string for invalid key configurations
330
+ }
331
+ var components = keyIndices.map(function(index) {
332
+ var _row_index;
333
+ return String((_row_index = row[index]) !== null && _row_index !== void 0 ? _row_index : '').trim();
334
+ });
335
+ // Only return key if all components are non-empty
336
+ if (components.every(function(comp) {
337
+ return comp.length > 0;
338
+ })) {
339
+ return components.join(separator);
340
+ }
341
+ return '';
342
+ }
343
+ function validateRowKeys(rows, header, strategy) {
344
+ var keyMap = new Map();
345
+ var duplicateKeys = [];
346
+ rows.forEach(function(row, index) {
347
+ var _keyMap_get;
348
+ var key = generateRowKey(row, header, strategy);
349
+ if (key.replace(/\\+/g, '') === '') return; // Skip empty keys
350
+ if (!keyMap.has(key)) {
351
+ keyMap.set(key, []);
352
+ }
353
+ (_keyMap_get = keyMap.get(key)) === null || _keyMap_get === void 0 ? void 0 : _keyMap_get.push(index);
354
+ });
355
+ // Find duplicates
356
+ keyMap.forEach(function(indices, key) {
357
+ if (indices.length > 1) {
358
+ duplicateKeys.push(key);
359
+ }
360
+ });
361
+ return {
362
+ valid: duplicateKeys.length === 0,
363
+ duplicateKeys: duplicateKeys,
364
+ keyMap: keyMap
365
+ };
366
+ }
367
+ function appendRows(_0, _1) {
368
+ return _async_to_generator(function(sheets, param) {
369
+ var spreadsheetId, sheetTitle, sheetRef, _param_rows, rows, _param_keySet, keySet, _param_keyColumns, keyColumns, _param_header, header, logger, resolvedSheetTitle, sheet, _sheet_properties, respHeader, vr, resolveKeyIndices, keyColsIdx, batchSize, totalUpdated, i, _app_updates, batch, resp, app, updatedRows, toKey, rowsToInsert, insertedKeys, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, r, key, rowsSkipped, INTERNAL_BATCH_SIZE, totalUpdated1, i1, batch1, _app2_updates, resp1, app2, updatedRows1, error, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, singleRow, _singleApp_updates, singleResp, singleApp, singleUpdatedRows, singleError, // Skip problematic individual rows but continue processing
370
+ _logger_warn, err, // Single row batch failed, skip it
371
+ _logger_warn1, rowsSkipped1;
372
+ return _ts_generator(this, function(_state) {
373
+ switch(_state.label){
374
+ case 0:
375
+ spreadsheetId = param.spreadsheetId, sheetTitle = param.sheetTitle, sheetRef = param.sheetRef, _param_rows = param.rows, rows = _param_rows === void 0 ? [] : _param_rows, _param_keySet = param.keySet, keySet = _param_keySet === void 0 ? null : _param_keySet, _param_keyColumns = param.keyColumns, keyColumns = _param_keyColumns === void 0 ? [
376
+ 'id'
377
+ ] : _param_keyColumns, _param_header = param.header, header = _param_header === void 0 ? [] : _param_header, logger = param.logger;
378
+ if (!sheets) throw new Error('appendRows: sheets is required');
379
+ if (!spreadsheetId) throw new Error('appendRows: spreadsheetId is required');
380
+ if (!sheetTitle && !sheetRef) throw new Error('appendRows: either sheetTitle or sheetRef is required');
381
+ // Resolve the actual sheet title from sheetRef if provided
382
+ resolvedSheetTitle = sheetTitle;
383
+ if (!sheetRef) return [
384
+ 3,
385
+ 2
386
+ ];
387
+ return [
388
+ 4,
389
+ (0, _sheetoperations.findSheetByRef)(sheets, spreadsheetId, sheetRef, logger)
390
+ ];
391
+ case 1:
392
+ sheet = _state.sent();
393
+ if (sheet) {
394
+ ;
395
+ resolvedSheetTitle = ((_sheet_properties = sheet.properties) === null || _sheet_properties === void 0 ? void 0 : _sheet_properties.title) || sheetRef;
396
+ } else {
397
+ // Sheet doesn't exist, use the sheetRef as the title
398
+ resolvedSheetTitle = sheetRef;
399
+ }
400
+ _state.label = 2;
401
+ case 2:
402
+ if (!resolvedSheetTitle) throw new Error('appendRows: could not resolve sheet title');
403
+ if (!Array.isArray(rows) || rows.length === 0) return [
404
+ 2,
405
+ {
406
+ updatedRows: 0,
407
+ inserted: []
408
+ }
409
+ ];
410
+ if (!(!Array.isArray(header) || header.length === 0)) return [
411
+ 3,
412
+ 4
413
+ ];
414
+ return [
415
+ 4,
416
+ sheets.spreadsheets.values.get({
417
+ spreadsheetId: spreadsheetId,
418
+ range: "".concat(resolvedSheetTitle, "!1:1"),
419
+ majorDimension: 'ROWS'
420
+ })
421
+ ];
422
+ case 3:
423
+ respHeader = _state.sent();
424
+ vr = respHeader.data;
425
+ header = ((vr === null || vr === void 0 ? void 0 : vr.values) || [])[0] || [];
426
+ _state.label = 4;
427
+ case 4:
428
+ resolveKeyIndices = function(kc, hdr) {
429
+ if (!Array.isArray(kc) || kc.length === 0) return [];
430
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
431
+ try {
432
+ for(var _iterator = kc[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
433
+ var c = _step.value;
434
+ if (typeof c !== 'string' || c.length === 0) throw new Error('appendRows: keyColumns must be an array of non-empty strings');
435
+ }
436
+ } catch (err) {
437
+ _didIteratorError = true;
438
+ _iteratorError = err;
439
+ } finally{
440
+ try {
441
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
442
+ _iterator.return();
443
+ }
444
+ } finally{
445
+ if (_didIteratorError) {
446
+ throw _iteratorError;
447
+ }
448
+ }
449
+ }
450
+ if (!Array.isArray(hdr) || hdr.length === 0) {
451
+ throw new Error('appendRows: header array is required when keyColumns are header names');
452
+ }
453
+ return kc.map(function(name) {
454
+ var idx = hdr.indexOf(name);
455
+ if (idx === -1) throw new Error('appendRows: header name "'.concat(name, '" not found in header'));
456
+ return idx;
457
+ });
458
+ };
459
+ keyColsIdx = resolveKeyIndices(keyColumns, header);
460
+ // Internal batch size to avoid Google Sheets limits
461
+ batchSize = 50;
462
+ if (!(!keyColsIdx || keyColsIdx.length === 0)) return [
463
+ 3,
464
+ 9
465
+ ];
466
+ totalUpdated = 0;
467
+ i = 0;
468
+ _state.label = 5;
469
+ case 5:
470
+ if (!(i < rows.length)) return [
471
+ 3,
472
+ 8
473
+ ];
474
+ batch = rows.slice(i, i + batchSize);
475
+ return [
476
+ 4,
477
+ sheets.spreadsheets.values.append({
478
+ spreadsheetId: spreadsheetId,
479
+ range: "".concat(resolvedSheetTitle, "!A1"),
480
+ valueInputOption: 'RAW',
481
+ insertDataOption: 'INSERT_ROWS',
482
+ requestBody: {
483
+ values: batch
484
+ }
485
+ })
486
+ ];
487
+ case 6:
488
+ resp = _state.sent();
489
+ app = resp.data;
490
+ updatedRows = Number((app === null || app === void 0 ? void 0 : (_app_updates = app.updates) === null || _app_updates === void 0 ? void 0 : _app_updates.updatedRows) || batch.length);
491
+ totalUpdated += updatedRows;
492
+ _state.label = 7;
493
+ case 7:
494
+ i += batchSize;
495
+ return [
496
+ 3,
497
+ 5
498
+ ];
499
+ case 8:
500
+ return [
501
+ 2,
502
+ {
503
+ updatedRows: totalUpdated,
504
+ inserted: [],
505
+ rowsSkipped: 0
506
+ }
507
+ ];
508
+ case 9:
509
+ toKey = function(r) {
510
+ var row = r;
511
+ // Use consistent key generation strategy
512
+ var strategy = {
513
+ keyColumns: keyColumns,
514
+ useProviderIdLogic: true,
515
+ separator: '\\'
516
+ };
517
+ return generateRowKey(row, header, strategy);
518
+ };
519
+ rowsToInsert = [];
520
+ insertedKeys = [];
521
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
522
+ try {
523
+ for(_iterator = rows[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
524
+ r = _step.value;
525
+ key = toKey(r);
526
+ if (keySet && keySet.has(key)) continue;
527
+ rowsToInsert.push(r);
528
+ insertedKeys.push(key);
529
+ }
530
+ } catch (err) {
531
+ _didIteratorError = true;
532
+ _iteratorError = err;
533
+ } finally{
534
+ try {
535
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
536
+ _iterator.return();
537
+ }
538
+ } finally{
539
+ if (_didIteratorError) {
540
+ throw _iteratorError;
541
+ }
542
+ }
543
+ }
544
+ if (rowsToInsert.length === 0) {
545
+ rowsSkipped = rows.length - rowsToInsert.length; // Should be rows.length when all are skipped
546
+ return [
547
+ 2,
548
+ {
549
+ updatedRows: 0,
550
+ inserted: [],
551
+ rowsSkipped: rowsSkipped
552
+ }
553
+ ];
554
+ }
555
+ // Use smaller internal batch size to avoid Google Sheets character limit errors
556
+ // Especially important when dealing with emails that may have long bodies
557
+ INTERNAL_BATCH_SIZE = 50;
558
+ totalUpdated1 = 0;
559
+ i1 = 0;
560
+ _state.label = 10;
561
+ case 10:
562
+ if (!(i1 < rowsToInsert.length)) return [
563
+ 3,
564
+ 27
565
+ ];
566
+ batch1 = rowsToInsert.slice(i1, i1 + INTERNAL_BATCH_SIZE);
567
+ _state.label = 11;
568
+ case 11:
569
+ _state.trys.push([
570
+ 11,
571
+ 13,
572
+ ,
573
+ 26
574
+ ]);
575
+ return [
576
+ 4,
577
+ sheets.spreadsheets.values.append({
578
+ spreadsheetId: spreadsheetId,
579
+ range: "".concat(resolvedSheetTitle, "!A1"),
580
+ valueInputOption: 'RAW',
581
+ insertDataOption: 'INSERT_ROWS',
582
+ requestBody: {
583
+ values: batch1
584
+ }
585
+ })
586
+ ];
587
+ case 12:
588
+ resp1 = _state.sent();
589
+ app2 = resp1.data;
590
+ updatedRows1 = Number((app2 === null || app2 === void 0 ? void 0 : (_app2_updates = app2.updates) === null || _app2_updates === void 0 ? void 0 : _app2_updates.updatedRows) || batch1.length);
591
+ totalUpdated1 += updatedRows1;
592
+ return [
593
+ 3,
594
+ 26
595
+ ];
596
+ case 13:
597
+ error = _state.sent();
598
+ if (!(batch1.length > 1)) return [
599
+ 3,
600
+ 24
601
+ ];
602
+ _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
603
+ _state.label = 14;
604
+ case 14:
605
+ _state.trys.push([
606
+ 14,
607
+ 21,
608
+ 22,
609
+ 23
610
+ ]);
611
+ _iterator1 = batch1[Symbol.iterator]();
612
+ _state.label = 15;
613
+ case 15:
614
+ if (!!(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done)) return [
615
+ 3,
616
+ 20
617
+ ];
618
+ singleRow = _step1.value;
619
+ _state.label = 16;
620
+ case 16:
621
+ _state.trys.push([
622
+ 16,
623
+ 18,
624
+ ,
625
+ 19
626
+ ]);
627
+ return [
628
+ 4,
629
+ sheets.spreadsheets.values.append({
630
+ spreadsheetId: spreadsheetId,
631
+ range: "".concat(resolvedSheetTitle, "!A1"),
632
+ valueInputOption: 'RAW',
633
+ insertDataOption: 'INSERT_ROWS',
634
+ requestBody: {
635
+ values: [
636
+ singleRow
637
+ ]
638
+ }
639
+ })
640
+ ];
641
+ case 17:
642
+ singleResp = _state.sent();
643
+ singleApp = singleResp.data;
644
+ singleUpdatedRows = Number((singleApp === null || singleApp === void 0 ? void 0 : (_singleApp_updates = singleApp.updates) === null || _singleApp_updates === void 0 ? void 0 : _singleApp_updates.updatedRows) || 1);
645
+ totalUpdated1 += singleUpdatedRows;
646
+ return [
647
+ 3,
648
+ 19
649
+ ];
650
+ case 18:
651
+ singleError = _state.sent();
652
+ (_logger_warn = logger.warn) === null || _logger_warn === void 0 ? void 0 : _logger_warn.call(logger, "Failed to insert single row: ".concat(_instanceof(singleError, Error) ? singleError.message : String(singleError)));
653
+ return [
654
+ 3,
655
+ 19
656
+ ];
657
+ case 19:
658
+ _iteratorNormalCompletion1 = true;
659
+ return [
660
+ 3,
661
+ 15
662
+ ];
663
+ case 20:
664
+ return [
665
+ 3,
666
+ 23
667
+ ];
668
+ case 21:
669
+ err = _state.sent();
670
+ _didIteratorError1 = true;
671
+ _iteratorError1 = err;
672
+ return [
673
+ 3,
674
+ 23
675
+ ];
676
+ case 22:
677
+ try {
678
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
679
+ _iterator1.return();
680
+ }
681
+ } finally{
682
+ if (_didIteratorError1) {
683
+ throw _iteratorError1;
684
+ }
685
+ }
686
+ return [
687
+ 7
688
+ ];
689
+ case 23:
690
+ return [
691
+ 3,
692
+ 25
693
+ ];
694
+ case 24:
695
+ (_logger_warn1 = logger.warn) === null || _logger_warn1 === void 0 ? void 0 : _logger_warn1.call(logger, "Failed to insert batch: ".concat(_instanceof(error, Error) ? error.message : String(error)));
696
+ _state.label = 25;
697
+ case 25:
698
+ return [
699
+ 3,
700
+ 26
701
+ ];
702
+ case 26:
703
+ i1 += INTERNAL_BATCH_SIZE;
704
+ return [
705
+ 3,
706
+ 10
707
+ ];
708
+ case 27:
709
+ rowsSkipped1 = rows.length - rowsToInsert.length;
710
+ return [
711
+ 2,
712
+ {
713
+ updatedRows: totalUpdated1,
714
+ inserted: insertedKeys,
715
+ rowsSkipped: rowsSkipped1
716
+ }
717
+ ];
718
+ }
719
+ });
720
+ }).apply(this, arguments);
721
+ }
722
+ function mapRowsToHeader(param) {
723
+ var _param_rows = param.rows, rows = _param_rows === void 0 ? [] : _param_rows, _param_header = param.header, header = _param_header === void 0 ? [] : _param_header, _param_canonical = param.canonical, canonical = _param_canonical === void 0 ? [] : _param_canonical;
724
+ if (!Array.isArray(rows) || rows.length === 0) return [];
725
+ if (!Array.isArray(header) || header.length === 0) return rows;
726
+ if (!Array.isArray(canonical) || canonical.length === 0) return rows;
727
+ var validation = validateAndMapHeaders(header, canonical);
728
+ var mappingLookup = new Map(validation.mappings.map(function(m) {
729
+ return [
730
+ m.canonical,
731
+ m.index
732
+ ];
733
+ }));
734
+ return rows.map(function(row) {
735
+ // Fill with null to skip unmapped columns (preserve existing values)
736
+ // Use '' (empty string) only when explicitly wanting to clear a cell
737
+ var mappedRow = new Array(header.length).fill(null);
738
+ canonical.forEach(function(canonicalCol, canonicalIndex) {
739
+ var sheetIndex = mappingLookup.get(canonicalCol);
740
+ if (sheetIndex !== undefined && canonicalIndex < row.length) {
741
+ // Preserve null values - they signal "skip this cell"
742
+ mappedRow[sheetIndex] = row[canonicalIndex];
743
+ }
744
+ });
745
+ return mappedRow;
746
+ });
747
+ }
748
+ function snapshotHeaderAndKeys(_0, _1, _2, _3) {
749
+ return _async_to_generator(function(sheets, spreadsheetId, sheetTitle) {
750
+ var keyColumns, keyStrategy, _Math, _Math1, _ref, _ref1, header, keySet, strategy, keyIndices, chunkSize, startRow, minIndex, maxIndex, startCol, endCol, endRow, range, _response_data, response, rows, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _loop, _iterator, _step, unused;
751
+ var _arguments = arguments;
752
+ return _ts_generator(this, function(_state) {
753
+ switch(_state.label){
754
+ case 0:
755
+ keyColumns = _arguments.length > 3 && _arguments[3] !== void 0 ? _arguments[3] : [
756
+ 'id'
757
+ ], keyStrategy = _arguments.length > 4 ? _arguments[4] : void 0;
758
+ return [
759
+ 4,
760
+ discoverHeader(sheets, spreadsheetId, sheetTitle)
761
+ ];
762
+ case 1:
763
+ header = _state.sent();
764
+ keySet = new Set();
765
+ if (header.length === 0) {
766
+ return [
767
+ 2,
768
+ {
769
+ header: header,
770
+ keySet: keySet,
771
+ keyIndices: []
772
+ }
773
+ ];
774
+ }
775
+ strategy = {
776
+ keyColumns: keyColumns,
777
+ useProviderIdLogic: (_ref = keyStrategy === null || keyStrategy === void 0 ? void 0 : keyStrategy.useProviderIdLogic) !== null && _ref !== void 0 ? _ref : true,
778
+ separator: (_ref1 = keyStrategy === null || keyStrategy === void 0 ? void 0 : keyStrategy.separator) !== null && _ref1 !== void 0 ? _ref1 : '\\'
779
+ };
780
+ // Find key column indices
781
+ keyIndices = keyColumns.map(function(name) {
782
+ var normalizedName = String(name !== null && name !== void 0 ? name : '').toLowerCase();
783
+ var lowerHeader = header.map(function(h) {
784
+ return String(h !== null && h !== void 0 ? h : '').toLowerCase();
785
+ });
786
+ var index = lowerHeader.indexOf(normalizedName);
787
+ if (index === -1 && normalizedName === 'id') {
788
+ index = lowerHeader.indexOf('messageid');
789
+ }
790
+ return index;
791
+ }).filter(function(index) {
792
+ return index >= 0;
793
+ });
794
+ if (keyIndices.length === 0) {
795
+ return [
796
+ 2,
797
+ {
798
+ header: header,
799
+ keySet: keySet,
800
+ keyIndices: keyIndices
801
+ }
802
+ ];
803
+ }
804
+ // Read key columns data in chunks
805
+ chunkSize = 1000;
806
+ startRow = 2;
807
+ minIndex = (_Math = Math).min.apply(_Math, _to_consumable_array(keyIndices));
808
+ maxIndex = (_Math1 = Math).max.apply(_Math1, _to_consumable_array(keyIndices));
809
+ startCol = (0, _columnutilities.a1Col)(minIndex + 1);
810
+ endCol = (0, _columnutilities.a1Col)(maxIndex + 1);
811
+ _state.label = 2;
812
+ case 2:
813
+ if (!true) return [
814
+ 3,
815
+ 7
816
+ ];
817
+ endRow = startRow + chunkSize - 1;
818
+ range = "".concat(sheetTitle, "!").concat(startCol).concat(startRow, ":").concat(endCol).concat(endRow);
819
+ _state.label = 3;
820
+ case 3:
821
+ _state.trys.push([
822
+ 3,
823
+ 5,
824
+ ,
825
+ 6
826
+ ]);
827
+ return [
828
+ 4,
829
+ sheets.spreadsheets.values.get({
830
+ spreadsheetId: spreadsheetId,
831
+ range: range,
832
+ majorDimension: 'ROWS'
833
+ })
834
+ ];
835
+ case 4:
836
+ response = _state.sent();
837
+ rows = ((_response_data = response.data) === null || _response_data === void 0 ? void 0 : _response_data.values) || [];
838
+ if (rows.length === 0) return [
839
+ 3,
840
+ 7
841
+ ];
842
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
843
+ try {
844
+ _loop = function() {
845
+ var rawRow = _step.value;
846
+ // Reconstruct full row for key generation
847
+ var fullRow = new Array(header.length).fill('');
848
+ keyIndices.forEach(function(globalIndex, _localIndex) {
849
+ var localRowIndex = globalIndex - minIndex;
850
+ if (localRowIndex >= 0 && localRowIndex < rawRow.length) {
851
+ fullRow[globalIndex] = rawRow[localRowIndex];
852
+ }
853
+ });
854
+ var key = generateRowKey(fullRow, header, strategy);
855
+ if (key.replace(/\\+/g, '') !== '') {
856
+ keySet.add(key);
857
+ }
858
+ };
859
+ for(_iterator = rows[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
860
+ } catch (err) {
861
+ _didIteratorError = true;
862
+ _iteratorError = err;
863
+ } finally{
864
+ try {
865
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
866
+ _iterator.return();
867
+ }
868
+ } finally{
869
+ if (_didIteratorError) {
870
+ throw _iteratorError;
871
+ }
872
+ }
873
+ }
874
+ startRow += rows.length;
875
+ if (rows.length < chunkSize) return [
876
+ 3,
877
+ 7
878
+ ]; // Last chunk
879
+ return [
880
+ 3,
881
+ 6
882
+ ];
883
+ case 5:
884
+ unused = _state.sent();
885
+ return [
886
+ 3,
887
+ 7
888
+ ]; // End of data or error
889
+ case 6:
890
+ return [
891
+ 3,
892
+ 2
893
+ ];
894
+ case 7:
895
+ return [
896
+ 2,
897
+ {
898
+ header: header,
899
+ keySet: keySet,
900
+ keyIndices: keyIndices
901
+ }
902
+ ];
903
+ }
904
+ });
905
+ }).apply(this, arguments);
906
+ }
907
+ function snapshotHeaderKeysAndPositions(_0, _1, _2, _3) {
908
+ return _async_to_generator(function(sheets, spreadsheetId, sheetTitle) {
909
+ var keyColumns, keyStrategy, _Math, _Math1, _ref, _ref1, header, keySet, keyToRowMap, strategy, keyIndices, chunkSize, startRow, minIndex, maxIndex, startCol, endCol, endRow, range, _loop, _response_data, response, rows, localRowIndex, unused;
910
+ var _arguments = arguments;
911
+ return _ts_generator(this, function(_state) {
912
+ switch(_state.label){
913
+ case 0:
914
+ keyColumns = _arguments.length > 3 && _arguments[3] !== void 0 ? _arguments[3] : [
915
+ 'id'
916
+ ], keyStrategy = _arguments.length > 4 ? _arguments[4] : void 0;
917
+ return [
918
+ 4,
919
+ discoverHeader(sheets, spreadsheetId, sheetTitle)
920
+ ];
921
+ case 1:
922
+ header = _state.sent();
923
+ keySet = new Set();
924
+ keyToRowMap = new Map();
925
+ if (header.length === 0) {
926
+ return [
927
+ 2,
928
+ {
929
+ header: header,
930
+ keySet: keySet,
931
+ keyToRowMap: keyToRowMap,
932
+ keyIndices: []
933
+ }
934
+ ];
935
+ }
936
+ strategy = {
937
+ keyColumns: keyColumns,
938
+ useProviderIdLogic: (_ref = keyStrategy === null || keyStrategy === void 0 ? void 0 : keyStrategy.useProviderIdLogic) !== null && _ref !== void 0 ? _ref : true,
939
+ separator: (_ref1 = keyStrategy === null || keyStrategy === void 0 ? void 0 : keyStrategy.separator) !== null && _ref1 !== void 0 ? _ref1 : '\\'
940
+ };
941
+ // Find key column indices
942
+ keyIndices = keyColumns.map(function(name) {
943
+ var normalizedName = String(name !== null && name !== void 0 ? name : '').toLowerCase();
944
+ var lowerHeader = header.map(function(h) {
945
+ return String(h !== null && h !== void 0 ? h : '').toLowerCase();
946
+ });
947
+ var index = lowerHeader.indexOf(normalizedName);
948
+ if (index === -1 && normalizedName === 'id') {
949
+ index = lowerHeader.indexOf('messageid');
950
+ }
951
+ return index;
952
+ }).filter(function(index) {
953
+ return index >= 0;
954
+ });
955
+ if (keyIndices.length === 0) {
956
+ return [
957
+ 2,
958
+ {
959
+ header: header,
960
+ keySet: keySet,
961
+ keyToRowMap: keyToRowMap,
962
+ keyIndices: keyIndices
963
+ }
964
+ ];
965
+ }
966
+ // Read key columns data in chunks and track row positions
967
+ chunkSize = 1000;
968
+ startRow = 2; // Start from row 2 (after header)
969
+ minIndex = (_Math = Math).min.apply(_Math, _to_consumable_array(keyIndices));
970
+ maxIndex = (_Math1 = Math).max.apply(_Math1, _to_consumable_array(keyIndices));
971
+ startCol = (0, _columnutilities.a1Col)(minIndex + 1);
972
+ endCol = (0, _columnutilities.a1Col)(maxIndex + 1);
973
+ _state.label = 2;
974
+ case 2:
975
+ if (!true) return [
976
+ 3,
977
+ 7
978
+ ];
979
+ endRow = startRow + chunkSize - 1;
980
+ range = "".concat(sheetTitle, "!").concat(startCol).concat(startRow, ":").concat(endCol).concat(endRow);
981
+ _state.label = 3;
982
+ case 3:
983
+ _state.trys.push([
984
+ 3,
985
+ 5,
986
+ ,
987
+ 6
988
+ ]);
989
+ _loop = function(localRowIndex) {
990
+ var rawRow = rows[localRowIndex];
991
+ var globalRowNumber = startRow + localRowIndex;
992
+ // Reconstruct full row for key generation
993
+ var fullRow = new Array(header.length).fill('');
994
+ if (rawRow) {
995
+ keyIndices.forEach(function(globalIndex, _localIndex) {
996
+ var localRowArrayIndex = globalIndex - minIndex;
997
+ if (localRowArrayIndex >= 0 && localRowArrayIndex < rawRow.length) {
998
+ fullRow[globalIndex] = rawRow[localRowArrayIndex];
999
+ }
1000
+ });
1001
+ }
1002
+ var key = generateRowKey(fullRow, header, strategy);
1003
+ if (key.replace(/\\+/g, '') !== '') {
1004
+ keySet.add(key);
1005
+ keyToRowMap.set(key, globalRowNumber); // Store 1-indexed row number
1006
+ }
1007
+ };
1008
+ return [
1009
+ 4,
1010
+ sheets.spreadsheets.values.get({
1011
+ spreadsheetId: spreadsheetId,
1012
+ range: range,
1013
+ majorDimension: 'ROWS'
1014
+ })
1015
+ ];
1016
+ case 4:
1017
+ response = _state.sent();
1018
+ rows = ((_response_data = response.data) === null || _response_data === void 0 ? void 0 : _response_data.values) || [];
1019
+ if (rows.length === 0) return [
1020
+ 3,
1021
+ 7
1022
+ ];
1023
+ for(localRowIndex = 0; localRowIndex < rows.length; localRowIndex++)_loop(localRowIndex);
1024
+ startRow += rows.length;
1025
+ if (rows.length < chunkSize) return [
1026
+ 3,
1027
+ 7
1028
+ ]; // Last chunk
1029
+ return [
1030
+ 3,
1031
+ 6
1032
+ ];
1033
+ case 5:
1034
+ unused = _state.sent();
1035
+ return [
1036
+ 3,
1037
+ 7
1038
+ ]; // End of data or error
1039
+ case 6:
1040
+ return [
1041
+ 3,
1042
+ 2
1043
+ ];
1044
+ case 7:
1045
+ return [
1046
+ 2,
1047
+ {
1048
+ header: header,
1049
+ keySet: keySet,
1050
+ keyToRowMap: keyToRowMap,
1051
+ keyIndices: keyIndices
1052
+ }
1053
+ ];
1054
+ }
1055
+ });
1056
+ }).apply(this, arguments);
1057
+ }
1058
+ function partitionDataForUpsert(rows, header, keyStrategy, existingKeys) {
1059
+ var allowUpdates = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : false, keyToRowMap = arguments.length > 5 ? arguments[5] : void 0;
1060
+ var toAppend = [];
1061
+ var toUpdate = [];
1062
+ var skippedKeys = [];
1063
+ rows.forEach(function(row) {
1064
+ var key = generateRowKey(row, header, keyStrategy);
1065
+ if (key.replace(/\\+/g, '') === '') {
1066
+ // Skip rows with empty keys
1067
+ return;
1068
+ }
1069
+ if (existingKeys.has(key)) {
1070
+ if (allowUpdates && keyToRowMap) {
1071
+ var existingRowIndex = keyToRowMap.get(key);
1072
+ if (existingRowIndex !== undefined) {
1073
+ toUpdate.push({
1074
+ row: row,
1075
+ existingRowIndex: existingRowIndex
1076
+ });
1077
+ } else {
1078
+ skippedKeys.push(key);
1079
+ }
1080
+ } else {
1081
+ skippedKeys.push(key);
1082
+ }
1083
+ } else {
1084
+ toAppend.push(row);
1085
+ }
1086
+ });
1087
+ return {
1088
+ toAppend: toAppend,
1089
+ toUpdate: toUpdate,
1090
+ skippedKeys: skippedKeys
1091
+ };
1092
+ }
1093
+ function performBatchUpdates(sheets, spreadsheetId, sheetTitle, updates, header, batchSize, valueInputOption) {
1094
+ return _async_to_generator(function() {
1095
+ var errors, totalUpdated, i, batch, requests, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _step_value, row, existingRowIndex, error, errorMsg, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, _step_value1, row1, existingRowIndex1, range, singleError, err, result;
1096
+ return _ts_generator(this, function(_state) {
1097
+ switch(_state.label){
1098
+ case 0:
1099
+ errors = [];
1100
+ totalUpdated = 0;
1101
+ i = 0;
1102
+ _state.label = 1;
1103
+ case 1:
1104
+ if (!(i < updates.length)) return [
1105
+ 3,
1106
+ 17
1107
+ ];
1108
+ batch = updates.slice(i, i + batchSize);
1109
+ _state.label = 2;
1110
+ case 2:
1111
+ _state.trys.push([
1112
+ 2,
1113
+ 5,
1114
+ ,
1115
+ 16
1116
+ ]);
1117
+ requests = [];
1118
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1119
+ try {
1120
+ for(_iterator = batch[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1121
+ _step_value = _step.value, row = _step_value.row, existingRowIndex = _step_value.existingRowIndex;
1122
+ requests.push({
1123
+ updateCells: {
1124
+ range: {
1125
+ sheetId: 0,
1126
+ startRowIndex: existingRowIndex - 1,
1127
+ endRowIndex: existingRowIndex,
1128
+ startColumnIndex: 0,
1129
+ endColumnIndex: header.length
1130
+ },
1131
+ rows: [
1132
+ {
1133
+ values: row.map(function(cellValue) {
1134
+ return {
1135
+ userEnteredValue: {
1136
+ stringValue: String(cellValue !== null && cellValue !== void 0 ? cellValue : '')
1137
+ }
1138
+ };
1139
+ })
1140
+ }
1141
+ ],
1142
+ fields: 'userEnteredValue'
1143
+ }
1144
+ });
1145
+ }
1146
+ } catch (err) {
1147
+ _didIteratorError = true;
1148
+ _iteratorError = err;
1149
+ } finally{
1150
+ try {
1151
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
1152
+ _iterator.return();
1153
+ }
1154
+ } finally{
1155
+ if (_didIteratorError) {
1156
+ throw _iteratorError;
1157
+ }
1158
+ }
1159
+ }
1160
+ if (!(requests.length > 0)) return [
1161
+ 3,
1162
+ 4
1163
+ ];
1164
+ return [
1165
+ 4,
1166
+ sheets.spreadsheets.batchUpdate({
1167
+ spreadsheetId: spreadsheetId,
1168
+ requestBody: {
1169
+ requests: requests
1170
+ }
1171
+ })
1172
+ ];
1173
+ case 3:
1174
+ _state.sent();
1175
+ totalUpdated += batch.length;
1176
+ _state.label = 4;
1177
+ case 4:
1178
+ return [
1179
+ 3,
1180
+ 16
1181
+ ];
1182
+ case 5:
1183
+ error = _state.sent();
1184
+ errorMsg = "Batch update ".concat(Math.floor(i / batchSize) + 1, " failed: ").concat(_instanceof(error, Error) ? error.message : String(error));
1185
+ errors.push(errorMsg);
1186
+ _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
1187
+ _state.label = 6;
1188
+ case 6:
1189
+ _state.trys.push([
1190
+ 6,
1191
+ 13,
1192
+ 14,
1193
+ 15
1194
+ ]);
1195
+ _iterator1 = batch[Symbol.iterator]();
1196
+ _state.label = 7;
1197
+ case 7:
1198
+ if (!!(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done)) return [
1199
+ 3,
1200
+ 12
1201
+ ];
1202
+ _step_value1 = _step1.value, row1 = _step_value1.row, existingRowIndex1 = _step_value1.existingRowIndex;
1203
+ _state.label = 8;
1204
+ case 8:
1205
+ _state.trys.push([
1206
+ 8,
1207
+ 10,
1208
+ ,
1209
+ 11
1210
+ ]);
1211
+ range = "".concat(sheetTitle, "!A").concat(existingRowIndex1, ":").concat((0, _columnutilities.a1Col)(header.length)).concat(existingRowIndex1);
1212
+ return [
1213
+ 4,
1214
+ sheets.spreadsheets.values.update({
1215
+ spreadsheetId: spreadsheetId,
1216
+ range: range,
1217
+ valueInputOption: valueInputOption,
1218
+ requestBody: {
1219
+ values: [
1220
+ row1
1221
+ ]
1222
+ }
1223
+ })
1224
+ ];
1225
+ case 9:
1226
+ _state.sent();
1227
+ totalUpdated += 1;
1228
+ return [
1229
+ 3,
1230
+ 11
1231
+ ];
1232
+ case 10:
1233
+ singleError = _state.sent();
1234
+ errors.push("Failed to update row ".concat(existingRowIndex1, ": ").concat(_instanceof(singleError, Error) ? singleError.message : String(singleError)));
1235
+ return [
1236
+ 3,
1237
+ 11
1238
+ ];
1239
+ case 11:
1240
+ _iteratorNormalCompletion1 = true;
1241
+ return [
1242
+ 3,
1243
+ 7
1244
+ ];
1245
+ case 12:
1246
+ return [
1247
+ 3,
1248
+ 15
1249
+ ];
1250
+ case 13:
1251
+ err = _state.sent();
1252
+ _didIteratorError1 = true;
1253
+ _iteratorError1 = err;
1254
+ return [
1255
+ 3,
1256
+ 15
1257
+ ];
1258
+ case 14:
1259
+ try {
1260
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
1261
+ _iterator1.return();
1262
+ }
1263
+ } finally{
1264
+ if (_didIteratorError1) {
1265
+ throw _iteratorError1;
1266
+ }
1267
+ }
1268
+ return [
1269
+ 7
1270
+ ];
1271
+ case 15:
1272
+ return [
1273
+ 3,
1274
+ 16
1275
+ ];
1276
+ case 16:
1277
+ i += batchSize;
1278
+ return [
1279
+ 3,
1280
+ 1
1281
+ ];
1282
+ case 17:
1283
+ result = {
1284
+ updatedRows: totalUpdated
1285
+ };
1286
+ if (errors.length > 0) {
1287
+ result.errors = errors;
1288
+ }
1289
+ return [
1290
+ 2,
1291
+ result
1292
+ ];
1293
+ }
1294
+ });
1295
+ })();
1296
+ }
1297
+ function upsertByKey(_0, _1) {
1298
+ return _async_to_generator(function(sheets, param) {
1299
+ var spreadsheetId, sheetTitle, sheetRef, rows, canonicalHeaders, options, logger, resolvedSheetTitle, _sheet_properties, sheet, inputValidation, currentHeader, effectiveHeader, headerValidation, _ref, existingKeys, keyToRowMap, processedRows, partition, batchSize, errors, totalUpdated, insertedKeys, i, batch, _response_data_updates, _response_data, response, updatedRows, error, errorMsg, updateResult, _errors, updateError, errorMsg1, result;
1300
+ return _ts_generator(this, function(_state) {
1301
+ switch(_state.label){
1302
+ case 0:
1303
+ spreadsheetId = param.spreadsheetId, sheetTitle = param.sheetTitle, sheetRef = param.sheetRef, rows = param.rows, canonicalHeaders = param.canonicalHeaders, options = param.options, logger = param.logger;
1304
+ // Validate inputs
1305
+ if (!sheets) throw new Error('upsertByKey: sheets client is required');
1306
+ if (!spreadsheetId) throw new Error('upsertByKey: spreadsheetId is required');
1307
+ if (!sheetTitle && !sheetRef) throw new Error('upsertByKey: either sheetTitle or sheetRef is required');
1308
+ if (!Array.isArray(rows) || rows.length === 0) {
1309
+ return [
1310
+ 2,
1311
+ {
1312
+ updatedRows: 0,
1313
+ inserted: [],
1314
+ rowsSkipped: 0
1315
+ }
1316
+ ];
1317
+ }
1318
+ // Step 1: Input validation (duplicate key checking)
1319
+ resolvedSheetTitle = sheetTitle;
1320
+ if (!sheetRef) return [
1321
+ 3,
1322
+ 2
1323
+ ];
1324
+ return [
1325
+ 4,
1326
+ (0, _sheetoperations.findSheetByRef)(sheets, spreadsheetId, sheetRef, logger)
1327
+ ];
1328
+ case 1:
1329
+ sheet = _state.sent();
1330
+ resolvedSheetTitle = (sheet === null || sheet === void 0 ? void 0 : (_sheet_properties = sheet.properties) === null || _sheet_properties === void 0 ? void 0 : _sheet_properties.title) || sheetRef;
1331
+ _state.label = 2;
1332
+ case 2:
1333
+ if (!resolvedSheetTitle) {
1334
+ throw new Error('upsertByKey: could not resolve sheet title');
1335
+ }
1336
+ // Validate for duplicate keys in input data
1337
+ inputValidation = validateRowKeys(rows, canonicalHeaders || [], options.keyStrategy);
1338
+ if (!inputValidation.valid) {
1339
+ throw new Error("upsertByKey: duplicate keys found in input data: ".concat(inputValidation.duplicateKeys.join(', ')));
1340
+ }
1341
+ return [
1342
+ 4,
1343
+ discoverHeader(sheets, spreadsheetId, resolvedSheetTitle)
1344
+ ];
1345
+ case 3:
1346
+ currentHeader = _state.sent();
1347
+ effectiveHeader = currentHeader;
1348
+ if (!(currentHeader.length === 0 && canonicalHeaders && canonicalHeaders.length > 0)) return [
1349
+ 3,
1350
+ 5
1351
+ ];
1352
+ effectiveHeader = canonicalHeaders;
1353
+ // Write headers to sheet
1354
+ return [
1355
+ 4,
1356
+ sheets.spreadsheets.values.append({
1357
+ spreadsheetId: spreadsheetId,
1358
+ range: "".concat(resolvedSheetTitle, "!A1"),
1359
+ valueInputOption: options.valueInputOption || 'USER_ENTERED',
1360
+ insertDataOption: 'INSERT_ROWS',
1361
+ requestBody: {
1362
+ values: [
1363
+ effectiveHeader
1364
+ ]
1365
+ }
1366
+ })
1367
+ ];
1368
+ case 4:
1369
+ _state.sent();
1370
+ _state.label = 5;
1371
+ case 5:
1372
+ // Validate headers if we have requirements
1373
+ if (canonicalHeaders && canonicalHeaders.length > 0) {
1374
+ headerValidation = validateAndMapHeaders(effectiveHeader, canonicalHeaders);
1375
+ if (!headerValidation.valid) {
1376
+ throw new Error("upsertByKey: missing required columns: ".concat(headerValidation.missingColumns.join(', ')));
1377
+ }
1378
+ }
1379
+ return [
1380
+ 4,
1381
+ snapshotHeaderKeysAndPositions(sheets, spreadsheetId, resolvedSheetTitle, options.keyStrategy.keyColumns, options.keyStrategy)
1382
+ ];
1383
+ case 6:
1384
+ _ref = _state.sent(), existingKeys = _ref.keySet, keyToRowMap = _ref.keyToRowMap;
1385
+ // Step 4: Partition changes (updates vs appends)
1386
+ processedRows = rows;
1387
+ // Map canonical data to sheet structure if needed
1388
+ if (canonicalHeaders && canonicalHeaders.length > 0 && effectiveHeader.length > 0) {
1389
+ processedRows = mapRowsToHeader({
1390
+ rows: rows,
1391
+ header: effectiveHeader,
1392
+ canonical: canonicalHeaders
1393
+ });
1394
+ }
1395
+ partition = partitionDataForUpsert(processedRows, effectiveHeader, options.keyStrategy, existingKeys, options.allowUpdates, keyToRowMap);
1396
+ // Step 5: Efficient batch writing
1397
+ batchSize = options.batchSize || 50;
1398
+ errors = [];
1399
+ totalUpdated = 0;
1400
+ insertedKeys = [];
1401
+ if (!(partition.toAppend.length > 0)) return [
1402
+ 3,
1403
+ 12
1404
+ ];
1405
+ i = 0;
1406
+ _state.label = 7;
1407
+ case 7:
1408
+ if (!(i < partition.toAppend.length)) return [
1409
+ 3,
1410
+ 12
1411
+ ];
1412
+ batch = partition.toAppend.slice(i, i + batchSize);
1413
+ _state.label = 8;
1414
+ case 8:
1415
+ _state.trys.push([
1416
+ 8,
1417
+ 10,
1418
+ ,
1419
+ 11
1420
+ ]);
1421
+ return [
1422
+ 4,
1423
+ sheets.spreadsheets.values.append({
1424
+ spreadsheetId: spreadsheetId,
1425
+ range: "".concat(resolvedSheetTitle, "!A1"),
1426
+ valueInputOption: options.valueInputOption || 'USER_ENTERED',
1427
+ insertDataOption: 'INSERT_ROWS',
1428
+ requestBody: {
1429
+ values: batch
1430
+ }
1431
+ })
1432
+ ];
1433
+ case 9:
1434
+ response = _state.sent();
1435
+ updatedRows = Number(((_response_data = response.data) === null || _response_data === void 0 ? void 0 : (_response_data_updates = _response_data.updates) === null || _response_data_updates === void 0 ? void 0 : _response_data_updates.updatedRows) || batch.length);
1436
+ totalUpdated += updatedRows;
1437
+ // Track inserted keys for successful batch
1438
+ batch.forEach(function(row) {
1439
+ var key = generateRowKey(row, effectiveHeader, options.keyStrategy);
1440
+ if (key.replace(/\\+/g, '') !== '') {
1441
+ insertedKeys.push(key);
1442
+ }
1443
+ });
1444
+ return [
1445
+ 3,
1446
+ 11
1447
+ ];
1448
+ case 10:
1449
+ error = _state.sent();
1450
+ errorMsg = "Batch ".concat(Math.floor(i / batchSize) + 1, " append failed: ").concat(_instanceof(error, Error) ? error.message : String(error));
1451
+ errors.push(errorMsg);
1452
+ return [
1453
+ 3,
1454
+ 11
1455
+ ];
1456
+ case 11:
1457
+ i += batchSize;
1458
+ return [
1459
+ 3,
1460
+ 7
1461
+ ];
1462
+ case 12:
1463
+ if (!(partition.toUpdate.length > 0 && options.allowUpdates)) return [
1464
+ 3,
1465
+ 16
1466
+ ];
1467
+ _state.label = 13;
1468
+ case 13:
1469
+ _state.trys.push([
1470
+ 13,
1471
+ 15,
1472
+ ,
1473
+ 16
1474
+ ]);
1475
+ return [
1476
+ 4,
1477
+ performBatchUpdates(sheets, spreadsheetId, resolvedSheetTitle, partition.toUpdate, effectiveHeader, batchSize, options.valueInputOption || 'USER_ENTERED')
1478
+ ];
1479
+ case 14:
1480
+ updateResult = _state.sent();
1481
+ totalUpdated += updateResult.updatedRows;
1482
+ if (updateResult.errors) {
1483
+ ;
1484
+ (_errors = errors).push.apply(_errors, _to_consumable_array(updateResult.errors));
1485
+ }
1486
+ return [
1487
+ 3,
1488
+ 16
1489
+ ];
1490
+ case 15:
1491
+ updateError = _state.sent();
1492
+ errorMsg1 = "Update operations failed: ".concat(_instanceof(updateError, Error) ? updateError.message : String(updateError));
1493
+ errors.push(errorMsg1);
1494
+ return [
1495
+ 3,
1496
+ 16
1497
+ ];
1498
+ case 16:
1499
+ result = {
1500
+ updatedRows: totalUpdated,
1501
+ inserted: insertedKeys,
1502
+ rowsSkipped: partition.skippedKeys.length
1503
+ };
1504
+ if (errors.length > 0) {
1505
+ result.errors = errors;
1506
+ }
1507
+ return [
1508
+ 2,
1509
+ result
1510
+ ];
1511
+ }
1512
+ });
1513
+ }).apply(this, arguments);
1514
+ }
1515
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }