@marcoappio/marco-config 4.0.26 → 6.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 (465) hide show
  1. package/dist/constants/api.d.ts +9 -0
  2. package/dist/constants/api.d.ts.map +1 -0
  3. package/dist/constants/api.js +8 -0
  4. package/dist/constants/emailAccounts.d.ts.map +1 -1
  5. package/dist/constants/emailAccounts.js +14 -1
  6. package/dist/constants/emailProvider.js +1 -1
  7. package/dist/constants/index.d.ts +11 -3
  8. package/dist/constants/index.d.ts.map +1 -1
  9. package/dist/constants/index.js +7 -5
  10. package/dist/constants/messages.d.ts.map +1 -1
  11. package/dist/constants/oauth.d.ts +2 -2
  12. package/dist/constants/oauth.d.ts.map +1 -1
  13. package/dist/constants/oauth.js +5 -1
  14. package/dist/constants/user.d.ts +1 -1
  15. package/dist/constants/user.d.ts.map +1 -1
  16. package/dist/constants/user.js +1 -1
  17. package/dist/index.d.ts +6 -5
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +6 -5
  20. package/dist/marcoPublicConfig.d.ts +36 -0
  21. package/dist/marcoPublicConfig.d.ts.map +1 -0
  22. package/dist/marcoPublicConfig.js +99 -0
  23. package/dist/schemas/app.d.ts +2 -2
  24. package/dist/schemas/app.d.ts.map +1 -1
  25. package/dist/schemas/app.js +3 -3
  26. package/dist/schemas/auth.d.ts +1 -1
  27. package/dist/schemas/auth.d.ts.map +1 -1
  28. package/dist/schemas/auth.js +2 -2
  29. package/dist/schemas/boolean.d.ts +5 -0
  30. package/dist/schemas/boolean.d.ts.map +1 -0
  31. package/dist/schemas/boolean.js +4 -0
  32. package/dist/schemas/emailAccount.d.ts +10 -10
  33. package/dist/schemas/emailAccount.d.ts.map +1 -1
  34. package/dist/schemas/emailAccount.js +13 -13
  35. package/dist/schemas/id.d.ts +1 -6
  36. package/dist/schemas/id.d.ts.map +1 -1
  37. package/dist/schemas/id.js +1 -2
  38. package/dist/schemas/index.d.ts +429 -60
  39. package/dist/schemas/index.d.ts.map +1 -1
  40. package/dist/schemas/index.js +21 -9
  41. package/dist/schemas/labels.d.ts +5 -0
  42. package/dist/schemas/labels.d.ts.map +1 -0
  43. package/dist/schemas/labels.js +5 -0
  44. package/dist/schemas/models/account.d.ts +3 -3
  45. package/dist/schemas/models/account.d.ts.map +1 -1
  46. package/dist/schemas/models/account.js +8 -8
  47. package/dist/schemas/models/contact.d.ts +2 -2
  48. package/dist/schemas/models/contact.d.ts.map +1 -1
  49. package/dist/schemas/models/contact.js +4 -4
  50. package/dist/schemas/models/draft.d.ts +9 -9
  51. package/dist/schemas/models/draft.d.ts.map +1 -1
  52. package/dist/schemas/models/draft.js +9 -9
  53. package/dist/schemas/models/index.d.ts +5 -5
  54. package/dist/schemas/models/index.d.ts.map +1 -1
  55. package/dist/schemas/models/index.js +5 -5
  56. package/dist/schemas/models/thread.d.ts +46 -28
  57. package/dist/schemas/models/thread.d.ts.map +1 -1
  58. package/dist/schemas/models/thread.js +12 -11
  59. package/dist/schemas/models/user.d.ts +30 -3
  60. package/dist/schemas/models/user.d.ts.map +1 -1
  61. package/dist/schemas/models/user.js +21 -5
  62. package/dist/schemas/mutators/index.d.ts +2 -0
  63. package/dist/schemas/mutators/index.d.ts.map +1 -0
  64. package/dist/schemas/mutators/index.js +1 -0
  65. package/dist/schemas/mutators/mutatorSchemas.d.ts +314 -0
  66. package/dist/schemas/mutators/mutatorSchemas.d.ts.map +1 -0
  67. package/dist/schemas/mutators/mutatorSchemas.js +229 -0
  68. package/dist/schemas/number.d.ts +5 -3
  69. package/dist/schemas/number.d.ts.map +1 -1
  70. package/dist/schemas/number.js +5 -4
  71. package/dist/schemas/oauth.d.ts +2 -2
  72. package/dist/schemas/oauth.d.ts.map +1 -1
  73. package/dist/schemas/oauth.js +3 -3
  74. package/dist/schemas/paginatedResponse.d.ts +10 -0
  75. package/dist/schemas/paginatedResponse.d.ts.map +1 -0
  76. package/dist/schemas/paginatedResponse.js +5 -0
  77. package/dist/schemas/pushNotifications.d.ts +3 -3
  78. package/dist/schemas/pushNotifications.d.ts.map +1 -1
  79. package/dist/schemas/pushNotifications.js +4 -3
  80. package/dist/schemas/string.d.ts +4 -2
  81. package/dist/schemas/string.d.ts.map +1 -1
  82. package/dist/schemas/string.js +5 -4
  83. package/dist/schemas/websocket.d.ts +14 -0
  84. package/dist/schemas/websocket.d.ts.map +1 -0
  85. package/dist/schemas/websocket.js +10 -0
  86. package/dist/sdk/endpoints/createEndpointConfig.d.ts +12 -0
  87. package/dist/sdk/endpoints/createEndpointConfig.d.ts.map +1 -0
  88. package/dist/sdk/endpoints/createEndpointConfig.js +21 -0
  89. package/dist/sdk/endpoints/index.d.ts +255 -0
  90. package/dist/sdk/endpoints/index.d.ts.map +1 -0
  91. package/dist/sdk/endpoints/index.js +6 -0
  92. package/dist/sdk/endpoints/private/draftAttachment/index.d.ts +31 -0
  93. package/dist/sdk/endpoints/private/draftAttachment/index.d.ts.map +1 -0
  94. package/dist/sdk/endpoints/private/draftAttachment/index.js +4 -0
  95. package/dist/sdk/endpoints/private/draftAttachment/uploadDraftAttachment.d.ts +30 -0
  96. package/dist/sdk/endpoints/private/draftAttachment/uploadDraftAttachment.d.ts.map +1 -0
  97. package/dist/sdk/endpoints/private/draftAttachment/uploadDraftAttachment.js +18 -0
  98. package/dist/sdk/endpoints/private/emailMessage/getEmailMessageAttachment.d.ts +21 -0
  99. package/dist/sdk/endpoints/private/emailMessage/getEmailMessageAttachment.d.ts.map +1 -0
  100. package/dist/sdk/endpoints/private/emailMessage/getEmailMessageAttachment.js +16 -0
  101. package/dist/sdk/endpoints/private/emailMessage/index.d.ts +22 -0
  102. package/dist/sdk/endpoints/private/emailMessage/index.d.ts.map +1 -0
  103. package/dist/sdk/endpoints/private/emailMessage/index.js +4 -0
  104. package/dist/sdk/endpoints/private/index.d.ts +103 -0
  105. package/dist/sdk/endpoints/private/index.d.ts.map +1 -0
  106. package/dist/sdk/endpoints/private/index.js +12 -0
  107. package/dist/sdk/endpoints/private/models/account/getAccounts.d.ts +70 -0
  108. package/dist/sdk/endpoints/private/models/account/getAccounts.d.ts.map +1 -0
  109. package/dist/sdk/endpoints/private/models/account/getAccounts.js +26 -0
  110. package/dist/sdk/endpoints/private/models/account/index.d.ts +2 -0
  111. package/dist/sdk/endpoints/private/models/account/index.d.ts.map +1 -0
  112. package/dist/sdk/endpoints/private/models/account/index.js +1 -0
  113. package/dist/sdk/endpoints/private/models/contact/getContacts.d.ts +41 -0
  114. package/dist/sdk/endpoints/private/models/contact/getContacts.d.ts.map +1 -0
  115. package/dist/sdk/endpoints/private/models/contact/getContacts.js +26 -0
  116. package/dist/sdk/endpoints/private/models/contact/index.d.ts +2 -0
  117. package/dist/sdk/endpoints/private/models/contact/index.d.ts.map +1 -0
  118. package/dist/sdk/endpoints/private/models/contact/index.js +1 -0
  119. package/dist/sdk/endpoints/private/models/draft/getDrafts.d.ts +62 -0
  120. package/dist/sdk/endpoints/private/models/draft/getDrafts.d.ts.map +1 -0
  121. package/dist/sdk/endpoints/private/models/draft/getDrafts.js +25 -0
  122. package/dist/sdk/endpoints/private/models/draft/index.d.ts +2 -0
  123. package/dist/sdk/endpoints/private/models/draft/index.d.ts.map +1 -0
  124. package/dist/sdk/endpoints/private/models/draft/index.js +1 -0
  125. package/dist/sdk/endpoints/private/models/index.d.ts +13 -0
  126. package/dist/sdk/endpoints/private/models/index.d.ts.map +1 -0
  127. package/dist/sdk/endpoints/private/models/index.js +12 -0
  128. package/dist/sdk/endpoints/private/models/thread/getThread.d.ts +63 -0
  129. package/dist/sdk/endpoints/private/models/thread/getThread.d.ts.map +1 -0
  130. package/dist/sdk/endpoints/private/models/thread/getThread.js +17 -0
  131. package/dist/sdk/endpoints/private/models/thread/getThreadByMessageId.d.ts +63 -0
  132. package/dist/sdk/endpoints/private/models/thread/getThreadByMessageId.d.ts.map +1 -0
  133. package/dist/sdk/endpoints/private/models/thread/getThreadByMessageId.js +17 -0
  134. package/dist/sdk/endpoints/private/models/thread/getThreadList.d.ts +79 -0
  135. package/dist/sdk/endpoints/private/models/thread/getThreadList.d.ts.map +1 -0
  136. package/dist/sdk/endpoints/private/models/thread/getThreadList.js +47 -0
  137. package/dist/sdk/endpoints/private/models/thread/getThreads.d.ts +83 -0
  138. package/dist/sdk/endpoints/private/models/thread/getThreads.d.ts.map +1 -0
  139. package/dist/sdk/endpoints/private/models/thread/getThreads.js +36 -0
  140. package/dist/sdk/endpoints/private/models/thread/index.d.ts +5 -0
  141. package/dist/sdk/endpoints/private/models/thread/index.d.ts.map +1 -0
  142. package/dist/sdk/endpoints/private/models/thread/index.js +4 -0
  143. package/dist/sdk/endpoints/private/models/user/getUser.d.ts +34 -0
  144. package/dist/sdk/endpoints/private/models/user/getUser.d.ts.map +1 -0
  145. package/dist/sdk/endpoints/private/models/user/getUser.js +16 -0
  146. package/dist/sdk/endpoints/private/models/user/index.d.ts +2 -0
  147. package/dist/sdk/endpoints/private/models/user/index.d.ts.map +1 -0
  148. package/dist/sdk/endpoints/private/models/user/index.js +1 -0
  149. package/dist/sdk/endpoints/private/mutations/account/createAccount.d.ts +35 -0
  150. package/dist/sdk/endpoints/private/mutations/account/createAccount.d.ts.map +1 -0
  151. package/dist/sdk/endpoints/private/mutations/account/createAccount.js +18 -0
  152. package/dist/sdk/endpoints/private/mutations/account/createAlias.d.ts +42 -0
  153. package/dist/sdk/endpoints/private/mutations/account/createAlias.d.ts.map +1 -0
  154. package/dist/sdk/endpoints/private/mutations/account/createAlias.js +19 -0
  155. package/dist/sdk/endpoints/private/mutations/account/createLabel.d.ts +44 -0
  156. package/dist/sdk/endpoints/private/mutations/account/createLabel.d.ts.map +1 -0
  157. package/dist/sdk/endpoints/private/mutations/account/createLabel.js +20 -0
  158. package/dist/sdk/endpoints/private/mutations/account/deleteAccount.d.ts +27 -0
  159. package/dist/sdk/endpoints/private/mutations/account/deleteAccount.d.ts.map +1 -0
  160. package/dist/sdk/endpoints/private/mutations/account/deleteAccount.js +18 -0
  161. package/dist/sdk/endpoints/private/mutations/account/deleteAlias.d.ts +33 -0
  162. package/dist/sdk/endpoints/private/mutations/account/deleteAlias.d.ts.map +1 -0
  163. package/dist/sdk/endpoints/private/mutations/account/deleteAlias.js +19 -0
  164. package/dist/sdk/endpoints/private/mutations/account/deleteLabel.d.ts +43 -0
  165. package/dist/sdk/endpoints/private/mutations/account/deleteLabel.d.ts.map +1 -0
  166. package/dist/sdk/endpoints/private/mutations/account/deleteLabel.js +20 -0
  167. package/dist/sdk/endpoints/private/mutations/account/index.d.ts +14 -0
  168. package/dist/sdk/endpoints/private/mutations/account/index.d.ts.map +1 -0
  169. package/dist/sdk/endpoints/private/mutations/account/index.js +13 -0
  170. package/dist/sdk/endpoints/private/mutations/account/renameLabel.d.ts +49 -0
  171. package/dist/sdk/endpoints/private/mutations/account/renameLabel.d.ts.map +1 -0
  172. package/dist/sdk/endpoints/private/mutations/account/renameLabel.js +21 -0
  173. package/dist/sdk/endpoints/private/mutations/account/setAliasName.d.ts +44 -0
  174. package/dist/sdk/endpoints/private/mutations/account/setAliasName.d.ts.map +1 -0
  175. package/dist/sdk/endpoints/private/mutations/account/setAliasName.js +20 -0
  176. package/dist/sdk/endpoints/private/mutations/account/setAliasPrimary.d.ts +33 -0
  177. package/dist/sdk/endpoints/private/mutations/account/setAliasPrimary.d.ts.map +1 -0
  178. package/dist/sdk/endpoints/private/mutations/account/setAliasPrimary.js +19 -0
  179. package/dist/sdk/endpoints/private/mutations/account/setAliasSignature.d.ts +44 -0
  180. package/dist/sdk/endpoints/private/mutations/account/setAliasSignature.d.ts.map +1 -0
  181. package/dist/sdk/endpoints/private/mutations/account/setAliasSignature.js +20 -0
  182. package/dist/sdk/endpoints/private/mutations/account/setConnectionConfigImap.d.ts +49 -0
  183. package/dist/sdk/endpoints/private/mutations/account/setConnectionConfigImap.d.ts.map +1 -0
  184. package/dist/sdk/endpoints/private/mutations/account/setConnectionConfigImap.js +19 -0
  185. package/dist/sdk/endpoints/private/mutations/account/setConnectionConfigOauth.d.ts +42 -0
  186. package/dist/sdk/endpoints/private/mutations/account/setConnectionConfigOauth.d.ts.map +1 -0
  187. package/dist/sdk/endpoints/private/mutations/account/setConnectionConfigOauth.js +19 -0
  188. package/dist/sdk/endpoints/private/mutations/account/setSettings.d.ts +39 -0
  189. package/dist/sdk/endpoints/private/mutations/account/setSettings.d.ts.map +1 -0
  190. package/dist/sdk/endpoints/private/mutations/account/setSettings.js +19 -0
  191. package/dist/sdk/endpoints/private/mutations/draft/cancelSend.d.ts +28 -0
  192. package/dist/sdk/endpoints/private/mutations/draft/cancelSend.d.ts.map +1 -0
  193. package/dist/sdk/endpoints/private/mutations/draft/cancelSend.js +18 -0
  194. package/dist/sdk/endpoints/private/mutations/draft/createAttachment.d.ts +45 -0
  195. package/dist/sdk/endpoints/private/mutations/draft/createAttachment.d.ts.map +1 -0
  196. package/dist/sdk/endpoints/private/mutations/draft/createAttachment.js +19 -0
  197. package/dist/sdk/endpoints/private/mutations/draft/createDraft.d.ts +60 -0
  198. package/dist/sdk/endpoints/private/mutations/draft/createDraft.d.ts.map +1 -0
  199. package/dist/sdk/endpoints/private/mutations/draft/createDraft.js +19 -0
  200. package/dist/sdk/endpoints/private/mutations/draft/deleteAttachment.d.ts +34 -0
  201. package/dist/sdk/endpoints/private/mutations/draft/deleteAttachment.d.ts.map +1 -0
  202. package/dist/sdk/endpoints/private/mutations/draft/deleteAttachment.js +19 -0
  203. package/dist/sdk/endpoints/private/mutations/draft/deleteDraft.d.ts +27 -0
  204. package/dist/sdk/endpoints/private/mutations/draft/deleteDraft.d.ts.map +1 -0
  205. package/dist/sdk/endpoints/private/mutations/draft/deleteDraft.js +18 -0
  206. package/dist/sdk/endpoints/private/mutations/draft/index.d.ts +10 -0
  207. package/dist/sdk/endpoints/private/mutations/draft/index.d.ts.map +1 -0
  208. package/dist/sdk/endpoints/private/mutations/draft/index.js +9 -0
  209. package/dist/sdk/endpoints/private/mutations/draft/replaceContent.d.ts +39 -0
  210. package/dist/sdk/endpoints/private/mutations/draft/replaceContent.d.ts.map +1 -0
  211. package/dist/sdk/endpoints/private/mutations/draft/replaceContent.js +19 -0
  212. package/dist/sdk/endpoints/private/mutations/draft/scheduleSend.d.ts +45 -0
  213. package/dist/sdk/endpoints/private/mutations/draft/scheduleSend.d.ts.map +1 -0
  214. package/dist/sdk/endpoints/private/mutations/draft/scheduleSend.js +19 -0
  215. package/dist/sdk/endpoints/private/mutations/draft/setEnvelope.d.ts +85 -0
  216. package/dist/sdk/endpoints/private/mutations/draft/setEnvelope.d.ts.map +1 -0
  217. package/dist/sdk/endpoints/private/mutations/draft/setEnvelope.js +19 -0
  218. package/dist/sdk/endpoints/private/mutations/draft/setFrom.d.ts +47 -0
  219. package/dist/sdk/endpoints/private/mutations/draft/setFrom.d.ts.map +1 -0
  220. package/dist/sdk/endpoints/private/mutations/draft/setFrom.js +20 -0
  221. package/dist/sdk/endpoints/private/mutations/index.d.ts +11 -0
  222. package/dist/sdk/endpoints/private/mutations/index.d.ts.map +1 -0
  223. package/dist/sdk/endpoints/private/mutations/index.js +10 -0
  224. package/dist/sdk/endpoints/private/mutations/thread/addLabel.d.ts +40 -0
  225. package/dist/sdk/endpoints/private/mutations/thread/addLabel.d.ts.map +1 -0
  226. package/dist/sdk/endpoints/private/mutations/thread/addLabel.js +19 -0
  227. package/dist/sdk/endpoints/private/mutations/thread/deleteThreads.d.ts +34 -0
  228. package/dist/sdk/endpoints/private/mutations/thread/deleteThreads.d.ts.map +1 -0
  229. package/dist/sdk/endpoints/private/mutations/thread/deleteThreads.js +18 -0
  230. package/dist/sdk/endpoints/private/mutations/thread/index.d.ts +11 -0
  231. package/dist/sdk/endpoints/private/mutations/thread/index.d.ts.map +1 -0
  232. package/dist/sdk/endpoints/private/mutations/thread/index.js +10 -0
  233. package/dist/sdk/endpoints/private/mutations/thread/removeLabel.d.ts +40 -0
  234. package/dist/sdk/endpoints/private/mutations/thread/removeLabel.d.ts.map +1 -0
  235. package/dist/sdk/endpoints/private/mutations/thread/removeLabel.js +19 -0
  236. package/dist/sdk/endpoints/private/mutations/thread/setArchive.d.ts +34 -0
  237. package/dist/sdk/endpoints/private/mutations/thread/setArchive.d.ts.map +1 -0
  238. package/dist/sdk/endpoints/private/mutations/thread/setArchive.js +18 -0
  239. package/dist/sdk/endpoints/private/mutations/thread/setFlagged.d.ts +35 -0
  240. package/dist/sdk/endpoints/private/mutations/thread/setFlagged.d.ts.map +1 -0
  241. package/dist/sdk/endpoints/private/mutations/thread/setFlagged.js +18 -0
  242. package/dist/sdk/endpoints/private/mutations/thread/setInbox.d.ts +34 -0
  243. package/dist/sdk/endpoints/private/mutations/thread/setInbox.d.ts.map +1 -0
  244. package/dist/sdk/endpoints/private/mutations/thread/setInbox.js +18 -0
  245. package/dist/sdk/endpoints/private/mutations/thread/setSeen.d.ts +35 -0
  246. package/dist/sdk/endpoints/private/mutations/thread/setSeen.d.ts.map +1 -0
  247. package/dist/sdk/endpoints/private/mutations/thread/setSeen.js +18 -0
  248. package/dist/sdk/endpoints/private/mutations/thread/setSnooze.d.ts +35 -0
  249. package/dist/sdk/endpoints/private/mutations/thread/setSnooze.d.ts.map +1 -0
  250. package/dist/sdk/endpoints/private/mutations/thread/setSnooze.js +18 -0
  251. package/dist/sdk/endpoints/private/mutations/thread/setSpam.d.ts +34 -0
  252. package/dist/sdk/endpoints/private/mutations/thread/setSpam.d.ts.map +1 -0
  253. package/dist/sdk/endpoints/private/mutations/thread/setSpam.js +18 -0
  254. package/dist/sdk/endpoints/private/mutations/thread/setTrash.d.ts +34 -0
  255. package/dist/sdk/endpoints/private/mutations/thread/setTrash.d.ts.map +1 -0
  256. package/dist/sdk/endpoints/private/mutations/thread/setTrash.js +18 -0
  257. package/dist/sdk/endpoints/private/mutations/user/createFeedback.d.ts +34 -0
  258. package/dist/sdk/endpoints/private/mutations/user/createFeedback.d.ts.map +1 -0
  259. package/dist/sdk/endpoints/private/mutations/user/createFeedback.js +18 -0
  260. package/dist/sdk/endpoints/private/mutations/user/createView.d.ts +38 -0
  261. package/dist/sdk/endpoints/private/mutations/user/createView.d.ts.map +1 -0
  262. package/dist/sdk/endpoints/private/mutations/user/createView.js +18 -0
  263. package/dist/sdk/endpoints/private/mutations/user/deletePushToken.d.ts +23 -0
  264. package/dist/sdk/endpoints/private/mutations/user/deletePushToken.d.ts.map +1 -0
  265. package/dist/sdk/endpoints/private/mutations/user/deletePushToken.js +17 -0
  266. package/dist/sdk/endpoints/private/mutations/user/deleteView.d.ts +28 -0
  267. package/dist/sdk/endpoints/private/mutations/user/deleteView.d.ts.map +1 -0
  268. package/dist/sdk/endpoints/private/mutations/user/deleteView.js +18 -0
  269. package/dist/sdk/endpoints/private/mutations/user/index.d.ts +9 -0
  270. package/dist/sdk/endpoints/private/mutations/user/index.d.ts.map +1 -0
  271. package/dist/sdk/endpoints/private/mutations/user/index.js +8 -0
  272. package/dist/sdk/endpoints/private/mutations/user/setFeedbackModalShown.d.ts +32 -0
  273. package/dist/sdk/endpoints/private/mutations/user/setFeedbackModalShown.d.ts.map +1 -0
  274. package/dist/sdk/endpoints/private/mutations/user/setFeedbackModalShown.js +18 -0
  275. package/dist/sdk/endpoints/private/mutations/user/setPushToken.d.ts +37 -0
  276. package/dist/sdk/endpoints/private/mutations/user/setPushToken.d.ts.map +1 -0
  277. package/dist/sdk/endpoints/private/mutations/user/setPushToken.js +18 -0
  278. package/dist/sdk/endpoints/private/mutations/user/setSettingsName.d.ts +33 -0
  279. package/dist/sdk/endpoints/private/mutations/user/setSettingsName.d.ts.map +1 -0
  280. package/dist/sdk/endpoints/private/mutations/user/setSettingsName.js +18 -0
  281. package/dist/sdk/endpoints/private/mutations/user/updateView.d.ts +43 -0
  282. package/dist/sdk/endpoints/private/mutations/user/updateView.d.ts.map +1 -0
  283. package/dist/sdk/endpoints/private/mutations/user/updateView.js +19 -0
  284. package/dist/sdk/endpoints/private/user/deleteUser.d.ts +10 -0
  285. package/dist/sdk/endpoints/private/user/deleteUser.d.ts.map +1 -0
  286. package/dist/sdk/endpoints/private/user/deleteUser.js +13 -0
  287. package/dist/sdk/endpoints/private/user/index.d.ts +37 -0
  288. package/dist/sdk/endpoints/private/user/index.d.ts.map +1 -0
  289. package/dist/sdk/endpoints/private/user/index.js +6 -0
  290. package/dist/sdk/endpoints/private/user/uploadProfilePicture.d.ts +28 -0
  291. package/dist/sdk/endpoints/private/user/uploadProfilePicture.d.ts.map +1 -0
  292. package/dist/sdk/endpoints/private/user/uploadProfilePicture.js +19 -0
  293. package/dist/sdk/endpoints/public/auth/index.d.ts +133 -0
  294. package/dist/sdk/endpoints/public/auth/index.d.ts.map +1 -0
  295. package/dist/sdk/endpoints/public/auth/index.js +8 -0
  296. package/dist/sdk/endpoints/public/auth/refreshAuth.d.ts +41 -0
  297. package/dist/sdk/endpoints/public/auth/refreshAuth.d.ts.map +1 -0
  298. package/dist/sdk/endpoints/public/auth/refreshAuth.js +33 -0
  299. package/dist/sdk/endpoints/public/auth/sendAuthCode.d.ts +27 -0
  300. package/dist/sdk/endpoints/public/auth/sendAuthCode.d.ts.map +1 -0
  301. package/dist/sdk/endpoints/public/auth/sendAuthCode.js +19 -0
  302. package/dist/sdk/endpoints/public/auth/verifyAuthCode.d.ts +68 -0
  303. package/dist/sdk/endpoints/public/auth/verifyAuthCode.d.ts.map +1 -0
  304. package/dist/sdk/endpoints/public/auth/verifyAuthCode.js +36 -0
  305. package/dist/sdk/endpoints/public/config/index.d.ts +10 -0
  306. package/dist/sdk/endpoints/public/config/index.d.ts.map +1 -0
  307. package/dist/sdk/endpoints/public/config/index.js +15 -0
  308. package/dist/sdk/endpoints/public/healthcheck/index.d.ts +8 -0
  309. package/dist/sdk/endpoints/public/healthcheck/index.d.ts.map +1 -0
  310. package/dist/sdk/endpoints/public/healthcheck/index.js +10 -0
  311. package/dist/sdk/endpoints/public/index.d.ts +149 -0
  312. package/dist/sdk/endpoints/public/index.d.ts.map +1 -0
  313. package/dist/sdk/endpoints/public/index.js +8 -0
  314. package/dist/sdk/index.d.ts +426 -0
  315. package/dist/sdk/index.d.ts.map +1 -0
  316. package/dist/sdk/index.js +6 -0
  317. package/dist/sdk/validation/errors.d.ts +326 -0
  318. package/dist/sdk/validation/errors.d.ts.map +1 -0
  319. package/dist/sdk/validation/errors.js +140 -0
  320. package/dist/sdk/validation/index.d.ts +172 -0
  321. package/dist/sdk/validation/index.d.ts.map +1 -0
  322. package/dist/sdk/validation/index.js +3 -0
  323. package/dist/sdk/validation/utils/flattenRequirements/flattenRequirements.d.ts +11 -0
  324. package/dist/sdk/validation/utils/flattenRequirements/flattenRequirements.d.ts.map +1 -0
  325. package/dist/sdk/validation/utils/flattenRequirements/flattenRequirements.js +22 -0
  326. package/dist/sdk/validation/utils/flattenRequirements/index.d.ts +2 -0
  327. package/dist/sdk/validation/utils/flattenRequirements/index.d.ts.map +1 -0
  328. package/dist/sdk/validation/utils/flattenRequirements/index.js +1 -0
  329. package/dist/sdk/validation/utils/index.d.ts +7 -0
  330. package/dist/sdk/validation/utils/index.d.ts.map +1 -0
  331. package/dist/sdk/validation/utils/index.js +4 -0
  332. package/dist/types/AuthData.d.ts +4 -0
  333. package/dist/types/AuthData.d.ts.map +1 -0
  334. package/dist/types/AuthData.js +1 -0
  335. package/dist/types/DraftAttachmentUploadStatus.d.ts +1 -1
  336. package/dist/types/DraftAttachmentUploadStatus.d.ts.map +1 -1
  337. package/dist/types/DraftStatus.d.ts +1 -1
  338. package/dist/types/DraftStatus.d.ts.map +1 -1
  339. package/dist/types/DraftType.d.ts +1 -1
  340. package/dist/types/DraftType.d.ts.map +1 -1
  341. package/dist/types/Endpoint.d.ts +25 -0
  342. package/dist/types/Endpoint.d.ts.map +1 -0
  343. package/dist/types/Endpoint.js +1 -0
  344. package/dist/types/IMAPConnectionStatus.d.ts +1 -1
  345. package/dist/types/IMAPConnectionStatus.d.ts.map +1 -1
  346. package/dist/types/IMAPSourceLocation.d.ts +1 -1
  347. package/dist/types/LabelSpecialUse.d.ts +1 -1
  348. package/dist/types/LabelSpecialUse.d.ts.map +1 -1
  349. package/dist/types/MarcoPlatform.d.ts +1 -1
  350. package/dist/types/MarcoPlatform.d.ts.map +1 -1
  351. package/dist/types/MessageRecipientType.d.ts +1 -1
  352. package/dist/types/MessageRecipientType.d.ts.map +1 -1
  353. package/dist/types/OAuthProvider.d.ts +1 -1
  354. package/dist/types/OAuthProvider.d.ts.map +1 -1
  355. package/dist/types/PokeEvent.d.ts +6 -0
  356. package/dist/types/PokeEvent.d.ts.map +1 -0
  357. package/dist/types/PokeEvent.js +1 -0
  358. package/dist/types/SDKError.d.ts +4 -0
  359. package/dist/types/SDKError.d.ts.map +1 -0
  360. package/dist/types/SDKError.js +1 -0
  361. package/dist/types/UserSettings.d.ts +15 -16
  362. package/dist/types/UserSettings.d.ts.map +1 -1
  363. package/dist/types/UserSettings.js +29 -15
  364. package/dist/types/index.d.ts +15 -11
  365. package/dist/types/index.d.ts.map +1 -1
  366. package/dist/types/index.js +15 -11
  367. package/dist/utils/accounts/generateAccountColor.d.ts.map +1 -1
  368. package/dist/utils/accounts/generateAccountColor.js +15 -10
  369. package/dist/utils/accounts/index.d.ts +3 -1
  370. package/dist/utils/accounts/index.d.ts.map +1 -1
  371. package/dist/utils/accounts/index.js +4 -1
  372. package/dist/utils/index.d.ts +3 -3
  373. package/dist/utils/index.d.ts.map +1 -1
  374. package/dist/utils/index.js +3 -3
  375. package/dist/utils/labels/index.d.ts +3 -2
  376. package/dist/utils/labels/index.d.ts.map +1 -1
  377. package/dist/utils/labels/index.js +4 -1
  378. package/dist/utils/threads/index.d.ts +4 -2
  379. package/dist/utils/threads/index.d.ts.map +1 -1
  380. package/dist/utils/threads/index.js +6 -2
  381. package/dist/utils/threads/parseLabelIdList/index.d.ts +2 -0
  382. package/dist/utils/threads/parseLabelIdList/index.d.ts.map +1 -0
  383. package/dist/utils/threads/parseLabelIdList/index.js +1 -0
  384. package/dist/utils/threads/processSearchTerm/index.d.ts +2 -0
  385. package/dist/utils/threads/processSearchTerm/index.d.ts.map +1 -0
  386. package/dist/utils/threads/processSearchTerm/index.js +1 -0
  387. package/package.json +13 -28
  388. package/dist/appwrite/appwrite.d.ts +0 -77
  389. package/dist/appwrite/appwrite.d.ts.map +0 -1
  390. package/dist/appwrite/appwrite.js +0 -61
  391. package/dist/appwrite/appwrite.test.d.ts +0 -2
  392. package/dist/appwrite/appwrite.test.d.ts.map +0 -1
  393. package/dist/appwrite/appwrite.test.js +0 -901
  394. package/dist/appwrite/commands.d.ts +0 -5093
  395. package/dist/appwrite/commands.d.ts.map +0 -1
  396. package/dist/appwrite/commands.js +0 -208
  397. package/dist/appwrite/commands.test.d.ts +0 -2
  398. package/dist/appwrite/commands.test.d.ts.map +0 -1
  399. package/dist/appwrite/commands.test.js +0 -425
  400. package/dist/appwrite/decodedSchemas.d.ts +0 -35
  401. package/dist/appwrite/decodedSchemas.d.ts.map +0 -1
  402. package/dist/appwrite/decodedSchemas.js +0 -18
  403. package/dist/appwrite/functions.d.ts +0 -2806
  404. package/dist/appwrite/functions.d.ts.map +0 -1
  405. package/dist/appwrite/functions.js +0 -192
  406. package/dist/appwrite/functions.test.d.ts +0 -2
  407. package/dist/appwrite/functions.test.d.ts.map +0 -1
  408. package/dist/appwrite/functions.test.js +0 -370
  409. package/dist/appwrite/index.d.ts +0 -8
  410. package/dist/appwrite/index.d.ts.map +0 -1
  411. package/dist/appwrite/index.js +0 -5
  412. package/dist/appwrite/queryContracts/queryContracts.d.ts +0 -392
  413. package/dist/appwrite/queryContracts/queryContracts.d.ts.map +0 -1
  414. package/dist/appwrite/queryContracts/queryContracts.js +0 -299
  415. package/dist/appwrite/queryContracts/queryContracts.test.d.ts +0 -2
  416. package/dist/appwrite/queryContracts/queryContracts.test.d.ts.map +0 -1
  417. package/dist/appwrite/queryContracts/queryContracts.test.js +0 -39
  418. package/dist/appwrite/tableContract/identity.d.ts +0 -207
  419. package/dist/appwrite/tableContract/identity.d.ts.map +0 -1
  420. package/dist/appwrite/tableContract/identity.js +0 -169
  421. package/dist/appwrite/tableContract/index.d.ts +0 -3125
  422. package/dist/appwrite/tableContract/index.d.ts.map +0 -1
  423. package/dist/appwrite/tableContract/index.js +0 -94
  424. package/dist/appwrite/tableContract/index.test.d.ts +0 -2
  425. package/dist/appwrite/tableContract/index.test.d.ts.map +0 -1
  426. package/dist/appwrite/tableContract/index.test.js +0 -150
  427. package/dist/appwrite/tableContract/mailbox.d.ts +0 -276
  428. package/dist/appwrite/tableContract/mailbox.d.ts.map +0 -1
  429. package/dist/appwrite/tableContract/mailbox.js +0 -261
  430. package/dist/appwrite/tableContract/operational.d.ts +0 -247
  431. package/dist/appwrite/tableContract/operational.d.ts.map +0 -1
  432. package/dist/appwrite/tableContract/operational.js +0 -167
  433. package/dist/appwrite/tableContract/shared.d.ts +0 -145
  434. package/dist/appwrite/tableContract/shared.d.ts.map +0 -1
  435. package/dist/appwrite/tableContract/shared.js +0 -83
  436. package/dist/index.test.d.ts +0 -2
  437. package/dist/index.test.d.ts.map +0 -1
  438. package/dist/index.test.js +0 -106
  439. package/dist/schemas/models/mailboxAddress.test.d.ts +0 -2
  440. package/dist/schemas/models/mailboxAddress.test.d.ts.map +0 -1
  441. package/dist/schemas/models/mailboxAddress.test.js +0 -31
  442. package/dist/schemas/models/numericSemantics.test.d.ts +0 -2
  443. package/dist/schemas/models/numericSemantics.test.d.ts.map +0 -1
  444. package/dist/schemas/models/numericSemantics.test.js +0 -24
  445. package/dist/schemas/models/user.test.d.ts +0 -2
  446. package/dist/schemas/models/user.test.d.ts.map +0 -1
  447. package/dist/schemas/models/user.test.js +0 -18
  448. package/dist/schemas/scalars.d.ts +0 -13
  449. package/dist/schemas/scalars.d.ts.map +0 -1
  450. package/dist/schemas/scalars.js +0 -15
  451. package/dist/schemas/scalars.test.d.ts +0 -2
  452. package/dist/schemas/scalars.test.d.ts.map +0 -1
  453. package/dist/schemas/scalars.test.js +0 -44
  454. package/dist/schemas/schemaValues.test.d.ts +0 -2
  455. package/dist/schemas/schemaValues.test.d.ts.map +0 -1
  456. package/dist/schemas/schemaValues.test.js +0 -21
  457. package/dist/utils/threads/parseLabelIdList/parseLabelIdList.test.d.ts +0 -2
  458. package/dist/utils/threads/parseLabelIdList/parseLabelIdList.test.d.ts.map +0 -1
  459. package/dist/utils/threads/parseLabelIdList/parseLabelIdList.test.js +0 -18
  460. package/dist/utils/threads/processSearchTerm/processSearchTerm.test.d.ts +0 -2
  461. package/dist/utils/threads/processSearchTerm/processSearchTerm.test.d.ts.map +0 -1
  462. package/dist/utils/threads/processSearchTerm/processSearchTerm.test.js +0 -38
  463. package/dist/utils/valibot/index.d.ts +0 -3
  464. package/dist/utils/valibot/index.d.ts.map +0 -1
  465. package/dist/utils/valibot/index.js +0 -2
