@atlasauth/msw 0.1.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.
@@ -0,0 +1,600 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.atlasHandlers = atlasHandlers;
4
+ /**
5
+ * MSW (v2) request handlers that stand in for Atlas's Frontend API (FAPI, the
6
+ * publishable-key browser surface) and Backend API (BAPI, the secret-key
7
+ * administrative surface). Each handler reads and mutates a {@link AtlasMock}
8
+ * store, so the mocked endpoints behave like a real instance across calls — a
9
+ * sign-in attempt advances, a minted session authenticates `me`, a created user
10
+ * appears in the next list.
11
+ *
12
+ * ```ts
13
+ * import { setupServer } from 'msw/node';
14
+ * import { atlasHandlers, createAtlasMock } from '@atlasauth/msw';
15
+ *
16
+ * const mock = createAtlasMock({ users: [{ email: 'ada@example.com', password: 'pw' }] });
17
+ * const server = setupServer(...atlasHandlers(mock));
18
+ * ```
19
+ */
20
+ const msw_1 = require("msw");
21
+ const serializers_1 = require("./serializers");
22
+ const ATTEMPT_TTL_MS = 10 * 60 * 1000;
23
+ /**
24
+ * Build the full set of FAPI + BAPI handlers for a mock store. Spread the result
25
+ * into `setupServer(...)` (Node) or `setupWorker(...)` (browser).
26
+ */
27
+ function atlasHandlers(mock, options = {}) {
28
+ const fapi = (options.fapiBaseUrl ?? mock.fapiBaseUrl).replace(/\/+$/, '');
29
+ const bapi = (options.bapiBaseUrl ?? mock.bapiBaseUrl).replace(/\/+$/, '');
30
+ return [...fapiHandlers(mock, fapi), ...bapiHandlers(mock, bapi)];
31
+ }
32
+ // ---------------------------------------------------------------------------
33
+ // Auth guards — the publishable-key (FAPI) and secret-key (BAPI) gates.
34
+ // ---------------------------------------------------------------------------
35
+ /** FAPI is identified by a publishable key (`x-publishable-key` header or `?publishable_key`). */
36
+ function requirePublishableKey(request) {
37
+ const header = request.headers.get('x-publishable-key');
38
+ const fromQuery = new URL(request.url).searchParams.get('publishable_key');
39
+ const key = header ?? fromQuery;
40
+ if (!key) {
41
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A publishable key is required.', 'publishable_key'), { status: 400 });
42
+ }
43
+ return null;
44
+ }
45
+ /** BAPI requires a secret key: `Authorization: Bearer sk_…`, matching the instance's. */
46
+ function requireSecretKey(mock, request) {
47
+ const header = request.headers.get('authorization');
48
+ if (!header?.startsWith('Bearer ')) {
49
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('UNAUTHENTICATED', 'Missing Authorization: Bearer <secret key>.'), { status: 401 });
50
+ }
51
+ const presented = header.slice('Bearer '.length).trim();
52
+ if (!presented.startsWith('sk_') || presented !== mock.instance.secretKey) {
53
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('INVALID_KEY', 'The API key is invalid or has been revoked.'), { status: 401 });
54
+ }
55
+ return null;
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // FAPI — the publishable-key browser surface.
59
+ // ---------------------------------------------------------------------------
60
+ function fapiHandlers(mock, base) {
61
+ const now = () => Date.now();
62
+ const newAttempt = (kind, partial) => {
63
+ const id = mock.ids.next(kind === 'sign_in' ? 'signInAttempt' : 'signUpAttempt');
64
+ const attempt = {
65
+ id,
66
+ kind,
67
+ status: partial.status ?? 'needs_first_factor',
68
+ identifier: partial.identifier ?? null,
69
+ userId: partial.userId ?? null,
70
+ strategy: partial.strategy ?? null,
71
+ pendingCode: partial.pendingCode ?? null,
72
+ pollSecret: partial.pollSecret ?? null,
73
+ ticket: partial.ticket ?? null,
74
+ sessionId: partial.sessionId ?? null,
75
+ createdAt: now(),
76
+ expiresAt: now() + ATTEMPT_TTL_MS,
77
+ };
78
+ mock.attempts.push(attempt);
79
+ return attempt;
80
+ };
81
+ /** Complete an attempt: mint a session + a one-time ticket, mirror onto the attempt. */
82
+ const complete = (attempt) => {
83
+ if (!attempt.userId)
84
+ return;
85
+ const session = mock.createSession(attempt.userId);
86
+ attempt.status = 'complete';
87
+ attempt.sessionId = session.id;
88
+ attempt.ticket = `tkt_${attempt.id}`;
89
+ };
90
+ return [
91
+ // GET /v1/client/environment — enabled first factors + social providers.
92
+ msw_1.http.get(`${base}/v1/client/environment`, ({ request }) => {
93
+ const guard = requirePublishableKey(request);
94
+ if (guard)
95
+ return guard;
96
+ return msw_1.HttpResponse.json({
97
+ object: 'environment',
98
+ first_factors: mock.instance.firstFactors,
99
+ social_providers: mock.instance.socialProviders,
100
+ });
101
+ }),
102
+ // GET /v1/client — the session-boot the SDK calls on every page load.
103
+ msw_1.http.get(`${base}/v1/client`, ({ request }) => {
104
+ const guard = requirePublishableKey(request);
105
+ if (guard)
106
+ return guard;
107
+ const session = mock.activeSessionId ? mock.findSession(mock.activeSessionId) : undefined;
108
+ if (!session || session.status !== 'active') {
109
+ return msw_1.HttpResponse.json({
110
+ object: 'client',
111
+ session: null,
112
+ sessions: [],
113
+ last_active_session_id: null,
114
+ user: null,
115
+ organization_memberships: [],
116
+ });
117
+ }
118
+ const user = mock.findUser(session.userId);
119
+ if (!user) {
120
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown user.'), { status: 404 });
121
+ }
122
+ const memberships = mock.memberships.filter((m) => m.userId === user.id);
123
+ return msw_1.HttpResponse.json({
124
+ object: 'client',
125
+ session: {
126
+ object: 'session',
127
+ id: session.id,
128
+ status: session.status,
129
+ last_active_organization_id: session.activeOrganizationId,
130
+ expire_at: session.expiresAt,
131
+ abandon_at: session.idleExpiresAt,
132
+ },
133
+ sessions: [
134
+ {
135
+ object: 'session',
136
+ id: session.id,
137
+ status: session.status,
138
+ last_active_organization_id: session.activeOrganizationId,
139
+ expire_at: session.expiresAt,
140
+ abandon_at: session.idleExpiresAt,
141
+ user: (0, serializers_1.presentMeUser)(mock, user),
142
+ },
143
+ ],
144
+ last_active_session_id: session.id,
145
+ jwt: session.jwt,
146
+ expires_in: Math.round((session.expiresAt - now()) / 1000),
147
+ user: (0, serializers_1.presentMeUser)(mock, user),
148
+ organization_memberships: memberships.map((m) => (0, serializers_1.presentMembership)(mock, m.organizationId, m.role)),
149
+ });
150
+ }),
151
+ // POST /v1/client/sign_ins — start an attempt from an identifier.
152
+ msw_1.http.post(`${base}/v1/client/sign_ins`, async ({ request }) => {
153
+ const guard = requirePublishableKey(request);
154
+ if (guard)
155
+ return guard;
156
+ const body = (await readJson(request));
157
+ const identifier = body.identifier?.trim().toLowerCase();
158
+ if (!identifier) {
159
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'An identifier is required.', 'identifier'), { status: 400 });
160
+ }
161
+ // An unknown identifier still produces a real attempt (no userId) that fails
162
+ // at the first factor — the response does not branch on account existence.
163
+ const user = mock.findUserByEmail(identifier);
164
+ const attempt = newAttempt('sign_in', {
165
+ status: 'needs_first_factor',
166
+ identifier,
167
+ userId: user?.id ?? null,
168
+ });
169
+ return msw_1.HttpResponse.json((0, serializers_1.presentSignInAttempt)(mock, attempt), { status: 201 });
170
+ }),
171
+ // POST /v1/client/sign_ins/:id/prepare_first_factor — send a code / magic link.
172
+ msw_1.http.post(`${base}/v1/client/sign_ins/:id/prepare_first_factor`, async ({ request, params }) => {
173
+ const guard = requirePublishableKey(request);
174
+ if (guard)
175
+ return guard;
176
+ const attempt = mock.findAttempt(String(params.id));
177
+ if (!attempt || attempt.kind !== 'sign_in') {
178
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown sign-in attempt.'), { status: 404 });
179
+ }
180
+ const body = (await readJson(request));
181
+ const strategy = body.strategy;
182
+ if (strategy !== 'email_code' && strategy !== 'email_link' && strategy !== 'phone_code') {
183
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'Supported strategies are email_code, email_link and phone_code.', 'strategy'), { status: 400 });
184
+ }
185
+ attempt.strategy = strategy;
186
+ attempt.pendingCode = mock.instance.testOtp;
187
+ attempt.pollSecret = `pol_${attempt.id}`;
188
+ return msw_1.HttpResponse.json({
189
+ object: 'sign_in_attempt',
190
+ id: attempt.id,
191
+ status: attempt.status,
192
+ strategy,
193
+ poll_secret: attempt.pollSecret,
194
+ });
195
+ }),
196
+ // POST /v1/client/sign_ins/:id/attempt_first_factor — present the factor.
197
+ msw_1.http.post(`${base}/v1/client/sign_ins/:id/attempt_first_factor`, async ({ request, params }) => {
198
+ const guard = requirePublishableKey(request);
199
+ if (guard)
200
+ return guard;
201
+ const attempt = mock.findAttempt(String(params.id));
202
+ if (!attempt || attempt.kind !== 'sign_in') {
203
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown sign-in attempt.'), { status: 404 });
204
+ }
205
+ const body = (await readJson(request));
206
+ const strategy = body.strategy;
207
+ const user = attempt.userId ? mock.findUser(attempt.userId) : undefined;
208
+ if (strategy === 'email_code' || strategy === 'phone_code') {
209
+ if (!body.code) {
210
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A code is required.', 'code'), {
211
+ status: 400,
212
+ });
213
+ }
214
+ if (!user || body.code !== (attempt.pendingCode ?? mock.instance.testOtp)) {
215
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VERIFICATION_FAILED', 'That code is incorrect or has expired.', 'code'), { status: 400 });
216
+ }
217
+ complete(attempt);
218
+ return msw_1.HttpResponse.json({ ...(0, serializers_1.presentSignInAttempt)(mock, attempt), ticket: attempt.ticket });
219
+ }
220
+ if (strategy !== 'password') {
221
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'Unsupported first-factor strategy.', 'strategy'), { status: 400 });
222
+ }
223
+ if (!body.password) {
224
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A password is required.', 'password'), { status: 400 });
225
+ }
226
+ // A wrong password — or an unknown identifier — fails identically (§13.2).
227
+ if (!user || user.password == null || user.password !== body.password) {
228
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VERIFICATION_FAILED', 'The credentials are incorrect.', 'password'), { status: 400 });
229
+ }
230
+ complete(attempt);
231
+ return msw_1.HttpResponse.json({ ...(0, serializers_1.presentSignInAttempt)(mock, attempt), ticket: attempt.ticket });
232
+ }),
233
+ // GET /v1/client/sign_ins/:id — poll an attempt (needs the poll secret).
234
+ msw_1.http.get(`${base}/v1/client/sign_ins/:id`, ({ request, params }) => {
235
+ const guard = requirePublishableKey(request);
236
+ if (guard)
237
+ return guard;
238
+ const secret = new URL(request.url).searchParams.get('poll_secret');
239
+ if (!secret) {
240
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A poll_secret is required.', 'poll_secret'), { status: 400 });
241
+ }
242
+ const attempt = mock.findAttempt(String(params.id));
243
+ // A wrong secret is answered exactly like an unknown attempt.
244
+ if (!attempt || attempt.kind !== 'sign_in' || attempt.pollSecret !== secret) {
245
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown sign-in attempt.'), { status: 404 });
246
+ }
247
+ if (attempt.status !== 'complete') {
248
+ return msw_1.HttpResponse.json((0, serializers_1.presentSignInAttempt)(mock, attempt));
249
+ }
250
+ return msw_1.HttpResponse.json({ ...(0, serializers_1.presentSignInAttempt)(mock, attempt), ticket: attempt.ticket });
251
+ }),
252
+ // POST /v1/client/sign_ups — start a sign-up.
253
+ msw_1.http.post(`${base}/v1/client/sign_ups`, async ({ request }) => {
254
+ const guard = requirePublishableKey(request);
255
+ if (guard)
256
+ return guard;
257
+ const body = (await readJson(request));
258
+ if (!body.email) {
259
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'An email address is required.', 'email'), { status: 400 });
260
+ }
261
+ if (!body.password) {
262
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A password is required.', 'password'), { status: 400 });
263
+ }
264
+ const email = body.email.trim().toLowerCase();
265
+ if (mock.findUserByEmail(email)) {
266
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('IDENTIFIER_EXISTS', 'That address is already in use.', 'email'), { status: 409 });
267
+ }
268
+ // Create the (unverified) user now; completion is gated on verification.
269
+ const user = mock.addUser({ email, emailVerified: false, password: body.password });
270
+ const attempt = newAttempt('sign_up', {
271
+ status: 'needs_email_verification',
272
+ identifier: email,
273
+ userId: user.id,
274
+ strategy: 'email_code',
275
+ pendingCode: mock.instance.testOtp,
276
+ });
277
+ return msw_1.HttpResponse.json((0, serializers_1.presentSignUpAttempt)(attempt), { status: 201 });
278
+ }),
279
+ // POST /v1/client/sign_ups/:id/prepare_verification — (re)send the code.
280
+ msw_1.http.post(`${base}/v1/client/sign_ups/:id/prepare_verification`, async ({ request, params }) => {
281
+ const guard = requirePublishableKey(request);
282
+ if (guard)
283
+ return guard;
284
+ const attempt = mock.findAttempt(String(params.id));
285
+ if (!attempt || attempt.kind !== 'sign_up') {
286
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown sign-up attempt.'), { status: 404 });
287
+ }
288
+ attempt.pendingCode = mock.instance.testOtp;
289
+ return msw_1.HttpResponse.json((0, serializers_1.presentSignUpAttempt)(attempt));
290
+ }),
291
+ // POST /v1/client/sign_ups/:id/attempt_verification — present the code.
292
+ msw_1.http.post(`${base}/v1/client/sign_ups/:id/attempt_verification`, async ({ request, params }) => {
293
+ const guard = requirePublishableKey(request);
294
+ if (guard)
295
+ return guard;
296
+ const attempt = mock.findAttempt(String(params.id));
297
+ if (!attempt || attempt.kind !== 'sign_up') {
298
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown sign-up attempt.'), { status: 404 });
299
+ }
300
+ const body = (await readJson(request));
301
+ if (!body.code) {
302
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A verification code is required.', 'code'), { status: 400 });
303
+ }
304
+ if (body.code !== (attempt.pendingCode ?? mock.instance.testOtp)) {
305
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VERIFICATION_FAILED', 'That code is incorrect or has expired.', 'code'), { status: 400 });
306
+ }
307
+ // Verify the address, then complete + mint a session (same as sign-in).
308
+ const user = attempt.userId ? mock.findUser(attempt.userId) : undefined;
309
+ if (user) {
310
+ const primary = user.emails[0];
311
+ if (primary) {
312
+ primary.verified = true;
313
+ user.primaryEmailId = primary.id;
314
+ }
315
+ }
316
+ complete(attempt);
317
+ return msw_1.HttpResponse.json({ ...(0, serializers_1.presentSignUpAttempt)(attempt), ticket: attempt.ticket });
318
+ }),
319
+ // POST /v1/client/tickets/exchange — swap a completed attempt's ticket for a session.
320
+ msw_1.http.post(`${base}/v1/client/tickets/exchange`, async ({ request }) => {
321
+ const guard = requirePublishableKey(request);
322
+ if (guard)
323
+ return guard;
324
+ const body = (await readJson(request));
325
+ if (!body.attempt_id) {
326
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'An attempt_id is required.', 'attempt_id'), { status: 400 });
327
+ }
328
+ if (!body.ticket) {
329
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A ticket is required.', 'ticket'), {
330
+ status: 400,
331
+ });
332
+ }
333
+ const attempt = mock.findAttempt(body.attempt_id);
334
+ if (!attempt ||
335
+ attempt.status !== 'complete' ||
336
+ !attempt.userId ||
337
+ attempt.ticket !== body.ticket) {
338
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'That sign-in attempt is not complete.', 'attempt_id'), { status: 400 });
339
+ }
340
+ // One-time: burn the ticket so a replay fails.
341
+ attempt.ticket = null;
342
+ const session = attempt.sessionId ? mock.findSession(attempt.sessionId) : undefined;
343
+ if (!session) {
344
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown session.'), { status: 404 });
345
+ }
346
+ mock.activeSessionId = session.id;
347
+ return msw_1.HttpResponse.json({
348
+ object: 'session',
349
+ id: session.id,
350
+ jwt: session.jwt,
351
+ expires_in: Math.round((session.expiresAt - now()) / 1000),
352
+ });
353
+ }),
354
+ // GET /v1/client/me — the signed-in user (Bearer session jwt).
355
+ msw_1.http.get(`${base}/v1/client/me`, ({ request }) => {
356
+ const header = request.headers.get('authorization');
357
+ const jwt = header?.startsWith('Bearer ') ? header.slice('Bearer '.length).trim() : undefined;
358
+ const session = jwt
359
+ ? mock.sessionForJwt(jwt)
360
+ : mock.activeSessionId
361
+ ? mock.findSession(mock.activeSessionId)
362
+ : undefined;
363
+ if (!session || session.status !== 'active') {
364
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('UNAUTHENTICATED', 'Authentication required.'), {
365
+ status: 401,
366
+ });
367
+ }
368
+ const user = mock.findUser(session.userId);
369
+ if (!user) {
370
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown user.'), { status: 404 });
371
+ }
372
+ return msw_1.HttpResponse.json((0, serializers_1.presentMeUser)(mock, user));
373
+ }),
374
+ // GET /.well-known/jwks.json — the token-verification key set.
375
+ msw_1.http.get(`${base}/.well-known/jwks.json`, () => msw_1.HttpResponse.json(mock.instance.jwks, {
376
+ headers: { 'cache-control': 'public, max-age=3600, stale-if-error=86400' },
377
+ })),
378
+ ];
379
+ }
380
+ // ---------------------------------------------------------------------------
381
+ // BAPI — the secret-key administrative surface.
382
+ // ---------------------------------------------------------------------------
383
+ function bapiHandlers(mock, base) {
384
+ /** Cursor pagination over an id-sorted (desc) list — the §9.1 envelope. */
385
+ const paginate = (rows, url) => {
386
+ const limit = Math.min(Number(url.searchParams.get('limit') ?? 20) || 20, 100);
387
+ const startingAfter = url.searchParams.get('starting_after');
388
+ const sorted = [...rows].sort((a, b) => (a.id < b.id ? 1 : a.id > b.id ? -1 : 0));
389
+ const filtered = startingAfter ? sorted.filter((r) => r.id < startingAfter) : sorted;
390
+ const hasMore = filtered.length > limit;
391
+ const page = hasMore ? filtered.slice(0, limit) : filtered;
392
+ const nextCursor = hasMore && page.length > 0 ? page[page.length - 1].id : null;
393
+ return { page, hasMore, nextCursor };
394
+ };
395
+ return [
396
+ // GET /v1/users — cursor-paginated list.
397
+ msw_1.http.get(`${base}/v1/users`, ({ request }) => {
398
+ const guard = requireSecretKey(mock, request);
399
+ if (guard)
400
+ return guard;
401
+ const live = mock.users.filter((u) => !u.deletedAt);
402
+ const { page, hasMore, nextCursor } = paginate(live, new URL(request.url));
403
+ return msw_1.HttpResponse.json((0, serializers_1.listEnvelope)(page.map(serializers_1.presentUser), hasMore, nextCursor));
404
+ }),
405
+ // POST /v1/users — create a user.
406
+ msw_1.http.post(`${base}/v1/users`, async ({ request }) => {
407
+ const guard = requireSecretKey(mock, request);
408
+ if (guard)
409
+ return guard;
410
+ const body = (await readJson(request));
411
+ const rawEmail = Array.isArray(body.email_address)
412
+ ? body.email_address[0]
413
+ : body.email_address;
414
+ const email = rawEmail?.trim().toLowerCase();
415
+ if (!email?.includes('@')) {
416
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A valid email_address is required.', 'email_address'), { status: 400 });
417
+ }
418
+ const emailVerified = body.email_verified === true;
419
+ if (emailVerified && mock.findUserByEmail(email)) {
420
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('IDENTIFIER_EXISTS', 'That address is already in use.'), { status: 409 });
421
+ }
422
+ const user = mock.addUser({
423
+ email,
424
+ emailVerified,
425
+ password: typeof body.password === 'string' ? body.password : undefined,
426
+ firstName: typeof body.first_name === 'string' ? body.first_name : undefined,
427
+ lastName: typeof body.last_name === 'string' ? body.last_name : undefined,
428
+ externalId: typeof body.external_id === 'string' ? body.external_id : undefined,
429
+ publicMetadata: isRecord(body.public_metadata) ? body.public_metadata : undefined,
430
+ privateMetadata: isRecord(body.private_metadata) ? body.private_metadata : undefined,
431
+ unsafeMetadata: isRecord(body.unsafe_metadata) ? body.unsafe_metadata : undefined,
432
+ });
433
+ return msw_1.HttpResponse.json((0, serializers_1.presentUser)(user), { status: 201 });
434
+ }),
435
+ // GET /v1/users/:id — one user (404 for unknown / soft-deleted).
436
+ msw_1.http.get(`${base}/v1/users/:id`, ({ request, params }) => {
437
+ const guard = requireSecretKey(mock, request);
438
+ if (guard)
439
+ return guard;
440
+ const includeDeleted = new URL(request.url).searchParams.get('include_deleted') === 'true';
441
+ const user = mock.findUser(String(params.id), includeDeleted);
442
+ if (!user) {
443
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown user.'), { status: 404 });
444
+ }
445
+ return msw_1.HttpResponse.json((0, serializers_1.presentUser)(user));
446
+ }),
447
+ // PATCH /v1/users/:id — update profile / metadata.
448
+ msw_1.http.patch(`${base}/v1/users/:id`, async ({ request, params }) => {
449
+ const guard = requireSecretKey(mock, request);
450
+ if (guard)
451
+ return guard;
452
+ const user = mock.findUser(String(params.id));
453
+ if (!user) {
454
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown user.'), { status: 404 });
455
+ }
456
+ const body = (await readJson(request));
457
+ if ('first_name' in body)
458
+ user.firstName = body.first_name ?? null;
459
+ if ('last_name' in body)
460
+ user.lastName = body.last_name ?? null;
461
+ if (isRecord(body.public_metadata))
462
+ user.publicMetadata = body.public_metadata;
463
+ if (isRecord(body.private_metadata))
464
+ user.privateMetadata = body.private_metadata;
465
+ if ('external_id' in body) {
466
+ const v = body.external_id;
467
+ user.externalId = typeof v === 'string' && v.trim() ? v.trim() : null;
468
+ }
469
+ if (typeof body.password === 'string' && body.password.length > 0)
470
+ user.password = body.password;
471
+ user.updatedAt = Date.now();
472
+ return msw_1.HttpResponse.json((0, serializers_1.presentUser)(user));
473
+ }),
474
+ // DELETE /v1/users/:id — soft delete.
475
+ msw_1.http.delete(`${base}/v1/users/:id`, ({ request, params }) => {
476
+ const guard = requireSecretKey(mock, request);
477
+ if (guard)
478
+ return guard;
479
+ const user = mock.findUser(String(params.id));
480
+ if (!user) {
481
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown user.'), { status: 404 });
482
+ }
483
+ user.deletedAt = Date.now();
484
+ return msw_1.HttpResponse.json({ object: 'user', id: user.id, deleted: true });
485
+ }),
486
+ // GET /v1/organizations — cursor-paginated list.
487
+ msw_1.http.get(`${base}/v1/organizations`, ({ request }) => {
488
+ const guard = requireSecretKey(mock, request);
489
+ if (guard)
490
+ return guard;
491
+ const { page, hasMore, nextCursor } = paginate(mock.organizations, new URL(request.url));
492
+ return msw_1.HttpResponse.json((0, serializers_1.listEnvelope)(page.map(serializers_1.presentOrganization), hasMore, nextCursor));
493
+ }),
494
+ // POST /v1/organizations — create.
495
+ msw_1.http.post(`${base}/v1/organizations`, async ({ request }) => {
496
+ const guard = requireSecretKey(mock, request);
497
+ if (guard)
498
+ return guard;
499
+ const body = (await readJson(request));
500
+ if (typeof body.name !== 'string' || !body.name.trim()) {
501
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A name is required.', 'name'), {
502
+ status: 400,
503
+ });
504
+ }
505
+ const org = mock.addOrganization({
506
+ name: body.name.trim(),
507
+ slug: typeof body.slug === 'string' ? body.slug : undefined,
508
+ createdBy: typeof body.created_by === 'string' ? body.created_by : undefined,
509
+ maxAllowedMemberships: typeof body.max_allowed_memberships === 'number'
510
+ ? body.max_allowed_memberships
511
+ : undefined,
512
+ publicMetadata: isRecord(body.public_metadata) ? body.public_metadata : undefined,
513
+ });
514
+ return msw_1.HttpResponse.json((0, serializers_1.presentOrganization)(org), { status: 201 });
515
+ }),
516
+ // GET /v1/organizations/:id — one organization.
517
+ msw_1.http.get(`${base}/v1/organizations/:id`, ({ request, params }) => {
518
+ const guard = requireSecretKey(mock, request);
519
+ if (guard)
520
+ return guard;
521
+ const org = mock.findOrganization(String(params.id));
522
+ if (!org) {
523
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown organization.'), { status: 404 });
524
+ }
525
+ return msw_1.HttpResponse.json((0, serializers_1.presentOrganization)(org));
526
+ }),
527
+ // POST /v1/sessions — mint a session for a user (headless, in one call).
528
+ msw_1.http.post(`${base}/v1/sessions`, async ({ request }) => {
529
+ const guard = requireSecretKey(mock, request);
530
+ if (guard)
531
+ return guard;
532
+ const body = (await readJson(request));
533
+ if (!body.user_id) {
534
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A user_id is required.', 'user_id'), {
535
+ status: 400,
536
+ });
537
+ }
538
+ const user = mock.findUser(body.user_id);
539
+ if (!user) {
540
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'Unknown user.', 'user_id'), {
541
+ status: 400,
542
+ });
543
+ }
544
+ if (user.banned) {
545
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'That user is banned.', 'user_id'), {
546
+ status: 400,
547
+ });
548
+ }
549
+ const actor = typeof body.actor?.sub === 'string' && body.actor.sub.trim() ? body.actor.sub.trim() : undefined;
550
+ const session = mock.createSession(user.id, { impersonatedBy: actor });
551
+ return msw_1.HttpResponse.json({
552
+ object: 'session',
553
+ id: session.id,
554
+ user_id: user.id,
555
+ jwt: session.jwt,
556
+ refresh_token: session.refreshToken,
557
+ expires_in: Math.round((session.expiresAt - Date.now()) / 1000),
558
+ ...(actor ? { impersonated_by: actor } : {}),
559
+ }, { status: 201 });
560
+ }),
561
+ // GET /v1/sessions/:id — one session (operator view).
562
+ msw_1.http.get(`${base}/v1/sessions/:id`, ({ request, params }) => {
563
+ const guard = requireSecretKey(mock, request);
564
+ if (guard)
565
+ return guard;
566
+ const session = mock.findSession(String(params.id));
567
+ if (!session) {
568
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown session.'), { status: 404 });
569
+ }
570
+ return msw_1.HttpResponse.json((0, serializers_1.presentSession)(session));
571
+ }),
572
+ // POST /v1/sessions/:id/revoke — revoke a session.
573
+ msw_1.http.post(`${base}/v1/sessions/:id/revoke`, ({ request, params }) => {
574
+ const guard = requireSecretKey(mock, request);
575
+ if (guard)
576
+ return guard;
577
+ const session = mock.findSession(String(params.id));
578
+ if (!session) {
579
+ return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown session.'), { status: 404 });
580
+ }
581
+ session.status = 'revoked';
582
+ if (mock.activeSessionId === session.id)
583
+ mock.activeSessionId = null;
584
+ return msw_1.HttpResponse.json({ object: 'session', id: session.id, status: 'revoked' });
585
+ }),
586
+ ];
587
+ }
588
+ // ---------------------------------------------------------------------------
589
+ async function readJson(request) {
590
+ try {
591
+ return (await request.clone().json());
592
+ }
593
+ catch {
594
+ return {};
595
+ }
596
+ }
597
+ function isRecord(value) {
598
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
599
+ }
600
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}