@selvajs/supabase-provider 0.14.4-beta.0 → 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 (144) hide show
  1. package/LICENSE +1 -1
  2. package/dist/auth/SupabaseAuthProvider.d.ts.map +1 -1
  3. package/dist/auth/SupabaseAuthProvider.js +7 -14
  4. package/dist/auth/SupabaseAuthProvider.js.map +1 -1
  5. package/dist/data/SupabaseDataProvider.d.ts +13 -1
  6. package/dist/data/SupabaseDataProvider.d.ts.map +1 -1
  7. package/dist/data/SupabaseDataProvider.js +59 -0
  8. package/dist/data/SupabaseDataProvider.js.map +1 -1
  9. package/dist/data/SupabaseDefinitionStore.d.ts +1 -0
  10. package/dist/data/SupabaseDefinitionStore.d.ts.map +1 -1
  11. package/dist/data/SupabaseDefinitionStore.js +27 -1
  12. package/dist/data/SupabaseDefinitionStore.js.map +1 -1
  13. package/dist/data/index.d.ts +1 -0
  14. package/dist/data/index.d.ts.map +1 -1
  15. package/dist/data/index.js +1 -0
  16. package/dist/data/index.js.map +1 -1
  17. package/dist/data/migrationHead.d.ts +14 -0
  18. package/dist/data/migrationHead.d.ts.map +1 -0
  19. package/dist/data/migrationHead.js +14 -0
  20. package/dist/data/migrationHead.js.map +1 -0
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/permissions/SupabasePlatformPermissionStore.d.ts +5 -3
  26. package/dist/permissions/SupabasePlatformPermissionStore.d.ts.map +1 -1
  27. package/dist/permissions/SupabasePlatformPermissionStore.js +17 -30
  28. package/dist/permissions/SupabasePlatformPermissionStore.js.map +1 -1
  29. package/dist/storage/SupabaseStorageProvider.d.ts.map +1 -1
  30. package/dist/storage/SupabaseStorageProvider.js +3 -0
  31. package/dist/storage/SupabaseStorageProvider.js.map +1 -1
  32. package/package.json +13 -14
  33. package/supabase/.branches/_current_branch +1 -0
  34. package/supabase/.temp/cli-latest +1 -0
  35. package/supabase/migrations/20260712120000_user_profiles_disabled_and_gin.sql +95 -0
  36. package/supabase/migrations/20260712123000_selva_migration_head_fn.sql +38 -0
  37. package/supabase/migrations/20260713120000_selva_next_version_number.sql +59 -0
  38. package/supabase/migrations/20260713140000_selva_solve_cache_limit.sql +15 -0
  39. package/dist/auth/__tests__/conformance.test.d.ts +0 -2
  40. package/dist/auth/__tests__/conformance.test.d.ts.map +0 -1
  41. package/dist/auth/__tests__/conformance.test.js +0 -76
  42. package/dist/auth/__tests__/conformance.test.js.map +0 -1
  43. package/dist/auth/__tests__/token-verification.test.d.ts +0 -13
  44. package/dist/auth/__tests__/token-verification.test.d.ts.map +0 -1
  45. package/dist/auth/__tests__/token-verification.test.js +0 -135
  46. package/dist/auth/__tests__/token-verification.test.js.map +0 -1
  47. package/dist/data/__tests__/compute-server-conformance.test.d.ts +0 -2
  48. package/dist/data/__tests__/compute-server-conformance.test.d.ts.map +0 -1
  49. package/dist/data/__tests__/compute-server-conformance.test.js +0 -45
  50. package/dist/data/__tests__/compute-server-conformance.test.js.map +0 -1
  51. package/dist/data/__tests__/compute-server-encryption.test.d.ts +0 -12
  52. package/dist/data/__tests__/compute-server-encryption.test.d.ts.map +0 -1
  53. package/dist/data/__tests__/compute-server-encryption.test.js +0 -143
  54. package/dist/data/__tests__/compute-server-encryption.test.js.map +0 -1
  55. package/dist/data/__tests__/definition-conformance.test.d.ts +0 -2
  56. package/dist/data/__tests__/definition-conformance.test.d.ts.map +0 -1
  57. package/dist/data/__tests__/definition-conformance.test.js +0 -85
  58. package/dist/data/__tests__/definition-conformance.test.js.map +0 -1
  59. package/dist/data/__tests__/event-sink-conformance.test.d.ts +0 -2
  60. package/dist/data/__tests__/event-sink-conformance.test.d.ts.map +0 -1
  61. package/dist/data/__tests__/event-sink-conformance.test.js +0 -27
  62. package/dist/data/__tests__/event-sink-conformance.test.js.map +0 -1
  63. package/dist/data/__tests__/invite-conformance.test.d.ts +0 -2
  64. package/dist/data/__tests__/invite-conformance.test.d.ts.map +0 -1
  65. package/dist/data/__tests__/invite-conformance.test.js +0 -45
  66. package/dist/data/__tests__/invite-conformance.test.js.map +0 -1
  67. package/dist/data/__tests__/org-conformance.test.d.ts +0 -2
  68. package/dist/data/__tests__/org-conformance.test.d.ts.map +0 -1
  69. package/dist/data/__tests__/org-conformance.test.js +0 -29
  70. package/dist/data/__tests__/org-conformance.test.js.map +0 -1
  71. package/dist/data/__tests__/project-conformance.test.d.ts +0 -2
  72. package/dist/data/__tests__/project-conformance.test.d.ts.map +0 -1
  73. package/dist/data/__tests__/project-conformance.test.js +0 -57
  74. package/dist/data/__tests__/project-conformance.test.js.map +0 -1
  75. package/dist/data/__tests__/share-link-concurrency.test.d.ts +0 -22
  76. package/dist/data/__tests__/share-link-concurrency.test.d.ts.map +0 -1
  77. package/dist/data/__tests__/share-link-concurrency.test.js +0 -115
  78. package/dist/data/__tests__/share-link-concurrency.test.js.map +0 -1
  79. package/dist/data/__tests__/share-link-conformance.test.d.ts +0 -2
  80. package/dist/data/__tests__/share-link-conformance.test.d.ts.map +0 -1
  81. package/dist/data/__tests__/share-link-conformance.test.js +0 -88
  82. package/dist/data/__tests__/share-link-conformance.test.js.map +0 -1
  83. package/dist/data/__tests__/solve-metric-sink-conformance.test.d.ts +0 -2
  84. package/dist/data/__tests__/solve-metric-sink-conformance.test.d.ts.map +0 -1
  85. package/dist/data/__tests__/solve-metric-sink-conformance.test.js +0 -52
  86. package/dist/data/__tests__/solve-metric-sink-conformance.test.js.map +0 -1
  87. package/dist/data/__tests__/test-helpers.d.ts +0 -52
  88. package/dist/data/__tests__/test-helpers.d.ts.map +0 -1
  89. package/dist/data/__tests__/test-helpers.js +0 -177
  90. package/dist/data/__tests__/test-helpers.js.map +0 -1
  91. package/dist/permissions/__tests__/conformance.test.d.ts +0 -2
  92. package/dist/permissions/__tests__/conformance.test.d.ts.map +0 -1
  93. package/dist/permissions/__tests__/conformance.test.js +0 -27
  94. package/dist/permissions/__tests__/conformance.test.js.map +0 -1
  95. package/dist/storage/__tests__/conformance.test.d.ts +0 -2
  96. package/dist/storage/__tests__/conformance.test.d.ts.map +0 -1
  97. package/dist/storage/__tests__/conformance.test.js +0 -149
  98. package/dist/storage/__tests__/conformance.test.js.map +0 -1
  99. package/dist/userProfile/__tests__/conformance.test.d.ts +0 -2
  100. package/dist/userProfile/__tests__/conformance.test.d.ts.map +0 -1
  101. package/dist/userProfile/__tests__/conformance.test.js +0 -38
  102. package/dist/userProfile/__tests__/conformance.test.js.map +0 -1
  103. package/src/auth/SupabaseAuthProvider.ts +0 -600
  104. package/src/auth/__tests__/conformance.test.ts +0 -78
  105. package/src/auth/__tests__/token-verification.test.ts +0 -158
  106. package/src/auth/index.ts +0 -2
  107. package/src/cli/sync-migrations.ts +0 -133
  108. package/src/data/SupabaseAuditQuery.ts +0 -103
  109. package/src/data/SupabaseComputeServerStore.ts +0 -382
  110. package/src/data/SupabaseDataProvider.ts +0 -153
  111. package/src/data/SupabaseDefinitionStore.ts +0 -527
  112. package/src/data/SupabaseEventSink.ts +0 -30
  113. package/src/data/SupabaseInviteStore.ts +0 -171
  114. package/src/data/SupabaseOrgStore.ts +0 -508
  115. package/src/data/SupabaseProjectStore.ts +0 -431
  116. package/src/data/SupabaseShareLinkStore.ts +0 -176
  117. package/src/data/SupabaseSolveMetricSink.ts +0 -38
  118. package/src/data/__tests__/compute-server-conformance.test.ts +0 -46
  119. package/src/data/__tests__/compute-server-encryption.test.ts +0 -173
  120. package/src/data/__tests__/definition-conformance.test.ts +0 -89
  121. package/src/data/__tests__/event-sink-conformance.test.ts +0 -32
  122. package/src/data/__tests__/invite-conformance.test.ts +0 -46
  123. package/src/data/__tests__/org-conformance.test.ts +0 -30
  124. package/src/data/__tests__/project-conformance.test.ts +0 -57
  125. package/src/data/__tests__/share-link-concurrency.test.ts +0 -124
  126. package/src/data/__tests__/share-link-conformance.test.ts +0 -87
  127. package/src/data/__tests__/solve-metric-sink-conformance.test.ts +0 -59
  128. package/src/data/__tests__/test-helpers.ts +0 -188
  129. package/src/data/client.ts +0 -173
  130. package/src/data/errors.ts +0 -45
  131. package/src/data/index.ts +0 -29
  132. package/src/data/pagination.ts +0 -68
  133. package/src/data/query.ts +0 -22
  134. package/src/data/rowStamp.ts +0 -48
  135. package/src/index.ts +0 -42
  136. package/src/permissions/SupabasePlatformPermissionStore.ts +0 -161
  137. package/src/permissions/__tests__/conformance.test.ts +0 -28
  138. package/src/permissions/index.ts +0 -1
  139. package/src/storage/SupabaseStorageProvider.ts +0 -182
  140. package/src/storage/__tests__/conformance.test.ts +0 -152
  141. package/src/storage/index.ts +0 -2
  142. package/src/userProfile/SupabaseUserProfileProvider.ts +0 -177
  143. package/src/userProfile/__tests__/conformance.test.ts +0 -39
  144. package/src/userProfile/index.ts +0 -1