@@ -1,901 +0,0 @@
1
- import { describe, expect, it } from 'bun:test';
2
- import { v } from '../utils/valibot/index.js';
3
- import { appwrite } from './appwrite.js';
4
- import { appwriteTableIds } from './tableContract/index.js';
5
- const metadata = {
6
- $createdAt: '2026-07-15T00:00:00.000Z',
7
- $databaseId: 'marco',
8
- $id: 'row-1',
9
- $permissions: ['read("user:user-1")'],
10
- $sequence: '1',
11
- $updatedAt: '2026-07-15T00:00:00.000Z',
12
- };
13
- const rowFixture = (table, data, permissions = metadata.$permissions) => ({
14
- ...metadata,
15
- $permissions: permissions,
16
- $tableId: appwrite.ids.tables[table],
17
- ...data,
18
- });
19
- const validRows = {
20
- accounts: rowFixture('accounts', {
21
- colour: '#000000',
22
- credential: null,
23
- displayName: null,
24
- initialSyncCompletedAt: null,
25
- lastErrorCode: null,
26
- lastSuccessfulSyncAt: null,
27
- mailboxSyncState: null,
28
- mailProcessedCount: 0,
29
- mailTotalCount: 0,
30
- pollShardAssignmentId: null,
31
- pollShardId: null,
32
- primaryAlias: 'alias-1',
33
- primaryEmail: 'marco@example.com',
34
- profile: 'user-1',
35
- profileAssignmentKey: 'user-1',
36
- provider: 'GMAIL',
37
- state: 'CONNECTED',
38
- }),
39
- aliases: rowFixture('aliases', {
40
- account: 'account-1',
41
- accountAssignmentKey: 'account-1',
42
- email: 'marco@example.com',
43
- isPrimary: true,
44
- name: 'Marco',
45
- providerId: 'provider-1',
46
- signature: '<p>Test signature</p>',
47
- }),
48
- commands: rowFixture('commands', {
49
- account: null,
50
- accountId: null,
51
- attempts: 0,
52
- canonicalRevision: null,
53
- draftId: null,
54
- errorCode: null,
55
- kind: 'thread.archive',
56
- payload: '{"threadId":"thread-1"}',
57
- payloadHash: 'hash-1',
58
- profile: 'user-1',
59
- state: 'ACCEPTED',
60
- submittedAt: '2026-07-15T00:00:00.000Z',
61
- userId: 'user-1',
62
- }),
63
- contacts: rowFixture('contacts', {
64
- displayName: 'Marco',
65
- lastContactedAt: '2026-07-15T00:00:00.000Z',
66
- messageCount: 0,
67
- normalisedAddress: 'marco@example.com',
68
- profile: 'user-1',
69
- profileAssignmentKey: 'user-1',
70
- searchText: 'marco',
71
- }),
72
- credentials: rowFixture('credentials', {
73
- accountId: 'account-1',
74
- encryptedPayload: 'encrypted-payload',
75
- expiresAt: null,
76
- provider: 'GMAIL',
77
- refreshLeaseExpiresAt: null,
78
- refreshLeaseId: null,
79
- userId: 'user-1',
80
- }),
81
- drafts: rowFixture('drafts', {
82
- account: 'account-1',
83
- accountAssignmentKey: 'account-1',
84
- attachmentMetadata: '[]',
85
- contentHash: 'hash-1',
86
- envelope: '{"bcc":[],"cc":[],"subject":null,"to":[]}',
87
- errorCode: null,
88
- executionLeaseExpiresAt: null,
89
- executionLeaseId: null,
90
- fromAlias: null,
91
- html: '<p>Draft</p>',
92
- referencedMessage: null,
93
- revision: 0,
94
- scheduledAt: null,
95
- sequence: 0,
96
- status: 'DRAFT',
97
- type: 'COMPOSE',
98
- }),
99
- jobs: rowFixture('jobs', {
100
- accountId: null,
101
- attempts: 0,
102
- commandId: 'command-1',
103
- dedupeKey: 'dedupe-1',
104
- errorCode: null,
105
- kind: 'thread.archive',
106
- leaseExpiresAt: null,
107
- leaseId: null,
108
- maxAttempts: 3,
109
- nextRunAt: '2026-07-15T00:00:00.000Z',
110
- payload: '{"threadId":"thread-1"}',
111
- state: 'PENDING',
112
- userId: 'user-1',
113
- }),
114
- labels: rowFixture('labels', {
115
- account: 'account-1',
116
- accountAssignmentKey: 'account-1',
117
- name: null,
118
- path: 'Inbox',
119
- providerId: 'provider-1',
120
- specialUse: 'INBOX',
121
- totalCount: 0,
122
- unreadCount: 0,
123
- }),
124
- mailboxSyncCandidates: rowFixture('mailboxSyncCandidates', {
125
- account: 'account-1',
126
- accountId: 'account-1',
127
- generation: 1,
128
- label: 'label-1',
129
- labelId: 'label-1',
130
- lane: 'HEAD',
131
- mailboxPath: 'INBOX',
132
- mailboxPriority: 1,
133
- mailboxSortKey: '0000000001:INBOX',
134
- providerId: 'provider-message-1',
135
- receivedAt: '2026-07-15T00:00:00.000Z',
136
- specialUse: 'INBOX',
137
- uid: 1,
138
- uidValidity: 1,
139
- userId: 'user-1',
140
- }),
141
- mailboxSyncLanes: rowFixture('mailboxSyncLanes', {
142
- account: 'test-account-id-1',
143
- accountId: 'test-account-id-1',
144
- commandId: 'sync_test-command-id-1',
145
- cursor: null,
146
- errorCode: null,
147
- generation: 1,
148
- lane: 'HEAD',
149
- state: 'RUNNING',
150
- userId: 'test-user-id-1',
151
- }, []),
152
- mailboxSyncStates: rowFixture('mailboxSyncStates', {
153
- accountId: 'account-1',
154
- errorCode: null,
155
- lastEventAt: null,
156
- lastSyncAt: null,
157
- materialisationLeaseExpiresAt: null,
158
- materialisationLeaseId: null,
159
- nextPollAt: null,
160
- provider: 'GMAIL',
161
- providerCursor: null,
162
- state: 'CURRENT',
163
- uidValidity: null,
164
- userId: 'user-1',
165
- }),
166
- messageLocations: rowFixture('messageLocations', {
167
- account: 'account-1',
168
- accountAssignmentKey: 'account-1',
169
- flagged: false,
170
- label: 'label-1',
171
- labelAssignmentKey: 'label-1',
172
- message: 'message-1',
173
- messageAt: '2026-07-15T00:00:00.000Z',
174
- seen: true,
175
- thread: 'thread-1',
176
- threadAssignmentKey: 'thread-1',
177
- uid: 1,
178
- uidValidity: 1,
179
- }),
180
- messages: rowFixture('messages', {
181
- account: 'account-1',
182
- accountAssignmentKey: 'account-1',
183
- attachmentMetadata: '[]',
184
- htmlFileId: null,
185
- materialisationGeneration: 1,
186
- preview: 'Preview',
187
- providerHistoryId: '987654321',
188
- providerId: 'provider-1',
189
- providerLabelIds: ['INBOX'],
190
- providerThreadId: 'provider-thread-1',
191
- rawFileId: null,
192
- receivedAt: null,
193
- recipients: '[{"emailAddress":"recipient@example.com","name":"Recipient","type":"to"}]',
194
- revision: 0,
195
- rfcMessageId: null,
196
- sender: 'marco@example.com',
197
- senderName: 'Marco',
198
- sentAt: '2026-07-15T00:00:00.000Z',
199
- size: 1,
200
- subject: 'Test subject',
201
- thread: 'thread-1',
202
- threadAssignmentKey: 'thread-1',
203
- }),
204
- oauthStates: rowFixture('oauthStates', {
205
- accountId: 'account-1',
206
- email: 'marco@example.com',
207
- expiresAt: '2026-07-15T00:10:00.000Z',
208
- nonceHash: 'test-nonce-hash-1',
209
- operation: 'CONNECT',
210
- profile: 'user-1',
211
- provider: 'GMAIL',
212
- returnUri: 'https://app.marcoapp.io/onboarding/loading',
213
- userId: 'user-1',
214
- }),
215
- pollShardCoordinators: rowFixture('pollShardCoordinators', {
216
- accountCursor: null,
217
- }, []),
218
- pollShards: rowFixture('pollShards', {
219
- accountIds: ['test-account-id-1'],
220
- errorCode: null,
221
- generation: 1,
222
- lastStartedAt: null,
223
- leaseExpiresAt: null,
224
- leaseId: null,
225
- nextStartAt: '2026-07-15T00:00:30.000Z',
226
- pollingSnapshot: '{"members":[],"version":1}',
227
- scheduledExecutionId: null,
228
- state: 'ACTIVE',
229
- }, []),
230
- profileAvatarCleanups: rowFixture('profileAvatarCleanups', {
231
- claimedAt: null,
232
- claimId: null,
233
- fileId: 'test-file-id-1',
234
- profile: 'user-1',
235
- }, []),
236
- profiles: rowFixture('profiles', {
237
- avatarFileId: null,
238
- deletionRequestedAt: null,
239
- email: 'marco@example.com',
240
- name: null,
241
- onboardingState: null,
242
- timezone: null,
243
- }),
244
- pushNotificationTokens: rowFixture('pushNotificationTokens', {
245
- profile: 'user-1',
246
- token: 'ExponentPushToken[token]',
247
- userId: 'user-1',
248
- }),
249
- savedViews: rowFixture('savedViews', {
250
- aliasIds: ['alias-1'],
251
- icon: 'mail',
252
- name: 'Unread',
253
- profile: 'user-1',
254
- }),
255
- threadAliases: rowFixture('threadAliases', {
256
- alias: 'alias-1',
257
- aliasAssignmentKey: 'alias-1',
258
- latestMessageAt: '2026-07-15T00:00:00.000Z',
259
- thread: 'thread-1',
260
- threadAssignmentKey: 'thread-1',
261
- }),
262
- threadLabels: rowFixture('threadLabels', {
263
- label: 'label-1',
264
- labelAssignmentKey: 'label-1',
265
- latestMessageAt: '2026-07-15T00:00:00.000Z',
266
- locationCount: 1,
267
- thread: 'thread-1',
268
- threadAssignmentKey: 'thread-1',
269
- }),
270
- threads: rowFixture('threads', {
271
- account: 'account-1',
272
- accountAssignmentKey: 'account-1',
273
- archived: false,
274
- firstMessageAt: '2026-07-14T00:00:00.000Z',
275
- flagged: false,
276
- flaggedLocationCount: 0,
277
- hasAttachments: false,
278
- labelIds: ['label-1'],
279
- latestMessageAt: '2026-07-15T00:00:00.000Z',
280
- latestMessageId: 'message-1',
281
- messageCount: 1,
282
- participants: 'sender@example.com recipient@example.com',
283
- preview: 'Preview',
284
- providerId: 'provider-1',
285
- revision: 0,
286
- searchText: 'preview',
287
- seen: true,
288
- senderEmail: 'sender@example.com',
289
- senderName: 'Sender',
290
- snoozedUntil: null,
291
- spam: false,
292
- subject: null,
293
- trashed: false,
294
- unseenLocationCount: 0,
295
- }),
296
- };
297
- const validPollShardCoordinatorRow = validRows.pollShardCoordinators;
298
- const pollShardCoordinatorSchema = Object.entries(appwrite.rowSchemas).find(([table]) => table === 'pollShardCoordinators')?.[1];
299
- describe('appwrite', () => {
300
- it('publishes the production browser and OAuth configuration', () => {
301
- expect(appwrite.environments).toEqual(['development', 'production', 'staging']);
302
- expect(appwrite.deployments).toEqual({
303
- development: {
304
- applicationUrl: 'https://app.staging.marcoapp.io',
305
- endpoint: 'https://nyc.cloud.appwrite.io/v1',
306
- oauthClientIds: {
307
- google: '338197922176-oml1o2iputhhu3vijgue9h8sbfq17qme.apps.googleusercontent.com',
308
- microsoft: 'd34106a5-5210-417e-bf38-6ddbe3aa91a7',
309
- },
310
- projectId: 'marco',
311
- },
312
- production: {
313
- applicationUrl: 'https://app.marcoapp.io',
314
- endpoint: 'https://platform.marcoapp.io/v1',
315
- oauthClientIds: {
316
- google: '338197922176-oml1o2iputhhu3vijgue9h8sbfq17qme.apps.googleusercontent.com',
317
- microsoft: 'd34106a5-5210-417e-bf38-6ddbe3aa91a7',
318
- },
319
- projectId: 'marco',
320
- },
321
- staging: {
322
- applicationUrl: 'https://app.staging.marcoapp.io',
323
- endpoint: 'https://nyc.cloud.appwrite.io/v1',
324
- oauthClientIds: {
325
- google: '338197922176-oml1o2iputhhu3vijgue9h8sbfq17qme.apps.googleusercontent.com',
326
- microsoft: 'd34106a5-5210-417e-bf38-6ddbe3aa91a7',
327
- },
328
- projectId: 'marco',
329
- },
330
- });
331
- expect(appwrite.deployments.development).not.toBe(appwrite.deployments.staging);
332
- expect(appwrite.deployments.development.oauthClientIds).not.toBe(appwrite.deployments.staging.oauthClientIds);
333
- expect(appwrite.deployments.development.oauthClientIds).not.toBe(appwrite.deployments.production.oauthClientIds);
334
- expect(appwrite.deployments.production.oauthClientIds).not.toBe(appwrite.deployments.staging.oauthClientIds);
335
- });
336
- it('exports the approved resource identifiers', () => {
337
- expect(appwrite.ids).toEqual({
338
- bucket: 'marco-files',
339
- database: 'marco',
340
- functions: { api: 'marco-api', worker: 'marco-worker' },
341
- tables: {
342
- accounts: 'accounts',
343
- aliases: 'aliases',
344
- commands: 'commands',
345
- contacts: 'contacts',
346
- credentials: 'credentials',
347
- drafts: 'drafts',
348
- jobs: 'jobs',
349
- labels: 'labels',
350
- mailboxSyncCandidates: 'mailbox_sync_candidates',
351
- mailboxSyncLanes: 'mailbox_sync_lanes',
352
- mailboxSyncStates: 'mailbox_sync_states',
353
- messageLocations: 'message_locations',
354
- messages: 'messages',
355
- oauthStates: 'oauth_states',
356
- pollShardCoordinators: 'poll_shard_coordinators',
357
- pollShards: 'poll_shards',
358
- profileAvatarCleanups: 'profile_avatar_cleanups',
359
- profiles: 'profiles',
360
- pushNotificationTokens: 'push_notification_tokens',
361
- savedViews: 'saved_views',
362
- threadAliases: 'thread_aliases',
363
- threadLabels: 'thread_labels',
364
- threads: 'threads',
365
- },
366
- });
367
- });
368
- it('generates every table definition and schema from the shared contract', () => {
369
- expect(Object.keys(appwrite.tables).sort()).toEqual(Object.keys(appwrite.ids.tables).sort());
370
- const tableKeys = Object.keys(appwrite.ids.tables);
371
- for (const tableKey of tableKeys) {
372
- const tableId = appwrite.ids.tables[tableKey];
373
- const table = appwrite.tables[tableKey];
374
- const dataSchema = appwrite.dataSchemas[tableKey];
375
- const rowSchema = appwrite.rowSchemas[tableKey];
376
- const dataKeys = Object.keys(dataSchema.entries);
377
- expect(table.id).toBe(tableId);
378
- expect(Object.keys(rowSchema.entries)).toEqual(['$createdAt', '$databaseId', '$id', '$permissions', '$sequence', '$tableId', '$updatedAt', ...dataKeys]);
379
- expect(dataKeys.sort()).toEqual([...table.columns.map(column => column.key), ...(table.relationships ?? []).map(relationship => relationship.key)].sort());
380
- }
381
- });
382
- it('publishes every physical table ID exactly once', () => {
383
- expect([...appwriteTableIds]).toEqual(Object.values(appwrite.ids.tables));
384
- expect(new Set(appwriteTableIds).size).toBe(appwriteTableIds.length);
385
- });
386
- it('publishes the explicit physical message-location contract', () => {
387
- expect(appwrite.tables.messageLocations.columns).toEqual([
388
- { key: 'accountAssignmentKey', required: true, size: 36, type: 'string' },
389
- { key: 'flagged', required: true, type: 'boolean' },
390
- { key: 'labelAssignmentKey', required: true, size: 36, type: 'string' },
391
- { key: 'messageAt', required: true, type: 'datetime' },
392
- { key: 'seen', required: true, type: 'boolean' },
393
- { key: 'threadAssignmentKey', required: true, size: 36, type: 'string' },
394
- { key: 'uid', required: false, type: 'bigint' },
395
- { key: 'uidValidity', required: false, type: 'bigint' },
396
- ]);
397
- expect(appwrite.tables.messageLocations.relationships).toEqual([
398
- { key: 'account', onDelete: 'cascade', relatedTableId: appwrite.ids.tables.accounts, type: 'manyToOne' },
399
- { key: 'label', onDelete: 'cascade', relatedTableId: appwrite.ids.tables.labels, type: 'manyToOne' },
400
- { key: 'message', onDelete: 'cascade', relatedTableId: appwrite.ids.tables.messages, type: 'manyToOne' },
401
- { key: 'thread', onDelete: 'cascade', relatedTableId: appwrite.ids.tables.threads, type: 'manyToOne' },
402
- ]);
403
- });
404
- it('enforces nullable positive message-location coordinates as a pair', () => {
405
- const messageLocations = appwrite.dataSchemas.messageLocations;
406
- for (const coordinates of [
407
- { uid: null, uidValidity: null },
408
- { uid: 1, uidValidity: 1 },
409
- ]) {
410
- expect(v.safeParse(messageLocations, { ...validRows.messageLocations, ...coordinates }).success).toBe(true);
411
- }
412
- for (const coordinates of [
413
- { uid: null, uidValidity: 1 },
414
- { uid: 1, uidValidity: null },
415
- { uid: 0, uidValidity: 1 },
416
- { uid: 1, uidValidity: 0 },
417
- ]) {
418
- expect(v.safeParse(messageLocations, { ...validRows.messageLocations, ...coordinates }).success).toBe(false);
419
- }
420
- });
421
- it('rejects zero mailbox-sync candidate coordinates', () => {
422
- expect(v.safeParse(appwrite.dataSchemas.mailboxSyncCandidates.entries.uid, 0).success).toBe(false);
423
- expect(v.safeParse(appwrite.dataSchemas.mailboxSyncCandidates.entries.uidValidity, 0).success).toBe(false);
424
- });
425
- it('rejects non-canonical persisted scheduling and lease fences', () => {
426
- const fenceSchemas = [
427
- appwrite.dataSchemas.credentials.entries.refreshLeaseExpiresAt,
428
- appwrite.dataSchemas.drafts.entries.scheduledAt,
429
- appwrite.dataSchemas.drafts.entries.executionLeaseExpiresAt,
430
- appwrite.dataSchemas.mailboxSyncStates.entries.nextPollAt,
431
- appwrite.dataSchemas.mailboxSyncStates.entries.materialisationLeaseExpiresAt,
432
- appwrite.dataSchemas.jobs.entries.nextRunAt,
433
- appwrite.dataSchemas.jobs.entries.leaseExpiresAt,
434
- appwrite.dataSchemas.pollShards.entries.nextStartAt,
435
- appwrite.dataSchemas.pollShards.entries.leaseExpiresAt,
436
- appwrite.dataSchemas.threads.entries.snoozedUntil,
437
- ];
438
- for (const schema of fenceSchemas) {
439
- expect(v.safeParse(schema, '2026-06-31T12:00:30.000Z').success).toBe(false);
440
- expect(v.safeParse(schema, '2026-07-23T12:00:30.000+00:00').success).toBe(false);
441
- }
442
- });
443
- it('pins every generated wire row to its table ID', () => {
444
- const tableKeys = Object.keys(appwrite.ids.tables);
445
- for (const tableKey of tableKeys) {
446
- const wrongTableId = tableKey === 'accounts' ? appwrite.ids.tables.aliases : appwrite.ids.tables.accounts;
447
- const rowSchema = appwrite.rowSchemas[tableKey];
448
- const row = validRows[tableKey];
449
- expect(v.safeParse(rowSchema, row).success).toBe(true);
450
- expect(v.safeParse(rowSchema, { ...row, $tableId: wrongTableId }).success).toBe(false);
451
- }
452
- });
453
- it('exports the shared OAuth state contract', () => {
454
- expect(appwrite.oauth).toMatchObject({
455
- operations: ['CONNECT', 'REPLACE'],
456
- providers: ['GMAIL', 'OUTLOOK'],
457
- returnUris: ['https://app.marcoapp.io/onboarding/loading'],
458
- });
459
- });
460
- for (const operation of ['CONNECT', 'REPLACE']) {
461
- it(`accepts a persisted ${operation} OAuth state completing at production loading`, () => {
462
- expect(v.safeParse(appwrite.rowSchemas.oauthStates, { ...validRows.oauthStates, operation }).success).toBe(true);
463
- });
464
- }
465
- for (const returnUri of [
466
- 'https://app.marcoapp.io/onboarding/provider-selection',
467
- 'https://app.staging.marcoapp.io/onboarding/loading',
468
- 'https://attacker.example/onboarding/loading',
469
- 'https://app.marcoapp.io/onboarding/loading/unexpected',
470
- ]) {
471
- it(`rejects persisted OAuth state with unapproved return URI ${returnUri}`, () => {
472
- expect(v.safeParse(appwrite.rowSchemas.oauthStates, { ...validRows.oauthStates, returnUri }).success).toBe(false);
473
- });
474
- }
475
- it('exports the final polling-only mailbox contract', () => {
476
- expect(appwrite.mailboxSync).toEqual({
477
- lanes: ['HEAD', 'BACKFILL'],
478
- laneStates: ['PENDING', 'RUNNING', 'COMPLETED', 'FAILED'],
479
- states: ['INITIAL', 'SYNCING', 'CURRENT', 'ERROR'],
480
- });
481
- expect(appwrite.polling).toEqual({ shardStates: ['ACTIVE', 'STOPPED', 'FAILED'] });
482
- });
483
- it('accepts CURRENT and rejects the retired IDLE mailbox sync state', () => {
484
- expect(v.safeParse(appwrite.rowSchemas.mailboxSyncStates, { ...validRows.mailboxSyncStates, state: 'CURRENT' }).success).toBe(true);
485
- expect(v.safeParse(appwrite.rowSchemas.mailboxSyncStates, { ...validRows.mailboxSyncStates, state: 'IDLE' }).success).toBe(false);
486
- });
487
- it('keys saved views by stable alias IDs', () => {
488
- expect(v.safeParse(appwrite.rowSchemas.savedViews, validRows.savedViews).success).toBe(true);
489
- expect(v.safeParse(appwrite.rowSchemas.savedViews, { ...validRows.savedViews, aliasEmails: ['marco@example.com'] }).success).toBe(false);
490
- });
491
- it('rejects a mailbox sync lane without a command identifier', () => {
492
- expect(v.safeParse(appwrite.rowSchemas.mailboxSyncLanes, {
493
- ...validRows.mailboxSyncLanes,
494
- commandId: '',
495
- }).success).toBe(false);
496
- });
497
- it('rejects a poll shard with more than ten accounts', () => {
498
- expect(v.safeParse(appwrite.rowSchemas.pollShards, {
499
- ...validRows.pollShards,
500
- accountIds: Array.from({ length: 11 }, (_, index) => `test-account-id-${index + 1}`),
501
- }).success).toBe(false);
502
- });
503
- it('accepts a populated poll shard snapshot', () => {
504
- expect(v.safeParse(appwrite.rowSchemas.pollShards, {
505
- ...validRows.pollShards,
506
- pollingSnapshot: '{"members":[]}',
507
- }).success).toBe(true);
508
- });
509
- it('exports the strict server-only poll shard coordinator row contract', () => {
510
- expect(pollShardCoordinatorSchema).toBeDefined();
511
- if (pollShardCoordinatorSchema) {
512
- for (const accountCursor of [null, 'test-account-id-1']) {
513
- expect(v.safeParse(pollShardCoordinatorSchema, { ...validPollShardCoordinatorRow, accountCursor }).success).toBe(true);
514
- }
515
- expect(v.safeParse(pollShardCoordinatorSchema, { ...validPollShardCoordinatorRow, $permissions: ['read("user:test-user-id-1")'] }).success).toBe(false);
516
- expect(v.safeParse(pollShardCoordinatorSchema, { ...validPollShardCoordinatorRow, unexpected: true }).success).toBe(false);
517
- const { $id: _, ...rowWithoutId } = validPollShardCoordinatorRow;
518
- expect(v.safeParse(pollShardCoordinatorSchema, rowWithoutId).success).toBe(false);
519
- }
520
- });
521
- const serverOnlyPollingRows = [
522
- { row: validRows.mailboxSyncLanes, schema: appwrite.rowSchemas.mailboxSyncLanes },
523
- { row: validRows.pollShards, schema: appwrite.rowSchemas.pollShards },
524
- ];
525
- for (const { row, schema } of serverOnlyPollingRows) {
526
- it(`rejects client permissions on ${row.$tableId}`, () => {
527
- expect(v.safeParse(schema, { ...row, $permissions: ['read("user:test-user-id-1")'] }).success).toBe(false);
528
- });
529
- }
530
- const rowTestCases = Object.keys(validRows);
531
- for (const table of rowTestCases) {
532
- it(`accepts the ${table} wire row`, () => {
533
- expect(v.safeParse(appwrite.rowSchemas[table], validRows[table]).success).toBe(true);
534
- });
535
- it(`rejects incomplete ${table} metadata`, () => {
536
- const { $id: _, ...rowWithoutId } = validRows[table];
537
- expect(v.safeParse(appwrite.rowSchemas[table], rowWithoutId).success).toBe(false);
538
- });
539
- }
540
- it('normalises Appwrite relationship objects to row IDs', () => {
541
- const account = v.parse(appwrite.rowSchemas.accounts, {
542
- ...validRows.accounts,
543
- credential: { $id: 'credential-1' },
544
- mailboxSyncState: { $id: 'mailbox-sync-state-1' },
545
- primaryAlias: { $id: 'alias-1' },
546
- profile: { $id: 'user-1' },
547
- });
548
- const alias = v.parse(appwrite.rowSchemas.aliases, { ...validRows.aliases, account: { $id: 'account-1' } });
549
- const command = v.parse(appwrite.rowSchemas.commands, { ...validRows.commands, account: { $id: 'account-1' }, profile: { $id: 'user-1' } });
550
- const contact = v.parse(appwrite.rowSchemas.contacts, { ...validRows.contacts, profile: { $id: 'user-1' } });
551
- const draft = v.parse(appwrite.rowSchemas.drafts, {
552
- ...validRows.drafts,
553
- account: { $id: 'account-1' },
554
- fromAlias: { $id: 'alias-1' },
555
- referencedMessage: { $id: 'message-1' },
556
- });
557
- const label = v.parse(appwrite.rowSchemas.labels, { ...validRows.labels, account: { $id: 'account-1' } });
558
- const mailboxSyncCandidate = v.parse(appwrite.rowSchemas.mailboxSyncCandidates, {
559
- ...validRows.mailboxSyncCandidates,
560
- account: { $id: 'account-1' },
561
- label: { $id: 'label-1' },
562
- });
563
- const mailboxSyncLane = v.parse(appwrite.rowSchemas.mailboxSyncLanes, { ...validRows.mailboxSyncLanes, account: { $id: 'account-1' } });
564
- const messageLocation = v.parse(appwrite.rowSchemas.messageLocations, {
565
- ...validRows.messageLocations,
566
- account: { $id: 'account-1' },
567
- label: { $id: 'label-1' },
568
- message: { $id: 'message-1' },
569
- thread: { $id: 'thread-1' },
570
- });
571
- const oauthState = v.parse(appwrite.rowSchemas.oauthStates, { ...validRows.oauthStates, profile: { $id: 'user-1' } });
572
- const profileAvatarCleanup = v.parse(appwrite.rowSchemas.profileAvatarCleanups, { ...validRows.profileAvatarCleanups, profile: { $id: 'user-1' } });
573
- const pushNotificationToken = v.parse(appwrite.rowSchemas.pushNotificationTokens, { ...validRows.pushNotificationTokens, profile: { $id: 'user-1' } });
574
- const savedView = v.parse(appwrite.rowSchemas.savedViews, { ...validRows.savedViews, profile: { $id: 'user-1' } });
575
- expect(account.credential).toBe('credential-1');
576
- expect(account.mailboxSyncState).toBe('mailbox-sync-state-1');
577
- expect(account.primaryAlias).toBe('alias-1');
578
- expect(account.profile).toBe('user-1');
579
- expect(alias.account).toBe('account-1');
580
- expect(command.account).toBe('account-1');
581
- expect(command.profile).toBe('user-1');
582
- expect(contact.profile).toBe('user-1');
583
- expect(draft.account).toBe('account-1');
584
- expect(draft.fromAlias).toBe('alias-1');
585
- expect(draft.referencedMessage).toBe('message-1');
586
- expect(label.account).toBe('account-1');
587
- expect(mailboxSyncCandidate.account).toBe('account-1');
588
- expect(mailboxSyncCandidate.label).toBe('label-1');
589
- expect(mailboxSyncLane.account).toBe('account-1');
590
- expect(messageLocation.account).toBe('account-1');
591
- expect(messageLocation.label).toBe('label-1');
592
- expect(messageLocation.message).toBe('message-1');
593
- expect(messageLocation.thread).toBe('thread-1');
594
- expect(oauthState.profile).toBe('user-1');
595
- expect(profileAvatarCleanup.profile).toBe('user-1');
596
- expect(pushNotificationToken.profile).toBe('user-1');
597
- expect(savedView.profile).toBe('user-1');
598
- });
599
- it('accepts backend message sender fields as plain nullable text', () => {
600
- expect(v.safeParse(appwrite.rowSchemas.messages, {
601
- ...validRows.messages,
602
- sender: 'not-an-email',
603
- senderName: '',
604
- }).success).toBe(true);
605
- });
606
- const requiredMailboxReferenceFieldTestCases = [
607
- { field: 'account', row: { ...validRows.messages, account: null }, schema: appwrite.rowSchemas.messages, table: 'messages' },
608
- { field: 'thread', row: { ...validRows.messages, thread: null }, schema: appwrite.rowSchemas.messages, table: 'messages' },
609
- { field: 'account', row: { ...validRows.threads, account: null }, schema: appwrite.rowSchemas.threads, table: 'threads' },
610
- { field: 'alias', row: { ...validRows.threadAliases, alias: null }, schema: appwrite.rowSchemas.threadAliases, table: 'threadAliases' },
611
- { field: 'thread', row: { ...validRows.threadAliases, thread: null }, schema: appwrite.rowSchemas.threadAliases, table: 'threadAliases' },
612
- { field: 'label', row: { ...validRows.threadLabels, label: null }, schema: appwrite.rowSchemas.threadLabels, table: 'threadLabels' },
613
- { field: 'thread', row: { ...validRows.threadLabels, thread: null }, schema: appwrite.rowSchemas.threadLabels, table: 'threadLabels' },
614
- ];
615
- for (const { field, row, schema, table } of requiredMailboxReferenceFieldTestCases) {
616
- it(`rejects nullable ${field} references on ${table}`, () => {
617
- expect(v.safeParse(schema, row).success).toBe(false);
618
- });
619
- }
620
- const nullableColumnTestCases = [
621
- {
622
- description: 'alias name',
623
- row: { ...validRows.aliases, name: null },
624
- schema: appwrite.rowSchemas.aliases,
625
- },
626
- {
627
- description: 'alias signature',
628
- row: { ...validRows.aliases, signature: null },
629
- schema: appwrite.rowSchemas.aliases,
630
- },
631
- {
632
- description: 'contact display name',
633
- row: { ...validRows.contacts, displayName: null },
634
- schema: appwrite.rowSchemas.contacts,
635
- },
636
- {
637
- description: 'contact last-contacted timestamp',
638
- row: { ...validRows.contacts, lastContactedAt: null },
639
- schema: appwrite.rowSchemas.contacts,
640
- },
641
- {
642
- description: 'saved-view icon',
643
- row: { ...validRows.savedViews, icon: null },
644
- schema: appwrite.rowSchemas.savedViews,
645
- },
646
- {
647
- description: 'thread first-message timestamp',
648
- row: { ...validRows.threads, firstMessageAt: null },
649
- schema: appwrite.rowSchemas.threads,
650
- },
651
- {
652
- description: 'thread sender email',
653
- row: { ...validRows.threads, senderEmail: null },
654
- schema: appwrite.rowSchemas.threads,
655
- },
656
- {
657
- description: 'thread sender name',
658
- row: { ...validRows.threads, senderName: null },
659
- schema: appwrite.rowSchemas.threads,
660
- },
661
- ];
662
- for (const { description, row, schema } of nullableColumnTestCases) {
663
- it(`accepts a wire row with a nullable ${description}`, () => {
664
- expect(v.safeParse(schema, row).success).toBe(true);
665
- });
666
- }
667
- it('accepts provider-derived RFC email addresses', () => {
668
- const maximumLengthMailboxAddress = `${'a'.repeat(64)}@${'b'.repeat(63)}.${'c'.repeat(63)}.${'d'.repeat(63)}.${'e'.repeat(63)}`;
669
- const mailboxAddresses = ['sender@example', 'first.last+tag@example.com', maximumLengthMailboxAddress];
670
- expect(maximumLengthMailboxAddress).toHaveLength(320);
671
- for (const mailboxAddress of mailboxAddresses) {
672
- expect(v.safeParse(appwrite.rowSchemas.contacts, { ...validRows.contacts, normalisedAddress: mailboxAddress }).success).toBe(true);
673
- expect(v.safeParse(appwrite.rowSchemas.threads, { ...validRows.threads, senderEmail: mailboxAddress }).success).toBe(true);
674
- expect(v.safeParse(appwrite.decodedSchemas.draftEnvelope, JSON.stringify({ bcc: [mailboxAddress], cc: [mailboxAddress], subject: null, to: [mailboxAddress] })).success).toBe(true);
675
- expect(v.safeParse(appwrite.decodedSchemas.messageRecipients, JSON.stringify([{ emailAddress: mailboxAddress, name: null, type: 'to' }])).success).toBe(true);
676
- }
677
- expect(v.safeParse(appwrite.rowSchemas.contacts, { ...validRows.contacts, normalisedAddress: '' }).success).toBe(false);
678
- expect(v.safeParse(appwrite.rowSchemas.contacts, { ...validRows.contacts, normalisedAddress: 'invalid@@example.com' }).success).toBe(false);
679
- expect(v.safeParse(appwrite.rowSchemas.contacts, { ...validRows.contacts, normalisedAddress: 'a'.repeat(321) }).success).toBe(false);
680
- });
681
- it('keeps account identity emails on the strict web-email boundary', () => {
682
- expect(v.safeParse(appwrite.rowSchemas.accounts, { ...validRows.accounts, primaryEmail: 'sender@example' }).success).toBe(false);
683
- expect(v.safeParse(appwrite.rowSchemas.aliases, { ...validRows.aliases, email: '"a@b"@example.com' }).success).toBe(false);
684
- });
685
- const { name: _aliasName, ...aliasWithoutName } = validRows.aliases;
686
- const { signature: _aliasSignature, ...aliasWithoutSignature } = validRows.aliases;
687
- const { displayName: _contactDisplayName, ...contactWithoutDisplayName } = validRows.contacts;
688
- const { lastContactedAt: _contactLastContactedAt, ...contactWithoutLastContactedAt } = validRows.contacts;
689
- const { icon: _savedViewIcon, ...savedViewWithoutIcon } = validRows.savedViews;
690
- const { firstMessageAt: _threadFirstMessageAt, ...threadWithoutFirstMessageAt } = validRows.threads;
691
- const { senderEmail: _threadSenderEmail, ...threadWithoutSenderEmail } = validRows.threads;
692
- const { senderName: _threadSenderName, ...threadWithoutSenderName } = validRows.threads;
693
- const missingNullableColumnTestCases = [
694
- {
695
- description: 'alias name',
696
- row: aliasWithoutName,
697
- schema: appwrite.rowSchemas.aliases,
698
- },
699
- {
700
- description: 'alias signature',
701
- row: aliasWithoutSignature,
702
- schema: appwrite.rowSchemas.aliases,
703
- },
704
- {
705
- description: 'contact display name',
706
- row: contactWithoutDisplayName,
707
- schema: appwrite.rowSchemas.contacts,
708
- },
709
- {
710
- description: 'contact last-contacted timestamp',
711
- row: contactWithoutLastContactedAt,
712
- schema: appwrite.rowSchemas.contacts,
713
- },
714
- {
715
- description: 'saved-view icon',
716
- row: savedViewWithoutIcon,
717
- schema: appwrite.rowSchemas.savedViews,
718
- },
719
- {
720
- description: 'thread first-message timestamp',
721
- row: threadWithoutFirstMessageAt,
722
- schema: appwrite.rowSchemas.threads,
723
- },
724
- {
725
- description: 'thread sender email',
726
- row: threadWithoutSenderEmail,
727
- schema: appwrite.rowSchemas.threads,
728
- },
729
- {
730
- description: 'thread sender name',
731
- row: threadWithoutSenderName,
732
- schema: appwrite.rowSchemas.threads,
733
- },
734
- ];
735
- for (const { description, row, schema } of missingNullableColumnTestCases) {
736
- it(`rejects a wire row missing its nullable ${description}`, () => {
737
- expect(v.safeParse(schema, row).success).toBe(false);
738
- });
739
- }
740
- const validOAuthStates = [
741
- { expected: true, operation: 'CONNECT', provider: 'GMAIL' },
742
- { expected: true, operation: 'REPLACE', provider: 'OUTLOOK' },
743
- ];
744
- for (const { expected, operation, provider } of validOAuthStates) {
745
- it(`accepts the ${operation} ${provider} OAuth state`, () => {
746
- expect(v.safeParse(appwrite.rowSchemas.oauthStates, {
747
- ...validRows.oauthStates,
748
- operation,
749
- provider,
750
- }).success).toBe(expected);
751
- });
752
- }
753
- const invalidOAuthStates = [
754
- { description: 'an unknown operation', expected: false, value: { operation: 'UNKNOWN' } },
755
- { description: 'an unknown provider', expected: false, value: { provider: 'UNKNOWN' } },
756
- { description: 'a malformed return URL', expected: false, value: { returnUri: 'not-a-url' } },
757
- {
758
- description: 'an unapproved return destination',
759
- expected: false,
760
- value: { returnUri: 'https://attacker.example/onboarding/provider-selection' },
761
- },
762
- ];
763
- for (const { description, expected, value } of invalidOAuthStates) {
764
- it(`rejects an OAuth state with ${description}`, () => {
765
- expect(v.safeParse(appwrite.rowSchemas.oauthStates, { ...validRows.oauthStates, ...value }).success).toBe(expected);
766
- });
767
- }
768
- const invalidSequences = [
769
- { description: 'numeric', value: 1 },
770
- { description: 'empty', value: '' },
771
- ];
772
- for (const { description, value } of invalidSequences) {
773
- it(`rejects ${description} Appwrite sequence metadata`, () => {
774
- expect(v.safeParse(appwrite.rowSchemas.profiles, { ...validRows.profiles, $sequence: value }).success).toBe(false);
775
- });
776
- }
777
- it('accepts a provider-canonical label name', () => {
778
- expect(v.safeParse(appwrite.rowSchemas.labels, { ...validRows.labels, name: 'CATEGORY_PROMOTIONS' }).success).toBe(true);
779
- });
780
- it('accepts nullable thread text before body materialisation', () => {
781
- expect(v.safeParse(appwrite.rowSchemas.threads, {
782
- ...validRows.threads,
783
- participants: null,
784
- preview: null,
785
- searchText: null,
786
- }).success).toBe(true);
787
- });
788
- const invalidAccountRows = [
789
- { description: 'an unknown state', row: { ...validRows.accounts, state: 'UNKNOWN' } },
790
- { description: 'an unknown database ID', row: { ...validRows.accounts, $databaseId: 'other' } },
791
- { description: 'a leading separator in $id', row: { ...validRows.accounts, $id: '-row-1' } },
792
- { description: 'an overlong $id', row: { ...validRows.accounts, $id: 'a'.repeat(37) } },
793
- ];
794
- for (const testCase of invalidAccountRows) {
795
- it(`rejects ${testCase.description}`, () => {
796
- expect(v.safeParse(appwrite.rowSchemas.accounts, testCase.row).success).toBe(false);
797
- });
798
- }
799
- const jsonTextTestCases = [
800
- {
801
- expected: [
802
- {
803
- fileId: 'test-file-id-1',
804
- isAttachment: true,
805
- mimeType: 'text/plain',
806
- name: 'test-file-name-1.txt',
807
- partNumber: '2',
808
- size: 1,
809
- },
810
- ],
811
- invalidValue: '[{"fileId":"test-file-id-1"}]',
812
- name: 'message attachments',
813
- schema: appwrite.decodedSchemas.messageAttachments,
814
- value: '[{"fileId":"test-file-id-1","isAttachment":true,"mimeType":"text/plain","name":"test-file-name-1.txt","partNumber":"2","size":1}]',
815
- },
816
- {
817
- expected: [
818
- {
819
- fileId: 'test-file-id-1',
820
- fileName: 'test-file-name-1.txt',
821
- mimeType: 'text/plain',
822
- size: 1,
823
- },
824
- ],
825
- invalidValue: '[{"fileId":"test-file-id-1"}]',
826
- name: 'draft attachments',
827
- schema: appwrite.decodedSchemas.draftAttachments,
828
- value: '[{"fileId":"test-file-id-1","fileName":"test-file-name-1.txt","mimeType":"text/plain","size":1}]',
829
- },
830
- {
831
- expected: { threadId: 'thread-1' },
832
- invalidValue: '[]',
833
- name: 'command payload',
834
- schema: appwrite.decodedSchemas.commandPayload,
835
- value: '{"threadId":"thread-1"}',
836
- },
837
- {
838
- expected: { bcc: [], cc: [], subject: null, to: [] },
839
- invalidValue: '[]',
840
- name: 'draft envelope',
841
- schema: appwrite.decodedSchemas.draftEnvelope,
842
- value: '{"bcc":[],"cc":[],"subject":null,"to":[]}',
843
- },
844
- {
845
- expected: { threadId: 'thread-1' },
846
- invalidValue: '[]',
847
- name: 'job payload',
848
- schema: appwrite.decodedSchemas.jobPayload,
849
- value: '{"threadId":"thread-1"}',
850
- },
851
- {
852
- expected: [
853
- {
854
- emailAddress: 'recipient@example.com',
855
- name: 'Recipient',
856
- type: 'to',
857
- },
858
- ],
859
- invalidValue: '[{"emailAddress":"recipient@example.com"}]',
860
- name: 'message recipients',
861
- schema: appwrite.decodedSchemas.messageRecipients,
862
- value: '[{"emailAddress":"recipient@example.com","name":"Recipient","type":"to"}]',
863
- },
864
- ];
865
- for (const testCase of jsonTextTestCases) {
866
- it(`decodes ${testCase.name} JSON text`, () => {
867
- const result = v.safeParse(testCase.schema, testCase.value);
868
- expect(result.success).toBe(true);
869
- if (result.success) {
870
- const output = result.output;
871
- expect(output).toEqual(testCase.expected);
872
- }
873
- expect(v.safeParse(testCase.schema, testCase.invalidValue).success).toBe(false);
874
- expect(v.safeParse(testCase.schema, '{').success).toBe(false);
875
- });
876
- }
877
- it('keeps persisted draft envelope constraints strict and bounded', () => {
878
- const envelope = { bcc: ['sender@example'], cc: [], subject: 'a'.repeat(998), to: ['recipient@example.com'] };
879
- expect(v.safeParse(appwrite.decodedSchemas.draftEnvelope, JSON.stringify(envelope)).success).toBe(true);
880
- for (const invalidEnvelope of [
881
- { ...envelope, subject: 'a'.repeat(999) },
882
- { ...envelope, to: ['not-an-address'] },
883
- { ...envelope, unexpected: true },
884
- ]) {
885
- expect(v.safeParse(appwrite.decodedSchemas.draftEnvelope, JSON.stringify(invalidEnvelope)).success).toBe(false);
886
- }
887
- });
888
- it('keeps persisted draft attachment constraints strict and bounded', () => {
889
- const attachment = { fileId: 'test-file-id-1', fileName: 'proposal.pdf', mimeType: 'application/pdf', size: 0 };
890
- expect(v.safeParse(appwrite.decodedSchemas.draftAttachments, JSON.stringify([attachment])).success).toBe(true);
891
- for (const invalidAttachment of [
892
- { ...attachment, fileId: '-invalid' },
893
- { ...attachment, fileName: 'a'.repeat(256) },
894
- { ...attachment, mimeType: 'x' },
895
- { ...attachment, size: -1 },
896
- { ...attachment, unexpected: true },
897
- ]) {
898
- expect(v.safeParse(appwrite.decodedSchemas.draftAttachments, JSON.stringify([invalidAttachment])).success).toBe(false);
899
- }
900
- });
901
- });