@nacre.work/api 0.0.0 → 0.2.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 (69) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +9 -0
  3. package/dist/adapters.d.ts +421 -17
  4. package/dist/adapters.d.ts.map +1 -1
  5. package/dist/adapters.js +1092 -72
  6. package/dist/adapters.js.map +1 -1
  7. package/dist/audit-export.d.ts +45 -0
  8. package/dist/audit-export.d.ts.map +1 -0
  9. package/dist/audit-export.js +155 -0
  10. package/dist/audit-export.js.map +1 -0
  11. package/dist/auth.d.ts +17 -0
  12. package/dist/auth.d.ts.map +1 -1
  13. package/dist/auth.js +17 -7
  14. package/dist/auth.js.map +1 -1
  15. package/dist/idempotency.d.ts +62 -0
  16. package/dist/idempotency.d.ts.map +1 -0
  17. package/dist/idempotency.js +147 -0
  18. package/dist/idempotency.js.map +1 -0
  19. package/dist/index.d.ts +12 -3
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +10 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/init.d.ts +9 -0
  24. package/dist/init.d.ts.map +1 -1
  25. package/dist/init.js +50 -5
  26. package/dist/init.js.map +1 -1
  27. package/dist/limits.d.ts +80 -0
  28. package/dist/limits.d.ts.map +1 -0
  29. package/dist/limits.js +63 -0
  30. package/dist/limits.js.map +1 -0
  31. package/dist/login.d.ts +94 -0
  32. package/dist/login.d.ts.map +1 -0
  33. package/dist/login.js +283 -0
  34. package/dist/login.js.map +1 -0
  35. package/dist/main.js +171 -60
  36. package/dist/main.js.map +1 -1
  37. package/dist/pagination.d.ts +72 -0
  38. package/dist/pagination.d.ts.map +1 -0
  39. package/dist/pagination.js +110 -0
  40. package/dist/pagination.js.map +1 -0
  41. package/dist/rerank.d.ts +99 -0
  42. package/dist/rerank.d.ts.map +1 -0
  43. package/dist/rerank.js +138 -0
  44. package/dist/rerank.js.map +1 -0
  45. package/dist/server.d.ts +361 -6
  46. package/dist/server.d.ts.map +1 -1
  47. package/dist/server.js +1050 -31
  48. package/dist/server.js.map +1 -1
  49. package/dist/service-keys.d.ts +13 -5
  50. package/dist/service-keys.d.ts.map +1 -1
  51. package/dist/service-keys.js +54 -31
  52. package/dist/service-keys.js.map +1 -1
  53. package/dist/source.d.ts +53 -0
  54. package/dist/source.d.ts.map +1 -0
  55. package/dist/source.js +109 -0
  56. package/dist/source.js.map +1 -0
  57. package/package.json +28 -10
  58. package/dist/__tests__/admin-surface.test.d.ts +0 -2
  59. package/dist/__tests__/admin-surface.test.d.ts.map +0 -1
  60. package/dist/__tests__/admin-surface.test.js +0 -431
  61. package/dist/__tests__/admin-surface.test.js.map +0 -1
  62. package/dist/__tests__/init.test.d.ts +0 -2
  63. package/dist/__tests__/init.test.d.ts.map +0 -1
  64. package/dist/__tests__/init.test.js +0 -125
  65. package/dist/__tests__/init.test.js.map +0 -1
  66. package/dist/__tests__/service-keys.test.d.ts +0 -2
  67. package/dist/__tests__/service-keys.test.d.ts.map +0 -1
  68. package/dist/__tests__/service-keys.test.js +0 -204
  69. package/dist/__tests__/service-keys.test.js.map +0 -1
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=admin-surface.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"admin-surface.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/admin-surface.test.ts"],"names":[],"mappings":""}
@@ -1,431 +0,0 @@
1
- import { SignJWT } from 'jose';
2
- import { afterAll, beforeAll, describe, expect, it } from 'vitest';
3
- import { createApi } from '../index.js';
4
- /**
5
- * The administrative surface: layers, grants, jobs.
6
- *
7
- * Storage is injected — what is under test is what the API says, not what the
8
- * database holds. Two things here are properties of this layer alone: the
9
- * 403/404 split on scopes the caller may not administer, and the two grant
10
- * shapes this build refuses because they are commercial.
11
- */
12
- const SECRET = new TextEncoder().encode('a'.repeat(32));
13
- const ISSUER = 'https://api.nacre.test';
14
- const AUDIENCE = 'nacre';
15
- const ORG_A = '11111111-1111-1111-1111-111111111111';
16
- const WS_MINE = 'dddddddd-0000-4000-8000-000000000001';
17
- const WS_THEIRS = 'dddddddd-0000-4000-8000-000000000002';
18
- const LAYER = 'eeeeeeee-0000-4000-8000-000000000001';
19
- const PRINCIPAL = 'ffffffff-0000-4000-8000-000000000001';
20
- const DOC = 'aaaaaaaa-0000-4000-8000-000000000001';
21
- async function answerOnly(r) {
22
- const { instance, request_id, ...rest } = (await r.json());
23
- void instance;
24
- void request_id;
25
- return rest;
26
- }
27
- const audited = [];
28
- const issued = [];
29
- const revoked = [];
30
- let server;
31
- let base;
32
- async function token() {
33
- return new SignJWT({ org: ORG_A, principal_type: 'user', role: 'member' })
34
- .setProtectedHeader({ alg: 'HS256' })
35
- .setSubject('alice')
36
- .setIssuer(ISSUER)
37
- .setAudience(AUDIENCE)
38
- .setExpirationTime('5m')
39
- .sign(SECRET);
40
- }
41
- const auth = async () => ({
42
- authorization: `Bearer ${await token()}`,
43
- 'content-type': 'application/json',
44
- });
45
- async function adminToken() {
46
- return new SignJWT({ org: ORG_A, principal_type: 'user', role: 'org_admin' })
47
- .setProtectedHeader({ alg: 'HS256' })
48
- .setSubject('root')
49
- .setIssuer(ISSUER)
50
- .setAudience(AUDIENCE)
51
- .setExpirationTime('5m')
52
- .sign(SECRET);
53
- }
54
- const adminAuth = async () => ({
55
- authorization: `Bearer ${await adminToken()}`,
56
- 'content-type': 'application/json',
57
- });
58
- describe('the administrative surface', () => {
59
- beforeAll(async () => {
60
- server = createApi({
61
- verify: { key: SECRET, issuer: ISSUER, audience: AUDIENCE },
62
- documents: { read: async () => undefined },
63
- search: { search: async () => [] },
64
- ingest: { queue: async () => undefined, remove: async () => false },
65
- audit: {
66
- write: async (event) => {
67
- audited.push(event);
68
- },
69
- },
70
- jobs: {
71
- read: async (a, jobId) => a.orgId === ORG_A && jobId === DOC
72
- ? { jobId: DOC, documentId: DOC, status: 'indexed', progress: 1 }
73
- : undefined,
74
- },
75
- layers: {
76
- list: async () => [
77
- {
78
- id: LAYER,
79
- slug: 'handbook',
80
- name: 'Handbook',
81
- workspaceId: WS_MINE,
82
- description: 'How things are done here',
83
- documentCount: 12,
84
- },
85
- ],
86
- // `denied` for "may not administer" and "no such workspace" alike;
87
- // `conflict` only once the caller has proved admin on the workspace.
88
- create: async (_a, input) => input.workspaceId !== WS_MINE
89
- ? { kind: 'denied' }
90
- : input.slug === 'taken'
91
- ? { kind: 'conflict' }
92
- : {
93
- kind: 'created',
94
- layer: {
95
- id: LAYER,
96
- slug: input.slug,
97
- name: input.name,
98
- workspaceId: WS_MINE,
99
- description: '',
100
- documentCount: 0,
101
- },
102
- },
103
- },
104
- serviceAccounts: {
105
- list: async () => [
106
- {
107
- id: 'sa-1',
108
- name: 'agent',
109
- keyPrefix: 'nacre_sk_abcd1234',
110
- createdAt: '2026-01-01T00:00:00.000Z',
111
- lastUsedAt: null,
112
- revokedAt: null,
113
- },
114
- ],
115
- create: async (_a, name) => ({
116
- key: 'nacre_sk_abcd1234SECRETSECRETSECRET',
117
- account: {
118
- id: 'sa-2',
119
- name,
120
- keyPrefix: 'nacre_sk_abcd1234',
121
- createdAt: '2026-01-01T00:00:00.000Z',
122
- lastUsedAt: null,
123
- revokedAt: null,
124
- },
125
- }),
126
- revoke: async (_a, id) => id === 'sa-1',
127
- },
128
- grants: {
129
- list: async () => [],
130
- issue: async (_a, input) => {
131
- if (input.scopeId !== LAYER)
132
- return undefined;
133
- issued.push(input);
134
- return { ...input, id: 'grant-1', effect: 'allow', source: 'api' };
135
- },
136
- revoke: async (_a, id) => {
137
- if (id !== 'grant-1')
138
- return false;
139
- revoked.push(id);
140
- return true;
141
- },
142
- },
143
- });
144
- await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
145
- base = `http://127.0.0.1:${server.address().port}`;
146
- });
147
- afterAll(async () => {
148
- await new Promise((resolve) => server.close(() => resolve()));
149
- });
150
- it('a job reports its status', async () => {
151
- const res = await fetch(`${base}/v1/jobs/${DOC}`, { headers: await auth() });
152
- expect(res.status).toBe(200);
153
- expect((await res.json())).toMatchObject({
154
- job_id: DOC,
155
- document_id: DOC,
156
- status: 'indexed',
157
- });
158
- });
159
- it('another organization’s job is 404, identical to one that does not exist', async () => {
160
- const missing = await fetch(`${base}/v1/jobs/${WS_THEIRS}`, { headers: await auth() });
161
- const absent = await fetch(`${base}/v1/jobs/${PRINCIPAL}`, { headers: await auth() });
162
- // A job names a document, so it is exactly as much of an oracle as the
163
- // document is. Anything that distinguishes these two enumerates ids.
164
- expect(missing.status).toBe(404);
165
- expect(await answerOnly(missing)).toEqual(await answerOnly(absent));
166
- });
167
- it('layers lists what the caller may read', async () => {
168
- const res = await fetch(`${base}/v1/layers`, { headers: await auth() });
169
- expect(res.status).toBe(200);
170
- const body = (await res.json());
171
- expect(body.items).toHaveLength(1);
172
- expect(body.items[0]?.slug).toBe('handbook');
173
- });
174
- it('creating a layer in a workspace the caller may not administer is 404, not 403', async () => {
175
- const res = await fetch(`${base}/v1/layers`, {
176
- method: 'POST',
177
- headers: await auth(),
178
- body: JSON.stringify({ workspace_id: WS_THEIRS, slug: 'secret', name: 'Secret' }),
179
- });
180
- expect(res.status).toBe(404);
181
- expect(audited.find((e) => e.action === 'create_layer')?.result).toBe('deny');
182
- });
183
- it('creating a layer answers 201 and journals it', async () => {
184
- audited.length = 0;
185
- const res = await fetch(`${base}/v1/layers`, {
186
- method: 'POST',
187
- headers: await auth(),
188
- body: JSON.stringify({ workspace_id: WS_MINE, slug: 'handbook', name: 'Handbook' }),
189
- });
190
- expect(res.status).toBe(201);
191
- expect(audited.find((e) => e.action === 'create_layer')?.result).toBe('allow');
192
- });
193
- it('a slug already in use is 409, not another 404', async () => {
194
- const res = await fetch(`${base}/v1/layers`, {
195
- method: 'POST',
196
- headers: await auth(),
197
- body: JSON.stringify({ workspace_id: WS_MINE, slug: 'taken', name: 'Taken' }),
198
- });
199
- // The caller proved admin on the workspace to get here, so this says
200
- // something about the resource rather than about what they can see.
201
- // Answering 404 makes the endpoint unusable: an administrator who picks a
202
- // name in use cannot tell it from having no permission, and guesses next.
203
- expect(res.status).toBe(409);
204
- expect((await answerOnly(res)).detail).toMatch(/already exists/);
205
- });
206
- it('a layer request missing its fields is 400', async () => {
207
- const res = await fetch(`${base}/v1/layers`, {
208
- method: 'POST',
209
- headers: await auth(),
210
- body: JSON.stringify({ slug: 'handbook' }),
211
- });
212
- expect(res.status).toBe(400);
213
- });
214
- it('a grant on a scope the caller may not administer is 404', async () => {
215
- const res = await fetch(`${base}/v1/grants`, {
216
- method: 'POST',
217
- headers: await auth(),
218
- body: JSON.stringify({
219
- principal_type: 'user',
220
- principal_id: PRINCIPAL,
221
- scope_type: 'layer',
222
- scope_id: WS_THEIRS,
223
- permission: 'read',
224
- }),
225
- });
226
- expect(res.status).toBe(404);
227
- expect(audited.find((e) => e.action === 'issue_grant')?.result).toBe('deny');
228
- });
229
- it('issuing a grant answers 201', async () => {
230
- issued.length = 0;
231
- const res = await fetch(`${base}/v1/grants`, {
232
- method: 'POST',
233
- headers: await auth(),
234
- body: JSON.stringify({
235
- principal_type: 'user',
236
- principal_id: PRINCIPAL,
237
- scope_type: 'layer',
238
- scope_id: LAYER,
239
- permission: 'read',
240
- }),
241
- });
242
- expect(res.status).toBe(201);
243
- expect((await res.json())).toMatchObject({ effect: 'allow', source: 'api' });
244
- expect(issued).toHaveLength(1);
245
- });
246
- it('a document-scoped grant is refused, and says why', async () => {
247
- issued.length = 0;
248
- const res = await fetch(`${base}/v1/grants`, {
249
- method: 'POST',
250
- headers: await auth(),
251
- body: JSON.stringify({
252
- principal_type: 'user',
253
- principal_id: PRINCIPAL,
254
- scope_type: 'document',
255
- scope_id: DOC,
256
- permission: 'read',
257
- }),
258
- });
259
- // Document-level ACLs are commercial (docs/licensing.md). 400 and not 404:
260
- // the caller is an administrator asking for a capability, which is not a
261
- // question about whether an object exists, so invariant I4 has no bearing
262
- // and the honest answer is the useful one.
263
- expect(res.status).toBe(400);
264
- expect((await answerOnly(res)).detail).toMatch(/not available in this build/);
265
- expect(issued, 'nothing may reach the store').toHaveLength(0);
266
- });
267
- it('a deny rule is refused', async () => {
268
- issued.length = 0;
269
- const res = await fetch(`${base}/v1/grants`, {
270
- method: 'POST',
271
- headers: await auth(),
272
- body: JSON.stringify({
273
- principal_type: 'user',
274
- principal_id: PRINCIPAL,
275
- scope_type: 'layer',
276
- scope_id: LAYER,
277
- permission: 'read',
278
- effect: 'deny',
279
- }),
280
- });
281
- // The resolver can represent deny — an enterprise resolver registered
282
- // through registerAuthzResolver produces them. The core must not issue what
283
- // it has no propagation for; a deny that never reaches the payload is worse
284
- // than one that was never accepted.
285
- expect(res.status).toBe(400);
286
- expect(issued).toHaveLength(0);
287
- });
288
- it('an explicit allow effect is accepted, since it is the default', async () => {
289
- const res = await fetch(`${base}/v1/grants`, {
290
- method: 'POST',
291
- headers: await auth(),
292
- body: JSON.stringify({
293
- principal_type: 'user',
294
- principal_id: PRINCIPAL,
295
- scope_type: 'layer',
296
- scope_id: LAYER,
297
- permission: 'read',
298
- effect: 'allow',
299
- }),
300
- });
301
- expect(res.status).toBe(201);
302
- });
303
- it('a grant can be withdrawn', async () => {
304
- const res = await fetch(`${base}/v1/grants/grant-1`, { method: 'DELETE', headers: await auth() });
305
- // 204 and no body. This is the operation the propagation SLA is written
306
- // about, and until this endpoint existed the only way to perform it was a
307
- // DELETE against the table by hand.
308
- expect(res.status).toBe(204);
309
- expect(revoked).toEqual(['grant-1']);
310
- });
311
- it('withdrawing a grant that is not there, or not the caller’s to touch, is 404', async () => {
312
- const res = await fetch(`${base}/v1/grants/grant-nope`, { method: 'DELETE', headers: await auth() });
313
- // Not 403. An administrator of one layer must not be able to tell an absent
314
- // grant from one on a scope they cannot administer — that difference is an
315
- // enumeration of the organization's grants.
316
- expect(res.status).toBe(404);
317
- expect(await answerOnly(res)).toEqual({
318
- type: 'https://nacre.work/errors/not-found',
319
- title: 'Not found',
320
- status: 404,
321
- detail: 'The requested resource does not exist or is not accessible.',
322
- });
323
- });
324
- it('the refused revocation is audited too', async () => {
325
- await fetch(`${base}/v1/grants/grant-nope`, { method: 'DELETE', headers: await auth() });
326
- // An attempt to revoke someone else's grant is exactly what a refused one
327
- // looks like, and it is the row an auditor asks for.
328
- const attempt = audited.filter((e) => e.action === 'revoke_grant' && e.result === 'deny');
329
- expect(attempt.length).toBeGreaterThan(0);
330
- expect(attempt.at(-1)?.detail).toMatchObject({ grant_id: 'grant-nope' });
331
- });
332
- it('an unknown permission or principal type is 400', async () => {
333
- for (const body of [
334
- { principal_type: 'robot', principal_id: PRINCIPAL, scope_type: 'layer', scope_id: LAYER, permission: 'read' },
335
- { principal_type: 'user', principal_id: PRINCIPAL, scope_type: 'layer', scope_id: LAYER, permission: 'superuser' },
336
- { principal_type: 'user', principal_id: PRINCIPAL, scope_type: 'planet', scope_id: LAYER, permission: 'read' },
337
- ]) {
338
- const res = await fetch(`${base}/v1/grants`, {
339
- method: 'POST',
340
- headers: await auth(),
341
- body: JSON.stringify(body),
342
- });
343
- expect(res.status, JSON.stringify(body)).toBe(400);
344
- }
345
- });
346
- it('a member may not mint or revoke a service account', async () => {
347
- // The fixture's token carries role 'member'. A service account is a
348
- // principal in the organization rather than an object in a workspace, so
349
- // there is no scope to check admin against — someone holding admin on one
350
- // layer must not be able to mint a credential.
351
- expect((await fetch(`${base}/v1/service-accounts`, { headers: await auth() })).status).toBe(404);
352
- const created = await fetch(`${base}/v1/service-accounts`, {
353
- method: 'POST',
354
- headers: await auth(),
355
- body: JSON.stringify({ name: 'agent' }),
356
- });
357
- expect(created.status).toBe(404);
358
- const revoked = await fetch(`${base}/v1/service-accounts/sa-1`, {
359
- method: 'DELETE',
360
- headers: await auth(),
361
- });
362
- expect(revoked.status).toBe(404);
363
- });
364
- it('an org_admin creates a key, and it is in the response exactly once', async () => {
365
- audited.length = 0;
366
- const res = await fetch(`${base}/v1/service-accounts`, {
367
- method: 'POST',
368
- headers: await adminAuth(),
369
- body: JSON.stringify({ name: 'agent' }),
370
- });
371
- expect(res.status).toBe(201);
372
- const body = (await res.json());
373
- expect(body.key).toBe('nacre_sk_abcd1234SECRETSECRETSECRET');
374
- // The key must not reach the audit log. That row is readable by anyone with
375
- // the access log, and the key is unrecoverable from anywhere else by
376
- // design — writing it here would quietly undo that.
377
- const event = audited.find((e) => e.action === 'create_service_account');
378
- expect(event?.result).toBe('allow');
379
- expect(JSON.stringify(event)).not.toContain('SECRETSECRETSECRET');
380
- expect(event?.detail.key_prefix).toBe('nacre_sk_abcd1234');
381
- });
382
- it('listing never carries a key', async () => {
383
- const res = await fetch(`${base}/v1/service-accounts`, { headers: await adminAuth() });
384
- expect(res.status).toBe(200);
385
- const text = await res.text();
386
- expect(text).toContain('key_prefix');
387
- // A listing that returned the key would make every operator's terminal
388
- // history a credential store, and the whole point of hashing it is that it
389
- // exists in exactly one response, once.
390
- expect(JSON.parse(text)).toMatchObject({
391
- items: [{ key_prefix: 'nacre_sk_abcd1234' }],
392
- });
393
- expect(text).not.toMatch(/"key"/);
394
- });
395
- it('revoking answers 204, and an unknown one 404', async () => {
396
- expect((await fetch(`${base}/v1/service-accounts/sa-1`, { method: 'DELETE', headers: await adminAuth() }))
397
- .status).toBe(204);
398
- expect((await fetch(`${base}/v1/service-accounts/sa-9`, { method: 'DELETE', headers: await adminAuth() }))
399
- .status).toBe(404);
400
- });
401
- it('a nameless service account is 400', async () => {
402
- const res = await fetch(`${base}/v1/service-accounts`, {
403
- method: 'POST',
404
- headers: await adminAuth(),
405
- body: JSON.stringify({ name: ' ' }),
406
- });
407
- expect(res.status).toBe(400);
408
- });
409
- it('the admin surface still refuses a body naming an organization', async () => {
410
- // Invariant I1 applies to every route, not only the ones that read
411
- // documents. A new endpoint that forgot rejectTenantOverride would be the
412
- // easiest way back in.
413
- const res = await fetch(`${base}/v1/layers`, {
414
- method: 'POST',
415
- headers: await auth(),
416
- body: JSON.stringify({
417
- workspace_id: WS_MINE,
418
- slug: 'x',
419
- name: 'X',
420
- org_id: '22222222-2222-2222-2222-222222222222',
421
- }),
422
- });
423
- expect(res.status).toBe(403);
424
- });
425
- it('the admin routes need a token', async () => {
426
- for (const path of ['/v1/layers', '/v1/grants', `/v1/jobs/${DOC}`]) {
427
- expect((await fetch(`${base}${path}`)).status, path).toBe(401);
428
- }
429
- });
430
- });
431
- //# sourceMappingURL=admin-surface.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"admin-surface.test.js","sourceRoot":"","sources":["../../src/__tests__/admin-surface.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=init.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/init.test.ts"],"names":[],"mappings":""}
@@ -1,125 +0,0 @@
1
- import { createPool } from '@nacre.work/core';
2
- import { afterAll, beforeAll, describe, expect, it } from 'vitest';
3
- import { initialize, parseArgs } from '../init.js';
4
- /**
5
- * Creating the first organization.
6
- *
7
- * Idempotency is the property under test and the one that regresses without
8
- * anyone noticing, because a second run of something non-idempotent usually
9
- * still exits zero — it just leaves two organizations, or two providers, and
10
- * the failure surfaces days later as a search that returns nothing.
11
- *
12
- * A half-finished first install is the normal case rather than the unlucky one:
13
- * the collection created and the process killed before the workspace, a
14
- * connection dropped mid-run, an operator who is not sure whether it worked and
15
- * runs it again. All of those have to converge.
16
- */
17
- const url = process.env.NACRE_PG_URL;
18
- if (!url && process.env.CI) {
19
- throw new Error('NACRE_PG_URL is not set and CI is; the init path would go untested.');
20
- }
21
- const when = url ? describe : describe.skip;
22
- const PROVIDER = { endpoint: 'http://embedder.test', model: 'bge-m3', dimensions: 8 };
23
- const options = {
24
- slug: 'inittest',
25
- name: 'Init Test',
26
- email: 'admin@inittest.test',
27
- workspace: 'default',
28
- };
29
- let pool;
30
- describe('parseArgs', () => {
31
- it('requires an organization and an email', () => {
32
- expect(parseArgs([])).toMatch(/usage/);
33
- expect(parseArgs(['--org', 'acme'])).toMatch(/usage/);
34
- expect(parseArgs(['--email', 'a@b.test'])).toMatch(/usage/);
35
- });
36
- it('defaults the display name and the workspace', () => {
37
- const parsed = parseArgs(['--org', 'acme', '--email', 'a@b.test']);
38
- expect(parsed).toMatchObject({ slug: 'acme', name: 'acme', workspace: 'default' });
39
- });
40
- it('refuses a slug that would not survive being a collection name', () => {
41
- // The slug becomes the Qdrant collection, so this is not a matter of taste.
42
- // A slug with a slash or a quote in it reaches a URL path and a JSON body.
43
- for (const bad of ['Acme', 'a', 'has space', 'has/slash', '-leading', 'trailing-', 'x'.repeat(41)]) {
44
- expect(parseArgs(['--org', bad, '--email', 'a@b.test']), bad).toMatch(/--org must be/);
45
- }
46
- for (const good of ['ac', 'acme', 'acme-corp', 'a1-b2', 'x'.repeat(40)]) {
47
- expect(parseArgs(['--org', good, '--email', 'a@b.test']), good).toMatchObject({ slug: good });
48
- }
49
- });
50
- it('refuses an address that is not one, and an odd argument list', () => {
51
- expect(parseArgs(['--org', 'acme', '--email', 'nobody'])).toMatch(/does not look like/);
52
- expect(parseArgs(['--org'])).toMatch(/usage/);
53
- expect(parseArgs(['acme', 'a@b.test'])).toMatch(/usage/);
54
- });
55
- });
56
- when('initialize', () => {
57
- beforeAll(async () => {
58
- pool = createPool({ connectionString: url });
59
- // Start from nothing, so "created" means created.
60
- const c = await pool.connect();
61
- try {
62
- await c.query(`DELETE FROM organizations WHERE slug = $1`, [options.slug]);
63
- }
64
- finally {
65
- c.release();
66
- }
67
- });
68
- afterAll(async () => {
69
- await pool?.end();
70
- });
71
- it('creates the organization, the admin, a provider and a workspace', async () => {
72
- const result = await initialize(pool, options, PROVIDER, 'org_inittest');
73
- expect(result.created).toBe(true);
74
- expect(result.orgId).toBeTruthy();
75
- expect(result.userId).toBeTruthy();
76
- expect(result.workspaceId).toBeTruthy();
77
- });
78
- it('a second run changes nothing and says so', async () => {
79
- const first = await initialize(pool, options, PROVIDER, 'org_inittest');
80
- const second = await initialize(pool, options, PROVIDER, 'org_inittest');
81
- expect(second.created).toBe(false);
82
- expect(second.orgId).toBe(first.orgId);
83
- expect(second.userId).toBe(first.userId);
84
- expect(second.workspaceId).toBe(first.workspaceId);
85
- const c = await pool.connect();
86
- try {
87
- const { rows } = await c.query(`SELECT count(*)::text AS n FROM organizations WHERE slug = $1`, [options.slug]);
88
- expect(rows[0]?.n).toBe('1');
89
- }
90
- finally {
91
- c.release();
92
- }
93
- });
94
- it('the admin is an org_admin, or nothing that follows can grant anything', async () => {
95
- const { orgId, userId } = await initialize(pool, options, PROVIDER, 'org_inittest');
96
- const c = await pool.connect();
97
- try {
98
- await c.query('SELECT set_config($1, $2, false)', ['app.current_org', orgId]);
99
- const { rows } = await c.query(`SELECT role FROM users WHERE id = $1`, [userId]);
100
- // A member here would leave the installation with no way to issue the
101
- // first grant — every scope check would deny, and the only route back
102
- // would be SQL by hand, which is the thing this command exists to remove.
103
- expect(rows[0]?.role).toBe('org_admin');
104
- }
105
- finally {
106
- c.release();
107
- }
108
- });
109
- it('the workspace it reports is real and belongs to the organization', async () => {
110
- const { orgId, workspaceId } = await initialize(pool, options, PROVIDER, 'org_inittest');
111
- const c = await pool.connect();
112
- try {
113
- await c.query('SELECT set_config($1, $2, false)', ['app.current_org', orgId]);
114
- const { rows } = await c.query(`SELECT org_id FROM workspaces WHERE id = $1`, [workspaceId]);
115
- // It is printed for the operator to paste into the next command. A
116
- // workspace id that does not resolve makes the whole page fail at step
117
- // one, with a 404 that reads as a permission problem.
118
- expect(rows[0]?.org_id).toBe(orgId);
119
- }
120
- finally {
121
- c.release();
122
- }
123
- });
124
- });
125
- //# sourceMappingURL=init.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../src/__tests__/init.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=service-keys.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-keys.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/service-keys.test.ts"],"names":[],"mappings":""}