@microsoft/teams-js 2.34.0-beta.0 → 2.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +4 -4
  2. package/dist/esm/_virtual/_polyfill-node.buffer.js +1 -0
  3. package/dist/esm/_virtual/_polyfill-node.global.js +1 -0
  4. package/dist/esm/packages/teams-js/dts/internal/constants.d.ts +8 -0
  5. package/dist/esm/packages/teams-js/dts/internal/internalAPIs.d.ts +1 -1
  6. package/dist/esm/packages/teams-js/dts/internal/messageObjects.d.ts +1 -0
  7. package/dist/esm/packages/teams-js/dts/internal/telemetry.d.ts +1 -0
  8. package/dist/esm/packages/teams-js/dts/internal/validOrigins.d.ts +1 -1
  9. package/dist/esm/packages/teams-js/dts/private/copilot/customTelemetry.d.ts +10 -0
  10. package/dist/esm/packages/teams-js/dts/public/app/app.d.ts +9 -0
  11. package/dist/esm/packages/teams-js/dts/public/authentication.d.ts +12 -4
  12. package/dist/esm/packages/teams-js/dts/public/constants.d.ts +2 -0
  13. package/dist/esm/packages/teams-js/dts/public/index.d.ts +1 -1
  14. package/dist/esm/packages/teams-js/dts/public/interfaces.d.ts +14 -0
  15. package/dist/esm/packages/teams-js/dts/public/mail/handoff.d.ts +48 -0
  16. package/dist/esm/packages/teams-js/dts/public/{mail.d.ts → mail/mail.d.ts} +4 -1
  17. package/dist/esm/packages/teams-js/dts/public/runtime.d.ts +3 -1
  18. package/dist/esm/packages/teams-js/src/index.js +1 -1
  19. package/dist/esm/packages/teams-js/src/internal/communication.js +1 -1
  20. package/dist/esm/packages/teams-js/src/internal/constants.js +1 -1
  21. package/dist/esm/packages/teams-js/src/internal/internalAPIs.js +1 -1
  22. package/dist/esm/packages/teams-js/src/internal/utils.js +1 -1
  23. package/dist/esm/packages/teams-js/src/internal/validOrigins.js +1 -1
  24. package/dist/esm/packages/teams-js/src/private/copilot/customTelemetry.js +1 -1
  25. package/dist/esm/packages/teams-js/src/public/app/app.js +1 -1
  26. package/dist/esm/packages/teams-js/src/public/constants.js +1 -1
  27. package/dist/esm/packages/teams-js/src/public/mail/handoff.js +1 -0
  28. package/dist/esm/packages/teams-js/src/public/mail/mail.js +1 -0
  29. package/dist/esm/packages/teams-js/src/public/nestedAppAuth.js +1 -1
  30. package/dist/esm/packages/teams-js/src/public/runtime.js +1 -1
  31. package/dist/esm/packages/teams-js/src/public/version.js +1 -1
  32. package/dist/esm/packages/teams-js/src/public/webStorage.js +1 -1
  33. package/dist/umd/MicrosoftTeams.js +318 -159
  34. package/dist/umd/MicrosoftTeams.js.map +1 -1
  35. package/dist/umd/MicrosoftTeams.min.js +1 -1
  36. package/dist/umd/MicrosoftTeams.min.js.map +1 -1
  37. package/package.json +53 -1
  38. package/dist/esm/node_modules/.pnpm/rollup-plugin-node-polyfills@0.2.1/node_modules/rollup-plugin-node-polyfills/polyfills/buffer-es6.js +0 -1
  39. package/dist/esm/packages/teams-js/src/public/mail.js +0 -1
