@workos-inc/node 6.2.0 → 6.4.0

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 (29) hide show
  1. package/lib/common/interfaces/event.interface.d.ts +12 -4
  2. package/lib/common/serializers/event.serializer.js +3 -0
  3. package/lib/common/utils/test-utils.d.ts +1 -1
  4. package/lib/user-management/fixtures/organization-membership.json +3 -0
  5. package/lib/user-management/interfaces/authentication-response.interface.d.ts +3 -0
  6. package/lib/user-management/interfaces/create-organization-membership-options.interface.d.ts +2 -0
  7. package/lib/user-management/interfaces/impersonator.interface.d.ts +8 -0
  8. package/lib/user-management/interfaces/impersonator.interface.js +2 -0
  9. package/lib/user-management/interfaces/index.d.ts +1 -0
  10. package/lib/user-management/interfaces/index.js +1 -0
  11. package/lib/user-management/interfaces/organization-membership.interface.d.ts +3 -0
  12. package/lib/user-management/interfaces/role.interface.d.ts +3 -0
  13. package/lib/user-management/interfaces/role.interface.js +2 -0
  14. package/lib/user-management/interfaces/session.interface.d.ts +19 -0
  15. package/lib/user-management/interfaces/session.interface.js +2 -0
  16. package/lib/user-management/interfaces/update-organization-membership-options.interface.d.ts +6 -0
  17. package/lib/user-management/interfaces/update-organization-membership-options.interface.js +2 -0
  18. package/lib/user-management/serializers/authentication-response.serializer.js +2 -2
  19. package/lib/user-management/serializers/create-organization-membership-options.serializer.js +1 -0
  20. package/lib/user-management/serializers/organization-membership.serializer.js +1 -0
  21. package/lib/user-management/serializers/session.serializer.d.ts +2 -0
  22. package/lib/user-management/serializers/session.serializer.js +13 -0
  23. package/lib/user-management/serializers/update-organization-membership-options.serializer.d.ts +2 -0
  24. package/lib/user-management/serializers/update-organization-membership-options.serializer.js +7 -0
  25. package/lib/user-management/user-management.d.ts +2 -0
  26. package/lib/user-management/user-management.js +7 -0
  27. package/lib/user-management/user-management.spec.js +47 -0
  28. package/lib/workos.js +1 -1
  29. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import { DirectoryUser, DirectoryUserResponse, DirectoryGroup, DirectoryGroupResponse, EventDirectory, EventDirectoryResponse } from '../../directory-sync/interfaces';
2
2
  import { Connection, ConnectionResponse } from '../../sso/interfaces';
3
- import { User, UserResponse } from '../../user-management/interfaces';
3
+ import { Session, SessionResponse, User, UserResponse } from '../../user-management/interfaces';
4
4
  import { OrganizationMembership, OrganizationMembershipResponse } from '../../user-management/interfaces/organization-membership.interface';
