@kaiz11/stack-client 0.0.14

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 (263) hide show
  1. package/LICENSE +32 -0
  2. package/README.md +586 -0
  3. package/dist/accounts/accounts-client.d.ts +188 -0
  4. package/dist/accounts/accounts-client.d.ts.map +1 -0
  5. package/dist/accounts/accounts-client.js +264 -0
  6. package/dist/accounts/accounts-client.js.map +1 -0
  7. package/dist/accounts/index.d.ts +8 -0
  8. package/dist/accounts/index.d.ts.map +1 -0
  9. package/dist/accounts/index.js +8 -0
  10. package/dist/accounts/index.js.map +1 -0
  11. package/dist/accounts/mock-accounts.d.ts +90 -0
  12. package/dist/accounts/mock-accounts.d.ts.map +1 -0
  13. package/dist/accounts/mock-accounts.js +434 -0
  14. package/dist/accounts/mock-accounts.js.map +1 -0
  15. package/dist/accounts/types.d.ts +180 -0
  16. package/dist/accounts/types.d.ts.map +1 -0
  17. package/dist/accounts/types.js +59 -0
  18. package/dist/accounts/types.js.map +1 -0
  19. package/dist/auth/auth-client.d.ts +224 -0
  20. package/dist/auth/auth-client.d.ts.map +1 -0
  21. package/dist/auth/auth-client.js +230 -0
  22. package/dist/auth/auth-client.js.map +1 -0
  23. package/dist/auth/base-auth.d.ts +44 -0
  24. package/dist/auth/base-auth.d.ts.map +1 -0
  25. package/dist/auth/base-auth.js +55 -0
  26. package/dist/auth/base-auth.js.map +1 -0
  27. package/dist/auth/index.d.ts +11 -0
  28. package/dist/auth/index.d.ts.map +1 -0
  29. package/dist/auth/index.js +11 -0
  30. package/dist/auth/index.js.map +1 -0
  31. package/dist/auth/methods/admin.d.ts +59 -0
  32. package/dist/auth/methods/admin.d.ts.map +1 -0
  33. package/dist/auth/methods/admin.js +55 -0
  34. package/dist/auth/methods/admin.js.map +1 -0
  35. package/dist/auth/methods/index.d.ts +9 -0
  36. package/dist/auth/methods/index.d.ts.map +1 -0
  37. package/dist/auth/methods/index.js +8 -0
  38. package/dist/auth/methods/index.js.map +1 -0
  39. package/dist/auth/methods/magic-link.d.ts +27 -0
  40. package/dist/auth/methods/magic-link.d.ts.map +1 -0
  41. package/dist/auth/methods/magic-link.js +37 -0
  42. package/dist/auth/methods/magic-link.js.map +1 -0
  43. package/dist/auth/methods/mfa.d.ts +92 -0
  44. package/dist/auth/methods/mfa.d.ts.map +1 -0
  45. package/dist/auth/methods/mfa.js +153 -0
  46. package/dist/auth/methods/mfa.js.map +1 -0
  47. package/dist/auth/methods/oauth.d.ts +62 -0
  48. package/dist/auth/methods/oauth.d.ts.map +1 -0
  49. package/dist/auth/methods/oauth.js +165 -0
  50. package/dist/auth/methods/oauth.js.map +1 -0
  51. package/dist/auth/methods/otp.d.ts +43 -0
  52. package/dist/auth/methods/otp.d.ts.map +1 -0
  53. package/dist/auth/methods/otp.js +66 -0
  54. package/dist/auth/methods/otp.js.map +1 -0
  55. package/dist/auth/methods/password.d.ts +64 -0
  56. package/dist/auth/methods/password.d.ts.map +1 -0
  57. package/dist/auth/methods/password.js +116 -0
  58. package/dist/auth/methods/password.js.map +1 -0
  59. package/dist/auth/methods/recovery.d.ts +62 -0
  60. package/dist/auth/methods/recovery.d.ts.map +1 -0
  61. package/dist/auth/methods/recovery.js +100 -0
  62. package/dist/auth/methods/recovery.js.map +1 -0
  63. package/dist/auth/mock-auth.d.ts +135 -0
  64. package/dist/auth/mock-auth.d.ts.map +1 -0
  65. package/dist/auth/mock-auth.js +417 -0
  66. package/dist/auth/mock-auth.js.map +1 -0
  67. package/dist/auth/server/helpers.d.ts +215 -0
  68. package/dist/auth/server/helpers.d.ts.map +1 -0
  69. package/dist/auth/server/helpers.js +241 -0
  70. package/dist/auth/server/helpers.js.map +1 -0
  71. package/dist/auth/server/index.d.ts +24 -0
  72. package/dist/auth/server/index.d.ts.map +1 -0
  73. package/dist/auth/server/index.js +40 -0
  74. package/dist/auth/server/index.js.map +1 -0
  75. package/dist/auth/server/middleware.d.ts +305 -0
  76. package/dist/auth/server/middleware.d.ts.map +1 -0
  77. package/dist/auth/server/middleware.js +405 -0
  78. package/dist/auth/server/middleware.js.map +1 -0
  79. package/dist/auth/server/verify.d.ts +184 -0
  80. package/dist/auth/server/verify.d.ts.map +1 -0
  81. package/dist/auth/server/verify.js +222 -0
  82. package/dist/auth/server/verify.js.map +1 -0
  83. package/dist/auth/token-manager.d.ts +94 -0
  84. package/dist/auth/token-manager.d.ts.map +1 -0
  85. package/dist/auth/token-manager.js +231 -0
  86. package/dist/auth/token-manager.js.map +1 -0
  87. package/dist/auth/types.d.ts +412 -0
  88. package/dist/auth/types.d.ts.map +1 -0
  89. package/dist/auth/types.js +66 -0
  90. package/dist/auth/types.js.map +1 -0
  91. package/dist/auth/user/identities.d.ts +62 -0
  92. package/dist/auth/user/identities.d.ts.map +1 -0
  93. package/dist/auth/user/identities.js +88 -0
  94. package/dist/auth/user/identities.js.map +1 -0
  95. package/dist/auth/user/index.d.ts +4 -0
  96. package/dist/auth/user/index.d.ts.map +1 -0
  97. package/dist/auth/user/index.js +4 -0
  98. package/dist/auth/user/index.js.map +1 -0
  99. package/dist/auth/user/user.d.ts +64 -0
  100. package/dist/auth/user/user.d.ts.map +1 -0
  101. package/dist/auth/user/user.js +105 -0
  102. package/dist/auth/user/user.js.map +1 -0
  103. package/dist/auth/user/verification.d.ts +49 -0
  104. package/dist/auth/user/verification.d.ts.map +1 -0
  105. package/dist/auth/user/verification.js +71 -0
  106. package/dist/auth/user/verification.js.map +1 -0
  107. package/dist/cli/browser.d.ts +11 -0
  108. package/dist/cli/browser.d.ts.map +1 -0
  109. package/dist/cli/browser.js +35 -0
  110. package/dist/cli/browser.js.map +1 -0
  111. package/dist/cli/callback-server.d.ts +30 -0
  112. package/dist/cli/callback-server.d.ts.map +1 -0
  113. package/dist/cli/callback-server.js +100 -0
  114. package/dist/cli/callback-server.js.map +1 -0
  115. package/dist/cli/file-token-store.d.ts +79 -0
  116. package/dist/cli/file-token-store.d.ts.map +1 -0
  117. package/dist/cli/file-token-store.js +138 -0
  118. package/dist/cli/file-token-store.js.map +1 -0
  119. package/dist/cli/index.d.ts +33 -0
  120. package/dist/cli/index.d.ts.map +1 -0
  121. package/dist/cli/index.js +38 -0
  122. package/dist/cli/index.js.map +1 -0
  123. package/dist/cli/oauth.d.ts +67 -0
  124. package/dist/cli/oauth.d.ts.map +1 -0
  125. package/dist/cli/oauth.js +101 -0
  126. package/dist/cli/oauth.js.map +1 -0
  127. package/dist/cli/pkce.d.ts +35 -0
  128. package/dist/cli/pkce.d.ts.map +1 -0
  129. package/dist/cli/pkce.js +43 -0
  130. package/dist/cli/pkce.js.map +1 -0
  131. package/dist/client.d.ts +22 -0
  132. package/dist/client.d.ts.map +1 -0
  133. package/dist/client.js +99 -0
  134. package/dist/client.js.map +1 -0
  135. package/dist/db/client.d.ts +9 -0
  136. package/dist/db/client.d.ts.map +1 -0
  137. package/dist/db/client.js +19 -0
  138. package/dist/db/client.js.map +1 -0
  139. package/dist/db/errors.d.ts +19 -0
  140. package/dist/db/errors.d.ts.map +1 -0
  141. package/dist/db/errors.js +57 -0
  142. package/dist/db/errors.js.map +1 -0
  143. package/dist/db/index.d.ts +7 -0
  144. package/dist/db/index.d.ts.map +1 -0
  145. package/dist/db/index.js +5 -0
  146. package/dist/db/index.js.map +1 -0
  147. package/dist/db/mock.d.ts +28 -0
  148. package/dist/db/mock.d.ts.map +1 -0
  149. package/dist/db/mock.js +459 -0
  150. package/dist/db/mock.js.map +1 -0
  151. package/dist/db/types.d.ts +73 -0
  152. package/dist/db/types.d.ts.map +1 -0
  153. package/dist/db/types.js +2 -0
  154. package/dist/db/types.js.map +1 -0
  155. package/dist/index.d.ts +21 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +20 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/lib/errors.d.ts +33 -0
  160. package/dist/lib/errors.d.ts.map +1 -0
  161. package/dist/lib/errors.js +76 -0
  162. package/dist/lib/errors.js.map +1 -0
  163. package/dist/lib/http.d.ts +81 -0
  164. package/dist/lib/http.d.ts.map +1 -0
  165. package/dist/lib/http.js +163 -0
  166. package/dist/lib/http.js.map +1 -0
  167. package/dist/lib/keys.d.ts +87 -0
  168. package/dist/lib/keys.d.ts.map +1 -0
  169. package/dist/lib/keys.js +147 -0
  170. package/dist/lib/keys.js.map +1 -0
  171. package/dist/lib/paths.d.ts +37 -0
  172. package/dist/lib/paths.d.ts.map +1 -0
  173. package/dist/lib/paths.js +49 -0
  174. package/dist/lib/paths.js.map +1 -0
  175. package/dist/lib/token-store.d.ts +42 -0
  176. package/dist/lib/token-store.d.ts.map +1 -0
  177. package/dist/lib/token-store.js +75 -0
  178. package/dist/lib/token-store.js.map +1 -0
  179. package/dist/mocks/handlers.d.ts +29 -0
  180. package/dist/mocks/handlers.d.ts.map +1 -0
  181. package/dist/mocks/handlers.js +79 -0
  182. package/dist/mocks/handlers.js.map +1 -0
  183. package/dist/mocks/index.d.ts +5 -0
  184. package/dist/mocks/index.d.ts.map +1 -0
  185. package/dist/mocks/index.js +9 -0
  186. package/dist/mocks/index.js.map +1 -0
  187. package/dist/mocks/responses.d.ts +76 -0
  188. package/dist/mocks/responses.d.ts.map +1 -0
  189. package/dist/mocks/responses.js +91 -0
  190. package/dist/mocks/responses.js.map +1 -0
  191. package/dist/mocks/server.d.ts +7 -0
  192. package/dist/mocks/server.d.ts.map +1 -0
  193. package/dist/mocks/server.js +9 -0
  194. package/dist/mocks/server.js.map +1 -0
  195. package/dist/mocks/state.d.ts +86 -0
  196. package/dist/mocks/state.d.ts.map +1 -0
  197. package/dist/mocks/state.js +77 -0
  198. package/dist/mocks/state.js.map +1 -0
  199. package/dist/storage/bucket-ref.d.ts +183 -0
  200. package/dist/storage/bucket-ref.d.ts.map +1 -0
  201. package/dist/storage/bucket-ref.js +529 -0
  202. package/dist/storage/bucket-ref.js.map +1 -0
  203. package/dist/storage/errors.d.ts +27 -0
  204. package/dist/storage/errors.d.ts.map +1 -0
  205. package/dist/storage/errors.js +89 -0
  206. package/dist/storage/errors.js.map +1 -0
  207. package/dist/storage/index.d.ts +13 -0
  208. package/dist/storage/index.d.ts.map +1 -0
  209. package/dist/storage/index.js +11 -0
  210. package/dist/storage/index.js.map +1 -0
  211. package/dist/storage/interface.d.ts +245 -0
  212. package/dist/storage/interface.d.ts.map +1 -0
  213. package/dist/storage/interface.js +2 -0
  214. package/dist/storage/interface.js.map +1 -0
  215. package/dist/storage/mock-storage.d.ts +67 -0
  216. package/dist/storage/mock-storage.d.ts.map +1 -0
  217. package/dist/storage/mock-storage.js +478 -0
  218. package/dist/storage/mock-storage.js.map +1 -0
  219. package/dist/storage/policies-client.d.ts +77 -0
  220. package/dist/storage/policies-client.d.ts.map +1 -0
  221. package/dist/storage/policies-client.js +115 -0
  222. package/dist/storage/policies-client.js.map +1 -0
  223. package/dist/storage/policy-templates.d.ts +6 -0
  224. package/dist/storage/policy-templates.d.ts.map +1 -0
  225. package/dist/storage/policy-templates.js +290 -0
  226. package/dist/storage/policy-templates.js.map +1 -0
  227. package/dist/storage/policy-types.d.ts +98 -0
  228. package/dist/storage/policy-types.d.ts.map +1 -0
  229. package/dist/storage/policy-types.js +20 -0
  230. package/dist/storage/policy-types.js.map +1 -0
  231. package/dist/storage/storage-client.d.ts +32 -0
  232. package/dist/storage/storage-client.d.ts.map +1 -0
  233. package/dist/storage/storage-client.js +94 -0
  234. package/dist/storage/storage-client.js.map +1 -0
  235. package/dist/storage/tus-upload.d.ts +56 -0
  236. package/dist/storage/tus-upload.d.ts.map +1 -0
  237. package/dist/storage/tus-upload.js +236 -0
  238. package/dist/storage/tus-upload.js.map +1 -0
  239. package/dist/storage/types.d.ts +335 -0
  240. package/dist/storage/types.d.ts.map +1 -0
  241. package/dist/storage/types.js +39 -0
  242. package/dist/storage/types.js.map +1 -0
  243. package/dist/test/auth/helpers.d.ts +33 -0
  244. package/dist/test/auth/helpers.d.ts.map +1 -0
  245. package/dist/test/auth/helpers.js +80 -0
  246. package/dist/test/auth/helpers.js.map +1 -0
  247. package/dist/test/helpers/jwt.d.ts +61 -0
  248. package/dist/test/helpers/jwt.d.ts.map +1 -0
  249. package/dist/test/helpers/jwt.js +132 -0
  250. package/dist/test/helpers/jwt.js.map +1 -0
  251. package/dist/test/helpers/mailpit.d.ts +61 -0
  252. package/dist/test/helpers/mailpit.d.ts.map +1 -0
  253. package/dist/test/helpers/mailpit.js +107 -0
  254. package/dist/test/helpers/mailpit.js.map +1 -0
  255. package/dist/test/setup.d.ts +2 -0
  256. package/dist/test/setup.d.ts.map +1 -0
  257. package/dist/test/setup.js +17 -0
  258. package/dist/test/setup.js.map +1 -0
  259. package/dist/types.d.ts +96 -0
  260. package/dist/types.d.ts.map +1 -0
  261. package/dist/types.js +5 -0
  262. package/dist/types.js.map +1 -0
  263. package/package.json +78 -0
