workos 0.12.0-beta.1 → 0.12.1

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 (96) hide show
  1. package/README.md +6 -4
  2. package/dist/bin.js +4 -2
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/debug.js +0 -1
  5. package/dist/commands/debug.js.map +1 -1
  6. package/dist/commands/login.js +0 -4
  7. package/dist/commands/login.js.map +1 -1
  8. package/dist/emulate/core/id.d.ts +16 -1
  9. package/dist/emulate/core/id.js +16 -1
  10. package/dist/emulate/core/id.js.map +1 -1
  11. package/dist/emulate/core/index.d.ts +1 -1
  12. package/dist/emulate/core/index.js +1 -1
  13. package/dist/emulate/core/index.js.map +1 -1
  14. package/dist/emulate/core/middleware/auth.d.ts +1 -4
  15. package/dist/emulate/core/middleware/auth.js +7 -18
  16. package/dist/emulate/core/middleware/auth.js.map +1 -1
  17. package/dist/emulate/core/pagination.d.ts +6 -0
  18. package/dist/emulate/core/pagination.js +9 -1
  19. package/dist/emulate/core/pagination.js.map +1 -1
  20. package/dist/emulate/core/server.js +20 -46
  21. package/dist/emulate/core/server.js.map +1 -1
  22. package/dist/emulate/core/store.d.ts +2 -0
  23. package/dist/emulate/core/store.js +22 -1
  24. package/dist/emulate/core/store.js.map +1 -1
  25. package/dist/emulate/workos/constants.d.ts +56 -0
  26. package/dist/emulate/workos/constants.js +56 -0
  27. package/dist/emulate/workos/constants.js.map +1 -0
  28. package/dist/emulate/workos/entities.js.map +1 -1
  29. package/dist/emulate/workos/event-bus.d.ts +6 -1
  30. package/dist/emulate/workos/event-bus.js +33 -8
  31. package/dist/emulate/workos/event-bus.js.map +1 -1
  32. package/dist/emulate/workos/helpers.d.ts +17 -8
  33. package/dist/emulate/workos/helpers.js +61 -368
  34. package/dist/emulate/workos/helpers.js.map +1 -1
  35. package/dist/emulate/workos/index.js +42 -39
  36. package/dist/emulate/workos/index.js.map +1 -1
  37. package/dist/emulate/workos/role-helpers.d.ts +21 -0
  38. package/dist/emulate/workos/role-helpers.js +130 -0
  39. package/dist/emulate/workos/role-helpers.js.map +1 -0
  40. package/dist/emulate/workos/routes/api-keys.js +5 -8
  41. package/dist/emulate/workos/routes/api-keys.js.map +1 -1
  42. package/dist/emulate/workos/routes/audit-logs.js +6 -9
  43. package/dist/emulate/workos/routes/audit-logs.js.map +1 -1
  44. package/dist/emulate/workos/routes/auth.js +7 -6
  45. package/dist/emulate/workos/routes/auth.js.map +1 -1
  46. package/dist/emulate/workos/routes/authorization-checks.js +5 -17
  47. package/dist/emulate/workos/routes/authorization-checks.js.map +1 -1
  48. package/dist/emulate/workos/routes/authorization-org-roles.js +29 -171
  49. package/dist/emulate/workos/routes/authorization-org-roles.js.map +1 -1
  50. package/dist/emulate/workos/routes/authorization-permissions.js +5 -16
  51. package/dist/emulate/workos/routes/authorization-permissions.js.map +1 -1
  52. package/dist/emulate/workos/routes/authorization-resources.js +4 -15
  53. package/dist/emulate/workos/routes/authorization-resources.js.map +1 -1
  54. package/dist/emulate/workos/routes/authorization-roles.d.ts +1 -1
  55. package/dist/emulate/workos/routes/authorization-roles.js +9 -132
  56. package/dist/emulate/workos/routes/authorization-roles.js.map +1 -1
  57. package/dist/emulate/workos/routes/config.js +3 -2
  58. package/dist/emulate/workos/routes/config.js.map +1 -1
  59. package/dist/emulate/workos/routes/connect.js +3 -7
  60. package/dist/emulate/workos/routes/connect.js.map +1 -1
  61. package/dist/emulate/workos/routes/connections.js +3 -7
  62. package/dist/emulate/workos/routes/connections.js.map +1 -1
  63. package/dist/emulate/workos/routes/directories.js +7 -23
  64. package/dist/emulate/workos/routes/directories.js.map +1 -1
  65. package/dist/emulate/workos/routes/events.js +3 -6
  66. package/dist/emulate/workos/routes/events.js.map +1 -1
  67. package/dist/emulate/workos/routes/feature-flags.js +20 -48
  68. package/dist/emulate/workos/routes/feature-flags.js.map +1 -1
  69. package/dist/emulate/workos/routes/invitations.js +10 -13
  70. package/dist/emulate/workos/routes/invitations.js.map +1 -1
  71. package/dist/emulate/workos/routes/memberships.js +3 -7
  72. package/dist/emulate/workos/routes/memberships.js.map +1 -1
  73. package/dist/emulate/workos/routes/organizations.js +13 -15
  74. package/dist/emulate/workos/routes/organizations.js.map +1 -1
  75. package/dist/emulate/workos/routes/pipes.js +3 -7
  76. package/dist/emulate/workos/routes/pipes.js.map +1 -1
  77. package/dist/emulate/workos/routes/radar.js +3 -7
  78. package/dist/emulate/workos/routes/radar.js.map +1 -1
  79. package/dist/emulate/workos/routes/sso.js +7 -6
  80. package/dist/emulate/workos/routes/sso.js.map +1 -1
  81. package/dist/emulate/workos/routes/users.js +3 -7
  82. package/dist/emulate/workos/routes/users.js.map +1 -1
  83. package/dist/emulate/workos/routes/webhook-endpoints.js +3 -7
  84. package/dist/emulate/workos/routes/webhook-endpoints.js.map +1 -1
  85. package/dist/emulate/workos/store.js +68 -59
  86. package/dist/emulate/workos/store.js.map +1 -1
  87. package/dist/lib/run-with-core.js +5 -4
  88. package/dist/lib/run-with-core.js.map +1 -1
  89. package/dist/lib/settings.js +1 -1
  90. package/dist/lib/settings.js.map +1 -1
  91. package/dist/utils/help-json.js +1 -23
  92. package/dist/utils/help-json.js.map +1 -1
  93. package/dist/utils/register-subcommand.d.ts +5 -2
  94. package/dist/utils/register-subcommand.js +16 -19
  95. package/dist/utils/register-subcommand.js.map +1 -1
  96. package/package.json +2 -2
@@ -1,7 +1,24 @@
1
1
  import { randomBytes, createHash, createCipheriv } from 'node:crypto';
2
2
  import { WorkOSApiError } from '../core/index.js';
