@decaf-ts/integrations 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (496) hide show
  1. package/README.md +164 -0
  2. package/dist/integrations.cjs +1 -1
  3. package/dist/integrations.cjs.map +1 -1
  4. package/dist/integrations.js +1 -1
  5. package/dist/integrations.js.map +1 -1
  6. package/docker/mailpit-compose.yml +17 -0
  7. package/docker/postgres-compose.yml +26 -0
  8. package/lib/cjs/blob/azure/AzureBlobStoreService.cjs +12 -23
  9. package/lib/cjs/blob/azure/AzureBlobStoreService.cjs.map +1 -1
  10. package/lib/cjs/blob/core/BlobStoreService.cjs +26 -25
  11. package/lib/cjs/blob/core/BlobStoreService.cjs.map +1 -1
  12. package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs +12 -23
  13. package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs.map +1 -1
  14. package/lib/cjs/blob/s3/S3BlobStoreService.cjs +11 -16
  15. package/lib/cjs/blob/s3/S3BlobStoreService.cjs.map +1 -1
  16. package/lib/cjs/blob/s3/S3CompatibleBlobStoreService.cjs +14 -16
  17. package/lib/cjs/blob/s3/S3CompatibleBlobStoreService.cjs.map +1 -1
  18. package/lib/cjs/comms/email/EmailService.cjs +376 -0
  19. package/lib/cjs/comms/email/EmailService.cjs.map +1 -0
  20. package/lib/cjs/comms/email/index.cjs +29 -0
  21. package/lib/cjs/comms/email/index.cjs.map +1 -0
  22. package/lib/cjs/comms/email/mime.cjs +225 -0
  23. package/lib/cjs/comms/email/mime.cjs.map +1 -0
  24. package/lib/cjs/comms/email/smtp.cjs +204 -0
  25. package/lib/cjs/comms/email/smtp.cjs.map +1 -0
  26. package/lib/cjs/comms/environment.cjs +63 -0
  27. package/lib/cjs/comms/environment.cjs.map +1 -0
  28. package/lib/cjs/comms/gmail/GmailService.cjs +235 -0
  29. package/lib/cjs/comms/gmail/GmailService.cjs.map +1 -0
  30. package/lib/cjs/comms/gmail/index.cjs +24 -0
  31. package/lib/cjs/comms/gmail/index.cjs.map +1 -0
  32. package/lib/cjs/comms/index.cjs +31 -0
  33. package/lib/cjs/comms/index.cjs.map +1 -0
  34. package/lib/cjs/comms/slack/SlackService.cjs +264 -0
  35. package/lib/cjs/comms/slack/SlackService.cjs.map +1 -0
  36. package/lib/cjs/comms/slack/index.cjs +24 -0
  37. package/lib/cjs/comms/slack/index.cjs.map +1 -0
  38. package/lib/cjs/comms/teams/TeamsService.cjs +212 -0
  39. package/lib/cjs/comms/teams/TeamsService.cjs.map +1 -0
  40. package/lib/cjs/comms/teams/index.cjs +24 -0
  41. package/lib/cjs/comms/teams/index.cjs.map +1 -0
  42. package/lib/cjs/comms/telegram/TelegramService.cjs +196 -0
  43. package/lib/cjs/comms/telegram/TelegramService.cjs.map +1 -0
  44. package/lib/cjs/comms/telegram/index.cjs +24 -0
  45. package/lib/cjs/comms/telegram/index.cjs.map +1 -0
  46. package/lib/cjs/devops/environment.cjs +43 -0
  47. package/lib/cjs/devops/environment.cjs.map +1 -0
  48. package/lib/cjs/devops/github/GithubService.cjs +302 -0
  49. package/lib/cjs/devops/github/GithubService.cjs.map +1 -0
  50. package/lib/cjs/devops/github/index.cjs +24 -0
  51. package/lib/cjs/devops/github/index.cjs.map +1 -0
  52. package/lib/cjs/devops/gitlab/GitlabService.cjs +282 -0
  53. package/lib/cjs/devops/gitlab/GitlabService.cjs.map +1 -0
  54. package/lib/cjs/devops/gitlab/index.cjs +24 -0
  55. package/lib/cjs/devops/gitlab/index.cjs.map +1 -0
  56. package/lib/cjs/devops/index.cjs +28 -0
  57. package/lib/cjs/devops/index.cjs.map +1 -0
  58. package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs +2 -0
  59. package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs.map +1 -1
  60. package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs +2 -0
  61. package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs.map +1 -1
  62. package/lib/cjs/index.cjs +3 -3
  63. package/lib/cjs/io/airtable/AirtableService.cjs +266 -0
  64. package/lib/cjs/io/airtable/AirtableService.cjs.map +1 -0
  65. package/lib/cjs/io/airtable/index.cjs +24 -0
  66. package/lib/cjs/io/airtable/index.cjs.map +1 -0
  67. package/lib/cjs/io/environment.cjs +46 -0
  68. package/lib/cjs/io/environment.cjs.map +1 -0
  69. package/lib/cjs/io/google-sheets/GoogleSheetsService.cjs +288 -0
  70. package/lib/cjs/io/google-sheets/GoogleSheetsService.cjs.map +1 -0
  71. package/lib/cjs/io/google-sheets/index.cjs +24 -0
  72. package/lib/cjs/io/google-sheets/index.cjs.map +1 -0
  73. package/lib/cjs/io/graphql/GraphqlService.cjs +143 -0
  74. package/lib/cjs/io/graphql/GraphqlService.cjs.map +1 -0
  75. package/lib/cjs/io/graphql/index.cjs +24 -0
  76. package/lib/cjs/io/graphql/index.cjs.map +1 -0
  77. package/lib/cjs/io/index.cjs +30 -0
  78. package/lib/cjs/io/index.cjs.map +1 -0
  79. package/lib/cjs/io/spreadsheet/SpreadsheetService.cjs +205 -0
  80. package/lib/cjs/io/spreadsheet/SpreadsheetService.cjs.map +1 -0
  81. package/lib/cjs/io/spreadsheet/index.cjs +25 -0
  82. package/lib/cjs/io/spreadsheet/index.cjs.map +1 -0
  83. package/lib/cjs/namespaces/index.cjs +1 -0
  84. package/lib/cjs/namespaces/index.cjs.map +1 -1
  85. package/lib/cjs/namespaces/models/credential.model.cjs +115 -0
  86. package/lib/cjs/namespaces/models/credential.model.cjs.map +1 -0
  87. package/lib/cjs/namespaces/models/effective-permission.model.cjs +2 -0
  88. package/lib/cjs/namespaces/models/effective-permission.model.cjs.map +1 -1
  89. package/lib/cjs/namespaces/models/group-membership.model.cjs +2 -0
  90. package/lib/cjs/namespaces/models/group-membership.model.cjs.map +1 -1
  91. package/lib/cjs/namespaces/models/group.model.cjs +2 -0
  92. package/lib/cjs/namespaces/models/group.model.cjs.map +1 -1
  93. package/lib/cjs/namespaces/models/index.cjs +1 -0
  94. package/lib/cjs/namespaces/models/index.cjs.map +1 -1
  95. package/lib/cjs/namespaces/models/inheritance-block.model.cjs +2 -0
  96. package/lib/cjs/namespaces/models/inheritance-block.model.cjs.map +1 -1
  97. package/lib/cjs/namespaces/models/org-unit-closure.model.cjs +2 -0
  98. package/lib/cjs/namespaces/models/org-unit-closure.model.cjs.map +1 -1
  99. package/lib/cjs/namespaces/models/org-unit-membership.model.cjs +2 -0
  100. package/lib/cjs/namespaces/models/org-unit-membership.model.cjs.map +1 -1
  101. package/lib/cjs/namespaces/models/org-unit-profile.model.cjs +2 -0
  102. package/lib/cjs/namespaces/models/org-unit-profile.model.cjs.map +1 -1
  103. package/lib/cjs/namespaces/models/org-unit.model.cjs +2 -0
  104. package/lib/cjs/namespaces/models/org-unit.model.cjs.map +1 -1
  105. package/lib/cjs/namespaces/models/permission.model.cjs +2 -0
  106. package/lib/cjs/namespaces/models/permission.model.cjs.map +1 -1
  107. package/lib/cjs/namespaces/models/principal.model.cjs +2 -0
  108. package/lib/cjs/namespaces/models/principal.model.cjs.map +1 -1
  109. package/lib/cjs/namespaces/models/protected-resource.model.cjs +2 -0
  110. package/lib/cjs/namespaces/models/protected-resource.model.cjs.map +1 -1
  111. package/lib/cjs/namespaces/models/resource-grant.model.cjs +2 -0
  112. package/lib/cjs/namespaces/models/resource-grant.model.cjs.map +1 -1
  113. package/lib/cjs/namespaces/models/role-assignment.model.cjs +2 -0
  114. package/lib/cjs/namespaces/models/role-assignment.model.cjs.map +1 -1
  115. package/lib/cjs/namespaces/models/role-permission.model.cjs +2 -0
  116. package/lib/cjs/namespaces/models/role-permission.model.cjs.map +1 -1
  117. package/lib/cjs/namespaces/models/role.model.cjs +2 -0
  118. package/lib/cjs/namespaces/models/role.model.cjs.map +1 -1
  119. package/lib/cjs/namespaces/models/storage-binding.model.cjs +2 -0
  120. package/lib/cjs/namespaces/models/storage-binding.model.cjs.map +1 -1
  121. package/lib/cjs/namespaces/models/tenant-membership.model.cjs +2 -0
  122. package/lib/cjs/namespaces/models/tenant-membership.model.cjs.map +1 -1
  123. package/lib/cjs/namespaces/models/tenant-profile.model.cjs +2 -0
  124. package/lib/cjs/namespaces/models/tenant-profile.model.cjs.map +1 -1
  125. package/lib/cjs/namespaces/models/tenant.model.cjs +2 -0
  126. package/lib/cjs/namespaces/models/tenant.model.cjs.map +1 -1
  127. package/lib/cjs/namespaces/models/user.model.cjs +2 -0
  128. package/lib/cjs/namespaces/models/user.model.cjs.map +1 -1
  129. package/lib/cjs/namespaces/rls/index.cjs +28 -0
  130. package/lib/cjs/namespaces/rls/index.cjs.map +1 -0
  131. package/lib/cjs/namespaces/rls/principal-resolver.cjs +66 -0
  132. package/lib/cjs/namespaces/rls/principal-resolver.cjs.map +1 -0
  133. package/lib/cjs/namespaces/rls/rls-bootstrap.service.cjs +269 -0
  134. package/lib/cjs/namespaces/rls/rls-bootstrap.service.cjs.map +1 -0
  135. package/lib/cjs/namespaces/rls/rls.constants.cjs +79 -0
  136. package/lib/cjs/namespaces/rls/rls.constants.cjs.map +1 -0
  137. package/lib/cjs/namespaces/rls/rls.template.cjs +719 -0
  138. package/lib/cjs/namespaces/rls/rls.template.cjs.map +1 -0
  139. package/lib/cjs/namespaces/rls/rls.types.cjs +4 -0
  140. package/lib/cjs/namespaces/rls/rls.types.cjs.map +1 -0
  141. package/lib/cjs/namespaces/rls/session-binding.cjs +70 -0
  142. package/lib/cjs/namespaces/rls/session-binding.cjs.map +1 -0
  143. package/lib/cjs/namespaces/services/credential.service.cjs +327 -0
  144. package/lib/cjs/namespaces/services/credential.service.cjs.map +1 -0
  145. package/lib/cjs/namespaces/services/index.cjs +1 -0
  146. package/lib/cjs/namespaces/services/index.cjs.map +1 -1
  147. package/lib/cjs/namespaces/types.cjs +6 -1
  148. package/lib/cjs/namespaces/types.cjs.map +1 -1
  149. package/lib/cjs/redis/adapter.cjs +7 -1
  150. package/lib/cjs/redis/adapter.cjs.map +1 -1
  151. package/lib/cjs/secrets/InfraCredentialBootstrap.cjs +80 -0
  152. package/lib/cjs/secrets/InfraCredentialBootstrap.cjs.map +1 -0
  153. package/lib/cjs/secrets/aws/AwsSecretService.cjs +2 -15
  154. package/lib/cjs/secrets/aws/AwsSecretService.cjs.map +1 -1
  155. package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs +2 -16
  156. package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs.map +1 -1
  157. package/lib/cjs/secrets/core/SecretReference.cjs +1 -0
  158. package/lib/cjs/secrets/core/SecretReference.cjs.map +1 -1
  159. package/lib/cjs/secrets/fs/FsSecretEnvironment.cjs +28 -0
  160. package/lib/cjs/secrets/fs/FsSecretEnvironment.cjs.map +1 -0
  161. package/lib/cjs/secrets/fs/FsSecretService.cjs +420 -0
  162. package/lib/cjs/secrets/fs/FsSecretService.cjs.map +1 -0
  163. package/lib/cjs/secrets/fs/FsSecretServiceConfig.cjs +25 -0
  164. package/lib/cjs/secrets/fs/FsSecretServiceConfig.cjs.map +1 -0
  165. package/lib/cjs/secrets/fs/index.cjs +27 -0
  166. package/lib/cjs/secrets/fs/index.cjs.map +1 -0
  167. package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs +2 -16
  168. package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs.map +1 -1
  169. package/lib/cjs/secrets/index.cjs +2 -0
  170. package/lib/cjs/secrets/index.cjs.map +1 -1
  171. package/lib/cjs/secrets/model/ModelSecretService.cjs +335 -43
  172. package/lib/cjs/secrets/model/ModelSecretService.cjs.map +1 -1
  173. package/lib/cjs/secrets/model/Secret.cjs +83 -5
  174. package/lib/cjs/secrets/model/Secret.cjs.map +1 -1
  175. package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs +2 -16
  176. package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs.map +1 -1
  177. package/lib/cjs/secrets/vault/VaultSecretService.cjs +2 -16
  178. package/lib/cjs/secrets/vault/VaultSecretService.cjs.map +1 -1
  179. package/lib/cjs/shared/environmentValue.cjs +24 -0
  180. package/lib/cjs/shared/environmentValue.cjs.map +1 -1
  181. package/lib/cjs/shared/http/HttpApiService.cjs +190 -0
  182. package/lib/cjs/shared/http/HttpApiService.cjs.map +1 -0
  183. package/lib/cjs/shared/http/hermeticBoot.cjs +150 -0
  184. package/lib/cjs/shared/http/hermeticBoot.cjs.map +1 -0
  185. package/lib/cjs/shared/http/index.cjs +28 -0
  186. package/lib/cjs/shared/http/index.cjs.map +1 -0
  187. package/lib/esm/blob/azure/AzureBlobStoreService.js +13 -21
  188. package/lib/esm/blob/azure/AzureBlobStoreService.js.map +1 -1
  189. package/lib/esm/blob/core/BlobStoreService.js +26 -25
  190. package/lib/esm/blob/core/BlobStoreService.js.map +1 -1
  191. package/lib/esm/blob/gcp/GcsBlobStoreService.js +13 -21
  192. package/lib/esm/blob/gcp/GcsBlobStoreService.js.map +1 -1
  193. package/lib/esm/blob/s3/S3BlobStoreService.js +12 -14
  194. package/lib/esm/blob/s3/S3BlobStoreService.js.map +1 -1
  195. package/lib/esm/blob/s3/S3CompatibleBlobStoreService.js +14 -16
  196. package/lib/esm/blob/s3/S3CompatibleBlobStoreService.js.map +1 -1
  197. package/lib/esm/comms/email/EmailService.js +338 -0
  198. package/lib/esm/comms/email/EmailService.js.map +1 -0
  199. package/lib/esm/comms/email/index.js +12 -0
  200. package/lib/esm/comms/email/index.js.map +1 -0
  201. package/lib/esm/comms/email/mime.js +218 -0
  202. package/lib/esm/comms/email/mime.js.map +1 -0
  203. package/lib/esm/comms/email/smtp.js +166 -0
  204. package/lib/esm/comms/email/smtp.js.map +1 -0
  205. package/lib/esm/comms/environment.js +59 -0
  206. package/lib/esm/comms/environment.js.map +1 -0
  207. package/lib/esm/comms/gmail/GmailService.js +230 -0
  208. package/lib/esm/comms/gmail/GmailService.js.map +1 -0
  209. package/lib/esm/comms/gmail/index.js +7 -0
  210. package/lib/esm/comms/gmail/index.js.map +1 -0
  211. package/lib/esm/comms/index.js +14 -0
  212. package/lib/esm/comms/index.js.map +1 -0
  213. package/lib/esm/comms/slack/SlackService.js +259 -0
  214. package/lib/esm/comms/slack/SlackService.js.map +1 -0
  215. package/lib/esm/comms/slack/index.js +7 -0
  216. package/lib/esm/comms/slack/index.js.map +1 -0
  217. package/lib/esm/comms/teams/TeamsService.js +204 -0
  218. package/lib/esm/comms/teams/TeamsService.js.map +1 -0
  219. package/lib/esm/comms/teams/index.js +7 -0
  220. package/lib/esm/comms/teams/index.js.map +1 -0
  221. package/lib/esm/comms/telegram/TelegramService.js +191 -0
  222. package/lib/esm/comms/telegram/TelegramService.js.map +1 -0
  223. package/lib/esm/comms/telegram/index.js +7 -0
  224. package/lib/esm/comms/telegram/index.js.map +1 -0
  225. package/lib/esm/devops/environment.js +39 -0
  226. package/lib/esm/devops/environment.js.map +1 -0
  227. package/lib/esm/devops/github/GithubService.js +297 -0
  228. package/lib/esm/devops/github/GithubService.js.map +1 -0
  229. package/lib/esm/devops/github/index.js +7 -0
  230. package/lib/esm/devops/github/index.js.map +1 -0
  231. package/lib/esm/devops/gitlab/GitlabService.js +277 -0
  232. package/lib/esm/devops/gitlab/GitlabService.js.map +1 -0
  233. package/lib/esm/devops/gitlab/index.js +7 -0
  234. package/lib/esm/devops/gitlab/index.js.map +1 -0
  235. package/lib/esm/devops/index.js +11 -0
  236. package/lib/esm/devops/index.js.map +1 -0
  237. package/lib/esm/feature-flags/models/FeatureFlag.model.js +2 -0
  238. package/lib/esm/feature-flags/models/FeatureFlag.model.js.map +1 -1
  239. package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js +2 -0
  240. package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js.map +1 -1
  241. package/lib/esm/index.js +3 -3
  242. package/lib/esm/io/airtable/AirtableService.js +261 -0
  243. package/lib/esm/io/airtable/AirtableService.js.map +1 -0
  244. package/lib/esm/io/airtable/index.js +7 -0
  245. package/lib/esm/io/airtable/index.js.map +1 -0
  246. package/lib/esm/io/environment.js +42 -0
  247. package/lib/esm/io/environment.js.map +1 -0
  248. package/lib/esm/io/google-sheets/GoogleSheetsService.js +283 -0
  249. package/lib/esm/io/google-sheets/GoogleSheetsService.js.map +1 -0
  250. package/lib/esm/io/google-sheets/index.js +7 -0
  251. package/lib/esm/io/google-sheets/index.js.map +1 -0
  252. package/lib/esm/io/graphql/GraphqlService.js +138 -0
  253. package/lib/esm/io/graphql/GraphqlService.js.map +1 -0
  254. package/lib/esm/io/graphql/index.js +7 -0
  255. package/lib/esm/io/graphql/index.js.map +1 -0
  256. package/lib/esm/io/index.js +13 -0
  257. package/lib/esm/io/index.js.map +1 -0
  258. package/lib/esm/io/spreadsheet/SpreadsheetService.js +200 -0
  259. package/lib/esm/io/spreadsheet/SpreadsheetService.js.map +1 -0
  260. package/lib/esm/io/spreadsheet/index.js +8 -0
  261. package/lib/esm/io/spreadsheet/index.js.map +1 -0
  262. package/lib/esm/namespaces/index.js +1 -0
  263. package/lib/esm/namespaces/index.js.map +1 -1
  264. package/lib/esm/namespaces/models/credential.model.js +106 -0
  265. package/lib/esm/namespaces/models/credential.model.js.map +1 -0
  266. package/lib/esm/namespaces/models/effective-permission.model.js +2 -0
  267. package/lib/esm/namespaces/models/effective-permission.model.js.map +1 -1
  268. package/lib/esm/namespaces/models/group-membership.model.js +2 -0
  269. package/lib/esm/namespaces/models/group-membership.model.js.map +1 -1
  270. package/lib/esm/namespaces/models/group.model.js +2 -0
  271. package/lib/esm/namespaces/models/group.model.js.map +1 -1
  272. package/lib/esm/namespaces/models/index.js +1 -0
  273. package/lib/esm/namespaces/models/index.js.map +1 -1
  274. package/lib/esm/namespaces/models/inheritance-block.model.js +2 -0
  275. package/lib/esm/namespaces/models/inheritance-block.model.js.map +1 -1
  276. package/lib/esm/namespaces/models/org-unit-closure.model.js +2 -0
  277. package/lib/esm/namespaces/models/org-unit-closure.model.js.map +1 -1
  278. package/lib/esm/namespaces/models/org-unit-membership.model.js +2 -0
  279. package/lib/esm/namespaces/models/org-unit-membership.model.js.map +1 -1
  280. package/lib/esm/namespaces/models/org-unit-profile.model.js +2 -0
  281. package/lib/esm/namespaces/models/org-unit-profile.model.js.map +1 -1
  282. package/lib/esm/namespaces/models/org-unit.model.js +2 -0
  283. package/lib/esm/namespaces/models/org-unit.model.js.map +1 -1
  284. package/lib/esm/namespaces/models/permission.model.js +2 -0
  285. package/lib/esm/namespaces/models/permission.model.js.map +1 -1
  286. package/lib/esm/namespaces/models/principal.model.js +2 -0
  287. package/lib/esm/namespaces/models/principal.model.js.map +1 -1
  288. package/lib/esm/namespaces/models/protected-resource.model.js +2 -0
  289. package/lib/esm/namespaces/models/protected-resource.model.js.map +1 -1
  290. package/lib/esm/namespaces/models/resource-grant.model.js +2 -0
  291. package/lib/esm/namespaces/models/resource-grant.model.js.map +1 -1
  292. package/lib/esm/namespaces/models/role-assignment.model.js +2 -0
  293. package/lib/esm/namespaces/models/role-assignment.model.js.map +1 -1
  294. package/lib/esm/namespaces/models/role-permission.model.js +2 -0
  295. package/lib/esm/namespaces/models/role-permission.model.js.map +1 -1
  296. package/lib/esm/namespaces/models/role.model.js +2 -0
  297. package/lib/esm/namespaces/models/role.model.js.map +1 -1
  298. package/lib/esm/namespaces/models/storage-binding.model.js +2 -0
  299. package/lib/esm/namespaces/models/storage-binding.model.js.map +1 -1
  300. package/lib/esm/namespaces/models/tenant-membership.model.js +2 -0
  301. package/lib/esm/namespaces/models/tenant-membership.model.js.map +1 -1
  302. package/lib/esm/namespaces/models/tenant-profile.model.js +2 -0
  303. package/lib/esm/namespaces/models/tenant-profile.model.js.map +1 -1
  304. package/lib/esm/namespaces/models/tenant.model.js +2 -0
  305. package/lib/esm/namespaces/models/tenant.model.js.map +1 -1
  306. package/lib/esm/namespaces/models/user.model.js +2 -0
  307. package/lib/esm/namespaces/models/user.model.js.map +1 -1
  308. package/lib/esm/namespaces/rls/index.js +11 -0
  309. package/lib/esm/namespaces/rls/index.js.map +1 -0
  310. package/lib/esm/namespaces/rls/principal-resolver.js +61 -0
  311. package/lib/esm/namespaces/rls/principal-resolver.js.map +1 -0
  312. package/lib/esm/namespaces/rls/rls-bootstrap.service.js +261 -0
  313. package/lib/esm/namespaces/rls/rls-bootstrap.service.js.map +1 -0
  314. package/lib/esm/namespaces/rls/rls.constants.js +75 -0
  315. package/lib/esm/namespaces/rls/rls.constants.js.map +1 -0
  316. package/lib/esm/namespaces/rls/rls.template.js +711 -0
  317. package/lib/esm/namespaces/rls/rls.template.js.map +1 -0
  318. package/lib/esm/namespaces/rls/rls.types.js +9 -0
  319. package/lib/esm/namespaces/rls/rls.types.js.map +1 -0
  320. package/lib/esm/namespaces/rls/session-binding.js +65 -0
  321. package/lib/esm/namespaces/rls/session-binding.js.map +1 -0
  322. package/lib/esm/namespaces/services/credential.service.js +322 -0
  323. package/lib/esm/namespaces/services/credential.service.js.map +1 -0
  324. package/lib/esm/namespaces/services/index.js +1 -0
  325. package/lib/esm/namespaces/services/index.js.map +1 -1
  326. package/lib/esm/namespaces/types.js +6 -0
  327. package/lib/esm/namespaces/types.js.map +1 -1
  328. package/lib/esm/redis/adapter.js +7 -1
  329. package/lib/esm/redis/adapter.js.map +1 -1
  330. package/lib/esm/secrets/InfraCredentialBootstrap.js +74 -0
  331. package/lib/esm/secrets/InfraCredentialBootstrap.js.map +1 -0
  332. package/lib/esm/secrets/aws/AwsSecretService.js +3 -13
  333. package/lib/esm/secrets/aws/AwsSecretService.js.map +1 -1
  334. package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js +2 -13
  335. package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js.map +1 -1
  336. package/lib/esm/secrets/core/SecretReference.js +1 -0
  337. package/lib/esm/secrets/core/SecretReference.js.map +1 -1
  338. package/lib/esm/secrets/fs/FsSecretEnvironment.js +24 -0
  339. package/lib/esm/secrets/fs/FsSecretEnvironment.js.map +1 -0
  340. package/lib/esm/secrets/fs/FsSecretService.js +412 -0
  341. package/lib/esm/secrets/fs/FsSecretService.js.map +1 -0
  342. package/lib/esm/secrets/fs/FsSecretServiceConfig.js +21 -0
  343. package/lib/esm/secrets/fs/FsSecretServiceConfig.js.map +1 -0
  344. package/lib/esm/secrets/fs/index.js +10 -0
  345. package/lib/esm/secrets/fs/index.js.map +1 -0
  346. package/lib/esm/secrets/gcp/GcpSecretManagerService.js +2 -13
  347. package/lib/esm/secrets/gcp/GcpSecretManagerService.js.map +1 -1
  348. package/lib/esm/secrets/index.js +2 -0
  349. package/lib/esm/secrets/index.js.map +1 -1
  350. package/lib/esm/secrets/model/ModelSecretService.js +337 -42
  351. package/lib/esm/secrets/model/ModelSecretService.js.map +1 -1
  352. package/lib/esm/secrets/model/Secret.js +86 -7
  353. package/lib/esm/secrets/model/Secret.js.map +1 -1
  354. package/lib/esm/secrets/onepassword/OnePasswordSecretService.js +2 -13
  355. package/lib/esm/secrets/onepassword/OnePasswordSecretService.js.map +1 -1
  356. package/lib/esm/secrets/vault/VaultSecretService.js +2 -13
  357. package/lib/esm/secrets/vault/VaultSecretService.js.map +1 -1
  358. package/lib/esm/shared/environmentValue.js +24 -0
  359. package/lib/esm/shared/environmentValue.js.map +1 -1
  360. package/lib/esm/shared/http/HttpApiService.js +181 -0
  361. package/lib/esm/shared/http/HttpApiService.js.map +1 -0
  362. package/lib/esm/shared/http/hermeticBoot.js +146 -0
  363. package/lib/esm/shared/http/hermeticBoot.js.map +1 -0
  364. package/lib/esm/shared/http/index.js +11 -0
  365. package/lib/esm/shared/http/index.js.map +1 -0
  366. package/lib/types/blob/azure/AzureBlobStoreService.d.cts +7 -7
  367. package/lib/types/blob/azure/AzureBlobStoreService.d.mts +7 -7
  368. package/lib/types/blob/core/BlobStoreService.d.cts +28 -27
  369. package/lib/types/blob/core/BlobStoreService.d.mts +28 -27
  370. package/lib/types/blob/gcp/GcsBlobStoreService.d.cts +7 -7
  371. package/lib/types/blob/gcp/GcsBlobStoreService.d.mts +7 -7
  372. package/lib/types/blob/s3/S3BlobStoreService.d.cts +9 -1
  373. package/lib/types/blob/s3/S3BlobStoreService.d.mts +9 -1
  374. package/lib/types/blob/s3/S3CompatibleBlobStoreService.d.cts +11 -15
  375. package/lib/types/blob/s3/S3CompatibleBlobStoreService.d.mts +11 -15
  376. package/lib/types/comms/email/EmailService.d.cts +184 -0
  377. package/lib/types/comms/email/EmailService.d.mts +184 -0
  378. package/lib/types/comms/email/index.d.cts +11 -0
  379. package/lib/types/comms/email/index.d.mts +11 -0
  380. package/lib/types/comms/email/mime.d.cts +84 -0
  381. package/lib/types/comms/email/mime.d.mts +84 -0
  382. package/lib/types/comms/email/smtp.d.cts +107 -0
  383. package/lib/types/comms/email/smtp.d.mts +107 -0
  384. package/lib/types/comms/environment.d.cts +84 -0
  385. package/lib/types/comms/environment.d.mts +84 -0
  386. package/lib/types/comms/gmail/GmailService.d.cts +190 -0
  387. package/lib/types/comms/gmail/GmailService.d.mts +190 -0
  388. package/lib/types/comms/gmail/index.d.cts +6 -0
  389. package/lib/types/comms/gmail/index.d.mts +6 -0
  390. package/lib/types/comms/index.d.cts +13 -0
  391. package/lib/types/comms/index.d.mts +13 -0
  392. package/lib/types/comms/slack/SlackService.d.cts +259 -0
  393. package/lib/types/comms/slack/SlackService.d.mts +259 -0
  394. package/lib/types/comms/slack/index.d.cts +6 -0
  395. package/lib/types/comms/slack/index.d.mts +6 -0
  396. package/lib/types/comms/teams/TeamsService.d.cts +172 -0
  397. package/lib/types/comms/teams/TeamsService.d.mts +172 -0
  398. package/lib/types/comms/teams/index.d.cts +6 -0
  399. package/lib/types/comms/teams/index.d.mts +6 -0
  400. package/lib/types/comms/telegram/TelegramService.d.cts +202 -0
  401. package/lib/types/comms/telegram/TelegramService.d.mts +202 -0
  402. package/lib/types/comms/telegram/index.d.cts +6 -0
  403. package/lib/types/comms/telegram/index.d.mts +6 -0
  404. package/lib/types/devops/environment.d.cts +62 -0
  405. package/lib/types/devops/environment.d.mts +62 -0
  406. package/lib/types/devops/github/GithubService.d.cts +287 -0
  407. package/lib/types/devops/github/GithubService.d.mts +287 -0
  408. package/lib/types/devops/github/index.d.cts +6 -0
  409. package/lib/types/devops/github/index.d.mts +6 -0
  410. package/lib/types/devops/gitlab/GitlabService.d.cts +277 -0
  411. package/lib/types/devops/gitlab/GitlabService.d.mts +277 -0
  412. package/lib/types/devops/gitlab/index.d.cts +6 -0
  413. package/lib/types/devops/gitlab/index.d.mts +6 -0
  414. package/lib/types/devops/index.d.cts +10 -0
  415. package/lib/types/devops/index.d.mts +10 -0
  416. package/lib/types/index.d.cts +2 -2
  417. package/lib/types/index.d.mts +2 -2
  418. package/lib/types/io/airtable/AirtableService.d.cts +268 -0
  419. package/lib/types/io/airtable/AirtableService.d.mts +268 -0
  420. package/lib/types/io/airtable/index.d.cts +6 -0
  421. package/lib/types/io/airtable/index.d.mts +6 -0
  422. package/lib/types/io/environment.d.cts +67 -0
  423. package/lib/types/io/environment.d.mts +67 -0
  424. package/lib/types/io/google-sheets/GoogleSheetsService.d.cts +204 -0
  425. package/lib/types/io/google-sheets/GoogleSheetsService.d.mts +204 -0
  426. package/lib/types/io/google-sheets/index.d.cts +6 -0
  427. package/lib/types/io/google-sheets/index.d.mts +6 -0
  428. package/lib/types/io/graphql/GraphqlService.d.cts +173 -0
  429. package/lib/types/io/graphql/GraphqlService.d.mts +173 -0
  430. package/lib/types/io/graphql/index.d.cts +6 -0
  431. package/lib/types/io/graphql/index.d.mts +6 -0
  432. package/lib/types/io/index.d.cts +12 -0
  433. package/lib/types/io/index.d.mts +12 -0
  434. package/lib/types/io/spreadsheet/SpreadsheetService.d.cts +144 -0
  435. package/lib/types/io/spreadsheet/SpreadsheetService.d.mts +144 -0
  436. package/lib/types/io/spreadsheet/index.d.cts +7 -0
  437. package/lib/types/io/spreadsheet/index.d.mts +7 -0
  438. package/lib/types/namespaces/index.d.cts +1 -0
  439. package/lib/types/namespaces/index.d.mts +1 -0
  440. package/lib/types/namespaces/models/credential.model.d.cts +23 -0
  441. package/lib/types/namespaces/models/credential.model.d.mts +23 -0
  442. package/lib/types/namespaces/models/index.d.cts +1 -0
  443. package/lib/types/namespaces/models/index.d.mts +1 -0
  444. package/lib/types/namespaces/rls/index.d.cts +10 -0
  445. package/lib/types/namespaces/rls/index.d.mts +10 -0
  446. package/lib/types/namespaces/rls/principal-resolver.d.cts +47 -0
  447. package/lib/types/namespaces/rls/principal-resolver.d.mts +47 -0
  448. package/lib/types/namespaces/rls/rls-bootstrap.service.d.cts +157 -0
  449. package/lib/types/namespaces/rls/rls-bootstrap.service.d.mts +157 -0
  450. package/lib/types/namespaces/rls/rls.constants.d.cts +52 -0
  451. package/lib/types/namespaces/rls/rls.constants.d.mts +52 -0
  452. package/lib/types/namespaces/rls/rls.template.d.cts +42 -0
  453. package/lib/types/namespaces/rls/rls.template.d.mts +42 -0
  454. package/lib/types/namespaces/rls/rls.types.d.cts +77 -0
  455. package/lib/types/namespaces/rls/rls.types.d.mts +77 -0
  456. package/lib/types/namespaces/rls/session-binding.d.cts +87 -0
  457. package/lib/types/namespaces/rls/session-binding.d.mts +87 -0
  458. package/lib/types/namespaces/services/credential.service.d.cts +175 -0
  459. package/lib/types/namespaces/services/credential.service.d.mts +175 -0
  460. package/lib/types/namespaces/services/index.d.cts +1 -0
  461. package/lib/types/namespaces/services/index.d.mts +1 -0
  462. package/lib/types/namespaces/types.d.cts +37 -0
  463. package/lib/types/namespaces/types.d.mts +37 -0
  464. package/lib/types/redis/adapter.d.cts +2 -0
  465. package/lib/types/redis/adapter.d.mts +2 -0
  466. package/lib/types/redis/types.d.cts +27 -2
  467. package/lib/types/redis/types.d.mts +27 -2
  468. package/lib/types/secrets/InfraCredentialBootstrap.d.cts +100 -0
  469. package/lib/types/secrets/InfraCredentialBootstrap.d.mts +100 -0
  470. package/lib/types/secrets/core/SecretTypes.d.cts +15 -1
  471. package/lib/types/secrets/core/SecretTypes.d.mts +15 -1
  472. package/lib/types/secrets/fs/FsSecretEnvironment.d.cts +42 -0
  473. package/lib/types/secrets/fs/FsSecretEnvironment.d.mts +42 -0
  474. package/lib/types/secrets/fs/FsSecretService.d.cts +207 -0
  475. package/lib/types/secrets/fs/FsSecretService.d.mts +207 -0
  476. package/lib/types/secrets/fs/FsSecretServiceConfig.d.cts +37 -0
  477. package/lib/types/secrets/fs/FsSecretServiceConfig.d.mts +37 -0
  478. package/lib/types/secrets/fs/index.d.cts +9 -0
  479. package/lib/types/secrets/fs/index.d.mts +9 -0
  480. package/lib/types/secrets/index.d.cts +2 -0
  481. package/lib/types/secrets/index.d.mts +2 -0
  482. package/lib/types/secrets/model/ModelSecretService.d.cts +190 -1
  483. package/lib/types/secrets/model/ModelSecretService.d.mts +190 -1
  484. package/lib/types/secrets/model/Secret.d.cts +44 -3
  485. package/lib/types/secrets/model/Secret.d.mts +44 -3
  486. package/lib/types/shared/environmentValue.d.cts +24 -0
  487. package/lib/types/shared/environmentValue.d.mts +24 -0
  488. package/lib/types/shared/http/HttpApiService.d.cts +193 -0
  489. package/lib/types/shared/http/HttpApiService.d.mts +193 -0
  490. package/lib/types/shared/http/hermeticBoot.d.cts +84 -0
  491. package/lib/types/shared/http/hermeticBoot.d.mts +84 -0
  492. package/lib/types/shared/http/index.d.cts +10 -0
  493. package/lib/types/shared/http/index.d.mts +10 -0
  494. package/package.json +180 -3
  495. package/sql/002_rls.sql +660 -15
  496. package/sql/004_credentials.sql +46 -0