@@ -0,0 +1,115 @@
1
+ import { normalizePolicy, } from "./policy-types.js";
2
+ import { generatePolicySet } from "./policy-templates.js";
3
+ /**
4
+ * Storage policies client for managing RLS policies on storage.objects
5
+ */
6
+ export class StoragePoliciesClient {
7
+ http;
8
+ tenantId;
9
+ accountId;
10
+ constructor(config) {
11
+ this.http = config.http;
12
+ this.tenantId = config.tenantId;
13
+ this.accountId = config.accountId;
14
+ }
15
+ /**
16
+ * Build path to postgres-meta policies endpoint
17
+ */
18
+ path(endpoint = "") {
19
+ return `/pg/${this.accountId}/${this.tenantId}/policies${endpoint}`;
20
+ }
21
+ /**
22
+ * List all storage policies, optionally filtered by bucket
23
+ */
24
+ async list(bucketId) {
25
+ const response = await this.http.rawRequest(`${this.path()}?included_schemas=storage`, { method: "GET" });
26
+ const data = (await response.json());
27
+ // Filter to only storage.objects policies
28
+ let policies = data
29
+ .filter((p) => p.schema === "storage" && p.table === "objects")
30
+ .map(normalizePolicy);
31
+ // Optionally filter by bucket
32
+ if (bucketId) {
33
+ policies = policies.filter((p) => p.definition?.includes(`bucket_id = '${bucketId}'`) ||
34
+ p.check?.includes(`bucket_id = '${bucketId}'`));
35
+ }
36
+ return policies;
37
+ }
38
+ /**
39
+ * Create a single policy
40
+ */
41
+ async create(policy) {
42
+ const body = {
43
+ name: policy.name.toLowerCase().replace(/\s+/g, "_"),
44
+ schema: "storage",
45
+ table: "objects",
46
+ action: "PERMISSIVE",
47
+ command: policy.command,
48
+ roles: policy.roles,
49
+ };
50
+ // INSERT only allows WITH CHECK, not USING (definition)
51
+ if (policy.command === "INSERT") {
52
+ body.check = policy.check ?? policy.definition;
53
+ }
54
+ else {
55
+ body.definition = policy.definition;
56
+ if (policy.check) {
57
+ body.check = policy.check;
58
+ }
59
+ }
60
+ const response = await this.http.rawRequest(this.path(), {
61
+ method: "POST",
62
+ headers: { "Content-Type": "application/json" },
63
+ body: JSON.stringify(body),
64
+ });
65
+ const data = (await response.json());
66
+ return normalizePolicy(data);
67
+ }
68
+ /**
69
+ * Create multiple policies from a policy set (additive)
70
+ */
71
+ async createSet(bucketId, policies) {
72
+ const created = [];
73
+ if (policies.select) {
74
+ created.push(await this.create(policies.select));
75
+ }
76
+ if (policies.insert) {
77
+ created.push(await this.create(policies.insert));
78
+ }
79
+ if (policies.update) {
80
+ created.push(await this.create(policies.update));
81
+ }
82
+ if (policies.delete) {
83
+ created.push(await this.create(policies.delete));
84
+ }
85
+ return created;
86
+ }
87
+ /**
88
+ * Apply a template (deletes existing bucket policies, creates new ones)
89
+ */
90
+ async applyTemplate(bucketId, template) {
91
+ // Delete existing policies for this bucket
92
+ await this.deleteAll(bucketId);
93
+ // Generate and create new policies
94
+ const policySet = generatePolicySet(bucketId, template);
95
+ return this.createSet(bucketId, policySet);
96
+ }
97
+ /**
98
+ * Delete a policy by ID
99
+ */
100
+ async delete(policyId) {
101
+ await this.http.rawRequest(this.path(`/${policyId}`), {
102
+ method: "DELETE",
103
+ });
104
+ }
105
+ /**
106
+ * Delete all policies for a bucket
107
+ */
108
+ async deleteAll(bucketId) {
109
+ const policies = await this.list(bucketId);
110
+ for (const policy of policies) {
111
+ await this.delete(policy.id);
112
+ }
113
+ }
114
+ }
115
+ //# sourceMappingURL=policies-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies-client.js","sourceRoot":"","sources":["../../src/storage/policies-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { StoragePolicySet } from "./policy-types.js";
2
+ /**
3
+ * Generate policy set for a specific template and bucket
4
+ */
5
+ export declare function generatePolicySet(bucketId: string, template: string): StoragePolicySet;
6
+ //# sourceMappingURL=policy-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-templates.d.ts","sourceRoot":"","sources":["../../src/storage/policy-templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAmBlB"}
@@ -0,0 +1,290 @@
1
+ /**
2
+ * Generate policy set for a specific template and bucket
3
+ */
4
+ export function generatePolicySet(bucketId, template) {
5
+ const prefix = bucketId.replace(/[^a-z0-9_]/gi, "_");
6
+ switch (template) {
7
+ case "ownerOnly":
8
+ return ownerOnlyPolicies(bucketId, prefix);
9
+ case "authenticated":
10
+ return authenticatedPolicies(bucketId, prefix);
11
+ case "publicRead":
12
+ return publicReadPolicies(bucketId, prefix);
13
+ case "uploadOnly":
14
+ return uploadOnlyPolicies(bucketId, prefix);
15
+ case "userFolder":
16
+ return userFolderPolicies(bucketId, prefix);
17
+ case "adminOnly":
18
+ return adminOnlyPolicies(bucketId, prefix);
19
+ default:
20
+ throw new Error(`Unknown policy template: ${template}`);
21
+ }
22
+ }
23
+ /**
24
+ * Template: Owner Only
25
+ *
26
+ * Users can only access files they uploaded (via `owner_id`).
27
+ *
28
+ * Access Matrix:
29
+ * | Role | SELECT | INSERT | UPDATE | DELETE |
30
+ * |---------------|--------|--------|--------|--------|
31
+ * | anon | ❌ | ❌ | ❌ | ❌ |
32
+ * | authenticated | Own | ✅ | Own | Own |
33
+ * | service_role | ✅ | ✅ | ✅ | ✅ |
34
+ *
35
+ * Use case: User profile pictures, personal documents.
36
+ */
37
+ function ownerOnlyPolicies(bucketId, prefix) {
38
+ const bucketCheck = `bucket_id = '${bucketId}'`;
39
+ const ownerCheck = `owner_id = auth.uid()::text`;
40
+ const serviceBypass = `auth.role() = 'service_role'`;
41
+ return {
42
+ select: {
43
+ name: `${prefix}_owner_select`,
44
+ command: "SELECT",
45
+ roles: ["authenticated", "service_role"],
46
+ definition: `${bucketCheck} AND (${ownerCheck} OR ${serviceBypass})`,
47
+ },
48
+ insert: {
49
+ name: `${prefix}_owner_insert`,
50
+ command: "INSERT",
51
+ roles: ["authenticated", "service_role"],
52
+ definition: bucketCheck,
53
+ check: bucketCheck,
54
+ },
55
+ update: {
56
+ name: `${prefix}_owner_update`,
57
+ command: "UPDATE",
58
+ roles: ["authenticated", "service_role"],
59
+ definition: `${bucketCheck} AND (${ownerCheck} OR ${serviceBypass})`,
60
+ },
61
+ delete: {
62
+ name: `${prefix}_owner_delete`,
63
+ command: "DELETE",
64
+ roles: ["authenticated", "service_role"],
65
+ definition: `${bucketCheck} AND (${ownerCheck} OR ${serviceBypass})`,
66
+ },
67
+ };
68
+ }
69
+ /**
70
+ * Template: Authenticated
71
+ *
72
+ * Any logged-in user can access all files in the bucket.
73
+ *
74
+ * Access Matrix:
75
+ * | Role | SELECT | INSERT | UPDATE | DELETE |
76
+ * |---------------|--------|--------|--------|--------|
77
+ * | anon | ❌ | ❌ | ❌ | ❌ |
78
+ * | authenticated | ✅ | ✅ | ✅ | ✅ |
79
+ * | service_role | ✅ | ✅ | ✅ | ✅ |
80
+ *
81
+ * Use case: Team shared folders, workspace documents.
82
+ */
83
+ function authenticatedPolicies(bucketId, prefix) {
84
+ const bucketCheck = `bucket_id = '${bucketId}'`;
85
+ const authCheck = `auth.role() IN ('authenticated', 'service_role')`;
86
+ return {
87
+ select: {
88
+ name: `${prefix}_auth_select`,
89
+ command: "SELECT",
90
+ roles: ["authenticated", "service_role"],
91
+ definition: `${bucketCheck} AND ${authCheck}`,
92
+ },
93
+ insert: {
94
+ name: `${prefix}_auth_insert`,
95
+ command: "INSERT",
96
+ roles: ["authenticated", "service_role"],
97
+ definition: bucketCheck,
98
+ check: bucketCheck,
99
+ },
100
+ update: {
101
+ name: `${prefix}_auth_update`,
102
+ command: "UPDATE",
103
+ roles: ["authenticated", "service_role"],
104
+ definition: `${bucketCheck} AND ${authCheck}`,
105
+ },
106
+ delete: {
107
+ name: `${prefix}_auth_delete`,
108
+ command: "DELETE",
109
+ roles: ["authenticated", "service_role"],
110
+ definition: `${bucketCheck} AND ${authCheck}`,
111
+ },
112
+ };
113
+ }
114
+ /**
115
+ * Template: Public Read
116
+ *
117
+ * Anyone can read files, but only authenticated users can write.
118
+ * Only service_role can update/delete.
119
+ *
120
+ * Access Matrix:
121
+ * | Role | SELECT | INSERT | UPDATE | DELETE |
122
+ * |---------------|--------|--------|--------|--------|
123
+ * | anon | ✅ | ❌ | ❌ | ❌ |
124
+ * | authenticated | ✅ | ✅ | ❌ | ❌ |
125
+ * | service_role | ✅ | ✅ | ✅ | ✅ |
126
+ *
127
+ * Use case: CDN assets, blog images, public marketing content.
128
+ */
129
+ function publicReadPolicies(bucketId, prefix) {
130
+ const bucketCheck = `bucket_id = '${bucketId}'`;
131
+ return {
132
+ select: {
133
+ name: `${prefix}_public_select`,
134
+ command: "SELECT",
135
+ roles: ["anon", "authenticated", "service_role"],
136
+ definition: bucketCheck,
137
+ },
138
+ insert: {
139
+ name: `${prefix}_public_insert`,
140
+ command: "INSERT",
141
+ roles: ["authenticated", "service_role"],
142
+ definition: bucketCheck,
143
+ check: bucketCheck,
144
+ },
145
+ update: {
146
+ name: `${prefix}_public_update`,
147
+ command: "UPDATE",
148
+ roles: ["service_role"],
149
+ definition: bucketCheck,
150
+ },
151
+ delete: {
152
+ name: `${prefix}_public_delete`,
153
+ command: "DELETE",
154
+ roles: ["service_role"],
155
+ definition: bucketCheck,
156
+ },
157
+ };
158
+ }
159
+ /**
160
+ * Template: Upload Only
161
+ *
162
+ * Anyone can upload files, but only service_role can read/delete.
163
+ * Useful for form submissions or anonymous file drops.
164
+ *
165
+ * Access Matrix:
166
+ * | Role | SELECT | INSERT | UPDATE | DELETE |
167
+ * |---------------|--------|--------|--------|--------|
168
+ * | anon | ❌ | ✅ | ❌ | ❌ |
169
+ * | authenticated | ❌ | ✅ | ❌ | ❌ |
170
+ * | service_role | ✅ | ✅ | ❌ | ✅ |
171
+ *
172
+ * Use case: Form submissions, anonymous file inbox.
173
+ */
174
+ function uploadOnlyPolicies(bucketId, prefix) {
175
+ const bucketCheck = `bucket_id = '${bucketId}'`;
176
+ return {
177
+ select: {
178
+ name: `${prefix}_upload_select`,
179
+ command: "SELECT",
180
+ roles: ["service_role"],
181
+ definition: bucketCheck,
182
+ },
183
+ insert: {
184
+ name: `${prefix}_upload_insert`,
185
+ command: "INSERT",
186
+ roles: ["anon", "authenticated", "service_role"],
187
+ definition: bucketCheck,
188
+ check: bucketCheck,
189
+ },
190
+ delete: {
191
+ name: `${prefix}_upload_delete`,
192
+ command: "DELETE",
193
+ roles: ["service_role"],
194
+ definition: bucketCheck,
195
+ },
196
+ };
197
+ }
198
+ /**
199
+ * Template: User Folder
200
+ *
201
+ * Path-based isolation where the first folder must be the user's ID.
202
+ * Files at `/{user_id}/...` are accessible only to that user.
203
+ *
204
+ * Access Matrix:
205
+ * | Role | SELECT | INSERT | UPDATE | DELETE |
206
+ * |---------------|----------|----------|----------|----------|
207
+ * | anon | ❌ | ❌ | ❌ | ❌ |
208
+ * | authenticated | Own path | Own path | Own path | Own path |
209
+ * | service_role | ✅ | ✅ | ✅ | ✅ |
210
+ *
211
+ * Use case: Multi-tenant storage isolation, user-specific directories.
212
+ */
213
+ function userFolderPolicies(bucketId, prefix) {
214
+ const bucketCheck = `bucket_id = '${bucketId}'`;
215
+ const folderCheck = `split_part(name, '/', 1) = auth.uid()::text`;
216
+ const serviceBypass = `auth.role() = 'service_role'`;
217
+ return {
218
+ select: {
219
+ name: `${prefix}_folder_select`,
220
+ command: "SELECT",
221
+ roles: ["authenticated", "service_role"],
222
+ definition: `${bucketCheck} AND (${folderCheck} OR ${serviceBypass})`,
223
+ },
224
+ insert: {
225
+ name: `${prefix}_folder_insert`,
226
+ command: "INSERT",
227
+ roles: ["authenticated", "service_role"],
228
+ definition: `${bucketCheck} AND (${folderCheck} OR ${serviceBypass})`,
229
+ check: `${bucketCheck} AND (${folderCheck} OR ${serviceBypass})`,
230
+ },
231
+ update: {
232
+ name: `${prefix}_folder_update`,
233
+ command: "UPDATE",
234
+ roles: ["authenticated", "service_role"],
235
+ definition: `${bucketCheck} AND (${folderCheck} OR ${serviceBypass})`,
236
+ },
237
+ delete: {
238
+ name: `${prefix}_folder_delete`,
239
+ command: "DELETE",
240
+ roles: ["authenticated", "service_role"],
241
+ definition: `${bucketCheck} AND (${folderCheck} OR ${serviceBypass})`,
242
+ },
243
+ };
244
+ }
245
+ /**
246
+ * Template: Admin Only
247
+ *
248
+ * Only service_role (backend) can access files.
249
+ * No access for anon or authenticated users.
250
+ *
251
+ * Access Matrix:
252
+ * | Role | SELECT | INSERT | UPDATE | DELETE |
253
+ * |---------------|--------|--------|--------|--------|
254
+ * | anon | ❌ | ❌ | ❌ | ❌ |
255
+ * | authenticated | ❌ | ❌ | ❌ | ❌ |
256
+ * | service_role | ✅ | ✅ | ✅ | ✅ |
257
+ *
258
+ * Use case: System files, internal assets, API-generated content.
259
+ */
260
+ function adminOnlyPolicies(bucketId, prefix) {
261
+ const bucketCheck = `bucket_id = '${bucketId}'`;
262
+ return {
263
+ select: {
264
+ name: `${prefix}_admin_select`,
265
+ command: "SELECT",
266
+ roles: ["service_role"],
267
+ definition: bucketCheck,
268
+ },
269
+ insert: {
270
+ name: `${prefix}_admin_insert`,
271
+ command: "INSERT",
272
+ roles: ["service_role"],
273
+ definition: bucketCheck,
274
+ check: bucketCheck,
275
+ },
276
+ update: {
277
+ name: `${prefix}_admin_update`,
278
+ command: "UPDATE",
279
+ roles: ["service_role"],
280
+ definition: bucketCheck,
281
+ },
282
+ delete: {
283
+ name: `${prefix}_admin_delete`,
284
+ command: "DELETE",
285
+ roles: ["service_role"],
286
+ definition: bucketCheck,
287
+ },
288
+ };
289
+ }
290
+ //# sourceMappingURL=policy-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-templates.js","sourceRoot":"","sources":["../../src/storage/policy-templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Policy command (SQL operations)
3
+ */
4
+ export type PolicyCommand = "SELECT" | "INSERT" | "UPDATE" | "DELETE" | "ALL";
5
+ /**
6
+ * Policy action type
7
+ */
8
+ export type PolicyAction = "PERMISSIVE" | "RESTRICTIVE";
9
+ /**
10
+ * Available policy templates for storage buckets.
11
+ *
12
+ * Each template defines access rules for different roles:
13
+ * - `anon`: Unauthenticated users (no JWT or anon key)
14
+ * - `authenticated`: Logged-in users with valid JWT
15
+ * - `service_role`: Backend services with service_role key (bypasses RLS)
16
+ *
17
+ * Note: Basejump account-level access (owner/member) is not handled by these
18
+ * templates. For account-based access, use custom policies with JWT claims
19
+ * like `auth.jwt()->>'account_id'`.
20
+ *
21
+ * ## Template Access Matrix
22
+ *
23
+ * | Template | anon | authenticated | service_role | Notes |
24
+ * |-----------------|------|---------------|--------------|----------------------------------|
25
+ * | `ownerOnly` | ❌ | Own files | ✅ All | Uses `owner_id = auth.uid()` |
26
+ * | `authenticated` | ❌ | ✅ All | ✅ All | Team shared bucket |
27
+ * | `publicRead` | Read | Read + Write | ✅ All | CDN/public assets |
28
+ * | `uploadOnly` | Write| Write | ✅ All | Form submissions, inbox |
29
+ * | `userFolder` | ❌ | Own folder | ✅ All | Path: `/{user_id}/...` |
30
+ * | `adminOnly` | ❌ | ❌ | ✅ All | System/internal files |
31
+ */
32
+ export type PolicyTemplate = "ownerOnly" | "authenticated" | "publicRead" | "uploadOnly" | "userFolder" | "adminOnly";
33
+ /**
34
+ * Input for creating a single policy
35
+ */
36
+ export interface StoragePolicyInput {
37
+ /** Policy name (will be snake_cased) */
38
+ name: string;
39
+ /** SQL command this policy applies to */
40
+ command: PolicyCommand;
41
+ /** Roles this policy applies to */
42
+ roles: string[];
43
+ /** SQL expression for USING clause (SELECT/UPDATE/DELETE) */
44
+ definition: string;
45
+ /** SQL expression for WITH CHECK clause (INSERT/UPDATE) */
46
+ check?: string;
47
+ }
48
+ /**
49
+ * Full policy as returned from API
50
+ */
51
+ export interface StoragePolicy {
52
+ /** Policy ID */
53
+ id: number;
54
+ /** Policy name */
55
+ name: string;
56
+ /** Schema (always "storage" for storage policies) */
57
+ schema: string;
58
+ /** Table (always "objects" for storage policies) */
59
+ table: string;
60
+ /** Policy action */
61
+ action: PolicyAction;
62
+ /** SQL command */
63
+ command: PolicyCommand;
64
+ /** Roles this policy applies to */
65
+ roles: string[];
66
+ /** USING clause expression */
67
+ definition: string | null;
68
+ /** WITH CHECK clause expression */
69
+ check: string | null;
70
+ }
71
+ /**
72
+ * Set of policies for all CRUD operations
73
+ */
74
+ export interface StoragePolicySet {
75
+ select?: StoragePolicyInput;
76
+ insert?: StoragePolicyInput;
77
+ update?: StoragePolicyInput;
78
+ delete?: StoragePolicyInput;
79
+ }
80
+ /**
81
+ * Raw policy from postgres-meta API
82
+ */
83
+ export interface ApiPolicy {
84
+ id: number;
85
+ name: string;
86
+ schema: string;
87
+ table: string;
88
+ action: string;
89
+ command: string;
90
+ roles: string[];
91
+ definition: string | null;
92
+ check: string | null;
93
+ }
94
+ /**
95
+ * Normalize API policy to SDK format
96
+ */
97
+ export declare function normalizePolicy(policy: ApiPolicy): StoragePolicy;
98
+ //# sourceMappingURL=policy-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-types.d.ts","sourceRoot":"","sources":["../../src/storage/policy-types.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE9E;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,aAAa,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,eAAe,GACf,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,WAAW,CAAC;AAEhB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,OAAO,EAAE,aAAa,CAAC;IACvB,mCAAmC;IACnC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gBAAgB;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,kBAAkB;IAClB,OAAO,EAAE,aAAa,CAAC;IACvB,mCAAmC;IACnC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,mCAAmC;IACnC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAMD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,CAYhE"}
@@ -0,0 +1,20 @@
1
+ // ============================================
2
+ // Storage Policy Types
3
+ // ============================================
4
+ /**
5
+ * Normalize API policy to SDK format
6
+ */
7
+ export function normalizePolicy(policy) {
8
+ return {
9
+ id: policy.id,
10
+ name: policy.name,
11
+ schema: policy.schema,
12
+ table: policy.table,
13
+ action: policy.action,
14
+ command: policy.command,
15
+ roles: policy.roles,
16
+ definition: policy.definition,
17
+ check: policy.check,
18
+ };
19
+ }
20
+ //# sourceMappingURL=policy-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-types.js","sourceRoot":"","sources":["../../src/storage/policy-types.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,uBAAuB;AACvB,+CAA+C;AAgH/C;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAsB;QACrC,OAAO,EAAE,MAAM,CAAC,OAAwB;QACxC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { HttpClient } from "../lib/http.js";
2
+ import type { IStorageClient, IBucketRef } from "./interface.js";
3
+ import { type Bucket, type CreateBucketOptions, type UpdateBucketOptions } from "./types.js";
4
+ import { type IStoragePoliciesClient } from "./policies-client.js";
5
+ /**
6
+ * Storage client configuration
7
+ */
8
+ export interface StorageClientConfig {
9
+ http: HttpClient;
10
+ tenantId: string;
11
+ /** Account ID for admin operations (policies, etc.) */
12
+ accountId?: string;
13
+ }
14
+ /**
15
+ * Storage client for bucket and object operations
16
+ */
17
+ export declare class StorageClient implements IStorageClient {
18
+ private readonly http;
19
+ private readonly tenantId;
20
+ /** Policies client (null if accountId not provided) */
21
+ readonly policies: IStoragePoliciesClient | null;
22
+ constructor(config: StorageClientConfig);
23
+ private path;
24
+ listBuckets(): Promise<Bucket[]>;
25
+ getBucket(id: string): Promise<Bucket>;
26
+ createBucket(options: CreateBucketOptions): Promise<Bucket>;
27
+ updateBucket(id: string, options: UpdateBucketOptions): Promise<Bucket>;
28
+ deleteBucket(id: string): Promise<void>;
29
+ emptyBucket(id: string): Promise<void>;
30
+ from(bucketId: string): IBucketRef;
31
+ }
32
+ //# sourceMappingURL=storage-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-client.d.ts","sourceRoot":"","sources":["../../src/storage/storage-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EAEzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAAC;gBAErC,MAAM,EAAE,mBAAmB;IAgBvC,OAAO,CAAC,IAAI;IAIN,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAShC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAStC,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB3D,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC;IAgBZ,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU;CAGnC"}