@microsoft/teams.client 0.2.12 → 0.2.14

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 (458) hide show
  1. package/README.md +1 -1
  2. package/dist/app.d.mts +25 -4
  3. package/dist/app.d.ts +25 -4
  4. package/dist/app.js +44 -7
  5. package/dist/app.js.map +1 -1
  6. package/dist/app.mjs +44 -7
  7. package/dist/app.mjs.map +1 -1
  8. package/dist/graph-utils.d.mts +10 -0
  9. package/dist/graph-utils.d.ts +10 -0
  10. package/dist/graph-utils.js +50 -0
  11. package/dist/graph-utils.js.map +1 -0
  12. package/dist/graph-utils.mjs +27 -0
  13. package/dist/graph-utils.mjs.map +1 -0
  14. package/dist/index.d.mts +3 -53
  15. package/dist/index.d.ts +3 -53
  16. package/dist/index.js +3 -34
  17. package/dist/index.mjs +1 -4
  18. package/dist/msal-utils.d.mts +11 -1
  19. package/dist/msal-utils.d.ts +11 -1
  20. package/dist/msal-utils.js +14 -0
  21. package/dist/msal-utils.js.map +1 -1
  22. package/dist/msal-utils.mjs +14 -1
  23. package/dist/msal-utils.mjs.map +1 -1
  24. package/package.json +2 -1
  25. package/dist/context/app-host.d.mts +0 -25
  26. package/dist/context/app-host.d.ts +0 -25
  27. package/dist/context/app-host.js +0 -4
  28. package/dist/context/app-host.js.map +0 -1
  29. package/dist/context/app-host.mjs +0 -3
  30. package/dist/context/app-host.mjs.map +0 -1
  31. package/dist/context/app.d.mts +0 -69
  32. package/dist/context/app.d.ts +0 -69
  33. package/dist/context/app.js +0 -4
  34. package/dist/context/app.js.map +0 -1
  35. package/dist/context/app.mjs +0 -3
  36. package/dist/context/app.mjs.map +0 -1
  37. package/dist/context/channel.d.mts +0 -37
  38. package/dist/context/channel.d.ts +0 -37
  39. package/dist/context/channel.js +0 -4
  40. package/dist/context/channel.js.map +0 -1
  41. package/dist/context/channel.mjs +0 -3
  42. package/dist/context/channel.mjs.map +0 -1
  43. package/dist/context/chat.d.mts +0 -11
  44. package/dist/context/chat.d.ts +0 -11
  45. package/dist/context/chat.js +0 -4
  46. package/dist/context/chat.js.map +0 -1
  47. package/dist/context/chat.mjs +0 -3
  48. package/dist/context/chat.mjs.map +0 -1
  49. package/dist/context/index.d.mts +0 -74
  50. package/dist/context/index.d.ts +0 -74
  51. package/dist/context/index.js +0 -108
  52. package/dist/context/index.js.map +0 -1
  53. package/dist/context/index.mjs +0 -86
  54. package/dist/context/index.mjs.map +0 -1
  55. package/dist/context/meeting.d.mts +0 -11
  56. package/dist/context/meeting.d.ts +0 -11
  57. package/dist/context/meeting.js +0 -4
  58. package/dist/context/meeting.js.map +0 -1
  59. package/dist/context/meeting.mjs +0 -3
  60. package/dist/context/meeting.mjs.map +0 -1
  61. package/dist/context/page.d.mts +0 -40
  62. package/dist/context/page.d.ts +0 -40
  63. package/dist/context/page.js +0 -4
  64. package/dist/context/page.js.map +0 -1
  65. package/dist/context/page.mjs +0 -3
  66. package/dist/context/page.mjs.map +0 -1
  67. package/dist/context/share-point-site.d.mts +0 -31
  68. package/dist/context/share-point-site.d.ts +0 -31
  69. package/dist/context/share-point-site.js +0 -4
  70. package/dist/context/share-point-site.js.map +0 -1
  71. package/dist/context/share-point-site.mjs +0 -3
  72. package/dist/context/share-point-site.mjs.map +0 -1
  73. package/dist/context/team.d.mts +0 -42
  74. package/dist/context/team.d.ts +0 -42
  75. package/dist/context/team.js +0 -4
  76. package/dist/context/team.js.map +0 -1
  77. package/dist/context/team.mjs +0 -3
  78. package/dist/context/team.mjs.map +0 -1
  79. package/dist/context/tenant.d.mts +0 -20
  80. package/dist/context/tenant.d.ts +0 -20
  81. package/dist/context/tenant.js +0 -4
  82. package/dist/context/tenant.js.map +0 -1
  83. package/dist/context/tenant.mjs +0 -3
  84. package/dist/context/tenant.mjs.map +0 -1
  85. package/dist/context/user.d.mts +0 -63
  86. package/dist/context/user.d.ts +0 -63
  87. package/dist/context/user.js +0 -4
  88. package/dist/context/user.js.map +0 -1
  89. package/dist/context/user.mjs +0 -3
  90. package/dist/context/user.mjs.map +0 -1
  91. package/dist/index-5Ok-M8A0.d.ts +0 -13
  92. package/dist/index-7hUkxLxx.d.mts +0 -17
  93. package/dist/index-8IcDrPMv.d.ts +0 -70
  94. package/dist/index-D6kqtGPa.d.mts +0 -13
  95. package/dist/index-DJal_Cxb.d.mts +0 -70
  96. package/dist/index-DrTQ_GLN.d.mts +0 -21
  97. package/dist/index-DtE-Eb9L.d.ts +0 -17
  98. package/dist/index-_Hc8oq9_.d.ts +0 -21
  99. package/dist/window/client-error.d.mts +0 -10
  100. package/dist/window/client-error.d.ts +0 -10
  101. package/dist/window/client-error.js +0 -4
  102. package/dist/window/client-error.js.map +0 -1
  103. package/dist/window/client-error.mjs +0 -3
  104. package/dist/window/client-error.mjs.map +0 -1
  105. package/dist/window/clients/app-entity.d.mts +0 -12
  106. package/dist/window/clients/app-entity.d.ts +0 -12
  107. package/dist/window/clients/app-entity.js +0 -15
  108. package/dist/window/clients/app-entity.js.map +0 -1
  109. package/dist/window/clients/app-entity.mjs +0 -13
  110. package/dist/window/clients/app-entity.mjs.map +0 -1
  111. package/dist/window/clients/app-initialization.d.mts +0 -50
  112. package/dist/window/clients/app-initialization.d.ts +0 -50
  113. package/dist/window/clients/app-initialization.js +0 -24
  114. package/dist/window/clients/app-initialization.js.map +0 -1
  115. package/dist/window/clients/app-initialization.mjs +0 -22
  116. package/dist/window/clients/app-initialization.mjs.map +0 -1
  117. package/dist/window/clients/app-install-dialog.d.mts +0 -21
  118. package/dist/window/clients/app-install-dialog.d.ts +0 -21
  119. package/dist/window/clients/app-install-dialog.js +0 -22
  120. package/dist/window/clients/app-install-dialog.js.map +0 -1
  121. package/dist/window/clients/app-install-dialog.mjs +0 -20
  122. package/dist/window/clients/app-install-dialog.mjs.map +0 -1
  123. package/dist/window/clients/authentication.d.mts +0 -66
  124. package/dist/window/clients/authentication.d.ts +0 -66
  125. package/dist/window/clients/authentication.js +0 -47
  126. package/dist/window/clients/authentication.js.map +0 -1
  127. package/dist/window/clients/authentication.mjs +0 -45
  128. package/dist/window/clients/authentication.mjs.map +0 -1
  129. package/dist/window/clients/bar-code.d.mts +0 -13
  130. package/dist/window/clients/bar-code.d.ts +0 -13
  131. package/dist/window/clients/bar-code.js +0 -20
  132. package/dist/window/clients/bar-code.js.map +0 -1
  133. package/dist/window/clients/bar-code.mjs +0 -18
  134. package/dist/window/clients/bar-code.mjs.map +0 -1
  135. package/dist/window/clients/calendar.d.mts +0 -47
  136. package/dist/window/clients/calendar.d.ts +0 -47
  137. package/dist/window/clients/calendar.js +0 -18
  138. package/dist/window/clients/calendar.js.map +0 -1
  139. package/dist/window/clients/calendar.mjs +0 -16
  140. package/dist/window/clients/calendar.mjs.map +0 -1
  141. package/dist/window/clients/call.d.mts +0 -32
  142. package/dist/window/clients/call.d.ts +0 -32
  143. package/dist/window/clients/call.js +0 -16
  144. package/dist/window/clients/call.js.map +0 -1
  145. package/dist/window/clients/call.mjs +0 -14
  146. package/dist/window/clients/call.mjs.map +0 -1
  147. package/dist/window/clients/clipboard.d.mts +0 -26
  148. package/dist/window/clients/clipboard.d.ts +0 -26
  149. package/dist/window/clients/clipboard.js +0 -19
  150. package/dist/window/clients/clipboard.js.map +0 -1
  151. package/dist/window/clients/clipboard.mjs +0 -17
  152. package/dist/window/clients/clipboard.mjs.map +0 -1
  153. package/dist/window/clients/conversation.d.mts +0 -53
  154. package/dist/window/clients/conversation.d.ts +0 -53
  155. package/dist/window/clients/conversation.js +0 -25
  156. package/dist/window/clients/conversation.js.map +0 -1
  157. package/dist/window/clients/conversation.mjs +0 -23
  158. package/dist/window/clients/conversation.mjs.map +0 -1
  159. package/dist/window/clients/dialog.d.mts +0 -81
  160. package/dist/window/clients/dialog.d.ts +0 -81
  161. package/dist/window/clients/dialog.js +0 -37
  162. package/dist/window/clients/dialog.js.map +0 -1
  163. package/dist/window/clients/dialog.mjs +0 -35
  164. package/dist/window/clients/dialog.mjs.map +0 -1
  165. package/dist/window/clients/index.d.mts +0 -84
  166. package/dist/window/clients/index.d.ts +0 -84
  167. package/dist/window/clients/index.js +0 -159
  168. package/dist/window/clients/index.js.map +0 -1
  169. package/dist/window/clients/index.mjs +0 -87
  170. package/dist/window/clients/index.mjs.map +0 -1
  171. package/dist/window/clients/location.d.mts +0 -14
  172. package/dist/window/clients/location.d.ts +0 -14
  173. package/dist/window/clients/location.js +0 -22
  174. package/dist/window/clients/location.js.map +0 -1
  175. package/dist/window/clients/location.mjs +0 -20
  176. package/dist/window/clients/location.mjs.map +0 -1
  177. package/dist/window/clients/media.d.mts +0 -190
  178. package/dist/window/clients/media.d.ts +0 -190
  179. package/dist/window/clients/media.js +0 -75
  180. package/dist/window/clients/media.js.map +0 -1
  181. package/dist/window/clients/media.mjs +0 -68
  182. package/dist/window/clients/media.mjs.map +0 -1
  183. package/dist/window/clients/notification.d.mts +0 -17
  184. package/dist/window/clients/notification.d.ts +0 -17
  185. package/dist/window/clients/notification.js +0 -15
  186. package/dist/window/clients/notification.js.map +0 -1
  187. package/dist/window/clients/notification.mjs +0 -13
  188. package/dist/window/clients/notification.mjs.map +0 -1
  189. package/dist/window/clients/permission.d.mts +0 -14
  190. package/dist/window/clients/permission.d.ts +0 -14
  191. package/dist/window/clients/permission.js +0 -20
  192. package/dist/window/clients/permission.js.map +0 -1
  193. package/dist/window/clients/permission.mjs +0 -18
  194. package/dist/window/clients/permission.mjs.map +0 -1
  195. package/dist/window/index.d.mts +0 -59
  196. package/dist/window/index.d.ts +0 -59
  197. package/dist/window/index.js +0 -35
  198. package/dist/window/index.js.map +0 -1
  199. package/dist/window/index.mjs +0 -6
  200. package/dist/window/index.mjs.map +0 -1
  201. package/dist/window/message.d.mts +0 -24
  202. package/dist/window/message.d.ts +0 -24
  203. package/dist/window/message.js +0 -4
  204. package/dist/window/message.js.map +0 -1
  205. package/dist/window/message.mjs +0 -3
  206. package/dist/window/message.mjs.map +0 -1
  207. package/dist/window/runtime.d.mts +0 -96
  208. package/dist/window/runtime.d.ts +0 -96
  209. package/dist/window/runtime.js +0 -4
  210. package/dist/window/runtime.js.map +0 -1
  211. package/dist/window/runtime.mjs +0 -3
  212. package/dist/window/runtime.mjs.map +0 -1
  213. package/dist/window/types/action-open-url-type.d.mts +0 -15
  214. package/dist/window/types/action-open-url-type.d.ts +0 -15
  215. package/dist/window/types/action-open-url-type.js +0 -13
  216. package/dist/window/types/action-open-url-type.js.map +0 -1
  217. package/dist/window/types/action-open-url-type.mjs +0 -11
  218. package/dist/window/types/action-open-url-type.mjs.map +0 -1
  219. package/dist/window/types/app-eligibility-info.d.mts +0 -48
  220. package/dist/window/types/app-eligibility-info.d.ts +0 -48
  221. package/dist/window/types/app-eligibility-info.js +0 -4
  222. package/dist/window/types/app-eligibility-info.js.map +0 -1
  223. package/dist/window/types/app-eligibility-info.mjs +0 -3
  224. package/dist/window/types/app-eligibility-info.mjs.map +0 -1
  225. package/dist/window/types/bar-code-config.d.mts +0 -13
  226. package/dist/window/types/bar-code-config.d.ts +0 -13
  227. package/dist/window/types/bar-code-config.js +0 -4
  228. package/dist/window/types/bar-code-config.js.map +0 -1
  229. package/dist/window/types/bar-code-config.mjs +0 -3
  230. package/dist/window/types/bar-code-config.mjs.map +0 -1
  231. package/dist/window/types/call-modality.d.mts +0 -21
  232. package/dist/window/types/call-modality.d.ts +0 -21
  233. package/dist/window/types/call-modality.js +0 -14
  234. package/dist/window/types/call-modality.js.map +0 -1
  235. package/dist/window/types/call-modality.mjs +0 -12
  236. package/dist/window/types/call-modality.mjs.map +0 -1
  237. package/dist/window/types/channel-type.d.mts +0 -17
  238. package/dist/window/types/channel-type.d.ts +0 -17
  239. package/dist/window/types/channel-type.js +0 -12
  240. package/dist/window/types/channel-type.js.map +0 -1
  241. package/dist/window/types/channel-type.mjs +0 -10
  242. package/dist/window/types/channel-type.mjs.map +0 -1
  243. package/dist/window/types/context.d.mts +0 -275
  244. package/dist/window/types/context.d.ts +0 -275
  245. package/dist/window/types/context.js +0 -4
  246. package/dist/window/types/context.js.map +0 -1
  247. package/dist/window/types/context.mjs +0 -3
  248. package/dist/window/types/context.mjs.map +0 -1
  249. package/dist/window/types/data-residency.d.mts +0 -6
  250. package/dist/window/types/data-residency.d.ts +0 -6
  251. package/dist/window/types/data-residency.js +0 -4
  252. package/dist/window/types/data-residency.js.map +0 -1
  253. package/dist/window/types/data-residency.mjs +0 -3
  254. package/dist/window/types/data-residency.mjs.map +0 -1
  255. package/dist/window/types/dialog/dialog-dimension.d.mts +0 -17
  256. package/dist/window/types/dialog/dialog-dimension.d.ts +0 -17
  257. package/dist/window/types/dialog/dialog-dimension.js +0 -12
  258. package/dist/window/types/dialog/dialog-dimension.js.map +0 -1
  259. package/dist/window/types/dialog/dialog-dimension.mjs +0 -10
  260. package/dist/window/types/dialog/dialog-dimension.mjs.map +0 -1
  261. package/dist/window/types/dialog/dialog-info.d.mts +0 -43
  262. package/dist/window/types/dialog/dialog-info.d.ts +0 -43
  263. package/dist/window/types/dialog/dialog-info.js +0 -4
  264. package/dist/window/types/dialog/dialog-info.js.map +0 -1
  265. package/dist/window/types/dialog/dialog-info.mjs +0 -3
  266. package/dist/window/types/dialog/dialog-info.mjs.map +0 -1
  267. package/dist/window/types/dialog/dialog-size.d.mts +0 -14
  268. package/dist/window/types/dialog/dialog-size.d.ts +0 -14
  269. package/dist/window/types/dialog/dialog-size.js +0 -4
  270. package/dist/window/types/dialog/dialog-size.js.map +0 -1
  271. package/dist/window/types/dialog/dialog-size.mjs +0 -3
  272. package/dist/window/types/dialog/dialog-size.mjs.map +0 -1
  273. package/dist/window/types/dialog/index.d.mts +0 -3
  274. package/dist/window/types/dialog/index.d.ts +0 -3
  275. package/dist/window/types/dialog/index.js +0 -28
  276. package/dist/window/types/dialog/index.js.map +0 -1
  277. package/dist/window/types/dialog/index.mjs +0 -5
  278. package/dist/window/types/dialog/index.mjs.map +0 -1
  279. package/dist/window/types/file-open-preference.d.mts +0 -17
  280. package/dist/window/types/file-open-preference.d.ts +0 -17
  281. package/dist/window/types/file-open-preference.js +0 -12
  282. package/dist/window/types/file-open-preference.js.map +0 -1
  283. package/dist/window/types/file-open-preference.mjs +0 -10
  284. package/dist/window/types/file-open-preference.mjs.map +0 -1
  285. package/dist/window/types/file.d.mts +0 -42
  286. package/dist/window/types/file.d.ts +0 -42
  287. package/dist/window/types/file.js +0 -11
  288. package/dist/window/types/file.js.map +0 -1
  289. package/dist/window/types/file.mjs +0 -9
  290. package/dist/window/types/file.mjs.map +0 -1
  291. package/dist/window/types/frame-context.d.mts +0 -44
  292. package/dist/window/types/frame-context.d.ts +0 -44
  293. package/dist/window/types/frame-context.js +0 -17
  294. package/dist/window/types/frame-context.js.map +0 -1
  295. package/dist/window/types/frame-context.mjs +0 -15
  296. package/dist/window/types/frame-context.mjs.map +0 -1
  297. package/dist/window/types/host.d.mts +0 -73
  298. package/dist/window/types/host.d.ts +0 -73
  299. package/dist/window/types/host.js +0 -32
  300. package/dist/window/types/host.js.map +0 -1
  301. package/dist/window/types/host.mjs +0 -29
  302. package/dist/window/types/host.mjs.map +0 -1
  303. package/dist/window/types/index.d.mts +0 -39
  304. package/dist/window/types/index.d.ts +0 -39
  305. package/dist/window/types/index.js +0 -189
  306. package/dist/window/types/index.js.map +0 -1
  307. package/dist/window/types/index.mjs +0 -30
  308. package/dist/window/types/index.mjs.map +0 -1
  309. package/dist/window/types/legal-age-group-classification.d.mts +0 -34
  310. package/dist/window/types/legal-age-group-classification.d.ts +0 -34
  311. package/dist/window/types/legal-age-group-classification.js +0 -14
  312. package/dist/window/types/legal-age-group-classification.js.map +0 -1
  313. package/dist/window/types/legal-age-group-classification.mjs +0 -12
  314. package/dist/window/types/legal-age-group-classification.mjs.map +0 -1
  315. package/dist/window/types/liveshare/client.d.mts +0 -23
  316. package/dist/window/types/liveshare/client.d.ts +0 -23
  317. package/dist/window/types/liveshare/client.js +0 -4
  318. package/dist/window/types/liveshare/client.js.map +0 -1
  319. package/dist/window/types/liveshare/client.mjs +0 -3
  320. package/dist/window/types/liveshare/client.mjs.map +0 -1
  321. package/dist/window/types/liveshare/container-state.d.mts +0 -33
  322. package/dist/window/types/liveshare/container-state.d.ts +0 -33
  323. package/dist/window/types/liveshare/container-state.js +0 -13
  324. package/dist/window/types/liveshare/container-state.js.map +0 -1
  325. package/dist/window/types/liveshare/container-state.mjs +0 -11
  326. package/dist/window/types/liveshare/container-state.mjs.map +0 -1
  327. package/dist/window/types/liveshare/fluid-container.d.mts +0 -28
  328. package/dist/window/types/liveshare/fluid-container.d.ts +0 -28
  329. package/dist/window/types/liveshare/fluid-container.js +0 -4
  330. package/dist/window/types/liveshare/fluid-container.js.map +0 -1
  331. package/dist/window/types/liveshare/fluid-container.mjs +0 -3
  332. package/dist/window/types/liveshare/fluid-container.mjs.map +0 -1
  333. package/dist/window/types/liveshare/fluid-tenant.d.mts +0 -16
  334. package/dist/window/types/liveshare/fluid-tenant.d.ts +0 -16
  335. package/dist/window/types/liveshare/fluid-tenant.js +0 -4
  336. package/dist/window/types/liveshare/fluid-tenant.js.map +0 -1
  337. package/dist/window/types/liveshare/fluid-tenant.mjs +0 -3
  338. package/dist/window/types/liveshare/fluid-tenant.mjs.map +0 -1
  339. package/dist/window/types/liveshare/index.d.mts +0 -6
  340. package/dist/window/types/liveshare/index.d.ts +0 -6
  341. package/dist/window/types/liveshare/index.js +0 -42
  342. package/dist/window/types/liveshare/index.js.map +0 -1
  343. package/dist/window/types/liveshare/index.mjs +0 -7
  344. package/dist/window/types/liveshare/index.mjs.map +0 -1
  345. package/dist/window/types/liveshare/ntp-time.d.mts +0 -16
  346. package/dist/window/types/liveshare/ntp-time.d.ts +0 -16
  347. package/dist/window/types/liveshare/ntp-time.js +0 -4
  348. package/dist/window/types/liveshare/ntp-time.js.map +0 -1
  349. package/dist/window/types/liveshare/ntp-time.mjs +0 -3
  350. package/dist/window/types/liveshare/ntp-time.mjs.map +0 -1
  351. package/dist/window/types/locale.d.mts +0 -38
  352. package/dist/window/types/locale.d.ts +0 -38
  353. package/dist/window/types/locale.js +0 -4
  354. package/dist/window/types/locale.js.map +0 -1
  355. package/dist/window/types/locale.mjs +0 -3
  356. package/dist/window/types/locale.mjs.map +0 -1
  357. package/dist/window/types/location.d.mts +0 -25
  358. package/dist/window/types/location.d.ts +0 -25
  359. package/dist/window/types/location.js +0 -4
  360. package/dist/window/types/location.js.map +0 -1
  361. package/dist/window/types/location.mjs +0 -3
  362. package/dist/window/types/location.mjs.map +0 -1
  363. package/dist/window/types/marketplace/cart-info.d.mts +0 -47
  364. package/dist/window/types/marketplace/cart-info.d.ts +0 -47
  365. package/dist/window/types/marketplace/cart-info.js +0 -4
  366. package/dist/window/types/marketplace/cart-info.js.map +0 -1
  367. package/dist/window/types/marketplace/cart-info.mjs +0 -3
  368. package/dist/window/types/marketplace/cart-info.mjs.map +0 -1
  369. package/dist/window/types/marketplace/cart-item.d.mts +0 -40
  370. package/dist/window/types/marketplace/cart-item.d.ts +0 -40
  371. package/dist/window/types/marketplace/cart-item.js +0 -4
  372. package/dist/window/types/marketplace/cart-item.js.map +0 -1
  373. package/dist/window/types/marketplace/cart-item.mjs +0 -3
  374. package/dist/window/types/marketplace/cart-item.mjs.map +0 -1
  375. package/dist/window/types/marketplace/cart-status.d.mts +0 -33
  376. package/dist/window/types/marketplace/cart-status.d.ts +0 -33
  377. package/dist/window/types/marketplace/cart-status.js +0 -14
  378. package/dist/window/types/marketplace/cart-status.js.map +0 -1
  379. package/dist/window/types/marketplace/cart-status.mjs +0 -12
  380. package/dist/window/types/marketplace/cart-status.mjs.map +0 -1
  381. package/dist/window/types/marketplace/cart-version.d.mts +0 -17
  382. package/dist/window/types/marketplace/cart-version.d.ts +0 -17
  383. package/dist/window/types/marketplace/cart-version.js +0 -4
  384. package/dist/window/types/marketplace/cart-version.js.map +0 -1
  385. package/dist/window/types/marketplace/cart-version.mjs +0 -3
  386. package/dist/window/types/marketplace/cart-version.mjs.map +0 -1
  387. package/dist/window/types/marketplace/cart.d.mts +0 -29
  388. package/dist/window/types/marketplace/cart.d.ts +0 -29
  389. package/dist/window/types/marketplace/cart.js +0 -4
  390. package/dist/window/types/marketplace/cart.js.map +0 -1
  391. package/dist/window/types/marketplace/cart.mjs +0 -3
  392. package/dist/window/types/marketplace/cart.mjs.map +0 -1
  393. package/dist/window/types/marketplace/index.d.mts +0 -6
  394. package/dist/window/types/marketplace/index.d.ts +0 -6
  395. package/dist/window/types/marketplace/index.js +0 -49
  396. package/dist/window/types/marketplace/index.js.map +0 -1
  397. package/dist/window/types/marketplace/index.mjs +0 -8
  398. package/dist/window/types/marketplace/index.mjs.map +0 -1
  399. package/dist/window/types/marketplace/intent.d.mts +0 -23
  400. package/dist/window/types/marketplace/intent.d.ts +0 -23
  401. package/dist/window/types/marketplace/intent.js +0 -12
  402. package/dist/window/types/marketplace/intent.js.map +0 -1
  403. package/dist/window/types/marketplace/intent.mjs +0 -10
  404. package/dist/window/types/marketplace/intent.mjs.map +0 -1
  405. package/dist/window/types/notification-type.d.mts +0 -3
  406. package/dist/window/types/notification-type.d.ts +0 -3
  407. package/dist/window/types/notification-type.js +0 -4
  408. package/dist/window/types/notification-type.js.map +0 -1
  409. package/dist/window/types/notification-type.mjs +0 -3
  410. package/dist/window/types/notification-type.mjs.map +0 -1
  411. package/dist/window/types/permission.d.mts +0 -3
  412. package/dist/window/types/permission.d.ts +0 -3
  413. package/dist/window/types/permission.js +0 -4
  414. package/dist/window/types/permission.js.map +0 -1
  415. package/dist/window/types/permission.mjs +0 -3
  416. package/dist/window/types/permission.mjs.map +0 -1
  417. package/dist/window/types/team-type.d.mts +0 -24
  418. package/dist/window/types/team-type.d.ts +0 -24
  419. package/dist/window/types/team-type.js +0 -18
  420. package/dist/window/types/team-type.js.map +0 -1
  421. package/dist/window/types/team-type.mjs +0 -15
  422. package/dist/window/types/team-type.mjs.map +0 -1
  423. package/dist/window/types/theme.d.mts +0 -6
  424. package/dist/window/types/theme.d.ts +0 -6
  425. package/dist/window/types/theme.js +0 -4
  426. package/dist/window/types/theme.js.map +0 -1
  427. package/dist/window/types/theme.mjs +0 -3
  428. package/dist/window/types/theme.mjs.map +0 -1
  429. package/dist/window/types/thread-member.d.mts +0 -11
  430. package/dist/window/types/thread-member.d.ts +0 -11
  431. package/dist/window/types/thread-member.js +0 -4
  432. package/dist/window/types/thread-member.js.map +0 -1
  433. package/dist/window/types/thread-member.mjs +0 -3
  434. package/dist/window/types/thread-member.mjs.map +0 -1
  435. package/dist/window/types/user-meeting-role.d.mts +0 -31
  436. package/dist/window/types/user-meeting-role.d.ts +0 -31
  437. package/dist/window/types/user-meeting-role.js +0 -13
  438. package/dist/window/types/user-meeting-role.js.map +0 -1
  439. package/dist/window/types/user-meeting-role.mjs +0 -11
  440. package/dist/window/types/user-meeting-role.mjs.map +0 -1
  441. package/dist/window/types/user-profile.d.mts +0 -82
  442. package/dist/window/types/user-profile.d.ts +0 -82
  443. package/dist/window/types/user-profile.js +0 -4
  444. package/dist/window/types/user-profile.js.map +0 -1
  445. package/dist/window/types/user-profile.mjs +0 -3
  446. package/dist/window/types/user-profile.mjs.map +0 -1
  447. package/dist/window/types/user-team-role.d.mts +0 -18
  448. package/dist/window/types/user-team-role.d.ts +0 -18
  449. package/dist/window/types/user-team-role.js +0 -16
  450. package/dist/window/types/user-team-role.js.map +0 -1
  451. package/dist/window/types/user-team-role.mjs +0 -13
  452. package/dist/window/types/user-team-role.mjs.map +0 -1
  453. package/dist/window/window-client.d.mts +0 -28
  454. package/dist/window/window-client.d.ts +0 -28
  455. package/dist/window/window-client.js +0 -92
  456. package/dist/window/window-client.js.map +0 -1
  457. package/dist/window/window-client.mjs +0 -70
  458. package/dist/window/window-client.mjs.map +0 -1
