@selvajs/supabase-provider 0.11.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 (173) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +271 -0
  3. package/dist/auth/SupabaseAuthProvider.d.ts +81 -0
  4. package/dist/auth/SupabaseAuthProvider.d.ts.map +1 -0
  5. package/dist/auth/SupabaseAuthProvider.js +383 -0
  6. package/dist/auth/SupabaseAuthProvider.js.map +1 -0
  7. package/dist/auth/__tests__/conformance.test.d.ts +2 -0
  8. package/dist/auth/__tests__/conformance.test.d.ts.map +1 -0
  9. package/dist/auth/__tests__/conformance.test.js +76 -0
  10. package/dist/auth/__tests__/conformance.test.js.map +1 -0
  11. package/dist/auth/index.d.ts +3 -0
  12. package/dist/auth/index.d.ts.map +1 -0
  13. package/dist/auth/index.js +2 -0
  14. package/dist/auth/index.js.map +1 -0
  15. package/dist/data/SupabaseAuditQuery.d.ts +16 -0
  16. package/dist/data/SupabaseAuditQuery.d.ts.map +1 -0
  17. package/dist/data/SupabaseAuditQuery.js +83 -0
  18. package/dist/data/SupabaseAuditQuery.js.map +1 -0
  19. package/dist/data/SupabaseComputeServerStore.d.ts +26 -0
  20. package/dist/data/SupabaseComputeServerStore.d.ts.map +1 -0
  21. package/dist/data/SupabaseComputeServerStore.js +227 -0
  22. package/dist/data/SupabaseComputeServerStore.js.map +1 -0
  23. package/dist/data/SupabaseDataProvider.d.ts +55 -0
  24. package/dist/data/SupabaseDataProvider.d.ts.map +1 -0
  25. package/dist/data/SupabaseDataProvider.js +114 -0
  26. package/dist/data/SupabaseDataProvider.js.map +1 -0
  27. package/dist/data/SupabaseDefinitionStore.d.ts +39 -0
  28. package/dist/data/SupabaseDefinitionStore.d.ts.map +1 -0
  29. package/dist/data/SupabaseDefinitionStore.js +419 -0
  30. package/dist/data/SupabaseDefinitionStore.js.map +1 -0
  31. package/dist/data/SupabaseEventSink.d.ts +17 -0
  32. package/dist/data/SupabaseEventSink.d.ts.map +1 -0
  33. package/dist/data/SupabaseEventSink.js +31 -0
  34. package/dist/data/SupabaseEventSink.js.map +1 -0
  35. package/dist/data/SupabaseInviteStore.d.ts +22 -0
  36. package/dist/data/SupabaseInviteStore.d.ts.map +1 -0
  37. package/dist/data/SupabaseInviteStore.js +159 -0
  38. package/dist/data/SupabaseInviteStore.js.map +1 -0
  39. package/dist/data/SupabaseOrgStore.d.ts +33 -0
  40. package/dist/data/SupabaseOrgStore.d.ts.map +1 -0
  41. package/dist/data/SupabaseOrgStore.js +455 -0
  42. package/dist/data/SupabaseOrgStore.js.map +1 -0
  43. package/dist/data/SupabaseProjectStore.d.ts +29 -0
  44. package/dist/data/SupabaseProjectStore.d.ts.map +1 -0
  45. package/dist/data/SupabaseProjectStore.js +328 -0
  46. package/dist/data/SupabaseProjectStore.js.map +1 -0
  47. package/dist/data/SupabaseShareLinkStore.d.ts +26 -0
  48. package/dist/data/SupabaseShareLinkStore.d.ts.map +1 -0
  49. package/dist/data/SupabaseShareLinkStore.js +150 -0
  50. package/dist/data/SupabaseShareLinkStore.js.map +1 -0
  51. package/dist/data/__tests__/compute-server-conformance.test.d.ts +2 -0
  52. package/dist/data/__tests__/compute-server-conformance.test.d.ts.map +1 -0
  53. package/dist/data/__tests__/compute-server-conformance.test.js +40 -0
  54. package/dist/data/__tests__/compute-server-conformance.test.js.map +1 -0
  55. package/dist/data/__tests__/definition-conformance.test.d.ts +2 -0
  56. package/dist/data/__tests__/definition-conformance.test.d.ts.map +1 -0
  57. package/dist/data/__tests__/definition-conformance.test.js +85 -0
  58. package/dist/data/__tests__/definition-conformance.test.js.map +1 -0
  59. package/dist/data/__tests__/event-sink-conformance.test.d.ts +2 -0
  60. package/dist/data/__tests__/event-sink-conformance.test.d.ts.map +1 -0
  61. package/dist/data/__tests__/event-sink-conformance.test.js +27 -0
  62. package/dist/data/__tests__/event-sink-conformance.test.js.map +1 -0
  63. package/dist/data/__tests__/invite-conformance.test.d.ts +2 -0
  64. package/dist/data/__tests__/invite-conformance.test.d.ts.map +1 -0
  65. package/dist/data/__tests__/invite-conformance.test.js +45 -0
  66. package/dist/data/__tests__/invite-conformance.test.js.map +1 -0
  67. package/dist/data/__tests__/org-conformance.test.d.ts +2 -0
  68. package/dist/data/__tests__/org-conformance.test.d.ts.map +1 -0
  69. package/dist/data/__tests__/org-conformance.test.js +29 -0
  70. package/dist/data/__tests__/org-conformance.test.js.map +1 -0
  71. package/dist/data/__tests__/project-conformance.test.d.ts +2 -0
  72. package/dist/data/__tests__/project-conformance.test.d.ts.map +1 -0
  73. package/dist/data/__tests__/project-conformance.test.js +57 -0
  74. package/dist/data/__tests__/project-conformance.test.js.map +1 -0
  75. package/dist/data/__tests__/share-link-conformance.test.d.ts +2 -0
  76. package/dist/data/__tests__/share-link-conformance.test.d.ts.map +1 -0
  77. package/dist/data/__tests__/share-link-conformance.test.js +88 -0
  78. package/dist/data/__tests__/share-link-conformance.test.js.map +1 -0
  79. package/dist/data/__tests__/test-helpers.d.ts +53 -0
  80. package/dist/data/__tests__/test-helpers.d.ts.map +1 -0
  81. package/dist/data/__tests__/test-helpers.js +175 -0
  82. package/dist/data/__tests__/test-helpers.js.map +1 -0
  83. package/dist/data/client.d.ts +44 -0
  84. package/dist/data/client.d.ts.map +1 -0
  85. package/dist/data/client.js +40 -0
  86. package/dist/data/client.js.map +1 -0
  87. package/dist/data/index.d.ts +12 -0
  88. package/dist/data/index.d.ts.map +1 -0
  89. package/dist/data/index.js +11 -0
  90. package/dist/data/index.js.map +1 -0
  91. package/dist/data/pagination.d.ts +30 -0
  92. package/dist/data/pagination.d.ts.map +1 -0
  93. package/dist/data/pagination.js +53 -0
  94. package/dist/data/pagination.js.map +1 -0
  95. package/dist/index.d.ts +9 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +6 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/permissions/SupabasePlatformPermissionStore.d.ts +25 -0
  100. package/dist/permissions/SupabasePlatformPermissionStore.d.ts.map +1 -0
  101. package/dist/permissions/SupabasePlatformPermissionStore.js +153 -0
  102. package/dist/permissions/SupabasePlatformPermissionStore.js.map +1 -0
  103. package/dist/permissions/__tests__/conformance.test.d.ts +2 -0
  104. package/dist/permissions/__tests__/conformance.test.d.ts.map +1 -0
  105. package/dist/permissions/__tests__/conformance.test.js +27 -0
  106. package/dist/permissions/__tests__/conformance.test.js.map +1 -0
  107. package/dist/permissions/index.d.ts +2 -0
  108. package/dist/permissions/index.d.ts.map +1 -0
  109. package/dist/permissions/index.js +2 -0
  110. package/dist/permissions/index.js.map +1 -0
  111. package/dist/storage/SupabaseStorageProvider.d.ts +67 -0
  112. package/dist/storage/SupabaseStorageProvider.d.ts.map +1 -0
  113. package/dist/storage/SupabaseStorageProvider.js +136 -0
  114. package/dist/storage/SupabaseStorageProvider.js.map +1 -0
  115. package/dist/storage/__tests__/conformance.test.d.ts +2 -0
  116. package/dist/storage/__tests__/conformance.test.d.ts.map +1 -0
  117. package/dist/storage/__tests__/conformance.test.js +149 -0
  118. package/dist/storage/__tests__/conformance.test.js.map +1 -0
  119. package/dist/storage/index.d.ts +3 -0
  120. package/dist/storage/index.d.ts.map +1 -0
  121. package/dist/storage/index.js +2 -0
  122. package/dist/storage/index.js.map +1 -0
  123. package/dist/userProfile/SupabaseUserProfileProvider.d.ts +16 -0
  124. package/dist/userProfile/SupabaseUserProfileProvider.d.ts.map +1 -0
  125. package/dist/userProfile/SupabaseUserProfileProvider.js +148 -0
  126. package/dist/userProfile/SupabaseUserProfileProvider.js.map +1 -0
  127. package/dist/userProfile/__tests__/conformance.test.d.ts +2 -0
  128. package/dist/userProfile/__tests__/conformance.test.d.ts.map +1 -0
  129. package/dist/userProfile/__tests__/conformance.test.js +38 -0
  130. package/dist/userProfile/__tests__/conformance.test.js.map +1 -0
  131. package/dist/userProfile/index.d.ts +2 -0
  132. package/dist/userProfile/index.d.ts.map +1 -0
  133. package/dist/userProfile/index.js +2 -0
  134. package/dist/userProfile/index.js.map +1 -0
  135. package/package.json +75 -0
  136. package/src/auth/SupabaseAuthProvider.ts +464 -0
  137. package/src/auth/__tests__/conformance.test.ts +78 -0
  138. package/src/auth/index.ts +2 -0
  139. package/src/data/SupabaseAuditQuery.ts +103 -0
  140. package/src/data/SupabaseComputeServerStore.ts +262 -0
  141. package/src/data/SupabaseDataProvider.ts +125 -0
  142. package/src/data/SupabaseDefinitionStore.ts +504 -0
  143. package/src/data/SupabaseEventSink.ts +30 -0
  144. package/src/data/SupabaseInviteStore.ts +183 -0
  145. package/src/data/SupabaseOrgStore.ts +547 -0
  146. package/src/data/SupabaseProjectStore.ts +414 -0
  147. package/src/data/SupabaseShareLinkStore.ts +191 -0
  148. package/src/data/__tests__/compute-server-conformance.test.ts +40 -0
  149. package/src/data/__tests__/definition-conformance.test.ts +89 -0
  150. package/src/data/__tests__/event-sink-conformance.test.ts +32 -0
  151. package/src/data/__tests__/invite-conformance.test.ts +46 -0
  152. package/src/data/__tests__/org-conformance.test.ts +30 -0
  153. package/src/data/__tests__/project-conformance.test.ts +57 -0
  154. package/src/data/__tests__/share-link-conformance.test.ts +87 -0
  155. package/src/data/__tests__/test-helpers.ts +186 -0
  156. package/src/data/client.ts +86 -0
  157. package/src/data/index.ts +11 -0
  158. package/src/data/pagination.ts +68 -0
  159. package/src/index.ts +23 -0
  160. package/src/permissions/SupabasePlatformPermissionStore.ts +161 -0
  161. package/src/permissions/__tests__/conformance.test.ts +28 -0
  162. package/src/permissions/index.ts +1 -0
  163. package/src/storage/SupabaseStorageProvider.ts +177 -0
  164. package/src/storage/__tests__/conformance.test.ts +152 -0
  165. package/src/storage/index.ts +2 -0
  166. package/src/userProfile/SupabaseUserProfileProvider.ts +177 -0
  167. package/src/userProfile/__tests__/conformance.test.ts +39 -0
  168. package/src/userProfile/index.ts +1 -0
  169. package/supabase/.branches/_current_branch +1 -0
  170. package/supabase/.temp/cli-latest +1 -0
  171. package/supabase/config.toml +68 -0
  172. package/supabase/migrations/0001_initial.sql +1084 -0
  173. package/supabase/seed.sql +13 -0
