@digimuza/saas-core 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/CLAUDE.md +1165 -0
  2. package/LICENSE +21 -0
  3. package/README.md +234 -0
  4. package/dist/api-keys/index.d.ts +9 -0
  5. package/dist/api-keys/index.d.ts.map +1 -0
  6. package/dist/api-keys/index.js +37 -0
  7. package/dist/api-keys/index.js.map +1 -0
  8. package/dist/api-keys/keys.d.ts +55 -0
  9. package/dist/api-keys/keys.d.ts.map +1 -0
  10. package/dist/api-keys/keys.js +92 -0
  11. package/dist/api-keys/keys.js.map +1 -0
  12. package/dist/api-keys/service.d.ts +111 -0
  13. package/dist/api-keys/service.d.ts.map +1 -0
  14. package/dist/api-keys/service.js +210 -0
  15. package/dist/api-keys/service.js.map +1 -0
  16. package/dist/audit/index.d.ts +5 -0
  17. package/dist/audit/index.d.ts.map +1 -0
  18. package/dist/audit/index.js +44 -0
  19. package/dist/audit/index.js.map +1 -0
  20. package/dist/audit/service.d.ts +88 -0
  21. package/dist/audit/service.d.ts.map +1 -0
  22. package/dist/audit/service.js +128 -0
  23. package/dist/audit/service.js.map +1 -0
  24. package/dist/auth/client.d.ts +5 -0
  25. package/dist/auth/client.d.ts.map +1 -0
  26. package/dist/auth/client.js +26 -0
  27. package/dist/auth/client.js.map +1 -0
  28. package/dist/auth/cookies.d.ts +51 -0
  29. package/dist/auth/cookies.d.ts.map +1 -0
  30. package/dist/auth/cookies.js +58 -0
  31. package/dist/auth/cookies.js.map +1 -0
  32. package/dist/auth/index.d.ts +14 -0
  33. package/dist/auth/index.d.ts.map +1 -0
  34. package/dist/auth/index.js +46 -0
  35. package/dist/auth/index.js.map +1 -0
  36. package/dist/auth/service.d.ts +67 -0
  37. package/dist/auth/service.d.ts.map +1 -0
  38. package/dist/auth/service.js +275 -0
  39. package/dist/auth/service.js.map +1 -0
  40. package/dist/auth/types.d.ts +56 -0
  41. package/dist/auth/types.d.ts.map +1 -0
  42. package/dist/auth/types.js +2 -0
  43. package/dist/auth/types.js.map +1 -0
  44. package/dist/authorization/index.d.ts +4 -0
  45. package/dist/authorization/index.d.ts.map +1 -0
  46. package/dist/authorization/index.js +24 -0
  47. package/dist/authorization/index.js.map +1 -0
  48. package/dist/authorization/service.d.ts +92 -0
  49. package/dist/authorization/service.d.ts.map +1 -0
  50. package/dist/authorization/service.js +254 -0
  51. package/dist/authorization/service.js.map +1 -0
  52. package/dist/billing/index.d.ts +16 -0
  53. package/dist/billing/index.d.ts.map +1 -0
  54. package/dist/billing/index.js +47 -0
  55. package/dist/billing/index.js.map +1 -0
  56. package/dist/billing/provider.d.ts +114 -0
  57. package/dist/billing/provider.d.ts.map +1 -0
  58. package/dist/billing/provider.js +2 -0
  59. package/dist/billing/provider.js.map +1 -0
  60. package/dist/billing/revolut.d.ts +68 -0
  61. package/dist/billing/revolut.d.ts.map +1 -0
  62. package/dist/billing/revolut.js +181 -0
  63. package/dist/billing/revolut.js.map +1 -0
  64. package/dist/billing/service.d.ts +124 -0
  65. package/dist/billing/service.d.ts.map +1 -0
  66. package/dist/billing/service.js +470 -0
  67. package/dist/billing/service.js.map +1 -0
  68. package/dist/cli/commands/dev.d.ts +43 -0
  69. package/dist/cli/commands/dev.d.ts.map +1 -0
  70. package/dist/cli/commands/dev.js +212 -0
  71. package/dist/cli/commands/dev.js.map +1 -0
  72. package/dist/cli/commands/project.d.ts +12 -0
  73. package/dist/cli/commands/project.d.ts.map +1 -0
  74. package/dist/cli/commands/project.js +49 -0
  75. package/dist/cli/commands/project.js.map +1 -0
  76. package/dist/cli/docker.d.ts +50 -0
  77. package/dist/cli/docker.d.ts.map +1 -0
  78. package/dist/cli/docker.js +84 -0
  79. package/dist/cli/docker.js.map +1 -0
  80. package/dist/cli/index.d.ts +6 -0
  81. package/dist/cli/index.d.ts.map +1 -0
  82. package/dist/cli/index.js +198 -0
  83. package/dist/cli/index.js.map +1 -0
  84. package/dist/cli/output.d.ts +30 -0
  85. package/dist/cli/output.d.ts.map +1 -0
  86. package/dist/cli/output.js +66 -0
  87. package/dist/cli/output.js.map +1 -0
  88. package/dist/cli/templates.d.ts +52 -0
  89. package/dist/cli/templates.d.ts.map +1 -0
  90. package/dist/cli/templates.js +225 -0
  91. package/dist/cli/templates.js.map +1 -0
  92. package/dist/config/client.d.ts +60 -0
  93. package/dist/config/client.d.ts.map +1 -0
  94. package/dist/config/client.js +94 -0
  95. package/dist/config/client.js.map +1 -0
  96. package/dist/config/config-loader.d.ts +2 -0
  97. package/dist/config/config-loader.d.ts.map +1 -0
  98. package/dist/config/config-loader.js +2 -0
  99. package/dist/config/config-loader.js.map +1 -0
  100. package/dist/config/env.d.ts +24 -0
  101. package/dist/config/env.d.ts.map +1 -0
  102. package/dist/config/env.js +40 -0
  103. package/dist/config/env.js.map +1 -0
  104. package/dist/config/errors.d.ts +17 -0
  105. package/dist/config/errors.d.ts.map +1 -0
  106. package/dist/config/errors.js +26 -0
  107. package/dist/config/errors.js.map +1 -0
  108. package/dist/config/index.d.ts +72 -0
  109. package/dist/config/index.d.ts.map +1 -0
  110. package/dist/config/index.js +106 -0
  111. package/dist/config/index.js.map +1 -0
  112. package/dist/config/runtime.d.ts +15 -0
  113. package/dist/config/runtime.d.ts.map +1 -0
  114. package/dist/config/runtime.js +22 -0
  115. package/dist/config/runtime.js.map +1 -0
  116. package/dist/config/sections.d.ts +226 -0
  117. package/dist/config/sections.d.ts.map +1 -0
  118. package/dist/config/sections.js +141 -0
  119. package/dist/config/sections.js.map +1 -0
  120. package/dist/db/client.d.ts +43 -0
  121. package/dist/db/client.d.ts.map +1 -0
  122. package/dist/db/client.js +77 -0
  123. package/dist/db/client.js.map +1 -0
  124. package/dist/db/errors.d.ts +39 -0
  125. package/dist/db/errors.d.ts.map +1 -0
  126. package/dist/db/errors.js +67 -0
  127. package/dist/db/errors.js.map +1 -0
  128. package/dist/db/index.d.ts +10 -0
  129. package/dist/db/index.d.ts.map +1 -0
  130. package/dist/db/index.js +10 -0
  131. package/dist/db/index.js.map +1 -0
  132. package/dist/db/migrate.d.ts +21 -0
  133. package/dist/db/migrate.d.ts.map +1 -0
  134. package/dist/db/migrate.js +28 -0
  135. package/dist/db/migrate.js.map +1 -0
  136. package/dist/db/schema/_shared.d.ts +30 -0
  137. package/dist/db/schema/_shared.d.ts.map +1 -0
  138. package/dist/db/schema/_shared.js +36 -0
  139. package/dist/db/schema/_shared.js.map +1 -0
  140. package/dist/db/schema/apikeys.d.ts +263 -0
  141. package/dist/db/schema/apikeys.d.ts.map +1 -0
  142. package/dist/db/schema/apikeys.js +70 -0
  143. package/dist/db/schema/apikeys.js.map +1 -0
  144. package/dist/db/schema/authorization.d.ts +465 -0
  145. package/dist/db/schema/authorization.d.ts.map +1 -0
  146. package/dist/db/schema/authorization.js +134 -0
  147. package/dist/db/schema/authorization.js.map +1 -0
  148. package/dist/db/schema/billing.d.ts +1100 -0
  149. package/dist/db/schema/billing.d.ts.map +1 -0
  150. package/dist/db/schema/billing.js +223 -0
  151. package/dist/db/schema/billing.js.map +1 -0
  152. package/dist/db/schema/events.d.ts +161 -0
  153. package/dist/db/schema/events.d.ts.map +1 -0
  154. package/dist/db/schema/events.js +66 -0
  155. package/dist/db/schema/events.js.map +1 -0
  156. package/dist/db/schema/features.d.ts +243 -0
  157. package/dist/db/schema/features.d.ts.map +1 -0
  158. package/dist/db/schema/features.js +87 -0
  159. package/dist/db/schema/features.js.map +1 -0
  160. package/dist/db/schema/files.d.ts +253 -0
  161. package/dist/db/schema/files.d.ts.map +1 -0
  162. package/dist/db/schema/files.js +74 -0
  163. package/dist/db/schema/files.js.map +1 -0
  164. package/dist/db/schema/index.d.ts +38 -0
  165. package/dist/db/schema/index.d.ts.map +1 -0
  166. package/dist/db/schema/index.js +38 -0
  167. package/dist/db/schema/index.js.map +1 -0
  168. package/dist/db/schema/invitations.d.ts +214 -0
  169. package/dist/db/schema/invitations.d.ts.map +1 -0
  170. package/dist/db/schema/invitations.js +80 -0
  171. package/dist/db/schema/invitations.js.map +1 -0
  172. package/dist/db/schema/messaging.d.ts +442 -0
  173. package/dist/db/schema/messaging.d.ts.map +1 -0
  174. package/dist/db/schema/messaging.js +120 -0
  175. package/dist/db/schema/messaging.js.map +1 -0
  176. package/dist/db/schema/users.d.ts +246 -0
  177. package/dist/db/schema/users.d.ts.map +1 -0
  178. package/dist/db/schema/users.js +60 -0
  179. package/dist/db/schema/users.js.map +1 -0
  180. package/dist/db/schema/webhooks.d.ts +693 -0
  181. package/dist/db/schema/webhooks.d.ts.map +1 -0
  182. package/dist/db/schema/webhooks.js +147 -0
  183. package/dist/db/schema/webhooks.js.map +1 -0
  184. package/dist/db/schema/workspaces.d.ts +196 -0
  185. package/dist/db/schema/workspaces.d.ts.map +1 -0
  186. package/dist/db/schema/workspaces.js +57 -0
  187. package/dist/db/schema/workspaces.js.map +1 -0
  188. package/dist/db/types.d.ts +18 -0
  189. package/dist/db/types.d.ts.map +1 -0
  190. package/dist/db/types.js +2 -0
  191. package/dist/db/types.js.map +1 -0
  192. package/dist/email/adapters.d.ts +29 -0
  193. package/dist/email/adapters.d.ts.map +1 -0
  194. package/dist/email/adapters.js +60 -0
  195. package/dist/email/adapters.js.map +1 -0
  196. package/dist/email/index.d.ts +20 -0
  197. package/dist/email/index.d.ts.map +1 -0
  198. package/dist/email/index.js +79 -0
  199. package/dist/email/index.js.map +1 -0
  200. package/dist/email/provider.d.ts +47 -0
  201. package/dist/email/provider.d.ts.map +1 -0
  202. package/dist/email/provider.js +7 -0
  203. package/dist/email/provider.js.map +1 -0
  204. package/dist/email/resend.d.ts +22 -0
  205. package/dist/email/resend.d.ts.map +1 -0
  206. package/dist/email/resend.js +51 -0
  207. package/dist/email/resend.js.map +1 -0
  208. package/dist/email/service.d.ts +55 -0
  209. package/dist/email/service.d.ts.map +1 -0
  210. package/dist/email/service.js +87 -0
  211. package/dist/email/service.js.map +1 -0
  212. package/dist/email/templates.d.ts +81 -0
  213. package/dist/email/templates.d.ts.map +1 -0
  214. package/dist/email/templates.js +84 -0
  215. package/dist/email/templates.js.map +1 -0
  216. package/dist/entitlements/index.d.ts +10 -0
  217. package/dist/entitlements/index.d.ts.map +1 -0
  218. package/dist/entitlements/index.js +28 -0
  219. package/dist/entitlements/index.js.map +1 -0
  220. package/dist/entitlements/service.d.ts +83 -0
  221. package/dist/entitlements/service.d.ts.map +1 -0
  222. package/dist/entitlements/service.js +158 -0
  223. package/dist/entitlements/service.js.map +1 -0
  224. package/dist/errors.d.ts +85 -0
  225. package/dist/errors.d.ts.map +1 -0
  226. package/dist/errors.js +95 -0
  227. package/dist/errors.js.map +1 -0
  228. package/dist/events/core-events.d.ts +120 -0
  229. package/dist/events/core-events.d.ts.map +1 -0
  230. package/dist/events/core-events.js +109 -0
  231. package/dist/events/core-events.js.map +1 -0
  232. package/dist/events/index.d.ts +15 -0
  233. package/dist/events/index.d.ts.map +1 -0
  234. package/dist/events/index.js +58 -0
  235. package/dist/events/index.js.map +1 -0
  236. package/dist/events/publisher.d.ts +46 -0
  237. package/dist/events/publisher.d.ts.map +1 -0
  238. package/dist/events/publisher.js +54 -0
  239. package/dist/events/publisher.js.map +1 -0
  240. package/dist/events/registry.d.ts +87 -0
  241. package/dist/events/registry.d.ts.map +1 -0
  242. package/dist/events/registry.js +34 -0
  243. package/dist/events/registry.js.map +1 -0
  244. package/dist/events/service.d.ts +78 -0
  245. package/dist/events/service.d.ts.map +1 -0
  246. package/dist/events/service.js +182 -0
  247. package/dist/events/service.js.map +1 -0
  248. package/dist/features/bucket.d.ts +22 -0
  249. package/dist/features/bucket.d.ts.map +1 -0
  250. package/dist/features/bucket.js +42 -0
  251. package/dist/features/bucket.js.map +1 -0
  252. package/dist/features/index.d.ts +15 -0
  253. package/dist/features/index.d.ts.map +1 -0
  254. package/dist/features/index.js +78 -0
  255. package/dist/features/index.js.map +1 -0
  256. package/dist/features/registry.d.ts +51 -0
  257. package/dist/features/registry.d.ts.map +1 -0
  258. package/dist/features/registry.js +52 -0
  259. package/dist/features/registry.js.map +1 -0
  260. package/dist/features/service.d.ts +78 -0
  261. package/dist/features/service.d.ts.map +1 -0
  262. package/dist/features/service.js +207 -0
  263. package/dist/features/service.js.map +1 -0
  264. package/dist/files/index.d.ts +6 -0
  265. package/dist/files/index.d.ts.map +1 -0
  266. package/dist/files/index.js +64 -0
  267. package/dist/files/index.js.map +1 -0
  268. package/dist/files/service.d.ts +92 -0
  269. package/dist/files/service.d.ts.map +1 -0
  270. package/dist/files/service.js +303 -0
  271. package/dist/files/service.js.map +1 -0
  272. package/dist/index.d.ts +33 -0
  273. package/dist/index.d.ts.map +1 -0
  274. package/dist/index.js +33 -0
  275. package/dist/index.js.map +1 -0
  276. package/dist/jobs/backend.d.ts +23 -0
  277. package/dist/jobs/backend.d.ts.map +1 -0
  278. package/dist/jobs/backend.js +23 -0
  279. package/dist/jobs/backend.js.map +1 -0
  280. package/dist/jobs/index.d.ts +29 -0
  281. package/dist/jobs/index.d.ts.map +1 -0
  282. package/dist/jobs/index.js +114 -0
  283. package/dist/jobs/index.js.map +1 -0
  284. package/dist/jobs/service.d.ts +67 -0
  285. package/dist/jobs/service.d.ts.map +1 -0
  286. package/dist/jobs/service.js +139 -0
  287. package/dist/jobs/service.js.map +1 -0
  288. package/dist/jobs/types.d.ts +78 -0
  289. package/dist/jobs/types.d.ts.map +1 -0
  290. package/dist/jobs/types.js +4 -0
  291. package/dist/jobs/types.js.map +1 -0
  292. package/dist/logger/default.d.ts +7 -0
  293. package/dist/logger/default.d.ts.map +1 -0
  294. package/dist/logger/default.js +28 -0
  295. package/dist/logger/default.js.map +1 -0
  296. package/dist/logger/index.d.ts +24 -0
  297. package/dist/logger/index.d.ts.map +1 -0
  298. package/dist/logger/index.js +90 -0
  299. package/dist/logger/index.js.map +1 -0
  300. package/dist/logger/redact.d.ts +40 -0
  301. package/dist/logger/redact.d.ts.map +1 -0
  302. package/dist/logger/redact.js +178 -0
  303. package/dist/logger/redact.js.map +1 -0
  304. package/dist/logger/service.d.ts +14 -0
  305. package/dist/logger/service.d.ts.map +1 -0
  306. package/dist/logger/service.js +56 -0
  307. package/dist/logger/service.js.map +1 -0
  308. package/dist/logger/sinks.d.ts +37 -0
  309. package/dist/logger/sinks.d.ts.map +1 -0
  310. package/dist/logger/sinks.js +135 -0
  311. package/dist/logger/sinks.js.map +1 -0
  312. package/dist/logger/types.d.ts +47 -0
  313. package/dist/logger/types.d.ts.map +1 -0
  314. package/dist/logger/types.js +8 -0
  315. package/dist/logger/types.js.map +1 -0
  316. package/dist/notifications/index.d.ts +8 -0
  317. package/dist/notifications/index.d.ts.map +1 -0
  318. package/dist/notifications/index.js +72 -0
  319. package/dist/notifications/index.js.map +1 -0
  320. package/dist/notifications/service.d.ts +79 -0
  321. package/dist/notifications/service.d.ts.map +1 -0
  322. package/dist/notifications/service.js +164 -0
  323. package/dist/notifications/service.js.map +1 -0
  324. package/dist/realtime/channels.d.ts +37 -0
  325. package/dist/realtime/channels.d.ts.map +1 -0
  326. package/dist/realtime/channels.js +58 -0
  327. package/dist/realtime/channels.js.map +1 -0
  328. package/dist/realtime/index.d.ts +19 -0
  329. package/dist/realtime/index.d.ts.map +1 -0
  330. package/dist/realtime/index.js +118 -0
  331. package/dist/realtime/index.js.map +1 -0
  332. package/dist/realtime/postgres.d.ts +48 -0
  333. package/dist/realtime/postgres.d.ts.map +1 -0
  334. package/dist/realtime/postgres.js +151 -0
  335. package/dist/realtime/postgres.js.map +1 -0
  336. package/dist/realtime/service.d.ts +75 -0
  337. package/dist/realtime/service.d.ts.map +1 -0
  338. package/dist/realtime/service.js +103 -0
  339. package/dist/realtime/service.js.map +1 -0
  340. package/dist/realtime/sse.d.ts +55 -0
  341. package/dist/realtime/sse.d.ts.map +1 -0
  342. package/dist/realtime/sse.js +123 -0
  343. package/dist/realtime/sse.js.map +1 -0
  344. package/dist/realtime/transport.d.ts +52 -0
  345. package/dist/realtime/transport.d.ts.map +1 -0
  346. package/dist/realtime/transport.js +2 -0
  347. package/dist/realtime/transport.js.map +1 -0
  348. package/dist/storage/index.d.ts +18 -0
  349. package/dist/storage/index.d.ts.map +1 -0
  350. package/dist/storage/index.js +89 -0
  351. package/dist/storage/index.js.map +1 -0
  352. package/dist/storage/keys.d.ts +50 -0
  353. package/dist/storage/keys.d.ts.map +1 -0
  354. package/dist/storage/keys.js +120 -0
  355. package/dist/storage/keys.js.map +1 -0
  356. package/dist/storage/memory.d.ts +32 -0
  357. package/dist/storage/memory.d.ts.map +1 -0
  358. package/dist/storage/memory.js +84 -0
  359. package/dist/storage/memory.js.map +1 -0
  360. package/dist/storage/provider.d.ts +93 -0
  361. package/dist/storage/provider.d.ts.map +1 -0
  362. package/dist/storage/provider.js +2 -0
  363. package/dist/storage/provider.js.map +1 -0
  364. package/dist/storage/s3.d.ts +34 -0
  365. package/dist/storage/s3.d.ts.map +1 -0
  366. package/dist/storage/s3.js +175 -0
  367. package/dist/storage/s3.js.map +1 -0
  368. package/dist/storage/service.d.ts +86 -0
  369. package/dist/storage/service.d.ts.map +1 -0
  370. package/dist/storage/service.js +107 -0
  371. package/dist/storage/service.js.map +1 -0
  372. package/dist/storage/sigv4.d.ts +58 -0
  373. package/dist/storage/sigv4.d.ts.map +1 -0
  374. package/dist/storage/sigv4.js +114 -0
  375. package/dist/storage/sigv4.js.map +1 -0
  376. package/dist/streams/client.d.ts +91 -0
  377. package/dist/streams/client.d.ts.map +1 -0
  378. package/dist/streams/client.js +128 -0
  379. package/dist/streams/client.js.map +1 -0
  380. package/dist/streams/events.d.ts +68 -0
  381. package/dist/streams/events.d.ts.map +1 -0
  382. package/dist/streams/events.js +81 -0
  383. package/dist/streams/events.js.map +1 -0
  384. package/dist/streams/index.d.ts +47 -0
  385. package/dist/streams/index.d.ts.map +1 -0
  386. package/dist/streams/index.js +47 -0
  387. package/dist/streams/index.js.map +1 -0
  388. package/dist/streams/realtime.d.ts +27 -0
  389. package/dist/streams/realtime.d.ts.map +1 -0
  390. package/dist/streams/realtime.js +50 -0
  391. package/dist/streams/realtime.js.map +1 -0
  392. package/dist/streams/state.d.ts +26 -0
  393. package/dist/streams/state.d.ts.map +1 -0
  394. package/dist/streams/state.js +34 -0
  395. package/dist/streams/state.js.map +1 -0
  396. package/dist/users/index.d.ts +9 -0
  397. package/dist/users/index.d.ts.map +1 -0
  398. package/dist/users/index.js +23 -0
  399. package/dist/users/index.js.map +1 -0
  400. package/dist/users/service.d.ts +43 -0
  401. package/dist/users/service.d.ts.map +1 -0
  402. package/dist/users/service.js +113 -0
  403. package/dist/users/service.js.map +1 -0
  404. package/dist/webhooks/inbound.d.ts +70 -0
  405. package/dist/webhooks/inbound.d.ts.map +1 -0
  406. package/dist/webhooks/inbound.js +146 -0
  407. package/dist/webhooks/inbound.js.map +1 -0
  408. package/dist/webhooks/index.d.ts +12 -0
  409. package/dist/webhooks/index.d.ts.map +1 -0
  410. package/dist/webhooks/index.js +65 -0
  411. package/dist/webhooks/index.js.map +1 -0
  412. package/dist/webhooks/outgoing.d.ts +89 -0
  413. package/dist/webhooks/outgoing.d.ts.map +1 -0
  414. package/dist/webhooks/outgoing.js +375 -0
  415. package/dist/webhooks/outgoing.js.map +1 -0
  416. package/dist/webhooks/signature.d.ts +40 -0
  417. package/dist/webhooks/signature.d.ts.map +1 -0
  418. package/dist/webhooks/signature.js +77 -0
  419. package/dist/webhooks/signature.js.map +1 -0
  420. package/dist/workspaces/context.d.ts +30 -0
  421. package/dist/workspaces/context.d.ts.map +1 -0
  422. package/dist/workspaces/context.js +12 -0
  423. package/dist/workspaces/context.js.map +1 -0
  424. package/dist/workspaces/index.d.ts +5 -0
  425. package/dist/workspaces/index.d.ts.map +1 -0
  426. package/dist/workspaces/index.js +21 -0
  427. package/dist/workspaces/index.js.map +1 -0
  428. package/dist/workspaces/service.d.ts +126 -0
  429. package/dist/workspaces/service.d.ts.map +1 -0
  430. package/dist/workspaces/service.js +495 -0
  431. package/dist/workspaces/service.js.map +1 -0
  432. package/docs/README.md +71 -0
  433. package/docs/api-keys.md +184 -0
  434. package/docs/audit.md +198 -0
  435. package/docs/auth.md +196 -0
  436. package/docs/authorization.md +225 -0
  437. package/docs/billing.md +293 -0
  438. package/docs/cli.md +238 -0
  439. package/docs/config.md +163 -0
  440. package/docs/db.md +219 -0
  441. package/docs/email.md +222 -0
  442. package/docs/entitlements.md +194 -0
  443. package/docs/errors.md +158 -0
  444. package/docs/events.md +279 -0
  445. package/docs/feature-flags.md +237 -0
  446. package/docs/files.md +229 -0
  447. package/docs/jobs.md +288 -0
  448. package/docs/logger.md +269 -0
  449. package/docs/notifications.md +179 -0
  450. package/docs/publishing.md +128 -0
  451. package/docs/realtime.md +360 -0
  452. package/docs/storage.md +279 -0
  453. package/docs/streams.md +296 -0
  454. package/docs/users.md +117 -0
  455. package/docs/webhooks.md +272 -0
  456. package/docs/workspaces.md +269 -0
  457. package/drizzle/0000_init_users.sql +21 -0
  458. package/drizzle/0001_workspaces_roles_permissions.sql +86 -0
  459. package/drizzle/0002_billing_entitlements.sql +97 -0
  460. package/drizzle/0003_events.sql +17 -0
  461. package/drizzle/0004_notifications_audit.sql +64 -0
  462. package/drizzle/0005_api_keys_webhooks.sql +77 -0
  463. package/drizzle/0006_feature_flags.sql +22 -0
  464. package/drizzle/0007_files.sql +23 -0
  465. package/drizzle/meta/0000_snapshot.json +160 -0
  466. package/drizzle/meta/0001_snapshot.json +837 -0
  467. package/drizzle/meta/0002_snapshot.json +1580 -0
  468. package/drizzle/meta/0003_snapshot.json +1751 -0
  469. package/drizzle/meta/0004_snapshot.json +2109 -0
  470. package/drizzle/meta/0005_snapshot.json +2719 -0
  471. package/drizzle/meta/0006_snapshot.json +2909 -0
  472. package/drizzle/meta/0007_snapshot.json +3113 -0
  473. package/drizzle/meta/_journal.json +62 -0
  474. package/package.json +180 -0