package/README.md CHANGED
@@ -34,4 +34,4 @@ $: npm install @microsoft/teams.client
34
34
 
35
35
  ## Links
36
36
 
37
- - https://learn.microsoft.com/en-us/microsoftteams/platform/tabs/what-are-tabs?tabs=personal
37
+ - https://learn.microsoft.com/en-us/microsoftteams/platform/tabs/what-are-tabs?tabs=personal
package/dist/app.d.mts CHANGED
@@ -1,7 +1,8 @@
1
1
  import * as msal from '@azure/msal-browser';
2
+ import * as teamsJs from '@microsoft/teams-js';
2
3
  import * as http from '@microsoft/teams.common/http';
3
4
  import { ILogger } from '@microsoft/teams.common/logging';
4
- import * as teamsJs from '@microsoft/teams-js';
5
+ import * as graph from '@microsoft/teams.graph';
5
6
 
6
7
  type MsalOptions = {
7
8
  /**
@@ -10,9 +11,12 @@ type MsalOptions = {
10
11
  */
11
12
  readonly configuration?: msal.Configuration;
12
13
  /**
13
- * Default token request options used when acquiring a token.
14
+ * Options to control scope consent pre-warming. If explicitly set to false, no pre-warming is performed.
15
+ * If no value is provided, the default scope (i.e. ".default") is pre-warmed. If a set of scopes is
16
+ * provided, the specified scopes are pre-warmed. The scopes should be for a single resource, and they
17
+ * should not mix the .default scope with named scopes.
14
18
  */
15
- readonly defaultSilentRequest?: msal.SilentRequest;
19
+ readonly prewarmScopes?: false | string[];
16
20
  };