@@ -0,0 +1,227 @@
1
+ import { isOrgServer, isPlatformServer } from '@selvajs/platform';
2
+ import { ProviderError } from '@selvajs/platform';
3
+ /**
4
+ * Compute-server config backed by three tables:
5
+ * - `compute_servers`: one row per server. `scope = 'platform' | 'org'`.
6
+ * Platform rows carry a `shared_with_all` flag + `compute_server_shares`
7
+ * allowlist; org rows carry `owner_org_id`.
8
+ * - `compute_server_shares`: many-to-many for platform servers shared
9
+ * with specific orgs (when `shared_with_all = false`).
10
+ * - `compute_server_org_defaults`: per-org `orgDefaults[orgId]` choice.
11
+ * - `compute_server_platform_default`: single-row sentinel for the global
12
+ * `defaultServerId`.
13
+ *
14
+ * `getConfig` returns the full doc; the visibility predicate is applied by
15
+ * callers (resolver, page loaders) using helpers in `@selvajs/platform`.
16
+ */
17
+ export class SupabaseComputeServerStore {
18
+ clients;
19
+ constructor(clients) {
20
+ this.clients = clients;
21
+ }
22
+ async getConfig(ctx) {
23
+ const client = this.clients.forRequest(ctx);
24
+ const [serversRes, sharesRes, orgDefRes, platDefRes] = await Promise.all([
25
+ client.from('compute_servers').select('*'),
26
+ client.from('compute_server_shares').select('*'),
27
+ client.from('compute_server_org_defaults').select('*'),
28
+ client
29
+ .from('compute_server_platform_default')
30
+ .select('default_server_id')
31
+ .eq('singleton', true)
32
+ .maybeSingle()
33
+ ]);
34
+ if (serversRes.error)
35
+ throw mapError(serversRes.error);
36
+ if (sharesRes.error)
37
+ throw mapError(sharesRes.error);
38
+ if (orgDefRes.error)
39
+ throw mapError(orgDefRes.error);
40
+ if (platDefRes.error)
41
+ throw mapError(platDefRes.error);
42
+ // Build per-server `sharedWith` allowlists from the join table.
43
+ const sharedByServer = new Map();
44
+ for (const row of sharesRes.data ?? []) {
45
+ const list = sharedByServer.get(row.server_id) ?? [];
46
+ list.push(row.org_id);
47
+ sharedByServer.set(row.server_id, list);
48
+ }
49
+ const servers = (serversRes.data ?? []).map((row) => rowToServer(row, sharedByServer));
50
+ const orgDefaults = {};
51
+ for (const row of orgDefRes.data ?? []) {
52
+ if (row.default_server_id)
53
+ orgDefaults[row.org_id] = row.default_server_id;
54
+ }
55
+ return {
56
+ servers,
57
+ defaultServerId: platDefRes.data?.default_server_id ?? undefined,
58
+ orgDefaults
59
+ };
60
+ }
61
+ async savePlatformServers(ctx, servers, defaultServerId) {
62
+ const client = this.clients.forRequest(ctx);
63
+ const platformOnly = servers.filter(isPlatformServer);
64
+ // Replace-all of platform rows.
65
+ const { error: delErr } = await client.from('compute_servers').delete().eq('scope', 'platform');
66
+ if (delErr)
67
+ throw mapError(delErr);
68
+ if (platformOnly.length > 0) {
69
+ const { error: insErr } = await client
70
+ .from('compute_servers')
71
+ .insert(platformOnly.map(serverToRow));
72
+ if (insErr)
73
+ throw mapError(insErr);
74
+ // Rebuild the share rows for any non-`all` platform servers.
75
+ const shareRows = platformOnly.flatMap((s) => s.sharedWith === 'all'
76
+ ? []
77
+ : s.sharedWith.map((orgId) => ({ server_id: s.id, org_id: orgId })));
78
+ if (shareRows.length > 0) {
79
+ const { error: shErr } = await client.from('compute_server_shares').insert(shareRows);
80
+ if (shErr)
81
+ throw mapError(shErr);
82
+ }
83
+ }
84
+ const { error: defErr } = await client
85
+ .from('compute_server_platform_default')
86
+ .update({ default_server_id: defaultServerId ?? null })
87
+ .eq('singleton', true);
88
+ if (defErr)
89
+ throw mapError(defErr);
90
+ }
91
+ async saveOrgServers(ctx, orgId, servers, defaultServerId) {
92
+ const client = this.clients.forRequest(ctx);
93
+ const orgOnly = servers.filter(isOrgServer).map((s) => ({ ...s, ownerOrgId: orgId }));
94
+ const { error: delErr } = await client
95
+ .from('compute_servers')
96
+ .delete()
97
+ .eq('scope', 'org')
98
+ .eq('owner_org_id', orgId);
99
+ if (delErr)
100
+ throw mapError(delErr);
101
+ if (orgOnly.length > 0) {
102
+ const { error: insErr } = await client
103
+ .from('compute_servers')
104
+ .insert(orgOnly.map(serverToRow));
105
+ if (insErr)
106
+ throw mapError(insErr);
107
+ }
108
+ if (defaultServerId === null) {
109
+ const { error } = await client
110
+ .from('compute_server_org_defaults')
111
+ .delete()
112
+ .eq('org_id', orgId);
113
+ if (error)
114
+ throw mapError(error);
115
+ }
116
+ else if (typeof defaultServerId === 'string') {
117
+ const { error } = await client
118
+ .from('compute_server_org_defaults')
119
+ .upsert({ org_id: orgId, default_server_id: defaultServerId });
120
+ if (error)
121
+ throw mapError(error);
122
+ }
123
+ }
124
+ async setOrgDefault(ctx, orgId, serverId) {
125
+ const client = this.clients.forRequest(ctx);
126
+ if (serverId === null) {
127
+ const { error } = await client
128
+ .from('compute_server_org_defaults')
129
+ .delete()
130
+ .eq('org_id', orgId);
131
+ if (error)
132
+ throw mapError(error);
133
+ return;
134
+ }
135
+ const { error } = await client
136
+ .from('compute_server_org_defaults')
137
+ .upsert({ org_id: orgId, default_server_id: serverId });
138
+ if (error)
139
+ throw mapError(error);
140
+ }
141
+ async deleteByOrg(ctx, orgId) {
142
+ const client = this.clients.forRequest(ctx);
143
+ // orgDefaults entry — FK on org_id cascades from orgs(id), but org
144
+ // soft-delete doesn't trigger the cascade, so do it explicitly.
145
+ const { error: defErr } = await client
146
+ .from('compute_server_org_defaults')
147
+ .delete()
148
+ .eq('org_id', orgId);
149
+ if (defErr)
150
+ throw mapError(defErr);
151
+ // Org-private servers owned by this org.
152
+ const { error: srvErr } = await client
153
+ .from('compute_servers')
154
+ .delete()
155
+ .eq('scope', 'org')
156
+ .eq('owner_org_id', orgId);
157
+ if (srvErr)
158
+ throw mapError(srvErr);
159
+ // Strip this org from any platform server share allowlist.
160
+ const { error: shErr } = await client
161
+ .from('compute_server_shares')
162
+ .delete()
163
+ .eq('org_id', orgId);
164
+ if (shErr)
165
+ throw mapError(shErr);
166
+ }
167
+ }
168
+ function rowToServer(row, sharedByServer) {
169
+ const common = {
170
+ id: row.id,
171
+ label: row.label,
172
+ serverUrl: row.server_url,
173
+ apiKey: row.api_key ?? undefined,
174
+ timeoutMs: row.timeout_ms ?? undefined,
175
+ retryCount: row.retry_count ?? undefined
176
+ };
177
+ if (row.scope === 'platform') {
178
+ return {
179
+ ...common,
180
+ scope: 'platform',
181
+ sharedWith: row.shared_with_all ? 'all' : (sharedByServer.get(row.id) ?? [])
182
+ };
183
+ }
184
+ if (!row.owner_org_id) {
185
+ throw new Error(`compute_servers row ${row.id} has scope='org' but null owner_org_id`);
186
+ }
187
+ return { ...common, scope: 'org', ownerOrgId: row.owner_org_id };
188
+ }
189
+ function serverToRow(s) {
190
+ const base = {
191
+ id: s.id,
192
+ label: s.label,
193
+ server_url: s.serverUrl,
194
+ api_key: s.apiKey ?? null,
195
+ timeout_ms: s.timeoutMs ?? null,
196
+ retry_count: s.retryCount ?? null
197
+ };
198
+ if (isPlatformServer(s)) {
199
+ return {
200
+ ...base,
201
+ scope: 'platform',
202
+ owner_org_id: null,
203
+ shared_with_all: s.sharedWith === 'all'
204
+ };
205
+ }
206
+ return {
207
+ ...base,
208
+ scope: 'org',
209
+ owner_org_id: s.ownerOrgId,
210
+ shared_with_all: false
211
+ };
212
+ }
213
+ function mapError(e) {
214
+ const pg = e;
215
+ if (pg?.code === '23505')
216
+ return new ProviderError(pg.message ?? 'Duplicate record', 409);
217
+ if (pg?.code === '23503')
218
+ return new ProviderError(pg.message ?? 'Foreign key violation', 409);
219
+ if (e instanceof Error)
220
+ return e;
221
+ if (e && typeof e === 'object') {
222
+ const obj = e;
223
+ return new Error(obj.code ? `[${obj.code}] ${obj.message ?? ''}` : (obj.message ?? String(e)));
224
+ }
225
+ return new Error(String(e));
226
+ }
227
+ //# sourceMappingURL=SupabaseComputeServerStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SupabaseComputeServerStore.js","sourceRoot":"","sources":["../../src/data/SupabaseComputeServerStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { IDataProvider, IEventSink, IPlatformProjectGrantStore } from '@selvajs/platform';
2
+ import type { ClientBundle, BuildClientOptions } from './client.js';
3
+ import { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
4
+ import { SupabaseOrgStore } from './SupabaseOrgStore.js';
5
+ import { SupabaseProjectStore } from './SupabaseProjectStore.js';
6
+ import { SupabaseDefinitionStore } from './SupabaseDefinitionStore.js';
7
+ import { SupabaseInviteStore } from './SupabaseInviteStore.js';
8
+ import { SupabaseComputeServerStore } from './SupabaseComputeServerStore.js';
9
+ import { SupabaseShareLinkStore } from './SupabaseShareLinkStore.js';
10
+ import { SupabaseUserProfileProvider } from '../userProfile/SupabaseUserProfileProvider.js';
11
+ import { SupabasePlatformPermissionStore } from '../permissions/SupabasePlatformPermissionStore.js';
12
+ /**
13
+ * Composition of every data store for the Supabase backend. Instantiates one
14
+ * `ClientBundle` (service-role + per-request factory) and wires each store
15
+ * against it so every store in a single process shares the same pooled clients.
16
+ */
17
+ export declare class SupabaseDataProvider implements IDataProvider {
18
+ private readonly clients;
19
+ readonly orgs: SupabaseOrgStore;
20
+ readonly projects: SupabaseProjectStore;
21
+ readonly definitions: SupabaseDefinitionStore;
22
+ readonly invites: SupabaseInviteStore;
23
+ readonly computeServer: SupabaseComputeServerStore;
24
+ readonly shareLinks: SupabaseShareLinkStore;
25
+ readonly userProfile: SupabaseUserProfileProvider;
26
+ readonly permissions: SupabasePlatformPermissionStore;
27
+ readonly platformProjectGrants: IPlatformProjectGrantStore;
28
+ readonly auditQuery: SupabaseAuditQuery;
29
+ private constructor();
30
+ static fromEnv(env: Record<string, string | undefined>, events?: IEventSink): SupabaseDataProvider;
31
+ static create(opts: BuildClientOptions, events?: IEventSink): SupabaseDataProvider;
32
+ /**
33
+ * Build from a pre-existing `ClientBundle`. Useful for tests or advanced
34
+ * cases that need to inject a custom event sink or share a bundle externally.
35
+ */
36
+ static fromBundle(bundle: ClientBundle, events?: IEventSink): SupabaseDataProvider;
37
+ /**
38
+ * Expose the underlying bundle so other providers in the same package
39
+ * (storage, user profile, auth) can share one set of clients per process.
40
+ */
41
+ getClientBundle(): ClientBundle;
42
+ /**
43
+ * No-op: `public.user_profiles` is auto-seeded by the `handle_new_auth_user`
44
+ * trigger on every `auth.users` insert (see `0001_initial.sql`). The data
45
+ * layer always has a row for any authenticated user without per-request work.
46
+ */
47
+ ensureUser(): Promise<void>;
48
+ /**
49
+ * No-op: `public.user_profiles.user_id` references `auth.users(id)` with
50
+ * `on delete cascade`. Deleting the auth user removes the profile row
51
+ * automatically.
52
+ */
53
+ onUserDeleted(): Promise<void>;
54
+ }
55
+ //# sourceMappingURL=SupabaseDataProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SupabaseDataProvider.d.ts","sourceRoot":"","sources":["../../src/data/SupabaseDataProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/F,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAC5F,OAAO,EAAE,+BAA+B,EAAE,MAAM,mDAAmD,CAAC;AA0BpG;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IAaxD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZzB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,uBAAuB,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,2BAA2B,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,+BAA+B,CAAC;IACtD,QAAQ,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;IAC3D,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IAExC,OAAO;IAgBP,MAAM,CAAC,OAAO,CACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,MAAM,CAAC,EAAE,UAAU,GACjB,oBAAoB;IAWvB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,oBAAoB;IAKlF;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,oBAAoB;IAIlF;;;OAGG;IACH,eAAe,IAAI,YAAY;IAI/B;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;OAIG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
@@ -0,0 +1,114 @@
1
+ import { ProviderError } from '@selvajs/platform';
2
+ import { buildClientBundle } from './client.js';
3
+ import { SupabaseEventSink } from './SupabaseEventSink.js';
4
+ import { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
5
+ import { SupabaseOrgStore } from './SupabaseOrgStore.js';
6
+ import { SupabaseProjectStore } from './SupabaseProjectStore.js';
7
+ import { SupabaseDefinitionStore } from './SupabaseDefinitionStore.js';
8
+ import { SupabaseInviteStore } from './SupabaseInviteStore.js';
9
+ import { SupabaseComputeServerStore } from './SupabaseComputeServerStore.js';
10
+ import { SupabaseShareLinkStore } from './SupabaseShareLinkStore.js';
11
+ import { SupabaseUserProfileProvider } from '../userProfile/SupabaseUserProfileProvider.js';
12
+ import { SupabasePlatformPermissionStore } from '../permissions/SupabasePlatformPermissionStore.js';
13
+ /**
14
+ * Stub until the Supabase implementation lands. Reads and mutations surface a
15
+ * clear 501; cascade hooks are silent no-ops so deleting an org or project on
16
+ * a Supabase deployment without the feature wired does not blow up.
17
+ */
18
+ const NOT_IMPLEMENTED_MSG = 'Platform projects are not supported on this deployment yet.';
19
+ const notImplementedGrantStore = {
20
+ listByProject: async () => {
21
+ throw new ProviderError(NOT_IMPLEMENTED_MSG, 501);
22
+ },
23
+ create: async () => {
24
+ throw new ProviderError(NOT_IMPLEMENTED_MSG, 501);
25
+ },
26
+ delete: async () => {
27
+ throw new ProviderError(NOT_IMPLEMENTED_MSG, 501);
28
+ },
29
+ deleteByProject: async () => {
30
+ // No-op: nothing to clean up on a deployment that never accepted grants.
31
+ },
32
+ deleteByGranteeOrg: async () => {
33
+ // No-op: same reasoning.
34
+ }
35
+ };
36
+ /**
37
+ * Composition of every data store for the Supabase backend. Instantiates one
38
+ * `ClientBundle` (service-role + per-request factory) and wires each store
39
+ * against it so every store in a single process shares the same pooled clients.
40
+ */
41
+ export class SupabaseDataProvider {
42
+ clients;
43
+ orgs;
44
+ projects;
45
+ definitions;
46
+ invites;
47
+ computeServer;
48
+ shareLinks;
49
+ userProfile;
50
+ permissions;
51
+ platformProjectGrants;
52
+ auditQuery;
53
+ constructor(clients, events) {
54
+ this.clients = clients;
55
+ this.orgs = new SupabaseOrgStore(clients, events);
56
+ this.projects = new SupabaseProjectStore(clients, events);
57
+ this.definitions = new SupabaseDefinitionStore(clients, events);
58
+ this.invites = new SupabaseInviteStore(clients, events);
59
+ this.computeServer = new SupabaseComputeServerStore(clients);
60
+ this.shareLinks = new SupabaseShareLinkStore(clients, events);
61
+ this.userProfile = new SupabaseUserProfileProvider(clients);
62
+ this.permissions = new SupabasePlatformPermissionStore(clients);
63
+ this.platformProjectGrants = notImplementedGrantStore;
64
+ this.auditQuery = new SupabaseAuditQuery(clients);
65
+ }
66
+ static fromEnv(env, events) {
67
+ const supabaseUrl = env.SUPABASE_URL;
68
+ const anonKey = env.SUPABASE_ANON_KEY;
69
+ const serviceRoleKey = env.SUPABASE_SERVICE_ROLE_KEY;
70
+ if (!supabaseUrl)
71
+ throw new Error('Missing required env var: SUPABASE_URL');
72
+ if (!anonKey)
73
+ throw new Error('Missing required env var: SUPABASE_ANON_KEY');
74
+ if (!serviceRoleKey)
75
+ throw new Error('Missing required env var: SUPABASE_SERVICE_ROLE_KEY');
76
+ const bundle = buildClientBundle({ supabaseUrl, anonKey, serviceRoleKey });
77
+ return new SupabaseDataProvider(bundle, events ?? new SupabaseEventSink(bundle));
78
+ }
79
+ static create(opts, events) {
80
+ const bundle = buildClientBundle(opts);
81
+ return new SupabaseDataProvider(bundle, events ?? new SupabaseEventSink(bundle));
82
+ }
83
+ /**
84
+ * Build from a pre-existing `ClientBundle`. Useful for tests or advanced
85
+ * cases that need to inject a custom event sink or share a bundle externally.
86
+ */
87
+ static fromBundle(bundle, events) {
88
+ return new SupabaseDataProvider(bundle, events ?? new SupabaseEventSink(bundle));
89
+ }
90
+ /**
91
+ * Expose the underlying bundle so other providers in the same package
92
+ * (storage, user profile, auth) can share one set of clients per process.
93
+ */
94
+ getClientBundle() {
95
+ return this.clients;
96
+ }
97
+ /**
98
+ * No-op: `public.user_profiles` is auto-seeded by the `handle_new_auth_user`
99
+ * trigger on every `auth.users` insert (see `0001_initial.sql`). The data
100
+ * layer always has a row for any authenticated user without per-request work.
101
+ */
102
+ async ensureUser() {
103
+ // Trigger handles it.
104
+ }
105
+ /**
106
+ * No-op: `public.user_profiles.user_id` references `auth.users(id)` with
107
+ * `on delete cascade`. Deleting the auth user removes the profile row
108
+ * automatically.
109
+ */
110
+ async onUserDeleted() {
111
+ // FK cascade handles it.
112
+ }
113
+ }
114
+ //# sourceMappingURL=SupabaseDataProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SupabaseDataProvider.js","sourceRoot":"","sources":["../../src/data/SupabaseDataProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { IDefinitionStore, IEventSink, DefinitionRecord, DefinitionRecordPatch, DefinitionVersion, RequestContext, DefinitionListOptions, ListOptions, Page } from '@selvajs/platform';
2
+ import type { ClientBundle } from './client.js';
3
+ /**
4
+ * Definition metadata + version store backed by Postgres. Spec §6 versioning:
5
+ * `definitions` carries the parent record and the `live`/`draft` channel
6
+ * pointers; `definition_versions` carries the immutable per-upload rows.
7
+ *
8
+ * Deletion protection (§6) is enforced by FK constraints — `live_version_id`
9
+ * and `draft_version_id` are ON DELETE RESTRICT. Trying to delete a
10
+ * referenced version raises 23503 which `mapError` turns into a 409.
11
+ *
12
+ * `incrementSolveCount` uses a SQL function for atomic UPDATE — no
13
+ * read-modify-write race like the local provider has.
14
+ */
15
+ export declare class SupabaseDefinitionStore implements IDefinitionStore {
16
+ private readonly clients;
17
+ private readonly events;
18
+ constructor(clients: ClientBundle, events?: IEventSink);
19
+ list(ctx: RequestContext, opts?: DefinitionListOptions): Promise<Page<DefinitionRecord>>;
20
+ listByProject(ctx: RequestContext, projectId: string, opts?: DefinitionListOptions): Promise<Page<DefinitionRecord>>;
21
+ listPublic(ctx: RequestContext, opts?: DefinitionListOptions & {
22
+ orgId?: string;
23
+ }): Promise<Page<DefinitionRecord>>;
24
+ private runList;
25
+ get(ctx: RequestContext, guid: string): Promise<DefinitionRecord | null>;
26
+ create(ctx: RequestContext, record: DefinitionRecord): Promise<void>;
27
+ update(ctx: RequestContext, guid: string, patch: DefinitionRecordPatch): Promise<void>;
28
+ delete(ctx: RequestContext, guid: string): Promise<void>;
29
+ incrementSolveCount(ctx: RequestContext, guid: string): Promise<void>;
30
+ createVersion(ctx: RequestContext, version: DefinitionVersion): Promise<void>;
31
+ listVersions(ctx: RequestContext, definitionId: string, opts?: ListOptions): Promise<Page<DefinitionVersion>>;
32
+ getVersion(ctx: RequestContext, versionId: string): Promise<DefinitionVersion | null>;
33
+ deleteVersion(ctx: RequestContext, versionId: string): Promise<void>;
34
+ setLiveVersion(ctx: RequestContext, definitionId: string, versionId: string): Promise<void>;
35
+ setDraftVersion(ctx: RequestContext, definitionId: string, versionId: string): Promise<void>;
36
+ attachInitialVersion(ctx: RequestContext, definitionId: string, versionId: string): Promise<void>;
37
+ private repointChannel;
38
+ }
39
+ //# sourceMappingURL=SupabaseDefinitionStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SupabaseDefinitionStore.d.ts","sourceRoot":"","sources":["../../src/data/SupabaseDefinitionStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,qBAAqB,EAGrB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,WAAW,EACX,IAAI,EACJ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD;;;;;;;;;;;GAWG;AACH,qBAAa,uBAAwB,YAAW,gBAAgB;IAI9D,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;gBAGlB,OAAO,EAAE,YAAY,EACtC,MAAM,GAAE,UAAgC;IASnC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAIxF,aAAa,CAClB,GAAG,EAAE,cAAc,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,qBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAI5B,UAAU,CACf,GAAG,EAAE,cAAc,EACnB,IAAI,CAAC,EAAE,qBAAqB,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/C,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAIpB,OAAO;IAkDf,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAYxE,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpE,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBtF,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBxD,mBAAmB,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASrE,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7E,YAAY,CACjB,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAc7B,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAWrF,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpE,cAAc,CACnB,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAYV,eAAe,CACpB,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAIV,oBAAoB,CACzB,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;YAqCF,cAAc;CA+B5B"}