workos 0.11.2 → 0.12.0-beta.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 (169) hide show
  1. package/README.md +163 -6
  2. package/dist/bin.js +20 -1
  3. package/dist/bin.js.map +1 -1
  4. package/dist/check-coverage.ts +237 -0
  5. package/dist/commands/dev.d.ts +23 -0
  6. package/dist/commands/dev.js +139 -0
  7. package/dist/commands/dev.js.map +1 -0
  8. package/dist/commands/emulate.d.ts +6 -0
  9. package/dist/commands/emulate.js +64 -0
  10. package/dist/commands/emulate.js.map +1 -0
  11. package/dist/emulate/core/id.d.ts +33 -0
  12. package/dist/emulate/core/id.js +58 -0
  13. package/dist/emulate/core/id.js.map +1 -0
  14. package/dist/emulate/core/index.d.ts +8 -0
  15. package/dist/emulate/core/index.js +8 -0
  16. package/dist/emulate/core/index.js.map +1 -0
  17. package/dist/emulate/core/jwt.d.ts +28 -0
  18. package/dist/emulate/core/jwt.js +78 -0
  19. package/dist/emulate/core/jwt.js.map +1 -0
  20. package/dist/emulate/core/middleware/auth.d.ts +18 -0
  21. package/dist/emulate/core/middleware/auth.js +28 -0
  22. package/dist/emulate/core/middleware/auth.js.map +1 -0
  23. package/dist/emulate/core/middleware/error-handler.d.ts +22 -0
  24. package/dist/emulate/core/middleware/error-handler.js +72 -0
  25. package/dist/emulate/core/middleware/error-handler.js.map +1 -0
  26. package/dist/emulate/core/pagination.d.ts +21 -0
  27. package/dist/emulate/core/pagination.js +35 -0
  28. package/dist/emulate/core/pagination.js.map +1 -0
  29. package/dist/emulate/core/plugin.d.ts +15 -0
  30. package/dist/emulate/core/plugin.js +2 -0
  31. package/dist/emulate/core/plugin.js.map +1 -0
  32. package/dist/emulate/core/server.d.ts +17 -0
  33. package/dist/emulate/core/server.js +116 -0
  34. package/dist/emulate/core/server.js.map +1 -0
  35. package/dist/emulate/core/store.d.ts +42 -0
  36. package/dist/emulate/core/store.js +148 -0
  37. package/dist/emulate/core/store.js.map +1 -0
  38. package/dist/emulate/index.d.ts +25 -0
  39. package/dist/emulate/index.js +47 -0
  40. package/dist/emulate/index.js.map +1 -0
  41. package/dist/emulate/workos/entities.d.ts +360 -0
  42. package/dist/emulate/workos/entities.js +2 -0
  43. package/dist/emulate/workos/entities.js.map +1 -0
  44. package/dist/emulate/workos/event-bus.d.ts +12 -0
  45. package/dist/emulate/workos/event-bus.js +45 -0
  46. package/dist/emulate/workos/event-bus.js.map +1 -0
  47. package/dist/emulate/workos/helpers.d.ts +63 -0
  48. package/dist/emulate/workos/helpers.js +518 -0
  49. package/dist/emulate/workos/helpers.js.map +1 -0
  50. package/dist/emulate/workos/index.d.ts +91 -0
  51. package/dist/emulate/workos/index.js +319 -0
  52. package/dist/emulate/workos/index.js.map +1 -0
  53. package/dist/emulate/workos/routes/api-keys.d.ts +2 -0
  54. package/dist/emulate/workos/routes/api-keys.js +35 -0
  55. package/dist/emulate/workos/routes/api-keys.js.map +1 -0
  56. package/dist/emulate/workos/routes/audit-logs.d.ts +2 -0
  57. package/dist/emulate/workos/routes/audit-logs.js +107 -0
  58. package/dist/emulate/workos/routes/audit-logs.js.map +1 -0
  59. package/dist/emulate/workos/routes/auth-challenges.d.ts +2 -0
  60. package/dist/emulate/workos/routes/auth-challenges.js +51 -0
  61. package/dist/emulate/workos/routes/auth-challenges.js.map +1 -0
  62. package/dist/emulate/workos/routes/auth-factors.d.ts +2 -0
  63. package/dist/emulate/workos/routes/auth-factors.js +51 -0
  64. package/dist/emulate/workos/routes/auth-factors.js.map +1 -0
  65. package/dist/emulate/workos/routes/auth.d.ts +2 -0
  66. package/dist/emulate/workos/routes/auth.js +349 -0
  67. package/dist/emulate/workos/routes/auth.js.map +1 -0
  68. package/dist/emulate/workos/routes/authorization-checks.d.ts +10 -0
  69. package/dist/emulate/workos/routes/authorization-checks.js +135 -0
  70. package/dist/emulate/workos/routes/authorization-checks.js.map +1 -0
  71. package/dist/emulate/workos/routes/authorization-org-roles.d.ts +2 -0
  72. package/dist/emulate/workos/routes/authorization-org-roles.js +206 -0
  73. package/dist/emulate/workos/routes/authorization-org-roles.js.map +1 -0
  74. package/dist/emulate/workos/routes/authorization-permissions.d.ts +2 -0
  75. package/dist/emulate/workos/routes/authorization-permissions.js +78 -0
  76. package/dist/emulate/workos/routes/authorization-permissions.js.map +1 -0
  77. package/dist/emulate/workos/routes/authorization-resources.d.ts +2 -0
  78. package/dist/emulate/workos/routes/authorization-resources.js +128 -0
  79. package/dist/emulate/workos/routes/authorization-resources.js.map +1 -0
  80. package/dist/emulate/workos/routes/authorization-roles.d.ts +2 -0
  81. package/dist/emulate/workos/routes/authorization-roles.js +136 -0
  82. package/dist/emulate/workos/routes/authorization-roles.js.map +1 -0
  83. package/dist/emulate/workos/routes/config.d.ts +2 -0
  84. package/dist/emulate/workos/routes/config.js +56 -0
  85. package/dist/emulate/workos/routes/config.js.map +1 -0
  86. package/dist/emulate/workos/routes/connect.d.ts +2 -0
  87. package/dist/emulate/workos/routes/connect.js +69 -0
  88. package/dist/emulate/workos/routes/connect.js.map +1 -0
  89. package/dist/emulate/workos/routes/connections.d.ts +2 -0
  90. package/dist/emulate/workos/routes/connections.js +77 -0
  91. package/dist/emulate/workos/routes/connections.js.map +1 -0
  92. package/dist/emulate/workos/routes/data-integrations.d.ts +2 -0
  93. package/dist/emulate/workos/routes/data-integrations.js +55 -0
  94. package/dist/emulate/workos/routes/data-integrations.js.map +1 -0
  95. package/dist/emulate/workos/routes/directories.d.ts +2 -0
  96. package/dist/emulate/workos/routes/directories.js +106 -0
  97. package/dist/emulate/workos/routes/directories.js.map +1 -0
  98. package/dist/emulate/workos/routes/email-verification.d.ts +2 -0
  99. package/dist/emulate/workos/routes/email-verification.js +49 -0
  100. package/dist/emulate/workos/routes/email-verification.js.map +1 -0
  101. package/dist/emulate/workos/routes/events.d.ts +2 -0
  102. package/dist/emulate/workos/routes/events.js +21 -0
  103. package/dist/emulate/workos/routes/events.js.map +1 -0
  104. package/dist/emulate/workos/routes/feature-flags.d.ts +2 -0
  105. package/dist/emulate/workos/routes/feature-flags.js +131 -0
  106. package/dist/emulate/workos/routes/feature-flags.js.map +1 -0
  107. package/dist/emulate/workos/routes/invitations.d.ts +2 -0
  108. package/dist/emulate/workos/routes/invitations.js +125 -0
  109. package/dist/emulate/workos/routes/invitations.js.map +1 -0
  110. package/dist/emulate/workos/routes/legacy-mfa.d.ts +2 -0
  111. package/dist/emulate/workos/routes/legacy-mfa.js +75 -0
  112. package/dist/emulate/workos/routes/legacy-mfa.js.map +1 -0
  113. package/dist/emulate/workos/routes/magic-auth.d.ts +2 -0
  114. package/dist/emulate/workos/routes/magic-auth.js +32 -0
  115. package/dist/emulate/workos/routes/magic-auth.js.map +1 -0
  116. package/dist/emulate/workos/routes/memberships.d.ts +2 -0
  117. package/dist/emulate/workos/routes/memberships.js +118 -0
  118. package/dist/emulate/workos/routes/memberships.js.map +1 -0
  119. package/dist/emulate/workos/routes/organization-domains.d.ts +2 -0
  120. package/dist/emulate/workos/routes/organization-domains.js +58 -0
  121. package/dist/emulate/workos/routes/organization-domains.js.map +1 -0
  122. package/dist/emulate/workos/routes/organizations.d.ts +2 -0
  123. package/dist/emulate/workos/routes/organizations.js +133 -0
  124. package/dist/emulate/workos/routes/organizations.js.map +1 -0
  125. package/dist/emulate/workos/routes/password-reset.d.ts +2 -0
  126. package/dist/emulate/workos/routes/password-reset.js +61 -0
  127. package/dist/emulate/workos/routes/password-reset.js.map +1 -0
  128. package/dist/emulate/workos/routes/pipes.d.ts +2 -0
  129. package/dist/emulate/workos/routes/pipes.js +86 -0
  130. package/dist/emulate/workos/routes/pipes.js.map +1 -0
  131. package/dist/emulate/workos/routes/portal.d.ts +2 -0
  132. package/dist/emulate/workos/routes/portal.js +18 -0
  133. package/dist/emulate/workos/routes/portal.js.map +1 -0
  134. package/dist/emulate/workos/routes/radar.d.ts +2 -0
  135. package/dist/emulate/workos/routes/radar.js +45 -0
  136. package/dist/emulate/workos/routes/radar.js.map +1 -0
  137. package/dist/emulate/workos/routes/sessions.d.ts +2 -0
  138. package/dist/emulate/workos/routes/sessions.js +51 -0
  139. package/dist/emulate/workos/routes/sessions.js.map +1 -0
  140. package/dist/emulate/workos/routes/sso.d.ts +2 -0
  141. package/dist/emulate/workos/routes/sso.js +160 -0
  142. package/dist/emulate/workos/routes/sso.js.map +1 -0
  143. package/dist/emulate/workos/routes/user-features.d.ts +2 -0
  144. package/dist/emulate/workos/routes/user-features.js +50 -0
  145. package/dist/emulate/workos/routes/user-features.js.map +1 -0
  146. package/dist/emulate/workos/routes/users.d.ts +2 -0
  147. package/dist/emulate/workos/routes/users.js +133 -0
  148. package/dist/emulate/workos/routes/users.js.map +1 -0
  149. package/dist/emulate/workos/routes/webhook-endpoints.d.ts +2 -0
  150. package/dist/emulate/workos/routes/webhook-endpoints.js +70 -0
  151. package/dist/emulate/workos/routes/webhook-endpoints.js.map +1 -0
  152. package/dist/emulate/workos/routes/widgets.d.ts +2 -0
  153. package/dist/emulate/workos/routes/widgets.js +27 -0
  154. package/dist/emulate/workos/routes/widgets.js.map +1 -0
  155. package/dist/emulate/workos/store.d.ts +48 -0
  156. package/dist/emulate/workos/store.js +93 -0
  157. package/dist/emulate/workos/store.js.map +1 -0
  158. package/dist/emulate/workos/webhook-signer.d.ts +1 -0
  159. package/dist/emulate/workos/webhook-signer.js +8 -0
  160. package/dist/emulate/workos/webhook-signer.js.map +1 -0
  161. package/dist/gen-routes-lib.spec.ts +659 -0
  162. package/dist/gen-routes-lib.ts +647 -0
  163. package/dist/gen-routes.ts +96 -0
  164. package/dist/lib/dev-command.d.ts +26 -0
  165. package/dist/lib/dev-command.js +122 -0
  166. package/dist/lib/dev-command.js.map +1 -0
  167. package/dist/utils/help-json.js +23 -0
  168. package/dist/utils/help-json.js.map +1 -1
  169. package/package.json +20 -7
