botframework-webchat-core 4.13.0 → 4.15.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 (138) hide show
  1. package/.eslintrc.yml +4 -198
  2. package/.prettierrc.yml +1 -1
  3. package/lib/actions/setNotification.js +1 -1
  4. package/lib/createPromiseQueue.js +1 -1
  5. package/lib/createStore.d.ts +3 -2
  6. package/lib/createStore.d.ts.map +1 -0
  7. package/lib/createStore.js +5 -5
  8. package/lib/index.d.ts +50 -0
  9. package/lib/index.d.ts.map +1 -0
  10. package/lib/index.js +34 -6
  11. package/lib/reducer.d.ts +1 -0
  12. package/lib/reducer.d.ts.map +1 -0
  13. package/lib/reducers/activities.js +1 -1
  14. package/lib/reducers/clockSkewAdjustment.js +1 -1
  15. package/lib/reducers/lastTypingAt.js +1 -1
  16. package/lib/reducers/notifications.js +21 -14
  17. package/lib/reducers/typing.js +1 -1
  18. package/lib/sagas/connectSaga.js +14 -8
  19. package/lib/sagas/connectionStatusToNotificationSaga.js +1 -1
  20. package/lib/sagas/effects/forkPut.js +1 -1
  21. package/lib/sagas/markAllAsSpokenOnStopSpeakActivitySaga.js +1 -1
  22. package/lib/sagas/observeActivitySaga.js +1 -1
  23. package/lib/sagas/postActivitySaga.js +39 -32
  24. package/lib/sagas/queueIncomingActivitySaga.js +7 -3
  25. package/lib/sagas/sendMessageBackToPostActivitySaga.js +4 -4
  26. package/lib/sagas/sendPostBackToPostActivitySaga.js +4 -4
  27. package/lib/sagas/sendTypingIndicatorOnSetSendBoxSaga.js +1 -1
  28. package/lib/sagas/speakActivityAndStartDictateOnIncomingActivityFromOthersSaga.js +1 -1
  29. package/lib/sagas/startSpeakActivityOnPostActivitySaga.js +1 -1
  30. package/lib/sagas/stopSpeakingActivityOnInputSaga.js +1 -1
  31. package/lib/sagas/submitSendBoxSaga.js +1 -1
  32. package/lib/selectors/combineSelectors.js +8 -3
  33. package/lib/types/OneOrMany.d.ts +3 -0
  34. package/lib/types/OneOrMany.d.ts.map +1 -0
  35. package/lib/types/OneOrMany.js +2 -0
  36. package/lib/types/external/DirectLineActivity.d.ts +3 -0
  37. package/lib/types/external/DirectLineActivity.d.ts.map +1 -0
  38. package/lib/types/external/DirectLineActivity.js +2 -0
  39. package/lib/types/external/DirectLineAnimationCard.d.ts +3 -0
  40. package/lib/types/external/DirectLineAnimationCard.d.ts.map +1 -0
  41. package/lib/types/external/DirectLineAnimationCard.js +2 -0
  42. package/lib/types/external/DirectLineAttachment.d.ts +3 -0
  43. package/lib/types/external/DirectLineAttachment.d.ts.map +1 -0
  44. package/lib/types/external/DirectLineAttachment.js +2 -0
  45. package/lib/types/external/DirectLineAudioCard.d.ts +3 -0
  46. package/lib/types/external/DirectLineAudioCard.d.ts.map +1 -0
  47. package/lib/types/external/DirectLineAudioCard.js +2 -0
  48. package/lib/types/external/DirectLineCardAction.d.ts +110 -0
  49. package/lib/types/external/DirectLineCardAction.d.ts.map +1 -0
  50. package/lib/types/external/DirectLineCardAction.js +2 -0
  51. package/lib/types/external/DirectLineHeroCard.d.ts +3 -0
  52. package/lib/types/external/DirectLineHeroCard.d.ts.map +1 -0
  53. package/lib/types/external/DirectLineHeroCard.js +2 -0
  54. package/lib/types/external/DirectLineJSBotConnection.d.ts +3 -0
  55. package/lib/types/external/DirectLineJSBotConnection.d.ts.map +1 -0
  56. package/lib/types/external/DirectLineJSBotConnection.js +2 -0
  57. package/lib/types/external/DirectLineOAuthCard.d.ts +3 -0
  58. package/lib/types/external/DirectLineOAuthCard.d.ts.map +1 -0
  59. package/lib/types/external/DirectLineOAuthCard.js +2 -0
  60. package/lib/types/external/DirectLineReceiptCard.d.ts +3 -0
  61. package/lib/types/external/DirectLineReceiptCard.d.ts.map +1 -0
  62. package/lib/types/external/DirectLineReceiptCard.js +2 -0
  63. package/lib/types/external/DirectLineSignInCard.d.ts +3 -0
  64. package/lib/types/external/DirectLineSignInCard.d.ts.map +1 -0
  65. package/lib/types/external/DirectLineSignInCard.js +2 -0
  66. package/lib/types/external/DirectLineSuggestedAction.d.ts +3 -0
  67. package/lib/types/external/DirectLineSuggestedAction.d.ts.map +1 -0
  68. package/lib/types/external/DirectLineSuggestedAction.js +2 -0
  69. package/lib/types/external/DirectLineThumbnailCard.d.ts +3 -0
  70. package/lib/types/external/DirectLineThumbnailCard.d.ts.map +1 -0
  71. package/lib/types/external/DirectLineThumbnailCard.js +2 -0
  72. package/lib/types/external/DirectLineVideoCard.d.ts +3 -0
  73. package/lib/types/external/DirectLineVideoCard.d.ts.map +1 -0
  74. package/lib/types/external/DirectLineVideoCard.js +2 -0
  75. package/lib/utils/dateToLocaleISOString.js +37 -0
  76. package/lib/utils/deleteKey.js +2 -3
  77. package/lib/utils/isForbiddenPropertyName.d.ts +2 -0
  78. package/lib/utils/isForbiddenPropertyName.d.ts.map +1 -0
  79. package/lib/utils/isForbiddenPropertyName.js +21 -0
  80. package/lib/utils/mime-wrapper.js +2 -4
  81. package/lib/utils/once.d.ts +2 -0
  82. package/lib/utils/once.d.ts.map +1 -0
  83. package/lib/utils/once.js +17 -0
  84. package/lib/utils/singleToArray.d.ts +2 -0
  85. package/lib/utils/singleToArray.d.ts.map +1 -0
  86. package/lib/utils/singleToArray.js +11 -0
  87. package/lib/utils/uniqueID.js +1 -1
  88. package/lib/utils/warnOnce.d.ts +2 -0
  89. package/lib/utils/warnOnce.d.ts.map +1 -0
  90. package/lib/utils/warnOnce.js +17 -0
  91. package/package.json +19 -22
  92. package/src/__tests__/detectSlowConnectionSaga.spec.js +1 -1
  93. package/src/__tests__/observeOnce.spec.js +3 -3
  94. package/src/actions/setNotification.js +8 -2
  95. package/src/createStore.ts +6 -6
  96. package/src/{index.js → index.ts} +40 -4
  97. package/src/reducers/notifications.js +22 -16
  98. package/src/sagas/connectSaga.js +9 -2
  99. package/src/sagas/connectionStatusToNotificationSaga.js +1 -1
  100. package/src/sagas/postActivitySaga.js +11 -4
  101. package/src/sagas/queueIncomingActivitySaga.js +40 -39
  102. package/src/sagas/sendMessageBackToPostActivitySaga.js +2 -3
  103. package/src/sagas/sendPostBackToPostActivitySaga.js +2 -3
  104. package/src/sagas/sendTypingIndicatorOnSetSendBoxSaga.js +1 -1
  105. package/src/sagas/speakActivityAndStartDictateOnIncomingActivityFromOthersSaga.js +1 -1
  106. package/src/sagas/startSpeakActivityOnPostActivitySaga.js +1 -1
  107. package/src/sagas/stopSpeakingActivityOnInputSaga.js +1 -1
  108. package/src/sagas/submitSendBoxSaga.js +1 -1
  109. package/src/selectors/combineSelectors.js +9 -1
  110. package/src/tsconfig.json +7 -3
  111. package/src/types/OneOrMany.ts +3 -0
  112. package/src/types/external/DirectLineActivity.ts +7 -0
  113. package/src/types/external/DirectLineAnimationCard.ts +5 -0
  114. package/src/types/external/DirectLineAttachment.ts +5 -0
  115. package/src/types/external/DirectLineAudioCard.ts +5 -0
  116. package/src/types/external/DirectLineCardAction.ts +128 -0
  117. package/src/types/external/DirectLineHeroCard.ts +5 -0
  118. package/src/types/external/DirectLineJSBotConnection.ts +5 -0
  119. package/src/types/external/DirectLineOAuthCard.ts +5 -0
  120. package/src/types/external/DirectLineReceiptCard.ts +5 -0
  121. package/src/types/external/DirectLineSignInCard.ts +5 -0
  122. package/src/types/external/DirectLineSuggestedAction.ts +5 -0
  123. package/src/types/external/DirectLineThumbnailCard.ts +5 -0
  124. package/src/types/external/DirectLineVideoCard.ts +5 -0
  125. package/src/utils/dateToLocaleISOString.chatham.spec.js +14 -0
  126. package/src/utils/dateToLocaleISOString.japan.spec.js +14 -0
  127. package/src/utils/dateToLocaleISOString.js +34 -0
  128. package/src/utils/dateToLocaleISOString.pacific.spec.js +14 -0
  129. package/src/utils/dateToLocaleISOString.utc.spec.js +22 -0
  130. package/src/utils/deleteKey.js +1 -3
  131. package/src/utils/isForbiddenPropertyName.spec.js +6 -0
  132. package/src/utils/isForbiddenPropertyName.ts +33 -0
  133. package/src/utils/mime-wrapper.js +1 -2
  134. package/src/utils/once.ts +10 -0
  135. package/src/utils/singleToArray.ts +3 -0
  136. package/src/utils/uniqueID.js +1 -6
  137. package/src/utils/warnOnce.ts +5 -0
  138. package/.eslintignore +0 -9
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = dateToLocaleISOString;
7
+
8
+ /* eslint no-magic-numbers: ["off", { "ignore": [1, 2, 3, 60] }] */
9
+ function pad(value) {
10
+ var count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
11
+
12
+ if (typeof value !== 'number') {
13
+ throw new Error('First argument must be a number');
14
+ }
15
+
16
+ value += '';
17
+
18
+ while (value.length < count) {
19
+ value = '0' + value;
20
+ }
21
+
22
+ return value;
23
+ } // Adopted from https://stackoverflow.com/questions/17415579/how-to-iso-8601-format-a-date-with-timezone-offset-in-javascript.
24
+
25
+
26
+ function dateToLocaleISOString(date) {
27
+ if (!(date instanceof Date)) {
28
+ throw new Error('First argument must be a Date object');
29
+ }
30
+
31
+ var timezoneOffset = -date.getTimezoneOffset();
32
+ var timezoneSign = timezoneOffset < 0 ? '-' : '+'; // "yyyy-MM-DDTHH:mm:ss.fff+08:00" for GMT+08
33
+ // "yyyy-MM-DDTHH:mm:ss.fffZ" for UTC
34
+
35
+ return "".concat(date.getFullYear(), "-").concat(pad(date.getMonth() + 1), "-").concat(pad(date.getDate()), "T").concat(pad(date.getHours()), ":").concat(pad(date.getMinutes()), ":").concat(pad(date.getSeconds()), ".").concat(pad(date.getMilliseconds(), 3)).concat(timezoneOffset ? "".concat(timezoneSign).concat(pad(~~(Math.abs(timezoneOffset) / 60)), ":").concat(pad(timezoneOffset % 60)) : 'Z');
36
+ }
37
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kYXRlVG9Mb2NhbGVJU09TdHJpbmcuanMiXSwibmFtZXMiOlsicGFkIiwidmFsdWUiLCJjb3VudCIsIkVycm9yIiwibGVuZ3RoIiwiZGF0ZVRvTG9jYWxlSVNPU3RyaW5nIiwiZGF0ZSIsIkRhdGUiLCJ0aW1lem9uZU9mZnNldCIsImdldFRpbWV6b25lT2Zmc2V0IiwidGltZXpvbmVTaWduIiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZ2V0TWlsbGlzZWNvbmRzIiwiTWF0aCIsImFicyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBRUEsU0FBU0EsR0FBVCxDQUFhQyxLQUFiLEVBQStCO0FBQUEsTUFBWEMsS0FBVyx1RUFBSCxDQUFHOztBQUM3QixNQUFJLE9BQU9ELEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDN0IsVUFBTSxJQUFJRSxLQUFKLENBQVUsaUNBQVYsQ0FBTjtBQUNEOztBQUVERixFQUFBQSxLQUFLLElBQUksRUFBVDs7QUFFQSxTQUFPQSxLQUFLLENBQUNHLE1BQU4sR0FBZUYsS0FBdEIsRUFBNkI7QUFDM0JELElBQUFBLEtBQUssR0FBRyxNQUFNQSxLQUFkO0FBQ0Q7O0FBRUQsU0FBT0EsS0FBUDtBQUNELEMsQ0FFRDs7O0FBQ2UsU0FBU0kscUJBQVQsQ0FBK0JDLElBQS9CLEVBQXFDO0FBQ2xELE1BQUksRUFBRUEsSUFBSSxZQUFZQyxJQUFsQixDQUFKLEVBQTZCO0FBQzNCLFVBQU0sSUFBSUosS0FBSixDQUFVLHNDQUFWLENBQU47QUFDRDs7QUFFRCxNQUFNSyxjQUFjLEdBQUcsQ0FBQ0YsSUFBSSxDQUFDRyxpQkFBTCxFQUF4QjtBQUNBLE1BQU1DLFlBQVksR0FBR0YsY0FBYyxHQUFHLENBQWpCLEdBQXFCLEdBQXJCLEdBQTJCLEdBQWhELENBTmtELENBUWxEO0FBQ0E7O0FBRUEsbUJBQVVGLElBQUksQ0FBQ0ssV0FBTCxFQUFWLGNBQWdDWCxHQUFHLENBQUNNLElBQUksQ0FBQ00sUUFBTCxLQUFrQixDQUFuQixDQUFuQyxjQUE0RFosR0FBRyxDQUFDTSxJQUFJLENBQUNPLE9BQUwsRUFBRCxDQUEvRCxjQUFtRmIsR0FBRyxDQUFDTSxJQUFJLENBQUNRLFFBQUwsRUFBRCxDQUF0RixjQUEyR2QsR0FBRyxDQUM1R00sSUFBSSxDQUFDUyxVQUFMLEVBRDRHLENBQTlHLGNBRUtmLEdBQUcsQ0FBQ00sSUFBSSxDQUFDVSxVQUFMLEVBQUQsQ0FGUixjQUUrQmhCLEdBQUcsQ0FBQ00sSUFBSSxDQUFDVyxlQUFMLEVBQUQsRUFBeUIsQ0FBekIsQ0FGbEMsU0FHRVQsY0FBYyxhQUFNRSxZQUFOLFNBQXFCVixHQUFHLENBQUMsQ0FBQyxFQUFFa0IsSUFBSSxDQUFDQyxHQUFMLENBQVNYLGNBQVQsSUFBMkIsRUFBN0IsQ0FBRixDQUF4QixjQUErRFIsR0FBRyxDQUFDUSxjQUFjLEdBQUcsRUFBbEIsQ0FBbEUsSUFBNEYsR0FINUc7QUFLRCIsInNvdXJjZVJvb3QiOiJjb3JlOi8vLyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludCBuby1tYWdpYy1udW1iZXJzOiBbXCJvZmZcIiwgeyBcImlnbm9yZVwiOiBbMSwgMiwgMywgNjBdIH1dICovXG5cbmZ1bmN0aW9uIHBhZCh2YWx1ZSwgY291bnQgPSAyKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gIH1cblxuICB2YWx1ZSArPSAnJztcblxuICB3aGlsZSAodmFsdWUubGVuZ3RoIDwgY291bnQpIHtcbiAgICB2YWx1ZSA9ICcwJyArIHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyBBZG9wdGVkIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTc0MTU1NzkvaG93LXRvLWlzby04NjAxLWZvcm1hdC1hLWRhdGUtd2l0aC10aW1lem9uZS1vZmZzZXQtaW4tamF2YXNjcmlwdC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRhdGVUb0xvY2FsZUlTT1N0cmluZyhkYXRlKSB7XG4gIGlmICghKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIERhdGUgb2JqZWN0Jyk7XG4gIH1cblxuICBjb25zdCB0aW1lem9uZU9mZnNldCA9IC1kYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gIGNvbnN0IHRpbWV6b25lU2lnbiA9IHRpbWV6b25lT2Zmc2V0IDwgMCA/ICctJyA6ICcrJztcblxuICAvLyBcInl5eXktTU0tRERUSEg6bW06c3MuZmZmKzA4OjAwXCIgZm9yIEdNVCswOFxuICAvLyBcInl5eXktTU0tRERUSEg6bW06c3MuZmZmWlwiIGZvciBVVENcblxuICByZXR1cm4gYCR7ZGF0ZS5nZXRGdWxsWWVhcigpfS0ke3BhZChkYXRlLmdldE1vbnRoKCkgKyAxKX0tJHtwYWQoZGF0ZS5nZXREYXRlKCkpfVQke3BhZChkYXRlLmdldEhvdXJzKCkpfToke3BhZChcbiAgICBkYXRlLmdldE1pbnV0ZXMoKVxuICApfToke3BhZChkYXRlLmdldFNlY29uZHMoKSl9LiR7cGFkKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCksIDMpfSR7XG4gICAgdGltZXpvbmVPZmZzZXQgPyBgJHt0aW1lem9uZVNpZ259JHtwYWQofn4oTWF0aC5hYnModGltZXpvbmVPZmZzZXQpIC8gNjApKX06JHtwYWQodGltZXpvbmVPZmZzZXQgJSA2MCl9YCA6ICdaJ1xuICB9YDtcbn1cbiJdfQ==
@@ -17,14 +17,13 @@ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _ty
17
17
 
