sceyt-chat-react-uikit 1.7.6-beta.11 → 1.7.6-beta.13

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 (3) hide show
  1. package/index.js +42 -12
  2. package/index.modern.js +42 -12
  3. package/package.json +1 -1
package/index.js CHANGED
@@ -9883,6 +9883,11 @@ var calculateRenderedImageWidth = function calculateRenderedImageWidth(width, he
9883
9883
  }
9884
9884
  }
9885
9885
  };
9886
+ var formatChannelDetailsDate = function formatChannelDetailsDate(date) {
9887
+ if (!date) return '';
9888
+ var momentDate = moment(date);
9889
+ return momentDate.isValid() ? momentDate.format('DD.MM.YY, HH:mm') : '';
9890
+ };
9886
9891
  var userLastActiveDateFormat = function userLastActiveDateFormat(date) {
9887
9892
  var formattingDate = moment(date).format();
9888
9893
  var currentTime = moment();
@@ -15016,9 +15021,7 @@ function watchForEvents() {
15016
15021
  _context.n = 77;
15017
15022
  break;
15018
15023
  }
15019
- lastMessage = _extends({}, _channel6.lastMessage, {
15020
- deliveryStatus: markerList.name
15021
- });
15024
+ lastMessage = _extends({}, _channel6.lastMessage, updateMessageDeliveryStatusAndMarkers(_channel6.lastMessage, markerList.name));
15022
15025
  updateChannelLastMessageOnAllChannels(_channel6.id, lastMessage);
15023
15026
  _context.n = 77;
15024
15027
  return effects.put(updateChannelLastMessageStatusAC(lastMessage, _channel6));
@@ -23186,7 +23189,9 @@ function JoinGroupPopup(_ref) {
23186
23189
  textSecondary = _useColor[THEME_COLORS.TEXT_SECONDARY],
23187
23190
  background = _useColor[THEME_COLORS.BACKGROUND],
23188
23191
  iconPrimary = _useColor[THEME_COLORS.ICON_PRIMARY],
23189
- surface1 = _useColor[THEME_COLORS.SURFACE_1];
23192
+ surface1 = _useColor[THEME_COLORS.SURFACE_1],
23193
+ accentColor = _useColor[THEME_COLORS.ACCENT],
23194
+ textOnPrimary = _useColor[THEME_COLORS.TEXT_ON_PRIMARY];
23190
23195
  var contactsMap = useSelector(contactsMapSelector, reactRedux.shallowEqual);
23191
23196
  var members = React.useMemo(function () {
23192
23197
  return channel.members.map(function (m) {
@@ -23286,8 +23291,8 @@ function JoinGroupPopup(_ref) {
23286
23291
  color: textSecondary
23287
23292
  }, membersLine), /*#__PURE__*/React__default.createElement(Center, null, /*#__PURE__*/React__default.createElement(Button, {
23288
23293
  type: 'button',
23289
- color: '#fff',
23290
- backgroundColor: '#0DBD8B',
23294
+ color: textOnPrimary,
23295
+ backgroundColor: accentColor,
23291
23296
  borderRadius: '8px',
23292
23297
  onClick: onJoin
23293
23298
  }, joinButtonText)))));
@@ -36644,6 +36649,7 @@ var Message$1 = function Message(_ref) {
36644
36649
  left: reactionsContainer ? reactionsContainer.getBoundingClientRect().left : 0,
36645
36650
  right: reactionsContPos ? window.innerWidth - reactionsContPos.left - reactionsContPos.width : 0
36646
36651
  });
36652
+ dispatch(setReactionsListAC([], false));
36647
36653
  setReactionsPopupOpen(!reactionsPopupOpen);
36648
36654
  };
36649
36655
  var handleMouseEnter = function handleMouseEnter() {
@@ -36734,7 +36740,7 @@ var Message$1 = function Message(_ref) {
36734
36740
  }
36735
36741
  };
