From f86f010a34e76996acd18b4603fab80c4a4cbd78 Mon Sep 17 00:00:00 2001 From: Knox Lively Date: Tue, 9 Apr 2024 22:14:42 -0600 Subject: [PATCH 1/2] updated the OpenAICloudCompletionTelemetryOffErrorMsg to include instructions for enabling telemetry (#564) --- wavesrv/pkg/cmdrunner/cmdrunner.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wavesrv/pkg/cmdrunner/cmdrunner.go b/wavesrv/pkg/cmdrunner/cmdrunner.go index c16e6502..e71637f7 100644 --- a/wavesrv/pkg/cmdrunner/cmdrunner.go +++ b/wavesrv/pkg/cmdrunner/cmdrunner.go @@ -86,8 +86,8 @@ const TsFormatStr = "2006-01-02 15:04:05" const OpenAIPacketTimeout = 10 * time.Second const OpenAIStreamTimeout = 5 * time.Minute +const OpenAICloudCompletionTelemetryOffErrorMsg = "To ensure responsible usage and prevent misuse, Wave AI requires telemetry to be enabled when using its free AI features.\n\nIf you prefer not to enable telemetry, you can still access Wave AI's features by providing your own OpenAI API key in the Settings menu. Please note that when using your personal API key, requests will be sent directly to the OpenAI API without being proxied through Wave's servers.\n\nIf you wish to continue using Wave AI's free features, you can easily enable telemetry by running the '/telemetry:on' command in the terminal. This will allow you to access the free AI features while helping to protect the platform from abuse." -const OpenAICloudCompletionTelemetryOffErrorMsg = "In order to protect against abuse, you must have telemetry turned on in order to use Wave's free AI features. If you do not want to turn telemetry on, you can still use Wave's AI features by adding your own OpenAI key in Settings. Note that when you use your own key, requests are not proxied through Wave's servers and will be sent directly to the OpenAI API." const ( KwArgRenderer = "renderer" From 5353f40a20614d8ab62f6cdf9382956cc1aa6326 Mon Sep 17 00:00:00 2001 From: Mike Sawka Date: Wed, 10 Apr 2024 22:15:11 -0700 Subject: [PATCH 2/2] new sidebar UI (#567) --- package.json | 4 +- src/app/app.tsx | 2 +- src/app/sidebar/right.less | 17 +++ src/app/sidebar/right.tsx | 36 +++++- src/app/sidebar/wavebook.tsx | 53 +++++++++ yarn.lock | 212 +++++++++++++++++++++++++++++++++++ 6 files changed, 320 insertions(+), 4 deletions(-) create mode 100644 src/app/sidebar/wavebook.tsx diff --git a/package.json b/package.json index 546a9d84..55ebfc17 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "appId": "dev.commandline.waveterm" }, "dependencies": { + "@lexical/react": "^0.14.3", "@monaco-editor/react": "^4.5.1", "@table-nav/core": "^0.0.7", "@table-nav/react": "^0.0.7", @@ -31,6 +32,7 @@ "electron-squirrel-startup": "^1.0.0", "electron-updater": "^6.1.8", "framer-motion": "^10.16.16", + "lexical": "^0.14.3", "mobx": "6.12", "mobx-react": "^7.5.0", "monaco-editor": "^0.44.0", @@ -50,8 +52,8 @@ "uuid": "^9.0.0", "winston": "^3.8.2", "xterm": "^5.3.0", - "xterm-addon-web-links": "^0.9.0", "xterm-addon-serialize": "^0.11.0", + "xterm-addon-web-links": "^0.9.0", "xterm-addon-webgl": "^0.16.0" }, "devDependencies": { diff --git a/src/app/app.tsx b/src/app/app.tsx index 684d04f6..d66cda18 100644 --- a/src/app/app.tsx +++ b/src/app/app.tsx @@ -146,7 +146,7 @@ class App extends React.Component<{}, {}> {
diff --git a/src/app/sidebar/right.less b/src/app/sidebar/right.less index f5a9bbb0..4c15fb3d 100644 --- a/src/app/sidebar/right.less +++ b/src/app/sidebar/right.less @@ -22,6 +22,23 @@ border-bottom: 1px solid var(--app-border-color); } + .rsb-modes { + display: flex; + flex-direction: row; + padding: 5px 10px; + gap: 5px; + border-bottom: 1px solid var(--app-border-color); + + .icon-container { + padding: 2px; + cursor: pointer; + } + + .icon-container:hover { + background-color: var(--app-selected-mask-color); + } + } + &.collapsed { display: none; } diff --git a/src/app/sidebar/right.tsx b/src/app/sidebar/right.tsx index 26191c3f..70f3a22c 100644 --- a/src/app/sidebar/right.tsx +++ b/src/app/sidebar/right.tsx @@ -1,14 +1,16 @@ -// Copyright 2023, Command Line Inc. +// Copyright 2023-2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 import * as React from "react"; import * as mobxReact from "mobx-react"; +import * as mobx from "mobx"; import dayjs from "dayjs"; import { If, For } from "tsx-control-statements/components"; import localizedFormat from "dayjs/plugin/localizedFormat"; import { GlobalModel } from "@/models"; import { ResizableSidebar, Button } from "@/elements"; +import { WaveBookDisplay } from "./wavebook"; import "./right.less"; @@ -55,6 +57,14 @@ class KeybindDevPane extends React.Component<{}, {}> { @mobxReact.observer class RightSideBar extends React.Component { + mode: OV = mobx.observable.box(null, { name: "RightSideBar-mode" }); + + setMode(mode: string) { + mobx.action(() => { + this.mode.set(mode); + })(); + } + render() { return ( { - +
+
+ +
this.setMode("keybind")} + > + +
+
+
this.setMode("wavebook")} + > + +
+
+ + + + )} diff --git a/src/app/sidebar/wavebook.tsx b/src/app/sidebar/wavebook.tsx new file mode 100644 index 00000000..8b4d7ee4 --- /dev/null +++ b/src/app/sidebar/wavebook.tsx @@ -0,0 +1,53 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +import * as React from "react"; +import * as mobxReact from "mobx-react"; +import * as mobx from "mobx"; +import { If, For } from "tsx-control-statements/components"; +import { GlobalModel } from "@/models"; + +import * as lexical from "lexical"; +import { AutoFocusPlugin } from "@lexical/react/LexicalAutoFocusPlugin"; +import { LexicalComposer } from "@lexical/react/LexicalComposer"; +import { RichTextPlugin } from "@lexical/react/LexicalRichTextPlugin"; +import { ContentEditable } from "@lexical/react/LexicalContentEditable"; +import { HistoryPlugin } from "@lexical/react/LexicalHistoryPlugin"; +import LexicalErrorBoundary from "@lexical/react/LexicalErrorBoundary"; +import { MarkdownShortcutPlugin } from "@lexical/react/LexicalMarkdownShortcutPlugin"; +import { $convertFromMarkdownString, $convertToMarkdownString, TRANSFORMERS } from "@lexical/markdown"; +import { CodeNode, CodeHighlightNode } from "@lexical/code"; +import { LinkNode } from "@lexical/link"; +import { ListNode, ListItemNode } from "@lexical/list"; +import { HeadingNode, QuoteNode } from "@lexical/rich-text"; +import { HorizontalRuleNode } from "@lexical/react/LexicalHorizontalRuleNode"; +import { KeybindManager } from "@/util/keyutil"; + +const theme = { + // Theme styling goes here +}; + +class WaveBookKeybindings extends React.Component<{}, {}> { + componentDidMount(): void { + const keybindManager = GlobalModel.keybindManager; + keybindManager.registerKeybinding("pane", "wavebook", "generic:confirm", (waveEvent) => { + return true; + }); + } + componentWillUnmount(): void { + const keybindManager = GlobalModel.keybindManager; + keybindManager.unregisterDomain("wavebook"); + } + render() { + return null; + } +} + +@mobxReact.observer +class WaveBookDisplay extends React.Component<{}, {}> { + render() { + return "playbooks"; + } +} + +export { WaveBookDisplay }; diff --git a/yarn.lock b/yarn.lock index 515fb593..c2ac9b96 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1743,6 +1743,13 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== +"@babel/runtime@^7.12.5": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" + integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/runtime@^7.8.4": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" @@ -1997,6 +2004,194 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== +"@lexical/clipboard@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/clipboard/-/clipboard-0.14.3.tgz#c759fddb384fbda7ecfd1a2e9dd9a304ee08ee76" + integrity sha512-kMasHJQCNSSdD6US8XF/GJEZAgdmIUIoqwcV/7Q8jVUICYT53bcr+Rh7RxL+1c7ZpJE2rXg5KTELsUPGjs0uwA== + dependencies: + "@lexical/html" "0.14.3" + "@lexical/list" "0.14.3" + "@lexical/selection" "0.14.3" + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/code@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/code/-/code-0.14.3.tgz#be7b7ebef5de9db3a88d939492084cda99f6f7c2" + integrity sha512-eBhs+TsJ5z7Vg/0e77bau86lN7R5nqO7effkPNNndn0XV2VSDpjMF+PTj4Cd1peenFlfqVivBr9gdewDrvPQng== + dependencies: + "@lexical/utils" "0.14.3" + lexical "0.14.3" + prismjs "^1.27.0" + +"@lexical/dragon@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/dragon/-/dragon-0.14.3.tgz#f9fb313daa04be4d04ead5fdd3cb46c54793955c" + integrity sha512-GTnt5a5Zs1f3q5Z9tC63VPzCFNAG+37ySHO+mQpVqlTsDmwSeJzFKGZyxq81tZXsKaXQZ4llc9K6I1f/XJoypw== + dependencies: + lexical "0.14.3" + +"@lexical/hashtag@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/hashtag/-/hashtag-0.14.3.tgz#c8ff80bfbbae901bbeb5e9685c27a0a10dac80d6" + integrity sha512-BlMhegitxNscJyM0QGjnzpt7QQaiftVf80dqfiVGdgFJi9hS4wrYEsPpA7jlsZG5Q46DSw/zMRp3tpHfdU6TCQ== + dependencies: + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/history@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/history/-/history-0.14.3.tgz#792252dc8932ff48139b9f4ca8d8c0e8b789cdde" + integrity sha512-I5Ssaz+uRYsFmqN5WfKCyTkPPV1CTnEQ21vuKp8PVI4hBdlIy5aJdeQXbQhg0BdCtQVSjpm7WRGMk5ATiAXLPw== + dependencies: + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/html@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/html/-/html-0.14.3.tgz#fe960afdc94232d5cec13a070bbb965b6d4bce66" + integrity sha512-ID4RdHdOXv2qIg6cqNhbYiqgcV5aEJFAV+zZ14CMpxPlW71tiRlmy/Pp4WqCFgjnZ2GZRq34+kag+cT2H69ILQ== + dependencies: + "@lexical/selection" "0.14.3" + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/link@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/link/-/link-0.14.3.tgz#7320f5eba82f451da9449a4b8c57fa60341938cb" + integrity sha512-txhuzcx2OfOtZ/fy9cgauDGW1gi2vSU0iQdde4i0UP2KK4ltioA9eFkjqAacGiPvwJ8w2CZV9q5Ck4DgFAKQ7w== + dependencies: + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/list@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/list/-/list-0.14.3.tgz#1b587e2c807465d1b50d0f09aedda58b7591a958" + integrity sha512-d9ZiEkZ34DpzBNq2GkedJpXF8sIxSQvHOGhNbVvTuBvgDcCwbmXL0KY4k+xu+jMScRO/3oR7C6YZpZT3GaUO+Q== + dependencies: + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/mark@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/mark/-/mark-0.14.3.tgz#b4f1606b9887e7b7f5ead57e325b7317d4662c0c" + integrity sha512-HegYMuiCazmM4XXVUzteA5bOFEiWxeIZSMK98rCV7t5czYlQmgaV5PWIT5/wLnSgrJA6apa02JHLINE9CuUHlw== + dependencies: + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/markdown@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/markdown/-/markdown-0.14.3.tgz#051ace914eafcc1c81e7834b09396a491a97be10" + integrity sha512-G97Twk0qq5Mkj7S95fFODN6D7nBZsHiXgd2QeCZQ+qbrItEsjEsM0vCtVBELpZzyl700ExfIJCA9eHrq28VNxw== + dependencies: + "@lexical/code" "0.14.3" + "@lexical/link" "0.14.3" + "@lexical/list" "0.14.3" + "@lexical/rich-text" "0.14.3" + "@lexical/text" "0.14.3" + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/offset@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/offset/-/offset-0.14.3.tgz#53dfa5ca3d32c3b02a036d43bf195cf37fbcf68c" + integrity sha512-xzyHLED9N3VPsLSpxs235W1xnh1xLl0SFqLLN9fkZs4fBLPtoPrzfYjjTMx6KgRPCa96GauAMsAaKn+JWHaD4g== + dependencies: + lexical "0.14.3" + +"@lexical/overflow@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/overflow/-/overflow-0.14.3.tgz#addb108ca69c12f5058c0ba705e1b9f789112bed" + integrity sha512-2PabHT5vCtfN1lx2d3j1AW6naGJEcjLyUxEMrPzqNZ8IDGuLbD3uRi/wS8evmFLgKkF5mqRnPPlpwGbqGg+qUw== + dependencies: + lexical "0.14.3" + +"@lexical/plain-text@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/plain-text/-/plain-text-0.14.3.tgz#9039f8635b0d79d32d3af0f95f2bbaa5e0256f86" + integrity sha512-Ct3sQmhc34Iuj0YWT5dlLzTcuCLAMx7uaLKb0lxb7A6bcUBPfC1eBv2KtILZ9eW/GEUCMTqYEnmixTY7vPR9AA== + dependencies: + "@lexical/clipboard" "0.14.3" + "@lexical/selection" "0.14.3" + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/react@^0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/react/-/react-0.14.3.tgz#eacbfc6bd8237aaafbc73daa655c0585b44c8256" + integrity sha512-sUgF7dStJTYvkS14QzlpB5XJ5p498JDSEBSADRsf0KOJsTINAQhh27vXuS8/I2FH3FanonH/RrLwSildL/FnzA== + dependencies: + "@lexical/clipboard" "0.14.3" + "@lexical/code" "0.14.3" + "@lexical/dragon" "0.14.3" + "@lexical/hashtag" "0.14.3" + "@lexical/history" "0.14.3" + "@lexical/link" "0.14.3" + "@lexical/list" "0.14.3" + "@lexical/mark" "0.14.3" + "@lexical/markdown" "0.14.3" + "@lexical/overflow" "0.14.3" + "@lexical/plain-text" "0.14.3" + "@lexical/rich-text" "0.14.3" + "@lexical/selection" "0.14.3" + "@lexical/table" "0.14.3" + "@lexical/text" "0.14.3" + "@lexical/utils" "0.14.3" + "@lexical/yjs" "0.14.3" + lexical "0.14.3" + react-error-boundary "^3.1.4" + +"@lexical/rich-text@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/rich-text/-/rich-text-0.14.3.tgz#92a26e5092af387c550c094df7a8353a8318f95b" + integrity sha512-o8wGvRDyPSRcfb6bauF5lzK5u/kzCW+hAQq0ExM1e8p4GHDb0vwz9DA6NH5D0BPHb2fUgknwClHOoJX95WUA8A== + dependencies: + "@lexical/clipboard" "0.14.3" + "@lexical/selection" "0.14.3" + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/selection@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/selection/-/selection-0.14.3.tgz#79b81dd8a9afeb442e180644dcde82d708b2c069" + integrity sha512-43EmqG6flLqFJJNZ7GCxFlx3qXy7osB3AQBgxKTthWtQeBrJPdgacctL1jhO7etTIQWP5C1DExy3opDLVKyDjg== + dependencies: + lexical "0.14.3" + +"@lexical/table@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/table/-/table-0.14.3.tgz#84df456c0565db2d18ef4e5fe2aa65cc1bff1b19" + integrity sha512-9btpU2lfAE34ucIqlMu5RiSVlxREXY7Zp+s26oFsXNoNPhW57iND96TrqwYo9FJl/6zXXfvqYxnUEcUD2dLgwQ== + dependencies: + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/text@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/text/-/text-0.14.3.tgz#8f868a6954e566db6348d541b68d024a739a3b88" + integrity sha512-7+B9KkA37iHTlPqt6GHdfBIoaA9dQfhKrQNP9+422/CO/adCru4S94yNxiHXFq7iCvgucfuFop9M8jOfqLQbBQ== + dependencies: + lexical "0.14.3" + +"@lexical/utils@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/utils/-/utils-0.14.3.tgz#dc5fe87282f77ad40b46b5d4aee148a9843ad939" + integrity sha512-coqG2AO7QhJCM0xBlYvtETjl0il9u4HQRuc8ye3j8jMfNadVvVVWO3Fodmm/8FTPyJuxIij1Ruma9zqhlAbN6Q== + dependencies: + "@lexical/list" "0.14.3" + "@lexical/selection" "0.14.3" + "@lexical/table" "0.14.3" + lexical "0.14.3" + +"@lexical/yjs@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/yjs/-/yjs-0.14.3.tgz#ac3773c4db2f589e5940ef9a409cc6f11e4c1fab" + integrity sha512-Ju+PQJg4NjQoNzfPlQKa6A71sjgGWj5lL4cbe+4xlNoknfK3NApVeznOi3xAM7rUCr6fPBAjzF9/uwfMXR451g== + dependencies: + "@lexical/offset" "0.14.3" + lexical "0.14.3" + "@malept/cross-spawn-promise@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" @@ -5328,6 +5523,11 @@ less@^4.1.2: needle "^3.1.0" source-map "~0.6.0" +lexical@0.14.3, lexical@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/lexical/-/lexical-0.14.3.tgz#81c41a4c585100192f6d330e81cc6013bf326f5e" + integrity sha512-LaWSKj6OpvJ+bdfQA2AybEzho0YoWfAdRGkuCtPNYd/uf7IHyoEwCFQsIBvWCQF23saDgE1NONR4uiwl6iaJ9g== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -6569,6 +6769,11 @@ prettier@^2.8.8: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +prismjs@^1.27.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -6689,6 +6894,13 @@ react-dom@^18.1.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-error-boundary@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.1.4.tgz#255db92b23197108757a888b01e5b729919abde0" + integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA== + dependencies: + "@babel/runtime" "^7.12.5" + react-is@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"