@selvajs/supabase-provider 0.14.3 → 0.14.4-beta.1
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 +1 -1
- package/dist/auth/SupabaseAuthProvider.d.ts +57 -0
- package/dist/auth/SupabaseAuthProvider.d.ts.map +1 -1
- package/dist/auth/SupabaseAuthProvider.js +123 -18
- package/dist/auth/SupabaseAuthProvider.js.map +1 -1
- package/dist/data/SupabaseComputeServerStore.d.ts +34 -2
- package/dist/data/SupabaseComputeServerStore.d.ts.map +1 -1
- package/dist/data/SupabaseComputeServerStore.js +146 -39
- package/dist/data/SupabaseComputeServerStore.js.map +1 -1
- package/dist/data/SupabaseDataProvider.d.ts +18 -3
- package/dist/data/SupabaseDataProvider.d.ts.map +1 -1
- package/dist/data/SupabaseDataProvider.js +83 -18
- package/dist/data/SupabaseDataProvider.js.map +1 -1
- package/dist/data/SupabaseDefinitionStore.d.ts +3 -1
- package/dist/data/SupabaseDefinitionStore.d.ts.map +1 -1
- package/dist/data/SupabaseDefinitionStore.js +94 -67
- package/dist/data/SupabaseDefinitionStore.js.map +1 -1
- package/dist/data/SupabaseInviteStore.d.ts.map +1 -1
- package/dist/data/SupabaseInviteStore.js +11 -22
- package/dist/data/SupabaseInviteStore.js.map +1 -1
- package/dist/data/SupabaseOrgStore.d.ts.map +1 -1
- package/dist/data/SupabaseOrgStore.js +49 -86
- package/dist/data/SupabaseOrgStore.js.map +1 -1
- package/dist/data/SupabaseProjectStore.d.ts.map +1 -1
- package/dist/data/SupabaseProjectStore.js +51 -70
- package/dist/data/SupabaseProjectStore.js.map +1 -1
- package/dist/data/SupabaseShareLinkStore.d.ts.map +1 -1
- package/dist/data/SupabaseShareLinkStore.js +13 -27
- package/dist/data/SupabaseShareLinkStore.js.map +1 -1
- package/dist/data/client.d.ts +35 -3
- package/dist/data/client.d.ts.map +1 -1
- package/dist/data/client.js +67 -16
- package/dist/data/client.js.map +1 -1
- package/dist/data/errors.d.ts +2 -0
- package/dist/data/errors.d.ts.map +1 -0
- package/dist/data/errors.js +23 -0
- package/dist/data/errors.js.map +1 -0
- package/dist/data/index.d.ts +8 -2
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +6 -1
- package/dist/data/index.js.map +1 -1
- package/dist/data/migrationHead.d.ts +14 -0
- package/dist/data/migrationHead.d.ts.map +1 -0
- package/dist/data/migrationHead.js +14 -0
- package/dist/data/migrationHead.js.map +1 -0
- package/dist/data/query.d.ts +20 -0
- package/dist/data/query.d.ts.map +1 -0
- package/dist/data/query.js +13 -0
- package/dist/data/query.js.map +1 -0
- package/dist/data/rowStamp.d.ts +38 -0
- package/dist/data/rowStamp.d.ts.map +1 -0
- package/dist/data/rowStamp.js +43 -0
- package/dist/data/rowStamp.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/permissions/SupabasePlatformPermissionStore.d.ts +5 -3
- package/dist/permissions/SupabasePlatformPermissionStore.d.ts.map +1 -1
- package/dist/permissions/SupabasePlatformPermissionStore.js +17 -30
- package/dist/permissions/SupabasePlatformPermissionStore.js.map +1 -1
- package/dist/storage/SupabaseStorageProvider.d.ts.map +1 -1
- package/dist/storage/SupabaseStorageProvider.js +3 -0
- package/dist/storage/SupabaseStorageProvider.js.map +1 -1
- package/package.json +13 -14
- package/supabase/.branches/_current_branch +1 -0
- package/supabase/.temp/cli-latest +1 -0
- package/supabase/migrations/20260711120000_selva_definition_schema_version.sql +18 -0
- package/supabase/migrations/20260712120000_user_profiles_disabled_and_gin.sql +95 -0
- package/supabase/migrations/20260712123000_selva_migration_head_fn.sql +38 -0
- package/supabase/migrations/20260713120000_selva_next_version_number.sql +59 -0
- package/supabase/migrations/20260713140000_selva_solve_cache_limit.sql +15 -0
- package/dist/auth/__tests__/conformance.test.d.ts +0 -2
- package/dist/auth/__tests__/conformance.test.d.ts.map +0 -1
- package/dist/auth/__tests__/conformance.test.js +0 -76
- package/dist/auth/__tests__/conformance.test.js.map +0 -1
- package/dist/data/__tests__/compute-server-conformance.test.d.ts +0 -2
- package/dist/data/__tests__/compute-server-conformance.test.d.ts.map +0 -1
- package/dist/data/__tests__/compute-server-conformance.test.js +0 -40
- package/dist/data/__tests__/compute-server-conformance.test.js.map +0 -1
- package/dist/data/__tests__/definition-conformance.test.d.ts +0 -2
- package/dist/data/__tests__/definition-conformance.test.d.ts.map +0 -1
- package/dist/data/__tests__/definition-conformance.test.js +0 -85
- package/dist/data/__tests__/definition-conformance.test.js.map +0 -1
- package/dist/data/__tests__/event-sink-conformance.test.d.ts +0 -2
- package/dist/data/__tests__/event-sink-conformance.test.d.ts.map +0 -1
- package/dist/data/__tests__/event-sink-conformance.test.js +0 -27
- package/dist/data/__tests__/event-sink-conformance.test.js.map +0 -1
- package/dist/data/__tests__/invite-conformance.test.d.ts +0 -2
- package/dist/data/__tests__/invite-conformance.test.d.ts.map +0 -1
- package/dist/data/__tests__/invite-conformance.test.js +0 -45
- package/dist/data/__tests__/invite-conformance.test.js.map +0 -1
- package/dist/data/__tests__/org-conformance.test.d.ts +0 -2
- package/dist/data/__tests__/org-conformance.test.d.ts.map +0 -1
- package/dist/data/__tests__/org-conformance.test.js +0 -29
- package/dist/data/__tests__/org-conformance.test.js.map +0 -1
- package/dist/data/__tests__/project-conformance.test.d.ts +0 -2
- package/dist/data/__tests__/project-conformance.test.d.ts.map +0 -1
- package/dist/data/__tests__/project-conformance.test.js +0 -57
- package/dist/data/__tests__/project-conformance.test.js.map +0 -1
- package/dist/data/__tests__/share-link-conformance.test.d.ts +0 -2
- package/dist/data/__tests__/share-link-conformance.test.d.ts.map +0 -1
- package/dist/data/__tests__/share-link-conformance.test.js +0 -88
- package/dist/data/__tests__/share-link-conformance.test.js.map +0 -1
- package/dist/data/__tests__/solve-metric-sink-conformance.test.d.ts +0 -2
- package/dist/data/__tests__/solve-metric-sink-conformance.test.d.ts.map +0 -1
- package/dist/data/__tests__/solve-metric-sink-conformance.test.js +0 -52
- package/dist/data/__tests__/solve-metric-sink-conformance.test.js.map +0 -1
- package/dist/data/__tests__/test-helpers.d.ts +0 -52
- package/dist/data/__tests__/test-helpers.d.ts.map +0 -1
- package/dist/data/__tests__/test-helpers.js +0 -177
- package/dist/data/__tests__/test-helpers.js.map +0 -1
- package/dist/permissions/__tests__/conformance.test.d.ts +0 -2
- package/dist/permissions/__tests__/conformance.test.d.ts.map +0 -1
- package/dist/permissions/__tests__/conformance.test.js +0 -27
- package/dist/permissions/__tests__/conformance.test.js.map +0 -1
- package/dist/storage/__tests__/conformance.test.d.ts +0 -2
- package/dist/storage/__tests__/conformance.test.d.ts.map +0 -1
- package/dist/storage/__tests__/conformance.test.js +0 -149
- package/dist/storage/__tests__/conformance.test.js.map +0 -1
- package/dist/userProfile/__tests__/conformance.test.d.ts +0 -2
- package/dist/userProfile/__tests__/conformance.test.d.ts.map +0 -1
- package/dist/userProfile/__tests__/conformance.test.js +0 -38
- package/dist/userProfile/__tests__/conformance.test.js.map +0 -1
- package/src/auth/SupabaseAuthProvider.ts +0 -464
- package/src/auth/__tests__/conformance.test.ts +0 -78
- package/src/auth/index.ts +0 -2
- package/src/cli/sync-migrations.ts +0 -133
- package/src/data/SupabaseAuditQuery.ts +0 -103
- package/src/data/SupabaseComputeServerStore.ts +0 -262
- package/src/data/SupabaseDataProvider.ts +0 -133
- package/src/data/SupabaseDefinitionStore.ts +0 -520
- package/src/data/SupabaseEventSink.ts +0 -30
- package/src/data/SupabaseInviteStore.ts +0 -183
- package/src/data/SupabaseOrgStore.ts +0 -552
- package/src/data/SupabaseProjectStore.ts +0 -454
- package/src/data/SupabaseShareLinkStore.ts +0 -191
- package/src/data/SupabaseSolveMetricSink.ts +0 -38
- package/src/data/__tests__/compute-server-conformance.test.ts +0 -40
- package/src/data/__tests__/definition-conformance.test.ts +0 -89
- package/src/data/__tests__/event-sink-conformance.test.ts +0 -32
- package/src/data/__tests__/invite-conformance.test.ts +0 -46
- package/src/data/__tests__/org-conformance.test.ts +0 -30
- package/src/data/__tests__/project-conformance.test.ts +0 -57
- package/src/data/__tests__/share-link-conformance.test.ts +0 -87
- package/src/data/__tests__/solve-metric-sink-conformance.test.ts +0 -59
- package/src/data/__tests__/test-helpers.ts +0 -188
- package/src/data/client.ts +0 -98
- package/src/data/index.ts +0 -12
- package/src/data/pagination.ts +0 -68
- package/src/index.ts +0 -24
- package/src/permissions/SupabasePlatformPermissionStore.ts +0 -161
- package/src/permissions/__tests__/conformance.test.ts +0 -28
- package/src/permissions/index.ts +0 -1
- package/src/storage/SupabaseStorageProvider.ts +0 -182
- package/src/storage/__tests__/conformance.test.ts +0 -152
- package/src/storage/index.ts +0 -2
- package/src/userProfile/SupabaseUserProfileProvider.ts +0 -177
- package/src/userProfile/__tests__/conformance.test.ts +0 -39
- package/src/userProfile/index.ts +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@selvajs/supabase-provider",
|
|
3
|
-
"version": "0.14.
|
|
3
|
+
"version": "0.14.4-beta.1",
|
|
4
4
|
"description": "Supabase (Auth + Postgres + Storage) implementations of @selvajs/platform interfaces",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -8,9 +8,12 @@
|
|
|
8
8
|
},
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
11
|
-
"url": "https://github.com/VektorNode/selva.git",
|
|
11
|
+
"url": "git+https://github.com/VektorNode/selva.git",
|
|
12
12
|
"directory": "packages/providers/supabase"
|
|
13
13
|
},
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=22.0.0"
|
|
16
|
+
},
|
|
14
17
|
"type": "module",
|
|
15
18
|
"main": "./dist/index.js",
|
|
16
19
|
"types": "./dist/index.d.ts",
|
|
@@ -19,51 +22,47 @@
|
|
|
19
22
|
},
|
|
20
23
|
"exports": {
|
|
21
24
|
".": {
|
|
22
|
-
"source": "./src/index.ts",
|
|
23
25
|
"types": "./dist/index.d.ts",
|
|
24
26
|
"import": "./dist/index.js"
|
|
25
27
|
},
|
|
26
28
|
"./auth": {
|
|
27
|
-
"source": "./src/auth/index.ts",
|
|
28
29
|
"types": "./dist/auth/index.d.ts",
|
|
29
30
|
"import": "./dist/auth/index.js"
|
|
30
31
|
},
|
|
31
32
|
"./data": {
|
|
32
|
-
"source": "./src/data/index.ts",
|
|
33
33
|
"types": "./dist/data/index.d.ts",
|
|
34
34
|
"import": "./dist/data/index.js"
|
|
35
35
|
},
|
|
36
36
|
"./storage": {
|
|
37
|
-
"source": "./src/storage/index.ts",
|
|
38
37
|
"types": "./dist/storage/index.d.ts",
|
|
39
38
|
"import": "./dist/storage/index.js"
|
|
40
39
|
},
|
|
41
40
|
"./permissions": {
|
|
42
|
-
"source": "./src/permissions/index.ts",
|
|
43
41
|
"types": "./dist/permissions/index.d.ts",
|
|
44
42
|
"import": "./dist/permissions/index.js"
|
|
45
43
|
},
|
|
46
44
|
"./userProfile": {
|
|
47
|
-
"source": "./src/userProfile/index.ts",
|
|
48
45
|
"types": "./dist/userProfile/index.d.ts",
|
|
49
46
|
"import": "./dist/userProfile/index.js"
|
|
50
47
|
}
|
|
51
48
|
},
|
|
52
49
|
"files": [
|
|
53
50
|
"dist",
|
|
54
|
-
"
|
|
55
|
-
"
|
|
51
|
+
"supabase",
|
|
52
|
+
"!**/__tests__/**",
|
|
53
|
+
"!**/*.test.*",
|
|
54
|
+
"!**/*.spec.*"
|
|
56
55
|
],
|
|
57
56
|
"dependencies": {
|
|
58
57
|
"@supabase/supabase-js": "^2.104.1",
|
|
59
58
|
"sharp": "^0.34.5",
|
|
60
|
-
"@selvajs/platform": "0.
|
|
59
|
+
"@selvajs/platform": "^0.15.0-beta.1"
|
|
61
60
|
},
|
|
62
61
|
"devDependencies": {
|
|
63
|
-
"@types/node": "^22.
|
|
62
|
+
"@types/node": "^22.20.1",
|
|
64
63
|
"supabase": "^2.95.3",
|
|
65
|
-
"typescript": "^
|
|
66
|
-
"vitest": "^3.2.
|
|
64
|
+
"typescript": "^6.0.3",
|
|
65
|
+
"vitest": "^3.2.7"
|
|
67
66
|
},
|
|
68
67
|
"scripts": {
|
|
69
68
|
"build": "tsc",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
main
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
v2.102.0
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
-- ============================================================================
|
|
2
|
+
-- Expose the cached schema's format version as a queryable column (ADR 0005).
|
|
3
|
+
--
|
|
4
|
+
-- The stored `schema` blob is a disposable cache of the compute-extracted UI
|
|
5
|
+
-- schema; its embedded `schemaVersion` says which schema format it was written
|
|
6
|
+
-- in. A GENERATED column keeps that version queryable for ops ("how many
|
|
7
|
+
-- versions are stale?") with zero write-path involvement — it can never drift
|
|
8
|
+
-- from the blob, and rows whose schema is NULL (pre-caching uploads) yield
|
|
9
|
+
-- NULL. The web render path re-extracts from compute on version mismatch; it
|
|
10
|
+
-- reads the version from the blob itself, not from this column.
|
|
11
|
+
-- ============================================================================
|
|
12
|
+
|
|
13
|
+
alter table selva.definition_versions
|
|
14
|
+
add column if not exists schema_version text
|
|
15
|
+
generated always as (schema ->> 'schemaVersion') stored;
|
|
16
|
+
|
|
17
|
+
comment on column selva.definition_versions.schema_version is
|
|
18
|
+
'Schema format version of the cached `schema` blob (generated from schema->>''schemaVersion''). NULL when no schema is cached. Ops/diagnostics only — the app reads the version from the blob.';
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
-- ============================================================================
|
|
2
|
+
-- user_profiles.disabled denormalization + platform_permissions GIN index
|
|
3
|
+
--
|
|
4
|
+
-- The instance-admin invariant queries ("is there an enabled instance_admin?",
|
|
5
|
+
-- "how many enabled admins besides X?") previously selected candidate ids and
|
|
6
|
+
-- then called the GoTrue admin API once per candidate just to read
|
|
7
|
+
-- user_metadata.disabled — an N+1 on the bootstrap and admin-write paths.
|
|
8
|
+
--
|
|
9
|
+
-- auth.users.raw_user_meta_data->>'disabled' stays the source of truth (the
|
|
10
|
+
-- auth provider keeps writing it via the admin API); user_profiles.disabled is
|
|
11
|
+
-- a trigger-maintained read-model copy so the invariant collapses to a single
|
|
12
|
+
-- indexed query. The GIN index serves the `platform_permissions @> ...`
|
|
13
|
+
-- filters those queries already used.
|
|
14
|
+
-- ============================================================================
|
|
15
|
+
|
|
16
|
+
alter table selva.user_profiles
|
|
17
|
+
add column if not exists disabled boolean not null default false;
|
|
18
|
+
|
|
19
|
+
-- Signup seed: carry disabled state for users created already-disabled (e.g.
|
|
20
|
+
-- via the Supabase dashboard). Conflict semantics unchanged (do nothing) —
|
|
21
|
+
-- a profile row can only pre-exist on re-fired triggers, where the update
|
|
22
|
+
-- trigger below owns the sync.
|
|
23
|
+
create or replace function selva.handle_new_auth_user()
|
|
24
|
+
returns trigger
|
|
25
|
+
language plpgsql
|
|
26
|
+
security definer
|
|
27
|
+
set search_path = public
|
|
28
|
+
as $$
|
|
29
|
+
begin
|
|
30
|
+
insert into selva.user_profiles (user_id, disabled)
|
|
31
|
+
values (new.id, coalesce((new.raw_user_meta_data ->> 'disabled')::boolean, false))
|
|
32
|
+
on conflict (user_id) do nothing;
|
|
33
|
+
return new;
|
|
34
|
+
end;
|
|
35
|
+
$$;
|
|
36
|
+
|
|
37
|
+
-- Sync disable/enable flips. The original mirror trigger is INSERT-only, so
|
|
38
|
+
-- without this the read-model copy would never see a later flip (which lands
|
|
39
|
+
-- as an UPDATE of raw_user_meta_data through the GoTrue admin API).
|
|
40
|
+
create or replace function selva.sync_auth_user_disabled()
|
|
41
|
+
returns trigger
|
|
42
|
+
language plpgsql
|
|
43
|
+
security definer
|
|
44
|
+
set search_path = public
|
|
45
|
+
as $$
|
|
46
|
+
begin
|
|
47
|
+
update selva.user_profiles
|
|
48
|
+
set disabled = coalesce((new.raw_user_meta_data ->> 'disabled')::boolean, false)
|
|
49
|
+
where user_id = new.id;
|
|
50
|
+
return new;
|
|
51
|
+
end;
|
|
52
|
+
$$;
|
|
53
|
+
|
|
54
|
+
drop trigger if exists trg_auth_user_disabled_sync on auth.users;
|
|
55
|
+
create trigger trg_auth_user_disabled_sync
|
|
56
|
+
after update of raw_user_meta_data on auth.users
|
|
57
|
+
for each row
|
|
58
|
+
when (
|
|
59
|
+
coalesce(old.raw_user_meta_data ->> 'disabled', 'false')
|
|
60
|
+
is distinct from coalesce(new.raw_user_meta_data ->> 'disabled', 'false')
|
|
61
|
+
)
|
|
62
|
+
execute function selva.sync_auth_user_disabled();
|
|
63
|
+
|
|
64
|
+
-- Backfill existing rows from the source of truth.
|
|
65
|
+
update selva.user_profiles p
|
|
66
|
+
set disabled = coalesce((u.raw_user_meta_data ->> 'disabled')::boolean, false)
|
|
67
|
+
from auth.users u
|
|
68
|
+
where u.id = p.user_id
|
|
69
|
+
and p.disabled is distinct from coalesce((u.raw_user_meta_data ->> 'disabled')::boolean, false);
|
|
70
|
+
|
|
71
|
+
-- The `platform_permissions @> '{instance_admin}'` filters in the permission
|
|
72
|
+
-- store were sequential scans without this.
|
|
73
|
+
create index if not exists idx_user_profiles_platform_permissions
|
|
74
|
+
on selva.user_profiles using gin (platform_permissions);
|
|
75
|
+
|
|
76
|
+
-- Extend the self-update RLS policy: users must not be able to clear their own
|
|
77
|
+
-- disabled flag (same freeze pattern as platform_permissions — only
|
|
78
|
+
-- service-role writes and the sync trigger may change it).
|
|
79
|
+
drop policy if exists "user_profiles: users can update own" on selva.user_profiles;
|
|
80
|
+
|
|
81
|
+
create policy "user_profiles: users can update own"
|
|
82
|
+
on selva.user_profiles for update
|
|
83
|
+
to authenticated
|
|
84
|
+
using (user_id = auth.uid())
|
|
85
|
+
with check (
|
|
86
|
+
user_id = auth.uid()
|
|
87
|
+
-- Users cannot escalate their own platform permissions; only service-role
|
|
88
|
+
-- writes (which bypass RLS) may change that column.
|
|
89
|
+
and platform_permissions is not distinct from (
|
|
90
|
+
select platform_permissions from selva.user_profiles where user_id = auth.uid()
|
|
91
|
+
)
|
|
92
|
+
and disabled is not distinct from (
|
|
93
|
+
select disabled from selva.user_profiles where user_id = auth.uid()
|
|
94
|
+
)
|
|
95
|
+
);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
-- ============================================================================
|
|
2
|
+
-- selva.migration_head() — app↔DB schema handshake (audit O3)
|
|
3
|
+
--
|
|
4
|
+
-- The app has no way to see whether the operator applied this package's
|
|
5
|
+
-- migrations: self-update only runs `npm install` + pm2 restart, and PostgREST
|
|
6
|
+
-- does not expose `supabase_migrations`. This SECURITY DEFINER function makes
|
|
7
|
+
-- the migration head queryable through the `selva` schema the app is pinned
|
|
8
|
+
-- to. The app compares it against its compiled-in EXPECTED_MIGRATION_HEAD at
|
|
9
|
+
-- boot and degrades /api/health on skew — which also makes the self-update
|
|
10
|
+
-- runner's health probe auto-roll-back an update whose migrations weren't
|
|
11
|
+
-- applied yet.
|
|
12
|
+
--
|
|
13
|
+
-- Bootstrapping is intentional: on a database that never applied THIS
|
|
14
|
+
-- migration the RPC itself is missing, which the app reads as "schema behind".
|
|
15
|
+
-- ============================================================================
|
|
16
|
+
|
|
17
|
+
create or replace function selva.migration_head()
|
|
18
|
+
returns text
|
|
19
|
+
language plpgsql
|
|
20
|
+
security definer
|
|
21
|
+
set search_path = ''
|
|
22
|
+
stable
|
|
23
|
+
as $$
|
|
24
|
+
begin
|
|
25
|
+
return coalesce(
|
|
26
|
+
(select max(version) from supabase_migrations.schema_migrations),
|
|
27
|
+
''
|
|
28
|
+
);
|
|
29
|
+
exception
|
|
30
|
+
-- A project where the CLI never pushed migrations has no
|
|
31
|
+
-- supabase_migrations.schema_migrations table at all.
|
|
32
|
+
when undefined_table then
|
|
33
|
+
return '';
|
|
34
|
+
end;
|
|
35
|
+
$$;
|
|
36
|
+
|
|
37
|
+
revoke all on function selva.migration_head() from public;
|
|
38
|
+
grant execute on function selva.migration_head() to service_role;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
-- ============================================================================
|
|
2
|
+
-- Monotonic per-definition version-number allocator (audit DC / caching Phase 1.5)
|
|
3
|
+
-- ============================================================================
|
|
4
|
+
--
|
|
5
|
+
-- Root-cause fix for `fileKey` reuse: `uploadVersion` used to compute the next
|
|
6
|
+
-- version number as max(existing)+1, so deleting the latest version freed its
|
|
7
|
+
-- number and the next upload reused it — reusing the `fileKey`
|
|
8
|
+
-- (`versions/v{N}.gh`) and letting a stale storage blob (or any layer keying on
|
|
9
|
+
-- the key) serve the old version's bytes for new content.
|
|
10
|
+
--
|
|
11
|
+
-- The `next_version_number` counter lives on the definition row and only ever
|
|
12
|
+
-- advances. `reserve_next_version_number` returns the current value and bumps it
|
|
13
|
+
-- atomically, so concurrent uploads never collide and a deleted version's number
|
|
14
|
+
-- is never handed out again.
|
|
15
|
+
|
|
16
|
+
-- Column: defaults to 2 (v1 is created with the parent, so the next upload takes
|
|
17
|
+
-- 2). Backfilled below for any pre-existing rows.
|
|
18
|
+
alter table selva.definitions
|
|
19
|
+
add column if not exists next_version_number integer not null default 2;
|
|
20
|
+
|
|
21
|
+
-- Backfill existing definitions to one past their highest live version number,
|
|
22
|
+
-- so already-uploaded versions don't get their numbers reused. Idempotent: after
|
|
23
|
+
-- the first run the counter is already >= this, and greatest() keeps it from
|
|
24
|
+
-- ever moving backwards.
|
|
25
|
+
update selva.definitions d
|
|
26
|
+
set next_version_number = greatest(
|
|
27
|
+
d.next_version_number,
|
|
28
|
+
coalesce(
|
|
29
|
+
(select max(v.version_number) + 1
|
|
30
|
+
from selva.definition_versions v
|
|
31
|
+
where v.definition_guid = d.guid),
|
|
32
|
+
2
|
|
33
|
+
)
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
-- Atomic reserve-and-increment. Returns the reserved number (the value BEFORE
|
|
37
|
+
-- the bump) and advances the counter. Never decrements. Raises if the row is
|
|
38
|
+
-- missing or soft-deleted so the caller surfaces a 404 rather than silently
|
|
39
|
+
-- minting a number for a dead definition.
|
|
40
|
+
create or replace function selva.reserve_next_version_number(g uuid)
|
|
41
|
+
returns integer
|
|
42
|
+
language plpgsql security definer set search_path = public
|
|
43
|
+
as $$
|
|
44
|
+
declare
|
|
45
|
+
reserved integer;
|
|
46
|
+
begin
|
|
47
|
+
update selva.definitions
|
|
48
|
+
set next_version_number = next_version_number + 1
|
|
49
|
+
where guid = g and deleted_at is null
|
|
50
|
+
returning next_version_number - 1 into reserved;
|
|
51
|
+
|
|
52
|
+
if reserved is null then
|
|
53
|
+
raise exception 'definition % not found', g using errcode = 'no_data_found';
|
|
54
|
+
end if;
|
|
55
|
+
|
|
56
|
+
return reserved;
|
|
57
|
+
end;
|
|
58
|
+
$$;
|
|
59
|
+
grant execute on function selva.reserve_next_version_number(uuid) to authenticated, service_role;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
-- ============================================================================
|
|
2
|
+
-- Per-definition durable solve-cache quota (caching Phase 3 / R9)
|
|
3
|
+
-- ============================================================================
|
|
4
|
+
--
|
|
5
|
+
-- `solve_cache_limit` is the definition's L2 solve-cache policy, one number:
|
|
6
|
+
-- NULL → inherit the global default (SOLVE_CACHE_DEFAULT_MAX_ENTRIES)
|
|
7
|
+
-- 0 → caching off for this definition (non-determinism / wide-input escape hatch)
|
|
8
|
+
-- N → keep at most N cached solves for this definition
|
|
9
|
+
--
|
|
10
|
+
-- Nullable, no default: an absent value MEANS inherit, so existing rows need no
|
|
11
|
+
-- backfill — they simply inherit the global default until an author sets a value.
|
|
12
|
+
|
|
13
|
+
alter table selva.definitions
|
|
14
|
+
add column if not exists solve_cache_limit integer
|
|
15
|
+
check (solve_cache_limit is null or solve_cache_limit >= 0);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conformance.test.d.ts","sourceRoot":"","sources":["../../../src/auth/__tests__/conformance.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { describe, beforeEach, it } from 'vitest';
|
|
2
|
-
import { runAuthProviderConformance, runEmailLinkAuthConformance } from '@selvajs/platform/testing';
|
|
3
|
-
import { SupabaseAuthProvider } from '../SupabaseAuthProvider.js';
|
|
4
|
-
import { readEnv, resetAllData } from '../../data/__tests__/test-helpers.js';
|
|
5
|
-
const envCtx = readEnv();
|
|
6
|
-
if (!envCtx) {
|
|
7
|
-
describe.skip('SupabaseAuthProvider (skipped: no live stack)', () => {
|
|
8
|
-
it('populate packages/providers/supabase/.env.test with Supabase creds to run these tests', () => { });
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
else {
|
|
12
|
-
const ctx = envCtx; // non-null in this branch
|
|
13
|
-
// The auth conformance suite expects `verifyLogin('', adminPassword)` to
|
|
14
|
-
// succeed. Supabase requires a non-empty email, so we seed a deterministic
|
|
15
|
-
// admin email and have the suite use that via the `adminEmail` option.
|
|
16
|
-
const ADMIN_EMAIL = 'admin@conformance.test';
|
|
17
|
-
const ADMIN_PASSWORD = 'conformance-admin-password-1234';
|
|
18
|
-
async function ensureAdmin() {
|
|
19
|
-
const { data: existing } = await ctx.adminClient.auth.admin.listUsers({ perPage: 1000 });
|
|
20
|
-
const match = existing.users.find((u) => u.email === ADMIN_EMAIL);
|
|
21
|
-
if (match)
|
|
22
|
-
return match.id;
|
|
23
|
-
const { data, error } = await ctx.adminClient.auth.admin.createUser({
|
|
24
|
-
email: ADMIN_EMAIL,
|
|
25
|
-
password: ADMIN_PASSWORD,
|
|
26
|
-
email_confirm: true
|
|
27
|
-
});
|
|
28
|
-
if (error)
|
|
29
|
-
throw error;
|
|
30
|
-
return data.user.id;
|
|
31
|
-
}
|
|
32
|
-
async function makeProvider() {
|
|
33
|
-
const provider = new SupabaseAuthProvider({
|
|
34
|
-
supabaseUrl: ctx.url,
|
|
35
|
-
anonKey: ctx.anonKey,
|
|
36
|
-
serviceRoleKey: ctx.serviceRoleKey
|
|
37
|
-
});
|
|
38
|
-
// Ensure the admin account exists + has instance_admin.
|
|
39
|
-
const id = await ensureAdmin();
|
|
40
|
-
const { error: upError } = await ctx.adminClient
|
|
41
|
-
.from('user_profiles')
|
|
42
|
-
.update({ platform_permissions: ['instance_admin'] })
|
|
43
|
-
.eq('user_id', id);
|
|
44
|
-
if (upError)
|
|
45
|
-
throw upError;
|
|
46
|
-
return { provider, adminPassword: ADMIN_PASSWORD };
|
|
47
|
-
}
|
|
48
|
-
describe('SupabaseAuthProvider', () => {
|
|
49
|
-
beforeEach(async () => {
|
|
50
|
-
await resetAllData(ctx);
|
|
51
|
-
});
|
|
52
|
-
runAuthProviderConformance({
|
|
53
|
-
name: 'SupabaseAuthProvider',
|
|
54
|
-
createProvider: async () => {
|
|
55
|
-
const { provider, adminPassword } = await makeProvider();
|
|
56
|
-
return { provider, adminPassword, adminEmail: ADMIN_EMAIL };
|
|
57
|
-
},
|
|
58
|
-
userManagement: true
|
|
59
|
-
});
|
|
60
|
-
runEmailLinkAuthConformance({
|
|
61
|
-
name: 'SupabaseEmailLinkAuth',
|
|
62
|
-
createAdapter: async () => {
|
|
63
|
-
const { provider } = await makeProvider();
|
|
64
|
-
return {
|
|
65
|
-
adapter: provider.emailLink,
|
|
66
|
-
// `validEmail` isn't used by the suite for live mail delivery;
|
|
67
|
-
// it just needs to look like a real address. The malformed
|
|
68
|
-
// case is what we actually assert on.
|
|
69
|
-
validEmail: 'real-looking@conformance.test',
|
|
70
|
-
invalidEmail: 'not-an-email-address'
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=conformance.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conformance.test.js","sourceRoot":"","sources":["../../../src/auth/__tests__/conformance.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compute-server-conformance.test.d.ts","sourceRoot":"","sources":["../../../src/data/__tests__/compute-server-conformance.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { describe, beforeEach, it } from 'vitest';
|
|
2
|
-
import { runComputeServerStoreConformance } from '@selvajs/platform/testing';
|
|
3
|
-
import { SupabaseComputeServerStore } from '../SupabaseComputeServerStore.js';
|
|
4
|
-
import { readEnv, resetAllData, seedUser } from './test-helpers.js';
|
|
5
|
-
const envCtx = readEnv();
|
|
6
|
-
if (!envCtx) {
|
|
7
|
-
describe.skip('SupabaseComputeServerStore (skipped: no live stack)', () => {
|
|
8
|
-
it('populate packages/providers/supabase/.env.test with Supabase creds to run these tests', () => { });
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
else {
|
|
12
|
-
describe('SupabaseComputeServerStore', () => {
|
|
13
|
-
beforeEach(async () => {
|
|
14
|
-
await resetAllData(envCtx);
|
|
15
|
-
});
|
|
16
|
-
runComputeServerStoreConformance({
|
|
17
|
-
name: 'SupabaseComputeServerStore',
|
|
18
|
-
createStore: () => new SupabaseComputeServerStore(envCtx.bundle),
|
|
19
|
-
seedOrg: async (orgId) => {
|
|
20
|
-
// `compute_servers.owner_org_id` and `compute_server_org_defaults.org_id`
|
|
21
|
-
// FK to `orgs(id)`; the suite invents an `orgId` per org-scoped test,
|
|
22
|
-
// so we materialize the parent org here. Owner is a throwaway user
|
|
23
|
-
// (the org-scoped tests use SYSTEM_CONTEXT for writes anyway).
|
|
24
|
-
const { userId } = await seedUser(envCtx, '');
|
|
25
|
-
const now = new Date().toISOString();
|
|
26
|
-
const { error } = await envCtx.adminClient.from('orgs').insert({
|
|
27
|
-
id: orgId,
|
|
28
|
-
name: 'Compute Test Org',
|
|
29
|
-
slug: `compute-${orgId.slice(0, 8)}`,
|
|
30
|
-
owner_id: userId,
|
|
31
|
-
created_at: now,
|
|
32
|
-
updated_at: now
|
|
33
|
-
});
|
|
34
|
-
if (error)
|
|
35
|
-
throw error;
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=compute-server-conformance.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compute-server-conformance.test.js","sourceRoot":"","sources":["../../../src/data/__tests__/compute-server-conformance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;AAEzB,IAAI,CAAC,MAAM,EAAE,CAAC;IACb,QAAQ,CAAC,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;QACzE,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;AACJ,CAAC;KAAM,CAAC;IACP,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC3C,UAAU,CAAC,KAAK,IAAI,EAAE;YACrB,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,gCAAgC,CAAC;YAChC,IAAI,EAAE,4BAA4B;YAClC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,0BAA0B,CAAC,MAAM,CAAC,MAAM,CAAC;YAChE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACxB,0EAA0E;gBAC1E,sEAAsE;gBACtE,mEAAmE;gBACnE,+DAA+D;gBAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACrC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;oBAC9D,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,kBAAkB;oBACxB,IAAI,EAAE,WAAW,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;oBACpC,QAAQ,EAAE,MAAM;oBAChB,UAAU,EAAE,GAAG;oBACf,UAAU,EAAE,GAAG;iBACf,CAAC,CAAC;gBACH,IAAI,KAAK;oBAAE,MAAM,KAAK,CAAC;YACxB,CAAC;SACD,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"definition-conformance.test.d.ts","sourceRoot":"","sources":["../../../src/data/__tests__/definition-conformance.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { describe, beforeEach, it } from 'vitest';
|
|
2
|
-
import { runDefinitionStoreConformance } from '@selvajs/platform/testing';
|
|
3
|
-
import { DEFAULT_ORG_PERMISSIONS } from '@selvajs/platform';
|
|
4
|
-
import { SupabaseDefinitionStore } from '../SupabaseDefinitionStore.js';
|
|
5
|
-
import { readEnv, resetAllData, seedUser } from './test-helpers.js';
|
|
6
|
-
const envCtx = readEnv();
|
|
7
|
-
if (!envCtx) {
|
|
8
|
-
describe.skip('SupabaseDefinitionStore (skipped: no live stack)', () => {
|
|
9
|
-
it('populate packages/providers/supabase/.env.test with Supabase creds to run these tests', () => { });
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
describe('SupabaseDefinitionStore', () => {
|
|
14
|
-
beforeEach(async () => {
|
|
15
|
-
await resetAllData(envCtx);
|
|
16
|
-
});
|
|
17
|
-
runDefinitionStoreConformance({
|
|
18
|
-
name: 'SupabaseDefinitionStore',
|
|
19
|
-
createStore: () => new SupabaseDefinitionStore(envCtx.bundle),
|
|
20
|
-
createScope: async () => {
|
|
21
|
-
// Seed: 1 owner + 1 secondary user + 1 org + 2 projects. Definitions
|
|
22
|
-
// created in the suite FK to one of those two projects.
|
|
23
|
-
const { userId: ownerId, sessionToken: ownerSessionToken } = await seedUser(envCtx, '');
|
|
24
|
-
const { userId: secondaryUserId, sessionToken: secondaryUserSessionToken } = await seedUser(envCtx, '');
|
|
25
|
-
const orgId = crypto.randomUUID();
|
|
26
|
-
const projectId = crypto.randomUUID();
|
|
27
|
-
const secondaryProjectId = crypto.randomUUID();
|
|
28
|
-
const now = new Date().toISOString();
|
|
29
|
-
const admin = envCtx.adminClient;
|
|
30
|
-
const { error: orgError } = await admin.from('orgs').insert({
|
|
31
|
-
id: orgId,
|
|
32
|
-
name: 'Definition Test Org',
|
|
33
|
-
slug: `def-test-${orgId.slice(0, 8)}`,
|
|
34
|
-
owner_id: ownerId,
|
|
35
|
-
created_at: now,
|
|
36
|
-
updated_at: now
|
|
37
|
-
});
|
|
38
|
-
if (orgError)
|
|
39
|
-
throw orgError;
|
|
40
|
-
const { error: memberError } = await admin.from('org_members').insert({
|
|
41
|
-
org_id: orgId,
|
|
42
|
-
user_id: ownerId,
|
|
43
|
-
role: 'owner',
|
|
44
|
-
permissions: [...DEFAULT_ORG_PERMISSIONS.owner],
|
|
45
|
-
joined_at: now
|
|
46
|
-
});
|
|
47
|
-
if (memberError)
|
|
48
|
-
throw memberError;
|
|
49
|
-
const { error: p1Error } = await admin.from('projects').insert([
|
|
50
|
-
{
|
|
51
|
-
id: projectId,
|
|
52
|
-
org_id: orgId,
|
|
53
|
-
name: 'Project A',
|
|
54
|
-
slug: `proj-a-${projectId.slice(0, 8)}`,
|
|
55
|
-
visibility: 'public',
|
|
56
|
-
owner_id: ownerId,
|
|
57
|
-
created_at: now,
|
|
58
|
-
updated_at: now
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
id: secondaryProjectId,
|
|
62
|
-
org_id: orgId,
|
|
63
|
-
name: 'Project B',
|
|
64
|
-
slug: `proj-b-${secondaryProjectId.slice(0, 8)}`,
|
|
65
|
-
visibility: 'public',
|
|
66
|
-
owner_id: ownerId,
|
|
67
|
-
created_at: now,
|
|
68
|
-
updated_at: now
|
|
69
|
-
}
|
|
70
|
-
]);
|
|
71
|
-
if (p1Error)
|
|
72
|
-
throw p1Error;
|
|
73
|
-
return {
|
|
74
|
-
ownerId,
|
|
75
|
-
ownerSessionToken,
|
|
76
|
-
projectId,
|
|
77
|
-
secondaryProjectId,
|
|
78
|
-
secondaryUserId,
|
|
79
|
-
secondaryUserSessionToken
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=definition-conformance.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"definition-conformance.test.js","sourceRoot":"","sources":["../../../src/data/__tests__/definition-conformance.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-sink-conformance.test.d.ts","sourceRoot":"","sources":["../../../src/data/__tests__/event-sink-conformance.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { describe, beforeEach, it } from 'vitest';
|
|
2
|
-
import { runEventSinkConformance } from '@selvajs/platform/testing';
|
|
3
|
-
import { SupabaseDataProvider } from '../SupabaseDataProvider.js';
|
|
4
|
-
import { readEnv, resetAllData, seedUser } from './test-helpers.js';
|
|
5
|
-
const envCtx = readEnv();
|
|
6
|
-
if (!envCtx) {
|
|
7
|
-
describe.skip('SupabaseDataProvider event-sink (skipped: no live stack)', () => {
|
|
8
|
-
it('populate packages/providers/supabase/.env.test with Supabase creds to run these tests', () => { });
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
else {
|
|
12
|
-
describe('SupabaseDataProvider event-sink', () => {
|
|
13
|
-
beforeEach(async () => {
|
|
14
|
-
await resetAllData(envCtx);
|
|
15
|
-
});
|
|
16
|
-
runEventSinkConformance({
|
|
17
|
-
name: 'SupabaseDataProvider',
|
|
18
|
-
createProvider: (sink) => SupabaseDataProvider.create({
|
|
19
|
-
supabaseUrl: envCtx.url,
|
|
20
|
-
anonKey: envCtx.anonKey,
|
|
21
|
-
serviceRoleKey: envCtx.serviceRoleKey
|
|
22
|
-
}, sink),
|
|
23
|
-
createActorId: () => seedUser(envCtx, '')
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=event-sink-conformance.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-sink-conformance.test.js","sourceRoot":"","sources":["../../../src/data/__tests__/event-sink-conformance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAA2B,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;AAEzB,IAAI,CAAC,MAAM,EAAE,CAAC;IACb,QAAQ,CAAC,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAC9E,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;AACJ,CAAC;KAAM,CAAC;IACP,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAChD,UAAU,CAAC,KAAK,IAAI,EAAE;YACrB,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,uBAAuB,CAAC;YACvB,IAAI,EAAE,sBAAsB;YAC5B,cAAc,EAAE,CAAC,IAAwB,EAAE,EAAE,CAC5C,oBAAoB,CAAC,MAAM,CAC1B;gBACC,WAAW,EAAE,MAAM,CAAC,GAAG;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,cAAc,EAAE,MAAM,CAAC,cAAc;aACrC,EACD,IAAI,CACJ;YACF,aAAa,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;SACzC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invite-conformance.test.d.ts","sourceRoot":"","sources":["../../../src/data/__tests__/invite-conformance.test.ts"],"names":[],"mappings":""}
|