@workos-inc/node 3.0.0-user-management.1 → 3.0.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 (211) hide show
  1. package/lib/audit-logs/audit-logs.js +5 -4
  2. package/lib/audit-logs/audit-logs.spec.js +87 -88
  3. package/lib/audit-logs/interfaces/audit-log-export-options.interface.d.ts +13 -3
  4. package/lib/audit-logs/interfaces/audit-log-export.interface.d.ts +8 -0
  5. package/lib/audit-logs/interfaces/create-audit-log-event-options.interface.d.ts +13 -1
  6. package/lib/audit-logs/serializers/audit-log-export-options.serializer.d.ts +2 -0
  7. package/lib/audit-logs/serializers/audit-log-export-options.serializer.js +14 -0
  8. package/lib/audit-logs/serializers/audit-log-export.serializer.d.ts +2 -0
  9. package/lib/audit-logs/serializers/audit-log-export.serializer.js +12 -0
  10. package/lib/audit-logs/serializers/create-audit-log-event-options.serializer.d.ts +2 -0
  11. package/lib/audit-logs/serializers/create-audit-log-event-options.serializer.js +16 -0
  12. package/lib/audit-logs/serializers/index.d.ts +3 -0
  13. package/lib/audit-logs/serializers/index.js +19 -0
  14. package/lib/audit-trail/audit-trail.d.ts +2 -2
  15. package/lib/common/interfaces/at-least-one-property-of.interface.d.ts +7 -0
  16. package/lib/common/interfaces/event.interface.d.ts +142 -0
  17. package/lib/common/interfaces/index.d.ts +4 -0
  18. package/lib/common/interfaces/index.js +4 -0
  19. package/lib/common/interfaces/list.interface.d.ts +9 -1
  20. package/lib/common/serializers/event.serializer.d.ts +2 -0
  21. package/lib/common/serializers/event.serializer.js +40 -0
  22. package/lib/common/serializers/index.d.ts +2 -0
  23. package/lib/common/serializers/index.js +18 -0
  24. package/lib/common/serializers/list.serializer.d.ts +2 -0
  25. package/lib/common/serializers/list.serializer.js +9 -0
  26. package/lib/common/utils/fetch-and-deserialize.d.ts +3 -0
  27. package/lib/common/utils/fetch-and-deserialize.js +23 -0
  28. package/lib/common/utils/pagination.d.ts +15 -0
  29. package/lib/common/utils/pagination.js +90 -0
  30. package/lib/common/utils/workos-mock-response.d.ts +7 -0
  31. package/lib/common/utils/workos-mock-response.js +11 -0
  32. package/lib/directory-sync/directory-sync.d.ts +8 -12
  33. package/lib/directory-sync/directory-sync.js +9 -15
  34. package/lib/directory-sync/directory-sync.spec.js +132 -20
  35. package/lib/directory-sync/interfaces/directory-group.interface.d.ts +40 -0
  36. package/lib/directory-sync/interfaces/directory-user.interface.d.ts +50 -0
  37. package/lib/directory-sync/interfaces/directory.interface.d.ts +47 -2
  38. package/lib/directory-sync/interfaces/index.d.ts +6 -6
  39. package/lib/directory-sync/interfaces/index.js +20 -0
  40. package/lib/directory-sync/interfaces/list-directories-options.interface.d.ts +1 -1
  41. package/lib/directory-sync/interfaces/{list-users-options.interface.d.ts → list-directory-users-options.interface.d.ts} +1 -1
  42. package/lib/directory-sync/interfaces/list-groups-options.interface.d.ts +1 -1
  43. package/lib/directory-sync/serializers/directory-group.serializer.d.ts +4 -0
  44. package/lib/directory-sync/serializers/directory-group.serializer.js +37 -0
  45. package/lib/directory-sync/serializers/directory-user.serializer.d.ts +4 -0
  46. package/lib/directory-sync/serializers/directory-user.serializer.js +43 -0
  47. package/lib/directory-sync/serializers/directory.serializer.d.ts +5 -0
  48. package/lib/directory-sync/serializers/directory.serializer.js +50 -0
  49. package/lib/directory-sync/serializers/index.d.ts +3 -0
  50. package/lib/directory-sync/serializers/index.js +19 -0
  51. package/lib/directory-sync/utils/get-primary-email.d.ts +2 -2
  52. package/lib/directory-sync/utils/get-primary-email.spec.js +11 -8
  53. package/lib/events/events.d.ts +1 -2
  54. package/lib/events/events.js +2 -1
  55. package/lib/events/events.spec.js +39 -5
  56. package/lib/events/interfaces/index.d.ts +0 -1
  57. package/lib/events/interfaces/index.js +0 -1
  58. package/lib/events/interfaces/list-events-options.interface.d.ts +4 -4
  59. package/lib/index.d.ts +1 -1
  60. package/lib/index.js +1 -1
  61. package/lib/mfa/interfaces/challenge.interface.d.ts +9 -0
  62. package/lib/mfa/interfaces/factor.interface.d.ts +13 -4
  63. package/lib/mfa/interfaces/index.d.ts +9 -0
  64. package/lib/mfa/interfaces/index.js +25 -0
  65. package/lib/mfa/interfaces/sms.interface.d.ts +3 -0
  66. package/lib/mfa/interfaces/totp.interface.d.ts +7 -0
  67. package/lib/mfa/interfaces/verify-challenge-response.d.ts +5 -1
  68. package/lib/mfa/mfa.d.ts +2 -8
  69. package/lib/mfa/mfa.js +5 -4
  70. package/lib/mfa/mfa.spec.js +134 -115
  71. package/lib/mfa/serializers/challenge.serializer.d.ts +2 -0
  72. package/lib/mfa/serializers/challenge.serializer.js +13 -0
  73. package/lib/mfa/serializers/factor.serializer.d.ts +2 -0
  74. package/lib/mfa/serializers/factor.serializer.js +7 -0
  75. package/lib/mfa/serializers/index.d.ts +3 -0
  76. package/lib/{webhooks/interfaces → mfa/serializers}/index.js +3 -4
  77. package/lib/mfa/serializers/sms.serializer.d.ts +2 -0
  78. package/lib/mfa/serializers/sms.serializer.js +7 -0
  79. package/lib/mfa/serializers/totp.serializer.d.ts +2 -0
  80. package/lib/mfa/serializers/totp.serializer.js +11 -0
  81. package/lib/mfa/serializers/verify-response.serializer.d.ts +2 -0
  82. package/lib/mfa/serializers/verify-response.serializer.js +9 -0
  83. package/lib/organizations/interfaces/create-organization-options.interface.d.ts +5 -0
  84. package/lib/organizations/interfaces/organization.interface.d.ts +9 -0
  85. package/lib/organizations/interfaces/update-organization-options.interface.d.ts +5 -0
  86. package/lib/organizations/organizations.d.ts +2 -2
  87. package/lib/organizations/organizations.js +9 -9
  88. package/lib/organizations/organizations.spec.js +9 -3
  89. package/lib/organizations/serializers/create-organization-options.serializer.d.ts +2 -0
  90. package/lib/organizations/serializers/create-organization-options.serializer.js +9 -0
  91. package/lib/organizations/serializers/index.d.ts +3 -0
  92. package/lib/organizations/serializers/index.js +19 -0
  93. package/lib/organizations/serializers/organization.serializer.d.ts +2 -0
  94. package/lib/organizations/serializers/organization.serializer.js +13 -0
  95. package/lib/organizations/serializers/update-organization-options.serializer.d.ts +2 -0
  96. package/lib/organizations/serializers/update-organization-options.serializer.js +9 -0
  97. package/lib/passwordless/interfaces/create-passwordless-session-options.interface.d.ts +8 -0
  98. package/lib/passwordless/interfaces/index.d.ts +3 -3
  99. package/lib/passwordless/interfaces/index.js +17 -0
  100. package/lib/passwordless/interfaces/passwordless-session.interface.d.ts +7 -0
  101. package/lib/passwordless/passwordless.d.ts +1 -3
  102. package/lib/passwordless/passwordless.js +2 -1
  103. package/lib/passwordless/serializers/index.d.ts +0 -0
  104. package/lib/passwordless/serializers/index.js +1 -0
  105. package/lib/passwordless/serializers/passwordless-session.serializer.d.ts +2 -0
  106. package/lib/passwordless/serializers/passwordless-session.serializer.js +11 -0
  107. package/lib/sso/interfaces/connection.interface.d.ts +15 -4
  108. package/lib/sso/interfaces/index.d.ts +2 -0
  109. package/lib/sso/interfaces/index.js +2 -0
  110. package/lib/sso/interfaces/list-connections-options.interface.d.ts +5 -0
  111. package/lib/sso/interfaces/profile-and-token.interface.d.ts +6 -2
  112. package/lib/sso/interfaces/profile.interface.d.ts +14 -0
  113. package/lib/sso/serializers/connection.serializer.d.ts +2 -0
  114. package/lib/sso/serializers/connection.serializer.js +16 -0
  115. package/lib/sso/serializers/index.d.ts +3 -0
  116. package/lib/sso/serializers/index.js +19 -0
  117. package/lib/sso/serializers/profile-and-token.serializer.d.ts +2 -0
  118. package/lib/sso/serializers/profile-and-token.serializer.js +9 -0
  119. package/lib/sso/serializers/profile.serializer.d.ts +2 -0
  120. package/lib/sso/serializers/profile.serializer.js +16 -0
  121. package/lib/sso/sso.d.ts +3 -9
  122. package/lib/sso/sso.js +11 -11
  123. package/lib/sso/sso.spec.js +23 -6
  124. package/lib/users/exceptions/index.d.ts +4 -0
  125. package/lib/users/exceptions/index.js +10 -0
  126. package/lib/users/fixtures/list-users.json +0 -1
  127. package/lib/users/fixtures/session.json +2 -0
  128. package/lib/users/fixtures/user.json +0 -1
  129. package/lib/users/interfaces/add-user-to-organization-options.interface.d.ts +4 -1
  130. package/lib/users/interfaces/authenticate-user-with-magic-auth-options.interface.d.ts +21 -0
  131. package/lib/users/interfaces/authenticate-user-with-password-options.interface.d.ts +14 -1
  132. package/lib/users/interfaces/authenticate-user-with-token-options.interface.d.ts +10 -1
  133. package/lib/users/interfaces/authentication-response.interface.d.ts +7 -3
  134. package/lib/users/interfaces/complete-password-reset-options.interface.d.ts +4 -0
  135. package/lib/users/interfaces/create-email-verification-challenge-options.interface.d.ts +9 -2
  136. package/lib/users/interfaces/create-password-reset-challenge-options.interface.d.ts +9 -1
  137. package/lib/users/interfaces/create-user-options.interface.d.ts +8 -1
  138. package/lib/users/interfaces/index.d.ts +7 -0
  139. package/lib/users/interfaces/index.js +7 -0
  140. package/lib/users/interfaces/magic-auth-challenge.interface.d.ts +3 -0
  141. package/lib/users/interfaces/remove-user-from-organization-options.interface.d.ts +2 -2
  142. package/lib/users/interfaces/revoke-all-sessions-for-user-options.interface.d.ts +3 -0
  143. package/lib/users/interfaces/revoke-session-options.interface.d.ts +7 -0
  144. package/lib/users/interfaces/send-magic-auth-code-options.interface.d.ts +6 -0
  145. package/lib/users/interfaces/send-magic-auth-code-options.interface.js +2 -0
  146. package/lib/users/interfaces/session.interface.d.ts +35 -0
  147. package/lib/users/interfaces/update-user-options.interface.d.ts +14 -0
  148. package/lib/users/interfaces/update-user-options.interface.js +2 -0
  149. package/lib/users/interfaces/update-user-password-options.interface.d.ts +7 -0
  150. package/lib/users/interfaces/update-user-password-options.interface.js +2 -0
  151. package/lib/users/interfaces/user.interface.d.ts +28 -18
  152. package/lib/users/interfaces/verify-session.interface.d.ts +10 -2
  153. package/lib/users/serializers/authenticate-user-with-magic-auth-options.serializer.d.ts +2 -0
  154. package/lib/users/serializers/authenticate-user-with-magic-auth-options.serializer.js +14 -0
  155. package/lib/users/serializers/authenticate-user-with-password-options.serializer.d.ts +2 -0
  156. package/lib/users/serializers/authenticate-user-with-password-options.serializer.js +14 -0
  157. package/lib/users/serializers/authenticate-user-with-token-options.serializer.d.ts +2 -0
  158. package/lib/users/serializers/authenticate-user-with-token-options.serializer.js +11 -0
  159. package/lib/users/serializers/authentication-response.serializer.d.ts +2 -0
  160. package/lib/users/serializers/authentication-response.serializer.js +10 -0
  161. package/lib/users/serializers/complete-password-reset-options.serializer.d.ts +2 -0
  162. package/lib/users/serializers/complete-password-reset-options.serializer.js +8 -0
  163. package/lib/users/serializers/create-email-verification-challenge.serializer.d.ts +2 -0
  164. package/lib/users/serializers/create-email-verification-challenge.serializer.js +9 -0
  165. package/lib/users/serializers/create-password-reset-challenge.serializer.d.ts +3 -0
  166. package/lib/users/serializers/create-password-reset-challenge.serializer.js +14 -0
  167. package/lib/users/serializers/create-user-options.serializer.d.ts +2 -0
  168. package/lib/users/serializers/create-user-options.serializer.js +11 -0
  169. package/lib/users/serializers/index.d.ts +15 -0
  170. package/lib/users/serializers/index.js +31 -0
  171. package/lib/users/serializers/revoke-session-options.serializer.d.ts +2 -0
  172. package/lib/users/serializers/revoke-session-options.serializer.js +14 -0
  173. package/lib/users/serializers/send-magic-auth-code-options.serializer.d.ts +2 -0
  174. package/lib/users/serializers/send-magic-auth-code-options.serializer.js +7 -0
  175. package/lib/users/serializers/session.serializer.d.ts +4 -0
  176. package/lib/users/serializers/session.serializer.js +22 -0
  177. package/lib/users/serializers/update-user-options.serializer.d.ts +2 -0
  178. package/lib/users/serializers/update-user-options.serializer.js +8 -0
  179. package/lib/users/serializers/update-user-password-options.serializer.d.ts +2 -0
  180. package/lib/users/serializers/update-user-password-options.serializer.js +7 -0
  181. package/lib/users/serializers/user.serializer.d.ts +2 -0
  182. package/lib/users/serializers/user.serializer.js +24 -0
  183. package/lib/users/serializers/verify-session.serializer.d.ts +3 -0
  184. package/lib/users/serializers/verify-session.serializer.js +15 -0
  185. package/lib/users/users.d.ts +11 -7
  186. package/lib/users/users.js +54 -30
  187. package/lib/users/users.spec.js +133 -49
  188. package/lib/webhooks/fixtures/webhook.json +67 -1
  189. package/lib/webhooks/webhooks.d.ts +2 -2
  190. package/lib/webhooks/webhooks.js +2 -1
  191. package/lib/webhooks/webhooks.spec.js +8 -6
  192. package/lib/workos.d.ts +5 -4
  193. package/lib/workos.js +4 -1
  194. package/lib/workos.spec.js +11 -1
  195. package/package.json +4 -4
  196. package/lib/directory-sync/interfaces/group.interface.d.ts +0 -10
  197. package/lib/directory-sync/interfaces/user.interface.d.ts +0 -23
  198. package/lib/events/interfaces/event.interface.d.ts +0 -63
  199. package/lib/webhooks/interfaces/index.d.ts +0 -4
  200. package/lib/webhooks/interfaces/webhook-directory-group.interface.d.ts +0 -10
  201. package/lib/webhooks/interfaces/webhook-directory-user.interface.d.ts +0 -5
  202. package/lib/webhooks/interfaces/webhook-directory.interface.d.ts +0 -20
  203. package/lib/webhooks/interfaces/webhook.interface.d.ts +0 -74
  204. /package/lib/{directory-sync/interfaces/group.interface.js → common/interfaces/at-least-one-property-of.interface.js} +0 -0
  205. /package/lib/{events → common}/interfaces/event.interface.js +0 -0
  206. /package/lib/directory-sync/interfaces/{list-users-options.interface.js → directory-group.interface.js} +0 -0
  207. /package/lib/directory-sync/interfaces/{user.interface.js → directory-user.interface.js} +0 -0
  208. /package/lib/{webhooks/interfaces/webhook-directory-group.interface.js → directory-sync/interfaces/list-directory-users-options.interface.js} +0 -0
  209. /package/lib/{webhooks/interfaces/webhook-directory-user.interface.js → users/interfaces/authenticate-user-with-magic-auth-options.interface.js} +0 -0
  210. /package/lib/{webhooks/interfaces/webhook-directory.interface.js → users/interfaces/magic-auth-challenge.interface.js} +0 -0
  211. /package/lib/{webhooks/interfaces/webhook.interface.js → users/interfaces/revoke-all-sessions-for-user-options.interface.js} +0 -0
