@selvajs/local-provider 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/dist/auth/LocalAuthProvider.d.ts +28 -0
  4. package/dist/auth/LocalAuthProvider.d.ts.map +1 -0
  5. package/dist/auth/LocalAuthProvider.js +142 -0
  6. package/dist/auth/LocalAuthProvider.js.map +1 -0
  7. package/dist/auth/__tests__/conformance.test.d.ts +2 -0
  8. package/dist/auth/__tests__/conformance.test.d.ts.map +1 -0
  9. package/dist/auth/__tests__/conformance.test.js +36 -0
  10. package/dist/auth/__tests__/conformance.test.js.map +1 -0
  11. package/dist/auth/hmac.d.ts +18 -0
  12. package/dist/auth/hmac.d.ts.map +1 -0
  13. package/dist/auth/hmac.js +41 -0
  14. package/dist/auth/hmac.js.map +1 -0
  15. package/dist/auth/index.d.ts +6 -0
  16. package/dist/auth/index.d.ts.map +1 -0
  17. package/dist/auth/index.js +4 -0
  18. package/dist/auth/index.js.map +1 -0
  19. package/dist/auth/users.d.ts +38 -0
  20. package/dist/auth/users.d.ts.map +1 -0
  21. package/dist/auth/users.js +100 -0
  22. package/dist/auth/users.js.map +1 -0
  23. package/dist/compute/FilesystemComputeProvider.d.ts +16 -0
  24. package/dist/compute/FilesystemComputeProvider.d.ts.map +1 -0
  25. package/dist/compute/FilesystemComputeProvider.js +51 -0
  26. package/dist/compute/FilesystemComputeProvider.js.map +1 -0
  27. package/dist/compute/SingleComputeServerProvider.d.ts +15 -0
  28. package/dist/compute/SingleComputeServerProvider.d.ts.map +1 -0
  29. package/dist/compute/SingleComputeServerProvider.js +26 -0
  30. package/dist/compute/SingleComputeServerProvider.js.map +1 -0
  31. package/dist/compute/types.d.ts +30 -0
  32. package/dist/compute/types.d.ts.map +1 -0
  33. package/dist/compute/types.js +2 -0
  34. package/dist/compute/types.js.map +1 -0
  35. package/dist/computeServer/FilesystemComputeServerStore.d.ts +14 -0
  36. package/dist/computeServer/FilesystemComputeServerStore.d.ts.map +1 -0
  37. package/dist/computeServer/FilesystemComputeServerStore.js +35 -0
  38. package/dist/computeServer/FilesystemComputeServerStore.js.map +1 -0
  39. package/dist/computeServer/LocalComputeServerProvider.d.ts +18 -0
  40. package/dist/computeServer/LocalComputeServerProvider.d.ts.map +1 -0
  41. package/dist/computeServer/LocalComputeServerProvider.js +29 -0
  42. package/dist/computeServer/LocalComputeServerProvider.js.map +1 -0
  43. package/dist/computeServer/__tests__/conformance.test.d.ts +2 -0
  44. package/dist/computeServer/__tests__/conformance.test.d.ts.map +1 -0
  45. package/dist/computeServer/__tests__/conformance.test.js +20 -0
  46. package/dist/computeServer/__tests__/conformance.test.js.map +1 -0
  47. package/dist/computeServer/index.d.ts +2 -0
  48. package/dist/computeServer/index.d.ts.map +1 -0
  49. package/dist/computeServer/index.js +2 -0
  50. package/dist/computeServer/index.js.map +1 -0
  51. package/dist/data/LocalComputeServerStore.d.ts +72 -0
  52. package/dist/data/LocalComputeServerStore.d.ts.map +1 -0
  53. package/dist/data/LocalComputeServerStore.js +207 -0
  54. package/dist/data/LocalComputeServerStore.js.map +1 -0
  55. package/dist/data/LocalDataProvider.d.ts +47 -0
  56. package/dist/data/LocalDataProvider.d.ts.map +1 -0
  57. package/dist/data/LocalDataProvider.js +118 -0
  58. package/dist/data/LocalDataProvider.js.map +1 -0
  59. package/dist/data/LocalDefinitionMetaProvider.d.ts +22 -0
  60. package/dist/data/LocalDefinitionMetaProvider.d.ts.map +1 -0
  61. package/dist/data/LocalDefinitionMetaProvider.js +131 -0
  62. package/dist/data/LocalDefinitionMetaProvider.js.map +1 -0
  63. package/dist/data/LocalDefinitionStore.d.ts +33 -0
  64. package/dist/data/LocalDefinitionStore.d.ts.map +1 -0
  65. package/dist/data/LocalDefinitionStore.js +274 -0
  66. package/dist/data/LocalDefinitionStore.js.map +1 -0
  67. package/dist/data/LocalInviteStore.d.ts +23 -0
  68. package/dist/data/LocalInviteStore.d.ts.map +1 -0
  69. package/dist/data/LocalInviteStore.js +98 -0
  70. package/dist/data/LocalInviteStore.js.map +1 -0
  71. package/dist/data/LocalOrgStore.d.ts +67 -0
  72. package/dist/data/LocalOrgStore.d.ts.map +1 -0
  73. package/dist/data/LocalOrgStore.js +255 -0
  74. package/dist/data/LocalOrgStore.js.map +1 -0
  75. package/dist/data/LocalPlatformProjectGrantStore.d.ts +14 -0
  76. package/dist/data/LocalPlatformProjectGrantStore.d.ts.map +1 -0
  77. package/dist/data/LocalPlatformProjectGrantStore.js +62 -0
  78. package/dist/data/LocalPlatformProjectGrantStore.js.map +1 -0
  79. package/dist/data/LocalProjectStore.d.ts +30 -0
  80. package/dist/data/LocalProjectStore.d.ts.map +1 -0
  81. package/dist/data/LocalProjectStore.js +171 -0
  82. package/dist/data/LocalProjectStore.js.map +1 -0
  83. package/dist/data/LocalShareLinkStore.d.ts +39 -0
  84. package/dist/data/LocalShareLinkStore.d.ts.map +1 -0
  85. package/dist/data/LocalShareLinkStore.js +108 -0
  86. package/dist/data/LocalShareLinkStore.js.map +1 -0
  87. package/dist/data/__tests__/LocalDefinitionMetaProvider.test.d.ts +2 -0
  88. package/dist/data/__tests__/LocalDefinitionMetaProvider.test.d.ts.map +1 -0
  89. package/dist/data/__tests__/LocalDefinitionMetaProvider.test.js +21 -0
  90. package/dist/data/__tests__/LocalDefinitionMetaProvider.test.js.map +1 -0
  91. package/dist/data/__tests__/cascade.test.d.ts +2 -0
  92. package/dist/data/__tests__/cascade.test.d.ts.map +1 -0
  93. package/dist/data/__tests__/cascade.test.js +265 -0
  94. package/dist/data/__tests__/cascade.test.js.map +1 -0
  95. package/dist/data/__tests__/compute-server-conformance.test.d.ts +2 -0
  96. package/dist/data/__tests__/compute-server-conformance.test.d.ts.map +1 -0
  97. package/dist/data/__tests__/compute-server-conformance.test.js +21 -0
  98. package/dist/data/__tests__/compute-server-conformance.test.js.map +1 -0
  99. package/dist/data/__tests__/compute-server-encryption.test.d.ts +2 -0
  100. package/dist/data/__tests__/compute-server-encryption.test.d.ts.map +1 -0
  101. package/dist/data/__tests__/compute-server-encryption.test.js +131 -0
  102. package/dist/data/__tests__/compute-server-encryption.test.js.map +1 -0
  103. package/dist/data/__tests__/definition-conformance.test.d.ts +2 -0
  104. package/dist/data/__tests__/definition-conformance.test.d.ts.map +1 -0
  105. package/dist/data/__tests__/definition-conformance.test.js +20 -0
  106. package/dist/data/__tests__/definition-conformance.test.js.map +1 -0
  107. package/dist/data/__tests__/event-sink-conformance.test.d.ts +2 -0
  108. package/dist/data/__tests__/event-sink-conformance.test.d.ts.map +1 -0
  109. package/dist/data/__tests__/event-sink-conformance.test.js +24 -0
  110. package/dist/data/__tests__/event-sink-conformance.test.js.map +1 -0
  111. package/dist/data/__tests__/invite-conformance.test.d.ts +2 -0
  112. package/dist/data/__tests__/invite-conformance.test.d.ts.map +1 -0
  113. package/dist/data/__tests__/invite-conformance.test.js +21 -0
  114. package/dist/data/__tests__/invite-conformance.test.js.map +1 -0
  115. package/dist/data/__tests__/org-conformance.test.d.ts +2 -0
  116. package/dist/data/__tests__/org-conformance.test.d.ts.map +1 -0
  117. package/dist/data/__tests__/org-conformance.test.js +36 -0
  118. package/dist/data/__tests__/org-conformance.test.js.map +1 -0
  119. package/dist/data/__tests__/platform-project-grant-conformance.test.d.ts +2 -0
  120. package/dist/data/__tests__/platform-project-grant-conformance.test.d.ts.map +1 -0
  121. package/dist/data/__tests__/platform-project-grant-conformance.test.js +20 -0
  122. package/dist/data/__tests__/platform-project-grant-conformance.test.js.map +1 -0
  123. package/dist/data/__tests__/project-conformance.test.d.ts +2 -0
  124. package/dist/data/__tests__/project-conformance.test.d.ts.map +1 -0
  125. package/dist/data/__tests__/project-conformance.test.js +53 -0
  126. package/dist/data/__tests__/project-conformance.test.js.map +1 -0
  127. package/dist/data/__tests__/rules.test.d.ts +2 -0
  128. package/dist/data/__tests__/rules.test.d.ts.map +1 -0
  129. package/dist/data/__tests__/rules.test.js +484 -0
  130. package/dist/data/__tests__/rules.test.js.map +1 -0
  131. package/dist/data/__tests__/share-link-conformance.test.d.ts +2 -0
  132. package/dist/data/__tests__/share-link-conformance.test.d.ts.map +1 -0
  133. package/dist/data/__tests__/share-link-conformance.test.js +20 -0
  134. package/dist/data/__tests__/share-link-conformance.test.js.map +1 -0
  135. package/dist/data/fsJson.d.ts +12 -0
  136. package/dist/data/fsJson.d.ts.map +1 -0
  137. package/dist/data/fsJson.js +29 -0
  138. package/dist/data/fsJson.js.map +1 -0
  139. package/dist/data/index.d.ts +13 -0
  140. package/dist/data/index.d.ts.map +1 -0
  141. package/dist/data/index.js +9 -0
  142. package/dist/data/index.js.map +1 -0
  143. package/dist/data/pagination.d.ts +15 -0
  144. package/dist/data/pagination.d.ts.map +1 -0
  145. package/dist/data/pagination.js +36 -0
  146. package/dist/data/pagination.js.map +1 -0
  147. package/dist/data/secretCrypto.d.ts +23 -0
  148. package/dist/data/secretCrypto.d.ts.map +1 -0
  149. package/dist/data/secretCrypto.js +64 -0
  150. package/dist/data/secretCrypto.js.map +1 -0
  151. package/dist/data/userData.d.ts +40 -0
  152. package/dist/data/userData.d.ts.map +1 -0
  153. package/dist/data/userData.js +84 -0
  154. package/dist/data/userData.js.map +1 -0
  155. package/dist/definitions/LocalDefinitionMetaProvider.d.ts +27 -0
  156. package/dist/definitions/LocalDefinitionMetaProvider.d.ts.map +1 -0
  157. package/dist/definitions/LocalDefinitionMetaProvider.js +188 -0
  158. package/dist/definitions/LocalDefinitionMetaProvider.js.map +1 -0
  159. package/dist/definitions/__tests__/conformance.test.d.ts +2 -0
  160. package/dist/definitions/__tests__/conformance.test.d.ts.map +1 -0
  161. package/dist/definitions/__tests__/conformance.test.js +20 -0
  162. package/dist/definitions/__tests__/conformance.test.js.map +1 -0
  163. package/dist/definitions/index.d.ts +2 -0
  164. package/dist/definitions/index.d.ts.map +1 -0
  165. package/dist/definitions/index.js +2 -0
  166. package/dist/definitions/index.js.map +1 -0
  167. package/dist/definitions/providers/filesystem-files.d.ts +24 -0
  168. package/dist/definitions/providers/filesystem-files.d.ts.map +1 -0
  169. package/dist/definitions/providers/filesystem-files.js +170 -0
  170. package/dist/definitions/providers/filesystem-files.js.map +1 -0
  171. package/dist/definitions/providers/filesystem-meta.d.ts +17 -0
  172. package/dist/definitions/providers/filesystem-meta.d.ts.map +1 -0
  173. package/dist/definitions/providers/filesystem-meta.js +216 -0
  174. package/dist/definitions/providers/filesystem-meta.js.map +1 -0
  175. package/dist/fsJson.d.ts +12 -0
  176. package/dist/fsJson.d.ts.map +1 -0
  177. package/dist/fsJson.js +29 -0
  178. package/dist/fsJson.js.map +1 -0
  179. package/dist/index.d.ts +13 -0
  180. package/dist/index.d.ts.map +1 -0
  181. package/dist/index.js +16 -0
  182. package/dist/index.js.map +1 -0
  183. package/dist/invites/LocalInviteProvider.d.ts +24 -0
  184. package/dist/invites/LocalInviteProvider.d.ts.map +1 -0
  185. package/dist/invites/LocalInviteProvider.js +89 -0
  186. package/dist/invites/LocalInviteProvider.js.map +1 -0
  187. package/dist/invites/__tests__/conformance.test.d.ts +2 -0
  188. package/dist/invites/__tests__/conformance.test.d.ts.map +1 -0
  189. package/dist/invites/__tests__/conformance.test.js +21 -0
  190. package/dist/invites/__tests__/conformance.test.js.map +1 -0
  191. package/dist/organizations/LocalOrganizationProvider.d.ts +41 -0
  192. package/dist/organizations/LocalOrganizationProvider.d.ts.map +1 -0
  193. package/dist/organizations/LocalOrganizationProvider.js +198 -0
  194. package/dist/organizations/LocalOrganizationProvider.js.map +1 -0
  195. package/dist/organizations/__tests__/conformance.test.d.ts +2 -0
  196. package/dist/organizations/__tests__/conformance.test.d.ts.map +1 -0
  197. package/dist/organizations/__tests__/conformance.test.js +20 -0
  198. package/dist/organizations/__tests__/conformance.test.js.map +1 -0
  199. package/dist/organizations/index.d.ts +2 -0
  200. package/dist/organizations/index.d.ts.map +1 -0
  201. package/dist/organizations/index.js +2 -0
  202. package/dist/organizations/index.js.map +1 -0
  203. package/dist/pagination.d.ts +15 -0
  204. package/dist/pagination.d.ts.map +1 -0
  205. package/dist/pagination.js +36 -0
  206. package/dist/pagination.js.map +1 -0
  207. package/dist/permissions/LocalPlatformPermissionStore.d.ts +39 -0
  208. package/dist/permissions/LocalPlatformPermissionStore.d.ts.map +1 -0
  209. package/dist/permissions/LocalPlatformPermissionStore.js +117 -0
  210. package/dist/permissions/LocalPlatformPermissionStore.js.map +1 -0
  211. package/dist/permissions/__tests__/conformance.test.d.ts +2 -0
  212. package/dist/permissions/__tests__/conformance.test.d.ts.map +1 -0
  213. package/dist/permissions/__tests__/conformance.test.js +37 -0
  214. package/dist/permissions/__tests__/conformance.test.js.map +1 -0
  215. package/dist/permissions/index.d.ts +2 -0
  216. package/dist/permissions/index.d.ts.map +1 -0
  217. package/dist/permissions/index.js +2 -0
  218. package/dist/permissions/index.js.map +1 -0
  219. package/dist/projects/LocalProjectProvider.d.ts +21 -0
  220. package/dist/projects/LocalProjectProvider.d.ts.map +1 -0
  221. package/dist/projects/LocalProjectProvider.js +125 -0
  222. package/dist/projects/LocalProjectProvider.js.map +1 -0
  223. package/dist/projects/__tests__/conformance.test.d.ts +2 -0
  224. package/dist/projects/__tests__/conformance.test.d.ts.map +1 -0
  225. package/dist/projects/__tests__/conformance.test.js +44 -0
  226. package/dist/projects/__tests__/conformance.test.js.map +1 -0
  227. package/dist/projects/index.d.ts +2 -0
  228. package/dist/projects/index.d.ts.map +1 -0
  229. package/dist/projects/index.js +2 -0
  230. package/dist/projects/index.js.map +1 -0
  231. package/dist/storage/LocalStorageProvider.d.ts +27 -0
  232. package/dist/storage/LocalStorageProvider.d.ts.map +1 -0
  233. package/dist/storage/LocalStorageProvider.js +74 -0
  234. package/dist/storage/LocalStorageProvider.js.map +1 -0
  235. package/dist/storage/__tests__/conformance.test.d.ts +2 -0
  236. package/dist/storage/__tests__/conformance.test.d.ts.map +1 -0
  237. package/dist/storage/__tests__/conformance.test.js +20 -0
  238. package/dist/storage/__tests__/conformance.test.js.map +1 -0
  239. package/dist/storage/index.d.ts +2 -0
  240. package/dist/storage/index.d.ts.map +1 -0
  241. package/dist/storage/index.js +2 -0
  242. package/dist/storage/index.js.map +1 -0
  243. package/dist/userProfile/LocalUserProfileProvider.d.ts +25 -0
  244. package/dist/userProfile/LocalUserProfileProvider.d.ts.map +1 -0
  245. package/dist/userProfile/LocalUserProfileProvider.js +110 -0
  246. package/dist/userProfile/LocalUserProfileProvider.js.map +1 -0
  247. package/dist/userProfile/__tests__/conformance.test.d.ts +2 -0
  248. package/dist/userProfile/__tests__/conformance.test.d.ts.map +1 -0
  249. package/dist/userProfile/__tests__/conformance.test.js +40 -0
  250. package/dist/userProfile/__tests__/conformance.test.js.map +1 -0
  251. package/dist/userProfile/index.d.ts +2 -0
  252. package/dist/userProfile/index.d.ts.map +1 -0
  253. package/dist/userProfile/index.js +2 -0
  254. package/dist/userProfile/index.js.map +1 -0
  255. package/package.json +70 -0
  256. package/src/README.md +37 -0
  257. package/src/auth/LocalAuthProvider.ts +165 -0
  258. package/src/auth/__tests__/conformance.test.ts +40 -0
  259. package/src/auth/hmac.ts +53 -0
  260. package/src/auth/index.ts +5 -0
  261. package/src/auth/users.ts +151 -0
  262. package/src/data/LocalComputeServerStore.ts +290 -0
  263. package/src/data/LocalDataProvider.ts +148 -0
  264. package/src/data/LocalDefinitionStore.ts +369 -0
  265. package/src/data/LocalInviteStore.ts +117 -0
  266. package/src/data/LocalOrgStore.ts +356 -0
  267. package/src/data/LocalPlatformProjectGrantStore.ts +85 -0
  268. package/src/data/LocalProjectStore.ts +274 -0
  269. package/src/data/LocalShareLinkStore.ts +138 -0
  270. package/src/data/__tests__/cascade.test.ts +300 -0
  271. package/src/data/__tests__/compute-server-conformance.test.ts +26 -0
  272. package/src/data/__tests__/compute-server-encryption.test.ts +185 -0
  273. package/src/data/__tests__/definition-conformance.test.ts +23 -0
  274. package/src/data/__tests__/event-sink-conformance.test.ts +28 -0
  275. package/src/data/__tests__/invite-conformance.test.ts +24 -0
  276. package/src/data/__tests__/org-conformance.test.ts +43 -0
  277. package/src/data/__tests__/platform-project-grant-conformance.test.ts +24 -0
  278. package/src/data/__tests__/project-conformance.test.ts +64 -0
  279. package/src/data/__tests__/rules.test.ts +682 -0
  280. package/src/data/__tests__/share-link-conformance.test.ts +23 -0
  281. package/src/data/fsJson.ts +28 -0
  282. package/src/data/index.ts +16 -0
  283. package/src/data/pagination.ts +48 -0
  284. package/src/data/secretCrypto.ts +69 -0
  285. package/src/data/userData.ts +134 -0
  286. package/src/index.ts +42 -0
  287. package/src/permissions/LocalPlatformPermissionStore.ts +129 -0
  288. package/src/permissions/__tests__/conformance.test.ts +40 -0
  289. package/src/permissions/index.ts +1 -0
  290. package/src/storage/LocalStorageProvider.ts +78 -0
  291. package/src/storage/__tests__/conformance.test.ts +23 -0
  292. package/src/storage/index.ts +1 -0
  293. package/src/userProfile/LocalUserProfileProvider.ts +135 -0
  294. package/src/userProfile/__tests__/conformance.test.ts +43 -0
  295. package/src/userProfile/index.ts +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalInviteProvider.js","sourceRoot":"","sources":["../../src/invites/LocalInviteProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=conformance.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conformance.test.d.ts","sourceRoot":"","sources":["../../../src/invites/__tests__/conformance.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { describe, beforeEach, afterEach } from 'vitest';