5
5
  export interface EventBase {
6
6
  id: string;
@@ -162,6 +162,14 @@ export interface UserDeletedEventResponse extends EventResponseBase {
162
162
  event: 'user.deleted';
163
163
  data: UserResponse;
164
164
  }
165
+ export interface UserImpersonatedEvent extends EventBase {
166
+ event: 'user.impersonated';
167
+ data: Session;
168
+ }
169
+ export interface UserImpersonatedEventResponse extends EventResponseBase {
170
+ event: 'user.impersonated';
171
+ data: SessionResponse;
172
+ }
165
173
  export interface OrganizationMembershipAdded extends EventBase {
166
174
  event: 'organization_membership.added';
167
175
  data: OrganizationMembership;
@@ -186,7 +194,7 @@ export interface OrganizationMembershipRemovedResponse extends EventResponseBase
186
194
  event: 'organization_membership.removed';
187
195
  data: OrganizationMembershipResponse;
188
196
  }
189
- export type Event = ConnectionActivatedEvent | ConnectionDeactivatedEvent | ConnectionDeletedEvent | DsyncActivatedEvent | DsyncDeactivatedEvent | DsyncDeletedEvent | DsyncGroupCreatedEvent | DsyncGroupUpdatedEvent | DsyncGroupDeletedEvent | DsyncGroupUserAddedEvent | DsyncGroupUserRemovedEvent | DsyncUserCreatedEvent | DsyncUserUpdatedEvent | DsyncUserDeletedEvent | UserCreatedEvent | UserUpdatedEvent | UserDeletedEvent | OrganizationMembershipAdded | OrganizationMembershipUpdated | OrganizationMembershipRemoved;
190
- export type EventResponse = ConnectionActivatedEventResponse | ConnectionDeactivatedEventResponse | ConnectionDeletedEventResponse | DsyncActivatedEventResponse | DsyncDeactivatedEventResponse | DsyncDeletedEventResponse | DsyncGroupCreatedEventResponse | DsyncGroupUpdatedEventResponse | DsyncGroupDeletedEventResponse | DsyncGroupUserAddedEventResponse | DsyncGroupUserRemovedEventResponse | DsyncUserCreatedEventResponse | DsyncUserUpdatedEventResponse | DsyncUserDeletedEventResponse | UserCreatedEventResponse | UserUpdatedEventResponse | UserDeletedEventResponse | OrganizationMembershipAddedResponse | OrganizationMembershipUpdatedResponse | OrganizationMembershipRemovedResponse;
191
- export type EventName = 'connection.activated' | 'connection.deactivated' | 'connection.deleted' | 'dsync.activated' | 'dsync.deactivated' | 'dsync.deleted' | 'dsync.group.created' | 'dsync.group.deleted' | 'dsync.group.updated' | 'dsync.group.user_added' | 'dsync.group.user_removed' | 'dsync.user.created' | 'dsync.user.deleted' | 'dsync.user.updated' | 'user.created' | 'user.updated' | 'user.deleted' | 'organization_membership.added' | 'organization_membership.updated' | 'organization_membership.removed';
197
+ export type Event = ConnectionActivatedEvent | ConnectionDeactivatedEvent | ConnectionDeletedEvent | DsyncActivatedEvent | DsyncDeactivatedEvent | DsyncDeletedEvent | DsyncGroupCreatedEvent | DsyncGroupUpdatedEvent | DsyncGroupDeletedEvent | DsyncGroupUserAddedEvent | DsyncGroupUserRemovedEvent | DsyncUserCreatedEvent | DsyncUserUpdatedEvent | DsyncUserDeletedEvent | UserCreatedEvent | UserUpdatedEvent | UserDeletedEvent | UserImpersonatedEvent | OrganizationMembershipAdded | OrganizationMembershipUpdated | OrganizationMembershipRemoved;
198
+ export type EventResponse = ConnectionActivatedEventResponse | ConnectionDeactivatedEventResponse | ConnectionDeletedEventResponse | DsyncActivatedEventResponse | DsyncDeactivatedEventResponse | DsyncDeletedEventResponse | DsyncGroupCreatedEventResponse | DsyncGroupUpdatedEventResponse | DsyncGroupDeletedEventResponse | DsyncGroupUserAddedEventResponse | DsyncGroupUserRemovedEventResponse | DsyncUserCreatedEventResponse | DsyncUserUpdatedEventResponse | DsyncUserDeletedEventResponse | UserCreatedEventResponse | UserUpdatedEventResponse | UserDeletedEventResponse | UserImpersonatedEventResponse | OrganizationMembershipAddedResponse | OrganizationMembershipUpdatedResponse | OrganizationMembershipRemovedResponse;
199
+ export type EventName = Event['event'];
192
200
  export {};
@@ -5,6 +5,7 @@ const serializers_1 = require("../../directory-sync/serializers");
5
5
  const serializers_2 = require("../../sso/serializers");
6
6
  const serializers_3 = require("../../user-management/serializers");
7
7
  const organization_membership_serializer_1 = require("../../user-management/serializers/organization-membership.serializer");
8
+ const session_serializer_1 = require("../../user-management/serializers/session.serializer");
8
9
  const deserializeEvent = (event) => {
9
10
  const eventBase = {
10
11
  id: event.id,
@@ -41,6 +42,8 @@ const deserializeEvent = (event) => {
41
42
  case 'user.updated':
42
43
  case 'user.deleted':
43
44
  return Object.assign(Object.assign({}, eventBase), { event: event.event, data: (0, serializers_3.deserializeUser)(event.data) });
45
+ case 'user.impersonated':
46
+ return Object.assign(Object.assign({}, eventBase), { event: event.event, data: (0, session_serializer_1.deserializeSession)(event.data) });
44
47
  case 'organization_membership.added':
45
48
  case 'organization_membership.updated':
46
49
  case 'organization_membership.removed':
@@ -1,5 +1,5 @@
1
1
  import { MockParams } from 'jest-fetch-mock';
2
- export declare function fetchOnce(response?: any, { status, headers, ...rest }?: MockParams): import("jest-fetch-mock").FetchMock;
2
+ export declare function fetchOnce(response?: {}, { status, headers, ...rest }?: MockParams): import("jest-fetch-mock").FetchMock;
3
3
  export declare function fetchURL(): string | Request | undefined;
4
4
  export declare function fetchSearchParams(): {
5
5
  [k: string]: string;
@@ -4,6 +4,9 @@
4
4
  "user_id": "user_01H5JQDV7R7ATEYZDEG0W5PRYS",
5
5
  "organization_id": "organization_01H5JQDV7R7ATEYZDEG0W5PRYS",
6
6
  "status": "active",
7
+ "role": {
8
+ "slug": "member"
9
+ },
7
10
  "created_at": "2023-07-18T02:07:19.911Z",
8
11
  "updated_at": "2023-07-18T02:07:19.911Z"
9
12
  }
@@ -1,15 +1,18 @@
1
+ import { Impersonator, ImpersonatorResponse } from './impersonator.interface';
1
2
  import { User, UserResponse } from './user.interface';
2
3
  export interface AuthenticationResponse {
3
4
  user: User;
4
5
  organizationId?: string;
5
6
  accessToken?: string;
6
7
  refreshToken?: string;
8
+ impersonator?: Impersonator;
7
9
  }
8
10
  export interface AuthenticationResponseResponse {
9
11
  user: UserResponse;
10
12
  organization_id?: string;
11
13
  access_token?: string;
12
14
  refresh_token?: string;
15
+ impersonator?: ImpersonatorResponse;
13
16
  }
14
17
  export interface RefreshAuthenticationResponse {
15
18
  accessToken: string;
@@ -1,8 +1,10 @@
1
1
  export interface CreateOrganizationMembershipOptions {
2
2
  organizationId: string;
3
3
  userId: string;
4
+ roleSlug?: string;
4
5
  }
5
6
  export interface SerializedCreateOrganizationMembershipOptions {
6
7
  organization_id: string;
7
8
  user_id: string;
9
+ role_slug?: string;
8
10
  }
@@ -0,0 +1,8 @@
1
+ export interface Impersonator {
2
+ email: string;
3
+ reason: string | null;
4
+ }
5
+ export interface ImpersonatorResponse {
6
+ email: string;
7
+ reason: string | null;
8
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -15,4 +15,5 @@ export * from './send-verification-email-options';
15
15
  export * from './update-user-options.interface';
16
16
  export * from './update-user-password-options.interface';
17
17
  export * from './user.interface';
18
+ export * from './session.interface';
18
19
  export * from './verify-email-options.interface';
@@ -31,4 +31,5 @@ __exportStar(require("./send-verification-email-options"), exports);
31
31
  __exportStar(require("./update-user-options.interface"), exports);
32
32
  __exportStar(require("./update-user-password-options.interface"), exports);
33
33
  __exportStar(require("./user.interface"), exports);
34
+ __exportStar(require("./session.interface"), exports);
34
35
  __exportStar(require("./verify-email-options.interface"), exports);
@@ -1,3 +1,4 @@
1
+ import { RoleResponse } from './role.interface';
1
2
  export interface OrganizationMembership {
2
3
  object: 'organization_membership';
3
4
  id: string;
@@ -6,6 +7,7 @@ export interface OrganizationMembership {
6
7
  userId: string;
7
8
  createdAt: string;
8
9
  updatedAt: string;
10
+ role: RoleResponse;
9
11
  }
10
12
  export interface OrganizationMembershipResponse {
11
13
  object: 'organization_membership';
@@ -15,4 +17,5 @@ export interface OrganizationMembershipResponse {
15
17
  user_id: string;
16
18
  created_at: string;
17
19
  updated_at: string;
20
+ role: RoleResponse;
18
21
  }
@@ -0,0 +1,3 @@
1
+ export interface RoleResponse {
2
+ slug: string;
3
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,19 @@
1
+ import { Impersonator } from './impersonator.interface';
2
+ export interface Session {
3
+ object: 'session';
4
+ id: string;
5
+ userId: string;
6
+ ipAddress: string | null;
7
+ userAgent: string | null;
8
+ organizationId?: string;
9
+ impersonator?: Impersonator;
10
+ }
11
+ export interface SessionResponse {
12
+ object: 'session';
13
+ id: string;
14
+ user_id: string;
15
+ ip_address: string | null;
16
+ user_agent: string | null;
17
+ organization_id?: string;
18
+ impersonator?: Impersonator;
19
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ export interface UpdateOrganizationMembershipOptions {
2
+ roleSlug?: string;
3
+ }
4
+ export interface SerializedUpdateOrganizationMembershipOptions {
5
+ role_slug?: string;
6
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -14,8 +14,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
14
14
  exports.deserializeRefreshAuthenticationResponse = exports.deserializeAuthenticationResponse = void 0;
15
15
  const user_serializer_1 = require("./user.serializer");
16
16
  const deserializeAuthenticationResponse = (authenticationResponse) => {
17
- const { user, organization_id, access_token, refresh_token } = authenticationResponse, rest = __rest(authenticationResponse, ["user", "organization_id", "access_token", "refresh_token"]);
18
- return Object.assign({ user: (0, user_serializer_1.deserializeUser)(user), organizationId: organization_id, accessToken: access_token, refreshToken: refresh_token }, rest);
17
+ const { user, organization_id, access_token, refresh_token, impersonator } = authenticationResponse, rest = __rest(authenticationResponse, ["user", "organization_id", "access_token", "refresh_token", "impersonator"]);
18
+ return Object.assign({ user: (0, user_serializer_1.deserializeUser)(user), organizationId: organization_id, accessToken: access_token, refreshToken: refresh_token, impersonator }, rest);
19
19
  };
20
20
  exports.deserializeAuthenticationResponse = deserializeAuthenticationResponse;
21
21
  const deserializeRefreshAuthenticationResponse = (refreshAuthenticationResponse) => {
@@ -4,5 +4,6 @@ exports.serializeCreateOrganizationMembershipOptions = void 0;
4
4
  const serializeCreateOrganizationMembershipOptions = (options) => ({
5
5
  organization_id: options.organizationId,
6
6
  user_id: options.userId,
7
+ role_slug: options.roleSlug,
7
8
  });
8
9
  exports.serializeCreateOrganizationMembershipOptions = serializeCreateOrganizationMembershipOptions;
@@ -9,5 +9,6 @@ const deserializeOrganizationMembership = (organizationMembership) => ({
9
9
  status: organizationMembership.status,
10
10
  createdAt: organizationMembership.created_at,
11
11
  updatedAt: organizationMembership.updated_at,
12
+ role: organizationMembership.role,
12
13
  });
13
14
  exports.deserializeOrganizationMembership = deserializeOrganizationMembership;
@@ -0,0 +1,2 @@
1
+ import { Session, SessionResponse } from '../interfaces';
2
+ export declare const deserializeSession: (session: SessionResponse) => Session;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deserializeSession = void 0;
4
+ const deserializeSession = (session) => ({
5
+ object: 'session',
6
+ id: session.id,
7
+ userId: session.user_id,
8
+ ipAddress: session.ip_address,
9
+ userAgent: session.user_agent,
10
+ organizationId: session.organization_id,
11
+ impersonator: session.impersonator,
12
+ });
13
+ exports.deserializeSession = deserializeSession;
@@ -0,0 +1,2 @@
1
+ import { UpdateOrganizationMembershipOptions, SerializedUpdateOrganizationMembershipOptions } from '../interfaces/update-organization-membership-options.interface';
2
+ export declare const serializeUpdateOrganizationMembershipOptions: (options: UpdateOrganizationMembershipOptions) => SerializedUpdateOrganizationMembershipOptions;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeUpdateOrganizationMembershipOptions = void 0;
4
+ const serializeUpdateOrganizationMembershipOptions = (options) => ({
5
+ role_slug: options.roleSlug,
6
+ });
7
+ exports.serializeUpdateOrganizationMembershipOptions = serializeUpdateOrganizationMembershipOptions;
@@ -13,6 +13,7 @@ import { AuthenticateWithEmailVerificationOptions } from './interfaces/authentic
13
13
  import { AuthenticateWithOrganizationSelectionOptions } from './interfaces/authenticate-with-organization-selection.interface';
14
14
  import { Factor, FactorWithSecrets } from './interfaces/factor.interface';
15
15
  import { RevokeSessionOptions } from './interfaces/revoke-session-options.interface';
16
+ import { UpdateOrganizationMembershipOptions } from './interfaces/update-organization-membership-options.interface';
16
17
  export declare class UserManagement {
17
18
  private readonly workos;
18
19
  constructor(workos: WorkOS);
@@ -47,6 +48,7 @@ export declare class UserManagement {
47
48
  getOrganizationMembership(organizationMembershipId: string): Promise<OrganizationMembership>;
48
49
  listOrganizationMemberships(options: ListOrganizationMembershipsOptions): Promise<AutoPaginatable<OrganizationMembership>>;
49
50
  createOrganizationMembership(options: CreateOrganizationMembershipOptions): Promise<OrganizationMembership>;
51
+ updateOrganizationMembership(organizationMembershipId: string, options: UpdateOrganizationMembershipOptions): Promise<OrganizationMembership>;
50
52
  deleteOrganizationMembership(organizationMembershipId: string): Promise<void>;
51
53
  getInvitation(invitationId: string): Promise<Invitation>;
52
54
  listInvitations(options: ListInvitationsOptions): Promise<AutoPaginatable<Invitation>>;
@@ -25,6 +25,7 @@ const authenticate_with_email_verification_serializer_1 = require("./serializers
25
25
  const authenticate_with_organization_selection_options_serializer_1 = require("./serializers/authenticate-with-organization-selection-options.serializer");
26
26
  const factor_serializer_1 = require("./serializers/factor.serializer");
27
27
  const revoke_session_options_interface_1 = require("./interfaces/revoke-session-options.interface");
28
+ const update_organization_membership_options_serializer_1 = require("./serializers/update-organization-membership-options.serializer");
28
29
  const toQueryString = (options) => {
29
30
  const searchParams = new URLSearchParams();
30
31
  const keys = Object.keys(options).sort();
@@ -175,6 +176,12 @@ class UserManagement {
175
176
  return (0, organization_membership_serializer_1.deserializeOrganizationMembership)(data);
176
177
  });
177
178
  }
179
+ updateOrganizationMembership(organizationMembershipId, options) {
180
+ return __awaiter(this, void 0, void 0, function* () {
181
+ const { data } = yield this.workos.put(`/user_management/organization_memberships/${organizationMembershipId}`, (0, update_organization_membership_options_serializer_1.serializeUpdateOrganizationMembershipOptions)(options));
182
+ return (0, organization_membership_serializer_1.deserializeOrganizationMembership)(data);
183
+ });
184
+ }
178
185
  deleteOrganizationMembership(organizationMembershipId) {
179
186
  return __awaiter(this, void 0, void 0, function* () {
180
187
  yield this.workos.delete(`/user_management/organization_memberships/${organizationMembershipId}`);
@@ -155,6 +155,30 @@ describe('UserManagement', () => {
155
155
  },
156
156
  });
157
157
  }));
158
+ describe('when the code is for an impersonator', () => {
159
+ it('deserializes the impersonator metadata', () => __awaiter(void 0, void 0, void 0, function* () {
160
+ (0, test_utils_1.fetchOnce)({
161
+ user: user_json_1.default,
162
+ impersonator: {
163
+ email: 'admin@example.com',
164
+ reason: 'A good reason.',
165
+ },
166
+ });
167
+ const resp = yield workos.userManagement.authenticateWithCode({
168
+ clientId: 'proj_whatever',
169
+ code: 'or this',
170
+ });
171
+ expect(resp).toMatchObject({
172
+ user: {
173
+ email: 'test01@example.com',
174
+ },
175
+ impersonator: {
176
+ email: 'admin@example.com',
177
+ reason: 'A good reason.',
178
+ },
179
+ });
180
+ }));
181
+ });
158
182
  });
159
183
  describe('authenticateWithRefreshToken', () => {
160
184
  it('sends a refresh_token authentication request', () => __awaiter(void 0, void 0, void 0, function* () {
@@ -531,6 +555,29 @@ describe('UserManagement', () => {
531
555
  organizationId: 'organization_01H5JQDV7R7ATEYZDEG0W5PRYS',
532
556
  userId: 'user_01H5JQDV7R7ATEYZDEG0W5PRYS',
533
557
  status: 'active',
558
+ role: {
559
+ slug: 'member',
560
+ },
561
+ });
562
+ }));
563
+ });
564
+ describe('updateOrganizationMembership', () => {
565
+ it('sends an update organization membership request', () => __awaiter(void 0, void 0, void 0, function* () {
566
+ (0, test_utils_1.fetchOnce)(organization_membership_json_1.default, {
567
+ status: 200,
568
+ });
569
+ const organizationMembership = yield workos.userManagement.updateOrganizationMembership(organizationMembershipId, {
570
+ roleSlug: 'member',
571
+ });
572
+ expect((0, test_utils_1.fetchURL)()).toContain(`/user_management/organization_memberships/${organizationMembershipId}`);
573
+ expect(organizationMembership).toMatchObject({
574
+ object: 'organization_membership',
575
+ organizationId: 'organization_01H5JQDV7R7ATEYZDEG0W5PRYS',
576
+ userId: 'user_01H5JQDV7R7ATEYZDEG0W5PRYS',
577
+ status: 'active',
578
+ role: {
579
+ slug: 'member',
580
+ },
534
581
  });
535
582
  }));
536
583
  });
package/lib/workos.js CHANGED
@@ -24,7 +24,7 @@ const audit_logs_1 = require("./audit-logs/audit-logs");
24
24
  const user_management_1 = require("./user-management/user-management");
25
25
  const bad_request_exception_1 = require("./common/exceptions/bad-request.exception");
26
26
  const fetch_client_1 = require("./common/utils/fetch-client");
27
- const VERSION = '6.2.0';
27
+ const VERSION = '6.4.0';
28
28
  const DEFAULT_HOSTNAME = 'api.workos.com';
29
29
  class WorkOS {
30
30
  constructor(key, options = {}) {
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "6.2.0",
2
+ "version": "6.4.0",
3
3
  "name": "@workos-inc/node",
4
4
  "author": "WorkOS",
5
5
  "description": "A Node wrapper for the WorkOS API",