hikoutei 0.2.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 (535) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja.md +135 -0
  3. package/README.ko.md +138 -0
  4. package/README.md +143 -0
  5. package/apps-script/gateway/Code.gs +412 -0
  6. package/dist/adapter/persistence/contracts/index.d.ts +3 -0
  7. package/dist/adapter/persistence/contracts/index.d.ts.map +1 -0
  8. package/dist/adapter/persistence/contracts/index.js +3 -0
  9. package/dist/adapter/persistence/contracts/index.js.map +1 -0
  10. package/dist/adapter/persistence/contracts/sql.d.ts +50 -0
  11. package/dist/adapter/persistence/contracts/sql.d.ts.map +1 -0
  12. package/dist/adapter/persistence/contracts/sql.js +9 -0
  13. package/dist/adapter/persistence/contracts/sql.js.map +1 -0
  14. package/dist/adapter/persistence/index.d.ts +2 -0
  15. package/dist/adapter/persistence/index.d.ts.map +1 -0
  16. package/dist/adapter/persistence/index.js +2 -0
  17. package/dist/adapter/persistence/index.js.map +1 -0
  18. package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.d.ts +53 -0
  19. package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.d.ts.map +1 -0
  20. package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.js +105 -0
  21. package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.js.map +1 -0
  22. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.d.ts +39 -0
  23. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.d.ts.map +1 -0
  24. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.js +54 -0
  25. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.js.map +1 -0
  26. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.d.ts +38 -0
  27. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.d.ts.map +1 -0
  28. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.js +55 -0
  29. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.js.map +1 -0
  30. package/dist/adapter/persistence/providers/mikro-orm/index.d.ts +16 -0
  31. package/dist/adapter/persistence/providers/mikro-orm/index.d.ts.map +1 -0
  32. package/dist/adapter/persistence/providers/mikro-orm/index.js +9 -0
  33. package/dist/adapter/persistence/providers/mikro-orm/index.js.map +1 -0
  34. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.d.ts +27 -0
  35. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.d.ts.map +1 -0
  36. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.js +67 -0
  37. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.js.map +1 -0
  38. package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.d.ts +19 -0
  39. package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.d.ts.map +1 -0
  40. package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.js +67 -0
  41. package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.js.map +1 -0
  42. package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.d.ts +78 -0
  43. package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.d.ts.map +1 -0
  44. package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.js +121 -0
  45. package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.js.map +1 -0
  46. package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.d.ts +20 -0
  47. package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.d.ts.map +1 -0
  48. package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.js +125 -0
  49. package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.js.map +1 -0
  50. package/dist/adapter/sheets/providers/apps-script-gateway/errors.d.ts +42 -0
  51. package/dist/adapter/sheets/providers/apps-script-gateway/errors.d.ts.map +1 -0
  52. package/dist/adapter/sheets/providers/apps-script-gateway/errors.js +51 -0
  53. package/dist/adapter/sheets/providers/apps-script-gateway/errors.js.map +1 -0
  54. package/dist/adapter/sheets/providers/apps-script-gateway/index.d.ts +22 -0
  55. package/dist/adapter/sheets/providers/apps-script-gateway/index.d.ts.map +1 -0
  56. package/dist/adapter/sheets/providers/apps-script-gateway/index.js +12 -0
  57. package/dist/adapter/sheets/providers/apps-script-gateway/index.js.map +1 -0
  58. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.d.ts +42 -0
  59. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.d.ts.map +1 -0
  60. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.js +161 -0
  61. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.js.map +1 -0
  62. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.d.ts +3 -0
  63. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.d.ts.map +1 -0
  64. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.js +692 -0
  65. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.js.map +1 -0
  66. package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.d.ts +29 -0
  67. package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.d.ts.map +1 -0
  68. package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.js +538 -0
  69. package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.js.map +1 -0
  70. package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.d.ts +12 -0
  71. package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.d.ts.map +1 -0
  72. package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.js +190 -0
  73. package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.js.map +1 -0
  74. package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.d.ts +23 -0
  75. package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.d.ts.map +1 -0
  76. package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.js +166 -0
  77. package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.js.map +1 -0
  78. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.d.ts +50 -0
  79. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.d.ts.map +1 -0
  80. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.js +60 -0
  81. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.js.map +1 -0
  82. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.d.ts +44 -0
  83. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.d.ts.map +1 -0
  84. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.js +40 -0
  85. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.js.map +1 -0
  86. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.d.ts +7 -0
  87. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.d.ts.map +1 -0
  88. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.js +47 -0
  89. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.js.map +1 -0
  90. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.d.ts +5 -0
  91. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.d.ts.map +1 -0
  92. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.js +54 -0
  93. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.js.map +1 -0
  94. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.d.ts +5 -0
  95. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.d.ts.map +1 -0
  96. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.js +2 -0
  97. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.js.map +1 -0
  98. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.d.ts +10 -0
  99. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.d.ts.map +1 -0
  100. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.js +35 -0
  101. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.js.map +1 -0
  102. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.d.ts +67 -0
  103. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.d.ts.map +1 -0
  104. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.js +204 -0
  105. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.js.map +1 -0
  106. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.d.ts +78 -0
  107. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.d.ts.map +1 -0
  108. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.js +343 -0
  109. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.js.map +1 -0
  110. package/dist/application/index.d.ts +4 -0
  111. package/dist/application/index.d.ts.map +1 -0
  112. package/dist/application/index.js +4 -0
  113. package/dist/application/index.js.map +1 -0
  114. package/dist/application/orm/api/TypedSheetsOrm.d.ts +71 -0
  115. package/dist/application/orm/api/TypedSheetsOrm.d.ts.map +1 -0
  116. package/dist/application/orm/api/TypedSheetsOrm.js +116 -0
  117. package/dist/application/orm/api/TypedSheetsOrm.js.map +1 -0
  118. package/dist/application/orm/api/contracts.d.ts +118 -0
  119. package/dist/application/orm/api/contracts.d.ts.map +1 -0
  120. package/dist/application/orm/api/contracts.js +21 -0
  121. package/dist/application/orm/api/contracts.js.map +1 -0
  122. package/dist/application/orm/errors.d.ts +35 -0
  123. package/dist/application/orm/errors.d.ts.map +1 -0
  124. package/dist/application/orm/errors.js +35 -0
  125. package/dist/application/orm/errors.js.map +1 -0
  126. package/dist/application/orm/index.d.ts +13 -0
  127. package/dist/application/orm/index.d.ts.map +1 -0
  128. package/dist/application/orm/index.js +7 -0
  129. package/dist/application/orm/index.js.map +1 -0
  130. package/dist/application/orm/mapping/contracts.d.ts +113 -0
  131. package/dist/application/orm/mapping/contracts.d.ts.map +1 -0
  132. package/dist/application/orm/mapping/contracts.js +8 -0
  133. package/dist/application/orm/mapping/contracts.js.map +1 -0
  134. package/dist/application/orm/mapping/definition.d.ts +16 -0
  135. package/dist/application/orm/mapping/definition.d.ts.map +1 -0
  136. package/dist/application/orm/mapping/definition.js +145 -0
  137. package/dist/application/orm/mapping/definition.js.map +1 -0
  138. package/dist/application/orm/mapping/entityMapping.d.ts +13 -0
  139. package/dist/application/orm/mapping/entityMapping.d.ts.map +1 -0
  140. package/dist/application/orm/mapping/entityMapping.js +13 -0
  141. package/dist/application/orm/mapping/entityMapping.js.map +1 -0
  142. package/dist/application/orm/mapping/identity.d.ts +14 -0
  143. package/dist/application/orm/mapping/identity.d.ts.map +1 -0
  144. package/dist/application/orm/mapping/identity.js +37 -0
  145. package/dist/application/orm/mapping/identity.js.map +1 -0
  146. package/dist/application/orm/mapping/observationMapping.d.ts +42 -0
  147. package/dist/application/orm/mapping/observationMapping.d.ts.map +1 -0
  148. package/dist/application/orm/mapping/observationMapping.js +65 -0
  149. package/dist/application/orm/mapping/observationMapping.js.map +1 -0
  150. package/dist/application/orm/mapping/projection.d.ts +22 -0
  151. package/dist/application/orm/mapping/projection.d.ts.map +1 -0
  152. package/dist/application/orm/mapping/projection.js +74 -0
  153. package/dist/application/orm/mapping/projection.js.map +1 -0
  154. package/dist/application/orm/mapping/registry.d.ts +15 -0
  155. package/dist/application/orm/mapping/registry.d.ts.map +1 -0
  156. package/dist/application/orm/mapping/registry.js +38 -0
  157. package/dist/application/orm/mapping/registry.js.map +1 -0
  158. package/dist/application/orm/mapping/values.d.ts +17 -0
  159. package/dist/application/orm/mapping/values.d.ts.map +1 -0
  160. package/dist/application/orm/mapping/values.js +141 -0
  161. package/dist/application/orm/mapping/values.js.map +1 -0
  162. package/dist/application/orm/persistence/flush/flushCoordinator.d.ts +28 -0
  163. package/dist/application/orm/persistence/flush/flushCoordinator.d.ts.map +1 -0
  164. package/dist/application/orm/persistence/flush/flushCoordinator.js +170 -0
  165. package/dist/application/orm/persistence/flush/flushCoordinator.js.map +1 -0
  166. package/dist/application/orm/persistence/flush/mappedFlushCoordinator.d.ts +9 -0
  167. package/dist/application/orm/persistence/flush/mappedFlushCoordinator.d.ts.map +1 -0
  168. package/dist/application/orm/persistence/flush/mappedFlushCoordinator.js +8 -0
  169. package/dist/application/orm/persistence/flush/mappedFlushCoordinator.js.map +1 -0
  170. package/dist/application/orm/persistence/lifecycle/entityLifecycle.d.ts +12 -0
  171. package/dist/application/orm/persistence/lifecycle/entityLifecycle.d.ts.map +1 -0
  172. package/dist/application/orm/persistence/lifecycle/entityLifecycle.js +134 -0
  173. package/dist/application/orm/persistence/lifecycle/entityLifecycle.js.map +1 -0
  174. package/dist/application/orm/persistence/projection/projectionEffects.d.ts +21 -0
  175. package/dist/application/orm/persistence/projection/projectionEffects.d.ts.map +1 -0
  176. package/dist/application/orm/persistence/projection/projectionEffects.js +203 -0
  177. package/dist/application/orm/persistence/projection/projectionEffects.js.map +1 -0
  178. package/dist/application/orm/persistence/support/businessKeys.d.ts +17 -0
  179. package/dist/application/orm/persistence/support/businessKeys.d.ts.map +1 -0
  180. package/dist/application/orm/persistence/support/businessKeys.js +72 -0
  181. package/dist/application/orm/persistence/support/businessKeys.js.map +1 -0
  182. package/dist/application/orm/persistence/support/canonicalState.d.ts +22 -0
  183. package/dist/application/orm/persistence/support/canonicalState.d.ts.map +1 -0
  184. package/dist/application/orm/persistence/support/canonicalState.js +88 -0
  185. package/dist/application/orm/persistence/support/canonicalState.js.map +1 -0
  186. package/dist/application/orm/persistence/support/contracts.d.ts +139 -0
  187. package/dist/application/orm/persistence/support/contracts.d.ts.map +1 -0
  188. package/dist/application/orm/persistence/support/contracts.js +93 -0
  189. package/dist/application/orm/persistence/support/contracts.js.map +1 -0
  190. package/dist/application/orm/persistence/support/helpers.d.ts +32 -0
  191. package/dist/application/orm/persistence/support/helpers.d.ts.map +1 -0
  192. package/dist/application/orm/persistence/support/helpers.js +66 -0
  193. package/dist/application/orm/persistence/support/helpers.js.map +1 -0
  194. package/dist/application/orm/persistence/support/timing.d.ts +20 -0
  195. package/dist/application/orm/persistence/support/timing.d.ts.map +1 -0
  196. package/dist/application/orm/persistence/support/timing.js +55 -0
  197. package/dist/application/orm/persistence/support/timing.js.map +1 -0
  198. package/dist/application/sync/gateway/SyncGatewayBootstrap.d.ts +46 -0
  199. package/dist/application/sync/gateway/SyncGatewayBootstrap.d.ts.map +1 -0
  200. package/dist/application/sync/gateway/SyncGatewayBootstrap.js +93 -0
  201. package/dist/application/sync/gateway/SyncGatewayBootstrap.js.map +1 -0
  202. package/dist/application/sync/gateway/constants.d.ts +65 -0
  203. package/dist/application/sync/gateway/constants.d.ts.map +1 -0
  204. package/dist/application/sync/gateway/constants.js +57 -0
  205. package/dist/application/sync/gateway/constants.js.map +1 -0
  206. package/dist/application/sync/gateway/errors.d.ts +15 -0
  207. package/dist/application/sync/gateway/errors.d.ts.map +1 -0
  208. package/dist/application/sync/gateway/errors.js +16 -0
  209. package/dist/application/sync/gateway/errors.js.map +1 -0
  210. package/dist/application/sync/gateway/syncGateway.d.ts +313 -0
  211. package/dist/application/sync/gateway/syncGateway.d.ts.map +1 -0
  212. package/dist/application/sync/gateway/syncGateway.js +202 -0
  213. package/dist/application/sync/gateway/syncGateway.js.map +1 -0
  214. package/dist/application/sync/gateway/validation.d.ts +17 -0
  215. package/dist/application/sync/gateway/validation.d.ts.map +1 -0
  216. package/dist/application/sync/gateway/validation.js +60 -0
  217. package/dist/application/sync/gateway/validation.js.map +1 -0
  218. package/dist/application/sync/inbound/polling/SimpleSheetPolling.d.ts +72 -0
  219. package/dist/application/sync/inbound/polling/SimpleSheetPolling.d.ts.map +1 -0
  220. package/dist/application/sync/inbound/polling/SimpleSheetPolling.js +272 -0
  221. package/dist/application/sync/inbound/polling/SimpleSheetPolling.js.map +1 -0
  222. package/dist/application/sync/index.d.ts +16 -0
  223. package/dist/application/sync/index.d.ts.map +1 -0
  224. package/dist/application/sync/index.js +9 -0
  225. package/dist/application/sync/index.js.map +1 -0
  226. package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts +106 -0
  227. package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts.map +1 -0
  228. package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js +297 -0
  229. package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js.map +1 -0
  230. package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts +100 -0
  231. package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts.map +1 -0
  232. package/dist/application/sync/outbound/effects/SyncEffectWorker.js +345 -0
  233. package/dist/application/sync/outbound/effects/SyncEffectWorker.js.map +1 -0
  234. package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts +46 -0
  235. package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts.map +1 -0
  236. package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js +63 -0
  237. package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js.map +1 -0
  238. package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts +20 -0
  239. package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts.map +1 -0
  240. package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js +102 -0
  241. package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js.map +1 -0
  242. package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.d.ts +19 -0
  243. package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.d.ts.map +1 -0
  244. package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.js +32 -0
  245. package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.js.map +1 -0
  246. package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts +30 -0
  247. package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts.map +1 -0
  248. package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js +202 -0
  249. package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js.map +1 -0
  250. package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.d.ts +17 -0
  251. package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.d.ts.map +1 -0
  252. package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.js +80 -0
  253. package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.js.map +1 -0
  254. package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.d.ts +13 -0
  255. package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.d.ts.map +1 -0
  256. package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.js +205 -0
  257. package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.js.map +1 -0
  258. package/dist/application/sync/outbound/projection/ProjectionEffectFactory.d.ts +81 -0
  259. package/dist/application/sync/outbound/projection/ProjectionEffectFactory.d.ts.map +1 -0
  260. package/dist/application/sync/outbound/projection/ProjectionEffectFactory.js +245 -0
  261. package/dist/application/sync/outbound/projection/ProjectionEffectFactory.js.map +1 -0
  262. package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.d.ts +77 -0
  263. package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.d.ts.map +1 -0
  264. package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.js +518 -0
  265. package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.js.map +1 -0
  266. package/dist/application/sync/telemetry/syncTiming.d.ts +50 -0
  267. package/dist/application/sync/telemetry/syncTiming.d.ts.map +1 -0
  268. package/dist/application/sync/telemetry/syncTiming.js +22 -0
  269. package/dist/application/sync/telemetry/syncTiming.js.map +1 -0
  270. package/dist/domain/conflict/errors.d.ts +42 -0
  271. package/dist/domain/conflict/errors.d.ts.map +1 -0
  272. package/dist/domain/conflict/errors.js +36 -0
  273. package/dist/domain/conflict/errors.js.map +1 -0
  274. package/dist/domain/conflict/index.d.ts +5 -0
  275. package/dist/domain/conflict/index.d.ts.map +1 -0
  276. package/dist/domain/conflict/index.js +3 -0
  277. package/dist/domain/conflict/index.js.map +1 -0
  278. package/dist/domain/conflict/transitions.d.ts +52 -0
  279. package/dist/domain/conflict/transitions.d.ts.map +1 -0
  280. package/dist/domain/conflict/transitions.js +115 -0
  281. package/dist/domain/conflict/transitions.js.map +1 -0
  282. package/dist/domain/errors/evaluation.d.ts +13 -0
  283. package/dist/domain/errors/evaluation.d.ts.map +1 -0
  284. package/dist/domain/errors/evaluation.js +14 -0
  285. package/dist/domain/errors/evaluation.js.map +1 -0
  286. package/dist/domain/errors/identity.d.ts +12 -0
  287. package/dist/domain/errors/identity.d.ts.map +1 -0
  288. package/dist/domain/errors/identity.js +15 -0
  289. package/dist/domain/errors/identity.js.map +1 -0
  290. package/dist/domain/errors/index.d.ts +7 -0
  291. package/dist/domain/errors/index.d.ts.map +1 -0
  292. package/dist/domain/errors/index.js +5 -0
  293. package/dist/domain/errors/index.js.map +1 -0
  294. package/dist/domain/errors/stableEncoding.d.ts +7 -0
  295. package/dist/domain/errors/stableEncoding.d.ts.map +1 -0
  296. package/dist/domain/errors/stableEncoding.js +8 -0
  297. package/dist/domain/errors/stableEncoding.js.map +1 -0
  298. package/dist/domain/errors/types.d.ts +20 -0
  299. package/dist/domain/errors/types.d.ts.map +1 -0
  300. package/dist/domain/errors/types.js +18 -0
  301. package/dist/domain/errors/types.js.map +1 -0
  302. package/dist/domain/evaluate/constants.d.ts +55 -0
  303. package/dist/domain/evaluate/constants.d.ts.map +1 -0
  304. package/dist/domain/evaluate/constants.js +41 -0
  305. package/dist/domain/evaluate/constants.js.map +1 -0
  306. package/dist/domain/evaluate/contracts.d.ts +125 -0
  307. package/dist/domain/evaluate/contracts.d.ts.map +1 -0
  308. package/dist/domain/evaluate/contracts.js +8 -0
  309. package/dist/domain/evaluate/contracts.js.map +1 -0
  310. package/dist/domain/evaluate/evaluateBatch.d.ts +11 -0
  311. package/dist/domain/evaluate/evaluateBatch.d.ts.map +1 -0
  312. package/dist/domain/evaluate/evaluateBatch.js +91 -0
  313. package/dist/domain/evaluate/evaluateBatch.js.map +1 -0
  314. package/dist/domain/evaluate/fieldEvaluation.d.ts +14 -0
  315. package/dist/domain/evaluate/fieldEvaluation.d.ts.map +1 -0
  316. package/dist/domain/evaluate/fieldEvaluation.js +133 -0
  317. package/dist/domain/evaluate/fieldEvaluation.js.map +1 -0
  318. package/dist/domain/evaluate/identity.d.ts +21 -0
  319. package/dist/domain/evaluate/identity.d.ts.map +1 -0
  320. package/dist/domain/evaluate/identity.js +72 -0
  321. package/dist/domain/evaluate/identity.js.map +1 -0
  322. package/dist/domain/evaluate/index.d.ts +4 -0
  323. package/dist/domain/evaluate/index.d.ts.map +1 -0
  324. package/dist/domain/evaluate/index.js +3 -0
  325. package/dist/domain/evaluate/index.js.map +1 -0
  326. package/dist/domain/evaluate/preconditions.d.ts +30 -0
  327. package/dist/domain/evaluate/preconditions.d.ts.map +1 -0
  328. package/dist/domain/evaluate/preconditions.js +389 -0
  329. package/dist/domain/evaluate/preconditions.js.map +1 -0
  330. package/dist/domain/evaluate/quarantine.d.ts +15 -0
  331. package/dist/domain/evaluate/quarantine.d.ts.map +1 -0
  332. package/dist/domain/evaluate/quarantine.js +185 -0
  333. package/dist/domain/evaluate/quarantine.js.map +1 -0
  334. package/dist/domain/index.d.ts +7 -0
  335. package/dist/domain/index.d.ts.map +1 -0
  336. package/dist/domain/index.js +7 -0
  337. package/dist/domain/index.js.map +1 -0
  338. package/dist/domain/model/constants.d.ts +73 -0
  339. package/dist/domain/model/constants.d.ts.map +1 -0
  340. package/dist/domain/model/constants.js +59 -0
  341. package/dist/domain/model/constants.js.map +1 -0
  342. package/dist/domain/model/index.d.ts +3 -0
  343. package/dist/domain/model/index.d.ts.map +1 -0
  344. package/dist/domain/model/index.js +2 -0
  345. package/dist/domain/model/index.js.map +1 -0
  346. package/dist/domain/model/types.d.ts +330 -0
  347. package/dist/domain/model/types.d.ts.map +1 -0
  348. package/dist/domain/model/types.js +8 -0
  349. package/dist/domain/model/types.js.map +1 -0
  350. package/dist/index.d.ts +17 -0
  351. package/dist/index.d.ts.map +1 -0
  352. package/dist/index.js +11 -0
  353. package/dist/index.js.map +1 -0
  354. package/dist/infrastructure/index.d.ts +3 -0
  355. package/dist/infrastructure/index.d.ts.map +1 -0
  356. package/dist/infrastructure/index.js +3 -0
  357. package/dist/infrastructure/index.js.map +1 -0
  358. package/dist/infrastructure/storage/constants.d.ts +4 -0
  359. package/dist/infrastructure/storage/constants.d.ts.map +1 -0
  360. package/dist/infrastructure/storage/constants.js +4 -0
  361. package/dist/infrastructure/storage/constants.js.map +1 -0
  362. package/dist/infrastructure/storage/errors.d.ts +55 -0
  363. package/dist/infrastructure/storage/errors.d.ts.map +1 -0
  364. package/dist/infrastructure/storage/errors.js +58 -0
  365. package/dist/infrastructure/storage/errors.js.map +1 -0
  366. package/dist/infrastructure/storage/index.d.ts +23 -0
  367. package/dist/infrastructure/storage/index.d.ts.map +1 -0
  368. package/dist/infrastructure/storage/index.js +13 -0
  369. package/dist/infrastructure/storage/index.js.map +1 -0
  370. package/dist/infrastructure/storage/recovery/restoreRecovery.d.ts +64 -0
  371. package/dist/infrastructure/storage/recovery/restoreRecovery.d.ts.map +1 -0
  372. package/dist/infrastructure/storage/recovery/restoreRecovery.js +148 -0
  373. package/dist/infrastructure/storage/recovery/restoreRecovery.js.map +1 -0
  374. package/dist/infrastructure/storage/sqlite/schema.d.ts +49 -0
  375. package/dist/infrastructure/storage/sqlite/schema.d.ts.map +1 -0
  376. package/dist/infrastructure/storage/sqlite/schema.js +529 -0
  377. package/dist/infrastructure/storage/sqlite/schema.js.map +1 -0
  378. package/dist/infrastructure/storage/sqlite/schemaTypes.d.ts +5 -0
  379. package/dist/infrastructure/storage/sqlite/schemaTypes.d.ts.map +1 -0
  380. package/dist/infrastructure/storage/sqlite/schemaTypes.js +2 -0
  381. package/dist/infrastructure/storage/sqlite/schemaTypes.js.map +1 -0
  382. package/dist/infrastructure/storage/sqlite/sqlScript.d.ts +9 -0
  383. package/dist/infrastructure/storage/sqlite/sqlScript.d.ts.map +1 -0
  384. package/dist/infrastructure/storage/sqlite/sqlScript.js +122 -0
  385. package/dist/infrastructure/storage/sqlite/sqlScript.js.map +1 -0
  386. package/dist/infrastructure/storage/sqlite/sqlState.d.ts +6 -0
  387. package/dist/infrastructure/storage/sqlite/sqlState.d.ts.map +1 -0
  388. package/dist/infrastructure/storage/sqlite/sqlState.js +14 -0
  389. package/dist/infrastructure/storage/sqlite/sqlState.js.map +1 -0
  390. package/dist/infrastructure/storage/sqlite/sqlTransaction.d.ts +6 -0
  391. package/dist/infrastructure/storage/sqlite/sqlTransaction.d.ts.map +1 -0
  392. package/dist/infrastructure/storage/sqlite/sqlTransaction.js +24 -0
  393. package/dist/infrastructure/storage/sqlite/sqlTransaction.js.map +1 -0
  394. package/dist/infrastructure/storage/sqlite/sqliteBridge.d.ts +44 -0
  395. package/dist/infrastructure/storage/sqlite/sqliteBridge.d.ts.map +1 -0
  396. package/dist/infrastructure/storage/sqlite/sqliteBridge.js +66 -0
  397. package/dist/infrastructure/storage/sqlite/sqliteBridge.js.map +1 -0
  398. package/dist/infrastructure/storage/state/canonical/canonicalCommit.d.ts +101 -0
  399. package/dist/infrastructure/storage/state/canonical/canonicalCommit.d.ts.map +1 -0
  400. package/dist/infrastructure/storage/state/canonical/canonicalCommit.js +417 -0
  401. package/dist/infrastructure/storage/state/canonical/canonicalCommit.js.map +1 -0
  402. package/dist/infrastructure/storage/state/observation/observationAudit.d.ts +16 -0
  403. package/dist/infrastructure/storage/state/observation/observationAudit.d.ts.map +1 -0
  404. package/dist/infrastructure/storage/state/observation/observationAudit.js +85 -0
  405. package/dist/infrastructure/storage/state/observation/observationAudit.js.map +1 -0
  406. package/dist/infrastructure/storage/state/observation/observationCanonical.d.ts +31 -0
  407. package/dist/infrastructure/storage/state/observation/observationCanonical.d.ts.map +1 -0
  408. package/dist/infrastructure/storage/state/observation/observationCanonical.js +439 -0
  409. package/dist/infrastructure/storage/state/observation/observationCanonical.js.map +1 -0
  410. package/dist/infrastructure/storage/state/observation/observationConstants.d.ts +53 -0
  411. package/dist/infrastructure/storage/state/observation/observationConstants.d.ts.map +1 -0
  412. package/dist/infrastructure/storage/state/observation/observationConstants.js +41 -0
  413. package/dist/infrastructure/storage/state/observation/observationConstants.js.map +1 -0
  414. package/dist/infrastructure/storage/state/observation/observationLedger.d.ts +49 -0
  415. package/dist/infrastructure/storage/state/observation/observationLedger.d.ts.map +1 -0
  416. package/dist/infrastructure/storage/state/observation/observationLedger.js +537 -0
  417. package/dist/infrastructure/storage/state/observation/observationLedger.js.map +1 -0
  418. package/dist/infrastructure/storage/state/observation/observationQuarantine.d.ts +15 -0
  419. package/dist/infrastructure/storage/state/observation/observationQuarantine.d.ts.map +1 -0
  420. package/dist/infrastructure/storage/state/observation/observationQuarantine.js +100 -0
  421. package/dist/infrastructure/storage/state/observation/observationQuarantine.js.map +1 -0
  422. package/dist/infrastructure/storage/state/observation/observationTypes.d.ts +124 -0
  423. package/dist/infrastructure/storage/state/observation/observationTypes.d.ts.map +1 -0
  424. package/dist/infrastructure/storage/state/observation/observationTypes.js +13 -0
  425. package/dist/infrastructure/storage/state/observation/observationTypes.js.map +1 -0
  426. package/dist/infrastructure/storage/state/observation/observationValidation.d.ts +28 -0
  427. package/dist/infrastructure/storage/state/observation/observationValidation.d.ts.map +1 -0
  428. package/dist/infrastructure/storage/state/observation/observationValidation.js +223 -0
  429. package/dist/infrastructure/storage/state/observation/observationValidation.js.map +1 -0
  430. package/dist/infrastructure/storage/state/observation/observationWriter.d.ts +28 -0
  431. package/dist/infrastructure/storage/state/observation/observationWriter.d.ts.map +1 -0
  432. package/dist/infrastructure/storage/state/observation/observationWriter.js +293 -0
  433. package/dist/infrastructure/storage/state/observation/observationWriter.js.map +1 -0
  434. package/dist/infrastructure/storage/state/readonly/readOnlyObservation.d.ts +58 -0
  435. package/dist/infrastructure/storage/state/readonly/readOnlyObservation.d.ts.map +1 -0
  436. package/dist/infrastructure/storage/state/readonly/readOnlyObservation.js +195 -0
  437. package/dist/infrastructure/storage/state/readonly/readOnlyObservation.js.map +1 -0
  438. package/dist/infrastructure/storage/state/resolution/resolutionWriter.d.ts +31 -0
  439. package/dist/infrastructure/storage/state/resolution/resolutionWriter.d.ts.map +1 -0
  440. package/dist/infrastructure/storage/state/resolution/resolutionWriter.js +563 -0
  441. package/dist/infrastructure/storage/state/resolution/resolutionWriter.js.map +1 -0
  442. package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.d.ts +118 -0
  443. package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.d.ts.map +1 -0
  444. package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.js +18 -0
  445. package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.js.map +1 -0
  446. package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.d.ts +23 -0
  447. package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.d.ts.map +1 -0
  448. package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.js +84 -0
  449. package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.js.map +1 -0
  450. package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.d.ts +16 -0
  451. package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.d.ts.map +1 -0
  452. package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.js +97 -0
  453. package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.js.map +1 -0
  454. package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts +137 -0
  455. package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts.map +1 -0
  456. package/dist/infrastructure/storage/sync/outbound/effectOutbox.js +396 -0
  457. package/dist/infrastructure/storage/sync/outbound/effectOutbox.js.map +1 -0
  458. package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.d.ts +101 -0
  459. package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.d.ts.map +1 -0
  460. package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.js +9 -0
  461. package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.js.map +1 -0
  462. package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts +21 -0
  463. package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts.map +1 -0
  464. package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js +184 -0
  465. package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js.map +1 -0
  466. package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.d.ts +25 -0
  467. package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.d.ts.map +1 -0
  468. package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.js +158 -0
  469. package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.js.map +1 -0
  470. package/dist/infrastructure/storage/sync/shared/syncRegistry.d.ts +69 -0
  471. package/dist/infrastructure/storage/sync/shared/syncRegistry.d.ts.map +1 -0
  472. package/dist/infrastructure/storage/sync/shared/syncRegistry.js +272 -0
  473. package/dist/infrastructure/storage/sync/shared/syncRegistry.js.map +1 -0
  474. package/dist/infrastructure/storage/sync/shared/writerLease.d.ts +90 -0
  475. package/dist/infrastructure/storage/sync/shared/writerLease.d.ts.map +1 -0
  476. package/dist/infrastructure/storage/sync/shared/writerLease.js +282 -0
  477. package/dist/infrastructure/storage/sync/shared/writerLease.js.map +1 -0
  478. package/dist/shared/constants.d.ts +8 -0
  479. package/dist/shared/constants.d.ts.map +1 -0
  480. package/dist/shared/constants.js +8 -0
  481. package/dist/shared/constants.js.map +1 -0
  482. package/dist/shared/encoding/constants.d.ts +45 -0
  483. package/dist/shared/encoding/constants.d.ts.map +1 -0
  484. package/dist/shared/encoding/constants.js +37 -0
  485. package/dist/shared/encoding/constants.js.map +1 -0
  486. package/dist/shared/encoding/index.d.ts +6 -0
  487. package/dist/shared/encoding/index.d.ts.map +1 -0
  488. package/dist/shared/encoding/index.js +4 -0
  489. package/dist/shared/encoding/index.js.map +1 -0
  490. package/dist/shared/encoding/stableEncode.d.ts +34 -0
  491. package/dist/shared/encoding/stableEncode.d.ts.map +1 -0
  492. package/dist/shared/encoding/stableEncode.js +210 -0
  493. package/dist/shared/encoding/stableEncode.js.map +1 -0
  494. package/dist/shared/encoding/typeGuards.d.ts +15 -0
  495. package/dist/shared/encoding/typeGuards.d.ts.map +1 -0
  496. package/dist/shared/encoding/typeGuards.js +11 -0
  497. package/dist/shared/encoding/typeGuards.js.map +1 -0
  498. package/dist/shared/encoding/types.d.ts +52 -0
  499. package/dist/shared/encoding/types.d.ts.map +1 -0
  500. package/dist/shared/encoding/types.js +8 -0
  501. package/dist/shared/encoding/types.js.map +1 -0
  502. package/dist/shared/index.d.ts +6 -0
  503. package/dist/shared/index.d.ts.map +1 -0
  504. package/dist/shared/index.js +6 -0
  505. package/dist/shared/index.js.map +1 -0
  506. package/dist/shared/state/constants.d.ts +16 -0
  507. package/dist/shared/state/constants.d.ts.map +1 -0
  508. package/dist/shared/state/constants.js +16 -0
  509. package/dist/shared/state/constants.js.map +1 -0
  510. package/dist/shared/state/index.d.ts +3 -0
  511. package/dist/shared/state/index.d.ts.map +1 -0
  512. package/dist/shared/state/index.js +2 -0
  513. package/dist/shared/state/index.js.map +1 -0
  514. package/dist/shared/state/types.d.ts +23 -0
  515. package/dist/shared/state/types.d.ts.map +1 -0
  516. package/dist/shared/state/types.js +2 -0
  517. package/dist/shared/state/types.js.map +1 -0
  518. package/dist/shared/validation.d.ts +9 -0
  519. package/dist/shared/validation.d.ts.map +1 -0
  520. package/dist/shared/validation.js +25 -0
  521. package/dist/shared/validation.js.map +1 -0
  522. package/docs/architecture.md +72 -0
  523. package/docs/code-guidelines.md +256 -0
  524. package/docs/development.md +48 -0
  525. package/docs/git-workflow.md +224 -0
  526. package/docs/mikro-orm-adapter-spike.md +248 -0
  527. package/docs/quick-start.md +102 -0
  528. package/docs/sql-layer-plan.md +59 -0
  529. package/docs/sync-bulk-write-benchmark.md +1036 -0
  530. package/docs/sync-observability.md +71 -0
  531. package/docs/task-queue-write-model.md +640 -0
  532. package/docs/typed-sheets-mvp-scope-2026-06-29.md +490 -0
  533. package/docs/typed-sheets-plan.md +417 -0
  534. package/docs/write-and-synchronization-flow.md +71 -0
  535. package/package.json +68 -0