17
21
  type AppOptions = {
18
22
  /**
@@ -56,6 +60,7 @@ type ExecOptions = ({
56
60
  declare class App {
57
61
  readonly options: AppOptions;
58
62
  readonly http: http.Client;
63
+ readonly graph: graph.Client;
59
64
  readonly clientId: string;
60
65
  protected _state: AppState;
61
66
  /**
@@ -87,6 +92,22 @@ declare class App {
87
92
  * @returns The function response
88
93
  */
89
94
  exec<T = unknown>(name: string, data?: unknown, options?: ExecOptions): Promise<T>;
95
+ /**
96
+ * Tests whether the user has consented to the specified scopes without prompting the user for consent.
97
+ * @param scopes The scopes to check consent for.The scopes should be for a single resource, and they
98
+ * should not mix the .default scope with named scopes.
99
+ * @returns A promise that resolves to a boolean indicating whether the user has consented to the scopes.
100
+ */
101
+ hasConsentForScopes(scopes: string[]): Promise<boolean>;
102
+ /**
103
+ * Tests whether the user has consented to the specified scopes, and prompts them if not. This is useful for ensuring
104
+ * that the user has consented to the required scopes before calling a graph API or other resource.
105
+ * @param scopes - The scopes to prewarm consent for. The scopes should be for a single resource, and they
106
+ * should not mix the .default scope with named scopes.
107
+ * @returns A value indicating whether consent has been acquired for the specified scopes.
108
+ */
109
+ ensureConsentForScopes(scopes: string[]): Promise<boolean>;
110
+ private appStateGuard;
90
111
  }
