@app-connect/core 1.7.37 → 1.7.38

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 (286) hide show
  1. package/README.md +17 -16
  2. package/dist/connector/developerPortal.d.ts +6 -0
  3. package/{connector → dist/connector}/developerPortal.js +29 -12
  4. package/dist/connector/mock.d.ts +1 -0
  5. package/{connector → dist/connector}/mock.js +33 -17
  6. package/dist/connector/proxy/engine.d.ts +10 -0
  7. package/dist/connector/proxy/engine.js +222 -0
  8. package/dist/connector/proxy/index.d.ts +5 -0
  9. package/dist/connector/proxy/index.js +511 -0
  10. package/dist/connector/registry.d.ts +1 -0
  11. package/dist/connector/registry.js +243 -0
  12. package/dist/handlers/admin.d.ts +1 -0
  13. package/{handlers → dist/handlers}/admin.js +137 -78
  14. package/dist/handlers/appointment.d.ts +9 -0
  15. package/{handlers → dist/handlers}/appointment.js +58 -29
  16. package/dist/handlers/auth.d.ts +9 -0
  17. package/{handlers → dist/handlers}/auth.js +68 -40
  18. package/dist/handlers/calldown.d.ts +10 -0
  19. package/dist/handlers/calldown.js +134 -0
  20. package/dist/handlers/contact.d.ts +1 -0
  21. package/{handlers → dist/handlers}/contact.js +61 -39
  22. package/dist/handlers/disposition.d.ts +1 -0
  23. package/{handlers → dist/handlers}/disposition.js +20 -10
  24. package/dist/handlers/log.d.ts +1 -0
  25. package/{handlers → dist/handlers}/log.js +91 -124
  26. package/dist/handlers/managedAuth.d.ts +1 -0
  27. package/{handlers → dist/handlers}/managedAuth.js +134 -61
  28. package/dist/handlers/managedOAuth.d.ts +13 -0
  29. package/{handlers → dist/handlers}/managedOAuth.js +102 -30
  30. package/dist/handlers/plugin.d.ts +1 -0
  31. package/{handlers → dist/handlers}/plugin.js +59 -27
  32. package/dist/handlers/user.d.ts +1 -0
  33. package/{handlers → dist/handlers}/user.js +45 -27
  34. package/dist/index.d.ts +1 -0
  35. package/{index.js → dist/index.js} +538 -449
  36. package/dist/jest.config.d.ts +1 -0
  37. package/dist/jest.config.js +65 -0
  38. package/dist/lib/analytics.d.ts +4 -0
  39. package/{lib → dist/lib}/analytics.js +8 -6
  40. package/dist/lib/authSession.d.ts +5 -0
  41. package/{lib → dist/lib}/authSession.js +15 -43
  42. package/dist/lib/cacheCleanup.d.ts +4 -0
  43. package/{lib → dist/lib}/cacheCleanup.js +5 -17
  44. package/dist/lib/callLogComposer.d.ts +109 -0
  45. package/{lib → dist/lib}/callLogComposer.js +157 -197
  46. package/dist/lib/callLogLookup.d.ts +6 -0
  47. package/{lib → dist/lib}/callLogLookup.js +12 -34
  48. package/dist/lib/constants.d.ts +6 -0
  49. package/dist/lib/constants.js +9 -0
  50. package/dist/lib/debugTracer.d.ts +17 -0
  51. package/{lib → dist/lib}/debugTracer.js +7 -83
  52. package/dist/lib/encode.d.ts +3 -0
  53. package/dist/lib/encode.js +50 -0
  54. package/dist/lib/errorHandler.d.ts +7 -0
  55. package/dist/lib/errorHandler.js +161 -0
  56. package/dist/lib/generalErrorMessage.d.ts +7 -0
  57. package/{lib → dist/lib}/generalErrorMessage.js +6 -6
  58. package/dist/lib/jwt.d.ts +4 -0
  59. package/dist/lib/jwt.js +18 -0
  60. package/dist/lib/logger.d.ts +24 -0
  61. package/dist/lib/logger.js +126 -0
  62. package/dist/lib/migrateCallLogsSchema.d.ts +32 -0
  63. package/{lib → dist/lib}/migrateCallLogsSchema.js +75 -160
  64. package/dist/lib/oauth.d.ts +4 -0
  65. package/{lib → dist/lib}/oauth.js +157 -160
  66. package/dist/lib/ringcentral.d.ts +24 -0
  67. package/dist/lib/ringcentral.js +226 -0
  68. package/dist/lib/s3ErrorLogReport.d.ts +4 -0
  69. package/{lib → dist/lib}/s3ErrorLogReport.js +11 -23
  70. package/dist/lib/sharedSMSComposer.d.ts +7 -0
  71. package/{lib → dist/lib}/sharedSMSComposer.js +21 -107
  72. package/dist/lib/util.d.ts +7 -0
  73. package/{lib → dist/lib}/util.js +9 -20
  74. package/dist/mcp/lib/oauthError.d.ts +1 -0
  75. package/dist/mcp/lib/oauthError.js +25 -0
  76. package/dist/mcp/lib/validator.d.ts +1 -0
  77. package/{mcp → dist/mcp}/lib/validator.js +16 -20
  78. package/dist/mcp/lib/widgetSessionToken.d.ts +1 -0
  79. package/dist/mcp/lib/widgetSessionToken.js +46 -0
  80. package/dist/mcp/mcpHandler.d.ts +8 -0
  81. package/{mcp → dist/mcp}/mcpHandler.js +98 -88
  82. package/dist/mcp/tools/cancelAppointment.d.ts +1 -0
  83. package/{mcp → dist/mcp}/tools/cancelAppointment.js +7 -16
  84. package/dist/mcp/tools/checkAuthStatus.d.ts +1 -0
  85. package/{mcp → dist/mcp}/tools/checkAuthStatus.js +21 -14
  86. package/dist/mcp/tools/confirmAppointment.d.ts +1 -0
  87. package/{mcp → dist/mcp}/tools/confirmAppointment.js +7 -16
  88. package/dist/mcp/tools/createAppointment.d.ts +1 -0
  89. package/{mcp → dist/mcp}/tools/createAppointment.js +7 -19
  90. package/dist/mcp/tools/createCallLog.d.ts +1 -0
  91. package/{mcp → dist/mcp}/tools/createCallLog.js +18 -29
  92. package/dist/mcp/tools/createContact.d.ts +1 -0
  93. package/{mcp → dist/mcp}/tools/createContact.js +8 -20
  94. package/dist/mcp/tools/createMessageLog.d.ts +1 -0
  95. package/{mcp → dist/mcp}/tools/createMessageLog.js +14 -26
  96. package/dist/mcp/tools/doAuth.d.ts +1 -0
  97. package/{mcp → dist/mcp}/tools/doAuth.js +17 -13
  98. package/dist/mcp/tools/findContactByName.d.ts +1 -0
  99. package/{mcp → dist/mcp}/tools/findContactByName.js +9 -15
  100. package/dist/mcp/tools/findContactByPhone.d.ts +1 -0
  101. package/{mcp → dist/mcp}/tools/findContactByPhone.js +8 -15
  102. package/dist/mcp/tools/getCallLog.d.ts +1 -0
  103. package/{mcp → dist/mcp}/tools/getCallLog.js +12 -21
  104. package/dist/mcp/tools/getGoogleFilePicker.d.ts +1 -0
  105. package/{mcp → dist/mcp}/tools/getGoogleFilePicker.js +9 -18
  106. package/dist/mcp/tools/getHelp.d.ts +1 -0
  107. package/{mcp → dist/mcp}/tools/getHelp.js +5 -6
  108. package/dist/mcp/tools/getPublicConnectors.d.ts +1 -0
  109. package/{mcp → dist/mcp}/tools/getPublicConnectors.js +19 -18
  110. package/dist/mcp/tools/getSessionInfo.d.ts +1 -0
  111. package/{mcp → dist/mcp}/tools/getSessionInfo.js +10 -16
  112. package/dist/mcp/tools/index.d.ts +8 -0
  113. package/dist/mcp/tools/index.js +50 -0
  114. package/dist/mcp/tools/listAppointments.d.ts +1 -0
  115. package/{mcp → dist/mcp}/tools/listAppointments.js +7 -19
  116. package/dist/mcp/tools/logout.d.ts +1 -0
  117. package/{mcp → dist/mcp}/tools/logout.js +16 -14
  118. package/dist/mcp/tools/rcGetCallLogs.d.ts +1 -0
  119. package/{mcp → dist/mcp}/tools/rcGetCallLogs.js +10 -8
  120. package/dist/mcp/tools/updateAppointment.d.ts +1 -0
  121. package/{mcp → dist/mcp}/tools/updateAppointment.js +17 -22
  122. package/dist/mcp/tools/updateCallLog.d.ts +1 -0
  123. package/{mcp → dist/mcp}/tools/updateCallLog.js +16 -26
  124. package/dist/models/accountDataModel.d.ts +3 -0
  125. package/dist/models/accountDataModel.js +39 -0
  126. package/dist/models/adminConfigModel.d.ts +2 -0
  127. package/dist/models/adminConfigModel.js +39 -0
  128. package/dist/models/cacheModel.d.ts +2 -0
  129. package/{models → dist/models}/cacheModel.js +7 -3
  130. package/dist/models/callDownListModel.d.ts +2 -0
  131. package/{models → dist/models}/callDownListModel.js +8 -4
  132. package/dist/models/callLogModel.d.ts +2 -0
  133. package/dist/models/callLogModel.js +43 -0
  134. package/dist/models/dynamo/connectorSchema.d.ts +2 -0
  135. package/dist/models/dynamo/connectorSchema.js +141 -0
  136. package/dist/models/dynamo/lockSchema.d.ts +2 -0
  137. package/{models → dist/models}/dynamo/lockSchema.js +5 -7
  138. package/dist/models/dynamo/noteCacheSchema.d.ts +2 -0
  139. package/{models → dist/models}/dynamo/noteCacheSchema.js +4 -6
  140. package/dist/models/llmSessionModel.d.ts +2 -0
  141. package/dist/models/llmSessionModel.js +21 -0
  142. package/dist/models/messageLogModel.d.ts +2 -0
  143. package/{models → dist/models}/messageLogModel.js +8 -4
  144. package/dist/models/sequelize.d.ts +2 -0
  145. package/dist/models/sequelize.js +68 -0
  146. package/dist/models/userModel.d.ts +2 -0
  147. package/dist/models/userModel.js +49 -0
  148. package/dist/package.json +100 -0
  149. package/dist/releaseNotes.json +1222 -0
  150. package/dist/tsconfig.json +14 -0
  151. package/dist/types/admin.d.ts +141 -0
  152. package/dist/types/analytics.d.ts +14 -0
  153. package/dist/types/appointment.d.ts +50 -0
  154. package/dist/types/auth.d.ts +137 -0
  155. package/dist/types/authSession.d.ts +35 -0
  156. package/dist/types/cacheCleanup.d.ts +12 -0
  157. package/dist/types/calldown.d.ts +54 -0
  158. package/dist/types/common.d.ts +46 -0
  159. package/dist/types/connector.d.ts +165 -0
  160. package/dist/types/contact.d.ts +125 -0
  161. package/dist/types/errorHandler.d.ts +60 -0
  162. package/dist/types/index.d.ts +76 -0
  163. package/dist/types/json.d.ts +9 -0
  164. package/dist/types/jwt.d.ts +8 -0
  165. package/dist/types/logging.d.ts +224 -0
  166. package/dist/types/managedAuth.d.ts +114 -0
  167. package/dist/types/managedOAuth.d.ts +59 -0
  168. package/dist/types/manifest.d.ts +120 -0
  169. package/dist/types/migration.d.ts +15 -0
  170. package/dist/types/plugin.d.ts +74 -0
  171. package/dist/types/ringcentral.d.ts +61 -0
  172. package/dist/types/s3ErrorLogReport.d.ts +16 -0
  173. package/dist/types/sharedSMSComposer.d.ts +105 -0
  174. package/dist/types/user.d.ts +46 -0
  175. package/dist/types/util.d.ts +7 -0
  176. package/package.json +34 -6
  177. package/releaseNotes.json +8 -0
  178. package/.env.test +0 -5
  179. package/connector/proxy/engine.js +0 -165
  180. package/connector/proxy/index.js +0 -500
  181. package/connector/registry.js +0 -252
  182. package/docs/README.md +0 -50
  183. package/docs/architecture.md +0 -94
  184. package/docs/connectors.md +0 -116
  185. package/docs/handlers.md +0 -128
  186. package/docs/libraries.md +0 -98
  187. package/docs/models.md +0 -146
  188. package/docs/routes.md +0 -119
  189. package/docs/tests.md +0 -73
  190. package/handlers/calldown.js +0 -99
  191. package/jest.config.js +0 -57
  192. package/lib/constants.js +0 -9
  193. package/lib/encode.js +0 -30
  194. package/lib/errorHandler.js +0 -218
  195. package/lib/jwt.js +0 -18
  196. package/lib/logger.js +0 -190
  197. package/lib/ringcentral.js +0 -267
  198. package/mcp/README.md +0 -420
  199. package/mcp/tools/index.js +0 -51
  200. package/mcp/ui/App/App.tsx +0 -358
  201. package/mcp/ui/App/components/AuthInfoForm.tsx +0 -113
  202. package/mcp/ui/App/components/AuthSuccess.tsx +0 -22
  203. package/mcp/ui/App/components/ConnectorList.tsx +0 -82
  204. package/mcp/ui/App/components/DebugPanel.tsx +0 -43
  205. package/mcp/ui/App/components/OAuthConnect.tsx +0 -270
  206. package/mcp/ui/App/lib/callTool.ts +0 -130
  207. package/mcp/ui/App/lib/debugLog.ts +0 -41
  208. package/mcp/ui/App/lib/developerPortal.ts +0 -111
  209. package/mcp/ui/App/main.css +0 -6
  210. package/mcp/ui/App/root.tsx +0 -13
  211. package/mcp/ui/dist/index.html +0 -53
  212. package/mcp/ui/vite.config.ts +0 -16
  213. package/models/accountDataModel.js +0 -34
  214. package/models/adminConfigModel.js +0 -35
  215. package/models/callLogModel.js +0 -39
  216. package/models/dynamo/connectorSchema.js +0 -146
  217. package/models/llmSessionModel.js +0 -17
  218. package/models/sequelize.js +0 -17
  219. package/models/userModel.js +0 -45
  220. package/test/connector/developerPortal.test.js +0 -166
  221. package/test/connector/mock.test.js +0 -131
  222. package/test/connector/proxy/engine.test.js +0 -211
  223. package/test/connector/proxy/index.test.js +0 -525
  224. package/test/connector/proxy/sample.json +0 -162
  225. package/test/connector/registry.test.js +0 -416
  226. package/test/handlers/admin.test.js +0 -960
  227. package/test/handlers/appointment.test.js +0 -260
  228. package/test/handlers/auth.test.js +0 -1096
  229. package/test/handlers/calldown.test.js +0 -310
  230. package/test/handlers/contact.test.js +0 -1014
  231. package/test/handlers/disposition.test.js +0 -396
  232. package/test/handlers/log.test.js +0 -1847
  233. package/test/handlers/managedAuth.test.js +0 -458
  234. package/test/handlers/managedOAuth.test.js +0 -262
  235. package/test/handlers/plugin.test.js +0 -429
  236. package/test/handlers/user.test.js +0 -381
  237. package/test/index.test.js +0 -301
  238. package/test/lib/analytics.test.js +0 -146
  239. package/test/lib/authSession.test.js +0 -173
  240. package/test/lib/cacheCleanup.test.js +0 -127
  241. package/test/lib/callLogComposer.test.js +0 -1231
  242. package/test/lib/debugTracer.test.js +0 -328
  243. package/test/lib/encode.test.js +0 -59
  244. package/test/lib/errorHandler.test.js +0 -246
  245. package/test/lib/generalErrorMessage.test.js +0 -82
  246. package/test/lib/jwt.test.js +0 -176
  247. package/test/lib/logger.test.js +0 -206
  248. package/test/lib/oauth.test.js +0 -359
  249. package/test/lib/ringcentral.test.js +0 -467
  250. package/test/lib/s3ErrorLogReport.test.js +0 -187
  251. package/test/lib/sharedSMSComposer.test.js +0 -1084
  252. package/test/lib/util.test.js +0 -329
  253. package/test/mcp/mcpHandler.test.js +0 -73
  254. package/test/mcp/mcpHandlerMore.test.js +0 -384
  255. package/test/mcp/tools/appointmentTools.test.js +0 -362
  256. package/test/mcp/tools/checkAuthStatus.test.js +0 -83
  257. package/test/mcp/tools/createCallLog.test.js +0 -436
  258. package/test/mcp/tools/createContact.test.js +0 -58
  259. package/test/mcp/tools/createMessageLog.test.js +0 -595
  260. package/test/mcp/tools/doAuth.test.js +0 -113
  261. package/test/mcp/tools/findContactByName.test.js +0 -275
  262. package/test/mcp/tools/findContactByPhone.test.js +0 -296
  263. package/test/mcp/tools/getCallLog.test.js +0 -298
  264. package/test/mcp/tools/getGoogleFilePicker.test.js +0 -281
  265. package/test/mcp/tools/getPublicConnectors.test.js +0 -107
  266. package/test/mcp/tools/getSessionInfo.test.js +0 -127
  267. package/test/mcp/tools/logout.test.js +0 -233
  268. package/test/mcp/tools/rcGetCallLogs.test.js +0 -56
  269. package/test/mcp/tools/updateCallLog.test.js +0 -360
  270. package/test/models/accountDataModel.test.js +0 -98
  271. package/test/models/callDownListModel.test.js +0 -125
  272. package/test/models/dynamo/connectorSchema.test.js +0 -189
  273. package/test/models/dynamo/lockSchema.test.js +0 -37
  274. package/test/models/dynamo/noteCacheSchema.test.js +0 -45
  275. package/test/models/llmSessionModel.test.js +0 -91
  276. package/test/models/models.test.js +0 -660
  277. package/test/routes/calldownRoutes.test.js +0 -224
  278. package/test/routes/coreRouterBroadRoutes.test.js +0 -855
  279. package/test/routes/dispositionRoutes.test.js +0 -192
  280. package/test/routes/managedAuthRoutes.test.js +0 -386
  281. package/test/routes/pluginRoutes.test.js +0 -262
  282. package/test/setup.js +0 -178
  283. /package/{mcp → dist/mcp}/ui/index.html +0 -0
  284. /package/{mcp → dist/mcp}/ui/package-lock.json +0 -0
  285. /package/{mcp → dist/mcp}/ui/package.json +0 -0
  286. /package/{mcp → dist/mcp}/ui/tsconfig.json +0 -0
