@selvajs/platform 0.14.3-beta.0 → 0.15.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/dist/computeServer/index.d.ts +1 -1
- package/dist/computeServer/index.d.ts.map +1 -1
- package/dist/computeServer/interface.d.ts +29 -1
- package/dist/computeServer/interface.d.ts.map +1 -1
- package/dist/computeServer/types.d.ts +12 -1
- package/dist/computeServer/types.d.ts.map +1 -1
- package/dist/computeServer/types.js.map +1 -1
- package/dist/data/index.d.ts +2 -1
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +1 -1
- package/dist/data/index.js.map +1 -1
- package/dist/data/interface.d.ts +69 -8
- package/dist/data/interface.d.ts.map +1 -1
- package/dist/data/interface.js +7 -1
- package/dist/data/interface.js.map +1 -1
- package/dist/definitions/interface.d.ts +16 -1
- package/dist/definitions/interface.d.ts.map +1 -1
- package/dist/definitions/schemas.d.ts +1 -0
- package/dist/definitions/schemas.d.ts.map +1 -1
- package/dist/definitions/schemas.js +8 -0
- package/dist/definitions/schemas.js.map +1 -1
- package/dist/definitions/types.d.ts +24 -1
- package/dist/definitions/types.d.ts.map +1 -1
- package/dist/events/index.d.ts +1 -1
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +1 -1
- package/dist/events/index.js.map +1 -1
- package/dist/events/interface.d.ts +30 -0
- package/dist/events/interface.d.ts.map +1 -1
- package/dist/events/interface.js +7 -0
- package/dist/events/interface.js.map +1 -1
- package/dist/index.d.ts +9 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/logging/interface.d.ts +82 -0
- package/dist/logging/interface.d.ts.map +1 -0
- package/dist/logging/interface.js +33 -0
- package/dist/logging/interface.js.map +1 -0
- package/dist/metrics/interface.d.ts +6 -0
- package/dist/metrics/interface.d.ts.map +1 -1
- package/dist/metrics/interface.js.map +1 -1
- package/dist/organizations/__tests__/slug-schema.test.d.ts +2 -0
- package/dist/organizations/__tests__/slug-schema.test.d.ts.map +1 -0
- package/dist/organizations/__tests__/slug-schema.test.js +38 -0
- package/dist/organizations/__tests__/slug-schema.test.js.map +1 -0
- package/dist/organizations/index.d.ts +1 -1
- package/dist/organizations/index.d.ts.map +1 -1
- package/dist/organizations/index.js +1 -1
- package/dist/organizations/index.js.map +1 -1
- package/dist/organizations/schemas.d.ts +16 -2
- package/dist/organizations/schemas.d.ts.map +1 -1
- package/dist/organizations/schemas.js +32 -2
- package/dist/organizations/schemas.js.map +1 -1
- package/dist/solveCache/interface.d.ts +86 -0
- package/dist/solveCache/interface.d.ts.map +1 -0
- package/dist/solveCache/interface.js +12 -0
- package/dist/solveCache/interface.js.map +1 -0
- package/dist/testing/suites/definitionStoreSuite.d.ts.map +1 -1
- package/dist/testing/suites/definitionStoreSuite.js +57 -0
- package/dist/testing/suites/definitionStoreSuite.js.map +1 -1
- package/dist/testing/suites/eventSinkSuite.js +1 -0
- package/dist/testing/suites/eventSinkSuite.js.map +1 -1
- package/dist/testing/suites/platformPermissionStoreSuite.d.ts +9 -0
- package/dist/testing/suites/platformPermissionStoreSuite.d.ts.map +1 -1
- package/dist/testing/suites/platformPermissionStoreSuite.js +34 -1
- package/dist/testing/suites/platformPermissionStoreSuite.js.map +1 -1
- package/dist/testing/suites/solveMetricSinkSuite.d.ts +5 -0
- package/dist/testing/suites/solveMetricSinkSuite.d.ts.map +1 -1
- package/dist/testing/suites/solveMetricSinkSuite.js +17 -8
- package/dist/testing/suites/solveMetricSinkSuite.js.map +1 -1
- package/dist/testing/suites/storageProviderSuite.d.ts.map +1 -1
- package/dist/testing/suites/storageProviderSuite.js +23 -2
- package/dist/testing/suites/storageProviderSuite.js.map +1 -1
- package/package.json +9 -24
- package/src/access/index.ts +0 -23
- package/src/access/rules.ts +0 -276
- package/src/auth/index.ts +0 -8
- package/src/auth/interface.ts +0 -279
- package/src/auth/types.ts +0 -32
- package/src/bindings/index.ts +0 -2
- package/src/bindings/interface.ts +0 -61
- package/src/computeServer/index.ts +0 -28
- package/src/computeServer/interface.ts +0 -73
- package/src/computeServer/secrets.ts +0 -102
- package/src/computeServer/types.ts +0 -74
- package/src/computeServer/utils.ts +0 -112
- package/src/config.ts +0 -99
- package/src/context.ts +0 -80
- package/src/data/index.ts +0 -1
- package/src/data/interface.ts +0 -70
- package/src/definitions/index.ts +0 -26
- package/src/definitions/interface.ts +0 -87
- package/src/definitions/paths.ts +0 -31
- package/src/definitions/schemas.ts +0 -64
- package/src/definitions/types.ts +0 -111
- package/src/errors/interface.ts +0 -45
- package/src/errors.ts +0 -16
- package/src/events/audit.ts +0 -67
- package/src/events/index.ts +0 -9
- package/src/events/interface.ts +0 -102
- package/src/index.ts +0 -247
- package/src/invites/index.ts +0 -2
- package/src/invites/interface.ts +0 -38
- package/src/invites/types.ts +0 -39
- package/src/metrics/interface.ts +0 -86
- package/src/organizations/index.ts +0 -23
- package/src/organizations/interface.ts +0 -68
- package/src/organizations/paths.ts +0 -45
- package/src/organizations/schemas.ts +0 -61
- package/src/organizations/types.ts +0 -41
- package/src/pagination.ts +0 -45
- package/src/permissions/index.ts +0 -3
- package/src/permissions/interface.ts +0 -60
- package/src/permissions/types.ts +0 -21
- package/src/platformProjects/index.ts +0 -3
- package/src/platformProjects/interface.ts +0 -27
- package/src/platformProjects/schemas.ts +0 -13
- package/src/platformProjects/types.ts +0 -22
- package/src/projects/index.ts +0 -4
- package/src/projects/interface.ts +0 -58
- package/src/projects/schemas.ts +0 -28
- package/src/projects/types.ts +0 -36
- package/src/shareLinks/index.ts +0 -5
- package/src/shareLinks/interface.ts +0 -35
- package/src/shareLinks/schemas.ts +0 -21
- package/src/shareLinks/types.ts +0 -34
- package/src/storage/assetClasses.ts +0 -134
- package/src/storage/cacheBust.ts +0 -26
- package/src/storage/image.ts +0 -82
- package/src/storage/index.ts +0 -12
- package/src/storage/interface.ts +0 -27
- package/src/testing/index.ts +0 -47
- package/src/testing/suites/authProviderSuite.ts +0 -207
- package/src/testing/suites/computeServerStoreSuite.ts +0 -195
- package/src/testing/suites/definitionStoreSuite.ts +0 -630
- package/src/testing/suites/emailLinkAuthSuite.ts +0 -83
- package/src/testing/suites/eventSinkSuite.ts +0 -379
- package/src/testing/suites/helpers.ts +0 -87
- package/src/testing/suites/inviteStoreSuite.ts +0 -143
- package/src/testing/suites/orgStoreSuite.ts +0 -429
- package/src/testing/suites/platformPermissionStoreSuite.ts +0 -196
- package/src/testing/suites/platformProjectGrantStoreSuite.ts +0 -166
- package/src/testing/suites/projectStoreSuite.ts +0 -381
- package/src/testing/suites/shareLinkStoreSuite.ts +0 -203
- package/src/testing/suites/solveMetricSinkSuite.ts +0 -135
- package/src/testing/suites/storageProviderSuite.ts +0 -196
- package/src/testing/suites/userProfileStoreSuite.ts +0 -134
- package/src/userProfile/index.ts +0 -3
- package/src/userProfile/interface.ts +0 -48
- package/src/userProfile/types.ts +0 -24
- package/src/utils/audit.ts +0 -46
- package/src/utils/index.ts +0 -2
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Adapter conformance suite for IComputeServerStore.
|
|
3
|
-
*
|
|
4
|
-
* Architecture spec §4.8 — servers are scoped (platform vs. org-private), with a global
|
|
5
|
-
* `defaultServerId` and per-org `orgDefaults`. The store surface exposes
|
|
6
|
-
* scope-targeted mutations; visibility filtering is done by callers via
|
|
7
|
-
* the pure helpers in `@selvajs/platform`.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { describe, it, expect } from 'vitest';
|
|
11
|
-
import type { IComputeServerStore } from '../../computeServer/interface.js';
|
|
12
|
-
import type {
|
|
13
|
-
ComputeServerConfig,
|
|
14
|
-
OrgComputeServer,
|
|
15
|
-
PlatformComputeServer
|
|
16
|
-
} from '../../computeServer/types.js';
|
|
17
|
-
import { isOrgServer, isPlatformServer } from '../../computeServer/types.js';
|
|
18
|
-
import { SYSTEM_CONTEXT } from '../../context.js';
|
|
19
|
-
import { makeUuid } from './helpers.js';
|
|
20
|
-
|
|
21
|
-
export interface ComputeServerStoreConformanceOptions {
|
|
22
|
-
name: string;
|
|
23
|
-
createStore: () => Promise<IComputeServerStore> | IComputeServerStore;
|
|
24
|
-
/**
|
|
25
|
-
* Optional hook adapters with FK constraints use to seed an `orgs` row
|
|
26
|
-
* before the suite writes an org-scoped compute config that FK-references
|
|
27
|
-
* it. Adapters without org FKs (local JSON) can omit this.
|
|
28
|
-
*/
|
|
29
|
-
seedOrg?: (orgId: string) => Promise<void>;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function platformServer(
|
|
33
|
-
overrides: Partial<Omit<PlatformComputeServer, 'scope'>> = {}
|
|
34
|
-
): PlatformComputeServer {
|
|
35
|
-
return {
|
|
36
|
-
id: overrides.id ?? makeUuid(),
|
|
37
|
-
scope: 'platform',
|
|
38
|
-
sharedWith: overrides.sharedWith ?? 'all',
|
|
39
|
-
label: overrides.label ?? 'Test Server',
|
|
40
|
-
serverUrl: overrides.serverUrl ?? 'http://localhost:5000',
|
|
41
|
-
apiKey: overrides.apiKey,
|
|
42
|
-
timeoutMs: overrides.timeoutMs,
|
|
43
|
-
retryCount: overrides.retryCount
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function orgServer(
|
|
48
|
-
ownerOrgId: string,
|
|
49
|
-
overrides: Partial<Omit<OrgComputeServer, 'scope' | 'ownerOrgId'>> = {}
|
|
50
|
-
): OrgComputeServer {
|
|
51
|
-
return {
|
|
52
|
-
id: overrides.id ?? makeUuid(),
|
|
53
|
-
scope: 'org',
|
|
54
|
-
ownerOrgId,
|
|
55
|
-
label: overrides.label ?? 'Org Server',
|
|
56
|
-
serverUrl: overrides.serverUrl ?? 'http://localhost:5001',
|
|
57
|
-
apiKey: overrides.apiKey,
|
|
58
|
-
timeoutMs: overrides.timeoutMs,
|
|
59
|
-
retryCount: overrides.retryCount
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export function runComputeServerStoreConformance(opts: ComputeServerStoreConformanceOptions): void {
|
|
64
|
-
const { name, createStore, seedOrg } = opts;
|
|
65
|
-
const seed = async (): Promise<string> => {
|
|
66
|
-
const id = makeUuid();
|
|
67
|
-
if (seedOrg) await seedOrg(id);
|
|
68
|
-
return id;
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
describe(`IComputeServerStore conformance: ${name}`, () => {
|
|
72
|
-
it('savePlatformServers + getConfig round-trips servers and defaultServerId', async () => {
|
|
73
|
-
const store = await createStore();
|
|
74
|
-
const s1 = platformServer({ label: 'Primary' });
|
|
75
|
-
const s2 = platformServer({ label: 'Secondary', apiKey: 'secret' });
|
|
76
|
-
await store.savePlatformServers(SYSTEM_CONTEXT, [s1, s2], s1.id);
|
|
77
|
-
|
|
78
|
-
const got = await store.getConfig(SYSTEM_CONTEXT);
|
|
79
|
-
const platformIds = got.servers.filter(isPlatformServer).map((s) => s.id);
|
|
80
|
-
expect(platformIds.sort()).toEqual([s1.id, s2.id].sort());
|
|
81
|
-
expect(got.defaultServerId).toBe(s1.id);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('savePlatformServers replaces the previous platform set', async () => {
|
|
85
|
-
const store = await createStore();
|
|
86
|
-
await store.savePlatformServers(
|
|
87
|
-
SYSTEM_CONTEXT,
|
|
88
|
-
[platformServer({ label: 'Old' })],
|
|
89
|
-
undefined
|
|
90
|
-
);
|
|
91
|
-
|
|
92
|
-
const newS = platformServer({ label: 'New' });
|
|
93
|
-
await store.savePlatformServers(SYSTEM_CONTEXT, [newS], newS.id);
|
|
94
|
-
|
|
95
|
-
const got = await store.getConfig(SYSTEM_CONTEXT);
|
|
96
|
-
const platformIds = got.servers.filter(isPlatformServer).map((s) => s.id);
|
|
97
|
-
expect(platformIds).toEqual([newS.id]);
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('getConfig on empty returns an empty servers list', async () => {
|
|
101
|
-
const store = await createStore();
|
|
102
|
-
const got = await store.getConfig(SYSTEM_CONTEXT);
|
|
103
|
-
expect(Array.isArray(got.servers)).toBe(true);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
// ============================================================================
|
|
107
|
-
// Org-private servers + orgDefaults (Architecture spec §4.8)
|
|
108
|
-
// ============================================================================
|
|
109
|
-
|
|
110
|
-
it('saveOrgServers stores rows owned by the org', async () => {
|
|
111
|
-
const store = await createStore();
|
|
112
|
-
const orgId = await seed();
|
|
113
|
-
const s = orgServer(orgId, { label: "Org's BYO" });
|
|
114
|
-
await store.saveOrgServers(SYSTEM_CONTEXT, orgId, [s], s.id);
|
|
115
|
-
|
|
116
|
-
const got = await store.getConfig(SYSTEM_CONTEXT);
|
|
117
|
-
const ownRows = got.servers.filter(
|
|
118
|
-
(row): row is OrgComputeServer => isOrgServer(row) && row.ownerOrgId === orgId
|
|
119
|
-
);
|
|
120
|
-
expect(ownRows.map((r) => r.id)).toEqual([s.id]);
|
|
121
|
-
expect(got.orgDefaults?.[orgId]).toBe(s.id);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it('saveOrgServers does not clobber platform rows (and vice versa)', async () => {
|
|
125
|
-
const store = await createStore();
|
|
126
|
-
const orgId = await seed();
|
|
127
|
-
const platS = platformServer({ label: 'Platform' });
|
|
128
|
-
const orgS = orgServer(orgId, { label: 'Org' });
|
|
129
|
-
|
|
130
|
-
await store.savePlatformServers(SYSTEM_CONTEXT, [platS], platS.id);
|
|
131
|
-
await store.saveOrgServers(SYSTEM_CONTEXT, orgId, [orgS], orgS.id);
|
|
132
|
-
|
|
133
|
-
// Replacing the platform set should leave org rows untouched.
|
|
134
|
-
const replacement = platformServer({ label: 'Replacement' });
|
|
135
|
-
await store.savePlatformServers(SYSTEM_CONTEXT, [replacement], replacement.id);
|
|
136
|
-
|
|
137
|
-
const got = await store.getConfig(SYSTEM_CONTEXT);
|
|
138
|
-
const platformIds = got.servers.filter(isPlatformServer).map((s) => s.id);
|
|
139
|
-
expect(platformIds).toEqual([replacement.id]);
|
|
140
|
-
const orgIds = got.servers
|
|
141
|
-
.filter((s): s is OrgComputeServer => isOrgServer(s) && s.ownerOrgId === orgId)
|
|
142
|
-
.map((s) => s.id);
|
|
143
|
-
expect(orgIds).toEqual([orgS.id]);
|
|
144
|
-
expect(got.defaultServerId).toBe(replacement.id);
|
|
145
|
-
expect(got.orgDefaults?.[orgId]).toBe(orgS.id);
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
it('setOrgDefault updates and clears the per-org default', async () => {
|
|
149
|
-
const store = await createStore();
|
|
150
|
-
const orgId = await seed();
|
|
151
|
-
const s = orgServer(orgId);
|
|
152
|
-
await store.saveOrgServers(SYSTEM_CONTEXT, orgId, [s]);
|
|
153
|
-
|
|
154
|
-
await store.setOrgDefault(SYSTEM_CONTEXT, orgId, s.id);
|
|
155
|
-
let got = await store.getConfig(SYSTEM_CONTEXT);
|
|
156
|
-
expect(got.orgDefaults?.[orgId]).toBe(s.id);
|
|
157
|
-
|
|
158
|
-
await store.setOrgDefault(SYSTEM_CONTEXT, orgId, null);
|
|
159
|
-
got = await store.getConfig(SYSTEM_CONTEXT);
|
|
160
|
-
expect(got.orgDefaults?.[orgId]).toBeUndefined();
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
it('deleteByOrg removes org-private rows and the orgDefaults entry', async () => {
|
|
164
|
-
const store = await createStore();
|
|
165
|
-
const orgId = await seed();
|
|
166
|
-
const orgS = orgServer(orgId);
|
|
167
|
-
await store.saveOrgServers(SYSTEM_CONTEXT, orgId, [orgS], orgS.id);
|
|
168
|
-
|
|
169
|
-
await store.deleteByOrg(SYSTEM_CONTEXT, orgId);
|
|
170
|
-
|
|
171
|
-
const got = await store.getConfig(SYSTEM_CONTEXT);
|
|
172
|
-
const remaining = got.servers.filter(
|
|
173
|
-
(s): s is ComputeServerConfig => isOrgServer(s) && s.ownerOrgId === orgId
|
|
174
|
-
);
|
|
175
|
-
expect(remaining).toEqual([]);
|
|
176
|
-
expect(got.orgDefaults?.[orgId]).toBeUndefined();
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it('deleteByOrg strips this org from platform sharedWith allowlists', async () => {
|
|
180
|
-
const store = await createStore();
|
|
181
|
-
const orgId = await seed();
|
|
182
|
-
const otherOrgId = await seed();
|
|
183
|
-
const platS = platformServer({ sharedWith: [orgId, otherOrgId] });
|
|
184
|
-
await store.savePlatformServers(SYSTEM_CONTEXT, [platS], platS.id);
|
|
185
|
-
|
|
186
|
-
await store.deleteByOrg(SYSTEM_CONTEXT, orgId);
|
|
187
|
-
|
|
188
|
-
const got = await store.getConfig(SYSTEM_CONTEXT);
|
|
189
|
-
const found = got.servers.find(
|
|
190
|
-
(s): s is PlatformComputeServer => isPlatformServer(s) && s.id === platS.id
|
|
191
|
-
);
|
|
192
|
-
expect(found?.sharedWith).toEqual([otherOrgId]);
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
}
|