91
112
 
92
- export { App, type AppOptions, type MsalOptions };
113
+ export { App, type AppOptions, type ExecOptions, type MsalOptions };
package/dist/app.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import * as msal from '@azure/msal-browser';
2
+ import * as teamsJs from '@microsoft/teams-js';
2
3
  import * as http from '@microsoft/teams.common/http';
3
4
  import { ILogger } from '@microsoft/teams.common/logging';
4
- import * as teamsJs from '@microsoft/teams-js';
5
+ import * as graph from '@microsoft/teams.graph';
5
6
 
6
7
  type MsalOptions = {
7
8
  /**
@@ -10,9 +11,12 @@ type MsalOptions = {
10
11
  */
11
12
  readonly configuration?: msal.Configuration;
12
13
  /**
13
- * Default token request options used when acquiring a token.
14
+ * Options to control scope consent pre-warming. If explicitly set to false, no pre-warming is performed.
15
+ * If no value is provided, the default scope (i.e. ".default") is pre-warmed. If a set of scopes is
16
+ * provided, the specified scopes are pre-warmed. The scopes should be for a single resource, and they
17
+ * should not mix the .default scope with named scopes.
14
18
  */
15
- readonly defaultSilentRequest?: msal.SilentRequest;
19
+ readonly prewarmScopes?: false | string[];
16
20
  };
17
21
  type AppOptions = {
18
22
  /**
@@ -56,6 +60,7 @@ type ExecOptions = ({
56
60
  declare class App {
57
61
  readonly options: AppOptions;
58
62
  readonly http: http.Client;
63
+ readonly graph: graph.Client;
59
64
  readonly clientId: string;
60
65
  protected _state: AppState;
61
66
  /**
@@ -87,6 +92,22 @@ declare class App {
87
92
  * @returns The function response
88
93
  */
89
94
  exec<T = unknown>(name: string, data?: unknown, options?: ExecOptions): Promise<T>;
95
+ /**
96
+ * Tests whether the user has consented to the specified scopes without prompting the user for consent.
97
+ * @param scopes The scopes to check consent for.The scopes should be for a single resource, and they
98
+ * should not mix the .default scope with named scopes.
99
+ * @returns A promise that resolves to a boolean indicating whether the user has consented to the scopes.
100
+ */
101
+ hasConsentForScopes(scopes: string[]): Promise<boolean>;
102
+ /**
103
+ * Tests whether the user has consented to the specified scopes, and prompts them if not. This is useful for ensuring
104
+ * that the user has consented to the required scopes before calling a graph API or other resource.
105
+ * @param scopes - The scopes to prewarm consent for. The scopes should be for a single resource, and they
106
+ * should not mix the .default scope with named scopes.
107
+ * @returns A value indicating whether consent has been acquired for the specified scopes.
108
+ */
109
+ ensureConsentForScopes(scopes: string[]): Promise<boolean>;
110
+ private appStateGuard;
90
111
  }
91
112
 
92
- export { App, type AppOptions, type MsalOptions };
113
+ export { App, type AppOptions, type ExecOptions, type MsalOptions };
package/dist/app.js CHANGED
@@ -1,9 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  var msal = require('@azure/msal-browser');
4
+ var teamsJs = require('@microsoft/teams-js');
4
5
  var http = require('@microsoft/teams.common/http');
5
6
  var logging = require('@microsoft/teams.common/logging');
6
- var teamsJs = require('@microsoft/teams-js');
7
+ var graphUtils = require('./graph-utils');
7
8
  var msalUtils = require('./msal-utils');
8
9
 
9
10
  function _interopNamespace(e) {
@@ -25,12 +26,13 @@ function _interopNamespace(e) {
25
26
  }
26
27
 
27
28
  var msal__namespace = /*#__PURE__*/_interopNamespace(msal);
28
- var http__namespace = /*#__PURE__*/_interopNamespace(http);
29
29
  var teamsJs__namespace = /*#__PURE__*/_interopNamespace(teamsJs);
30
+ var http__namespace = /*#__PURE__*/_interopNamespace(http);
30
31
 
31
32
  class App {
32
33
  options;
33
34
  http;
35
+ graph;
34
36
  clientId;
35
37
  _state = { phase: "stopped" };
36
38
  /**
@@ -58,6 +60,7 @@ class App {
58
60
  this.options = options;
59
61
  this._log = options?.logger || new logging.ConsoleLogger("@teams/client");
60
62
  this.http = new http__namespace.Client({ baseUrl: options?.baseUrl });
63
+ this.graph = graphUtils.buildGraphClient(() => this.appStateGuard(), this._log);
61
64
  }
62
65
  /**
63
66
  * Starts the library and initializes the dependent teams-js and MSAL libraries.
@@ -77,6 +80,11 @@ class App {
77
80
  const msalInstance = await msal__namespace.createNestablePublicClientApplication(msalConfig);
78
81
  await msalInstance.initialize();
79
82
  this._state = { phase: "started", msalInstance, context, startedAt: /* @__PURE__ */ new Date() };
83
+ if (this.options.msalOptions?.prewarmScopes !== false) {
84
+ const scopes = this.options.msalOptions?.prewarmScopes ?? [".default"];
85
+ this._log.debug(`prewarming consent for scopes: ${scopes.join(", ")}`);
86
+ await this.ensureConsentForScopes(scopes);
87
+ }
80
88
  this._log.debug("app started");
81
89
  }
82
90
  /**
@@ -90,12 +98,9 @@ class App {
90
98
  * @returns The function response
91
99
  */
92
100
  async exec(name, data, options) {
93
- if (this._state.phase !== "started") {
94
- throw new Error("App not started");
95
- }
96
- const { context } = this._state;
101
+ const { msalInstance, context } = this.appStateGuard();
97
102
  const accessToken = await msalUtils.acquireMsalAccessToken(
98
- this._state.msalInstance,
103
+ msalInstance,
99
104
  options?.msalTokenRequest ?? msalUtils.getStandardExecSilentRequest(this.clientId, options?.permission),
100
105
  this._log
101
106
  );
@@ -115,6 +120,38 @@ class App {
115
120
  });
116
121
  return res.data;
117
122
  }
123
+ /**
124
+ * Tests whether the user has consented to the specified scopes without prompting the user for consent.
125
+ * @param scopes The scopes to check consent for.The scopes should be for a single resource, and they
126
+ * should not mix the .default scope with named scopes.
127
+ * @returns A promise that resolves to a boolean indicating whether the user has consented to the scopes.
128
+ */
129
+ async hasConsentForScopes(scopes) {
130
+ const { msalInstance } = this.appStateGuard();
131
+ return await msalUtils.hasConsentForScopes(msalInstance, scopes, this.log);
132
+ }
133
+ /**
134
+ * Tests whether the user has consented to the specified scopes, and prompts them if not. This is useful for ensuring
135
+ * that the user has consented to the required scopes before calling a graph API or other resource.
136
+ * @param scopes - The scopes to prewarm consent for. The scopes should be for a single resource, and they
137
+ * should not mix the .default scope with named scopes.
138
+ * @returns A value indicating whether consent has been acquired for the specified scopes.
139
+ */
140
+ async ensureConsentForScopes(scopes) {
141
+ const { msalInstance } = this.appStateGuard();
142
+ try {
143
+ const token = await msalUtils.acquireMsalAccessToken(msalInstance, { scopes }, this.log);
144
+ return !!token;
145
+ } catch (ex) {
146
+ return false;
147
+ }
148
+ }
149
+ appStateGuard() {
150
+ if (this._state.phase !== "started") {
151
+ throw new Error("App not started");
152
+ }
153
+ return this._state;
154
+ }
118
155
  }
119
156
 
