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.
- package/README.md +163 -6
- package/dist/bin.js +20 -1
- package/dist/bin.js.map +1 -1
- package/dist/check-coverage.ts +237 -0
- package/dist/commands/dev.d.ts +23 -0
- package/dist/commands/dev.js +139 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/emulate.d.ts +6 -0
- package/dist/commands/emulate.js +64 -0
- package/dist/commands/emulate.js.map +1 -0
- package/dist/emulate/core/id.d.ts +33 -0
- package/dist/emulate/core/id.js +58 -0
- package/dist/emulate/core/id.js.map +1 -0
- package/dist/emulate/core/index.d.ts +8 -0
- package/dist/emulate/core/index.js +8 -0
- package/dist/emulate/core/index.js.map +1 -0
- package/dist/emulate/core/jwt.d.ts +28 -0
- package/dist/emulate/core/jwt.js +78 -0
- package/dist/emulate/core/jwt.js.map +1 -0
- package/dist/emulate/core/middleware/auth.d.ts +18 -0
- package/dist/emulate/core/middleware/auth.js +28 -0
- package/dist/emulate/core/middleware/auth.js.map +1 -0
- package/dist/emulate/core/middleware/error-handler.d.ts +22 -0
- package/dist/emulate/core/middleware/error-handler.js +72 -0
- package/dist/emulate/core/middleware/error-handler.js.map +1 -0
- package/dist/emulate/core/pagination.d.ts +21 -0
- package/dist/emulate/core/pagination.js +35 -0
- package/dist/emulate/core/pagination.js.map +1 -0
- package/dist/emulate/core/plugin.d.ts +15 -0
- package/dist/emulate/core/plugin.js +2 -0
- package/dist/emulate/core/plugin.js.map +1 -0
- package/dist/emulate/core/server.d.ts +17 -0
- package/dist/emulate/core/server.js +116 -0
- package/dist/emulate/core/server.js.map +1 -0
- package/dist/emulate/core/store.d.ts +42 -0
- package/dist/emulate/core/store.js +148 -0
- package/dist/emulate/core/store.js.map +1 -0
- package/dist/emulate/index.d.ts +25 -0
- package/dist/emulate/index.js +47 -0
- package/dist/emulate/index.js.map +1 -0
- package/dist/emulate/workos/entities.d.ts +360 -0
- package/dist/emulate/workos/entities.js +2 -0
- package/dist/emulate/workos/entities.js.map +1 -0
- package/dist/emulate/workos/event-bus.d.ts +12 -0
- package/dist/emulate/workos/event-bus.js +45 -0
- package/dist/emulate/workos/event-bus.js.map +1 -0
- package/dist/emulate/workos/helpers.d.ts +63 -0
- package/dist/emulate/workos/helpers.js +518 -0
- package/dist/emulate/workos/helpers.js.map +1 -0
- package/dist/emulate/workos/index.d.ts +91 -0
- package/dist/emulate/workos/index.js +319 -0
- package/dist/emulate/workos/index.js.map +1 -0
- package/dist/emulate/workos/routes/api-keys.d.ts +2 -0
- package/dist/emulate/workos/routes/api-keys.js +35 -0
- package/dist/emulate/workos/routes/api-keys.js.map +1 -0
- package/dist/emulate/workos/routes/audit-logs.d.ts +2 -0
- package/dist/emulate/workos/routes/audit-logs.js +107 -0
- package/dist/emulate/workos/routes/audit-logs.js.map +1 -0
- package/dist/emulate/workos/routes/auth-challenges.d.ts +2 -0
- package/dist/emulate/workos/routes/auth-challenges.js +51 -0
- package/dist/emulate/workos/routes/auth-challenges.js.map +1 -0
- package/dist/emulate/workos/routes/auth-factors.d.ts +2 -0
- package/dist/emulate/workos/routes/auth-factors.js +51 -0
- package/dist/emulate/workos/routes/auth-factors.js.map +1 -0
- package/dist/emulate/workos/routes/auth.d.ts +2 -0
- package/dist/emulate/workos/routes/auth.js +349 -0
- package/dist/emulate/workos/routes/auth.js.map +1 -0
- package/dist/emulate/workos/routes/authorization-checks.d.ts +10 -0
- package/dist/emulate/workos/routes/authorization-checks.js +135 -0
- package/dist/emulate/workos/routes/authorization-checks.js.map +1 -0
- package/dist/emulate/workos/routes/authorization-org-roles.d.ts +2 -0
- package/dist/emulate/workos/routes/authorization-org-roles.js +206 -0
- package/dist/emulate/workos/routes/authorization-org-roles.js.map +1 -0
- package/dist/emulate/workos/routes/authorization-permissions.d.ts +2 -0
- package/dist/emulate/workos/routes/authorization-permissions.js +78 -0
- package/dist/emulate/workos/routes/authorization-permissions.js.map +1 -0
- package/dist/emulate/workos/routes/authorization-resources.d.ts +2 -0
- package/dist/emulate/workos/routes/authorization-resources.js +128 -0
- package/dist/emulate/workos/routes/authorization-resources.js.map +1 -0
- package/dist/emulate/workos/routes/authorization-roles.d.ts +2 -0
- package/dist/emulate/workos/routes/authorization-roles.js +136 -0
- package/dist/emulate/workos/routes/authorization-roles.js.map +1 -0
- package/dist/emulate/workos/routes/config.d.ts +2 -0
- package/dist/emulate/workos/routes/config.js +56 -0
- package/dist/emulate/workos/routes/config.js.map +1 -0
- package/dist/emulate/workos/routes/connect.d.ts +2 -0
- package/dist/emulate/workos/routes/connect.js +69 -0
- package/dist/emulate/workos/routes/connect.js.map +1 -0
- package/dist/emulate/workos/routes/connections.d.ts +2 -0
- package/dist/emulate/workos/routes/connections.js +77 -0
- package/dist/emulate/workos/routes/connections.js.map +1 -0
- package/dist/emulate/workos/routes/data-integrations.d.ts +2 -0
- package/dist/emulate/workos/routes/data-integrations.js +55 -0
- package/dist/emulate/workos/routes/data-integrations.js.map +1 -0
- package/dist/emulate/workos/routes/directories.d.ts +2 -0
- package/dist/emulate/workos/routes/directories.js +106 -0
- package/dist/emulate/workos/routes/directories.js.map +1 -0
- package/dist/emulate/workos/routes/email-verification.d.ts +2 -0
- package/dist/emulate/workos/routes/email-verification.js +49 -0
- package/dist/emulate/workos/routes/email-verification.js.map +1 -0
- package/dist/emulate/workos/routes/events.d.ts +2 -0
- package/dist/emulate/workos/routes/events.js +21 -0
- package/dist/emulate/workos/routes/events.js.map +1 -0
- package/dist/emulate/workos/routes/feature-flags.d.ts +2 -0
- package/dist/emulate/workos/routes/feature-flags.js +131 -0
- package/dist/emulate/workos/routes/feature-flags.js.map +1 -0
- package/dist/emulate/workos/routes/invitations.d.ts +2 -0
- package/dist/emulate/workos/routes/invitations.js +125 -0
- package/dist/emulate/workos/routes/invitations.js.map +1 -0
- package/dist/emulate/workos/routes/legacy-mfa.d.ts +2 -0
- package/dist/emulate/workos/routes/legacy-mfa.js +75 -0
- package/dist/emulate/workos/routes/legacy-mfa.js.map +1 -0
- package/dist/emulate/workos/routes/magic-auth.d.ts +2 -0
- package/dist/emulate/workos/routes/magic-auth.js +32 -0
- package/dist/emulate/workos/routes/magic-auth.js.map +1 -0
- package/dist/emulate/workos/routes/memberships.d.ts +2 -0
- package/dist/emulate/workos/routes/memberships.js +118 -0
- package/dist/emulate/workos/routes/memberships.js.map +1 -0
- package/dist/emulate/workos/routes/organization-domains.d.ts +2 -0
- package/dist/emulate/workos/routes/organization-domains.js +58 -0
- package/dist/emulate/workos/routes/organization-domains.js.map +1 -0
- package/dist/emulate/workos/routes/organizations.d.ts +2 -0
- package/dist/emulate/workos/routes/organizations.js +133 -0
- package/dist/emulate/workos/routes/organizations.js.map +1 -0
- package/dist/emulate/workos/routes/password-reset.d.ts +2 -0
- package/dist/emulate/workos/routes/password-reset.js +61 -0
- package/dist/emulate/workos/routes/password-reset.js.map +1 -0
- package/dist/emulate/workos/routes/pipes.d.ts +2 -0
- package/dist/emulate/workos/routes/pipes.js +86 -0
- package/dist/emulate/workos/routes/pipes.js.map +1 -0
- package/dist/emulate/workos/routes/portal.d.ts +2 -0
- package/dist/emulate/workos/routes/portal.js +18 -0
- package/dist/emulate/workos/routes/portal.js.map +1 -0
- package/dist/emulate/workos/routes/radar.d.ts +2 -0
- package/dist/emulate/workos/routes/radar.js +45 -0
- package/dist/emulate/workos/routes/radar.js.map +1 -0
- package/dist/emulate/workos/routes/sessions.d.ts +2 -0
- package/dist/emulate/workos/routes/sessions.js +51 -0
- package/dist/emulate/workos/routes/sessions.js.map +1 -0
- package/dist/emulate/workos/routes/sso.d.ts +2 -0
- package/dist/emulate/workos/routes/sso.js +160 -0
- package/dist/emulate/workos/routes/sso.js.map +1 -0
- package/dist/emulate/workos/routes/user-features.d.ts +2 -0
- package/dist/emulate/workos/routes/user-features.js +50 -0
- package/dist/emulate/workos/routes/user-features.js.map +1 -0
- package/dist/emulate/workos/routes/users.d.ts +2 -0
- package/dist/emulate/workos/routes/users.js +133 -0
- package/dist/emulate/workos/routes/users.js.map +1 -0
- package/dist/emulate/workos/routes/webhook-endpoints.d.ts +2 -0
- package/dist/emulate/workos/routes/webhook-endpoints.js +70 -0
- package/dist/emulate/workos/routes/webhook-endpoints.js.map +1 -0
- package/dist/emulate/workos/routes/widgets.d.ts +2 -0
- package/dist/emulate/workos/routes/widgets.js +27 -0
- package/dist/emulate/workos/routes/widgets.js.map +1 -0
- package/dist/emulate/workos/store.d.ts +48 -0
- package/dist/emulate/workos/store.js +93 -0
- package/dist/emulate/workos/store.js.map +1 -0
- package/dist/emulate/workos/webhook-signer.d.ts +1 -0
- package/dist/emulate/workos/webhook-signer.js +8 -0
- package/dist/emulate/workos/webhook-signer.js.map +1 -0
- package/dist/gen-routes-lib.spec.ts +659 -0
- package/dist/gen-routes-lib.ts +647 -0
- package/dist/gen-routes.ts +96 -0
- package/dist/lib/dev-command.d.ts +26 -0
- package/dist/lib/dev-command.js +122 -0
- package/dist/lib/dev-command.js.map +1 -0
- package/dist/utils/help-json.js +23 -0
- package/dist/utils/help-json.js.map +1 -1
- 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,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,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"]}
|