@@ -1,4 +1,4 @@
1
- import { ProviderError, hasPermission, PlatformPermissionSchema } from '@selvajs/platform';
1
+ import { ProviderError, hasPermission, ALL_PLATFORM_PERMISSIONS } from '@selvajs/platform';
2
2
  /**
3
3
  * Supabase-backed platform-permission store. Reads and writes
4
4
  * `public.user_profiles.platform_permissions` (auto-seeded by the
@@ -6,9 +6,11 @@ import { ProviderError, hasPermission, PlatformPermissionSchema } from '@selvajs
6
6
  * `assertAdmin` / `assertCanRead` enforce the auth boundary at the app level
7
7
  * since RLS on `user_profiles` is coarse-grained for cross-user reads.
8
8
  *
9
- * Disabled-user state lives on `auth.users.user_metadata.disabled`, so the
10
- * invariant counters cross-reference the auth backend to exclude disabled
11
- * admins (matches `Permissions.md §10` "enabled instance_admin" semantics).
9
+ * Disabled-user state is sourced from `auth.users.user_metadata.disabled` and
10
+ * mirrored into `user_profiles.disabled` by the `sync_auth_user_disabled`
11
+ * trigger, so the invariant counters exclude disabled admins in a single
12
+ * indexed query (matches `Permissions.md §10` "enabled instance_admin"
13
+ * semantics) instead of cross-referencing the auth admin API per candidate.
12
14
  */