120
157
  exports.App = App;
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/app.ts"],"names":["ConsoleLogger","http","teamsJs","buildMsalConfig","msal","acquireMsalAccessToken","getStandardExecSilentRequest"],"mappings":"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","file":"app.js","sourcesContent":["import * as msal from '@azure/msal-browser';\nimport * as http from '@microsoft/teams.common/http';\nimport { ILogger, ConsoleLogger } from '@microsoft/teams.common/logging';\nimport * as teamsJs from '@microsoft/teams-js';\n\nimport {\n acquireMsalAccessToken,\n buildMsalConfig,\n getStandardExecSilentRequest,\n} from './msal-utils';\n\nexport type MsalOptions = {\n /**\n * Optional MSAL configuration. This parameter is used to construct an MSAL instance in order\n * to make authenticated function calls. If omitted, a default configuration is created.\n */\n readonly configuration?: msal.Configuration;\n /**\n * Default token request options used when acquiring a token.\n */\n readonly defaultSilentRequest?: msal.SilentRequest;\n};\n\nexport type AppOptions = {\n /**\n * The app base url.\n */\n readonly baseUrl?: string;\n\n /** App tenant ID */\n readonly tenantId?: string;\n\n /**\n * Logger instance to use.\n */\n readonly logger?: ILogger;\n\n /**\n * Options to control how MSAL is initialized and used.\n */\n readonly msalOptions?: MsalOptions;\n};\n\ntype AppState =\n | {\n phase: 'stopped' | 'starting';\n startedAt?: never;\n msalInstance?: never;\n context?: never;\n }\n | {\n phase: 'started';\n startedAt: Date;\n msalInstance: msal.IPublicClientApplication;\n context: teamsJs.app.Context;\n };\n\ntype ExecOptions = (\n | { msalTokenRequest: msal.SilentRequest; permission?: never }\n | { msalTokenRequest?: never; permission: string }\n | { msalTokenRequest?: never; permission?: never }\n) & {\n requestHeaders?: Record<string, string>;\n};\n\nexport class App {\n readonly options: AppOptions;\n readonly http: http.Client;\n readonly clientId: string;\n protected _state: AppState = { phase: 'stopped' };\n\n /**\n * the apps logger\n */\n get log() {\n return this._log;\n }\n protected _log: ILogger;\n\n /**\n * the date/time when the app was successfully started.\n */\n get startedAt() {\n return this._state?.startedAt;\n }\n\n /** the msal instance used in this app. undefined until the app is started. */\n get msalInstance() {\n return this._state.msalInstance;\n }\n\n constructor(clientId: string, options: AppOptions = {}) {\n if (!clientId) {\n throw new Error('Invalid client ID.');\n }\n\n this.clientId = clientId;\n this.options = options;\n this._log = options?.logger || new ConsoleLogger('@teams/client');\n this.http = new http.Client({ baseUrl: options?.baseUrl });\n }\n\n /**\n * Starts the library and initializes the dependent teams-js and MSAL libraries.\n * @returns A promise that will be fulfilled when the app has started, or\n * rejected if the initialization fails or times out.\n */\n async start(): Promise<void> {\n if (this._state.phase !== 'stopped') {\n this._log.debug(`app already ${this._state.phase}`);\n return;\n }\n\n this._log.debug('app starting');\n this._state = { phase: 'starting' };\n\n await teamsJs.app.initialize();\n const context = await teamsJs.app.getContext();\n\n const msalConfig =\n this.options.msalOptions?.configuration ?? buildMsalConfig(this.clientId, this._log);\n const msalInstance = await msal.createNestablePublicClientApplication(msalConfig);\n await msalInstance.initialize();\n\n this._state = { phase: 'started', msalInstance, context, startedAt: new Date() };\n this._log.debug('app started');\n }\n\n /**\n * Execute a server-side function\n * @param name The unique function name\n * @param data The data to send\n * @param options Options\n * @param options.msalTokenRequest Optional MSAL token request.\n * If omitted, a default token request is used.\n * @param options.requestHeaders Optional additional request headers.\n * @returns The function response\n */\n async exec<T = unknown>(name: string, data?: unknown, options?: ExecOptions): Promise<T> {\n if (this._state.phase !== 'started') {\n throw new Error('App not started');\n }\n\n const { context } = this._state;\n const accessToken = await acquireMsalAccessToken(\n this._state.msalInstance,\n options?.msalTokenRequest ?? getStandardExecSilentRequest(this.clientId, options?.permission),\n this._log\n );\n\n const res = await this.http.post<T>(`/api/functions/${name}`, data, {\n headers: {\n authorization: `Bearer ${accessToken}`,\n 'x-teams-app-session-id': context.app.sessionId,\n 'x-teams-channel-id': context.channel?.id,\n 'x-teams-chat-id': context.chat?.id,\n 'x-teams-meeting-id': context.meeting?.id,\n 'x-teams-message-id': context.app.parentMessageId,\n 'x-teams-page-id': context.page.id,\n 'x-teams-sub-page-id': context.page.subPageId,\n 'x-teams-team-id': context.team?.internalId,\n ...(options?.requestHeaders ?? {}),\n },\n });\n\n return res.data;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/app.ts"],"names":["ConsoleLogger","http","buildGraphClient","teamsJs","buildMsalConfig","msal","acquireMsalAccessToken","getStandardExecSilentRequest","hasConsentForScopes"],"mappings":"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","file":"app.js","sourcesContent":["import * as msal from '@azure/msal-browser';\n\nimport * as teamsJs from '@microsoft/teams-js';\nimport * as http from '@microsoft/teams.common/http';\nimport { ILogger, ConsoleLogger } from '@microsoft/teams.common/logging';\nimport * as graph from '@microsoft/teams.graph';\n\nimport { buildGraphClient } from './graph-utils';\nimport {\n acquireMsalAccessToken,\n buildMsalConfig,\n getStandardExecSilentRequest,\n hasConsentForScopes,\n} from './msal-utils';\n\nexport type MsalOptions = {\n /**\n * Optional MSAL configuration. This parameter is used to construct an MSAL instance in order\n * to make authenticated function calls. If omitted, a default configuration is created.\n */\n readonly configuration?: msal.Configuration;\n /**\n * Options to control scope consent pre-warming. If explicitly set to false, no pre-warming is performed.\n * If no value is provided, the default scope (i.e. \".default\") is pre-warmed. If a set of scopes is\n * provided, the specified scopes are pre-warmed. The scopes should be for a single resource, and they\n * should not mix the .default scope with named scopes.\n */\n readonly prewarmScopes?: false | string[];\n};\n\nexport type AppOptions = {\n /**\n * The app base url.\n */\n readonly baseUrl?: string;\n\n /** App tenant ID */\n readonly tenantId?: string;\n\n /**\n * Logger instance to use.\n */\n readonly logger?: ILogger;\n\n /**\n * Options to control how MSAL is initialized and used.\n */\n readonly msalOptions?: MsalOptions;\n};\n\ntype AppState =\n | {\n phase: 'stopped' | 'starting';\n startedAt?: never;\n msalInstance?: never;\n context?: never;\n }\n | {\n phase: 'started';\n startedAt: Date;\n msalInstance: msal.IPublicClientApplication;\n context: teamsJs.app.Context;\n };\n\nexport type ExecOptions = (\n | { msalTokenRequest: msal.SilentRequest; permission?: never }\n | { msalTokenRequest?: never; permission: string }\n | { msalTokenRequest?: never; permission?: never }\n) & {\n requestHeaders?: Record<string, string>;\n};\n\nexport class App {\n readonly options: AppOptions;\n readonly http: http.Client;\n readonly graph: graph.Client;\n readonly clientId: string;\n protected _state: AppState = { phase: 'stopped' };\n\n /**\n * the apps logger\n */\n get log() {\n return this._log;\n }\n protected _log: ILogger;\n\n /**\n * the date/time when the app was successfully started.\n */\n get startedAt() {\n return this._state?.startedAt;\n }\n\n /** the msal instance used in this app. undefined until the app is started. */\n get msalInstance() {\n return this._state.msalInstance;\n }\n\n constructor(clientId: string, options: AppOptions = {}) {\n if (!clientId) {\n throw new Error('Invalid client ID.');\n }\n\n this.clientId = clientId;\n this.options = options;\n this._log = options?.logger || new ConsoleLogger('@teams/client');\n this.http = new http.Client({ baseUrl: options?.baseUrl });\n this.graph = buildGraphClient(() => this.appStateGuard(), this._log);\n }\n\n /**\n * Starts the library and initializes the dependent teams-js and MSAL libraries.\n * @returns A promise that will be fulfilled when the app has started, or\n * rejected if the initialization fails or times out.\n */\n async start(): Promise<void> {\n if (this._state.phase !== 'stopped') {\n this._log.debug(`app already ${this._state.phase}`);\n return;\n }\n\n this._log.debug('app starting');\n this._state = { phase: 'starting' };\n\n await teamsJs.app.initialize();\n const context = await teamsJs.app.getContext();\n\n const msalConfig =\n this.options.msalOptions?.configuration ?? buildMsalConfig(this.clientId, this._log);\n const msalInstance = await msal.createNestablePublicClientApplication(msalConfig);\n await msalInstance.initialize();\n\n this._state = { phase: 'started', msalInstance, context, startedAt: new Date() };\n\n // pre-warm consent for the specified scopes\n if (this.options.msalOptions?.prewarmScopes !== false) {\n const scopes = this.options.msalOptions?.prewarmScopes ?? ['.default'];\n this._log.debug(`prewarming consent for scopes: ${scopes.join(', ')}`);\n await this.ensureConsentForScopes(scopes);\n }\n\n this._log.debug('app started');\n }\n\n /**\n * Execute a server-side function\n * @param name The unique function name\n * @param data The data to send\n * @param options Options\n * @param options.msalTokenRequest Optional MSAL token request.\n * If omitted, a default token request is used.\n * @param options.requestHeaders Optional additional request headers.\n * @returns The function response\n */\n async exec<T = unknown>(name: string, data?: unknown, options?: ExecOptions): Promise<T> {\n const { msalInstance, context } = this.appStateGuard();\n\n const accessToken = await acquireMsalAccessToken(\n msalInstance,\n options?.msalTokenRequest ?? getStandardExecSilentRequest(this.clientId, options?.permission),\n this._log\n );\n\n const res = await this.http.post<T>(`/api/functions/${name}`, data, {\n headers: {\n authorization: `Bearer ${accessToken}`,\n 'x-teams-app-session-id': context.app.sessionId,\n 'x-teams-channel-id': context.channel?.id,\n 'x-teams-chat-id': context.chat?.id,\n 'x-teams-meeting-id': context.meeting?.id,\n 'x-teams-message-id': context.app.parentMessageId,\n 'x-teams-page-id': context.page.id,\n 'x-teams-sub-page-id': context.page.subPageId,\n 'x-teams-team-id': context.team?.internalId,\n ...(options?.requestHeaders ?? {}),\n },\n });\n\n return res.data;\n }\n\n /**\n * Tests whether the user has consented to the specified scopes without prompting the user for consent.\n * @param scopes The scopes to check consent for.The scopes should be for a single resource, and they\n * should not mix the .default scope with named scopes.\n * @returns A promise that resolves to a boolean indicating whether the user has consented to the scopes.\n */\n async hasConsentForScopes(scopes: string[]): Promise<boolean> {\n const { msalInstance } = this.appStateGuard();\n\n return await hasConsentForScopes(msalInstance, scopes, this.log);\n }\n\n /**\n * Tests whether the user has consented to the specified scopes, and prompts them if not. This is useful for ensuring\n * that the user has consented to the required scopes before calling a graph API or other resource.\n * @param scopes - The scopes to prewarm consent for. The scopes should be for a single resource, and they\n * should not mix the .default scope with named scopes.\n * @returns A value indicating whether consent has been acquired for the specified scopes.\n */\n async ensureConsentForScopes(scopes: string[]): Promise<boolean> {\n const { msalInstance } = this.appStateGuard();\n\n try {\n const token = await acquireMsalAccessToken(msalInstance, { scopes }, this.log);\n return !!token;\n } catch (ex) {\n return false;\n }\n }\n\n private appStateGuard(): AppState & { phase: 'started' } {\n if (this._state.phase !== 'started') {\n throw new Error('App not started');\n }\n return this._state;\n }\n}\n"]}
package/dist/app.mjs CHANGED
@@ -1,12 +1,14 @@
1
1
  import * as msal from '@azure/msal-browser';
2
+ import * as teamsJs from '@microsoft/teams-js';
2
3
  import * as http from '@microsoft/teams.common/http';
3
4
  import { ConsoleLogger } from '@microsoft/teams.common/logging';
4
- import * as teamsJs from '@microsoft/teams-js';
5
- import { buildMsalConfig, acquireMsalAccessToken, getStandardExecSilentRequest } from './msal-utils';
5
+ import { buildGraphClient } from './graph-utils';
6
+ import { buildMsalConfig, acquireMsalAccessToken, getStandardExecSilentRequest, hasConsentForScopes } from './msal-utils';
6
7
 
7
8
  class App {
8
9
  options;
9
10
  http;
11
+ graph;
10
12
  clientId;
11
13
  _state = { phase: "stopped" };
12
14
  /**
@@ -34,6 +36,7 @@ class App {
34
36
  this.options = options;
35
37
  this._log = options?.logger || new ConsoleLogger("@teams/client");
36
38
  this.http = new http.Client({ baseUrl: options?.baseUrl });
39
+ this.graph = buildGraphClient(() => this.appStateGuard(), this._log);
37
40
  }
38
41
  /**
39
42
  * Starts the library and initializes the dependent teams-js and MSAL libraries.
@@ -53,6 +56,11 @@ class App {
53
56
  const msalInstance = await msal.createNestablePublicClientApplication(msalConfig);
54
57
  await msalInstance.initialize();
55
58
  this._state = { phase: "started", msalInstance, context, startedAt: /* @__PURE__ */ new Date() };
59
+ if (this.options.msalOptions?.prewarmScopes !== false) {
60
+ const scopes = this.options.msalOptions?.prewarmScopes ?? [".default"];
61
+ this._log.debug(`prewarming consent for scopes: ${scopes.join(", ")}`);
62
+ await this.ensureConsentForScopes(scopes);
63
+ }
56
64
  this._log.debug("app started");
57
65
  }
58
66
  /**
@@ -66,12 +74,9 @@ class App {
66
74
  * @returns The function response
67
75
  */
68
76
  async exec(name, data, options) {
69
- if (this._state.phase !== "started") {
70
- throw new Error("App not started");
71
- }
72
- const { context } = this._state;
77
+ const { msalInstance, context } = this.appStateGuard();
73
78
  const accessToken = await acquireMsalAccessToken(
74
- this._state.msalInstance,
79
+ msalInstance,
75
80
  options?.msalTokenRequest ?? getStandardExecSilentRequest(this.clientId, options?.permission),
76
81
  this._log
77
82
  );
@@ -91,6 +96,38 @@ class App {
91
96
  });
92
97
  return res.data;
93
98
  }
99
+ /**
100
+ * Tests whether the user has consented to the specified scopes without prompting the user for consent.
101
+ * @param scopes The scopes to check consent for.The scopes should be for a single resource, and they
102
+ * should not mix the .default scope with named scopes.
103
+ * @returns A promise that resolves to a boolean indicating whether the user has consented to the scopes.
104
+ */
105
+ async hasConsentForScopes(scopes) {
106
+ const { msalInstance } = this.appStateGuard();
107
+ return await hasConsentForScopes(msalInstance, scopes, this.log);
108
+ }
109
+ /**
110
+ * Tests whether the user has consented to the specified scopes, and prompts them if not. This is useful for ensuring
111
+ * that the user has consented to the required scopes before calling a graph API or other resource.
112
+ * @param scopes - The scopes to prewarm consent for. The scopes should be for a single resource, and they
113
+ * should not mix the .default scope with named scopes.
114
+ * @returns A value indicating whether consent has been acquired for the specified scopes.
115
+ */
116
+ async ensureConsentForScopes(scopes) {
117
+ const { msalInstance } = this.appStateGuard();
118
+ try {
119
+ const token = await acquireMsalAccessToken(msalInstance, { scopes }, this.log);
120
+ return !!token;
121
+ } catch (ex) {
122
+ return false;
123
+ }
124
+ }
125
+ appStateGuard() {
126
+ if (this._state.phase !== "started") {
127
+ throw new Error("App not started");
128
+ }
129
+ return this._state;
130
+ }
94
131
  }
95
132
 
96
133
  export { App };
package/dist/app.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/app.ts"],"names":[],"mappings":"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","file":"app.mjs","sourcesContent":["import * as msal from '@azure/msal-browser';\nimport * as http from '@microsoft/teams.common/http';\nimport { ILogger, ConsoleLogger } from '@microsoft/teams.common/logging';\nimport * as teamsJs from '@microsoft/teams-js';\n\nimport {\n acquireMsalAccessToken,\n buildMsalConfig,\n getStandardExecSilentRequest,\n} from './msal-utils';\n\nexport type MsalOptions = {\n /**\n * Optional MSAL configuration. This parameter is used to construct an MSAL instance in order\n * to make authenticated function calls. If omitted, a default configuration is created.\n */\n readonly configuration?: msal.Configuration;\n /**\n * Default token request options used when acquiring a token.\n */\n readonly defaultSilentRequest?: msal.SilentRequest;\n};\n\nexport type AppOptions = {\n /**\n * The app base url.\n */\n readonly baseUrl?: string;\n\n /** App tenant ID */\n readonly tenantId?: string;\n\n /**\n * Logger instance to use.\n */\n readonly logger?: ILogger;\n\n /**\n * Options to control how MSAL is initialized and used.\n */\n readonly msalOptions?: MsalOptions;\n};\n\ntype AppState =\n | {\n phase: 'stopped' | 'starting';\n startedAt?: never;\n msalInstance?: never;\n context?: never;\n }\n | {\n phase: 'started';\n startedAt: Date;\n msalInstance: msal.IPublicClientApplication;\n context: teamsJs.app.Context;\n };\n\ntype ExecOptions = (\n | { msalTokenRequest: msal.SilentRequest; permission?: never }\n | { msalTokenRequest?: never; permission: string }\n | { msalTokenRequest?: never; permission?: never }\n) & {\n requestHeaders?: Record<string, string>;\n};\n\nexport class App {\n readonly options: AppOptions;\n readonly http: http.Client;\n readonly clientId: string;\n protected _state: AppState = { phase: 'stopped' };\n\n /**\n * the apps logger\n */\n get log() {\n return this._log;\n }\n protected _log: ILogger;\n\n /**\n * the date/time when the app was successfully started.\n */\n get startedAt() {\n return this._state?.startedAt;\n }\n\n /** the msal instance used in this app. undefined until the app is started. */\n get msalInstance() {\n return this._state.msalInstance;\n }\n\n constructor(clientId: string, options: AppOptions = {}) {\n if (!clientId) {\n throw new Error('Invalid client ID.');\n }\n\n this.clientId = clientId;\n this.options = options;\n this._log = options?.logger || new ConsoleLogger('@teams/client');\n this.http = new http.Client({ baseUrl: options?.baseUrl });\n }\n\n /**\n * Starts the library and initializes the dependent teams-js and MSAL libraries.\n * @returns A promise that will be fulfilled when the app has started, or\n * rejected if the initialization fails or times out.\n */\n async start(): Promise<void> {\n if (this._state.phase !== 'stopped') {\n this._log.debug(`app already ${this._state.phase}`);\n return;\n }\n\n this._log.debug('app starting');\n this._state = { phase: 'starting' };\n\n await teamsJs.app.initialize();\n const context = await teamsJs.app.getContext();\n\n const msalConfig =\n this.options.msalOptions?.configuration ?? buildMsalConfig(this.clientId, this._log);\n const msalInstance = await msal.createNestablePublicClientApplication(msalConfig);\n await msalInstance.initialize();\n\n this._state = { phase: 'started', msalInstance, context, startedAt: new Date() };\n this._log.debug('app started');\n }\n\n /**\n * Execute a server-side function\n * @param name The unique function name\n * @param data The data to send\n * @param options Options\n * @param options.msalTokenRequest Optional MSAL token request.\n * If omitted, a default token request is used.\n * @param options.requestHeaders Optional additional request headers.\n * @returns The function response\n */\n async exec<T = unknown>(name: string, data?: unknown, options?: ExecOptions): Promise<T> {\n if (this._state.phase !== 'started') {\n throw new Error('App not started');\n }\n\n const { context } = this._state;\n const accessToken = await acquireMsalAccessToken(\n this._state.msalInstance,\n options?.msalTokenRequest ?? getStandardExecSilentRequest(this.clientId, options?.permission),\n this._log\n );\n\n const res = await this.http.post<T>(`/api/functions/${name}`, data, {\n headers: {\n authorization: `Bearer ${accessToken}`,\n 'x-teams-app-session-id': context.app.sessionId,\n 'x-teams-channel-id': context.channel?.id,\n 'x-teams-chat-id': context.chat?.id,\n 'x-teams-meeting-id': context.meeting?.id,\n 'x-teams-message-id': context.app.parentMessageId,\n 'x-teams-page-id': context.page.id,\n 'x-teams-sub-page-id': context.page.subPageId,\n 'x-teams-team-id': context.team?.internalId,\n ...(options?.requestHeaders ?? {}),\n },\n });\n\n return res.data;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/app.ts"],"names":[],"mappings":"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","file":"app.mjs","sourcesContent":["import * as msal from '@azure/msal-browser';\n\nimport * as teamsJs from '@microsoft/teams-js';\nimport * as http from '@microsoft/teams.common/http';\nimport { ILogger, ConsoleLogger } from '@microsoft/teams.common/logging';\nimport * as graph from '@microsoft/teams.graph';\n\nimport { buildGraphClient } from './graph-utils';\nimport {\n acquireMsalAccessToken,\n buildMsalConfig,\n getStandardExecSilentRequest,\n hasConsentForScopes,\n} from './msal-utils';\n\nexport type MsalOptions = {\n /**\n * Optional MSAL configuration. This parameter is used to construct an MSAL instance in order\n * to make authenticated function calls. If omitted, a default configuration is created.\n */\n readonly configuration?: msal.Configuration;\n /**\n * Options to control scope consent pre-warming. If explicitly set to false, no pre-warming is performed.\n * If no value is provided, the default scope (i.e. \".default\") is pre-warmed. If a set of scopes is\n * provided, the specified scopes are pre-warmed. The scopes should be for a single resource, and they\n * should not mix the .default scope with named scopes.\n */\n readonly prewarmScopes?: false | string[];\n};\n\nexport type AppOptions = {\n /**\n * The app base url.\n */\n readonly baseUrl?: string;\n\n /** App tenant ID */\n readonly tenantId?: string;\n\n /**\n * Logger instance to use.\n */\n readonly logger?: ILogger;\n\n /**\n * Options to control how MSAL is initialized and used.\n */\n readonly msalOptions?: MsalOptions;\n};\n\ntype AppState =\n | {\n phase: 'stopped' | 'starting';\n startedAt?: never;\n msalInstance?: never;\n context?: never;\n }\n | {\n phase: 'started';\n startedAt: Date;\n msalInstance: msal.IPublicClientApplication;\n context: teamsJs.app.Context;\n };\n\nexport type ExecOptions = (\n | { msalTokenRequest: msal.SilentRequest; permission?: never }\n | { msalTokenRequest?: never; permission: string }\n | { msalTokenRequest?: never; permission?: never }\n) & {\n requestHeaders?: Record<string, string>;\n};\n\nexport class App {\n readonly options: AppOptions;\n readonly http: http.Client;\n readonly graph: graph.Client;\n readonly clientId: string;\n protected _state: AppState = { phase: 'stopped' };\n\n /**\n * the apps logger\n */\n get log() {\n return this._log;\n }\n protected _log: ILogger;\n\n /**\n * the date/time when the app was successfully started.\n */\n get startedAt() {\n return this._state?.startedAt;\n }\n\n /** the msal instance used in this app. undefined until the app is started. */\n get msalInstance() {\n return this._state.msalInstance;\n }\n\n constructor(clientId: string, options: AppOptions = {}) {\n if (!clientId) {\n throw new Error('Invalid client ID.');\n }\n\n this.clientId = clientId;\n this.options = options;\n this._log = options?.logger || new ConsoleLogger('@teams/client');\n this.http = new http.Client({ baseUrl: options?.baseUrl });\n this.graph = buildGraphClient(() => this.appStateGuard(), this._log);\n }\n\n /**\n * Starts the library and initializes the dependent teams-js and MSAL libraries.\n * @returns A promise that will be fulfilled when the app has started, or\n * rejected if the initialization fails or times out.\n */\n async start(): Promise<void> {\n if (this._state.phase !== 'stopped') {\n this._log.debug(`app already ${this._state.phase}`);\n return;\n }\n\n this._log.debug('app starting');\n this._state = { phase: 'starting' };\n\n await teamsJs.app.initialize();\n const context = await teamsJs.app.getContext();\n\n const msalConfig =\n this.options.msalOptions?.configuration ?? buildMsalConfig(this.clientId, this._log);\n const msalInstance = await msal.createNestablePublicClientApplication(msalConfig);\n await msalInstance.initialize();\n\n this._state = { phase: 'started', msalInstance, context, startedAt: new Date() };\n\n // pre-warm consent for the specified scopes\n if (this.options.msalOptions?.prewarmScopes !== false) {\n const scopes = this.options.msalOptions?.prewarmScopes ?? ['.default'];\n this._log.debug(`prewarming consent for scopes: ${scopes.join(', ')}`);\n await this.ensureConsentForScopes(scopes);\n }\n\n this._log.debug('app started');\n }\n\n /**\n * Execute a server-side function\n * @param name The unique function name\n * @param data The data to send\n * @param options Options\n * @param options.msalTokenRequest Optional MSAL token request.\n * If omitted, a default token request is used.\n * @param options.requestHeaders Optional additional request headers.\n * @returns The function response\n */\n async exec<T = unknown>(name: string, data?: unknown, options?: ExecOptions): Promise<T> {\n const { msalInstance, context } = this.appStateGuard();\n\n const accessToken = await acquireMsalAccessToken(\n msalInstance,\n options?.msalTokenRequest ?? getStandardExecSilentRequest(this.clientId, options?.permission),\n this._log\n );\n\n const res = await this.http.post<T>(`/api/functions/${name}`, data, {\n headers: {\n authorization: `Bearer ${accessToken}`,\n 'x-teams-app-session-id': context.app.sessionId,\n 'x-teams-channel-id': context.channel?.id,\n 'x-teams-chat-id': context.chat?.id,\n 'x-teams-meeting-id': context.meeting?.id,\n 'x-teams-message-id': context.app.parentMessageId,\n 'x-teams-page-id': context.page.id,\n 'x-teams-sub-page-id': context.page.subPageId,\n 'x-teams-team-id': context.team?.internalId,\n ...(options?.requestHeaders ?? {}),\n },\n });\n\n return res.data;\n }\n\n /**\n * Tests whether the user has consented to the specified scopes without prompting the user for consent.\n * @param scopes The scopes to check consent for.The scopes should be for a single resource, and they\n * should not mix the .default scope with named scopes.\n * @returns A promise that resolves to a boolean indicating whether the user has consented to the scopes.\n */\n async hasConsentForScopes(scopes: string[]): Promise<boolean> {\n const { msalInstance } = this.appStateGuard();\n\n return await hasConsentForScopes(msalInstance, scopes, this.log);\n }\n\n /**\n * Tests whether the user has consented to the specified scopes, and prompts them if not. This is useful for ensuring\n * that the user has consented to the required scopes before calling a graph API or other resource.\n * @param scopes - The scopes to prewarm consent for. The scopes should be for a single resource, and they\n * should not mix the .default scope with named scopes.\n * @returns A value indicating whether consent has been acquired for the specified scopes.\n */\n async ensureConsentForScopes(scopes: string[]): Promise<boolean> {\n const { msalInstance } = this.appStateGuard();\n\n try {\n const token = await acquireMsalAccessToken(msalInstance, { scopes }, this.log);\n return !!token;\n } catch (ex) {\n return false;\n }\n }\n\n private appStateGuard(): AppState & { phase: 'started' } {\n if (this._state.phase !== 'started') {\n throw new Error('App not started');\n }\n return this._state;\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { ILogger } from '@microsoft/teams.common/logging';
2
+ import * as graph from '@microsoft/teams.graph';
3
+ import { acquireMsalAccessToken } from './msal-utils.mjs';
4
+ import '@azure/msal-browser';
5
+
6
+ declare function buildGraphClient(getMsalInstance: () => {
7
+ msalInstance: Parameters<typeof acquireMsalAccessToken>[0];
8
+ }, logger: ILogger): graph.Client;
9
+
10
+ export { buildGraphClient };
@@ -0,0 +1,10 @@
1
+ import { ILogger } from '@microsoft/teams.common/logging';
2
+ import * as graph from '@microsoft/teams.graph';
3
+ import { acquireMsalAccessToken } from './msal-utils.js';
4
+ import '@azure/msal-browser';
5
+
6
+ declare function buildGraphClient(getMsalInstance: () => {
7
+ msalInstance: Parameters<typeof acquireMsalAccessToken>[0];
8
+ }, logger: ILogger): graph.Client;
9
+
10
+ export { buildGraphClient };
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ var http = require('@microsoft/teams.common/http');
4
+ var graph = require('@microsoft/teams.graph');
5
+ var msalUtils = require('./msal-utils');
6
+
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
24
+
25
+ var http__namespace = /*#__PURE__*/_interopNamespace(http);
26
+ var graph__namespace = /*#__PURE__*/_interopNamespace(graph);
27
+
28
+ function buildGraphClient(getMsalInstance, logger) {
29
+ {
30
+ const graphRequestAccessTokenInterceptor = async (ctx) => {
31
+ const { msalInstance } = getMsalInstance();
32
+ const accessToken = await msalUtils.acquireMsalAccessToken(
33
+ msalInstance,
34
+ { scopes: [".default"] },
35
+ logger
36
+ );
37
+ ctx.config.headers.set("Authorization", `Bearer ${accessToken}`);
38
+ return ctx.config;
39
+ };
40
+ return new graph__namespace.Client(
41
+ new http__namespace.Client({
42
+ interceptors: [{ request: graphRequestAccessTokenInterceptor }]
43
+ })
44
+ );
45
+ }
46
+ }
47
+
48
+ exports.buildGraphClient = buildGraphClient;
49
+ //# sourceMappingURL=graph-utils.js.map
50
+ //# sourceMappingURL=graph-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/graph-utils.ts"],"names":["acquireMsalAccessToken","graph","http"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAMO,SAAS,gBAAA,CACd,iBACA,MACc,EAAA;AACd,EAAA;AACE,IAAM,MAAA,kCAAA,GAAqC,OAAO,GAA6B,KAAA;AAC7E,MAAM,MAAA,EAAE,YAAa,EAAA,GAAI,eAAgB,EAAA;AAIzC,MAAA,MAAM,cAAc,MAAMA,gCAAA;AAAA,QACxB,YAAA;AAAA,QACA,EAAE,MAAA,EAAQ,CAAC,UAAU,CAAE,EAAA;AAAA,QACvB;AAAA,OACF;AAEA,MAAA,GAAA,CAAI,OAAO,OAAQ,CAAA,GAAA,CAAI,eAAiB,EAAA,CAAA,OAAA,EAAU,WAAW,CAAE,CAAA,CAAA;AAC/D,MAAA,OAAO,GAAI,CAAA,MAAA;AAAA,KACb;AAEA,IAAA,OAAO,IAAIC,gBAAM,CAAA,MAAA;AAAA,MACf,IAAIC,gBAAK,MAAO,CAAA;AAAA,QACd,YAAc,EAAA,CAAC,EAAE,OAAA,EAAS,oCAAoC;AAAA,OAC/D;AAAA,KACH;AAAA;AAEJ","file":"graph-utils.js","sourcesContent":["import * as http from '@microsoft/teams.common/http';\nimport { ILogger } from '@microsoft/teams.common/logging';\nimport * as graph from '@microsoft/teams.graph';\n\nimport { acquireMsalAccessToken } from './msal-utils';\n\nexport function buildGraphClient(\n getMsalInstance: () => { msalInstance: Parameters<typeof acquireMsalAccessToken>[0] },\n logger: ILogger\n): graph.Client {\n {\n const graphRequestAccessTokenInterceptor = async (ctx: http.RequestContext) => {\n const { msalInstance } = getMsalInstance();\n\n // The developer should already have made sure that the user has consented to the scope\n // needed for the graph API they're calling, so requesting '.default' should be sufficient.\n const accessToken = await acquireMsalAccessToken(\n msalInstance,\n { scopes: ['.default'] },\n logger\n );\n\n ctx.config.headers.set('Authorization', `Bearer ${accessToken}`);\n return ctx.config;\n };\n\n return new graph.Client(\n new http.Client({\n interceptors: [{ request: graphRequestAccessTokenInterceptor }],\n })\n );\n }\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import * as http from '@microsoft/teams.common/http';
2
+ import * as graph from '@microsoft/teams.graph';
3
+ import { acquireMsalAccessToken } from './msal-utils';
4
+
5
+ function buildGraphClient(getMsalInstance, logger) {
6
+ {
7
+ const graphRequestAccessTokenInterceptor = async (ctx) => {
8
+ const { msalInstance } = getMsalInstance();
9
+ const accessToken = await acquireMsalAccessToken(
10
+ msalInstance,
11
+ { scopes: [".default"] },
12
+ logger
13
+ );
14
+ ctx.config.headers.set("Authorization", `Bearer ${accessToken}`);
15
+ return ctx.config;
16
+ };
17
+ return new graph.Client(
18
+ new http.Client({
19
+ interceptors: [{ request: graphRequestAccessTokenInterceptor }]
20
+ })
21
+ );
22
+ }
23
+ }
24
+
25
+ export { buildGraphClient };
26
+ //# sourceMappingURL=graph-utils.mjs.map
27
+ //# sourceMappingURL=graph-utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/graph-utils.ts"],"names":[],"mappings":";;;;AAMO,SAAS,gBAAA,CACd,iBACA,MACc,EAAA;AACd,EAAA;AACE,IAAM,MAAA,kCAAA,GAAqC,OAAO,GAA6B,KAAA;AAC7E,MAAM,MAAA,EAAE,YAAa,EAAA,GAAI,eAAgB,EAAA;AAIzC,MAAA,MAAM,cAAc,MAAM,sBAAA;AAAA,QACxB,YAAA;AAAA,QACA,EAAE,MAAA,EAAQ,CAAC,UAAU,CAAE,EAAA;AAAA,QACvB;AAAA,OACF;AAEA,MAAA,GAAA,CAAI,OAAO,OAAQ,CAAA,GAAA,CAAI,eAAiB,EAAA,CAAA,OAAA,EAAU,WAAW,CAAE,CAAA,CAAA;AAC/D,MAAA,OAAO,GAAI,CAAA,MAAA;AAAA,KACb;AAEA,IAAA,OAAO,IAAI,KAAM,CAAA,MAAA;AAAA,MACf,IAAI,KAAK,MAAO,CAAA;AAAA,QACd,YAAc,EAAA,CAAC,EAAE,OAAA,EAAS,oCAAoC;AAAA,OAC/D;AAAA,KACH;AAAA;AAEJ","file":"graph-utils.mjs","sourcesContent":["import * as http from '@microsoft/teams.common/http';\nimport { ILogger } from '@microsoft/teams.common/logging';\nimport * as graph from '@microsoft/teams.graph';\n\nimport { acquireMsalAccessToken } from './msal-utils';\n\nexport function buildGraphClient(\n getMsalInstance: () => { msalInstance: Parameters<typeof acquireMsalAccessToken>[0] },\n logger: ILogger\n): graph.Client {\n {\n const graphRequestAccessTokenInterceptor = async (ctx: http.RequestContext) => {\n const { msalInstance } = getMsalInstance();\n\n // The developer should already have made sure that the user has consented to the scope\n // needed for the graph API they're calling, so requesting '.default' should be sufficient.\n const accessToken = await acquireMsalAccessToken(\n msalInstance,\n { scopes: ['.default'] },\n logger\n );\n\n ctx.config.headers.set('Authorization', `Bearer ${accessToken}`);\n return ctx.config;\n };\n\n return new graph.Client(\n new http.Client({\n interceptors: [{ request: graphRequestAccessTokenInterceptor }],\n })\n );\n }\n}\n"]}
package/dist/index.d.mts CHANGED
@@ -1,56 +1,6 @@
1
- export { App, AppOptions, MsalOptions } from './app.mjs';
2
- export { Context, mapContext } from './context/index.mjs';
3
- export { i as types } from './index-DJal_Cxb.mjs';
1
+ export { App, AppOptions, ExecOptions, MsalOptions } from './app.mjs';
4
2
  import '@azure/msal-browser';
3
+ import '@microsoft/teams-js';
5
4
  import '@microsoft/teams.common/http';
6
5
  import '@microsoft/teams.common/logging';
7
- import '@microsoft/teams-js';
8
- import './window/types/context.mjs';
9
- import './window/types/channel-type.mjs';
10
- import './window/types/file-open-preference.mjs';
11
- import './window/types/frame-context.mjs';
12
- import './window/types/host.mjs';
13
- import './window/types/locale.mjs';
14
- import './window/types/team-type.mjs';
15
- import './window/types/theme.mjs';
16
- import './window/types/user-team-role.mjs';
17
- import './context/app.mjs';
18
- import './context/app-host.mjs';
19
- import './context/channel.mjs';
20
- import './context/chat.mjs';
21
- import './context/meeting.mjs';
22
- import './context/page.mjs';
23
- import './context/share-point-site.mjs';
24
- import './context/team.mjs';
25
- import './context/user.mjs';
26
- import './context/tenant.mjs';
27
- import './window/types/user-meeting-role.mjs';
28
- import './window/types/user-profile.mjs';
29
- import './window/types/data-residency.mjs';
30
- import './window/types/bar-code-config.mjs';
31
- import './window/types/permission.mjs';
32
- import './window/types/call-modality.mjs';
33
- import './window/types/file.mjs';
34
- import './window/types/thread-member.mjs';
35
- import './window/types/legal-age-group-classification.mjs';
36
- import './window/types/app-eligibility-info.mjs';
37
- import './window/types/action-open-url-type.mjs';
38
- import './window/types/location.mjs';
39
- import './window/types/notification-type.mjs';
40
- import './index-7hUkxLxx.mjs';
41
- import './window/types/liveshare/container-state.mjs';
42
- import './window/types/liveshare/fluid-container.mjs';
43
- import './window/types/liveshare/ntp-time.mjs';
44
- import './window/types/liveshare/fluid-tenant.mjs';
45
- import './window/types/liveshare/client.mjs';
46
- import './index-DrTQ_GLN.mjs';
47
- import './window/types/marketplace/cart.mjs';
48
- import './window/types/marketplace/cart-info.mjs';
49
- import './window/types/marketplace/cart-status.mjs';
50
- import './window/types/marketplace/intent.mjs';
51
- import './window/types/marketplace/cart-item.mjs';
52
- import './window/types/marketplace/cart-version.mjs';
53
- import './index-D6kqtGPa.mjs';
54
- import './window/types/dialog/dialog-dimension.mjs';
55
- import './window/types/dialog/dialog-info.mjs';
56
- import './window/types/dialog/dialog-size.mjs';
6
+ import '@microsoft/teams.graph';
package/dist/index.d.ts CHANGED
@@ -1,56 +1,6 @@
1
- export { App, AppOptions, MsalOptions } from './app.js';
2
- export { Context, mapContext } from './context/index.js';
3
- export { i as types } from './index-8IcDrPMv.js';
1
+ export { App, AppOptions, ExecOptions, MsalOptions } from './app.js';
4
2
  import '@azure/msal-browser';
3
+ import '@microsoft/teams-js';
5
4
  import '@microsoft/teams.common/http';
6
5
  import '@microsoft/teams.common/logging';
7
- import '@microsoft/teams-js';
8
- import './window/types/context.js';
9
- import './window/types/channel-type.js';
10
- import './window/types/file-open-preference.js';
11
- import './window/types/frame-context.js';
12
- import './window/types/host.js';
13
- import './window/types/locale.js';
14
- import './window/types/team-type.js';
15
- import './window/types/theme.js';
16
- import './window/types/user-team-role.js';
17
- import './context/app.js';
18
- import './context/app-host.js';
19
- import './context/channel.js';
20
- import './context/chat.js';
21
- import './context/meeting.js';
22
- import './context/page.js';
23
- import './context/share-point-site.js';
24
- import './context/team.js';
25
- import './context/user.js';
26
- import './context/tenant.js';
27
- import './window/types/user-meeting-role.js';
28
- import './window/types/user-profile.js';
29
- import './window/types/data-residency.js';
30
- import './window/types/bar-code-config.js';
31
- import './window/types/permission.js';
32
- import './window/types/call-modality.js';
33
- import './window/types/file.js';
34
- import './window/types/thread-member.js';
35
- import './window/types/legal-age-group-classification.js';
36
- import './window/types/app-eligibility-info.js';
37
- import './window/types/action-open-url-type.js';
38
- import './window/types/location.js';
39
- import './window/types/notification-type.js';
40
- import './index-DtE-Eb9L.js';
41
- import './window/types/liveshare/container-state.js';
42
- import './window/types/liveshare/fluid-container.js';
43
- import './window/types/liveshare/ntp-time.js';
44
- import './window/types/liveshare/fluid-tenant.js';
45
- import './window/types/liveshare/client.js';
46
- import './index-_Hc8oq9_.js';
47
- import './window/types/marketplace/cart.js';
48
- import './window/types/marketplace/cart-info.js';
49
- import './window/types/marketplace/cart-status.js';
50
- import './window/types/marketplace/intent.js';
51
- import './window/types/marketplace/cart-item.js';
52
- import './window/types/marketplace/cart-version.js';
53
- import './index-5Ok-M8A0.js';
54
- import './window/types/dialog/dialog-dimension.js';
55
- import './window/types/dialog/dialog-info.js';
56
- import './window/types/dialog/dialog-size.js';
6
+ import '@microsoft/teams.graph';