@@ -1,7 +1,23 @@
1
- const { AccountDataModel } = require('../models/accountDataModel');
2
- const { CacheModel } = require('../models/cacheModel');
3
- const { encode, decoded } = require('../lib/encode');
4
-
1
+ "use strict";
2
+ // @ts-check
3
+ /** @typedef {import('../types').ManagedOAuthAccountParams} ManagedOAuthAccountParams */
4
+ /** @typedef {import('../types').ManagedOAuthPendingParams} ManagedOAuthPendingParams */
5
+ /** @typedef {import('../types').ManagedOAuthRecord} ManagedOAuthRecord */
6
+ /** @typedef {import('../types').ManagedOAuthResolution} ManagedOAuthResolution */
7
+ /** @typedef {import('../types').ManagedOAuthState} ManagedOAuthState */
8
+ /** @typedef {import('../types').ManagedOAuthStateParams} ManagedOAuthStateParams */
9
+ /** @typedef {import('../types').ManagedOAuthStoredData} ManagedOAuthStoredData */
10
+ /** @typedef {import('../types').ManagedOAuthStoredValue} ManagedOAuthStoredValue */
11
+ /** @typedef {import('../types').ManagedOAuthValue} ManagedOAuthValue */
12
+ /** @typedef {import('../types').ManagedOAuthValues} ManagedOAuthValues */
13
+ /** @typedef {import('../types').ResetManagedOAuthResult} ResetManagedOAuthResult */
14
+ /** @typedef {import('../types').UpsertPendingManagedOAuthParams} UpsertPendingManagedOAuthParams */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ const { AccountDataModel: AccountDataModelImport } = require('../models/accountDataModel');
17
+ const { CacheModel: CacheModelImport } = require('../models/cacheModel');
18
+ const AccountDataModel = /** @type {any} */ (AccountDataModelImport);
19
+ const CacheModel = /** @type {any} */ (CacheModelImport);
20
+ const { encode, decoded } = /** @type {{ encode(data: string): string, decoded(data: string): string }} */ (require('../lib/encode'));
5
21
  const MANAGED_OAUTH_ACCOUNT_DATA_KEY = 'managed-oauth-account';