@@ -1,6 +1,10 @@
1
+ export * from './at-least-one-property-of.interface';
2
+ export * from './event.interface';
1
3
  export * from './get-options.interface';
4
+ export * from './list.interface';
2
5
  export * from './post-options.interface';
3
6
  export * from './put-options.interface';
4
7
  export * from './unprocessable-entity-error.interface';
5
8
  export * from './workos-options.interface';
6
9
  export * from './workos-response-error.interface';
10
+ export * from './pagination-options.interface';
@@ -14,9 +14,13 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./at-least-one-property-of.interface"), exports);
18
+ __exportStar(require("./event.interface"), exports);
17
19
  __exportStar(require("./get-options.interface"), exports);
20
+ __exportStar(require("./list.interface"), exports);
18
21
  __exportStar(require("./post-options.interface"), exports);
19
22
  __exportStar(require("./put-options.interface"), exports);
20
23
  __exportStar(require("./unprocessable-entity-error.interface"), exports);
21
24
  __exportStar(require("./workos-options.interface"), exports);
22
25
  __exportStar(require("./workos-response-error.interface"), exports);
26
+ __exportStar(require("./pagination-options.interface"), exports);
@@ -1,4 +1,4 @@
1
- export interface List<T> {
1
+ export interface ListResponse<T> {
2
2
  readonly object: 'list';
3
3
  data: T[];
4
4
  list_metadata: {
@@ -6,3 +6,11 @@ export interface List<T> {
6
6
  after?: string;
7
7
  };
8
8
  }
9
+ export interface List<T> {
10
+ readonly object: 'list';
11
+ data: T[];
12
+ listMetadata: {
13
+ before?: string;
14
+ after?: string;
15
+ };
16
+ }
@@ -0,0 +1,2 @@
1
+ import { Event, EventResponse } from '../interfaces';
2
+ export declare const deserializeEvent: (event: EventResponse) => Event;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deserializeEvent = void 0;
4
+ const serializers_1 = require("../../directory-sync/serializers");
5
+ const serializers_2 = require("../../sso/serializers");
6
+ const deserializeEvent = (event) => {
7
+ const eventBase = {
8
+ id: event.id,
9
+ createdAt: event.created_at,
10
+ };
11
+ switch (event.event) {
12
+ case 'connection.activated':
13
+ case 'connection.deactivated':
14
+ case 'connection.deleted':
15
+ return Object.assign(Object.assign({}, eventBase), { event: event.event, data: (0, serializers_2.deserializeConnection)(event.data) });
16
+ case 'dsync.activated':
17
+ case 'dsync.deactivated':
18
+ return Object.assign(Object.assign({}, eventBase), { event: event.event, data: (0, serializers_1.deserializeEventDirectory)(event.data) });
19
+ case 'dsync.deleted':
20
+ return Object.assign(Object.assign({}, eventBase), { event: event.event, data: (0, serializers_1.deserializeDeletedEventDirectory)(event.data) });
21
+ case 'dsync.group.created':
22
+ case 'dsync.group.deleted':
23
+ return Object.assign(Object.assign({}, eventBase), { event: event.event, data: (0, serializers_1.deserializeEventDirectoryGroup)(event.data) });
24
+ case 'dsync.group.updated':
25
+ return Object.assign(Object.assign({}, eventBase), { event: event.event, data: (0, serializers_1.deserializeUpdatedEventDirectoryGroup)(event.data) });
26
+ case 'dsync.group.user_added':
27
+ case 'dsync.group.user_removed':
28
+ return Object.assign(Object.assign({}, eventBase), { event: event.event, data: {
29
+ directoryId: event.data.directory_id,
30
+ user: (0, serializers_1.deserializeDirectoryUser)(event.data.user),
31
+ group: event.data.group,
32
+ } });
33
+ case 'dsync.user.created':
34
+ case 'dsync.user.deleted':
35
+ return Object.assign(Object.assign({}, eventBase), { event: event.event, data: (0, serializers_1.deserializeDirectoryUser)(event.data) });
36
+ case 'dsync.user.updated':
37
+ return Object.assign(Object.assign({}, eventBase), { event: event.event, data: (0, serializers_1.deserializeUpdatedEventDirectoryUser)(event.data) });
38
+ }
39
+ };
40
+ exports.deserializeEvent = deserializeEvent;
@@ -0,0 +1,2 @@
1
+ export * from './event.serializer';
2
+ export * from './list.serializer';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./event.serializer"), exports);
18
+ __exportStar(require("./list.serializer"), exports);
@@ -0,0 +1,2 @@
1
+ import { List, ListResponse } from '../interfaces';
2
+ export declare const deserializeList: <TSerialized, TDeserialized>(list: ListResponse<TSerialized>, deserializer: (serialized: TSerialized) => TDeserialized) => List<TDeserialized>;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deserializeList = void 0;
4
+ const deserializeList = (list, deserializer) => ({
5
+ object: 'list',
6
+ data: list.data.map(deserializer),
7
+ listMetadata: list.list_metadata,
8
+ });
9
+ exports.deserializeList = deserializeList;
@@ -0,0 +1,3 @@
1
+ import { WorkOS } from '../../workos';
2
+ import { List, PaginationOptions } from '../interfaces';
3
+ export declare const fetchAndDeserialize: <T, U>(workos: WorkOS, endpoint: string, deserializeFn: (data: T) => U, options?: PaginationOptions) => Promise<List<U>>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.fetchAndDeserialize = void 0;
13
+ const serializers_1 = require("../serializers");
14
+ const setDefaultOptions = (options) => {
15
+ return Object.assign(Object.assign({}, options), { order: (options === null || options === void 0 ? void 0 : options.order) || 'desc' });
16
+ };
17
+ const fetchAndDeserialize = (workos, endpoint, deserializeFn, options) => __awaiter(void 0, void 0, void 0, function* () {
18
+ const { data } = yield workos.get(endpoint, {
19
+ query: setDefaultOptions(options),
20
+ });
21
+ return (0, serializers_1.deserializeList)(data, deserializeFn);
22
+ });
23
+ exports.fetchAndDeserialize = fetchAndDeserialize;
@@ -0,0 +1,15 @@
1
+ import { List, PaginationOptions } from '../interfaces';
2
+ export declare class AutoPaginatable<T> {
3
+ private list;
4
+ private apiCall;
5
+ readonly object: 'list';
6
+ readonly options: PaginationOptions;
7
+ constructor(list: List<T>, apiCall: (params: PaginationOptions) => Promise<List<T>>, options?: PaginationOptions);
8
+ get data(): T[];
9
+ get listMetadata(): {
10
+ before?: string | undefined;
11
+ after?: string | undefined;
12
+ };
13
+ private generatePages;
14
+ autoPagination(): Promise<T[]>;
15
+ }
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
12
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
13
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
14
+ var m = o[Symbol.asyncIterator], i;
15
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
16
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
17
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
18
+ };
19
+ var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
20
+ var i, p;
21
+ return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
22
+ function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
23
+ };
24
+ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
25
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
26
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
27
+ return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
28
+ function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
29
+ function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
30
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
31
+ function fulfill(value) { resume("next", value); }
32
+ function reject(value) { resume("throw", value); }
33
+ function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
34
+ };
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AutoPaginatable = void 0;
37
+ class AutoPaginatable {
38
+ constructor(list, apiCall, options) {
39
+ this.list = list;
40
+ this.apiCall = apiCall;
41
+ this.object = 'list';
42
+ this.options = Object.assign({}, options);
43
+ }
44
+ get data() {
45
+ return this.list.data;
46
+ }
47
+ get listMetadata() {
48
+ return this.list.listMetadata;
49
+ }
50
+ generatePages(params) {
51
+ return __asyncGenerator(this, arguments, function* generatePages_1() {
52
+ const result = yield __await(this.apiCall(Object.assign(Object.assign({}, this.options), { after: params.after })));
53
+ yield yield __await(result.data);
54
+ if (result.listMetadata.after) {
55
+ yield __await(yield* __asyncDelegator(__asyncValues(this.generatePages({ after: result.listMetadata.after }))));
56
+ }
57
+ });
58
+ }
59
+ autoPagination() {
60
+ var _a, e_1, _b, _c;
61
+ return __awaiter(this, void 0, void 0, function* () {
62
+ if (!this.options.limit) {
63
+ const generatePages = this.generatePages({
64
+ after: this.options.after,
65
+ });
66
+ const results = [];
67
+ try {
68
+ for (var _d = true, generatePages_2 = __asyncValues(generatePages), generatePages_2_1; generatePages_2_1 = yield generatePages_2.next(), _a = generatePages_2_1.done, !_a; _d = true) {
69
+ _c = generatePages_2_1.value;
70
+ _d = false;
71
+ const page = _c;
72
+ results.push(...page);
73
+ }
74
+ }
75
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
76
+ finally {
77
+ try {
78
+ if (!_d && !_a && (_b = generatePages_2.return)) yield _b.call(generatePages_2);
79
+ }
80
+ finally { if (e_1) throw e_1.error; }
81
+ }
82
+ return results;
83
+ }
84
+ else {
85
+ return this.data;
86
+ }
87
+ });
88
+ }
89
+ }
90
+ exports.AutoPaginatable = AutoPaginatable;
@@ -0,0 +1,7 @@
1
+ export declare const mockWorkOsResponse: (status: number, data: unknown) => {
2
+ data: unknown;
3
+ status: number;
4
+ headers: {};
5
+ statusText: string;
6
+ config: any;
7
+ };
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mockWorkOsResponse = void 0;
4
+ const mockWorkOsResponse = (status, data) => ({
5
+ data,
6
+ status,
7
+ headers: {},
8
+ statusText: '',
9
+ config: {},
10
+ });
11
+ exports.mockWorkOsResponse = mockWorkOsResponse;
@@ -1,19 +1,15 @@
1
1
  import { WorkOS } from '../workos';
