@hexclave/shared 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1144) hide show
  1. package/LICENSE +7 -0
  2. package/dist/ai/image-limits.d.ts +24 -0
  3. package/dist/ai/image-limits.d.ts.map +1 -0
  4. package/dist/ai/image-limits.js +61 -0
  5. package/dist/ai/image-limits.js.map +1 -0
  6. package/dist/ai/unified-prompts/reminders.d.ts +5 -0
  7. package/dist/ai/unified-prompts/reminders.d.ts.map +1 -0
  8. package/dist/ai/unified-prompts/reminders.js +33 -0
  9. package/dist/ai/unified-prompts/reminders.js.map +1 -0
  10. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts +11 -0
  11. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -0
  12. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +851 -0
  13. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -0
  14. package/dist/ai/unified-prompts/skill-site-prompt-parts/brain.d.ts +5 -0
  15. package/dist/ai/unified-prompts/skill-site-prompt-parts/brain.d.ts.map +1 -0
  16. package/dist/ai/unified-prompts/skill-site-prompt-parts/brain.js +12 -0
  17. package/dist/ai/unified-prompts/skill-site-prompt-parts/brain.js.map +1 -0
  18. package/dist/ai/unified-prompts/skill-site-prompt-parts/cli-help.d.ts +5 -0
  19. package/dist/ai/unified-prompts/skill-site-prompt-parts/cli-help.d.ts.map +1 -0
  20. package/dist/ai/unified-prompts/skill-site-prompt-parts/cli-help.js +12 -0
  21. package/dist/ai/unified-prompts/skill-site-prompt-parts/cli-help.js.map +1 -0
  22. package/dist/ai/unified-prompts/skill-site-prompt-parts/config-docs.d.ts +5 -0
  23. package/dist/ai/unified-prompts/skill-site-prompt-parts/config-docs.d.ts.map +1 -0
  24. package/dist/ai/unified-prompts/skill-site-prompt-parts/config-docs.js +12 -0
  25. package/dist/ai/unified-prompts/skill-site-prompt-parts/config-docs.js.map +1 -0
  26. package/dist/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.d.ts +5 -0
  27. package/dist/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.d.ts.map +1 -0
  28. package/dist/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js +12 -0
  29. package/dist/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js.map +1 -0
  30. package/dist/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.d.ts +5 -0
  31. package/dist/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.d.ts.map +1 -0
  32. package/dist/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js +12 -0
  33. package/dist/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js.map +1 -0
  34. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts +5 -0
  35. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -0
  36. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +64 -0
  37. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -0
  38. package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.d.ts +5 -0
  39. package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.d.ts.map +1 -0
  40. package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +12 -0
  41. package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -0
  42. package/dist/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.d.ts +5 -0
  43. package/dist/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.d.ts.map +1 -0
  44. package/dist/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js +12 -0
  45. package/dist/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js.map +1 -0
  46. package/dist/ai/unified-prompts/skill-site-prompt.d.ts +5 -0
  47. package/dist/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -0
  48. package/dist/ai/unified-prompts/skill-site-prompt.js +75 -0
  49. package/dist/ai/unified-prompts/skill-site-prompt.js.map +1 -0
  50. package/dist/apps/apps-config.d.ts +168 -0
  51. package/dist/apps/apps-config.d.ts.map +1 -0
  52. package/dist/apps/apps-config.js +157 -0
  53. package/dist/apps/apps-config.js.map +1 -0
  54. package/dist/apps/apps-ui.d.ts +45 -0
  55. package/dist/apps/apps-ui.d.ts.map +1 -0
  56. package/dist/apps/apps-ui.js +109 -0
  57. package/dist/apps/apps-ui.js.map +1 -0
  58. package/dist/chunk-BE-pF4vm.js +34 -0
  59. package/dist/config/db-sync-mappings.d.ts +193 -0
  60. package/dist/config/db-sync-mappings.d.ts.map +1 -0
  61. package/dist/config/db-sync-mappings.js +2255 -0
  62. package/dist/config/db-sync-mappings.js.map +1 -0
  63. package/dist/config/format.d.ts +61 -0
  64. package/dist/config/format.d.ts.map +1 -0
  65. package/dist/config/format.js +337 -0
  66. package/dist/config/format.js.map +1 -0
  67. package/dist/config/migrate-catalogs-to-product-lines.d.ts +14 -0
  68. package/dist/config/migrate-catalogs-to-product-lines.d.ts.map +1 -0
  69. package/dist/config/migrate-catalogs-to-product-lines.js +379 -0
  70. package/dist/config/migrate-catalogs-to-product-lines.js.map +1 -0
  71. package/dist/config/schema-fuzzer.test.d.ts +1 -0
  72. package/dist/config/schema-fuzzer.test.js +401 -0
  73. package/dist/config/schema-fuzzer.test.js.map +1 -0
  74. package/dist/config/schema.d.ts +2315 -0
  75. package/dist/config/schema.d.ts.map +1 -0
  76. package/dist/config/schema.js +1085 -0
  77. package/dist/config/schema.js.map +1 -0
  78. package/dist/config-authoring.d.ts +12 -0
  79. package/dist/config-authoring.d.ts.map +1 -0
  80. package/dist/config-authoring.js +12 -0
  81. package/dist/config-authoring.js.map +1 -0
  82. package/dist/config-authoring.test.d.ts +1 -0
  83. package/dist/config-authoring.test.js +29 -0
  84. package/dist/config-authoring.test.js.map +1 -0
  85. package/dist/config-rendering.d.ts +17 -0
  86. package/dist/config-rendering.d.ts.map +1 -0
  87. package/dist/config-rendering.js +114 -0
  88. package/dist/config-rendering.js.map +1 -0
  89. package/dist/crud.d.ts +98 -0
  90. package/dist/crud.d.ts.map +1 -0
  91. package/dist/crud.js +129 -0
  92. package/dist/crud.js.map +1 -0
  93. package/dist/esm/ai/image-limits.d.ts +24 -0
  94. package/dist/esm/ai/image-limits.d.ts.map +1 -0
  95. package/dist/esm/ai/image-limits.js +53 -0
  96. package/dist/esm/ai/image-limits.js.map +1 -0
  97. package/dist/esm/ai/unified-prompts/reminders.d.ts +5 -0
  98. package/dist/esm/ai/unified-prompts/reminders.d.ts.map +1 -0
  99. package/dist/esm/ai/unified-prompts/reminders.js +31 -0
  100. package/dist/esm/ai/unified-prompts/reminders.js.map +1 -0
  101. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts +11 -0
  102. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -0
  103. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +843 -0
  104. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -0
  105. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/brain.d.ts +5 -0
  106. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/brain.d.ts.map +1 -0
  107. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/brain.js +10 -0
  108. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/brain.js.map +1 -0
  109. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/cli-help.d.ts +5 -0
  110. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/cli-help.d.ts.map +1 -0
  111. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/cli-help.js +10 -0
  112. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/cli-help.js.map +1 -0
  113. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/config-docs.d.ts +5 -0
  114. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/config-docs.d.ts.map +1 -0
  115. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/config-docs.js +10 -0
  116. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/config-docs.js.map +1 -0
  117. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.d.ts +5 -0
  118. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.d.ts.map +1 -0
  119. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js +10 -0
  120. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js.map +1 -0
  121. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.d.ts +5 -0
  122. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.d.ts.map +1 -0
  123. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js +10 -0
  124. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js.map +1 -0
  125. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts +5 -0
  126. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -0
  127. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +61 -0
  128. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -0
  129. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.d.ts +5 -0
  130. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.d.ts.map +1 -0
  131. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +10 -0
  132. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -0
  133. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.d.ts +5 -0
  134. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.d.ts.map +1 -0
  135. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js +10 -0
  136. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js.map +1 -0
  137. package/dist/esm/ai/unified-prompts/skill-site-prompt.d.ts +5 -0
  138. package/dist/esm/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -0
  139. package/dist/esm/ai/unified-prompts/skill-site-prompt.js +73 -0
  140. package/dist/esm/ai/unified-prompts/skill-site-prompt.js.map +1 -0
  141. package/dist/esm/apps/apps-config.d.ts +168 -0
  142. package/dist/esm/apps/apps-config.d.ts.map +1 -0
  143. package/dist/esm/apps/apps-config.js +154 -0
  144. package/dist/esm/apps/apps-config.js.map +1 -0
  145. package/dist/esm/apps/apps-ui.d.ts +45 -0
  146. package/dist/esm/apps/apps-ui.d.ts.map +1 -0
  147. package/dist/esm/apps/apps-ui.js +104 -0
  148. package/dist/esm/apps/apps-ui.js.map +1 -0
  149. package/dist/esm/config/db-sync-mappings.d.ts +193 -0
  150. package/dist/esm/config/db-sync-mappings.d.ts.map +1 -0
  151. package/dist/esm/config/db-sync-mappings.js +2253 -0
  152. package/dist/esm/config/db-sync-mappings.js.map +1 -0
  153. package/dist/esm/config/format.d.ts +61 -0
  154. package/dist/esm/config/format.d.ts.map +1 -0
  155. package/dist/esm/config/format.js +327 -0
  156. package/dist/esm/config/format.js.map +1 -0
  157. package/dist/esm/config/migrate-catalogs-to-product-lines.d.ts +14 -0
  158. package/dist/esm/config/migrate-catalogs-to-product-lines.d.ts.map +1 -0
  159. package/dist/esm/config/migrate-catalogs-to-product-lines.js +377 -0
  160. package/dist/esm/config/migrate-catalogs-to-product-lines.js.map +1 -0
  161. package/dist/esm/config/schema-fuzzer.test.d.ts +1 -0
  162. package/dist/esm/config/schema-fuzzer.test.js +401 -0
  163. package/dist/esm/config/schema-fuzzer.test.js.map +1 -0
  164. package/dist/esm/config/schema.d.ts +2315 -0
  165. package/dist/esm/config/schema.d.ts.map +1 -0
  166. package/dist/esm/config/schema.js +1065 -0
  167. package/dist/esm/config/schema.js.map +1 -0
  168. package/dist/esm/config-authoring.d.ts +12 -0
  169. package/dist/esm/config-authoring.d.ts.map +1 -0
  170. package/dist/esm/config-authoring.js +9 -0
  171. package/dist/esm/config-authoring.js.map +1 -0
  172. package/dist/esm/config-authoring.test.d.ts +1 -0
  173. package/dist/esm/config-authoring.test.js +29 -0
  174. package/dist/esm/config-authoring.test.js.map +1 -0
  175. package/dist/esm/config-rendering.d.ts +17 -0
  176. package/dist/esm/config-rendering.d.ts.map +1 -0
  177. package/dist/esm/config-rendering.js +108 -0
  178. package/dist/esm/config-rendering.js.map +1 -0
  179. package/dist/esm/crud.d.ts +98 -0
  180. package/dist/esm/crud.d.ts.map +1 -0
  181. package/dist/esm/crud.js +127 -0
  182. package/dist/esm/crud.js.map +1 -0
  183. package/dist/esm/global.d.ts +1 -0
  184. package/dist/esm/helpers/emails.d.ts +69 -0
  185. package/dist/esm/helpers/emails.d.ts.map +1 -0
  186. package/dist/esm/helpers/emails.js +243 -0
  187. package/dist/esm/helpers/emails.js.map +1 -0
  188. package/dist/esm/helpers/init-prompt.d.ts +5 -0
  189. package/dist/esm/helpers/init-prompt.d.ts.map +1 -0
  190. package/dist/esm/helpers/init-prompt.js +40 -0
  191. package/dist/esm/helpers/init-prompt.js.map +1 -0
  192. package/dist/esm/helpers/password.d.ts +7 -0
  193. package/dist/esm/helpers/password.d.ts.map +1 -0
  194. package/dist/esm/helpers/password.js +13 -0
  195. package/dist/esm/helpers/password.js.map +1 -0
  196. package/dist/esm/helpers/production-mode.d.ts +11 -0
  197. package/dist/esm/helpers/production-mode.d.ts.map +1 -0
  198. package/dist/esm/helpers/production-mode.js +46 -0
  199. package/dist/esm/helpers/production-mode.js.map +1 -0
  200. package/dist/esm/helpers/support-sla.d.ts +48 -0
  201. package/dist/esm/helpers/support-sla.d.ts.map +1 -0
  202. package/dist/esm/helpers/support-sla.js +65 -0
  203. package/dist/esm/helpers/support-sla.js.map +1 -0
  204. package/dist/esm/helpers/support-sla.test.d.ts +1 -0
  205. package/dist/esm/helpers/support-sla.test.js +102 -0
  206. package/dist/esm/helpers/support-sla.test.js.map +1 -0
  207. package/dist/esm/helpers/vault/client-side.d.ts +16 -0
  208. package/dist/esm/helpers/vault/client-side.d.ts.map +1 -0
  209. package/dist/esm/helpers/vault/client-side.js +69 -0
  210. package/dist/esm/helpers/vault/client-side.js.map +1 -0
  211. package/dist/esm/helpers/vault/server-side.d.ts +9 -0
  212. package/dist/esm/helpers/vault/server-side.d.ts.map +1 -0
  213. package/dist/esm/helpers/vault/server-side.js +123 -0
  214. package/dist/esm/helpers/vault/server-side.js.map +1 -0
  215. package/dist/esm/hooks/use-async-callback.d.ts +8 -0
  216. package/dist/esm/hooks/use-async-callback.d.ts.map +1 -0
  217. package/dist/esm/hooks/use-async-callback.js +38 -0
  218. package/dist/esm/hooks/use-async-callback.js.map +1 -0
  219. package/dist/esm/hooks/use-async-external-store.d.ts +9 -0
  220. package/dist/esm/hooks/use-async-external-store.d.ts.map +1 -0
  221. package/dist/esm/hooks/use-async-external-store.js +20 -0
  222. package/dist/esm/hooks/use-async-external-store.js.map +1 -0
  223. package/dist/esm/hooks/use-hash.d.ts +5 -0
  224. package/dist/esm/hooks/use-hash.d.ts.map +1 -0
  225. package/dist/esm/hooks/use-hash.js +15 -0
  226. package/dist/esm/hooks/use-hash.js.map +1 -0
  227. package/dist/esm/hooks/use-hover.d.ts +8 -0
  228. package/dist/esm/hooks/use-hover.d.ts.map +1 -0
  229. package/dist/esm/hooks/use-hover.js +59 -0
  230. package/dist/esm/hooks/use-hover.js.map +1 -0
  231. package/dist/esm/hooks/use-strict-memo.d.ts +10 -0
  232. package/dist/esm/hooks/use-strict-memo.d.ts.map +1 -0
  233. package/dist/esm/hooks/use-strict-memo.js +119 -0
  234. package/dist/esm/hooks/use-strict-memo.js.map +1 -0
  235. package/dist/esm/index.d.ts +5 -0
  236. package/dist/esm/index.js +6 -0
  237. package/dist/esm/interface/admin-interface.d.ts +308 -0
  238. package/dist/esm/interface/admin-interface.d.ts.map +1 -0
  239. package/dist/esm/interface/admin-interface.js +463 -0
  240. package/dist/esm/interface/admin-interface.js.map +1 -0
  241. package/dist/esm/interface/admin-metrics.d.ts +597 -0
  242. package/dist/esm/interface/admin-metrics.d.ts.map +1 -0
  243. package/dist/esm/interface/admin-metrics.js +134 -0
  244. package/dist/esm/interface/admin-metrics.js.map +1 -0
  245. package/dist/esm/interface/client-interface.d.ts +447 -0
  246. package/dist/esm/interface/client-interface.d.ts.map +1 -0
  247. package/dist/esm/interface/client-interface.js +1946 -0
  248. package/dist/esm/interface/client-interface.js.map +1 -0
  249. package/dist/esm/interface/client-interface.test.d.ts +1 -0
  250. package/dist/esm/interface/client-interface.test.js +559 -0
  251. package/dist/esm/interface/client-interface.test.js.map +1 -0
  252. package/dist/esm/interface/conversations.d.ts +314 -0
  253. package/dist/esm/interface/conversations.d.ts.map +1 -0
  254. package/dist/esm/interface/conversations.js +108 -0
  255. package/dist/esm/interface/conversations.js.map +1 -0
  256. package/dist/esm/interface/crud/analytics.d.ts +14 -0
  257. package/dist/esm/interface/crud/analytics.d.ts.map +1 -0
  258. package/dist/esm/interface/crud/analytics.js +1 -0
  259. package/dist/esm/interface/crud/connected-accounts.d.ts +69 -0
  260. package/dist/esm/interface/crud/connected-accounts.d.ts.map +1 -0
  261. package/dist/esm/interface/crud/connected-accounts.js +35 -0
  262. package/dist/esm/interface/crud/connected-accounts.js.map +1 -0
  263. package/dist/esm/interface/crud/contact-channels.d.ts +182 -0
  264. package/dist/esm/interface/crud/contact-channels.d.ts.map +1 -0
  265. package/dist/esm/interface/crud/contact-channels.js +68 -0
  266. package/dist/esm/interface/crud/contact-channels.js.map +1 -0
  267. package/dist/esm/interface/crud/current-user.d.ts +286 -0
  268. package/dist/esm/interface/crud/current-user.d.ts.map +1 -0
  269. package/dist/esm/interface/crud/current-user.js +69 -0
  270. package/dist/esm/interface/crud/current-user.js.map +1 -0
  271. package/dist/esm/interface/crud/email-outbox.d.ts +1466 -0
  272. package/dist/esm/interface/crud/email-outbox.d.ts.map +1 -0
  273. package/dist/esm/interface/crud/email-outbox.js +190 -0
  274. package/dist/esm/interface/crud/email-outbox.js.map +1 -0
  275. package/dist/esm/interface/crud/email-templates.d.ts +86 -0
  276. package/dist/esm/interface/crud/email-templates.d.ts.map +1 -0
  277. package/dist/esm/interface/crud/email-templates.js +46 -0
  278. package/dist/esm/interface/crud/email-templates.js.map +1 -0
  279. package/dist/esm/interface/crud/emails.d.ts +42 -0
  280. package/dist/esm/interface/crud/emails.d.ts.map +1 -0
  281. package/dist/esm/interface/crud/emails.js +19 -0
  282. package/dist/esm/interface/crud/emails.js.map +1 -0
  283. package/dist/esm/interface/crud/internal-api-keys.d.ts +141 -0
  284. package/dist/esm/interface/crud/internal-api-keys.d.ts.map +1 -0
  285. package/dist/esm/interface/crud/internal-api-keys.js +49 -0
  286. package/dist/esm/interface/crud/internal-api-keys.js.map +1 -0
  287. package/dist/esm/interface/crud/invoices.d.ts +43 -0
  288. package/dist/esm/interface/crud/invoices.d.ts.map +1 -0
  289. package/dist/esm/interface/crud/invoices.js +25 -0
  290. package/dist/esm/interface/crud/invoices.js.map +1 -0
  291. package/dist/esm/interface/crud/items.d.ts +31 -0
  292. package/dist/esm/interface/crud/items.d.ts.map +1 -0
  293. package/dist/esm/interface/crud/items.js +23 -0
  294. package/dist/esm/interface/crud/items.js.map +1 -0
  295. package/dist/esm/interface/crud/notification-preferences.d.ts +39 -0
  296. package/dist/esm/interface/crud/notification-preferences.d.ts.map +1 -0
  297. package/dist/esm/interface/crud/notification-preferences.js +31 -0
  298. package/dist/esm/interface/crud/notification-preferences.js.map +1 -0
  299. package/dist/esm/interface/crud/oauth-providers.d.ts +187 -0
  300. package/dist/esm/interface/crud/oauth-providers.d.ts.map +1 -0
  301. package/dist/esm/interface/crud/oauth-providers.js +75 -0
  302. package/dist/esm/interface/crud/oauth-providers.js.map +1 -0
  303. package/dist/esm/interface/crud/products.d.ts +182 -0
  304. package/dist/esm/interface/crud/products.d.ts.map +1 -0
  305. package/dist/esm/interface/crud/products.js +29 -0
  306. package/dist/esm/interface/crud/products.js.map +1 -0
  307. package/dist/esm/interface/crud/project-api-keys.d.ts +204 -0
  308. package/dist/esm/interface/crud/project-api-keys.d.ts.map +1 -0
  309. package/dist/esm/interface/crud/project-api-keys.js +72 -0
  310. package/dist/esm/interface/crud/project-api-keys.js.map +1 -0
  311. package/dist/esm/interface/crud/project-permissions.d.ts +162 -0
  312. package/dist/esm/interface/crud/project-permissions.d.ts.map +1 -0
  313. package/dist/esm/interface/crud/project-permissions.js +104 -0
  314. package/dist/esm/interface/crud/project-permissions.js.map +1 -0
  315. package/dist/esm/interface/crud/projects.d.ts +852 -0
  316. package/dist/esm/interface/crud/projects.d.ts.map +1 -0
  317. package/dist/esm/interface/crud/projects.js +193 -0
  318. package/dist/esm/interface/crud/projects.js.map +1 -0
  319. package/dist/esm/interface/crud/session-replays.d.ts +83 -0
  320. package/dist/esm/interface/crud/session-replays.d.ts.map +1 -0
  321. package/dist/esm/interface/crud/session-replays.js +1 -0
  322. package/dist/esm/interface/crud/sessions.d.ts +151 -0
  323. package/dist/esm/interface/crud/sessions.d.ts.map +1 -0
  324. package/dist/esm/interface/crud/sessions.js +56 -0
  325. package/dist/esm/interface/crud/sessions.js.map +1 -0
  326. package/dist/esm/interface/crud/sign-up-rules.d.ts +15 -0
  327. package/dist/esm/interface/crud/sign-up-rules.d.ts.map +1 -0
  328. package/dist/esm/interface/crud/sign-up-rules.js +1 -0
  329. package/dist/esm/interface/crud/svix-token.d.ts +32 -0
  330. package/dist/esm/interface/crud/svix-token.d.ts.map +1 -0
  331. package/dist/esm/interface/crud/svix-token.js +18 -0
  332. package/dist/esm/interface/crud/svix-token.js.map +1 -0
  333. package/dist/esm/interface/crud/team-invitation-details.d.ts +32 -0
  334. package/dist/esm/interface/crud/team-invitation-details.d.ts.map +1 -0
  335. package/dist/esm/interface/crud/team-invitation-details.js +21 -0
  336. package/dist/esm/interface/crud/team-invitation-details.js.map +1 -0
  337. package/dist/esm/interface/crud/team-invitation.d.ts +55 -0
  338. package/dist/esm/interface/crud/team-invitation.d.ts.map +1 -0
  339. package/dist/esm/interface/crud/team-invitation.js +37 -0
  340. package/dist/esm/interface/crud/team-invitation.js.map +1 -0
  341. package/dist/esm/interface/crud/team-member-profiles.d.ts +287 -0
  342. package/dist/esm/interface/crud/team-member-profiles.d.ts.map +1 -0
  343. package/dist/esm/interface/crud/team-member-profiles.js +58 -0
  344. package/dist/esm/interface/crud/team-member-profiles.js.map +1 -0
  345. package/dist/esm/interface/crud/team-memberships.d.ts +76 -0
  346. package/dist/esm/interface/crud/team-memberships.d.ts.map +1 -0
  347. package/dist/esm/interface/crud/team-memberships.js +54 -0
  348. package/dist/esm/interface/crud/team-memberships.js.map +1 -0
  349. package/dist/esm/interface/crud/team-permissions.d.ts +170 -0
  350. package/dist/esm/interface/crud/team-permissions.d.ts.map +1 -0
  351. package/dist/esm/interface/crud/team-permissions.js +105 -0
  352. package/dist/esm/interface/crud/team-permissions.js.map +1 -0
  353. package/dist/esm/interface/crud/teams.d.ts +300 -0
  354. package/dist/esm/interface/crud/teams.d.ts.map +1 -0
  355. package/dist/esm/interface/crud/teams.js +129 -0
  356. package/dist/esm/interface/crud/teams.js.map +1 -0
  357. package/dist/esm/interface/crud/transactions.d.ts +183 -0
  358. package/dist/esm/interface/crud/transactions.d.ts.map +1 -0
  359. package/dist/esm/interface/crud/transactions.js +85 -0
  360. package/dist/esm/interface/crud/transactions.js.map +1 -0
  361. package/dist/esm/interface/crud/users.d.ts +654 -0
  362. package/dist/esm/interface/crud/users.d.ts.map +1 -0
  363. package/dist/esm/interface/crud/users.js +181 -0
  364. package/dist/esm/interface/crud/users.js.map +1 -0
  365. package/dist/esm/interface/handler-urls.d.ts +51 -0
  366. package/dist/esm/interface/handler-urls.d.ts.map +1 -0
  367. package/dist/esm/interface/handler-urls.js +3 -0
  368. package/dist/esm/interface/page-component-versions.d.ts +25 -0
  369. package/dist/esm/interface/page-component-versions.d.ts.map +1 -0
  370. package/dist/esm/interface/page-component-versions.js +1661 -0
  371. package/dist/esm/interface/page-component-versions.js.map +1 -0
  372. package/dist/esm/interface/server-interface.d.ts +255 -0
  373. package/dist/esm/interface/server-interface.d.ts.map +1 -0
  374. package/dist/esm/interface/server-interface.js +459 -0
  375. package/dist/esm/interface/server-interface.js.map +1 -0
  376. package/dist/esm/interface/webhooks.d.ts +326 -0
  377. package/dist/esm/interface/webhooks.d.ts.map +1 -0
  378. package/dist/esm/interface/webhooks.js +22 -0
  379. package/dist/esm/interface/webhooks.js.map +1 -0
  380. package/dist/esm/known-errors.d.ts +575 -0
  381. package/dist/esm/known-errors.d.ts.map +1 -0
  382. package/dist/esm/known-errors.js +791 -0
  383. package/dist/esm/known-errors.js.map +1 -0
  384. package/dist/esm/local-emulator.d.ts +6 -0
  385. package/dist/esm/local-emulator.d.ts.map +1 -0
  386. package/dist/esm/local-emulator.js +7 -0
  387. package/dist/esm/local-emulator.js.map +1 -0
  388. package/dist/esm/payments/payment-methods.d.ts +64 -0
  389. package/dist/esm/payments/payment-methods.d.ts.map +1 -0
  390. package/dist/esm/payments/payment-methods.js +205 -0
  391. package/dist/esm/payments/payment-methods.js.map +1 -0
  392. package/dist/esm/payments/stripe-limits.d.ts +17 -0
  393. package/dist/esm/payments/stripe-limits.d.ts.map +1 -0
  394. package/dist/esm/payments/stripe-limits.js +17 -0
  395. package/dist/esm/payments/stripe-limits.js.map +1 -0
  396. package/dist/esm/plans.d.ts +72 -0
  397. package/dist/esm/plans.d.ts.map +1 -0
  398. package/dist/esm/plans.js +81 -0
  399. package/dist/esm/plans.js.map +1 -0
  400. package/dist/esm/schema-fields.d.ts +472 -0
  401. package/dist/esm/schema-fields.d.ts.map +1 -0
  402. package/dist/esm/schema-fields.js +1009 -0
  403. package/dist/esm/schema-fields.js.map +1 -0
  404. package/dist/esm/sessions.d.ts +165 -0
  405. package/dist/esm/sessions.d.ts.map +1 -0
  406. package/dist/esm/sessions.js +226 -0
  407. package/dist/esm/sessions.js.map +1 -0
  408. package/dist/esm/stack-config-file.d.ts +15 -0
  409. package/dist/esm/stack-config-file.d.ts.map +1 -0
  410. package/dist/esm/stack-config-file.js +76 -0
  411. package/dist/esm/stack-config-file.js.map +1 -0
  412. package/dist/esm/utils/api-keys.d.ts +26 -0
  413. package/dist/esm/utils/api-keys.d.ts.map +1 -0
  414. package/dist/esm/utils/api-keys.js +77 -0
  415. package/dist/esm/utils/api-keys.js.map +1 -0
  416. package/dist/esm/utils/arrays.d.ts +25 -0
  417. package/dist/esm/utils/arrays.d.ts.map +1 -0
  418. package/dist/esm/utils/arrays.js +552 -0
  419. package/dist/esm/utils/arrays.js.map +1 -0
  420. package/dist/esm/utils/auth-methods.d.ts +6 -0
  421. package/dist/esm/utils/auth-methods.d.ts.map +1 -0
  422. package/dist/esm/utils/auth-methods.js +11 -0
  423. package/dist/esm/utils/auth-methods.js.map +1 -0
  424. package/dist/esm/utils/base64.d.ts +6 -0
  425. package/dist/esm/utils/base64.d.ts.map +1 -0
  426. package/dist/esm/utils/base64.js +25 -0
  427. package/dist/esm/utils/base64.js.map +1 -0
  428. package/dist/esm/utils/booleans.d.ts +8 -0
  429. package/dist/esm/utils/booleans.d.ts.map +1 -0
  430. package/dist/esm/utils/booleans.js +35 -0
  431. package/dist/esm/utils/booleans.js.map +1 -0
  432. package/dist/esm/utils/browser-compat.d.ts +10 -0
  433. package/dist/esm/utils/browser-compat.d.ts.map +1 -0
  434. package/dist/esm/utils/browser-compat.js +21 -0
  435. package/dist/esm/utils/browser-compat.js.map +1 -0
  436. package/dist/esm/utils/bytes.d.ts +17 -0
  437. package/dist/esm/utils/bytes.d.ts.map +1 -0
  438. package/dist/esm/utils/bytes.js +290 -0
  439. package/dist/esm/utils/bytes.js.map +1 -0
  440. package/dist/esm/utils/caches.d.ts +102 -0
  441. package/dist/esm/utils/caches.d.ts.map +1 -0
  442. package/dist/esm/utils/caches.js +185 -0
  443. package/dist/esm/utils/caches.js.map +1 -0
  444. package/dist/esm/utils/cel-fields.d.ts +23 -0
  445. package/dist/esm/utils/cel-fields.d.ts.map +1 -0
  446. package/dist/esm/utils/cel-fields.js +99 -0
  447. package/dist/esm/utils/cel-fields.js.map +1 -0
  448. package/dist/esm/utils/compile-time.d.ts +10 -0
  449. package/dist/esm/utils/compile-time.d.ts.map +1 -0
  450. package/dist/esm/utils/compile-time.js +14 -0
  451. package/dist/esm/utils/compile-time.js.map +1 -0
  452. package/dist/esm/utils/country-codes.d.ts +11 -0
  453. package/dist/esm/utils/country-codes.d.ts.map +1 -0
  454. package/dist/esm/utils/country-codes.js +36 -0
  455. package/dist/esm/utils/country-codes.js.map +1 -0
  456. package/dist/esm/utils/crypto.d.ts +48 -0
  457. package/dist/esm/utils/crypto.d.ts.map +1 -0
  458. package/dist/esm/utils/crypto.js +208 -0
  459. package/dist/esm/utils/crypto.js.map +1 -0
  460. package/dist/esm/utils/currencies.d.ts +8 -0
  461. package/dist/esm/utils/currencies.d.ts.map +1 -0
  462. package/dist/esm/utils/currencies.js +50 -0
  463. package/dist/esm/utils/currencies.js.map +1 -0
  464. package/dist/esm/utils/currency-constants.d.ts +39 -0
  465. package/dist/esm/utils/currency-constants.d.ts.map +1 -0
  466. package/dist/esm/utils/currency-constants.js +42 -0
  467. package/dist/esm/utils/currency-constants.js.map +1 -0
  468. package/dist/esm/utils/dates.d.ts +23 -0
  469. package/dist/esm/utils/dates.d.ts.map +1 -0
  470. package/dist/esm/utils/dates.js +167 -0
  471. package/dist/esm/utils/dates.js.map +1 -0
  472. package/dist/esm/utils/dev-env-state-path.d.ts +6 -0
  473. package/dist/esm/utils/dev-env-state-path.d.ts.map +1 -0
  474. package/dist/esm/utils/dev-env-state-path.js +15 -0
  475. package/dist/esm/utils/dev-env-state-path.js.map +1 -0
  476. package/dist/esm/utils/dom.d.ts +5 -0
  477. package/dist/esm/utils/dom.d.ts.map +1 -0
  478. package/dist/esm/utils/dom.js +11 -0
  479. package/dist/esm/utils/dom.js.map +1 -0
  480. package/dist/esm/utils/env.d.ts +25 -0
  481. package/dist/esm/utils/env.d.ts.map +1 -0
  482. package/dist/esm/utils/env.js +78 -0
  483. package/dist/esm/utils/env.js.map +1 -0
  484. package/dist/esm/utils/errors.d.ts +231 -0
  485. package/dist/esm/utils/errors.d.ts.map +1 -0
  486. package/dist/esm/utils/errors.js +385 -0
  487. package/dist/esm/utils/errors.js.map +1 -0
  488. package/dist/esm/utils/esbuild.d.ts +16 -0
  489. package/dist/esm/utils/esbuild.d.ts.map +1 -0
  490. package/dist/esm/utils/esbuild.js +182 -0
  491. package/dist/esm/utils/esbuild.js.map +1 -0
  492. package/dist/esm/utils/featurebase.d.ts +30 -0
  493. package/dist/esm/utils/featurebase.d.ts.map +1 -0
  494. package/dist/esm/utils/featurebase.js +166 -0
  495. package/dist/esm/utils/featurebase.js.map +1 -0
  496. package/dist/esm/utils/fs.d.ts +9 -0
  497. package/dist/esm/utils/fs.d.ts.map +1 -0
  498. package/dist/esm/utils/fs.js +25 -0
  499. package/dist/esm/utils/fs.js.map +1 -0
  500. package/dist/esm/utils/functions.d.ts +6 -0
  501. package/dist/esm/utils/functions.d.ts.map +1 -0
  502. package/dist/esm/utils/functions.js +34 -0
  503. package/dist/esm/utils/functions.js.map +1 -0
  504. package/dist/esm/utils/geo.d.ts +24 -0
  505. package/dist/esm/utils/geo.d.ts.map +1 -0
  506. package/dist/esm/utils/geo.js +16 -0
  507. package/dist/esm/utils/geo.js.map +1 -0
  508. package/dist/esm/utils/globals.d.ts +13 -0
  509. package/dist/esm/utils/globals.d.ts.map +1 -0
  510. package/dist/esm/utils/globals.js +34 -0
  511. package/dist/esm/utils/globals.js.map +1 -0
  512. package/dist/esm/utils/hashes.d.ts +9 -0
  513. package/dist/esm/utils/hashes.d.ts.map +1 -0
  514. package/dist/esm/utils/hashes.js +40 -0
  515. package/dist/esm/utils/hashes.js.map +1 -0
  516. package/dist/esm/utils/html.d.ts +7 -0
  517. package/dist/esm/utils/html.d.ts.map +1 -0
  518. package/dist/esm/utils/html.js +33 -0
  519. package/dist/esm/utils/html.js.map +1 -0
  520. package/dist/esm/utils/http.d.ts +45 -0
  521. package/dist/esm/utils/http.d.ts.map +1 -0
  522. package/dist/esm/utils/http.js +75 -0
  523. package/dist/esm/utils/http.js.map +1 -0
  524. package/dist/esm/utils/ips.d.ts +8 -0
  525. package/dist/esm/utils/ips.d.ts.map +1 -0
  526. package/dist/esm/utils/ips.js +36 -0
  527. package/dist/esm/utils/ips.js.map +1 -0
  528. package/dist/esm/utils/json.d.ts +15 -0
  529. package/dist/esm/utils/json.d.ts.map +1 -0
  530. package/dist/esm/utils/json.js +178 -0
  531. package/dist/esm/utils/json.js.map +1 -0
  532. package/dist/esm/utils/jsx-editable-transpiler.d.ts +68 -0
  533. package/dist/esm/utils/jsx-editable-transpiler.d.ts.map +1 -0
  534. package/dist/esm/utils/jsx-editable-transpiler.js +216 -0
  535. package/dist/esm/utils/jsx-editable-transpiler.js.map +1 -0
  536. package/dist/esm/utils/jsx-editable-transpiler.test.d.ts +1 -0
  537. package/dist/esm/utils/jsx-editable-transpiler.test.js +122 -0
  538. package/dist/esm/utils/jsx-editable-transpiler.test.js.map +1 -0
  539. package/dist/esm/utils/jwt.d.ts +79 -0
  540. package/dist/esm/utils/jwt.d.ts.map +1 -0
  541. package/dist/esm/utils/jwt.js +102 -0
  542. package/dist/esm/utils/jwt.js.map +1 -0
  543. package/dist/esm/utils/locks.d.ts +17 -0
  544. package/dist/esm/utils/locks.d.ts.map +1 -0
  545. package/dist/esm/utils/locks.js +54 -0
  546. package/dist/esm/utils/locks.js.map +1 -0
  547. package/dist/esm/utils/maps.d.ts +61 -0
  548. package/dist/esm/utils/maps.d.ts.map +1 -0
  549. package/dist/esm/utils/maps.js +297 -0
  550. package/dist/esm/utils/maps.js.map +1 -0
  551. package/dist/esm/utils/math.d.ts +8 -0
  552. package/dist/esm/utils/math.d.ts.map +1 -0
  553. package/dist/esm/utils/math.js +21 -0
  554. package/dist/esm/utils/math.js.map +1 -0
  555. package/dist/esm/utils/monkey-patch.d.ts +7 -0
  556. package/dist/esm/utils/monkey-patch.d.ts.map +1 -0
  557. package/dist/esm/utils/monkey-patch.js +21 -0
  558. package/dist/esm/utils/monkey-patch.js.map +1 -0
  559. package/dist/esm/utils/node-http.d.ts +17 -0
  560. package/dist/esm/utils/node-http.d.ts.map +1 -0
  561. package/dist/esm/utils/node-http.js +38 -0
  562. package/dist/esm/utils/node-http.js.map +1 -0
  563. package/dist/esm/utils/numbers.d.ts +7 -0
  564. package/dist/esm/utils/numbers.d.ts.map +1 -0
  565. package/dist/esm/utils/numbers.js +75 -0
  566. package/dist/esm/utils/numbers.js.map +1 -0
  567. package/dist/esm/utils/oauth.d.ts +11 -0
  568. package/dist/esm/utils/oauth.d.ts.map +1 -0
  569. package/dist/esm/utils/oauth.js +27 -0
  570. package/dist/esm/utils/oauth.js.map +1 -0
  571. package/dist/esm/utils/objects.d.ts +59 -0
  572. package/dist/esm/utils/objects.d.ts.map +1 -0
  573. package/dist/esm/utils/objects.js +818 -0
  574. package/dist/esm/utils/objects.js.map +1 -0
  575. package/dist/esm/utils/paginated-lists.d.ts +442 -0
  576. package/dist/esm/utils/paginated-lists.d.ts.map +1 -0
  577. package/dist/esm/utils/paginated-lists.js +411 -0
  578. package/dist/esm/utils/paginated-lists.js.map +1 -0
  579. package/dist/esm/utils/paginated-lists.test.d.ts +1 -0
  580. package/dist/esm/utils/paginated-lists.test.js +1304 -0
  581. package/dist/esm/utils/paginated-lists.test.js.map +1 -0
  582. package/dist/esm/utils/passkey.d.ts +2 -0
  583. package/dist/esm/utils/passkey.js +1 -0
  584. package/dist/esm/utils/promises.d.ts +80 -0
  585. package/dist/esm/utils/promises.d.ts.map +1 -0
  586. package/dist/esm/utils/promises.js +333 -0
  587. package/dist/esm/utils/promises.js.map +1 -0
  588. package/dist/esm/utils/proxies.d.ts +13 -0
  589. package/dist/esm/utils/proxies.d.ts.map +1 -0
  590. package/dist/esm/utils/proxies.js +197 -0
  591. package/dist/esm/utils/proxies.js.map +1 -0
  592. package/dist/esm/utils/react.d.ts +61 -0
  593. package/dist/esm/utils/react.d.ts.map +1 -0
  594. package/dist/esm/utils/react.js +229 -0
  595. package/dist/esm/utils/react.js.map +1 -0
  596. package/dist/esm/utils/redirect-urls.d.ts +30 -0
  597. package/dist/esm/utils/redirect-urls.d.ts.map +1 -0
  598. package/dist/esm/utils/redirect-urls.js +215 -0
  599. package/dist/esm/utils/redirect-urls.js.map +1 -0
  600. package/dist/esm/utils/regex.d.ts +5 -0
  601. package/dist/esm/utils/regex.d.ts.map +1 -0
  602. package/dist/esm/utils/regex.js +13 -0
  603. package/dist/esm/utils/regex.js.map +1 -0
  604. package/dist/esm/utils/results.d.ts +70 -0
  605. package/dist/esm/utils/results.d.ts.map +1 -0
  606. package/dist/esm/utils/results.js +339 -0
  607. package/dist/esm/utils/results.js.map +1 -0
  608. package/dist/esm/utils/sentry.d.ts +13 -0
  609. package/dist/esm/utils/sentry.d.ts.map +1 -0
  610. package/dist/esm/utils/sentry.js +14 -0
  611. package/dist/esm/utils/sentry.js.map +1 -0
  612. package/dist/esm/utils/stores.d.ts +104 -0
  613. package/dist/esm/utils/stores.d.ts.map +1 -0
  614. package/dist/esm/utils/stores.js +175 -0
  615. package/dist/esm/utils/stores.js.map +1 -0
  616. package/dist/esm/utils/strings.d.ts +76 -0
  617. package/dist/esm/utils/strings.d.ts.map +1 -0
  618. package/dist/esm/utils/strings.js +530 -0
  619. package/dist/esm/utils/strings.js.map +1 -0
  620. package/dist/esm/utils/strings.nicify.test.d.ts +1 -0
  621. package/dist/esm/utils/strings.nicify.test.js +243 -0
  622. package/dist/esm/utils/strings.nicify.test.js.map +1 -0
  623. package/dist/esm/utils/telemetry.d.ts +15 -0
  624. package/dist/esm/utils/telemetry.d.ts.map +1 -0
  625. package/dist/esm/utils/telemetry.js +31 -0
  626. package/dist/esm/utils/telemetry.js.map +1 -0
  627. package/dist/esm/utils/turnstile-browser.d.ts +32 -0
  628. package/dist/esm/utils/turnstile-browser.d.ts.map +1 -0
  629. package/dist/esm/utils/turnstile-browser.js +61 -0
  630. package/dist/esm/utils/turnstile-browser.js.map +1 -0
  631. package/dist/esm/utils/turnstile-flow.d.ts +29 -0
  632. package/dist/esm/utils/turnstile-flow.d.ts.map +1 -0
  633. package/dist/esm/utils/turnstile-flow.js +219 -0
  634. package/dist/esm/utils/turnstile-flow.js.map +1 -0
  635. package/dist/esm/utils/turnstile-flow.test.d.ts +1 -0
  636. package/dist/esm/utils/turnstile-flow.test.js +75 -0
  637. package/dist/esm/utils/turnstile-flow.test.js.map +1 -0
  638. package/dist/esm/utils/turnstile.d.ts +17 -0
  639. package/dist/esm/utils/turnstile.d.ts.map +1 -0
  640. package/dist/esm/utils/turnstile.js +25 -0
  641. package/dist/esm/utils/turnstile.js.map +1 -0
  642. package/dist/esm/utils/typed-arrays.d.ts +14 -0
  643. package/dist/esm/utils/typed-arrays.d.ts.map +1 -0
  644. package/dist/esm/utils/typed-arrays.js +20 -0
  645. package/dist/esm/utils/typed-arrays.js.map +1 -0
  646. package/dist/esm/utils/types.d.ts +77 -0
  647. package/dist/esm/utils/types.d.ts.map +1 -0
  648. package/dist/esm/utils/types.js +55 -0
  649. package/dist/esm/utils/types.js.map +1 -0
  650. package/dist/esm/utils/unicode.d.ts +5 -0
  651. package/dist/esm/utils/unicode.d.ts.map +1 -0
  652. package/dist/esm/utils/unicode.js +24 -0
  653. package/dist/esm/utils/unicode.js.map +1 -0
  654. package/dist/esm/utils/urls.d.ts +28 -0
  655. package/dist/esm/utils/urls.d.ts.map +1 -0
  656. package/dist/esm/utils/urls.js +259 -0
  657. package/dist/esm/utils/urls.js.map +1 -0
  658. package/dist/esm/utils/uuids.d.ts +6 -0
  659. package/dist/esm/utils/uuids.d.ts.map +1 -0
  660. package/dist/esm/utils/uuids.js +36 -0
  661. package/dist/esm/utils/uuids.js.map +1 -0
  662. package/dist/global.d.d.ts +0 -0
  663. package/dist/global.d.ts +1 -0
  664. package/dist/helpers/emails.d.ts +69 -0
  665. package/dist/helpers/emails.d.ts.map +1 -0
  666. package/dist/helpers/emails.js +252 -0
  667. package/dist/helpers/emails.js.map +1 -0
  668. package/dist/helpers/init-prompt.d.ts +5 -0
  669. package/dist/helpers/init-prompt.d.ts.map +1 -0
  670. package/dist/helpers/init-prompt.js +42 -0
  671. package/dist/helpers/init-prompt.js.map +1 -0
  672. package/dist/helpers/password.d.ts +6 -0
  673. package/dist/helpers/password.d.ts.map +1 -0
  674. package/dist/helpers/password.js +15 -0
  675. package/dist/helpers/password.js.map +1 -0
  676. package/dist/helpers/production-mode.d.ts +11 -0
  677. package/dist/helpers/production-mode.d.ts.map +1 -0
  678. package/dist/helpers/production-mode.js +48 -0
  679. package/dist/helpers/production-mode.js.map +1 -0
  680. package/dist/helpers/support-sla.d.ts +48 -0
  681. package/dist/helpers/support-sla.d.ts.map +1 -0
  682. package/dist/helpers/support-sla.js +72 -0
  683. package/dist/helpers/support-sla.js.map +1 -0
  684. package/dist/helpers/support-sla.test.d.ts +1 -0
  685. package/dist/helpers/support-sla.test.js +102 -0
  686. package/dist/helpers/support-sla.test.js.map +1 -0
  687. package/dist/helpers/vault/client-side.d.ts +16 -0
  688. package/dist/helpers/vault/client-side.d.ts.map +1 -0
  689. package/dist/helpers/vault/client-side.js +73 -0
  690. package/dist/helpers/vault/client-side.js.map +1 -0
  691. package/dist/helpers/vault/server-side.d.ts +9 -0
  692. package/dist/helpers/vault/server-side.d.ts.map +1 -0
  693. package/dist/helpers/vault/server-side.js +126 -0
  694. package/dist/helpers/vault/server-side.js.map +1 -0
  695. package/dist/hooks/use-async-callback.d.ts +8 -0
  696. package/dist/hooks/use-async-callback.d.ts.map +1 -0
  697. package/dist/hooks/use-async-callback.js +42 -0
  698. package/dist/hooks/use-async-callback.js.map +1 -0
  699. package/dist/hooks/use-async-external-store.d.ts +9 -0
  700. package/dist/hooks/use-async-external-store.d.ts.map +1 -0
  701. package/dist/hooks/use-async-external-store.js +22 -0
  702. package/dist/hooks/use-async-external-store.js.map +1 -0
  703. package/dist/hooks/use-hash.d.ts +5 -0
  704. package/dist/hooks/use-hash.d.ts.map +1 -0
  705. package/dist/hooks/use-hash.js +17 -0
  706. package/dist/hooks/use-hash.js.map +1 -0
  707. package/dist/hooks/use-hover.d.ts +8 -0
  708. package/dist/hooks/use-hover.d.ts.map +1 -0
  709. package/dist/hooks/use-hover.js +61 -0
  710. package/dist/hooks/use-hover.js.map +1 -0
  711. package/dist/hooks/use-strict-memo.d.ts +10 -0
  712. package/dist/hooks/use-strict-memo.d.ts.map +1 -0
  713. package/dist/hooks/use-strict-memo.js +121 -0
  714. package/dist/hooks/use-strict-memo.js.map +1 -0
  715. package/dist/index-D9ysacya.d.ts +153 -0
  716. package/dist/index-D9ysacya.d.ts.map +1 -0
  717. package/dist/index.d.ts +5 -0
  718. package/dist/index.js +37 -0
  719. package/dist/interface/admin-interface.d.ts +308 -0
  720. package/dist/interface/admin-interface.d.ts.map +1 -0
  721. package/dist/interface/admin-interface.js +465 -0
  722. package/dist/interface/admin-interface.js.map +1 -0
  723. package/dist/interface/admin-metrics.d.ts +597 -0
  724. package/dist/interface/admin-metrics.d.ts.map +1 -0
  725. package/dist/interface/admin-metrics.js +153 -0
  726. package/dist/interface/admin-metrics.js.map +1 -0
  727. package/dist/interface/client-interface.d.ts +447 -0
  728. package/dist/interface/client-interface.d.ts.map +1 -0
  729. package/dist/interface/client-interface.js +1948 -0
  730. package/dist/interface/client-interface.js.map +1 -0
  731. package/dist/interface/client-interface.test.d.ts +1 -0
  732. package/dist/interface/client-interface.test.js +559 -0
  733. package/dist/interface/client-interface.test.js.map +1 -0
  734. package/dist/interface/conversations.d.ts +314 -0
  735. package/dist/interface/conversations.d.ts.map +1 -0
  736. package/dist/interface/conversations.js +121 -0
  737. package/dist/interface/conversations.js.map +1 -0
  738. package/dist/interface/crud/analytics.d.ts +14 -0
  739. package/dist/interface/crud/analytics.d.ts.map +1 -0
  740. package/dist/interface/crud/analytics.js +0 -0
  741. package/dist/interface/crud/connected-accounts.d.ts +68 -0
  742. package/dist/interface/crud/connected-accounts.d.ts.map +1 -0
  743. package/dist/interface/crud/connected-accounts.js +41 -0
  744. package/dist/interface/crud/connected-accounts.js.map +1 -0
  745. package/dist/interface/crud/contact-channels.d.ts +181 -0
  746. package/dist/interface/crud/contact-channels.d.ts.map +1 -0
  747. package/dist/interface/crud/contact-channels.js +76 -0
  748. package/dist/interface/crud/contact-channels.js.map +1 -0
  749. package/dist/interface/crud/current-user.d.ts +285 -0
  750. package/dist/interface/crud/current-user.d.ts.map +1 -0
  751. package/dist/interface/crud/current-user.js +71 -0
  752. package/dist/interface/crud/current-user.js.map +1 -0
  753. package/dist/interface/crud/email-outbox.d.ts +1465 -0
  754. package/dist/interface/crud/email-outbox.d.ts.map +1 -0
  755. package/dist/interface/crud/email-outbox.js +195 -0
  756. package/dist/interface/crud/email-outbox.js.map +1 -0
  757. package/dist/interface/crud/email-templates.d.ts +85 -0
  758. package/dist/interface/crud/email-templates.d.ts.map +1 -0
  759. package/dist/interface/crud/email-templates.js +53 -0
  760. package/dist/interface/crud/email-templates.js.map +1 -0
  761. package/dist/interface/crud/emails.d.ts +41 -0
  762. package/dist/interface/crud/emails.d.ts.map +1 -0
  763. package/dist/interface/crud/emails.js +23 -0
  764. package/dist/interface/crud/emails.js.map +1 -0
  765. package/dist/interface/crud/internal-api-keys.d.ts +140 -0
  766. package/dist/interface/crud/internal-api-keys.d.ts.map +1 -0
  767. package/dist/interface/crud/internal-api-keys.js +56 -0
  768. package/dist/interface/crud/internal-api-keys.js.map +1 -0
  769. package/dist/interface/crud/invoices.d.ts +43 -0
  770. package/dist/interface/crud/invoices.d.ts.map +1 -0
  771. package/dist/interface/crud/invoices.js +28 -0
  772. package/dist/interface/crud/invoices.js.map +1 -0
  773. package/dist/interface/crud/items.d.ts +30 -0
  774. package/dist/interface/crud/items.d.ts.map +1 -0
  775. package/dist/interface/crud/items.js +25 -0
  776. package/dist/interface/crud/items.js.map +1 -0
  777. package/dist/interface/crud/notification-preferences.d.ts +38 -0
  778. package/dist/interface/crud/notification-preferences.d.ts.map +1 -0
  779. package/dist/interface/crud/notification-preferences.js +33 -0
  780. package/dist/interface/crud/notification-preferences.js.map +1 -0
  781. package/dist/interface/crud/oauth-providers.d.ts +186 -0
  782. package/dist/interface/crud/oauth-providers.d.ts.map +1 -0
  783. package/dist/interface/crud/oauth-providers.js +83 -0
  784. package/dist/interface/crud/oauth-providers.js.map +1 -0
  785. package/dist/interface/crud/products.d.ts +182 -0
  786. package/dist/interface/crud/products.d.ts.map +1 -0
  787. package/dist/interface/crud/products.js +32 -0
  788. package/dist/interface/crud/products.js.map +1 -0
  789. package/dist/interface/crud/project-api-keys.d.ts +203 -0
  790. package/dist/interface/crud/project-api-keys.d.ts.map +1 -0
  791. package/dist/interface/crud/project-api-keys.js +79 -0
  792. package/dist/interface/crud/project-api-keys.js.map +1 -0
  793. package/dist/interface/crud/project-permissions.d.ts +161 -0
  794. package/dist/interface/crud/project-permissions.d.ts.map +1 -0
  795. package/dist/interface/crud/project-permissions.js +116 -0
  796. package/dist/interface/crud/project-permissions.js.map +1 -0
  797. package/dist/interface/crud/projects.d.ts +851 -0
  798. package/dist/interface/crud/projects.d.ts.map +1 -0
  799. package/dist/interface/crud/projects.js +204 -0
  800. package/dist/interface/crud/projects.js.map +1 -0
  801. package/dist/interface/crud/session-replays.d.ts +83 -0
  802. package/dist/interface/crud/session-replays.d.ts.map +1 -0
  803. package/dist/interface/crud/session-replays.js +0 -0
  804. package/dist/interface/crud/sessions.d.ts +150 -0
  805. package/dist/interface/crud/sessions.d.ts.map +1 -0
  806. package/dist/interface/crud/sessions.js +62 -0
  807. package/dist/interface/crud/sessions.js.map +1 -0
  808. package/dist/interface/crud/sign-up-rules.d.ts +15 -0
  809. package/dist/interface/crud/sign-up-rules.d.ts.map +1 -0
  810. package/dist/interface/crud/sign-up-rules.js +0 -0
  811. package/dist/interface/crud/svix-token.d.ts +31 -0
  812. package/dist/interface/crud/svix-token.d.ts.map +1 -0
  813. package/dist/interface/crud/svix-token.js +22 -0
  814. package/dist/interface/crud/svix-token.js.map +1 -0
  815. package/dist/interface/crud/team-invitation-details.d.ts +31 -0
  816. package/dist/interface/crud/team-invitation-details.d.ts.map +1 -0
  817. package/dist/interface/crud/team-invitation-details.js +24 -0
  818. package/dist/interface/crud/team-invitation-details.js.map +1 -0
  819. package/dist/interface/crud/team-invitation.d.ts +54 -0
  820. package/dist/interface/crud/team-invitation.d.ts.map +1 -0
  821. package/dist/interface/crud/team-invitation.js +40 -0
  822. package/dist/interface/crud/team-invitation.js.map +1 -0
  823. package/dist/interface/crud/team-member-profiles.d.ts +286 -0
  824. package/dist/interface/crud/team-member-profiles.d.ts.map +1 -0
  825. package/dist/interface/crud/team-member-profiles.js +63 -0
  826. package/dist/interface/crud/team-member-profiles.js.map +1 -0
  827. package/dist/interface/crud/team-memberships.d.ts +75 -0
  828. package/dist/interface/crud/team-memberships.d.ts.map +1 -0
  829. package/dist/interface/crud/team-memberships.js +61 -0
  830. package/dist/interface/crud/team-memberships.js.map +1 -0
  831. package/dist/interface/crud/team-permissions.d.ts +169 -0
  832. package/dist/interface/crud/team-permissions.d.ts.map +1 -0
  833. package/dist/interface/crud/team-permissions.js +117 -0
  834. package/dist/interface/crud/team-permissions.js.map +1 -0
  835. package/dist/interface/crud/teams.d.ts +299 -0
  836. package/dist/interface/crud/teams.d.ts.map +1 -0
  837. package/dist/interface/crud/teams.js +142 -0
  838. package/dist/interface/crud/teams.js.map +1 -0
  839. package/dist/interface/crud/transactions.d.ts +183 -0
  840. package/dist/interface/crud/transactions.d.ts.map +1 -0
  841. package/dist/interface/crud/transactions.js +89 -0
  842. package/dist/interface/crud/transactions.js.map +1 -0
  843. package/dist/interface/crud/users.d.ts +653 -0
  844. package/dist/interface/crud/users.d.ts.map +1 -0
  845. package/dist/interface/crud/users.js +193 -0
  846. package/dist/interface/crud/users.js.map +1 -0
  847. package/dist/interface/handler-urls.d.ts +51 -0
  848. package/dist/interface/handler-urls.d.ts.map +1 -0
  849. package/dist/interface/handler-urls.js +16 -0
  850. package/dist/interface/page-component-versions.d.ts +25 -0
  851. package/dist/interface/page-component-versions.d.ts.map +1 -0
  852. package/dist/interface/page-component-versions.js +1664 -0
  853. package/dist/interface/page-component-versions.js.map +1 -0
  854. package/dist/interface/server-interface.d.ts +255 -0
  855. package/dist/interface/server-interface.d.ts.map +1 -0
  856. package/dist/interface/server-interface.js +461 -0
  857. package/dist/interface/server-interface.js.map +1 -0
  858. package/dist/interface/webhooks.d.ts +326 -0
  859. package/dist/interface/webhooks.d.ts.map +1 -0
  860. package/dist/interface/webhooks.js +24 -0
  861. package/dist/interface/webhooks.js.map +1 -0
  862. package/dist/known-errors.d.ts +575 -0
  863. package/dist/known-errors.d.ts.map +1 -0
  864. package/dist/known-errors.js +794 -0
  865. package/dist/known-errors.js.map +1 -0
  866. package/dist/local-emulator.d.ts +6 -0
  867. package/dist/local-emulator.d.ts.map +1 -0
  868. package/dist/local-emulator.js +10 -0
  869. package/dist/local-emulator.js.map +1 -0
  870. package/dist/payments/payment-methods.d.ts +64 -0
  871. package/dist/payments/payment-methods.d.ts.map +1 -0
  872. package/dist/payments/payment-methods.js +216 -0
  873. package/dist/payments/payment-methods.js.map +1 -0
  874. package/dist/payments/stripe-limits.d.ts +17 -0
  875. package/dist/payments/stripe-limits.d.ts.map +1 -0
  876. package/dist/payments/stripe-limits.js +20 -0
  877. package/dist/payments/stripe-limits.js.map +1 -0
  878. package/dist/plans.d.ts +72 -0
  879. package/dist/plans.d.ts.map +1 -0
  880. package/dist/plans.js +88 -0
  881. package/dist/plans.js.map +1 -0
  882. package/dist/schema-fields.d.ts +472 -0
  883. package/dist/schema-fields.d.ts.map +1 -0
  884. package/dist/schema-fields.js +1188 -0
  885. package/dist/schema-fields.js.map +1 -0
  886. package/dist/sessions.d.ts +165 -0
  887. package/dist/sessions.d.ts.map +1 -0
  888. package/dist/sessions.js +231 -0
  889. package/dist/sessions.js.map +1 -0
  890. package/dist/stack-config-file.d.ts +15 -0
  891. package/dist/stack-config-file.d.ts.map +1 -0
  892. package/dist/stack-config-file.js +82 -0
  893. package/dist/stack-config-file.js.map +1 -0
  894. package/dist/utils/api-keys.d.ts +26 -0
  895. package/dist/utils/api-keys.d.ts.map +1 -0
  896. package/dist/utils/api-keys.js +82 -0
  897. package/dist/utils/api-keys.js.map +1 -0
  898. package/dist/utils/arrays.d.ts +25 -0
  899. package/dist/utils/arrays.d.ts.map +1 -0
  900. package/dist/utils/arrays.js +569 -0
  901. package/dist/utils/arrays.js.map +1 -0
  902. package/dist/utils/auth-methods.d.ts +6 -0
  903. package/dist/utils/auth-methods.d.ts.map +1 -0
  904. package/dist/utils/auth-methods.js +13 -0
  905. package/dist/utils/auth-methods.js.map +1 -0
  906. package/dist/utils/base64.d.ts +6 -0
  907. package/dist/utils/base64.d.ts.map +1 -0
  908. package/dist/utils/base64.js +28 -0
  909. package/dist/utils/base64.js.map +1 -0
  910. package/dist/utils/booleans.d.ts +8 -0
  911. package/dist/utils/booleans.d.ts.map +1 -0
  912. package/dist/utils/booleans.js +38 -0
  913. package/dist/utils/booleans.js.map +1 -0
  914. package/dist/utils/browser-compat.d.ts +10 -0
  915. package/dist/utils/browser-compat.d.ts.map +1 -0
  916. package/dist/utils/browser-compat.js +23 -0
  917. package/dist/utils/browser-compat.js.map +1 -0
  918. package/dist/utils/bytes.d.ts +17 -0
  919. package/dist/utils/bytes.d.ts.map +1 -0
  920. package/dist/utils/bytes.js +304 -0
  921. package/dist/utils/bytes.js.map +1 -0
  922. package/dist/utils/caches.d.ts +102 -0
  923. package/dist/utils/caches.d.ts.map +1 -0
  924. package/dist/utils/caches.js +188 -0
  925. package/dist/utils/caches.js.map +1 -0
  926. package/dist/utils/cel-fields.d.ts +23 -0
  927. package/dist/utils/cel-fields.d.ts.map +1 -0
  928. package/dist/utils/cel-fields.js +108 -0
  929. package/dist/utils/cel-fields.js.map +1 -0
  930. package/dist/utils/compile-time.d.ts +10 -0
  931. package/dist/utils/compile-time.d.ts.map +1 -0
  932. package/dist/utils/compile-time.js +16 -0
  933. package/dist/utils/compile-time.js.map +1 -0
  934. package/dist/utils/country-codes.d.ts +11 -0
  935. package/dist/utils/country-codes.d.ts.map +1 -0
  936. package/dist/utils/country-codes.js +40 -0
  937. package/dist/utils/country-codes.js.map +1 -0
  938. package/dist/utils/crypto.d.ts +48 -0
  939. package/dist/utils/crypto.d.ts.map +1 -0
  940. package/dist/utils/crypto.js +215 -0
  941. package/dist/utils/crypto.js.map +1 -0
  942. package/dist/utils/currencies.d.ts +8 -0
  943. package/dist/utils/currencies.d.ts.map +1 -0
  944. package/dist/utils/currencies.js +52 -0
  945. package/dist/utils/currencies.js.map +1 -0
  946. package/dist/utils/currency-constants.d.ts +39 -0
  947. package/dist/utils/currency-constants.d.ts.map +1 -0
  948. package/dist/utils/currency-constants.js +44 -0
  949. package/dist/utils/currency-constants.js.map +1 -0
  950. package/dist/utils/dates.d.ts +23 -0
  951. package/dist/utils/dates.d.ts.map +1 -0
  952. package/dist/utils/dates.js +176 -0
  953. package/dist/utils/dates.js.map +1 -0
  954. package/dist/utils/dev-env-state-path.d.ts +6 -0
  955. package/dist/utils/dev-env-state-path.d.ts.map +1 -0
  956. package/dist/utils/dev-env-state-path.js +18 -0
  957. package/dist/utils/dev-env-state-path.js.map +1 -0
  958. package/dist/utils/dom.d.ts +5 -0
  959. package/dist/utils/dom.d.ts.map +1 -0
  960. package/dist/utils/dom.js +13 -0
  961. package/dist/utils/dom.js.map +1 -0
  962. package/dist/utils/env.d.ts +25 -0
  963. package/dist/utils/env.d.ts.map +1 -0
  964. package/dist/utils/env.js +85 -0
  965. package/dist/utils/env.js.map +1 -0
  966. package/dist/utils/errors.d.ts +231 -0
  967. package/dist/utils/errors.d.ts.map +1 -0
  968. package/dist/utils/errors.js +393 -0
  969. package/dist/utils/errors.js.map +1 -0
  970. package/dist/utils/esbuild.d.ts +16 -0
  971. package/dist/utils/esbuild.d.ts.map +1 -0
  972. package/dist/utils/esbuild.js +186 -0
  973. package/dist/utils/esbuild.js.map +1 -0
  974. package/dist/utils/featurebase.d.ts +30 -0
  975. package/dist/utils/featurebase.d.ts.map +1 -0
  976. package/dist/utils/featurebase.js +168 -0
  977. package/dist/utils/featurebase.js.map +1 -0
  978. package/dist/utils/fs.d.ts +9 -0
  979. package/dist/utils/fs.d.ts.map +1 -0
  980. package/dist/utils/fs.js +31 -0
  981. package/dist/utils/fs.js.map +1 -0
  982. package/dist/utils/functions.d.ts +6 -0
  983. package/dist/utils/functions.d.ts.map +1 -0
  984. package/dist/utils/functions.js +37 -0
  985. package/dist/utils/functions.js.map +1 -0
  986. package/dist/utils/geo.d.ts +24 -0
  987. package/dist/utils/geo.d.ts.map +1 -0
  988. package/dist/utils/geo.js +18 -0
  989. package/dist/utils/geo.js.map +1 -0
  990. package/dist/utils/globals.d.ts +13 -0
  991. package/dist/utils/globals.d.ts.map +1 -0
  992. package/dist/utils/globals.js +40 -0
  993. package/dist/utils/globals.js.map +1 -0
  994. package/dist/utils/hashes.d.ts +9 -0
  995. package/dist/utils/hashes.d.ts.map +1 -0
  996. package/dist/utils/hashes.js +47 -0
  997. package/dist/utils/hashes.js.map +1 -0
  998. package/dist/utils/html.d.ts +7 -0
  999. package/dist/utils/html.d.ts.map +1 -0
  1000. package/dist/utils/html.js +37 -0
  1001. package/dist/utils/html.js.map +1 -0
  1002. package/dist/utils/http.d.ts +45 -0
  1003. package/dist/utils/http.d.ts.map +1 -0
  1004. package/dist/utils/http.js +79 -0
  1005. package/dist/utils/http.js.map +1 -0
  1006. package/dist/utils/ips.d.ts +8 -0
  1007. package/dist/utils/ips.d.ts.map +1 -0
  1008. package/dist/utils/ips.js +40 -0
  1009. package/dist/utils/ips.js.map +1 -0
  1010. package/dist/utils/json.d.ts +15 -0
  1011. package/dist/utils/json.d.ts.map +1 -0
  1012. package/dist/utils/json.js +182 -0
  1013. package/dist/utils/json.js.map +1 -0
  1014. package/dist/utils/jsx-editable-transpiler.d.ts +68 -0
  1015. package/dist/utils/jsx-editable-transpiler.d.ts.map +1 -0
  1016. package/dist/utils/jsx-editable-transpiler.js +223 -0
  1017. package/dist/utils/jsx-editable-transpiler.js.map +1 -0
  1018. package/dist/utils/jsx-editable-transpiler.test.d.ts +1 -0
  1019. package/dist/utils/jsx-editable-transpiler.test.js +122 -0
  1020. package/dist/utils/jsx-editable-transpiler.test.js.map +1 -0
  1021. package/dist/utils/jwt.d.ts +79 -0
  1022. package/dist/utils/jwt.d.ts.map +1 -0
  1023. package/dist/utils/jwt.js +112 -0
  1024. package/dist/utils/jwt.js.map +1 -0
  1025. package/dist/utils/locks.d.ts +17 -0
  1026. package/dist/utils/locks.d.ts.map +1 -0
  1027. package/dist/utils/locks.js +56 -0
  1028. package/dist/utils/locks.js.map +1 -0
  1029. package/dist/utils/maps.d.ts +61 -0
  1030. package/dist/utils/maps.d.ts.map +1 -0
  1031. package/dist/utils/maps.js +302 -0
  1032. package/dist/utils/maps.js.map +1 -0
  1033. package/dist/utils/math.d.ts +8 -0
  1034. package/dist/utils/math.d.ts.map +1 -0
  1035. package/dist/utils/math.js +23 -0
  1036. package/dist/utils/math.js.map +1 -0
  1037. package/dist/utils/monkey-patch.d.ts +7 -0
  1038. package/dist/utils/monkey-patch.d.ts.map +1 -0
  1039. package/dist/utils/monkey-patch.js +25 -0
  1040. package/dist/utils/monkey-patch.js.map +1 -0
  1041. package/dist/utils/node-http.d.ts +17 -0
  1042. package/dist/utils/node-http.d.ts.map +1 -0
  1043. package/dist/utils/node-http.js +40 -0
  1044. package/dist/utils/node-http.js.map +1 -0
  1045. package/dist/utils/numbers.d.ts +7 -0
  1046. package/dist/utils/numbers.d.ts.map +1 -0
  1047. package/dist/utils/numbers.js +79 -0
  1048. package/dist/utils/numbers.js.map +1 -0
  1049. package/dist/utils/oauth.d.ts +11 -0
  1050. package/dist/utils/oauth.d.ts.map +1 -0
  1051. package/dist/utils/oauth.js +32 -0
  1052. package/dist/utils/oauth.js.map +1 -0
  1053. package/dist/utils/objects.d.ts +59 -0
  1054. package/dist/utils/objects.d.ts.map +1 -0
  1055. package/dist/utils/objects.js +846 -0
  1056. package/dist/utils/objects.js.map +1 -0
  1057. package/dist/utils/paginated-lists.d.ts +442 -0
  1058. package/dist/utils/paginated-lists.d.ts.map +1 -0
  1059. package/dist/utils/paginated-lists.js +414 -0
  1060. package/dist/utils/paginated-lists.js.map +1 -0
  1061. package/dist/utils/paginated-lists.test.d.ts +1 -0
  1062. package/dist/utils/paginated-lists.test.js +1304 -0
  1063. package/dist/utils/paginated-lists.test.js.map +1 -0
  1064. package/dist/utils/passkey.d.ts +2 -0
  1065. package/dist/utils/passkey.js +0 -0
  1066. package/dist/utils/promises.d.ts +80 -0
  1067. package/dist/utils/promises.d.ts.map +1 -0
  1068. package/dist/utils/promises.js +349 -0
  1069. package/dist/utils/promises.js.map +1 -0
  1070. package/dist/utils/proxies.d.ts +13 -0
  1071. package/dist/utils/proxies.d.ts.map +1 -0
  1072. package/dist/utils/proxies.js +201 -0
  1073. package/dist/utils/proxies.js.map +1 -0
  1074. package/dist/utils/react.d.ts +61 -0
  1075. package/dist/utils/react.d.ts.map +1 -0
  1076. package/dist/utils/react.js +243 -0
  1077. package/dist/utils/react.js.map +1 -0
  1078. package/dist/utils/redirect-urls.d.ts +30 -0
  1079. package/dist/utils/redirect-urls.d.ts.map +1 -0
  1080. package/dist/utils/redirect-urls.js +222 -0
  1081. package/dist/utils/redirect-urls.js.map +1 -0
  1082. package/dist/utils/regex.d.ts +5 -0
  1083. package/dist/utils/regex.d.ts.map +1 -0
  1084. package/dist/utils/regex.js +15 -0
  1085. package/dist/utils/regex.js.map +1 -0
  1086. package/dist/utils/results.d.ts +70 -0
  1087. package/dist/utils/results.d.ts.map +1 -0
  1088. package/dist/utils/results.js +342 -0
  1089. package/dist/utils/results.js.map +1 -0
  1090. package/dist/utils/sentry.d.ts +13 -0
  1091. package/dist/utils/sentry.d.ts.map +1 -0
  1092. package/dist/utils/sentry.js +16 -0
  1093. package/dist/utils/sentry.js.map +1 -0
  1094. package/dist/utils/stores.d.ts +104 -0
  1095. package/dist/utils/stores.d.ts.map +1 -0
  1096. package/dist/utils/stores.js +179 -0
  1097. package/dist/utils/stores.js.map +1 -0
  1098. package/dist/utils/strings.d.ts +76 -0
  1099. package/dist/utils/strings.d.ts.map +1 -0
  1100. package/dist/utils/strings.js +549 -0
  1101. package/dist/utils/strings.js.map +1 -0
  1102. package/dist/utils/strings.nicify.test.d.ts +1 -0
  1103. package/dist/utils/strings.nicify.test.js +243 -0
  1104. package/dist/utils/strings.nicify.test.js.map +1 -0
  1105. package/dist/utils/telemetry.d.ts +15 -0
  1106. package/dist/utils/telemetry.d.ts.map +1 -0
  1107. package/dist/utils/telemetry.js +35 -0
  1108. package/dist/utils/telemetry.js.map +1 -0
  1109. package/dist/utils/turnstile-browser.d.ts +32 -0
  1110. package/dist/utils/turnstile-browser.d.ts.map +1 -0
  1111. package/dist/utils/turnstile-browser.js +65 -0
  1112. package/dist/utils/turnstile-browser.js.map +1 -0
  1113. package/dist/utils/turnstile-flow.d.ts +29 -0
  1114. package/dist/utils/turnstile-flow.d.ts.map +1 -0
  1115. package/dist/utils/turnstile-flow.js +225 -0
  1116. package/dist/utils/turnstile-flow.js.map +1 -0
  1117. package/dist/utils/turnstile-flow.test.d.ts +1 -0
  1118. package/dist/utils/turnstile-flow.test.js +75 -0
  1119. package/dist/utils/turnstile-flow.test.js.map +1 -0
  1120. package/dist/utils/turnstile.d.ts +17 -0
  1121. package/dist/utils/turnstile.d.ts.map +1 -0
  1122. package/dist/utils/turnstile.js +31 -0
  1123. package/dist/utils/turnstile.js.map +1 -0
  1124. package/dist/utils/typed-arrays.d.ts +14 -0
  1125. package/dist/utils/typed-arrays.d.ts.map +1 -0
  1126. package/dist/utils/typed-arrays.js +22 -0
  1127. package/dist/utils/typed-arrays.js.map +1 -0
  1128. package/dist/utils/types.d.ts +77 -0
  1129. package/dist/utils/types.d.ts.map +1 -0
  1130. package/dist/utils/types.js +59 -0
  1131. package/dist/utils/types.js.map +1 -0
  1132. package/dist/utils/unicode.d.ts +5 -0
  1133. package/dist/utils/unicode.d.ts.map +1 -0
  1134. package/dist/utils/unicode.js +26 -0
  1135. package/dist/utils/unicode.js.map +1 -0
  1136. package/dist/utils/urls.d.ts +28 -0
  1137. package/dist/utils/urls.d.ts.map +1 -0
  1138. package/dist/utils/urls.js +274 -0
  1139. package/dist/utils/urls.js.map +1 -0
  1140. package/dist/utils/uuids.d.ts +6 -0
  1141. package/dist/utils/uuids.d.ts.map +1 -0
  1142. package/dist/utils/uuids.js +39 -0
  1143. package/dist/utils/uuids.js.map +1 -0
  1144. package/package.json +99 -0
