@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.
- package/LICENSE +21 -0
- package/README.md +271 -0
- package/dist/auth/SupabaseAuthProvider.d.ts +81 -0
- package/dist/auth/SupabaseAuthProvider.d.ts.map +1 -0
- package/dist/auth/SupabaseAuthProvider.js +383 -0
- package/dist/auth/SupabaseAuthProvider.js.map +1 -0
- package/dist/auth/__tests__/conformance.test.d.ts +2 -0
- package/dist/auth/__tests__/conformance.test.d.ts.map +1 -0
- package/dist/auth/__tests__/conformance.test.js +76 -0
- package/dist/auth/__tests__/conformance.test.js.map +1 -0
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/data/SupabaseAuditQuery.d.ts +16 -0
- package/dist/data/SupabaseAuditQuery.d.ts.map +1 -0
- package/dist/data/SupabaseAuditQuery.js +83 -0
- package/dist/data/SupabaseAuditQuery.js.map +1 -0
- package/dist/data/SupabaseComputeServerStore.d.ts +26 -0
- package/dist/data/SupabaseComputeServerStore.d.ts.map +1 -0
- package/dist/data/SupabaseComputeServerStore.js +227 -0
- package/dist/data/SupabaseComputeServerStore.js.map +1 -0
- package/dist/data/SupabaseDataProvider.d.ts +55 -0
- package/dist/data/SupabaseDataProvider.d.ts.map +1 -0
- package/dist/data/SupabaseDataProvider.js +114 -0
- package/dist/data/SupabaseDataProvider.js.map +1 -0
- package/dist/data/SupabaseDefinitionStore.d.ts +39 -0
- package/dist/data/SupabaseDefinitionStore.d.ts.map +1 -0
- package/dist/data/SupabaseDefinitionStore.js +419 -0
- package/dist/data/SupabaseDefinitionStore.js.map +1 -0
- package/dist/data/SupabaseEventSink.d.ts +17 -0
- package/dist/data/SupabaseEventSink.d.ts.map +1 -0
- package/dist/data/SupabaseEventSink.js +31 -0
- package/dist/data/SupabaseEventSink.js.map +1 -0
- package/dist/data/SupabaseInviteStore.d.ts +22 -0
- package/dist/data/SupabaseInviteStore.d.ts.map +1 -0
- package/dist/data/SupabaseInviteStore.js +159 -0
- package/dist/data/SupabaseInviteStore.js.map +1 -0
- package/dist/data/SupabaseOrgStore.d.ts +33 -0
- package/dist/data/SupabaseOrgStore.d.ts.map +1 -0
- package/dist/data/SupabaseOrgStore.js +455 -0
- package/dist/data/SupabaseOrgStore.js.map +1 -0
- package/dist/data/SupabaseProjectStore.d.ts +29 -0
- package/dist/data/SupabaseProjectStore.d.ts.map +1 -0
- package/dist/data/SupabaseProjectStore.js +328 -0
- package/dist/data/SupabaseProjectStore.js.map +1 -0
- package/dist/data/SupabaseShareLinkStore.d.ts +26 -0
- package/dist/data/SupabaseShareLinkStore.d.ts.map +1 -0
- package/dist/data/SupabaseShareLinkStore.js +150 -0
- package/dist/data/SupabaseShareLinkStore.js.map +1 -0
- package/dist/data/__tests__/compute-server-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/compute-server-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/compute-server-conformance.test.js +40 -0
- package/dist/data/__tests__/compute-server-conformance.test.js.map +1 -0
- package/dist/data/__tests__/definition-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/definition-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/definition-conformance.test.js +85 -0
- package/dist/data/__tests__/definition-conformance.test.js.map +1 -0
- package/dist/data/__tests__/event-sink-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/event-sink-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/event-sink-conformance.test.js +27 -0
- package/dist/data/__tests__/event-sink-conformance.test.js.map +1 -0
- package/dist/data/__tests__/invite-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/invite-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/invite-conformance.test.js +45 -0
- package/dist/data/__tests__/invite-conformance.test.js.map +1 -0
- package/dist/data/__tests__/org-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/org-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/org-conformance.test.js +29 -0
- package/dist/data/__tests__/org-conformance.test.js.map +1 -0
- package/dist/data/__tests__/project-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/project-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/project-conformance.test.js +57 -0
- package/dist/data/__tests__/project-conformance.test.js.map +1 -0
- package/dist/data/__tests__/share-link-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/share-link-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/share-link-conformance.test.js +88 -0
- package/dist/data/__tests__/share-link-conformance.test.js.map +1 -0
- package/dist/data/__tests__/test-helpers.d.ts +53 -0
- package/dist/data/__tests__/test-helpers.d.ts.map +1 -0
- package/dist/data/__tests__/test-helpers.js +175 -0
- package/dist/data/__tests__/test-helpers.js.map +1 -0
- package/dist/data/client.d.ts +44 -0
- package/dist/data/client.d.ts.map +1 -0
- package/dist/data/client.js +40 -0
- package/dist/data/client.js.map +1 -0
- package/dist/data/index.d.ts +12 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +11 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/pagination.d.ts +30 -0
- package/dist/data/pagination.d.ts.map +1 -0
- package/dist/data/pagination.js +53 -0
- package/dist/data/pagination.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/permissions/SupabasePlatformPermissionStore.d.ts +25 -0
- package/dist/permissions/SupabasePlatformPermissionStore.d.ts.map +1 -0
- package/dist/permissions/SupabasePlatformPermissionStore.js +153 -0
- package/dist/permissions/SupabasePlatformPermissionStore.js.map +1 -0
- package/dist/permissions/__tests__/conformance.test.d.ts +2 -0
- package/dist/permissions/__tests__/conformance.test.d.ts.map +1 -0
- package/dist/permissions/__tests__/conformance.test.js +27 -0
- package/dist/permissions/__tests__/conformance.test.js.map +1 -0
- package/dist/permissions/index.d.ts +2 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +2 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/storage/SupabaseStorageProvider.d.ts +67 -0
- package/dist/storage/SupabaseStorageProvider.d.ts.map +1 -0
- package/dist/storage/SupabaseStorageProvider.js +136 -0
- package/dist/storage/SupabaseStorageProvider.js.map +1 -0
- package/dist/storage/__tests__/conformance.test.d.ts +2 -0
- package/dist/storage/__tests__/conformance.test.d.ts.map +1 -0
- package/dist/storage/__tests__/conformance.test.js +149 -0
- package/dist/storage/__tests__/conformance.test.js.map +1 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/userProfile/SupabaseUserProfileProvider.d.ts +16 -0
- package/dist/userProfile/SupabaseUserProfileProvider.d.ts.map +1 -0
- package/dist/userProfile/SupabaseUserProfileProvider.js +148 -0
- package/dist/userProfile/SupabaseUserProfileProvider.js.map +1 -0
- package/dist/userProfile/__tests__/conformance.test.d.ts +2 -0
- package/dist/userProfile/__tests__/conformance.test.d.ts.map +1 -0
- package/dist/userProfile/__tests__/conformance.test.js +38 -0
- package/dist/userProfile/__tests__/conformance.test.js.map +1 -0
- package/dist/userProfile/index.d.ts +2 -0
- package/dist/userProfile/index.d.ts.map +1 -0
- package/dist/userProfile/index.js +2 -0
- package/dist/userProfile/index.js.map +1 -0
- package/package.json +75 -0
- package/src/auth/SupabaseAuthProvider.ts +464 -0
- package/src/auth/__tests__/conformance.test.ts +78 -0
- package/src/auth/index.ts +2 -0
- package/src/data/SupabaseAuditQuery.ts +103 -0
- package/src/data/SupabaseComputeServerStore.ts +262 -0
- package/src/data/SupabaseDataProvider.ts +125 -0
- package/src/data/SupabaseDefinitionStore.ts +504 -0
- package/src/data/SupabaseEventSink.ts +30 -0
- package/src/data/SupabaseInviteStore.ts +183 -0
- package/src/data/SupabaseOrgStore.ts +547 -0
- package/src/data/SupabaseProjectStore.ts +414 -0
- package/src/data/SupabaseShareLinkStore.ts +191 -0
- package/src/data/__tests__/compute-server-conformance.test.ts +40 -0
- package/src/data/__tests__/definition-conformance.test.ts +89 -0
- package/src/data/__tests__/event-sink-conformance.test.ts +32 -0
- package/src/data/__tests__/invite-conformance.test.ts +46 -0
- package/src/data/__tests__/org-conformance.test.ts +30 -0
- package/src/data/__tests__/project-conformance.test.ts +57 -0
- package/src/data/__tests__/share-link-conformance.test.ts +87 -0
- package/src/data/__tests__/test-helpers.ts +186 -0
- package/src/data/client.ts +86 -0
- package/src/data/index.ts +11 -0
- package/src/data/pagination.ts +68 -0
- package/src/index.ts +23 -0
- package/src/permissions/SupabasePlatformPermissionStore.ts +161 -0
- package/src/permissions/__tests__/conformance.test.ts +28 -0
- package/src/permissions/index.ts +1 -0
- package/src/storage/SupabaseStorageProvider.ts +177 -0
- package/src/storage/__tests__/conformance.test.ts +152 -0
- package/src/storage/index.ts +2 -0
- package/src/userProfile/SupabaseUserProfileProvider.ts +177 -0
- package/src/userProfile/__tests__/conformance.test.ts +39 -0
- package/src/userProfile/index.ts +1 -0
- package/supabase/.branches/_current_branch +1 -0
- package/supabase/.temp/cli-latest +1 -0
- package/supabase/config.toml +68 -0
- package/supabase/migrations/0001_initial.sql +1084 -0
- package/supabase/seed.sql +13 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SupabaseOrgStore.js","sourceRoot":"","sources":["../../src/data/SupabaseOrgStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { IProjectStore, IEventSink, Project, ProjectMember, ProjectRole, RequestContext, ListOptions, Page } from '@selvajs/platform';
|
|
2
|
+
import type { ClientBundle } from './client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Project + project-membership store backed by Postgres. Visibility semantics
|
|
5
|
+
* (public / org / private) are enforced by the `visible_project()` helper in
|
|
6
|
+
* RLS. Access predicates (canEdit / canManage / canView etc.) live as pure
|
|
7
|
+
* functions in `@selvajs/platform/access`; the route layer composes them with
|
|
8
|
+
* pre-loaded entities. See `packages/selva/src/lib/server/access.server.ts`.
|
|
9
|
+
*
|
|
10
|
+
* `createProject` atomically seeds the creator as the project `owner` in
|
|
11
|
+
* `project_members` so subsequent user-scoped reads can see it.
|
|
12
|
+
*/
|
|
13
|
+
export declare class SupabaseProjectStore implements IProjectStore {
|
|
14
|
+
private readonly clients;
|
|
15
|
+
private readonly events;
|
|
16
|
+
constructor(clients: ClientBundle, events?: IEventSink);
|
|
17
|
+
listProjects(ctx: RequestContext, orgId: string, opts?: ListOptions): Promise<Page<Project>>;
|
|
18
|
+
getProject(ctx: RequestContext, id: string): Promise<Project | null>;
|
|
19
|
+
getProjectBySlug(ctx: RequestContext, orgId: string, slug: string): Promise<Project | null>;
|
|
20
|
+
createProject(ctx: RequestContext, project: Project): Promise<void>;
|
|
21
|
+
updateProject(ctx: RequestContext, id: string, patch: Partial<Pick<Project, 'name' | 'slug' | 'description' | 'visibility' | 'autoJoinOnUpload'>>): Promise<void>;
|
|
22
|
+
deleteProject(ctx: RequestContext, id: string): Promise<void>;
|
|
23
|
+
listProjectMembers(ctx: RequestContext, projectId: string, opts?: ListOptions): Promise<Page<ProjectMember>>;
|
|
24
|
+
getProjectMember(ctx: RequestContext, projectId: string, userId: string): Promise<ProjectMember | null>;
|
|
25
|
+
addProjectMember(ctx: RequestContext, member: ProjectMember): Promise<void>;
|
|
26
|
+
updateProjectMemberRole(ctx: RequestContext, projectId: string, userId: string, role: ProjectRole): Promise<void>;
|
|
27
|
+
removeProjectMember(ctx: RequestContext, projectId: string, userId: string): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=SupabaseProjectStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SupabaseProjectStore.d.ts","sourceRoot":"","sources":["../../src/data/SupabaseProjectStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,aAAa,EACb,UAAU,EACV,OAAO,EACP,aAAa,EACb,WAAW,EACX,cAAc,EACd,WAAW,EACX,IAAI,EACJ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD;;;;;;;;;GASG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IAIxD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;gBAGlB,OAAO,EAAE,YAAY,EACtC,MAAM,GAAE,UAAgC;IAKnC,YAAY,CACjB,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAgBnB,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAYpE,gBAAgB,CACrB,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAapB,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BnE,aAAa,CAClB,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CACb,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,YAAY,GAAG,kBAAkB,CAAC,CAClF,GACC,OAAO,CAAC,IAAI,CAAC;IAqBV,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC7D,kBAAkB,CACvB,GAAG,EAAE,cAAc,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAezB,gBAAgB,CACrB,GAAG,EAAE,cAAc,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAa1B,gBAAgB,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB3E,uBAAuB,CAC5B,GAAG,EAAE,cAAc,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,WAAW,GACf,OAAO,CAAC,IAAI,CAAC;IAuBV,mBAAmB,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBhG"}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { ProviderError, auditSoftDelete, actorFrom, NoopEventSink } from '@selvajs/platform';
|
|
2
|
+
import { nextCursorFromRange, orderColumn, toRange } from './pagination.js';
|
|
3
|
+
/**
|
|
4
|
+
* Project + project-membership store backed by Postgres. Visibility semantics
|
|
5
|
+
* (public / org / private) are enforced by the `visible_project()` helper in
|
|
6
|
+
* RLS. Access predicates (canEdit / canManage / canView etc.) live as pure
|
|
7
|
+
* functions in `@selvajs/platform/access`; the route layer composes them with
|
|
8
|
+
* pre-loaded entities. See `packages/selva/src/lib/server/access.server.ts`.
|
|
9
|
+
*
|
|
10
|
+
* `createProject` atomically seeds the creator as the project `owner` in
|
|
11
|
+
* `project_members` so subsequent user-scoped reads can see it.
|
|
12
|
+
*/
|
|
13
|
+
export class SupabaseProjectStore {
|
|
14
|
+
clients;
|
|
15
|
+
events;
|
|
16
|
+
constructor(clients, events = new NoopEventSink()) {
|
|
17
|
+
this.clients = clients;
|
|
18
|
+
this.events = events;
|
|
19
|
+
}
|
|
20
|
+
async listProjects(ctx, orgId, opts) {
|
|
21
|
+
const range = toRange(opts);
|
|
22
|
+
const direction = opts?.orderDir ?? 'desc';
|
|
23
|
+
const { data, error, count } = await this.clients
|
|
24
|
+
.forRequest(ctx)
|
|
25
|
+
.from('projects')
|
|
26
|
+
.select('*', { count: 'exact' })
|
|
27
|
+
.eq('org_id', orgId)
|
|
28
|
+
.is('deleted_at', null)
|
|
29
|
+
.order(orderColumn(opts?.orderBy), { ascending: direction === 'asc' })
|
|
30
|
+
.range(range.from, range.to);
|
|
31
|
+
if (error)
|
|
32
|
+
throw mapError(error);
|
|
33
|
+
const items = (data ?? []).map(rowToProject);
|
|
34
|
+
return { items, nextCursor: nextCursorFromRange(range, items.length, count) };
|
|
35
|
+
}
|
|
36
|
+
async getProject(ctx, id) {
|
|
37
|
+
const { data, error } = await this.clients
|
|
38
|
+
.forRequest(ctx)
|
|
39
|
+
.from('projects')
|
|
40
|
+
.select('*')
|
|
41
|
+
.eq('id', id)
|
|
42
|
+
.is('deleted_at', null)
|
|
43
|
+
.maybeSingle();
|
|
44
|
+
if (error)
|
|
45
|
+
throw mapError(error);
|
|
46
|
+
return data ? rowToProject(data) : null;
|
|
47
|
+
}
|
|
48
|
+
async getProjectBySlug(ctx, orgId, slug) {
|
|
49
|
+
const { data, error } = await this.clients
|
|
50
|
+
.forRequest(ctx)
|
|
51
|
+
.from('projects')
|
|
52
|
+
.select('*')
|
|
53
|
+
.eq('org_id', orgId)
|
|
54
|
+
.eq('slug', slug)
|
|
55
|
+
.is('deleted_at', null)
|
|
56
|
+
.maybeSingle();
|
|
57
|
+
if (error)
|
|
58
|
+
throw mapError(error);
|
|
59
|
+
return data ? rowToProject(data) : null;
|
|
60
|
+
}
|
|
61
|
+
async createProject(ctx, project) {
|
|
62
|
+
const client = this.clients.forRequest(ctx);
|
|
63
|
+
const { error } = await client.from('projects').insert(projectToRow(project));
|
|
64
|
+
if (error)
|
|
65
|
+
throw mapError(error);
|
|
66
|
+
// Seed owner membership so user-scoped reads see the project post-create.
|
|
67
|
+
// Upsert so a stale soft-deleted row from a prior project with the same id
|
|
68
|
+
// is reactivated rather than blocking creation.
|
|
69
|
+
const { error: memberError } = await client.from('project_members').upsert({
|
|
70
|
+
project_id: project.id,
|
|
71
|
+
user_id: project.ownerId,
|
|
72
|
+
role: 'owner',
|
|
73
|
+
joined_at: new Date().toISOString(),
|
|
74
|
+
deleted_at: null
|
|
75
|
+
}, { onConflict: 'project_id,user_id' });
|
|
76
|
+
if (memberError)
|
|
77
|
+
throw mapError(memberError);
|
|
78
|
+
await this.events.emit({
|
|
79
|
+
type: 'project.created',
|
|
80
|
+
projectId: project.id,
|
|
81
|
+
orgId: project.orgId,
|
|
82
|
+
actorId: actorFrom(ctx)
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async updateProject(ctx, id, patch) {
|
|
86
|
+
const row = {};
|
|
87
|
+
if (patch.name !== undefined)
|
|
88
|
+
row.name = patch.name;
|
|
89
|
+
if (patch.slug !== undefined)
|
|
90
|
+
row.slug = patch.slug;
|
|
91
|
+
if (patch.description !== undefined)
|
|
92
|
+
row.description = patch.description;
|
|
93
|
+
if (patch.visibility !== undefined)
|
|
94
|
+
row.visibility = patch.visibility;
|
|
95
|
+
if (patch.autoJoinOnUpload !== undefined)
|
|
96
|
+
row.auto_join_on_upload = patch.autoJoinOnUpload;
|
|
97
|
+
if (Object.keys(row).length === 0)
|
|
98
|
+
return;
|
|
99
|
+
if (ctx.userId)
|
|
100
|
+
row.updated_by = ctx.userId;
|
|
101
|
+
const { data, error } = await this.clients
|
|
102
|
+
.forRequest(ctx)
|
|
103
|
+
.from('projects')
|
|
104
|
+
.update(row)
|
|
105
|
+
.eq('id', id)
|
|
106
|
+
.is('deleted_at', null)
|
|
107
|
+
.select('id');
|
|
108
|
+
if (error)
|
|
109
|
+
throw mapError(error);
|
|
110
|
+
if (!data || data.length === 0)
|
|
111
|
+
throw new ProviderError(`Project '${id}' not found`, 404);
|
|
112
|
+
}
|
|
113
|
+
async deleteProject(ctx, id) {
|
|
114
|
+
// §9 soft-delete with cascade. Mirrors LocalProjectStore: project →
|
|
115
|
+
// project_members, definitions. FK CASCADE doesn't fire on soft-delete,
|
|
116
|
+
// so the cascade is in app code.
|
|
117
|
+
const client = this.clients.forRequest(ctx);
|
|
118
|
+
const stamp = auditSoftDelete(ctx, ctx.userId);
|
|
119
|
+
const stampRow = stampToRow(stamp);
|
|
120
|
+
const { data, error } = await client
|
|
121
|
+
.from('projects')
|
|
122
|
+
.update(stampRow)
|
|
123
|
+
.eq('id', id)
|
|
124
|
+
.is('deleted_at', null)
|
|
125
|
+
.select('id');
|
|
126
|
+
if (error)
|
|
127
|
+
throw mapError(error);
|
|
128
|
+
if (!data || data.length === 0)
|
|
129
|
+
throw new ProviderError(`Project '${id}' not found`, 404);
|
|
130
|
+
const { error: pmErr } = await client
|
|
131
|
+
.from('project_members')
|
|
132
|
+
.update(stampRow)
|
|
133
|
+
.eq('project_id', id)
|
|
134
|
+
.is('deleted_at', null);
|
|
135
|
+
if (pmErr)
|
|
136
|
+
throw mapError(pmErr);
|
|
137
|
+
const { error: defErr } = await client
|
|
138
|
+
.from('definitions')
|
|
139
|
+
.update(stampRow)
|
|
140
|
+
.eq('project_id', id)
|
|
141
|
+
.is('deleted_at', null);
|
|
142
|
+
if (defErr)
|
|
143
|
+
throw mapError(defErr);
|
|
144
|
+
await this.events.emit({ type: 'project.deleted', projectId: id, actorId: actorFrom(ctx) });
|
|
145
|
+
}
|
|
146
|
+
// ============================================================================
|
|
147
|
+
// Project members
|
|
148
|
+
// ============================================================================
|
|
149
|
+
async listProjectMembers(ctx, projectId, opts) {
|
|
150
|
+
const range = toRange(opts);
|
|
151
|
+
const { data, error, count } = await this.clients
|
|
152
|
+
.forRequest(ctx)
|
|
153
|
+
.from('project_members')
|
|
154
|
+
.select('*', { count: 'exact' })
|
|
155
|
+
.eq('project_id', projectId)
|
|
156
|
+
.is('deleted_at', null)
|
|
157
|
+
.order('joined_at', { ascending: (opts?.orderDir ?? 'desc') === 'asc' })
|
|
158
|
+
.range(range.from, range.to);
|
|
159
|
+
if (error)
|
|
160
|
+
throw mapError(error);
|
|
161
|
+
const items = (data ?? []).map(rowToProjectMember);
|
|
162
|
+
return { items, nextCursor: nextCursorFromRange(range, items.length, count) };
|
|
163
|
+
}
|
|
164
|
+
async getProjectMember(ctx, projectId, userId) {
|
|
165
|
+
const { data, error } = await this.clients
|
|
166
|
+
.forRequest(ctx)
|
|
167
|
+
.from('project_members')
|
|
168
|
+
.select('*')
|
|
169
|
+
.eq('project_id', projectId)
|
|
170
|
+
.eq('user_id', userId)
|
|
171
|
+
.is('deleted_at', null)
|
|
172
|
+
.maybeSingle();
|
|
173
|
+
if (error)
|
|
174
|
+
throw mapError(error);
|
|
175
|
+
return data ? rowToProjectMember(data) : null;
|
|
176
|
+
}
|
|
177
|
+
async addProjectMember(ctx, member) {
|
|
178
|
+
// Upsert reactivates a prior soft-deleted row instead of throwing
|
|
179
|
+
// duplicate-key. Mirrors LocalProjectStore.addProjectMember.
|
|
180
|
+
const row = {
|
|
181
|
+
...projectMemberToRow(member),
|
|
182
|
+
deleted_at: null
|
|
183
|
+
};
|
|
184
|
+
if (ctx.userId)
|
|
185
|
+
row.updated_by = ctx.userId;
|
|
186
|
+
const { error } = await this.clients
|
|
187
|
+
.forRequest(ctx)
|
|
188
|
+
.from('project_members')
|
|
189
|
+
.upsert(row, { onConflict: 'project_id,user_id' });
|
|
190
|
+
if (error)
|
|
191
|
+
throw mapError(error);
|
|
192
|
+
await this.events.emit({
|
|
193
|
+
type: 'project_member.added',
|
|
194
|
+
projectId: member.projectId,
|
|
195
|
+
userId: member.userId,
|
|
196
|
+
actorId: actorFrom(ctx)
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
async updateProjectMemberRole(ctx, projectId, userId, role) {
|
|
200
|
+
const row = { role };
|
|
201
|
+
if (ctx.userId)
|
|
202
|
+
row.updated_by = ctx.userId;
|
|
203
|
+
const { data, error } = await this.clients
|
|
204
|
+
.forRequest(ctx)
|
|
205
|
+
.from('project_members')
|
|
206
|
+
.update(row)
|
|
207
|
+
.eq('project_id', projectId)
|
|
208
|
+
.eq('user_id', userId)
|
|
209
|
+
.is('deleted_at', null)
|
|
210
|
+
.select('user_id');
|
|
211
|
+
if (error)
|
|
212
|
+
throw mapError(error);
|
|
213
|
+
if (!data || data.length === 0)
|
|
214
|
+
throw new ProviderError(`Project member '${userId}' not found`, 404);
|
|
215
|
+
await this.events.emit({
|
|
216
|
+
type: 'project_member.role_changed',
|
|
217
|
+
projectId,
|
|
218
|
+
userId,
|
|
219
|
+
role,
|
|
220
|
+
actorId: actorFrom(ctx)
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
async removeProjectMember(ctx, projectId, userId) {
|
|
224
|
+
const stamp = auditSoftDelete(ctx, ctx.userId);
|
|
225
|
+
const { error } = await this.clients
|
|
226
|
+
.forRequest(ctx)
|
|
227
|
+
.from('project_members')
|
|
228
|
+
.update(stampToRow(stamp))
|
|
229
|
+
.eq('project_id', projectId)
|
|
230
|
+
.eq('user_id', userId)
|
|
231
|
+
.is('deleted_at', null);
|
|
232
|
+
if (error)
|
|
233
|
+
throw mapError(error);
|
|
234
|
+
await this.events.emit({
|
|
235
|
+
type: 'project_member.removed',
|
|
236
|
+
projectId,
|
|
237
|
+
userId,
|
|
238
|
+
actorId: actorFrom(ctx)
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function rowToProject(row) {
|
|
243
|
+
return {
|
|
244
|
+
id: row.id,
|
|
245
|
+
orgId: row.org_id,
|
|
246
|
+
name: row.name,
|
|
247
|
+
slug: row.slug,
|
|
248
|
+
description: row.description ?? undefined,
|
|
249
|
+
visibility: row.visibility,
|
|
250
|
+
ownerId: row.owner_id,
|
|
251
|
+
createdBy: row.created_by ?? row.owner_id,
|
|
252
|
+
updatedBy: row.updated_by ?? row.owner_id,
|
|
253
|
+
autoJoinOnUpload: row.auto_join_on_upload ?? false,
|
|
254
|
+
createdAt: row.created_at,
|
|
255
|
+
updatedAt: row.updated_at,
|
|
256
|
+
deletedAt: row.deleted_at ?? null
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
function projectToRow(p) {
|
|
260
|
+
return {
|
|
261
|
+
id: p.id,
|
|
262
|
+
org_id: p.orgId,
|
|
263
|
+
name: p.name,
|
|
264
|
+
slug: p.slug,
|
|
265
|
+
description: p.description ?? null,
|
|
266
|
+
visibility: p.visibility,
|
|
267
|
+
owner_id: p.ownerId,
|
|
268
|
+
created_by: p.createdBy,
|
|
269
|
+
updated_by: p.updatedBy,
|
|
270
|
+
auto_join_on_upload: p.autoJoinOnUpload,
|
|
271
|
+
created_at: p.createdAt,
|
|
272
|
+
updated_at: p.updatedAt,
|
|
273
|
+
deleted_at: p.deletedAt ?? null
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
function rowToProjectMember(row) {
|
|
277
|
+
return {
|
|
278
|
+
projectId: row.project_id,
|
|
279
|
+
userId: row.user_id,
|
|
280
|
+
role: row.role,
|
|
281
|
+
joinedAt: row.joined_at,
|
|
282
|
+
updatedAt: row.updated_at ?? row.joined_at,
|
|
283
|
+
updatedBy: row.updated_by ?? row.user_id,
|
|
284
|
+
deletedAt: row.deleted_at ?? null
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
function projectMemberToRow(m) {
|
|
288
|
+
return {
|
|
289
|
+
project_id: m.projectId,
|
|
290
|
+
user_id: m.userId,
|
|
291
|
+
role: m.role,
|
|
292
|
+
joined_at: m.joinedAt
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Build a row payload from an audit-soft-delete stamp. `updated_by` only goes
|
|
297
|
+
* into the row when ctx.userId is set — passing `''` would violate the
|
|
298
|
+
* `references auth.users(id)` FK on system contexts. The DB trigger sets
|
|
299
|
+
* `updated_at`, but for soft-delete we set it explicitly so it matches
|
|
300
|
+
* `deleted_at` (single timestamp for the deletion event).
|
|
301
|
+
*/
|
|
302
|
+
function stampToRow(stamp) {
|
|
303
|
+
const row = {
|
|
304
|
+
deleted_at: stamp.deletedAt,
|
|
305
|
+
updated_at: stamp.updatedAt
|
|
306
|
+
};
|
|
307
|
+
if (stamp.updatedBy)
|
|
308
|
+
row.updated_by = stamp.updatedBy;
|
|
309
|
+
return row;
|
|
310
|
+
}
|
|
311
|
+
function mapError(e) {
|
|
312
|
+
const pg = e;
|
|
313
|
+
if (pg?.code === '23505')
|
|
314
|
+
return new ProviderError(pg.message ?? 'Duplicate record', 409);
|
|
315
|
+
if (pg?.code === '23503')
|
|
316
|
+
return new ProviderError(pg.message ?? 'Foreign key violation', 409);
|
|
317
|
+
if (e instanceof Error)
|
|
318
|
+
return e;
|
|
319
|
+
if (e && typeof e === 'object') {
|
|
320
|
+
const obj = e;
|
|
321
|
+
const msg = obj.message ?? obj.details ?? obj.hint ?? 'Unknown Postgres error';
|
|
322
|
+
const err = new Error(obj.code ? `[${obj.code}] ${msg}` : msg);
|
|
323
|
+
Object.assign(err, obj);
|
|
324
|
+
return err;
|
|
325
|
+
}
|
|
326
|
+
return new Error(String(e));
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=SupabaseProjectStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SupabaseProjectStore.js","sourceRoot":"","sources":["../../src/data/SupabaseProjectStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { IShareLinkStore, IEventSink, ShareLink, RequestContext, ListOptions, Page } from '@selvajs/platform';
|
|
2
|
+
import type { ClientBundle } from './client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Spec §7 — share-link store backed by Postgres.
|
|
5
|
+
*
|
|
6
|
+
* Token resolution (`getByTokenHash`) and atomic increment use the
|
|
7
|
+
* SECURITY DEFINER `try_increment_share_link_solve_count` RPC + service-
|
|
8
|
+
* role client to bypass RLS — the token IS the credential, not the
|
|
9
|
+
* authenticated user identity.
|
|
10
|
+
*
|
|
11
|
+
* `tryIncrementSolveCount` returns a single number on success or null when
|
|
12
|
+
* the cap is hit. The RPC enforces "increment iff under cap and live" in
|
|
13
|
+
* one statement, so even concurrent solves can't overshoot the cap.
|
|
14
|
+
*/
|
|
15
|
+
export declare class SupabaseShareLinkStore implements IShareLinkStore {
|
|
16
|
+
private readonly clients;
|
|
17
|
+
private readonly events;
|
|
18
|
+
constructor(clients: ClientBundle, events?: IEventSink);
|
|
19
|
+
create(ctx: RequestContext, link: ShareLink): Promise<void>;
|
|
20
|
+
listByDefinition(ctx: RequestContext, definitionId: string, opts?: ListOptions): Promise<Page<ShareLink>>;
|
|
21
|
+
getById(ctx: RequestContext, id: string): Promise<ShareLink | null>;
|
|
22
|
+
getByTokenHash(_ctx: RequestContext, tokenHash: string): Promise<ShareLink | null>;
|
|
23
|
+
revoke(ctx: RequestContext, id: string): Promise<void>;
|
|
24
|
+
tryIncrementSolveCount(_ctx: RequestContext, id: string): Promise<number | null>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=SupabaseShareLinkStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SupabaseShareLinkStore.d.ts","sourceRoot":"","sources":["../../src/data/SupabaseShareLinkStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,eAAe,EACf,UAAU,EACV,SAAS,EACT,cAAc,EACd,WAAW,EACX,IAAI,EACJ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD;;;;;;;;;;;GAWG;AACH,qBAAa,sBAAuB,YAAW,eAAe;IAI5D,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;gBAGlB,OAAO,EAAE,YAAY,EACtC,MAAM,GAAE,UAAgC;IAKnC,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAc3D,gBAAgB,CACrB,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAerB,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAWnE,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAelF,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IActD,sBAAsB,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAWtF"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { ProviderError, actorFrom, NoopEventSink } from '@selvajs/platform';
|
|
2
|
+
import { nextCursorFromRange, toRange } from './pagination.js';
|
|
3
|
+
/**
|
|
4
|
+
* Spec §7 — share-link store backed by Postgres.
|
|
5
|
+
*
|
|
6
|
+
* Token resolution (`getByTokenHash`) and atomic increment use the
|
|
7
|
+
* SECURITY DEFINER `try_increment_share_link_solve_count` RPC + service-
|
|
8
|
+
* role client to bypass RLS — the token IS the credential, not the
|
|
9
|
+
* authenticated user identity.
|
|
10
|
+
*
|
|
11
|
+
* `tryIncrementSolveCount` returns a single number on success or null when
|
|
12
|
+
* the cap is hit. The RPC enforces "increment iff under cap and live" in
|
|
13
|
+
* one statement, so even concurrent solves can't overshoot the cap.
|
|
14
|
+
*/
|
|
15
|
+
export class SupabaseShareLinkStore {
|
|
16
|
+
clients;
|
|
17
|
+
events;
|
|
18
|
+
constructor(clients, events = new NoopEventSink()) {
|
|
19
|
+
this.clients = clients;
|
|
20
|
+
this.events = events;
|
|
21
|
+
}
|
|
22
|
+
async create(ctx, link) {
|
|
23
|
+
const { error } = await this.clients
|
|
24
|
+
.forRequest(ctx)
|
|
25
|
+
.from('share_links')
|
|
26
|
+
.insert(linkToRow(link));
|
|
27
|
+
if (error)
|
|
28
|
+
throw mapError(error);
|
|
29
|
+
await this.events.emit({
|
|
30
|
+
type: 'share_link.minted',
|
|
31
|
+
linkId: link.id,
|
|
32
|
+
definitionId: link.definitionId,
|
|
33
|
+
actorId: actorFrom(ctx)
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async listByDefinition(ctx, definitionId, opts) {
|
|
37
|
+
const range = toRange(opts);
|
|
38
|
+
const { data, error, count } = await this.clients
|
|
39
|
+
.forRequest(ctx)
|
|
40
|
+
.from('share_links')
|
|
41
|
+
.select('*', { count: 'exact' })
|
|
42
|
+
.eq('definition_guid', definitionId)
|
|
43
|
+
.is('revoked_at', null)
|
|
44
|
+
.order('created_at', { ascending: false })
|
|
45
|
+
.range(range.from, range.to);
|
|
46
|
+
if (error)
|
|
47
|
+
throw mapError(error);
|
|
48
|
+
const items = (data ?? []).map(rowToLink);
|
|
49
|
+
return { items, nextCursor: nextCursorFromRange(range, items.length, count) };
|
|
50
|
+
}
|
|
51
|
+
async getById(ctx, id) {
|
|
52
|
+
const { data, error } = await this.clients
|
|
53
|
+
.forRequest(ctx)
|
|
54
|
+
.from('share_links')
|
|
55
|
+
.select('*')
|
|
56
|
+
.eq('id', id)
|
|
57
|
+
.maybeSingle();
|
|
58
|
+
if (error)
|
|
59
|
+
throw mapError(error);
|
|
60
|
+
return data ? rowToLink(data) : null;
|
|
61
|
+
}
|
|
62
|
+
async getByTokenHash(_ctx, tokenHash) {
|
|
63
|
+
// Service-role: token resolution must work for anonymous requests too.
|
|
64
|
+
// RLS would scope the query down to "links the current user can see"
|
|
65
|
+
// — exactly the wrong semantic for token-credentialed access.
|
|
66
|
+
const { data, error } = await this.clients.serviceClient
|
|
67
|
+
.from('share_links')
|
|
68
|
+
.select('*, definitions!inner(deleted_at)')
|
|
69
|
+
.eq('token_hash', tokenHash)
|
|
70
|
+
.is('revoked_at', null)
|
|
71
|
+
.is('definitions.deleted_at', null)
|
|
72
|
+
.maybeSingle();
|
|
73
|
+
if (error)
|
|
74
|
+
throw mapError(error);
|
|
75
|
+
return data ? rowToLink(data) : null;
|
|
76
|
+
}
|
|
77
|
+
async revoke(ctx, id) {
|
|
78
|
+
// Idempotent: succeeds whether or not the row exists / is already
|
|
79
|
+
// revoked. The `is null` predicate on revoked_at means a re-revoke
|
|
80
|
+
// is a no-op (no row updated).
|
|
81
|
+
const { error } = await this.clients
|
|
82
|
+
.forRequest(ctx)
|
|
83
|
+
.from('share_links')
|
|
84
|
+
.update({ revoked_at: new Date().toISOString() })
|
|
85
|
+
.eq('id', id)
|
|
86
|
+
.is('revoked_at', null);
|
|
87
|
+
if (error)
|
|
88
|
+
throw mapError(error);
|
|
89
|
+
await this.events.emit({ type: 'share_link.revoked', linkId: id, actorId: actorFrom(ctx) });
|
|
90
|
+
}
|
|
91
|
+
async tryIncrementSolveCount(_ctx, id) {
|
|
92
|
+
// SECURITY DEFINER RPC — bypasses RLS. Atomic check-and-increment.
|
|
93
|
+
// Returns NULL when the link is missing/revoked/expired/capped; the
|
|
94
|
+
// row update is the only way to get a numeric return.
|
|
95
|
+
const { data, error } = await this.clients.serviceClient.rpc('try_increment_share_link_solve_count', { link_id: id });
|
|
96
|
+
if (error)
|
|
97
|
+
throw mapError(error);
|
|
98
|
+
return typeof data === 'number' ? data : null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function rowToLink(row) {
|
|
102
|
+
return {
|
|
103
|
+
id: row.id,
|
|
104
|
+
definitionId: row.definition_guid,
|
|
105
|
+
channel: row.channel,
|
|
106
|
+
tokenHash: row.token_hash,
|
|
107
|
+
name: row.name ?? undefined,
|
|
108
|
+
createdBy: row.created_by,
|
|
109
|
+
createdAt: row.created_at,
|
|
110
|
+
expiresAt: row.expires_at,
|
|
111
|
+
revokedAt: row.revoked_at,
|
|
112
|
+
allowSolve: row.allow_solve,
|
|
113
|
+
maxSolves: row.max_solves,
|
|
114
|
+
solveCount: row.solve_count
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function linkToRow(l) {
|
|
118
|
+
return {
|
|
119
|
+
id: l.id,
|
|
120
|
+
definition_guid: l.definitionId,
|
|
121
|
+
channel: l.channel,
|
|
122
|
+
token_hash: l.tokenHash,
|
|
123
|
+
name: l.name ?? null,
|
|
124
|
+
created_by: l.createdBy,
|
|
125
|
+
created_at: l.createdAt,
|
|
126
|
+
expires_at: l.expiresAt ?? null,
|
|
127
|
+
revoked_at: l.revokedAt ?? null,
|
|
128
|
+
allow_solve: l.allowSolve,
|
|
129
|
+
max_solves: l.maxSolves ?? null,
|
|
130
|
+
solve_count: l.solveCount
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function mapError(e) {
|
|
134
|
+
const pg = e;
|
|
135
|
+
if (pg?.code === '23505')
|
|
136
|
+
return new ProviderError(pg.message ?? 'Duplicate record', 409);
|
|
137
|
+
if (pg?.code === '23503')
|
|
138
|
+
return new ProviderError(pg.message ?? 'Foreign key violation', 409);
|
|
139
|
+
if (e instanceof Error)
|
|
140
|
+
return e;
|
|
141
|
+
if (e && typeof e === 'object') {
|
|
142
|
+
const obj = e;
|
|
143
|
+
const msg = obj.message ?? obj.details ?? obj.hint ?? 'Unknown Postgres error';
|
|
144
|
+
const err = new Error(obj.code ? `[${obj.code}] ${msg}` : msg);
|
|
145
|
+
Object.assign(err, obj);
|
|
146
|
+
return err;
|
|
147
|
+
}
|
|
148
|
+
return new Error(String(e));
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=SupabaseShareLinkStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SupabaseShareLinkStore.js","sourceRoot":"","sources":["../../src/data/SupabaseShareLinkStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-server-conformance.test.d.ts","sourceRoot":"","sources":["../../../src/data/__tests__/compute-server-conformance.test.ts"],"names":[],"mappings":""}
|