@@ -0,0 +1,158 @@
1
+ import { and, eq, gte, inArray, lt, sql } from "drizzle-orm";
2
+ import { EntitlementRequiredError, InvalidInputError, LimitExceededError } from "../errors.js";
3
+ import { isUniqueViolation } from "../db/errors.js";
4
+ import { ENTITLING_SUBSCRIPTION_STATUSES, entitlements, plans, subscriptions, usageRecords, } from "../db/schema/index.js";
5
+ function startOfUtcMonth(at) {
6
+ return new Date(Date.UTC(at.getUTCFullYear(), at.getUTCMonth(), 1));
7
+ }
8
+ function startOfNextUtcMonth(at) {
9
+ return new Date(Date.UTC(at.getUTCFullYear(), at.getUTCMonth() + 1, 1));
10
+ }
11
+ export function createEntitlementsService(deps) {
12
+ const now = deps.now ?? (() => new Date());
13
+ async function findLive(workspaceId) {
14
+ const rows = await deps.db
15
+ .select({
16
+ plan: plans,
17
+ periodStart: subscriptions.currentPeriodStart,
18
+ periodEnd: subscriptions.currentPeriodEnd,
19
+ })
20
+ .from(subscriptions)
21
+ .innerJoin(plans, eq(plans.id, subscriptions.planId))
22
+ .where(and(eq(subscriptions.workspaceId, workspaceId), inArray(subscriptions.status, [...ENTITLING_SUBSCRIPTION_STATUSES])))
23
+ .limit(1);
24
+ return rows[0];
25
+ }
26
+ async function fallbackPlan() {
27
+ if (deps.fallbackPlanKey === undefined) {
28
+ return undefined;
29
+ }
30
+ const rows = await deps.db
31
+ .select()
32
+ .from(plans)
33
+ .where(eq(plans.key, deps.fallbackPlanKey))
34
+ .limit(1);
35
+ return rows[0];
36
+ }
37
+ async function resolveWindow(workspaceId) {
38
+ const live = await findLive(workspaceId);
39
+ const at = now();
40
+ if (live?.periodStart != null && live.periodEnd != null) {
41
+ return { start: live.periodStart, end: live.periodEnd };
42
+ }
43
+ return { start: startOfUtcMonth(at), end: startOfNextUtcMonth(at) };
44
+ }
45
+ const service = {
46
+ async resolvePlan(context) {
47
+ const live = await findLive(context.workspaceId);
48
+ return live?.plan ?? (await fallbackPlan());
49
+ },
50
+ async resolve(context) {
51
+ const plan = await service.resolvePlan(context);
52
+ if (plan === undefined) {
53
+ return { plan: undefined, byKey: new Map() };
54
+ }
55
+ const rows = await deps.db
56
+ .select()
57
+ .from(entitlements)
58
+ .where(eq(entitlements.planId, plan.id));
59
+ return { plan, byKey: new Map(rows.map((row) => [row.key, row])) };
60
+ },
61
+ async has(context, key) {
62
+ const { byKey } = await service.resolve(context);
63
+ return byKey.has(key);
64
+ },
65
+ async require(context, key) {
66
+ if (!(await service.has(context, key))) {
67
+ throw new EntitlementRequiredError(key);
68
+ }
69
+ },
70
+ async getLimit(context, key) {
71
+ const { byKey } = await service.resolve(context);
72
+ const entitlement = byKey.get(key);
73
+ /**
74
+ * Fail closed. A limit the plan does not mention is zero, not unlimited —
75
+ * a typo in a plan definition must not hand out infinite quota.
76
+ */
77
+ if (entitlement === undefined || entitlement.kind !== "limit") {
78
+ return 0;
79
+ }
80
+ return entitlement.limitValue;
81
+ },
82
+ async getUsage(context, key) {
83
+ const window = await resolveWindow(context.workspaceId);
84
+ const rows = await deps.db
85
+ .select({ total: sql `coalesce(sum(${usageRecords.quantity}), 0)::int` })
86
+ .from(usageRecords)
87
+ .where(and(eq(usageRecords.workspaceId, context.workspaceId), eq(usageRecords.key, key), gte(usageRecords.occurredAt, window.start), lt(usageRecords.occurredAt, window.end)));
88
+ return rows[0]?.total ?? 0;
89
+ },
90
+ async checkLimit(context, key, quantity = 1) {
91
+ if (!Number.isInteger(quantity) || quantity < 0) {
92
+ throw new InvalidInputError("Quantity must be a non-negative integer.");
93
+ }
94
+ const [limit, used, window] = await Promise.all([
95
+ service.getLimit(context, key),
96
+ service.getUsage(context, key),
97
+ resolveWindow(context.workspaceId),
98
+ ]);
99
+ if (limit === null) {
100
+ return { allowed: true, limit: null, used, remaining: null, window };
101
+ }
102
+ const remaining = Math.max(0, limit - used);
103
+ return { allowed: used + quantity <= limit, limit, used, remaining, window };
104
+ },
105
+ async requireLimit(context, key, quantity = 1) {
106
+ const check = await service.checkLimit(context, key, quantity);
107
+ if (!check.allowed) {
108
+ throw new LimitExceededError({
109
+ entitlement: key,
110
+ limit: check.limit ?? 0,
111
+ used: check.used,
112
+ });
113
+ }
114
+ return check;
115
+ },
116
+ async recordUsage(context, key, options = {}) {
117
+ const quantity = options.quantity ?? 1;
118
+ if (!Number.isInteger(quantity) || quantity <= 0) {
119
+ throw new InvalidInputError("Usage quantity must be a positive integer.");
120
+ }
121
+ try {
122
+ await deps.db.insert(usageRecords).values({
123
+ workspaceId: context.workspaceId,
124
+ key,
125
+ quantity,
126
+ occurredAt: options.occurredAt ?? now(),
127
+ idempotencyKey: options.idempotencyKey ?? null,
128
+ });
129
+ }
130
+ catch (error) {
131
+ /**
132
+ * The idempotency key was already used, so this consumption is already
133
+ * counted. Swallowing it makes the call safe to retry.
134
+ */
135
+ if (isUniqueViolation(error, "usage_records_idempotency_idx")) {
136
+ return;
137
+ }
138
+ throw error;
139
+ }
140
+ },
141
+ async consume(context, key, options = {}) {
142
+ const quantity = options.quantity ?? 1;
143
+ const check = await service.requireLimit(context, key, quantity);
144
+ await service.recordUsage(context, key, options);
145
+ /**
146
+ * The check and the insert are not one transaction, so concurrent
147
+ * consumers can together exceed the quota by their in-flight quantity.
148
+ * That is a deliberate trade: serialising every metered call behind a lock
149
+ * would make the hot path a contention point, and a small overshoot on a
150
+ * usage quota is cheaper than that. Wrap `consume` in your own transaction
151
+ * with `select ... for update` if a hard cap is required.
152
+ */
153
+ return { ...check, used: check.used + quantity };
154
+ },
155
+ };
156
+ return service;
157
+ }
158
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/entitlements/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Domain errors shared across the core.
3
+ *
4
+ * Each carries a stable machine-readable `code` so route handlers can map errors
5
+ * to HTTP status codes without matching on message text.
6
+ */
7
+ export type SaasCoreErrorCode = "unauthorized" | "forbidden" | "not_found" | "conflict" | "invalid_input" | "payment_required" | "limit_exceeded";
8
+ export declare abstract class SaasCoreError extends Error {
9
+ abstract readonly code: SaasCoreErrorCode;
10
+ constructor(message: string, options?: {
11
+ cause?: unknown;
12
+ });
13
+ }
14
+ /** No authenticated user. Maps to HTTP 401. */
15
+ export declare class UnauthorizedError extends SaasCoreError {
16
+ readonly code = "unauthorized";
17
+ constructor(message?: string);
18
+ }
19
+ /**
20
+ * Authenticated, but not permitted. Maps to HTTP 403.
21
+ *
22
+ * Use this only when the caller is already known to belong to the workspace.
23
+ * When they are not a member, raise {@link NotFoundError} instead — see below.
24
+ */
25
+ export declare class ForbiddenError extends SaasCoreError {
26
+ readonly code = "forbidden";
27
+ /** The permission that was required, when the check was permission-based. */
28
+ readonly permission?: string;
29
+ constructor(message?: string, options?: {
30
+ permission?: string;
31
+ });
32
+ }
33
+ /**
34
+ * The resource does not exist, or the caller has no way to know that it does.
35
+ *
36
+ * Tenant isolation deliberately reports "not found" rather than "forbidden" for
37
+ * workspaces the caller is not a member of. A 403 would confirm that a given
38
+ * workspace id or slug exists, letting an attacker enumerate other tenants.
39
+ */
40
+ export declare class NotFoundError extends SaasCoreError {
41
+ readonly code = "not_found";
42
+ constructor(message?: string);
43
+ }
44
+ /** The write conflicts with existing state. Maps to HTTP 409. */
45
+ export declare class ConflictError extends SaasCoreError {
46
+ readonly code = "conflict";
47
+ constructor(message?: string, options?: {
48
+ cause?: unknown;
49
+ });
50
+ }
51
+ /** The input is structurally invalid. Maps to HTTP 400. */
52
+ export declare class InvalidInputError extends SaasCoreError {
53
+ readonly code = "invalid_input";
54
+ constructor(message?: string, options?: {
55
+ cause?: unknown;
56
+ });
57
+ }
58
+ /**
59
+ * The workspace's plan does not include a required feature. Maps to HTTP 402.
60
+ *
61
+ * Distinct from {@link ForbiddenError}: the caller may well have permission, but
62
+ * the workspace has not paid for the capability. The two answer different
63
+ * questions and a client shows different UI for each — an upsell rather than an
64
+ * access error.
65
+ */
66
+ export declare class EntitlementRequiredError extends SaasCoreError {
67
+ readonly code = "payment_required";
68
+ /** The entitlement key that was missing. */
69
+ readonly entitlement: string;
70
+ constructor(entitlement: string, message?: string);
71
+ }
72
+ /** A metered quota is exhausted. Maps to HTTP 429 or 402 depending on product. */
73
+ export declare class LimitExceededError extends SaasCoreError {
74
+ readonly code = "limit_exceeded";
75
+ readonly entitlement: string;
76
+ readonly limit: number;
77
+ readonly used: number;
78
+ constructor(input: {
79
+ entitlement: string;
80
+ limit: number;
81
+ used: number;
82
+ message?: string;
83
+ });
84
+ }
85
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,iBAAiB,GACzB,cAAc,GACd,WAAW,GACX,WAAW,GACX,UAAU,GACV,eAAe,GACf,kBAAkB,GAClB,gBAAgB,CAAC;AAErB,8BAAsB,aAAc,SAAQ,KAAK;IAC/C,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAE1C,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAGzD;CACF;AAED,+CAA+C;AAC/C,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,SAAkB,IAAI,kBAAkB;IAExC,YAAY,OAAO,SAA6B,EAE/C;CACF;AAED;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,aAAa;IAC/C,SAAkB,IAAI,eAAe;IAErC,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE7B,YAAY,OAAO,SAAuB,EAAE,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,EAK5E;CACF;AAED;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,aAAa;IAC9C,SAAkB,IAAI,eAAe;IAErC,YAAY,OAAO,SAAe,EAEjC;CACF;AAED,iEAAiE;AACjE,qBAAa,aAAc,SAAQ,aAAa;IAC9C,SAAkB,IAAI,cAAc;IAEpC,YAAY,OAAO,SAAc,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAE/D;CACF;AAED,2DAA2D;AAC3D,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,SAAkB,IAAI,mBAAmB;IAEzC,YAAY,OAAO,SAAmB,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAEpE;CACF;AAED;;;;;;;GAOG;AACH,qBAAa,wBAAyB,SAAQ,aAAa;IACzD,SAAkB,IAAI,sBAAsB;IAE5C,4CAA4C;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,YAAY,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAGhD;CACF;AAED,kFAAkF;AAClF,qBAAa,kBAAmB,SAAQ,aAAa;IACnD,SAAkB,IAAI,oBAAoB;IAE1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAQxF;CACF"}
package/dist/errors.js ADDED
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Domain errors shared across the core.
3
+ *
4
+ * Each carries a stable machine-readable `code` so route handlers can map errors
5
+ * to HTTP status codes without matching on message text.
6
+ */
7
+ export class SaasCoreError extends Error {
8
+ constructor(message, options) {
9
+ super(message, options);
10
+ this.name = new.target.name;
11
+ }
12
+ }
13
+ /** No authenticated user. Maps to HTTP 401. */
14
+ export class UnauthorizedError extends SaasCoreError {
15
+ code = "unauthorized";
16
+ constructor(message = "Authentication required.") {
17
+ super(message);
18
+ }
19
+ }
20
+ /**
21
+ * Authenticated, but not permitted. Maps to HTTP 403.
22
+ *
23
+ * Use this only when the caller is already known to belong to the workspace.
24
+ * When they are not a member, raise {@link NotFoundError} instead — see below.
25
+ */
26
+ export class ForbiddenError extends SaasCoreError {
27
+ code = "forbidden";
28
+ /** The permission that was required, when the check was permission-based. */
29
+ permission;
30
+ constructor(message = "Permission denied.", options) {
31
+ super(message);
32
+ if (options?.permission !== undefined) {
33
+ this.permission = options.permission;
34
+ }
35
+ }
36
+ }
37
+ /**
38
+ * The resource does not exist, or the caller has no way to know that it does.
39
+ *
40
+ * Tenant isolation deliberately reports "not found" rather than "forbidden" for
41
+ * workspaces the caller is not a member of. A 403 would confirm that a given
42
+ * workspace id or slug exists, letting an attacker enumerate other tenants.
43
+ */
44
+ export class NotFoundError extends SaasCoreError {
45
+ code = "not_found";
46
+ constructor(message = "Not found.") {
47
+ super(message);
48
+ }
49
+ }
50
+ /** The write conflicts with existing state. Maps to HTTP 409. */
51
+ export class ConflictError extends SaasCoreError {
52
+ code = "conflict";
53
+ constructor(message = "Conflict.", options) {
54
+ super(message, options);
55
+ }
56
+ }
57
+ /** The input is structurally invalid. Maps to HTTP 400. */
58
+ export class InvalidInputError extends SaasCoreError {
59
+ code = "invalid_input";
60
+ constructor(message = "Invalid input.", options) {
61
+ super(message, options);
62
+ }
63
+ }
64
+ /**
65
+ * The workspace's plan does not include a required feature. Maps to HTTP 402.
66
+ *
67
+ * Distinct from {@link ForbiddenError}: the caller may well have permission, but
68
+ * the workspace has not paid for the capability. The two answer different
69
+ * questions and a client shows different UI for each — an upsell rather than an
70
+ * access error.
71
+ */
72
+ export class EntitlementRequiredError extends SaasCoreError {
73
+ code = "payment_required";
74
+ /** The entitlement key that was missing. */
75
+ entitlement;
76
+ constructor(entitlement, message) {
77
+ super(message ?? `This workspace's plan does not include "${entitlement}".`);
78
+ this.entitlement = entitlement;
79
+ }
80
+ }
81
+ /** A metered quota is exhausted. Maps to HTTP 429 or 402 depending on product. */
82
+ export class LimitExceededError extends SaasCoreError {
83
+ code = "limit_exceeded";
84
+ entitlement;
85
+ limit;
86
+ used;
87
+ constructor(input) {
88
+ super(input.message ??
89
+ `Quota for "${input.entitlement}" exhausted (${input.used} of ${input.limit} used).`);
90
+ this.entitlement = input.entitlement;
91
+ this.limit = input.limit;
92
+ this.used = input.used;
93
+ }
94
+ }
95
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,OAAgB,aAAc,SAAQ,KAAK;IAG/C,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC;IAC9B,CAAC;CACF;AAED,+CAA+C;AAC/C,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAChC,IAAI,GAAG,cAAc,CAAC;IAExC,YAAY,OAAO,GAAG,0BAA0B;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,cAAe,SAAQ,aAAa;IAC7B,IAAI,GAAG,WAAW,CAAC;IAErC,6EAA6E;IACpE,UAAU,CAAU;IAE7B,YAAY,OAAO,GAAG,oBAAoB,EAAE,OAAiC;QAC3E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,OAAO,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACvC,CAAC;IACH,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,OAAO,aAAc,SAAQ,aAAa;IAC5B,IAAI,GAAG,WAAW,CAAC;IAErC,YAAY,OAAO,GAAG,YAAY;QAChC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AAED,iEAAiE;AACjE,MAAM,OAAO,aAAc,SAAQ,aAAa;IAC5B,IAAI,GAAG,UAAU,CAAC;IAEpC,YAAY,OAAO,GAAG,WAAW,EAAE,OAA6B;QAC9D,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;CACF;AAED,2DAA2D;AAC3D,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAChC,IAAI,GAAG,eAAe,CAAC;IAEzC,YAAY,OAAO,GAAG,gBAAgB,EAAE,OAA6B;QACnE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,wBAAyB,SAAQ,aAAa;IACvC,IAAI,GAAG,kBAAkB,CAAC;IAE5C,4CAA4C;IACnC,WAAW,CAAS;IAE7B,YAAY,WAAmB,EAAE,OAAgB;QAC/C,KAAK,CAAC,OAAO,IAAI,2CAA2C,WAAW,IAAI,CAAC,CAAC;QAC7E,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;CACF;AAED,kFAAkF;AAClF,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IACjC,IAAI,GAAG,gBAAgB,CAAC;IAEjC,WAAW,CAAS;IACpB,KAAK,CAAS;IACd,IAAI,CAAS;IAEtB,YAAY,KAA6E;QACvF,KAAK,CACH,KAAK,CAAC,OAAO;YACX,cAAc,KAAK,CAAC,WAAW,gBAAgB,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,SAAS,CACvF,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,120 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Events the core itself emits.
4
+ *
5
+ * Deliberately limited to what the core actually does today. Notification and
6
+ * realtime events belong to the phases that introduce them — declaring them now
7
+ * would ship a catalogue of types nothing publishes, which is worse than no type
8
+ * at all because consumers would write handlers that never fire.
9
+ *
10
+ * Payloads carry identifiers, not whole records. A consumer that needs the
11
+ * current state should read it; embedding a snapshot would go stale between
12
+ * publication and delivery, and would put mutable user data in an append-only
13
+ * table.
14
+ */
15
+ export declare const coreEvents: import("./registry.ts").EventRegistry<{
16
+ readonly "user.created": z.ZodObject<{
17
+ userId: z.ZodUUID;
18
+ workosUserId: z.ZodString;
19
+ }, z.core.$strip>;
20
+ readonly "workspace.created": z.ZodObject<{
21
+ workspaceId: z.ZodUUID;
22
+ slug: z.ZodString;
23
+ }, z.core.$strip>;
24
+ readonly "workspace.updated": z.ZodObject<{
25
+ workspaceId: z.ZodUUID;
26
+ changed: z.ZodArray<z.ZodEnum<{
27
+ name: "name";
28
+ slug: "slug";
29
+ }>>;
30
+ }, z.core.$strip>;
31
+ readonly "workspace.deleted": z.ZodObject<{
32
+ workspaceId: z.ZodUUID;
33
+ slug: z.ZodString;
34
+ }, z.core.$strip>;
35
+ readonly "workspace.member.created": z.ZodObject<{
36
+ userId: z.ZodUUID;
37
+ roleIds: z.ZodArray<z.ZodUUID>;
38
+ }, z.core.$strip>;
39
+ readonly "workspace.member.removed": z.ZodObject<{
40
+ userId: z.ZodUUID;
41
+ }, z.core.$strip>;
42
+ readonly "workspace.member.role.updated": z.ZodObject<{
43
+ userId: z.ZodUUID;
44
+ roleId: z.ZodUUID;
45
+ action: z.ZodEnum<{
46
+ assigned: "assigned";
47
+ unassigned: "unassigned";
48
+ }>;
49
+ }, z.core.$strip>;
50
+ readonly "workspace.invitation.created": z.ZodObject<{
51
+ invitationId: z.ZodUUID;
52
+ email: z.ZodEmail;
53
+ roleId: z.ZodNullable<z.ZodUUID>;
54
+ }, z.core.$strip>;
55
+ readonly "workspace.invitation.accepted": z.ZodObject<{
56
+ invitationId: z.ZodUUID;
57
+ userId: z.ZodUUID;
58
+ }, z.core.$strip>;
59
+ readonly "workspace.invitation.revoked": z.ZodObject<{
60
+ invitationId: z.ZodUUID;
61
+ }, z.core.$strip>;
62
+ readonly "billing.subscription.updated": z.ZodObject<{
63
+ subscriptionId: z.ZodUUID;
64
+ planKey: z.ZodString;
65
+ status: z.ZodEnum<{
66
+ active: "active";
67
+ canceled: "canceled";
68
+ incomplete: "incomplete";
69
+ past_due: "past_due";
70
+ paused: "paused";
71
+ trialing: "trialing";
72
+ }>;
73
+ previousStatus: z.ZodOptional<z.ZodEnum<{
74
+ active: "active";
75
+ canceled: "canceled";
76
+ incomplete: "incomplete";
77
+ past_due: "past_due";
78
+ paused: "paused";
79
+ trialing: "trialing";
80
+ }>>;
81
+ }, z.core.$strip>;
82
+ /**
83
+ * Job lifecycle, reported from inside a Trigger.dev task.
84
+ *
85
+ * Trigger.dev owns run state — these events exist so the *application* can
86
+ * react and so a browser can watch progress, not as a second source of truth.
87
+ * `runId` is Trigger.dev's, which is what makes a run traceable across both
88
+ * systems.
89
+ */
90
+ readonly "job.started": z.ZodObject<{
91
+ runId: z.ZodString;
92
+ taskId: z.ZodString;
93
+ }, z.core.$strip>;
94
+ readonly "job.progress": z.ZodObject<{
95
+ runId: z.ZodString;
96
+ taskId: z.ZodString;
97
+ percent: z.ZodOptional<z.ZodNumber>;
98
+ message: z.ZodOptional<z.ZodString>;
99
+ step: z.ZodOptional<z.ZodNumber>;
100
+ totalSteps: z.ZodOptional<z.ZodNumber>;
101
+ }, z.core.$strip>;
102
+ readonly "job.completed": z.ZodObject<{
103
+ runId: z.ZodString;
104
+ taskId: z.ZodString;
105
+ durationMs: z.ZodOptional<z.ZodNumber>;
106
+ }, z.core.$strip>;
107
+ readonly "job.failed": z.ZodObject<{
108
+ runId: z.ZodString;
109
+ taskId: z.ZodString;
110
+ error: z.ZodString;
111
+ attempt: z.ZodOptional<z.ZodNumber>;
112
+ }, z.core.$strip>;
113
+ readonly "billing.subscription.canceled": z.ZodObject<{
114
+ subscriptionId: z.ZodUUID;
115
+ planKey: z.ZodString;
116
+ atPeriodEnd: z.ZodBoolean;
117
+ }, z.core.$strip>;
118
+ }>;
119
+ export type CoreEventSchemas = (typeof coreEvents)["schemas"];
120
+ //# sourceMappingURL=core-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-events.d.ts","sourceRoot":"","sources":["../../src/events/core-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuDrB;;;;;;;OAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCH,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { z } from "zod";
2
+ import { defineEvents } from "./registry.js";
3
+ const uuid = z.uuid();
4
+ /**
5
+ * Events the core itself emits.
6
+ *
7
+ * Deliberately limited to what the core actually does today. Notification and
8
+ * realtime events belong to the phases that introduce them — declaring them now
9
+ * would ship a catalogue of types nothing publishes, which is worse than no type
10
+ * at all because consumers would write handlers that never fire.
11
+ *
12
+ * Payloads carry identifiers, not whole records. A consumer that needs the
13
+ * current state should read it; embedding a snapshot would go stale between
14
+ * publication and delivery, and would put mutable user data in an append-only
15
+ * table.
16
+ */
17
+ export const coreEvents = defineEvents({
18
+ "user.created": z.object({
19
+ userId: uuid,
20
+ workosUserId: z.string().min(1),
21
+ }),
22
+ "workspace.created": z.object({
23
+ workspaceId: uuid,
24
+ slug: z.string().min(1),
25
+ }),
26
+ "workspace.updated": z.object({
27
+ workspaceId: uuid,
28
+ /** Which fields changed, so a consumer can skip work it does not care about. */
29
+ changed: z.array(z.enum(["name", "slug"])),
30
+ }),
31
+ "workspace.deleted": z.object({
32
+ workspaceId: uuid,
33
+ slug: z.string().min(1),
34
+ }),
35
+ "workspace.member.created": z.object({
36
+ userId: uuid,
37
+ roleIds: z.array(uuid),
38
+ }),
39
+ "workspace.member.removed": z.object({
40
+ userId: uuid,
41
+ }),
42
+ "workspace.member.role.updated": z.object({
43
+ userId: uuid,
44
+ roleId: uuid,
45
+ action: z.enum(["assigned", "unassigned"]),
46
+ }),
47
+ "workspace.invitation.created": z.object({
48
+ invitationId: uuid,
49
+ email: z.email(),
50
+ roleId: uuid.nullable(),
51
+ }),
52
+ "workspace.invitation.accepted": z.object({
53
+ invitationId: uuid,
54
+ userId: uuid,
55
+ }),
56
+ "workspace.invitation.revoked": z.object({
57
+ invitationId: uuid,
58
+ }),
59
+ "billing.subscription.updated": z.object({
60
+ subscriptionId: uuid,
61
+ planKey: z.string().min(1),
62
+ status: z.enum(["trialing", "active", "past_due", "paused", "canceled", "incomplete"]),
63
+ /** Absent on the first observation of a subscription. */
64
+ previousStatus: z
65
+ .enum(["trialing", "active", "past_due", "paused", "canceled", "incomplete"])
66
+ .optional(),
67
+ }),
68
+ /**
69
+ * Job lifecycle, reported from inside a Trigger.dev task.
70
+ *
71
+ * Trigger.dev owns run state — these events exist so the *application* can
72
+ * react and so a browser can watch progress, not as a second source of truth.
73
+ * `runId` is Trigger.dev's, which is what makes a run traceable across both
74
+ * systems.
75
+ */
76
+ "job.started": z.object({
77
+ runId: z.string().min(1),
78
+ taskId: z.string().min(1),
79
+ }),
80
+ "job.progress": z.object({
81
+ runId: z.string().min(1),
82
+ taskId: z.string().min(1),
83
+ /** 0-100 where the task can estimate it. */
84
+ percent: z.number().min(0).max(100).optional(),
85
+ message: z.string().max(500).optional(),
86
+ step: z.number().int().nonnegative().optional(),
87
+ totalSteps: z.number().int().positive().optional(),
88
+ }),
89
+ "job.completed": z.object({
90
+ runId: z.string().min(1),
91
+ taskId: z.string().min(1),
92
+ durationMs: z.number().int().nonnegative().optional(),
93
+ }),
94
+ "job.failed": z.object({
95
+ runId: z.string().min(1),
96
+ taskId: z.string().min(1),
97
+ /** Truncated failure message. Never put a secret in a task error. */
98
+ error: z.string().max(2000),
99
+ /** Trigger.dev attempt number, so a retry is distinguishable from a give-up. */
100
+ attempt: z.number().int().positive().optional(),
101
+ }),
102
+ "billing.subscription.canceled": z.object({
103
+ subscriptionId: uuid,
104
+ planKey: z.string().min(1),
105
+ /** False when access ended immediately. */
106
+ atPeriodEnd: z.boolean(),
107
+ }),
108
+ });
109
+ //# sourceMappingURL=core-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-events.js","sourceRoot":"","sources":["../../src/events/core-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type CoreEventSchemas } from "./core-events.ts";
2
+ import { type EventsService } from "./service.ts";
3
+ export { coreEvents, type CoreEventSchemas } from "./core-events.ts";
4
+ export { defineEvents, mergeEventRegistries, type AnyEventHandler, type EventDataOf, type EventHandler, type EventRegistry, type EventSchemaMap, type EventTypeOf, type PublishInput, type SaasEvent, type SaasEventOf, type Unsubscribe, } from "./registry.ts";
5
+ export { createEventsService, type EventsService, type EventsServiceDeps, type ListEventsOptions, type RecordResult, type ScopedPublisher, } from "./service.ts";
6
+ /**
7
+ * Default service over the core catalogue only.
8
+ *
9
+ * An application with its own events should build its own service from a merged
10
+ * registry — this one cannot publish types it does not know about. It exists so
11
+ * the core's own services have somewhere to emit without every consumer having
12
+ * to wire a registry first.
13
+ */
14
+ export declare const events: EventsService<CoreEventSchemas>;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAsCA,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAEvE,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AAEtB;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAKjD,CAAC"}