@@ -0,0 +1,711 @@
1
+ /**
2
+ * @module integrations/namespaces/rls/template
3
+ * @summary SQL template for the namespace row-level-security policies.
4
+ * @description Generates the helper functions and enable/force/policy DDL that
5
+ * enforce the reader/writer/admin matrix across the namespace tables and the
6
+ * slice-1 credential/secret records.
7
+ *
8
+ * The template assumes the canonical snake_case schema documented by the
9
+ * `integrations/sql` artifacts. Helper functions are `SECURITY DEFINER` so the
10
+ * authorization lookups bypass RLS and cannot recurse through the policies they
11
+ * implement. Production deployments should own those functions with a role that
12
+ * is allowed to bypass RLS (the database owner, a `BYPASSRLS` role, or the
13
+ * migration role).
14
+ */
15
+ import { InternalError } from "@decaf-ts/db-decorators";
16
+ import { RLS_PROTECTED_TABLES, RLS_SETTINGS } from "./rls.constants.js";
17
+ const FUNCTION_SEARCH_PATH = "SET search_path = public, pg_temp";
18
+ /**
19
+ * @description Helper functions backing the namespace RLS policies.
20
+ * @summary Each function is idempotently created with `CREATE OR REPLACE`.
21
+ * `app_rls_principal_for_subject(text, uuid)` is additionally `SECURITY
22
+ * DEFINER` with `search_path` pinned to `public, pg_temp` and `REVOKE`d from
23
+ * `PUBLIC`: it maps an authenticated subject (and optional tenant) to the
24
+ * single matching principal UUID - or `NULL` when the match is ambiguous or
25
+ * absent - and is consumed by privileged resolvers such as
26
+ * `resolvePrincipalForSubject` from `./principal-resolver`.
27
+ */
28
+ export const RLS_FUNCTION_STATEMENTS = [
29
+ `CREATE OR REPLACE FUNCTION app_rls_principal_id()
30
+ RETURNS uuid
31
+ LANGUAGE sql
32
+ STABLE
33
+ AS $fn$
34
+ SELECT NULLIF(current_setting('${RLS_SETTINGS.Principal}', true), '')::uuid
35
+ $fn$;`,
36
+ `CREATE OR REPLACE FUNCTION app_rls_subject_id()
37
+ RETURNS text
38
+ LANGUAGE sql
39
+ STABLE
40
+ SECURITY DEFINER
41
+ ${FUNCTION_SEARCH_PATH}
42
+ AS $fn$
43
+ SELECT p.subject_id
44
+ FROM principals p
45
+ WHERE p.id = app_rls_principal_id()
46
+ $fn$;`,
47
+ `CREATE OR REPLACE FUNCTION app_rls_principal_for_subject(
48
+ p_subject text,
49
+ p_tenant uuid DEFAULT NULL
50
+ )
51
+ RETURNS uuid
52
+ LANGUAGE sql
53
+ STABLE
54
+ SECURITY DEFINER
55
+ ${FUNCTION_SEARCH_PATH}
56
+ AS $fn$
57
+ SELECT CASE WHEN COUNT(*) = 1 THEN (MIN(p.id::text))::uuid ELSE NULL END
58
+ FROM principals p
59
+ WHERE p.subject_id = NULLIF(p_subject, '')
60
+ AND (p_tenant IS NULL OR p.tenant_id = p_tenant)
61
+ $fn$;`,
62
+ `REVOKE ALL ON FUNCTION app_rls_principal_for_subject(text, uuid) FROM PUBLIC;`,
63
+ `CREATE OR REPLACE FUNCTION app_rls_org_unit_tenant(p_org_unit uuid)
64
+ RETURNS uuid
65
+ LANGUAGE sql
66
+ STABLE
67
+ SECURITY DEFINER
68
+ ${FUNCTION_SEARCH_PATH}
69
+ AS $fn$
70
+ SELECT ou.tenant_id
71
+ FROM org_units ou
72
+ WHERE ou.id = p_org_unit
73
+ $fn$;`,
74
+ `CREATE OR REPLACE FUNCTION app_rls_has_permission(
75
+ p_tenant uuid,
76
+ p_permission text,
77
+ p_scope_kind text,
78
+ p_scope_id text
79
+ )
80
+ RETURNS boolean
81
+ LANGUAGE sql
82
+ STABLE
83
+ SECURITY DEFINER
84
+ ${FUNCTION_SEARCH_PATH}
85
+ AS $fn$
86
+ SELECT EXISTS (
87
+ SELECT 1
88
+ FROM effective_permissions ep
89
+ WHERE ep.tenant_id = p_tenant
90
+ AND ep.principal_id = app_rls_principal_id()
91
+ AND ep.permission_key = p_permission
92
+ AND ep.scope_kind = p_scope_kind
93
+ AND ep.scope_id = p_scope_id
94
+ AND (ep.starts_at IS NULL OR ep.starts_at <= now())
95
+ AND (ep.expires_at IS NULL OR ep.expires_at >= now())
96
+ )
97
+ $fn$;`,
98
+ `CREATE OR REPLACE FUNCTION app_rls_tenant_permission(
99
+ p_tenant uuid,
100
+ p_permission text
101
+ )
102
+ RETURNS boolean
103
+ LANGUAGE sql
104
+ STABLE
105
+ SECURITY DEFINER
106
+ ${FUNCTION_SEARCH_PATH}
107
+ AS $fn$
108
+ SELECT app_rls_has_permission(
109
+ p_tenant,
110
+ p_permission,
111
+ 'tenant',
112
+ p_tenant::text
113
+ )
114
+ $fn$;`,
115
+ `CREATE OR REPLACE FUNCTION app_rls_org_unit_permission(
116
+ p_tenant uuid,
117
+ p_org_unit uuid,
118
+ p_permission text
119
+ )
120
+ RETURNS boolean
121
+ LANGUAGE sql
122
+ STABLE
123
+ SECURITY DEFINER
124
+ ${FUNCTION_SEARCH_PATH}
125
+ AS $fn$
126
+ SELECT app_rls_has_permission(
127
+ p_tenant,
128
+ p_permission,
129
+ 'tenant',
130
+ p_tenant::text
131
+ )
132
+ OR (
133
+ p_org_unit IS NOT NULL
134
+ AND app_rls_has_permission(
135
+ p_tenant,
136
+ p_permission,
137
+ 'org_unit',
138
+ p_org_unit::text
139
+ )
140
+ )
141
+ $fn$;`,
142
+ `CREATE OR REPLACE FUNCTION app_rls_is_tenant_member(p_tenant uuid)
143
+ RETURNS boolean
144
+ LANGUAGE sql
145
+ STABLE
146
+ SECURITY DEFINER
147
+ ${FUNCTION_SEARCH_PATH}
148
+ AS $fn$
149
+ SELECT EXISTS (
150
+ SELECT 1
151
+ FROM tenant_memberships tm
152
+ WHERE tm.tenant_id = p_tenant
153
+ AND tm.status = 'active'
154
+ AND tm.user_id::text = app_rls_subject_id()
155
+ )
156
+ $fn$;`,
157
+ `CREATE OR REPLACE FUNCTION app_rls_is_org_unit_member(
158
+ p_tenant uuid,
159
+ p_org_unit uuid
160
+ )
161
+ RETURNS boolean
162
+ LANGUAGE sql
163
+ STABLE
164
+ SECURITY DEFINER
165
+ ${FUNCTION_SEARCH_PATH}
166
+ AS $fn$
167
+ SELECT EXISTS (
168
+ SELECT 1
169
+ FROM org_unit_memberships m
170
+ WHERE m.tenant_id = p_tenant
171
+ AND m.org_unit_id = p_org_unit
172
+ AND m.status = 'active'
173
+ AND m.user_id::text = app_rls_subject_id()
174
+ )
175
+ $fn$;`,
176
+ `CREATE OR REPLACE FUNCTION app_rls_can_read_tenant(p_tenant uuid)
177
+ RETURNS boolean
178
+ LANGUAGE sql
179
+ STABLE
180
+ SECURITY DEFINER
181
+ ${FUNCTION_SEARCH_PATH}
182
+ AS $fn$
183
+ SELECT app_rls_tenant_permission(p_tenant, 'namespace.admin')
184
+ OR app_rls_tenant_permission(p_tenant, 'namespace.write')
185
+ OR app_rls_tenant_permission(p_tenant, 'namespace.read')
186
+ $fn$;`,
187
+ `CREATE OR REPLACE FUNCTION app_rls_can_write_tenant(p_tenant uuid)
188
+ RETURNS boolean
189
+ LANGUAGE sql
190
+ STABLE
191
+ SECURITY DEFINER
192
+ ${FUNCTION_SEARCH_PATH}
193
+ AS $fn$
194
+ SELECT app_rls_tenant_permission(p_tenant, 'namespace.admin')
195
+ OR app_rls_tenant_permission(p_tenant, 'namespace.write')
196
+ $fn$;`,
197
+ `CREATE OR REPLACE FUNCTION app_rls_can_read_org_unit(
198
+ p_tenant uuid,
199
+ p_org_unit uuid
200
+ )
201
+ RETURNS boolean
202
+ LANGUAGE sql
203
+ STABLE
204
+ SECURITY DEFINER
205
+ ${FUNCTION_SEARCH_PATH}
206
+ AS $fn$
207
+ SELECT app_rls_can_read_tenant(p_tenant)
208
+ OR app_rls_org_unit_permission(p_tenant, p_org_unit, 'namespace.admin')
209
+ OR app_rls_org_unit_permission(p_tenant, p_org_unit, 'namespace.write')
210
+ OR app_rls_org_unit_permission(p_tenant, p_org_unit, 'namespace.read')
211
+ OR app_rls_is_org_unit_member(p_tenant, p_org_unit)
212
+ $fn$;`,
213
+ `CREATE OR REPLACE FUNCTION app_rls_can_write_org_unit(
214
+ p_tenant uuid,
215
+ p_org_unit uuid
216
+ )
217
+ RETURNS boolean
218
+ LANGUAGE sql
219
+ STABLE
220
+ SECURITY DEFINER
221
+ ${FUNCTION_SEARCH_PATH}
222
+ AS $fn$
223
+ SELECT app_rls_can_write_tenant(p_tenant)
224
+ OR app_rls_org_unit_permission(p_tenant, p_org_unit, 'namespace.admin')
225
+ OR app_rls_org_unit_permission(p_tenant, p_org_unit, 'namespace.write')
226
+ $fn$;`,
227
+ `CREATE OR REPLACE FUNCTION app_rls_is_admin()
228
+ RETURNS boolean
229
+ LANGUAGE sql
230
+ STABLE
231
+ SECURITY DEFINER
232
+ ${FUNCTION_SEARCH_PATH}
233
+ AS $fn$
234
+ SELECT EXISTS (
235
+ SELECT 1
236
+ FROM effective_permissions ep
237
+ WHERE ep.principal_id = app_rls_principal_id()
238
+ AND ep.permission_key = 'namespace.admin'
239
+ AND (ep.starts_at IS NULL OR ep.starts_at <= now())
240
+ AND (ep.expires_at IS NULL OR ep.expires_at >= now())
241
+ )
242
+ $fn$;`,
243
+ `CREATE OR REPLACE FUNCTION app_rls_is_tenant_admin(p_tenant uuid)
244
+ RETURNS boolean
245
+ LANGUAGE sql
246
+ STABLE
247
+ SECURITY DEFINER
248
+ ${FUNCTION_SEARCH_PATH}
249
+ AS $fn$
250
+ SELECT app_rls_tenant_permission(p_tenant, 'namespace.admin')
251
+ $fn$;`,
252
+ `CREATE OR REPLACE FUNCTION app_rls_is_org_unit_admin(
253
+ p_tenant uuid,
254
+ p_org_unit uuid
255
+ )
256
+ RETURNS boolean
257
+ LANGUAGE sql
258
+ STABLE
259
+ SECURITY DEFINER
260
+ ${FUNCTION_SEARCH_PATH}
261
+ AS $fn$
262
+ SELECT app_rls_is_tenant_admin(p_tenant)
263
+ OR (
264
+ p_org_unit IS NOT NULL
265
+ AND app_rls_org_unit_permission(p_tenant, p_org_unit, 'namespace.admin')
266
+ )
267
+ $fn$;`,
268
+ `CREATE OR REPLACE FUNCTION app_rls_is_scope_admin(
269
+ p_tenant uuid,
270
+ p_scope_kind text,
271
+ p_scope_id text
272
+ )
273
+ RETURNS boolean
274
+ LANGUAGE sql
275
+ STABLE
276
+ SECURITY DEFINER
277
+ ${FUNCTION_SEARCH_PATH}
278
+ AS $fn$
279
+ SELECT CASE
280
+ WHEN p_scope_kind = 'tenant' THEN app_rls_is_tenant_admin(p_tenant)
281
+ WHEN p_scope_kind = 'org_unit' THEN app_rls_is_org_unit_admin(
282
+ p_tenant,
283
+ p_scope_id::uuid
284
+ )
285
+ WHEN p_scope_kind = 'resource' THEN EXISTS (
286
+ SELECT 1
287
+ FROM protected_resources r
288
+ WHERE r.id = p_scope_id::uuid
289
+ AND r.tenant_id = p_tenant
290
+ AND app_rls_is_org_unit_admin(p_tenant, r.org_unit_id)
291
+ )
292
+ ELSE false
293
+ END
294
+ $fn$;`,
295
+ `CREATE OR REPLACE FUNCTION app_rls_can_admin_user(p_user_id uuid)
296
+ RETURNS boolean
297
+ LANGUAGE sql
298
+ STABLE
299
+ SECURITY DEFINER
300
+ ${FUNCTION_SEARCH_PATH}
301
+ AS $fn$
302
+ SELECT EXISTS (
303
+ SELECT 1
304
+ FROM tenant_memberships tm
305
+ WHERE tm.user_id = p_user_id
306
+ AND app_rls_is_tenant_admin(tm.tenant_id)
307
+ )
308
+ $fn$;`,
309
+ `CREATE OR REPLACE FUNCTION app_rls_can_read_group(
310
+ p_tenant uuid,
311
+ p_group uuid
312
+ )
313
+ RETURNS boolean
314
+ LANGUAGE sql
315
+ STABLE
316
+ SECURITY DEFINER
317
+ ${FUNCTION_SEARCH_PATH}
318
+ AS $fn$
319
+ SELECT EXISTS (
320
+ SELECT 1
321
+ FROM groups g
322
+ WHERE g.id = p_group
323
+ AND g.tenant_id = p_tenant
324
+ AND (
325
+ (g.org_unit_id IS NULL AND app_rls_can_read_tenant(p_tenant))
326
+ OR (
327
+ g.org_unit_id IS NOT NULL
328
+ AND app_rls_can_read_org_unit(p_tenant, g.org_unit_id)
329
+ )
330
+ )
331
+ )
332
+ $fn$;`,
333
+ `CREATE OR REPLACE FUNCTION app_rls_can_write_group(
334
+ p_tenant uuid,
335
+ p_group uuid
336
+ )
337
+ RETURNS boolean
338
+ LANGUAGE sql
339
+ STABLE
340
+ SECURITY DEFINER
341
+ ${FUNCTION_SEARCH_PATH}
342
+ AS $fn$
343
+ SELECT EXISTS (
344
+ SELECT 1
345
+ FROM groups g
346
+ WHERE g.id = p_group
347
+ AND g.tenant_id = p_tenant
348
+ AND (
349
+ (g.org_unit_id IS NULL AND app_rls_can_write_tenant(p_tenant))
350
+ OR (
351
+ g.org_unit_id IS NOT NULL
352
+ AND app_rls_can_write_org_unit(p_tenant, g.org_unit_id)
353
+ )
354
+ )
355
+ )
356
+ $fn$;`,
357
+ `CREATE OR REPLACE FUNCTION app_rls_can_read_resource(
358
+ p_tenant uuid,
359
+ p_resource uuid
360
+ )
361
+ RETURNS boolean
362
+ LANGUAGE sql
363
+ STABLE
364
+ SECURITY DEFINER
365
+ ${FUNCTION_SEARCH_PATH}
366
+ AS $fn$
367
+ SELECT EXISTS (
368
+ SELECT 1
369
+ FROM protected_resources r
370
+ WHERE r.id = p_resource
371
+ AND r.tenant_id = p_tenant
372
+ AND (
373
+ r.owner_principal_id = app_rls_principal_id()
374
+ OR app_rls_is_org_unit_admin(p_tenant, r.org_unit_id)
375
+ OR (
376
+ r.visibility = 'tenant'
377
+ AND app_rls_can_read_tenant(p_tenant)
378
+ )
379
+ OR (
380
+ r.visibility IN ('org_unit', 'org_subtree')
381
+ AND app_rls_can_read_org_unit(p_tenant, r.org_unit_id)
382
+ )
383
+ OR EXISTS (
384
+ SELECT 1
385
+ FROM resource_grants g
386
+ WHERE g.resource_id = r.id
387
+ AND g.principal_id = app_rls_principal_id()
388
+ AND g.permission_key IN (
389
+ 'resource.read',
390
+ 'namespace.read',
391
+ 'namespace.write',
392
+ 'namespace.admin'
393
+ )
394
+ AND (g.starts_at IS NULL OR g.starts_at <= now())
395
+ AND (g.expires_at IS NULL OR g.expires_at >= now())
396
+ )
397
+ )
398
+ )
399
+ $fn$;`,
400
+ `CREATE OR REPLACE FUNCTION app_rls_can_write_resource(
401
+ p_tenant uuid,
402
+ p_resource uuid
403
+ )
404
+ RETURNS boolean
405
+ LANGUAGE sql
406
+ STABLE
407
+ SECURITY DEFINER
408
+ ${FUNCTION_SEARCH_PATH}
409
+ AS $fn$
410
+ SELECT EXISTS (
411
+ SELECT 1
412
+ FROM protected_resources r
413
+ WHERE r.id = p_resource
414
+ AND r.tenant_id = p_tenant
415
+ AND (
416
+ app_rls_is_org_unit_admin(p_tenant, r.org_unit_id)
417
+ OR app_rls_can_write_org_unit(p_tenant, r.org_unit_id)
418
+ )
419
+ )
420
+ $fn$;`,
421
+ `CREATE OR REPLACE FUNCTION app_rls_is_role_admin(p_role uuid)
422
+ RETURNS boolean
423
+ LANGUAGE sql
424
+ STABLE
425
+ SECURITY DEFINER
426
+ ${FUNCTION_SEARCH_PATH}
427
+ AS $fn$
428
+ SELECT EXISTS (
429
+ SELECT 1
430
+ FROM roles r
431
+ WHERE r.id = p_role
432
+ AND (
433
+ (r.tenant_id IS NULL AND app_rls_is_admin())
434
+ OR (
435
+ r.tenant_id IS NOT NULL
436
+ AND app_rls_is_tenant_admin(r.tenant_id)
437
+ )
438
+ )
439
+ )
440
+ $fn$;`,
441
+ `CREATE OR REPLACE FUNCTION app_rls_can_read_credential_scope(
442
+ p_tenant uuid,
443
+ p_org_unit uuid
444
+ )
445
+ RETURNS boolean
446
+ LANGUAGE sql
447
+ STABLE
448
+ SECURITY DEFINER
449
+ ${FUNCTION_SEARCH_PATH}
450
+ AS $fn$
451
+ SELECT CASE
452
+ WHEN p_org_unit IS NULL THEN app_rls_can_read_tenant(p_tenant)
453
+ ELSE app_rls_can_read_org_unit(p_tenant, p_org_unit)
454
+ END
455
+ $fn$;`,
456
+ `CREATE OR REPLACE FUNCTION app_rls_can_write_credential_scope(
457
+ p_tenant uuid,
458
+ p_org_unit uuid
459
+ )
460
+ RETURNS boolean
461
+ LANGUAGE sql
462
+ STABLE
463
+ SECURITY DEFINER
464
+ ${FUNCTION_SEARCH_PATH}
465
+ AS $fn$
466
+ SELECT CASE
467
+ WHEN p_org_unit IS NULL THEN app_rls_can_write_tenant(p_tenant)
468
+ ELSE app_rls_can_write_org_unit(p_tenant, p_org_unit)
469
+ END
470
+ $fn$;`,
471
+ ];
472
+ const ADMIN = "app_rls_is_admin()";
473
+ const TENANT_ADMIN = "app_rls_is_tenant_admin(tenant_id)";
474
+ const WRITE_SCOPE = "app_rls_can_write_org_unit(tenant_id, org_unit_id)";
475
+ const CREDENTIAL_READ = "app_rls_can_read_credential_scope(tenant_id, org_unit_id)";
476
+ const CREDENTIAL_WRITE = "app_rls_can_write_credential_scope(tenant_id, org_unit_id)";
477
+ /**
478
+ * @description Canonical reader/writer/admin policy matrix.
479
+ * @summary Administrative tables (permissions, roles, role assignments,
480
+ * inheritance blocks, storage bindings) are visible only to admins. Content
481
+ * tables are visible to readers and writable by writers. Users always see their
482
+ * own identity rows and their own credentials/secrets.
483
+ */
484
+ export const NAMESPACE_RLS_POLICY_SETS = [
485
+ {
486
+ table: "tenants",
487
+ select: "app_rls_is_tenant_member(id) OR app_rls_can_read_tenant(id)",
488
+ insert: ADMIN,
489
+ update: "app_rls_is_tenant_admin(id)",
490
+ delete: "app_rls_is_tenant_admin(id)",
491
+ },
492
+ {
493
+ table: "org_units",
494
+ select: "app_rls_can_read_org_unit(tenant_id, id) OR (parent_id IS NOT NULL AND app_rls_can_write_org_unit(tenant_id, parent_id))",
495
+ insert: "app_rls_can_write_tenant(tenant_id) OR (parent_id IS NOT NULL AND app_rls_can_write_org_unit(tenant_id, parent_id))",
496
+ update: "app_rls_can_write_org_unit(tenant_id, id) OR (parent_id IS NOT NULL AND app_rls_can_write_org_unit(tenant_id, parent_id))",
497
+ delete: "app_rls_can_write_org_unit(tenant_id, id) OR (parent_id IS NOT NULL AND app_rls_can_write_org_unit(tenant_id, parent_id))",
498
+ },
499
+ {
500
+ table: "org_unit_closure",
501
+ select: "app_rls_can_read_org_unit(tenant_id, descendant_org_unit_id)",
502
+ insert: "app_rls_can_write_org_unit(tenant_id, descendant_org_unit_id)",
503
+ update: "app_rls_can_write_org_unit(tenant_id, descendant_org_unit_id)",
504
+ delete: "app_rls_can_write_org_unit(tenant_id, descendant_org_unit_id)",
505
+ },
506
+ {
507
+ table: "users",
508
+ select: "id::text = app_rls_subject_id() OR app_rls_can_admin_user(id)",
509
+ insert: ADMIN,
510
+ update: "id::text = app_rls_subject_id() OR app_rls_can_admin_user(id)",
511
+ delete: "app_rls_can_admin_user(id)",
512
+ },
513
+ {
514
+ table: "groups",
515
+ select: "app_rls_can_read_group(tenant_id, id)",
516
+ insert: "app_rls_can_write_tenant(tenant_id) OR (org_unit_id IS NOT NULL AND app_rls_can_write_org_unit(tenant_id, org_unit_id))",
517
+ update: "app_rls_can_write_group(tenant_id, id)",
518
+ delete: "app_rls_can_write_group(tenant_id, id)",
519
+ },
520
+ {
521
+ table: "principals",
522
+ select: "id = app_rls_principal_id() OR (kind = 'user' AND subject_id = app_rls_subject_id()) OR app_rls_is_tenant_admin(tenant_id)",
523
+ insert: TENANT_ADMIN,
524
+ update: TENANT_ADMIN,
525
+ delete: TENANT_ADMIN,
526
+ },
527
+ {
528
+ table: "tenant_memberships",
529
+ select: "user_id::text = app_rls_subject_id() OR app_rls_can_read_tenant(tenant_id)",
530
+ insert: TENANT_ADMIN,
531
+ update: TENANT_ADMIN,
532
+ delete: TENANT_ADMIN,
533
+ },
534
+ {
535
+ table: "org_unit_memberships",
536
+ select: "user_id::text = app_rls_subject_id() OR app_rls_org_unit_permission(tenant_id, org_unit_id, 'namespace.admin') OR app_rls_org_unit_permission(tenant_id, org_unit_id, 'namespace.write') OR app_rls_org_unit_permission(tenant_id, org_unit_id, 'namespace.read')",
537
+ insert: WRITE_SCOPE,
538
+ update: WRITE_SCOPE,
539
+ delete: WRITE_SCOPE,
540
+ },
541
+ {
542
+ table: "group_memberships",
543
+ select: "app_rls_can_read_group(tenant_id, group_id)",
544
+ insert: "app_rls_can_write_group(tenant_id, group_id)",
545
+ update: "app_rls_can_write_group(tenant_id, group_id)",
546
+ delete: "app_rls_can_write_group(tenant_id, group_id)",
547
+ },
548
+ {
549
+ table: "permissions",
550
+ select: ADMIN,
551
+ insert: ADMIN,
552
+ update: ADMIN,
553
+ delete: ADMIN,
554
+ },
555
+ {
556
+ table: "roles",
557
+ select: "(tenant_id IS NOT NULL AND app_rls_is_tenant_admin(tenant_id)) OR (tenant_id IS NULL AND app_rls_is_admin())",
558
+ insert: "(tenant_id IS NOT NULL AND app_rls_is_tenant_admin(tenant_id)) OR (tenant_id IS NULL AND app_rls_is_admin())",
559
+ update: "(tenant_id IS NOT NULL AND app_rls_is_tenant_admin(tenant_id)) OR (tenant_id IS NULL AND app_rls_is_admin())",
560
+ delete: "(tenant_id IS NOT NULL AND app_rls_is_tenant_admin(tenant_id)) OR (tenant_id IS NULL AND app_rls_is_admin())",
561
+ },
562
+ {
563
+ table: "role_permissions",
564
+ select: "app_rls_is_role_admin(role_id)",
565
+ insert: "app_rls_is_role_admin(role_id)",
566
+ update: "app_rls_is_role_admin(role_id)",
567
+ delete: "app_rls_is_role_admin(role_id)",
568
+ },
569
+ {
570
+ table: "role_assignments",
571
+ select: "app_rls_is_scope_admin(tenant_id, scope_kind, scope_id)",
572
+ insert: "app_rls_is_scope_admin(tenant_id, scope_kind, scope_id)",
573
+ update: "app_rls_is_scope_admin(tenant_id, scope_kind, scope_id)",
574
+ delete: "app_rls_is_scope_admin(tenant_id, scope_kind, scope_id)",
575
+ },
576
+ {
577
+ table: "inheritance_blocks",
578
+ select: "app_rls_is_org_unit_admin(tenant_id, org_unit_id)",
579
+ insert: "app_rls_is_org_unit_admin(tenant_id, org_unit_id)",
580
+ update: "app_rls_is_org_unit_admin(tenant_id, org_unit_id)",
581
+ delete: "app_rls_is_org_unit_admin(tenant_id, org_unit_id)",
582
+ },
583
+ {
584
+ table: "protected_resources",
585
+ select: "app_rls_can_read_resource(tenant_id, id)",
586
+ insert: "app_rls_can_write_tenant(tenant_id) OR (org_unit_id IS NOT NULL AND app_rls_can_write_org_unit(tenant_id, org_unit_id))",
587
+ update: "app_rls_can_write_resource(tenant_id, id)",
588
+ delete: "app_rls_can_write_resource(tenant_id, id)",
589
+ },
590
+ {
591
+ table: "resource_grants",
592
+ select: "principal_id = app_rls_principal_id() OR app_rls_can_read_resource(tenant_id, resource_id)",
593
+ insert: "app_rls_can_write_resource(tenant_id, resource_id)",
594
+ update: "app_rls_can_write_resource(tenant_id, resource_id)",
595
+ delete: "app_rls_can_write_resource(tenant_id, resource_id)",
596
+ },
597
+ {
598
+ table: "effective_permissions",
599
+ select: "principal_id = app_rls_principal_id() OR app_rls_is_scope_admin(tenant_id, scope_kind, scope_id)",
600
+ insert: "app_rls_is_scope_admin(tenant_id, scope_kind, scope_id)",
601
+ update: "app_rls_is_scope_admin(tenant_id, scope_kind, scope_id)",
602
+ delete: "app_rls_is_scope_admin(tenant_id, scope_kind, scope_id)",
603
+ },
604
+ {
605
+ table: "storage_bindings",
606
+ select: TENANT_ADMIN,
607
+ insert: TENANT_ADMIN,
608
+ update: TENANT_ADMIN,
609
+ delete: TENANT_ADMIN,
610
+ },
611
+ {
612
+ table: "tenant_profiles",
613
+ select: "app_rls_is_tenant_member(tenant_id) OR app_rls_can_read_tenant(tenant_id)",
614
+ insert: TENANT_ADMIN,
615
+ update: TENANT_ADMIN,
616
+ delete: TENANT_ADMIN,
617
+ },
618
+ {
619
+ table: "org_unit_profiles",
620
+ select: "app_rls_can_read_org_unit(app_rls_org_unit_tenant(org_unit_id), org_unit_id)",
621
+ insert: "app_rls_can_write_org_unit(app_rls_org_unit_tenant(org_unit_id), org_unit_id)",
622
+ update: "app_rls_can_write_org_unit(app_rls_org_unit_tenant(org_unit_id), org_unit_id)",
623
+ delete: "app_rls_can_write_org_unit(app_rls_org_unit_tenant(org_unit_id), org_unit_id)",
624
+ },
625
+ {
626
+ table: "credentials",
627
+ select: "owner_principal_id = app_rls_principal_id() OR " + CREDENTIAL_READ,
628
+ insert: CREDENTIAL_WRITE,
629
+ update: CREDENTIAL_WRITE,
630
+ delete: CREDENTIAL_WRITE,
631
+ },
632
+ {
633
+ table: "secrets",
634
+ select: "owner_principal_id = app_rls_principal_id() OR " +
635
+ CREDENTIAL_READ +
636
+ " OR (tenant_id IS NULL AND app_rls_is_admin())",
637
+ insert: CREDENTIAL_WRITE + " OR (tenant_id IS NULL AND app_rls_is_admin())",
638
+ update: CREDENTIAL_WRITE + " OR (tenant_id IS NULL AND app_rls_is_admin())",
639
+ delete: CREDENTIAL_WRITE + " OR (tenant_id IS NULL AND app_rls_is_admin())",
640
+ },
641
+ ];
642
+ /**
643
+ * @description Generates enable/force and policy DDL for a policy set.
644
+ * @summary `DROP POLICY IF EXISTS` makes the output safe to replay on every
645
+ * deployment. Missing command expressions leave that command denied.
646
+ */
647
+ export function rlsPolicyStatements(policySets = NAMESPACE_RLS_POLICY_SETS) {
648
+ const statements = [];
649
+ for (const set of policySets) {
650
+ if (set.enable !== false) {
651
+ statements.push(`ALTER TABLE ${set.table} ENABLE ROW LEVEL SECURITY;`, `ALTER TABLE ${set.table} FORCE ROW LEVEL SECURITY;`);
652
+ }
653
+ const prefix = set.table.replace(/[^A-Za-z0-9_]/g, "_");
654
+ const commands = [
655
+ [
656
+ "select",
657
+ set.select,
658
+ (name, expression) => `CREATE POLICY ${name} ON ${set.table} FOR SELECT USING (${expression});`,
659
+ ],
660
+ [
661
+ "insert",
662
+ set.insert,
663
+ (name, expression) => `CREATE POLICY ${name} ON ${set.table} FOR INSERT WITH CHECK (${expression});`,
664
+ ],
665
+ [
666
+ "update",
667
+ set.update,
668
+ (name, expression) => `CREATE POLICY ${name} ON ${set.table} FOR UPDATE USING (${expression}) WITH CHECK (${expression});`,
669
+ ],
670
+ [
671
+ "delete",
672
+ set.delete,
673
+ (name, expression) => `CREATE POLICY ${name} ON ${set.table} FOR DELETE USING (${expression});`,
674
+ ],
675
+ ];
676
+ for (const [command, expression, render] of commands) {
677
+ if (!expression)
678
+ continue;
679
+ const name = `${prefix}_${command}_policy`;
680
+ statements.push(`DROP POLICY IF EXISTS ${name} ON ${set.table};`, render(name, expression));
681
+ }
682
+ }
683
+ return statements;
684
+ }
685
+ /**
686
+ * @description Full namespace RLS bootstrap statement list.
687
+ * @summary Helper functions followed by enable/force and policy DDL for every
688
+ * table in {@link RLS_PROTECTED_TABLES}. Apply after the namespace schema
689
+ * exists and before request-scoped traffic reaches the database.
690
+ */
691
+ export function rlsBootstrapStatements() {
692
+ return [...RLS_FUNCTION_STATEMENTS, ...rlsPolicyStatements()];
693
+ }
694
+ /**
695
+ * @description Tables targeted by the bundled namespace template.
696
+ */
697
+ export function rlsPolicyTables(policySets = NAMESPACE_RLS_POLICY_SETS) {
698
+ return policySets.map((set) => set.table);
699
+ }
700
+ /**
701
+ * @description Asserts that the bundled policy template covers every protected
702
+ * table. Exposed for deployment checks and unit tests.
703
+ */
704
+ export function assertRlsTableCoverage(policySets = NAMESPACE_RLS_POLICY_SETS) {
705
+ const covered = new Set(rlsPolicyTables(policySets));
706
+ const missing = RLS_PROTECTED_TABLES.filter((table) => !covered.has(table));
707
+ if (missing.length) {
708
+ throw new InternalError(`RLS template is missing tables: ${missing.join(", ")}`);
709
+ }
710
+ }
711
+ //# sourceMappingURL=rls.template.js.map