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,133 @@
1
+ import { notFound, validationError, parseJsonBody, WorkOSApiError } from '../../core/index.js';
2
+ import { getWorkOSStore } from '../store.js';
3
+ import { formatUser, formatIdentity, hashPassword, parseListParams } from '../helpers.js';
4
+ export function userRoutes(ctx) {
5
+ const { app, store } = ctx;
6
+ const ws = getWorkOSStore(store);
7
+ app.post('/user_management/users', async (c) => {
8
+ const body = await parseJsonBody(c);
9
+ const email = body.email;
10
+ if (!email) {
11
+ throw validationError('email is required', [{ field: 'email', code: 'required' }]);
12
+ }
13
+ const existing = ws.users.findOneBy('email', email);
14
+ if (existing) {
15
+ throw new WorkOSApiError(409, 'A user with this email already exists', 'user_already_exists');
16
+ }
17
+ const password = body.password;
18
+ const user = ws.users.insert({
19
+ object: 'user',
20
+ email,
21
+ first_name: body.first_name ?? null,
22
+ last_name: body.last_name ?? null,
23
+ email_verified: body.email_verified ?? false,
24
+ profile_picture_url: null,
25
+ last_sign_in_at: null,
26
+ external_id: body.external_id ?? null,
27
+ metadata: body.metadata ?? {},
28
+ locale: null,
29
+ password_hash: password ? hashPassword(password) : null,
30
+ impersonator: null,
31
+ });
32
+ return c.json(formatUser(user), 201);
33
+ });
34
+ app.get('/user_management/users', (c) => {
35
+ const url = new URL(c.req.url);
36
+ const params = parseListParams(url);
37
+ const emailFilter = url.searchParams.get('email') ?? undefined;
38
+ const orgFilter = url.searchParams.get('organization_id') ?? undefined;
39
+ let orgUserIds;
40
+ if (orgFilter) {
41
+ orgUserIds = new Set(ws.organizationMemberships.findBy('organization_id', orgFilter).map((m) => m.user_id));
42
+ }
43
+ const result = ws.users.list({
44
+ ...params,
45
+ filter: (user) => {
46
+ if (emailFilter && user.email !== emailFilter)
47
+ return false;
48
+ if (orgUserIds && !orgUserIds.has(user.id))
49
+ return false;
50
+ return true;
51
+ },
52
+ });
53
+ return c.json({
54
+ object: 'list',
55
+ data: result.data.map(formatUser),
56
+ list_metadata: result.list_metadata,
57
+ });
58
+ });
59
+ app.get('/user_management/users/:id', (c) => {
60
+ const user = ws.users.get(c.req.param('id'));
61
+ if (!user)
62
+ throw notFound('User');
63
+ return c.json(formatUser(user));
64
+ });
65
+ app.get('/user_management/users/external_id/:external_id', (c) => {
66
+ const user = ws.users.findOneBy('external_id', c.req.param('external_id'));
67
+ if (!user)
68
+ throw notFound('User');
69
+ return c.json(formatUser(user));
70
+ });
71
+ app.put('/user_management/users/:id', async (c) => {
72
+ const user = ws.users.get(c.req.param('id'));
73
+ if (!user)
74
+ throw notFound('User');
75
+ const body = await parseJsonBody(c);
76
+ const updates = {};
77
+ if ('first_name' in body)
78
+ updates.first_name = body.first_name ?? null;
79
+ if ('last_name' in body)
80
+ updates.last_name = body.last_name ?? null;
81
+ if ('email_verified' in body)
82
+ updates.email_verified = body.email_verified;
83
+ if ('external_id' in body)
84
+ updates.external_id = body.external_id ?? null;
85
+ if ('metadata' in body)
86
+ updates.metadata = body.metadata ?? {};
87
+ if ('password' in body && body.password) {
88
+ updates.password_hash = hashPassword(body.password);
89
+ }
90
+ const updated = ws.users.update(user.id, updates);
91
+ return c.json(formatUser(updated));
92
+ });
93
+ app.delete('/user_management/users/:id', (c) => {
94
+ const user = ws.users.get(c.req.param('id'));
95
+ if (!user)
96
+ throw notFound('User');
97
+ for (const s of ws.sessions.findBy('user_id', user.id)) {
98
+ ws.sessions.delete(s.id);
99
+ }
100
+ for (const m of ws.organizationMemberships.findBy('user_id', user.id)) {
101
+ ws.organizationMemberships.delete(m.id);
102
+ }
103
+ for (const f of ws.authFactors.findBy('user_id', user.id)) {
104
+ ws.authFactors.delete(f.id);
105
+ }
106
+ for (const i of ws.identities.findBy('user_id', user.id)) {
107
+ ws.identities.delete(i.id);
108
+ }
109
+ for (const pr of ws.passwordResets.findBy('user_id', user.id)) {
110
+ ws.passwordResets.delete(pr.id);
111
+ }
112
+ for (const ev of ws.emailVerifications.findBy('user_id', user.id)) {
113
+ ws.emailVerifications.delete(ev.id);
114
+ }
115
+ for (const ma of ws.magicAuths.findBy('user_id', user.id)) {
116
+ ws.magicAuths.delete(ma.id);
117
+ }
118
+ ws.users.delete(user.id);
119
+ return c.body(null, 204);
120
+ });
121
+ app.get('/user_management/users/:id/identities', (c) => {
122
+ const user = ws.users.get(c.req.param('id'));
123
+ if (!user)
124
+ throw notFound('User');
125
+ const identities = ws.identities.findBy('user_id', user.id);
126
+ return c.json({
127
+ object: 'list',
128
+ data: identities.map(formatIdentity),
129
+ list_metadata: { before: null, after: null },
130
+ });
131
+ });
132
+ }
133
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../../../src/emulate/workos/routes/users.ts"],"names":[],"mappings":"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","sourcesContent":["import { type RouteContext, notFound, validationError, parseJsonBody, WorkOSApiError } from '../../core/index.js';\nimport { getWorkOSStore } from '../store.js';\nimport { formatUser, formatIdentity, hashPassword, parseListParams } from '../helpers.js';\n\nexport function userRoutes(ctx: RouteContext): void {\n const { app, store } = ctx;\n const ws = getWorkOSStore(store);\n\n app.post('/user_management/users', async (c) => {\n const body = await parseJsonBody(c);\n const email = body.email as string | undefined;\n if (!email) {\n throw validationError('email is required', [{ field: 'email', code: 'required' }]);\n }\n\n const existing = ws.users.findOneBy('email', email);\n if (existing) {\n throw new WorkOSApiError(409, 'A user with this email already exists', 'user_already_exists');\n }\n\n const password = body.password as string | undefined;\n const user = ws.users.insert({\n object: 'user',\n email,\n first_name: (body.first_name as string) ?? null,\n last_name: (body.last_name as string) ?? null,\n email_verified: (body.email_verified as boolean) ?? false,\n profile_picture_url: null,\n last_sign_in_at: null,\n external_id: (body.external_id as string) ?? null,\n metadata: (body.metadata as Record<string, string>) ?? {},\n locale: null,\n password_hash: password ? hashPassword(password) : null,\n impersonator: null,\n });\n\n return c.json(formatUser(user), 201);\n });\n\n app.get('/user_management/users', (c) => {\n const url = new URL(c.req.url);\n const params = parseListParams(url);\n const emailFilter = url.searchParams.get('email') ?? undefined;\n const orgFilter = url.searchParams.get('organization_id') ?? undefined;\n\n let orgUserIds: Set<string> | undefined;\n if (orgFilter) {\n orgUserIds = new Set(ws.organizationMemberships.findBy('organization_id', orgFilter).map((m) => m.user_id));\n }\n\n const result = ws.users.list({\n ...params,\n filter: (user) => {\n if (emailFilter && user.email !== emailFilter) return false;\n if (orgUserIds && !orgUserIds.has(user.id)) return false;\n return true;\n },\n });\n\n return c.json({\n object: 'list',\n data: result.data.map(formatUser),\n list_metadata: result.list_metadata,\n });\n });\n\n app.get('/user_management/users/:id', (c) => {\n const user = ws.users.get(c.req.param('id'));\n if (!user) throw notFound('User');\n return c.json(formatUser(user));\n });\n\n app.get('/user_management/users/external_id/:external_id', (c) => {\n const user = ws.users.findOneBy('external_id', c.req.param('external_id'));\n if (!user) throw notFound('User');\n return c.json(formatUser(user));\n });\n\n app.put('/user_management/users/:id', async (c) => {\n const user = ws.users.get(c.req.param('id'));\n if (!user) throw notFound('User');\n\n const body = await parseJsonBody(c);\n const updates: Record<string, unknown> = {};\n\n if ('first_name' in body) updates.first_name = body.first_name ?? null;\n if ('last_name' in body) updates.last_name = body.last_name ?? null;\n if ('email_verified' in body) updates.email_verified = body.email_verified;\n if ('external_id' in body) updates.external_id = body.external_id ?? null;\n if ('metadata' in body) updates.metadata = body.metadata ?? {};\n if ('password' in body && body.password) {\n updates.password_hash = hashPassword(body.password as string);\n }\n\n const updated = ws.users.update(user.id, updates);\n return c.json(formatUser(updated!));\n });\n\n app.delete('/user_management/users/:id', (c) => {\n const user = ws.users.get(c.req.param('id'));\n if (!user) throw notFound('User');\n\n for (const s of ws.sessions.findBy('user_id', user.id)) {\n ws.sessions.delete(s.id);\n }\n for (const m of ws.organizationMemberships.findBy('user_id', user.id)) {\n ws.organizationMemberships.delete(m.id);\n }\n for (const f of ws.authFactors.findBy('user_id', user.id)) {\n ws.authFactors.delete(f.id);\n }\n for (const i of ws.identities.findBy('user_id', user.id)) {\n ws.identities.delete(i.id);\n }\n for (const pr of ws.passwordResets.findBy('user_id', user.id)) {\n ws.passwordResets.delete(pr.id);\n }\n for (const ev of ws.emailVerifications.findBy('user_id', user.id)) {\n ws.emailVerifications.delete(ev.id);\n }\n for (const ma of ws.magicAuths.findBy('user_id', user.id)) {\n ws.magicAuths.delete(ma.id);\n }\n\n ws.users.delete(user.id);\n return c.body(null, 204);\n });\n\n app.get('/user_management/users/:id/identities', (c) => {\n const user = ws.users.get(c.req.param('id'));\n if (!user) throw notFound('User');\n\n const identities = ws.identities.findBy('user_id', user.id);\n return c.json({\n object: 'list',\n data: identities.map(formatIdentity),\n list_metadata: { before: null, after: null },\n });\n });\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { type RouteContext } from '../../core/index.js';
2
+ export declare function webhookEndpointRoutes(ctx: RouteContext): void;
@@ -0,0 +1,70 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { notFound, validationError, parseJsonBody } from '../../core/index.js';
3
+ import { getWorkOSStore } from '../store.js';
4
+ import { formatWebhookEndpoint, parseListParams } from '../helpers.js';
5
+ export function webhookEndpointRoutes(ctx) {
6
+ const { app, store } = ctx;
7
+ const ws = getWorkOSStore(store);
8
+ app.post('/webhook_endpoints', async (c) => {
9
+ const body = await parseJsonBody(c);
10
+ const url = body.url;
11
+ if (!url || typeof url !== 'string') {
12
+ throw validationError('URL is required', [{ field: 'url', code: 'required' }]);
13
+ }
14
+ const secret = body.secret ?? randomBytes(32).toString('hex');
15
+ const endpoint = ws.webhookEndpoints.insert({
16
+ object: 'webhook_endpoint',
17
+ url,
18
+ secret,
19
+ enabled: body.enabled !== false,
20
+ events: Array.isArray(body.events) ? body.events : [],
21
+ description: body.description ?? null,
22
+ });
23
+ return c.json(formatWebhookEndpoint(endpoint, { includeSecret: true }), 201);
24
+ });
25
+ app.get('/webhook_endpoints', (c) => {
26
+ const url = new URL(c.req.url);
27
+ const params = parseListParams(url);
28
+ const result = ws.webhookEndpoints.list(params);
29
+ return c.json({
30
+ object: 'list',
31
+ data: result.data.map((ep) => formatWebhookEndpoint(ep)),
32
+ list_metadata: result.list_metadata,
33
+ });
34
+ });
35
+ app.get('/webhook_endpoints/:id', (c) => {
36
+ const ep = ws.webhookEndpoints.get(c.req.param('id'));
37
+ if (!ep)
38
+ throw notFound('WebhookEndpoint');
39
+ return c.json(formatWebhookEndpoint(ep));
40
+ });
41
+ app.put('/webhook_endpoints/:id', async (c) => {
42
+ const ep = ws.webhookEndpoints.get(c.req.param('id'));
43
+ if (!ep)
44
+ throw notFound('WebhookEndpoint');
45
+ const body = await parseJsonBody(c);
46
+ const updates = {};
47
+ if ('url' in body) {
48
+ if (!body.url || typeof body.url !== 'string') {
49
+ throw validationError('URL is required', [{ field: 'url', code: 'required' }]);
50
+ }
51
+ updates.url = body.url;
52
+ }
53
+ if ('enabled' in body)
54
+ updates.enabled = !!body.enabled;
55
+ if ('events' in body)
56
+ updates.events = Array.isArray(body.events) ? body.events : [];
57
+ if ('description' in body)
58
+ updates.description = body.description ?? null;
59
+ const updated = ws.webhookEndpoints.update(ep.id, updates);
60
+ return c.json(formatWebhookEndpoint(updated));
61
+ });
62
+ app.delete('/webhook_endpoints/:id', (c) => {
63
+ const ep = ws.webhookEndpoints.get(c.req.param('id'));
64
+ if (!ep)
65
+ throw notFound('WebhookEndpoint');
66
+ ws.webhookEndpoints.delete(ep.id);
67
+ return c.body(null, 204);
68
+ });
69
+ }
70
+ //# sourceMappingURL=webhook-endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-endpoints.js","sourceRoot":"","sources":["../../../../src/emulate/workos/routes/webhook-endpoints.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { type RouteContext, notFound, validationError, parseJsonBody } from '../../core/index.js';\nimport { getWorkOSStore } from '../store.js';\nimport { formatWebhookEndpoint, parseListParams } from '../helpers.js';\n\nexport function webhookEndpointRoutes(ctx: RouteContext): void {\n const { app, store } = ctx;\n const ws = getWorkOSStore(store);\n\n app.post('/webhook_endpoints', async (c) => {\n const body = await parseJsonBody(c);\n const url = body.url as string | undefined;\n if (!url || typeof url !== 'string') {\n throw validationError('URL is required', [{ field: 'url', code: 'required' }]);\n }\n\n const secret = (body.secret as string) ?? randomBytes(32).toString('hex');\n\n const endpoint = ws.webhookEndpoints.insert({\n object: 'webhook_endpoint',\n url,\n secret,\n enabled: body.enabled !== false,\n events: Array.isArray(body.events) ? (body.events as string[]) : [],\n description: (body.description as string) ?? null,\n });\n\n return c.json(formatWebhookEndpoint(endpoint, { includeSecret: true }), 201);\n });\n\n app.get('/webhook_endpoints', (c) => {\n const url = new URL(c.req.url);\n const params = parseListParams(url);\n\n const result = ws.webhookEndpoints.list(params);\n return c.json({\n object: 'list',\n data: result.data.map((ep) => formatWebhookEndpoint(ep)),\n list_metadata: result.list_metadata,\n });\n });\n\n app.get('/webhook_endpoints/:id', (c) => {\n const ep = ws.webhookEndpoints.get(c.req.param('id'));\n if (!ep) throw notFound('WebhookEndpoint');\n return c.json(formatWebhookEndpoint(ep));\n });\n\n app.put('/webhook_endpoints/:id', async (c) => {\n const ep = ws.webhookEndpoints.get(c.req.param('id'));\n if (!ep) throw notFound('WebhookEndpoint');\n\n const body = await parseJsonBody(c);\n const updates: Record<string, unknown> = {};\n\n if ('url' in body) {\n if (!body.url || typeof body.url !== 'string') {\n throw validationError('URL is required', [{ field: 'url', code: 'required' }]);\n }\n updates.url = body.url;\n }\n if ('enabled' in body) updates.enabled = !!body.enabled;\n if ('events' in body) updates.events = Array.isArray(body.events) ? body.events : [];\n if ('description' in body) updates.description = body.description ?? null;\n\n const updated = ws.webhookEndpoints.update(ep.id, updates);\n return c.json(formatWebhookEndpoint(updated!));\n });\n\n app.delete('/webhook_endpoints/:id', (c) => {\n const ep = ws.webhookEndpoints.get(c.req.param('id'));\n if (!ep) throw notFound('WebhookEndpoint');\n ws.webhookEndpoints.delete(ep.id);\n return c.body(null, 204);\n });\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { type RouteContext } from '../../core/index.js';
2
+ export declare function widgetRoutes(ctx: RouteContext): void;
@@ -0,0 +1,27 @@
1
+ import { parseJsonBody, validationError } from '../../core/index.js';
2
+ export function widgetRoutes(ctx) {
3
+ const { app, jwt } = ctx;
4
+ app.post('/widgets/token', async (c) => {
5
+ const body = await parseJsonBody(c);
6
+ const organizationId = body.organization_id;
7
+ const userId = body.user_id;
8
+ const scopes = body.scopes;
9
+ if (!organizationId) {
10
+ throw validationError('organization_id is required', [{ field: 'organization_id', code: 'required' }]);
11
+ }
12
+ if (!userId) {
13
+ throw validationError('user_id is required', [{ field: 'user_id', code: 'required' }]);
14
+ }
15
+ if (!scopes || !Array.isArray(scopes)) {
16
+ throw validationError('scopes is required', [{ field: 'scopes', code: 'required' }]);
17
+ }
18
+ const token = jwt.sign({
19
+ sub: userId,
20
+ org_id: organizationId,
21
+ aud: 'widgets',
22
+ scopes,
23
+ });
24
+ return c.json({ token });
25
+ });
26
+ }
27
+ //# sourceMappingURL=widgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgets.js","sourceRoot":"","sources":["../../../../src/emulate/workos/routes/widgets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAExF,MAAM,UAAU,YAAY,CAAC,GAAiB;IAC5C,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IAEzB,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,cAAc,GAAG,IAAI,CAAC,eAAqC,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,OAA6B,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,MAA8B,CAAC;QAEnD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,eAAe,CAAC,6BAA6B,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QACzG,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,eAAe,CAAC,qBAAqB,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,eAAe,CAAC,oBAAoB,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC;YACrB,GAAG,EAAE,MAAM;YACX,MAAM,EAAE,cAAc;YACtB,GAAG,EAAE,SAAS;YACd,MAAM;SACA,CAAC,CAAC;QAEV,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { type RouteContext, parseJsonBody, validationError } from '../../core/index.js';\n\nexport function widgetRoutes(ctx: RouteContext): void {\n const { app, jwt } = ctx;\n\n app.post('/widgets/token', async (c) => {\n const body = await parseJsonBody(c);\n const organizationId = body.organization_id as string | undefined;\n const userId = body.user_id as string | undefined;\n const scopes = body.scopes as string[] | undefined;\n\n if (!organizationId) {\n throw validationError('organization_id is required', [{ field: 'organization_id', code: 'required' }]);\n }\n if (!userId) {\n throw validationError('user_id is required', [{ field: 'user_id', code: 'required' }]);\n }\n if (!scopes || !Array.isArray(scopes)) {\n throw validationError('scopes is required', [{ field: 'scopes', code: 'required' }]);\n }\n\n const token = jwt.sign({\n sub: userId,\n org_id: organizationId,\n aud: 'widgets',\n scopes,\n } as any);\n\n return c.json({ token });\n });\n}\n"]}
@@ -0,0 +1,48 @@
1
+ import { type Store, type Collection } from '../core/index.js';
2
+ import type { WorkOSOrganization, WorkOSOrganizationDomain, WorkOSOrganizationMembership, WorkOSUser, WorkOSSession, WorkOSEmailVerification, WorkOSPasswordReset, WorkOSMagicAuth, WorkOSAuthenticationFactor, WorkOSAuthorizationCode, WorkOSIdentity, WorkOSConnection, WorkOSSSOProfile, WorkOSSSOAuthorization, WorkOSPipeConnection, WorkOSRefreshToken, WorkOSAuthenticationChallenge, WorkOSDeviceAuthorization, WorkOSInvitation, WorkOSRedirectUri, WorkOSCorsOrigin, WorkOSAuthorizedApplication, WorkOSConnectedAccount, WorkOSRole, WorkOSPermission, WorkOSRolePermission, WorkOSAuthorizationResource, WorkOSRoleAssignment, WorkOSDirectory, WorkOSDirectoryUser, WorkOSDirectoryGroup, WorkOSAuditLogAction, WorkOSAuditLogEvent, WorkOSAuditLogExport, WorkOSFeatureFlag, WorkOSFlagTarget, WorkOSConnectApplication, WorkOSClientSecret, WorkOSDataIntegrationAuth, WorkOSRadarAttempt, WorkOSApiKey, WorkOSEvent, WorkOSWebhookEndpoint } from './entities.js';
3
+ export interface WorkOSStore {
4
+ organizations: Collection<WorkOSOrganization>;
5
+ organizationDomains: Collection<WorkOSOrganizationDomain>;
6
+ organizationMemberships: Collection<WorkOSOrganizationMembership>;
7
+ users: Collection<WorkOSUser>;
8
+ sessions: Collection<WorkOSSession>;
9
+ emailVerifications: Collection<WorkOSEmailVerification>;
10
+ passwordResets: Collection<WorkOSPasswordReset>;
11
+ magicAuths: Collection<WorkOSMagicAuth>;
12
+ authFactors: Collection<WorkOSAuthenticationFactor>;
13
+ authCodes: Collection<WorkOSAuthorizationCode>;
14
+ identities: Collection<WorkOSIdentity>;
15
+ connections: Collection<WorkOSConnection>;
16
+ ssoProfiles: Collection<WorkOSSSOProfile>;
17
+ ssoAuthorizations: Collection<WorkOSSSOAuthorization>;
18
+ pipeConnections: Collection<WorkOSPipeConnection>;
19
+ refreshTokens: Collection<WorkOSRefreshToken>;
20
+ authChallenges: Collection<WorkOSAuthenticationChallenge>;
21
+ deviceAuthorizations: Collection<WorkOSDeviceAuthorization>;
22
+ invitations: Collection<WorkOSInvitation>;
23
+ redirectUris: Collection<WorkOSRedirectUri>;
24
+ corsOrigins: Collection<WorkOSCorsOrigin>;
25
+ authorizedApplications: Collection<WorkOSAuthorizedApplication>;
26
+ connectedAccounts: Collection<WorkOSConnectedAccount>;
27
+ roles: Collection<WorkOSRole>;
28
+ permissions: Collection<WorkOSPermission>;
29
+ rolePermissions: Collection<WorkOSRolePermission>;
30
+ authorizationResources: Collection<WorkOSAuthorizationResource>;
31
+ roleAssignments: Collection<WorkOSRoleAssignment>;
32
+ directories: Collection<WorkOSDirectory>;
33
+ directoryUsers: Collection<WorkOSDirectoryUser>;
34
+ directoryGroups: Collection<WorkOSDirectoryGroup>;
35
+ auditLogActions: Collection<WorkOSAuditLogAction>;
36
+ auditLogEvents: Collection<WorkOSAuditLogEvent>;
37
+ auditLogExports: Collection<WorkOSAuditLogExport>;
38
+ featureFlags: Collection<WorkOSFeatureFlag>;
39
+ flagTargets: Collection<WorkOSFlagTarget>;
40
+ connectApplications: Collection<WorkOSConnectApplication>;
41
+ clientSecrets: Collection<WorkOSClientSecret>;
42
+ dataIntegrationAuths: Collection<WorkOSDataIntegrationAuth>;
43
+ radarAttempts: Collection<WorkOSRadarAttempt>;
44
+ apiKeyRecords: Collection<WorkOSApiKey>;
45
+ events: Collection<WorkOSEvent>;
46
+ webhookEndpoints: Collection<WorkOSWebhookEndpoint>;
47
+ }
48
+ export declare function getWorkOSStore(store: Store): WorkOSStore;
@@ -0,0 +1,93 @@
1
+ export function getWorkOSStore(store) {
2
+ return {
3
+ organizations: store.collection('workos.organizations', 'org', ['name', 'external_id']),
4
+ organizationDomains: store.collection('workos.organization_domains', 'org_domain', [
5
+ 'organization_id',
6
+ 'domain',
7
+ ]),
8
+ organizationMemberships: store.collection('workos.organization_memberships', 'om', [
9
+ 'organization_id',
10
+ 'user_id',
11
+ ]),
12
+ users: store.collection('workos.users', 'user', ['email', 'external_id']),
13
+ sessions: store.collection('workos.sessions', 'session', ['user_id']),
14
+ emailVerifications: store.collection('workos.email_verifications', 'email_verification', [
15
+ 'user_id',
16
+ ]),
17
+ passwordResets: store.collection('workos.password_resets', 'password_reset', ['user_id']),
18
+ magicAuths: store.collection('workos.magic_auths', 'magic_auth', ['user_id']),
19
+ authFactors: store.collection('workos.auth_factors', 'auth_factor', ['user_id']),
20
+ authCodes: store.collection('workos.auth_codes', 'auth_code', ['user_id', 'code']),
21
+ identities: store.collection('workos.identities', 'identity', ['user_id']),
22
+ connections: store.collection('workos.connections', 'conn', ['organization_id']),
23
+ ssoProfiles: store.collection('workos.sso_profiles', 'prof', ['connection_id', 'email']),
24
+ ssoAuthorizations: store.collection('workos.sso_authorizations', 'sso_auth', ['code']),
25
+ pipeConnections: store.collection('workos.pipe_connections', 'pipe_conn', [
26
+ 'user_id',
27
+ 'provider',
28
+ ]),
29
+ refreshTokens: store.collection('workos.refresh_tokens', 'ref', [
30
+ 'token',
31
+ 'user_id',
32
+ 'session_id',
33
+ ]),
34
+ authChallenges: store.collection('workos.auth_challenges', 'auth_challenge', [
35
+ 'user_id',
36
+ 'factor_id',
37
+ ]),
38
+ deviceAuthorizations: store.collection('workos.device_authorizations', 'dev_auth', [
39
+ 'device_code',
40
+ 'user_code',
41
+ ]),
42
+ invitations: store.collection('workos.invitations', 'inv', ['email', 'token', 'organization_id']),
43
+ redirectUris: store.collection('workos.redirect_uris', 'redir', ['uri']),
44
+ corsOrigins: store.collection('workos.cors_origins', 'cors', ['origin']),
45
+ authorizedApplications: store.collection('workos.authorized_applications', 'auth_app', ['user_id']),
46
+ connectedAccounts: store.collection('workos.connected_accounts', 'conn_acct', [
47
+ 'user_id',
48
+ 'provider',
49
+ ]),
50
+ roles: store.collection('workos.roles', 'role', ['slug', 'organization_id']),
51
+ permissions: store.collection('workos.permissions', 'perm', ['slug']),
52
+ rolePermissions: store.collection('workos.role_permissions', 'rp', [
53
+ 'role_id',
54
+ 'permission_id',
55
+ ]),
56
+ authorizationResources: store.collection('workos.authorization_resources', 'auth_res', ['organization_id', 'resource_type_slug']),
57
+ roleAssignments: store.collection('workos.role_assignments', 'ra', [
58
+ 'organization_membership_id',
59
+ 'role_id',
60
+ ]),
61
+ directories: store.collection('workos.directories', 'directory', ['organization_id']),
62
+ directoryUsers: store.collection('workos.directory_users', 'directory_user', [
63
+ 'directory_id',
64
+ 'organization_id',
65
+ ]),
66
+ directoryGroups: store.collection('workos.directory_groups', 'directory_grp', [
67
+ 'directory_id',
68
+ 'organization_id',
69
+ ]),
70
+ auditLogActions: store.collection('workos.audit_log_actions', 'audit_action', ['name']),
71
+ auditLogEvents: store.collection('workos.audit_log_events', 'audit_event', [
72
+ 'organization_id',
73
+ ]),
74
+ auditLogExports: store.collection('workos.audit_log_exports', 'audit_export', [
75
+ 'organization_id',
76
+ ]),
77
+ featureFlags: store.collection('workos.feature_flags', 'ff', ['slug']),
78
+ flagTargets: store.collection('workos.flag_targets', 'ff_target', ['flag_slug', 'resource_id']),
79
+ connectApplications: store.collection('workos.connect_applications', 'connect_app', [
80
+ 'client_id',
81
+ ]),
82
+ clientSecrets: store.collection('workos.client_secrets', 'client_secret', ['application_id']),
83
+ dataIntegrationAuths: store.collection('workos.data_integration_auths', 'di_auth', [
84
+ 'code',
85
+ 'slug',
86
+ ]),
87
+ radarAttempts: store.collection('workos.radar_attempts', 'radar_attempt', ['ip_address']),
88
+ apiKeyRecords: store.collection('workos.api_keys', 'api_key', ['key', 'environment']),
89
+ events: store.collection('workos.events', 'evt', ['event']),
90
+ webhookEndpoints: store.collection('workos.webhook_endpoints', 'we', ['url']),
91
+ };
92
+ }
93
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/emulate/workos/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Store, type Collection } from '../core/index.js';\nimport type {\n WorkOSOrganization,\n WorkOSOrganizationDomain,\n WorkOSOrganizationMembership,\n WorkOSUser,\n WorkOSSession,\n WorkOSEmailVerification,\n WorkOSPasswordReset,\n WorkOSMagicAuth,\n WorkOSAuthenticationFactor,\n WorkOSAuthorizationCode,\n WorkOSIdentity,\n WorkOSConnection,\n WorkOSSSOProfile,\n WorkOSSSOAuthorization,\n WorkOSPipeConnection,\n WorkOSRefreshToken,\n WorkOSAuthenticationChallenge,\n WorkOSDeviceAuthorization,\n WorkOSInvitation,\n WorkOSRedirectUri,\n WorkOSCorsOrigin,\n WorkOSAuthorizedApplication,\n WorkOSConnectedAccount,\n WorkOSRole,\n WorkOSPermission,\n WorkOSRolePermission,\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 WorkOSDataIntegrationAuth,\n WorkOSRadarAttempt,\n WorkOSApiKey,\n WorkOSEvent,\n WorkOSWebhookEndpoint,\n} from './entities.js';\n\nexport interface WorkOSStore {\n organizations: Collection<WorkOSOrganization>;\n organizationDomains: Collection<WorkOSOrganizationDomain>;\n organizationMemberships: Collection<WorkOSOrganizationMembership>;\n users: Collection<WorkOSUser>;\n sessions: Collection<WorkOSSession>;\n emailVerifications: Collection<WorkOSEmailVerification>;\n passwordResets: Collection<WorkOSPasswordReset>;\n magicAuths: Collection<WorkOSMagicAuth>;\n authFactors: Collection<WorkOSAuthenticationFactor>;\n authCodes: Collection<WorkOSAuthorizationCode>;\n identities: Collection<WorkOSIdentity>;\n connections: Collection<WorkOSConnection>;\n ssoProfiles: Collection<WorkOSSSOProfile>;\n ssoAuthorizations: Collection<WorkOSSSOAuthorization>;\n pipeConnections: Collection<WorkOSPipeConnection>;\n refreshTokens: Collection<WorkOSRefreshToken>;\n authChallenges: Collection<WorkOSAuthenticationChallenge>;\n deviceAuthorizations: Collection<WorkOSDeviceAuthorization>;\n invitations: Collection<WorkOSInvitation>;\n redirectUris: Collection<WorkOSRedirectUri>;\n corsOrigins: Collection<WorkOSCorsOrigin>;\n authorizedApplications: Collection<WorkOSAuthorizedApplication>;\n connectedAccounts: Collection<WorkOSConnectedAccount>;\n roles: Collection<WorkOSRole>;\n permissions: Collection<WorkOSPermission>;\n rolePermissions: Collection<WorkOSRolePermission>;\n authorizationResources: Collection<WorkOSAuthorizationResource>;\n roleAssignments: Collection<WorkOSRoleAssignment>;\n directories: Collection<WorkOSDirectory>;\n directoryUsers: Collection<WorkOSDirectoryUser>;\n directoryGroups: Collection<WorkOSDirectoryGroup>;\n auditLogActions: Collection<WorkOSAuditLogAction>;\n auditLogEvents: Collection<WorkOSAuditLogEvent>;\n auditLogExports: Collection<WorkOSAuditLogExport>;\n featureFlags: Collection<WorkOSFeatureFlag>;\n flagTargets: Collection<WorkOSFlagTarget>;\n connectApplications: Collection<WorkOSConnectApplication>;\n clientSecrets: Collection<WorkOSClientSecret>;\n dataIntegrationAuths: Collection<WorkOSDataIntegrationAuth>;\n radarAttempts: Collection<WorkOSRadarAttempt>;\n apiKeyRecords: Collection<WorkOSApiKey>;\n events: Collection<WorkOSEvent>;\n webhookEndpoints: Collection<WorkOSWebhookEndpoint>;\n}\n\nexport function getWorkOSStore(store: Store): WorkOSStore {\n return {\n organizations: store.collection<WorkOSOrganization>('workos.organizations', 'org', ['name', 'external_id']),\n organizationDomains: store.collection<WorkOSOrganizationDomain>('workos.organization_domains', 'org_domain', [\n 'organization_id',\n 'domain',\n ]),\n organizationMemberships: store.collection<WorkOSOrganizationMembership>('workos.organization_memberships', 'om', [\n 'organization_id',\n 'user_id',\n ]),\n users: store.collection<WorkOSUser>('workos.users', 'user', ['email', 'external_id']),\n sessions: store.collection<WorkOSSession>('workos.sessions', 'session', ['user_id']),\n emailVerifications: store.collection<WorkOSEmailVerification>('workos.email_verifications', 'email_verification', [\n 'user_id',\n ]),\n passwordResets: store.collection<WorkOSPasswordReset>('workos.password_resets', 'password_reset', ['user_id']),\n magicAuths: store.collection<WorkOSMagicAuth>('workos.magic_auths', 'magic_auth', ['user_id']),\n authFactors: store.collection<WorkOSAuthenticationFactor>('workos.auth_factors', 'auth_factor', ['user_id']),\n authCodes: store.collection<WorkOSAuthorizationCode>('workos.auth_codes', 'auth_code', ['user_id', 'code']),\n identities: store.collection<WorkOSIdentity>('workos.identities', 'identity', ['user_id']),\n connections: store.collection<WorkOSConnection>('workos.connections', 'conn', ['organization_id']),\n ssoProfiles: store.collection<WorkOSSSOProfile>('workos.sso_profiles', 'prof', ['connection_id', 'email']),\n ssoAuthorizations: store.collection<WorkOSSSOAuthorization>('workos.sso_authorizations', 'sso_auth', ['code']),\n pipeConnections: store.collection<WorkOSPipeConnection>('workos.pipe_connections', 'pipe_conn', [\n 'user_id',\n 'provider',\n ]),\n refreshTokens: store.collection<WorkOSRefreshToken>('workos.refresh_tokens', 'ref', [\n 'token',\n 'user_id',\n 'session_id',\n ]),\n authChallenges: store.collection<WorkOSAuthenticationChallenge>('workos.auth_challenges', 'auth_challenge', [\n 'user_id',\n 'factor_id',\n ]),\n deviceAuthorizations: store.collection<WorkOSDeviceAuthorization>('workos.device_authorizations', 'dev_auth', [\n 'device_code',\n 'user_code',\n ]),\n invitations: store.collection<WorkOSInvitation>('workos.invitations', 'inv', ['email', 'token', 'organization_id']),\n redirectUris: store.collection<WorkOSRedirectUri>('workos.redirect_uris', 'redir', ['uri']),\n corsOrigins: store.collection<WorkOSCorsOrigin>('workos.cors_origins', 'cors', ['origin']),\n authorizedApplications: store.collection<WorkOSAuthorizedApplication>(\n 'workos.authorized_applications',\n 'auth_app',\n ['user_id'],\n ),\n connectedAccounts: store.collection<WorkOSConnectedAccount>('workos.connected_accounts', 'conn_acct', [\n 'user_id',\n 'provider',\n ]),\n roles: store.collection<WorkOSRole>('workos.roles', 'role', ['slug', 'organization_id']),\n permissions: store.collection<WorkOSPermission>('workos.permissions', 'perm', ['slug']),\n rolePermissions: store.collection<WorkOSRolePermission>('workos.role_permissions', 'rp', [\n 'role_id',\n 'permission_id',\n ]),\n authorizationResources: store.collection<WorkOSAuthorizationResource>(\n 'workos.authorization_resources',\n 'auth_res',\n ['organization_id', 'resource_type_slug'],\n ),\n roleAssignments: store.collection<WorkOSRoleAssignment>('workos.role_assignments', 'ra', [\n 'organization_membership_id',\n 'role_id',\n ]),\n directories: store.collection<WorkOSDirectory>('workos.directories', 'directory', ['organization_id']),\n directoryUsers: store.collection<WorkOSDirectoryUser>('workos.directory_users', 'directory_user', [\n 'directory_id',\n 'organization_id',\n ]),\n directoryGroups: store.collection<WorkOSDirectoryGroup>('workos.directory_groups', 'directory_grp', [\n 'directory_id',\n 'organization_id',\n ]),\n auditLogActions: store.collection<WorkOSAuditLogAction>('workos.audit_log_actions', 'audit_action', ['name']),\n auditLogEvents: store.collection<WorkOSAuditLogEvent>('workos.audit_log_events', 'audit_event', [\n 'organization_id',\n ]),\n auditLogExports: store.collection<WorkOSAuditLogExport>('workos.audit_log_exports', 'audit_export', [\n 'organization_id',\n ]),\n featureFlags: store.collection<WorkOSFeatureFlag>('workos.feature_flags', 'ff', ['slug']),\n flagTargets: store.collection<WorkOSFlagTarget>('workos.flag_targets', 'ff_target', ['flag_slug', 'resource_id']),\n connectApplications: store.collection<WorkOSConnectApplication>('workos.connect_applications', 'connect_app', [\n 'client_id',\n ]),\n clientSecrets: store.collection<WorkOSClientSecret>('workos.client_secrets', 'client_secret', ['application_id']),\n dataIntegrationAuths: store.collection<WorkOSDataIntegrationAuth>('workos.data_integration_auths', 'di_auth', [\n 'code',\n 'slug',\n ]),\n radarAttempts: store.collection<WorkOSRadarAttempt>('workos.radar_attempts', 'radar_attempt', ['ip_address']),\n apiKeyRecords: store.collection<WorkOSApiKey>('workos.api_keys', 'api_key', ['key', 'environment']),\n events: store.collection<WorkOSEvent>('workos.events', 'evt', ['event']),\n webhookEndpoints: store.collection<WorkOSWebhookEndpoint>('workos.webhook_endpoints', 'we', ['url']),\n };\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function signWebhookPayload(payload: string, secret: string): string;
@@ -0,0 +1,8 @@
1
+ import { createHmac } from 'node:crypto';
2
+ export function signWebhookPayload(payload, secret) {
3
+ const timestamp = Math.floor(Date.now() / 1000).toString();
4
+ const signedPayload = `${timestamp}.${payload}`;
5
+ const signature = createHmac('sha256', secret).update(signedPayload).digest('hex');
6
+ return `t=${timestamp},v1=${signature}`;
7
+ }
8
+ //# sourceMappingURL=webhook-signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-signer.js","sourceRoot":"","sources":["../../../src/emulate/workos/webhook-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,MAAc;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3D,MAAM,aAAa,GAAG,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEnF,OAAO,KAAK,SAAS,OAAO,SAAS,EAAE,CAAC;AAC1C,CAAC","sourcesContent":["import { createHmac } from 'node:crypto';\n\nexport function signWebhookPayload(payload: string, secret: string): string {\n const timestamp = Math.floor(Date.now() / 1000).toString();\n const signedPayload = `${timestamp}.${payload}`;\n const signature = createHmac('sha256', secret).update(signedPayload).digest('hex');\n\n return `t=${timestamp},v1=${signature}`;\n}\n"]}