2
- import { Directory } from './interfaces/directory.interface';
3
- import { List } from '../common/interfaces/list.interface';
4
- import { Group } from './interfaces/group.interface';
5
- import { DefaultCustomAttributes, UserWithGroups } from './interfaces/user.interface';
6
- import { ListDirectoriesOptions } from './interfaces/list-directories-options.interface';
7
- import { ListGroupsOptions } from './interfaces/list-groups-options.interface';
8
- import { ListUsersOptions } from './interfaces/list-users-options.interface';
2
+ import { AutoPaginatable } from '../common/utils/pagination';
3
+ import { DefaultCustomAttributes, Directory, DirectoryGroup, DirectoryUserWithGroups, ListDirectoriesOptions, ListDirectoryGroupsOptions, ListDirectoryUsersOptions } from './interfaces';
4
+ import { List } from '../common/interfaces';
9
5
  export declare class DirectorySync {
10
6
  private readonly workos;
11
7
  constructor(workos: WorkOS);
12
- listDirectories(options?: ListDirectoriesOptions): Promise<List<Directory>>;
8
+ listDirectories(options?: ListDirectoriesOptions): Promise<AutoPaginatable<Directory>>;
13
9
  getDirectory(id: string): Promise<Directory>;
14
10
  deleteDirectory(id: string): Promise<void>;
15
- listGroups(options: ListGroupsOptions): Promise<List<Group>>;
16
- listUsers<TCustomAttributes extends object = DefaultCustomAttributes>(options: ListUsersOptions): Promise<List<UserWithGroups<TCustomAttributes>>>;
17
- getUser<TCustomAttributes extends object = DefaultCustomAttributes>(user: string): Promise<UserWithGroups<TCustomAttributes>>;
18
- getGroup(group: string): Promise<Group>;
11
+ listGroups(options: ListDirectoryGroupsOptions): Promise<List<DirectoryGroup>>;
12
+ listUsers<TCustomAttributes extends object = DefaultCustomAttributes>(options: ListDirectoryUsersOptions): Promise<List<DirectoryUserWithGroups<TCustomAttributes>>>;
13
+ getUser<TCustomAttributes extends object = DefaultCustomAttributes>(user: string): Promise<DirectoryUserWithGroups<TCustomAttributes>>;
14
+ getGroup(group: string): Promise<DirectoryGroup>;
19
15
  }
