@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.
- package/README.md +1 -1
- package/dist/app.d.mts +25 -4
- package/dist/app.d.ts +25 -4
- package/dist/app.js +44 -7
- package/dist/app.js.map +1 -1
- package/dist/app.mjs +44 -7
- package/dist/app.mjs.map +1 -1
- package/dist/graph-utils.d.mts +10 -0
- package/dist/graph-utils.d.ts +10 -0
- package/dist/graph-utils.js +50 -0
- package/dist/graph-utils.js.map +1 -0
- package/dist/graph-utils.mjs +27 -0
- package/dist/graph-utils.mjs.map +1 -0
- package/dist/index.d.mts +3 -53
- package/dist/index.d.ts +3 -53
- package/dist/index.js +3 -34
- package/dist/index.mjs +1 -4
- package/dist/msal-utils.d.mts +11 -1
- package/dist/msal-utils.d.ts +11 -1
- package/dist/msal-utils.js +14 -0
- package/dist/msal-utils.js.map +1 -1
- package/dist/msal-utils.mjs +14 -1
- package/dist/msal-utils.mjs.map +1 -1
- package/package.json +2 -1
- package/dist/context/app-host.d.mts +0 -25
- package/dist/context/app-host.d.ts +0 -25
- package/dist/context/app-host.js +0 -4
- package/dist/context/app-host.js.map +0 -1
- package/dist/context/app-host.mjs +0 -3
- package/dist/context/app-host.mjs.map +0 -1
- package/dist/context/app.d.mts +0 -69
- package/dist/context/app.d.ts +0 -69
- package/dist/context/app.js +0 -4
- package/dist/context/app.js.map +0 -1
- package/dist/context/app.mjs +0 -3
- package/dist/context/app.mjs.map +0 -1
- package/dist/context/channel.d.mts +0 -37
- package/dist/context/channel.d.ts +0 -37
- package/dist/context/channel.js +0 -4
- package/dist/context/channel.js.map +0 -1
- package/dist/context/channel.mjs +0 -3
- package/dist/context/channel.mjs.map +0 -1
- package/dist/context/chat.d.mts +0 -11
- package/dist/context/chat.d.ts +0 -11
- package/dist/context/chat.js +0 -4
- package/dist/context/chat.js.map +0 -1
- package/dist/context/chat.mjs +0 -3
- package/dist/context/chat.mjs.map +0 -1
- package/dist/context/index.d.mts +0 -74
- package/dist/context/index.d.ts +0 -74
- package/dist/context/index.js +0 -108
- package/dist/context/index.js.map +0 -1
- package/dist/context/index.mjs +0 -86
- package/dist/context/index.mjs.map +0 -1
- package/dist/context/meeting.d.mts +0 -11
- package/dist/context/meeting.d.ts +0 -11
- package/dist/context/meeting.js +0 -4
- package/dist/context/meeting.js.map +0 -1
- package/dist/context/meeting.mjs +0 -3
- package/dist/context/meeting.mjs.map +0 -1
- package/dist/context/page.d.mts +0 -40
- package/dist/context/page.d.ts +0 -40
- package/dist/context/page.js +0 -4
- package/dist/context/page.js.map +0 -1
- package/dist/context/page.mjs +0 -3
- package/dist/context/page.mjs.map +0 -1
- package/dist/context/share-point-site.d.mts +0 -31
- package/dist/context/share-point-site.d.ts +0 -31
- package/dist/context/share-point-site.js +0 -4
- package/dist/context/share-point-site.js.map +0 -1
- package/dist/context/share-point-site.mjs +0 -3
- package/dist/context/share-point-site.mjs.map +0 -1
- package/dist/context/team.d.mts +0 -42
- package/dist/context/team.d.ts +0 -42
- package/dist/context/team.js +0 -4
- package/dist/context/team.js.map +0 -1
- package/dist/context/team.mjs +0 -3
- package/dist/context/team.mjs.map +0 -1
- package/dist/context/tenant.d.mts +0 -20
- package/dist/context/tenant.d.ts +0 -20
- package/dist/context/tenant.js +0 -4
- package/dist/context/tenant.js.map +0 -1
- package/dist/context/tenant.mjs +0 -3
- package/dist/context/tenant.mjs.map +0 -1
- package/dist/context/user.d.mts +0 -63
- package/dist/context/user.d.ts +0 -63
- package/dist/context/user.js +0 -4
- package/dist/context/user.js.map +0 -1
- package/dist/context/user.mjs +0 -3
- package/dist/context/user.mjs.map +0 -1
- package/dist/index-5Ok-M8A0.d.ts +0 -13
- package/dist/index-7hUkxLxx.d.mts +0 -17
- package/dist/index-8IcDrPMv.d.ts +0 -70
- package/dist/index-D6kqtGPa.d.mts +0 -13
- package/dist/index-DJal_Cxb.d.mts +0 -70
- package/dist/index-DrTQ_GLN.d.mts +0 -21
- package/dist/index-DtE-Eb9L.d.ts +0 -17
- package/dist/index-_Hc8oq9_.d.ts +0 -21
- package/dist/window/client-error.d.mts +0 -10
- package/dist/window/client-error.d.ts +0 -10
- package/dist/window/client-error.js +0 -4
- package/dist/window/client-error.js.map +0 -1
- package/dist/window/client-error.mjs +0 -3
- package/dist/window/client-error.mjs.map +0 -1
- package/dist/window/clients/app-entity.d.mts +0 -12
- package/dist/window/clients/app-entity.d.ts +0 -12
- package/dist/window/clients/app-entity.js +0 -15
- package/dist/window/clients/app-entity.js.map +0 -1
- package/dist/window/clients/app-entity.mjs +0 -13
- package/dist/window/clients/app-entity.mjs.map +0 -1
- package/dist/window/clients/app-initialization.d.mts +0 -50
- package/dist/window/clients/app-initialization.d.ts +0 -50
- package/dist/window/clients/app-initialization.js +0 -24
- package/dist/window/clients/app-initialization.js.map +0 -1
- package/dist/window/clients/app-initialization.mjs +0 -22
- package/dist/window/clients/app-initialization.mjs.map +0 -1
- package/dist/window/clients/app-install-dialog.d.mts +0 -21
- package/dist/window/clients/app-install-dialog.d.ts +0 -21
- package/dist/window/clients/app-install-dialog.js +0 -22
- package/dist/window/clients/app-install-dialog.js.map +0 -1
- package/dist/window/clients/app-install-dialog.mjs +0 -20
- package/dist/window/clients/app-install-dialog.mjs.map +0 -1
- package/dist/window/clients/authentication.d.mts +0 -66
- package/dist/window/clients/authentication.d.ts +0 -66
- package/dist/window/clients/authentication.js +0 -47
- package/dist/window/clients/authentication.js.map +0 -1
- package/dist/window/clients/authentication.mjs +0 -45
- package/dist/window/clients/authentication.mjs.map +0 -1
- package/dist/window/clients/bar-code.d.mts +0 -13
- package/dist/window/clients/bar-code.d.ts +0 -13
- package/dist/window/clients/bar-code.js +0 -20
- package/dist/window/clients/bar-code.js.map +0 -1
- package/dist/window/clients/bar-code.mjs +0 -18
- package/dist/window/clients/bar-code.mjs.map +0 -1
- package/dist/window/clients/calendar.d.mts +0 -47
- package/dist/window/clients/calendar.d.ts +0 -47
- package/dist/window/clients/calendar.js +0 -18
- package/dist/window/clients/calendar.js.map +0 -1
- package/dist/window/clients/calendar.mjs +0 -16
- package/dist/window/clients/calendar.mjs.map +0 -1
- package/dist/window/clients/call.d.mts +0 -32
- package/dist/window/clients/call.d.ts +0 -32
- package/dist/window/clients/call.js +0 -16
- package/dist/window/clients/call.js.map +0 -1
- package/dist/window/clients/call.mjs +0 -14
- package/dist/window/clients/call.mjs.map +0 -1
- package/dist/window/clients/clipboard.d.mts +0 -26
- package/dist/window/clients/clipboard.d.ts +0 -26
- package/dist/window/clients/clipboard.js +0 -19
- package/dist/window/clients/clipboard.js.map +0 -1
- package/dist/window/clients/clipboard.mjs +0 -17
- package/dist/window/clients/clipboard.mjs.map +0 -1
- package/dist/window/clients/conversation.d.mts +0 -53
- package/dist/window/clients/conversation.d.ts +0 -53
- package/dist/window/clients/conversation.js +0 -25
- package/dist/window/clients/conversation.js.map +0 -1
- package/dist/window/clients/conversation.mjs +0 -23
- package/dist/window/clients/conversation.mjs.map +0 -1
- package/dist/window/clients/dialog.d.mts +0 -81
- package/dist/window/clients/dialog.d.ts +0 -81
- package/dist/window/clients/dialog.js +0 -37
- package/dist/window/clients/dialog.js.map +0 -1
- package/dist/window/clients/dialog.mjs +0 -35
- package/dist/window/clients/dialog.mjs.map +0 -1
- package/dist/window/clients/index.d.mts +0 -84
- package/dist/window/clients/index.d.ts +0 -84
- package/dist/window/clients/index.js +0 -159
- package/dist/window/clients/index.js.map +0 -1
- package/dist/window/clients/index.mjs +0 -87
- package/dist/window/clients/index.mjs.map +0 -1
- package/dist/window/clients/location.d.mts +0 -14
- package/dist/window/clients/location.d.ts +0 -14
- package/dist/window/clients/location.js +0 -22
- package/dist/window/clients/location.js.map +0 -1
- package/dist/window/clients/location.mjs +0 -20
- package/dist/window/clients/location.mjs.map +0 -1
- package/dist/window/clients/media.d.mts +0 -190
- package/dist/window/clients/media.d.ts +0 -190
- package/dist/window/clients/media.js +0 -75
- package/dist/window/clients/media.js.map +0 -1
- package/dist/window/clients/media.mjs +0 -68
- package/dist/window/clients/media.mjs.map +0 -1
- package/dist/window/clients/notification.d.mts +0 -17
- package/dist/window/clients/notification.d.ts +0 -17
- package/dist/window/clients/notification.js +0 -15
- package/dist/window/clients/notification.js.map +0 -1
- package/dist/window/clients/notification.mjs +0 -13
- package/dist/window/clients/notification.mjs.map +0 -1
- package/dist/window/clients/permission.d.mts +0 -14
- package/dist/window/clients/permission.d.ts +0 -14
- package/dist/window/clients/permission.js +0 -20
- package/dist/window/clients/permission.js.map +0 -1
- package/dist/window/clients/permission.mjs +0 -18
- package/dist/window/clients/permission.mjs.map +0 -1
- package/dist/window/index.d.mts +0 -59
- package/dist/window/index.d.ts +0 -59
- package/dist/window/index.js +0 -35
- package/dist/window/index.js.map +0 -1
- package/dist/window/index.mjs +0 -6
- package/dist/window/index.mjs.map +0 -1
- package/dist/window/message.d.mts +0 -24
- package/dist/window/message.d.ts +0 -24
- package/dist/window/message.js +0 -4
- package/dist/window/message.js.map +0 -1
- package/dist/window/message.mjs +0 -3
- package/dist/window/message.mjs.map +0 -1
- package/dist/window/runtime.d.mts +0 -96
- package/dist/window/runtime.d.ts +0 -96
- package/dist/window/runtime.js +0 -4
- package/dist/window/runtime.js.map +0 -1
- package/dist/window/runtime.mjs +0 -3
- package/dist/window/runtime.mjs.map +0 -1
- package/dist/window/types/action-open-url-type.d.mts +0 -15
- package/dist/window/types/action-open-url-type.d.ts +0 -15
- package/dist/window/types/action-open-url-type.js +0 -13
- package/dist/window/types/action-open-url-type.js.map +0 -1
- package/dist/window/types/action-open-url-type.mjs +0 -11
- package/dist/window/types/action-open-url-type.mjs.map +0 -1
- package/dist/window/types/app-eligibility-info.d.mts +0 -48
- package/dist/window/types/app-eligibility-info.d.ts +0 -48
- package/dist/window/types/app-eligibility-info.js +0 -4
- package/dist/window/types/app-eligibility-info.js.map +0 -1
- package/dist/window/types/app-eligibility-info.mjs +0 -3
- package/dist/window/types/app-eligibility-info.mjs.map +0 -1
- package/dist/window/types/bar-code-config.d.mts +0 -13
- package/dist/window/types/bar-code-config.d.ts +0 -13
- package/dist/window/types/bar-code-config.js +0 -4
- package/dist/window/types/bar-code-config.js.map +0 -1
- package/dist/window/types/bar-code-config.mjs +0 -3
- package/dist/window/types/bar-code-config.mjs.map +0 -1
- package/dist/window/types/call-modality.d.mts +0 -21
- package/dist/window/types/call-modality.d.ts +0 -21
- package/dist/window/types/call-modality.js +0 -14
- package/dist/window/types/call-modality.js.map +0 -1
- package/dist/window/types/call-modality.mjs +0 -12
- package/dist/window/types/call-modality.mjs.map +0 -1
- package/dist/window/types/channel-type.d.mts +0 -17
- package/dist/window/types/channel-type.d.ts +0 -17
- package/dist/window/types/channel-type.js +0 -12
- package/dist/window/types/channel-type.js.map +0 -1
- package/dist/window/types/channel-type.mjs +0 -10
- package/dist/window/types/channel-type.mjs.map +0 -1
- package/dist/window/types/context.d.mts +0 -275
- package/dist/window/types/context.d.ts +0 -275
- package/dist/window/types/context.js +0 -4
- package/dist/window/types/context.js.map +0 -1
- package/dist/window/types/context.mjs +0 -3
- package/dist/window/types/context.mjs.map +0 -1
- package/dist/window/types/data-residency.d.mts +0 -6
- package/dist/window/types/data-residency.d.ts +0 -6
- package/dist/window/types/data-residency.js +0 -4
- package/dist/window/types/data-residency.js.map +0 -1
- package/dist/window/types/data-residency.mjs +0 -3
- package/dist/window/types/data-residency.mjs.map +0 -1
- package/dist/window/types/dialog/dialog-dimension.d.mts +0 -17
- package/dist/window/types/dialog/dialog-dimension.d.ts +0 -17
- package/dist/window/types/dialog/dialog-dimension.js +0 -12
- package/dist/window/types/dialog/dialog-dimension.js.map +0 -1
- package/dist/window/types/dialog/dialog-dimension.mjs +0 -10
- package/dist/window/types/dialog/dialog-dimension.mjs.map +0 -1
- package/dist/window/types/dialog/dialog-info.d.mts +0 -43
- package/dist/window/types/dialog/dialog-info.d.ts +0 -43
- package/dist/window/types/dialog/dialog-info.js +0 -4
- package/dist/window/types/dialog/dialog-info.js.map +0 -1
- package/dist/window/types/dialog/dialog-info.mjs +0 -3
- package/dist/window/types/dialog/dialog-info.mjs.map +0 -1
- package/dist/window/types/dialog/dialog-size.d.mts +0 -14
- package/dist/window/types/dialog/dialog-size.d.ts +0 -14
- package/dist/window/types/dialog/dialog-size.js +0 -4
- package/dist/window/types/dialog/dialog-size.js.map +0 -1
- package/dist/window/types/dialog/dialog-size.mjs +0 -3
- package/dist/window/types/dialog/dialog-size.mjs.map +0 -1
- package/dist/window/types/dialog/index.d.mts +0 -3
- package/dist/window/types/dialog/index.d.ts +0 -3
- package/dist/window/types/dialog/index.js +0 -28
- package/dist/window/types/dialog/index.js.map +0 -1
- package/dist/window/types/dialog/index.mjs +0 -5
- package/dist/window/types/dialog/index.mjs.map +0 -1
- package/dist/window/types/file-open-preference.d.mts +0 -17
- package/dist/window/types/file-open-preference.d.ts +0 -17
- package/dist/window/types/file-open-preference.js +0 -12
- package/dist/window/types/file-open-preference.js.map +0 -1
- package/dist/window/types/file-open-preference.mjs +0 -10
- package/dist/window/types/file-open-preference.mjs.map +0 -1
- package/dist/window/types/file.d.mts +0 -42
- package/dist/window/types/file.d.ts +0 -42
- package/dist/window/types/file.js +0 -11
- package/dist/window/types/file.js.map +0 -1
- package/dist/window/types/file.mjs +0 -9
- package/dist/window/types/file.mjs.map +0 -1
- package/dist/window/types/frame-context.d.mts +0 -44
- package/dist/window/types/frame-context.d.ts +0 -44
- package/dist/window/types/frame-context.js +0 -17
- package/dist/window/types/frame-context.js.map +0 -1
- package/dist/window/types/frame-context.mjs +0 -15
- package/dist/window/types/frame-context.mjs.map +0 -1
- package/dist/window/types/host.d.mts +0 -73
- package/dist/window/types/host.d.ts +0 -73
- package/dist/window/types/host.js +0 -32
- package/dist/window/types/host.js.map +0 -1
- package/dist/window/types/host.mjs +0 -29
- package/dist/window/types/host.mjs.map +0 -1
- package/dist/window/types/index.d.mts +0 -39
- package/dist/window/types/index.d.ts +0 -39
- package/dist/window/types/index.js +0 -189
- package/dist/window/types/index.js.map +0 -1
- package/dist/window/types/index.mjs +0 -30
- package/dist/window/types/index.mjs.map +0 -1
- package/dist/window/types/legal-age-group-classification.d.mts +0 -34
- package/dist/window/types/legal-age-group-classification.d.ts +0 -34
- package/dist/window/types/legal-age-group-classification.js +0 -14
- package/dist/window/types/legal-age-group-classification.js.map +0 -1
- package/dist/window/types/legal-age-group-classification.mjs +0 -12
- package/dist/window/types/legal-age-group-classification.mjs.map +0 -1
- package/dist/window/types/liveshare/client.d.mts +0 -23
- package/dist/window/types/liveshare/client.d.ts +0 -23
- package/dist/window/types/liveshare/client.js +0 -4
- package/dist/window/types/liveshare/client.js.map +0 -1
- package/dist/window/types/liveshare/client.mjs +0 -3
- package/dist/window/types/liveshare/client.mjs.map +0 -1
- package/dist/window/types/liveshare/container-state.d.mts +0 -33
- package/dist/window/types/liveshare/container-state.d.ts +0 -33
- package/dist/window/types/liveshare/container-state.js +0 -13
- package/dist/window/types/liveshare/container-state.js.map +0 -1
- package/dist/window/types/liveshare/container-state.mjs +0 -11
- package/dist/window/types/liveshare/container-state.mjs.map +0 -1
- package/dist/window/types/liveshare/fluid-container.d.mts +0 -28
- package/dist/window/types/liveshare/fluid-container.d.ts +0 -28
- package/dist/window/types/liveshare/fluid-container.js +0 -4
- package/dist/window/types/liveshare/fluid-container.js.map +0 -1
- package/dist/window/types/liveshare/fluid-container.mjs +0 -3
- package/dist/window/types/liveshare/fluid-container.mjs.map +0 -1
- package/dist/window/types/liveshare/fluid-tenant.d.mts +0 -16
- package/dist/window/types/liveshare/fluid-tenant.d.ts +0 -16
- package/dist/window/types/liveshare/fluid-tenant.js +0 -4
- package/dist/window/types/liveshare/fluid-tenant.js.map +0 -1
- package/dist/window/types/liveshare/fluid-tenant.mjs +0 -3
- package/dist/window/types/liveshare/fluid-tenant.mjs.map +0 -1
- package/dist/window/types/liveshare/index.d.mts +0 -6
- package/dist/window/types/liveshare/index.d.ts +0 -6
- package/dist/window/types/liveshare/index.js +0 -42
- package/dist/window/types/liveshare/index.js.map +0 -1
- package/dist/window/types/liveshare/index.mjs +0 -7
- package/dist/window/types/liveshare/index.mjs.map +0 -1
- package/dist/window/types/liveshare/ntp-time.d.mts +0 -16
- package/dist/window/types/liveshare/ntp-time.d.ts +0 -16
- package/dist/window/types/liveshare/ntp-time.js +0 -4
- package/dist/window/types/liveshare/ntp-time.js.map +0 -1
- package/dist/window/types/liveshare/ntp-time.mjs +0 -3
- package/dist/window/types/liveshare/ntp-time.mjs.map +0 -1
- package/dist/window/types/locale.d.mts +0 -38
- package/dist/window/types/locale.d.ts +0 -38
- package/dist/window/types/locale.js +0 -4
- package/dist/window/types/locale.js.map +0 -1
- package/dist/window/types/locale.mjs +0 -3
- package/dist/window/types/locale.mjs.map +0 -1
- package/dist/window/types/location.d.mts +0 -25
- package/dist/window/types/location.d.ts +0 -25
- package/dist/window/types/location.js +0 -4
- package/dist/window/types/location.js.map +0 -1
- package/dist/window/types/location.mjs +0 -3
- package/dist/window/types/location.mjs.map +0 -1
- package/dist/window/types/marketplace/cart-info.d.mts +0 -47
- package/dist/window/types/marketplace/cart-info.d.ts +0 -47
- package/dist/window/types/marketplace/cart-info.js +0 -4
- package/dist/window/types/marketplace/cart-info.js.map +0 -1
- package/dist/window/types/marketplace/cart-info.mjs +0 -3
- package/dist/window/types/marketplace/cart-info.mjs.map +0 -1
- package/dist/window/types/marketplace/cart-item.d.mts +0 -40
- package/dist/window/types/marketplace/cart-item.d.ts +0 -40
- package/dist/window/types/marketplace/cart-item.js +0 -4
- package/dist/window/types/marketplace/cart-item.js.map +0 -1
- package/dist/window/types/marketplace/cart-item.mjs +0 -3
- package/dist/window/types/marketplace/cart-item.mjs.map +0 -1
- package/dist/window/types/marketplace/cart-status.d.mts +0 -33
- package/dist/window/types/marketplace/cart-status.d.ts +0 -33
- package/dist/window/types/marketplace/cart-status.js +0 -14
- package/dist/window/types/marketplace/cart-status.js.map +0 -1
- package/dist/window/types/marketplace/cart-status.mjs +0 -12
- package/dist/window/types/marketplace/cart-status.mjs.map +0 -1
- package/dist/window/types/marketplace/cart-version.d.mts +0 -17
- package/dist/window/types/marketplace/cart-version.d.ts +0 -17
- package/dist/window/types/marketplace/cart-version.js +0 -4
- package/dist/window/types/marketplace/cart-version.js.map +0 -1
- package/dist/window/types/marketplace/cart-version.mjs +0 -3
- package/dist/window/types/marketplace/cart-version.mjs.map +0 -1
- package/dist/window/types/marketplace/cart.d.mts +0 -29
- package/dist/window/types/marketplace/cart.d.ts +0 -29
- package/dist/window/types/marketplace/cart.js +0 -4
- package/dist/window/types/marketplace/cart.js.map +0 -1
- package/dist/window/types/marketplace/cart.mjs +0 -3
- package/dist/window/types/marketplace/cart.mjs.map +0 -1
- package/dist/window/types/marketplace/index.d.mts +0 -6
- package/dist/window/types/marketplace/index.d.ts +0 -6
- package/dist/window/types/marketplace/index.js +0 -49
- package/dist/window/types/marketplace/index.js.map +0 -1
- package/dist/window/types/marketplace/index.mjs +0 -8
- package/dist/window/types/marketplace/index.mjs.map +0 -1
- package/dist/window/types/marketplace/intent.d.mts +0 -23
- package/dist/window/types/marketplace/intent.d.ts +0 -23
- package/dist/window/types/marketplace/intent.js +0 -12
- package/dist/window/types/marketplace/intent.js.map +0 -1
- package/dist/window/types/marketplace/intent.mjs +0 -10
- package/dist/window/types/marketplace/intent.mjs.map +0 -1
- package/dist/window/types/notification-type.d.mts +0 -3
- package/dist/window/types/notification-type.d.ts +0 -3
- package/dist/window/types/notification-type.js +0 -4
- package/dist/window/types/notification-type.js.map +0 -1
- package/dist/window/types/notification-type.mjs +0 -3
- package/dist/window/types/notification-type.mjs.map +0 -1
- package/dist/window/types/permission.d.mts +0 -3
- package/dist/window/types/permission.d.ts +0 -3
- package/dist/window/types/permission.js +0 -4
- package/dist/window/types/permission.js.map +0 -1
- package/dist/window/types/permission.mjs +0 -3
- package/dist/window/types/permission.mjs.map +0 -1
- package/dist/window/types/team-type.d.mts +0 -24
- package/dist/window/types/team-type.d.ts +0 -24
- package/dist/window/types/team-type.js +0 -18
- package/dist/window/types/team-type.js.map +0 -1
- package/dist/window/types/team-type.mjs +0 -15
- package/dist/window/types/team-type.mjs.map +0 -1
- package/dist/window/types/theme.d.mts +0 -6
- package/dist/window/types/theme.d.ts +0 -6
- package/dist/window/types/theme.js +0 -4
- package/dist/window/types/theme.js.map +0 -1
- package/dist/window/types/theme.mjs +0 -3
- package/dist/window/types/theme.mjs.map +0 -1
- package/dist/window/types/thread-member.d.mts +0 -11
- package/dist/window/types/thread-member.d.ts +0 -11
- package/dist/window/types/thread-member.js +0 -4
- package/dist/window/types/thread-member.js.map +0 -1
- package/dist/window/types/thread-member.mjs +0 -3
- package/dist/window/types/thread-member.mjs.map +0 -1
- package/dist/window/types/user-meeting-role.d.mts +0 -31
- package/dist/window/types/user-meeting-role.d.ts +0 -31
- package/dist/window/types/user-meeting-role.js +0 -13
- package/dist/window/types/user-meeting-role.js.map +0 -1
- package/dist/window/types/user-meeting-role.mjs +0 -11
- package/dist/window/types/user-meeting-role.mjs.map +0 -1
- package/dist/window/types/user-profile.d.mts +0 -82
- package/dist/window/types/user-profile.d.ts +0 -82
- package/dist/window/types/user-profile.js +0 -4
- package/dist/window/types/user-profile.js.map +0 -1
- package/dist/window/types/user-profile.mjs +0 -3
- package/dist/window/types/user-profile.mjs.map +0 -1
- package/dist/window/types/user-team-role.d.mts +0 -18
- package/dist/window/types/user-team-role.d.ts +0 -18
- package/dist/window/types/user-team-role.js +0 -16
- package/dist/window/types/user-team-role.js.map +0 -1
- package/dist/window/types/user-team-role.mjs +0 -13
- package/dist/window/types/user-team-role.mjs.map +0 -1
- package/dist/window/window-client.d.mts +0 -28
- package/dist/window/window-client.d.ts +0 -28
- package/dist/window/window-client.js +0 -92
- package/dist/window/window-client.js.map +0 -1
- package/dist/window/window-client.mjs +0 -70
- package/dist/window/window-client.mjs.map +0 -1
package/README.md
CHANGED
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
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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';
|