@@ -0,0 +1,692 @@
1
+ /** Self-contained V8 source executed by Code.gs for effect application and read-back. */
2
+ export const EFFECT_OPERATION_SOURCE = String.raw `function (spreadsheet, args) {
3
+ var MAX_EFFECTS = 20;
4
+ var RECEIPT_SHEET_NAME = "__typed_sheets_internal_effect_receipts";
5
+ var RECEIPT_HEADERS = ["effectId", "payloadHash", "status", "visibleHash", "visibleRevision", "updatedAt"];
6
+ var ANCHOR_KEY = "typed_sheets_sync_anchor";
7
+ var EFFECT_KINDS = {
8
+ SYSTEM_PROJECTION: "system_projection",
9
+ CANDIDATE_RECONCILE: "candidate_reconcile",
10
+ SYSTEM_REPAIR: "system_repair",
11
+ RESOLUTION_PROJECTION: "resolution_projection",
12
+ RESOLUTION_DELETE: "resolution_delete",
13
+ USER_INPUT_DELETE: "user_input_delete"
14
+ };
15
+ var DEFERRED = "deferred";
16
+
17
+ var phases = [];
18
+ var effectLockStartedAt = Date.now();
19
+ var effectLock = LockService.getScriptLock();
20
+ if (!effectLock.tryLock(20000)) throw new Error("Could not acquire the sync effect gateway lock");
21
+ try {
22
+ var operationResult = run_();
23
+ appendTimingPhase_(operationResult, "script_lock", Date.now() - effectLockStartedAt);
24
+ return operationResult;
25
+ } finally {
26
+ effectLock.releaseLock();
27
+ }
28
+
29
+ function run_() {
30
+ var startedAt = Date.now();
31
+ requireObject_(args, "effect operation args");
32
+ var validationStartedAt = Date.now();
33
+ if (!Array.isArray(args.effects) && args.mode === "applyEffects") {
34
+ throw new Error("applyEffects effects must be an array");
35
+ }
36
+ phase_("validate_input", validationStartedAt);
37
+
38
+ var sheetLookupStartedAt = Date.now();
39
+ var sheet = spreadsheet.getSheetByName(args.sheetName);
40
+ if (sheet === null) throw new Error("Registered sync sheet does not exist: " + args.sheetName);
41
+ phase_("sheet_lookup", sheetLookupStartedAt);
42
+ var layoutStartedAt = Date.now();
43
+ var layout = readLayout_(sheet, args.registeredRange);
44
+ phase_("layout_read", layoutStartedAt);
45
+ var contextStartedAt = Date.now();
46
+ var context = readContext_(sheet, layout, args.identityField);
47
+ phase_("context_read", contextStartedAt);
48
+
49
+ if (args.mode === "readEffectPostcondition") {
50
+ return classifyPostcondition_(context, args.effect, readPostconditionReceipts_());
51
+ }
52
+ if (args.mode === "readEffectPostconditions") {
53
+ if (!Array.isArray(args.effects) || args.effects.length === 0) {
54
+ throw new Error("postcondition effects must be a non-empty array");
55
+ }
56
+ var postconditionReceipts = readPostconditionReceipts_();
57
+ return {
58
+ results: args.effects.map(function (effect) {
59
+ return {
60
+ effectId: String(effect.effectId),
61
+ payloadHash: String(effect.payloadHash),
62
+ postcondition: classifyPostcondition_(context, effect, postconditionReceipts)
63
+ };
64
+ })
65
+ };
66
+ }
67
+ if (args.mode !== "applyEffects") throw new Error("unsupported effect operation mode");
68
+
69
+ var receiptEnsureStartedAt = Date.now();
70
+ var receiptSheet = ensureReceiptSheet_(spreadsheet);
71
+ phase_("receipt_sheet_ensure", receiptEnsureStartedAt);
72
+ var receiptReadStartedAt = Date.now();
73
+ var receipts = readReceipts_(receiptSheet);
74
+ phase_("receipt_read", receiptReadStartedAt);
75
+ var pendingReceipts = [];
76
+ var pendingReceiptsById = Object.create(null);
77
+ var appendRows = [];
78
+ var deleteRows = [];
79
+ var deferred = [];
80
+ var results = [];
81
+ var count = Math.min(args.effects.length, MAX_EFFECTS);
82
+ var postconditionMode = args.postconditionMode === undefined ? "inline" : args.postconditionMode;
83
+ if (postconditionMode !== "inline" && postconditionMode !== DEFERRED) {
84
+ throw new Error("applyEffects postconditionMode must be inline or deferred");
85
+ }
86
+
87
+ var planStartedAt = Date.now();
88
+ for (var index = 0; index < count; index += 1) {
89
+ var checked = requireEffect_(args.effects[index], args);
90
+ var existingReceipt = receipts[checked.effectId] || pendingReceiptsById[checked.effectId] || null;
91
+ if (existingReceipt !== null) {
92
+ if (existingReceipt.payloadHash !== checked.payloadHash) {
93
+ results[index] = result_(checked, "schema_error", null, "effect_id_reused_with_different_payload", null);
94
+ continue;
95
+ }
96
+ var receiptRow = findRow_(context, checked.payload.targetAnchor, checked.targetId);
97
+ if (isDeletion_(checked.effectKind)) {
98
+ results[index] = receiptRow === null
99
+ ? result_(checked, "already_applied", null, null, existingReceipt)
100
+ : result_(checked, "guard_mismatch", receiptRow.rowNumber, "receipt_target_reappeared", null);
101
+ continue;
102
+ }
103
+ if (receiptRow === null) {
104
+ results[index] = result_(
105
+ checked,
106
+ checked.effectKind === EFFECT_KINDS.SYSTEM_REPAIR ? "repair_reobserve" : "guard_mismatch",
107
+ null,
108
+ "receipt_target_missing",
109
+ null,
110
+ );
111
+ continue;
112
+ }
113
+ var receiptCurrentHash = currentHash_(receiptRow, checked.payload.fields);
114
+ results[index] = receiptCurrentHash === checked.payload.targetVisibleHash
115
+ ? result_(checked, "already_applied", receiptRow.rowNumber, null, existingReceipt)
116
+ : result_(
117
+ checked,
118
+ checked.effectKind === EFFECT_KINDS.SYSTEM_REPAIR ? "repair_reobserve" : "guard_mismatch",
119
+ receiptRow.rowNumber,
120
+ "receipt_postcondition_changed",
121
+ null,
122
+ );
123
+ continue;
124
+ }
125
+
126
+ var row = findRow_(context, checked.payload.targetAnchor, checked.targetId);
127
+ var created = false;
128
+ if (row === null) {
129
+ if (!checked.payload.createIfMissing) {
130
+ results[index] = result_(checked, "guard_mismatch", null, "target_anchor_missing", null);
131
+ continue;
132
+ }
133
+ if (checked.expectedVisibleRevision !== 0 || checked.expectedVisibleHash !== "") {
134
+ results[index] = result_(checked, "guard_mismatch", null, "insert_requires_empty_visible_baseline", null);
135
+ continue;
136
+ }
137
+ row = createRow_(context, checked.payload.targetAnchor, checked.targetId);
138
+ appendRows.push(row);
139
+ created = true;
140
+ }
141
+
142
+ if (isDeletion_(checked.effectKind)) {
143
+ var deletionSchemaError = validateDeletion_(layout, checked);
144
+ if (deletionSchemaError !== null) {
145
+ results[index] = result_(checked, "schema_error", row.rowNumber, deletionSchemaError, null);
146
+ continue;
147
+ }
148
+ var deletionHash = currentHash_(row, checked.payload.fields);
149
+ if (deletionHash !== checked.expectedVisibleHash) {
150
+ results[index] = result_(checked, "guard_mismatch", row.rowNumber, "visible_guard_mismatch", null);
151
+ continue;
152
+ }
153
+ var deletionReceipt = makeReceipt_(checked, deletionHash, checked.expectedVisibleRevision);
154
+ row.deleted = true;
155
+ deleteRows.push(row);
156
+ queueReceipt_(receipts, pendingReceipts, pendingReceiptsById, deletionReceipt);
157
+ deferred.push({ index: index, checked: checked, row: row, receipt: deletionReceipt, deletion: true });
158
+ continue;
159
+ }
160
+
161
+ var currentHash = currentHash_(row, checked.payload.fields);
162
+ var expectedCandidateHash = optionalWireText_(checked.payload.expectedCandidateHash);
163
+ if (checked.effectKind === EFFECT_KINDS.CANDIDATE_RECONCILE &&
164
+ expectedCandidateHash !== null && currentHash !== checked.expectedVisibleHash) {
165
+ results[index] = result_(checked, "guard_mismatch", row.rowNumber, "candidate_guard_mismatch", null);
166
+ continue;
167
+ }
168
+ if (currentHash === checked.payload.targetVisibleHash) {
169
+ var alreadyReceipt = makeReceipt_(checked, currentHash, checked.expectedVisibleRevision + 1);
170
+ queueReceipt_(receipts, pendingReceipts, pendingReceiptsById, alreadyReceipt);
171
+ results[index] = result_(checked, created ? "applied" : "already_applied", row.rowNumber, null, alreadyReceipt);
172
+ continue;
173
+ }
174
+ var repairGuardHash = optionalWireText_(checked.repairGuardHash);
175
+ if (checked.effectKind === EFFECT_KINDS.SYSTEM_REPAIR) {
176
+ if (repairGuardHash === null || currentHash !== repairGuardHash) {
177
+ results[index] = result_(checked, "repair_reobserve", row.rowNumber, "repair_guard_mismatch", null);
178
+ continue;
179
+ }
180
+ } else if (currentHash !== checked.expectedVisibleHash) {
181
+ results[index] = result_(checked, "guard_mismatch", row.rowNumber, "visible_guard_mismatch", null);
182
+ continue;
183
+ }
184
+
185
+ Object.keys(checked.payload.fields).forEach(function (fieldName) {
186
+ row.cells[fieldName] = checked.payload.fields[fieldName];
187
+ if (!row.appended) {
188
+ row.writeFields[fieldName] = checked.payload.fields[fieldName];
189
+ context.updatedRows[row.rowNumber] = row;
190
+ }
191
+ });
192
+ deferred.push({
193
+ index: index,
194
+ checked: checked,
195
+ row: row,
196
+ receipt: makeReceipt_(checked, checked.payload.targetVisibleHash, checked.expectedVisibleRevision + 1),
197
+ deletion: false,
198
+ });
199
+ }
200
+ phase_("effect_plan", planStartedAt);
201
+
202
+ var appendWriteStartedAt = Date.now();
203
+ writeAppendRows_(sheet, layout, appendRows, args.checkboxHeaders);
204
+ phase_("append_write", appendWriteStartedAt);
205
+ var fieldWriteStartedAt = Date.now();
206
+ writeFieldUpdates_(sheet, layout, context.rows);
207
+ phase_("field_update_write", fieldWriteStartedAt);
208
+ var writeFlushStartedAt = Date.now();
209
+ if (appendRows.length > 0 || Object.keys(context.updatedRows).length > 0) SpreadsheetApp.flush();
210
+ phase_("write_flush", writeFlushStartedAt);
211
+
212
+ var postconditionStartedAt = Date.now();
213
+ deferred.forEach(function (planned) {
214
+ if (planned.deletion) {
215
+ results[planned.index] = result_(planned.checked, "applied", null, null, planned.receipt);
216
+ return;
217
+ }
218
+ if (postconditionMode !== DEFERRED &&
219
+ physicalHash_(sheet, layout, planned.row.rowNumber, planned.checked.payload.fields) !== planned.checked.payload.targetVisibleHash) {
220
+ results[planned.index] = result_(planned.checked, "retryable_error", planned.row.rowNumber, "postcondition_hash_mismatch", null);
221
+ return;
222
+ }
223
+ queueReceipt_(receipts, pendingReceipts, pendingReceiptsById, planned.receipt);
224
+ results[planned.index] = result_(planned.checked, "applied", planned.row.rowNumber, null, planned.receipt);
225
+ });
226
+ phase_("postcondition", postconditionStartedAt);
227
+
228
+ var deleteStartedAt = Date.now();
229
+ deleteRows.slice().sort(function (left, right) { return right.rowNumber - left.rowNumber; }).forEach(function (row) {
230
+ sheet.deleteRow(row.rowNumber);
231
+ });
232
+ phase_("delete_rows", deleteStartedAt);
233
+ var deleteFlushStartedAt = Date.now();
234
+ if (deleteRows.length > 0) SpreadsheetApp.flush();
235
+ phase_("delete_flush", deleteFlushStartedAt);
236
+ var receiptWriteStartedAt = Date.now();
237
+ writeReceipts_(receiptSheet, pendingReceipts);
238
+ phase_("receipt_write", receiptWriteStartedAt);
239
+ results.forEach(function (entry) {
240
+ if (entry === null || entry === undefined) throw new Error("effect result was not produced");
241
+ if (postconditionMode === DEFERRED &&
242
+ (entry.status === "applied" || entry.status === "already_applied")) {
243
+ entry.postcondition = "acknowledged";
244
+ }
245
+ });
246
+ var operationCounts = countOperationKinds_(args.effects);
247
+ return {
248
+ results: results,
249
+ snapshotHash: null,
250
+ hasMore: args.effects.length > count,
251
+ timing: {
252
+ operationKinds: operationKinds_(operationCounts),
253
+ operationCounts: operationCounts,
254
+ durationMs: Date.now() - startedAt,
255
+ phases: phases,
256
+ },
257
+ };
258
+ }
259
+
260
+ function readLayout_(targetSheet, registeredRange) {
261
+ var parsed = parseRange_(registeredRange);
262
+ var headerValues = targetSheet.getRange(1, parsed.startColumn, 1, parsed.columnCount).getValues()[0];
263
+ var headers = [];
264
+ var positions = Object.create(null);
265
+ headerValues.forEach(function (header, headerIndex) {
266
+ if (typeof header !== "string" || header.trim() === "") throw new Error("registered header is invalid");
267
+ if (positions[header] !== undefined) throw new Error("registered headers contain a duplicate");
268
+ headers.push(header);
269
+ positions[header] = parsed.startColumn + headerIndex;
270
+ });
271
+ return { startColumn: parsed.startColumn, columnCount: parsed.columnCount, headers: headers, positions: positions };
272
+ }
273
+
274
+ function readContext_(targetSheet, layout, identityField) {
275
+ var rows = [];
276
+ var byAnchor = Object.create(null);
277
+ var byIdentity = Object.create(null);
278
+ var lastRow = targetSheet.getLastRow();
279
+ var rawRows = lastRow < 2 ? [] : targetSheet.getRange(2, layout.startColumn, lastRow - 1, layout.columnCount).getValues();
280
+ rawRows.forEach(function (raw, offset) {
281
+ if (isBlankRow_(raw)) return;
282
+ var rowNumber = offset + 2;
283
+ var cells = Object.create(null);
284
+ layout.headers.forEach(function (header, headerIndex) {
285
+ cells[header] = normalizedCellFromSheetValue_(raw[headerIndex]);
286
+ });
287
+ var anchors = readAnchors_(targetSheet, rowNumber);
288
+ if (anchors.length > 1) throw new Error("row has multiple sync anchors: " + rowNumber);
289
+ var anchor = anchors.length === 1 ? anchors[0] : null;
290
+ var identity = identityField === undefined ? null : identityFromCell_(cells[identityField]);
291
+ var row = {
292
+ rowNumber: rowNumber,
293
+ physicalAnchor: anchor,
294
+ targetId: identity,
295
+ cells: cells,
296
+ writeFields: Object.create(null),
297
+ appended: false,
298
+ deleted: false,
299
+ };
300
+ if (anchor !== null) {
301
+ if (byAnchor[anchor] !== undefined) throw new Error("sync anchor is duplicated: " + anchor);
302
+ byAnchor[anchor] = row;
303
+ }
304
+ if (identity !== null) {
305
+ if (byIdentity[identity] !== undefined) throw new Error("sync identity is duplicated: " + identity);
306
+ byIdentity[identity] = row;
307
+ }
308
+ rows.push(row);
309
+ });
310
+ return {
311
+ rows: rows,
312
+ updatedRows: Object.create(null),
313
+ byAnchor: byAnchor,
314
+ byIdentity: byIdentity,
315
+ nextAppendRow: Math.max(lastRow + 1, 2),
316
+ layout: layout,
317
+ };
318
+ }
319
+
320
+ function createRow_(targetContext, anchor, targetId) {
321
+ var cells = Object.create(null);
322
+ targetContext.layout.headers.forEach(function (header) { cells[header] = null; });
323
+ var row = {
324
+ rowNumber: targetContext.nextAppendRow++,
325
+ physicalAnchor: anchor,
326
+ targetId: targetId,
327
+ cells: cells,
328
+ writeFields: Object.create(null),
329
+ appended: true,
330
+ deleted: false,
331
+ };
332
+ targetContext.rows.push(row);
333
+ targetContext.byAnchor[anchor] = row;
334
+ if (targetId !== null) targetContext.byIdentity[targetId] = row;
335
+ return row;
336
+ }
337
+
338
+ function findRow_(targetContext, anchor, targetId) {
339
+ var row = targetContext.byAnchor[anchor] || null;
340
+ if (row === null && targetId !== null && targetId !== undefined) row = targetContext.byIdentity[targetId] || null;
341
+ return row !== null && row.deleted ? null : row;
342
+ }
343
+
344
+ function currentHash_(row, fields) {
345
+ var values = Object.create(null);
346
+ Object.keys(fields).forEach(function (fieldName) {
347
+ if (!Object.prototype.hasOwnProperty.call(row.cells, fieldName)) throw new Error("effect field is not a registered header: " + fieldName);
348
+ values[fieldName] = row.cells[fieldName];
349
+ });
350
+ return visibleHash_(values);
351
+ }
352
+
353
+ function physicalHash_(targetSheet, targetLayout, rowNumber, fields) {
354
+ var values = Object.create(null);
355
+ Object.keys(fields).forEach(function (fieldName) {
356
+ if (targetLayout.positions[fieldName] === undefined) throw new Error("effect field is not a registered header: " + fieldName);
357
+ values[fieldName] = normalizedCellFromSheetValue_(
358
+ targetSheet.getRange(rowNumber, targetLayout.positions[fieldName], 1, 1).getValues()[0][0],
359
+ );
360
+ });
361
+ return visibleHash_(values);
362
+ }
363
+
364
+ function readPostconditionReceipts_() {
365
+ var receiptSheetForRead = spreadsheet.getSheetByName(RECEIPT_SHEET_NAME);
366
+ return receiptSheetForRead === null ? Object.create(null) : readReceipts_(receiptSheetForRead);
367
+ }
368
+
369
+ function classifyPostcondition_(targetContext, rawEffect, receiptsForRead) {
370
+ var checked = requireEffect_(rawEffect, args);
371
+ var receipt = receiptsForRead[checked.effectId] || null;
372
+ var row = findRow_(targetContext, checked.payload.targetAnchor, checked.targetId);
373
+ if (isDeletion_(checked.effectKind)) {
374
+ if (receipt !== null && row === null) return postcondition_("applied", receipt.visibleRevision, receipt.visibleHash);
375
+ if (row === null) return postcondition_("unavailable", null, null);
376
+ var deleteHash = currentHash_(row, checked.payload.fields);
377
+ if (receipt !== null) return postcondition_("changed", null, deleteHash);
378
+ return deleteHash === checked.expectedVisibleHash
379
+ ? postcondition_("unapplied", checked.expectedVisibleRevision, deleteHash)
380
+ : postcondition_("changed", null, deleteHash);
381
+ }
382
+ if (row === null) return postcondition_(checked.payload.createIfMissing ? "unapplied" : "changed", null, null);
383
+ var current = currentHash_(row, checked.payload.fields);
384
+ if (current === checked.payload.targetVisibleHash) {
385
+ return postcondition_("applied", receipt === null ? checked.expectedVisibleRevision + 1 : receipt.visibleRevision, current);
386
+ }
387
+ var repairGuard = optionalWireText_(checked.repairGuardHash);
388
+ if (current === checked.expectedVisibleHash || (repairGuard !== null && current === repairGuard)) {
389
+ return postcondition_("unapplied", checked.expectedVisibleRevision, current);
390
+ }
391
+ return postcondition_("changed", null, current);
392
+ }
393
+
394
+ function postcondition_(disposition, revision, hash) {
395
+ return { disposition: disposition, visibleRevision: revision, visibleHash: hash, snapshotHash: null };
396
+ }
397
+
398
+ function requireEffect_(rawEffect, request) {
399
+ requireObject_(rawEffect, "effect");
400
+ var effectKind = string_(rawEffect.effectKind, "effectKind");
401
+ if ([
402
+ EFFECT_KINDS.SYSTEM_PROJECTION,
403
+ EFFECT_KINDS.CANDIDATE_RECONCILE,
404
+ EFFECT_KINDS.SYSTEM_REPAIR,
405
+ EFFECT_KINDS.RESOLUTION_PROJECTION,
406
+ EFFECT_KINDS.RESOLUTION_DELETE,
407
+ EFFECT_KINDS.USER_INPUT_DELETE,
408
+ ].indexOf(effectKind) < 0) throw new Error("unsupported sync effect kind: " + effectKind);
409
+ if (rawEffect.projection !== request.projection) throw new Error("effect projection is not registered for this request");
410
+ if (effectKind === EFFECT_KINDS.RESOLUTION_DELETE && request.projection !== "sync_conflicts") {
411
+ throw new Error("resolution_delete is only allowed on sync_conflicts");
412
+ }
413
+ if (effectKind === EFFECT_KINDS.USER_INPUT_DELETE && request.projection !== "user_input") {
414
+ throw new Error("user_input_delete is only allowed on user_input");
415
+ }
416
+ var payload = rawEffect.payload;
417
+ requireObject_(payload, "effect payload");
418
+ if (payload.sheetName !== request.sheetName || payload.registeredRange !== request.registeredRange ||
419
+ payload.schemaVersion !== request.schemaVersion) throw new Error("effect payload does not match the registered projection");
420
+ var fields = Object.create(null);
421
+ requireObject_(payload.fields, "effect fields");
422
+ Object.keys(payload.fields).forEach(function (fieldName) { fields[fieldName] = normalizeCell_(payload.fields[fieldName]); });
423
+ if (Object.keys(fields).length === 0) throw new Error("effect fields must contain a field");
424
+ if (visibleHash_(fields) !== string_(payload.targetVisibleHash, "targetVisibleHash")) {
425
+ throw new Error("effect targetVisibleHash does not match fields");
426
+ }
427
+ if (typeof payload.createIfMissing !== "boolean") throw new Error("effect createIfMissing must be boolean");
428
+ var expectedVisibleRevision = nonNegativeInteger_(rawEffect.expectedVisibleRevision, "expectedVisibleRevision");
429
+ var expectedVisibleHash = stringAllowEmpty_(rawEffect.expectedVisibleHash, "expectedVisibleHash");
430
+ if (
431
+ expectedVisibleHash.length === 0 &&
432
+ !(expectedVisibleRevision === 0 && payload.createIfMissing === true)
433
+ ) {
434
+ throw new Error("empty expectedVisibleHash is only valid for a new row");
435
+ }
436
+ return {
437
+ effectId: string_(rawEffect.effectId, "effectId"),
438
+ payloadHash: string_(rawEffect.payloadHash, "payloadHash"),
439
+ effectKind: effectKind,
440
+ targetId: typeof rawEffect.targetId === "string" && rawEffect.targetId.length > 0 ? rawEffect.targetId : null,
441
+ expectedVisibleRevision: expectedVisibleRevision,
442
+ expectedVisibleHash: expectedVisibleHash,
443
+ repairGuardHash: rawEffect.repairGuardHash,
444
+ payload: {
445
+ targetAnchor: string_(payload.targetAnchor, "targetAnchor"),
446
+ targetVisibleHash: payload.targetVisibleHash,
447
+ createIfMissing: payload.createIfMissing,
448
+ expectedCandidateHash: payload.expectedCandidateHash,
449
+ fields: fields,
450
+ },
451
+ };
452
+ }
453
+
454
+ function validateDeletion_(targetLayout, checked) {
455
+ if (checked.payload.createIfMissing || checked.expectedVisibleRevision < 1 ||
456
+ checked.payload.targetVisibleHash !== checked.expectedVisibleHash) return "invalid_deletion_guard";
457
+ var names = Object.keys(checked.payload.fields).sort();
458
+ var headers = targetLayout.headers.slice().sort();
459
+ if (names.length !== headers.length) return checked.effectKind + "_requires_full_row";
460
+ for (var index = 0; index < headers.length; index += 1) if (names[index] !== headers[index]) return checked.effectKind + "_requires_full_row";
461
+ return null;
462
+ }
463
+
464
+ function result_(checked, status, rowNumber, reason, receipt) {
465
+ return {
466
+ effectId: checked.effectId,
467
+ payloadHash: checked.payloadHash,
468
+ status: status,
469
+ visibleRevision: receipt === null ? null : receipt.visibleRevision,
470
+ visibleHash: receipt === null ? null : receipt.visibleHash,
471
+ snapshotHash: null,
472
+ reason: reason === null ? null : reason,
473
+ postcondition: receipt === null ? "unavailable" : "verified",
474
+ };
475
+ }
476
+
477
+ function makeReceipt_(checked, visibleHash, visibleRevision) {
478
+ return { effectId: checked.effectId, payloadHash: checked.payloadHash, status: "applied", visibleHash: visibleHash, visibleRevision: visibleRevision };
479
+ }
480
+
481
+ function ensureReceiptSheet_(targetSpreadsheet) {
482
+ var target = targetSpreadsheet.getSheetByName(RECEIPT_SHEET_NAME);
483
+ if (target === null) target = targetSpreadsheet.insertSheet(RECEIPT_SHEET_NAME);
484
+ if (target.getLastRow() === 0 && target.getLastColumn() === 0) target.getRange(1, 1, 1, RECEIPT_HEADERS.length).setValues([RECEIPT_HEADERS]);
485
+ var actual = target.getRange(1, 1, 1, RECEIPT_HEADERS.length).getValues()[0];
486
+ RECEIPT_HEADERS.forEach(function (header, index) { if (String(actual[index]) !== header) throw new Error("receipt sheet headers do not match"); });
487
+ try { if (!target.isSheetHidden()) target.hideSheet(); } catch (error) {}
488
+ return target;
489
+ }
490
+
491
+ function readReceipts_(target) {
492
+ var parsed = Object.create(null);
493
+ var lastRow = target.getLastRow();
494
+ if (lastRow < 2) return parsed;
495
+ target.getRange(2, 1, lastRow - 1, RECEIPT_HEADERS.length).getValues().forEach(function (row, index) {
496
+ if (row[0] === "" || row[0] === null) return;
497
+ var effectId = String(row[0]);
498
+ if (parsed[effectId] !== undefined) throw new Error("receipt sheet contains duplicate effectId: " + effectId);
499
+ parsed[effectId] = {
500
+ effectId: effectId,
501
+ payloadHash: string_(row[1], "receipt payloadHash"),
502
+ status: string_(row[2], "receipt status"),
503
+ visibleHash: string_(row[3], "receipt visibleHash"),
504
+ visibleRevision: nonNegativeInteger_(row[4], "receipt visibleRevision"),
505
+ rowNumber: index + 2,
506
+ };
507
+ });
508
+ return parsed;
509
+ }
510
+
511
+ function queueReceipt_(stored, pending, pendingById, receipt) {
512
+ var existing = stored[receipt.effectId] || pendingById[receipt.effectId] || null;
513
+ if (existing !== null) {
514
+ if (existing.payloadHash !== receipt.payloadHash) throw new Error("effect ID cannot be reused with another payload");
515
+ return;
516
+ }
517
+ pendingById[receipt.effectId] = receipt;
518
+ pending.push(receipt);
519
+ }
520
+
521
+ function writeReceipts_(target, values) {
522
+ if (values.length === 0) return;
523
+ var startRow = Math.max(target.getLastRow() + 1, 2);
524
+ var updatedAt = new Date().toISOString();
525
+ target.getRange(startRow, 1, values.length, RECEIPT_HEADERS.length).setValues(values.map(function (receipt) {
526
+ return [receipt.effectId, receipt.payloadHash, receipt.status, receipt.visibleHash, receipt.visibleRevision, updatedAt];
527
+ }));
528
+ }
529
+
530
+ function writeAppendRows_(target, targetLayout, rows, checkboxHeaders) {
531
+ if (rows.length === 0) return;
532
+ rows.sort(function (left, right) { return left.rowNumber - right.rowNumber; });
533
+ target.getRange(rows[0].rowNumber, targetLayout.startColumn, rows.length, targetLayout.columnCount).setValues(rows.map(function (row) {
534
+ return targetLayout.headers.map(function (header) { return toSheetValue_(row.cells[header]); });
535
+ }));
536
+ rows.forEach(function (row) {
537
+ target.getRange(row.rowNumber + ":" + row.rowNumber).addDeveloperMetadata(ANCHOR_KEY, row.physicalAnchor, SpreadsheetApp.DeveloperMetadataVisibility.PROJECT);
538
+ });
539
+ if (Array.isArray(checkboxHeaders)) checkboxHeaders.forEach(function (header) {
540
+ var position = targetLayout.positions[header];
541
+ if (position === undefined) throw new Error("checkbox header is not registered: " + header);
542
+ target.getRange(rows[0].rowNumber, position, rows.length, 1).setDataValidation(
543
+ SpreadsheetApp.newDataValidation().requireCheckbox().setAllowInvalid(false).build(),
544
+ );
545
+ });
546
+ }
547
+
548
+ function writeFieldUpdates_(target, targetLayout, rows) {
549
+ rows.filter(function (row) { return !row.appended && Object.keys(row.writeFields).length > 0; }).forEach(function (row) {
550
+ var fields = Object.keys(row.writeFields).sort(function (left, right) { return targetLayout.positions[left] - targetLayout.positions[right]; });
551
+ var run = [];
552
+ fields.forEach(function (fieldName) {
553
+ if (run.length > 0 && targetLayout.positions[fieldName] !== targetLayout.positions[run[run.length - 1]] + 1) {
554
+ writeFieldRun_(target, targetLayout, row, run);
555
+ run = [];
556
+ }
557
+ run.push(fieldName);
558
+ });
559
+ if (run.length > 0) writeFieldRun_(target, targetLayout, row, run);
560
+ });
561
+ }
562
+
563
+ function writeFieldRun_(target, targetLayout, row, fields) {
564
+ target.getRange(row.rowNumber, targetLayout.positions[fields[0]], 1, fields.length).setValues([
565
+ fields.map(function (fieldName) { return toSheetValue_(row.writeFields[fieldName]); }),
566
+ ]);
567
+ }
568
+
569
+ function readAnchors_(target, rowNumber) {
570
+ return target.getRange(rowNumber + ":" + rowNumber).getDeveloperMetadata().filter(function (metadata) {
571
+ return metadata.getKey() === ANCHOR_KEY;
572
+ }).map(function (metadata) { return String(metadata.getValue()); });
573
+ }
574
+
575
+ function parseRange_(value) {
576
+ if (typeof value !== "string" || !/^[A-Z]+:[A-Z]+$/.test(value)) throw new Error("registeredRange must be an uppercase whole-column range");
577
+ var parts = value.split(":");
578
+ var startColumn = columnNumber_(parts[0]);
579
+ var endColumn = columnNumber_(parts[1]);
580
+ if (endColumn < startColumn) throw new Error("registeredRange end precedes start");
581
+ return { startColumn: startColumn, columnCount: endColumn - startColumn + 1 };
582
+ }
583
+
584
+ function columnNumber_(letters) {
585
+ var value = 0;
586
+ for (var index = 0; index < letters.length; index += 1) value = value * 26 + letters.charCodeAt(index) - 64;
587
+ return value;
588
+ }
589
+
590
+ function normalizeCell_(value) {
591
+ if (value === null) return null;
592
+ requireObject_(value, "normalized cell");
593
+ if (value.kind === "string" && typeof value.value === "string") return { kind: "string", value: normalizeScalarString_(value.value) };
594
+ if (value.kind === "date" && typeof value.value === "string") return { kind: "date", value: value.value };
595
+ if (value.kind === "number" && typeof value.value === "number" && isFinite(value.value)) return { kind: "number", value: value.value };
596
+ if (value.kind === "boolean" && typeof value.value === "boolean") return { kind: "boolean", value: value.value };
597
+ throw new Error("normalized cell is invalid");
598
+ }
599
+
600
+ function normalizedCellFromSheetValue_(value) {
601
+ if (value === "" || value === null) return null;
602
+ if (isDate_(value)) return { kind: "date", value: value.toISOString() };
603
+ if (typeof value === "string") return { kind: "string", value: normalizeScalarString_(value) };
604
+ if (typeof value === "number" && isFinite(value)) return { kind: "number", value: value };
605
+ if (typeof value === "boolean") return { kind: "boolean", value: value };
606
+ throw new Error("Sheet cell cannot be normalized");
607
+ }
608
+
609
+ function toSheetValue_(value) { return value === null ? "" : value.value; }
610
+ function identityFromCell_(value) {
611
+ if (value === null || value === undefined) return null;
612
+ if (typeof value.value === "string" && value.value.length > 0) return value.value;
613
+ if (typeof value.value === "number" && isFinite(value.value)) return String(value.value);
614
+ return null;
615
+ }
616
+ function optionalWireText_(value) {
617
+ if (value === null || value === undefined) return null;
618
+ if (typeof value === "string") return value;
619
+ if (isObject_(value) && (value.kind === "present" || value.kind === "applicable")) return string_(value.value, "optional wire value");
620
+ if (isObject_(value) && (value.kind === "absent" || value.kind === "not_applicable")) return null;
621
+ throw new Error("optional wire value is invalid");
622
+ }
623
+ function isDeletion_(effectKind) { return effectKind === EFFECT_KINDS.RESOLUTION_DELETE || effectKind === EFFECT_KINDS.USER_INPUT_DELETE; }
624
+ function countOperationKinds_(effects) {
625
+ var counts = { append: 0, update: 0, delete: 0 };
626
+ effects.forEach(function (effect) {
627
+ if (effect !== null && isDeletion_(effect.effectKind)) {
628
+ counts.delete += 1;
629
+ return;
630
+ }
631
+ if (effect !== null && effect.payload !== null && effect.payload !== undefined &&
632
+ effect.payload.createIfMissing === true && effect.expectedVisibleRevision === 0 &&
633
+ effect.expectedVisibleHash === "") {
634
+ counts.append += 1;
635
+ return;
636
+ }
637
+ counts.update += 1;
638
+ });
639
+ return counts;
640
+ }
641
+ function operationKinds_(counts) {
642
+ var kinds = [];
643
+ if (counts.append > 0) kinds.push("append");
644
+ if (counts.update > 0) kinds.push("update");
645
+ if (counts.delete > 0) kinds.push("delete");
646
+ return kinds;
647
+ }
648
+ function phase_(name, phaseStartedAt) {
649
+ phases.push({ phase: name, durationMs: Date.now() - phaseStartedAt });
650
+ }
651
+ function appendTimingPhase_(result, phaseName, durationMs) {
652
+ if (!isObject_(result) || !isObject_(result.timing)) return;
653
+ if (!Array.isArray(result.timing.phases)) result.timing.phases = [];
654
+ result.timing.phases.push({ phase: phaseName, durationMs: durationMs });
655
+ result.timing.durationMs = Number(result.timing.durationMs) + durationMs;
656
+ }
657
+ function isBlankRow_(row) { return row.every(function (cell) { return cell === "" || cell === null; }); }
658
+ function isDate_(value) { return Object.prototype.toString.call(value) === "[object Date]" && !isNaN(value.getTime()); }
659
+ function isObject_(value) { return value !== null && typeof value === "object" && !Array.isArray(value); }
660
+ function requireObject_(value, label) { if (!isObject_(value)) throw new Error(label + " must be an object"); return value; }
661
+ function string_(value, label) { if (typeof value !== "string" || value.length === 0) throw new Error(label + " must be a non-empty string"); return value; }
662
+ function stringAllowEmpty_(value, label) { if (typeof value !== "string") throw new Error(label + " must be a string"); return value; }
663
+ function nonNegativeInteger_(value, label) { if (typeof value !== "number" || !isFinite(value) || Math.floor(value) !== value || value < 0) throw new Error(label + " must be a non-negative integer"); return value; }
664
+
665
+ function visibleHash_(fields) {
666
+ return stableHash_({ fields: Object.keys(fields).sort().map(function (fieldName) { return { fieldName: fieldName, value: fields[fieldName] }; }) });
667
+ }
668
+ function stableHash_(value) { return sha256Hex_(stableEncode_(value)); }
669
+ function stableEncode_(value) {
670
+ if (value === null) return "n";
671
+ if (value === true) return "b1";
672
+ if (value === false) return "b0";
673
+ if (typeof value === "number") return stableEncodeNumber_(value);
674
+ if (typeof value === "string") return stableEncodeString_(value);
675
+ if (isObject_(value) && value.kind === "date" && typeof value.value === "string") return "d24:" + value.value;
676
+ if (Array.isArray(value)) return "a" + value.length + "[" + value.map(stableEncode_).join("") + "]";
677
+ if (isObject_(value)) {
678
+ var entries = Object.keys(value).map(function (key) { var normalized = normalizeScalarString_(key); return { key: normalized, bytes: utf8Bytes_(normalized), value: value[key] }; });
679
+ entries.sort(function (left, right) { return compareBytes_(left.bytes, right.bytes); });
680
+ return "o" + entries.length + "{" + entries.map(function (entry) { return "s" + entry.bytes.length + ":" + entry.key + stableEncode_(entry.value); }).join("") + "}";
681
+ }
682
+ throw new Error("stable value is unsupported");
683
+ }
684
+ function stableEncodeNumber_(value) { if (!isFinite(value)) throw new Error("stable number is not finite"); var decimal = value === 0 ? "0" : String(value).replace(/e\+/, "e").replace(/e(-?)0+(\d+)/, "e$1$2"); return "f" + utf8ByteLength_(decimal) + ":" + decimal; }
685
+ function stableEncodeString_(value) { var normalized = normalizeScalarString_(value); return "s" + utf8ByteLength_(normalized) + ":" + normalized; }
686
+ function normalizeScalarString_(value) { return value.normalize("NFC"); }
687
+ function sha256Hex_(value) { return Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, value, Utilities.Charset.UTF_8).map(function (byte) { var unsigned = byte < 0 ? byte + 256 : byte; return ("0" + unsigned.toString(16)).slice(-2); }).join(""); }
688
+ function utf8Bytes_(value) { return Utilities.newBlob(value).getBytes(); }
689
+ function utf8ByteLength_(value) { return utf8Bytes_(value).length; }
690
+ function compareBytes_(left, right) { var count = Math.min(left.length, right.length); for (var index = 0; index < count; index += 1) { var a = left[index] < 0 ? left[index] + 256 : left[index]; var b = right[index] < 0 ? right[index] + 256 : right[index]; if (a !== b) return a - b; } return left.length - right.length; }
691
+ }`;
692
+ //# sourceMappingURL=effectOperationScript.js.map