@@ -1353,6 +1353,7 @@ __webpack_require__.d(conversations_namespaceObject, {
1353
1353
  var customTelemetry_namespaceObject = {};
1354
1354
  __webpack_require__.r(customTelemetry_namespaceObject);
1355
1355
  __webpack_require__.d(customTelemetry_namespaceObject, {
1356
+ isSupported: () => (customTelemetry_isSupported),
1356
1357
  sendCustomTelemetryData: () => (sendCustomTelemetryData)
1357
1358
  });
1358
1359
 
@@ -1771,12 +1772,21 @@ __webpack_require__.d(calendar_namespaceObject, {
1771
1772
  openCalendarItem: () => (openCalendarItem)
1772
1773
  });
1773
1774
 
1774
- // NAMESPACE OBJECT: ./src/public/mail.ts
1775
+ // NAMESPACE OBJECT: ./src/public/mail/handoff.ts
1776
+ var handoff_namespaceObject = {};
1777
+ __webpack_require__.r(handoff_namespaceObject);
1778
+ __webpack_require__.d(handoff_namespaceObject, {
1779
+ composeMailWithHandoff: () => (composeMailWithHandoff),
1780
+ isSupported: () => (handoff_isSupported)
1781
+ });
1782
+
1783
+ // NAMESPACE OBJECT: ./src/public/mail/mail.ts
1775
1784
  var mail_namespaceObject = {};
1776
1785
  __webpack_require__.r(mail_namespaceObject);
1777
1786
  __webpack_require__.d(mail_namespaceObject, {
1778
1787
  ComposeMailType: () => (ComposeMailType),
1779
1788
  composeMail: () => (composeMail),
1789
+ handoff: () => (handoff_namespaceObject),
1780
1790
  isSupported: () => (mail_isSupported),
1781
1791
  openMailItem: () => (openMailItem)
1782
1792
  });
@@ -3146,6 +3156,8 @@ var HostClientType;
3146
3156
  HostClientType["ipados"] = "ipados";
3147
3157
  /** The host is running on a macOS client, which runs on devices such as MacBooks. */
3148
3158
  HostClientType["macos"] = "macos";
3159
+ /** The host is running on a visionOS client, which runs on devices such as Apple Vision. */
3160
+ HostClientType["visionOS"] = "visionOS";
3149
3161
  /**
3150
3162
  * @deprecated
3151
3163
  * As of TeamsJS v2.0.0, please use {@link teamsRoomsWindows} instead.
@@ -4003,6 +4015,14 @@ const validOriginsLocal = artifactsForCDN_validDomains_namespaceObject;
4003
4015
  * Limited to Microsoft-internal use
4004
4016
  */
4005
4017
  const validOriginsFallback = validOriginsLocal.validOrigins;
4018
+ /**
4019
+ * @hidden
4020
+ * Timeout length for Fetch Call for Valid Origins
4021
+ *
4022
+ * @internal
4023
+ * Limited to Microsoft-internal use
4024
+ */
4025
+ const ORIGIN_LIST_FETCH_TIMEOUT_IN_MS = 1500;
4006
4026
  /**
4007
4027
  * @hidden
4008
4028
  * CDN endpoint of the list of valid origins
@@ -4178,7 +4198,12 @@ const v1NonMobileHostClientTypes = [
4178
4198
  HostClientType.teamsPhones,
4179
4199
  HostClientType.teamsDisplays,
4180
4200
  ];
4181
- const v1MobileHostClientTypes = [HostClientType.android, HostClientType.ios, HostClientType.ipados];
4201
+ const v1MobileHostClientTypes = [
4202
+ HostClientType.android,
4203
+ HostClientType.ios,
4204
+ HostClientType.ipados,
4205
+ HostClientType.visionOS,
4206
+ ];
4182
4207
  const v1HostClientTypes = [...v1NonMobileHostClientTypes, ...v1MobileHostClientTypes];
4183
4208
  /**
4184
4209
  * @hidden
@@ -4328,7 +4353,7 @@ const mapTeamsVersionToSupportedCapabilities = {
4328
4353
  '2.1.1': [
4329
4354
  {
4330
4355
  capability: { nestedAppAuth: {} },
4331
- hostClientTypes: [HostClientType.android, HostClientType.ios, HostClientType.ipados],
4356
+ hostClientTypes: [HostClientType.android, HostClientType.ios, HostClientType.ipados, HostClientType.visionOS],
4332
4357
  },
4333
4358
  ],
4334
4359
  };
@@ -4460,7 +4485,7 @@ function isSerializable(arg) {
4460
4485
  * @hidden
4461
4486
  * Package version.
4462
4487
  */
4463
- const version = "2.34.0-beta.0";
4488
+ const version = "2.34.0";
4464
4489
 
4465
4490
  ;// ./src/internal/internalAPIs.ts
4466
4491
 
@@ -4539,7 +4564,7 @@ function isCurrentSDKVersionAtLeast(requiredVersion = defaultSDKVersionForCompat
4539
4564
  }
4540
4565
  /**
4541
4566
  * @hidden
4542
- * Helper function to identify if host client is either android, ios, or ipados
4567
+ * Helper function to identify if host client is either android, ios, ipados, or visionOS
4543
4568
  *
4544
4569
  * @internal
4545
4570
  * Limited to Microsoft-internal use
@@ -4547,7 +4572,8 @@ function isCurrentSDKVersionAtLeast(requiredVersion = defaultSDKVersionForCompat
4547
4572
  function isHostClientMobile() {
4548
4573
  return (GlobalVars.hostClientType == HostClientType.android ||
4549
4574
  GlobalVars.hostClientType == HostClientType.ios ||
4550
- GlobalVars.hostClientType == HostClientType.ipados);
4575
+ GlobalVars.hostClientType == HostClientType.ipados ||
4576
+ GlobalVars.hostClientType == HostClientType.visionOS);
4551
4577
  }
4552
4578
  /**
4553
4579
  * @hidden
@@ -4687,139 +4713,8 @@ function isNullOrUndefined(value) {
4687
4713
  return value === null || value === undefined;
4688
4714
  }
4689
4715
 
4690
- ;// ./src/internal/validOrigins.ts
4691
- var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
4692
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4693
- return new (P || (P = Promise))(function (resolve, reject) {
4694
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
4695
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
4696
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
4697
- step((generator = generator.apply(thisArg, _arguments || [])).next());
4698
- });
4699
- };
4700
-
4701
-
4702
-
4703
-
4704
- let validOriginsCache = [];
4705
- const validateOriginLogger = getLogger('validateOrigin');
4706
- function prefetchOriginsFromCDN() {
4707
- return __awaiter(this, void 0, void 0, function* () {
4708
- yield getValidOriginsListFromCDN();
4709
- });
4710
- }
4711
- function isValidOriginsCacheEmpty() {
4712
- return validOriginsCache.length === 0;
4713
- }
4714
- function getValidOriginsListFromCDN() {
4715
- return __awaiter(this, void 0, void 0, function* () {
4716
- if (!isValidOriginsCacheEmpty()) {
4717
- return validOriginsCache;
4718
- }
4719
- if (!inServerSideRenderingEnvironment()) {
4720
- return fetch(validOriginsCdnEndpoint)
4721
- .then((response) => {
4722
- if (!response.ok) {
4723
- throw new Error('Invalid Response from Fetch Call');
4724
- }
4725
- return response.json().then((validOriginsCDN) => {
4726
- if (isValidOriginsJSONValid(JSON.stringify(validOriginsCDN))) {
4727
- validOriginsCache = validOriginsCDN.validOrigins;
4728
- return validOriginsCache;
4729
- }
4730
- else {
4731
- throw new Error('Valid Origins List Is Invalid');
4732
- }
4733
- });
4734
- })
4735
- .catch((e) => {
4736
- validateOriginLogger('validOrigins fetch call to CDN failed with error: %s. Defaulting to fallback list', e);
4737
- validOriginsCache = validOriginsFallback;
4738
- return validOriginsCache;
4739
- });
4740
- }
4741
- else {
4742
- validOriginsCache = validOriginsFallback;
4743
- return validOriginsFallback;
4744
- }
4745
- });
4746
- }
4747
- function isValidOriginsJSONValid(validOriginsJSON) {
4748
- let validOriginsCDN = JSON.parse(validOriginsJSON);
4749
- try {
4750
- validOriginsCDN = JSON.parse(validOriginsJSON);
4751
- }
4752
- catch (_) {
4753
- return false;
4754
- }
4755
- if (!validOriginsCDN.validOrigins) {
4756
- return false;
4757
- }
4758
- for (const validOrigin of validOriginsCDN.validOrigins) {
4759
- try {
4760
- new URL('https://' + validOrigin);
4761
- }
4762
- catch (_) {
4763
- validateOriginLogger('isValidOriginsFromCDN call failed to validate origin: %s', validOrigin);
4764
- return false;
4765
- }
4766
- }
4767
- return true;
4768
- }
4769
- /**
4770
- * @param pattern - reference pattern
4771
- * @param host - candidate string
4772
- * @returns returns true if host matches pre-know valid pattern
4773
- *
4774
- * @example
4775
- * validateHostAgainstPattern('*.teams.microsoft.com', 'subdomain.teams.microsoft.com') returns true
4776
- * validateHostAgainstPattern('teams.microsoft.com', 'team.microsoft.com') returns false
4777
- *
4778
- * @internal
4779
- * Limited to Microsoft-internal use
4780
- */
4781
- function validateHostAgainstPattern(pattern, host) {
4782
- if (pattern.substring(0, 2) === '*.') {
4783
- const suffix = pattern.substring(1);
4784
- if (host.length > suffix.length &&
4785
- host.split('.').length === suffix.split('.').length &&
4786
- host.substring(host.length - suffix.length) === suffix) {
4787
- return true;
4788
- }
4789
- }
4790
- else if (pattern === host) {
4791
- return true;
4792
- }
4793
- return false;
4794
- }
4795
- /**
4796
- * @internal
4797
- * Limited to Microsoft-internal use
4798
- */
4799
- function validateOrigin(messageOrigin) {
4800
- return getValidOriginsListFromCDN().then((validOriginsList) => {
4801
- // Check whether the url is in the pre-known allowlist or supplied by user
4802
- if (!isValidHttpsURL(messageOrigin)) {
4803
- validateOriginLogger('Origin %s is invalid because it is not using https protocol. Protocol being used: %s', messageOrigin, messageOrigin.protocol);
4804
- return false;
4805
- }
4806
- const messageOriginHost = messageOrigin.host;
4807
- if (validOriginsList.some((pattern) => validateHostAgainstPattern(pattern, messageOriginHost))) {
4808
- return true;
4809
- }
4810
- for (const domainOrPattern of GlobalVars.additionalValidOrigins) {
4811
- const pattern = domainOrPattern.substring(0, 8) === 'https://' ? domainOrPattern.substring(8) : domainOrPattern;
4812
- if (validateHostAgainstPattern(pattern, messageOriginHost)) {
4813
- return true;
4814
- }
4815
- }
4816
- validateOriginLogger('Origin %s is invalid because it is not an origin approved by this library or included in the call to app.initialize.\nOrigins approved by this library: %o\nOrigins included in app.initialize: %o', messageOrigin, validOriginsList, GlobalVars.additionalValidOrigins);
4817
- return false;
4818
- });
4819
- }
4820
-
4821
4716
  ;// ./src/private/messageChannels/telemetry.ts
4822
- var telemetry_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
4717
+ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
4823
4718
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4824
4719
  return new (P || (P = Promise))(function (resolve, reject) {
4825
4720
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -4851,7 +4746,7 @@ const logger = getLogger('messageChannels.telemetry');
4851
4746
  * Limited to Microsoft-internal use
4852
4747
  */
4853
4748
  function getTelemetryPort() {
4854
- return telemetry_awaiter(this, void 0, void 0, function* () {
4749
+ return __awaiter(this, void 0, void 0, function* () {
4855
4750
  // If the port has already been initialized, return it.
4856
4751
  if (telemetryPort) {
4857
4752
  logger('Returning telemetry port from cache');
@@ -5145,7 +5040,6 @@ logWhereTeamsJsIsBeingUsed();
5145
5040
  * @returns Promise that will be fulfilled when initialization has completed, or rejected if the initialization fails or times out
5146
5041
  */
5147
5042
  function initialize(validMessageOrigins) {
5148
- prefetchOriginsFromCDN();
5149
5043
  return appInitializeHelper(getApiVersionTag(appTelemetryVersionNumber, "app.initialize" /* ApiName.App_Initialize */), validMessageOrigins);
5150
5044
  }
5151
5045
  /**
@@ -5309,6 +5203,8 @@ function transformLegacyContextToAppContext(legacyContext) {
5309
5203
  ringId: legacyContext.ringId,
5310
5204
  },
5311
5205
  appLaunchId: legacyContext.appLaunchId,
5206
+ appId: legacyContext.appId ? new AppId(legacyContext.appId) : undefined,
5207
+ manifestVersion: legacyContext.manifestVersion,
5312
5208
  },
5313
5209
  page: {
5314
5210
  id: legacyContext.entityId,
@@ -6808,6 +6704,148 @@ function openLinkHelper(apiVersionTag, deepLink) {
6808
6704
  });
6809
6705
  }
6810
6706
 
6707
+ ;// ./src/internal/validOrigins.ts
6708
+ var validOrigins_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
6709
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
6710
+ return new (P || (P = Promise))(function (resolve, reject) {
6711
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6712
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6713
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
6714
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
6715
+ });
6716
+ };
6717
+
6718
+
6719
+
6720
+
6721
+ let validOriginsCache = [];
6722
+ const validateOriginLogger = getLogger('validateOrigin');
6723
+ function prefetchOriginsFromCDN() {
6724
+ return validOrigins_awaiter(this, void 0, void 0, function* () {
6725
+ yield getValidOriginsListFromCDN();
6726
+ });
6727
+ }
6728
+ function isValidOriginsCacheEmpty() {
6729
+ return validOriginsCache.length === 0;
6730
+ }
6731
+ function getValidOriginsListFromCDN(shouldDisableCache = false) {
6732
+ return validOrigins_awaiter(this, void 0, void 0, function* () {
6733
+ if (!isValidOriginsCacheEmpty() && !shouldDisableCache) {
6734
+ return validOriginsCache;
6735
+ }
6736
+ if (!inServerSideRenderingEnvironment()) {
6737
+ validateOriginLogger('Initiating fetch call to acquire valid origins list from CDN');
6738
+ const controller = new AbortController();
6739
+ const timeoutId = setTimeout(() => controller.abort(), ORIGIN_LIST_FETCH_TIMEOUT_IN_MS);
6740
+ return fetch(validOriginsCdnEndpoint, { signal: controller.signal })
6741
+ .then((response) => {
6742
+ clearTimeout(timeoutId);
6743
+ if (!response.ok) {
6744
+ throw new Error('Invalid Response from Fetch Call');
6745
+ }
6746
+ validateOriginLogger('Fetch call completed and retrieved valid origins list from CDN');
6747
+ return response.json().then((validOriginsCDN) => {
6748
+ if (isValidOriginsJSONValid(JSON.stringify(validOriginsCDN))) {
6749
+ validOriginsCache = validOriginsCDN.validOrigins;
6750
+ return validOriginsCache;
6751
+ }
6752
+ else {
6753
+ throw new Error('Valid origins list retrieved from CDN is invalid');
6754
+ }
6755
+ });
6756
+ })
6757
+ .catch((e) => {
6758
+ if (e.name === 'AbortError') {
6759
+ validateOriginLogger(`validOrigins fetch call to CDN failed due to Timeout of ${ORIGIN_LIST_FETCH_TIMEOUT_IN_MS} ms. Defaulting to fallback list`);
6760
+ }
6761
+ else {
6762
+ validateOriginLogger('validOrigins fetch call to CDN failed with error: %s. Defaulting to fallback list', e);
6763
+ }
6764
+ validOriginsCache = validOriginsFallback;
6765
+ return validOriginsCache;
6766
+ });
6767
+ }
6768
+ else {
6769
+ validOriginsCache = validOriginsFallback;
6770
+ return validOriginsFallback;
6771
+ }
6772
+ });
6773
+ }
6774
+ function isValidOriginsJSONValid(validOriginsJSON) {
6775
+ let validOriginsCDN = JSON.parse(validOriginsJSON);
6776
+ try {
6777
+ validOriginsCDN = JSON.parse(validOriginsJSON);
6778
+ }
6779
+ catch (_) {
6780
+ return false;
6781
+ }
6782
+ if (!validOriginsCDN.validOrigins) {
6783
+ return false;
6784
+ }
6785
+ for (const validOrigin of validOriginsCDN.validOrigins) {
6786
+ try {
6787
+ new URL('https://' + validOrigin);
6788
+ }
6789
+ catch (_) {
6790
+ validateOriginLogger('isValidOriginsFromCDN call failed to validate origin: %s', validOrigin);
6791
+ return false;
6792
+ }
6793
+ }
6794
+ return true;
6795
+ }
6796
+ /**
6797
+ * @param pattern - reference pattern
6798
+ * @param host - candidate string
6799
+ * @returns returns true if host matches pre-know valid pattern
6800
+ *
6801
+ * @example
6802
+ * validateHostAgainstPattern('*.teams.microsoft.com', 'subdomain.teams.microsoft.com') returns true
6803
+ * validateHostAgainstPattern('teams.microsoft.com', 'team.microsoft.com') returns false
6804
+ *
6805
+ * @internal
6806
+ * Limited to Microsoft-internal use
6807
+ */
6808
+ function validateHostAgainstPattern(pattern, host) {
6809
+ if (pattern.substring(0, 2) === '*.') {
6810
+ const suffix = pattern.substring(1);
6811
+ if (host.length > suffix.length &&
6812
+ host.split('.').length === suffix.split('.').length &&
6813
+ host.substring(host.length - suffix.length) === suffix) {
6814
+ return true;
6815
+ }
6816
+ }
6817
+ else if (pattern === host) {
6818
+ return true;
6819
+ }
6820
+ return false;
6821
+ }
6822
+ /**
6823
+ * @internal
6824
+ * Limited to Microsoft-internal use
6825
+ */
6826
+ function validateOrigin(messageOrigin, disableCache) {
6827
+ return getValidOriginsListFromCDN(disableCache).then((validOriginsList) => {
6828
+ // Check whether the url is in the pre-known allowlist or supplied by user
6829
+ if (!isValidHttpsURL(messageOrigin)) {
6830
+ validateOriginLogger('Origin %s is invalid because it is not using https protocol. Protocol being used: %s', messageOrigin, messageOrigin.protocol);
6831
+ return false;
6832
+ }
6833
+ const messageOriginHost = messageOrigin.host;
6834
+ if (validOriginsList.some((pattern) => validateHostAgainstPattern(pattern, messageOriginHost))) {
6835
+ return true;
6836
+ }
6837
+ for (const domainOrPattern of GlobalVars.additionalValidOrigins) {
6838
+ const pattern = domainOrPattern.substring(0, 8) === 'https://' ? domainOrPattern.substring(8) : domainOrPattern;
6839
+ if (validateHostAgainstPattern(pattern, messageOriginHost)) {
6840
+ return true;
6841
+ }
6842
+ }
6843
+ validateOriginLogger('Origin %s is invalid because it is not an origin approved by this library or included in the call to app.initialize.\nOrigins approved by this library: %o\nOrigins included in app.initialize: %o', messageOrigin, validOriginsList, GlobalVars.additionalValidOrigins);
6844
+ return false;
6845
+ });
6846
+ }
6847
+ prefetchOriginsFromCDN();
6848
+
6811
6849
  ;// ./src/public/pages/appButton.ts
6812
6850
  /**
6813
6851
  * Provides APIs to interact with the app button part of the SDK.
@@ -8344,10 +8382,10 @@ const sendMessageToParentHelperLogger = communicationLogger.extend('sendMessageT
8344
8382
  * @internal
8345
8383
  * Limited to Microsoft-internal use
8346
8384
  */
8347
- function sendMessageToParentHelper(apiVersionTag, actionName, args) {
8385
+ function sendMessageToParentHelper(apiVersionTag, actionName, args, isProxiedFromChild) {
8348
8386
  const logger = sendMessageToParentHelperLogger;
8349
8387
  const targetWindow = Communication.parentWindow;
8350
- const request = createMessageRequest(apiVersionTag, actionName, args);
8388
+ const request = createMessageRequest(apiVersionTag, actionName, args, isProxiedFromChild);
8351
8389
  HostToAppMessageDelayTelemetry.storeCallbackInformation(request.uuid, {
8352
8390
  name: actionName,
8353
8391
  calledAt: request.timestamp,
@@ -8674,15 +8712,7 @@ function handleIncomingMessageFromChild(evt) {
8674
8712
  else {
8675
8713
  // No handler, proxy to parent
8676
8714
  handleIncomingMessageFromChildLogger('No handler for message %s from child found; relaying message on to parent, action: %s. Relayed message will have a new id.', getMessageIdsAsLogString(message), message.func);
8677
- sendMessageToParent(getApiVersionTag("v2" /* ApiVersionNumber.V_2 */, "tasks.startTask" /* ApiName.Tasks_StartTask */), message.func, message.args, (...args) => {
8678
- if (Communication.childWindow) {
8679
- const isPartialResponse = args.pop();
8680
- handleIncomingMessageFromChildLogger('Message from parent being relayed to child, id: %s', getMessageIdsAsLogString(message));
8681
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
8682
- // @ts-ignore
8683
- sendMessageResponseToChild(message.id, message.uuid, args, isPartialResponse);
8684
- }
8685
- });
8715
+ proxyChildMessageToParent(message);
8686
8716
  }
8687
8717
  }
8688
8718
  }
@@ -8829,7 +8859,7 @@ function sendMessageEventToChild(actionName, args) {
8829
8859
  * @internal
8830
8860
  * Limited to Microsoft-internal use
8831
8861
  */
8832
- function createMessageRequest(apiVersionTag, func, args) {
8862
+ function createMessageRequest(apiVersionTag, func, args, isProxiedFromChild) {
8833
8863
  const messageId = CommunicationPrivate.nextMessageId++;
8834
8864
  const messageUuid = new UUID();
8835
8865
  CommunicationPrivate.legacyMessageIdsToUuidMap[messageId] = messageUuid;
@@ -8841,6 +8871,7 @@ function createMessageRequest(apiVersionTag, func, args) {
8841
8871
  monotonicTimestamp: getCurrentTimestamp(),
8842
8872
  args: args || [],
8843
8873
  apiVersionTag: apiVersionTag,
8874
+ isProxiedFromChild: isProxiedFromChild !== null && isProxiedFromChild !== void 0 ? isProxiedFromChild : false,
8844
8875
  };
8845
8876
  }
8846
8877
  /**
@@ -8906,6 +8937,22 @@ function getMessageIdsAsLogString(message) {
8906
8937
  return `legacy id: ${message.id} (no uuid)`;
8907
8938
  }
8908
8939
  }
8940
+ /**
8941
+ * @internal
8942
+ * Limited to Microsoft-internal use
8943
+ */
8944
+ function proxyChildMessageToParent(message) {
8945
+ const request = sendMessageToParentHelper(getApiVersionTag("v2" /* ApiVersionNumber.V_2 */, "tasks.startTask" /* ApiName.Tasks_StartTask */), message.func, message.args, true);
8946
+ CommunicationPrivate.callbacks.set(request.uuid, (...args) => {
8947
+ if (Communication.childWindow) {
8948
+ const isPartialResponse = args.pop();
8949
+ handleIncomingMessageFromChildLogger('Message from parent being relayed to child, id: %s', getMessageIdsAsLogString(message));
8950
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
8951
+ // @ts-ignore
8952
+ sendMessageResponseToChild(message.id, message.uuid, args, isPartialResponse);
8953
+ }
8954
+ });
8955
+ }
8909
8956
 
8910
8957
  ;// ./src/private/logs.ts
8911
8958
  /**
@@ -9289,6 +9336,19 @@ var customTelemetry_awaiter = (undefined && undefined.__awaiter) || function (th
9289
9336
 
9290
9337
  const copilotTelemetryVersionNumber = "v2" /* ApiVersionNumber.V_2 */;
9291
9338
  const copilotLogger = getLogger('copilot');
9339
+ /**
9340
+ * @hidden
9341
+ * @internal
9342
+ * Limited to Microsoft-internal use
9343
+ * @beta
9344
+ * @returns boolean to represent whether copilot.customTelemetry capability is supported
9345
+ *
9346
+ * @throws Error if {@linkcode app.initialize} has not successfully completed
9347
+ */
9348
+ function customTelemetry_isSupported() {
9349
+ var _a;
9350
+ return ensureInitialized(runtime) && !!((_a = runtime.supports.copilot) === null || _a === void 0 ? void 0 : _a.customTelemetry);
9351
+ }
9292
9352
  /**
9293
9353
  * Sends custom telemetry data to the host.
9294
9354
  *
@@ -14318,16 +14378,17 @@ function isNAAChannelRecommended() {
14318
14378
  }
14319
14379
  function isNAAChannelRecommendedForLegacyTeamsMobile() {
14320
14380
  return ensureInitialized(runtime) &&
14321
- isHostAndroidOrIOSOrIPadOS() &&
14381
+ isHostAndroidOrIOSOrIPadOSOrVisionOS() &&
14322
14382
  runtime.isLegacyTeams &&
14323
14383
  runtime.supports.nestedAppAuth
14324
14384
  ? true
14325
14385
  : false;
14326
14386
  }
14327
- function isHostAndroidOrIOSOrIPadOS() {
14387
+ function isHostAndroidOrIOSOrIPadOSOrVisionOS() {
14328
14388
  return (GlobalVars.hostClientType === HostClientType.android ||
14329
14389
  GlobalVars.hostClientType === HostClientType.ios ||
14330
- GlobalVars.hostClientType === HostClientType.ipados);
14390
+ GlobalVars.hostClientType === HostClientType.ipados ||
14391
+ GlobalVars.hostClientType === HostClientType.visionOS);
14331
14392
  }
14332
14393
 
14333
14394
  ;// ./src/public/geoLocation/map.ts
@@ -15559,20 +15620,116 @@ function calendar_isSupported() {
15559
15620
  return ensureInitialized(runtime) && runtime.supports.calendar ? true : false;
15560
15621
  }
15561
15622
 
15562
- ;// ./src/public/mail.ts
15623
+ ;// ./src/public/mail/handoff.ts
15563
15624
  /**
15564
15625
  * Used to interact with mail capability, including opening and composing mail.
15565
15626
  * @module
15627
+ *
15628
+ * @beta
15566
15629
  */
15567
15630
 
15568
15631
 
15569
15632
 
15570
15633
 
15571
15634
 
15635
+
15636
+
15572
15637
  /**
15573
15638
  * v2 APIs telemetry file: All of APIs in this capability file should send out API version v2 ONLY
15574
15639
  */
15575
15640
  const mailTelemetryVersionNumber = "v2" /* ApiVersionNumber.V_2 */;
15641
+ /**
15642
+ * Validates an array of email addresses.
15643
+ * For ComposeMailType.New, it is valid to pass empty arrays for toRecipients, ccRecipients, and bccRecipients.
15644
+ * This will result in a new email with handed-off (pre-populated) body content but no pre-populated recipients.
15645
+ *
15646
+ * @param emails - An optional array of email addresses to validate.
15647
+ * @throws Error with a message describing if the email address is invalid.
15648
+ *
15649
+ * @beta
15650
+ */
15651
+ function validateEmails(emails) {
15652
+ if (!emails || emails.length === 0) {
15653
+ return; // If the array is undefined or empty, consider it valid
15654
+ }
15655
+ // Use validateEmailAddress for each email in the param
15656
+ emails.forEach((email) => {
15657
+ validateEmailAddress(email); // This will throw an error if the email is invalid
15658
+ });
15659
+ }
15660
+ /**
15661
+ * Validates email addresses in the given ComposeMailParams object.
15662
+ * Validates `toRecipients`, `ccRecipients`, and `bccRecipients` for `ComposeNewParams`.
15663
+ *
15664
+ * @param params - The incoming ComposeMailParams object.
15665
+ * @throws Error with a message describing if the email address is invalid.
15666
+ *
15667
+ * @beta
15668
+ */
15669
+ function validateHandoffComposeMailParams(param) {
15670
+ if (!param.handoffId || param.handoffId.trim().length == 0 || param.handoffId.trim() === '') {
15671
+ throw new Error('handoffId should not be null or empty string.');
15672
+ }
15673
+ const composeMailParams = param.composeMailParams;
15674
+ if (composeMailParams.type === ComposeMailType.New) {
15675
+ validateEmails(composeMailParams.toRecipients);
15676
+ validateEmails(composeMailParams.ccRecipients);
15677
+ validateEmails(composeMailParams.bccRecipients);
15678
+ }
15679
+ // For Reply, ReplyAll, and Forward types, no validation needed
15680
+ }
15681
+ /**
15682
+ * Compose a new email in the user's mailbox, opening it in the drafts UX instead of the standard email.
15683
+ *
15684
+ * @param composeMailParamsWithHandoff - Object that specifies the type of mail item to compose and the details of the mail item.
15685
+ * @returns { Promise<void> } - promise resolves after the compose window has opened successfully in host SDK.
15686
+ * @throws Error with a message describing whether the capability is not initialized or the input is invalid.
15687
+ *
15688
+ * @beta
15689
+ */
15690
+ function composeMailWithHandoff(composeMailParamsWithHandoff) {
15691
+ ensureInitialized(runtime, FrameContexts.content);
15692
+ if (!handoff_isSupported()) {
15693
+ throw new Error('Not supported');
15694
+ }
15695
+ validateHandoffComposeMailParams(composeMailParamsWithHandoff);
15696
+ return callFunctionInHost("mail.handoff.composeMail" /* ApiName.Mail_Handoff_ComposeMail */, [new SerializableComposeMailParamsWithHandoff(composeMailParamsWithHandoff)], getApiVersionTag(mailTelemetryVersionNumber, "mail.handoff.composeMail" /* ApiName.Mail_Handoff_ComposeMail */));
15697
+ }
15698
+ /**
15699
+ * Checks if the mail capability and handoff sub-capability is supported by the host
15700
+ * @returns boolean to represent whether the handoff sub-capability is supported
15701
+ *
15702
+ * @throws Error if {@linkcode app.initialize} has not successfully completed
15703
+ *
15704
+ * @beta
15705
+ */
15706
+ function handoff_isSupported() {
15707
+ return ensureInitialized(runtime) && runtime.supports.mail && runtime.supports.mail.handoff ? true : false;
15708
+ }
15709
+ class SerializableComposeMailParamsWithHandoff {
15710
+ constructor(composeMailParamsWithHandoff) {
15711
+ this.composeMailParamsWithHandoff = composeMailParamsWithHandoff;
15712
+ }
15713
+ serialize() {
15714
+ return this.composeMailParamsWithHandoff;
15715
+ }
15716
+ }
15717
+
15718
+ ;// ./src/public/mail/mail.ts
15719
+ /**
15720
+ * Used to interact with mail capability, including opening and composing mail.
15721
+ * @module
15722
+ */
15723
+
15724
+
15725
+
15726
+
15727
+
15728
+
15729
+ /**
15730
+ * v2 APIs telemetry file: All of APIs in this capability file should send out API version v2 ONLY
15731
+ */
15732
+ const mail_mailTelemetryVersionNumber = "v2" /* ApiVersionNumber.V_2 */;
15576
15733
  /**
15577
15734
  * Opens a mail message in the host.
15578
15735
  *
@@ -15587,7 +15744,7 @@ function openMailItem(openMailItemParams) {
15587
15744
  if (!openMailItemParams.itemId || !openMailItemParams.itemId.trim()) {
15588
15745
  throw new Error('Must supply an itemId to openMailItem');
15589
15746
  }
15590
- resolve(sendAndHandleStatusAndReason(getApiVersionTag(mailTelemetryVersionNumber, "mail.openMailItem" /* ApiName.Mail_OpenMailItem */), 'mail.openMailItem', openMailItemParams));
15747
+ resolve(sendAndHandleStatusAndReason(getApiVersionTag(mail_mailTelemetryVersionNumber, "mail.openMailItem" /* ApiName.Mail_OpenMailItem */), 'mail.openMailItem', openMailItemParams));
15591
15748
  });
15592
15749
  }
15593
15750
  /**
@@ -15602,7 +15759,7 @@ function composeMail(composeMailParams) {
15602
15759
  if (!mail_isSupported()) {
15603
15760
  throw new Error('Not supported');
15604
15761
  }
15605
- resolve(sendAndHandleStatusAndReason(getApiVersionTag(mailTelemetryVersionNumber, "mail.composeMail" /* ApiName.Mail_ComposeMail */), 'mail.composeMail', composeMailParams));
15762
+ resolve(sendAndHandleStatusAndReason(getApiVersionTag(mail_mailTelemetryVersionNumber, "mail.composeMail" /* ApiName.Mail_ComposeMail */), 'mail.composeMail', composeMailParams));
15606
15763
  });
15607
15764
  }
15608
15765
  /**
@@ -15626,6 +15783,7 @@ var ComposeMailType;
15626
15783
  /** Compose a new mail message with the content of an existing mail message forwarded to a new recipient. */
15627
15784
  ComposeMailType["Forward"] = "forward";
15628
15785
  })(ComposeMailType || (ComposeMailType = {}));
15786
+
15629
15787
 
15630
15788
  ;// ./src/public/teamsAPIs.ts
15631
15789
  /**
@@ -16619,7 +16777,8 @@ function isWebStorageClearedOnUserLogOut() {
16619
16777
  if (runtime.isLegacyTeams &&
16620
16778
  (GlobalVars.hostClientType === HostClientType.android ||
16621
16779
  GlobalVars.hostClientType === HostClientType.ios ||
16622
- GlobalVars.hostClientType === HostClientType.ipados) &&
16780
+ GlobalVars.hostClientType === HostClientType.ipados ||
16781
+ GlobalVars.hostClientType === HostClientType.visionOS) &&
16623
16782
  (yield getHostName()) === HostName.teams) {
16624
16783
  // On Teams Mobile, they haven't yet implemented this capability. However, for compatibility reasons, we need
16625
16784
  // to act as if they do. If they did implement it, they would return true, so that's what we do here.