2
+ import * as fs from 'node:fs/promises';
3
+ import * as path from 'node:path';
4
+ import * as os from 'node:os';
5
+ import { runInviteStoreConformance } from '@selva/platform/testing';
6
+ import { LocalInviteProvider } from '../LocalInviteProvider.js';
7
+ describe('LocalInviteProvider', () => {
8
+ let tempDir;
9
+ beforeEach(async () => {
10
+ tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'selva-invites-'));
11
+ });
12
+ afterEach(async () => {
13
+ await fs.rm(tempDir, { recursive: true, force: true });
14
+ });
15
+ // Local provider has no FK constraints so the default scope ids are fine.
16
+ runInviteStoreConformance({
17
+ name: 'LocalInviteProvider',
18
+ createStore: () => new LocalInviteProvider(tempDir)
19
+ });
20
+ });
21
+ //# sourceMappingURL=conformance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conformance.test.js","sourceRoot":"","sources":["../../../src/invites/__tests__/conformance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACpC,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,KAAK,IAAI,EAAE;QACrB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,yBAAyB,CAAC;QACzB,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,mBAAmB,CAAC,OAAO,CAAC;KACnD,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { IOrgStore, Organization, OrgRole, OrgMember, Project, ProjectMember, RequestContext, ListOptions, Page } from '@selva/platform';
2
+ export interface LocalOrgStore {
3
+ orgs: Organization[];
4
+ projects: Project[];
5
+ orgMembers: OrgMember[];
6
+ projectMembers: ProjectMember[];
7
+ }
8
+ /**
9
+ * Shared loader for the local-org.json file. Both LocalOrganizationProvider
10
+ * and LocalProjectProvider point to the same instance so all reads and writes
11
+ * go through one cache and one atomic write path.
12
+ *
13
+ * The store starts empty — orgs are created explicitly via `createOrg`
14
+ * (typically from the setup flow). No lazy seeding.
15
+ */
16
+ export declare class LocalOrgStoreLoader {
17
+ readonly storePath: string;
18
+ private readonly usersPath;
19
+ private readonly userMeta;
20
+ private store;
21
+ constructor(dataPath: string);
22
+ get(): Promise<LocalOrgStore>;
23
+ write(store: LocalOrgStore): Promise<void>;
24
+ }
25
+ export declare class LocalOrganizationProvider implements IOrgStore {
26
+ private readonly loader;
27
+ static fromEnv(env: Record<string, string | undefined>): LocalOrganizationProvider;
28
+ constructor(loader: LocalOrgStoreLoader);
29
+ listOrgs(_ctx: RequestContext, opts?: ListOptions): Promise<Page<Organization>>;
30
+ getOrg(_ctx: RequestContext, id: string): Promise<Organization | null>;
31
+ getOrgBySlug(_ctx: RequestContext, slug: string): Promise<Organization | null>;
32
+ createOrg(_ctx: RequestContext, org: Organization): Promise<void>;
33
+ updateOrg(_ctx: RequestContext, id: string, patch: Partial<Pick<Organization, 'name' | 'slug'>>): Promise<void>;
34
+ deleteOrg(_ctx: RequestContext, id: string): Promise<void>;
35
+ listOrgMembers(_ctx: RequestContext, orgId: string, opts?: ListOptions): Promise<Page<OrgMember>>;
36
+ getOrgMember(_ctx: RequestContext, orgId: string, userId: string): Promise<OrgMember | null>;
37
+ addOrgMember(_ctx: RequestContext, member: OrgMember): Promise<void>;
38
+ updateOrgMemberRole(_ctx: RequestContext, orgId: string, userId: string, role: OrgRole): Promise<void>;
39
+ removeOrgMember(_ctx: RequestContext, orgId: string, userId: string): Promise<void>;
40
+ }
41
+ //# sourceMappingURL=LocalOrganizationProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalOrganizationProvider.d.ts","sourceRoot":"","sources":["../../src/organizations/LocalOrganizationProvider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,SAAS,EACT,YAAY,EACZ,OAAO,EAEP,SAAS,EACT,OAAO,EACP,aAAa,EACb,cAAc,EACd,WAAW,EACX,IAAI,EACJ,MAAM,iBAAiB,CAAC;AAOzB,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,cAAc,EAAE,aAAa,EAAE,CAAC;CAChC;AAqCD;;;;;;;GAOG;AACH,qBAAa,mBAAmB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+B;IACxD,OAAO,CAAC,KAAK,CAA8B;gBAE/B,QAAQ,EAAE,MAAM;IAMtB,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC;IA2C7B,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAIhD;AAED,qBAAa,yBAA0B,YAAW,SAAS;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAE7C,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,yBAAyB;gBAKtE,MAAM,EAAE,mBAAmB;IAMjC,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAK/E,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKtE,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAK9E,SAAS,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBjE,SAAS,CACd,IAAI,EAAE,cAAc,EACpB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,GACjD,OAAO,CAAC,IAAI,CAAC;IAaV,SAAS,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB1D,cAAc,CACnB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAQrB,YAAY,CACjB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAMtB,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpE,mBAAmB,CACxB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,GACX,OAAO,CAAC,IAAI,CAAC;IAYV,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOzF"}
@@ -0,0 +1,198 @@
1
+ import * as path from 'node:path';
2
+ import { DEFAULT_ORG_PERMISSIONS, ProviderError, ALL_ORG_PERMISSIONS } from '@selva/platform';
3
+ import { createLocalUserMetaProvider } from '../auth/users.js';
4
+ import { paginate, applyOrder } from '../pagination.js';
5
+ import { readJsonFile, writeJsonFile } from '../fsJson.js';
6
+ const EMPTY_STORE = {
7
+ orgs: [],
8
+ projects: [],
9
+ orgMembers: [],
10
+ projectMembers: []
11
+ };
12
+ const VALID_ORG_PERMS = new Set(ALL_ORG_PERMISSIONS);
13
+ function sanitizeOrgPermissions(raw) {
14
+ if (!raw)
15
+ return [];
16
+ return raw.filter((p) => VALID_ORG_PERMS.has(p));
17
+ }
18
+ /**
19
+ * Pre-§1g OrgMember records had no `permissions` field. Backfill from the
20
+ * role's defaults so existing `local-org.json` files keep working.
21
+ */
22
+ function migrateOrgMember(m) {
23
+ if (!m.permissions)
24
+ m.permissions = [...DEFAULT_ORG_PERMISSIONS[m.role]];
25
+ return m;
26
+ }
27
+ /**
28
+ * Shared loader for the local-org.json file. Both LocalOrganizationProvider
29
+ * and LocalProjectProvider point to the same instance so all reads and writes
30
+ * go through one cache and one atomic write path.
31
+ *
32
+ * The store starts empty — orgs are created explicitly via `createOrg`
33
+ * (typically from the setup flow). No lazy seeding.
34
+ */
35
+ export class LocalOrgStoreLoader {
36
+ storePath;
37
+ usersPath;
38
+ userMeta;
39
+ store = null;
40
+ constructor(dataPath) {
41
+ this.storePath = path.join(dataPath, 'local-org.json');
42
+ this.usersPath = path.join(dataPath, 'users.json');
43
+ this.userMeta = createLocalUserMetaProvider(this.usersPath);
44
+ }
45
+ async get() {
46
+ if (this.store) {
47
+ return this.store;
48
+ }
49
+ const raw = await readJsonFile(this.storePath, null);
50
+ if (!raw) {
51
+ this.store = { ...EMPTY_STORE, orgs: [], projects: [], orgMembers: [], projectMembers: [] };
52
+ return this.store;
53
+ }
54
+ // Migrate the singleton `org` field to the new `orgs[]` array.
55
+ const orgs = raw.orgs ?? (raw.org ? [raw.org] : []);
56
+ const store = {
57
+ orgs,
58
+ projects: raw.projects ?? [],
59
+ orgMembers: raw.orgMembers ?? [],
60
+ projectMembers: raw.projectMembers ?? []
61
+ };
62
+ // Migrate legacy members (no permissions field) in place.
63
+ let changed = raw.orgs === undefined && raw.org !== undefined;
64
+ for (const m of store.orgMembers) {
65
+ const before = m.permissions;
66
+ migrateOrgMember(m);
67
+ if (before === undefined)
68
+ changed = true;
69
+ }
70
+ // One-time sweep: apply legacy user-level OrgPermissions to memberships.
71
+ if (this.userMeta) {
72
+ for (const m of store.orgMembers) {
73
+ const legacy = await this.userMeta.consumeLegacyOrgPermissions(m.userId);
74
+ if (legacy) {
75
+ const extra = sanitizeOrgPermissions(legacy);
76
+ m.permissions = Array.from(new Set([...(m.permissions ?? []), ...extra]));
77
+ changed = true;
78
+ }
79
+ }
80
+ }
81
+ this.store = store;
82
+ if (changed)
83
+ await this.write(store);
84
+ return store;
85
+ }
86
+ async write(store) {
87
+ this.store = store;
88
+ await writeJsonFile(this.storePath, store);
89
+ }
90
+ }
91
+ export class LocalOrganizationProvider {
92
+ loader;
93
+ static fromEnv(env) {
94
+ if (!env.DATA_PATH)
95
+ throw new Error('Missing required env var: DATA_PATH');
96
+ return new LocalOrganizationProvider(new LocalOrgStoreLoader(env.DATA_PATH));
97
+ }
98
+ constructor(loader) {
99
+ this.loader = loader;
100
+ }
101
+ // ── Organizations ────────────────────────────────────────────────────────────
102
+ async listOrgs(_ctx, opts) {
103
+ const { orgs } = await this.loader.get();
104
+ return paginate(applyOrder(orgs, opts), opts);
105
+ }
106
+ async getOrg(_ctx, id) {
107
+ const { orgs } = await this.loader.get();
108
+ return orgs.find((o) => o.id === id) ?? null;
109
+ }
110
+ async getOrgBySlug(_ctx, slug) {
111
+ const { orgs } = await this.loader.get();
112
+ return orgs.find((o) => o.slug === slug) ?? null;
113
+ }
114
+ async createOrg(_ctx, org) {
115
+ const store = await this.loader.get();
116
+ if (store.orgs.some((o) => o.id === org.id)) {
117
+ throw new ProviderError(`Org '${org.id}' already exists`, 409);
118
+ }
119
+ if (store.orgs.some((o) => o.slug === org.slug)) {
120
+ throw new ProviderError(`Org slug '${org.slug}' already in use`, 409);
121
+ }
122
+ store.orgs.push(org);
123
+ // Seed the owner membership so the creator can see their own org through
124
+ // downstream permission checks. Mirrors SupabaseOrgStore.createOrg.
125
+ store.orgMembers.push({
126
+ orgId: org.id,
127
+ userId: org.ownerId,
128
+ role: 'owner',
129
+ permissions: [...DEFAULT_ORG_PERMISSIONS.owner],
130
+ joinedAt: new Date().toISOString()
131
+ });
132
+ await this.loader.write(store);
133
+ }
134
+ async updateOrg(_ctx, id, patch) {
135
+ const store = await this.loader.get();
136
+ const idx = store.orgs.findIndex((o) => o.id === id);
137
+ if (idx === -1)
138
+ throw new ProviderError(`Org '${id}' not found`, 404);
139
+ if (patch.slug && patch.slug !== store.orgs[idx].slug) {
140
+ if (store.orgs.some((o) => o.id !== id && o.slug === patch.slug)) {
141
+ throw new ProviderError(`Org slug '${patch.slug}' already in use`, 409);
142
+ }
143
+ }
144
+ store.orgs[idx] = { ...store.orgs[idx], ...patch, updatedAt: new Date().toISOString() };
145
+ await this.loader.write(store);
146
+ }
147
+ async deleteOrg(_ctx, id) {
148
+ const store = await this.loader.get();
149
+ const idx = store.orgs.findIndex((o) => o.id === id);
150
+ if (idx === -1)
151
+ throw new ProviderError(`Org '${id}' not found`, 404);
152
+ store.orgs.splice(idx, 1);
153
+ store.orgMembers = store.orgMembers.filter((m) => m.orgId !== id);
154
+ // Cascade: drop projects + project members in this org.
155
+ const droppedProjectIds = new Set(store.projects.filter((p) => p.orgId === id).map((p) => p.id));
156
+ store.projects = store.projects.filter((p) => p.orgId !== id);
157
+ store.projectMembers = store.projectMembers.filter((m) => !droppedProjectIds.has(m.projectId));
158
+ await this.loader.write(store);
159
+ }
160
+ // ── Org members ──────────────────────────────────────────────────────────────
161
+ async listOrgMembers(_ctx, orgId, opts) {
162
+ const { orgMembers } = await this.loader.get();
163
+ return paginate(orgMembers.filter((m) => m.orgId === orgId).map(migrateOrgMember), opts);
164
+ }
165
+ async getOrgMember(_ctx, orgId, userId) {
166
+ const { orgMembers } = await this.loader.get();
167
+ const m = orgMembers.find((m) => m.orgId === orgId && m.userId === userId);
168
+ return m ? migrateOrgMember(m) : null;
169
+ }
170
+ async addOrgMember(_ctx, member) {
171
+ const store = await this.loader.get();
172
+ // If callers forget to pass permissions, seed from role defaults.
173
+ const full = {
174
+ ...member,
175
+ permissions: member.permissions ?? [...DEFAULT_ORG_PERMISSIONS[member.role]]
176
+ };
177
+ store.orgMembers.push(full);
178
+ await this.loader.write(store);
179
+ }
180
+ async updateOrgMemberRole(_ctx, orgId, userId, role) {
181
+ const store = await this.loader.get();
182
+ const m = store.orgMembers.find((m) => m.orgId === orgId && m.userId === userId);
183
+ if (!m)
184
+ throw new ProviderError(`Org member '${userId}' not found`, 404);
185
+ m.role = role;
186
+ // Role change re-seeds the permission defaults. Callers that want to
187
+ // preserve a custom OrgPermission set must call updateOrgMemberPermissions
188
+ // (once §1g-ui adds it) after updating the role.
189
+ m.permissions = [...DEFAULT_ORG_PERMISSIONS[role]];
190
+ await this.loader.write(store);
191
+ }
192
+ async removeOrgMember(_ctx, orgId, userId) {
193
+ const store = await this.loader.get();
194
+ store.orgMembers = store.orgMembers.filter((m) => !(m.orgId === orgId && m.userId === userId));
195
+ await this.loader.write(store);
196
+ }
197
+ }
198
+ //# sourceMappingURL=LocalOrganizationProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalOrganizationProvider.js","sourceRoot":"","sources":["../../src/organizations/LocalOrganizationProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=conformance.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conformance.test.d.ts","sourceRoot":"","sources":["../../../src/organizations/__tests__/conformance.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { describe, beforeEach, afterEach } from 'vitest';
2
+ import * as fs from 'node:fs/promises';
3
+ import * as path from 'node:path';
4
+ import * as os from 'node:os';
5
+ import { runOrgStoreConformance } from '@selva/platform/testing';
6
+ import { LocalOrganizationProvider, LocalOrgStoreLoader } from '../LocalOrganizationProvider.js';
7
+ describe('LocalOrganizationProvider', () => {
8
+ let tempDir;
9
+ beforeEach(async () => {
10
+ tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'selva-test-'));
11
+ });
12
+ afterEach(async () => {
13
+ await fs.rm(tempDir, { recursive: true, force: true });
14
+ });
15
+ runOrgStoreConformance({
16
+ name: 'LocalOrganizationProvider',
17
+ createStore: () => new LocalOrganizationProvider(new LocalOrgStoreLoader(tempDir))
18
+ });
19
+ });
20
+ //# sourceMappingURL=conformance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conformance.test.js","sourceRoot":"","sources":["../../../src/organizations/__tests__/conformance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEjG,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IAC1C,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,KAAK,IAAI,EAAE;QACrB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,sBAAsB,CAAC;QACtB,IAAI,EAAE,2BAA2B;QACjC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,yBAAyB,CAAC,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;KAClF,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { LocalOrganizationProvider, LocalOrgStoreLoader } from './LocalOrganizationProvider.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/organizations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { LocalOrganizationProvider, LocalOrgStoreLoader } from './LocalOrganizationProvider.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/organizations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type ListOptions, type DefinitionListOptions, type Page } from '@selva/platform';
2
+ type AnyListOptions = ListOptions | DefinitionListOptions;
3
+ /**
4
+ * In-memory pagination for filesystem-backed adapters.
5
+ * Cursor is an offset encoded as a string. Good enough for single-node local use.
6
+ */
7
+ export declare function paginate<T>(items: T[], opts?: AnyListOptions): Page<T>;
8
+ /**
9
+ * Sort a list in place per ListOptions. Mutates the input.
10
+ * Pass `keyFn` to customize how the comparison value is derived (e.g. nested
11
+ * fields, case-folded strings).
12
+ */
13
+ export declare function applyOrder<T>(items: T[], opts?: AnyListOptions, keyFn?: (item: T, field: string) => unknown): T[];
14
+ export {};
15
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,WAAW,EAAE,KAAK,qBAAqB,EAAE,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE9H,KAAK,cAAc,GAAG,WAAW,GAAG,qBAAqB,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,CAStE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC3B,KAAK,EAAE,CAAC,EAAE,EACV,IAAI,CAAC,EAAE,cAAc,EACrB,KAAK,GAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OACM,GACvC,CAAC,EAAE,CAYL"}
@@ -0,0 +1,36 @@
1
+ import { DEFAULT_PAGE_LIMIT, MAX_PAGE_LIMIT } from '@selva/platform';
2
+ /**
3
+ * In-memory pagination for filesystem-backed adapters.
4
+ * Cursor is an offset encoded as a string. Good enough for single-node local use.
5
+ */
6
+ export function paginate(items, opts) {
7
+ const limit = Math.min(Math.max(1, opts?.limit ?? DEFAULT_PAGE_LIMIT), MAX_PAGE_LIMIT);
8
+ const offset = opts?.cursor ? parseInt(opts.cursor, 10) || 0 : 0;
9
+ const slice = items.slice(offset, offset + limit);
10
+ const nextOffset = offset + slice.length;
11
+ return {
12
+ items: slice,
13
+ nextCursor: nextOffset < items.length ? String(nextOffset) : undefined
14
+ };
15
+ }
16
+ /**
17
+ * Sort a list in place per ListOptions. Mutates the input.
18
+ * Pass `keyFn` to customize how the comparison value is derived (e.g. nested
19
+ * fields, case-folded strings).
20
+ */
21
+ export function applyOrder(items, opts, keyFn = (item, field) => item[field]) {
22
+ const field = opts?.orderBy ?? 'createdAt';
23
+ const dir = opts?.orderDir ?? 'desc';
24
+ const mul = dir === 'asc' ? 1 : -1;
25
+ items.sort((a, b) => {
26
+ const av = (keyFn(a, field) ?? '');
27
+ const bv = (keyFn(b, field) ?? '');
28
+ if (av < bv)
29
+ return -1 * mul;
30
+ if (av > bv)
31
+ return 1 * mul;
32
+ return 0;
33
+ });
34
+ return items;
35
+ }
36
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAA2D,MAAM,iBAAiB,CAAC;AAI9H;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAI,KAAU,EAAE,IAAqB;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,kBAAkB,CAAC,EAAE,cAAc,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IACzC,OAAO;QACN,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;KACtE,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACzB,KAAU,EACV,IAAqB,EACrB,QAA6C,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC3D,IAAgC,CAAC,KAAK,CAAC;IAEzC,MAAM,KAAK,GAAG,IAAI,EAAE,OAAO,IAAI,WAAW,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,EAAE,QAAQ,IAAI,MAAM,CAAC;IACrC,MAAM,GAAG,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnB,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,CAAoB,CAAC;QACtD,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,CAAoB,CAAC;QACtD,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC;QAC7B,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,GAAG,GAAG,CAAC;QAC5B,OAAO,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACd,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { IPlatformPermissionStore, PlatformPermission, RequestContext, UserManagementResult } from '@selvajs/platform';
2
+ /**
3
+ * Filesystem-backed platform-permission store. Reads and writes the
4
+ * `platformPermissions` field on `user-data.json` — a data-layer file owned
5
+ * by `LocalDataProvider`, distinct from `auth-users.json` which the
6
+ * `LocalAuthProvider` owns. This split lets the local data layer pair with
7
+ * any auth provider (local, Supabase, Entra, Eterna, …): the data layer only
8
+ * cares about the user ID, never about how identity is stored.
9
+ *
10
+ * The "user is known to the data layer" precondition is established by
11
+ * `IDataProvider.ensureUser`, called from `hooks.server.ts` on every authed
12
+ * request — the local equivalent of the Supabase `handle_new_auth_user`
13
+ * trigger. After that call, `set` finds a row and `getFor` reads it; before
14
+ * it, `set` returns `not_found` (matching the conformance contract).
15
+ *
16
+ * Enforces:
17
+ * - The §2 sole-`instance_admin` invariant on `set` (refuses to drop the
18
+ * last admin)
19
+ * - Authorization on read/write (`assertCanRead` / `assertCanWrite`)
20
+ *
21
+ * "Disabled" state lives on the auth provider's user record. The local
22
+ * provider's permission store can't see across that boundary, so the
23
+ * invariant counters here treat every row in `user-data.json` as enabled.
24
+ * Code that disables a user is expected to also drop their `instance_admin`
25
+ * grant via `set` (the §2 invariant kicks in there) before the auth-side
26
+ * disable lands — see `LocalAuthProvider.disableUser`.
27
+ */
28
+ export declare class LocalPlatformPermissionStore implements IPlatformPermissionStore {
29
+ private readonly data;
30
+ static fromEnv(env: Record<string, string | undefined>): LocalPlatformPermissionStore;
31
+ constructor(userDataFilePath: string);
32
+ getFor(ctx: RequestContext, userId: string): Promise<PlatformPermission[]>;
33
+ getForBatch(ctx: RequestContext, userIds: readonly string[]): Promise<Map<string, PlatformPermission[]>>;
34
+ set(ctx: RequestContext, userId: string, permissions: readonly PlatformPermission[]): Promise<UserManagementResult>;
35
+ hasInstanceAdmin(_ctx: RequestContext): Promise<boolean>;
36
+ countInstanceAdminsExcluding(_ctx: RequestContext, excludeUserId: string): Promise<number>;
37
+ private countOtherAdmins;
38
+ }
39
+ //# sourceMappingURL=LocalPlatformPermissionStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalPlatformPermissionStore.d.ts","sourceRoot":"","sources":["../../src/permissions/LocalPlatformPermissionStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,wBAAwB,EACxB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,MAAM,mBAAmB,CAAC;AAI3B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,4BAA6B,YAAW,wBAAwB;IAC5E,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAE1C,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,4BAA4B;gBAKzE,gBAAgB,EAAE,MAAM;IAI9B,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAM1E,WAAW,CAChB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,SAAS,MAAM,EAAE,GACxB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAWvC,GAAG,CACR,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,SAAS,kBAAkB,EAAE,GACxC,OAAO,CAAC,oBAAoB,CAAC;IAmB1B,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAOxD,4BAA4B,CAAC,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAIlF,gBAAgB;CAM9B"}
@@ -0,0 +1,117 @@
1
+ import * as path from 'node:path';
2
+ import { ProviderError, hasPermission } from '@selvajs/platform';
3
+ import { createLocalUserDataStore } from '../data/userData.js';
4
+ /**
5
+ * Filesystem-backed platform-permission store. Reads and writes the
6
+ * `platformPermissions` field on `user-data.json` — a data-layer file owned
7
+ * by `LocalDataProvider`, distinct from `auth-users.json` which the
8
+ * `LocalAuthProvider` owns. This split lets the local data layer pair with
9
+ * any auth provider (local, Supabase, Entra, Eterna, …): the data layer only
10
+ * cares about the user ID, never about how identity is stored.
11
+ *
12
+ * The "user is known to the data layer" precondition is established by
13
+ * `IDataProvider.ensureUser`, called from `hooks.server.ts` on every authed
14
+ * request — the local equivalent of the Supabase `handle_new_auth_user`
15
+ * trigger. After that call, `set` finds a row and `getFor` reads it; before
16
+ * it, `set` returns `not_found` (matching the conformance contract).
17
+ *
18
+ * Enforces:
19
+ * - The §2 sole-`instance_admin` invariant on `set` (refuses to drop the
20
+ * last admin)
21
+ * - Authorization on read/write (`assertCanRead` / `assertCanWrite`)
22
+ *
23
+ * "Disabled" state lives on the auth provider's user record. The local
24
+ * provider's permission store can't see across that boundary, so the
25
+ * invariant counters here treat every row in `user-data.json` as enabled.
26
+ * Code that disables a user is expected to also drop their `instance_admin`
27
+ * grant via `set` (the §2 invariant kicks in there) before the auth-side
28
+ * disable lands — see `LocalAuthProvider.disableUser`.
29
+ */
30
+ export class LocalPlatformPermissionStore {
31
+ data;
32
+ static fromEnv(env) {
33
+ if (!env.DATA_PATH)
34
+ throw new Error('Missing required env var: DATA_PATH');
35
+ return new LocalPlatformPermissionStore(path.join(env.DATA_PATH, 'user-data.json'));
36
+ }
37
+ constructor(userDataFilePath) {
38
+ this.data = createLocalUserDataStore(userDataFilePath);
39
+ }
40
+ async getFor(ctx, userId) {
41
+ assertCanRead(ctx, userId);
42
+ const row = await this.data.findById(userId);
43
+ return row?.platformPermissions ?? [];
44
+ }
45
+ async getForBatch(ctx, userIds) {
46
+ assertCanReadBatch(ctx);
47
+ const all = await this.data.listAll();
48
+ const wanted = new Set(userIds);
49
+ const out = new Map();
50
+ for (const u of all) {
51
+ if (wanted.has(u.userId))
52
+ out.set(u.userId, u.platformPermissions ?? []);
53
+ }
54
+ return out;
55
+ }
56
+ async set(ctx, userId, permissions) {
57
+ assertAdmin(ctx);
58
+ const target = await this.data.findById(userId);
59
+ if (!target)
60
+ return 'not_found';
61
+ const wasAdmin = target.platformPermissions.includes('instance_admin');
62
+ const willBeAdmin = permissions.includes('instance_admin');
63
+ if (wasAdmin && !willBeAdmin) {
64
+ const others = await this.countOtherAdmins(userId);
65
+ if (others === 0)
66
+ return 'last_admin';
67
+ }
68
+ try {
69
+ await this.data.updatePermissions(userId, [...permissions]);
70
+ return 'ok';
71
+ }
72
+ catch (err) {
73
+ if (err instanceof ProviderError && err.statusCode === 404)
74
+ return 'not_found';
75
+ throw err;
76
+ }
77
+ }
78
+ async hasInstanceAdmin(_ctx) {
79
+ // First-run + invariant check — always allowed (read-only existence
80
+ // probe). The route layer decides what to do with the answer.
81
+ const all = await this.data.listAll();
82
+ return all.some((u) => u.platformPermissions.includes('instance_admin'));
83
+ }
84
+ async countInstanceAdminsExcluding(_ctx, excludeUserId) {
85
+ return this.countOtherAdmins(excludeUserId);
86
+ }
87
+ async countOtherAdmins(excludeUserId) {
88
+ const all = await this.data.listAll();
89
+ return all.filter((u) => u.userId !== excludeUserId && u.platformPermissions.includes('instance_admin')).length;
90
+ }
91
+ }
92
+ function assertCanRead(ctx, userId) {
93
+ if (ctx.system)
94
+ return;
95
+ if (ctx.userId === userId)
96
+ return;
97
+ if (hasPermission(ctx, 'instance_admin'))
98
+ return;
99
+ throw new ProviderError('Forbidden: cannot read another user’s permissions', 403);
100
+ }
101
+ function assertAdmin(ctx) {
102
+ if (ctx.system)
103
+ return;
104
+ if (hasPermission(ctx, 'instance_admin'))
105
+ return;
106
+ throw new ProviderError('Forbidden: instance admin required', 403);
107
+ }
108
+ function assertCanReadBatch(ctx) {
109
+ if (ctx.system)
110
+ return;
111
+ if (hasPermission(ctx, 'instance_admin'))
112
+ return;
113
+ if (hasPermission(ctx, 'manage_instance_users'))
114
+ return;
115
+ throw new ProviderError('Forbidden: instance admin or manage_instance_users required', 403);
116
+ }
117
+ //# sourceMappingURL=LocalPlatformPermissionStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalPlatformPermissionStore.js","sourceRoot":"","sources":["../../src/permissions/LocalPlatformPermissionStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=conformance.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conformance.test.d.ts","sourceRoot":"","sources":["../../../src/permissions/__tests__/conformance.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { describe, beforeEach, afterEach } from 'vitest';
2
+ import * as fs from 'node:fs/promises';
3
+ import * as path from 'node:path';
4
+ import * as os from 'node:os';
5
+ import { runPlatformPermissionStoreConformance } from '@selvajs/platform/testing';
6
+ import { LocalPlatformPermissionStore } from '../LocalPlatformPermissionStore.js';
7
+ import { createLocalUserDataStore } from '../../data/userData.js';
8
+ import { randomUUID } from 'node:crypto';
9
+ describe('LocalPlatformPermissionStore', () => {
10
+ let tempDir;
11
+ beforeEach(async () => {
12
+ tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'selva-perm-test-'));
13
+ });
14
+ afterEach(async () => {
15
+ await fs.rm(tempDir, { recursive: true, force: true });
16
+ });
17
+ runPlatformPermissionStoreConformance({
18
+ name: 'LocalPlatformPermissionStore',
19
+ createStore: async () => {
20
+ const userDataPath = path.join(tempDir, 'user-data.json');
21
+ const userData = createLocalUserDataStore(userDataPath);
22
+ const store = new LocalPlatformPermissionStore(userDataPath);
23
+ return {
24
+ store,
25
+ seedUser: async () => {
26
+ // Mirrors `IDataProvider.ensureUser` — produces a user the data
27
+ // layer knows about, regardless of which auth provider would
28
+ // hand out the ID in production.
29
+ const id = randomUUID();
30
+ await userData.ensure(id);
31
+ return id;
32
+ }
33
+ };
34
+ }
35
+ });
36
+ });
37
+ //# sourceMappingURL=conformance.test.js.map