@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.
Files changed (160) hide show
  1. package/LICENSE +1 -1
  2. package/dist/auth/SupabaseAuthProvider.d.ts +57 -0
  3. package/dist/auth/SupabaseAuthProvider.d.ts.map +1 -1
  4. package/dist/auth/SupabaseAuthProvider.js +123 -18
  5. package/dist/auth/SupabaseAuthProvider.js.map +1 -1
  6. package/dist/data/SupabaseComputeServerStore.d.ts +34 -2
  7. package/dist/data/SupabaseComputeServerStore.d.ts.map +1 -1
  8. package/dist/data/SupabaseComputeServerStore.js +146 -39
  9. package/dist/data/SupabaseComputeServerStore.js.map +1 -1
  10. package/dist/data/SupabaseDataProvider.d.ts +18 -3
  11. package/dist/data/SupabaseDataProvider.d.ts.map +1 -1
  12. package/dist/data/SupabaseDataProvider.js +83 -18
  13. package/dist/data/SupabaseDataProvider.js.map +1 -1
  14. package/dist/data/SupabaseDefinitionStore.d.ts +3 -1
  15. package/dist/data/SupabaseDefinitionStore.d.ts.map +1 -1
  16. package/dist/data/SupabaseDefinitionStore.js +94 -67
  17. package/dist/data/SupabaseDefinitionStore.js.map +1 -1
  18. package/dist/data/SupabaseInviteStore.d.ts.map +1 -1
  19. package/dist/data/SupabaseInviteStore.js +11 -22
  20. package/dist/data/SupabaseInviteStore.js.map +1 -1
  21. package/dist/data/SupabaseOrgStore.d.ts.map +1 -1
  22. package/dist/data/SupabaseOrgStore.js +49 -86
  23. package/dist/data/SupabaseOrgStore.js.map +1 -1
  24. package/dist/data/SupabaseProjectStore.d.ts.map +1 -1
  25. package/dist/data/SupabaseProjectStore.js +51 -70
  26. package/dist/data/SupabaseProjectStore.js.map +1 -1
  27. package/dist/data/SupabaseShareLinkStore.d.ts.map +1 -1
  28. package/dist/data/SupabaseShareLinkStore.js +13 -27
  29. package/dist/data/SupabaseShareLinkStore.js.map +1 -1
  30. package/dist/data/client.d.ts +35 -3
  31. package/dist/data/client.d.ts.map +1 -1
  32. package/dist/data/client.js +67 -16
  33. package/dist/data/client.js.map +1 -1
  34. package/dist/data/errors.d.ts +2 -0
  35. package/dist/data/errors.d.ts.map +1 -0
  36. package/dist/data/errors.js +23 -0
  37. package/dist/data/errors.js.map +1 -0
  38. package/dist/data/index.d.ts +8 -2
  39. package/dist/data/index.d.ts.map +1 -1
  40. package/dist/data/index.js +6 -1
  41. package/dist/data/index.js.map +1 -1
  42. package/dist/data/migrationHead.d.ts +14 -0
  43. package/dist/data/migrationHead.d.ts.map +1 -0
  44. package/dist/data/migrationHead.js +14 -0
  45. package/dist/data/migrationHead.js.map +1 -0
  46. package/dist/data/query.d.ts +20 -0
  47. package/dist/data/query.d.ts.map +1 -0
  48. package/dist/data/query.js +13 -0
  49. package/dist/data/query.js.map +1 -0
  50. package/dist/data/rowStamp.d.ts +38 -0
  51. package/dist/data/rowStamp.d.ts.map +1 -0
  52. package/dist/data/rowStamp.js +43 -0
  53. package/dist/data/rowStamp.js.map +1 -0
  54. package/dist/index.d.ts +2 -2
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +1 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/permissions/SupabasePlatformPermissionStore.d.ts +5 -3
  59. package/dist/permissions/SupabasePlatformPermissionStore.d.ts.map +1 -1
  60. package/dist/permissions/SupabasePlatformPermissionStore.js +17 -30
  61. package/dist/permissions/SupabasePlatformPermissionStore.js.map +1 -1
  62. package/dist/storage/SupabaseStorageProvider.d.ts.map +1 -1
  63. package/dist/storage/SupabaseStorageProvider.js +3 -0
  64. package/dist/storage/SupabaseStorageProvider.js.map +1 -1
  65. package/package.json +13 -14
  66. package/supabase/.branches/_current_branch +1 -0
  67. package/supabase/.temp/cli-latest +1 -0
  68. package/supabase/migrations/20260711120000_selva_definition_schema_version.sql +18 -0
  69. package/supabase/migrations/20260712120000_user_profiles_disabled_and_gin.sql +95 -0
  70. package/supabase/migrations/20260712123000_selva_migration_head_fn.sql +38 -0
  71. package/supabase/migrations/20260713120000_selva_next_version_number.sql +59 -0
  72. package/supabase/migrations/20260713140000_selva_solve_cache_limit.sql +15 -0
  73. package/dist/auth/__tests__/conformance.test.d.ts +0 -2
  74. package/dist/auth/__tests__/conformance.test.d.ts.map +0 -1
  75. package/dist/auth/__tests__/conformance.test.js +0 -76
  76. package/dist/auth/__tests__/conformance.test.js.map +0 -1
  77. package/dist/data/__tests__/compute-server-conformance.test.d.ts +0 -2
  78. package/dist/data/__tests__/compute-server-conformance.test.d.ts.map +0 -1
  79. package/dist/data/__tests__/compute-server-conformance.test.js +0 -40
  80. package/dist/data/__tests__/compute-server-conformance.test.js.map +0 -1
  81. package/dist/data/__tests__/definition-conformance.test.d.ts +0 -2
  82. package/dist/data/__tests__/definition-conformance.test.d.ts.map +0 -1
  83. package/dist/data/__tests__/definition-conformance.test.js +0 -85
  84. package/dist/data/__tests__/definition-conformance.test.js.map +0 -1
  85. package/dist/data/__tests__/event-sink-conformance.test.d.ts +0 -2
  86. package/dist/data/__tests__/event-sink-conformance.test.d.ts.map +0 -1
  87. package/dist/data/__tests__/event-sink-conformance.test.js +0 -27
  88. package/dist/data/__tests__/event-sink-conformance.test.js.map +0 -1
  89. package/dist/data/__tests__/invite-conformance.test.d.ts +0 -2
  90. package/dist/data/__tests__/invite-conformance.test.d.ts.map +0 -1
  91. package/dist/data/__tests__/invite-conformance.test.js +0 -45
  92. package/dist/data/__tests__/invite-conformance.test.js.map +0 -1
  93. package/dist/data/__tests__/org-conformance.test.d.ts +0 -2
  94. package/dist/data/__tests__/org-conformance.test.d.ts.map +0 -1
  95. package/dist/data/__tests__/org-conformance.test.js +0 -29
  96. package/dist/data/__tests__/org-conformance.test.js.map +0 -1
  97. package/dist/data/__tests__/project-conformance.test.d.ts +0 -2
  98. package/dist/data/__tests__/project-conformance.test.d.ts.map +0 -1
  99. package/dist/data/__tests__/project-conformance.test.js +0 -57
  100. package/dist/data/__tests__/project-conformance.test.js.map +0 -1
  101. package/dist/data/__tests__/share-link-conformance.test.d.ts +0 -2
  102. package/dist/data/__tests__/share-link-conformance.test.d.ts.map +0 -1
  103. package/dist/data/__tests__/share-link-conformance.test.js +0 -88
  104. package/dist/data/__tests__/share-link-conformance.test.js.map +0 -1
  105. package/dist/data/__tests__/solve-metric-sink-conformance.test.d.ts +0 -2
  106. package/dist/data/__tests__/solve-metric-sink-conformance.test.d.ts.map +0 -1
  107. package/dist/data/__tests__/solve-metric-sink-conformance.test.js +0 -52
  108. package/dist/data/__tests__/solve-metric-sink-conformance.test.js.map +0 -1
  109. package/dist/data/__tests__/test-helpers.d.ts +0 -52
  110. package/dist/data/__tests__/test-helpers.d.ts.map +0 -1
  111. package/dist/data/__tests__/test-helpers.js +0 -177
  112. package/dist/data/__tests__/test-helpers.js.map +0 -1
  113. package/dist/permissions/__tests__/conformance.test.d.ts +0 -2
  114. package/dist/permissions/__tests__/conformance.test.d.ts.map +0 -1
  115. package/dist/permissions/__tests__/conformance.test.js +0 -27
  116. package/dist/permissions/__tests__/conformance.test.js.map +0 -1
  117. package/dist/storage/__tests__/conformance.test.d.ts +0 -2
  118. package/dist/storage/__tests__/conformance.test.d.ts.map +0 -1
  119. package/dist/storage/__tests__/conformance.test.js +0 -149
  120. package/dist/storage/__tests__/conformance.test.js.map +0 -1
  121. package/dist/userProfile/__tests__/conformance.test.d.ts +0 -2
  122. package/dist/userProfile/__tests__/conformance.test.d.ts.map +0 -1
  123. package/dist/userProfile/__tests__/conformance.test.js +0 -38
  124. package/dist/userProfile/__tests__/conformance.test.js.map +0 -1
  125. package/src/auth/SupabaseAuthProvider.ts +0 -464
  126. package/src/auth/__tests__/conformance.test.ts +0 -78
  127. package/src/auth/index.ts +0 -2
  128. package/src/cli/sync-migrations.ts +0 -133
  129. package/src/data/SupabaseAuditQuery.ts +0 -103
  130. package/src/data/SupabaseComputeServerStore.ts +0 -262
  131. package/src/data/SupabaseDataProvider.ts +0 -133
  132. package/src/data/SupabaseDefinitionStore.ts +0 -520
  133. package/src/data/SupabaseEventSink.ts +0 -30
  134. package/src/data/SupabaseInviteStore.ts +0 -183
  135. package/src/data/SupabaseOrgStore.ts +0 -552
  136. package/src/data/SupabaseProjectStore.ts +0 -454
  137. package/src/data/SupabaseShareLinkStore.ts +0 -191
  138. package/src/data/SupabaseSolveMetricSink.ts +0 -38
  139. package/src/data/__tests__/compute-server-conformance.test.ts +0 -40
  140. package/src/data/__tests__/definition-conformance.test.ts +0 -89
  141. package/src/data/__tests__/event-sink-conformance.test.ts +0 -32
  142. package/src/data/__tests__/invite-conformance.test.ts +0 -46
  143. package/src/data/__tests__/org-conformance.test.ts +0 -30
  144. package/src/data/__tests__/project-conformance.test.ts +0 -57
  145. package/src/data/__tests__/share-link-conformance.test.ts +0 -87
  146. package/src/data/__tests__/solve-metric-sink-conformance.test.ts +0 -59
  147. package/src/data/__tests__/test-helpers.ts +0 -188
  148. package/src/data/client.ts +0 -98
  149. package/src/data/index.ts +0 -12
  150. package/src/data/pagination.ts +0 -68
  151. package/src/index.ts +0 -24
  152. package/src/permissions/SupabasePlatformPermissionStore.ts +0 -161
  153. package/src/permissions/__tests__/conformance.test.ts +0 -28
  154. package/src/permissions/index.ts +0 -1
  155. package/src/storage/SupabaseStorageProvider.ts +0 -182
  156. package/src/storage/__tests__/conformance.test.ts +0 -152
  157. package/src/storage/index.ts +0 -2
  158. package/src/userProfile/SupabaseUserProfileProvider.ts +0 -177
  159. package/src/userProfile/__tests__/conformance.test.ts +0 -39
  160. 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",
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
- "src",
55
- "supabase"
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.14.2"
59
+ "@selvajs/platform": "^0.15.0-beta.1"
61
60
  },
62
61
  "devDependencies": {
63
- "@types/node": "^22.19.17",
62
+ "@types/node": "^22.20.1",
64
63
  "supabase": "^2.95.3",
65
- "typescript": "^5.9.3",
66
- "vitest": "^3.2.6"
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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=conformance.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=compute-server-conformance.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=definition-conformance.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=event-sink-conformance.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=invite-conformance.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invite-conformance.test.d.ts","sourceRoot":"","sources":["../../../src/data/__tests__/invite-conformance.test.ts"],"names":[],"mappings":""}