6
22
  const MANAGED_OAUTH_CACHE_TTL_MS = 24 * 60 * 60 * 1000;
7
23
  const MANAGED_OAUTH_FIELDS = [
@@ -13,15 +29,24 @@ const MANAGED_OAUTH_FIELDS = [
13
29
  'scopes',
14
30
  'hostname'
15
31
  ];
16
-
32
+ /**
33
+ * @param {ManagedOAuthPendingParams} params
34
+ * @returns {string}
35
+ */
17
36
  function getPendingManagedOAuthCacheId({ rcAccountId }) {
18
37
  return `${rcAccountId}-${MANAGED_OAUTH_ACCOUNT_DATA_KEY}`;
19
38
  }
20
-
39
+ /**
40
+ * @param {unknown} value
41
+ * @returns {boolean}
42
+ */
21
43
  function isFilled(value) {
22
44
  return value !== undefined && value !== null && value !== '';
23
45
  }
24
-
46
+ /**
47
+ * @param {ManagedOAuthValue} value
48
+ * @returns {ManagedOAuthStoredValue}
49
+ */
25
50
  function encryptStoredValue(value) {
26
51
  return {
27
52
  version: 1,
@@ -29,19 +54,26 @@ function encryptStoredValue(value) {
29
54
  value: encode(JSON.stringify(value))
30
55
  };
31
56
  }
32
-
57
+ /**
58
+ * @param {ManagedOAuthStoredValue | ManagedOAuthValue} value
59
+ * @returns {ManagedOAuthValue | undefined}
60
+ */
33
61
  function decryptStoredValue(value) {
34
62
  if (!value) {
35
63
  return undefined;
36
64
  }
37
- if (value?.encrypted && value?.value) {
38
- return JSON.parse(decoded(value.value));
65
+ const storedValue = /** @type {ManagedOAuthStoredValue} */ (value);
66
+ if (storedValue?.encrypted && storedValue?.value) {
67
+ return JSON.parse(decoded(storedValue.value));
39
68
  }
40
69
  return value;
41
70
  }
42
-
71
+ /**
72
+ * @param {ManagedOAuthValues} [values]
73
+ * @returns {ManagedOAuthValues}
74
+ */
43
75
  function normalizeManagedOAuthValues(values = {}) {
44
- const normalized = {};
76
+ const normalized = /** @type {ManagedOAuthValues} */ ({});
45
77
  MANAGED_OAUTH_FIELDS.forEach(field => {
46
78
  if (isFilled(values[field])) {
47
79
  normalized[field] = values[field];
@@ -49,31 +81,43 @@ function normalizeManagedOAuthValues(values = {}) {
49
81
  });
50
82
  return normalized;
51
83
  }
52
-
84
+ /**
85
+ * @param {ManagedOAuthValues} [values]
86
+ * @returns {ManagedOAuthStoredData}
87
+ */
53
88
  function buildStoredData(values = {}) {
54
89
  const normalized = normalizeManagedOAuthValues(values);
55
- const fields = {};
90
+ const fields = /** @type {Record<string, ManagedOAuthStoredValue>} */ ({});
56
91
  Object.keys(normalized).forEach(key => {
57
92
  fields[key] = encryptStoredValue(normalized[key]);
58
93
  });
59
94
  return { fields };
60
95
  }
61
-
96
+ /**
97
+ * @param {ManagedOAuthStoredData} [data]
98
+ * @returns {ManagedOAuthValues}
99
+ */
62
100
  function decryptStoredData(data = {}) {
63
101
  const fields = data?.fields ?? {};
64
- const values = {};
102
+ const values = /** @type {ManagedOAuthValues} */ ({});
65
103
  Object.keys(fields).forEach(key => {
66
104
  values[key] = decryptStoredValue(fields[key]);
67
105
  });
68
106
  return values;
69
107
  }
70
-
108
+ /**
109
+ * @param {ManagedOAuthValues} [values]
110
+ * @returns {ManagedOAuthValues}
111
+ */
71
112
  function removeSecret(values = {}) {
72
113
  const sanitized = { ...values };
73
114
  delete sanitized.clientSecret;
74
115
  return sanitized;
75
116
  }
76
-
117
+ /**
118
+ * @param {ManagedOAuthAccountParams} params
119
+ * @returns {Promise<ManagedOAuthRecord | null>}
120
+ */
77
121
  async function getAccountManagedOAuthRecord({ rcAccountId, platform }) {
78
122
  if (!rcAccountId || !platform) {
79
123
  return null;
@@ -86,7 +130,10 @@ async function getAccountManagedOAuthRecord({ rcAccountId, platform }) {
86
130
  }
87
131
  });
88
132
  }
89
-
133
+ /**
134
+ * @param {ManagedOAuthPendingParams} params
135
+ * @returns {Promise<ManagedOAuthRecord | null>}
136
+ */
90
137
  async function getPendingManagedOAuthRecord({ rcAccountId }) {
91
138
  if (!rcAccountId) {
92
139
  return null;
@@ -101,17 +148,26 @@ async function getPendingManagedOAuthRecord({ rcAccountId }) {
101
148
  }
102
149
  return record;
103
150
  }
104
-
151
+ /**
152
+ * @param {ManagedOAuthAccountParams} params
153
+ * @returns {Promise<ManagedOAuthValues>}
154
+ */
105
155
  async function getAccountManagedOAuthValues({ rcAccountId, platform }) {
106
156
  const record = await getAccountManagedOAuthRecord({ rcAccountId, platform });
107
157
  return decryptStoredData(record?.data);
108
158
  }
109
-
159
+ /**
160
+ * @param {ManagedOAuthPendingParams} params
161
+ * @returns {Promise<ManagedOAuthValues>}
162
+ */
110
163
  async function getPendingManagedOAuthValues({ rcAccountId }) {
111
164
  const record = await getPendingManagedOAuthRecord({ rcAccountId });
112
165
  return decryptStoredData(record?.data);
113
166
  }
114
-
167
+ /**
168
+ * @param {ManagedOAuthStateParams} params
169
+ * @returns {Promise<ManagedOAuthState>}
170
+ */
115
171
  async function getManagedOAuthState({ rcAccountId, platform, isAdmin }) {
116
172
  const accountValues = await getAccountManagedOAuthValues({ rcAccountId, platform });
117
173
  const hasAccountOAuth = Object.keys(accountValues).length > 0;
@@ -119,7 +175,6 @@ async function getManagedOAuthState({ rcAccountId, platform, isAdmin }) {
119
175
  ? await getPendingManagedOAuthValues({ rcAccountId })
120
176
  : {};
121
177
  const hasPendingOAuth = Object.keys(pendingValues).length > 0;
122
-
123
178
  return {
124
179
  isAdmin: !!isAdmin,
125
180
  hasAccountOAuth,
@@ -128,7 +183,10 @@ async function getManagedOAuthState({ rcAccountId, platform, isAdmin }) {
128
183
  ...(isAdmin && hasPendingOAuth ? { pendingValues } : {})
129
184
  };
130
185
  }
131
-
186
+ /**
187
+ * @param {UpsertPendingManagedOAuthParams} params
188
+ * @returns {Promise<ManagedOAuthRecord>}
189
+ */
132
190
  async function upsertPendingManagedOAuth({ rcAccountId, values = {} }) {
133
191
  if (!rcAccountId) {
134
192
  throw new Error('rcAccountId is required');
@@ -156,7 +214,10 @@ async function upsertPendingManagedOAuth({ rcAccountId, values = {} }) {
156
214
  expiry
157
215
  });
158
216
  }
159
-
217
+ /**
218
+ * @param {ManagedOAuthAccountParams} params
219
+ * @returns {Promise<boolean>}
220
+ */
160
221
  async function migratePendingManagedOAuth({ rcAccountId, platform }) {
161
222
  const pending = await getPendingManagedOAuthRecord({ rcAccountId });
162
223
  if (!pending) {
@@ -178,7 +239,10 @@ async function migratePendingManagedOAuth({ rcAccountId, platform }) {
178
239
  await pending.destroy();
179
240
  return true;
180
241
  }
181
-
242
+ /**
243
+ * @param {ManagedOAuthAccountParams} params
244
+ * @returns {Promise<ManagedOAuthResolution>}
245
+ */
182
246
  async function resolveManagedOAuthInfo({ rcAccountId, platform }) {
183
247
  const accountValues = await getAccountManagedOAuthValues({ rcAccountId, platform });
184
248
  if (Object.keys(accountValues).length > 0) {
@@ -199,7 +263,10 @@ async function resolveManagedOAuthInfo({ rcAccountId, platform }) {
199
263
  oauthInfo: null
200
264
  };
201
265
  }
202
-
266
+ /**
267
+ * @param {ManagedOAuthPendingParams} params
268
+ * @returns {Promise<number>}
269
+ */
203
270
  async function clearPendingManagedOAuth({ rcAccountId }) {
204
271
  if (!rcAccountId) {
205
272
  return 0;
@@ -210,7 +277,10 @@ async function clearPendingManagedOAuth({ rcAccountId }) {
210
277
  }
211
278
  });
212
279
  }
213
-
280
+ /**
281
+ * @param {ManagedOAuthAccountParams} params
282
+ * @returns {Promise<number>}
283
+ */
214
284
  async function clearAccountManagedOAuth({ rcAccountId, platform }) {
215
285
  if (!rcAccountId || !platform) {
216
286
  return 0;
@@ -223,7 +293,10 @@ async function clearAccountManagedOAuth({ rcAccountId, platform }) {
223
293
  }
224
294
  });
225
295
  }
226
-
296
+ /**
297
+ * @param {ManagedOAuthAccountParams} params
298
+ * @returns {Promise<ResetManagedOAuthResult>}
299
+ */
227
300
  async function resetManagedOAuth({ rcAccountId, platform }) {
228
301
  const deletedAccountCount = await clearAccountManagedOAuth({ rcAccountId, platform });
229
302
  const deletedPendingCount = await clearPendingManagedOAuth({ rcAccountId });
@@ -232,7 +305,6 @@ async function resetManagedOAuth({ rcAccountId, platform }) {
232
305
  deletedPendingCount
233
306
  };
234
307
  }
235
-
236
308
  exports.MANAGED_OAUTH_ACCOUNT_DATA_KEY = MANAGED_OAUTH_ACCOUNT_DATA_KEY;
237
309
  exports.MANAGED_OAUTH_FIELDS = MANAGED_OAUTH_FIELDS;
238
310
  exports.getManagedOAuthState = getManagedOAuthState;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,11 +1,24 @@
1
+ "use strict";
2
+ // @ts-check
3
+ Object.defineProperty(exports, "__esModule", { value: true });
1
4
  const { CacheModel } = require('../models/cacheModel');
2
5
  const { Op } = require('sequelize');
3
- const axios = require('axios');
4
- const { AccountDataModel } = require('../models/accountDataModel');
6
+ const axios = /** @type {any} */ (require('axios'));
7
+ const { AccountDataModel: AccountDataModelImport } = require('../models/accountDataModel');
8
+ const AccountDataModel = /** @type {any} */ (AccountDataModelImport);
5
9
  const logger = require('../lib/logger');
6
-
10
+ /** @typedef {import('../types').InstalledPlugin} InstalledPlugin */
11
+ /** @typedef {import('../types').JsonObject} JsonObject */
12
+ /** @typedef {import('../types').PluginAccess} PluginAccess */
13
+ /** @typedef {import('../types').PluginLicenseStatus} PluginLicenseStatus */
14
+ /** @typedef {import('../types').ResolvePluginManifestResult} ResolvePluginManifestResult */
15
+ /** @typedef {import('../types').RegisterPluginAccountResult} RegisterPluginAccountResult */
16
+ /** @typedef {import('../types').UserSettings} UserSettings */
7
17
  const PUBLIC_MANIFEST_BASE = 'https://appconnect.labs.ringcentral.com/public-api/connectors';
8
-
18
+ /**
19
+ * @param {{ rcAccountId: string | number }} params
20
+ * @returns {Promise<InstalledPlugin[]>}
21
+ */
9
22
  async function getPluginsFromRcAccountId({ rcAccountId }) {
10
23
  const accountData = await AccountDataModel.findAll({
11
24
  where: {
@@ -19,18 +32,25 @@ async function getPluginsFromRcAccountId({ rcAccountId }) {
19
32
  }));
20
33
  return workingPlugins;
21
34
  }
22
-
35
+ /**
36
+ * @param {{ userSettings?: UserSettings | null, pluginId: string }} params
37
+ * @returns {JsonObject | null}
38
+ */
23
39
  function getPluginConfigFromUserSettings({ userSettings, pluginId }) {
24
40
  if (!userSettings) {
25
41
  return null;
26
42
  }
27
43
  const targetPluginSettings = userSettings[`plugin_${pluginId}`];
28
- if (!targetPluginSettings?.value?.config) {
44
+ const targetPluginSettingsValue = /** @type {{ config?: JsonObject } | undefined} */ (targetPluginSettings?.value);
45
+ if (!targetPluginSettingsValue?.config) {
29
46
  return null;
30
47
  }
31
- return targetPluginSettings.value.config;
48
+ return targetPluginSettingsValue.config;
32
49
  }
33
-
50
+ /**
51
+ * @param {{ rcAccountId: string | number, pluginId: string }} params
52
+ * @returns {Promise<PluginLicenseStatus | null>}
53
+ */
34
54
  async function getPluginLicenseStatus({ rcAccountId, pluginId }) {
35
55
  const accountData = await AccountDataModel.findOne({
36
56
  where: {
@@ -57,25 +77,32 @@ async function getPluginLicenseStatus({ rcAccountId, pluginId }) {
57
77
  }
58
78
  return licenseStatus;
59
79
  }
60
-
80
+ /**
81
+ * @param {{ headers?: Record<string, string> | null }} params
82
+ * @returns {string | null}
83
+ */
61
84
  function getRefreshedJwtTokenFromHeaders({ headers }) {
62
85
  if (!headers) {
63
86
  return null;
64
87
  }
65
88
  return headers['x-refreshed-jwt-token'] || headers['X-Refreshed-Jwt-Token'] || null;
66
89
  }
67
-
90
+ /**
91
+ * @param {{ pluginId: string, pluginAccess?: PluginAccess, ownerRcAccountId?: string | number, pluginName?: string }} params
92
+ * @returns {Promise<ResolvePluginManifestResult>}
93
+ */
68
94
  async function resolvePluginManifest({ pluginId, pluginAccess, ownerRcAccountId, pluginName }) {
69
95
  const manifestFetchers = [];
70
96
  if (pluginAccess === 'public') {
71
97
  manifestFetchers.push(`${PUBLIC_MANIFEST_BASE}/${pluginId}/manifest?type=plugin`);
72
- } else if (pluginAccess === 'private' || pluginAccess === 'shared') {
98
+ }
99
+ else if (pluginAccess === 'private' || pluginAccess === 'shared') {
73
100
  manifestFetchers.push(`${PUBLIC_MANIFEST_BASE}/${pluginId}/manifest?access=internal&type=plugin&accountId=${ownerRcAccountId}`);
74
- } else {
101
+ }
102
+ else {
75
103
  manifestFetchers.push(`${PUBLIC_MANIFEST_BASE}/${pluginId}/manifest?type=plugin`);
76
104
  manifestFetchers.push(`${PUBLIC_MANIFEST_BASE}/${pluginId}/manifest?access=internal&type=plugin&accountId=${ownerRcAccountId}`);
77
105
  }
78
-
79
106
  let pluginData = null;
80
107
  let lastError = null;
81
108
  for (const url of manifestFetchers) {
@@ -83,27 +110,28 @@ async function resolvePluginManifest({ pluginId, pluginAccess, ownerRcAccountId,
83
110
  const pluginDataResponse = await axios.get(url);
84
111
  pluginData = pluginDataResponse.data;
85
112
  break;
86
- } catch (error) {
113
+ }
114
+ catch (error) {
87
115
  lastError = error;
88
116
  }
89
117
  }
90
-
91
118
  if (!pluginData) {
92
119
  throw lastError || new Error(`Unable to resolve manifest for plugin ${pluginId}`);
93
120
  }
94
-
95
121
  const platformKey = pluginName || Object.keys(pluginData.platforms || {})[0];
96
122
  if (!platformKey || !pluginData.platforms?.[platformKey]) {
97
123
  throw new Error(`Unable to resolve platform manifest for plugin ${pluginId}`);
98
124
  }
99
-
100
125
  return {
101
126
  pluginData,
102
127
  pluginManifest: pluginData.platforms[platformKey],
103
128
  platformKey,
104
129
  };
105
130
  }
106
-
131
+ /**
132
+ * @param {{ rcAccountId: string | number, pluginId: string, jwtToken: string, pluginData?: JsonObject }} params
133
+ * @returns {Promise<void>}
134
+ */
107
135
  async function persistPluginData({ rcAccountId, pluginId, jwtToken, pluginData = {} }) {
108
136
  try {
109
137
  const accountData = await AccountDataModel.findOne({
@@ -122,7 +150,8 @@ async function persistPluginData({ rcAccountId, pluginId, jwtToken, pluginData =
122
150
  ...pluginData,
123
151
  },
124
152
  });
125
- } else {
153
+ }
154
+ else {
126
155
  await accountData.update({
127
156
  data: {
128
157
  jwtToken,
@@ -130,7 +159,8 @@ async function persistPluginData({ rcAccountId, pluginId, jwtToken, pluginData =
130
159
  },
131
160
  });
132
161
  }
133
- } catch (error) {
162
+ }
163
+ catch (error) {
134
164
  logger.error('Failed to persist plugin data', {
135
165
  pluginId,
136
166
  rcAccountId,
@@ -138,13 +168,15 @@ async function persistPluginData({ rcAccountId, pluginId, jwtToken, pluginData =
138
168
  });
139
169
  }
140
170
  }
141
-
171
+ /**
172
+ * @param {{ pluginId: string, rcAccessToken: string, rcAccountId: string | number, pluginAccess?: PluginAccess, pluginName?: string, ownerRcAccountId?: string | number }} params
173
+ * @returns {Promise<RegisterPluginAccountResult>}
174
+ */
142
175
  async function registerPluginAccount({ pluginId, rcAccessToken, rcAccountId, pluginAccess, pluginName, ownerRcAccountId }) {
143
176
  const { pluginManifest } = await resolvePluginManifest({ pluginId, pluginAccess, ownerRcAccountId, pluginName });
144
177
  if (!pluginManifest?.endpointUrl) {
145
178
  throw new Error(`Plugin endpoint URL not found for ${pluginId}`);
146
179
  }
147
-
148
180
  const registerUrl = pluginManifest.userRegisterEndpointUrl;
149
181
  const registerResponse = await axios.post(registerUrl, {
150
182
  rcAccessToken,
@@ -154,21 +186,22 @@ async function registerPluginAccount({ pluginId, rcAccessToken, rcAccountId, plu
154
186
  if (!pluginJwtToken) {
155
187
  throw new Error('Plugin register API did not return jwtToken');
156
188
  }
157
-
158
189
  await persistPluginData({
159
190
  rcAccountId: rcAccountId?.toString(),
160
191
  pluginId,
161
192
  jwtToken: pluginJwtToken,
162
193
  pluginData: pluginManifest,
163
194
  });
164
-
165
195
  return {
166
196
  successful: true,
167
197
  registerUrl,
168
198
  jwtToken: pluginJwtToken,
169
199
  };
170
200
  }
171
-
201
+ /**
202
+ * @param {{ pluginId: string, rcAccountId: string | number }} params
203
+ * @returns {Promise<void>}
204
+ */
172
205
  async function unregisterPluginAccount({ pluginId, rcAccountId }) {
173
206
  const accountData = await AccountDataModel.findOne({
174
207
  where: {
@@ -181,7 +214,6 @@ async function unregisterPluginAccount({ pluginId, rcAccountId }) {
181
214
  await accountData.destroy();
182
215
  }
183
216
  }
184
-
185
217
  exports.getPluginsFromRcAccountId = getPluginsFromRcAccountId;
186
218
  exports.getPluginConfigFromUserSettings = getPluginConfigFromUserSettings;
187
219
  exports.getPluginLicenseStatus = getPluginLicenseStatus;
@@ -189,4 +221,4 @@ exports.getRefreshedJwtTokenFromHeaders = getRefreshedJwtTokenFromHeaders;
189
221
  exports.resolvePluginManifest = resolvePluginManifest;
190
222
  exports.persistPluginData = persistPluginData;
191
223
  exports.registerPluginAccount = registerPluginAccount;
192
- exports.unregisterPluginAccount = unregisterPluginAccount;
224
+ exports.unregisterPluginAccount = unregisterPluginAccount;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,14 +1,30 @@
1
- const axios = require('axios');
2
- const { AdminConfigModel } = require('../models/adminConfigModel');
1
+ "use strict";
2
+ // @ts-check
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const axios = /** @type {any} */ (require('axios'));
5
+ const { AdminConfigModel: AdminConfigModelImport } = require('../models/adminConfigModel');
3
6
  const { getHashValue } = require('../lib/util');
4
- const connectorRegistry = require('../connector/registry');
7
+ const connectorRegistry = /** @type {any} */ (require('../connector/registry'));
5
8
  const logger = require('../lib/logger');
6
9
  const { handleDatabaseError } = require('../lib/errorHandler');
7
- const { UserModel } = require('../models/userModel');
10
+ const { UserModel: UserModelImport } = require('../models/userModel');
8
11
  const { handleApiError } = require('../lib/errorHandler');
9
- const oauth = require('../lib/oauth');
10
- const { Connector } = require('../models/dynamo/connectorSchema');
11
-
12
+ const oauth = /** @type {any} */ (require('../lib/oauth'));
13
+ const { Connector: ConnectorImport } = require('../models/dynamo/connectorSchema');
14
+ const AdminConfigModel = /** @type {any} */ (AdminConfigModelImport);
15
+ const UserModel = /** @type {any} */ (UserModelImport);
16
+ const Connector = /** @type {any} */ (ConnectorImport);
17
+ /** @typedef {import('../types').GetUserSettingsParams} GetUserSettingsParams */
18
+ /** @typedef {import('../types').HandlerResult} HandlerResult */
19
+ /** @typedef {import('../types').RefreshUserInfoParams} RefreshUserInfoParams */
20
+ /** @typedef {import('../types').UpdateUserSettingsParams} UpdateUserSettingsParams */
21
+ /** @typedef {import('../types').UserSettings} UserSettings */
22
+ /** @typedef {import('../types').UserSettingsByAdminParams} UserSettingsByAdminParams */
23
+ /** @typedef {import('../types').UserSettingsByAdminResult} UserSettingsByAdminResult */
24
+ /**
25
+ * @param {RefreshUserInfoParams} params
26
+ * @returns {Promise<HandlerResult>}
27
+ */
12
28
  async function refreshUserInfo({ platform, userId, tracer }) {
13
29
  tracer?.trace('refreshUserInfo:start', { platform, userId });
14
30
  try {
@@ -19,7 +35,6 @@ async function refreshUserInfo({ platform, userId, tracer }) {
19
35
  }
20
36
  });
21
37
  tracer?.trace('refreshUserInfo:userFound', { user });
22
-
23
38
  if (!user || !user.accessToken) {
24
39
  tracer?.trace('refreshUserInfo:noUser', { userId });
25
40
  return {
@@ -31,18 +46,15 @@ async function refreshUserInfo({ platform, userId, tracer }) {
31
46
  }
32
47
  };
33
48
  }
34
-
35
49
  const proxyId = user.platformAdditionalInfo?.proxyId;
36
50
  let proxyConfig = null;
37
51
  if (proxyId) {
38
52
  proxyConfig = await Connector.getProxyConfig(proxyId);
39
53
  tracer?.trace('refreshUserInfo:proxyConfig', { proxyConfig });
40
54
  }
41
-
42
55
  const platformModule = connectorRegistry.getConnector(platform);
43
56
  const authType = await platformModule.getAuthType({ proxyId, proxyConfig });
44
57
  tracer?.trace('refreshUserInfo:authType', { authType });
45
-
46
58
  let authHeader = '';
47
59
  switch (authType) {
48
60
  case 'oauth':
@@ -57,7 +69,7 @@ async function refreshUserInfo({ platform, userId, tracer }) {
57
69
  ttl: 5000
58
70
  },
59
71
  isRevokeUserSession: true
60
- }
72
+ };
61
73
  }
62
74
  authHeader = `Bearer ${user.accessToken}`;
63
75
  tracer?.trace('refreshUserInfo:oauthAuth', { authHeader });
@@ -68,7 +80,6 @@ async function refreshUserInfo({ platform, userId, tracer }) {
68
80
  tracer?.trace('refreshUserInfo:apiKeyAuth', {});
69
81
  break;
70
82
  }
71
-
72
83
  const { successful, returnMessage } = await platformModule.refreshUserInfo({ user, authHeader, proxyConfig });
73
84
  tracer?.trace('refreshUserInfo:platformRefreshResult', { successful, returnMessage });
74
85
  return {
@@ -81,20 +92,21 @@ async function refreshUserInfo({ platform, userId, tracer }) {
81
92
  return handleApiError(e, platform, 'refreshUserInfo', { userId });
82
93
  }
83
94
  }
84
-
95
+ /**
96
+ * @param {UserSettingsByAdminParams} params
97
+ * @returns {Promise<UserSettingsByAdminResult>}
98
+ */
85
99
  async function getUserSettingsByAdmin({ rcAccessToken, rcAccountId }) {
86
100
  let hashedRcAccountId = null;
87
101
  if (rcAccountId) {
88
102
  hashedRcAccountId = rcAccountId;
89
103
  }
90
104
  else {
91
- const rcExtensionResponse = await axios.get(
92
- 'https://platform.ringcentral.com/restapi/v1.0/account/~/extension/~',
93
- {
94
- headers: {
95
- Authorization: `Bearer ${rcAccessToken}`,
96
- },
97
- });
105
+ const rcExtensionResponse = await axios.get('https://platform.ringcentral.com/restapi/v1.0/account/~/extension/~', {
106
+ headers: {
107
+ Authorization: `Bearer ${rcAccessToken}`,
108
+ },
109
+ });
98
110
  hashedRcAccountId = getHashValue(rcExtensionResponse.data.account.id, process.env.HASH_KEY);
99
111
  }
100
112
  const adminConfig = await AdminConfigModel.findByPk(hashedRcAccountId);
@@ -102,21 +114,25 @@ async function getUserSettingsByAdmin({ rcAccessToken, rcAccountId }) {
102
114
  userSettings: adminConfig?.userSettings
103
115
  };
104
116
  }
105
-
117
+ /**
118
+ * @param {GetUserSettingsParams} params
119
+ * @returns {Promise<UserSettings>}
120
+ */
106
121
  async function getUserSettings({ user, rcAccessToken, rcAccountId }) {
122
+ /** @type {any} */
107
123
  let userSettingsByAdmin = [];
108
124
  if (rcAccessToken || rcAccountId) {
109
125
  try {
110
126
  userSettingsByAdmin = await getUserSettingsByAdmin({ rcAccessToken, rcAccountId });
111
127
  }
112
128
  catch (e) {
113
- logger.error('Error getting user settings by admin', { stack: e.stack });
129
+ logger.error('Error getting user settings by admin', { stack: /** @type {any} */ (e).stack });
114
130
  userSettingsByAdmin = [];
115
131
  }
116
132
  }
117
-
118
133
  // For non-readonly admin settings, user use its own setting
119
134
  let userSettings = await user?.userSettings;
135
+ /** @type {any} */
120
136
  let result = {};
121
137
  if (!userSettingsByAdmin?.userSettings) {
122
138
  result = userSettings;
@@ -177,7 +193,10 @@ async function getUserSettings({ user, rcAccessToken, rcAccountId }) {
177
193
  }
178
194
  return result;
179
195
  }
180
-
196
+ /**
197
+ * @param {UpdateUserSettingsParams} params
198
+ * @returns {Promise<HandlerResult | { userSettings?: UserSettings }>}
199
+ */
181
200
  async function updateUserSettings({ user, userSettings, settingKeysToRemove, platformName }) {
182
201
  const keys = Object.keys(userSettings || {});
183
202
  let updatedSettings = {
@@ -223,8 +242,7 @@ async function updateUserSettings({ user, userSettings, settingKeysToRemove, pla
223
242
  userSettings: user.userSettings
224
243
  };
225
244
  }
226
-
227
245
  exports.refreshUserInfo = refreshUserInfo;
228
246
  exports.getUserSettingsByAdmin = getUserSettingsByAdmin;
229
247
  exports.getUserSettings = getUserSettings;
230
- exports.updateUserSettings = updateUserSettings;
248
+ exports.updateUserSettings = updateUserSettings;
@@ -0,0 +1 @@
1
+ export {};