18
18
  function _toPrimitive(input, hint) { if ((0, _typeof2["default"])(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if ((0, _typeof2["default"])(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
19
19
 
20
- /* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^deleted$" }] */
21
20
  function deleteKey(map, key) {
22
21
  if (!map) {
23
22
  return map;
24
23
  }
25
24
 
26
- var deleted = map[key],
25
+ var _deleted = map[key],
27
26
  nextMap = (0, _objectWithoutProperties2["default"])(map, [key].map(_toPropertyKey));
28
27
  return nextMap;
29
28
  }
30
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kZWxldGVLZXkuanMiXSwibmFtZXMiOlsiZGVsZXRlS2V5IiwibWFwIiwia2V5IiwiZGVsZXRlZCIsIm5leHRNYXAiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUVlLFNBQVNBLFNBQVQsQ0FBbUJDLEdBQW5CLEVBQXdCQyxHQUF4QixFQUE2QjtBQUMxQyxNQUFJLENBQUNELEdBQUwsRUFBVTtBQUNSLFdBQU9BLEdBQVA7QUFDRDs7QUFIeUMsTUFLM0JFLE9BTDJCLEdBS0hGLEdBTEcsQ0FLakNDLEdBTGlDO0FBQUEsTUFLZkUsT0FMZSw2Q0FLSEgsR0FMRyxHQUtqQ0MsR0FMaUM7QUFPMUMsU0FBT0UsT0FBUDtBQUNEIiwic291cmNlUm9vdCI6ImNvcmU6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBbXCJlcnJvclwiLCB7IFwidmFyc0lnbm9yZVBhdHRlcm5cIjogXCJeZGVsZXRlZCRcIiB9XSAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWxldGVLZXkobWFwLCBrZXkpIHtcbiAgaWYgKCFtYXApIHtcbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgY29uc3QgeyBba2V5XTogZGVsZXRlZCwgLi4ubmV4dE1hcCB9ID0gbWFwO1xuXG4gIHJldHVybiBuZXh0TWFwO1xufVxuIl19
29
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kZWxldGVLZXkuanMiXSwibmFtZXMiOlsiZGVsZXRlS2V5IiwibWFwIiwia2V5IiwiX2RlbGV0ZWQiLCJuZXh0TWFwIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQWUsU0FBU0EsU0FBVCxDQUFtQkMsR0FBbkIsRUFBd0JDLEdBQXhCLEVBQTZCO0FBQzFDLE1BQUksQ0FBQ0QsR0FBTCxFQUFVO0FBQ1IsV0FBT0EsR0FBUDtBQUNEOztBQUVELE1BQWVFLFFBQWYsR0FBd0NGLEdBQXhDLENBQVNDLEdBQVQ7QUFBQSxNQUE0QkUsT0FBNUIsNkNBQXdDSCxHQUF4QyxHQUFTQyxHQUFUO0FBRUEsU0FBT0UsT0FBUDtBQUNEIiwic291cmNlUm9vdCI6ImNvcmU6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVsZXRlS2V5KG1hcCwga2V5KSB7XG4gIGlmICghbWFwKSB7XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIGNvbnN0IHsgW2tleV06IF9kZWxldGVkLCAuLi5uZXh0TWFwIH0gPSBtYXA7XG5cbiAgcmV0dXJuIG5leHRNYXA7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export default function isForbiddenPropertyName(propertyName: string): boolean;
2
+ //# sourceMappingURL=isForbiddenPropertyName.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isForbiddenPropertyName.d.ts","sourceRoot":"","sources":["../../src/utils/isForbiddenPropertyName.ts"],"names":[],"mappings":"AA8BA,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAE7E"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = isForbiddenPropertyName;
9
+
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
+
12
+ var FORBIDDEN_PROPERTY_NAMES;
13
+
14
+ function getForbiddenPropertyNames() {
15
+ return FORBIDDEN_PROPERTY_NAMES || (FORBIDDEN_PROPERTY_NAMES = Object.freeze(Array.from(new Set([].concat((0, _toConsumableArray2["default"])(Object.getOwnPropertyNames(Object.prototype)), ['prototype'])))));
16
+ }
17
+
18
+ function isForbiddenPropertyName(propertyName) {
19
+ return getForbiddenPropertyNames().includes(propertyName);
20
+ }
21
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9pc0ZvcmJpZGRlblByb3BlcnR5TmFtZS50cyJdLCJuYW1lcyI6WyJGT1JCSURERU5fUFJPUEVSVFlfTkFNRVMiLCJnZXRGb3JiaWRkZW5Qcm9wZXJ0eU5hbWVzIiwiT2JqZWN0IiwiZnJlZXplIiwiQXJyYXkiLCJmcm9tIiwiU2V0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3RvdHlwZSIsImlzRm9yYmlkZGVuUHJvcGVydHlOYW1lIiwicHJvcGVydHlOYW1lIiwiaW5jbHVkZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsd0JBQUo7O0FBRUEsU0FBU0MseUJBQVQsR0FBK0M7QUFDN0MsU0FDRUQsd0JBQXdCLEtBQ3ZCQSx3QkFBd0IsR0FBR0UsTUFBTSxDQUFDQyxNQUFQLENBQzFCQyxLQUFLLENBQUNDLElBQU4sQ0FDRSxJQUFJQyxHQUFKLCtDQWNLSixNQUFNLENBQUNLLG1CQUFQLENBQTJCTCxNQUFNLENBQUNNLFNBQWxDLENBZEwsSUFnQkUsV0FoQkYsR0FERixDQUQwQixDQURKLENBRDFCO0FBeUJEOztBQUVjLFNBQVNDLHVCQUFULENBQWlDQyxZQUFqQyxFQUFnRTtBQUM3RSxTQUFPVCx5QkFBeUIsR0FBR1UsUUFBNUIsQ0FBcUNELFlBQXJDLENBQVA7QUFDRCIsInNvdXJjZVJvb3QiOiJjb3JlOi8vLyIsInNvdXJjZXNDb250ZW50IjpbImxldCBGT1JCSURERU5fUFJPUEVSVFlfTkFNRVM7XG5cbmZ1bmN0aW9uIGdldEZvcmJpZGRlblByb3BlcnR5TmFtZXMoKTogc3RyaW5nW10ge1xuICByZXR1cm4gKFxuICAgIEZPUkJJRERFTl9QUk9QRVJUWV9OQU1FUyB8fFxuICAgIChGT1JCSURERU5fUFJPUEVSVFlfTkFNRVMgPSBPYmplY3QuZnJlZXplKFxuICAgICAgQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChbXG4gICAgICAgICAgLy8gQXMtb2Ygd3JpdGluZywgYE9iamVjdC5wcm90b3R5cGVgIGluY2x1ZGVzOlxuICAgICAgICAgIC8vICAgX19kZWZpbmVHZXR0ZXJfX1xuICAgICAgICAgIC8vICAgX19kZWZpbmVTZXR0ZXJfX1xuICAgICAgICAgIC8vICAgX19sb29rdXBHZXR0ZXJfX1xuICAgICAgICAgIC8vICAgX19sb29rdXBTZXR0ZXJcbiAgICAgICAgICAvLyAgIF9fcHJvdG9fX1xuICAgICAgICAgIC8vICAgY29uc3RydWN0b3JcbiAgICAgICAgICAvLyAgIGhhc093blByb3BlcnR5XG4gICAgICAgICAgLy8gICBpc1Byb3RvdHlwZU9mXG4gICAgICAgICAgLy8gICBwcm9wZXJ0eUlzRW51bWVyYWJsZVxuICAgICAgICAgIC8vICAgdG9Mb2NhbGVTdHJpbmdcbiAgICAgICAgICAvLyAgIHRvU3RyaW5nXG4gICAgICAgICAgLy8gICB2YWx1ZU9mXG4gICAgICAgICAgLi4uT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoT2JqZWN0LnByb3RvdHlwZSksXG5cbiAgICAgICAgICAncHJvdG90eXBlJ1xuICAgICAgICBdKVxuICAgICAgKVxuICAgICkpXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzRm9yYmlkZGVuUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRGb3JiaWRkZW5Qcm9wZXJ0eU5hbWVzKCkuaW5jbHVkZXMocHJvcGVydHlOYW1lKTtcbn1cbiJdfQ==
@@ -9,9 +9,7 @@ exports["default"] = void 0;
9
9
 
10
10
  var _Mime = _interopRequireDefault(require("mime/Mime"));
11
11
 
12
- /* eslint no-undef: "off"*/
13
-
14
- /* eslint node/global-require: "off"*/
12
+ /* eslint no-undef: "off" */
15
13
  // We adopted the work from mime-wrapper, at https://github.com/marlon360/mime-wrapper.
16
14
  // This file wraps the mime library constructor to include '.json' types. This is needed
17
15
  // to support Angular CLI web projects, in which the webpack.config files are hidden away
@@ -46,4 +44,4 @@ var _Mime = _interopRequireDefault(require("mime/Mime"));
46
44
  var _default = new _Mime["default"](require('mime/types/standard'), require('mime/types/other'));
47
45
 
48
46
  exports["default"] = _default;
49
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9taW1lLXdyYXBwZXIuanMiXSwibmFtZXMiOlsiTWltZSIsInJlcXVpcmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQXFDQTs7QUFyQ0E7O0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtlQUllLElBQUlBLGdCQUFKLENBQVNDLE9BQU8sQ0FBQyxxQkFBRCxDQUFoQixFQUF5Q0EsT0FBTyxDQUFDLGtCQUFELENBQWhELEMiLCJzb3VyY2VSb290IjoiY29yZTovLy8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tdW5kZWY6IFwib2ZmXCIqL1xuLyogZXNsaW50IG5vZGUvZ2xvYmFsLXJlcXVpcmU6IFwib2ZmXCIqL1xuXG4vLyBXZSBhZG9wdGVkIHRoZSB3b3JrIGZyb20gbWltZS13cmFwcGVyLCBhdCBodHRwczovL2dpdGh1Yi5jb20vbWFybG9uMzYwL21pbWUtd3JhcHBlci5cblxuLy8gVGhpcyBmaWxlIHdyYXBzIHRoZSBtaW1lIGxpYnJhcnkgY29uc3RydWN0b3IgdG8gaW5jbHVkZSAnLmpzb24nIHR5cGVzLiBUaGlzIGlzIG5lZWRlZFxuLy8gdG8gc3VwcG9ydCBBbmd1bGFyIENMSSB3ZWIgcHJvamVjdHMsIGluIHdoaWNoIHRoZSB3ZWJwYWNrLmNvbmZpZyBmaWxlcyBhcmUgaGlkZGVuIGF3YXlcbi8vIGZyb20gdGhlIHVzZXIsIGFuZCBkbyBub3Qgc3VwcG9ydCAuanNvbiBmaWxlIGV4dGVuc2lvbiBtb2R1bGUgcmVzb2x1dGlvbnMuXG4vL1xuLy8gUmVmZXIgdG8gaXNzdWUgaHR0cHM6Ly9naXRodWIuY29tL2pzaHR0cC9taW1lLXR5cGVzL2lzc3Vlcy81MCNpc3N1ZWNvbW1lbnQtMzkwOTMyNjc4XG4vLyBhbmQgaXNzdWUgaHR0cHM6Ly9naXRodWIuY29tL2Jyb29mYS9ub2RlLW1pbWUvaXNzdWVzLzIwOC5cbi8vXG4vLyBUaGlzIGZpbGUgbWF5IG5lZWQgdG8gY2hhbmdlIGlmIHRoZSBtaW1lIGxpYnJhcnkgaXMgYnVtcGVkIGEgbWFqb3IgdGhhdCBtYXkgY2F1c2UgYVxuLy8gYnJlYWtpbmcgY2hhbmdlLCBhcyBpdCByZWxpZXMgb24gdGhlIGludGVybmFsIGxpYnJhcnkgZmlsZSBwbGFjZW1lbnQuXG5cbi8vIE1JVCBMaWNlbnNlXG4vL1xuLy8gQ29weXJpZ2h0IChjKSAyMDE4IE1hcmxvbiBMw7xja2VydFxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbi8vIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuLy8gU09GVFdBUkUuXG5cbmltcG9ydCBNaW1lIGZyb20gJ21pbWUvTWltZSc7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBNaW1lKHJlcXVpcmUoJ21pbWUvdHlwZXMvc3RhbmRhcmQnKSwgcmVxdWlyZSgnbWltZS90eXBlcy9vdGhlcicpKTtcbiJdfQ==
47
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9taW1lLXdyYXBwZXIuanMiXSwibmFtZXMiOlsiTWltZSIsInJlcXVpcmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQW9DQTs7QUFwQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtlQUllLElBQUlBLGdCQUFKLENBQVNDLE9BQU8sQ0FBQyxxQkFBRCxDQUFoQixFQUF5Q0EsT0FBTyxDQUFDLGtCQUFELENBQWhELEMiLCJzb3VyY2VSb290IjoiY29yZTovLy8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tdW5kZWY6IFwib2ZmXCIgKi9cblxuLy8gV2UgYWRvcHRlZCB0aGUgd29yayBmcm9tIG1pbWUtd3JhcHBlciwgYXQgaHR0cHM6Ly9naXRodWIuY29tL21hcmxvbjM2MC9taW1lLXdyYXBwZXIuXG5cbi8vIFRoaXMgZmlsZSB3cmFwcyB0aGUgbWltZSBsaWJyYXJ5IGNvbnN0cnVjdG9yIHRvIGluY2x1ZGUgJy5qc29uJyB0eXBlcy4gVGhpcyBpcyBuZWVkZWRcbi8vIHRvIHN1cHBvcnQgQW5ndWxhciBDTEkgd2ViIHByb2plY3RzLCBpbiB3aGljaCB0aGUgd2VicGFjay5jb25maWcgZmlsZXMgYXJlIGhpZGRlbiBhd2F5XG4vLyBmcm9tIHRoZSB1c2VyLCBhbmQgZG8gbm90IHN1cHBvcnQgLmpzb24gZmlsZSBleHRlbnNpb24gbW9kdWxlIHJlc29sdXRpb25zLlxuLy9cbi8vIFJlZmVyIHRvIGlzc3VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qc2h0dHAvbWltZS10eXBlcy9pc3N1ZXMvNTAjaXNzdWVjb21tZW50LTM5MDkzMjY3OFxuLy8gYW5kIGlzc3VlIGh0dHBzOi8vZ2l0aHViLmNvbS9icm9vZmEvbm9kZS1taW1lL2lzc3Vlcy8yMDguXG4vL1xuLy8gVGhpcyBmaWxlIG1heSBuZWVkIHRvIGNoYW5nZSBpZiB0aGUgbWltZSBsaWJyYXJ5IGlzIGJ1bXBlZCBhIG1ham9yIHRoYXQgbWF5IGNhdXNlIGFcbi8vIGJyZWFraW5nIGNoYW5nZSwgYXMgaXQgcmVsaWVzIG9uIHRoZSBpbnRlcm5hbCBsaWJyYXJ5IGZpbGUgcGxhY2VtZW50LlxuXG4vLyBNSVQgTGljZW5zZVxuLy9cbi8vIENvcHlyaWdodCAoYykgMjAxOCBNYXJsb24gTMO8Y2tlcnRcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbi8vIFNPRlRXQVJFLlxuXG5pbXBvcnQgTWltZSBmcm9tICdtaW1lL01pbWUnO1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgTWltZShyZXF1aXJlKCdtaW1lL3R5cGVzL3N0YW5kYXJkJyksIHJlcXVpcmUoJ21pbWUvdHlwZXMvb3RoZXInKSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export default function once(fn: () => void): () => void;
2
+ //# sourceMappingURL=once.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"once.d.ts","sourceRoot":"","sources":["../../src/utils/once.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CASvD"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = once;
7
+
8
+ function once(fn) {
9
+ var done;
10
+ return function () {
11
+ if (!done) {
12
+ fn();
13
+ done = 1;
14
+ }
15
+ };
16
+ }
17
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9vbmNlLnRzIl0sIm5hbWVzIjpbIm9uY2UiLCJmbiIsImRvbmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBZSxTQUFTQSxJQUFULENBQWNDLEVBQWQsRUFBMEM7QUFDdkQsTUFBSUMsSUFBSjtBQUVBLFNBQU8sWUFBTTtBQUNYLFFBQUksQ0FBQ0EsSUFBTCxFQUFXO0FBQ1RELE1BQUFBLEVBQUU7QUFDRkMsTUFBQUEsSUFBSSxHQUFHLENBQVA7QUFDRDtBQUNGLEdBTEQ7QUFNRCIsInNvdXJjZVJvb3QiOiJjb3JlOi8vLyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9uY2UoZm46ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgbGV0IGRvbmU7XG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoIWRvbmUpIHtcbiAgICAgIGZuKCk7XG4gICAgICBkb25lID0gMTtcbiAgICB9XG4gIH07XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export default function singleToArray<T>(singleOrArray: T | T[]): T[];
2
+ //# sourceMappingURL=singleToArray.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"singleToArray.d.ts","sourceRoot":"","sources":["../../src/utils/singleToArray.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAEpE"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = singleToArray;
7
+
8
+ function singleToArray(singleOrArray) {
9
+ return singleOrArray ? Array.isArray(singleOrArray) ? singleOrArray : [singleOrArray] : [];
10
+ }
11
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zaW5nbGVUb0FycmF5LnRzIl0sIm5hbWVzIjpbInNpbmdsZVRvQXJyYXkiLCJzaW5nbGVPckFycmF5IiwiQXJyYXkiLCJpc0FycmF5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQWUsU0FBU0EsYUFBVCxDQUEwQkMsYUFBMUIsRUFBdUQ7QUFDcEUsU0FBT0EsYUFBYSxHQUFJQyxLQUFLLENBQUNDLE9BQU4sQ0FBY0YsYUFBZCxJQUErQkEsYUFBL0IsR0FBK0MsQ0FBQ0EsYUFBRCxDQUFuRCxHQUFzRSxFQUExRjtBQUNEIiwic291cmNlUm9vdCI6ImNvcmU6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2luZ2xlVG9BcnJheTxUPihzaW5nbGVPckFycmF5OiBUIHwgVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNpbmdsZU9yQXJyYXkgPyAoQXJyYXkuaXNBcnJheShzaW5nbGVPckFycmF5KSA/IHNpbmdsZU9yQXJyYXkgOiBbc2luZ2xlT3JBcnJheV0pIDogW107XG59XG4iXX0=
@@ -13,4 +13,4 @@ var _mathRandom = _interopRequireDefault(require("math-random"));
13
13
  function uniqueID() {
14
14
  return Date.now() + (0, _mathRandom["default"])().toString(36).substr(2);
15
15
  }
16
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91bmlxdWVJRC5qcyJdLCJuYW1lcyI6WyJ1bmlxdWVJRCIsIkRhdGUiLCJub3ciLCJ0b1N0cmluZyIsInN1YnN0ciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBRUE7O0FBRkE7QUFJZSxTQUFTQSxRQUFULEdBQW9CO0FBQ2pDLFNBQ0VDLElBQUksQ0FBQ0MsR0FBTCxLQUNBLDhCQUNHQyxRQURILENBQ1ksRUFEWixFQUVHQyxNQUZILENBRVUsQ0FGVixDQUZGO0FBTUQiLCJzb3VyY2VSb290IjoiY29yZTovLy8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tbWFnaWMtbnVtYmVyczogW1wiZXJyb3JcIiwgeyBcImlnbm9yZVwiOiBbMiwgMzZdIH1dICovXG5cbmltcG9ydCByYW5kb20gZnJvbSAnbWF0aC1yYW5kb20nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1bmlxdWVJRCgpIHtcbiAgcmV0dXJuIChcbiAgICBEYXRlLm5vdygpICtcbiAgICByYW5kb20oKVxuICAgICAgLnRvU3RyaW5nKDM2KVxuICAgICAgLnN1YnN0cigyKVxuICApO1xufVxuIl19
16
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91bmlxdWVJRC5qcyJdLCJuYW1lcyI6WyJ1bmlxdWVJRCIsIkRhdGUiLCJub3ciLCJ0b1N0cmluZyIsInN1YnN0ciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBRUE7O0FBRkE7QUFJZSxTQUFTQSxRQUFULEdBQW9CO0FBQ2pDLFNBQU9DLElBQUksQ0FBQ0MsR0FBTCxLQUFhLDhCQUFTQyxRQUFULENBQWtCLEVBQWxCLEVBQXNCQyxNQUF0QixDQUE2QixDQUE3QixDQUFwQjtBQUNEIiwic291cmNlUm9vdCI6ImNvcmU6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5vLW1hZ2ljLW51bWJlcnM6IFtcImVycm9yXCIsIHsgXCJpZ25vcmVcIjogWzIsIDM2XSB9XSAqL1xuXG5pbXBvcnQgcmFuZG9tIGZyb20gJ21hdGgtcmFuZG9tJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdW5pcXVlSUQoKSB7XG4gIHJldHVybiBEYXRlLm5vdygpICsgcmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyKTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export default function warnOnce(message: string): () => void;
2
+ //# sourceMappingURL=warnOnce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warnOnce.d.ts","sourceRoot":"","sources":["../../src/utils/warnOnce.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,IAAI,CAE5D"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = warnOnce;
9
+
10
+ var _once = _interopRequireDefault(require("./once"));
11
+
12
+ function warnOnce(message) {
13
+ return (0, _once["default"])(function () {
14
+ return console.warn("botframework-webchat: ".concat(message, "."));
15
+ });
16
+ }
17
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy93YXJuT25jZS50cyJdLCJuYW1lcyI6WyJ3YXJuT25jZSIsIm1lc3NhZ2UiLCJjb25zb2xlIiwid2FybiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBRWUsU0FBU0EsUUFBVCxDQUFrQkMsT0FBbEIsRUFBK0M7QUFDNUQsU0FBTyxzQkFBSztBQUFBLFdBQU1DLE9BQU8sQ0FBQ0MsSUFBUixpQ0FBc0NGLE9BQXRDLE9BQU47QUFBQSxHQUFMLENBQVA7QUFDRCIsInNvdXJjZVJvb3QiOiJjb3JlOi8vLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBvbmNlIGZyb20gJy4vb25jZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdhcm5PbmNlKG1lc3NhZ2U6IHN0cmluZyk6ICgpID0+IHZvaWQge1xuICByZXR1cm4gb25jZSgoKSA9PiBjb25zb2xlLndhcm4oYGJvdGZyYW1ld29yay13ZWJjaGF0OiAke21lc3NhZ2V9LmApKTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "botframework-webchat-core",
3
- "version": "4.13.0",
3
+ "version": "4.15.0",
4
4
  "description": "Core of botframework-webchat",
5
5
  "main": "lib/index.js",
6
6
  "publishConfig": {
@@ -20,40 +20,37 @@
20
20
  "build": "npm run build:typescript && npm run build:babel",
21
21
  "build:babel": "babel src --extensions .js,.ts,.tsx --ignore **/*.spec.js,**/*.spec.ts,**/*.spec.tsx,**/*.test.js,**/*.test.ts,**/*.test.tsx,__tests__/**/*.js,__tests__/**/*.ts,__tests__/**/*.tsx --out-dir lib --verbose",
22
22
  "build:typescript": "tsc --project src/tsconfig.json",
23
- "eslint": "eslint src/**/*.js src/**/*.ts --fix",
23
+ "eslint": "npm run precommit",
24
+ "precommit": "npm run precommit:eslint -- src && npm run precommit:typecheck",
25
+ "precommit:eslint": "../../node_modules/.bin/eslint --report-unused-disable-directives --max-warnings 0",
26
+ "precommit:typecheck": "tsc --project ./src --emitDeclarationOnly false --esModuleInterop true --noEmit --pretty false",
24
27
  "prestart": "npm run build:babel",
25
28
  "start": "concurrently --kill-others --names \"babel,tsc\" \"npm run start:babel\" \"npm run start:typescript\"",
26
29
  "start:babel": "npm run build:babel -- --skip-initial-build --watch",
27
30
  "start:typescript": "npm run build:typescript -- --watch"
28
31
  },
29
32
  "devDependencies": {
30
- "@babel/cli": "^7.13.10",
31
- "@babel/core": "^7.13.10",
32
- "@babel/plugin-transform-runtime": "^7.13.10",
33
- "@babel/preset-env": "^7.13.10",
34
- "@babel/preset-typescript": "^7.13.0",
35
- "@types/node": "^14.14.35",
36
- "@typescript-eslint/eslint-plugin": "^4.19.0",
37
- "@typescript-eslint/parser": "^4.19.0",
33
+ "@babel/cli": "^7.14.5",
34
+ "@babel/core": "^7.14.6",
35
+ "@babel/plugin-transform-runtime": "^7.14.5",
36
+ "@babel/preset-env": "^7.14.7",
37
+ "@babel/preset-typescript": "^7.14.5",
38
+ "@types/node": "^16.3.1",
38
39
  "babel-plugin-istanbul": "^6.0.0",
39
40
  "babel-plugin-transform-inline-environment-variables": "^0.4.3",
40
- "botframework-directlinejs": "^0.14.1",
41
- "concurrently": "^6.0.0",
42
- "eslint": "^7.22.0",
43
- "eslint-plugin-node": "^11.1.0",
44
- "eslint-plugin-prettier": "^3.3.1",
45
- "prettier": "^2.2.1",
46
- "typescript": "^4.2.3"
41
+ "botframework-directlinejs": "0.15.1",
42
+ "concurrently": "^6.3.0",
43
+ "typescript": "^4.3.5"
47
44
  },
48
45
  "dependencies": {
49
- "@babel/runtime": "7.13.10",
50
- "jsonwebtoken": "8.5.1",
46
+ "@babel/runtime": "7.15.4",
47
+ "jwt-decode": "3.1.2",
51
48
  "math-random": "2.0.1",
52
49
  "mime": "2.5.2",
53
- "p-defer": "3.0.0",
54
- "p-defer-es5": "1.2.1",
50
+ "p-defer": "4.0.0",
51
+ "p-defer-es5": "2.0.1",
55
52
  "redux": "4.0.5",
56
- "redux-devtools-extension": "2.13.8",
53
+ "redux-devtools-extension": "2.13.9",
57
54
  "redux-saga": "1.1.3",
58
55
  "simple-update-in": "2.2.0"
59
56
  },
@@ -58,7 +58,7 @@ beforeEach(() => {
58
58
  applyMiddleware(sagaMiddleware)
59
59
  );
60
60
 
61
- sagaMiddleware.run(function*() {
61
+ sagaMiddleware.run(function* () {
62
62
  yield fork(connectSaga);
63
63
  yield fork(connectionStatusUpdateSaga);
64
64
  yield fork(detectSlowConnectionSaga);
@@ -36,7 +36,7 @@ describe('observeOnce', () => {
36
36
 
37
37
  test('should unsubscribe after first next', () =>
38
38
  new Promise((resolve, reject) => {
39
- runSaga(inputOutput, function*() {
39
+ runSaga(inputOutput, function* () {
40
40
  try {
41
41
  const [result] = yield all([observeOnce(observable), call(() => onNext('Hello, World!'))]);
42
42
 
@@ -53,7 +53,7 @@ describe('observeOnce', () => {
53
53
 
54
54
  test('should unsubscribe and throw after first error', () =>
55
55
  new Promise((resolve, reject) => {
56
- runSaga(inputOutput, function*() {
56
+ runSaga(inputOutput, function* () {
57
57
  try {
58
58
  try {
59
59
  yield all([observeOnce(observable), call(() => onError(new Error('Hello, World!')))]);
@@ -75,7 +75,7 @@ describe('observeOnce', () => {
75
75
 
76
76
  test('should unsubscribe after complete', () =>
77
77
  new Promise((resolve, reject) => {
78
- runSaga(inputOutput, function*() {
78
+ runSaga(inputOutput, function* () {
79
79
  try {
80
80
  const [result] = yield all([observeOnce(observable), call(() => onComplete())]);
81
81
 
@@ -4,12 +4,18 @@ const SET_NOTIFICATION = 'WEB_CHAT/SET_NOTIFICATION';
4
4
 
5
5
  export default function setNotification({ alt, data, id, level, message }) {
6
6
  if (!id || typeof id !== 'string') {
7
- console.warn('botframework-webchat: The "id" argument passed to "setNotification" must be a string; defaulting to a random value.');
7
+ console.warn(
8
+ 'botframework-webchat: The "id" argument passed to "setNotification" must be a string; defaulting to a random value.'
9
+ );
10
+
8
11
  id = uniqueID();
9
12
  }
10
13
 
11
14
  if (!level || typeof level !== 'string') {
12
- console.warn('botframework-webchat: The "level" argument passed to "setNotification" must be a string; defaulting to "info".');
15
+ console.warn(
16
+ 'botframework-webchat: The "level" argument passed to "setNotification" must be a string; defaulting to "info".'
17
+ );
18
+
13
19
  level = 'info';
14
20
  }
15
21
 
@@ -1,7 +1,3 @@
1
- /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
2
- // This is for the racing between sagaMiddleware and store
3
- /* eslint no-use-before-define: "off" */
4
-
5
1
  import { applyMiddleware, createStore as createReduxStore, Store } from 'redux';
6
2
  import { composeWithDevTools } from 'redux-devtools-extension';
7
3
  import createSagaMiddleware from 'redux-saga';
@@ -29,7 +25,9 @@ function createEnhancerAndSagaMiddleware(getStore, ...middlewares) {
29
25
  };
30
26
  }
31
27
 
32
- export default function createStore(initialState, ...middlewares): Store {
28
+ export default function createStore(initialState?, ...middlewares): Store {
29
+ // We are sure the "getStore" (first argument) is not called on "createEnhancerAndSagaMiddleware()".
30
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
33
31
  const { enhancer, sagaMiddleware } = createEnhancerAndSagaMiddleware(() => store, ...middlewares);
34
32
  const store = createReduxStore(reducer, initialState || {}, enhancer);
35
33
 
@@ -38,7 +36,9 @@ export default function createStore(initialState, ...middlewares): Store {
38
36
  return store;
39
37
  }
40
38
 
41
- export function withDevTools(initialState, ...middlewares): Store {
39
+ export function withDevTools(initialState?, ...middlewares): Store {
40
+ // We are sure the "getStore" (first argument) is not called on "createEnhancerAndSagaMiddleware()".
41
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
42
42
  const { enhancer, sagaMiddleware } = createEnhancerAndSagaMiddleware(() => store, ...middlewares);
43
43
  const store = createReduxStore(reducer, initialState || {}, composeWithDevTools(enhancer));
44
44
 
@@ -1,10 +1,27 @@
1
+ import * as ActivityClientState from './constants/ActivityClientState';
2
+ import * as DictateState from './constants/DictateState';
1
3
  import clearSuggestedActions from './actions/clearSuggestedActions';
2
4
  import connect from './actions/connect';
3
5
  import createStore, { withDevTools as createStoreWithDevTools } from './createStore';
6
+ import DirectLineActivity from './types/external/DirectLineActivity';
7
+ import DirectLineAnimationCard from './types/external/DirectLineAnimationCard';
8
+ import DirectLineAttachment from './types/external/DirectLineAttachment';
9
+ import DirectLineAudioCard from './types/external/DirectLineAudioCard';
10
+ import DirectLineCardAction from './types/external/DirectLineCardAction';
11
+ import DirectLineHeroCard from './types/external/DirectLineHeroCard';
12
+ import DirectLineJSBotConnection from './types/external/DirectLineJSBotConnection';
13
+ import DirectLineOAuthCard from './types/external/DirectLineOAuthCard';
14
+ import DirectLineReceiptCard from './types/external/DirectLineReceiptCard';
15
+ import DirectLineSignInCard from './types/external/DirectLineSignInCard';
16
+ import DirectLineSuggestedAction from './types/external/DirectLineSuggestedAction';
17
+ import DirectLineThumbnailCard from './types/external/DirectLineThumbnailCard';
18
+ import DirectLineVideoCard from './types/external/DirectLineVideoCard';
4
19
  import disconnect from './actions/disconnect';
5
20
  import dismissNotification from './actions/dismissNotification';
6
21
  import emitTypingIndicator from './actions/emitTypingIndicator';
22
+ import isForbiddenPropertyName from './utils/isForbiddenPropertyName';
7
23
  import markActivity from './actions/markActivity';
24
+ import OneOrMany from './types/OneOrMany';
8
25
  import postActivity from './actions/postActivity';
9
26
  import sendEvent from './actions/sendEvent';
10
27
  import sendFiles from './actions/sendFiles';
@@ -18,14 +35,13 @@ import setNotification from './actions/setNotification';
18
35
  import setSendBox from './actions/setSendBox';
19
36
  import setSendTimeout from './actions/setSendTimeout';
20
37
  import setSendTypingIndicator from './actions/setSendTypingIndicator';
38
+ import singleToArray from './utils/singleToArray';
21
39
  import startDictate from './actions/startDictate';
22
40
  import startSpeakingActivity from './actions/startSpeakingActivity';
23
41
  import stopDictate from './actions/stopDictate';
24
42
  import stopSpeakingActivity from './actions/stopSpeakingActivity';
25
43
  import submitSendBox from './actions/submitSendBox';
26
-
27
- import * as ActivityClientState from './constants/ActivityClientState';
28
- import * as DictateState from './constants/DictateState';
44
+ import warnOnce from './utils/warnOnce';
29
45
 
30
46
  const Constants = { ActivityClientState, DictateState };
31
47
  const version = process.env.npm_package_version;
@@ -39,6 +55,7 @@ export {
39
55
  disconnect,
40
56
  dismissNotification,
41
57
  emitTypingIndicator,
58
+ isForbiddenPropertyName,
42
59
  markActivity,
43
60
  postActivity,
44
61
  sendEvent,
@@ -53,10 +70,29 @@ export {
53
70
  setSendBox,
54
71
  setSendTimeout,
55
72
  setSendTypingIndicator,
73
+ singleToArray,
56
74
  startDictate,
57
75
  startSpeakingActivity,
58
76
  stopDictate,
59
77
  stopSpeakingActivity,
60
78
  submitSendBox,
61
- version
79
+ version,
80
+ warnOnce
81
+ };
82
+
83
+ export type {
84
+ DirectLineActivity,
85
+ DirectLineAnimationCard,
86
+ DirectLineAttachment,
87
+ DirectLineAudioCard,
88
+ DirectLineCardAction,
89
+ DirectLineHeroCard,
90
+ DirectLineOAuthCard,
91
+ DirectLineJSBotConnection,
92
+ DirectLineReceiptCard,
93
+ DirectLineSignInCard,
94
+ DirectLineSuggestedAction,
95
+ DirectLineThumbnailCard,
96
+ DirectLineVideoCard,
97
+ OneOrMany
62
98
  };
@@ -3,6 +3,7 @@ import updateIn from 'simple-update-in';
3
3
  import { DISMISS_NOTIFICATION } from '../actions/dismissNotification';
4
4
  import { SAGA_ERROR } from '../actions/sagaError';
5
5
  import { SET_NOTIFICATION } from '../actions/setNotification';
6
+ import isForbiddenPropertyName from '../utils/isForbiddenPropertyName';
6
7
 
7
8
  const DEFAULT_STATE = {};
8
9
 
@@ -15,23 +16,28 @@ export default function notifications(state = DEFAULT_STATE, { payload, type })
15
16
  state = updateIn(state, ['connectivitystatus', 'message'], () => 'javascripterror');
16
17
  } else if (type === SET_NOTIFICATION) {
17
18
  const { alt, data, id, level, message } = payload;
18
- const notification = state[id];
19
19
 
20
- if (
21
- !notification ||
22
- alt !== notification.alt ||
23
- !Object.is(data, notification.data) ||
24
- level !== notification.level ||
25
- message !== notification.message
26
- ) {
27
- state = updateIn(state, [id], () => ({
28
- alt,
29
- data,
30
- id,
31
- level,
32
- message,
33
- timestamp: now
34
- }));
20
+ if (!isForbiddenPropertyName(id)) {
21
+ // Mitigated through denylisting.
22
+ // eslint-disable-next-line security/detect-object-injection
23
+ const notification = state[id];
24
+
25
+ if (
26
+ !notification ||
27
+ alt !== notification.alt ||
28
+ !Object.is(data, notification.data) ||
29
+ level !== notification.level ||
30
+ message !== notification.message
31
+ ) {
32
+ state = updateIn(state, [id], () => ({
33
+ alt,
34
+ data,
35
+ id,
36
+ level,
37
+ message,
38
+ timestamp: now
39
+ }));
40
+ }
35
41
  }
36
42
  }
37
43
 
@@ -3,7 +3,7 @@
3
3
  import { call, cancel, cancelled, fork, put, race, take } from 'redux-saga/effects';
4
4
 
5
5
  import { ConnectionStatus } from 'botframework-directlinejs';
6
- import { decode } from 'jsonwebtoken';
6
+ import decode from 'jwt-decode';
7
7
 
8
8
  import { CONNECT } from '../actions/connect';
9
9
  import createPromiseQueue from '../createPromiseQueue';
@@ -39,7 +39,14 @@ function* observeAndPutConnectionStatusUpdate(directLine) {
39
39
  // TODO: [P2] We should move this check and rectification to DirectLineJS.
40
40
  function rectifyUserID(directLine, userIDFromAction) {
41
41
  const { token } = directLine;
42
- const { user: userIDFromToken } = decode(token) || {};
42
+
43
+ let userIDFromToken;
44
+
45
+ // TODO: Add test to make sure "jwt-decode" work as expected.
46
+ try {
47
+ userIDFromToken = (decode(token) || {}).user;
48
+ // eslint-disable-next-line no-empty
49
+ } catch (err) {}
43
50
 
44
51
  const result = {
45
52
  fromAction: userIDFromAction,
@@ -78,6 +78,6 @@ function* connectionStatusToNotification({ payload: { directLine } }) {
78
78
  }
79
79
  }
80
80
 
81
- export default function*() {
81
+ export default function* () {
82
82
  yield takeLatest(CONNECT, connectionStatusToNotification);
83
83
  }
@@ -5,6 +5,7 @@ import whileConnected from './effects/whileConnected';
5
5
 
6
6
  import clockSkewAdjustmentSelector from '../selectors/clockSkewAdjustment';
7
7
  import combineSelectors from '../selectors/combineSelectors';
8
+ import dateToLocaleISOString from '../utils/dateToLocaleISOString';
8
9
  import languageSelector from '../selectors/language';
9
10
  import sendTimeoutSelector from '../selectors/sendTimeout';
10
11
 
@@ -21,8 +22,9 @@ import {
21
22
 
22
23
  import { INCOMING_ACTIVITY } from '../actions/incomingActivity';
23
24
 
24
- function getTimestamp(clockSkewAdjustment = 0) {
25
- return new Date(Date.now() + clockSkewAdjustment).toISOString();
25
+ function getTimestamp(date, clockSkewAdjustment = 0) {
26
+ // "+date" will return epoch time in milliseconds, same as Date.getTime().
27
+ return new Date(+date + clockSkewAdjustment).toISOString();
26
28
  }
27
29
 
28
30
  function* postActivity(directLine, userID, username, numActivitiesPosted, { meta: { method }, payload: { activity } }) {
@@ -31,6 +33,9 @@ function* postActivity(directLine, userID, username, numActivitiesPosted, { meta
31
33
  );
32
34
  const { attachments } = activity;
33
35
  const clientActivityID = uniqueID();
36
+ const now = new Date();
37
+ const localTimeZone =
38
+ typeof window.Intl === 'undefined' ? undefined : new Intl.DateTimeFormat().resolvedOptions().timeZone;
34
39
 
35
40
  activity = {
36
41
  ...deleteKey(activity, 'id'),
@@ -46,7 +51,7 @@ function* postActivity(directLine, userID, username, numActivitiesPosted, { meta
46
51
  ...deleteKey(activity.channelData, 'state'),
47
52
  clientActivityID,
48
53
  // This is unskewed local timestamp for estimating clock skew.
49
- clientTimestamp: getTimestamp()
54
+ clientTimestamp: getTimestamp(now)
50
55
  },
51
56
  channelId: 'webchat',
52
57
  from: {
@@ -55,9 +60,11 @@ function* postActivity(directLine, userID, username, numActivitiesPosted, { meta
55
60
  role: 'user'
56
61
  },
57
62
  locale,
63
+ localTimestamp: dateToLocaleISOString(now),
64
+ localTimezone: localTimeZone,
58
65
  // This timestamp will be replaced by Direct Line Channel in echoback.
59
66
  // We are temporarily adding this timestamp for sorting.
60
- timestamp: getTimestamp(clockSkewAdjustment)
67
+ timestamp: getTimestamp(now, clockSkewAdjustment)
61
68
  };
62
69
 
63
70
  if (!numActivitiesPosted) {