13
15
  export class SupabasePlatformPermissionStore {
14
16
  clients;
@@ -77,48 +79,33 @@ export class SupabasePlatformPermissionStore {
77
79
  return 'ok';
78
80
  }
79
81
  async hasInstanceAdmin(_ctx) {
80
- const { data, error } = await this.client()
82
+ const { count, error } = await this.client()
81
83
  .from('user_profiles')
82
- .select('user_id')
83
- .contains('platform_permissions', ['instance_admin']);
84
+ .select('user_id', { count: 'exact', head: true })
85
+ .contains('platform_permissions', ['instance_admin'])
86
+ .eq('disabled', false);
84
87
  if (error)
85
88
  throw mapError(error);
86
- const candidates = (data ?? []).map((r) => r.user_id);
87
- if (candidates.length === 0)
88
- return false;
89
- // Check at least one isn't disabled.
90
- for (const id of candidates) {
91
- const { data: authData } = await this.clients.serviceClient.auth.admin.getUserById(id);
92
- if (authData.user && authData.user.user_metadata?.disabled !== true)
93
- return true;
94
- }
95
- return false;
89
+ return (count ?? 0) > 0;
96
90
  }
97
91
  async countInstanceAdminsExcluding(_ctx, excludeUserId) {
98
92
  return this.countOtherEnabledAdmins(excludeUserId);
99
93
  }
100
94
  async countOtherEnabledAdmins(excludeUserId) {
101
- const { data, error } = await this.client()
95
+ const { count, error } = await this.client()
102
96
  .from('user_profiles')
103
- .select('user_id')
97
+ .select('user_id', { count: 'exact', head: true })
104
98
  .contains('platform_permissions', ['instance_admin'])
99
+ .eq('disabled', false)
105
100
  .neq('user_id', excludeUserId);
106
101
  if (error)
107
102
  throw mapError(error);
108
- const candidates = (data ?? []).map((r) => r.user_id);
109
- if (candidates.length === 0)
110
- return 0;
111
- let count = 0;
112
- for (const id of candidates) {
113
- const { data: authData } = await this.clients.serviceClient.auth.admin.getUserById(id);
114
- if (authData.user && authData.user.user_metadata?.disabled !== true)
115
- count += 1;
116
- }
117
- return count;
103
+ return count ?? 0;
118
104
  }
119
105
  }
