@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,58 @@
1
+ /**
2
+ * Adapt a Next.js-style cookie jar to a {@link CookieStore}.
3
+ *
4
+ * Pass the accessor itself, not the jar: Next resolves `cookies()` per request,
5
+ * so calling it once at module scope would bind every request to the first one.
6
+ *
7
+ * ```ts
8
+ * // lib/auth.ts
9
+ * import { cookies } from "next/headers";
10
+ * import { createConfiguredAuthService, createCookieStore } from "@digimuza/saas-core/auth";
11
+ *
12
+ * export const auth = createConfiguredAuthService(createCookieStore(cookies));
13
+ * ```
14
+ *
15
+ * Writes only succeed in Server Actions, Route Handlers and middleware. Next
16
+ * throws on cookie writes from Server Components; session refresh tolerates
17
+ * that, but sign-in and sign-out must run somewhere writable.
18
+ */
19
+ export function createCookieStore(getJar) {
20
+ return {
21
+ async get(name) {
22
+ const jar = await getJar();
23
+ return jar.get(name)?.value;
24
+ },
25
+ async set(name, value, options) {
26
+ const jar = await getJar();
27
+ await jar.set(name, value, {
28
+ httpOnly: options.httpOnly,
29
+ secure: options.secure,
30
+ sameSite: options.sameSite,
31
+ path: options.path,
32
+ maxAge: options.maxAge,
33
+ });
34
+ },
35
+ async delete(name) {
36
+ const jar = await getJar();
37
+ await jar.delete(name);
38
+ },
39
+ };
40
+ }
41
+ /**
42
+ * An in-memory cookie store. Useful for tests and for non-HTTP runtimes that
43
+ * still need to hold a session for the duration of a call.
44
+ */
45
+ export function createMemoryCookieStore(initial = {}) {
46
+ const entries = new Map(Object.entries(initial));
47
+ return {
48
+ entries,
49
+ get: (name) => entries.get(name),
50
+ set: (name, value) => {
51
+ entries.set(name, value);
52
+ },
53
+ delete: (name) => {
54
+ entries.delete(name);
55
+ },
56
+ };
57
+ }
58
+ //# sourceMappingURL=cookies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/auth/cookies.ts"],"names":[],"mappings":"AAyBA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA0D;IAE1D,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,IAAY;YACpB,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;YAC3B,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;QAC9B,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,OAA6B;YAClE,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;gBACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,IAAY;YACvB,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAO,GAA2B,EAAE;IAEpC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAiB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAEjE,OAAO;QACL,OAAO;QACP,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACf,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type AuthService } from "./service.ts";
2
+ import type { CookieStore } from "./types.ts";
3
+ export { getWorkos, resetWorkos } from "./client.ts";
4
+ export { createCookieStore, createMemoryCookieStore, type NextCookieAttributes, type RequestCookieJar, } from "./cookies.ts";
5
+ export { createAuthService, DEFAULT_SESSION_COOKIE, DEFAULT_STATE_COOKIE, type AuthorizationUrl, type AuthService, type AuthServiceDeps, } from "./service.ts";
6
+ export type { AuthorizationUrlOptions, AuthSession, CallbackResult, CookieStore, SessionCookieOptions, } from "./types.ts";
7
+ /**
8
+ * Build an auth service from configuration, for a given cookie store.
9
+ *
10
+ * `secureCookies` follows `APP_ENV`: cookies must be `Secure` in production, but
11
+ * requiring it in local development over plain HTTP would break sign-in.
12
+ */
13
+ export declare function createConfiguredAuthService(cookieStore: CookieStore): AuthService;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,uBAAuB,EACvB,WAAW,EACX,cAAc,EACd,WAAW,EACX,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAYjF"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Public auth surface: `@digimuza/saas-core/auth`. Server-only.
3
+ *
4
+ * WorkOS owns identity: OAuth, SAML, OIDC, passkeys, MFA and session sealing.
5
+ * This module keeps its details behind a small API so application code never
6
+ * imports the WorkOS SDK directly.
7
+ *
8
+ * Applications construct the service once against their runtime's cookie store:
9
+ *
10
+ * ```ts
11
+ * // lib/auth.ts
12
+ * import { cookies } from "next/headers";
13
+ * import { createConfiguredAuthService, createCookieStore } from "@digimuza/saas-core/auth";
14
+ *
15
+ * export const auth = createConfiguredAuthService(createCookieStore(cookies));
16
+ * ```
17
+ *
18
+ * Then `auth.getCurrentUser()`, `auth.requireUser()`, `auth.getSession()` and
19
+ * `auth.signOut()` are available throughout the application.
20
+ */
21
+ import { config } from "../config/index.js";
22
+ import { users } from "../users/index.js";
23
+ import { getWorkos } from "./client.js";
24
+ import { createAuthService } from "./service.js";
25
+ export { getWorkos, resetWorkos } from "./client.js";
26
+ export { createCookieStore, createMemoryCookieStore, } from "./cookies.js";
27
+ export { createAuthService, DEFAULT_SESSION_COOKIE, DEFAULT_STATE_COOKIE, } from "./service.js";
28
+ /**
29
+ * Build an auth service from configuration, for a given cookie store.
30
+ *
31
+ * `secureCookies` follows `APP_ENV`: cookies must be `Secure` in production, but
32
+ * requiring it in local development over plain HTTP would break sign-in.
33
+ */
34
+ export function createConfiguredAuthService(cookieStore) {
35
+ const auth = config.auth;
36
+ return createAuthService({
37
+ workos: getWorkos(),
38
+ cookies: cookieStore,
39
+ users,
40
+ clientId: auth.workosClientId,
41
+ cookiePassword: auth.cookiePassword,
42
+ redirectUri: auth.redirectUri,
43
+ secureCookies: config.app.isProduction,
44
+ });
45
+ }
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAoB,MAAM,cAAc,CAAC;AAGnE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GAGxB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,GAIrB,MAAM,cAAc,CAAC;AAStB;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,WAAwB;IAClE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAEzB,OAAO,iBAAiB,CAAC;QACvB,MAAM,EAAE,SAAS,EAAE;QACnB,OAAO,EAAE,WAAW;QACpB,KAAK;QACL,QAAQ,EAAE,IAAI,CAAC,cAAc;QAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY;KACvC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,67 @@
1
+ import type { WorkOS } from "@workos-inc/node";
2
+ import type { UsersService, UserWithProfile } from "../users/service.ts";
3
+ import type { AuthorizationUrlOptions, AuthSession, CallbackResult, CookieStore } from "./types.ts";
4
+ export declare const DEFAULT_SESSION_COOKIE = "dg_session";
5
+ export declare const DEFAULT_STATE_COOKIE = "dg_oauth_state";
6
+ export interface AuthServiceDeps {
7
+ readonly workos: WorkOS;
8
+ readonly cookies: CookieStore;
9
+ readonly users: UsersService;
10
+ readonly clientId: string;
11
+ readonly cookiePassword: string;
12
+ readonly redirectUri: string;
13
+ /** Set `Secure` on session cookies. Must be true in production. */
14
+ readonly secureCookies: boolean;
15
+ readonly sessionCookieName?: string;
16
+ readonly stateCookieName?: string;
17
+ readonly sessionMaxAgeSeconds?: number;
18
+ }
19
+ export interface AuthorizationUrl {
20
+ readonly url: string;
21
+ /**
22
+ * The generated CSRF state. Already stored in a cookie and verified by
23
+ * {@link AuthService.handleCallback}; returned for logging and tests.
24
+ */
25
+ readonly state: string;
26
+ }
27
+ export interface AuthService {
28
+ /**
29
+ * Build the WorkOS AuthKit URL and store a single-use CSRF state cookie.
30
+ *
31
+ * Asynchronous because it writes a cookie.
32
+ */
33
+ getAuthorizationUrl(options?: AuthorizationUrlOptions): Promise<AuthorizationUrl>;
34
+ /**
35
+ * Exchange the callback code for a session.
36
+ *
37
+ * Verifies `state` against the cookie set by {@link getAuthorizationUrl},
38
+ * seals the session into an httpOnly cookie, and syncs the identity into
39
+ * `users` / `user_profiles`.
40
+ */
41
+ handleCallback(input: {
42
+ code: string;
43
+ state?: string;
44
+ }): Promise<CallbackResult>;
45
+ /** The current session, or `undefined` when unauthenticated. */
46
+ getSession(): Promise<AuthSession | undefined>;
47
+ /** As {@link getSession}, but throws {@link UnauthorizedError}. */
48
+ requireSession(): Promise<AuthSession>;
49
+ /** The current user, or `undefined` when unauthenticated. */
50
+ getCurrentUser(): Promise<UserWithProfile | undefined>;
51
+ /** As {@link getCurrentUser}, but throws {@link UnauthorizedError}. */
52
+ requireUser(): Promise<UserWithProfile>;
53
+ /**
54
+ * Clear the session cookie and return the WorkOS logout URL.
55
+ *
56
+ * The caller must redirect to that URL to end the session at the identity
57
+ * provider too; clearing the cookie alone leaves the WorkOS session alive, so
58
+ * the next sign-in would silently succeed without re-authenticating.
59
+ */
60
+ signOut(options?: {
61
+ returnTo?: string;
62
+ }): Promise<{
63
+ logoutUrl: string | undefined;
64
+ }>;
65
+ }
66
+ export declare function createAuthService(deps: AuthServiceDeps): AuthService;
67
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/auth/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EACV,uBAAuB,EACvB,WAAW,EACX,cAAc,EACd,WAAW,EAEZ,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,sBAAsB,eAAe,CAAC;AACnD,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AAQrD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAElF;;;;;;OAMG;IACH,cAAc,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEjF,gEAAgE;IAChE,UAAU,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAE/C,mEAAmE;IACnE,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAEvC,6DAA6D;IAC7D,cAAc,IAAI,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;IAEvD,uEAAuE;IACvE,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAExC;;;;;;OAMG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;CACtF;AAuCD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAwRpE"}
@@ -0,0 +1,275 @@
1
+ import { randomBytes, timingSafeEqual } from "node:crypto";
2
+ import { UnauthorizedError } from "../errors.js";
3
+ export const DEFAULT_SESSION_COOKIE = "dg_session";
4
+ export const DEFAULT_STATE_COOKIE = "dg_oauth_state";
5
+ /** 30 days. The sealed session carries a refresh token, not a bearer token. */
6
+ const DEFAULT_SESSION_MAX_AGE_SECONDS = 60 * 60 * 24 * 30;
7
+ /** Long enough to complete a sign-in, short enough to limit replay. */
8
+ const STATE_MAX_AGE_SECONDS = 60 * 10;
9
+ function newState() {
10
+ return randomBytes(32).toString("base64url");
11
+ }
12
+ /**
13
+ * Read the `sid` claim from a WorkOS access token.
14
+ *
15
+ * The signature is deliberately not verified: this token was just received over
16
+ * TLS in a direct response from WorkOS, so it has not passed through anything
17
+ * that could tamper with it, and re-verifying would mean an extra JWKS fetch.
18
+ * Never use this on a token that arrived from a client.
19
+ */
20
+ function readSessionId(accessToken) {
21
+ const payload = accessToken.split(".")[1];
22
+ if (payload === undefined) {
23
+ return "";
24
+ }
25
+ try {
26
+ const decoded = JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
27
+ return typeof decoded.sid === "string" ? decoded.sid : "";
28
+ }
29
+ catch {
30
+ return "";
31
+ }
32
+ }
33
+ /** Constant-time comparison, safe for values of differing length. */
34
+ function statesMatch(a, b) {
35
+ const left = Buffer.from(a);
36
+ const right = Buffer.from(b);
37
+ if (left.length !== right.length) {
38
+ return false;
39
+ }
40
+ return timingSafeEqual(left, right);
41
+ }
42
+ export function createAuthService(deps) {
43
+ const sessionCookie = deps.sessionCookieName ?? DEFAULT_SESSION_COOKIE;
44
+ const stateCookie = deps.stateCookieName ?? DEFAULT_STATE_COOKIE;
45
+ const sessionMaxAge = deps.sessionMaxAgeSeconds ?? DEFAULT_SESSION_MAX_AGE_SECONDS;
46
+ function cookieOptions(maxAge) {
47
+ return {
48
+ httpOnly: true,
49
+ secure: deps.secureCookies,
50
+ /**
51
+ * `lax`, not `strict`: the identity provider returns the user via a
52
+ * top-level GET navigation, and `strict` would withhold the cookie on
53
+ * that request and break every sign-in.
54
+ */
55
+ sameSite: "lax",
56
+ path: "/",
57
+ maxAge,
58
+ };
59
+ }
60
+ /**
61
+ * Persist a refreshed session cookie.
62
+ *
63
+ * Next.js Server Components cannot write cookies, and attempting it throws. A
64
+ * refresh that succeeded at WorkOS is still a usable session for this request,
65
+ * so the write failure is tolerated rather than surfaced. Applications that
66
+ * want the rotated token to stick should refresh in middleware, where writing
67
+ * cookies is allowed.
68
+ */
69
+ async function tryPersistSession(sealed) {
70
+ try {
71
+ await deps.cookies.set(sessionCookie, sealed, cookieOptions(sessionMaxAge));
72
+ }
73
+ catch {
74
+ // Intentionally ignored; see above.
75
+ }
76
+ }
77
+ async function toSession(input) {
78
+ /**
79
+ * Resolve the local user id on every session read, and provision it if the
80
+ * identity is new. A session sealed by WorkOS is proof of identity, but it
81
+ * says nothing about whether this database has seen the user yet — that is
82
+ * not true after a restore, or the first sign-in following a deploy.
83
+ */
84
+ const user = (await deps.users.getByWorkosId(input.workosUserId)) ??
85
+ (await deps.users.syncFromWorkos({
86
+ workosUserId: input.workosUserId,
87
+ email: input.email,
88
+ firstName: input.firstName ?? null,
89
+ lastName: input.lastName ?? null,
90
+ profilePictureUrl: input.profilePictureUrl ?? null,
91
+ }));
92
+ return {
93
+ userId: user.id,
94
+ workosUserId: input.workosUserId,
95
+ sessionId: input.sessionId,
96
+ email: input.email,
97
+ ...(input.organizationId !== undefined ? { organizationId: input.organizationId } : {}),
98
+ ...(input.impersonatorEmail !== undefined
99
+ ? { impersonatorEmail: input.impersonatorEmail }
100
+ : {}),
101
+ };
102
+ }
103
+ async function readSealedSession() {
104
+ const value = await deps.cookies.get(sessionCookie);
105
+ return value !== undefined && value.length > 0 ? value : undefined;
106
+ }
107
+ return {
108
+ async getAuthorizationUrl(options = {}) {
109
+ const state = options.state ?? newState();
110
+ await deps.cookies.set(stateCookie, state, cookieOptions(STATE_MAX_AGE_SECONDS));
111
+ /**
112
+ * WorkOS expects exactly one selector. `provider: "authkit"` means "show
113
+ * the hosted sign-in UI"; sending it alongside an organization or
114
+ * connection would conflict with the more specific choice.
115
+ */
116
+ const targetsSpecificConnection = options.organizationId !== undefined || options.connectionId !== undefined;
117
+ const url = deps.workos.userManagement.getAuthorizationUrl({
118
+ clientId: deps.clientId,
119
+ redirectUri: options.redirectUri ?? deps.redirectUri,
120
+ state,
121
+ ...(targetsSpecificConnection ? {} : { provider: "authkit" }),
122
+ ...(options.screenHint !== undefined ? { screenHint: options.screenHint } : {}),
123
+ ...(options.loginHint !== undefined ? { loginHint: options.loginHint } : {}),
124
+ ...(options.organizationId !== undefined ? { organizationId: options.organizationId } : {}),
125
+ ...(options.connectionId !== undefined ? { connectionId: options.connectionId } : {}),
126
+ ...(options.invitationToken !== undefined
127
+ ? { invitationToken: options.invitationToken }
128
+ : {}),
129
+ });
130
+ return { url, state };
131
+ },
132
+ async handleCallback({ code, state }) {
133
+ const expected = await deps.cookies.get(stateCookie);
134
+ /**
135
+ * CSRF defence. Without this, an attacker can feed a victim's browser a
136
+ * callback URL bearing the attacker's `code` and log the victim into the
137
+ * attacker's account.
138
+ */
139
+ if (expected === undefined || state === undefined || !statesMatch(expected, state)) {
140
+ throw new UnauthorizedError("Invalid or missing OAuth state.");
141
+ }
142
+ // Single use, regardless of what happens next.
143
+ await deps.cookies.delete(stateCookie);
144
+ const authenticated = await deps.workos.userManagement.authenticateWithCode({
145
+ code,
146
+ clientId: deps.clientId,
147
+ session: { sealSession: true, cookiePassword: deps.cookiePassword },
148
+ });
149
+ if (authenticated.sealedSession === undefined) {
150
+ throw new UnauthorizedError("WorkOS did not return a sealed session.");
151
+ }
152
+ await deps.cookies.set(sessionCookie, authenticated.sealedSession, cookieOptions(sessionMaxAge));
153
+ const synced = await deps.users.syncFromWorkos({
154
+ workosUserId: authenticated.user.id,
155
+ email: authenticated.user.email,
156
+ firstName: authenticated.user.firstName,
157
+ lastName: authenticated.user.lastName,
158
+ profilePictureUrl: authenticated.user.profilePictureUrl,
159
+ });
160
+ return {
161
+ session: {
162
+ userId: synced.id,
163
+ workosUserId: authenticated.user.id,
164
+ sessionId: readSessionId(authenticated.accessToken),
165
+ email: authenticated.user.email,
166
+ ...(authenticated.organizationId !== undefined
167
+ ? { organizationId: authenticated.organizationId }
168
+ : {}),
169
+ ...(authenticated.impersonator?.email !== undefined
170
+ ? { impersonatorEmail: authenticated.impersonator.email }
171
+ : {}),
172
+ },
173
+ ...(state !== undefined ? { state } : {}),
174
+ };
175
+ },
176
+ async getSession() {
177
+ const sealed = await readSealedSession();
178
+ if (sealed === undefined) {
179
+ return undefined;
180
+ }
181
+ const session = deps.workos.userManagement.loadSealedSession({
182
+ sessionData: sealed,
183
+ cookiePassword: deps.cookiePassword,
184
+ });
185
+ const result = await session.authenticate();
186
+ if (result.authenticated) {
187
+ return toSession({
188
+ workosUserId: result.user.id,
189
+ email: result.user.email,
190
+ sessionId: result.sessionId,
191
+ firstName: result.user.firstName,
192
+ lastName: result.user.lastName,
193
+ profilePictureUrl: result.user.profilePictureUrl,
194
+ ...(result.organizationId !== undefined
195
+ ? { organizationId: result.organizationId }
196
+ : {}),
197
+ ...(result.impersonator?.email !== undefined
198
+ ? { impersonatorEmail: result.impersonator.email }
199
+ : {}),
200
+ });
201
+ }
202
+ /**
203
+ * A short-lived access token expiring is the normal case, not an error:
204
+ * the sealed session still holds a valid refresh token. Any other reason
205
+ * (tampered or absent cookie) is treated as unauthenticated.
206
+ */
207
+ if (result.reason !== "invalid_jwt") {
208
+ return undefined;
209
+ }
210
+ const refreshed = await session.refresh({ cookiePassword: deps.cookiePassword });
211
+ if (!refreshed.authenticated) {
212
+ return undefined;
213
+ }
214
+ if (refreshed.sealedSession !== undefined) {
215
+ await tryPersistSession(refreshed.sealedSession);
216
+ }
217
+ return toSession({
218
+ workosUserId: refreshed.user.id,
219
+ email: refreshed.user.email,
220
+ sessionId: refreshed.sessionId,
221
+ firstName: refreshed.user.firstName,
222
+ lastName: refreshed.user.lastName,
223
+ profilePictureUrl: refreshed.user.profilePictureUrl,
224
+ ...(refreshed.organizationId !== undefined
225
+ ? { organizationId: refreshed.organizationId }
226
+ : {}),
227
+ ...(refreshed.impersonator?.email !== undefined
228
+ ? { impersonatorEmail: refreshed.impersonator.email }
229
+ : {}),
230
+ });
231
+ },
232
+ async requireSession() {
233
+ const session = await this.getSession();
234
+ if (session === undefined) {
235
+ throw new UnauthorizedError();
236
+ }
237
+ return session;
238
+ },
239
+ async getCurrentUser() {
240
+ const session = await this.getSession();
241
+ if (session === undefined) {
242
+ return undefined;
243
+ }
244
+ return deps.users.getById(session.userId);
245
+ },
246
+ async requireUser() {
247
+ const user = await this.getCurrentUser();
248
+ if (user === undefined) {
249
+ throw new UnauthorizedError();
250
+ }
251
+ return user;
252
+ },
253
+ async signOut(options = {}) {
254
+ const sealed = await readSealedSession();
255
+ // Clear locally first, so a WorkOS failure cannot leave the user signed in.
256
+ await deps.cookies.delete(sessionCookie);
257
+ if (sealed === undefined) {
258
+ return { logoutUrl: undefined };
259
+ }
260
+ try {
261
+ const session = deps.workos.userManagement.loadSealedSession({
262
+ sessionData: sealed,
263
+ cookiePassword: deps.cookiePassword,
264
+ });
265
+ const logoutUrl = await session.getLogoutUrl(options.returnTo !== undefined ? { returnTo: options.returnTo } : {});
266
+ return { logoutUrl };
267
+ }
268
+ catch {
269
+ // An unreadable or already-invalid session has nothing left to log out.
270
+ return { logoutUrl: undefined };
271
+ }
272
+ },
273
+ };
274
+ }
275
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/auth/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Transport-neutral session storage.
3
+ *
4
+ * The core does not import `next/headers`: it also runs in route handlers,
5
+ * Trigger.dev tasks and tests. A Next.js adapter lives in
6
+ * `@digimuza/saas-core/auth/next`.
7
+ *
8
+ * Methods may return promises — Next.js `cookies()` is async in the App Router.
9
+ */
10
+ export interface CookieStore {
11
+ get(name: string): string | undefined | Promise<string | undefined>;
12
+ set(name: string, value: string, options: SessionCookieOptions): void | Promise<void>;
13
+ delete(name: string): void | Promise<void>;
14
+ }
15
+ export interface SessionCookieOptions {
16
+ readonly httpOnly: boolean;
17
+ readonly secure: boolean;
18
+ readonly sameSite: "lax" | "strict" | "none";
19
+ readonly path: string;
20
+ readonly maxAge: number;
21
+ }
22
+ /**
23
+ * A resolved session.
24
+ *
25
+ * `userId` is the local user id; `workosUserId` is the identity-provider id.
26
+ * Application code should key off `userId`.
27
+ */
28
+ export interface AuthSession {
29
+ readonly userId: string;
30
+ readonly workosUserId: string;
31
+ readonly sessionId: string;
32
+ readonly email: string;
33
+ /** WorkOS organization, when the session was established against one. */
34
+ readonly organizationId?: string;
35
+ /** Set when an administrator is impersonating this user. */
36
+ readonly impersonatorEmail?: string;
37
+ }
38
+ export interface AuthorizationUrlOptions {
39
+ /** Overrides the configured `WORKOS_REDIRECT_URI`. */
40
+ readonly redirectUri?: string;
41
+ /** Opaque value echoed back to the callback. Use it for CSRF defence. */
42
+ readonly state?: string;
43
+ readonly screenHint?: "sign-up" | "sign-in";
44
+ readonly loginHint?: string;
45
+ readonly organizationId?: string;
46
+ /** Authenticate against a specific SSO connection. */
47
+ readonly connectionId?: string;
48
+ /** Accept a workspace invitation as part of signing in. */
49
+ readonly invitationToken?: string;
50
+ }
51
+ export interface CallbackResult {
52
+ readonly session: AuthSession;
53
+ /** WorkOS `state` echoed back, for the caller to verify. */
54
+ readonly state?: string;
55
+ }
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACpE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtF,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,uBAAuB;IACtC,sDAAsD;IACtD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,sDAAsD;IACtD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,2DAA2D;IAC3D,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export { createAuthorizationService, definePermissions, findRolesWithPermission, type AuthorizationService, type AuthorizationServiceDeps, type CreateRoleInput, type PermissionDefinition, type PermissionKey, } from "./service.ts";
2
+ /** Default service, bound to the configuration-driven database handle. */
3
+ export declare const authorization: import("./service.ts").AuthorizationService;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/authorization/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,aAAa,GACnB,MAAM,cAAc,CAAC;AAEtB,0EAA0E;AAC1E,eAAO,MAAM,aAAa,6CAKxB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Public authorization surface: `@digimuza/saas-core/authorization`. Server-only.
3
+ *
4
+ * Authorization always requires workspace context. A user's effective
5
+ * permissions are the union of the permissions carried by every role they hold
6
+ * in that workspace.
7
+ *
8
+ * Permissions are application-defined; the core stores the vocabulary an
9
+ * application registers rather than shipping its own. Application code should
10
+ * check permissions, not roles or subscription plans — see
11
+ * `@digimuza/saas-core/entitlements` for what a customer has paid for.
12
+ */
13
+ import { getDatabase } from "../db/client.js";
14
+ import { events as coreEventsService } from "../events/index.js";
15
+ import { createAuthorizationService } from "./service.js";
16
+ export { createAuthorizationService, definePermissions, findRolesWithPermission, } from "./service.js";
17
+ /** Default service, bound to the configuration-driven database handle. */
18
+ export const authorization = createAuthorizationService({
19
+ get db() {
20
+ return getDatabase();
21
+ },
22
+ events: coreEventsService,
23
+ });
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/authorization/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,MAAM,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,GAMxB,MAAM,cAAc,CAAC;AAEtB,0EAA0E;AAC1E,MAAM,CAAC,MAAM,aAAa,GAAG,0BAA0B,CAAC;IACtD,IAAI,EAAE;QACJ,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;IACD,MAAM,EAAE,iBAAiB;CAC1B,CAAC,CAAC"}