@@ -0,0 +1,2253 @@
1
+ //#region src/config/db-sync-mappings.ts
2
+ const DEFAULT_DB_SYNC_MAPPINGS = {
3
+ "users": {
4
+ sourceTables: { "ProjectUser": "ProjectUser" },
5
+ targetTable: "users",
6
+ targetTableSchemas: {
7
+ postgres: `
8
+ CREATE TABLE IF NOT EXISTS "users" (
9
+ "id" uuid PRIMARY KEY NOT NULL,
10
+ "display_name" text,
11
+ "profile_image_url" text,
12
+ "primary_email" text,
13
+ "primary_email_verified" boolean NOT NULL DEFAULT false,
14
+ "signed_up_at" timestamp without time zone NOT NULL,
15
+ "client_metadata" jsonb NOT NULL DEFAULT '{}'::jsonb,
16
+ "client_read_only_metadata" jsonb NOT NULL DEFAULT '{}'::jsonb,
17
+ "server_metadata" jsonb NOT NULL DEFAULT '{}'::jsonb,
18
+ "is_anonymous" boolean NOT NULL DEFAULT false
19
+ );
20
+ REVOKE ALL ON "users" FROM PUBLIC;
21
+ GRANT SELECT ON "users" TO PUBLIC;
22
+
23
+ CREATE TABLE IF NOT EXISTS "_stack_sync_metadata" (
24
+ "mapping_name" text PRIMARY KEY NOT NULL,
25
+ "last_synced_sequence_id" bigint NOT NULL DEFAULT -1,
26
+ "updated_at" timestamp without time zone NOT NULL DEFAULT now()
27
+ );
28
+ `.trim(),
29
+ clickhouse: `
30
+ CREATE TABLE IF NOT EXISTS analytics_internal.users (
31
+ project_id String,
32
+ branch_id String,
33
+ id UUID,
34
+ display_name Nullable(String),
35
+ profile_image_url Nullable(String),
36
+ primary_email Nullable(String),
37
+ primary_email_verified UInt8,
38
+ signed_up_at DateTime64(3, 'UTC'),
39
+ client_metadata String,
40
+ client_read_only_metadata String,
41
+ server_metadata String,
42
+ is_anonymous UInt8,
43
+ restricted_by_admin UInt8,
44
+ restricted_by_admin_reason Nullable(String),
45
+ restricted_by_admin_private_details Nullable(String),
46
+ sync_sequence_id Int64,
47
+ sync_is_deleted UInt8,
48
+ sync_created_at DateTime64(3, 'UTC') DEFAULT now64(3)
49
+ )
50
+ ENGINE ReplacingMergeTree(sync_sequence_id)
51
+ PARTITION BY toYYYYMM(signed_up_at)
52
+ ORDER BY (project_id, branch_id, id);
53
+
54
+ CREATE TABLE IF NOT EXISTS analytics_internal._stack_sync_metadata (
55
+ tenancy_id UUID,
56
+ mapping_name String,
57
+ last_synced_sequence_id Int64,
58
+ updated_at DateTime64(3, 'UTC') DEFAULT now64(3)
59
+ )
60
+ ENGINE ReplacingMergeTree(updated_at)
61
+ ORDER BY (tenancy_id, mapping_name);
62
+ `.trim()
63
+ },
64
+ internalDbFetchQueries: { clickhouse: `
65
+ SELECT *
66
+ FROM (
67
+ SELECT
68
+ "Tenancy"."projectId" AS "project_id",
69
+ "Tenancy"."branchId" AS "branch_id",
70
+ "ProjectUser"."projectUserId" AS "id",
71
+ "ProjectUser"."displayName" AS "display_name",
72
+ "ProjectUser"."profileImageUrl" AS "profile_image_url",
73
+ (
74
+ SELECT "ContactChannel"."value"
75
+ FROM "ContactChannel"
76
+ WHERE "ContactChannel"."projectUserId" = "ProjectUser"."projectUserId"
77
+ AND "ContactChannel"."tenancyId" = "ProjectUser"."tenancyId"
78
+ AND "ContactChannel"."type" = 'EMAIL'
79
+ AND "ContactChannel"."isPrimary" = 'TRUE'
80
+ LIMIT 1
81
+ ) AS "primary_email",
82
+ COALESCE(
83
+ (
84
+ SELECT "ContactChannel"."isVerified"
85
+ FROM "ContactChannel"
86
+ WHERE "ContactChannel"."projectUserId" = "ProjectUser"."projectUserId"
87
+ AND "ContactChannel"."tenancyId" = "ProjectUser"."tenancyId"
88
+ AND "ContactChannel"."type" = 'EMAIL'
89
+ AND "ContactChannel"."isPrimary" = 'TRUE'
90
+ LIMIT 1
91
+ ),
92
+ false
93
+ ) AS "primary_email_verified",
94
+ COALESCE("ProjectUser"."signedUpAt", "ProjectUser"."createdAt") AS "signed_up_at",
95
+ COALESCE("ProjectUser"."clientMetadata", '{}'::jsonb) AS "client_metadata",
96
+ COALESCE("ProjectUser"."clientReadOnlyMetadata", '{}'::jsonb) AS "client_read_only_metadata",
97
+ COALESCE("ProjectUser"."serverMetadata", '{}'::jsonb) AS "server_metadata",
98
+ "ProjectUser"."isAnonymous" AS "is_anonymous",
99
+ "ProjectUser"."restrictedByAdmin" AS "restricted_by_admin",
100
+ "ProjectUser"."restrictedByAdminReason" AS "restricted_by_admin_reason",
101
+ "ProjectUser"."restrictedByAdminPrivateDetails" AS "restricted_by_admin_private_details",
102
+ "ProjectUser"."sequenceId" AS "sync_sequence_id",
103
+ "ProjectUser"."tenancyId" AS "tenancyId",
104
+ false AS "sync_is_deleted"
105
+ FROM "ProjectUser"
106
+ JOIN "Tenancy" ON "Tenancy"."id" = "ProjectUser"."tenancyId"
107
+ WHERE "ProjectUser"."tenancyId" = $1::uuid
108
+
109
+ UNION ALL
110
+
111
+ SELECT
112
+ "Tenancy"."projectId" AS "project_id",
113
+ "Tenancy"."branchId" AS "branch_id",
114
+ ("DeletedRow"."primaryKey"->>'projectUserId')::uuid AS "id",
115
+ NULL::text AS "display_name",
116
+ NULL::text AS "profile_image_url",
117
+ NULL::text AS "primary_email",
118
+ false AS "primary_email_verified",
119
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "signed_up_at",
120
+ '{}'::jsonb AS "client_metadata",
121
+ '{}'::jsonb AS "client_read_only_metadata",
122
+ '{}'::jsonb AS "server_metadata",
123
+ false AS "is_anonymous",
124
+ false AS "restricted_by_admin",
125
+ NULL::text AS "restricted_by_admin_reason",
126
+ NULL::text AS "restricted_by_admin_private_details",
127
+ "DeletedRow"."sequenceId" AS "sync_sequence_id",
128
+ "DeletedRow"."tenancyId" AS "tenancyId",
129
+ true AS "sync_is_deleted"
130
+ FROM "DeletedRow"
131
+ JOIN "Tenancy" ON "Tenancy"."id" = "DeletedRow"."tenancyId"
132
+ WHERE
133
+ "DeletedRow"."tenancyId" = $1::uuid
134
+ AND "DeletedRow"."tableName" = 'ProjectUser'
135
+ ) AS "_src"
136
+ WHERE "sync_sequence_id" IS NOT NULL
137
+ AND "sync_sequence_id" > $2::bigint
138
+ ORDER BY "sync_sequence_id" ASC
139
+ LIMIT 1000
140
+ `.trim() },
141
+ internalDbFetchQuery: `
142
+ SELECT *
143
+ FROM (
144
+ SELECT
145
+ "ProjectUser"."projectUserId" AS "id",
146
+ "ProjectUser"."displayName" AS "display_name",
147
+ "ProjectUser"."profileImageUrl" AS "profile_image_url",
148
+ (
149
+ SELECT "ContactChannel"."value"
150
+ FROM "ContactChannel"
151
+ WHERE "ContactChannel"."projectUserId" = "ProjectUser"."projectUserId"
152
+ AND "ContactChannel"."tenancyId" = "ProjectUser"."tenancyId"
153
+ AND "ContactChannel"."type" = 'EMAIL'
154
+ AND "ContactChannel"."isPrimary" = 'TRUE'
155
+ LIMIT 1
156
+ ) AS "primary_email",
157
+ COALESCE(
158
+ (
159
+ SELECT "ContactChannel"."isVerified"
160
+ FROM "ContactChannel"
161
+ WHERE "ContactChannel"."projectUserId" = "ProjectUser"."projectUserId"
162
+ AND "ContactChannel"."tenancyId" = "ProjectUser"."tenancyId"
163
+ AND "ContactChannel"."type" = 'EMAIL'
164
+ AND "ContactChannel"."isPrimary" = 'TRUE'
165
+ LIMIT 1
166
+ ),
167
+ false
168
+ ) AS "primary_email_verified",
169
+ COALESCE("ProjectUser"."signedUpAt", "ProjectUser"."createdAt") AS "signed_up_at",
170
+ COALESCE("ProjectUser"."clientMetadata", '{}'::jsonb) AS "client_metadata",
171
+ COALESCE("ProjectUser"."clientReadOnlyMetadata", '{}'::jsonb) AS "client_read_only_metadata",
172
+ COALESCE("ProjectUser"."serverMetadata", '{}'::jsonb) AS "server_metadata",
173
+ "ProjectUser"."isAnonymous" AS "is_anonymous",
174
+ "ProjectUser"."sequenceId" AS "sequence_id",
175
+ "ProjectUser"."tenancyId",
176
+ false AS "is_deleted"
177
+ FROM "ProjectUser"
178
+ WHERE "ProjectUser"."tenancyId" = $1::uuid
179
+
180
+ UNION ALL
181
+
182
+ SELECT
183
+ ("DeletedRow"."primaryKey"->>'projectUserId')::uuid AS "id",
184
+ NULL::text AS "display_name",
185
+ NULL::text AS "profile_image_url",
186
+ NULL::text AS "primary_email",
187
+ false AS "primary_email_verified",
188
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "signed_up_at",
189
+ '{}'::jsonb AS "client_metadata",
190
+ '{}'::jsonb AS "client_read_only_metadata",
191
+ '{}'::jsonb AS "server_metadata",
192
+ false AS "is_anonymous",
193
+ "DeletedRow"."sequenceId" AS "sequence_id",
194
+ "DeletedRow"."tenancyId",
195
+ true AS "is_deleted"
196
+ FROM "DeletedRow"
197
+ WHERE
198
+ "DeletedRow"."tenancyId" = $1::uuid
199
+ AND "DeletedRow"."tableName" = 'ProjectUser'
200
+ ) AS "_src"
201
+ WHERE "sequence_id" IS NOT NULL
202
+ AND "sequence_id" > $2::bigint
203
+ ORDER BY "sequence_id" ASC
204
+ LIMIT 1000
205
+ `.trim(),
206
+ externalDbUpdateQueries: { postgres: `
207
+ WITH params AS (
208
+ SELECT
209
+ $1::uuid AS "id",
210
+ $2::text AS "display_name",
211
+ $3::text AS "profile_image_url",
212
+ $4::text AS "primary_email",
213
+ $5::boolean AS "primary_email_verified",
214
+ $6::timestamp without time zone AS "signed_up_at",
215
+ $7::jsonb AS "client_metadata",
216
+ $8::jsonb AS "client_read_only_metadata",
217
+ $9::jsonb AS "server_metadata",
218
+ $10::boolean AS "is_anonymous",
219
+ $11::bigint AS "sequence_id",
220
+ $12::boolean AS "is_deleted",
221
+ $13::text AS "mapping_name"
222
+ ),
223
+ deleted AS (
224
+ DELETE FROM "users" u
225
+ USING params p
226
+ WHERE p."is_deleted" = true AND u."id" = p."id"
227
+ RETURNING 1
228
+ ),
229
+ upserted AS (
230
+ INSERT INTO "users" (
231
+ "id",
232
+ "display_name",
233
+ "profile_image_url",
234
+ "primary_email",
235
+ "primary_email_verified",
236
+ "signed_up_at",
237
+ "client_metadata",
238
+ "client_read_only_metadata",
239
+ "server_metadata",
240
+ "is_anonymous"
241
+ )
242
+ SELECT
243
+ p."id",
244
+ p."display_name",
245
+ p."profile_image_url",
246
+ p."primary_email",
247
+ p."primary_email_verified",
248
+ p."signed_up_at",
249
+ p."client_metadata",
250
+ p."client_read_only_metadata",
251
+ p."server_metadata",
252
+ p."is_anonymous"
253
+ FROM params p
254
+ WHERE p."is_deleted" = false
255
+ ON CONFLICT ("id") DO UPDATE SET
256
+ "display_name" = EXCLUDED."display_name",
257
+ "profile_image_url" = EXCLUDED."profile_image_url",
258
+ "primary_email" = EXCLUDED."primary_email",
259
+ "primary_email_verified" = EXCLUDED."primary_email_verified",
260
+ "signed_up_at" = EXCLUDED."signed_up_at",
261
+ "client_metadata" = EXCLUDED."client_metadata",
262
+ "client_read_only_metadata" = EXCLUDED."client_read_only_metadata",
263
+ "server_metadata" = EXCLUDED."server_metadata",
264
+ "is_anonymous" = EXCLUDED."is_anonymous"
265
+ RETURNING 1
266
+ )
267
+ INSERT INTO "_stack_sync_metadata" ("mapping_name", "last_synced_sequence_id", "updated_at")
268
+ SELECT p."mapping_name", p."sequence_id", now() FROM params p
269
+ ON CONFLICT ("mapping_name") DO UPDATE SET
270
+ "last_synced_sequence_id" = GREATEST("_stack_sync_metadata"."last_synced_sequence_id", EXCLUDED."last_synced_sequence_id"),
271
+ "updated_at" = now();
272
+ `.trim() }
273
+ },
274
+ "contact_channels": {
275
+ sourceTables: { "ContactChannel": "ContactChannel" },
276
+ targetTable: "contact_channels",
277
+ targetTableSchemas: {
278
+ postgres: `
279
+ CREATE TABLE IF NOT EXISTS "contact_channels" (
280
+ "id" uuid PRIMARY KEY NOT NULL,
281
+ "user_id" uuid NOT NULL,
282
+ "type" text NOT NULL,
283
+ "value" text NOT NULL,
284
+ "is_primary" boolean NOT NULL DEFAULT false,
285
+ "is_verified" boolean NOT NULL DEFAULT false,
286
+ "used_for_auth" boolean NOT NULL DEFAULT false,
287
+ "created_at" timestamp without time zone NOT NULL
288
+ );
289
+ REVOKE ALL ON "contact_channels" FROM PUBLIC;
290
+ GRANT SELECT ON "contact_channels" TO PUBLIC;
291
+
292
+ CREATE TABLE IF NOT EXISTS "_stack_sync_metadata" (
293
+ "mapping_name" text PRIMARY KEY NOT NULL,
294
+ "last_synced_sequence_id" bigint NOT NULL DEFAULT -1,
295
+ "updated_at" timestamp without time zone NOT NULL DEFAULT now()
296
+ );
297
+ `.trim(),
298
+ clickhouse: `
299
+ CREATE TABLE IF NOT EXISTS analytics_internal.contact_channels (
300
+ project_id String,
301
+ branch_id String,
302
+ id UUID,
303
+ user_id UUID,
304
+ type LowCardinality(String),
305
+ value String,
306
+ is_primary UInt8,
307
+ is_verified UInt8,
308
+ used_for_auth UInt8,
309
+ created_at DateTime64(3, 'UTC'),
310
+ sync_sequence_id Int64,
311
+ sync_is_deleted UInt8,
312
+ sync_created_at DateTime64(3, 'UTC') DEFAULT now64(3)
313
+ )
314
+ ENGINE ReplacingMergeTree(sync_sequence_id)
315
+ PARTITION BY toYYYYMM(created_at)
316
+ ORDER BY (project_id, branch_id, id);
317
+ `.trim()
318
+ },
319
+ internalDbFetchQueries: { clickhouse: `
320
+ SELECT *
321
+ FROM (
322
+ SELECT
323
+ "Tenancy"."projectId" AS "project_id",
324
+ "Tenancy"."branchId" AS "branch_id",
325
+ "ContactChannel"."id" AS "id",
326
+ "ContactChannel"."projectUserId" AS "user_id",
327
+ "ContactChannel"."type"::text AS "type",
328
+ "ContactChannel"."value" AS "value",
329
+ CASE WHEN "ContactChannel"."isPrimary" = 'TRUE' THEN true ELSE false END AS "is_primary",
330
+ "ContactChannel"."isVerified" AS "is_verified",
331
+ CASE WHEN "ContactChannel"."usedForAuth" = 'TRUE' THEN true ELSE false END AS "used_for_auth",
332
+ "ContactChannel"."createdAt" AS "created_at",
333
+ "ContactChannel"."sequenceId" AS "sync_sequence_id",
334
+ "ContactChannel"."tenancyId" AS "tenancyId",
335
+ false AS "sync_is_deleted"
336
+ FROM "ContactChannel"
337
+ JOIN "Tenancy" ON "Tenancy"."id" = "ContactChannel"."tenancyId"
338
+ WHERE "ContactChannel"."tenancyId" = $1::uuid
339
+
340
+ UNION ALL
341
+
342
+ SELECT
343
+ "Tenancy"."projectId" AS "project_id",
344
+ "Tenancy"."branchId" AS "branch_id",
345
+ ("DeletedRow"."primaryKey"->>'id')::uuid AS "id",
346
+ ("DeletedRow"."primaryKey"->>'projectUserId')::uuid AS "user_id",
347
+ NULL::text AS "type",
348
+ NULL::text AS "value",
349
+ false AS "is_primary",
350
+ false AS "is_verified",
351
+ false AS "used_for_auth",
352
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
353
+ "DeletedRow"."sequenceId" AS "sync_sequence_id",
354
+ "DeletedRow"."tenancyId" AS "tenancyId",
355
+ true AS "sync_is_deleted"
356
+ FROM "DeletedRow"
357
+ JOIN "Tenancy" ON "Tenancy"."id" = "DeletedRow"."tenancyId"
358
+ WHERE
359
+ "DeletedRow"."tenancyId" = $1::uuid
360
+ AND "DeletedRow"."tableName" = 'ContactChannel'
361
+ ) AS "_src"
362
+ WHERE "sync_sequence_id" IS NOT NULL
363
+ AND "sync_sequence_id" > $2::bigint
364
+ ORDER BY "sync_sequence_id" ASC
365
+ LIMIT 1000
366
+ `.trim() },
367
+ internalDbFetchQuery: `
368
+ SELECT *
369
+ FROM (
370
+ SELECT
371
+ "ContactChannel"."id" AS "id",
372
+ "ContactChannel"."projectUserId" AS "user_id",
373
+ "ContactChannel"."type"::text AS "type",
374
+ "ContactChannel"."value" AS "value",
375
+ CASE WHEN "ContactChannel"."isPrimary" = 'TRUE' THEN true ELSE false END AS "is_primary",
376
+ "ContactChannel"."isVerified" AS "is_verified",
377
+ CASE WHEN "ContactChannel"."usedForAuth" = 'TRUE' THEN true ELSE false END AS "used_for_auth",
378
+ "ContactChannel"."createdAt" AS "created_at",
379
+ "ContactChannel"."sequenceId" AS "sequence_id",
380
+ "ContactChannel"."tenancyId",
381
+ false AS "is_deleted"
382
+ FROM "ContactChannel"
383
+ WHERE "ContactChannel"."tenancyId" = $1::uuid
384
+
385
+ UNION ALL
386
+
387
+ SELECT
388
+ ("DeletedRow"."primaryKey"->>'id')::uuid AS "id",
389
+ ("DeletedRow"."primaryKey"->>'projectUserId')::uuid AS "user_id",
390
+ NULL::text AS "type",
391
+ NULL::text AS "value",
392
+ false AS "is_primary",
393
+ false AS "is_verified",
394
+ false AS "used_for_auth",
395
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
396
+ "DeletedRow"."sequenceId" AS "sequence_id",
397
+ "DeletedRow"."tenancyId",
398
+ true AS "is_deleted"
399
+ FROM "DeletedRow"
400
+ WHERE
401
+ "DeletedRow"."tenancyId" = $1::uuid
402
+ AND "DeletedRow"."tableName" = 'ContactChannel'
403
+ ) AS "_src"
404
+ WHERE "sequence_id" IS NOT NULL
405
+ AND "sequence_id" > $2::bigint
406
+ ORDER BY "sequence_id" ASC
407
+ LIMIT 1000
408
+ `.trim(),
409
+ externalDbUpdateQueries: { postgres: `
410
+ WITH params AS (
411
+ SELECT
412
+ $1::uuid AS "id",
413
+ $2::uuid AS "user_id",
414
+ $3::text AS "type",
415
+ $4::text AS "value",
416
+ $5::boolean AS "is_primary",
417
+ $6::boolean AS "is_verified",
418
+ $7::boolean AS "used_for_auth",
419
+ $8::timestamp without time zone AS "created_at",
420
+ $9::bigint AS "sequence_id",
421
+ $10::boolean AS "is_deleted",
422
+ $11::text AS "mapping_name"
423
+ ),
424
+ deleted AS (
425
+ DELETE FROM "contact_channels" c
426
+ USING params p
427
+ WHERE p."is_deleted" = true AND c."id" = p."id"
428
+ RETURNING 1
429
+ ),
430
+ upserted AS (
431
+ INSERT INTO "contact_channels" (
432
+ "id",
433
+ "user_id",
434
+ "type",
435
+ "value",
436
+ "is_primary",
437
+ "is_verified",
438
+ "used_for_auth",
439
+ "created_at"
440
+ )
441
+ SELECT
442
+ p."id",
443
+ p."user_id",
444
+ p."type",
445
+ p."value",
446
+ p."is_primary",
447
+ p."is_verified",
448
+ p."used_for_auth",
449
+ p."created_at"
450
+ FROM params p
451
+ WHERE p."is_deleted" = false
452
+ ON CONFLICT ("id") DO UPDATE SET
453
+ "user_id" = EXCLUDED."user_id",
454
+ "type" = EXCLUDED."type",
455
+ "value" = EXCLUDED."value",
456
+ "is_primary" = EXCLUDED."is_primary",
457
+ "is_verified" = EXCLUDED."is_verified",
458
+ "used_for_auth" = EXCLUDED."used_for_auth",
459
+ "created_at" = EXCLUDED."created_at"
460
+ RETURNING 1
461
+ )
462
+ INSERT INTO "_stack_sync_metadata" ("mapping_name", "last_synced_sequence_id", "updated_at")
463
+ SELECT p."mapping_name", p."sequence_id", now() FROM params p
464
+ ON CONFLICT ("mapping_name") DO UPDATE SET
465
+ "last_synced_sequence_id" = GREATEST("_stack_sync_metadata"."last_synced_sequence_id", EXCLUDED."last_synced_sequence_id"),
466
+ "updated_at" = now();
467
+ `.trim() }
468
+ },
469
+ "teams": {
470
+ sourceTables: { "Team": "Team" },
471
+ targetTable: "teams",
472
+ targetTableSchemas: {
473
+ postgres: `
474
+ CREATE TABLE IF NOT EXISTS "teams" (
475
+ "id" uuid PRIMARY KEY NOT NULL,
476
+ "display_name" text NOT NULL,
477
+ "profile_image_url" text,
478
+ "created_at" timestamp without time zone NOT NULL,
479
+ "client_metadata" jsonb NOT NULL DEFAULT '{}'::jsonb,
480
+ "client_read_only_metadata" jsonb NOT NULL DEFAULT '{}'::jsonb,
481
+ "server_metadata" jsonb NOT NULL DEFAULT '{}'::jsonb
482
+ );
483
+ REVOKE ALL ON "teams" FROM PUBLIC;
484
+ GRANT SELECT ON "teams" TO PUBLIC;
485
+
486
+ CREATE TABLE IF NOT EXISTS "_stack_sync_metadata" (
487
+ "mapping_name" text PRIMARY KEY NOT NULL,
488
+ "last_synced_sequence_id" bigint NOT NULL DEFAULT -1,
489
+ "updated_at" timestamp without time zone NOT NULL DEFAULT now()
490
+ );
491
+ `.trim(),
492
+ clickhouse: `
493
+ CREATE TABLE IF NOT EXISTS analytics_internal.teams (
494
+ project_id String,
495
+ branch_id String,
496
+ id UUID,
497
+ display_name String,
498
+ profile_image_url Nullable(String),
499
+ created_at DateTime64(3, 'UTC'),
500
+ client_metadata String,
501
+ client_read_only_metadata String,
502
+ server_metadata String,
503
+ sync_sequence_id Int64,
504
+ sync_is_deleted UInt8,
505
+ sync_created_at DateTime64(3, 'UTC') DEFAULT now64(3)
506
+ )
507
+ ENGINE ReplacingMergeTree(sync_sequence_id)
508
+ PARTITION BY toYYYYMM(created_at)
509
+ ORDER BY (project_id, branch_id, id);
510
+ `.trim()
511
+ },
512
+ internalDbFetchQueries: { clickhouse: `
513
+ SELECT *
514
+ FROM (
515
+ SELECT
516
+ "Tenancy"."projectId" AS "project_id",
517
+ "Tenancy"."branchId" AS "branch_id",
518
+ "Team"."teamId" AS "id",
519
+ "Team"."displayName" AS "display_name",
520
+ "Team"."profileImageUrl" AS "profile_image_url",
521
+ "Team"."createdAt" AS "created_at",
522
+ COALESCE("Team"."clientMetadata", '{}'::jsonb) AS "client_metadata",
523
+ COALESCE("Team"."clientReadOnlyMetadata", '{}'::jsonb) AS "client_read_only_metadata",
524
+ COALESCE("Team"."serverMetadata", '{}'::jsonb) AS "server_metadata",
525
+ "Team"."sequenceId" AS "sync_sequence_id",
526
+ "Team"."tenancyId" AS "tenancyId",
527
+ false AS "sync_is_deleted"
528
+ FROM "Team"
529
+ JOIN "Tenancy" ON "Tenancy"."id" = "Team"."tenancyId"
530
+ WHERE "Team"."tenancyId" = $1::uuid
531
+
532
+ UNION ALL
533
+
534
+ SELECT
535
+ "Tenancy"."projectId" AS "project_id",
536
+ "Tenancy"."branchId" AS "branch_id",
537
+ ("DeletedRow"."primaryKey"->>'teamId')::uuid AS "id",
538
+ NULL::text AS "display_name",
539
+ NULL::text AS "profile_image_url",
540
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
541
+ '{}'::jsonb AS "client_metadata",
542
+ '{}'::jsonb AS "client_read_only_metadata",
543
+ '{}'::jsonb AS "server_metadata",
544
+ "DeletedRow"."sequenceId" AS "sync_sequence_id",
545
+ "DeletedRow"."tenancyId" AS "tenancyId",
546
+ true AS "sync_is_deleted"
547
+ FROM "DeletedRow"
548
+ JOIN "Tenancy" ON "Tenancy"."id" = "DeletedRow"."tenancyId"
549
+ WHERE
550
+ "DeletedRow"."tenancyId" = $1::uuid
551
+ AND "DeletedRow"."tableName" = 'Team'
552
+ ) AS "_src"
553
+ WHERE "sync_sequence_id" IS NOT NULL
554
+ AND "sync_sequence_id" > $2::bigint
555
+ ORDER BY "sync_sequence_id" ASC
556
+ LIMIT 1000
557
+ `.trim() },
558
+ internalDbFetchQuery: `
559
+ SELECT *
560
+ FROM (
561
+ SELECT
562
+ "Team"."teamId" AS "id",
563
+ "Team"."displayName" AS "display_name",
564
+ "Team"."profileImageUrl" AS "profile_image_url",
565
+ "Team"."createdAt" AS "created_at",
566
+ COALESCE("Team"."clientMetadata", '{}'::jsonb) AS "client_metadata",
567
+ COALESCE("Team"."clientReadOnlyMetadata", '{}'::jsonb) AS "client_read_only_metadata",
568
+ COALESCE("Team"."serverMetadata", '{}'::jsonb) AS "server_metadata",
569
+ "Team"."sequenceId" AS "sequence_id",
570
+ "Team"."tenancyId",
571
+ false AS "is_deleted"
572
+ FROM "Team"
573
+ WHERE "Team"."tenancyId" = $1::uuid
574
+
575
+ UNION ALL
576
+
577
+ SELECT
578
+ ("DeletedRow"."primaryKey"->>'teamId')::uuid AS "id",
579
+ NULL::text AS "display_name",
580
+ NULL::text AS "profile_image_url",
581
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
582
+ '{}'::jsonb AS "client_metadata",
583
+ '{}'::jsonb AS "client_read_only_metadata",
584
+ '{}'::jsonb AS "server_metadata",
585
+ "DeletedRow"."sequenceId" AS "sequence_id",
586
+ "DeletedRow"."tenancyId",
587
+ true AS "is_deleted"
588
+ FROM "DeletedRow"
589
+ WHERE
590
+ "DeletedRow"."tenancyId" = $1::uuid
591
+ AND "DeletedRow"."tableName" = 'Team'
592
+ ) AS "_src"
593
+ WHERE "sequence_id" IS NOT NULL
594
+ AND "sequence_id" > $2::bigint
595
+ ORDER BY "sequence_id" ASC
596
+ LIMIT 1000
597
+ `.trim(),
598
+ externalDbUpdateQueries: { postgres: `
599
+ WITH params AS (
600
+ SELECT
601
+ $1::uuid AS "id",
602
+ $2::text AS "display_name",
603
+ $3::text AS "profile_image_url",
604
+ $4::timestamp without time zone AS "created_at",
605
+ $5::jsonb AS "client_metadata",
606
+ $6::jsonb AS "client_read_only_metadata",
607
+ $7::jsonb AS "server_metadata",
608
+ $8::bigint AS "sequence_id",
609
+ $9::boolean AS "is_deleted",
610
+ $10::text AS "mapping_name"
611
+ ),
612
+ deleted AS (
613
+ DELETE FROM "teams" t
614
+ USING params p
615
+ WHERE p."is_deleted" = true AND t."id" = p."id"
616
+ RETURNING 1
617
+ ),
618
+ upserted AS (
619
+ INSERT INTO "teams" (
620
+ "id",
621
+ "display_name",
622
+ "profile_image_url",
623
+ "created_at",
624
+ "client_metadata",
625
+ "client_read_only_metadata",
626
+ "server_metadata"
627
+ )
628
+ SELECT
629
+ p."id",
630
+ p."display_name",
631
+ p."profile_image_url",
632
+ p."created_at",
633
+ p."client_metadata",
634
+ p."client_read_only_metadata",
635
+ p."server_metadata"
636
+ FROM params p
637
+ WHERE p."is_deleted" = false
638
+ ON CONFLICT ("id") DO UPDATE SET
639
+ "display_name" = EXCLUDED."display_name",
640
+ "profile_image_url" = EXCLUDED."profile_image_url",
641
+ "created_at" = EXCLUDED."created_at",
642
+ "client_metadata" = EXCLUDED."client_metadata",
643
+ "client_read_only_metadata" = EXCLUDED."client_read_only_metadata",
644
+ "server_metadata" = EXCLUDED."server_metadata"
645
+ RETURNING 1
646
+ )
647
+ INSERT INTO "_stack_sync_metadata" ("mapping_name", "last_synced_sequence_id", "updated_at")
648
+ SELECT p."mapping_name", p."sequence_id", now() FROM params p
649
+ ON CONFLICT ("mapping_name") DO UPDATE SET
650
+ "last_synced_sequence_id" = GREATEST("_stack_sync_metadata"."last_synced_sequence_id", EXCLUDED."last_synced_sequence_id"),
651
+ "updated_at" = now();
652
+ `.trim() }
653
+ },
654
+ "team_member_profiles": {
655
+ sourceTables: { "TeamMember": "TeamMember" },
656
+ targetTable: "team_member_profiles",
657
+ targetTableSchemas: {
658
+ postgres: `
659
+ CREATE TABLE IF NOT EXISTS "team_member_profiles" (
660
+ "team_id" uuid NOT NULL,
661
+ "user_id" uuid NOT NULL,
662
+ "display_name" text,
663
+ "profile_image_url" text,
664
+ "created_at" timestamp without time zone NOT NULL,
665
+ PRIMARY KEY ("team_id", "user_id")
666
+ );
667
+ REVOKE ALL ON "team_member_profiles" FROM PUBLIC;
668
+ GRANT SELECT ON "team_member_profiles" TO PUBLIC;
669
+
670
+ CREATE TABLE IF NOT EXISTS "_stack_sync_metadata" (
671
+ "mapping_name" text PRIMARY KEY NOT NULL,
672
+ "last_synced_sequence_id" bigint NOT NULL DEFAULT -1,
673
+ "updated_at" timestamp without time zone NOT NULL DEFAULT now()
674
+ );
675
+ `.trim(),
676
+ clickhouse: `
677
+ CREATE TABLE IF NOT EXISTS analytics_internal.team_member_profiles (
678
+ project_id String,
679
+ branch_id String,
680
+ team_id UUID,
681
+ user_id UUID,
682
+ display_name Nullable(String),
683
+ profile_image_url Nullable(String),
684
+ created_at DateTime64(3, 'UTC'),
685
+ sync_sequence_id Int64,
686
+ sync_is_deleted UInt8,
687
+ sync_created_at DateTime64(3, 'UTC') DEFAULT now64(3)
688
+ )
689
+ ENGINE ReplacingMergeTree(sync_sequence_id)
690
+ PARTITION BY toYYYYMM(created_at)
691
+ ORDER BY (project_id, branch_id, team_id, user_id);
692
+ `.trim()
693
+ },
694
+ internalDbFetchQueries: { clickhouse: `
695
+ SELECT *
696
+ FROM (
697
+ SELECT
698
+ "Tenancy"."projectId" AS "project_id",
699
+ "Tenancy"."branchId" AS "branch_id",
700
+ "TeamMember"."teamId" AS "team_id",
701
+ "TeamMember"."projectUserId" AS "user_id",
702
+ "TeamMember"."displayName" AS "display_name",
703
+ "TeamMember"."profileImageUrl" AS "profile_image_url",
704
+ "TeamMember"."createdAt" AS "created_at",
705
+ "TeamMember"."sequenceId" AS "sync_sequence_id",
706
+ "TeamMember"."tenancyId" AS "tenancyId",
707
+ false AS "sync_is_deleted"
708
+ FROM "TeamMember"
709
+ JOIN "Tenancy" ON "Tenancy"."id" = "TeamMember"."tenancyId"
710
+ WHERE "TeamMember"."tenancyId" = $1::uuid
711
+
712
+ UNION ALL
713
+
714
+ SELECT
715
+ "Tenancy"."projectId" AS "project_id",
716
+ "Tenancy"."branchId" AS "branch_id",
717
+ ("DeletedRow"."primaryKey"->>'teamId')::uuid AS "team_id",
718
+ ("DeletedRow"."primaryKey"->>'projectUserId')::uuid AS "user_id",
719
+ NULL::text AS "display_name",
720
+ NULL::text AS "profile_image_url",
721
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
722
+ "DeletedRow"."sequenceId" AS "sync_sequence_id",
723
+ "DeletedRow"."tenancyId" AS "tenancyId",
724
+ true AS "sync_is_deleted"
725
+ FROM "DeletedRow"
726
+ JOIN "Tenancy" ON "Tenancy"."id" = "DeletedRow"."tenancyId"
727
+ WHERE
728
+ "DeletedRow"."tenancyId" = $1::uuid
729
+ AND "DeletedRow"."tableName" = 'TeamMember'
730
+ ) AS "_src"
731
+ WHERE "sync_sequence_id" IS NOT NULL
732
+ AND "sync_sequence_id" > $2::bigint
733
+ ORDER BY "sync_sequence_id" ASC
734
+ LIMIT 1000
735
+ `.trim() },
736
+ internalDbFetchQuery: `
737
+ SELECT *
738
+ FROM (
739
+ SELECT
740
+ "TeamMember"."teamId" AS "team_id",
741
+ "TeamMember"."projectUserId" AS "user_id",
742
+ "TeamMember"."displayName" AS "display_name",
743
+ "TeamMember"."profileImageUrl" AS "profile_image_url",
744
+ "TeamMember"."createdAt" AS "created_at",
745
+ "TeamMember"."sequenceId" AS "sequence_id",
746
+ "TeamMember"."tenancyId",
747
+ false AS "is_deleted"
748
+ FROM "TeamMember"
749
+ WHERE "TeamMember"."tenancyId" = $1::uuid
750
+
751
+ UNION ALL
752
+
753
+ SELECT
754
+ ("DeletedRow"."primaryKey"->>'teamId')::uuid AS "team_id",
755
+ ("DeletedRow"."primaryKey"->>'projectUserId')::uuid AS "user_id",
756
+ NULL::text AS "display_name",
757
+ NULL::text AS "profile_image_url",
758
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
759
+ "DeletedRow"."sequenceId" AS "sequence_id",
760
+ "DeletedRow"."tenancyId",
761
+ true AS "is_deleted"
762
+ FROM "DeletedRow"
763
+ WHERE
764
+ "DeletedRow"."tenancyId" = $1::uuid
765
+ AND "DeletedRow"."tableName" = 'TeamMember'
766
+ ) AS "_src"
767
+ WHERE "sequence_id" IS NOT NULL
768
+ AND "sequence_id" > $2::bigint
769
+ ORDER BY "sequence_id" ASC
770
+ LIMIT 1000
771
+ `.trim(),
772
+ externalDbUpdateQueries: { postgres: `
773
+ WITH params AS (
774
+ SELECT
775
+ $1::uuid AS "team_id",
776
+ $2::uuid AS "user_id",
777
+ $3::text AS "display_name",
778
+ $4::text AS "profile_image_url",
779
+ $5::timestamp without time zone AS "created_at",
780
+ $6::bigint AS "sequence_id",
781
+ $7::boolean AS "is_deleted",
782
+ $8::text AS "mapping_name"
783
+ ),
784
+ deleted AS (
785
+ DELETE FROM "team_member_profiles" tm
786
+ USING params p
787
+ WHERE p."is_deleted" = true AND tm."team_id" = p."team_id" AND tm."user_id" = p."user_id"
788
+ RETURNING 1
789
+ ),
790
+ upserted AS (
791
+ INSERT INTO "team_member_profiles" (
792
+ "team_id",
793
+ "user_id",
794
+ "display_name",
795
+ "profile_image_url",
796
+ "created_at"
797
+ )
798
+ SELECT
799
+ p."team_id",
800
+ p."user_id",
801
+ p."display_name",
802
+ p."profile_image_url",
803
+ p."created_at"
804
+ FROM params p
805
+ WHERE p."is_deleted" = false
806
+ ON CONFLICT ("team_id", "user_id") DO UPDATE SET
807
+ "display_name" = EXCLUDED."display_name",
808
+ "profile_image_url" = EXCLUDED."profile_image_url",
809
+ "created_at" = EXCLUDED."created_at"
810
+ RETURNING 1
811
+ )
812
+ INSERT INTO "_stack_sync_metadata" ("mapping_name", "last_synced_sequence_id", "updated_at")
813
+ SELECT p."mapping_name", p."sequence_id", now() FROM params p
814
+ ON CONFLICT ("mapping_name") DO UPDATE SET
815
+ "last_synced_sequence_id" = GREATEST("_stack_sync_metadata"."last_synced_sequence_id", EXCLUDED."last_synced_sequence_id"),
816
+ "updated_at" = now();
817
+ `.trim() }
818
+ },
819
+ "team_permissions": {
820
+ sourceTables: { "TeamMemberDirectPermission": "TeamMemberDirectPermission" },
821
+ targetTable: "team_permissions",
822
+ targetTableSchemas: {
823
+ postgres: `
824
+ CREATE TABLE IF NOT EXISTS "team_permissions" (
825
+ "team_id" uuid NOT NULL,
826
+ "user_id" uuid NOT NULL,
827
+ "permission_id" text NOT NULL,
828
+ "created_at" timestamp without time zone NOT NULL,
829
+ PRIMARY KEY ("team_id", "user_id", "permission_id")
830
+ );
831
+ REVOKE ALL ON "team_permissions" FROM PUBLIC;
832
+ GRANT SELECT ON "team_permissions" TO PUBLIC;
833
+
834
+ CREATE TABLE IF NOT EXISTS "_stack_sync_metadata" (
835
+ "mapping_name" text PRIMARY KEY NOT NULL,
836
+ "last_synced_sequence_id" bigint NOT NULL DEFAULT -1,
837
+ "updated_at" timestamp without time zone NOT NULL DEFAULT now()
838
+ );
839
+ `.trim(),
840
+ clickhouse: `
841
+ CREATE TABLE IF NOT EXISTS analytics_internal.team_permissions (
842
+ project_id String,
843
+ branch_id String,
844
+ team_id UUID,
845
+ user_id UUID,
846
+ id String,
847
+ created_at DateTime64(3, 'UTC'),
848
+ sync_sequence_id Int64,
849
+ sync_is_deleted UInt8,
850
+ sync_created_at DateTime64(3, 'UTC') DEFAULT now64(3)
851
+ )
852
+ ENGINE ReplacingMergeTree(sync_sequence_id)
853
+ PARTITION BY toYYYYMM(created_at)
854
+ ORDER BY (project_id, branch_id, team_id, user_id, id);
855
+ `.trim()
856
+ },
857
+ internalDbFetchQueries: { clickhouse: `
858
+ SELECT *
859
+ FROM (
860
+ SELECT
861
+ "Tenancy"."projectId" AS "project_id",
862
+ "Tenancy"."branchId" AS "branch_id",
863
+ "TeamMemberDirectPermission"."teamId" AS "team_id",
864
+ "TeamMemberDirectPermission"."projectUserId" AS "user_id",
865
+ "TeamMemberDirectPermission"."permissionId" AS "id",
866
+ "TeamMemberDirectPermission"."createdAt" AS "created_at",
867
+ "TeamMemberDirectPermission"."sequenceId" AS "sync_sequence_id",
868
+ "TeamMemberDirectPermission"."tenancyId" AS "tenancyId",
869
+ false AS "sync_is_deleted"
870
+ FROM "TeamMemberDirectPermission"
871
+ JOIN "Tenancy" ON "Tenancy"."id" = "TeamMemberDirectPermission"."tenancyId"
872
+ WHERE "TeamMemberDirectPermission"."tenancyId" = $1::uuid
873
+
874
+ UNION ALL
875
+
876
+ SELECT
877
+ "Tenancy"."projectId" AS "project_id",
878
+ "Tenancy"."branchId" AS "branch_id",
879
+ ("DeletedRow"."primaryKey"->>'teamId')::uuid AS "team_id",
880
+ ("DeletedRow"."primaryKey"->>'projectUserId')::uuid AS "user_id",
881
+ "DeletedRow"."primaryKey"->>'permissionId' AS "id",
882
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
883
+ "DeletedRow"."sequenceId" AS "sync_sequence_id",
884
+ "DeletedRow"."tenancyId" AS "tenancyId",
885
+ true AS "sync_is_deleted"
886
+ FROM "DeletedRow"
887
+ JOIN "Tenancy" ON "Tenancy"."id" = "DeletedRow"."tenancyId"
888
+ WHERE
889
+ "DeletedRow"."tenancyId" = $1::uuid
890
+ AND "DeletedRow"."tableName" = 'TeamMemberDirectPermission'
891
+ ) AS "_src"
892
+ WHERE "sync_sequence_id" IS NOT NULL
893
+ AND "sync_sequence_id" > $2::bigint
894
+ ORDER BY "sync_sequence_id" ASC
895
+ LIMIT 1000
896
+ `.trim() },
897
+ internalDbFetchQuery: `
898
+ SELECT *
899
+ FROM (
900
+ SELECT
901
+ "TeamMemberDirectPermission"."teamId" AS "team_id",
902
+ "TeamMemberDirectPermission"."projectUserId" AS "user_id",
903
+ "TeamMemberDirectPermission"."permissionId" AS "permission_id",
904
+ "TeamMemberDirectPermission"."createdAt" AS "created_at",
905
+ "TeamMemberDirectPermission"."sequenceId" AS "sequence_id",
906
+ "TeamMemberDirectPermission"."tenancyId",
907
+ false AS "is_deleted"
908
+ FROM "TeamMemberDirectPermission"
909
+ WHERE "TeamMemberDirectPermission"."tenancyId" = $1::uuid
910
+
911
+ UNION ALL
912
+
913
+ SELECT
914
+ ("DeletedRow"."primaryKey"->>'teamId')::uuid AS "team_id",
915
+ ("DeletedRow"."primaryKey"->>'projectUserId')::uuid AS "user_id",
916
+ "DeletedRow"."primaryKey"->>'permissionId' AS "id",
917
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
918
+ "DeletedRow"."sequenceId" AS "sequence_id",
919
+ "DeletedRow"."tenancyId",
920
+ true AS "is_deleted"
921
+ FROM "DeletedRow"
922
+ WHERE
923
+ "DeletedRow"."tenancyId" = $1::uuid
924
+ AND "DeletedRow"."tableName" = 'TeamMemberDirectPermission'
925
+ ) AS "_src"
926
+ WHERE "sequence_id" IS NOT NULL
927
+ AND "sequence_id" > $2::bigint
928
+ ORDER BY "sequence_id" ASC
929
+ LIMIT 1000
930
+ `.trim(),
931
+ externalDbUpdateQueries: { postgres: `
932
+ WITH params AS (
933
+ SELECT
934
+ $1::uuid AS "team_id",
935
+ $2::uuid AS "user_id",
936
+ $3::text AS "permission_id",
937
+ $4::timestamp without time zone AS "created_at",
938
+ $5::bigint AS "sequence_id",
939
+ $6::boolean AS "is_deleted",
940
+ $7::text AS "mapping_name"
941
+ ),
942
+ deleted AS (
943
+ DELETE FROM "team_permissions" tp
944
+ USING params p
945
+ WHERE p."is_deleted" = true AND tp."team_id" = p."team_id" AND tp."user_id" = p."user_id" AND tp."permission_id" = p."permission_id"
946
+ RETURNING 1
947
+ ),
948
+ upserted AS (
949
+ INSERT INTO "team_permissions" (
950
+ "team_id",
951
+ "user_id",
952
+ "permission_id",
953
+ "created_at"
954
+ )
955
+ SELECT
956
+ p."team_id",
957
+ p."user_id",
958
+ p."permission_id",
959
+ p."created_at"
960
+ FROM params p
961
+ WHERE p."is_deleted" = false
962
+ ON CONFLICT ("team_id", "user_id", "permission_id") DO UPDATE SET
963
+ "created_at" = EXCLUDED."created_at"
964
+ RETURNING 1
965
+ )
966
+ INSERT INTO "_stack_sync_metadata" ("mapping_name", "last_synced_sequence_id", "updated_at")
967
+ SELECT p."mapping_name", p."sequence_id", now() FROM params p
968
+ ON CONFLICT ("mapping_name") DO UPDATE SET
969
+ "last_synced_sequence_id" = GREATEST("_stack_sync_metadata"."last_synced_sequence_id", EXCLUDED."last_synced_sequence_id"),
970
+ "updated_at" = now();
971
+ `.trim() }
972
+ },
973
+ "team_invitations": {
974
+ sourceTables: { "VerificationCode": "VerificationCode" },
975
+ targetTable: "team_invitations",
976
+ targetTableSchemas: {
977
+ postgres: `
978
+ CREATE TABLE IF NOT EXISTS "team_invitations" (
979
+ "id" uuid PRIMARY KEY NOT NULL,
980
+ "team_id" uuid NOT NULL,
981
+ "team_display_name" text NOT NULL,
982
+ "recipient_email" text NOT NULL,
983
+ "expires_at_millis" bigint NOT NULL,
984
+ "created_at" timestamp without time zone NOT NULL
985
+ );
986
+ REVOKE ALL ON "team_invitations" FROM PUBLIC;
987
+ GRANT SELECT ON "team_invitations" TO PUBLIC;
988
+
989
+ CREATE TABLE IF NOT EXISTS "_stack_sync_metadata" (
990
+ "mapping_name" text PRIMARY KEY NOT NULL,
991
+ "last_synced_sequence_id" bigint NOT NULL DEFAULT -1,
992
+ "updated_at" timestamp without time zone NOT NULL DEFAULT now()
993
+ );
994
+ `.trim(),
995
+ clickhouse: `
996
+ CREATE TABLE IF NOT EXISTS analytics_internal.team_invitations (
997
+ project_id String,
998
+ branch_id String,
999
+ id UUID,
1000
+ team_id UUID,
1001
+ team_display_name String,
1002
+ recipient_email String,
1003
+ expires_at_millis Int64,
1004
+ created_at DateTime64(3, 'UTC'),
1005
+ sync_sequence_id Int64,
1006
+ sync_is_deleted UInt8,
1007
+ sync_created_at DateTime64(3, 'UTC') DEFAULT now64(3)
1008
+ )
1009
+ ENGINE ReplacingMergeTree(sync_sequence_id)
1010
+ PARTITION BY toYYYYMM(created_at)
1011
+ ORDER BY (project_id, branch_id, id);
1012
+ `.trim()
1013
+ },
1014
+ internalDbFetchQueries: { clickhouse: `
1015
+ SELECT *
1016
+ FROM (
1017
+ SELECT
1018
+ "Tenancy"."projectId" AS "project_id",
1019
+ "Tenancy"."branchId" AS "branch_id",
1020
+ "VerificationCode"."id"::uuid AS "id",
1021
+ ("VerificationCode"."data"->>'team_id')::uuid AS "team_id",
1022
+ "Team"."displayName" AS "team_display_name",
1023
+ "VerificationCode"."method"->>'email' AS "recipient_email",
1024
+ FLOOR(EXTRACT(EPOCH FROM "VerificationCode"."expiresAt") * 1000)::bigint AS "expires_at_millis",
1025
+ "VerificationCode"."createdAt" AS "created_at",
1026
+ "VerificationCode"."sequenceId" AS "sync_sequence_id",
1027
+ "Tenancy"."id" AS "tenancyId",
1028
+ false AS "sync_is_deleted"
1029
+ FROM "VerificationCode"
1030
+ JOIN "Tenancy" ON "Tenancy"."projectId" = "VerificationCode"."projectId"
1031
+ AND "Tenancy"."branchId" = "VerificationCode"."branchId"
1032
+ LEFT JOIN "Team" ON "Team"."teamId" = ("VerificationCode"."data"->>'team_id')::uuid
1033
+ AND "Team"."tenancyId" = "Tenancy"."id"
1034
+ WHERE "Tenancy"."id" = $1::uuid
1035
+ AND "VerificationCode"."type" = 'TEAM_INVITATION'
1036
+
1037
+ UNION ALL
1038
+
1039
+ SELECT
1040
+ "Tenancy"."projectId" AS "project_id",
1041
+ "Tenancy"."branchId" AS "branch_id",
1042
+ ("DeletedRow"."primaryKey"->>'id')::uuid AS "id",
1043
+ '00000000-0000-0000-0000-000000000000'::uuid AS "team_id",
1044
+ ''::text AS "team_display_name",
1045
+ ''::text AS "recipient_email",
1046
+ 0::bigint AS "expires_at_millis",
1047
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
1048
+ "DeletedRow"."sequenceId" AS "sync_sequence_id",
1049
+ "DeletedRow"."tenancyId" AS "tenancyId",
1050
+ true AS "sync_is_deleted"
1051
+ FROM "DeletedRow"
1052
+ JOIN "Tenancy" ON "Tenancy"."id" = "DeletedRow"."tenancyId"
1053
+ WHERE
1054
+ "DeletedRow"."tenancyId" = $1::uuid
1055
+ AND "DeletedRow"."tableName" = 'VerificationCode_TEAM_INVITATION'
1056
+ ) AS "_src"
1057
+ WHERE "sync_sequence_id" IS NOT NULL
1058
+ AND "sync_sequence_id" > $2::bigint
1059
+ ORDER BY "sync_sequence_id" ASC
1060
+ LIMIT 1000
1061
+ `.trim() },
1062
+ internalDbFetchQuery: `
1063
+ SELECT *
1064
+ FROM (
1065
+ SELECT
1066
+ "VerificationCode"."id"::uuid AS "id",
1067
+ ("VerificationCode"."data"->>'team_id')::uuid AS "team_id",
1068
+ "Team"."displayName" AS "team_display_name",
1069
+ "VerificationCode"."method"->>'email' AS "recipient_email",
1070
+ FLOOR(EXTRACT(EPOCH FROM "VerificationCode"."expiresAt") * 1000)::bigint AS "expires_at_millis",
1071
+ "VerificationCode"."createdAt" AS "created_at",
1072
+ "VerificationCode"."sequenceId" AS "sequence_id",
1073
+ "Tenancy"."id" AS "tenancyId",
1074
+ false AS "is_deleted"
1075
+ FROM "VerificationCode"
1076
+ JOIN "Tenancy" ON "Tenancy"."projectId" = "VerificationCode"."projectId"
1077
+ AND "Tenancy"."branchId" = "VerificationCode"."branchId"
1078
+ LEFT JOIN "Team" ON "Team"."teamId" = ("VerificationCode"."data"->>'team_id')::uuid
1079
+ AND "Team"."tenancyId" = "Tenancy"."id"
1080
+ WHERE "Tenancy"."id" = $1::uuid
1081
+ AND "VerificationCode"."type" = 'TEAM_INVITATION'
1082
+
1083
+ UNION ALL
1084
+
1085
+ SELECT
1086
+ ("DeletedRow"."primaryKey"->>'id')::uuid AS "id",
1087
+ '00000000-0000-0000-0000-000000000000'::uuid AS "team_id",
1088
+ ''::text AS "team_display_name",
1089
+ ''::text AS "recipient_email",
1090
+ 0::bigint AS "expires_at_millis",
1091
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
1092
+ "DeletedRow"."sequenceId" AS "sequence_id",
1093
+ "DeletedRow"."tenancyId" AS "tenancyId",
1094
+ true AS "is_deleted"
1095
+ FROM "DeletedRow"
1096
+ WHERE
1097
+ "DeletedRow"."tenancyId" = $1::uuid
1098
+ AND "DeletedRow"."tableName" = 'VerificationCode_TEAM_INVITATION'
1099
+ ) AS "_src"
1100
+ WHERE "sequence_id" IS NOT NULL
1101
+ AND "sequence_id" > $2::bigint
1102
+ ORDER BY "sequence_id" ASC
1103
+ LIMIT 1000
1104
+ `.trim(),
1105
+ externalDbUpdateQueries: { postgres: `
1106
+ WITH params AS (
1107
+ SELECT
1108
+ $1::uuid AS "id",
1109
+ $2::uuid AS "team_id",
1110
+ $3::text AS "team_display_name",
1111
+ $4::text AS "recipient_email",
1112
+ $5::bigint AS "expires_at_millis",
1113
+ $6::timestamp without time zone AS "created_at",
1114
+ $7::bigint AS "sequence_id",
1115
+ $8::boolean AS "is_deleted",
1116
+ $9::text AS "mapping_name"
1117
+ ),
1118
+ deleted AS (
1119
+ DELETE FROM "team_invitations" ti
1120
+ USING params p
1121
+ WHERE p."is_deleted" = true AND ti."id" = p."id"
1122
+ RETURNING 1
1123
+ ),
1124
+ upserted AS (
1125
+ INSERT INTO "team_invitations" (
1126
+ "id",
1127
+ "team_id",
1128
+ "team_display_name",
1129
+ "recipient_email",
1130
+ "expires_at_millis",
1131
+ "created_at"
1132
+ )
1133
+ SELECT
1134
+ p."id",
1135
+ p."team_id",
1136
+ p."team_display_name",
1137
+ p."recipient_email",
1138
+ p."expires_at_millis",
1139
+ p."created_at"
1140
+ FROM params p
1141
+ WHERE p."is_deleted" = false
1142
+ ON CONFLICT ("id") DO UPDATE SET
1143
+ "team_id" = EXCLUDED."team_id",
1144
+ "team_display_name" = EXCLUDED."team_display_name",
1145
+ "recipient_email" = EXCLUDED."recipient_email",
1146
+ "expires_at_millis" = EXCLUDED."expires_at_millis",
1147
+ "created_at" = EXCLUDED."created_at"
1148
+ RETURNING 1
1149
+ )
1150
+ INSERT INTO "_stack_sync_metadata" ("mapping_name", "last_synced_sequence_id", "updated_at")
1151
+ SELECT p."mapping_name", p."sequence_id", now() FROM params p
1152
+ ON CONFLICT ("mapping_name") DO UPDATE SET
1153
+ "last_synced_sequence_id" = GREATEST("_stack_sync_metadata"."last_synced_sequence_id", EXCLUDED."last_synced_sequence_id"),
1154
+ "updated_at" = now();
1155
+ `.trim() }
1156
+ },
1157
+ "email_outboxes": {
1158
+ sourceTables: { "EmailOutbox": "EmailOutbox" },
1159
+ targetTable: "email_outboxes",
1160
+ targetTableSchemas: {
1161
+ postgres: `
1162
+ CREATE TABLE IF NOT EXISTS "email_outboxes" (
1163
+ "id" uuid PRIMARY KEY NOT NULL,
1164
+ "status" text NOT NULL,
1165
+ "simple_status" text NOT NULL,
1166
+ "created_with" text NOT NULL,
1167
+ "email_draft_id" text,
1168
+ "email_programmatic_call_template_id" text,
1169
+ "theme_id" text,
1170
+ "is_high_priority" boolean NOT NULL DEFAULT false,
1171
+ "rendered_is_transactional" boolean,
1172
+ "rendered_subject" text,
1173
+ "rendered_notification_category_id" text,
1174
+ "started_rendering_at" timestamp without time zone,
1175
+ "finished_rendering_at" timestamp without time zone,
1176
+ "render_error" text,
1177
+ "scheduled_at" timestamp without time zone NOT NULL,
1178
+ "created_at" timestamp without time zone NOT NULL,
1179
+ "started_sending_at" timestamp without time zone,
1180
+ "finished_sending_at" timestamp without time zone,
1181
+ "server_error" text,
1182
+ "sent_at" timestamp without time zone,
1183
+ "delivered_at" timestamp without time zone,
1184
+ "opened_at" timestamp without time zone,
1185
+ "clicked_at" timestamp without time zone,
1186
+ "unsubscribed_at" timestamp without time zone,
1187
+ "marked_as_spam_at" timestamp without time zone,
1188
+ "bounced_at" timestamp without time zone,
1189
+ "delivery_delayed_at" timestamp without time zone,
1190
+ "can_have_delivery_info" boolean,
1191
+ "skipped_reason" text,
1192
+ "skipped_details" jsonb,
1193
+ "send_retries" integer NOT NULL DEFAULT 0,
1194
+ "is_paused" boolean NOT NULL DEFAULT false
1195
+ );
1196
+ REVOKE ALL ON "email_outboxes" FROM PUBLIC;
1197
+ GRANT SELECT ON "email_outboxes" TO PUBLIC;
1198
+
1199
+ CREATE TABLE IF NOT EXISTS "_stack_sync_metadata" (
1200
+ "mapping_name" text PRIMARY KEY NOT NULL,
1201
+ "last_synced_sequence_id" bigint NOT NULL DEFAULT -1,
1202
+ "updated_at" timestamp without time zone NOT NULL DEFAULT now()
1203
+ );
1204
+ `.trim(),
1205
+ clickhouse: `
1206
+ CREATE TABLE IF NOT EXISTS analytics_internal.email_outboxes (
1207
+ project_id String,
1208
+ branch_id String,
1209
+ id UUID,
1210
+ status LowCardinality(String),
1211
+ simple_status LowCardinality(String),
1212
+ created_with LowCardinality(String),
1213
+ email_draft_id Nullable(String),
1214
+ email_programmatic_call_template_id Nullable(String),
1215
+ theme_id Nullable(String),
1216
+ is_high_priority UInt8,
1217
+ is_transactional Nullable(UInt8),
1218
+ subject Nullable(String),
1219
+ notification_category_id Nullable(String),
1220
+ started_rendering_at Nullable(DateTime64(3, 'UTC')),
1221
+ rendered_at Nullable(DateTime64(3, 'UTC')),
1222
+ render_error Nullable(String),
1223
+ scheduled_at DateTime64(3, 'UTC'),
1224
+ created_at DateTime64(3, 'UTC'),
1225
+ updated_at DateTime64(3, 'UTC'),
1226
+ started_sending_at Nullable(DateTime64(3, 'UTC')),
1227
+ server_error Nullable(String),
1228
+ delivered_at Nullable(DateTime64(3, 'UTC')),
1229
+ opened_at Nullable(DateTime64(3, 'UTC')),
1230
+ clicked_at Nullable(DateTime64(3, 'UTC')),
1231
+ unsubscribed_at Nullable(DateTime64(3, 'UTC')),
1232
+ marked_as_spam_at Nullable(DateTime64(3, 'UTC')),
1233
+ bounced_at Nullable(DateTime64(3, 'UTC')),
1234
+ delivery_delayed_at Nullable(DateTime64(3, 'UTC')),
1235
+ can_have_delivery_info Nullable(UInt8),
1236
+ skipped_reason LowCardinality(Nullable(String)),
1237
+ skipped_details Nullable(String),
1238
+ send_retries Int32,
1239
+ is_paused UInt8,
1240
+ sync_sequence_id Int64,
1241
+ sync_is_deleted UInt8,
1242
+ sync_created_at DateTime64(3, 'UTC') DEFAULT now64(3)
1243
+ )
1244
+ ENGINE ReplacingMergeTree(sync_sequence_id)
1245
+ PARTITION BY toYYYYMM(created_at)
1246
+ ORDER BY (project_id, branch_id, id);
1247
+ `.trim()
1248
+ },
1249
+ internalDbFetchQueries: { clickhouse: `
1250
+ SELECT *
1251
+ FROM (
1252
+ SELECT
1253
+ "Tenancy"."projectId" AS "project_id",
1254
+ "Tenancy"."branchId" AS "branch_id",
1255
+ "EmailOutbox"."id" AS "id",
1256
+ LOWER(REPLACE("EmailOutbox"."status"::text, '_', '-')) AS "status",
1257
+ LOWER(REPLACE("EmailOutbox"."simpleStatus"::text, '_', '-')) AS "simple_status",
1258
+ CASE WHEN "EmailOutbox"."createdWith"::text = 'DRAFT' THEN 'draft' ELSE 'programmatic-call' END AS "created_with",
1259
+ "EmailOutbox"."emailDraftId" AS "email_draft_id",
1260
+ "EmailOutbox"."emailProgrammaticCallTemplateId" AS "email_programmatic_call_template_id",
1261
+ "EmailOutbox"."themeId" AS "theme_id",
1262
+ "EmailOutbox"."isHighPriority" AS "is_high_priority",
1263
+ "EmailOutbox"."renderedIsTransactional" AS "is_transactional",
1264
+ "EmailOutbox"."renderedSubject" AS "subject",
1265
+ "EmailOutbox"."renderedNotificationCategoryId" AS "notification_category_id",
1266
+ "EmailOutbox"."startedRenderingAt" AS "started_rendering_at",
1267
+ "EmailOutbox"."finishedRenderingAt" AS "rendered_at",
1268
+ "EmailOutbox"."renderErrorExternalMessage" AS "render_error",
1269
+ "EmailOutbox"."scheduledAt" AS "scheduled_at",
1270
+ "EmailOutbox"."createdAt" AS "created_at",
1271
+ "EmailOutbox"."updatedAt" AS "updated_at",
1272
+ "EmailOutbox"."startedSendingAt" AS "started_sending_at",
1273
+ "EmailOutbox"."sendServerErrorExternalMessage" AS "server_error",
1274
+ "EmailOutbox"."deliveredAt" AS "delivered_at",
1275
+ "EmailOutbox"."openedAt" AS "opened_at",
1276
+ "EmailOutbox"."clickedAt" AS "clicked_at",
1277
+ "EmailOutbox"."unsubscribedAt" AS "unsubscribed_at",
1278
+ "EmailOutbox"."markedAsSpamAt" AS "marked_as_spam_at",
1279
+ "EmailOutbox"."bouncedAt" AS "bounced_at",
1280
+ "EmailOutbox"."deliveryDelayedAt" AS "delivery_delayed_at",
1281
+ "EmailOutbox"."canHaveDeliveryInfo" AS "can_have_delivery_info",
1282
+ LOWER(REPLACE("EmailOutbox"."skippedReason"::text, '_', '-')) AS "skipped_reason",
1283
+ "EmailOutbox"."skippedDetails" AS "skipped_details",
1284
+ "EmailOutbox"."sendRetries" AS "send_retries",
1285
+ "EmailOutbox"."isPaused" AS "is_paused",
1286
+ "EmailOutbox"."sequenceId" AS "sync_sequence_id",
1287
+ "EmailOutbox"."tenancyId" AS "tenancyId",
1288
+ false AS "sync_is_deleted"
1289
+ FROM "EmailOutbox"
1290
+ JOIN "Tenancy" ON "Tenancy"."id" = "EmailOutbox"."tenancyId"
1291
+ WHERE "EmailOutbox"."tenancyId" = $1::uuid
1292
+
1293
+ UNION ALL
1294
+
1295
+ SELECT
1296
+ "Tenancy"."projectId" AS "project_id",
1297
+ "Tenancy"."branchId" AS "branch_id",
1298
+ ("DeletedRow"."primaryKey"->>'id')::uuid AS "id",
1299
+ ''::text AS "status",
1300
+ ''::text AS "simple_status",
1301
+ ''::text AS "created_with",
1302
+ NULL::text AS "email_draft_id",
1303
+ NULL::text AS "email_programmatic_call_template_id",
1304
+ NULL::text AS "theme_id",
1305
+ false AS "is_high_priority",
1306
+ NULL::boolean AS "is_transactional",
1307
+ NULL::text AS "subject",
1308
+ NULL::text AS "notification_category_id",
1309
+ NULL::timestamp without time zone AS "started_rendering_at",
1310
+ NULL::timestamp without time zone AS "rendered_at",
1311
+ NULL::text AS "render_error",
1312
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "scheduled_at",
1313
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
1314
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "updated_at",
1315
+ NULL::timestamp without time zone AS "started_sending_at",
1316
+ NULL::text AS "server_error",
1317
+ NULL::timestamp without time zone AS "delivered_at",
1318
+ NULL::timestamp without time zone AS "opened_at",
1319
+ NULL::timestamp without time zone AS "clicked_at",
1320
+ NULL::timestamp without time zone AS "unsubscribed_at",
1321
+ NULL::timestamp without time zone AS "marked_as_spam_at",
1322
+ NULL::timestamp without time zone AS "bounced_at",
1323
+ NULL::timestamp without time zone AS "delivery_delayed_at",
1324
+ NULL::boolean AS "can_have_delivery_info",
1325
+ NULL::text AS "skipped_reason",
1326
+ NULL::jsonb AS "skipped_details",
1327
+ 0 AS "send_retries",
1328
+ false AS "is_paused",
1329
+ "DeletedRow"."sequenceId" AS "sync_sequence_id",
1330
+ "DeletedRow"."tenancyId" AS "tenancyId",
1331
+ true AS "sync_is_deleted"
1332
+ FROM "DeletedRow"
1333
+ JOIN "Tenancy" ON "Tenancy"."id" = "DeletedRow"."tenancyId"
1334
+ WHERE
1335
+ "DeletedRow"."tenancyId" = $1::uuid
1336
+ AND "DeletedRow"."tableName" = 'EmailOutbox'
1337
+ ) AS "_src"
1338
+ WHERE "sync_sequence_id" IS NOT NULL
1339
+ AND "sync_sequence_id" > $2::bigint
1340
+ ORDER BY "sync_sequence_id" ASC
1341
+ LIMIT 1000
1342
+ `.trim() },
1343
+ internalDbFetchQuery: `
1344
+ SELECT *
1345
+ FROM (
1346
+ SELECT
1347
+ "EmailOutbox"."id" AS "id",
1348
+ "EmailOutbox"."status"::text AS "status",
1349
+ "EmailOutbox"."simpleStatus"::text AS "simple_status",
1350
+ "EmailOutbox"."createdWith"::text AS "created_with",
1351
+ "EmailOutbox"."emailDraftId" AS "email_draft_id",
1352
+ "EmailOutbox"."emailProgrammaticCallTemplateId" AS "email_programmatic_call_template_id",
1353
+ "EmailOutbox"."themeId" AS "theme_id",
1354
+ "EmailOutbox"."isHighPriority" AS "is_high_priority",
1355
+ "EmailOutbox"."renderedIsTransactional" AS "rendered_is_transactional",
1356
+ "EmailOutbox"."renderedSubject" AS "rendered_subject",
1357
+ "EmailOutbox"."renderedNotificationCategoryId" AS "rendered_notification_category_id",
1358
+ "EmailOutbox"."startedRenderingAt" AS "started_rendering_at",
1359
+ "EmailOutbox"."finishedRenderingAt" AS "finished_rendering_at",
1360
+ "EmailOutbox"."renderErrorExternalMessage" AS "render_error",
1361
+ "EmailOutbox"."scheduledAt" AS "scheduled_at",
1362
+ "EmailOutbox"."createdAt" AS "created_at",
1363
+ "EmailOutbox"."startedSendingAt" AS "started_sending_at",
1364
+ "EmailOutbox"."finishedSendingAt" AS "finished_sending_at",
1365
+ "EmailOutbox"."sendServerErrorExternalMessage" AS "server_error",
1366
+ "EmailOutbox"."sentAt" AS "sent_at",
1367
+ "EmailOutbox"."deliveredAt" AS "delivered_at",
1368
+ "EmailOutbox"."openedAt" AS "opened_at",
1369
+ "EmailOutbox"."clickedAt" AS "clicked_at",
1370
+ "EmailOutbox"."unsubscribedAt" AS "unsubscribed_at",
1371
+ "EmailOutbox"."markedAsSpamAt" AS "marked_as_spam_at",
1372
+ "EmailOutbox"."bouncedAt" AS "bounced_at",
1373
+ "EmailOutbox"."deliveryDelayedAt" AS "delivery_delayed_at",
1374
+ "EmailOutbox"."canHaveDeliveryInfo" AS "can_have_delivery_info",
1375
+ "EmailOutbox"."skippedReason"::text AS "skipped_reason",
1376
+ "EmailOutbox"."skippedDetails" AS "skipped_details",
1377
+ "EmailOutbox"."sendRetries" AS "send_retries",
1378
+ "EmailOutbox"."isPaused" AS "is_paused",
1379
+ "EmailOutbox"."sequenceId" AS "sequence_id",
1380
+ "EmailOutbox"."tenancyId",
1381
+ false AS "is_deleted"
1382
+ FROM "EmailOutbox"
1383
+ WHERE "EmailOutbox"."tenancyId" = $1::uuid
1384
+
1385
+ UNION ALL
1386
+
1387
+ SELECT
1388
+ ("DeletedRow"."primaryKey"->>'id')::uuid AS "id",
1389
+ ''::text AS "status",
1390
+ ''::text AS "simple_status",
1391
+ ''::text AS "created_with",
1392
+ NULL::text AS "email_draft_id",
1393
+ NULL::text AS "email_programmatic_call_template_id",
1394
+ NULL::text AS "theme_id",
1395
+ false AS "is_high_priority",
1396
+ NULL::boolean AS "rendered_is_transactional",
1397
+ NULL::text AS "rendered_subject",
1398
+ NULL::text AS "rendered_notification_category_id",
1399
+ NULL::timestamp without time zone AS "started_rendering_at",
1400
+ NULL::timestamp without time zone AS "finished_rendering_at",
1401
+ NULL::text AS "render_error",
1402
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "scheduled_at",
1403
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
1404
+ NULL::timestamp without time zone AS "started_sending_at",
1405
+ NULL::timestamp without time zone AS "finished_sending_at",
1406
+ NULL::text AS "server_error",
1407
+ NULL::timestamp without time zone AS "sent_at",
1408
+ NULL::timestamp without time zone AS "delivered_at",
1409
+ NULL::timestamp without time zone AS "opened_at",
1410
+ NULL::timestamp without time zone AS "clicked_at",
1411
+ NULL::timestamp without time zone AS "unsubscribed_at",
1412
+ NULL::timestamp without time zone AS "marked_as_spam_at",
1413
+ NULL::timestamp without time zone AS "bounced_at",
1414
+ NULL::timestamp without time zone AS "delivery_delayed_at",
1415
+ NULL::boolean AS "can_have_delivery_info",
1416
+ NULL::text AS "skipped_reason",
1417
+ NULL::jsonb AS "skipped_details",
1418
+ 0 AS "send_retries",
1419
+ false AS "is_paused",
1420
+ "DeletedRow"."sequenceId" AS "sequence_id",
1421
+ "DeletedRow"."tenancyId",
1422
+ true AS "is_deleted"
1423
+ FROM "DeletedRow"
1424
+ WHERE
1425
+ "DeletedRow"."tenancyId" = $1::uuid
1426
+ AND "DeletedRow"."tableName" = 'EmailOutbox'
1427
+ ) AS "_src"
1428
+ WHERE "sequence_id" IS NOT NULL
1429
+ AND "sequence_id" > $2::bigint
1430
+ ORDER BY "sequence_id" ASC
1431
+ LIMIT 1000
1432
+ `.trim(),
1433
+ externalDbUpdateQueries: { postgres: `
1434
+ WITH params AS (
1435
+ SELECT
1436
+ $1::uuid AS "id",
1437
+ $2::text AS "status",
1438
+ $3::text AS "simple_status",
1439
+ $4::text AS "created_with",
1440
+ $5::text AS "email_draft_id",
1441
+ $6::text AS "email_programmatic_call_template_id",
1442
+ $7::text AS "theme_id",
1443
+ $8::boolean AS "is_high_priority",
1444
+ $9::boolean AS "rendered_is_transactional",
1445
+ $10::text AS "rendered_subject",
1446
+ $11::text AS "rendered_notification_category_id",
1447
+ $12::timestamp without time zone AS "started_rendering_at",
1448
+ $13::timestamp without time zone AS "finished_rendering_at",
1449
+ $14::text AS "render_error",
1450
+ $15::timestamp without time zone AS "scheduled_at",
1451
+ $16::timestamp without time zone AS "created_at",
1452
+ $17::timestamp without time zone AS "started_sending_at",
1453
+ $18::timestamp without time zone AS "finished_sending_at",
1454
+ $19::text AS "server_error",
1455
+ $20::timestamp without time zone AS "sent_at",
1456
+ $21::timestamp without time zone AS "delivered_at",
1457
+ $22::timestamp without time zone AS "opened_at",
1458
+ $23::timestamp without time zone AS "clicked_at",
1459
+ $24::timestamp without time zone AS "unsubscribed_at",
1460
+ $25::timestamp without time zone AS "marked_as_spam_at",
1461
+ $26::timestamp without time zone AS "bounced_at",
1462
+ $27::timestamp without time zone AS "delivery_delayed_at",
1463
+ $28::boolean AS "can_have_delivery_info",
1464
+ $29::text AS "skipped_reason",
1465
+ $30::jsonb AS "skipped_details",
1466
+ $31::integer AS "send_retries",
1467
+ $32::boolean AS "is_paused",
1468
+ $33::bigint AS "sequence_id",
1469
+ $34::boolean AS "is_deleted",
1470
+ $35::text AS "mapping_name"
1471
+ ),
1472
+ deleted AS (
1473
+ DELETE FROM "email_outboxes" eo
1474
+ USING params p
1475
+ WHERE p."is_deleted" = true AND eo."id" = p."id"
1476
+ RETURNING 1
1477
+ ),
1478
+ upserted AS (
1479
+ INSERT INTO "email_outboxes" (
1480
+ "id",
1481
+ "status",
1482
+ "simple_status",
1483
+ "created_with",
1484
+ "email_draft_id",
1485
+ "email_programmatic_call_template_id",
1486
+ "theme_id",
1487
+ "is_high_priority",
1488
+ "rendered_is_transactional",
1489
+ "rendered_subject",
1490
+ "rendered_notification_category_id",
1491
+ "started_rendering_at",
1492
+ "finished_rendering_at",
1493
+ "render_error",
1494
+ "scheduled_at",
1495
+ "created_at",
1496
+ "started_sending_at",
1497
+ "finished_sending_at",
1498
+ "server_error",
1499
+ "sent_at",
1500
+ "delivered_at",
1501
+ "opened_at",
1502
+ "clicked_at",
1503
+ "unsubscribed_at",
1504
+ "marked_as_spam_at",
1505
+ "bounced_at",
1506
+ "delivery_delayed_at",
1507
+ "can_have_delivery_info",
1508
+ "skipped_reason",
1509
+ "skipped_details",
1510
+ "send_retries",
1511
+ "is_paused"
1512
+ )
1513
+ SELECT
1514
+ p."id",
1515
+ p."status",
1516
+ p."simple_status",
1517
+ p."created_with",
1518
+ p."email_draft_id",
1519
+ p."email_programmatic_call_template_id",
1520
+ p."theme_id",
1521
+ p."is_high_priority",
1522
+ p."rendered_is_transactional",
1523
+ p."rendered_subject",
1524
+ p."rendered_notification_category_id",
1525
+ p."started_rendering_at",
1526
+ p."finished_rendering_at",
1527
+ p."render_error",
1528
+ p."scheduled_at",
1529
+ p."created_at",
1530
+ p."started_sending_at",
1531
+ p."finished_sending_at",
1532
+ p."server_error",
1533
+ p."sent_at",
1534
+ p."delivered_at",
1535
+ p."opened_at",
1536
+ p."clicked_at",
1537
+ p."unsubscribed_at",
1538
+ p."marked_as_spam_at",
1539
+ p."bounced_at",
1540
+ p."delivery_delayed_at",
1541
+ p."can_have_delivery_info",
1542
+ p."skipped_reason",
1543
+ p."skipped_details",
1544
+ p."send_retries",
1545
+ p."is_paused"
1546
+ FROM params p
1547
+ WHERE p."is_deleted" = false
1548
+ ON CONFLICT ("id") DO UPDATE SET
1549
+ "status" = EXCLUDED."status",
1550
+ "simple_status" = EXCLUDED."simple_status",
1551
+ "created_with" = EXCLUDED."created_with",
1552
+ "email_draft_id" = EXCLUDED."email_draft_id",
1553
+ "email_programmatic_call_template_id" = EXCLUDED."email_programmatic_call_template_id",
1554
+ "theme_id" = EXCLUDED."theme_id",
1555
+ "is_high_priority" = EXCLUDED."is_high_priority",
1556
+ "rendered_is_transactional" = EXCLUDED."rendered_is_transactional",
1557
+ "rendered_subject" = EXCLUDED."rendered_subject",
1558
+ "rendered_notification_category_id" = EXCLUDED."rendered_notification_category_id",
1559
+ "started_rendering_at" = EXCLUDED."started_rendering_at",
1560
+ "finished_rendering_at" = EXCLUDED."finished_rendering_at",
1561
+ "render_error" = EXCLUDED."render_error",
1562
+ "scheduled_at" = EXCLUDED."scheduled_at",
1563
+ "created_at" = EXCLUDED."created_at",
1564
+ "started_sending_at" = EXCLUDED."started_sending_at",
1565
+ "finished_sending_at" = EXCLUDED."finished_sending_at",
1566
+ "server_error" = EXCLUDED."server_error",
1567
+ "sent_at" = EXCLUDED."sent_at",
1568
+ "delivered_at" = EXCLUDED."delivered_at",
1569
+ "opened_at" = EXCLUDED."opened_at",
1570
+ "clicked_at" = EXCLUDED."clicked_at",
1571
+ "unsubscribed_at" = EXCLUDED."unsubscribed_at",
1572
+ "marked_as_spam_at" = EXCLUDED."marked_as_spam_at",
1573
+ "bounced_at" = EXCLUDED."bounced_at",
1574
+ "delivery_delayed_at" = EXCLUDED."delivery_delayed_at",
1575
+ "can_have_delivery_info" = EXCLUDED."can_have_delivery_info",
1576
+ "skipped_reason" = EXCLUDED."skipped_reason",
1577
+ "skipped_details" = EXCLUDED."skipped_details",
1578
+ "send_retries" = EXCLUDED."send_retries",
1579
+ "is_paused" = EXCLUDED."is_paused"
1580
+ RETURNING 1
1581
+ )
1582
+ INSERT INTO "_stack_sync_metadata" ("mapping_name", "last_synced_sequence_id", "updated_at")
1583
+ SELECT p."mapping_name", p."sequence_id", now() FROM params p
1584
+ ON CONFLICT ("mapping_name") DO UPDATE SET
1585
+ "last_synced_sequence_id" = GREATEST("_stack_sync_metadata"."last_synced_sequence_id", EXCLUDED."last_synced_sequence_id"),
1586
+ "updated_at" = now();
1587
+ `.trim() }
1588
+ },
1589
+ "project_permissions": {
1590
+ sourceTables: { "ProjectUserDirectPermission": "ProjectUserDirectPermission" },
1591
+ targetTable: "project_permissions",
1592
+ targetTableSchemas: {
1593
+ postgres: `
1594
+ CREATE TABLE IF NOT EXISTS "project_permissions" (
1595
+ "user_id" uuid NOT NULL,
1596
+ "permission_id" text NOT NULL,
1597
+ "created_at" timestamp without time zone NOT NULL,
1598
+ PRIMARY KEY ("user_id", "permission_id")
1599
+ );
1600
+ REVOKE ALL ON "project_permissions" FROM PUBLIC;
1601
+ GRANT SELECT ON "project_permissions" TO PUBLIC;
1602
+
1603
+ CREATE TABLE IF NOT EXISTS "_stack_sync_metadata" (
1604
+ "mapping_name" text PRIMARY KEY NOT NULL,
1605
+ "last_synced_sequence_id" bigint NOT NULL DEFAULT -1,
1606
+ "updated_at" timestamp without time zone NOT NULL DEFAULT now()
1607
+ );
1608
+ `.trim(),
1609
+ clickhouse: `
1610
+ CREATE TABLE IF NOT EXISTS analytics_internal.project_permissions (
1611
+ project_id String,
1612
+ branch_id String,
1613
+ user_id UUID,
1614
+ id String,
1615
+ created_at DateTime64(3, 'UTC'),
1616
+ sync_sequence_id Int64,
1617
+ sync_is_deleted UInt8,
1618
+ sync_created_at DateTime64(3, 'UTC') DEFAULT now64(3)
1619
+ )
1620
+ ENGINE ReplacingMergeTree(sync_sequence_id)
1621
+ PARTITION BY toYYYYMM(created_at)
1622
+ ORDER BY (project_id, branch_id, user_id, id);
1623
+ `.trim()
1624
+ },
1625
+ internalDbFetchQueries: { clickhouse: `
1626
+ SELECT *
1627
+ FROM (
1628
+ SELECT
1629
+ "Tenancy"."projectId" AS "project_id",
1630
+ "Tenancy"."branchId" AS "branch_id",
1631
+ "ProjectUserDirectPermission"."projectUserId" AS "user_id",
1632
+ "ProjectUserDirectPermission"."permissionId" AS "id",
1633
+ "ProjectUserDirectPermission"."createdAt" AS "created_at",
1634
+ "ProjectUserDirectPermission"."sequenceId" AS "sync_sequence_id",
1635
+ "ProjectUserDirectPermission"."tenancyId" AS "tenancyId",
1636
+ false AS "sync_is_deleted"
1637
+ FROM "ProjectUserDirectPermission"
1638
+ JOIN "Tenancy" ON "Tenancy"."id" = "ProjectUserDirectPermission"."tenancyId"
1639
+ WHERE "ProjectUserDirectPermission"."tenancyId" = $1::uuid
1640
+
1641
+ UNION ALL
1642
+
1643
+ SELECT
1644
+ "Tenancy"."projectId" AS "project_id",
1645
+ "Tenancy"."branchId" AS "branch_id",
1646
+ ("DeletedRow"."primaryKey"->>'projectUserId')::uuid AS "user_id",
1647
+ "DeletedRow"."primaryKey"->>'permissionId' AS "id",
1648
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
1649
+ "DeletedRow"."sequenceId" AS "sync_sequence_id",
1650
+ "DeletedRow"."tenancyId" AS "tenancyId",
1651
+ true AS "sync_is_deleted"
1652
+ FROM "DeletedRow"
1653
+ JOIN "Tenancy" ON "Tenancy"."id" = "DeletedRow"."tenancyId"
1654
+ WHERE
1655
+ "DeletedRow"."tenancyId" = $1::uuid
1656
+ AND "DeletedRow"."tableName" = 'ProjectUserDirectPermission'
1657
+ ) AS "_src"
1658
+ WHERE "sync_sequence_id" IS NOT NULL
1659
+ AND "sync_sequence_id" > $2::bigint
1660
+ ORDER BY "sync_sequence_id" ASC
1661
+ LIMIT 1000
1662
+ `.trim() },
1663
+ internalDbFetchQuery: `
1664
+ SELECT *
1665
+ FROM (
1666
+ SELECT
1667
+ "ProjectUserDirectPermission"."projectUserId" AS "user_id",
1668
+ "ProjectUserDirectPermission"."permissionId" AS "permission_id",
1669
+ "ProjectUserDirectPermission"."createdAt" AS "created_at",
1670
+ "ProjectUserDirectPermission"."sequenceId" AS "sequence_id",
1671
+ "ProjectUserDirectPermission"."tenancyId",
1672
+ false AS "is_deleted"
1673
+ FROM "ProjectUserDirectPermission"
1674
+ WHERE "ProjectUserDirectPermission"."tenancyId" = $1::uuid
1675
+
1676
+ UNION ALL
1677
+
1678
+ SELECT
1679
+ ("DeletedRow"."primaryKey"->>'projectUserId')::uuid AS "user_id",
1680
+ "DeletedRow"."primaryKey"->>'permissionId' AS "id",
1681
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
1682
+ "DeletedRow"."sequenceId" AS "sequence_id",
1683
+ "DeletedRow"."tenancyId",
1684
+ true AS "is_deleted"
1685
+ FROM "DeletedRow"
1686
+ WHERE
1687
+ "DeletedRow"."tenancyId" = $1::uuid
1688
+ AND "DeletedRow"."tableName" = 'ProjectUserDirectPermission'
1689
+ ) AS "_src"
1690
+ WHERE "sequence_id" IS NOT NULL
1691
+ AND "sequence_id" > $2::bigint
1692
+ ORDER BY "sequence_id" ASC
1693
+ LIMIT 1000
1694
+ `.trim(),
1695
+ externalDbUpdateQueries: { postgres: `
1696
+ WITH params AS (
1697
+ SELECT
1698
+ $1::uuid AS "user_id",
1699
+ $2::text AS "permission_id",
1700
+ $3::timestamp without time zone AS "created_at",
1701
+ $4::bigint AS "sequence_id",
1702
+ $5::boolean AS "is_deleted",
1703
+ $6::text AS "mapping_name"
1704
+ ),
1705
+ deleted AS (
1706
+ DELETE FROM "project_permissions" pp
1707
+ USING params p
1708
+ WHERE p."is_deleted" = true AND pp."user_id" = p."user_id" AND pp."permission_id" = p."permission_id"
1709
+ RETURNING 1
1710
+ ),
1711
+ upserted AS (
1712
+ INSERT INTO "project_permissions" (
1713
+ "user_id",
1714
+ "permission_id",
1715
+ "created_at"
1716
+ )
1717
+ SELECT
1718
+ p."user_id",
1719
+ p."permission_id",
1720
+ p."created_at"
1721
+ FROM params p
1722
+ WHERE p."is_deleted" = false
1723
+ ON CONFLICT ("user_id", "permission_id") DO UPDATE SET
1724
+ "created_at" = EXCLUDED."created_at"
1725
+ RETURNING 1
1726
+ )
1727
+ INSERT INTO "_stack_sync_metadata" ("mapping_name", "last_synced_sequence_id", "updated_at")
1728
+ SELECT p."mapping_name", p."sequence_id", now() FROM params p
1729
+ ON CONFLICT ("mapping_name") DO UPDATE SET
1730
+ "last_synced_sequence_id" = GREATEST("_stack_sync_metadata"."last_synced_sequence_id", EXCLUDED."last_synced_sequence_id"),
1731
+ "updated_at" = now();
1732
+ `.trim() }
1733
+ },
1734
+ "notification_preferences": {
1735
+ sourceTables: { "UserNotificationPreference": "UserNotificationPreference" },
1736
+ targetTable: "notification_preferences",
1737
+ targetTableSchemas: {
1738
+ postgres: `
1739
+ CREATE TABLE IF NOT EXISTS "notification_preferences" (
1740
+ "id" uuid PRIMARY KEY NOT NULL,
1741
+ "user_id" uuid NOT NULL,
1742
+ "notification_category_id" text NOT NULL,
1743
+ "enabled" boolean NOT NULL DEFAULT true
1744
+ );
1745
+ REVOKE ALL ON "notification_preferences" FROM PUBLIC;
1746
+ GRANT SELECT ON "notification_preferences" TO PUBLIC;
1747
+
1748
+ CREATE TABLE IF NOT EXISTS "_stack_sync_metadata" (
1749
+ "mapping_name" text PRIMARY KEY NOT NULL,
1750
+ "last_synced_sequence_id" bigint NOT NULL DEFAULT -1,
1751
+ "updated_at" timestamp without time zone NOT NULL DEFAULT now()
1752
+ );
1753
+ `.trim(),
1754
+ clickhouse: `
1755
+ CREATE TABLE IF NOT EXISTS analytics_internal.notification_preferences (
1756
+ project_id String,
1757
+ branch_id String,
1758
+ user_id UUID,
1759
+ notification_category_id String,
1760
+ enabled UInt8,
1761
+ sync_sequence_id Int64,
1762
+ sync_is_deleted UInt8,
1763
+ sync_created_at DateTime64(3, 'UTC') DEFAULT now64(3)
1764
+ )
1765
+ ENGINE ReplacingMergeTree(sync_sequence_id)
1766
+ ORDER BY (project_id, branch_id, user_id, notification_category_id);
1767
+ `.trim()
1768
+ },
1769
+ internalDbFetchQueries: { clickhouse: `
1770
+ SELECT *
1771
+ FROM (
1772
+ SELECT
1773
+ "Tenancy"."projectId" AS "project_id",
1774
+ "Tenancy"."branchId" AS "branch_id",
1775
+ "UserNotificationPreference"."projectUserId" AS "user_id",
1776
+ "UserNotificationPreference"."notificationCategoryId" AS "notification_category_id",
1777
+ "UserNotificationPreference"."enabled" AS "enabled",
1778
+ "UserNotificationPreference"."sequenceId" AS "sync_sequence_id",
1779
+ "UserNotificationPreference"."tenancyId" AS "tenancyId",
1780
+ false AS "sync_is_deleted"
1781
+ FROM "UserNotificationPreference"
1782
+ JOIN "Tenancy" ON "Tenancy"."id" = "UserNotificationPreference"."tenancyId"
1783
+ WHERE "UserNotificationPreference"."tenancyId" = $1::uuid
1784
+
1785
+ UNION ALL
1786
+
1787
+ SELECT
1788
+ "Tenancy"."projectId" AS "project_id",
1789
+ "Tenancy"."branchId" AS "branch_id",
1790
+ ("DeletedRow"."data"->>'projectUserId')::uuid AS "user_id",
1791
+ ("DeletedRow"."data"->>'notificationCategoryId')::uuid AS "notification_category_id",
1792
+ ("DeletedRow"."data"->>'enabled')::boolean AS "enabled",
1793
+ "DeletedRow"."sequenceId" AS "sync_sequence_id",
1794
+ "DeletedRow"."tenancyId" AS "tenancyId",
1795
+ true AS "sync_is_deleted"
1796
+ FROM "DeletedRow"
1797
+ JOIN "Tenancy" ON "Tenancy"."id" = "DeletedRow"."tenancyId"
1798
+ WHERE
1799
+ "DeletedRow"."tenancyId" = $1::uuid
1800
+ AND "DeletedRow"."tableName" = 'UserNotificationPreference'
1801
+ ) AS "_src"
1802
+ WHERE "sync_sequence_id" IS NOT NULL
1803
+ AND "sync_sequence_id" > $2::bigint
1804
+ ORDER BY "sync_sequence_id" ASC
1805
+ LIMIT 1000
1806
+ `.trim() },
1807
+ internalDbFetchQuery: `
1808
+ SELECT *
1809
+ FROM (
1810
+ SELECT
1811
+ "UserNotificationPreference"."id" AS "id",
1812
+ "UserNotificationPreference"."projectUserId" AS "user_id",
1813
+ "UserNotificationPreference"."notificationCategoryId" AS "notification_category_id",
1814
+ "UserNotificationPreference"."enabled" AS "enabled",
1815
+ "UserNotificationPreference"."sequenceId" AS "sequence_id",
1816
+ "UserNotificationPreference"."tenancyId",
1817
+ false AS "is_deleted"
1818
+ FROM "UserNotificationPreference"
1819
+ WHERE "UserNotificationPreference"."tenancyId" = $1::uuid
1820
+
1821
+ UNION ALL
1822
+
1823
+ SELECT
1824
+ ("DeletedRow"."primaryKey"->>'id')::uuid AS "id",
1825
+ ("DeletedRow"."data"->>'projectUserId')::uuid AS "user_id",
1826
+ ("DeletedRow"."data"->>'notificationCategoryId')::uuid AS "notification_category_id",
1827
+ ("DeletedRow"."data"->>'enabled')::boolean AS "enabled",
1828
+ "DeletedRow"."sequenceId" AS "sequence_id",
1829
+ "DeletedRow"."tenancyId",
1830
+ true AS "is_deleted"
1831
+ FROM "DeletedRow"
1832
+ WHERE
1833
+ "DeletedRow"."tenancyId" = $1::uuid
1834
+ AND "DeletedRow"."tableName" = 'UserNotificationPreference'
1835
+ ) AS "_src"
1836
+ WHERE "sequence_id" IS NOT NULL
1837
+ AND "sequence_id" > $2::bigint
1838
+ ORDER BY "sequence_id" ASC
1839
+ LIMIT 1000
1840
+ `.trim(),
1841
+ externalDbUpdateQueries: { postgres: `
1842
+ WITH params AS (
1843
+ SELECT
1844
+ $1::uuid AS "id",
1845
+ $2::uuid AS "user_id",
1846
+ $3::text AS "notification_category_id",
1847
+ $4::boolean AS "enabled",
1848
+ $5::bigint AS "sequence_id",
1849
+ $6::boolean AS "is_deleted",
1850
+ $7::text AS "mapping_name"
1851
+ ),
1852
+ deleted AS (
1853
+ DELETE FROM "notification_preferences" np
1854
+ USING params p
1855
+ WHERE p."is_deleted" = true AND np."id" = p."id"
1856
+ RETURNING 1
1857
+ ),
1858
+ upserted AS (
1859
+ INSERT INTO "notification_preferences" (
1860
+ "id",
1861
+ "user_id",
1862
+ "notification_category_id",
1863
+ "enabled"
1864
+ )
1865
+ SELECT
1866
+ p."id",
1867
+ p."user_id",
1868
+ p."notification_category_id",
1869
+ p."enabled"
1870
+ FROM params p
1871
+ WHERE p."is_deleted" = false
1872
+ ON CONFLICT ("id") DO UPDATE SET
1873
+ "user_id" = EXCLUDED."user_id",
1874
+ "notification_category_id" = EXCLUDED."notification_category_id",
1875
+ "enabled" = EXCLUDED."enabled"
1876
+ RETURNING 1
1877
+ )
1878
+ INSERT INTO "_stack_sync_metadata" ("mapping_name", "last_synced_sequence_id", "updated_at")
1879
+ SELECT p."mapping_name", p."sequence_id", now() FROM params p
1880
+ ON CONFLICT ("mapping_name") DO UPDATE SET
1881
+ "last_synced_sequence_id" = GREATEST("_stack_sync_metadata"."last_synced_sequence_id", EXCLUDED."last_synced_sequence_id"),
1882
+ "updated_at" = now();
1883
+ `.trim() }
1884
+ },
1885
+ "refresh_tokens": {
1886
+ sourceTables: { "ProjectUserRefreshToken": "ProjectUserRefreshToken" },
1887
+ targetTable: "refresh_tokens",
1888
+ targetTableSchemas: {
1889
+ postgres: `
1890
+ CREATE TABLE IF NOT EXISTS "refresh_tokens" (
1891
+ "id" uuid PRIMARY KEY NOT NULL,
1892
+ "user_id" uuid NOT NULL,
1893
+ "created_at" timestamp without time zone NOT NULL,
1894
+ "last_used_at" timestamp without time zone NOT NULL,
1895
+ "is_impersonation" boolean NOT NULL DEFAULT false,
1896
+ "expires_at" timestamp without time zone
1897
+ );
1898
+ REVOKE ALL ON "refresh_tokens" FROM PUBLIC;
1899
+ GRANT SELECT ON "refresh_tokens" TO PUBLIC;
1900
+
1901
+ CREATE TABLE IF NOT EXISTS "_stack_sync_metadata" (
1902
+ "mapping_name" text PRIMARY KEY NOT NULL,
1903
+ "last_synced_sequence_id" bigint NOT NULL DEFAULT -1,
1904
+ "updated_at" timestamp without time zone NOT NULL DEFAULT now()
1905
+ );
1906
+ `.trim(),
1907
+ clickhouse: `
1908
+ CREATE TABLE IF NOT EXISTS analytics_internal.refresh_tokens (
1909
+ project_id String,
1910
+ branch_id String,
1911
+ id UUID,
1912
+ user_id UUID,
1913
+ created_at DateTime64(3, 'UTC'),
1914
+ last_used_at DateTime64(3, 'UTC'),
1915
+ is_impersonation UInt8,
1916
+ expires_at Nullable(DateTime64(3, 'UTC')),
1917
+ sync_sequence_id Int64,
1918
+ sync_is_deleted UInt8,
1919
+ sync_created_at DateTime64(3, 'UTC') DEFAULT now64(3)
1920
+ )
1921
+ ENGINE ReplacingMergeTree(sync_sequence_id)
1922
+ PARTITION BY toYYYYMM(created_at)
1923
+ ORDER BY (project_id, branch_id, id);
1924
+
1925
+ CREATE TABLE IF NOT EXISTS analytics_internal._stack_sync_metadata (
1926
+ tenancy_id UUID,
1927
+ mapping_name String,
1928
+ last_synced_sequence_id Int64,
1929
+ updated_at DateTime64(3, 'UTC') DEFAULT now64(3)
1930
+ )
1931
+ ENGINE ReplacingMergeTree(updated_at)
1932
+ ORDER BY (tenancy_id, mapping_name);
1933
+ `.trim()
1934
+ },
1935
+ internalDbFetchQueries: { clickhouse: `
1936
+ SELECT *
1937
+ FROM (
1938
+ SELECT
1939
+ "Tenancy"."projectId" AS "project_id",
1940
+ "Tenancy"."branchId" AS "branch_id",
1941
+ "ProjectUserRefreshToken"."id" AS "id",
1942
+ "ProjectUserRefreshToken"."projectUserId" AS "user_id",
1943
+ "ProjectUserRefreshToken"."createdAt" AS "created_at",
1944
+ "ProjectUserRefreshToken"."lastActiveAt" AS "last_used_at",
1945
+ "ProjectUserRefreshToken"."isImpersonation" AS "is_impersonation",
1946
+ "ProjectUserRefreshToken"."expiresAt" AS "expires_at",
1947
+ "ProjectUserRefreshToken"."sequenceId" AS "sync_sequence_id",
1948
+ "ProjectUserRefreshToken"."tenancyId" AS "tenancyId",
1949
+ false AS "sync_is_deleted"
1950
+ FROM "ProjectUserRefreshToken"
1951
+ JOIN "Tenancy" ON "Tenancy"."id" = "ProjectUserRefreshToken"."tenancyId"
1952
+ WHERE "ProjectUserRefreshToken"."tenancyId" = $1::uuid
1953
+
1954
+ UNION ALL
1955
+
1956
+ SELECT
1957
+ "Tenancy"."projectId" AS "project_id",
1958
+ "Tenancy"."branchId" AS "branch_id",
1959
+ ("DeletedRow"."primaryKey"->>'id')::uuid AS "id",
1960
+ ("DeletedRow"."data"->>'projectUserId')::uuid AS "user_id",
1961
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
1962
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "last_used_at",
1963
+ false AS "is_impersonation",
1964
+ NULL::timestamp without time zone AS "expires_at",
1965
+ "DeletedRow"."sequenceId" AS "sync_sequence_id",
1966
+ "DeletedRow"."tenancyId" AS "tenancyId",
1967
+ true AS "sync_is_deleted"
1968
+ FROM "DeletedRow"
1969
+ JOIN "Tenancy" ON "Tenancy"."id" = "DeletedRow"."tenancyId"
1970
+ WHERE
1971
+ "DeletedRow"."tenancyId" = $1::uuid
1972
+ AND "DeletedRow"."tableName" = 'ProjectUserRefreshToken'
1973
+ ) AS "_src"
1974
+ WHERE "sync_sequence_id" IS NOT NULL
1975
+ AND "sync_sequence_id" > $2::bigint
1976
+ ORDER BY "sync_sequence_id" ASC
1977
+ LIMIT 1000
1978
+ `.trim() },
1979
+ internalDbFetchQuery: `
1980
+ SELECT *
1981
+ FROM (
1982
+ SELECT
1983
+ "ProjectUserRefreshToken"."id" AS "id",
1984
+ "ProjectUserRefreshToken"."projectUserId" AS "user_id",
1985
+ "ProjectUserRefreshToken"."createdAt" AS "created_at",
1986
+ "ProjectUserRefreshToken"."lastActiveAt" AS "last_used_at",
1987
+ "ProjectUserRefreshToken"."isImpersonation" AS "is_impersonation",
1988
+ "ProjectUserRefreshToken"."expiresAt" AS "expires_at",
1989
+ "ProjectUserRefreshToken"."sequenceId" AS "sequence_id",
1990
+ "ProjectUserRefreshToken"."tenancyId",
1991
+ false AS "is_deleted"
1992
+ FROM "ProjectUserRefreshToken"
1993
+ WHERE "ProjectUserRefreshToken"."tenancyId" = $1::uuid
1994
+
1995
+ UNION ALL
1996
+
1997
+ SELECT
1998
+ ("DeletedRow"."primaryKey"->>'id')::uuid AS "id",
1999
+ ("DeletedRow"."data"->>'projectUserId')::uuid AS "user_id",
2000
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
2001
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "last_used_at",
2002
+ false AS "is_impersonation",
2003
+ NULL::timestamp without time zone AS "expires_at",
2004
+ "DeletedRow"."sequenceId" AS "sequence_id",
2005
+ "DeletedRow"."tenancyId",
2006
+ true AS "is_deleted"
2007
+ FROM "DeletedRow"
2008
+ WHERE
2009
+ "DeletedRow"."tenancyId" = $1::uuid
2010
+ AND "DeletedRow"."tableName" = 'ProjectUserRefreshToken'
2011
+ ) AS "_src"
2012
+ WHERE "sequence_id" IS NOT NULL
2013
+ AND "sequence_id" > $2::bigint
2014
+ ORDER BY "sequence_id" ASC
2015
+ LIMIT 1000
2016
+ `.trim(),
2017
+ externalDbUpdateQueries: { postgres: `
2018
+ WITH params AS (
2019
+ SELECT
2020
+ $1::uuid AS "id",
2021
+ $2::uuid AS "user_id",
2022
+ $3::timestamp without time zone AS "created_at",
2023
+ $4::timestamp without time zone AS "last_used_at",
2024
+ $5::boolean AS "is_impersonation",
2025
+ $6::timestamp without time zone AS "expires_at",
2026
+ $7::bigint AS "sequence_id",
2027
+ $8::boolean AS "is_deleted",
2028
+ $9::text AS "mapping_name"
2029
+ ),
2030
+ deleted AS (
2031
+ DELETE FROM "refresh_tokens" rt
2032
+ USING params p
2033
+ WHERE p."is_deleted" = true AND rt."id" = p."id"
2034
+ RETURNING 1
2035
+ ),
2036
+ upserted AS (
2037
+ INSERT INTO "refresh_tokens" (
2038
+ "id",
2039
+ "user_id",
2040
+ "created_at",
2041
+ "last_used_at",
2042
+ "is_impersonation",
2043
+ "expires_at"
2044
+ )
2045
+ SELECT
2046
+ p."id",
2047
+ p."user_id",
2048
+ p."created_at",
2049
+ p."last_used_at",
2050
+ p."is_impersonation",
2051
+ p."expires_at"
2052
+ FROM params p
2053
+ WHERE p."is_deleted" = false
2054
+ ON CONFLICT ("id") DO UPDATE SET
2055
+ "user_id" = EXCLUDED."user_id",
2056
+ "created_at" = EXCLUDED."created_at",
2057
+ "last_used_at" = EXCLUDED."last_used_at",
2058
+ "is_impersonation" = EXCLUDED."is_impersonation",
2059
+ "expires_at" = EXCLUDED."expires_at"
2060
+ RETURNING 1
2061
+ )
2062
+ INSERT INTO "_stack_sync_metadata" ("mapping_name", "last_synced_sequence_id", "updated_at")
2063
+ SELECT p."mapping_name", p."sequence_id", now() FROM params p
2064
+ ON CONFLICT ("mapping_name") DO UPDATE SET
2065
+ "last_synced_sequence_id" = GREATEST("_stack_sync_metadata"."last_synced_sequence_id", EXCLUDED."last_synced_sequence_id"),
2066
+ "updated_at" = now();
2067
+ `.trim() }
2068
+ },
2069
+ "connected_accounts": {
2070
+ sourceTables: { "ProjectUserOAuthAccount": "ProjectUserOAuthAccount" },
2071
+ targetTable: "connected_accounts",
2072
+ targetTableSchemas: {
2073
+ postgres: `
2074
+ CREATE TABLE IF NOT EXISTS "connected_accounts" (
2075
+ "id" uuid PRIMARY KEY NOT NULL,
2076
+ "user_id" uuid NOT NULL,
2077
+ "provider" text NOT NULL,
2078
+ "provider_account_id" text NOT NULL,
2079
+ "email" text,
2080
+ "created_at" timestamp without time zone NOT NULL
2081
+ );
2082
+ REVOKE ALL ON "connected_accounts" FROM PUBLIC;
2083
+ GRANT SELECT ON "connected_accounts" TO PUBLIC;
2084
+
2085
+ CREATE TABLE IF NOT EXISTS "_stack_sync_metadata" (
2086
+ "mapping_name" text PRIMARY KEY NOT NULL,
2087
+ "last_synced_sequence_id" bigint NOT NULL DEFAULT -1,
2088
+ "updated_at" timestamp without time zone NOT NULL DEFAULT now()
2089
+ );
2090
+ `.trim(),
2091
+ clickhouse: `
2092
+ CREATE TABLE IF NOT EXISTS analytics_internal.connected_accounts (
2093
+ project_id String,
2094
+ branch_id String,
2095
+ user_id UUID,
2096
+ provider String,
2097
+ provider_account_id String,
2098
+ created_at DateTime64(3, 'UTC'),
2099
+ sync_sequence_id Int64,
2100
+ sync_is_deleted UInt8,
2101
+ sync_created_at DateTime64(3, 'UTC') DEFAULT now64(3)
2102
+ )
2103
+ ENGINE ReplacingMergeTree(sync_sequence_id)
2104
+ PARTITION BY toYYYYMM(created_at)
2105
+ ORDER BY (project_id, branch_id, user_id, provider, provider_account_id);
2106
+
2107
+ CREATE TABLE IF NOT EXISTS analytics_internal._stack_sync_metadata (
2108
+ tenancy_id UUID,
2109
+ mapping_name String,
2110
+ last_synced_sequence_id Int64,
2111
+ updated_at DateTime64(3, 'UTC') DEFAULT now64(3)
2112
+ )
2113
+ ENGINE ReplacingMergeTree(updated_at)
2114
+ ORDER BY (tenancy_id, mapping_name);
2115
+ `.trim()
2116
+ },
2117
+ internalDbFetchQueries: { clickhouse: `
2118
+ SELECT *
2119
+ FROM (
2120
+ SELECT
2121
+ "Tenancy"."projectId" AS "project_id",
2122
+ "Tenancy"."branchId" AS "branch_id",
2123
+ "ProjectUserOAuthAccount"."projectUserId" AS "user_id",
2124
+ "ProjectUserOAuthAccount"."configOAuthProviderId" AS "provider",
2125
+ "ProjectUserOAuthAccount"."providerAccountId" AS "provider_account_id",
2126
+ "ProjectUserOAuthAccount"."createdAt" AS "created_at",
2127
+ "ProjectUserOAuthAccount"."sequenceId" AS "sync_sequence_id",
2128
+ "ProjectUserOAuthAccount"."tenancyId" AS "tenancyId",
2129
+ false AS "sync_is_deleted"
2130
+ FROM "ProjectUserOAuthAccount"
2131
+ JOIN "Tenancy" ON "Tenancy"."id" = "ProjectUserOAuthAccount"."tenancyId"
2132
+ WHERE "ProjectUserOAuthAccount"."tenancyId" = $1::uuid
2133
+ AND "ProjectUserOAuthAccount"."projectUserId" IS NOT NULL
2134
+
2135
+ UNION ALL
2136
+
2137
+ SELECT
2138
+ "Tenancy"."projectId" AS "project_id",
2139
+ "Tenancy"."branchId" AS "branch_id",
2140
+ ("DeletedRow"."data"->>'projectUserId')::uuid AS "user_id",
2141
+ "DeletedRow"."data"->>'configOAuthProviderId' AS "provider",
2142
+ "DeletedRow"."data"->>'providerAccountId' AS "provider_account_id",
2143
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
2144
+ "DeletedRow"."sequenceId" AS "sync_sequence_id",
2145
+ "DeletedRow"."tenancyId" AS "tenancyId",
2146
+ true AS "sync_is_deleted"
2147
+ FROM "DeletedRow"
2148
+ JOIN "Tenancy" ON "Tenancy"."id" = "DeletedRow"."tenancyId"
2149
+ WHERE
2150
+ "DeletedRow"."tenancyId" = $1::uuid
2151
+ AND "DeletedRow"."tableName" = 'ProjectUserOAuthAccount'
2152
+ ) AS "_src"
2153
+ WHERE "sync_sequence_id" IS NOT NULL
2154
+ AND "sync_sequence_id" > $2::bigint
2155
+ ORDER BY "sync_sequence_id" ASC
2156
+ LIMIT 1000
2157
+ `.trim() },
2158
+ internalDbFetchQuery: `
2159
+ SELECT *
2160
+ FROM (
2161
+ SELECT
2162
+ "ProjectUserOAuthAccount"."id" AS "id",
2163
+ "ProjectUserOAuthAccount"."projectUserId" AS "user_id",
2164
+ "ProjectUserOAuthAccount"."configOAuthProviderId" AS "provider",
2165
+ "ProjectUserOAuthAccount"."providerAccountId" AS "provider_account_id",
2166
+ "ProjectUserOAuthAccount"."email" AS "email",
2167
+ "ProjectUserOAuthAccount"."createdAt" AS "created_at",
2168
+ "ProjectUserOAuthAccount"."sequenceId" AS "sequence_id",
2169
+ "ProjectUserOAuthAccount"."tenancyId",
2170
+ false AS "is_deleted"
2171
+ FROM "ProjectUserOAuthAccount"
2172
+ WHERE "ProjectUserOAuthAccount"."tenancyId" = $1::uuid
2173
+ AND "ProjectUserOAuthAccount"."projectUserId" IS NOT NULL
2174
+
2175
+ UNION ALL
2176
+
2177
+ SELECT
2178
+ ("DeletedRow"."primaryKey"->>'id')::uuid AS "id",
2179
+ ("DeletedRow"."data"->>'projectUserId')::uuid AS "user_id",
2180
+ NULL::text AS "provider",
2181
+ NULL::text AS "provider_account_id",
2182
+ NULL::text AS "email",
2183
+ "DeletedRow"."deletedAt"::timestamp without time zone AS "created_at",
2184
+ "DeletedRow"."sequenceId" AS "sequence_id",
2185
+ "DeletedRow"."tenancyId",
2186
+ true AS "is_deleted"
2187
+ FROM "DeletedRow"
2188
+ WHERE
2189
+ "DeletedRow"."tenancyId" = $1::uuid
2190
+ AND "DeletedRow"."tableName" = 'ProjectUserOAuthAccount'
2191
+ ) AS "_src"
2192
+ WHERE "sequence_id" IS NOT NULL
2193
+ AND "sequence_id" > $2::bigint
2194
+ ORDER BY "sequence_id" ASC
2195
+ LIMIT 1000
2196
+ `.trim(),
2197
+ externalDbUpdateQueries: { postgres: `
2198
+ WITH params AS (
2199
+ SELECT
2200
+ $1::uuid AS "id",
2201
+ $2::uuid AS "user_id",
2202
+ $3::text AS "provider",
2203
+ $4::text AS "provider_account_id",
2204
+ $5::text AS "email",
2205
+ $6::timestamp without time zone AS "created_at",
2206
+ $7::bigint AS "sequence_id",
2207
+ $8::boolean AS "is_deleted",
2208
+ $9::text AS "mapping_name"
2209
+ ),
2210
+ deleted AS (
2211
+ DELETE FROM "connected_accounts" ca
2212
+ USING params p
2213
+ WHERE p."is_deleted" = true AND ca."id" = p."id"
2214
+ RETURNING 1
2215
+ ),
2216
+ upserted AS (
2217
+ INSERT INTO "connected_accounts" (
2218
+ "id",
2219
+ "user_id",
2220
+ "provider",
2221
+ "provider_account_id",
2222
+ "email",
2223
+ "created_at"
2224
+ )
2225
+ SELECT
2226
+ p."id",
2227
+ p."user_id",
2228
+ p."provider",
2229
+ p."provider_account_id",
2230
+ p."email",
2231
+ p."created_at"
2232
+ FROM params p
2233
+ WHERE p."is_deleted" = false
2234
+ ON CONFLICT ("id") DO UPDATE SET
2235
+ "user_id" = EXCLUDED."user_id",
2236
+ "provider" = EXCLUDED."provider",
2237
+ "provider_account_id" = EXCLUDED."provider_account_id",
2238
+ "email" = EXCLUDED."email",
2239
+ "created_at" = EXCLUDED."created_at"
2240
+ RETURNING 1
2241
+ )
2242
+ INSERT INTO "_stack_sync_metadata" ("mapping_name", "last_synced_sequence_id", "updated_at")
2243
+ SELECT p."mapping_name", p."sequence_id", now() FROM params p
2244
+ ON CONFLICT ("mapping_name") DO UPDATE SET
2245
+ "last_synced_sequence_id" = GREATEST("_stack_sync_metadata"."last_synced_sequence_id", EXCLUDED."last_synced_sequence_id"),
2246
+ "updated_at" = now();
2247
+ `.trim() }
2248
+ }
2249
+ };
2250
+
2251
+ //#endregion
2252
+ export { DEFAULT_DB_SYNC_MAPPINGS };
2253
+ //# sourceMappingURL=db-sync-mappings.js.map