3
- export function formatOrganization(org, ws) {
4
- const domains = ws.organizationDomains.findBy('organization_id', org.id).map(formatDomain);
3
+ const INTERNAL_FIELDS = new Set(['password_hash', 'code_challenge', 'code_challenge_method']);
4
+ export function formatEntity(entity, opts) {
5
+ const exclude = opts?.exclude ?? INTERNAL_FIELDS;
6
+ const result = {};
7
+ for (const [key, value] of Object.entries(entity)) {
8
+ if (!exclude.has(key))
9
+ result[key] = value;
10
+ }
11
+ return result;
12
+ }
13
+ export function formatListResponse(result, formatter) {
14
+ return {
15
+ object: 'list',
16
+ data: result.data.map(formatter),
17
+ list_metadata: result.list_metadata,
18
+ };
19
+ }
20
+ export function formatOrganization(org, ws, opts) {
21
+ const domains = (opts?.domains ?? ws.organizationDomains.findBy('organization_id', org.id)).map(formatDomain);
5
22
  return {
6
23
  object: 'organization',
7
24
  id: org.id,
@@ -15,120 +32,32 @@ export function formatOrganization(org, ws) {
15
32
  };
16
33
  }
17
34
  export function formatDomain(domain) {
18
- return {
19
- object: 'organization_domain',
20
- id: domain.id,
21
- organization_id: domain.organization_id,
22
- domain: domain.domain,
23
- state: domain.state,
24
- verification_strategy: domain.verification_strategy,
25
- verification_token: domain.verification_token,
26
- verification_prefix: domain.verification_prefix,
27
- created_at: domain.created_at,
28
- updated_at: domain.updated_at,
29
- };
35
+ return formatEntity(domain);
30
36
  }
31
37
  export function formatMembership(m) {
32
- return {
33
- object: 'organization_membership',
34
- id: m.id,
35
- organization_id: m.organization_id,
36
- user_id: m.user_id,
37
- role: m.role,
38
- status: m.status,
39
- external_id: m.external_id,
40
- metadata: m.metadata,
41
- created_at: m.created_at,
42
- updated_at: m.updated_at,
43
- };
38
+ return formatEntity(m);
44
39
  }
40
+ const USER_EXCLUDE = new Set([...INTERNAL_FIELDS, 'impersonator']);
45
41
  export function formatUser(user) {
46
- return {
47
- object: 'user',
48
- id: user.id,
49
- email: user.email,
50
- first_name: user.first_name,
51
- last_name: user.last_name,
52
- email_verified: user.email_verified,
53
- profile_picture_url: user.profile_picture_url,
54
- last_sign_in_at: user.last_sign_in_at,
55
- external_id: user.external_id,
56
- metadata: user.metadata,
57
- locale: user.locale,
58
- created_at: user.created_at,
59
- updated_at: user.updated_at,
60
- };
42
+ return formatEntity(user, { exclude: USER_EXCLUDE });
61
43
  }
62
44
  export function formatSession(s) {
63
- return {
64
- object: 'session',
65
- id: s.id,
66
- user_id: s.user_id,
67
- organization_id: s.organization_id,
68
- ip_address: s.ip_address,
69
- user_agent: s.user_agent,
70
- created_at: s.created_at,
71
- updated_at: s.updated_at,
72
- };
45
+ return formatEntity(s);
73
46
  }
74
47
  export function formatEmailVerification(ev) {
75
- return {
76
- object: 'email_verification',
77
- id: ev.id,
78
- user_id: ev.user_id,
79
- email: ev.email,
80
- code: ev.code,
81
- expires_at: ev.expires_at,
82
- created_at: ev.created_at,
83
- updated_at: ev.updated_at,
84
- };
48
+ return formatEntity(ev);
85
49
  }
86
50
  export function formatPasswordReset(pr) {
87
- return {
88
- object: 'password_reset',
89
- id: pr.id,
90
- user_id: pr.user_id,
91
- email: pr.email,
92
- token: pr.token,
93
- expires_at: pr.expires_at,
94
- created_at: pr.created_at,
95
- updated_at: pr.updated_at,
96
- };
51
+ return formatEntity(pr);
97
52
  }
98
53
  export function formatMagicAuth(ma) {
99
- return {
100
- object: 'magic_auth',
101
- id: ma.id,
102
- user_id: ma.user_id,
103
- email: ma.email,
104
- code: ma.code,
105
- expires_at: ma.expires_at,
106
- created_at: ma.created_at,
107
- updated_at: ma.updated_at,
108
- };
54
+ return formatEntity(ma);
109
55
  }
110
56
  export function formatAuthFactor(f) {
111
- return {
112
- object: 'authentication_factor',
113
- id: f.id,
114
- user_id: f.user_id,
115
- type: f.type,
116
- totp: f.totp,
117
- created_at: f.created_at,
118
- updated_at: f.updated_at,
119
- };
57
+ return formatEntity(f);
120
58
  }
121
59
  export function formatIdentity(i) {
122
- return {
123
- object: 'identity',
124
- id: i.id,
125
- user_id: i.user_id,
126
- provider: i.provider,
127
- provider_id: i.provider_id,
128
- type: i.type,
129
- created_at: i.created_at,
130
- updated_at: i.updated_at,
131
- };
60
+ return formatEntity(i);
132
61
  }
133
62
  export function generateVerificationToken() {
134
63
  return randomBytes(16).toString('hex');
@@ -149,110 +78,28 @@ export function isExpired(expiresAt) {
149
78
  return new Date(expiresAt).getTime() < Date.now();
150
79
  }
151
80
  export function formatConnection(conn) {
152
- return {
153
- object: 'connection',
154
- id: conn.id,
155
- organization_id: conn.organization_id,
156
- connection_type: conn.connection_type,
157
- name: conn.name,
158
- state: conn.state,
159
- domains: conn.domains,
160
- created_at: conn.created_at,
161
- updated_at: conn.updated_at,
162
- };
81
+ return formatEntity(conn);
163
82
  }
164
83
  export function formatSSOProfile(p) {
165
- return {
166
- object: 'profile',
167
- id: p.id,
168
- connection_id: p.connection_id,
169
- connection_type: p.connection_type,
170
- organization_id: p.organization_id,
171
- idp_id: p.idp_id,
172
- email: p.email,
173
- first_name: p.first_name,
174
- last_name: p.last_name,
175
- groups: p.groups,
176
- raw_attributes: p.raw_attributes,
177
- created_at: p.created_at,
178
- updated_at: p.updated_at,
179
- };
84
+ return formatEntity(p);
180
85
  }
181
86
  export function formatPipeConnection(pc) {
182
- return {
183
- object: 'pipe_connection',
184
- id: pc.id,
185
- user_id: pc.user_id,
186
- provider: pc.provider,
187
- scopes: pc.scopes,
188
- status: pc.status,
189
- external_account_id: pc.external_account_id,
190
- created_at: pc.created_at,
191
- updated_at: pc.updated_at,
192
- };
87
+ return formatEntity(pc);
193
88
  }
194
89
  export function formatInvitation(inv) {
195
- return {
196
- object: 'invitation',
197
- id: inv.id,
198
- email: inv.email,
199
- state: inv.state,
200
- token: inv.token,
201
- accept_invitation_url: inv.accept_invitation_url,
202
- organization_id: inv.organization_id,
203
- inviter_user_id: inv.inviter_user_id,
204
- role_slug: inv.role_slug,
205
- expires_at: inv.expires_at,
206
- created_at: inv.created_at,
207
- updated_at: inv.updated_at,
208
- };
90
+ return formatEntity(inv);
209
91
  }
210
92
  export function formatRedirectUri(r) {
211
- return {
212
- object: 'redirect_uri',
213
- id: r.id,
214
- uri: r.uri,
215
- created_at: r.created_at,
216
- updated_at: r.updated_at,
217
- };
93
+ return formatEntity(r);
218
94
  }
219
95
  export function formatCorsOrigin(o) {
220
- return {
221
- object: 'cors_origin',
222
- id: o.id,
223
- origin: o.origin,
224
- created_at: o.created_at,
225
- updated_at: o.updated_at,
226
- };
96
+ return formatEntity(o);
227
97
  }
228
98
  export function formatAuthorizedApplication(a) {
229
- return {
230
- object: 'authorized_application',
231
- id: a.id,
232
- user_id: a.user_id,
233
- name: a.name,
234
- redirect_uri: a.redirect_uri,
235
- created_at: a.created_at,
236
- updated_at: a.updated_at,
237
- };
99
+ return formatEntity(a);
238
100
  }
239
101
  export function formatConnectedAccount(a) {
240
- return {
241
- object: 'connected_account',
242
- id: a.id,
243
- user_id: a.user_id,
244
- provider: a.provider,
245
- provider_id: a.provider_id,
246
- created_at: a.created_at,
247
- updated_at: a.updated_at,
248
- };
249
- }
250
- export function parseListParams(url) {
251
- const limit = Math.max(1, Math.min(parseInt(url.searchParams.get('limit') ?? '10'), 100));
252
- const order = url.searchParams.get('order') ?? 'desc';
253
- const before = url.searchParams.get('before') ?? undefined;
254
- const after = url.searchParams.get('after') ?? undefined;
255
- return { limit, order, before, after };
102
+ return formatEntity(a);
256
103
  }
257
104
  /** Allowed redirect URI hosts for the emulator's authorize endpoints. */
258
105
  const ALLOWED_REDIRECT_HOSTS = new Set(['localhost', '127.0.0.1', '[::1]']);
@@ -272,64 +119,21 @@ export function assertLocalRedirectUri(uri) {
272
119
  throw new WorkOSApiError(400, `redirect_uri must point to localhost, got ${parsed.hostname}`, 'invalid_redirect_uri');
273
120
  }
274
121
  }
122
+ const AUTH_CHALLENGE_EXCLUDE = new Set([...INTERNAL_FIELDS, 'code']);
275
123
  export function formatAuthChallenge(c) {
276
- return {
277
- object: 'authentication_challenge',
278
- id: c.id,
279
- user_id: c.user_id,
280
- factor_id: c.factor_id,
281
- expires_at: c.expires_at,
282
- created_at: c.created_at,
283
- updated_at: c.updated_at,
284
- };
124
+ return formatEntity(c, { exclude: AUTH_CHALLENGE_EXCLUDE });
285
125
  }
286
126
  export function formatRole(role) {
287
- return {
288
- object: 'role',
289
- id: role.id,
290
- slug: role.slug,
291
- name: role.name,
292
- description: role.description,
293
- type: role.type,
294
- organization_id: role.organization_id,
295
- is_default_role: role.is_default_role,
296
- priority: role.priority,
297
- created_at: role.created_at,
298
- updated_at: role.updated_at,
299
- };
127
+ return formatEntity(role);
300
128
  }
301
129
  export function formatPermission(p) {
302
- return {
303
- object: 'permission',
304
- id: p.id,
305
- slug: p.slug,
306
- name: p.name,
307
- description: p.description,
308
- created_at: p.created_at,
309
- updated_at: p.updated_at,
310
- };
130
+ return formatEntity(p);
311
131
  }
312
132
  export function formatAuthorizationResource(r) {
313
- return {
314
- object: 'authorization_resource',
315
- id: r.id,
316
- resource_type_slug: r.resource_type_slug,
317
- external_id: r.external_id,
318
- organization_id: r.organization_id,
319
- metadata: r.metadata,
320
- created_at: r.created_at,
321
- updated_at: r.updated_at,
322
- };
133
+ return formatEntity(r);
323
134
  }
324
135
  export function formatRoleAssignment(ra) {
325
- return {
326
- object: 'role_assignment',
327
- id: ra.id,
328
- organization_membership_id: ra.organization_membership_id,
329
- role_id: ra.role_id,
330
- created_at: ra.created_at,
331
- updated_at: ra.updated_at,
332
- };
136
+ return formatEntity(ra);
333
137
  }
334
138
  export function formatDeviceAuthorization(d) {
335
139
  return {
@@ -340,158 +144,47 @@ export function formatDeviceAuthorization(d) {
340
144
  interval: d.interval,
341
145
  };
342
146
  }
343
- // --- Phase 4: CRUD Domain formatters ---
344
147
  export function formatDirectory(d) {
345
- return {
346
- object: 'directory',
347
- id: d.id,
348
- name: d.name,
349
- organization_id: d.organization_id,
350
- domain: d.domain,
351
- type: d.type,
352
- state: d.state,
353
- external_key: d.external_key,
354
- created_at: d.created_at,
355
- updated_at: d.updated_at,
356
- };
148
+ return formatEntity(d);
357
149
  }
358
150
  export function formatDirectoryUser(u) {
359
- return {
360
- object: 'directory_user',
361
- id: u.id,
362
- directory_id: u.directory_id,
363
- organization_id: u.organization_id,
364
- idp_id: u.idp_id,
365
- first_name: u.first_name,
366
- last_name: u.last_name,
367
- email: u.email,
368
- username: u.username,
369
- state: u.state,
370
- role: u.role,
371
- custom_attributes: u.custom_attributes,
372
- raw_attributes: u.raw_attributes,
373
- groups: u.groups,
374
- created_at: u.created_at,
375
- updated_at: u.updated_at,
376
- };
151
+ return formatEntity(u);
377
152
  }
378
153
  export function formatDirectoryGroup(g) {
379
- return {
380
- object: 'directory_group',
381
- id: g.id,
382
- directory_id: g.directory_id,
383
- organization_id: g.organization_id,
384
- idp_id: g.idp_id,
385
- name: g.name,
386
- raw_attributes: g.raw_attributes,
387
- created_at: g.created_at,
388
- updated_at: g.updated_at,
389
- };
154
+ return formatEntity(g);
390
155
  }
391
156
  export function formatAuditLogAction(a) {
392
- return {
393
- object: 'audit_log_action',
394
- id: a.id,
395
- name: a.name,
396
- description: a.description,
397
- condition: a.condition,
398
- created_at: a.created_at,
399
- updated_at: a.updated_at,
400
- };
157
+ return formatEntity(a);
401
158
  }
402
159
  export function formatAuditLogEvent(e) {
403
- return {
404
- object: 'audit_log_event',
405
- id: e.id,
406
- organization_id: e.organization_id,
407
- action: e.action,
408
- actor: e.actor,
409
- targets: e.targets,
410
- metadata: e.metadata,
411
- occurred_at: e.occurred_at,
412
- created_at: e.created_at,
413
- updated_at: e.updated_at,
414
- };
160
+ return formatEntity(e);
415
161
  }
416
162
  export function formatAuditLogExport(ex) {
417
- return {
418
- object: 'audit_log_export',
419
- id: ex.id,
420
- organization_id: ex.organization_id,
421
- state: ex.state,
422
- url: ex.url,
423
- filters: ex.filters,
424
- created_at: ex.created_at,
425
- updated_at: ex.updated_at,
426
- };
163
+ return formatEntity(ex);
427
164
  }
428
165
  export function formatFeatureFlag(f) {
429
- return {
430
- object: 'feature_flag',
431
- id: f.id,
432
- slug: f.slug,
433
- name: f.name,
434
- description: f.description,
435
- type: f.type,
436
- default_value: f.default_value,
437
- enabled: f.enabled,
438
- created_at: f.created_at,
439
- updated_at: f.updated_at,
440
- };
166
+ return formatEntity(f);
167
+ }
168
+ export function formatFlagTarget(t) {
169
+ return formatEntity(t);
441
170
  }
442
171
  export function formatConnectApplication(a) {
443
- return {
444
- object: 'connect_application',
445
- id: a.id,
446
- name: a.name,
447
- redirect_uris: a.redirect_uris,
448
- client_id: a.client_id,
449
- logo_url: a.logo_url,
450
- created_at: a.created_at,
451
- updated_at: a.updated_at,
452
- };
172
+ return formatEntity(a);
453
173
  }
174
+ const CLIENT_SECRET_EXCLUDE = new Set([...INTERNAL_FIELDS, 'value']);
454
175
  export function formatClientSecret(s) {
455
- return {
456
- object: 'client_secret',
457
- id: s.id,
458
- application_id: s.application_id,
459
- last_four: s.last_four,
460
- created_at: s.created_at,
461
- updated_at: s.updated_at,
462
- };
176
+ return formatEntity(s, { exclude: CLIENT_SECRET_EXCLUDE });
463
177
  }
464
178
  export function formatRadarAttempt(a) {
465
- return {
466
- object: 'radar_attempt',
467
- id: a.id,
468
- user_id: a.user_id,
469
- ip_address: a.ip_address,
470
- user_agent: a.user_agent,
471
- verdict: a.verdict,
472
- signals: a.signals,
473
- created_at: a.created_at,
474
- updated_at: a.updated_at,
475
- };
179
+ return formatEntity(a);
476
180
  }
181
+ const API_KEY_EXCLUDE = new Set([...INTERNAL_FIELDS, 'key', 'environment']);
477
182
  export function formatApiKeyRecord(k) {
478
- return {
479
- object: 'api_key',
480
- id: k.id,
481
- name: k.name,
482
- created_at: k.created_at,
483
- updated_at: k.updated_at,
484
- };
183
+ return formatEntity(k, { exclude: API_KEY_EXCLUDE });
485
184
  }
185
+ const EVENT_EXCLUDE = new Set([...INTERNAL_FIELDS, 'updated_at']);
486
186
  export function formatEvent(e) {
487
- return {
488
- object: 'event',
489
- id: e.id,
490
- event: e.event,
491
- data: e.data,
492
- environment_id: e.environment_id,
493
- created_at: e.created_at,
494
- };
187
+ return formatEntity(e, { exclude: EVENT_EXCLUDE });
495
188
  }
496
189
  export function formatWebhookEndpoint(ep, opts) {
497
190
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/emulate/workos/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes, createHash, createCipheriv } from 'node:crypto';\nimport { WorkOSApiError } from '../core/index.js';\nimport type { WorkOSStore } from './store.js';\nimport type {\n WorkOSOrganization,\n WorkOSOrganizationDomain,\n WorkOSOrganizationMembership,\n WorkOSUser,\n WorkOSSession,\n WorkOSEmailVerification,\n WorkOSPasswordReset,\n WorkOSMagicAuth,\n WorkOSAuthenticationFactor,\n WorkOSIdentity,\n WorkOSConnection,\n WorkOSSSOProfile,\n WorkOSPipeConnection,\n WorkOSInvitation,\n WorkOSRedirectUri,\n WorkOSCorsOrigin,\n WorkOSAuthorizedApplication,\n WorkOSConnectedAccount,\n WorkOSAuthenticationChallenge,\n WorkOSDeviceAuthorization,\n WorkOSRole,\n WorkOSPermission,\n WorkOSAuthorizationResource,\n WorkOSRoleAssignment,\n WorkOSDirectory,\n WorkOSDirectoryUser,\n WorkOSDirectoryGroup,\n WorkOSAuditLogAction,\n WorkOSAuditLogEvent,\n WorkOSAuditLogExport,\n WorkOSFeatureFlag,\n WorkOSConnectApplication,\n WorkOSClientSecret,\n WorkOSRadarAttempt,\n WorkOSApiKey,\n WorkOSEvent,\n WorkOSWebhookEndpoint,\n} from './entities.js';\n\nexport function formatOrganization(org: WorkOSOrganization, ws: WorkOSStore): Record<string, unknown> {\n const domains = ws.organizationDomains.findBy('organization_id', org.id).map(formatDomain);\n\n return {\n object: 'organization',\n id: org.id,\n name: org.name,\n external_id: org.external_id,\n metadata: org.metadata,\n domains,\n stripe_customer_id: org.stripe_customer_id,\n created_at: org.created_at,\n updated_at: org.updated_at,\n };\n}\n\nexport function formatDomain(domain: WorkOSOrganizationDomain): Record<string, unknown> {\n return {\n object: 'organization_domain',\n id: domain.id,\n organization_id: domain.organization_id,\n domain: domain.domain,\n state: domain.state,\n verification_strategy: domain.verification_strategy,\n verification_token: domain.verification_token,\n verification_prefix: domain.verification_prefix,\n created_at: domain.created_at,\n updated_at: domain.updated_at,\n };\n}\n\nexport function formatMembership(m: WorkOSOrganizationMembership): Record<string, unknown> {\n return {\n object: 'organization_membership',\n id: m.id,\n organization_id: m.organization_id,\n user_id: m.user_id,\n role: m.role,\n status: m.status,\n external_id: m.external_id,\n metadata: m.metadata,\n created_at: m.created_at,\n updated_at: m.updated_at,\n };\n}\n\nexport function formatUser(user: WorkOSUser): Record<string, unknown> {\n return {\n object: 'user',\n id: user.id,\n email: user.email,\n first_name: user.first_name,\n last_name: user.last_name,\n email_verified: user.email_verified,\n profile_picture_url: user.profile_picture_url,\n last_sign_in_at: user.last_sign_in_at,\n external_id: user.external_id,\n metadata: user.metadata,\n locale: user.locale,\n created_at: user.created_at,\n updated_at: user.updated_at,\n };\n}\n\nexport function formatSession(s: WorkOSSession): Record<string, unknown> {\n return {\n object: 'session',\n id: s.id,\n user_id: s.user_id,\n organization_id: s.organization_id,\n ip_address: s.ip_address,\n user_agent: s.user_agent,\n created_at: s.created_at,\n updated_at: s.updated_at,\n };\n}\n\nexport function formatEmailVerification(ev: WorkOSEmailVerification): Record<string, unknown> {\n return {\n object: 'email_verification',\n id: ev.id,\n user_id: ev.user_id,\n email: ev.email,\n code: ev.code,\n expires_at: ev.expires_at,\n created_at: ev.created_at,\n updated_at: ev.updated_at,\n };\n}\n\nexport function formatPasswordReset(pr: WorkOSPasswordReset): Record<string, unknown> {\n return {\n object: 'password_reset',\n id: pr.id,\n user_id: pr.user_id,\n email: pr.email,\n token: pr.token,\n expires_at: pr.expires_at,\n created_at: pr.created_at,\n updated_at: pr.updated_at,\n };\n}\n\nexport function formatMagicAuth(ma: WorkOSMagicAuth): Record<string, unknown> {\n return {\n object: 'magic_auth',\n id: ma.id,\n user_id: ma.user_id,\n email: ma.email,\n code: ma.code,\n expires_at: ma.expires_at,\n created_at: ma.created_at,\n updated_at: ma.updated_at,\n };\n}\n\nexport function formatAuthFactor(f: WorkOSAuthenticationFactor): Record<string, unknown> {\n return {\n object: 'authentication_factor',\n id: f.id,\n user_id: f.user_id,\n type: f.type,\n totp: f.totp,\n created_at: f.created_at,\n updated_at: f.updated_at,\n };\n}\n\nexport function formatIdentity(i: WorkOSIdentity): Record<string, unknown> {\n return {\n object: 'identity',\n id: i.id,\n user_id: i.user_id,\n provider: i.provider,\n provider_id: i.provider_id,\n type: i.type,\n created_at: i.created_at,\n updated_at: i.updated_at,\n };\n}\n\nexport function generateVerificationToken(): string {\n return randomBytes(16).toString('hex');\n}\n\nexport function generateCode(): string {\n return String(Math.floor(100000 + Math.random() * 900000));\n}\n\nexport function hashPassword(password: string): string {\n return createHash('sha256').update(password).digest('hex');\n}\n\nexport function verifyPassword(password: string, hash: string): boolean {\n return hashPassword(password) === hash;\n}\n\nexport function expiresIn(minutes: number): string {\n return new Date(Date.now() + minutes * 60 * 1000).toISOString();\n}\n\nexport function isExpired(expiresAt: string): boolean {\n return new Date(expiresAt).getTime() < Date.now();\n}\n\nexport function formatConnection(conn: WorkOSConnection): Record<string, unknown> {\n return {\n object: 'connection',\n id: conn.id,\n organization_id: conn.organization_id,\n connection_type: conn.connection_type,\n name: conn.name,\n state: conn.state,\n domains: conn.domains,\n created_at: conn.created_at,\n updated_at: conn.updated_at,\n };\n}\n\nexport function formatSSOProfile(p: WorkOSSSOProfile): Record<string, unknown> {\n return {\n object: 'profile',\n id: p.id,\n connection_id: p.connection_id,\n connection_type: p.connection_type,\n organization_id: p.organization_id,\n idp_id: p.idp_id,\n email: p.email,\n first_name: p.first_name,\n last_name: p.last_name,\n groups: p.groups,\n raw_attributes: p.raw_attributes,\n created_at: p.created_at,\n updated_at: p.updated_at,\n };\n}\n\nexport function formatPipeConnection(pc: WorkOSPipeConnection): Record<string, unknown> {\n return {\n object: 'pipe_connection',\n id: pc.id,\n user_id: pc.user_id,\n provider: pc.provider,\n scopes: pc.scopes,\n status: pc.status,\n external_account_id: pc.external_account_id,\n created_at: pc.created_at,\n updated_at: pc.updated_at,\n };\n}\n\nexport function formatInvitation(inv: WorkOSInvitation): Record<string, unknown> {\n return {\n object: 'invitation',\n id: inv.id,\n email: inv.email,\n state: inv.state,\n token: inv.token,\n accept_invitation_url: inv.accept_invitation_url,\n organization_id: inv.organization_id,\n inviter_user_id: inv.inviter_user_id,\n role_slug: inv.role_slug,\n expires_at: inv.expires_at,\n created_at: inv.created_at,\n updated_at: inv.updated_at,\n };\n}\n\nexport function formatRedirectUri(r: WorkOSRedirectUri): Record<string, unknown> {\n return {\n object: 'redirect_uri',\n id: r.id,\n uri: r.uri,\n created_at: r.created_at,\n updated_at: r.updated_at,\n };\n}\n\nexport function formatCorsOrigin(o: WorkOSCorsOrigin): Record<string, unknown> {\n return {\n object: 'cors_origin',\n id: o.id,\n origin: o.origin,\n created_at: o.created_at,\n updated_at: o.updated_at,\n };\n}\n\nexport function formatAuthorizedApplication(a: WorkOSAuthorizedApplication): Record<string, unknown> {\n return {\n object: 'authorized_application',\n id: a.id,\n user_id: a.user_id,\n name: a.name,\n redirect_uri: a.redirect_uri,\n created_at: a.created_at,\n updated_at: a.updated_at,\n };\n}\n\nexport function formatConnectedAccount(a: WorkOSConnectedAccount): Record<string, unknown> {\n return {\n object: 'connected_account',\n id: a.id,\n user_id: a.user_id,\n provider: a.provider,\n provider_id: a.provider_id,\n created_at: a.created_at,\n updated_at: a.updated_at,\n };\n}\n\nexport function parseListParams(url: URL) {\n const limit = Math.max(1, Math.min(parseInt(url.searchParams.get('limit') ?? '10'), 100));\n const order = (url.searchParams.get('order') as 'asc' | 'desc') ?? 'desc';\n const before = url.searchParams.get('before') ?? undefined;\n const after = url.searchParams.get('after') ?? undefined;\n return { limit, order, before, after };\n}\n\n/** Allowed redirect URI hosts for the emulator's authorize endpoints. */\nconst ALLOWED_REDIRECT_HOSTS = new Set(['localhost', '127.0.0.1', '[::1]']);\n\n/**\n * Validate that a redirect_uri points to a localhost origin.\n * Prevents the emulator from being used as an open redirect.\n */\nexport function assertLocalRedirectUri(uri: string): void {\n let parsed: URL;\n try {\n parsed = new URL(uri);\n } catch {\n throw new WorkOSApiError(400, 'Invalid redirect_uri', 'invalid_redirect_uri');\n }\n if (!ALLOWED_REDIRECT_HOSTS.has(parsed.hostname)) {\n throw new WorkOSApiError(\n 400,\n `redirect_uri must point to localhost, got ${parsed.hostname}`,\n 'invalid_redirect_uri',\n );\n }\n}\n\nexport function formatAuthChallenge(c: WorkOSAuthenticationChallenge): Record<string, unknown> {\n return {\n object: 'authentication_challenge',\n id: c.id,\n user_id: c.user_id,\n factor_id: c.factor_id,\n expires_at: c.expires_at,\n created_at: c.created_at,\n updated_at: c.updated_at,\n };\n}\n\nexport function formatRole(role: WorkOSRole): Record<string, unknown> {\n return {\n object: 'role',\n id: role.id,\n slug: role.slug,\n name: role.name,\n description: role.description,\n type: role.type,\n organization_id: role.organization_id,\n is_default_role: role.is_default_role,\n priority: role.priority,\n created_at: role.created_at,\n updated_at: role.updated_at,\n };\n}\n\nexport function formatPermission(p: WorkOSPermission): Record<string, unknown> {\n return {\n object: 'permission',\n id: p.id,\n slug: p.slug,\n name: p.name,\n description: p.description,\n created_at: p.created_at,\n updated_at: p.updated_at,\n };\n}\n\nexport function formatAuthorizationResource(r: WorkOSAuthorizationResource): Record<string, unknown> {\n return {\n object: 'authorization_resource',\n id: r.id,\n resource_type_slug: r.resource_type_slug,\n external_id: r.external_id,\n organization_id: r.organization_id,\n metadata: r.metadata,\n created_at: r.created_at,\n updated_at: r.updated_at,\n };\n}\n\nexport function formatRoleAssignment(ra: WorkOSRoleAssignment): Record<string, unknown> {\n return {\n object: 'role_assignment',\n id: ra.id,\n organization_membership_id: ra.organization_membership_id,\n role_id: ra.role_id,\n created_at: ra.created_at,\n updated_at: ra.updated_at,\n };\n}\n\nexport function formatDeviceAuthorization(d: WorkOSDeviceAuthorization): Record<string, unknown> {\n return {\n device_code: d.device_code,\n user_code: d.user_code,\n verification_uri: 'http://localhost:0/user_management/authorize/device/verify',\n expires_in: Math.max(0, Math.floor((new Date(d.expires_at).getTime() - Date.now()) / 1000)),\n interval: d.interval,\n };\n}\n\n// --- Phase 4: CRUD Domain formatters ---\n\nexport function formatDirectory(d: WorkOSDirectory): Record<string, unknown> {\n return {\n object: 'directory',\n id: d.id,\n name: d.name,\n organization_id: d.organization_id,\n domain: d.domain,\n type: d.type,\n state: d.state,\n external_key: d.external_key,\n created_at: d.created_at,\n updated_at: d.updated_at,\n };\n}\n\nexport function formatDirectoryUser(u: WorkOSDirectoryUser): Record<string, unknown> {\n return {\n object: 'directory_user',\n id: u.id,\n directory_id: u.directory_id,\n organization_id: u.organization_id,\n idp_id: u.idp_id,\n first_name: u.first_name,\n last_name: u.last_name,\n email: u.email,\n username: u.username,\n state: u.state,\n role: u.role,\n custom_attributes: u.custom_attributes,\n raw_attributes: u.raw_attributes,\n groups: u.groups,\n created_at: u.created_at,\n updated_at: u.updated_at,\n };\n}\n\nexport function formatDirectoryGroup(g: WorkOSDirectoryGroup): Record<string, unknown> {\n return {\n object: 'directory_group',\n id: g.id,\n directory_id: g.directory_id,\n organization_id: g.organization_id,\n idp_id: g.idp_id,\n name: g.name,\n raw_attributes: g.raw_attributes,\n created_at: g.created_at,\n updated_at: g.updated_at,\n };\n}\n\nexport function formatAuditLogAction(a: WorkOSAuditLogAction): Record<string, unknown> {\n return {\n object: 'audit_log_action',\n id: a.id,\n name: a.name,\n description: a.description,\n condition: a.condition,\n created_at: a.created_at,\n updated_at: a.updated_at,\n };\n}\n\nexport function formatAuditLogEvent(e: WorkOSAuditLogEvent): Record<string, unknown> {\n return {\n object: 'audit_log_event',\n id: e.id,\n organization_id: e.organization_id,\n action: e.action,\n actor: e.actor,\n targets: e.targets,\n metadata: e.metadata,\n occurred_at: e.occurred_at,\n created_at: e.created_at,\n updated_at: e.updated_at,\n };\n}\n\nexport function formatAuditLogExport(ex: WorkOSAuditLogExport): Record<string, unknown> {\n return {\n object: 'audit_log_export',\n id: ex.id,\n organization_id: ex.organization_id,\n state: ex.state,\n url: ex.url,\n filters: ex.filters,\n created_at: ex.created_at,\n updated_at: ex.updated_at,\n };\n}\n\nexport function formatFeatureFlag(f: WorkOSFeatureFlag): Record<string, unknown> {\n return {\n object: 'feature_flag',\n id: f.id,\n slug: f.slug,\n name: f.name,\n description: f.description,\n type: f.type,\n default_value: f.default_value,\n enabled: f.enabled,\n created_at: f.created_at,\n updated_at: f.updated_at,\n };\n}\n\nexport function formatConnectApplication(a: WorkOSConnectApplication): Record<string, unknown> {\n return {\n object: 'connect_application',\n id: a.id,\n name: a.name,\n redirect_uris: a.redirect_uris,\n client_id: a.client_id,\n logo_url: a.logo_url,\n created_at: a.created_at,\n updated_at: a.updated_at,\n };\n}\n\nexport function formatClientSecret(s: WorkOSClientSecret): Record<string, unknown> {\n return {\n object: 'client_secret',\n id: s.id,\n application_id: s.application_id,\n last_four: s.last_four,\n created_at: s.created_at,\n updated_at: s.updated_at,\n };\n}\n\nexport function formatRadarAttempt(a: WorkOSRadarAttempt): Record<string, unknown> {\n return {\n object: 'radar_attempt',\n id: a.id,\n user_id: a.user_id,\n ip_address: a.ip_address,\n user_agent: a.user_agent,\n verdict: a.verdict,\n signals: a.signals,\n created_at: a.created_at,\n updated_at: a.updated_at,\n };\n}\n\nexport function formatApiKeyRecord(k: WorkOSApiKey): Record<string, unknown> {\n return {\n object: 'api_key',\n id: k.id,\n name: k.name,\n created_at: k.created_at,\n updated_at: k.updated_at,\n };\n}\n\nexport function formatEvent(e: WorkOSEvent): Record<string, unknown> {\n return {\n object: 'event',\n id: e.id,\n event: e.event,\n data: e.data,\n environment_id: e.environment_id,\n created_at: e.created_at,\n };\n}\n\nexport function formatWebhookEndpoint(\n ep: WorkOSWebhookEndpoint,\n opts?: { includeSecret?: boolean },\n): Record<string, unknown> {\n return {\n object: 'webhook_endpoint',\n id: ep.id,\n url: ep.url,\n secret: opts?.includeSecret ? ep.secret : `${ep.secret.slice(0, 8)}****`,\n enabled: ep.enabled,\n events: ep.events,\n description: ep.description,\n created_at: ep.created_at,\n updated_at: ep.updated_at,\n };\n}\n\nexport function sealSession(\n data: { access_token: string; refresh_token: string; session_id: string },\n apiKey: string,\n): string {\n const key = createHash('sha256').update(apiKey).digest();\n const iv = randomBytes(12);\n const cipher = createCipheriv('aes-256-gcm', key, iv);\n const plaintext = JSON.stringify(data);\n const encrypted = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\n const tag = cipher.getAuthTag();\n return Buffer.concat([iv, tag, encrypted]).toString('base64');\n}\n"]}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/emulate/workos/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes, createHash, createCipheriv } from 'node:crypto';\nimport { WorkOSApiError, type CursorPaginatedResult, type Entity } from '../core/index.js';\nimport type { WorkOSStore } from './store.js';\nimport type {\n WorkOSOrganization,\n WorkOSOrganizationDomain,\n WorkOSOrganizationMembership,\n WorkOSUser,\n WorkOSSession,\n WorkOSEmailVerification,\n WorkOSPasswordReset,\n WorkOSMagicAuth,\n WorkOSAuthenticationFactor,\n WorkOSIdentity,\n WorkOSConnection,\n WorkOSSSOProfile,\n WorkOSPipeConnection,\n WorkOSInvitation,\n WorkOSRedirectUri,\n WorkOSCorsOrigin,\n WorkOSAuthorizedApplication,\n WorkOSConnectedAccount,\n WorkOSAuthenticationChallenge,\n WorkOSDeviceAuthorization,\n WorkOSRole,\n WorkOSPermission,\n WorkOSAuthorizationResource,\n WorkOSRoleAssignment,\n WorkOSDirectory,\n WorkOSDirectoryUser,\n WorkOSDirectoryGroup,\n WorkOSAuditLogAction,\n WorkOSAuditLogEvent,\n WorkOSAuditLogExport,\n WorkOSFeatureFlag,\n WorkOSFlagTarget,\n WorkOSConnectApplication,\n WorkOSClientSecret,\n WorkOSRadarAttempt,\n WorkOSApiKey,\n WorkOSEvent,\n WorkOSWebhookEndpoint,\n} from './entities.js';\n\nconst INTERNAL_FIELDS = new Set<string>(['password_hash', 'code_challenge', 'code_challenge_method']);\n\nexport function formatEntity<T extends Entity>(entity: T, opts?: { exclude?: Set<string> }): Record<string, unknown> {\n const exclude = opts?.exclude ?? INTERNAL_FIELDS;\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(entity)) {\n if (!exclude.has(key)) result[key] = value;\n }\n return result;\n}\n\nexport function formatListResponse<T>(\n result: CursorPaginatedResult<T>,\n formatter: (item: T) => Record<string, unknown>,\n): { object: 'list'; data: Record<string, unknown>[]; list_metadata: { before: string | null; after: string | null } } {\n return {\n object: 'list',\n data: result.data.map(formatter),\n list_metadata: result.list_metadata,\n };\n}\n\nexport function formatOrganization(\n org: WorkOSOrganization,\n ws: WorkOSStore,\n opts?: { domains?: WorkOSOrganizationDomain[] },\n): Record<string, unknown> {\n const domains = (opts?.domains ?? ws.organizationDomains.findBy('organization_id', org.id)).map(formatDomain);\n\n return {\n object: 'organization',\n id: org.id,\n name: org.name,\n external_id: org.external_id,\n metadata: org.metadata,\n domains,\n stripe_customer_id: org.stripe_customer_id,\n created_at: org.created_at,\n updated_at: org.updated_at,\n };\n}\n\nexport function formatDomain(domain: WorkOSOrganizationDomain): Record<string, unknown> {\n return formatEntity(domain);\n}\n\nexport function formatMembership(m: WorkOSOrganizationMembership): Record<string, unknown> {\n return formatEntity(m);\n}\n\nconst USER_EXCLUDE = new Set([...INTERNAL_FIELDS, 'impersonator']);\n\nexport function formatUser(user: WorkOSUser): Record<string, unknown> {\n return formatEntity(user, { exclude: USER_EXCLUDE });\n}\n\nexport function formatSession(s: WorkOSSession): Record<string, unknown> {\n return formatEntity(s);\n}\n\nexport function formatEmailVerification(ev: WorkOSEmailVerification): Record<string, unknown> {\n return formatEntity(ev);\n}\n\nexport function formatPasswordReset(pr: WorkOSPasswordReset): Record<string, unknown> {\n return formatEntity(pr);\n}\n\nexport function formatMagicAuth(ma: WorkOSMagicAuth): Record<string, unknown> {\n return formatEntity(ma);\n}\n\nexport function formatAuthFactor(f: WorkOSAuthenticationFactor): Record<string, unknown> {\n return formatEntity(f);\n}\n\nexport function formatIdentity(i: WorkOSIdentity): Record<string, unknown> {\n return formatEntity(i);\n}\n\nexport function generateVerificationToken(): string {\n return randomBytes(16).toString('hex');\n}\n\nexport function generateCode(): string {\n return String(Math.floor(100000 + Math.random() * 900000));\n}\n\nexport function hashPassword(password: string): string {\n return createHash('sha256').update(password).digest('hex');\n}\n\nexport function verifyPassword(password: string, hash: string): boolean {\n return hashPassword(password) === hash;\n}\n\nexport function expiresIn(minutes: number): string {\n return new Date(Date.now() + minutes * 60 * 1000).toISOString();\n}\n\nexport function isExpired(expiresAt: string): boolean {\n return new Date(expiresAt).getTime() < Date.now();\n}\n\nexport function formatConnection(conn: WorkOSConnection): Record<string, unknown> {\n return formatEntity(conn);\n}\n\nexport function formatSSOProfile(p: WorkOSSSOProfile): Record<string, unknown> {\n return formatEntity(p);\n}\n\nexport function formatPipeConnection(pc: WorkOSPipeConnection): Record<string, unknown> {\n return formatEntity(pc);\n}\n\nexport function formatInvitation(inv: WorkOSInvitation): Record<string, unknown> {\n return formatEntity(inv);\n}\n\nexport function formatRedirectUri(r: WorkOSRedirectUri): Record<string, unknown> {\n return formatEntity(r);\n}\n\nexport function formatCorsOrigin(o: WorkOSCorsOrigin): Record<string, unknown> {\n return formatEntity(o);\n}\n\nexport function formatAuthorizedApplication(a: WorkOSAuthorizedApplication): Record<string, unknown> {\n return formatEntity(a);\n}\n\nexport function formatConnectedAccount(a: WorkOSConnectedAccount): Record<string, unknown> {\n return formatEntity(a);\n}\n\n/** Allowed redirect URI hosts for the emulator's authorize endpoints. */\nconst ALLOWED_REDIRECT_HOSTS = new Set(['localhost', '127.0.0.1', '[::1]']);\n\n/**\n * Validate that a redirect_uri points to a localhost origin.\n * Prevents the emulator from being used as an open redirect.\n */\nexport function assertLocalRedirectUri(uri: string): void {\n let parsed: URL;\n try {\n parsed = new URL(uri);\n } catch {\n throw new WorkOSApiError(400, 'Invalid redirect_uri', 'invalid_redirect_uri');\n }\n if (!ALLOWED_REDIRECT_HOSTS.has(parsed.hostname)) {\n throw new WorkOSApiError(\n 400,\n `redirect_uri must point to localhost, got ${parsed.hostname}`,\n 'invalid_redirect_uri',\n );\n }\n}\n\nconst AUTH_CHALLENGE_EXCLUDE = new Set([...INTERNAL_FIELDS, 'code']);\n\nexport function formatAuthChallenge(c: WorkOSAuthenticationChallenge): Record<string, unknown> {\n return formatEntity(c, { exclude: AUTH_CHALLENGE_EXCLUDE });\n}\n\nexport function formatRole(role: WorkOSRole): Record<string, unknown> {\n return formatEntity(role);\n}\n\nexport function formatPermission(p: WorkOSPermission): Record<string, unknown> {\n return formatEntity(p);\n}\n\nexport function formatAuthorizationResource(r: WorkOSAuthorizationResource): Record<string, unknown> {\n return formatEntity(r);\n}\n\nexport function formatRoleAssignment(ra: WorkOSRoleAssignment): Record<string, unknown> {\n return formatEntity(ra);\n}\n\nexport function formatDeviceAuthorization(d: WorkOSDeviceAuthorization): Record<string, unknown> {\n return {\n device_code: d.device_code,\n user_code: d.user_code,\n verification_uri: 'http://localhost:0/user_management/authorize/device/verify',\n expires_in: Math.max(0, Math.floor((new Date(d.expires_at).getTime() - Date.now()) / 1000)),\n interval: d.interval,\n };\n}\n\nexport function formatDirectory(d: WorkOSDirectory): Record<string, unknown> {\n return formatEntity(d);\n}\n\nexport function formatDirectoryUser(u: WorkOSDirectoryUser): Record<string, unknown> {\n return formatEntity(u);\n}\n\nexport function formatDirectoryGroup(g: WorkOSDirectoryGroup): Record<string, unknown> {\n return formatEntity(g);\n}\n\nexport function formatAuditLogAction(a: WorkOSAuditLogAction): Record<string, unknown> {\n return formatEntity(a);\n}\n\nexport function formatAuditLogEvent(e: WorkOSAuditLogEvent): Record<string, unknown> {\n return formatEntity(e);\n}\n\nexport function formatAuditLogExport(ex: WorkOSAuditLogExport): Record<string, unknown> {\n return formatEntity(ex);\n}\n\nexport function formatFeatureFlag(f: WorkOSFeatureFlag): Record<string, unknown> {\n return formatEntity(f);\n}\n\nexport function formatFlagTarget(t: WorkOSFlagTarget): Record<string, unknown> {\n return formatEntity(t);\n}\n\nexport function formatConnectApplication(a: WorkOSConnectApplication): Record<string, unknown> {\n return formatEntity(a);\n}\n\nconst CLIENT_SECRET_EXCLUDE = new Set([...INTERNAL_FIELDS, 'value']);\n\nexport function formatClientSecret(s: WorkOSClientSecret): Record<string, unknown> {\n return formatEntity(s, { exclude: CLIENT_SECRET_EXCLUDE });\n}\n\nexport function formatRadarAttempt(a: WorkOSRadarAttempt): Record<string, unknown> {\n return formatEntity(a);\n}\n\nconst API_KEY_EXCLUDE = new Set([...INTERNAL_FIELDS, 'key', 'environment']);\n\nexport function formatApiKeyRecord(k: WorkOSApiKey): Record<string, unknown> {\n return formatEntity(k, { exclude: API_KEY_EXCLUDE });\n}\n\nconst EVENT_EXCLUDE = new Set([...INTERNAL_FIELDS, 'updated_at']);\n\nexport function formatEvent(e: WorkOSEvent): Record<string, unknown> {\n return formatEntity(e, { exclude: EVENT_EXCLUDE });\n}\n\nexport function formatWebhookEndpoint(\n ep: WorkOSWebhookEndpoint,\n opts?: { includeSecret?: boolean },\n): Record<string, unknown> {\n return {\n object: 'webhook_endpoint',\n id: ep.id,\n url: ep.url,\n secret: opts?.includeSecret ? ep.secret : `${ep.secret.slice(0, 8)}****`,\n enabled: ep.enabled,\n events: ep.events,\n description: ep.description,\n created_at: ep.created_at,\n updated_at: ep.updated_at,\n };\n}\n\nexport function sealSession(\n data: { access_token: string; refresh_token: string; session_id: string },\n apiKey: string,\n): string {\n const key = createHash('sha256').update(apiKey).digest();\n const iv = randomBytes(12);\n const cipher = createCipheriv('aes-256-gcm', key, iv);\n const plaintext = JSON.stringify(data);\n const encrypted = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\n const tag = cipher.getAuthTag();\n return Buffer.concat([iv, tag, encrypted]).toString('base64');\n}\n"]}