@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,470 @@
1
+ import { and, asc, eq, inArray, ne, sql } from "drizzle-orm";
2
+ import { ConflictError, InvalidInputError, NotFoundError } from "../errors.js";
3
+ import { isUniqueViolation } from "../db/errors.js";
4
+ import { billingCustomers, billingEvents, ENTITLING_SUBSCRIPTION_STATUSES, entitlements, plans, subscriptions, workspaces, } from "../db/schema/index.js";
5
+ import { EventOutbox } from "../events/publisher.js";
6
+ /** Raised when a webhook's signature does not verify. */
7
+ export class InvalidWebhookSignatureError extends Error {
8
+ name = "InvalidWebhookSignatureError";
9
+ constructor() {
10
+ /**
11
+ * Deliberately uninformative. A caller who cannot produce a valid signature
12
+ * gets no hint about which part failed.
13
+ */
14
+ super("Webhook signature verification failed.");
15
+ }
16
+ }
17
+ export function createBillingService(deps) {
18
+ /**
19
+ * Read through `deps` on every call rather than capturing at construction, so
20
+ * the default service can be built at import time while the provider — and
21
+ * the credentials it needs — resolve only on first use.
22
+ */
23
+ const providerName = () => deps.provider.name;
24
+ const outbox = () => new EventOutbox(deps.events);
25
+ async function findLiveSubscription(workspaceId) {
26
+ const rows = await deps.db
27
+ .select({ subscription: subscriptions, plan: plans })
28
+ .from(subscriptions)
29
+ .innerJoin(plans, eq(plans.id, subscriptions.planId))
30
+ .where(and(eq(subscriptions.workspaceId, workspaceId), inArray(subscriptions.status, [...ENTITLING_SUBSCRIPTION_STATUSES])))
31
+ .limit(1);
32
+ const row = rows[0];
33
+ return row === undefined ? undefined : { subscription: row.subscription, plan: row.plan };
34
+ }
35
+ async function replaceEntitlements(tx, planId, definitions) {
36
+ await tx.delete(entitlements).where(eq(entitlements.planId, planId));
37
+ if (definitions.length === 0) {
38
+ return;
39
+ }
40
+ await tx.insert(entitlements).values(definitions.map((definition) => ({
41
+ planId,
42
+ key: definition.key,
43
+ kind: definition.kind,
44
+ /**
45
+ * Features carry no quota. Storing one would make `getLimit()` on a
46
+ * feature look meaningful when it is not.
47
+ */
48
+ limitValue: definition.kind === "limit" ? (definition.limitValue ?? null) : null,
49
+ })));
50
+ }
51
+ /**
52
+ * Apply normalised subscription state from a verified webhook.
53
+ *
54
+ * Returns false when the event is not actionable — an unknown customer or an
55
+ * unresolvable plan — so the caller can record it as ignored rather than
56
+ * failed. That distinction matters: ignored events are expected (traffic for
57
+ * another environment sharing a provider account), failures need attention.
58
+ */
59
+ async function applySubscriptionState(tx, state, events) {
60
+ const customerRows = await tx
61
+ .select()
62
+ .from(billingCustomers)
63
+ .where(and(eq(billingCustomers.provider, providerName()), eq(billingCustomers.providerCustomerId, state.providerCustomerId)))
64
+ .limit(1);
65
+ const customer = customerRows[0];
66
+ if (customer === undefined) {
67
+ return false;
68
+ }
69
+ /**
70
+ * The workspace comes from our own customer record, never from the webhook
71
+ * payload. A provider-supplied workspace reference would be attacker-visible
72
+ * if the signing secret ever leaked, and this way tenancy is resolved from
73
+ * data we wrote ourselves.
74
+ */
75
+ const workspaceId = customer.workspaceId;
76
+ const planRows = state.providerPriceId !== undefined
77
+ ? await tx
78
+ .select()
79
+ .from(plans)
80
+ .where(eq(plans.providerPriceId, state.providerPriceId))
81
+ .limit(1)
82
+ : state.planKey !== undefined
83
+ ? await tx.select().from(plans).where(eq(plans.key, state.planKey)).limit(1)
84
+ : [];
85
+ const plan = planRows[0];
86
+ if (plan === undefined) {
87
+ return false;
88
+ }
89
+ const isLive = ENTITLING_SUBSCRIPTION_STATUSES.includes(state.status);
90
+ /**
91
+ * Read the prior status before the upsert overwrites it, so the event can
92
+ * report the transition. Consumers care about the change — "became
93
+ * past_due" — far more than the resulting value.
94
+ */
95
+ const priorRows = await tx
96
+ .select({ status: subscriptions.status })
97
+ .from(subscriptions)
98
+ .where(and(eq(subscriptions.provider, providerName()), eq(subscriptions.providerSubscriptionId, state.providerSubscriptionId)))
99
+ .limit(1);
100
+ const previousStatus = priorRows[0]?.status;
101
+ /**
102
+ * Retire any other live subscription for this workspace first.
103
+ *
104
+ * `subscriptions_one_live_per_workspace_idx` allows only one, and an upgrade
105
+ * arrives as a new subscription rather than a mutation of the old one, so
106
+ * without this the insert would violate the index.
107
+ */
108
+ if (isLive) {
109
+ await tx
110
+ .update(subscriptions)
111
+ .set({ status: "canceled", canceledAt: new Date(), updatedAt: new Date() })
112
+ .where(and(eq(subscriptions.workspaceId, workspaceId), ne(subscriptions.providerSubscriptionId, state.providerSubscriptionId), inArray(subscriptions.status, [...ENTITLING_SUBSCRIPTION_STATUSES])));
113
+ }
114
+ const upserted = await tx
115
+ .insert(subscriptions)
116
+ .values({
117
+ workspaceId,
118
+ billingCustomerId: customer.id,
119
+ planId: plan.id,
120
+ provider: providerName(),
121
+ providerSubscriptionId: state.providerSubscriptionId,
122
+ status: state.status,
123
+ currentPeriodStart: state.currentPeriodStart ?? null,
124
+ currentPeriodEnd: state.currentPeriodEnd ?? null,
125
+ cancelAtPeriodEnd: state.cancelAtPeriodEnd ?? false,
126
+ canceledAt: state.canceledAt ?? null,
127
+ trialEndsAt: state.trialEndsAt ?? null,
128
+ })
129
+ .onConflictDoUpdate({
130
+ target: [subscriptions.provider, subscriptions.providerSubscriptionId],
131
+ set: {
132
+ planId: plan.id,
133
+ status: state.status,
134
+ currentPeriodStart: state.currentPeriodStart ?? null,
135
+ currentPeriodEnd: state.currentPeriodEnd ?? null,
136
+ cancelAtPeriodEnd: state.cancelAtPeriodEnd ?? false,
137
+ canceledAt: state.canceledAt ?? null,
138
+ trialEndsAt: state.trialEndsAt ?? null,
139
+ updatedAt: new Date(),
140
+ },
141
+ })
142
+ .returning({ id: subscriptions.id });
143
+ if (events.enabled && upserted[0] !== undefined) {
144
+ await events.record({
145
+ type: "billing.subscription.updated",
146
+ workspaceId,
147
+ // No human actor: this came from the provider.
148
+ actorId: null,
149
+ data: {
150
+ subscriptionId: upserted[0].id,
151
+ planKey: plan.key,
152
+ status: state.status,
153
+ ...(previousStatus !== undefined ? { previousStatus } : {}),
154
+ },
155
+ }, tx);
156
+ }
157
+ return true;
158
+ }
159
+ const planAdmin = {
160
+ async list(options = {}) {
161
+ const query = deps.db.select().from(plans).orderBy(asc(plans.sortOrder), asc(plans.key));
162
+ if (options.includeInactive === true) {
163
+ return query;
164
+ }
165
+ return deps.db
166
+ .select()
167
+ .from(plans)
168
+ .where(eq(plans.isActive, true))
169
+ .orderBy(asc(plans.sortOrder), asc(plans.key));
170
+ },
171
+ async getByKey(key) {
172
+ const rows = await deps.db.select().from(plans).where(eq(plans.key, key)).limit(1);
173
+ return rows[0];
174
+ },
175
+ async upsert(input) {
176
+ return deps.db.transaction(async (tx) => {
177
+ const [plan] = await tx
178
+ .insert(plans)
179
+ .values({
180
+ key: input.key,
181
+ name: input.name,
182
+ description: input.description ?? null,
183
+ providerPriceId: input.providerPriceId ?? null,
184
+ amountCents: input.amountCents ?? 0,
185
+ currency: (input.currency ?? "EUR").toUpperCase(),
186
+ interval: input.interval ?? "month",
187
+ isActive: input.isActive ?? true,
188
+ sortOrder: input.sortOrder ?? 0,
189
+ })
190
+ .onConflictDoUpdate({
191
+ target: plans.key,
192
+ set: {
193
+ name: input.name,
194
+ description: input.description ?? null,
195
+ providerPriceId: input.providerPriceId ?? null,
196
+ amountCents: input.amountCents ?? 0,
197
+ currency: (input.currency ?? "EUR").toUpperCase(),
198
+ interval: input.interval ?? "month",
199
+ isActive: input.isActive ?? true,
200
+ sortOrder: input.sortOrder ?? 0,
201
+ updatedAt: new Date(),
202
+ },
203
+ })
204
+ .returning();
205
+ if (input.entitlements !== undefined) {
206
+ assertEntitlementDefinitions(input.entitlements);
207
+ await replaceEntitlements(tx, plan.id, input.entitlements);
208
+ }
209
+ return plan;
210
+ });
211
+ },
212
+ async setEntitlements(planKey, definitions) {
213
+ assertEntitlementDefinitions(definitions);
214
+ await deps.db.transaction(async (tx) => {
215
+ const rows = await tx.select({ id: plans.id }).from(plans).where(eq(plans.key, planKey)).limit(1);
216
+ const plan = rows[0];
217
+ if (plan === undefined) {
218
+ throw new NotFoundError(`Plan "${planKey}" not found.`);
219
+ }
220
+ await replaceEntitlements(tx, plan.id, definitions);
221
+ });
222
+ },
223
+ };
224
+ const webhooks = {
225
+ async handle(request) {
226
+ /**
227
+ * Verify before anything else. An unverified body must not reach the
228
+ * parser, let alone the database.
229
+ */
230
+ const verified = deps.provider.verifyWebhook({
231
+ rawBody: request.rawBody,
232
+ signature: request.signature,
233
+ ...(request.timestamp !== undefined ? { timestamp: request.timestamp } : {}),
234
+ });
235
+ if (!verified) {
236
+ throw new InvalidWebhookSignatureError();
237
+ }
238
+ const event = deps.provider.parseWebhookEvent(request.rawBody);
239
+ /**
240
+ * Claim the event with a conditional upsert.
241
+ *
242
+ * The insert is the claim, so at-least-once delivery is handled by the
243
+ * `(provider, provider_event_id)` unique constraint rather than by a
244
+ * check-then-act that two concurrent deliveries could both pass. The
245
+ * `setWhere` clause means a retry re-claims an event whose previous
246
+ * attempt *failed*, but never one already `processed` or currently
247
+ * `pending` — so a genuine failure can be retried without risking a
248
+ * double application.
249
+ */
250
+ const claimed = await deps.db
251
+ .insert(billingEvents)
252
+ .values({
253
+ provider: providerName(),
254
+ providerEventId: event.providerEventId,
255
+ type: event.type,
256
+ payload: event.payload,
257
+ status: "pending",
258
+ })
259
+ .onConflictDoUpdate({
260
+ target: [billingEvents.provider, billingEvents.providerEventId],
261
+ set: { status: "pending", error: null, updatedAt: new Date() },
262
+ setWhere: eq(billingEvents.status, "failed"),
263
+ })
264
+ .returning({ id: billingEvents.id });
265
+ const claim = claimed[0];
266
+ if (claim === undefined) {
267
+ return { status: "duplicate", type: event.type };
268
+ }
269
+ const outgoing = outbox();
270
+ try {
271
+ const applied = event.subscription === undefined
272
+ ? false
273
+ : await deps.db.transaction((tx) => applySubscriptionState(tx, event.subscription, outgoing));
274
+ // After commit: subscribers must not see uncommitted subscription state.
275
+ await outgoing.flush();
276
+ await deps.db
277
+ .update(billingEvents)
278
+ .set({
279
+ status: applied ? "processed" : "ignored",
280
+ processedAt: new Date(),
281
+ updatedAt: new Date(),
282
+ })
283
+ .where(eq(billingEvents.id, claim.id));
284
+ return applied
285
+ ? { status: "processed", eventId: claim.id, type: event.type }
286
+ : { status: "ignored", eventId: claim.id, type: event.type };
287
+ }
288
+ catch (error) {
289
+ /**
290
+ * Record the failure so the event can be replayed from the stored
291
+ * payload, then rethrow so the provider sees a non-2xx and retries.
292
+ */
293
+ await deps.db
294
+ .update(billingEvents)
295
+ .set({
296
+ status: "failed",
297
+ error: error instanceof Error ? error.message : "Unknown error",
298
+ updatedAt: new Date(),
299
+ })
300
+ .where(eq(billingEvents.id, claim.id));
301
+ throw error;
302
+ }
303
+ },
304
+ };
305
+ return {
306
+ async getCustomer(context) {
307
+ const rows = await deps.db
308
+ .select()
309
+ .from(billingCustomers)
310
+ .where(eq(billingCustomers.workspaceId, context.workspaceId))
311
+ .limit(1);
312
+ return rows[0];
313
+ },
314
+ async ensureCustomer(context, options = {}) {
315
+ const existing = await this.getCustomer(context);
316
+ if (existing !== undefined) {
317
+ return existing;
318
+ }
319
+ const workspaceRows = await deps.db
320
+ .select({ name: workspaces.name })
321
+ .from(workspaces)
322
+ .where(eq(workspaces.id, context.workspaceId))
323
+ .limit(1);
324
+ const workspace = workspaceRows[0];
325
+ if (workspace === undefined) {
326
+ throw new NotFoundError("Workspace not found.");
327
+ }
328
+ const created = await deps.provider.createCustomer({
329
+ workspaceId: context.workspaceId,
330
+ workspaceName: workspace.name,
331
+ ...(options.email !== undefined ? { email: options.email } : {}),
332
+ });
333
+ try {
334
+ const [customer] = await deps.db
335
+ .insert(billingCustomers)
336
+ .values({
337
+ workspaceId: context.workspaceId,
338
+ provider: providerName(),
339
+ providerCustomerId: created.providerCustomerId,
340
+ email: options.email ?? null,
341
+ })
342
+ .returning();
343
+ return customer;
344
+ }
345
+ catch (error) {
346
+ /**
347
+ * A concurrent request created this workspace's customer first. Its row
348
+ * is equally valid, so adopt it rather than failing the caller.
349
+ *
350
+ * Matched on the workspace constraint specifically. A violation of
351
+ * `billing_customers_provider_customer_unique` means the provider handed
352
+ * back an id already bound to a *different* workspace — a genuine fault
353
+ * that must surface, not a race to absorb.
354
+ */
355
+ if (isUniqueViolation(error, "billing_customers_workspace_id_unique")) {
356
+ const raced = await this.getCustomer(context);
357
+ if (raced !== undefined) {
358
+ return raced;
359
+ }
360
+ }
361
+ throw error;
362
+ }
363
+ },
364
+ async createCheckout(context, options) {
365
+ const plan = await planAdmin.getByKey(options.planKey);
366
+ if (plan === undefined) {
367
+ throw new NotFoundError(`Plan "${options.planKey}" not found.`);
368
+ }
369
+ if (!plan.isActive) {
370
+ throw new ConflictError(`Plan "${options.planKey}" is no longer available.`);
371
+ }
372
+ const customer = await this.ensureCustomer(context);
373
+ return deps.provider.createCheckout({
374
+ workspaceId: context.workspaceId,
375
+ providerCustomerId: customer.providerCustomerId,
376
+ plan,
377
+ successUrl: options.successUrl,
378
+ cancelUrl: options.cancelUrl,
379
+ ...(options.quantity !== undefined ? { quantity: options.quantity } : {}),
380
+ ...(options.metadata !== undefined ? { metadata: options.metadata } : {}),
381
+ });
382
+ },
383
+ async getSubscription(context) {
384
+ return findLiveSubscription(context.workspaceId);
385
+ },
386
+ async cancelSubscription(context, options = {}) {
387
+ const live = await findLiveSubscription(context.workspaceId);
388
+ if (live === undefined) {
389
+ throw new NotFoundError("No active subscription for this workspace.");
390
+ }
391
+ const atPeriodEnd = options.atPeriodEnd ?? true;
392
+ // Only when the provider actually supports it; see BillingProvider.
393
+ if (deps.provider.cancelSubscription !== undefined) {
394
+ await deps.provider.cancelSubscription({
395
+ providerSubscriptionId: live.subscription.providerSubscriptionId,
396
+ atPeriodEnd,
397
+ });
398
+ }
399
+ /**
400
+ * Cancelling at period end keeps the subscription live — and therefore
401
+ * entitling — until the paid period expires. Cancelling immediately ends
402
+ * entitlements now.
403
+ */
404
+ const events = outbox();
405
+ const updated = await deps.db.transaction(async (tx) => {
406
+ const [row] = await tx
407
+ .update(subscriptions)
408
+ .set(atPeriodEnd
409
+ ? { cancelAtPeriodEnd: true, updatedAt: new Date() }
410
+ : { status: "canceled", canceledAt: new Date(), updatedAt: new Date() })
411
+ .where(eq(subscriptions.id, live.subscription.id))
412
+ .returning();
413
+ await events.record({
414
+ type: "billing.subscription.canceled",
415
+ workspaceId: context.workspaceId,
416
+ actorId: context.userId,
417
+ data: {
418
+ subscriptionId: live.subscription.id,
419
+ planKey: live.plan.key,
420
+ atPeriodEnd,
421
+ },
422
+ }, tx);
423
+ return row;
424
+ });
425
+ await events.flush();
426
+ return updated;
427
+ },
428
+ async getPortal(context, options) {
429
+ if (deps.provider.getPortalUrl === undefined) {
430
+ return { url: undefined };
431
+ }
432
+ const customer = await this.getCustomer(context);
433
+ if (customer === undefined) {
434
+ throw new NotFoundError("This workspace has no billing customer.");
435
+ }
436
+ const url = await deps.provider.getPortalUrl({
437
+ providerCustomerId: customer.providerCustomerId,
438
+ returnUrl: options.returnUrl,
439
+ });
440
+ return { url };
441
+ },
442
+ plans: planAdmin,
443
+ webhooks,
444
+ };
445
+ }
446
+ /** Validate an entitlement definition set before it reaches the database. */
447
+ export function assertEntitlementDefinitions(definitions) {
448
+ const seen = new Set();
449
+ for (const definition of definitions) {
450
+ if (seen.has(definition.key)) {
451
+ throw new InvalidInputError(`Duplicate entitlement key "${definition.key}".`);
452
+ }
453
+ seen.add(definition.key);
454
+ if (definition.kind === "limit" &&
455
+ definition.limitValue !== undefined &&
456
+ definition.limitValue !== null &&
457
+ (!Number.isInteger(definition.limitValue) || definition.limitValue < 0)) {
458
+ throw new InvalidInputError(`Limit for "${definition.key}" must be a non-negative integer or null for unlimited.`);
459
+ }
460
+ }
461
+ }
462
+ /** Exposed for diagnostics: how many events are awaiting replay. */
463
+ export async function countFailedBillingEvents(db) {
464
+ const rows = await db
465
+ .select({ count: sql `count(*)::int` })
466
+ .from(billingEvents)
467
+ .where(eq(billingEvents.status, "failed"));
468
+ return rows[0]?.count ?? 0;
469
+ }
470
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/billing/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type CommandRunner } from "../docker.ts";
2
+ import { type StackConfig } from "../templates.ts";
3
+ /** Where the generated stack lives, relative to the project root. */
4
+ export declare const STACK_DIRECTORY = ".saas-core";
5
+ export interface DevOptions {
6
+ readonly cwd?: string;
7
+ readonly runner?: CommandRunner;
8
+ readonly projectName?: string;
9
+ readonly domain?: string;
10
+ readonly appPort?: number;
11
+ readonly postgresPort?: number;
12
+ readonly minioPort?: number;
13
+ /** Rewrite the generated files even if they already exist. */
14
+ readonly force?: boolean;
15
+ }
16
+ export interface WrittenFile {
17
+ readonly path: string;
18
+ readonly action: "created" | "updated" | "kept";
19
+ }
20
+ /**
21
+ * Write the stack files.
22
+ *
23
+ * Existing files are left alone unless `--force`. They are meant to be edited —
24
+ * a developer who changed the Caddyfile to add a second host should not lose it
25
+ * to the next `up`.
26
+ */
27
+ export declare function writeStackFiles(cwd: string, options?: DevOptions): Promise<{
28
+ config: StackConfig;
29
+ directory: string;
30
+ files: WrittenFile[];
31
+ }>;
32
+ export declare function devUp(options?: DevOptions): Promise<void>;
33
+ export declare function devDown(options?: DevOptions & {
34
+ volumes?: boolean;
35
+ }): Promise<void>;
36
+ export declare function devStatus(options?: DevOptions): Promise<void>;
37
+ export declare function devLogs(options?: DevOptions & {
38
+ follow?: boolean;
39
+ service?: string;
40
+ }): Promise<void>;
41
+ /** Write the files without starting anything. For inspecting or editing first. */
42
+ export declare function devInit(options?: DevOptions): Promise<void>;
43
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,aAAa,EAEnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAEzB,qEAAqE;AACrE,eAAO,MAAM,eAAe,eAAe,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AA0BD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;CACjD;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC,CA2B3E;AAwCD,wBAAsB,KAAK,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEnE;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE,UAAU,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC7F;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBvE;AAED,wBAAsB,OAAO,CAC3B,OAAO,GAAE,UAAU,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAChE,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,kFAAkF;AAClF,wBAAsB,OAAO,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBrE"}