36736
36742
  React.useEffect(function () {
36737
- if (isVisible) {
36743
+ if (isVisible && !unreadScrollTo) {
36738
36744
  var _channel$lastMessage;
36739
36745
  if (setLastVisibleMessageId) {
36740
36746
  setLastVisibleMessageId(message.id);
@@ -36752,7 +36758,7 @@ var Message$1 = function Message(_ref) {
36752
36758
  removeMessageFromVisibleMessagesMap(message);
36753
36759
  }
36754
36760
  }
36755
- }, [isVisible]);
36761
+ }, [isVisible, unreadScrollTo]);
36756
36762
  useDidUpdate(function () {
36757
36763
  if (tabIsActive) {
36758
36764
  handleSendReadMarker();
@@ -38036,6 +38042,9 @@ var MessageList = function MessageList(_ref2) {
38036
38042
  setScrollIntoView(false);
38037
38043
  }, 100);
38038
38044
  }
38045
+ } else {
38046
+ dispatch(setUnreadScrollToAC(false));
38047
+ setScrollIntoView(false);
38039
38048
  }
38040
38049
  }, [channel.id, channel.newMessageCount, scrollRef.current, unreadScrollTo, channel.lastDisplayedMessageId, scrollIntoView, messages.length]);
38041
38050
  React.useEffect(function () {
@@ -42886,7 +42895,28 @@ var SendMessageInput = function SendMessageInput(_ref3) {
42886
42895
  iconColor: textOnPrimary
42887
42896
  }, /*#__PURE__*/React__default.createElement(SvgChoseFile, null)))), /*#__PURE__*/React__default.createElement(ReplyMessageBody$1, null, /*#__PURE__*/React__default.createElement(EditReplyMessageHeader, {
42888
42897
  color: accentColor
42889
- }, replyMessageIcon || /*#__PURE__*/React__default.createElement(SvgReplyIcon, null), " Reply to", /*#__PURE__*/React__default.createElement(UserName$1, null, user.id === messageForReply.user.id ? user.firstName ? user.firstName + " " + user.lastName : user.id : makeUsername(contactsMap[messageForReply.user.id], messageForReply.user, getFromContacts))), messageForReply.attachments && messageForReply.attachments.length ? messageForReply.attachments[0].type === attachmentTypes.voice ? 'Voice' : messageForReply.attachments[0].type === attachmentTypes.image ? (/*#__PURE__*/React__default.createElement(TextInOneLine, null, messageForReply.body || 'Photo')) : messageForReply.attachments[0].type === attachmentTypes.video ? (/*#__PURE__*/React__default.createElement(TextInOneLine, null, messageForReply.body || 'Video')) : (/*#__PURE__*/React__default.createElement(TextInOneLine, null, messageForReply.body || 'File')) : MessageTextFormat({
42898
+ }, replyMessageIcon || /*#__PURE__*/React__default.createElement(SvgReplyIcon, null), " Reply to", /*#__PURE__*/React__default.createElement(UserName$1, null, user.id === messageForReply.user.id ? user.firstName ? user.firstName + " " + user.lastName : user.id : makeUsername(contactsMap[messageForReply.user.id], messageForReply.user, getFromContacts))), messageForReply.attachments && messageForReply.attachments.length ? messageForReply.attachments[0].type === attachmentTypes.voice ? 'Voice' : messageForReply.body && messageForReply.bodyAttributes && messageForReply.bodyAttributes.length > 0 ? MessageTextFormat({
42899
+ text: messageForReply.body,
42900
+ message: _extends({}, messageForReply, {
42901
+ mentionedUsers: messageForReply.mentionedUsers && messageForReply.mentionedUsers.length > 0 ? messageForReply.mentionedUsers : activeChannelMembers && messageForReply.bodyAttributes && messageForReply.bodyAttributes.length > 0 ? messageForReply.bodyAttributes.filter(function (attr) {
42902
+ return attr.type.includes('mention');
42903
+ }).map(function (attr) {
42904
+ var member = activeChannelMembers.find(function (m) {
42905
+ return m.id === attr.metadata;
42906
+ });
42907
+ return member || null;
42908
+ }).filter(function (m) {
42909
+ return m !== null;
42910
+ }) : messageForReply.mentionedUsers || [],
42911
+ channel: activeChannelMembers ? {
42912
+ members: activeChannelMembers
42913
+ } : undefined
42914
+ }),
42915
+ contactsMap: contactsMap,
42916
+ getFromContacts: getFromContacts,
42917
+ accentColor: accentColor,
42918
+ textSecondary: textSecondary
42919
+ }) : messageForReply.attachments[0].type === attachmentTypes.image ? (/*#__PURE__*/React__default.createElement(TextInOneLine, null, messageForReply.body || 'Photo')) : messageForReply.attachments[0].type === attachmentTypes.video ? (/*#__PURE__*/React__default.createElement(TextInOneLine, null, messageForReply.body || 'Video')) : (/*#__PURE__*/React__default.createElement(TextInOneLine, null, messageForReply.body || 'File')) : MessageTextFormat({
42890
42920
  text: messageForReply.body,
42891
42921
  message: messageForReply,
42892
42922
  contactsMap: contactsMap,
@@ -45223,7 +45253,7 @@ var Files = function Files(_ref) {
45223
45253
  fontSize: fileSizeFontSize,
45224
45254
  lineHeight: fileSizeLineHeight,
45225
45255
  color: filePreviewSizeColor || textSecondary
45226
- }, file.size ? bytesToSize(file.size) : '')), /*#__PURE__*/React__default.createElement(DownloadWrapper, {
45256
+ }, file.size ? bytesToSize(file.size) + " \u2022 " + formatChannelDetailsDate(file.createdAt) : formatChannelDetailsDate(file.createdAt))), /*#__PURE__*/React__default.createElement(DownloadWrapper, {
45227
45257
  visible: !!downloadingFilesMap[file.id],
45228
45258
  iconColor: accentColor,
45229
45259
  onClick: function onClick() {
@@ -45555,7 +45585,7 @@ var VoiceItem = function VoiceItem(_ref) {
45555
45585
  color: voicePreviewTitleColor || textPrimary
45556
45586
  }, file.user && (file.user.id === user.id ? 'You' : makeUsername(contactsMap[file.user.id], file.user, getFromContacts))), /*#__PURE__*/React__default.createElement(AudioDate, {
45557
45587
  color: voicePreviewDateAndTimeColor || textSecondary
45558
- }, moment(file.createdAt).format('DD MMMM, YYYY')), /*#__PURE__*/React__default.createElement(AudioSendTime, {
45588
+ }, formatChannelDetailsDate(file.createdAt)), /*#__PURE__*/React__default.createElement(AudioSendTime, {
45559
45589
  color: textSecondary
45560
45590
  }, currentTime || (file.metadata.dur ? formatAudioVideoTime(file.metadata.dur) : ''))), /*#__PURE__*/React__default.createElement(Audio, {
45561
45591
  controls: true,
@@ -45586,7 +45616,7 @@ var AudioInfo = styled__default.div(_templateObject4$F || (_templateObject4$F =
45586
45616
  var AudioTitle = styled__default.span(_templateObject5$A || (_templateObject5$A = _taggedTemplateLiteralLoose(["\n display: block;\n font-style: normal;\n font-weight: 500;\n font-size: 15px;\n line-height: 20px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: calc(100% - 72px);\n color: ", ";\n"])), function (props) {
45587
45617
  return props.color;
45588
45618
  });
45589
- var AudioDate = styled__default.span(_templateObject6$v || (_templateObject6$v = _taggedTemplateLiteralLoose(["\n display: block;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: calc(100% - 72px);\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 16px;\n color: ", ";\n"])), function (props) {
45619
+ var AudioDate = styled__default.span(_templateObject6$v || (_templateObject6$v = _taggedTemplateLiteralLoose(["\n display: block;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: calc(100% - 72px);\n font-style: normal;\n font-weight: normal;\n font-size: 13px;\n line-height: 16px;\n color: ", ";\n"])), function (props) {
45590
45620
  return props.color;
45591
45621
  });
45592
45622
  var AudioSendTime = styled__default.span(_templateObject7$t || (_templateObject7$t = _taggedTemplateLiteralLoose(["\n position: absolute;\n right: 0;\n top: 11px;\n color: ", ";\n font-size: 12px;\n line-height: 16px;\n"])), function (props) {
package/index.modern.js CHANGED
@@ -9882,6 +9882,11 @@ var calculateRenderedImageWidth = function calculateRenderedImageWidth(width, he
9882
9882
  }
9883
9883
  }
9884
9884
  };
9885
+ var formatChannelDetailsDate = function formatChannelDetailsDate(date) {
9886
+ if (!date) return '';
9887
+ var momentDate = moment(date);
9888
+ return momentDate.isValid() ? momentDate.format('DD.MM.YY, HH:mm') : '';
9889
+ };
9885
9890
  var userLastActiveDateFormat = function userLastActiveDateFormat(date) {
9886
9891
  var formattingDate = moment(date).format();
9887
9892
  var currentTime = moment();
@@ -15015,9 +15020,7 @@ function watchForEvents() {
15015
15020
  _context.n = 77;
15016
15021
  break;
15017
15022
  }
15018
- lastMessage = _extends({}, _channel6.lastMessage, {
15019
- deliveryStatus: markerList.name
15020
- });
15023
+ lastMessage = _extends({}, _channel6.lastMessage, updateMessageDeliveryStatusAndMarkers(_channel6.lastMessage, markerList.name));
15021
15024
  updateChannelLastMessageOnAllChannels(_channel6.id, lastMessage);
15022
15025
  _context.n = 77;
15023
15026
  return put(updateChannelLastMessageStatusAC(lastMessage, _channel6));
@@ -23185,7 +23188,9 @@ function JoinGroupPopup(_ref) {
23185
23188
  textSecondary = _useColor[THEME_COLORS.TEXT_SECONDARY],
23186
23189
  background = _useColor[THEME_COLORS.BACKGROUND],
23187
23190
  iconPrimary = _useColor[THEME_COLORS.ICON_PRIMARY],
23188
- surface1 = _useColor[THEME_COLORS.SURFACE_1];
23191
+ surface1 = _useColor[THEME_COLORS.SURFACE_1],
23192
+ accentColor = _useColor[THEME_COLORS.ACCENT],
23193
+ textOnPrimary = _useColor[THEME_COLORS.TEXT_ON_PRIMARY];
23189
23194
  var contactsMap = useSelector(contactsMapSelector, shallowEqual);
23190
23195
  var members = useMemo(function () {
23191
23196
  return channel.members.map(function (m) {
@@ -23285,8 +23290,8 @@ function JoinGroupPopup(_ref) {
23285
23290
  color: textSecondary
23286
23291
  }, membersLine), /*#__PURE__*/React__default.createElement(Center, null, /*#__PURE__*/React__default.createElement(Button, {
23287
23292
  type: 'button',
23288
- color: '#fff',
23289
- backgroundColor: '#0DBD8B',
23293
+ color: textOnPrimary,
23294
+ backgroundColor: accentColor,
23290
23295
  borderRadius: '8px',
23291
23296
  onClick: onJoin
23292
23297
  }, joinButtonText)))));
@@ -36643,6 +36648,7 @@ var Message$1 = function Message(_ref) {
36643
36648
  left: reactionsContainer ? reactionsContainer.getBoundingClientRect().left : 0,
36644
36649
  right: reactionsContPos ? window.innerWidth - reactionsContPos.left - reactionsContPos.width : 0
36645
36650
  });
36651
+ dispatch(setReactionsListAC([], false));
36646
36652
  setReactionsPopupOpen(!reactionsPopupOpen);
36647
36653
  };
36648
36654
  var handleMouseEnter = function handleMouseEnter() {
@@ -36733,7 +36739,7 @@ var Message$1 = function Message(_ref) {
36733
36739
  }
36734
36740
  };
36735
36741
  useEffect(function () {
36736
- if (isVisible) {
36742
+ if (isVisible && !unreadScrollTo) {
36737
36743
  var _channel$lastMessage;
36738
36744
  if (setLastVisibleMessageId) {
36739
36745
  setLastVisibleMessageId(message.id);
@@ -36751,7 +36757,7 @@ var Message$1 = function Message(_ref) {
36751
36757
  removeMessageFromVisibleMessagesMap(message);
36752
36758
  }
36753
36759
  }
36754
- }, [isVisible]);
36760
+ }, [isVisible, unreadScrollTo]);
36755
36761
  useDidUpdate(function () {
36756
36762
  if (tabIsActive) {
36757
36763
  handleSendReadMarker();
@@ -38035,6 +38041,9 @@ var MessageList = function MessageList(_ref2) {
38035
38041
  setScrollIntoView(false);
38036
38042
  }, 100);
38037
38043
  }
38044
+ } else {
38045
+ dispatch(setUnreadScrollToAC(false));
38046
+ setScrollIntoView(false);
38038
38047
  }
38039
38048
  }, [channel.id, channel.newMessageCount, scrollRef.current, unreadScrollTo, channel.lastDisplayedMessageId, scrollIntoView, messages.length]);
38040
38049
  useEffect(function () {
@@ -42885,7 +42894,28 @@ var SendMessageInput = function SendMessageInput(_ref3) {
42885
42894
  iconColor: textOnPrimary
42886
42895
  }, /*#__PURE__*/React__default.createElement(SvgChoseFile, null)))), /*#__PURE__*/React__default.createElement(ReplyMessageBody$1, null, /*#__PURE__*/React__default.createElement(EditReplyMessageHeader, {
42887
42896
  color: accentColor
42888
- }, replyMessageIcon || /*#__PURE__*/React__default.createElement(SvgReplyIcon, null), " Reply to", /*#__PURE__*/React__default.createElement(UserName$1, null, user.id === messageForReply.user.id ? user.firstName ? user.firstName + " " + user.lastName : user.id : makeUsername(contactsMap[messageForReply.user.id], messageForReply.user, getFromContacts))), messageForReply.attachments && messageForReply.attachments.length ? messageForReply.attachments[0].type === attachmentTypes.voice ? 'Voice' : messageForReply.attachments[0].type === attachmentTypes.image ? (/*#__PURE__*/React__default.createElement(TextInOneLine, null, messageForReply.body || 'Photo')) : messageForReply.attachments[0].type === attachmentTypes.video ? (/*#__PURE__*/React__default.createElement(TextInOneLine, null, messageForReply.body || 'Video')) : (/*#__PURE__*/React__default.createElement(TextInOneLine, null, messageForReply.body || 'File')) : MessageTextFormat({
42897
+ }, replyMessageIcon || /*#__PURE__*/React__default.createElement(SvgReplyIcon, null), " Reply to", /*#__PURE__*/React__default.createElement(UserName$1, null, user.id === messageForReply.user.id ? user.firstName ? user.firstName + " " + user.lastName : user.id : makeUsername(contactsMap[messageForReply.user.id], messageForReply.user, getFromContacts))), messageForReply.attachments && messageForReply.attachments.length ? messageForReply.attachments[0].type === attachmentTypes.voice ? 'Voice' : messageForReply.body && messageForReply.bodyAttributes && messageForReply.bodyAttributes.length > 0 ? MessageTextFormat({
42898
+ text: messageForReply.body,
42899
+ message: _extends({}, messageForReply, {
42900
+ mentionedUsers: messageForReply.mentionedUsers && messageForReply.mentionedUsers.length > 0 ? messageForReply.mentionedUsers : activeChannelMembers && messageForReply.bodyAttributes && messageForReply.bodyAttributes.length > 0 ? messageForReply.bodyAttributes.filter(function (attr) {
42901
+ return attr.type.includes('mention');
42902
+ }).map(function (attr) {
42903
+ var member = activeChannelMembers.find(function (m) {
42904
+ return m.id === attr.metadata;
42905
+ });
42906
+ return member || null;
42907
+ }).filter(function (m) {
42908
+ return m !== null;
42909
+ }) : messageForReply.mentionedUsers || [],
42910
+ channel: activeChannelMembers ? {
42911
+ members: activeChannelMembers
42912
+ } : undefined
42913
+ }),
42914
+ contactsMap: contactsMap,
42915
+ getFromContacts: getFromContacts,
42916
+ accentColor: accentColor,
42917
+ textSecondary: textSecondary
42918
+ }) : messageForReply.attachments[0].type === attachmentTypes.image ? (/*#__PURE__*/React__default.createElement(TextInOneLine, null, messageForReply.body || 'Photo')) : messageForReply.attachments[0].type === attachmentTypes.video ? (/*#__PURE__*/React__default.createElement(TextInOneLine, null, messageForReply.body || 'Video')) : (/*#__PURE__*/React__default.createElement(TextInOneLine, null, messageForReply.body || 'File')) : MessageTextFormat({
42889
42919
  text: messageForReply.body,
42890
42920
  message: messageForReply,
42891
42921
  contactsMap: contactsMap,
@@ -45222,7 +45252,7 @@ var Files = function Files(_ref) {
45222
45252
  fontSize: fileSizeFontSize,
45223
45253
  lineHeight: fileSizeLineHeight,
45224
45254
  color: filePreviewSizeColor || textSecondary
45225
- }, file.size ? bytesToSize(file.size) : '')), /*#__PURE__*/React__default.createElement(DownloadWrapper, {
45255
+ }, file.size ? bytesToSize(file.size) + " \u2022 " + formatChannelDetailsDate(file.createdAt) : formatChannelDetailsDate(file.createdAt))), /*#__PURE__*/React__default.createElement(DownloadWrapper, {
45226
45256
  visible: !!downloadingFilesMap[file.id],
45227
45257
  iconColor: accentColor,
45228
45258
  onClick: function onClick() {
@@ -45554,7 +45584,7 @@ var VoiceItem = function VoiceItem(_ref) {
45554
45584
  color: voicePreviewTitleColor || textPrimary
45555
45585
  }, file.user && (file.user.id === user.id ? 'You' : makeUsername(contactsMap[file.user.id], file.user, getFromContacts))), /*#__PURE__*/React__default.createElement(AudioDate, {
45556
45586
  color: voicePreviewDateAndTimeColor || textSecondary
45557
- }, moment(file.createdAt).format('DD MMMM, YYYY')), /*#__PURE__*/React__default.createElement(AudioSendTime, {
45587
+ }, formatChannelDetailsDate(file.createdAt)), /*#__PURE__*/React__default.createElement(AudioSendTime, {
45558
45588
  color: textSecondary
45559
45589
  }, currentTime || (file.metadata.dur ? formatAudioVideoTime(file.metadata.dur) : ''))), /*#__PURE__*/React__default.createElement(Audio, {
45560
45590
  controls: true,
@@ -45585,7 +45615,7 @@ var AudioInfo = styled.div(_templateObject4$F || (_templateObject4$F = _taggedTe
45585
45615
  var AudioTitle = styled.span(_templateObject5$A || (_templateObject5$A = _taggedTemplateLiteralLoose(["\n display: block;\n font-style: normal;\n font-weight: 500;\n font-size: 15px;\n line-height: 20px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: calc(100% - 72px);\n color: ", ";\n"])), function (props) {
45586
45616
  return props.color;
45587
45617
  });
45588
- var AudioDate = styled.span(_templateObject6$v || (_templateObject6$v = _taggedTemplateLiteralLoose(["\n display: block;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: calc(100% - 72px);\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 16px;\n color: ", ";\n"])), function (props) {
45618
+ var AudioDate = styled.span(_templateObject6$v || (_templateObject6$v = _taggedTemplateLiteralLoose(["\n display: block;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: calc(100% - 72px);\n font-style: normal;\n font-weight: normal;\n font-size: 13px;\n line-height: 16px;\n color: ", ";\n"])), function (props) {
45589
45619
  return props.color;
45590
45620
  });
45591
45621
  var AudioSendTime = styled.span(_templateObject7$t || (_templateObject7$t = _taggedTemplateLiteralLoose(["\n position: absolute;\n right: 0;\n top: 11px;\n color: ", ";\n font-size: 12px;\n line-height: 16px;\n"])), function (props) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sceyt-chat-react-uikit",
3
- "version": "1.7.6-beta.11",
3
+ "version": "1.7.6-beta.13",
4
4
  "description": "Interactive React UI Components for Sceyt Chat.",
5
5
  "author": "Sceyt",
6
6
  "license": "MIT",