@@ -10,22 +10,22 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.DirectorySync = void 0;
13
+ const pagination_1 = require("../common/utils/pagination");
14
+ const serializers_1 = require("./serializers");
15
+ const fetch_and_deserialize_1 = require("../common/utils/fetch-and-deserialize");
13
16
  class DirectorySync {
14
17
  constructor(workos) {
15
18
  this.workos = workos;
16
19
  }
17
20
  listDirectories(options) {
18
21
  return __awaiter(this, void 0, void 0, function* () {
19
- const { data } = yield this.workos.get('/directories', {
20
- query: options,
21
- });
22
- return data;
22
+ return new pagination_1.AutoPaginatable(yield (0, fetch_and_deserialize_1.fetchAndDeserialize)(this.workos, '/directories', serializers_1.deserializeDirectory, options), (params) => (0, fetch_and_deserialize_1.fetchAndDeserialize)(this.workos, '/directories', serializers_1.deserializeDirectory, params), options);
23
23
  });
24
24
  }
25
25
  getDirectory(id) {
26
26
  return __awaiter(this, void 0, void 0, function* () {
27
27
  const { data } = yield this.workos.get(`/directories/${id}`);
28
- return data;
28
+ return (0, serializers_1.deserializeDirectory)(data);
29
29
  });
30
30
  }
31
31
  deleteDirectory(id) {
@@ -35,30 +35,24 @@ class DirectorySync {
35
35
  }
36
36
  listGroups(options) {
37
37
  return __awaiter(this, void 0, void 0, function* () {
38
- const { data } = yield this.workos.get(`/directory_groups`, {
39
- query: options,
40
- });
41
- return data;
38
+ return new pagination_1.AutoPaginatable(yield (0, fetch_and_deserialize_1.fetchAndDeserialize)(this.workos, '/directory_groups', serializers_1.deserializeDirectoryGroup, options), (params) => (0, fetch_and_deserialize_1.fetchAndDeserialize)(this.workos, '/directory_groups', serializers_1.deserializeDirectoryGroup, params), options);
42
39
  });
43
40
  }
44
41
  listUsers(options) {
45
42
  return __awaiter(this, void 0, void 0, function* () {
46
- const { data } = yield this.workos.get(`/directory_users`, {
47
- query: options,
48
- });
49
- return data;
43
+ return new pagination_1.AutoPaginatable(yield (0, fetch_and_deserialize_1.fetchAndDeserialize)(this.workos, '/directory_users', serializers_1.deserializeDirectoryUserWithGroups, options), (params) => (0, fetch_and_deserialize_1.fetchAndDeserialize)(this.workos, '/directory_users', serializers_1.deserializeDirectoryUserWithGroups, params), options);
50
44
  });
51
45
  }
52
46
  getUser(user) {
53
47
  return __awaiter(this, void 0, void 0, function* () {
54
48
  const { data } = yield this.workos.get(`/directory_users/${user}`);
55
- return data;
49
+ return (0, serializers_1.deserializeDirectoryUserWithGroups)(data);
56
50
  });
57
51
  }
58
52
  getGroup(group) {
59
53
  return __awaiter(this, void 0, void 0, function* () {
60
54
  const { data } = yield this.workos.get(`/directory_groups/${group}`);
61
- return data;
55
+ return (0, serializers_1.deserializeDirectoryGroup)(data);
62
56
  });
63
57
  }
64
58
  }
@@ -19,6 +19,18 @@ const mock = new axios_mock_adapter_1.default(axios_1.default);
19
19
  describe('DirectorySync', () => {
20
20
  afterEach(() => mock.resetHistory());
21
21
  const workos = new workos_1.WorkOS('sk_test_Sz3IQjepeSWaI4cMS4ms4sMuU');
22
+ const directory = {
23
+ id: 'directory_123',
24
+ createdAt: '2020-05-06 04:21:48.649164',
25
+ domain: 'foo-corp.com',
26
+ externalKey: '9asBRBVHz2ASEkgg',
27
+ name: 'Foo',
28
+ object: 'directory',
29
+ organizationId: 'org_01EXSR7M9QTKCC5D531SMCWMYG',
30
+ state: 'active',
31
+ type: 'okta scim v1.1',
32
+ updatedAt: '2021-12-13 12:15:45.531847',
33
+ };
22
34
  const directoryResponse = {
23
35
  id: 'directory_123',
24
36
  created_at: '2020-05-06 04:21:48.649164',
@@ -29,7 +41,19 @@ describe('DirectorySync', () => {
29
41
  organization_id: 'org_01EXSR7M9QTKCC5D531SMCWMYG',
30
42
  state: 'linked',
31
43
  type: 'okta scim v1.1',
32
- updated_at: '2021-10-27 15:21:50.640958',
44
+ updated_at: '2021-12-13 12:15:45.531847',
45
+ };
46
+ const group = {
47
+ id: 'dir_grp_123',
48
+ idpId: '123',
49
+ directoryId: 'dir_123',
50
+ organizationId: 'org_123',
51
+ name: 'Foo Group',
52
+ createdAt: '2021-10-27 15:21:50.640958',
53
+ updatedAt: '2021-12-13 12:15:45.531847',
54
+ rawAttributes: {
55
+ foo: 'bar',
56
+ },
33
57
  };
34
58
  const groupResponse = {
35
59
  id: 'dir_grp_123',
@@ -37,13 +61,40 @@ describe('DirectorySync', () => {
37
61
  directory_id: 'dir_123',
38
62
  organization_id: 'org_123',
39
63
  name: 'Foo Group',
40
- created_at: `2021-10-27 15:21:50.640958`,
41
- updated_at: '2021-10-27 15:21:50.640959',
64
+ created_at: '2021-10-27 15:21:50.640958',
65
+ updated_at: '2021-12-13 12:15:45.531847',
42
66
  raw_attributes: {
43
67
  foo: 'bar',
44
68
  },
45
69
  };
70
+ const userWithGroup = {
71
+ object: 'directory_user',
72
+ id: 'user_123',
73
+ customAttributes: {
74
+ custom: true,
75
+ },
76
+ directoryId: 'dir_123',
77
+ organizationId: 'org_123',
78
+ emails: [
79
+ {
80
+ primary: true,
81
+ type: 'type',
82
+ value: 'jonsnow@workos.com',
83
+ },
84
+ ],
85
+ firstName: 'Jon',
86
+ groups: [group],
87
+ idpId: 'idp_foo',
88
+ lastName: 'Snow',
89
+ jobTitle: 'Knight of the Watch',
90
+ rawAttributes: {},
91
+ state: 'active',
92
+ username: 'jonsnow',
93
+ createdAt: '2021-10-27 15:21:50.640959',
94
+ updatedAt: '2021-12-13 12:15:45.531847',
95
+ };
46
96
  const userWithGroupResponse = {
97
+ object: 'directory_user',
47
98
  id: 'user_123',
48
99
  custom_attributes: {
49
100
  custom: true,
@@ -65,6 +116,8 @@ describe('DirectorySync', () => {
65
116
  raw_attributes: {},
66
117
  state: 'active',
67
118
  username: 'jonsnow',
119
+ created_at: '2021-10-27 15:21:50.640959',
120
+ updated_at: '2021-12-13 12:15:45.531847',
68
121
  };
69
122
  describe('listDirectories', () => {
70
123
  describe('with options', () => {
@@ -79,10 +132,21 @@ describe('DirectorySync', () => {
79
132
  domain: 'google.com',
80
133
  })
81
134
  .replyOnce(200, directoryListResponse);
82
- const directories = yield workos.directorySync.listDirectories({
135
+ const subject = yield workos.directorySync.listDirectories({
83
136
  domain: 'google.com',
84
137
  });
85
- expect(directories).toEqual(directoryListResponse);
138
+ expect(subject).toMatchObject({
139
+ object: 'list',
140
+ list: {
141
+ object: 'list',
142
+ data: [directory],
143
+ listMetadata: {},
144
+ },
145
+ apiCall: expect.any(Function),
146
+ options: {
147
+ domain: 'google.com',
148
+ },
149
+ });
86
150
  }));
87
151
  });
88
152
  });
@@ -91,8 +155,8 @@ describe('DirectorySync', () => {
91
155
  mock
92
156
  .onGet('/directories/directory_123')
93
157
  .replyOnce(200, directoryResponse);
94
- const directory = yield workos.directorySync.getDirectory('directory_123');
95
- expect(directory).toEqual(directoryResponse);
158
+ const subject = yield workos.directorySync.getDirectory('directory_123');
159
+ expect(subject).toEqual(directory);
96
160
  }));
97
161
  });
98
162
  describe('deleteDirectory', () => {
@@ -105,8 +169,8 @@ describe('DirectorySync', () => {
105
169
  describe('getGroup', () => {
106
170
  it(`requests a Directory Group`, () => __awaiter(void 0, void 0, void 0, function* () {
107
171
  mock.onGet('/directory_groups/dir_grp_123').replyOnce(200, groupResponse);
108
- const group = yield workos.directorySync.getGroup('dir_grp_123');
109
- expect(group).toEqual(groupResponse);
172
+ const subject = yield workos.directorySync.getGroup('dir_grp_123');
173
+ expect(subject).toEqual(group);
110
174
  }));
111
175
  });
112
176
  describe('listGroups', () => {
@@ -122,10 +186,21 @@ describe('DirectorySync', () => {
122
186
  directory: 'directory_123',
123
187
  })
124
188
  .replyOnce(200, groupListResponse);
125
- const list = yield workos.directorySync.listGroups({
189
+ const subject = yield workos.directorySync.listGroups({
126
190
  directory: 'directory_123',
127
191
  });
128
- expect(list).toEqual(groupListResponse);
192
+ expect(subject).toMatchObject({
193
+ object: 'list',
194
+ list: {
195
+ object: 'list',
196
+ data: [group],
197
+ listMetadata: {},
198
+ },
199
+ apiCall: expect.any(Function),
200
+ options: {
201
+ directory: 'directory_123',
202
+ },
203
+ });
129
204
  }));
130
205
  });
131
206
  describe('with a User', () => {
@@ -135,10 +210,21 @@ describe('DirectorySync', () => {
135
210
  user: 'directory_usr_123',
136
211
  })
137
212
  .replyOnce(200, groupListResponse);
138
- const list = yield workos.directorySync.listGroups({
213
+ const subject = yield workos.directorySync.listGroups({
139
214
  user: 'directory_usr_123',
140
215
  });
141
- expect(list).toEqual(groupListResponse);
216
+ expect(subject).toEqual({
217
+ object: 'list',
218
+ list: {
219
+ object: 'list',
220
+ data: [group],
221
+ listMetadata: {},
222
+ },
223
+ apiCall: expect.any(Function),
224
+ options: {
225
+ user: 'directory_usr_123',
226
+ },
227
+ });
142
228
  }));
143
229
  });
144
230
  });
@@ -155,10 +241,21 @@ describe('DirectorySync', () => {
155
241
  directory: 'directory_123',
156
242
  })
157
243
  .replyOnce(200, userWithGroupListResponse);
158
- const list = yield workos.directorySync.listUsers({
244
+ const subject = yield workos.directorySync.listUsers({
159
245
  directory: 'directory_123',
160
246
  });
161
- expect(list).toEqual(userWithGroupListResponse);
247
+ expect(subject).toMatchObject({
248
+ object: 'list',
249
+ list: {
250
+ object: 'list',
251
+ data: [userWithGroup],
252
+ listMetadata: {},
253
+ },
254
+ apiCall: expect.any(Function),
255
+ options: {
256
+ directory: 'directory_123',
257
+ },
258
+ });
162
259
  }));
163
260
  describe('with custom attributes', () => {
164
261
  it('returns the custom attributes, using the provided type', () => __awaiter(void 0, void 0, void 0, function* () {
@@ -179,6 +276,8 @@ describe('DirectorySync', () => {
179
276
  last_name: 'Stoltenberg',
180
277
  job_title: 'Software Engineer',
181
278
  state: 'active',
279
+ created_at: '2021-10-27 15:21:50.640959',
280
+ updated_at: '2021-12-13 12:15:45.531847',
182
281
  raw_attributes: {},
183
282
  custom_attributes: {
184
283
  managerId: '99f1817b-149c-4438-b80f-a272c3406109',
@@ -204,6 +303,8 @@ describe('DirectorySync', () => {
204
303
  last_name: 'Leffler',
205
304
  job_title: 'Software Engineer',
206
305
  state: 'active',
306
+ created_at: '2021-10-27 15:21:50.640959',
307
+ updated_at: '2021-12-13 12:15:45.531847',
207
308
  raw_attributes: {},
208
309
  custom_attributes: {
209
310
  managerId: '263c7472-4d3f-4ab4-8162-e768af103065',
@@ -223,7 +324,7 @@ describe('DirectorySync', () => {
223
324
  const users = yield workos.directorySync.listUsers({
224
325
  directory: 'directory_123',
225
326
  });
226
- const managerIds = users.data.map((user) => user.custom_attributes.managerId);
327
+ const managerIds = users.data.map((user) => user.customAttributes.managerId);
227
328
  expect(managerIds).toEqual([
228
329
  '99f1817b-149c-4438-b80f-a272c3406109',
229
330
  '263c7472-4d3f-4ab4-8162-e768af103065',
@@ -238,10 +339,21 @@ describe('DirectorySync', () => {
238
339
  group: 'directory_grp_123',
239
340
  })
240
341
  .replyOnce(200, userWithGroupListResponse);
241
- const list = yield workos.directorySync.listUsers({
342
+ const subject = yield workos.directorySync.listUsers({
242
343
  group: 'directory_grp_123',
243
344
  });
244
- expect(list).toEqual(userWithGroupListResponse);
345
+ expect(subject).toMatchObject({
346
+ object: 'list',
347
+ list: {
348
+ object: 'list',
349
+ data: [userWithGroup],
350
+ listMetadata: {},
351
+ },
352
+ apiCall: expect.any(Function),
353
+ options: {
354
+ group: 'directory_grp_123',
355
+ },
356
+ });
245
357
  }));
246
358
  });
247
359
  });
@@ -250,8 +362,8 @@ describe('DirectorySync', () => {
250
362
  mock
251
363
  .onGet('/directory_users/dir_usr_123')
252
364
  .replyOnce(200, userWithGroupResponse);
253
- const user = yield workos.directorySync.getUser('dir_usr_123');
254
- expect(user).toEqual(userWithGroupResponse);
365
+ const subject = yield workos.directorySync.getUser('dir_usr_123');
366
+ expect(subject).toEqual(userWithGroup);
255
367
  }));
256
368
  });
257
369
  });