workos 0.11.1 → 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 (172) hide show
  1. package/README.md +163 -6
  2. package/dist/bin.js +22 -2
  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/commands/seed.d.ts +2 -0
  12. package/dist/commands/seed.js +60 -1
  13. package/dist/commands/seed.js.map +1 -1
  14. package/dist/emulate/core/id.d.ts +33 -0
  15. package/dist/emulate/core/id.js +58 -0
  16. package/dist/emulate/core/id.js.map +1 -0
  17. package/dist/emulate/core/index.d.ts +8 -0
  18. package/dist/emulate/core/index.js +8 -0
  19. package/dist/emulate/core/index.js.map +1 -0
  20. package/dist/emulate/core/jwt.d.ts +28 -0
  21. package/dist/emulate/core/jwt.js +78 -0
  22. package/dist/emulate/core/jwt.js.map +1 -0
  23. package/dist/emulate/core/middleware/auth.d.ts +18 -0
  24. package/dist/emulate/core/middleware/auth.js +28 -0
  25. package/dist/emulate/core/middleware/auth.js.map +1 -0
  26. package/dist/emulate/core/middleware/error-handler.d.ts +22 -0
  27. package/dist/emulate/core/middleware/error-handler.js +72 -0
  28. package/dist/emulate/core/middleware/error-handler.js.map +1 -0
  29. package/dist/emulate/core/pagination.d.ts +21 -0
  30. package/dist/emulate/core/pagination.js +35 -0
  31. package/dist/emulate/core/pagination.js.map +1 -0
  32. package/dist/emulate/core/plugin.d.ts +15 -0
  33. package/dist/emulate/core/plugin.js +2 -0
  34. package/dist/emulate/core/plugin.js.map +1 -0
  35. package/dist/emulate/core/server.d.ts +17 -0
  36. package/dist/emulate/core/server.js +116 -0
  37. package/dist/emulate/core/server.js.map +1 -0
  38. package/dist/emulate/core/store.d.ts +42 -0
  39. package/dist/emulate/core/store.js +148 -0
  40. package/dist/emulate/core/store.js.map +1 -0
  41. package/dist/emulate/index.d.ts +25 -0
  42. package/dist/emulate/index.js +47 -0
  43. package/dist/emulate/index.js.map +1 -0
  44. package/dist/emulate/workos/entities.d.ts +360 -0
  45. package/dist/emulate/workos/entities.js +2 -0
  46. package/dist/emulate/workos/entities.js.map +1 -0
  47. package/dist/emulate/workos/event-bus.d.ts +12 -0
  48. package/dist/emulate/workos/event-bus.js +45 -0
  49. package/dist/emulate/workos/event-bus.js.map +1 -0
  50. package/dist/emulate/workos/helpers.d.ts +63 -0
  51. package/dist/emulate/workos/helpers.js +518 -0
  52. package/dist/emulate/workos/helpers.js.map +1 -0
  53. package/dist/emulate/workos/index.d.ts +91 -0
  54. package/dist/emulate/workos/index.js +319 -0
  55. package/dist/emulate/workos/index.js.map +1 -0
  56. package/dist/emulate/workos/routes/api-keys.d.ts +2 -0
  57. package/dist/emulate/workos/routes/api-keys.js +35 -0
  58. package/dist/emulate/workos/routes/api-keys.js.map +1 -0
  59. package/dist/emulate/workos/routes/audit-logs.d.ts +2 -0
  60. package/dist/emulate/workos/routes/audit-logs.js +107 -0
  61. package/dist/emulate/workos/routes/audit-logs.js.map +1 -0
  62. package/dist/emulate/workos/routes/auth-challenges.d.ts +2 -0
  63. package/dist/emulate/workos/routes/auth-challenges.js +51 -0
  64. package/dist/emulate/workos/routes/auth-challenges.js.map +1 -0
  65. package/dist/emulate/workos/routes/auth-factors.d.ts +2 -0
  66. package/dist/emulate/workos/routes/auth-factors.js +51 -0
  67. package/dist/emulate/workos/routes/auth-factors.js.map +1 -0
  68. package/dist/emulate/workos/routes/auth.d.ts +2 -0
  69. package/dist/emulate/workos/routes/auth.js +349 -0
  70. package/dist/emulate/workos/routes/auth.js.map +1 -0
  71. package/dist/emulate/workos/routes/authorization-checks.d.ts +10 -0
  72. package/dist/emulate/workos/routes/authorization-checks.js +135 -0
  73. package/dist/emulate/workos/routes/authorization-checks.js.map +1 -0
  74. package/dist/emulate/workos/routes/authorization-org-roles.d.ts +2 -0
  75. package/dist/emulate/workos/routes/authorization-org-roles.js +206 -0
  76. package/dist/emulate/workos/routes/authorization-org-roles.js.map +1 -0
  77. package/dist/emulate/workos/routes/authorization-permissions.d.ts +2 -0
  78. package/dist/emulate/workos/routes/authorization-permissions.js +78 -0
  79. package/dist/emulate/workos/routes/authorization-permissions.js.map +1 -0
  80. package/dist/emulate/workos/routes/authorization-resources.d.ts +2 -0
  81. package/dist/emulate/workos/routes/authorization-resources.js +128 -0
  82. package/dist/emulate/workos/routes/authorization-resources.js.map +1 -0
  83. package/dist/emulate/workos/routes/authorization-roles.d.ts +2 -0
  84. package/dist/emulate/workos/routes/authorization-roles.js +136 -0
  85. package/dist/emulate/workos/routes/authorization-roles.js.map +1 -0
  86. package/dist/emulate/workos/routes/config.d.ts +2 -0
  87. package/dist/emulate/workos/routes/config.js +56 -0
  88. package/dist/emulate/workos/routes/config.js.map +1 -0
  89. package/dist/emulate/workos/routes/connect.d.ts +2 -0
  90. package/dist/emulate/workos/routes/connect.js +69 -0
  91. package/dist/emulate/workos/routes/connect.js.map +1 -0
  92. package/dist/emulate/workos/routes/connections.d.ts +2 -0
  93. package/dist/emulate/workos/routes/connections.js +77 -0
  94. package/dist/emulate/workos/routes/connections.js.map +1 -0
  95. package/dist/emulate/workos/routes/data-integrations.d.ts +2 -0
  96. package/dist/emulate/workos/routes/data-integrations.js +55 -0
  97. package/dist/emulate/workos/routes/data-integrations.js.map +1 -0
  98. package/dist/emulate/workos/routes/directories.d.ts +2 -0
  99. package/dist/emulate/workos/routes/directories.js +106 -0
  100. package/dist/emulate/workos/routes/directories.js.map +1 -0
  101. package/dist/emulate/workos/routes/email-verification.d.ts +2 -0
  102. package/dist/emulate/workos/routes/email-verification.js +49 -0
  103. package/dist/emulate/workos/routes/email-verification.js.map +1 -0
  104. package/dist/emulate/workos/routes/events.d.ts +2 -0
  105. package/dist/emulate/workos/routes/events.js +21 -0
  106. package/dist/emulate/workos/routes/events.js.map +1 -0
  107. package/dist/emulate/workos/routes/feature-flags.d.ts +2 -0
  108. package/dist/emulate/workos/routes/feature-flags.js +131 -0
  109. package/dist/emulate/workos/routes/feature-flags.js.map +1 -0
  110. package/dist/emulate/workos/routes/invitations.d.ts +2 -0
  111. package/dist/emulate/workos/routes/invitations.js +125 -0
  112. package/dist/emulate/workos/routes/invitations.js.map +1 -0
  113. package/dist/emulate/workos/routes/legacy-mfa.d.ts +2 -0
  114. package/dist/emulate/workos/routes/legacy-mfa.js +75 -0
  115. package/dist/emulate/workos/routes/legacy-mfa.js.map +1 -0
  116. package/dist/emulate/workos/routes/magic-auth.d.ts +2 -0
  117. package/dist/emulate/workos/routes/magic-auth.js +32 -0
  118. package/dist/emulate/workos/routes/magic-auth.js.map +1 -0
  119. package/dist/emulate/workos/routes/memberships.d.ts +2 -0
  120. package/dist/emulate/workos/routes/memberships.js +118 -0
  121. package/dist/emulate/workos/routes/memberships.js.map +1 -0
  122. package/dist/emulate/workos/routes/organization-domains.d.ts +2 -0
  123. package/dist/emulate/workos/routes/organization-domains.js +58 -0
  124. package/dist/emulate/workos/routes/organization-domains.js.map +1 -0
  125. package/dist/emulate/workos/routes/organizations.d.ts +2 -0
  126. package/dist/emulate/workos/routes/organizations.js +133 -0
  127. package/dist/emulate/workos/routes/organizations.js.map +1 -0
  128. package/dist/emulate/workos/routes/password-reset.d.ts +2 -0
  129. package/dist/emulate/workos/routes/password-reset.js +61 -0
  130. package/dist/emulate/workos/routes/password-reset.js.map +1 -0
  131. package/dist/emulate/workos/routes/pipes.d.ts +2 -0
  132. package/dist/emulate/workos/routes/pipes.js +86 -0
  133. package/dist/emulate/workos/routes/pipes.js.map +1 -0
  134. package/dist/emulate/workos/routes/portal.d.ts +2 -0
  135. package/dist/emulate/workos/routes/portal.js +18 -0
  136. package/dist/emulate/workos/routes/portal.js.map +1 -0
  137. package/dist/emulate/workos/routes/radar.d.ts +2 -0
  138. package/dist/emulate/workos/routes/radar.js +45 -0
  139. package/dist/emulate/workos/routes/radar.js.map +1 -0
  140. package/dist/emulate/workos/routes/sessions.d.ts +2 -0
  141. package/dist/emulate/workos/routes/sessions.js +51 -0
  142. package/dist/emulate/workos/routes/sessions.js.map +1 -0
  143. package/dist/emulate/workos/routes/sso.d.ts +2 -0
  144. package/dist/emulate/workos/routes/sso.js +160 -0
  145. package/dist/emulate/workos/routes/sso.js.map +1 -0
  146. package/dist/emulate/workos/routes/user-features.d.ts +2 -0
  147. package/dist/emulate/workos/routes/user-features.js +50 -0
  148. package/dist/emulate/workos/routes/user-features.js.map +1 -0
  149. package/dist/emulate/workos/routes/users.d.ts +2 -0
  150. package/dist/emulate/workos/routes/users.js +133 -0
  151. package/dist/emulate/workos/routes/users.js.map +1 -0
  152. package/dist/emulate/workos/routes/webhook-endpoints.d.ts +2 -0
  153. package/dist/emulate/workos/routes/webhook-endpoints.js +70 -0
  154. package/dist/emulate/workos/routes/webhook-endpoints.js.map +1 -0
  155. package/dist/emulate/workos/routes/widgets.d.ts +2 -0
  156. package/dist/emulate/workos/routes/widgets.js +27 -0
  157. package/dist/emulate/workos/routes/widgets.js.map +1 -0
  158. package/dist/emulate/workos/store.d.ts +48 -0
  159. package/dist/emulate/workos/store.js +93 -0
  160. package/dist/emulate/workos/store.js.map +1 -0
  161. package/dist/emulate/workos/webhook-signer.d.ts +1 -0
  162. package/dist/emulate/workos/webhook-signer.js +8 -0
  163. package/dist/emulate/workos/webhook-signer.js.map +1 -0
  164. package/dist/gen-routes-lib.spec.ts +659 -0
  165. package/dist/gen-routes-lib.ts +647 -0
  166. package/dist/gen-routes.ts +96 -0
  167. package/dist/lib/dev-command.d.ts +26 -0
  168. package/dist/lib/dev-command.js +122 -0
  169. package/dist/lib/dev-command.js.map +1 -0
  170. package/dist/utils/help-json.js +31 -0
  171. package/dist/utils/help-json.js.map +1 -1
  172. package/package.json +20 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization-checks.js","sourceRoot":"","sources":["../../../../src/emulate/workos/routes/authorization-checks.ts"],"names":[],"mappings":"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","sourcesContent":["import { type RouteContext, notFound, validationError, parseJsonBody } from '../../core/index.js';\nimport { getWorkOSStore } from '../store.js';\nimport { formatRoleAssignment, formatAuthorizationResource, parseListParams } from '../helpers.js';\n\n/**\n * Gather all permission slugs for a given membership:\n * 1. From the membership's role (role.slug field)\n * 2. From any additional role assignments\n */\nfunction getPermissionsForMembership(ws: ReturnType<typeof getWorkOSStore>, membershipId: string): Set<string> {\n const membership = ws.organizationMemberships.get(membershipId);\n if (!membership) return new Set();\n\n const permSlugs = new Set<string>();\n\n // Permissions from the membership's primary role\n const primaryRole = ws.roles\n .findBy('slug', membership.role.slug)\n .find((r) => r.organization_id === membership.organization_id || r.type === 'EnvironmentRole');\n if (primaryRole) {\n const rps = ws.rolePermissions.findBy('role_id', primaryRole.id);\n for (const rp of rps) {\n const perm = ws.permissions.get(rp.permission_id);\n if (perm) permSlugs.add(perm.slug);\n }\n }\n\n // Permissions from additional role assignments\n const assignments = ws.roleAssignments.findBy('organization_membership_id', membershipId);\n for (const assignment of assignments) {\n const role = ws.roles.get(assignment.role_id);\n if (!role) continue;\n const rps = ws.rolePermissions.findBy('role_id', role.id);\n for (const rp of rps) {\n const perm = ws.permissions.get(rp.permission_id);\n if (perm) permSlugs.add(perm.slug);\n }\n }\n\n return permSlugs;\n}\n\nexport function authorizationCheckRoutes(ctx: RouteContext): void {\n const { app, store } = ctx;\n\n // Permission check\n app.post('/authorization/organization_memberships/:id/check', async (c) => {\n const ws = getWorkOSStore(store);\n const membershipId = c.req.param('id');\n const membership = ws.organizationMemberships.get(membershipId);\n if (!membership) throw notFound('OrganizationMembership');\n\n const body = await parseJsonBody(c);\n const permission = body.permission as string;\n if (!permission) {\n throw validationError('permission is required', [{ field: 'permission', code: 'required' }]);\n }\n\n const permSlugs = getPermissionsForMembership(ws, membershipId);\n return c.json({ authorized: permSlugs.has(permission) });\n });\n\n // List resources accessible to a membership (all resources in the membership's org)\n app.get('/authorization/organization_memberships/:id/resources', (c) => {\n const ws = getWorkOSStore(store);\n const membershipId = c.req.param('id');\n const membership = ws.organizationMemberships.get(membershipId);\n if (!membership) throw notFound('OrganizationMembership');\n\n const url = new URL(c.req.url);\n const params = parseListParams(url);\n\n const result = ws.authorizationResources.list({\n ...params,\n filter: (r) => r.organization_id === membership.organization_id,\n });\n\n return c.json({\n object: 'list',\n data: result.data.map(formatAuthorizationResource),\n list_metadata: result.list_metadata,\n });\n });\n\n // List role assignments for a membership\n app.get('/authorization/organization_memberships/:id/role_assignments', (c) => {\n const ws = getWorkOSStore(store);\n const membershipId = c.req.param('id');\n const membership = ws.organizationMemberships.get(membershipId);\n if (!membership) throw notFound('OrganizationMembership');\n\n const url = new URL(c.req.url);\n const params = parseListParams(url);\n\n const result = ws.roleAssignments.list({\n ...params,\n filter: (ra) => ra.organization_membership_id === membershipId,\n });\n\n return c.json({\n object: 'list',\n data: result.data.map(formatRoleAssignment),\n list_metadata: result.list_metadata,\n });\n });\n\n // Create role assignment\n app.post('/authorization/organization_memberships/:id/role_assignments', async (c) => {\n const ws = getWorkOSStore(store);\n const membershipId = c.req.param('id');\n const membership = ws.organizationMemberships.get(membershipId);\n if (!membership) throw notFound('OrganizationMembership');\n\n const body = await parseJsonBody(c);\n const roleId = body.role_id as string;\n if (!roleId) {\n throw validationError('role_id is required', [{ field: 'role_id', code: 'required' }]);\n }\n\n const role = ws.roles.get(roleId);\n if (!role) throw notFound('Role');\n\n const assignment = ws.roleAssignments.insert({\n object: 'role_assignment',\n organization_membership_id: membershipId,\n role_id: roleId,\n });\n\n return c.json(formatRoleAssignment(assignment), 201);\n });\n\n // Delete role assignment\n app.delete('/authorization/organization_memberships/:id/role_assignments/:assignmentId', (c) => {\n const ws = getWorkOSStore(store);\n const membershipId = c.req.param('id');\n const assignmentId = c.req.param('assignmentId');\n\n const membership = ws.organizationMemberships.get(membershipId);\n if (!membership) throw notFound('OrganizationMembership');\n\n const assignment = ws.roleAssignments.get(assignmentId);\n if (!assignment || assignment.organization_membership_id !== membershipId) {\n throw notFound('RoleAssignment');\n }\n\n ws.roleAssignments.delete(assignmentId);\n return c.body(null, 204);\n });\n}\n\nexport { getPermissionsForMembership };\n"]}
@@ -0,0 +1,2 @@
1
+ import { type RouteContext } from '../../core/index.js';
2
+ export declare function authorizationOrgRoleRoutes(ctx: RouteContext): void;
@@ -0,0 +1,206 @@
1
+ import { notFound, validationError, parseJsonBody } from '../../core/index.js';
2
+ import { getWorkOSStore } from '../store.js';
3
+ import { formatRole, formatPermission, parseListParams } from '../helpers.js';
4
+ export function authorizationOrgRoleRoutes(ctx) {
5
+ const { app, store } = ctx;
6
+ app.post('/authorization/organizations/:orgId/roles', async (c) => {
7
+ const ws = getWorkOSStore(store);
8
+ const orgId = c.req.param('orgId');
9
+ const org = ws.organizations.get(orgId);
10
+ if (!org)
11
+ throw notFound('Organization');
12
+ const body = await parseJsonBody(c);
13
+ const slug = body.slug;
14
+ const name = body.name;
15
+ if (!slug || typeof slug !== 'string') {
16
+ throw validationError('slug is required', [{ field: 'slug', code: 'required' }]);
17
+ }
18
+ if (!name || typeof name !== 'string') {
19
+ throw validationError('name is required', [{ field: 'name', code: 'required' }]);
20
+ }
21
+ // Check uniqueness within this org
22
+ const existing = ws.roles
23
+ .findBy('organization_id', orgId)
24
+ .find((r) => r.slug === slug && r.type === 'OrganizationRole');
25
+ if (existing) {
26
+ throw validationError('Role with this slug already exists in this organization', [
27
+ { field: 'slug', code: 'duplicate' },
28
+ ]);
29
+ }
30
+ const role = ws.roles.insert({
31
+ object: 'role',
32
+ slug,
33
+ name,
34
+ description: body.description ?? null,
35
+ type: 'OrganizationRole',
36
+ organization_id: orgId,
37
+ is_default_role: Boolean(body.is_default_role),
38
+ priority: typeof body.priority === 'number' ? body.priority : 0,
39
+ });
40
+ return c.json(formatRole(role), 201);
41
+ });
42
+ app.get('/authorization/organizations/:orgId/roles', (c) => {
43
+ const ws = getWorkOSStore(store);
44
+ const orgId = c.req.param('orgId');
45
+ const url = new URL(c.req.url);
46
+ const params = parseListParams(url);
47
+ const result = ws.roles.list({
48
+ ...params,
49
+ filter: (r) => r.organization_id === orgId && r.type === 'OrganizationRole',
50
+ });
51
+ return c.json({
52
+ object: 'list',
53
+ data: result.data.map(formatRole),
54
+ list_metadata: result.list_metadata,
55
+ });
56
+ });
57
+ // Priority ordering — must be registered before :slug routes
58
+ app.put('/authorization/organizations/:orgId/roles/priority', async (c) => {
59
+ const ws = getWorkOSStore(store);
60
+ const orgId = c.req.param('orgId');
61
+ const body = await parseJsonBody(c);
62
+ const slugs = body.slugs;
63
+ if (!Array.isArray(slugs)) {
64
+ throw validationError('slugs must be an array', [{ field: 'slugs', code: 'invalid' }]);
65
+ }
66
+ for (let i = 0; i < slugs.length; i++) {
67
+ const role = ws.roles
68
+ .findBy('organization_id', orgId)
69
+ .find((r) => r.slug === slugs[i] && r.type === 'OrganizationRole');
70
+ if (!role)
71
+ throw notFound('Role');
72
+ ws.roles.update(role.id, { priority: i });
73
+ }
74
+ const roles = ws.roles
75
+ .findBy('organization_id', orgId)
76
+ .filter((r) => r.type === 'OrganizationRole')
77
+ .sort((a, b) => a.priority - b.priority);
78
+ return c.json({
79
+ object: 'list',
80
+ data: roles.map(formatRole),
81
+ list_metadata: { before: null, after: null },
82
+ });
83
+ });
84
+ app.get('/authorization/organizations/:orgId/roles/:slug', (c) => {
85
+ const ws = getWorkOSStore(store);
86
+ const orgId = c.req.param('orgId');
87
+ const slug = c.req.param('slug');
88
+ const role = ws.roles
89
+ .findBy('organization_id', orgId)
90
+ .find((r) => r.slug === slug && r.type === 'OrganizationRole');
91
+ if (!role)
92
+ throw notFound('Role');
93
+ return c.json(formatRole(role));
94
+ });
95
+ app.put('/authorization/organizations/:orgId/roles/:slug', async (c) => {
96
+ const ws = getWorkOSStore(store);
97
+ const orgId = c.req.param('orgId');
98
+ const slug = c.req.param('slug');
99
+ const role = ws.roles
100
+ .findBy('organization_id', orgId)
101
+ .find((r) => r.slug === slug && r.type === 'OrganizationRole');
102
+ if (!role)
103
+ throw notFound('Role');
104
+ const body = await parseJsonBody(c);
105
+ const updates = {};
106
+ if ('name' in body)
107
+ updates.name = body.name;
108
+ if ('description' in body)
109
+ updates.description = body.description ?? null;
110
+ if ('is_default_role' in body)
111
+ updates.is_default_role = Boolean(body.is_default_role);
112
+ if ('priority' in body)
113
+ updates.priority = body.priority;
114
+ const updated = ws.roles.update(role.id, updates);
115
+ return c.json(formatRole(updated));
116
+ });
117
+ app.delete('/authorization/organizations/:orgId/roles/:slug', (c) => {
118
+ const ws = getWorkOSStore(store);
119
+ const orgId = c.req.param('orgId');
120
+ const slug = c.req.param('slug');
121
+ const role = ws.roles
122
+ .findBy('organization_id', orgId)
123
+ .find((r) => r.slug === slug && r.type === 'OrganizationRole');
124
+ if (!role)
125
+ throw notFound('Role');
126
+ // Cascade: remove role-permission joins and role assignments
127
+ const rps = ws.rolePermissions.findBy('role_id', role.id);
128
+ for (const rp of rps)
129
+ ws.rolePermissions.delete(rp.id);
130
+ const ras = ws.roleAssignments.findBy('role_id', role.id);
131
+ for (const ra of ras)
132
+ ws.roleAssignments.delete(ra.id);
133
+ ws.roles.delete(role.id);
134
+ return c.body(null, 204);
135
+ });
136
+ // Org role permissions
137
+ app.get('/authorization/organizations/:orgId/roles/:slug/permissions', (c) => {
138
+ const ws = getWorkOSStore(store);
139
+ const orgId = c.req.param('orgId');
140
+ const slug = c.req.param('slug');
141
+ const role = ws.roles
142
+ .findBy('organization_id', orgId)
143
+ .find((r) => r.slug === slug && r.type === 'OrganizationRole');
144
+ if (!role)
145
+ throw notFound('Role');
146
+ const rps = ws.rolePermissions.findBy('role_id', role.id);
147
+ const permissions = rps.map((rp) => ws.permissions.get(rp.permission_id)).filter(Boolean);
148
+ return c.json({
149
+ object: 'list',
150
+ data: permissions.map((p) => formatPermission(p)),
151
+ list_metadata: { before: null, after: null },
152
+ });
153
+ });
154
+ app.post('/authorization/organizations/:orgId/roles/:slug/permissions', async (c) => {
155
+ const ws = getWorkOSStore(store);
156
+ const orgId = c.req.param('orgId');
157
+ const slug = c.req.param('slug');
158
+ const role = ws.roles
159
+ .findBy('organization_id', orgId)
160
+ .find((r) => r.slug === slug && r.type === 'OrganizationRole');
161
+ if (!role)
162
+ throw notFound('Role');
163
+ const body = await parseJsonBody(c);
164
+ const permissionSlugs = body.permissions;
165
+ if (!Array.isArray(permissionSlugs)) {
166
+ throw validationError('permissions must be an array of slugs', [{ field: 'permissions', code: 'invalid' }]);
167
+ }
168
+ // Replace all
169
+ const existing = ws.rolePermissions.findBy('role_id', role.id);
170
+ for (const rp of existing)
171
+ ws.rolePermissions.delete(rp.id);
172
+ for (const permSlug of permissionSlugs) {
173
+ const perm = ws.permissions.findOneBy('slug', permSlug);
174
+ if (!perm)
175
+ throw notFound('Permission');
176
+ ws.rolePermissions.insert({ role_id: role.id, permission_id: perm.id });
177
+ }
178
+ const rps = ws.rolePermissions.findBy('role_id', role.id);
179
+ const permissions = rps.map((rp) => ws.permissions.get(rp.permission_id)).filter(Boolean);
180
+ return c.json({
181
+ object: 'list',
182
+ data: permissions.map((p) => formatPermission(p)),
183
+ list_metadata: { before: null, after: null },
184
+ });
185
+ });
186
+ app.delete('/authorization/organizations/:orgId/roles/:slug/permissions/:permissionSlug', (c) => {
187
+ const ws = getWorkOSStore(store);
188
+ const orgId = c.req.param('orgId');
189
+ const slug = c.req.param('slug');
190
+ const permissionSlug = c.req.param('permissionSlug');
191
+ const role = ws.roles
192
+ .findBy('organization_id', orgId)
193
+ .find((r) => r.slug === slug && r.type === 'OrganizationRole');
194
+ if (!role)
195
+ throw notFound('Role');
196
+ const perm = ws.permissions.findOneBy('slug', permissionSlug);
197
+ if (!perm)
198
+ throw notFound('Permission');
199
+ const rp = ws.rolePermissions.findBy('role_id', role.id).find((rp) => rp.permission_id === perm.id);
200
+ if (!rp)
201
+ throw notFound('RolePermission');
202
+ ws.rolePermissions.delete(rp.id);
203
+ return c.body(null, 204);
204
+ });
205
+ }
206
+ //# sourceMappingURL=authorization-org-roles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization-org-roles.js","sourceRoot":"","sources":["../../../../src/emulate/workos/routes/authorization-org-roles.ts"],"names":[],"mappings":"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","sourcesContent":["import { type RouteContext, notFound, validationError, parseJsonBody } from '../../core/index.js';\nimport { getWorkOSStore } from '../store.js';\nimport { formatRole, formatPermission, parseListParams } from '../helpers.js';\n\nexport function authorizationOrgRoleRoutes(ctx: RouteContext): void {\n const { app, store } = ctx;\n\n app.post('/authorization/organizations/:orgId/roles', async (c) => {\n const ws = getWorkOSStore(store);\n const orgId = c.req.param('orgId');\n const org = ws.organizations.get(orgId);\n if (!org) throw notFound('Organization');\n\n const body = await parseJsonBody(c);\n const slug = body.slug as string;\n const name = body.name as string;\n\n if (!slug || typeof slug !== 'string') {\n throw validationError('slug is required', [{ field: 'slug', code: 'required' }]);\n }\n if (!name || typeof name !== 'string') {\n throw validationError('name is required', [{ field: 'name', code: 'required' }]);\n }\n\n // Check uniqueness within this org\n const existing = ws.roles\n .findBy('organization_id', orgId)\n .find((r) => r.slug === slug && r.type === 'OrganizationRole');\n if (existing) {\n throw validationError('Role with this slug already exists in this organization', [\n { field: 'slug', code: 'duplicate' },\n ]);\n }\n\n const role = ws.roles.insert({\n object: 'role',\n slug,\n name,\n description: (body.description as string) ?? null,\n type: 'OrganizationRole',\n organization_id: orgId,\n is_default_role: Boolean(body.is_default_role),\n priority: typeof body.priority === 'number' ? body.priority : 0,\n });\n\n return c.json(formatRole(role), 201);\n });\n\n app.get('/authorization/organizations/:orgId/roles', (c) => {\n const ws = getWorkOSStore(store);\n const orgId = c.req.param('orgId');\n const url = new URL(c.req.url);\n const params = parseListParams(url);\n\n const result = ws.roles.list({\n ...params,\n filter: (r) => r.organization_id === orgId && r.type === 'OrganizationRole',\n });\n\n return c.json({\n object: 'list',\n data: result.data.map(formatRole),\n list_metadata: result.list_metadata,\n });\n });\n\n // Priority ordering — must be registered before :slug routes\n app.put('/authorization/organizations/:orgId/roles/priority', async (c) => {\n const ws = getWorkOSStore(store);\n const orgId = c.req.param('orgId');\n const body = await parseJsonBody(c);\n const slugs = body.slugs as string[];\n\n if (!Array.isArray(slugs)) {\n throw validationError('slugs must be an array', [{ field: 'slugs', code: 'invalid' }]);\n }\n\n for (let i = 0; i < slugs.length; i++) {\n const role = ws.roles\n .findBy('organization_id', orgId)\n .find((r) => r.slug === slugs[i] && r.type === 'OrganizationRole');\n if (!role) throw notFound('Role');\n ws.roles.update(role.id, { priority: i });\n }\n\n const roles = ws.roles\n .findBy('organization_id', orgId)\n .filter((r) => r.type === 'OrganizationRole')\n .sort((a, b) => a.priority - b.priority);\n\n return c.json({\n object: 'list',\n data: roles.map(formatRole),\n list_metadata: { before: null, after: null },\n });\n });\n\n app.get('/authorization/organizations/:orgId/roles/:slug', (c) => {\n const ws = getWorkOSStore(store);\n const orgId = c.req.param('orgId');\n const slug = c.req.param('slug');\n const role = ws.roles\n .findBy('organization_id', orgId)\n .find((r) => r.slug === slug && r.type === 'OrganizationRole');\n if (!role) throw notFound('Role');\n return c.json(formatRole(role));\n });\n\n app.put('/authorization/organizations/:orgId/roles/:slug', async (c) => {\n const ws = getWorkOSStore(store);\n const orgId = c.req.param('orgId');\n const slug = c.req.param('slug');\n const role = ws.roles\n .findBy('organization_id', orgId)\n .find((r) => r.slug === slug && r.type === 'OrganizationRole');\n if (!role) throw notFound('Role');\n\n const body = await parseJsonBody(c);\n const updates: Record<string, unknown> = {};\n if ('name' in body) updates.name = body.name;\n if ('description' in body) updates.description = body.description ?? null;\n if ('is_default_role' in body) updates.is_default_role = Boolean(body.is_default_role);\n if ('priority' in body) updates.priority = body.priority;\n\n const updated = ws.roles.update(role.id, updates);\n return c.json(formatRole(updated!));\n });\n\n app.delete('/authorization/organizations/:orgId/roles/:slug', (c) => {\n const ws = getWorkOSStore(store);\n const orgId = c.req.param('orgId');\n const slug = c.req.param('slug');\n const role = ws.roles\n .findBy('organization_id', orgId)\n .find((r) => r.slug === slug && r.type === 'OrganizationRole');\n if (!role) throw notFound('Role');\n\n // Cascade: remove role-permission joins and role assignments\n const rps = ws.rolePermissions.findBy('role_id', role.id);\n for (const rp of rps) ws.rolePermissions.delete(rp.id);\n const ras = ws.roleAssignments.findBy('role_id', role.id);\n for (const ra of ras) ws.roleAssignments.delete(ra.id);\n\n ws.roles.delete(role.id);\n return c.body(null, 204);\n });\n\n // Org role permissions\n app.get('/authorization/organizations/:orgId/roles/:slug/permissions', (c) => {\n const ws = getWorkOSStore(store);\n const orgId = c.req.param('orgId');\n const slug = c.req.param('slug');\n const role = ws.roles\n .findBy('organization_id', orgId)\n .find((r) => r.slug === slug && r.type === 'OrganizationRole');\n if (!role) throw notFound('Role');\n\n const rps = ws.rolePermissions.findBy('role_id', role.id);\n const permissions = rps.map((rp) => ws.permissions.get(rp.permission_id)).filter(Boolean);\n\n return c.json({\n object: 'list',\n data: permissions.map((p) => formatPermission(p!)),\n list_metadata: { before: null, after: null },\n });\n });\n\n app.post('/authorization/organizations/:orgId/roles/:slug/permissions', async (c) => {\n const ws = getWorkOSStore(store);\n const orgId = c.req.param('orgId');\n const slug = c.req.param('slug');\n const role = ws.roles\n .findBy('organization_id', orgId)\n .find((r) => r.slug === slug && r.type === 'OrganizationRole');\n if (!role) throw notFound('Role');\n\n const body = await parseJsonBody(c);\n const permissionSlugs = body.permissions as string[];\n if (!Array.isArray(permissionSlugs)) {\n throw validationError('permissions must be an array of slugs', [{ field: 'permissions', code: 'invalid' }]);\n }\n\n // Replace all\n const existing = ws.rolePermissions.findBy('role_id', role.id);\n for (const rp of existing) ws.rolePermissions.delete(rp.id);\n\n for (const permSlug of permissionSlugs) {\n const perm = ws.permissions.findOneBy('slug', permSlug);\n if (!perm) throw notFound('Permission');\n ws.rolePermissions.insert({ role_id: role.id, permission_id: perm.id });\n }\n\n const rps = ws.rolePermissions.findBy('role_id', role.id);\n const permissions = rps.map((rp) => ws.permissions.get(rp.permission_id)).filter(Boolean);\n\n return c.json({\n object: 'list',\n data: permissions.map((p) => formatPermission(p!)),\n list_metadata: { before: null, after: null },\n });\n });\n\n app.delete('/authorization/organizations/:orgId/roles/:slug/permissions/:permissionSlug', (c) => {\n const ws = getWorkOSStore(store);\n const orgId = c.req.param('orgId');\n const slug = c.req.param('slug');\n const permissionSlug = c.req.param('permissionSlug');\n\n const role = ws.roles\n .findBy('organization_id', orgId)\n .find((r) => r.slug === slug && r.type === 'OrganizationRole');\n if (!role) throw notFound('Role');\n\n const perm = ws.permissions.findOneBy('slug', permissionSlug);\n if (!perm) throw notFound('Permission');\n\n const rp = ws.rolePermissions.findBy('role_id', role.id).find((rp) => rp.permission_id === perm.id);\n if (!rp) throw notFound('RolePermission');\n\n ws.rolePermissions.delete(rp.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 authorizationPermissionRoutes(ctx: RouteContext): void;
@@ -0,0 +1,78 @@
1
+ import { notFound, validationError, parseJsonBody } from '../../core/index.js';
2
+ import { getWorkOSStore } from '../store.js';
3
+ import { formatPermission, parseListParams } from '../helpers.js';
4
+ export function authorizationPermissionRoutes(ctx) {
5
+ const { app, store } = ctx;
6
+ app.post('/authorization/permissions', async (c) => {
7
+ const ws = getWorkOSStore(store);
8
+ const body = await parseJsonBody(c);
9
+ const slug = body.slug;
10
+ const name = body.name;
11
+ if (!slug || typeof slug !== 'string') {
12
+ throw validationError('slug is required', [{ field: 'slug', code: 'required' }]);
13
+ }
14
+ if (!name || typeof name !== 'string') {
15
+ throw validationError('name is required', [{ field: 'name', code: 'required' }]);
16
+ }
17
+ const existing = ws.permissions.findOneBy('slug', slug);
18
+ if (existing) {
19
+ throw validationError('Permission with this slug already exists', [{ field: 'slug', code: 'duplicate' }]);
20
+ }
21
+ const permission = ws.permissions.insert({
22
+ object: 'permission',
23
+ slug,
24
+ name,
25
+ description: body.description ?? null,
26
+ });
27
+ return c.json(formatPermission(permission), 201);
28
+ });
29
+ app.get('/authorization/permissions', (c) => {
30
+ const ws = getWorkOSStore(store);
31
+ const url = new URL(c.req.url);
32
+ const params = parseListParams(url);
33
+ const result = ws.permissions.list(params);
34
+ return c.json({
35
+ object: 'list',
36
+ data: result.data.map(formatPermission),
37
+ list_metadata: result.list_metadata,
38
+ });
39
+ });
40
+ app.get('/authorization/permissions/:slug', (c) => {
41
+ const ws = getWorkOSStore(store);
42
+ const slug = c.req.param('slug');
43
+ const permission = ws.permissions.findOneBy('slug', slug);
44
+ if (!permission)
45
+ throw notFound('Permission');
46
+ return c.json(formatPermission(permission));
47
+ });
48
+ app.put('/authorization/permissions/:slug', async (c) => {
49
+ const ws = getWorkOSStore(store);
50
+ const slug = c.req.param('slug');
51
+ const permission = ws.permissions.findOneBy('slug', slug);
52
+ if (!permission)
53
+ throw notFound('Permission');
54
+ const body = await parseJsonBody(c);
55
+ const updates = {};
56
+ if ('name' in body)
57
+ updates.name = body.name;
58
+ if ('description' in body)
59
+ updates.description = body.description ?? null;
60
+ const updated = ws.permissions.update(permission.id, updates);
61
+ return c.json(formatPermission(updated));
62
+ });
63
+ app.delete('/authorization/permissions/:slug', (c) => {
64
+ const ws = getWorkOSStore(store);
65
+ const slug = c.req.param('slug');
66
+ const permission = ws.permissions.findOneBy('slug', slug);
67
+ if (!permission)
68
+ throw notFound('Permission');
69
+ // Cascade: remove from all role-permission joins
70
+ const rps = ws.rolePermissions.findBy('permission_id', permission.id);
71
+ for (const rp of rps) {
72
+ ws.rolePermissions.delete(rp.id);
73
+ }
74
+ ws.permissions.delete(permission.id);
75
+ return c.body(null, 204);
76
+ });
77
+ }
78
+ //# sourceMappingURL=authorization-permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization-permissions.js","sourceRoot":"","sources":["../../../../src/emulate/workos/routes/authorization-permissions.ts"],"names":[],"mappings":"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","sourcesContent":["import { type RouteContext, notFound, validationError, parseJsonBody } from '../../core/index.js';\nimport { getWorkOSStore } from '../store.js';\nimport { formatPermission, parseListParams } from '../helpers.js';\n\nexport function authorizationPermissionRoutes(ctx: RouteContext): void {\n const { app, store } = ctx;\n\n app.post('/authorization/permissions', async (c) => {\n const ws = getWorkOSStore(store);\n const body = await parseJsonBody(c);\n const slug = body.slug as string;\n const name = body.name as string;\n\n if (!slug || typeof slug !== 'string') {\n throw validationError('slug is required', [{ field: 'slug', code: 'required' }]);\n }\n if (!name || typeof name !== 'string') {\n throw validationError('name is required', [{ field: 'name', code: 'required' }]);\n }\n\n const existing = ws.permissions.findOneBy('slug', slug);\n if (existing) {\n throw validationError('Permission with this slug already exists', [{ field: 'slug', code: 'duplicate' }]);\n }\n\n const permission = ws.permissions.insert({\n object: 'permission',\n slug,\n name,\n description: (body.description as string) ?? null,\n });\n\n return c.json(formatPermission(permission), 201);\n });\n\n app.get('/authorization/permissions', (c) => {\n const ws = getWorkOSStore(store);\n const url = new URL(c.req.url);\n const params = parseListParams(url);\n\n const result = ws.permissions.list(params);\n return c.json({\n object: 'list',\n data: result.data.map(formatPermission),\n list_metadata: result.list_metadata,\n });\n });\n\n app.get('/authorization/permissions/:slug', (c) => {\n const ws = getWorkOSStore(store);\n const slug = c.req.param('slug');\n const permission = ws.permissions.findOneBy('slug', slug);\n if (!permission) throw notFound('Permission');\n return c.json(formatPermission(permission));\n });\n\n app.put('/authorization/permissions/:slug', async (c) => {\n const ws = getWorkOSStore(store);\n const slug = c.req.param('slug');\n const permission = ws.permissions.findOneBy('slug', slug);\n if (!permission) throw notFound('Permission');\n\n const body = await parseJsonBody(c);\n const updates: Record<string, unknown> = {};\n if ('name' in body) updates.name = body.name;\n if ('description' in body) updates.description = body.description ?? null;\n\n const updated = ws.permissions.update(permission.id, updates);\n return c.json(formatPermission(updated!));\n });\n\n app.delete('/authorization/permissions/:slug', (c) => {\n const ws = getWorkOSStore(store);\n const slug = c.req.param('slug');\n const permission = ws.permissions.findOneBy('slug', slug);\n if (!permission) throw notFound('Permission');\n\n // Cascade: remove from all role-permission joins\n const rps = ws.rolePermissions.findBy('permission_id', permission.id);\n for (const rp of rps) {\n ws.rolePermissions.delete(rp.id);\n }\n\n ws.permissions.delete(permission.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 authorizationResourceRoutes(ctx: RouteContext): void;
@@ -0,0 +1,128 @@
1
+ import { notFound, validationError, parseJsonBody } from '../../core/index.js';
2
+ import { getWorkOSStore } from '../store.js';
3
+ import { formatAuthorizationResource, formatMembership, parseListParams } from '../helpers.js';
4
+ export function authorizationResourceRoutes(ctx) {
5
+ const { app, store } = ctx;
6
+ app.post('/authorization/resources', async (c) => {
7
+ const ws = getWorkOSStore(store);
8
+ const body = await parseJsonBody(c);
9
+ const resourceTypeSlug = body.resource_type_slug;
10
+ const externalId = body.external_id;
11
+ const organizationId = body.organization_id;
12
+ if (!resourceTypeSlug) {
13
+ throw validationError('resource_type_slug is required', [{ field: 'resource_type_slug', code: 'required' }]);
14
+ }
15
+ if (!externalId) {
16
+ throw validationError('external_id is required', [{ field: 'external_id', code: 'required' }]);
17
+ }
18
+ if (!organizationId) {
19
+ throw validationError('organization_id is required', [{ field: 'organization_id', code: 'required' }]);
20
+ }
21
+ const resource = ws.authorizationResources.insert({
22
+ object: 'authorization_resource',
23
+ resource_type_slug: resourceTypeSlug,
24
+ external_id: externalId,
25
+ organization_id: organizationId,
26
+ metadata: body.metadata ?? {},
27
+ });
28
+ return c.json(formatAuthorizationResource(resource), 201);
29
+ });
30
+ app.get('/authorization/resources', (c) => {
31
+ const ws = getWorkOSStore(store);
32
+ const url = new URL(c.req.url);
33
+ const params = parseListParams(url);
34
+ const organizationId = url.searchParams.get('organization_id') ?? undefined;
35
+ const resourceTypeSlug = url.searchParams.get('resource_type_slug') ?? undefined;
36
+ const result = ws.authorizationResources.list({
37
+ ...params,
38
+ filter: (r) => {
39
+ if (organizationId && r.organization_id !== organizationId)
40
+ return false;
41
+ if (resourceTypeSlug && r.resource_type_slug !== resourceTypeSlug)
42
+ return false;
43
+ return true;
44
+ },
45
+ });
46
+ return c.json({
47
+ object: 'list',
48
+ data: result.data.map(formatAuthorizationResource),
49
+ list_metadata: result.list_metadata,
50
+ });
51
+ });
52
+ app.get('/authorization/resources/:resource_id', (c) => {
53
+ const ws = getWorkOSStore(store);
54
+ const resourceId = c.req.param('resource_id');
55
+ const resource = ws.authorizationResources.get(resourceId);
56
+ if (!resource)
57
+ throw notFound('AuthorizationResource');
58
+ return c.json(formatAuthorizationResource(resource));
59
+ });
60
+ app.put('/authorization/resources/:resource_id', async (c) => {
61
+ const ws = getWorkOSStore(store);
62
+ const resourceId = c.req.param('resource_id');
63
+ const resource = ws.authorizationResources.get(resourceId);
64
+ if (!resource)
65
+ throw notFound('AuthorizationResource');
66
+ const body = await parseJsonBody(c);
67
+ const updates = {};
68
+ if ('metadata' in body)
69
+ updates.metadata = body.metadata;
70
+ const updated = ws.authorizationResources.update(resourceId, updates);
71
+ return c.json(formatAuthorizationResource(updated));
72
+ });
73
+ app.delete('/authorization/resources/:resource_id', (c) => {
74
+ const ws = getWorkOSStore(store);
75
+ const resourceId = c.req.param('resource_id');
76
+ const resource = ws.authorizationResources.get(resourceId);
77
+ if (!resource)
78
+ throw notFound('AuthorizationResource');
79
+ ws.authorizationResources.delete(resourceId);
80
+ return c.body(null, 204);
81
+ });
82
+ // Memberships with access to a resource (by resource ID)
83
+ app.get('/authorization/resources/:resource_id/organization_memberships', (c) => {
84
+ const ws = getWorkOSStore(store);
85
+ const resourceId = c.req.param('resource_id');
86
+ const resource = ws.authorizationResources.get(resourceId);
87
+ if (!resource)
88
+ throw notFound('AuthorizationResource');
89
+ const memberships = ws.organizationMemberships.findBy('organization_id', resource.organization_id);
90
+ return c.json({
91
+ object: 'list',
92
+ data: memberships.map(formatMembership),
93
+ list_metadata: { before: null, after: null },
94
+ });
95
+ });
96
+ // Get resource by type + external ID within an org
97
+ app.get('/authorization/organizations/:orgId/resources/:type_slug/:external_id', (c) => {
98
+ const ws = getWorkOSStore(store);
99
+ const orgId = c.req.param('orgId');
100
+ const typeSlug = c.req.param('type_slug');
101
+ const externalId = c.req.param('external_id');
102
+ const resource = ws.authorizationResources
103
+ .findBy('organization_id', orgId)
104
+ .find((r) => r.resource_type_slug === typeSlug && r.external_id === externalId);
105
+ if (!resource)
106
+ throw notFound('AuthorizationResource');
107
+ return c.json(formatAuthorizationResource(resource));
108
+ });
109
+ // Memberships for resource by type + external ID within an org
110
+ app.get('/authorization/organizations/:orgId/resources/:type_slug/:external_id/organization_memberships', (c) => {
111
+ const ws = getWorkOSStore(store);
112
+ const orgId = c.req.param('orgId');
113
+ const typeSlug = c.req.param('type_slug');
114
+ const externalId = c.req.param('external_id');
115
+ const resource = ws.authorizationResources
116
+ .findBy('organization_id', orgId)
117
+ .find((r) => r.resource_type_slug === typeSlug && r.external_id === externalId);
118
+ if (!resource)
119
+ throw notFound('AuthorizationResource');
120
+ const memberships = ws.organizationMemberships.findBy('organization_id', resource.organization_id);
121
+ return c.json({
122
+ object: 'list',
123
+ data: memberships.map(formatMembership),
124
+ list_metadata: { before: null, after: null },
125
+ });
126
+ });
127
+ }
128
+ //# sourceMappingURL=authorization-resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization-resources.js","sourceRoot":"","sources":["../../../../src/emulate/workos/routes/authorization-resources.ts"],"names":[],"mappings":"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","sourcesContent":["import { type RouteContext, notFound, validationError, parseJsonBody } from '../../core/index.js';\nimport { getWorkOSStore } from '../store.js';\nimport { formatAuthorizationResource, formatMembership, parseListParams } from '../helpers.js';\n\nexport function authorizationResourceRoutes(ctx: RouteContext): void {\n const { app, store } = ctx;\n\n app.post('/authorization/resources', async (c) => {\n const ws = getWorkOSStore(store);\n const body = await parseJsonBody(c);\n\n const resourceTypeSlug = body.resource_type_slug as string;\n const externalId = body.external_id as string;\n const organizationId = body.organization_id as string;\n\n if (!resourceTypeSlug) {\n throw validationError('resource_type_slug is required', [{ field: 'resource_type_slug', code: 'required' }]);\n }\n if (!externalId) {\n throw validationError('external_id is required', [{ field: 'external_id', code: 'required' }]);\n }\n if (!organizationId) {\n throw validationError('organization_id is required', [{ field: 'organization_id', code: 'required' }]);\n }\n\n const resource = ws.authorizationResources.insert({\n object: 'authorization_resource',\n resource_type_slug: resourceTypeSlug,\n external_id: externalId,\n organization_id: organizationId,\n metadata: (body.metadata as Record<string, string>) ?? {},\n });\n\n return c.json(formatAuthorizationResource(resource), 201);\n });\n\n app.get('/authorization/resources', (c) => {\n const ws = getWorkOSStore(store);\n const url = new URL(c.req.url);\n const params = parseListParams(url);\n const organizationId = url.searchParams.get('organization_id') ?? undefined;\n const resourceTypeSlug = url.searchParams.get('resource_type_slug') ?? undefined;\n\n const result = ws.authorizationResources.list({\n ...params,\n filter: (r) => {\n if (organizationId && r.organization_id !== organizationId) return false;\n if (resourceTypeSlug && r.resource_type_slug !== resourceTypeSlug) return false;\n return true;\n },\n });\n\n return c.json({\n object: 'list',\n data: result.data.map(formatAuthorizationResource),\n list_metadata: result.list_metadata,\n });\n });\n\n app.get('/authorization/resources/:resource_id', (c) => {\n const ws = getWorkOSStore(store);\n const resourceId = c.req.param('resource_id');\n const resource = ws.authorizationResources.get(resourceId);\n if (!resource) throw notFound('AuthorizationResource');\n return c.json(formatAuthorizationResource(resource));\n });\n\n app.put('/authorization/resources/:resource_id', async (c) => {\n const ws = getWorkOSStore(store);\n const resourceId = c.req.param('resource_id');\n const resource = ws.authorizationResources.get(resourceId);\n if (!resource) throw notFound('AuthorizationResource');\n\n const body = await parseJsonBody(c);\n const updates: Record<string, unknown> = {};\n if ('metadata' in body) updates.metadata = body.metadata;\n\n const updated = ws.authorizationResources.update(resourceId, updates);\n return c.json(formatAuthorizationResource(updated!));\n });\n\n app.delete('/authorization/resources/:resource_id', (c) => {\n const ws = getWorkOSStore(store);\n const resourceId = c.req.param('resource_id');\n const resource = ws.authorizationResources.get(resourceId);\n if (!resource) throw notFound('AuthorizationResource');\n\n ws.authorizationResources.delete(resourceId);\n return c.body(null, 204);\n });\n\n // Memberships with access to a resource (by resource ID)\n app.get('/authorization/resources/:resource_id/organization_memberships', (c) => {\n const ws = getWorkOSStore(store);\n const resourceId = c.req.param('resource_id');\n const resource = ws.authorizationResources.get(resourceId);\n if (!resource) throw notFound('AuthorizationResource');\n\n const memberships = ws.organizationMemberships.findBy('organization_id', resource.organization_id);\n return c.json({\n object: 'list',\n data: memberships.map(formatMembership),\n list_metadata: { before: null, after: null },\n });\n });\n\n // Get resource by type + external ID within an org\n app.get('/authorization/organizations/:orgId/resources/:type_slug/:external_id', (c) => {\n const ws = getWorkOSStore(store);\n const orgId = c.req.param('orgId');\n const typeSlug = c.req.param('type_slug');\n const externalId = c.req.param('external_id');\n\n const resource = ws.authorizationResources\n .findBy('organization_id', orgId)\n .find((r) => r.resource_type_slug === typeSlug && r.external_id === externalId);\n if (!resource) throw notFound('AuthorizationResource');\n return c.json(formatAuthorizationResource(resource));\n });\n\n // Memberships for resource by type + external ID within an org\n app.get('/authorization/organizations/:orgId/resources/:type_slug/:external_id/organization_memberships', (c) => {\n const ws = getWorkOSStore(store);\n const orgId = c.req.param('orgId');\n const typeSlug = c.req.param('type_slug');\n const externalId = c.req.param('external_id');\n\n const resource = ws.authorizationResources\n .findBy('organization_id', orgId)\n .find((r) => r.resource_type_slug === typeSlug && r.external_id === externalId);\n if (!resource) throw notFound('AuthorizationResource');\n\n const memberships = ws.organizationMemberships.findBy('organization_id', resource.organization_id);\n return c.json({\n object: 'list',\n data: memberships.map(formatMembership),\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 authorizationRoleRoutes(ctx: RouteContext): void;