@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.
- package/LICENSE +21 -0
- package/README.md +123 -0
- package/dist/auth/LocalAuthProvider.d.ts +28 -0
- package/dist/auth/LocalAuthProvider.d.ts.map +1 -0
- package/dist/auth/LocalAuthProvider.js +142 -0
- package/dist/auth/LocalAuthProvider.js.map +1 -0
- package/dist/auth/__tests__/conformance.test.d.ts +2 -0
- package/dist/auth/__tests__/conformance.test.d.ts.map +1 -0
- package/dist/auth/__tests__/conformance.test.js +36 -0
- package/dist/auth/__tests__/conformance.test.js.map +1 -0
- package/dist/auth/hmac.d.ts +18 -0
- package/dist/auth/hmac.d.ts.map +1 -0
- package/dist/auth/hmac.js +41 -0
- package/dist/auth/hmac.js.map +1 -0
- package/dist/auth/index.d.ts +6 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/users.d.ts +38 -0
- package/dist/auth/users.d.ts.map +1 -0
- package/dist/auth/users.js +100 -0
- package/dist/auth/users.js.map +1 -0
- package/dist/compute/FilesystemComputeProvider.d.ts +16 -0
- package/dist/compute/FilesystemComputeProvider.d.ts.map +1 -0
- package/dist/compute/FilesystemComputeProvider.js +51 -0
- package/dist/compute/FilesystemComputeProvider.js.map +1 -0
- package/dist/compute/SingleComputeServerProvider.d.ts +15 -0
- package/dist/compute/SingleComputeServerProvider.d.ts.map +1 -0
- package/dist/compute/SingleComputeServerProvider.js +26 -0
- package/dist/compute/SingleComputeServerProvider.js.map +1 -0
- package/dist/compute/types.d.ts +30 -0
- package/dist/compute/types.d.ts.map +1 -0
- package/dist/compute/types.js +2 -0
- package/dist/compute/types.js.map +1 -0
- package/dist/computeServer/FilesystemComputeServerStore.d.ts +14 -0
- package/dist/computeServer/FilesystemComputeServerStore.d.ts.map +1 -0
- package/dist/computeServer/FilesystemComputeServerStore.js +35 -0
- package/dist/computeServer/FilesystemComputeServerStore.js.map +1 -0
- package/dist/computeServer/LocalComputeServerProvider.d.ts +18 -0
- package/dist/computeServer/LocalComputeServerProvider.d.ts.map +1 -0
- package/dist/computeServer/LocalComputeServerProvider.js +29 -0
- package/dist/computeServer/LocalComputeServerProvider.js.map +1 -0
- package/dist/computeServer/__tests__/conformance.test.d.ts +2 -0
- package/dist/computeServer/__tests__/conformance.test.d.ts.map +1 -0
- package/dist/computeServer/__tests__/conformance.test.js +20 -0
- package/dist/computeServer/__tests__/conformance.test.js.map +1 -0
- package/dist/computeServer/index.d.ts +2 -0
- package/dist/computeServer/index.d.ts.map +1 -0
- package/dist/computeServer/index.js +2 -0
- package/dist/computeServer/index.js.map +1 -0
- package/dist/data/LocalComputeServerStore.d.ts +72 -0
- package/dist/data/LocalComputeServerStore.d.ts.map +1 -0
- package/dist/data/LocalComputeServerStore.js +207 -0
- package/dist/data/LocalComputeServerStore.js.map +1 -0
- package/dist/data/LocalDataProvider.d.ts +47 -0
- package/dist/data/LocalDataProvider.d.ts.map +1 -0
- package/dist/data/LocalDataProvider.js +118 -0
- package/dist/data/LocalDataProvider.js.map +1 -0
- package/dist/data/LocalDefinitionMetaProvider.d.ts +22 -0
- package/dist/data/LocalDefinitionMetaProvider.d.ts.map +1 -0
- package/dist/data/LocalDefinitionMetaProvider.js +131 -0
- package/dist/data/LocalDefinitionMetaProvider.js.map +1 -0
- package/dist/data/LocalDefinitionStore.d.ts +33 -0
- package/dist/data/LocalDefinitionStore.d.ts.map +1 -0
- package/dist/data/LocalDefinitionStore.js +274 -0
- package/dist/data/LocalDefinitionStore.js.map +1 -0
- package/dist/data/LocalInviteStore.d.ts +23 -0
- package/dist/data/LocalInviteStore.d.ts.map +1 -0
- package/dist/data/LocalInviteStore.js +98 -0
- package/dist/data/LocalInviteStore.js.map +1 -0
- package/dist/data/LocalOrgStore.d.ts +67 -0
- package/dist/data/LocalOrgStore.d.ts.map +1 -0
- package/dist/data/LocalOrgStore.js +255 -0
- package/dist/data/LocalOrgStore.js.map +1 -0
- package/dist/data/LocalPlatformProjectGrantStore.d.ts +14 -0
- package/dist/data/LocalPlatformProjectGrantStore.d.ts.map +1 -0
- package/dist/data/LocalPlatformProjectGrantStore.js +62 -0
- package/dist/data/LocalPlatformProjectGrantStore.js.map +1 -0
- package/dist/data/LocalProjectStore.d.ts +30 -0
- package/dist/data/LocalProjectStore.d.ts.map +1 -0
- package/dist/data/LocalProjectStore.js +171 -0
- package/dist/data/LocalProjectStore.js.map +1 -0
- package/dist/data/LocalShareLinkStore.d.ts +39 -0
- package/dist/data/LocalShareLinkStore.d.ts.map +1 -0
- package/dist/data/LocalShareLinkStore.js +108 -0
- package/dist/data/LocalShareLinkStore.js.map +1 -0
- package/dist/data/__tests__/LocalDefinitionMetaProvider.test.d.ts +2 -0
- package/dist/data/__tests__/LocalDefinitionMetaProvider.test.d.ts.map +1 -0
- package/dist/data/__tests__/LocalDefinitionMetaProvider.test.js +21 -0
- package/dist/data/__tests__/LocalDefinitionMetaProvider.test.js.map +1 -0
- package/dist/data/__tests__/cascade.test.d.ts +2 -0
- package/dist/data/__tests__/cascade.test.d.ts.map +1 -0
- package/dist/data/__tests__/cascade.test.js +265 -0
- package/dist/data/__tests__/cascade.test.js.map +1 -0
- package/dist/data/__tests__/compute-server-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/compute-server-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/compute-server-conformance.test.js +21 -0
- package/dist/data/__tests__/compute-server-conformance.test.js.map +1 -0
- package/dist/data/__tests__/compute-server-encryption.test.d.ts +2 -0
- package/dist/data/__tests__/compute-server-encryption.test.d.ts.map +1 -0
- package/dist/data/__tests__/compute-server-encryption.test.js +131 -0
- package/dist/data/__tests__/compute-server-encryption.test.js.map +1 -0
- package/dist/data/__tests__/definition-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/definition-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/definition-conformance.test.js +20 -0
- package/dist/data/__tests__/definition-conformance.test.js.map +1 -0
- package/dist/data/__tests__/event-sink-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/event-sink-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/event-sink-conformance.test.js +24 -0
- package/dist/data/__tests__/event-sink-conformance.test.js.map +1 -0
- package/dist/data/__tests__/invite-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/invite-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/invite-conformance.test.js +21 -0
- package/dist/data/__tests__/invite-conformance.test.js.map +1 -0
- package/dist/data/__tests__/org-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/org-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/org-conformance.test.js +36 -0
- package/dist/data/__tests__/org-conformance.test.js.map +1 -0
- package/dist/data/__tests__/platform-project-grant-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/platform-project-grant-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/platform-project-grant-conformance.test.js +20 -0
- package/dist/data/__tests__/platform-project-grant-conformance.test.js.map +1 -0
- package/dist/data/__tests__/project-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/project-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/project-conformance.test.js +53 -0
- package/dist/data/__tests__/project-conformance.test.js.map +1 -0
- package/dist/data/__tests__/rules.test.d.ts +2 -0
- package/dist/data/__tests__/rules.test.d.ts.map +1 -0
- package/dist/data/__tests__/rules.test.js +484 -0
- package/dist/data/__tests__/rules.test.js.map +1 -0
- package/dist/data/__tests__/share-link-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/share-link-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/share-link-conformance.test.js +20 -0
- package/dist/data/__tests__/share-link-conformance.test.js.map +1 -0
- package/dist/data/fsJson.d.ts +12 -0
- package/dist/data/fsJson.d.ts.map +1 -0
- package/dist/data/fsJson.js +29 -0
- package/dist/data/fsJson.js.map +1 -0
- package/dist/data/index.d.ts +13 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +9 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/pagination.d.ts +15 -0
- package/dist/data/pagination.d.ts.map +1 -0
- package/dist/data/pagination.js +36 -0
- package/dist/data/pagination.js.map +1 -0
- package/dist/data/secretCrypto.d.ts +23 -0
- package/dist/data/secretCrypto.d.ts.map +1 -0
- package/dist/data/secretCrypto.js +64 -0
- package/dist/data/secretCrypto.js.map +1 -0
- package/dist/data/userData.d.ts +40 -0
- package/dist/data/userData.d.ts.map +1 -0
- package/dist/data/userData.js +84 -0
- package/dist/data/userData.js.map +1 -0
- package/dist/definitions/LocalDefinitionMetaProvider.d.ts +27 -0
- package/dist/definitions/LocalDefinitionMetaProvider.d.ts.map +1 -0
- package/dist/definitions/LocalDefinitionMetaProvider.js +188 -0
- package/dist/definitions/LocalDefinitionMetaProvider.js.map +1 -0
- package/dist/definitions/__tests__/conformance.test.d.ts +2 -0
- package/dist/definitions/__tests__/conformance.test.d.ts.map +1 -0
- package/dist/definitions/__tests__/conformance.test.js +20 -0
- package/dist/definitions/__tests__/conformance.test.js.map +1 -0
- package/dist/definitions/index.d.ts +2 -0
- package/dist/definitions/index.d.ts.map +1 -0
- package/dist/definitions/index.js +2 -0
- package/dist/definitions/index.js.map +1 -0
- package/dist/definitions/providers/filesystem-files.d.ts +24 -0
- package/dist/definitions/providers/filesystem-files.d.ts.map +1 -0
- package/dist/definitions/providers/filesystem-files.js +170 -0
- package/dist/definitions/providers/filesystem-files.js.map +1 -0
- package/dist/definitions/providers/filesystem-meta.d.ts +17 -0
- package/dist/definitions/providers/filesystem-meta.d.ts.map +1 -0
- package/dist/definitions/providers/filesystem-meta.js +216 -0
- package/dist/definitions/providers/filesystem-meta.js.map +1 -0
- package/dist/fsJson.d.ts +12 -0
- package/dist/fsJson.d.ts.map +1 -0
- package/dist/fsJson.js +29 -0
- package/dist/fsJson.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/invites/LocalInviteProvider.d.ts +24 -0
- package/dist/invites/LocalInviteProvider.d.ts.map +1 -0
- package/dist/invites/LocalInviteProvider.js +89 -0
- package/dist/invites/LocalInviteProvider.js.map +1 -0
- package/dist/invites/__tests__/conformance.test.d.ts +2 -0
- package/dist/invites/__tests__/conformance.test.d.ts.map +1 -0
- package/dist/invites/__tests__/conformance.test.js +21 -0
- package/dist/invites/__tests__/conformance.test.js.map +1 -0
- package/dist/organizations/LocalOrganizationProvider.d.ts +41 -0
- package/dist/organizations/LocalOrganizationProvider.d.ts.map +1 -0
- package/dist/organizations/LocalOrganizationProvider.js +198 -0
- package/dist/organizations/LocalOrganizationProvider.js.map +1 -0
- package/dist/organizations/__tests__/conformance.test.d.ts +2 -0
- package/dist/organizations/__tests__/conformance.test.d.ts.map +1 -0
- package/dist/organizations/__tests__/conformance.test.js +20 -0
- package/dist/organizations/__tests__/conformance.test.js.map +1 -0
- package/dist/organizations/index.d.ts +2 -0
- package/dist/organizations/index.d.ts.map +1 -0
- package/dist/organizations/index.js +2 -0
- package/dist/organizations/index.js.map +1 -0
- package/dist/pagination.d.ts +15 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +36 -0
- package/dist/pagination.js.map +1 -0
- package/dist/permissions/LocalPlatformPermissionStore.d.ts +39 -0
- package/dist/permissions/LocalPlatformPermissionStore.d.ts.map +1 -0
- package/dist/permissions/LocalPlatformPermissionStore.js +117 -0
- package/dist/permissions/LocalPlatformPermissionStore.js.map +1 -0
- package/dist/permissions/__tests__/conformance.test.d.ts +2 -0
- package/dist/permissions/__tests__/conformance.test.d.ts.map +1 -0
- package/dist/permissions/__tests__/conformance.test.js +37 -0
- package/dist/permissions/__tests__/conformance.test.js.map +1 -0
- package/dist/permissions/index.d.ts +2 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +2 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/projects/LocalProjectProvider.d.ts +21 -0
- package/dist/projects/LocalProjectProvider.d.ts.map +1 -0
- package/dist/projects/LocalProjectProvider.js +125 -0
- package/dist/projects/LocalProjectProvider.js.map +1 -0
- package/dist/projects/__tests__/conformance.test.d.ts +2 -0
- package/dist/projects/__tests__/conformance.test.d.ts.map +1 -0
- package/dist/projects/__tests__/conformance.test.js +44 -0
- package/dist/projects/__tests__/conformance.test.js.map +1 -0
- package/dist/projects/index.d.ts +2 -0
- package/dist/projects/index.d.ts.map +1 -0
- package/dist/projects/index.js +2 -0
- package/dist/projects/index.js.map +1 -0
- package/dist/storage/LocalStorageProvider.d.ts +27 -0
- package/dist/storage/LocalStorageProvider.d.ts.map +1 -0
- package/dist/storage/LocalStorageProvider.js +74 -0
- package/dist/storage/LocalStorageProvider.js.map +1 -0
- package/dist/storage/__tests__/conformance.test.d.ts +2 -0
- package/dist/storage/__tests__/conformance.test.d.ts.map +1 -0
- package/dist/storage/__tests__/conformance.test.js +20 -0
- package/dist/storage/__tests__/conformance.test.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/userProfile/LocalUserProfileProvider.d.ts +25 -0
- package/dist/userProfile/LocalUserProfileProvider.d.ts.map +1 -0
- package/dist/userProfile/LocalUserProfileProvider.js +110 -0
- package/dist/userProfile/LocalUserProfileProvider.js.map +1 -0
- package/dist/userProfile/__tests__/conformance.test.d.ts +2 -0
- package/dist/userProfile/__tests__/conformance.test.d.ts.map +1 -0
- package/dist/userProfile/__tests__/conformance.test.js +40 -0
- package/dist/userProfile/__tests__/conformance.test.js.map +1 -0
- package/dist/userProfile/index.d.ts +2 -0
- package/dist/userProfile/index.d.ts.map +1 -0
- package/dist/userProfile/index.js +2 -0
- package/dist/userProfile/index.js.map +1 -0
- package/package.json +70 -0
- package/src/README.md +37 -0
- package/src/auth/LocalAuthProvider.ts +165 -0
- package/src/auth/__tests__/conformance.test.ts +40 -0
- package/src/auth/hmac.ts +53 -0
- package/src/auth/index.ts +5 -0
- package/src/auth/users.ts +151 -0
- package/src/data/LocalComputeServerStore.ts +290 -0
- package/src/data/LocalDataProvider.ts +148 -0
- package/src/data/LocalDefinitionStore.ts +369 -0
- package/src/data/LocalInviteStore.ts +117 -0
- package/src/data/LocalOrgStore.ts +356 -0
- package/src/data/LocalPlatformProjectGrantStore.ts +85 -0
- package/src/data/LocalProjectStore.ts +274 -0
- package/src/data/LocalShareLinkStore.ts +138 -0
- package/src/data/__tests__/cascade.test.ts +300 -0
- package/src/data/__tests__/compute-server-conformance.test.ts +26 -0
- package/src/data/__tests__/compute-server-encryption.test.ts +185 -0
- package/src/data/__tests__/definition-conformance.test.ts +23 -0
- package/src/data/__tests__/event-sink-conformance.test.ts +28 -0
- package/src/data/__tests__/invite-conformance.test.ts +24 -0
- package/src/data/__tests__/org-conformance.test.ts +43 -0
- package/src/data/__tests__/platform-project-grant-conformance.test.ts +24 -0
- package/src/data/__tests__/project-conformance.test.ts +64 -0
- package/src/data/__tests__/rules.test.ts +682 -0
- package/src/data/__tests__/share-link-conformance.test.ts +23 -0
- package/src/data/fsJson.ts +28 -0
- package/src/data/index.ts +16 -0
- package/src/data/pagination.ts +48 -0
- package/src/data/secretCrypto.ts +69 -0
- package/src/data/userData.ts +134 -0
- package/src/index.ts +42 -0
- package/src/permissions/LocalPlatformPermissionStore.ts +129 -0
- package/src/permissions/__tests__/conformance.test.ts +40 -0
- package/src/permissions/index.ts +1 -0
- package/src/storage/LocalStorageProvider.ts +78 -0
- package/src/storage/__tests__/conformance.test.ts +23 -0
- package/src/storage/index.ts +1 -0
- package/src/userProfile/LocalUserProfileProvider.ts +135 -0
- package/src/userProfile/__tests__/conformance.test.ts +43 -0
- package/src/userProfile/index.ts +1 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { DEFAULT_PAGE_LIMIT, MAX_PAGE_LIMIT } from '@selvajs/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/data/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,kBAAkB,EAClB,cAAc,EAId,MAAM,mBAAmB,CAAC;AAI3B;;;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,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AES-256-GCM envelope for at-rest secrets (e.g. compute API keys).
|
|
3
|
+
*
|
|
4
|
+
* On-disk format: `enc:v1:<base64(iv|tag|ciphertext)>`. The version prefix
|
|
5
|
+
* lets us migrate to a new algorithm later without ambiguity. Plaintext
|
|
6
|
+
* never sits on disk.
|
|
7
|
+
*
|
|
8
|
+
* Security model: defends against backup leaks, accidental file sharing,
|
|
9
|
+
* and read-only disk access. An attacker with both the data file *and*
|
|
10
|
+
* the master key (env var, process memory) can still decrypt — this is
|
|
11
|
+
* encryption at rest, not a secret manager.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isEncryptedSecret(value: string): boolean;
|
|
14
|
+
export declare function encryptSecret(plaintext: string, key: Buffer): string;
|
|
15
|
+
export declare function decryptSecret(envelope: string, key: Buffer): string;
|
|
16
|
+
/**
|
|
17
|
+
* Decode a `SELVA_AT_REST_KEY` env var into a 32-byte buffer. Accepts either
|
|
18
|
+
* 64-char hex or base64 (with or without padding). Throws on anything else
|
|
19
|
+
* so misconfiguration fails loudly at boot rather than silently producing
|
|
20
|
+
* an undecryptable file.
|
|
21
|
+
*/
|
|
22
|
+
export declare function decodeSecretKey(raw: string): Buffer;
|
|
23
|
+
//# sourceMappingURL=secretCrypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretCrypto.d.ts","sourceRoot":"","sources":["../../src/data/secretCrypto.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;GAWG;AAEH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAYpE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAcnE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQnD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { randomBytes, createCipheriv, createDecipheriv } from 'node:crypto';
|
|
2
|
+
const ALGO = 'aes-256-gcm';
|
|
3
|
+
const IV_BYTES = 12;
|
|
4
|
+
const TAG_BYTES = 16;
|
|
5
|
+
const PREFIX = 'enc:v1:';
|
|
6
|
+
/**
|
|
7
|
+
* AES-256-GCM envelope for at-rest secrets (e.g. compute API keys).
|
|
8
|
+
*
|
|
9
|
+
* On-disk format: `enc:v1:<base64(iv|tag|ciphertext)>`. The version prefix
|
|
10
|
+
* lets us migrate to a new algorithm later without ambiguity. Plaintext
|
|
11
|
+
* never sits on disk.
|
|
12
|
+
*
|
|
13
|
+
* Security model: defends against backup leaks, accidental file sharing,
|
|
14
|
+
* and read-only disk access. An attacker with both the data file *and*
|
|
15
|
+
* the master key (env var, process memory) can still decrypt — this is
|
|
16
|
+
* encryption at rest, not a secret manager.
|
|
17
|
+
*/
|
|
18
|
+
export function isEncryptedSecret(value) {
|
|
19
|
+
return value.startsWith(PREFIX);
|
|
20
|
+
}
|
|
21
|
+
export function encryptSecret(plaintext, key) {
|
|
22
|
+
if (key.length !== 32) {
|
|
23
|
+
throw new Error(`Secret key must be 32 bytes; got ${key.length}`);
|
|
24
|
+
}
|
|
25
|
+
if (isEncryptedSecret(plaintext)) {
|
|
26
|
+
throw new Error('Refusing to encrypt a value that is already encrypted');
|
|
27
|
+
}
|
|
28
|
+
const iv = randomBytes(IV_BYTES);
|
|
29
|
+
const cipher = createCipheriv(ALGO, key, iv);
|
|
30
|
+
const ciphertext = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
|
|
31
|
+
const tag = cipher.getAuthTag();
|
|
32
|
+
return PREFIX + Buffer.concat([iv, tag, ciphertext]).toString('base64');
|
|
33
|
+
}
|
|
34
|
+
export function decryptSecret(envelope, key) {
|
|
35
|
+
if (key.length !== 32) {
|
|
36
|
+
throw new Error(`Secret key must be 32 bytes; got ${key.length}`);
|
|
37
|
+
}
|
|
38
|
+
if (!isEncryptedSecret(envelope)) {
|
|
39
|
+
throw new Error('Value is not an encrypted secret envelope');
|
|
40
|
+
}
|
|
41
|
+
const buf = Buffer.from(envelope.slice(PREFIX.length), 'base64');
|
|
42
|
+
const iv = buf.subarray(0, IV_BYTES);
|
|
43
|
+
const tag = buf.subarray(IV_BYTES, IV_BYTES + TAG_BYTES);
|
|
44
|
+
const ciphertext = buf.subarray(IV_BYTES + TAG_BYTES);
|
|
45
|
+
const decipher = createDecipheriv(ALGO, key, iv);
|
|
46
|
+
decipher.setAuthTag(tag);
|
|
47
|
+
return Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString('utf8');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Decode a `SELVA_AT_REST_KEY` env var into a 32-byte buffer. Accepts either
|
|
51
|
+
* 64-char hex or base64 (with or without padding). Throws on anything else
|
|
52
|
+
* so misconfiguration fails loudly at boot rather than silently producing
|
|
53
|
+
* an undecryptable file.
|
|
54
|
+
*/
|
|
55
|
+
export function decodeSecretKey(raw) {
|
|
56
|
+
if (/^[0-9a-fA-F]{64}$/.test(raw))
|
|
57
|
+
return Buffer.from(raw, 'hex');
|
|
58
|
+
const buf = Buffer.from(raw, 'base64');
|
|
59
|
+
if (buf.length === 32)
|
|
60
|
+
return buf;
|
|
61
|
+
throw new Error('SELVA_AT_REST_KEY must be 32 bytes encoded as 64-char hex or base64. ' +
|
|
62
|
+
"Generate one with: node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"");
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=secretCrypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretCrypto.js","sourceRoot":"","sources":["../../src/data/secretCrypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { PlatformPermission, RecentRun } from '@selvajs/platform';
|
|
2
|
+
/**
|
|
3
|
+
* Per-user state owned by the data layer, keyed by the auth provider's user
|
|
4
|
+
* ID. Mirrors `public.user_profiles` in the Supabase schema. **Never holds
|
|
5
|
+
* identity** (email, password hash, createdAt) — those live with the auth
|
|
6
|
+
* provider, which may be anything from `LocalAuthProvider` to an external
|
|
7
|
+
* IdP like Eterna ID.
|
|
8
|
+
*
|
|
9
|
+
* The local equivalent of Supabase's `handle_new_auth_user` trigger lives in
|
|
10
|
+
* `hooks.server.ts`, which calls `IDataProvider.ensureUser` once per
|
|
11
|
+
* authenticated request. After that call, every read here is guaranteed to
|
|
12
|
+
* find a row.
|
|
13
|
+
*/
|
|
14
|
+
export interface StoredUserData {
|
|
15
|
+
userId: string;
|
|
16
|
+
displayName?: string;
|
|
17
|
+
platformPermissions: PlatformPermission[];
|
|
18
|
+
starredDefinitions: string[];
|
|
19
|
+
recentRuns: RecentRun[];
|
|
20
|
+
}
|
|
21
|
+
export interface UserDataFile {
|
|
22
|
+
users: StoredUserData[];
|
|
23
|
+
}
|
|
24
|
+
export interface LocalUserDataStore {
|
|
25
|
+
/**
|
|
26
|
+
* Idempotent. Adds an empty row if missing; no-op if present. Safe to call
|
|
27
|
+
* on every authed request.
|
|
28
|
+
*/
|
|
29
|
+
ensure(userId: string): Promise<void>;
|
|
30
|
+
findById(userId: string): Promise<StoredUserData | null>;
|
|
31
|
+
listAll(): Promise<StoredUserData[]>;
|
|
32
|
+
updatePermissions(userId: string, permissions: PlatformPermission[]): Promise<void>;
|
|
33
|
+
updateDisplayName(userId: string, displayName: string | undefined): Promise<void>;
|
|
34
|
+
starDefinition(userId: string, definitionId: string): Promise<void>;
|
|
35
|
+
unstarDefinition(userId: string, definitionId: string): Promise<void>;
|
|
36
|
+
recordRun(userId: string, run: RecentRun): Promise<void>;
|
|
37
|
+
deleteUser(userId: string): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
export declare function createLocalUserDataStore(filePath: string): LocalUserDataStore;
|
|
40
|
+
//# sourceMappingURL=userData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userData.d.ts","sourceRoot":"","sources":["../../src/data/userData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGvE;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,SAAS,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,cAAc,EAAE,CAAC;CACxB;AAeD,MAAM,WAAW,kBAAkB;IAClC;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACzD,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACrC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpF,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CA4E7E"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { ProviderError } from '@selvajs/platform';
|
|
2
|
+
import { readJsonFile, writeJsonFile } from './fsJson.js';
|
|
3
|
+
const MAX_RECENT_RUNS = 20;
|
|
4
|
+
const empty = () => ({ users: [] });
|
|
5
|
+
function emptyRow(userId) {
|
|
6
|
+
return {
|
|
7
|
+
userId,
|
|
8
|
+
platformPermissions: [],
|
|
9
|
+
starredDefinitions: [],
|
|
10
|
+
recentRuns: []
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function createLocalUserDataStore(filePath) {
|
|
14
|
+
async function findOrThrow(userId) {
|
|
15
|
+
const file = await readJsonFile(filePath, empty());
|
|
16
|
+
const row = file.users.find((u) => u.userId === userId);
|
|
17
|
+
if (!row)
|
|
18
|
+
throw new ProviderError(`User-data row "${userId}" not found`, 404);
|
|
19
|
+
return { file, row };
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
async ensure(userId) {
|
|
23
|
+
const file = await readJsonFile(filePath, empty());
|
|
24
|
+
if (file.users.some((u) => u.userId === userId))
|
|
25
|
+
return;
|
|
26
|
+
file.users.push(emptyRow(userId));
|
|
27
|
+
await writeJsonFile(filePath, file);
|
|
28
|
+
},
|
|
29
|
+
async findById(userId) {
|
|
30
|
+
const { users } = await readJsonFile(filePath, empty());
|
|
31
|
+
return users.find((u) => u.userId === userId) ?? null;
|
|
32
|
+
},
|
|
33
|
+
async listAll() {
|
|
34
|
+
const { users } = await readJsonFile(filePath, empty());
|
|
35
|
+
return users;
|
|
36
|
+
},
|
|
37
|
+
async updatePermissions(userId, permissions) {
|
|
38
|
+
const { file, row } = await findOrThrow(userId);
|
|
39
|
+
row.platformPermissions = permissions;
|
|
40
|
+
await writeJsonFile(filePath, file);
|
|
41
|
+
},
|
|
42
|
+
async updateDisplayName(userId, displayName) {
|
|
43
|
+
const { file, row } = await findOrThrow(userId);
|
|
44
|
+
if (displayName === undefined) {
|
|
45
|
+
delete row.displayName;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
row.displayName = displayName;
|
|
49
|
+
}
|
|
50
|
+
await writeJsonFile(filePath, file);
|
|
51
|
+
},
|
|
52
|
+
async starDefinition(userId, definitionId) {
|
|
53
|
+
const { file, row } = await findOrThrow(userId);
|
|
54
|
+
if (!row.starredDefinitions.includes(definitionId)) {
|
|
55
|
+
row.starredDefinitions.push(definitionId);
|
|
56
|
+
await writeJsonFile(filePath, file);
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
async unstarDefinition(userId, definitionId) {
|
|
60
|
+
const { file, row } = await findOrThrow(userId);
|
|
61
|
+
row.starredDefinitions = row.starredDefinitions.filter((d) => d !== definitionId);
|
|
62
|
+
await writeJsonFile(filePath, file);
|
|
63
|
+
},
|
|
64
|
+
async recordRun(userId, run) {
|
|
65
|
+
const { file, row } = await findOrThrow(userId);
|
|
66
|
+
// Remove older entry for same definition, then prepend newest.
|
|
67
|
+
row.recentRuns = [
|
|
68
|
+
run,
|
|
69
|
+
...row.recentRuns.filter((r) => r.definitionId !== run.definitionId)
|
|
70
|
+
].slice(0, MAX_RECENT_RUNS);
|
|
71
|
+
await writeJsonFile(filePath, file);
|
|
72
|
+
},
|
|
73
|
+
async deleteUser(userId) {
|
|
74
|
+
const file = await readJsonFile(filePath, empty());
|
|
75
|
+
const before = file.users.length;
|
|
76
|
+
file.users = file.users.filter((u) => u.userId !== userId);
|
|
77
|
+
if (file.users.length === before) {
|
|
78
|
+
throw new ProviderError(`User-data row "${userId}" not found`, 404);
|
|
79
|
+
}
|
|
80
|
+
await writeJsonFile(filePath, file);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=userData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userData.js","sourceRoot":"","sources":["../../src/data/userData.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { IDefinitionStore, IProjectStore, DefinitionRecord, DefinitionRecordPatch, HistoryEntry, RequestContext, DefinitionListOptions, Page } from '@selva/platform';
|
|
2
|
+
export declare class LocalDefinitionMetaProvider implements IDefinitionStore {
|
|
3
|
+
private readonly configPath;
|
|
4
|
+
private projectProvider?;
|
|
5
|
+
static fromEnv(env: Record<string, string | undefined>): LocalDefinitionMetaProvider;
|
|
6
|
+
constructor(definitionsPath: string, projectProvider?: IProjectStore);
|
|
7
|
+
setProjectProvider(projectProvider: IProjectStore): void;
|
|
8
|
+
private readConfig;
|
|
9
|
+
private writeConfig;
|
|
10
|
+
private sortedRecords;
|
|
11
|
+
private visibleRecords;
|
|
12
|
+
list(_ctx: RequestContext, opts?: DefinitionListOptions): Promise<Page<DefinitionRecord>>;
|
|
13
|
+
listByProject(_ctx: RequestContext, projectId: string, opts?: DefinitionListOptions): Promise<Page<DefinitionRecord>>;
|
|
14
|
+
listPublic(ctx: RequestContext, opts?: DefinitionListOptions & {
|
|
15
|
+
orgId?: string;
|
|
16
|
+
}): Promise<Page<DefinitionRecord>>;
|
|
17
|
+
get(_ctx: RequestContext, guid: string): Promise<DefinitionRecord | null>;
|
|
18
|
+
create(_ctx: RequestContext, record: DefinitionRecord): Promise<void>;
|
|
19
|
+
update(_ctx: RequestContext, guid: string, patch: DefinitionRecordPatch): Promise<void>;
|
|
20
|
+
addHistoryEntry(_ctx: RequestContext, guid: string, entry: HistoryEntry): Promise<void>;
|
|
21
|
+
removeHistoryEntry(_ctx: RequestContext, guid: string, ref: string): Promise<void>;
|
|
22
|
+
delete(_ctx: RequestContext, guid: string): Promise<void>;
|
|
23
|
+
incrementRunCount(_ctx: RequestContext, guid: string): Promise<void>;
|
|
24
|
+
listStalePending(_ctx: RequestContext, olderThanIso: string): Promise<DefinitionRecord[]>;
|
|
25
|
+
canEditDefinition(ctx: RequestContext, projectId: string, userId: string, definitionOwnerId: string): Promise<boolean>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=LocalDefinitionMetaProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalDefinitionMetaProvider.d.ts","sourceRoot":"","sources":["../../src/definitions/LocalDefinitionMetaProvider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,IAAI,EACJ,MAAM,iBAAiB,CAAC;AASzB,qBAAa,2BAA4B,YAAW,gBAAgB;IACnE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,eAAe,CAAC,CAAgB;IAExC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,2BAA2B;gBAKxE,eAAe,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,aAAa;IAKpE,kBAAkB,CAAC,eAAe,EAAE,aAAa,GAAG,IAAI;YAI1C,UAAU;YAeV,WAAW;IAIzB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,cAAc;IAYhB,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAMzF,aAAa,CAClB,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,qBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAS5B,UAAU,CACf,GAAG,EAAE,cAAc,EACnB,IAAI,CAAC,EAAE,qBAAqB,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/C,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAmC5B,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAKzE,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrE,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BvF,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvF,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASlF,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzD,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASpE,gBAAgB,CACrB,IAAI,EAAE,cAAc,EACpB,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAOxB,iBAAiB,CACtB,GAAG,EAAE,cAAc,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,MAAM,GACvB,OAAO,CAAC,OAAO,CAAC;CAmBnB"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import { ProviderError, hasPermission } from '@selva/platform';
|
|
3
|
+
import { paginate, applyOrder } from '../pagination.js';
|
|
4
|
+
import { readJsonFile, writeJsonFile } from '../fsJson.js';
|
|
5
|
+
export class LocalDefinitionMetaProvider {
|
|
6
|
+
configPath;
|
|
7
|
+
projectProvider;
|
|
8
|
+
static fromEnv(env) {
|
|
9
|
+
if (!env.DATA_PATH)
|
|
10
|
+
throw new Error('Missing required env var: DATA_PATH');
|
|
11
|
+
return new LocalDefinitionMetaProvider(env.DATA_PATH);
|
|
12
|
+
}
|
|
13
|
+
constructor(definitionsPath, projectProvider) {
|
|
14
|
+
this.configPath = path.join(definitionsPath, 'definitions-config.json');
|
|
15
|
+
this.projectProvider = projectProvider;
|
|
16
|
+
}
|
|
17
|
+
setProjectProvider(projectProvider) {
|
|
18
|
+
this.projectProvider = projectProvider;
|
|
19
|
+
}
|
|
20
|
+
async readConfig() {
|
|
21
|
+
const parsed = await readJsonFile(this.configPath, { definitions: {} });
|
|
22
|
+
// Backfill fields for records written before schema migrations.
|
|
23
|
+
for (const record of Object.values(parsed.definitions)) {
|
|
24
|
+
if (!record)
|
|
25
|
+
continue;
|
|
26
|
+
// Records that pre-date the editorial workflow: treat as published.
|
|
27
|
+
if (!record.status || record.status === 'ready')
|
|
28
|
+
record.status = 'published';
|
|
29
|
+
if (record.runCount === undefined)
|
|
30
|
+
record.runCount = 0;
|
|
31
|
+
for (const entry of record.history ?? []) {
|
|
32
|
+
if (!entry.uploadedBy)
|
|
33
|
+
entry.uploadedBy = record.ownerId;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return parsed;
|
|
37
|
+
}
|
|
38
|
+
async writeConfig(config) {
|
|
39
|
+
await writeJsonFile(this.configPath, config);
|
|
40
|
+
}
|
|
41
|
+
sortedRecords(records, opts) {
|
|
42
|
+
const defaulted = {
|
|
43
|
+
...opts,
|
|
44
|
+
orderBy: opts?.orderBy ?? 'name',
|
|
45
|
+
orderDir: opts?.orderDir ?? 'asc'
|
|
46
|
+
};
|
|
47
|
+
return applyOrder([...records], defaulted, (r, field) => {
|
|
48
|
+
if (field === 'name')
|
|
49
|
+
return r.displayName.toLowerCase();
|
|
50
|
+
if (field === 'runCount')
|
|
51
|
+
return r.runCount ?? 0;
|
|
52
|
+
return r[field];
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
visibleRecords(records, opts) {
|
|
56
|
+
const filtered = records.filter((r) => r?.displayName);
|
|
57
|
+
// Apply status filter
|
|
58
|
+
if (opts?.statuses?.length) {
|
|
59
|
+
const allowed = new Set(opts.statuses);
|
|
60
|
+
return filtered.filter((r) => allowed.has(r.status));
|
|
61
|
+
}
|
|
62
|
+
if (opts?.includePending)
|
|
63
|
+
return filtered;
|
|
64
|
+
// Default: everything except internal 'pending' state
|
|
65
|
+
return filtered.filter((r) => r.status !== 'pending');
|
|
66
|
+
}
|
|
67
|
+
async list(_ctx, opts) {
|
|
68
|
+
const config = await this.readConfig();
|
|
69
|
+
const records = this.visibleRecords(Object.values(config.definitions), opts);
|
|
70
|
+
return paginate(this.sortedRecords(records, opts), opts);
|
|
71
|
+
}
|
|
72
|
+
async listByProject(_ctx, projectId, opts) {
|
|
73
|
+
const config = await this.readConfig();
|
|
74
|
+
const records = this.visibleRecords(Object.values(config.definitions).filter((r) => r?.projectId === projectId), opts);
|
|
75
|
+
return paginate(this.sortedRecords(records, opts), opts);
|
|
76
|
+
}
|
|
77
|
+
async listPublic(ctx, opts) {
|
|
78
|
+
if (!this.projectProvider) {
|
|
79
|
+
// Pre-wiring fallback: behave as if the default project is public, which
|
|
80
|
+
// matches the local bootstrap. Once setProjectProvider is called this
|
|
81
|
+
// branch stops executing.
|
|
82
|
+
return this.list(ctx, opts);
|
|
83
|
+
}
|
|
84
|
+
const config = await this.readConfig();
|
|
85
|
+
const records = Object.values(config.definitions).filter((r) => Boolean(r?.displayName));
|
|
86
|
+
// Resolve each record's project once, in bulk — one getProject call per
|
|
87
|
+
// unique projectId. Cheap for local scale (single file read behind the scenes).
|
|
88
|
+
const projectIds = Array.from(new Set(records.map((r) => r.projectId)));
|
|
89
|
+
const projects = await Promise.all(projectIds.map((id) => this.projectProvider.getProject(ctx, id)));
|
|
90
|
+
const publicProjectIds = new Set(projects
|
|
91
|
+
.filter((p) => p !== null && p.visibility === 'public' && (!opts?.orgId || p.orgId === opts.orgId))
|
|
92
|
+
.map((p) => p.id));
|
|
93
|
+
const publicRecords = this.visibleRecords(records.filter((r) => publicProjectIds.has(r.projectId)), opts);
|
|
94
|
+
return paginate(this.sortedRecords(publicRecords, opts), opts);
|
|
95
|
+
}
|
|
96
|
+
async get(_ctx, guid) {
|
|
97
|
+
const config = await this.readConfig();
|
|
98
|
+
return config.definitions[guid] ?? null;
|
|
99
|
+
}
|
|
100
|
+
async create(_ctx, record) {
|
|
101
|
+
const config = await this.readConfig();
|
|
102
|
+
config.definitions[record.guid] = record;
|
|
103
|
+
await this.writeConfig(config);
|
|
104
|
+
}
|
|
105
|
+
async update(_ctx, guid, patch) {
|
|
106
|
+
const config = await this.readConfig();
|
|
107
|
+
const existing = config.definitions[guid];
|
|
108
|
+
if (!existing)
|
|
109
|
+
throw new ProviderError(`Definition '${guid}' not found`, 404);
|
|
110
|
+
// `null` clears the field (sets to undefined); `undefined` leaves unchanged.
|
|
111
|
+
const clearable = (v) => (v === null ? undefined : v);
|
|
112
|
+
config.definitions[guid] = {
|
|
113
|
+
...existing,
|
|
114
|
+
...(patch.displayName !== undefined && { displayName: patch.displayName }),
|
|
115
|
+
...(patch.description !== undefined && { description: clearable(patch.description) }),
|
|
116
|
+
...(patch.category !== undefined && { category: clearable(patch.category) }),
|
|
117
|
+
...(patch.tags !== undefined && { tags: clearable(patch.tags) }),
|
|
118
|
+
...(patch.coverImage !== undefined && { coverImage: clearable(patch.coverImage) }),
|
|
119
|
+
...(patch.fileExt !== undefined && { fileExt: patch.fileExt }),
|
|
120
|
+
...(patch.originalFilename !== undefined && { originalFilename: patch.originalFilename }),
|
|
121
|
+
...(patch.maxHistory !== undefined && { maxHistory: patch.maxHistory }),
|
|
122
|
+
...(patch.projectId !== undefined && { projectId: patch.projectId }),
|
|
123
|
+
...(patch.computeServerId !== undefined && {
|
|
124
|
+
computeServerId: clearable(patch.computeServerId)
|
|
125
|
+
}),
|
|
126
|
+
...(patch.status !== undefined && { status: patch.status }),
|
|
127
|
+
...(patch.lastEditedBy !== undefined && { lastEditedBy: patch.lastEditedBy }),
|
|
128
|
+
updatedAt: new Date().toISOString()
|
|
129
|
+
};
|
|
130
|
+
await this.writeConfig(config);
|
|
131
|
+
}
|
|
132
|
+
async addHistoryEntry(_ctx, guid, entry) {
|
|
133
|
+
const config = await this.readConfig();
|
|
134
|
+
const existing = config.definitions[guid];
|
|
135
|
+
if (!existing)
|
|
136
|
+
throw new ProviderError(`Definition '${guid}' not found`, 404);
|
|
137
|
+
const history = [entry, ...existing.history];
|
|
138
|
+
existing.history = existing.maxHistory > 0 ? history.slice(0, existing.maxHistory) : history;
|
|
139
|
+
await this.writeConfig(config);
|
|
140
|
+
}
|
|
141
|
+
async removeHistoryEntry(_ctx, guid, ref) {
|
|
142
|
+
const config = await this.readConfig();
|
|
143
|
+
const existing = config.definitions[guid];
|
|
144
|
+
if (!existing)
|
|
145
|
+
throw new ProviderError(`Definition '${guid}' not found`, 404);
|
|
146
|
+
existing.history = existing.history.filter((e) => e.ref !== ref);
|
|
147
|
+
await this.writeConfig(config);
|
|
148
|
+
}
|
|
149
|
+
async delete(_ctx, guid) {
|
|
150
|
+
const config = await this.readConfig();
|
|
151
|
+
delete config.definitions[guid];
|
|
152
|
+
await this.writeConfig(config);
|
|
153
|
+
}
|
|
154
|
+
async incrementRunCount(_ctx, guid) {
|
|
155
|
+
const config = await this.readConfig();
|
|
156
|
+
const existing = config.definitions[guid];
|
|
157
|
+
if (!existing)
|
|
158
|
+
return;
|
|
159
|
+
existing.runCount = (existing.runCount ?? 0) + 1;
|
|
160
|
+
existing.updatedAt = new Date().toISOString();
|
|
161
|
+
await this.writeConfig(config);
|
|
162
|
+
}
|
|
163
|
+
async listStalePending(_ctx, olderThanIso) {
|
|
164
|
+
const config = await this.readConfig();
|
|
165
|
+
return Object.values(config.definitions).filter((r) => r?.status === 'pending' && r.createdAt <= olderThanIso);
|
|
166
|
+
}
|
|
167
|
+
async canEditDefinition(ctx, projectId, userId, definitionOwnerId) {
|
|
168
|
+
if (!this.projectProvider)
|
|
169
|
+
return false;
|
|
170
|
+
if (hasPermission(ctx, 'platform_admin'))
|
|
171
|
+
return true;
|
|
172
|
+
const project = await this.projectProvider.getProject(ctx, projectId);
|
|
173
|
+
if (!project)
|
|
174
|
+
return false;
|
|
175
|
+
const projectMembers = await this.projectProvider.listProjectMembers(ctx, projectId);
|
|
176
|
+
const member = projectMembers.items.find((m) => m.userId === userId);
|
|
177
|
+
if (project.visibility === 'public')
|
|
178
|
+
return userId === definitionOwnerId;
|
|
179
|
+
if (project.visibility === 'org') {
|
|
180
|
+
return userId === definitionOwnerId || member?.role === 'owner' || member?.role === 'editor';
|
|
181
|
+
}
|
|
182
|
+
if (project.visibility === 'private') {
|
|
183
|
+
return member?.role === 'owner' || member?.role === 'editor';
|
|
184
|
+
}
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=LocalDefinitionMetaProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalDefinitionMetaProvider.js","sourceRoot":"","sources":["../../src/definitions/LocalDefinitionMetaProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.test.d.ts","sourceRoot":"","sources":["../../../src/definitions/__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 { runDefinitionStoreConformance } from '@selva/platform/testing';
|
|
6
|
+
import { LocalDefinitionMetaProvider } from '../LocalDefinitionMetaProvider.js';
|
|
7
|
+
describe('LocalDefinitionMetaProvider', () => {
|
|
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
|
+
runDefinitionStoreConformance({
|
|
16
|
+
name: 'LocalDefinitionMetaProvider',
|
|
17
|
+
createStore: () => new LocalDefinitionMetaProvider(tempDir)
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=conformance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.test.js","sourceRoot":"","sources":["../../../src/definitions/__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,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAEhF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC5C,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,6BAA6B,CAAC;QAC7B,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,2BAA2B,CAAC,OAAO,CAAC;KAC3D,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/definitions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/definitions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { IDefinitionFileProvider, DefinitionFileExt, HistoryEntry } from '@selva/platform/definitions';
|
|
2
|
+
export declare class LocalDefinitionFileProvider implements IDefinitionFileProvider {
|
|
3
|
+
private readonly definitionsPath;
|
|
4
|
+
private readonly imageUrlPrefix;
|
|
5
|
+
constructor(definitionsPath: string, imageUrlPrefix?: string);
|
|
6
|
+
private guidPath;
|
|
7
|
+
private oldFilesDir;
|
|
8
|
+
getFile(guid: string): Promise<Uint8Array | null>;
|
|
9
|
+
getPreviewImage(guid: string): Promise<Uint8Array | null>;
|
|
10
|
+
getArchivedFile(guid: string, ref: string): Promise<Uint8Array | null>;
|
|
11
|
+
saveFile(guid: string, data: Uint8Array, ext: DefinitionFileExt): Promise<void>;
|
|
12
|
+
archiveCurrentFile(guid: string, originalName: string): Promise<HistoryEntry | null>;
|
|
13
|
+
deleteArchivedFile(guid: string, ref: string): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Save a preview image compressed to WebP.
|
|
16
|
+
* Returns the public URL for the stored image (used by callers to update meta.coverImage).
|
|
17
|
+
* The return type is void per IDefinitionFileProvider — callers read the URL via getImageUrl().
|
|
18
|
+
*/
|
|
19
|
+
saveImage(guid: string, data: Uint8Array): Promise<void>;
|
|
20
|
+
/** Returns the public URL for the stored cover image (always cover.webp). */
|
|
21
|
+
getCoverImageUrl(guid: string): string;
|
|
22
|
+
deleteFiles(guid: string): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=filesystem-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-files.d.ts","sourceRoot":"","sources":["../../../src/definitions/providers/filesystem-files.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACX,uBAAuB,EACvB,iBAAiB,EACjB,YAAY,EACZ,MAAM,6BAA6B,CAAC;AAGrC,qBAAa,2BAA4B,YAAW,uBAAuB;IAC1E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,eAAe,EAAE,MAAM,EAAE,cAAc,SAAqB;IAKxE,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,WAAW;IAMb,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAcjD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAqCzD,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAUtE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/E,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAqCpF,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE;;;;OAIG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B9D,6EAA6E;IAC7E,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIhC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9C"}
|