@@ -0,0 +1,45 @@
1
+ import { getWorkOSStore } from './store.js';
2
+ import { signWebhookPayload } from './webhook-signer.js';
3
+ export class EventBus {
4
+ store;
5
+ constructor(store) {
6
+ this.store = store;
7
+ }
8
+ emit(payload) {
9
+ const ws = getWorkOSStore(this.store);
10
+ const event = ws.events.insert({
11
+ object: 'event',
12
+ event: payload.event,
13
+ data: payload.data,
14
+ environment_id: payload.environment_id ?? null,
15
+ });
16
+ const endpoints = ws.webhookEndpoints.all();
17
+ for (const endpoint of endpoints) {
18
+ if (!endpoint.enabled)
19
+ continue;
20
+ if (endpoint.events.length > 0 && !endpoint.events.includes(payload.event))
21
+ continue;
22
+ // Fire-and-forget — don't await
23
+ this.deliver(endpoint, event).catch(() => { });
24
+ }
25
+ }
26
+ async deliver(endpoint, event) {
27
+ const body = JSON.stringify({
28
+ id: event.id,
29
+ event: event.event,
30
+ data: event.data,
31
+ created_at: event.created_at,
32
+ });
33
+ const signature = signWebhookPayload(body, endpoint.secret);
34
+ await fetch(endpoint.url, {
35
+ method: 'POST',
36
+ headers: {
37
+ 'Content-Type': 'application/json',
38
+ 'WorkOS-Signature': signature,
39
+ },
40
+ body,
41
+ signal: AbortSignal.timeout(5000),
42
+ });
43
+ }
44
+ }
45
+ //# sourceMappingURL=event-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../../src/emulate/workos/event-bus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAQzD,MAAM,OAAO,QAAQ;IACC;IAApB,YAAoB,KAAY;QAAZ,UAAK,GAAL,KAAK,CAAO;IAAG,CAAC;IAEpC,IAAI,CAAC,OAAqB;QACxB,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtC,MAAM,KAAK,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YAC7B,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI;SAC/C,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC;QAC5C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,OAAO;gBAAE,SAAS;YAChC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,SAAS;YACrF,gCAAgC;YAChC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,QAA+B,EAAE,KAAkB;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE5D,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;YACxB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,kBAAkB,EAAE,SAAS;aAC9B;YACD,IAAI;YACJ,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import type { Store } from '../core/index.js';\nimport { getWorkOSStore } from './store.js';\nimport type { WorkOSWebhookEndpoint, WorkOSEvent } from './entities.js';\nimport { signWebhookPayload } from './webhook-signer.js';\n\nexport interface EventPayload {\n event: string;\n data: Record<string, unknown>;\n environment_id?: string;\n}\n\nexport class EventBus {\n constructor(private store: Store) {}\n\n emit(payload: EventPayload): void {\n const ws = getWorkOSStore(this.store);\n\n const event = ws.events.insert({\n object: 'event',\n event: payload.event,\n data: payload.data,\n environment_id: payload.environment_id ?? null,\n });\n\n const endpoints = ws.webhookEndpoints.all();\n for (const endpoint of endpoints) {\n if (!endpoint.enabled) continue;\n if (endpoint.events.length > 0 && !endpoint.events.includes(payload.event)) continue;\n // Fire-and-forget — don't await\n this.deliver(endpoint, event).catch(() => {});\n }\n }\n\n private async deliver(endpoint: WorkOSWebhookEndpoint, event: WorkOSEvent): Promise<void> {\n const body = JSON.stringify({\n id: event.id,\n event: event.event,\n data: event.data,\n created_at: event.created_at,\n });\n\n const signature = signWebhookPayload(body, endpoint.secret);\n\n await fetch(endpoint.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'WorkOS-Signature': signature,\n },\n body,\n signal: AbortSignal.timeout(5000),\n });\n }\n}\n"]}
@@ -0,0 +1,63 @@
1
+ import type { WorkOSStore } from './store.js';
2
+ import type { WorkOSOrganization, WorkOSOrganizationDomain, WorkOSOrganizationMembership, WorkOSUser, WorkOSSession, WorkOSEmailVerification, WorkOSPasswordReset, WorkOSMagicAuth, WorkOSAuthenticationFactor, WorkOSIdentity, WorkOSConnection, WorkOSSSOProfile, WorkOSPipeConnection, WorkOSInvitation, WorkOSRedirectUri, WorkOSCorsOrigin, WorkOSAuthorizedApplication, WorkOSConnectedAccount, WorkOSAuthenticationChallenge, WorkOSDeviceAuthorization, WorkOSRole, WorkOSPermission, WorkOSAuthorizationResource, WorkOSRoleAssignment, WorkOSDirectory, WorkOSDirectoryUser, WorkOSDirectoryGroup, WorkOSAuditLogAction, WorkOSAuditLogEvent, WorkOSAuditLogExport, WorkOSFeatureFlag, WorkOSConnectApplication, WorkOSClientSecret, WorkOSRadarAttempt, WorkOSApiKey, WorkOSEvent, WorkOSWebhookEndpoint } from './entities.js';
3
+ export declare function formatOrganization(org: WorkOSOrganization, ws: WorkOSStore): Record<string, unknown>;
4
+ export declare function formatDomain(domain: WorkOSOrganizationDomain): Record<string, unknown>;
5
+ export declare function formatMembership(m: WorkOSOrganizationMembership): Record<string, unknown>;
6
+ export declare function formatUser(user: WorkOSUser): Record<string, unknown>;
7
+ export declare function formatSession(s: WorkOSSession): Record<string, unknown>;
8
+ export declare function formatEmailVerification(ev: WorkOSEmailVerification): Record<string, unknown>;
9
+ export declare function formatPasswordReset(pr: WorkOSPasswordReset): Record<string, unknown>;
10
+ export declare function formatMagicAuth(ma: WorkOSMagicAuth): Record<string, unknown>;
11
+ export declare function formatAuthFactor(f: WorkOSAuthenticationFactor): Record<string, unknown>;
12
+ export declare function formatIdentity(i: WorkOSIdentity): Record<string, unknown>;
13
+ export declare function generateVerificationToken(): string;
14
+ export declare function generateCode(): string;
15
+ export declare function hashPassword(password: string): string;
16
+ export declare function verifyPassword(password: string, hash: string): boolean;
17
+ export declare function expiresIn(minutes: number): string;
18
+ export declare function isExpired(expiresAt: string): boolean;
19
+ export declare function formatConnection(conn: WorkOSConnection): Record<string, unknown>;
20
+ export declare function formatSSOProfile(p: WorkOSSSOProfile): Record<string, unknown>;
21
+ export declare function formatPipeConnection(pc: WorkOSPipeConnection): Record<string, unknown>;
22
+ export declare function formatInvitation(inv: WorkOSInvitation): Record<string, unknown>;
23
+ export declare function formatRedirectUri(r: WorkOSRedirectUri): Record<string, unknown>;
24
+ export declare function formatCorsOrigin(o: WorkOSCorsOrigin): Record<string, unknown>;
25
+ export declare function formatAuthorizedApplication(a: WorkOSAuthorizedApplication): Record<string, unknown>;
26
+ export declare function formatConnectedAccount(a: WorkOSConnectedAccount): Record<string, unknown>;
27
+ export declare function parseListParams(url: URL): {
28
+ limit: number;
29
+ order: "asc" | "desc";
30
+ before: string | undefined;
31
+ after: string | undefined;
32
+ };
33
+ /**
34
+ * Validate that a redirect_uri points to a localhost origin.
35
+ * Prevents the emulator from being used as an open redirect.
36
+ */
37
+ export declare function assertLocalRedirectUri(uri: string): void;
38
+ export declare function formatAuthChallenge(c: WorkOSAuthenticationChallenge): Record<string, unknown>;
39
+ export declare function formatRole(role: WorkOSRole): Record<string, unknown>;
40
+ export declare function formatPermission(p: WorkOSPermission): Record<string, unknown>;
41
+ export declare function formatAuthorizationResource(r: WorkOSAuthorizationResource): Record<string, unknown>;
42
+ export declare function formatRoleAssignment(ra: WorkOSRoleAssignment): Record<string, unknown>;
43
+ export declare function formatDeviceAuthorization(d: WorkOSDeviceAuthorization): Record<string, unknown>;
44
+ export declare function formatDirectory(d: WorkOSDirectory): Record<string, unknown>;
45
+ export declare function formatDirectoryUser(u: WorkOSDirectoryUser): Record<string, unknown>;
46
+ export declare function formatDirectoryGroup(g: WorkOSDirectoryGroup): Record<string, unknown>;
47
+ export declare function formatAuditLogAction(a: WorkOSAuditLogAction): Record<string, unknown>;
48
+ export declare function formatAuditLogEvent(e: WorkOSAuditLogEvent): Record<string, unknown>;
49
+ export declare function formatAuditLogExport(ex: WorkOSAuditLogExport): Record<string, unknown>;
50
+ export declare function formatFeatureFlag(f: WorkOSFeatureFlag): Record<string, unknown>;
51
+ export declare function formatConnectApplication(a: WorkOSConnectApplication): Record<string, unknown>;
52
+ export declare function formatClientSecret(s: WorkOSClientSecret): Record<string, unknown>;
53
+ export declare function formatRadarAttempt(a: WorkOSRadarAttempt): Record<string, unknown>;
54
+ export declare function formatApiKeyRecord(k: WorkOSApiKey): Record<string, unknown>;
55
+ export declare function formatEvent(e: WorkOSEvent): Record<string, unknown>;
56
+ export declare function formatWebhookEndpoint(ep: WorkOSWebhookEndpoint, opts?: {
57
+ includeSecret?: boolean;
58
+ }): Record<string, unknown>;
59
+ export declare function sealSession(data: {
60
+ access_token: string;
61
+ refresh_token: string;
62
+ session_id: string;
63
+ }, apiKey: string): string;
@@ -0,0 +1,518 @@
1
+ import { randomBytes, createHash, createCipheriv } from 'node:crypto';
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);
5
+ return {
6
+ object: 'organization',
7
+ id: org.id,
8
+ name: org.name,
9
+ external_id: org.external_id,
10
+ metadata: org.metadata,
11
+ domains,
12
+ stripe_customer_id: org.stripe_customer_id,
13
+ created_at: org.created_at,
14
+ updated_at: org.updated_at,
15
+ };
16
+ }
17
+ 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
+ };
30
+ }
31
+ 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
+ };
44
+ }
45
+ 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
+ };
61
+ }
62
+ 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
+ };
73
+ }
74
+ 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
+ };
85
+ }
86
+ 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
+ };
97
+ }
98
+ 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
+ };
109
+ }
110
+ 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
+ };
120
+ }
121
+ 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
+ };
132
+ }
133
+ export function generateVerificationToken() {
134
+ return randomBytes(16).toString('hex');
135
+ }
136
+ export function generateCode() {
137
+ return String(Math.floor(100000 + Math.random() * 900000));
138
+ }
139
+ export function hashPassword(password) {
140
+ return createHash('sha256').update(password).digest('hex');
141
+ }
142
+ export function verifyPassword(password, hash) {
143
+ return hashPassword(password) === hash;
144
+ }
145
+ export function expiresIn(minutes) {
146
+ return new Date(Date.now() + minutes * 60 * 1000).toISOString();
147
+ }
148
+ export function isExpired(expiresAt) {
149
+ return new Date(expiresAt).getTime() < Date.now();
150
+ }
151
+ 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
+ };
163
+ }
164
+ 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
+ };
180
+ }
181
+ 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
+ };
193
+ }
194
+ 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
+ };
209
+ }
210
+ 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
+ };
218
+ }
219
+ 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
+ };
227
+ }
228
+ 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
+ };
238
+ }
239
+ 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 };
256
+ }
257
+ /** Allowed redirect URI hosts for the emulator's authorize endpoints. */
258
+ const ALLOWED_REDIRECT_HOSTS = new Set(['localhost', '127.0.0.1', '[::1]']);
259
+ /**
260
+ * Validate that a redirect_uri points to a localhost origin.
261
+ * Prevents the emulator from being used as an open redirect.
262
+ */
263
+ export function assertLocalRedirectUri(uri) {
264
+ let parsed;
265
+ try {
266
+ parsed = new URL(uri);
267
+ }
268
+ catch {
269
+ throw new WorkOSApiError(400, 'Invalid redirect_uri', 'invalid_redirect_uri');
270
+ }
271
+ if (!ALLOWED_REDIRECT_HOSTS.has(parsed.hostname)) {
272
+ throw new WorkOSApiError(400, `redirect_uri must point to localhost, got ${parsed.hostname}`, 'invalid_redirect_uri');
273
+ }
274
+ }
275
+ 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
+ };
285
+ }
286
+ 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
+ };
300
+ }
301
+ 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
+ };
311
+ }
312
+ 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
+ };
323
+ }
324
+ 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
+ };
333
+ }
334
+ export function formatDeviceAuthorization(d) {
335
+ return {
336
+ device_code: d.device_code,
337
+ user_code: d.user_code,
338
+ verification_uri: 'http://localhost:0/user_management/authorize/device/verify',
339
+ expires_in: Math.max(0, Math.floor((new Date(d.expires_at).getTime() - Date.now()) / 1000)),
340
+ interval: d.interval,
341
+ };
342
+ }
343
+ // --- Phase 4: CRUD Domain formatters ---
344
+ 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
+ };
357
+ }
358
+ 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
+ };
377
+ }
378
+ 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
+ };
390
+ }
391
+ 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
+ };
401
+ }
402
+ 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
+ };
415
+ }
416
+ 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
+ };
427
+ }
428
+ 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
+ };
441
+ }
442
+ 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
+ };
453
+ }
454
+ 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
+ };
463
+ }
464
+ 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
+ };
476
+ }
477
+ 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
+ };
485
+ }
486
+ 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
+ };
495
+ }
496
+ export function formatWebhookEndpoint(ep, opts) {
497
+ return {
498
+ object: 'webhook_endpoint',
499
+ id: ep.id,
500
+ url: ep.url,
501
+ secret: opts?.includeSecret ? ep.secret : `${ep.secret.slice(0, 8)}****`,
502
+ enabled: ep.enabled,
503
+ events: ep.events,
504
+ description: ep.description,
505
+ created_at: ep.created_at,
506
+ updated_at: ep.updated_at,
507
+ };
508
+ }
509
+ export function sealSession(data, apiKey) {
510
+ const key = createHash('sha256').update(apiKey).digest();
511
+ const iv = randomBytes(12);
512
+ const cipher = createCipheriv('aes-256-gcm', key, iv);
513
+ const plaintext = JSON.stringify(data);
514
+ const encrypted = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
515
+ const tag = cipher.getAuthTag();
516
+ return Buffer.concat([iv, tag, encrypted]).toString('base64');
517
+ }
518
+ //# sourceMappingURL=helpers.js.map