106
+ const VALID_PERMISSIONS = new Set(ALL_PLATFORM_PERMISSIONS);
120
107
  function filterValid(raw) {
121
- return raw.filter((p) => PlatformPermissionSchema.safeParse(p).success);
108
+ return raw.filter((p) => VALID_PERMISSIONS.has(p));
122
109
  }
123
110
  function assertCanRead(ctx, userId) {
124
111
  if (ctx.system)
@@ -1 +1 @@
1
- {"version":3,"file":"SupabasePlatformPermissionStore.js","sourceRoot":"","sources":["../../src/permissions/SupabasePlatformPermissionStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SupabasePlatformPermissionStore.js","sourceRoot":"","sources":["../../src/permissions/SupabasePlatformPermissionStore.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SupabaseStorageProvider.d.ts","sourceRoot":"","sources":["../../src/storage/SupabaseStorageProvider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,6BAA6B;IAC7C,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,uBAAwB,YAAW,gBAAgB;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,uBAAuB;gBAcpE,MAAM,EAAE,6BAA6B;IAWjD;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;IAOX,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAcpD,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/E,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1C,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YASnC,oBAAoB;IAYlC;;;OAGG;YACW,WAAW;IAuBzB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAOzC"}
1
+ {"version":3,"file":"SupabaseStorageProvider.d.ts","sourceRoot":"","sources":["../../src/storage/SupabaseStorageProvider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,6BAA6B;IAC7C,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,uBAAwB,YAAW,gBAAgB;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,uBAAuB;gBAcpE,MAAM,EAAE,6BAA6B;IAWjD;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;IAOX,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAcpD,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/E,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1C,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YASnC,oBAAoB;IAYlC;;;OAGG;YACW,WAAW;IAuBzB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAOzC"}
@@ -71,6 +71,9 @@ export class SupabaseStorageProvider {
71
71
  .from(bucket)
72
72
  .upload(transcoded.path, transcoded.data, {
73
73
  contentType: transcoded.contentType,
74
+ // Objects are content-addressed (GUID/hash prefixes) and effectively
75
+ // immutable, so let CDN/browser cache them for a year.
76
+ cacheControl: '31536000',
74
77
  upsert: true
75
78
  });
76
79
  if (error)
@@ -1 +1 @@
1
- {"version":3,"file":"SupabaseStorageProvider.js","sourceRoot":"","sources":["../../src/storage/SupabaseStorageProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SupabaseStorageProvider.js","sourceRoot":"","sources":["../../src/storage/SupabaseStorageProvider.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@selvajs/supabase-provider",
3
- "version": "0.14.4-beta.0",
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.3-beta.0"
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,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,13 +0,0 @@
1
- /**
2
- * CI-runnable (no live stack) tests for §1b hybrid token verification. Stubs
3
- * the internal anon client's `getClaims` (local JWT verify) and `getUser`
4
- * (network GoTrue verify) so we can assert the network-call behavior directly.
5
- *
6
- * Contract:
7
- * - hybrid (default): verify locally via getClaims on every request; hit
8
- * getUser at most once per `revalidateMs` per session; a getUser rejection
9
- * during that recheck (sign-out / disabled) denies immediately.
10
- * - strict: getUser on every request.
11
- */
12
- export {};
13
- //# sourceMappingURL=token-verification.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"token-verification.test.d.ts","sourceRoot":"","sources":["../../../src/auth/__tests__/token-verification.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}