├── docs
├── logo.png
├── reply.gif
├── options.png
└── screenshot.png
├── icons
├── 128.png
├── 16.png
├── 32.png
├── 48.png
├── button.svg
└── button_error.svg
├── src
├── utils
│ └── wait.ts
├── settings
│ ├── components
│ │ ├── space.tsx
│ │ ├── text_input.tsx
│ │ ├── text.tsx
│ │ ├── selector.tsx
│ │ └── checkbox.tsx
│ ├── settings.tsx
│ ├── settings_screen.styled.ts
│ └── settings_screen.tsx
├── inject
│ ├── utils
│ │ └── generate_text.ts
│ ├── dom
│ │ ├── set_input_text.ts
│ │ ├── find_closest_input.ts
│ │ ├── create_observer.ts
│ │ └── add_gpt_button.ts
│ └── inject.ts
└── background
│ ├── background.ts
│ └── chat_gpt_client
│ ├── chat_gpt_client.ts
│ └── locales.ts
├── .gitignore
├── tsconfig.json
├── assets
├── unchecked.svg
├── checked.svg
└── settings.html
├── webpack.config.js
├── manifest.json
├── package.json
├── LICENCE
├── css
└── inject.css
├── README.MD
├── lib
├── background.js
└── inject.js
└── yarn.lock
/docs/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/docs/logo.png
--------------------------------------------------------------------------------
/docs/reply.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/docs/reply.gif
--------------------------------------------------------------------------------
/icons/128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/icons/128.png
--------------------------------------------------------------------------------
/icons/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/icons/16.png
--------------------------------------------------------------------------------
/icons/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/icons/32.png
--------------------------------------------------------------------------------
/icons/48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/icons/48.png
--------------------------------------------------------------------------------
/docs/options.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/docs/options.png
--------------------------------------------------------------------------------
/docs/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/docs/screenshot.png
--------------------------------------------------------------------------------
/src/utils/wait.ts:
--------------------------------------------------------------------------------
1 | export const wait = (timeout: number) => {
2 | return new Promise((res) => setTimeout(() => res(null), timeout));
3 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | npm-debug.log*
2 | yarn-debug.log*
3 | yarn-error.log*
4 |
5 | node_modules/
6 | .vscode
7 | .history
8 | */.DS_Store
9 | .DS_Store
10 | *.zip
--------------------------------------------------------------------------------
/src/settings/components/space.tsx:
--------------------------------------------------------------------------------
1 | import styled from "styled-components";
2 |
3 | export const Space = styled.div((props: { height: number }) => `
4 | height: ${props.height}px;
5 | `);
--------------------------------------------------------------------------------
/src/settings/settings.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import { createRoot } from 'react-dom/client';
3 | import { SettingsScreen } from './settings_screen';
4 |
5 | const root = createRoot(
6 | document.getElementById('root')!
7 | );
8 |
9 | root.render();
--------------------------------------------------------------------------------
/src/inject/utils/generate_text.ts:
--------------------------------------------------------------------------------
1 | import { TweetProps } from "../../background/chat_gpt_client/chat_gpt_client";
2 |
3 | export const generateText = (props: TweetProps): Promise => {
4 | return new Promise((resolve) => {
5 | chrome.runtime.sendMessage({type: 'generate_tweet', props}, response => resolve(response));
6 | });
7 | };
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ESNext",
4 | "moduleResolution": "node",
5 | "types": ["node", "chrome"],
6 | "jsx": "react",
7 | "allowJs": false,
8 | "removeComments": false,
9 | "strict": true,
10 | "skipLibCheck": true,
11 | },
12 | "include": ["src/**/*"],
13 | "exclude": ["node_modules"]
14 | }
15 |
--------------------------------------------------------------------------------
/src/settings/components/text_input.tsx:
--------------------------------------------------------------------------------
1 | import styled from "styled-components";
2 |
3 | export const TextInput = styled.input`
4 | box-sizing: border-box;
5 | width: 100%;
6 | height: 40px;
7 | padding: 0 10px;
8 | background: #FFFFFF;
9 | border: 1px solid #D1D9DD;
10 | color: #181C21;
11 | font-size: 15px;
12 | border-radius: 5px;
13 |
14 | ::placeholder {
15 | color: #D1D9DD;
16 | }
17 | `;
--------------------------------------------------------------------------------
/assets/unchecked.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
--------------------------------------------------------------------------------
/src/settings/components/text.tsx:
--------------------------------------------------------------------------------
1 | import styled from "styled-components";
2 |
3 | export const H1 = styled.h1`
4 | font-size: 25px;
5 | font-weight: bold;
6 | color: #181C21;
7 | margin: 0;
8 | `;
9 |
10 | export const H2 = styled.h2`
11 | font-size: 18px;
12 | font-weight: 600;
13 | color: #181C21;
14 | margin: 0;
15 | `
16 |
17 | export const Subtitle = styled.span`
18 | font-size: 15px;
19 | color: #566370;
20 |
21 | a {
22 | color: #566370;
23 | }
24 | `
--------------------------------------------------------------------------------
/assets/checked.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
--------------------------------------------------------------------------------
/assets/settings.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | TweetGPT Settings
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/inject/dom/set_input_text.ts:
--------------------------------------------------------------------------------
1 | export const setInputText = async (el: any, text: string) => {
2 | const dataTransfer = new DataTransfer();
3 |
4 | // this may be 'text/html' if it's required
5 | dataTransfer.setData("text/plain", text);
6 |
7 | el.dispatchEvent(
8 | new ClipboardEvent("paste", {
9 | clipboardData: dataTransfer,
10 |
11 | // need these for the event to reach Draft paste handler
12 | bubbles: true,
13 | cancelable: true,
14 | })
15 | );
16 |
17 | // clear DataTransfer Data
18 | dataTransfer.clearData();
19 | };
20 |
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | module.exports = {
4 | mode: "production",
5 | entry: {
6 | inject: "./src/inject/inject.ts",
7 | background: "./src/background/background.ts",
8 | settings: './src/settings/settings.tsx',
9 | },
10 | optimization: {
11 | minimize: false
12 | },
13 | output: {
14 | path: path.resolve(__dirname, './lib'),
15 | filename: "[name].js"
16 | },
17 | resolve: {
18 | extensions: [".ts", ".tsx", ".js"],
19 | },
20 | module: {
21 | rules: [
22 | {
23 | test: /\.tsx?$/,
24 | loader: "ts-loader"
25 | }
26 | ]
27 | }
28 | };
--------------------------------------------------------------------------------
/src/inject/dom/find_closest_input.ts:
--------------------------------------------------------------------------------
1 | // can be more optimised, but ¯\_(ツ)_/¯, typically common container is just 2-3 levels higher
2 | export const findClosestInput: (el: Element) => HTMLElement | null = (el) => {
3 | // Adjust the selector to target the contenteditable div
4 | const contentEditableEl = el.querySelector("div[data-testid^='tweetTextarea_'][contenteditable='true']") as HTMLElement;
5 | if (contentEditableEl) {
6 | return contentEditableEl;
7 | }
8 |
9 | // Recurse up the DOM tree if the element is not found
10 | if (!el.parentElement) {
11 | return null;
12 | } else {
13 | return findClosestInput(el.parentElement);
14 | }
15 | };
--------------------------------------------------------------------------------
/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "TweetGPT",
3 | "manifest_version": 3,
4 | "version": "2.0.3",
5 | "description": "Helps writing tweets using chatGPT",
6 | "permissions": [
7 | "storage",
8 | "scripting",
9 | "notifications"
10 | ],
11 | "host_permissions": [
12 | "https://twitter.com/",
13 | "https://api.openai.com/"
14 | ],
15 | "externally_connectable": {
16 | "matches": ["https://twitter.com/*"]
17 | },
18 | "icons": {
19 | "16": "icons/16.png",
20 | "32": "icons/32.png",
21 | "48": "icons/48.png",
22 | "128": "icons/128.png"
23 | },
24 | "background": {
25 | "service_worker": "lib/background.js"
26 | },
27 | "web_accessible_resources": [
28 | {
29 | "resources": ["icons/button.svg", "icons/button_error.svg", "assets/settings.html"],
30 | "matches": ["https://twitter.com/*"]
31 | }
32 | ]
33 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "twitter-gpt",
3 | "version": "2.0.1",
4 | "description": "A chrome extension that writes tweets with chatGPT",
5 | "main": "lib/background.js",
6 | "author": "Yaroslav https://twitter.com/512x512",
7 | "license": "MIT",
8 | "scripts": {
9 | "build": "yarn clean && webpack",
10 | "watch": "yarn clean && webpack -w",
11 | "clean": "rm -rf ./lib/*",
12 | "package": "rm -f ./extension.zip && yarn build && zip -r -X extension.zip *"
13 | },
14 | "dependencies": {
15 | "react": "^18.2.0",
16 | "react-dom": "^18.2.0",
17 | "styled-components": "^5.3.10",
18 | "typescript": "^4.9.3"
19 | },
20 | "devDependencies": {
21 | "@types/chrome": "^0.0.203",
22 | "@types/node": "^18.11.11",
23 | "@types/react": "^18.0.38",
24 | "@types/react-dom": "^18.0.11",
25 | "@types/styled-components": "^5.1.26",
26 | "ts-loader": "^9.4.2",
27 | "webpack": "^5.75.0",
28 | "webpack-cli": "^5.0.1"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/icons/button.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/src/settings/settings_screen.styled.ts:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components';
2 |
3 | export const Body = styled.div`
4 | display: flex;
5 | width: 100%;
6 | height: 100%;
7 | flex-direction: column;
8 | align-items: center;
9 | justify-content: flex-start;
10 | padding-top: 50px;
11 | background-color: #F7F9F9;
12 | font-family: 'Roboto', sans-serif;
13 | box-sizing: border-box;
14 | `;
15 |
16 | export const Container = styled.div`
17 | width: 600px;
18 | padding: 35px 25px;
19 | border-radius: 10px;
20 | background-color: white;
21 | display: flex;
22 | flex-direction: column;
23 | `;
24 |
25 |
26 | export const Logo = styled.img`
27 | width: 80px;
28 | height: 80px;
29 | margin-bottom: 25px;
30 | `;
31 |
32 | export const SettingsBlock = styled.div`
33 | width: 100%;
34 | margin-top: 25px;
35 | display: flex;
36 | justify-content: flex-start;
37 | align-items: flex-start;
38 | flex-direction: column;
39 | `;
40 |
--------------------------------------------------------------------------------
/LICENCE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Yaroslav Nazarov
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/src/inject/dom/create_observer.ts:
--------------------------------------------------------------------------------
1 | type ElementObserver = (
2 | selector: string,
3 | onInputAdded: (el: Element) => void,
4 | onInputRemoved: (el: Element) => void,
5 | ) => MutationObserver;
6 |
7 | export const createObserver: ElementObserver = (selector, onInputAdded, onInputRemoved) => {
8 | return new MutationObserver((mutations_list) => {
9 | mutations_list.forEach((mutation) => {
10 | const addedNodes = mutation.addedNodes as unknown as HTMLElement[]; // wrong typings
11 | addedNodes.forEach((added_node) => {
12 | if (added_node.querySelector) {
13 | const inputEl = added_node.querySelector(selector);
14 | if (!!inputEl) {
15 | onInputAdded(inputEl);
16 | };
17 | }
18 | });
19 |
20 | const removedNodes = mutation.removedNodes as unknown as HTMLElement[];
21 | removedNodes.forEach((removed_node) => {
22 | if (removed_node.querySelector) {
23 | const inputEl = removed_node.querySelector(selector);
24 | if (!!inputEl) {
25 | onInputRemoved(inputEl);
26 | };
27 | }
28 | });
29 | });
30 | });
31 | }
32 |
--------------------------------------------------------------------------------
/src/settings/components/selector.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import { FC } from "react";
3 | import styled from 'styled-components';
4 |
5 | export type languageOption = {
6 | value: string;
7 | label: string;
8 | }
9 |
10 | type Props = {
11 | value: string;
12 | onChange: (newVal: string) => void;
13 | options: languageOption[];
14 | };
15 |
16 | export const Selector: FC = ({ value, onChange, options }) => {
17 | return (
18 |
19 |
24 |
25 | )
26 | };
27 |
28 | const Container = styled.div`
29 | border: 1px solid #ccc;
30 | border-radius: 3px;
31 | padding-right: 10px;
32 | width: 100%;
33 | `;
34 |
35 | const Select = styled.select`
36 | border-radius: 3px;
37 | border-width: 0;
38 | padding: 7px 10px;
39 | font-size: 15px;
40 | font-family: 'Roboto', sans-serif;
41 | color: #333;
42 | cursor: pointer;
43 | outline: none;
44 | width: 100%;
45 | box-sizing: border-box;
46 | `;
--------------------------------------------------------------------------------
/icons/button_error.svg:
--------------------------------------------------------------------------------
1 |
19 |
--------------------------------------------------------------------------------
/css/inject.css:
--------------------------------------------------------------------------------
1 | .gptIconWrapper {
2 | min-width: 36px;
3 | min-height: 36px;
4 | border-radius: 100px;
5 | cursor: pointer;
6 | display: flex;
7 | justify-content: center;
8 | align-items: center;
9 | user-select: none;
10 | }
11 |
12 | .gptIconWrapper:hover {
13 | background-color: rgba(29, 155, 240, 0.1);
14 | }
15 |
16 | .gptIconWrapper.loading {
17 | animation: pulsate 1s linear infinite;
18 | pointer-events: none;
19 | cursor: default;
20 | background-color: transparent !important;
21 | }
22 |
23 | .gptIcon {
24 | max-height: 20px;
25 | max-width: 20px;
26 | }
27 |
28 | .gptIcon.error {
29 | animation: error 0.5s linear 2;
30 | }
31 |
32 | .gptSelector {
33 | cursor: pointer;
34 | padding: 10px 10px;
35 | }
36 |
37 | .gptSelector:hover {
38 | background-color: rgb(247, 249, 249);
39 | }
40 |
41 | .gptSeparator {
42 | height: 1px;
43 | width: 100%;
44 | background-color: rgba(0,0,0,0.05);
45 | }
46 |
47 | .gptSelectorContainer {
48 | position: absolute;
49 | z-index: 999999;
50 | font-family: TwitterChirp, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
51 | color: rgb(15, 20, 25);
52 | font-size: 15px;
53 | background-color: white;
54 | border-radius: 10px;
55 | overflow: hidden;
56 | box-shadow: rgb(101 119 134 / 20%) 0px 0px 15px, rgb(101 119 134 / 15%) 0px 0px 3px 1px;
57 | }
58 |
59 | @keyframes pulsate {
60 | from { opacity: 1; }
61 | 50% { opacity: 0.3; }
62 | to { opacity: 1; }
63 | }
64 |
65 | @keyframes error {
66 | from { transform: scale(1); }
67 | 50% { transform: scale(1.3); }
68 | to { transform: scale(1); }
69 | }
--------------------------------------------------------------------------------
/src/background/background.ts:
--------------------------------------------------------------------------------
1 | import { ChatGPTClient, TweetProps } from "./chat_gpt_client/chat_gpt_client";
2 |
3 | chrome.scripting.registerContentScripts([
4 | {
5 | id: `main_context_inject_${Math.random()}`,
6 | world: "ISOLATED",
7 | matches: ["https://twitter.com/*"],
8 | js: ["lib/inject.js"],
9 | css: ["css/inject.css"],
10 | },
11 | ]);
12 |
13 | chrome.runtime.onInstalled.addListener(function (object) {
14 | let internalUrl = chrome.runtime.getURL("assets/settings.html");
15 | chrome.tabs.create({ url: internalUrl });
16 | });
17 |
18 |
19 | const gptChat = new ChatGPTClient();
20 |
21 | type Message = {
22 | type: 'generate_tweet';
23 | props: TweetProps;
24 | }
25 |
26 | chrome.runtime.onMessage.addListener((message: Message, sender, sendResponse) => {
27 | if (!message.type) {
28 | return;
29 | }
30 |
31 | switch(message.type) {
32 | case 'generate_tweet':
33 | gptChat.generateTweet(message.props).then(
34 | async (text) => {
35 | if (!text) {
36 | return sendResponse(undefined);
37 | }
38 |
39 | let finalText = text;
40 | const savedSettings = await chrome.storage.local.get('isAddSignature')
41 | const isAddSignature = savedSettings.isAddSignature ?? true;
42 | if (isAddSignature) {
43 | finalText = text + ' — tweetGPT';
44 | }
45 | sendResponse(finalText);
46 | },
47 | () => sendResponse(undefined)
48 | );
49 | break;
50 | }
51 |
52 | return true;
53 | });
--------------------------------------------------------------------------------
/src/settings/components/checkbox.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import { FC } from "react";
3 | import styled from "styled-components";
4 |
5 | type Props = {
6 | value: boolean;
7 | label: string;
8 | onChange: (newVal: boolean) => void;
9 | }
10 |
11 | const icons = {
12 | checked: chrome.runtime.getURL("assets/checked.svg"),
13 | uncheked: chrome.runtime.getURL("assets/unchecked.svg"),
14 | };
15 |
16 | export const Checkbox: FC = ({ value, label, onChange}) => {
17 | const src = value && icons.checked || icons.uncheked;
18 |
19 | return (
20 | onChange(!value)}>
21 |
22 |
23 |
24 |
25 |
26 |
27 | )
28 | }
29 |
30 | const Container = styled.div`
31 | cursor: pointer;
32 |
33 | .iconContainer {
34 | /* padding: 10px; */
35 | border-radius: 3px;
36 | float:left;
37 | position: relative;
38 | }
39 |
40 | &:hover {
41 | .iconContainer {
42 | outline: 5px solid rgba(0,0,0,0.07);
43 | }
44 | }
45 | `
46 |
47 | const CheckboxSquare = styled.input`
48 | position: absolute;
49 | left: 0;
50 | top: 0;
51 | width: 100%;
52 | height: 100%;
53 | margin: 0;
54 | opacity: 0;
55 | cursor: pointer;
56 | `
57 |
58 | const Icon = styled.img`
59 | width: 18px;
60 | height: 18px;
61 | `
62 |
63 |
64 | const Label = styled.label`
65 | margin-left: 10px;
66 | font-size: 15px;
67 | cursor: pointer;
68 | color: #181C21;
69 | user-select: none;
70 | `
--------------------------------------------------------------------------------
/README.MD:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Archived
4 | This open-source version of the extension is no longer supported. You can install the proprietary version from https://typebar.app
5 |
6 | # tweetGPT Chrome Extension - Community Edition
7 | This is an open-source edition of the [TweetGPT chrome extension](https://chrome.google.com/webstore/detail/tweetgpt/lkjblpoingopdeaofcaapmeoojjjnhnc). It doesn't use TweetGPT backend and only relies on your own OpenAI API credentials.
8 |
9 | ## Requirements
10 | To use this extension, will you need:
11 | * Twitter account
12 | * OpenAI [API KEY](https://platform.openai.com/account/api-keys)
13 | * Chrome browser
14 |
15 | ## Installation
16 | 1. Clone this repo to your machine
17 | 2. Open [chrome://extensions/](chrome://extensions/) in your browser
18 | 3. Check the box for Developer mode in the top right
19 | 4. Press __Load Unpacked__ button and select the folder with the code
20 | 5. The settings screen should open, where you need to put your OpenAI API Key. You can find your API key on [this page](https://platform.openai.com/account/api-keys).
21 |
22 | You can start using the extension now.
23 |
24 |
25 | ## How to use tweetGPT
26 | When you open a new tab with Twitter, you will see this icon under the tweet section:
27 |
28 |
29 |
30 | When you press it, it will let you select a type of tweet to generate. The types include positive, negative, controversial, etc.
31 |
32 |
33 |
34 | Once selected, the extension will write a new tweet.
35 |
36 | For a reply, it will generate a tweet based on the original tweet. For a new tweet, it will ask for a topic you want to write tweet about.
37 |
38 |
39 |
40 | ## ⚠️ Warning
41 | Depending on the tweet type, TweetGPT can sometimes generate controversial or even offensive tweets.
42 | Remember, this is like an L2 autopilot - the driver is responsible for the outcome. Don't tweet what you disagree with, just re-generate the tweet instead.
43 |
--------------------------------------------------------------------------------
/src/inject/inject.ts:
--------------------------------------------------------------------------------
1 | import { addGPTButton, showErrorButton } from "./dom/add_gpt_button";
2 | import { createObserver } from "./dom/create_observer";
3 | import { findClosestInput } from "./dom/find_closest_input";
4 | import { generateText } from "./utils/generate_text";
5 | import { setInputText } from "./dom/set_input_text";
6 | import { defaultLocale } from "../background/chat_gpt_client/locales";
7 | const onToolBarAdded = (toolBarEl: Element) => {
8 | let inputEl = findClosestInput(toolBarEl);
9 | if (inputEl) {
10 | addGPTButton(toolBarEl, async (type: string, topic?: string) => {
11 | (toolBarEl as HTMLDivElement).click();
12 | const replyToTweet = document.querySelector("article[data-testid=\"tweet\"][tabindex=\"-1\"]");
13 | let replyTo: string | undefined = undefined;
14 | if (!!replyToTweet) {
15 | const textEl = replyToTweet.querySelector("div[data-testid=\"tweetText\"]");
16 | if (!textEl || !textEl.textContent) {
17 | showErrorButton(toolBarEl);
18 | return;
19 | }
20 |
21 | replyTo = textEl.textContent;
22 | }
23 |
24 | const text = await generateText({
25 | locale: (await chrome.storage.local.get('language')).language ?? defaultLocale,
26 | type,
27 | replyTo,
28 | topic
29 | });
30 | if (text) {
31 | inputEl = findClosestInput(toolBarEl);
32 | if (inputEl) {
33 | setInputText(inputEl, text);
34 | }
35 | } else { // show error
36 | showErrorButton(toolBarEl);
37 | }
38 | });
39 | }
40 | }
41 |
42 | const onToolBarRemoved = (toolBarEl: Element) => {}
43 |
44 | // observe dom tree to detect all tweet inputs once they are created
45 | const toolbarObserver = createObserver("div[data-testid=\"toolBar\"]", onToolBarAdded, onToolBarRemoved);
46 | const reactRoot = document.querySelector("#react-root") as unknown as Node;
47 | toolbarObserver.observe(reactRoot, { subtree: true, childList: true });
--------------------------------------------------------------------------------
/src/background/chat_gpt_client/chat_gpt_client.ts:
--------------------------------------------------------------------------------
1 | const GPT_TOKEN_NAME = 'openAIToken';
2 |
3 | export type TweetProps = {
4 | type: string,
5 | topic?: string,
6 | locale: string,
7 | replyTo?: string,
8 | }
9 |
10 | export class ChatGPTClient {
11 | waitForTokenCallback: ((newGptToken: string) => void) | undefined;
12 | async generateTweet(props: TweetProps): Promise {
13 | const token = await this.getToken();
14 |
15 | if (!token) {
16 | return Promise.reject();
17 | }
18 |
19 | const systemMessage = `You are a ghostwriter for users tweets. Use locale "${props.locale}". Return only one tweet. Keep it short.`;
20 | const systemMessage2 =
21 | "Exclude everything after the tweet. Exclude hashtags. Exclude emojis. Don't apologize. Don't provide translation. Don't provide notes. Exclude сalls to action.";
22 | const userMessage = `Write a ${props.type} tweet${
23 | props.topic ? ` about ${props.topic}` : ""
24 | }${props.replyTo ? ` in reply to a tweet "${props.replyTo}"` : ""}`;
25 |
26 | const body = {
27 | stream: false,
28 | model: "gpt-3.5-turbo",
29 | messages: [
30 | { role: "system", content: systemMessage },
31 | { role: "system", content: systemMessage2 },
32 | { role: "user", content: userMessage },
33 | ],
34 | };
35 |
36 | try {
37 | const response = await fetch(`https://api.openai.com/v1/chat/completions`, {
38 | method: 'POST',
39 | headers: {
40 | 'Content-Type': 'application/json',
41 | 'authorization': `Bearer ${token}`,
42 | },
43 | body: JSON.stringify(body),
44 | });
45 |
46 | if (response.status === 403) {
47 | await chrome.storage.local.remove(GPT_TOKEN_NAME)
48 | }
49 |
50 | if (response.status !== 200) {
51 | console.error(JSON.stringify(response.body));
52 | chrome.notifications.create(
53 | "TextGenerationError",
54 | {
55 | type: 'basic',
56 | iconUrl: "./icons/32.png",
57 | title: 'Error',
58 | message: JSON.stringify(response.body),
59 | priority: 2,
60 | }
61 | );
62 | return Promise.reject();
63 | }
64 |
65 | const responseJSON = await response.json();
66 | const tweet = responseJSON?.choices[0].message?.content || '';
67 | return tweet.trim()
68 | .replace(/^\"/g, "")
69 | .replace(/\"$/g, "")
70 | .trim();
71 | } catch(e) {
72 | console.error(e);
73 | return Promise.reject();
74 | }
75 | }
76 |
77 | getTextFromResponse(response: string): string {
78 | const message = JSON.parse(response);
79 | let tweet = message?.message?.content?.parts[0] || '';
80 | tweet = tweet.trim().replace(/"([^"]*)[#"]?/g, '$1');
81 |
82 | return tweet;
83 | }
84 |
85 | async getToken(): Promise {
86 | const result = await chrome.storage.local.get(GPT_TOKEN_NAME);
87 |
88 | if (!result[GPT_TOKEN_NAME]) {
89 | let internalUrl = chrome.runtime.getURL("assets/settings.html");
90 | chrome.tabs.create({ url: internalUrl });
91 | }
92 |
93 | return result[GPT_TOKEN_NAME];
94 | }
95 | }
--------------------------------------------------------------------------------
/src/settings/settings_screen.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import { useMemo, useEffect, useState, useCallback } from 'react';
3 | import { Body, Container, Logo, SettingsBlock } from './settings_screen.styled';
4 | import { Checkbox } from './components/checkbox';
5 | import { Selector, languageOption } from './components/selector';
6 | import { TextInput } from './components/text_input';
7 | import { H1, H2, Subtitle } from './components/text';
8 | import { Space } from './components/space';
9 | import { locales } from '../background/chat_gpt_client/locales';
10 | import { defaultLocale } from '../background/chat_gpt_client/locales';
11 |
12 | export const SettingsScreen = () => {
13 | const logoPath = useMemo(() => chrome.runtime.getURL('icons/128.png'), []);
14 | const [openAIToken, setOpenAIToken] = useState('');
15 | const [selectedLanguage, setLanguage] = useState(defaultLocale);
16 | const [isAddSignature, setAddSignature] = useState(true);
17 | const [isAddTopicForReplies, setTopicForReplies] = useState(false);
18 |
19 | const changeOpenAIToken = useCallback(async (newToken: string) => {
20 | await chrome.storage.local.set({ openAIToken: newToken });
21 | setOpenAIToken(newToken);
22 | }, []);
23 |
24 | const changeSignature = useCallback(async (isNewAddSignature: boolean) => {
25 | console.log('>>>', isNewAddSignature);
26 | await chrome.storage.local.set({ isAddSignature: isNewAddSignature });
27 | setAddSignature(isNewAddSignature);
28 | }, []);
29 |
30 | const changeTopic = useCallback(async (isAddTopicForReplies: boolean) => {
31 | await chrome.storage.local.set({ isAddTopicForReplies });
32 | setTopicForReplies(isAddTopicForReplies);
33 | }, []);
34 |
35 | const changeLanguage = useCallback(async (language: string) => {
36 | await chrome.storage.local.set({ language });
37 | setLanguage(language);
38 | }, []);
39 |
40 | useEffect(() => {
41 | chrome.storage.local.get(['language', 'isAddSignature', 'isAddTopicForReplies', 'openAIToken']).then((state) => {
42 | if (state['language']) {
43 | setLanguage(state['language']);
44 | }
45 | if (state['isAddSignature'] != null) {
46 | setAddSignature(state['isAddSignature']);
47 | }
48 | if (state['isAddTopicForReplies'] != null) {
49 | setTopicForReplies(state['isAddTopicForReplies']);
50 | }
51 | if (state['openAIToken']) {
52 | setOpenAIToken(state['openAIToken']);
53 | }
54 | });
55 | }, []);
56 |
57 | const languageOptions: languageOption[] = useMemo(() =>{
58 | const codes = Object.keys(locales);
59 |
60 | return codes.map(code => ({
61 | value: code,
62 | label: locales[code][0]
63 | }));
64 | }, []);
65 |
66 | const warning = useMemo(() => {
67 | return openAIToken.length === 0 ? '⚠️' : '';
68 | }, [openAIToken === '']);
69 |
70 | return (
71 |
72 |
73 |
74 | TweetGPT Settings
75 |
76 | OpenAI API Token {warning}
77 |
78 | Required. You can find your Secret API key in your OpenAI User settings.
79 |
80 | changeOpenAIToken(e.target.value)}/>
81 |
82 |
83 | Text Generation
84 |
85 |
86 |
87 |
88 |
89 |
90 | Language
91 |
92 |
93 |
94 |
95 |
96 | )
97 | };
--------------------------------------------------------------------------------
/src/background/chat_gpt_client/locales.ts:
--------------------------------------------------------------------------------
1 | export const locales: Record = {
2 | "af-ZA": [
3 | "Afrikaans",
4 | "Afrikaans"
5 | ],
6 | "ar": [
7 | "العربية",
8 | "Arabic"
9 | ],
10 | "bg-BG": [
11 | "Български",
12 | "Bulgarian"
13 | ],
14 | "ca-AD": [
15 | "Català",
16 | "Catalan"
17 | ],
18 | "cs-CZ": [
19 | "Čeština",
20 | "Czech"
21 | ],
22 | "cy-GB": [
23 | "Cymraeg",
24 | "Welsh"
25 | ],
26 | "da-DK": [
27 | "Dansk",
28 | "Danish"
29 | ],
30 | "de-AT": [
31 | "Deutsch (Österreich)",
32 | "German (Austria)"
33 | ],
34 | "de-CH": [
35 | "Deutsch (Schweiz)",
36 | "German (Switzerland)"
37 | ],
38 | "de-DE": [
39 | "Deutsch (Deutschland)",
40 | "German (Germany)"
41 | ],
42 | "el-GR": [
43 | "Ελληνικά",
44 | "Greek"
45 | ],
46 | "en-GB": [
47 | "English (UK)",
48 | "English (UK)"
49 | ],
50 | "en-US": [
51 | "English (US)",
52 | "English (US)"
53 | ],
54 | "es-CL": [
55 | "Español (Chile)",
56 | "Spanish (Chile)"
57 | ],
58 | "es-ES": [
59 | "Español (España)",
60 | "Spanish (Spain)"
61 | ],
62 | "es-MX": [
63 | "Español (México)",
64 | "Spanish (Mexico)"
65 | ],
66 | "et-EE": [
67 | "Eesti keel",
68 | "Estonian"
69 | ],
70 | "eu": [
71 | "Euskara",
72 | "Basque"
73 | ],
74 | "fa-IR": [
75 | "فارسی",
76 | "Persian"
77 | ],
78 | "fi-FI": [
79 | "Suomi",
80 | "Finnish"
81 | ],
82 | "fr-CA": [
83 | "Français (Canada)",
84 | "French (Canada)"
85 | ],
86 | "fr-FR": [
87 | "Français (France)",
88 | "French (France)"
89 | ],
90 | "he-IL": [
91 | "עברית",
92 | "Hebrew"
93 | ],
94 | "hi-IN": [
95 | "हिंदी",
96 | "Hindi"
97 | ],
98 | "hr-HR": [
99 | "Hrvatski",
100 | "Croatian"
101 | ],
102 | "hu-HU": [
103 | "Magyar",
104 | "Hungarian"
105 | ],
106 | "id-ID": [
107 | "Bahasa Indonesia",
108 | "Indonesian"
109 | ],
110 | "is-IS": [
111 | "Íslenska",
112 | "Icelandic"
113 | ],
114 | "it-IT": [
115 | "Italiano",
116 | "Italian"
117 | ],
118 | "ja-JP": [
119 | "日本語",
120 | "Japanese"
121 | ],
122 | "km-KH": [
123 | "ភាសាខ្មែរ",
124 | "Khmer"
125 | ],
126 | "ko-KR": [
127 | "한국어",
128 | "Korean"
129 | ],
130 | "la": [
131 | "Latina",
132 | "Latin"
133 | ],
134 | "lt-LT": [
135 | "Lietuvių kalba",
136 | "Lithuanian"
137 | ],
138 | "lv-LV": [
139 | "Latviešu",
140 | "Latvian"
141 | ],
142 | "mn-MN": [
143 | "Монгол",
144 | "Mongolian"
145 | ],
146 | "nb-NO": [
147 | "Norsk bokmål",
148 | "Norwegian (Bokmål)"
149 | ],
150 | "nl-NL": [
151 | "Nederlands",
152 | "Dutch"
153 | ],
154 | "nn-NO": [
155 | "Norsk nynorsk",
156 | "Norwegian (Nynorsk)"
157 | ],
158 | "pl-PL": [
159 | "Polski",
160 | "Polish"
161 | ],
162 | "pt-BR": [
163 | "Português (Brasil)",
164 | "Portuguese (Brazil)"
165 | ],
166 | "pt-PT": [
167 | "Português (Portugal)",
168 | "Portuguese (Portugal)"
169 | ],
170 | "ro-RO": [
171 | "Română",
172 | "Romanian"
173 | ],
174 | "ru-RU": [
175 | "Русский",
176 | "Russian"
177 | ],
178 | "sk-SK": [
179 | "Slovenčina",
180 | "Slovak"
181 | ],
182 | "sl-SI": [
183 | "Slovenščina",
184 | "Slovenian"
185 | ],
186 | "sr-RS": [
187 | "Српски / Srpski",
188 | "Serbian"
189 | ],
190 | "sv-SE": [
191 | "Svenska",
192 | "Swedish"
193 | ],
194 | "th-TH": [
195 | "ไทย",
196 | "Thai"
197 | ],
198 | "tr-TR": [
199 | "Türkçe",
200 | "Turkish"
201 | ],
202 | "uk-UA": [
203 | "Українська",
204 | "Ukrainian"
205 | ],
206 | "ur-PK": [
207 | "اردو",
208 | "Urdu"
209 | ],
210 | "vi-VN": [
211 | "Tiếng Việt",
212 | "Vietnamese"
213 | ],
214 | "zh-CN": [
215 | "中文 (中国大陆)",
216 | "Chinese (PRC)"
217 | ],
218 | "zh-TW": [
219 | "中文 (台灣)",
220 | "Chinese (Taiwan)"
221 | ]
222 | };
223 |
224 | export const defaultLocale = 'en-US';
--------------------------------------------------------------------------------
/lib/background.js:
--------------------------------------------------------------------------------
1 | /******/ (() => { // webpackBootstrap
2 | /******/ "use strict";
3 | var __webpack_exports__ = {};
4 |
5 | ;// CONCATENATED MODULE: ./src/background/chat_gpt_client/chat_gpt_client.ts
6 | const GPT_TOKEN_NAME = 'openAIToken';
7 | class ChatGPTClient {
8 | waitForTokenCallback;
9 | async generateTweet(props) {
10 | const token = await this.getToken();
11 | if (!token) {
12 | return Promise.reject();
13 | }
14 | const systemMessage = `You are a ghostwriter for users tweets. Use locale "${props.locale}". Return only one tweet. Keep it short.`;
15 | const systemMessage2 = "Exclude everything after the tweet. Exclude hashtags. Exclude emojis. Don't apologize. Don't provide translation. Don't provide notes. Exclude сalls to action.";
16 | const userMessage = `Write a ${props.type} tweet${props.topic ? ` about ${props.topic}` : ""}${props.replyTo ? ` in reply to a tweet "${props.replyTo}"` : ""}`;
17 | const body = {
18 | stream: false,
19 | model: "gpt-3.5-turbo",
20 | messages: [
21 | { role: "system", content: systemMessage },
22 | { role: "system", content: systemMessage2 },
23 | { role: "user", content: userMessage },
24 | ],
25 | };
26 | try {
27 | const response = await fetch(`https://api.openai.com/v1/chat/completions`, {
28 | method: 'POST',
29 | headers: {
30 | 'Content-Type': 'application/json',
31 | 'authorization': `Bearer ${token}`,
32 | },
33 | body: JSON.stringify(body),
34 | });
35 | if (response.status === 403) {
36 | await chrome.storage.local.remove(GPT_TOKEN_NAME);
37 | }
38 | if (response.status !== 200) {
39 | console.error(response.body);
40 | chrome.notifications.create("TextGenerationError", {
41 | type: 'basic',
42 | iconUrl: "./icons/32.png",
43 | title: 'Error',
44 | message: JSON.stringify(response.body),
45 | priority: 2,
46 | });
47 | return Promise.reject();
48 | }
49 | const responseJSON = await response.json();
50 | const tweet = responseJSON?.choices[0].message?.content || '';
51 | return tweet.trim()
52 | .replace(/^\"/g, "")
53 | .replace(/\"$/g, "")
54 | .trim();
55 | }
56 | catch (e) {
57 | console.error(e);
58 | return Promise.reject();
59 | }
60 | }
61 | getTextFromResponse(response) {
62 | const message = JSON.parse(response);
63 | let tweet = message?.message?.content?.parts[0] || '';
64 | tweet = tweet.trim().replace(/"([^"]*)[#"]?/g, '$1');
65 | return tweet;
66 | }
67 | async getToken() {
68 | const result = await chrome.storage.local.get(GPT_TOKEN_NAME);
69 | if (!result[GPT_TOKEN_NAME]) {
70 | let internalUrl = chrome.runtime.getURL("assets/settings.html");
71 | chrome.tabs.create({ url: internalUrl });
72 | }
73 | return result[GPT_TOKEN_NAME];
74 | }
75 | }
76 |
77 | ;// CONCATENATED MODULE: ./src/background/background.ts
78 |
79 | chrome.scripting.registerContentScripts([
80 | {
81 | id: `main_context_inject_${Math.random()}`,
82 | world: "ISOLATED",
83 | matches: ["https://twitter.com/*"],
84 | js: ["lib/inject.js"],
85 | css: ["css/inject.css"],
86 | },
87 | ]);
88 | chrome.runtime.onInstalled.addListener(function (object) {
89 | let internalUrl = chrome.runtime.getURL("assets/settings.html");
90 | chrome.tabs.create({ url: internalUrl });
91 | });
92 | const gptChat = new ChatGPTClient();
93 | chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
94 | if (!message.type) {
95 | return;
96 | }
97 | switch (message.type) {
98 | case 'generate_tweet':
99 | gptChat.generateTweet(message.props).then(async (text) => {
100 | if (!text) {
101 | return sendResponse(undefined);
102 | }
103 | let finalText = text;
104 | const savedSettings = await chrome.storage.local.get('isAddSignature');
105 | const isAddSignature = savedSettings.isAddSignature ?? true;
106 | if (isAddSignature) {
107 | finalText = text + ' — tweetGPT';
108 | }
109 | sendResponse(finalText);
110 | }, () => sendResponse(undefined));
111 | break;
112 | }
113 | return true;
114 | });
115 |
116 | /******/ })()
117 | ;
--------------------------------------------------------------------------------
/src/inject/dom/add_gpt_button.ts:
--------------------------------------------------------------------------------
1 | import { wait } from "../../utils/wait";
2 |
3 | const gptIconSrc = chrome.runtime.getURL("icons/button.svg");
4 | const gptIconErrorSrc = chrome.runtime.getURL("icons/button_error.svg");
5 | const tweetTypes: Array<{ emoji: string; type: string; }> = [
6 | {emoji: '👍', type: 'supportive'},
7 | {emoji: '🎩', type: 'snarky'},
8 | {emoji: '🌤️', type: 'optimistic'},
9 | {emoji: '🔥', type: 'controversial'},
10 | {emoji: '🤩', type: 'excited'},
11 | {emoji: '🧠', type: 'smart'},
12 | {emoji: '🤠', type: 'hillbilly'},
13 | {emoji: '🏴☠️', type: 'pirate'},
14 | {emoji: '🤣', type: 'humorous'},
15 | {emoji: '🙄', type: 'passive aggressive'}
16 | ];
17 |
18 | export const addGPTButton = async (toolbarEl: Element, onClick: (type: string, topic?: string) => Promise) => {
19 | addGPTButtonWithType(toolbarEl, onClick);
20 | }
21 |
22 | const maybeReturnTopic = async (): Promise => {
23 | const replyState = await chrome.storage.local.get('isAddTopicForReplies');
24 | const isAddTopicForReplies = replyState.isAddTopicForReplies ?? false;
25 |
26 | const lastState = await chrome.storage.local.get('lastTopic');
27 | const lastTopic = lastState.lastTopic ?? '';
28 |
29 | const replyToTweet = document.querySelector("article[data-testid=\"tweet\"][tabindex=\"-1\"]");
30 |
31 | let topic: string | undefined;
32 |
33 | if (!replyToTweet || isAddTopicForReplies) {
34 | topic = window.prompt("What do you want to tweet about?", lastTopic) || 'Twitter';
35 | await chrome.storage.local.set({'lastTopic': topic});
36 | }
37 |
38 | return topic;
39 | }
40 |
41 | const addGPTButtonWithType = (toolbarEl: Element, onClick: (type: string, topic?: string) => Promise) => {
42 | const doc = new DOMParser().parseFromString(`
43 |
46 | `, "text/html");
47 | const iconWrap = doc.querySelector("div[id=\"gptButton\"]")! as HTMLDivElement;
48 |
49 | const buttonContainer = toolbarEl.children[0];
50 |
51 | // attach to container
52 | buttonContainer.appendChild(iconWrap);
53 |
54 | iconWrap.onclick = async () => {
55 | const topic = await maybeReturnTopic();
56 | const bodyRect = document.body.getBoundingClientRect();
57 | const elemRect = iconWrap.getBoundingClientRect();
58 |
59 | const top = elemRect.top - bodyRect.top;
60 | const left = elemRect.left - bodyRect.left + 40;
61 | let optionsList: HTMLDivElement;
62 | let dismissHandler: GlobalEventHandlers["onclick"];
63 | optionsList = createOptionsList(async (type: string) => {
64 | if (dismissHandler) {
65 | document.body.removeEventListener('click', dismissHandler);
66 | }
67 | if (optionsList) {
68 | optionsList.remove();
69 | }
70 |
71 | iconWrap.classList.add("loading");
72 | await onClick(type, topic);
73 | iconWrap.classList.remove("loading");
74 | });
75 |
76 | // adding settings button
77 | const separator = document.createElement("div");
78 | separator.classList.add("gptSeparator");
79 | optionsList.appendChild(separator);
80 | const item = document.createElement("div");
81 | item.classList.add("gptSelector");
82 | item.innerHTML = `⚙️ Settings`;
83 | item.onclick = (e) => {
84 | e.stopPropagation();
85 | const url = chrome.runtime.getURL("assets/settings.html");
86 | window.open(url, '_blank')?.focus();
87 | };
88 | optionsList.appendChild(item);
89 |
90 |
91 | optionsList.style.left = `${left}px`;
92 | optionsList.style.top = `${top}px`;
93 |
94 | document.body.appendChild(optionsList);
95 | dismissHandler = () => {
96 | if (dismissHandler) {
97 | document.body.removeEventListener('click', dismissHandler);
98 | }
99 | if (optionsList) {
100 | optionsList.remove();
101 | }
102 | };
103 |
104 | window.setTimeout(() => {
105 | document.body.addEventListener('click', dismissHandler!);
106 | }, 1);
107 | }
108 | }
109 |
110 | const createOptionsList = (onClick: (type: string) => Promise) => {
111 | const container = document.createElement("div");
112 | container.classList.add("gptSelectorContainer");
113 |
114 | for(const tt of tweetTypes) {
115 | const item = document.createElement("div");
116 | item.classList.add("gptSelector");
117 | item.innerHTML = `${tt.emoji} ${tt.type}`;
118 | item.onclick = (e) => {
119 | e.stopPropagation();
120 | onClick(tt.type);
121 | };
122 | container.appendChild(item);
123 | }
124 |
125 | return container;
126 | }
127 |
128 | export const showErrorButton = async (toolbarEl: Element) => {
129 | const gptIcon = toolbarEl.querySelector(".gptIcon");
130 | if (gptIcon) {
131 | gptIcon.setAttribute("src", gptIconErrorSrc);
132 | gptIcon.classList.add("error");
133 | }
134 | await wait(5000);
135 | gptIcon?.setAttribute("src", gptIconSrc);
136 | gptIcon?.classList.remove("error");
137 | }
--------------------------------------------------------------------------------
/lib/inject.js:
--------------------------------------------------------------------------------
1 | /******/ (() => { // webpackBootstrap
2 | /******/ "use strict";
3 | var __webpack_exports__ = {};
4 |
5 | ;// CONCATENATED MODULE: ./src/utils/wait.ts
6 | const wait = (timeout) => {
7 | return new Promise((res) => setTimeout(() => res(null), timeout));
8 | };
9 |
10 | ;// CONCATENATED MODULE: ./src/inject/dom/add_gpt_button.ts
11 |
12 | const gptIconSrc = chrome.runtime.getURL("icons/button.svg");
13 | const gptIconErrorSrc = chrome.runtime.getURL("icons/button_error.svg");
14 | const tweetTypes = [
15 | { emoji: '👍', type: 'supportive' },
16 | { emoji: '🎩', type: 'snarky' },
17 | { emoji: '🌤️', type: 'optimistic' },
18 | { emoji: '🔥', type: 'controversial' },
19 | { emoji: '🤩', type: 'excited' },
20 | { emoji: '🧠', type: 'smart' },
21 | { emoji: '🤠', type: 'hillbilly' },
22 | { emoji: '🏴☠️', type: 'pirate' },
23 | { emoji: '🤣', type: 'humorous' },
24 | { emoji: '🙄', type: 'passive aggressive' }
25 | ];
26 | const addGPTButton = async (toolbarEl, onClick) => {
27 | addGPTButtonWithType(toolbarEl, onClick);
28 | };
29 | const maybeReturnTopic = async () => {
30 | const replyState = await chrome.storage.local.get('isAddTopicForReplies');
31 | const isAddTopicForReplies = replyState.isAddTopicForReplies ?? false;
32 | const lastState = await chrome.storage.local.get('lastTopic');
33 | const lastTopic = lastState.lastTopic ?? '';
34 | const replyToTweet = document.querySelector("article[data-testid=\"tweet\"][tabindex=\"-1\"]");
35 | let topic;
36 | if (!replyToTweet || isAddTopicForReplies) {
37 | topic = window.prompt("What do you want to tweet about?", lastTopic) || 'Twitter';
38 | await chrome.storage.local.set({ 'lastTopic': topic });
39 | }
40 | return topic;
41 | };
42 | const addGPTButtonWithType = (toolbarEl, onClick) => {
43 | const doc = new DOMParser().parseFromString(`
44 |
47 | `, "text/html");
48 | const iconWrap = doc.querySelector("div[id=\"gptButton\"]");
49 | const buttonContainer = toolbarEl.children[0];
50 | // attach to container
51 | buttonContainer.appendChild(iconWrap);
52 | iconWrap.onclick = async () => {
53 | const topic = await maybeReturnTopic();
54 | const bodyRect = document.body.getBoundingClientRect();
55 | const elemRect = iconWrap.getBoundingClientRect();
56 | const top = elemRect.top - bodyRect.top;
57 | const left = elemRect.left - bodyRect.left + 40;
58 | let optionsList;
59 | let dismissHandler;
60 | optionsList = createOptionsList(async (type) => {
61 | if (dismissHandler) {
62 | document.body.removeEventListener('click', dismissHandler);
63 | }
64 | if (optionsList) {
65 | optionsList.remove();
66 | }
67 | iconWrap.classList.add("loading");
68 | await onClick(type, topic);
69 | iconWrap.classList.remove("loading");
70 | });
71 | // adding settings button
72 | const separator = document.createElement("div");
73 | separator.classList.add("gptSeparator");
74 | optionsList.appendChild(separator);
75 | const item = document.createElement("div");
76 | item.classList.add("gptSelector");
77 | item.innerHTML = `⚙️ Settings`;
78 | item.onclick = (e) => {
79 | e.stopPropagation();
80 | const url = chrome.runtime.getURL("assets/settings.html");
81 | window.open(url, '_blank')?.focus();
82 | };
83 | optionsList.appendChild(item);
84 | optionsList.style.left = `${left}px`;
85 | optionsList.style.top = `${top}px`;
86 | document.body.appendChild(optionsList);
87 | dismissHandler = () => {
88 | if (dismissHandler) {
89 | document.body.removeEventListener('click', dismissHandler);
90 | }
91 | if (optionsList) {
92 | optionsList.remove();
93 | }
94 | };
95 | window.setTimeout(() => {
96 | document.body.addEventListener('click', dismissHandler);
97 | }, 1);
98 | };
99 | };
100 | const createOptionsList = (onClick) => {
101 | const container = document.createElement("div");
102 | container.classList.add("gptSelectorContainer");
103 | for (const tt of tweetTypes) {
104 | const item = document.createElement("div");
105 | item.classList.add("gptSelector");
106 | item.innerHTML = `${tt.emoji} ${tt.type}`;
107 | item.onclick = (e) => {
108 | e.stopPropagation();
109 | onClick(tt.type);
110 | };
111 | container.appendChild(item);
112 | }
113 | return container;
114 | };
115 | const showErrorButton = async (toolbarEl) => {
116 | const gptIcon = toolbarEl.querySelector(".gptIcon");
117 | if (gptIcon) {
118 | gptIcon.setAttribute("src", gptIconErrorSrc);
119 | gptIcon.classList.add("error");
120 | }
121 | await wait(5000);
122 | gptIcon?.setAttribute("src", gptIconSrc);
123 | gptIcon?.classList.remove("error");
124 | };
125 |
126 | ;// CONCATENATED MODULE: ./src/inject/dom/create_observer.ts
127 | const createObserver = (selector, onInputAdded, onInputRemoved) => {
128 | return new MutationObserver((mutations_list) => {
129 | mutations_list.forEach((mutation) => {
130 | const addedNodes = mutation.addedNodes; // wrong typings
131 | addedNodes.forEach((added_node) => {
132 | if (added_node.querySelector) {
133 | const inputEl = added_node.querySelector(selector);
134 | if (!!inputEl) {
135 | onInputAdded(inputEl);
136 | }
137 | ;
138 | }
139 | });
140 | const removedNodes = mutation.removedNodes;
141 | removedNodes.forEach((removed_node) => {
142 | if (removed_node.querySelector) {
143 | const inputEl = removed_node.querySelector(selector);
144 | if (!!inputEl) {
145 | onInputRemoved(inputEl);
146 | }
147 | ;
148 | }
149 | });
150 | });
151 | });
152 | };
153 |
154 | ;// CONCATENATED MODULE: ./src/inject/dom/find_closest_input.ts
155 | // can be more optimised, but ¯\_(ツ)_/¯, typically common container is just 2-3 levels higher
156 | const findClosestInput = (el) => {
157 | const inputEl = el.querySelector("div[data-testid^=\"tweetTextarea_\"][role=\"textbox\"]");
158 | if (inputEl) {
159 | return inputEl;
160 | }
161 | if (!el.parentElement) {
162 | return null;
163 | }
164 | else {
165 | return findClosestInput(el.parentElement);
166 | }
167 | };
168 |
169 | ;// CONCATENATED MODULE: ./src/inject/utils/generate_text.ts
170 | const generateText = (props) => {
171 | return new Promise((resolve) => {
172 | chrome.runtime.sendMessage({ type: 'generate_tweet', props }, response => resolve(response));
173 | });
174 | };
175 |
176 | ;// CONCATENATED MODULE: ./src/inject/dom/set_input_text.ts
177 | const setInputText = async (inputEl, text) => {
178 | const textWrapper = inputEl.querySelector('[data-text="true"]')?.parentElement;
179 | if (textWrapper) {
180 | textWrapper.innerHTML = `${text}`;
181 | textWrapper.dispatchEvent(new Event('input', { 'bubbles': true, 'cancelable': true }));
182 | }
183 | };
184 |
185 | ;// CONCATENATED MODULE: ./src/background/chat_gpt_client/locales.ts
186 | const locales = {
187 | "af-ZA": [
188 | "Afrikaans",
189 | "Afrikaans"
190 | ],
191 | "ar": [
192 | "العربية",
193 | "Arabic"
194 | ],
195 | "bg-BG": [
196 | "Български",
197 | "Bulgarian"
198 | ],
199 | "ca-AD": [
200 | "Català",
201 | "Catalan"
202 | ],
203 | "cs-CZ": [
204 | "Čeština",
205 | "Czech"
206 | ],
207 | "cy-GB": [
208 | "Cymraeg",
209 | "Welsh"
210 | ],
211 | "da-DK": [
212 | "Dansk",
213 | "Danish"
214 | ],
215 | "de-AT": [
216 | "Deutsch (Österreich)",
217 | "German (Austria)"
218 | ],
219 | "de-CH": [
220 | "Deutsch (Schweiz)",
221 | "German (Switzerland)"
222 | ],
223 | "de-DE": [
224 | "Deutsch (Deutschland)",
225 | "German (Germany)"
226 | ],
227 | "el-GR": [
228 | "Ελληνικά",
229 | "Greek"
230 | ],
231 | "en-GB": [
232 | "English (UK)",
233 | "English (UK)"
234 | ],
235 | "en-US": [
236 | "English (US)",
237 | "English (US)"
238 | ],
239 | "es-CL": [
240 | "Español (Chile)",
241 | "Spanish (Chile)"
242 | ],
243 | "es-ES": [
244 | "Español (España)",
245 | "Spanish (Spain)"
246 | ],
247 | "es-MX": [
248 | "Español (México)",
249 | "Spanish (Mexico)"
250 | ],
251 | "et-EE": [
252 | "Eesti keel",
253 | "Estonian"
254 | ],
255 | "eu": [
256 | "Euskara",
257 | "Basque"
258 | ],
259 | "fa-IR": [
260 | "فارسی",
261 | "Persian"
262 | ],
263 | "fi-FI": [
264 | "Suomi",
265 | "Finnish"
266 | ],
267 | "fr-CA": [
268 | "Français (Canada)",
269 | "French (Canada)"
270 | ],
271 | "fr-FR": [
272 | "Français (France)",
273 | "French (France)"
274 | ],
275 | "he-IL": [
276 | "עברית",
277 | "Hebrew"
278 | ],
279 | "hi-IN": [
280 | "हिंदी",
281 | "Hindi"
282 | ],
283 | "hr-HR": [
284 | "Hrvatski",
285 | "Croatian"
286 | ],
287 | "hu-HU": [
288 | "Magyar",
289 | "Hungarian"
290 | ],
291 | "id-ID": [
292 | "Bahasa Indonesia",
293 | "Indonesian"
294 | ],
295 | "is-IS": [
296 | "Íslenska",
297 | "Icelandic"
298 | ],
299 | "it-IT": [
300 | "Italiano",
301 | "Italian"
302 | ],
303 | "ja-JP": [
304 | "日本語",
305 | "Japanese"
306 | ],
307 | "km-KH": [
308 | "ភាសាខ្មែរ",
309 | "Khmer"
310 | ],
311 | "ko-KR": [
312 | "한국어",
313 | "Korean"
314 | ],
315 | "la": [
316 | "Latina",
317 | "Latin"
318 | ],
319 | "lt-LT": [
320 | "Lietuvių kalba",
321 | "Lithuanian"
322 | ],
323 | "lv-LV": [
324 | "Latviešu",
325 | "Latvian"
326 | ],
327 | "mn-MN": [
328 | "Монгол",
329 | "Mongolian"
330 | ],
331 | "nb-NO": [
332 | "Norsk bokmål",
333 | "Norwegian (Bokmål)"
334 | ],
335 | "nl-NL": [
336 | "Nederlands",
337 | "Dutch"
338 | ],
339 | "nn-NO": [
340 | "Norsk nynorsk",
341 | "Norwegian (Nynorsk)"
342 | ],
343 | "pl-PL": [
344 | "Polski",
345 | "Polish"
346 | ],
347 | "pt-BR": [
348 | "Português (Brasil)",
349 | "Portuguese (Brazil)"
350 | ],
351 | "pt-PT": [
352 | "Português (Portugal)",
353 | "Portuguese (Portugal)"
354 | ],
355 | "ro-RO": [
356 | "Română",
357 | "Romanian"
358 | ],
359 | "ru-RU": [
360 | "Русский",
361 | "Russian"
362 | ],
363 | "sk-SK": [
364 | "Slovenčina",
365 | "Slovak"
366 | ],
367 | "sl-SI": [
368 | "Slovenščina",
369 | "Slovenian"
370 | ],
371 | "sr-RS": [
372 | "Српски / Srpski",
373 | "Serbian"
374 | ],
375 | "sv-SE": [
376 | "Svenska",
377 | "Swedish"
378 | ],
379 | "th-TH": [
380 | "ไทย",
381 | "Thai"
382 | ],
383 | "tr-TR": [
384 | "Türkçe",
385 | "Turkish"
386 | ],
387 | "uk-UA": [
388 | "Українська",
389 | "Ukrainian"
390 | ],
391 | "ur-PK": [
392 | "اردو",
393 | "Urdu"
394 | ],
395 | "vi-VN": [
396 | "Tiếng Việt",
397 | "Vietnamese"
398 | ],
399 | "zh-CN": [
400 | "中文 (中国大陆)",
401 | "Chinese (PRC)"
402 | ],
403 | "zh-TW": [
404 | "中文 (台灣)",
405 | "Chinese (Taiwan)"
406 | ]
407 | };
408 | const defaultLocale = 'en-US';
409 |
410 | ;// CONCATENATED MODULE: ./src/inject/inject.ts
411 |
412 |
413 |
414 |
415 |
416 |
417 | const onToolBarAdded = (toolBarEl) => {
418 | let inputEl = findClosestInput(toolBarEl);
419 | if (inputEl) {
420 | addGPTButton(toolBarEl, async (type, topic) => {
421 | toolBarEl.click();
422 | const replyToTweet = document.querySelector("article[data-testid=\"tweet\"][tabindex=\"-1\"]");
423 | let replyTo = undefined;
424 | if (!!replyToTweet) {
425 | const textEl = replyToTweet.querySelector("div[data-testid=\"tweetText\"]");
426 | if (!textEl || !textEl.textContent) {
427 | showErrorButton(toolBarEl);
428 | return;
429 | }
430 | replyTo = textEl.textContent;
431 | }
432 | const text = await generateText({
433 | locale: (await chrome.storage.local.get('language')).language ?? defaultLocale,
434 | type,
435 | replyTo,
436 | topic
437 | });
438 | if (text) {
439 | inputEl = findClosestInput(toolBarEl);
440 | if (inputEl) {
441 | setInputText(inputEl, text);
442 | }
443 | }
444 | else { // show error
445 | showErrorButton(toolBarEl);
446 | }
447 | });
448 | }
449 | };
450 | const onToolBarRemoved = (toolBarEl) => { };
451 | // observe dom tree to detect all tweet inputs once they are created
452 | const toolbarObserver = createObserver("div[data-testid=\"toolBar\"]", onToolBarAdded, onToolBarRemoved);
453 | const reactRoot = document.querySelector("#react-root");
454 | toolbarObserver.observe(reactRoot, { subtree: true, childList: true });
455 |
456 | /******/ })()
457 | ;
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4":
6 | version "7.21.4"
7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39"
8 | integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==
9 | dependencies:
10 | "@babel/highlight" "^7.18.6"
11 |
12 | "@babel/generator@^7.21.4":
13 | version "7.21.4"
14 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc"
15 | integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==
16 | dependencies:
17 | "@babel/types" "^7.21.4"
18 | "@jridgewell/gen-mapping" "^0.3.2"
19 | "@jridgewell/trace-mapping" "^0.3.17"
20 | jsesc "^2.5.1"
21 |
22 | "@babel/helper-annotate-as-pure@^7.16.0":
23 | version "7.18.6"
24 | resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb"
25 | integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==
26 | dependencies:
27 | "@babel/types" "^7.18.6"
28 |
29 | "@babel/helper-environment-visitor@^7.18.9":
30 | version "7.18.9"
31 | resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be"
32 | integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
33 |
34 | "@babel/helper-function-name@^7.21.0":
35 | version "7.21.0"
36 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4"
37 | integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==
38 | dependencies:
39 | "@babel/template" "^7.20.7"
40 | "@babel/types" "^7.21.0"
41 |
42 | "@babel/helper-hoist-variables@^7.18.6":
43 | version "7.18.6"
44 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678"
45 | integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==
46 | dependencies:
47 | "@babel/types" "^7.18.6"
48 |
49 | "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0":
50 | version "7.21.4"
51 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af"
52 | integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==
53 | dependencies:
54 | "@babel/types" "^7.21.4"
55 |
56 | "@babel/helper-split-export-declaration@^7.18.6":
57 | version "7.18.6"
58 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075"
59 | integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==
60 | dependencies:
61 | "@babel/types" "^7.18.6"
62 |
63 | "@babel/helper-string-parser@^7.19.4":
64 | version "7.19.4"
65 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63"
66 | integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
67 |
68 | "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1":
69 | version "7.19.1"
70 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
71 | integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
72 |
73 | "@babel/highlight@^7.18.6":
74 | version "7.18.6"
75 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
76 | integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
77 | dependencies:
78 | "@babel/helper-validator-identifier" "^7.18.6"
79 | chalk "^2.0.0"
80 | js-tokens "^4.0.0"
81 |
82 | "@babel/parser@^7.20.7", "@babel/parser@^7.21.4":
83 | version "7.21.4"
84 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17"
85 | integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==
86 |
87 | "@babel/template@^7.20.7":
88 | version "7.20.7"
89 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8"
90 | integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==
91 | dependencies:
92 | "@babel/code-frame" "^7.18.6"
93 | "@babel/parser" "^7.20.7"
94 | "@babel/types" "^7.20.7"
95 |
96 | "@babel/traverse@^7.4.5":
97 | version "7.21.4"
98 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36"
99 | integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==
100 | dependencies:
101 | "@babel/code-frame" "^7.21.4"
102 | "@babel/generator" "^7.21.4"
103 | "@babel/helper-environment-visitor" "^7.18.9"
104 | "@babel/helper-function-name" "^7.21.0"
105 | "@babel/helper-hoist-variables" "^7.18.6"
106 | "@babel/helper-split-export-declaration" "^7.18.6"
107 | "@babel/parser" "^7.21.4"
108 | "@babel/types" "^7.21.4"
109 | debug "^4.1.0"
110 | globals "^11.1.0"
111 |
112 | "@babel/types@^7.18.6", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4":
113 | version "7.21.4"
114 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4"
115 | integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==
116 | dependencies:
117 | "@babel/helper-string-parser" "^7.19.4"
118 | "@babel/helper-validator-identifier" "^7.19.1"
119 | to-fast-properties "^2.0.0"
120 |
121 | "@discoveryjs/json-ext@^0.5.0":
122 | version "0.5.7"
123 | resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
124 | integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
125 |
126 | "@emotion/is-prop-valid@^1.1.0":
127 | version "1.2.0"
128 | resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83"
129 | integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==
130 | dependencies:
131 | "@emotion/memoize" "^0.8.0"
132 |
133 | "@emotion/memoize@^0.8.0":
134 | version "0.8.0"
135 | resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f"
136 | integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==
137 |
138 | "@emotion/stylis@^0.8.4":
139 | version "0.8.5"
140 | resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04"
141 | integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==
142 |
143 | "@emotion/unitless@^0.7.4":
144 | version "0.7.5"
145 | resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
146 | integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
147 |
148 | "@jridgewell/gen-mapping@^0.3.0":
149 | version "0.3.2"
150 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
151 | integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
152 | dependencies:
153 | "@jridgewell/set-array" "^1.0.1"
154 | "@jridgewell/sourcemap-codec" "^1.4.10"
155 | "@jridgewell/trace-mapping" "^0.3.9"
156 |
157 | "@jridgewell/gen-mapping@^0.3.2":
158 | version "0.3.3"
159 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
160 | integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
161 | dependencies:
162 | "@jridgewell/set-array" "^1.0.1"
163 | "@jridgewell/sourcemap-codec" "^1.4.10"
164 | "@jridgewell/trace-mapping" "^0.3.9"
165 |
166 | "@jridgewell/resolve-uri@3.1.0":
167 | version "3.1.0"
168 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
169 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
170 |
171 | "@jridgewell/set-array@^1.0.1":
172 | version "1.1.2"
173 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
174 | integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
175 |
176 | "@jridgewell/source-map@^0.3.2":
177 | version "0.3.2"
178 | resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
179 | integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
180 | dependencies:
181 | "@jridgewell/gen-mapping" "^0.3.0"
182 | "@jridgewell/trace-mapping" "^0.3.9"
183 |
184 | "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10":
185 | version "1.4.14"
186 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
187 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
188 |
189 | "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9":
190 | version "0.3.17"
191 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985"
192 | integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==
193 | dependencies:
194 | "@jridgewell/resolve-uri" "3.1.0"
195 | "@jridgewell/sourcemap-codec" "1.4.14"
196 |
197 | "@jridgewell/trace-mapping@^0.3.17":
198 | version "0.3.18"
199 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6"
200 | integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==
201 | dependencies:
202 | "@jridgewell/resolve-uri" "3.1.0"
203 | "@jridgewell/sourcemap-codec" "1.4.14"
204 |
205 | "@types/chrome@^0.0.203":
206 | version "0.0.203"
207 | resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.203.tgz#cf883669ba489ec965e48d32cdcf14f45437f7cf"
208 | integrity sha512-JlQNebwpBETVc8U1Rr2inDFuOTtn0lahRAhnddx1dd0S5RrLAFJEEsyIu7AXI14mkCgSunksnuLGioH8kvBqRA==
209 | dependencies:
210 | "@types/filesystem" "*"
211 | "@types/har-format" "*"
212 |
213 | "@types/eslint-scope@^3.7.3":
214 | version "3.7.4"
215 | resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16"
216 | integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==
217 | dependencies:
218 | "@types/eslint" "*"
219 | "@types/estree" "*"
220 |
221 | "@types/eslint@*":
222 | version "8.4.10"
223 | resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.10.tgz#19731b9685c19ed1552da7052b6f668ed7eb64bb"
224 | integrity sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==
225 | dependencies:
226 | "@types/estree" "*"
227 | "@types/json-schema" "*"
228 |
229 | "@types/estree@*":
230 | version "1.0.0"
231 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2"
232 | integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==
233 |
234 | "@types/estree@^0.0.51":
235 | version "0.0.51"
236 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
237 | integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
238 |
239 | "@types/filesystem@*":
240 | version "0.0.32"
241 | resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.32.tgz#307df7cc084a2293c3c1a31151b178063e0a8edf"
242 | integrity sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==
243 | dependencies:
244 | "@types/filewriter" "*"
245 |
246 | "@types/filewriter@*":
247 | version "0.0.29"
248 | resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.29.tgz#a48795ecadf957f6c0d10e0c34af86c098fa5bee"
249 | integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==
250 |
251 | "@types/har-format@*":
252 | version "1.2.10"
253 | resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.10.tgz#7b4e1e0ada4d17684ac3b05d601a4871cfab11fc"
254 | integrity sha512-o0J30wqycjF5miWDKYKKzzOU1ZTLuA42HZ4HE7/zqTOc/jTLdQ5NhYWvsRQo45Nfi1KHoRdNhteSI4BAxTF1Pg==
255 |
256 | "@types/hoist-non-react-statics@*":
257 | version "3.3.1"
258 | resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
259 | integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==
260 | dependencies:
261 | "@types/react" "*"
262 | hoist-non-react-statics "^3.3.0"
263 |
264 | "@types/json-schema@*", "@types/json-schema@^7.0.8":
265 | version "7.0.11"
266 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
267 | integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
268 |
269 | "@types/node@*", "@types/node@^18.11.11":
270 | version "18.11.11"
271 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.11.tgz#1d455ac0211549a8409d3cdb371cd55cc971e8dc"
272 | integrity sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g==
273 |
274 | "@types/prop-types@*":
275 | version "15.7.5"
276 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
277 | integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
278 |
279 | "@types/react-dom@^18.0.11":
280 | version "18.0.11"
281 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33"
282 | integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==
283 | dependencies:
284 | "@types/react" "*"
285 |
286 | "@types/react@*", "@types/react@^18.0.38":
287 | version "18.0.38"
288 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.38.tgz#02a23bef8848b360a0d1dceef4432c15c21c600c"
289 | integrity sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw==
290 | dependencies:
291 | "@types/prop-types" "*"
292 | "@types/scheduler" "*"
293 | csstype "^3.0.2"
294 |
295 | "@types/scheduler@*":
296 | version "0.16.3"
297 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5"
298 | integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==
299 |
300 | "@types/styled-components@^5.1.26":
301 | version "5.1.26"
302 | resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.26.tgz#5627e6812ee96d755028a98dae61d28e57c233af"
303 | integrity sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==
304 | dependencies:
305 | "@types/hoist-non-react-statics" "*"
306 | "@types/react" "*"
307 | csstype "^3.0.2"
308 |
309 | "@webassemblyjs/ast@1.11.1":
310 | version "1.11.1"
311 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
312 | integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==
313 | dependencies:
314 | "@webassemblyjs/helper-numbers" "1.11.1"
315 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
316 |
317 | "@webassemblyjs/floating-point-hex-parser@1.11.1":
318 | version "1.11.1"
319 | resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f"
320 | integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==
321 |
322 | "@webassemblyjs/helper-api-error@1.11.1":
323 | version "1.11.1"
324 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16"
325 | integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==
326 |
327 | "@webassemblyjs/helper-buffer@1.11.1":
328 | version "1.11.1"
329 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5"
330 | integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==
331 |
332 | "@webassemblyjs/helper-numbers@1.11.1":
333 | version "1.11.1"
334 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae"
335 | integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==
336 | dependencies:
337 | "@webassemblyjs/floating-point-hex-parser" "1.11.1"
338 | "@webassemblyjs/helper-api-error" "1.11.1"
339 | "@xtuc/long" "4.2.2"
340 |
341 | "@webassemblyjs/helper-wasm-bytecode@1.11.1":
342 | version "1.11.1"
343 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1"
344 | integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==
345 |
346 | "@webassemblyjs/helper-wasm-section@1.11.1":
347 | version "1.11.1"
348 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a"
349 | integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==
350 | dependencies:
351 | "@webassemblyjs/ast" "1.11.1"
352 | "@webassemblyjs/helper-buffer" "1.11.1"
353 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
354 | "@webassemblyjs/wasm-gen" "1.11.1"
355 |
356 | "@webassemblyjs/ieee754@1.11.1":
357 | version "1.11.1"
358 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614"
359 | integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==
360 | dependencies:
361 | "@xtuc/ieee754" "^1.2.0"
362 |
363 | "@webassemblyjs/leb128@1.11.1":
364 | version "1.11.1"
365 | resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5"
366 | integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==
367 | dependencies:
368 | "@xtuc/long" "4.2.2"
369 |
370 | "@webassemblyjs/utf8@1.11.1":
371 | version "1.11.1"
372 | resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff"
373 | integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==
374 |
375 | "@webassemblyjs/wasm-edit@1.11.1":
376 | version "1.11.1"
377 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6"
378 | integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==
379 | dependencies:
380 | "@webassemblyjs/ast" "1.11.1"
381 | "@webassemblyjs/helper-buffer" "1.11.1"
382 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
383 | "@webassemblyjs/helper-wasm-section" "1.11.1"
384 | "@webassemblyjs/wasm-gen" "1.11.1"
385 | "@webassemblyjs/wasm-opt" "1.11.1"
386 | "@webassemblyjs/wasm-parser" "1.11.1"
387 | "@webassemblyjs/wast-printer" "1.11.1"
388 |
389 | "@webassemblyjs/wasm-gen@1.11.1":
390 | version "1.11.1"
391 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76"
392 | integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==
393 | dependencies:
394 | "@webassemblyjs/ast" "1.11.1"
395 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
396 | "@webassemblyjs/ieee754" "1.11.1"
397 | "@webassemblyjs/leb128" "1.11.1"
398 | "@webassemblyjs/utf8" "1.11.1"
399 |
400 | "@webassemblyjs/wasm-opt@1.11.1":
401 | version "1.11.1"
402 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2"
403 | integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==
404 | dependencies:
405 | "@webassemblyjs/ast" "1.11.1"
406 | "@webassemblyjs/helper-buffer" "1.11.1"
407 | "@webassemblyjs/wasm-gen" "1.11.1"
408 | "@webassemblyjs/wasm-parser" "1.11.1"
409 |
410 | "@webassemblyjs/wasm-parser@1.11.1":
411 | version "1.11.1"
412 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199"
413 | integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==
414 | dependencies:
415 | "@webassemblyjs/ast" "1.11.1"
416 | "@webassemblyjs/helper-api-error" "1.11.1"
417 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
418 | "@webassemblyjs/ieee754" "1.11.1"
419 | "@webassemblyjs/leb128" "1.11.1"
420 | "@webassemblyjs/utf8" "1.11.1"
421 |
422 | "@webassemblyjs/wast-printer@1.11.1":
423 | version "1.11.1"
424 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0"
425 | integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==
426 | dependencies:
427 | "@webassemblyjs/ast" "1.11.1"
428 | "@xtuc/long" "4.2.2"
429 |
430 | "@webpack-cli/configtest@^2.0.1":
431 | version "2.0.1"
432 | resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.0.1.tgz#a69720f6c9bad6aef54a8fa6ba9c3533e7ef4c7f"
433 | integrity sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==
434 |
435 | "@webpack-cli/info@^2.0.1":
436 | version "2.0.1"
437 | resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.1.tgz#eed745799c910d20081e06e5177c2b2569f166c0"
438 | integrity sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==
439 |
440 | "@webpack-cli/serve@^2.0.1":
441 | version "2.0.1"
442 | resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.1.tgz#34bdc31727a1889198855913db2f270ace6d7bf8"
443 | integrity sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==
444 |
445 | "@xtuc/ieee754@^1.2.0":
446 | version "1.2.0"
447 | resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
448 | integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
449 |
450 | "@xtuc/long@4.2.2":
451 | version "4.2.2"
452 | resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
453 | integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
454 |
455 | acorn-import-assertions@^1.7.6:
456 | version "1.8.0"
457 | resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
458 | integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==
459 |
460 | acorn@^8.5.0, acorn@^8.7.1:
461 | version "8.8.1"
462 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73"
463 | integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==
464 |
465 | ajv-keywords@^3.5.2:
466 | version "3.5.2"
467 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
468 | integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
469 |
470 | ajv@^6.12.5:
471 | version "6.12.6"
472 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
473 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
474 | dependencies:
475 | fast-deep-equal "^3.1.1"
476 | fast-json-stable-stringify "^2.0.0"
477 | json-schema-traverse "^0.4.1"
478 | uri-js "^4.2.2"
479 |
480 | ansi-styles@^3.2.1:
481 | version "3.2.1"
482 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
483 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
484 | dependencies:
485 | color-convert "^1.9.0"
486 |
487 | ansi-styles@^4.1.0:
488 | version "4.3.0"
489 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
490 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
491 | dependencies:
492 | color-convert "^2.0.1"
493 |
494 | "babel-plugin-styled-components@>= 1.12.0":
495 | version "2.1.1"
496 | resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.1.tgz#cd977cc0ff8410d5cbfdd142e42576e9c8794b87"
497 | integrity sha512-c8lJlszObVQPguHkI+akXv8+Jgb9Ccujx0EetL7oIvwU100LxO6XAGe45qry37wUL40a5U9f23SYrivro2XKhA==
498 | dependencies:
499 | "@babel/helper-annotate-as-pure" "^7.16.0"
500 | "@babel/helper-module-imports" "^7.16.0"
501 | babel-plugin-syntax-jsx "^6.18.0"
502 | lodash "^4.17.21"
503 | picomatch "^2.3.0"
504 |
505 | babel-plugin-syntax-jsx@^6.18.0:
506 | version "6.18.0"
507 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
508 | integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==
509 |
510 | braces@^3.0.2:
511 | version "3.0.2"
512 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
513 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
514 | dependencies:
515 | fill-range "^7.0.1"
516 |
517 | browserslist@^4.14.5:
518 | version "4.21.4"
519 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987"
520 | integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==
521 | dependencies:
522 | caniuse-lite "^1.0.30001400"
523 | electron-to-chromium "^1.4.251"
524 | node-releases "^2.0.6"
525 | update-browserslist-db "^1.0.9"
526 |
527 | buffer-from@^1.0.0:
528 | version "1.1.2"
529 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
530 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
531 |
532 | camelize@^1.0.0:
533 | version "1.0.1"
534 | resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3"
535 | integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==
536 |
537 | caniuse-lite@^1.0.30001400:
538 | version "1.0.30001436"
539 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz#22d7cbdbbbb60cdc4ca1030ccd6dea9f5de4848b"
540 | integrity sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg==
541 |
542 | chalk@^2.0.0:
543 | version "2.4.2"
544 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
545 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
546 | dependencies:
547 | ansi-styles "^3.2.1"
548 | escape-string-regexp "^1.0.5"
549 | supports-color "^5.3.0"
550 |
551 | chalk@^4.1.0:
552 | version "4.1.2"
553 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
554 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
555 | dependencies:
556 | ansi-styles "^4.1.0"
557 | supports-color "^7.1.0"
558 |
559 | chrome-trace-event@^1.0.2:
560 | version "1.0.3"
561 | resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
562 | integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
563 |
564 | clone-deep@^4.0.1:
565 | version "4.0.1"
566 | resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
567 | integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
568 | dependencies:
569 | is-plain-object "^2.0.4"
570 | kind-of "^6.0.2"
571 | shallow-clone "^3.0.0"
572 |
573 | color-convert@^1.9.0:
574 | version "1.9.3"
575 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
576 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
577 | dependencies:
578 | color-name "1.1.3"
579 |
580 | color-convert@^2.0.1:
581 | version "2.0.1"
582 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
583 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
584 | dependencies:
585 | color-name "~1.1.4"
586 |
587 | color-name@1.1.3:
588 | version "1.1.3"
589 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
590 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
591 |
592 | color-name@~1.1.4:
593 | version "1.1.4"
594 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
595 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
596 |
597 | colorette@^2.0.14:
598 | version "2.0.19"
599 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
600 | integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
601 |
602 | commander@^2.20.0:
603 | version "2.20.3"
604 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
605 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
606 |
607 | commander@^9.4.1:
608 | version "9.4.1"
609 | resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd"
610 | integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==
611 |
612 | cross-spawn@^7.0.3:
613 | version "7.0.3"
614 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
615 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
616 | dependencies:
617 | path-key "^3.1.0"
618 | shebang-command "^2.0.0"
619 | which "^2.0.1"
620 |
621 | css-color-keywords@^1.0.0:
622 | version "1.0.0"
623 | resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05"
624 | integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==
625 |
626 | css-to-react-native@^3.0.0:
627 | version "3.2.0"
628 | resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32"
629 | integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==
630 | dependencies:
631 | camelize "^1.0.0"
632 | css-color-keywords "^1.0.0"
633 | postcss-value-parser "^4.0.2"
634 |
635 | csstype@^3.0.2:
636 | version "3.1.2"
637 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
638 | integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
639 |
640 | debug@^4.1.0:
641 | version "4.3.4"
642 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
643 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
644 | dependencies:
645 | ms "2.1.2"
646 |
647 | electron-to-chromium@^1.4.251:
648 | version "1.4.284"
649 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592"
650 | integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==
651 |
652 | enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0:
653 | version "5.12.0"
654 | resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634"
655 | integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==
656 | dependencies:
657 | graceful-fs "^4.2.4"
658 | tapable "^2.2.0"
659 |
660 | envinfo@^7.7.3:
661 | version "7.8.1"
662 | resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
663 | integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
664 |
665 | es-module-lexer@^0.9.0:
666 | version "0.9.3"
667 | resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
668 | integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
669 |
670 | escalade@^3.1.1:
671 | version "3.1.1"
672 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
673 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
674 |
675 | escape-string-regexp@^1.0.5:
676 | version "1.0.5"
677 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
678 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
679 |
680 | eslint-scope@5.1.1:
681 | version "5.1.1"
682 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
683 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
684 | dependencies:
685 | esrecurse "^4.3.0"
686 | estraverse "^4.1.1"
687 |
688 | esrecurse@^4.3.0:
689 | version "4.3.0"
690 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
691 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
692 | dependencies:
693 | estraverse "^5.2.0"
694 |
695 | estraverse@^4.1.1:
696 | version "4.3.0"
697 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
698 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
699 |
700 | estraverse@^5.2.0:
701 | version "5.3.0"
702 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
703 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
704 |
705 | events@^3.2.0:
706 | version "3.3.0"
707 | resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
708 | integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
709 |
710 | fast-deep-equal@^3.1.1:
711 | version "3.1.3"
712 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
713 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
714 |
715 | fast-json-stable-stringify@^2.0.0:
716 | version "2.1.0"
717 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
718 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
719 |
720 | fastest-levenshtein@^1.0.12:
721 | version "1.0.16"
722 | resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5"
723 | integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==
724 |
725 | fill-range@^7.0.1:
726 | version "7.0.1"
727 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
728 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
729 | dependencies:
730 | to-regex-range "^5.0.1"
731 |
732 | find-up@^4.0.0:
733 | version "4.1.0"
734 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
735 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
736 | dependencies:
737 | locate-path "^5.0.0"
738 | path-exists "^4.0.0"
739 |
740 | function-bind@^1.1.1:
741 | version "1.1.1"
742 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
743 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
744 |
745 | glob-to-regexp@^0.4.1:
746 | version "0.4.1"
747 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
748 | integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
749 |
750 | globals@^11.1.0:
751 | version "11.12.0"
752 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
753 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
754 |
755 | graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
756 | version "4.2.10"
757 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
758 | integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
759 |
760 | has-flag@^3.0.0:
761 | version "3.0.0"
762 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
763 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
764 |
765 | has-flag@^4.0.0:
766 | version "4.0.0"
767 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
768 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
769 |
770 | has@^1.0.3:
771 | version "1.0.3"
772 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
773 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
774 | dependencies:
775 | function-bind "^1.1.1"
776 |
777 | hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0:
778 | version "3.3.2"
779 | resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
780 | integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
781 | dependencies:
782 | react-is "^16.7.0"
783 |
784 | import-local@^3.0.2:
785 | version "3.1.0"
786 | resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
787 | integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
788 | dependencies:
789 | pkg-dir "^4.2.0"
790 | resolve-cwd "^3.0.0"
791 |
792 | interpret@^3.1.1:
793 | version "3.1.1"
794 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4"
795 | integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==
796 |
797 | is-core-module@^2.9.0:
798 | version "2.11.0"
799 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144"
800 | integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==
801 | dependencies:
802 | has "^1.0.3"
803 |
804 | is-number@^7.0.0:
805 | version "7.0.0"
806 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
807 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
808 |
809 | is-plain-object@^2.0.4:
810 | version "2.0.4"
811 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
812 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
813 | dependencies:
814 | isobject "^3.0.1"
815 |
816 | isexe@^2.0.0:
817 | version "2.0.0"
818 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
819 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
820 |
821 | isobject@^3.0.1:
822 | version "3.0.1"
823 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
824 | integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
825 |
826 | jest-worker@^27.4.5:
827 | version "27.5.1"
828 | resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
829 | integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
830 | dependencies:
831 | "@types/node" "*"
832 | merge-stream "^2.0.0"
833 | supports-color "^8.0.0"
834 |
835 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
836 | version "4.0.0"
837 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
838 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
839 |
840 | jsesc@^2.5.1:
841 | version "2.5.2"
842 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
843 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
844 |
845 | json-parse-even-better-errors@^2.3.1:
846 | version "2.3.1"
847 | resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
848 | integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
849 |
850 | json-schema-traverse@^0.4.1:
851 | version "0.4.1"
852 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
853 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
854 |
855 | kind-of@^6.0.2:
856 | version "6.0.3"
857 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
858 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
859 |
860 | loader-runner@^4.2.0:
861 | version "4.3.0"
862 | resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1"
863 | integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
864 |
865 | locate-path@^5.0.0:
866 | version "5.0.0"
867 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
868 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
869 | dependencies:
870 | p-locate "^4.1.0"
871 |
872 | lodash@^4.17.21:
873 | version "4.17.21"
874 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
875 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
876 |
877 | loose-envify@^1.1.0:
878 | version "1.4.0"
879 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
880 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
881 | dependencies:
882 | js-tokens "^3.0.0 || ^4.0.0"
883 |
884 | lru-cache@^6.0.0:
885 | version "6.0.0"
886 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
887 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
888 | dependencies:
889 | yallist "^4.0.0"
890 |
891 | merge-stream@^2.0.0:
892 | version "2.0.0"
893 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
894 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
895 |
896 | micromatch@^4.0.0:
897 | version "4.0.5"
898 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
899 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
900 | dependencies:
901 | braces "^3.0.2"
902 | picomatch "^2.3.1"
903 |
904 | mime-db@1.52.0:
905 | version "1.52.0"
906 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
907 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
908 |
909 | mime-types@^2.1.27:
910 | version "2.1.35"
911 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
912 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
913 | dependencies:
914 | mime-db "1.52.0"
915 |
916 | ms@2.1.2:
917 | version "2.1.2"
918 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
919 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
920 |
921 | neo-async@^2.6.2:
922 | version "2.6.2"
923 | resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
924 | integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
925 |
926 | node-releases@^2.0.6:
927 | version "2.0.6"
928 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503"
929 | integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==
930 |
931 | p-limit@^2.2.0:
932 | version "2.3.0"
933 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
934 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
935 | dependencies:
936 | p-try "^2.0.0"
937 |
938 | p-locate@^4.1.0:
939 | version "4.1.0"
940 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
941 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
942 | dependencies:
943 | p-limit "^2.2.0"
944 |
945 | p-try@^2.0.0:
946 | version "2.2.0"
947 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
948 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
949 |
950 | path-exists@^4.0.0:
951 | version "4.0.0"
952 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
953 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
954 |
955 | path-key@^3.1.0:
956 | version "3.1.1"
957 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
958 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
959 |
960 | path-parse@^1.0.7:
961 | version "1.0.7"
962 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
963 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
964 |
965 | picocolors@^1.0.0:
966 | version "1.0.0"
967 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
968 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
969 |
970 | picomatch@^2.3.0, picomatch@^2.3.1:
971 | version "2.3.1"
972 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
973 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
974 |
975 | pkg-dir@^4.2.0:
976 | version "4.2.0"
977 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
978 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
979 | dependencies:
980 | find-up "^4.0.0"
981 |
982 | postcss-value-parser@^4.0.2:
983 | version "4.2.0"
984 | resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
985 | integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
986 |
987 | punycode@^2.1.0:
988 | version "2.1.1"
989 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
990 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
991 |
992 | randombytes@^2.1.0:
993 | version "2.1.0"
994 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
995 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
996 | dependencies:
997 | safe-buffer "^5.1.0"
998 |
999 | react-dom@^18.2.0:
1000 | version "18.2.0"
1001 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
1002 | integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
1003 | dependencies:
1004 | loose-envify "^1.1.0"
1005 | scheduler "^0.23.0"
1006 |
1007 | react-is@^16.7.0:
1008 | version "16.13.1"
1009 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
1010 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
1011 |
1012 | react@^18.2.0:
1013 | version "18.2.0"
1014 | resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
1015 | integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
1016 | dependencies:
1017 | loose-envify "^1.1.0"
1018 |
1019 | rechoir@^0.8.0:
1020 | version "0.8.0"
1021 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22"
1022 | integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==
1023 | dependencies:
1024 | resolve "^1.20.0"
1025 |
1026 | resolve-cwd@^3.0.0:
1027 | version "3.0.0"
1028 | resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
1029 | integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
1030 | dependencies:
1031 | resolve-from "^5.0.0"
1032 |
1033 | resolve-from@^5.0.0:
1034 | version "5.0.0"
1035 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
1036 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
1037 |
1038 | resolve@^1.20.0:
1039 | version "1.22.1"
1040 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
1041 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
1042 | dependencies:
1043 | is-core-module "^2.9.0"
1044 | path-parse "^1.0.7"
1045 | supports-preserve-symlinks-flag "^1.0.0"
1046 |
1047 | safe-buffer@^5.1.0:
1048 | version "5.2.1"
1049 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
1050 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
1051 |
1052 | scheduler@^0.23.0:
1053 | version "0.23.0"
1054 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
1055 | integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
1056 | dependencies:
1057 | loose-envify "^1.1.0"
1058 |
1059 | schema-utils@^3.1.0, schema-utils@^3.1.1:
1060 | version "3.1.1"
1061 | resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
1062 | integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
1063 | dependencies:
1064 | "@types/json-schema" "^7.0.8"
1065 | ajv "^6.12.5"
1066 | ajv-keywords "^3.5.2"
1067 |
1068 | semver@^7.3.4:
1069 | version "7.3.8"
1070 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
1071 | integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
1072 | dependencies:
1073 | lru-cache "^6.0.0"
1074 |
1075 | serialize-javascript@^6.0.0:
1076 | version "6.0.0"
1077 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
1078 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
1079 | dependencies:
1080 | randombytes "^2.1.0"
1081 |
1082 | shallow-clone@^3.0.0:
1083 | version "3.0.1"
1084 | resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
1085 | integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
1086 | dependencies:
1087 | kind-of "^6.0.2"
1088 |
1089 | shallowequal@^1.1.0:
1090 | version "1.1.0"
1091 | resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
1092 | integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
1093 |
1094 | shebang-command@^2.0.0:
1095 | version "2.0.0"
1096 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
1097 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
1098 | dependencies:
1099 | shebang-regex "^3.0.0"
1100 |
1101 | shebang-regex@^3.0.0:
1102 | version "3.0.0"
1103 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
1104 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
1105 |
1106 | source-map-support@~0.5.20:
1107 | version "0.5.21"
1108 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
1109 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
1110 | dependencies:
1111 | buffer-from "^1.0.0"
1112 | source-map "^0.6.0"
1113 |
1114 | source-map@^0.6.0:
1115 | version "0.6.1"
1116 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
1117 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
1118 |
1119 | styled-components@^5.3.10:
1120 | version "5.3.10"
1121 | resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.10.tgz#42f7245f58fe960362a63f543dda23c0ac107c0f"
1122 | integrity sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==
1123 | dependencies:
1124 | "@babel/helper-module-imports" "^7.0.0"
1125 | "@babel/traverse" "^7.4.5"
1126 | "@emotion/is-prop-valid" "^1.1.0"
1127 | "@emotion/stylis" "^0.8.4"
1128 | "@emotion/unitless" "^0.7.4"
1129 | babel-plugin-styled-components ">= 1.12.0"
1130 | css-to-react-native "^3.0.0"
1131 | hoist-non-react-statics "^3.0.0"
1132 | shallowequal "^1.1.0"
1133 | supports-color "^5.5.0"
1134 |
1135 | supports-color@^5.3.0, supports-color@^5.5.0:
1136 | version "5.5.0"
1137 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
1138 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
1139 | dependencies:
1140 | has-flag "^3.0.0"
1141 |
1142 | supports-color@^7.1.0:
1143 | version "7.2.0"
1144 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
1145 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
1146 | dependencies:
1147 | has-flag "^4.0.0"
1148 |
1149 | supports-color@^8.0.0:
1150 | version "8.1.1"
1151 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
1152 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
1153 | dependencies:
1154 | has-flag "^4.0.0"
1155 |
1156 | supports-preserve-symlinks-flag@^1.0.0:
1157 | version "1.0.0"
1158 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
1159 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
1160 |
1161 | tapable@^2.1.1, tapable@^2.2.0:
1162 | version "2.2.1"
1163 | resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
1164 | integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
1165 |
1166 | terser-webpack-plugin@^5.1.3:
1167 | version "5.3.6"
1168 | resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c"
1169 | integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==
1170 | dependencies:
1171 | "@jridgewell/trace-mapping" "^0.3.14"
1172 | jest-worker "^27.4.5"
1173 | schema-utils "^3.1.1"
1174 | serialize-javascript "^6.0.0"
1175 | terser "^5.14.1"
1176 |
1177 | terser@^5.14.1:
1178 | version "5.16.1"
1179 | resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880"
1180 | integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==
1181 | dependencies:
1182 | "@jridgewell/source-map" "^0.3.2"
1183 | acorn "^8.5.0"
1184 | commander "^2.20.0"
1185 | source-map-support "~0.5.20"
1186 |
1187 | to-fast-properties@^2.0.0:
1188 | version "2.0.0"
1189 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
1190 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
1191 |
1192 | to-regex-range@^5.0.1:
1193 | version "5.0.1"
1194 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
1195 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
1196 | dependencies:
1197 | is-number "^7.0.0"
1198 |
1199 | ts-loader@^9.4.2:
1200 | version "9.4.2"
1201 | resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.2.tgz#80a45eee92dd5170b900b3d00abcfa14949aeb78"
1202 | integrity sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==
1203 | dependencies:
1204 | chalk "^4.1.0"
1205 | enhanced-resolve "^5.0.0"
1206 | micromatch "^4.0.0"
1207 | semver "^7.3.4"
1208 |
1209 | typescript@^4.9.3:
1210 | version "4.9.3"
1211 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db"
1212 | integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==
1213 |
1214 | update-browserslist-db@^1.0.9:
1215 | version "1.0.10"
1216 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3"
1217 | integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==
1218 | dependencies:
1219 | escalade "^3.1.1"
1220 | picocolors "^1.0.0"
1221 |
1222 | uri-js@^4.2.2:
1223 | version "4.4.1"
1224 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
1225 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
1226 | dependencies:
1227 | punycode "^2.1.0"
1228 |
1229 | watchpack@^2.4.0:
1230 | version "2.4.0"
1231 | resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"
1232 | integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==
1233 | dependencies:
1234 | glob-to-regexp "^0.4.1"
1235 | graceful-fs "^4.1.2"
1236 |
1237 | webpack-cli@^5.0.1:
1238 | version "5.0.1"
1239 | resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.0.1.tgz#95fc0495ac4065e9423a722dec9175560b6f2d9a"
1240 | integrity sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==
1241 | dependencies:
1242 | "@discoveryjs/json-ext" "^0.5.0"
1243 | "@webpack-cli/configtest" "^2.0.1"
1244 | "@webpack-cli/info" "^2.0.1"
1245 | "@webpack-cli/serve" "^2.0.1"
1246 | colorette "^2.0.14"
1247 | commander "^9.4.1"
1248 | cross-spawn "^7.0.3"
1249 | envinfo "^7.7.3"
1250 | fastest-levenshtein "^1.0.12"
1251 | import-local "^3.0.2"
1252 | interpret "^3.1.1"
1253 | rechoir "^0.8.0"
1254 | webpack-merge "^5.7.3"
1255 |
1256 | webpack-merge@^5.7.3:
1257 | version "5.8.0"
1258 | resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61"
1259 | integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==
1260 | dependencies:
1261 | clone-deep "^4.0.1"
1262 | wildcard "^2.0.0"
1263 |
1264 | webpack-sources@^3.2.3:
1265 | version "3.2.3"
1266 | resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
1267 | integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
1268 |
1269 | webpack@^5.75.0:
1270 | version "5.75.0"
1271 | resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152"
1272 | integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==
1273 | dependencies:
1274 | "@types/eslint-scope" "^3.7.3"
1275 | "@types/estree" "^0.0.51"
1276 | "@webassemblyjs/ast" "1.11.1"
1277 | "@webassemblyjs/wasm-edit" "1.11.1"
1278 | "@webassemblyjs/wasm-parser" "1.11.1"
1279 | acorn "^8.7.1"
1280 | acorn-import-assertions "^1.7.6"
1281 | browserslist "^4.14.5"
1282 | chrome-trace-event "^1.0.2"
1283 | enhanced-resolve "^5.10.0"
1284 | es-module-lexer "^0.9.0"
1285 | eslint-scope "5.1.1"
1286 | events "^3.2.0"
1287 | glob-to-regexp "^0.4.1"
1288 | graceful-fs "^4.2.9"
1289 | json-parse-even-better-errors "^2.3.1"
1290 | loader-runner "^4.2.0"
1291 | mime-types "^2.1.27"
1292 | neo-async "^2.6.2"
1293 | schema-utils "^3.1.0"
1294 | tapable "^2.1.1"
1295 | terser-webpack-plugin "^5.1.3"
1296 | watchpack "^2.4.0"
1297 | webpack-sources "^3.2.3"
1298 |
1299 | which@^2.0.1:
1300 | version "2.0.2"
1301 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
1302 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
1303 | dependencies:
1304 | isexe "^2.0.0"
1305 |
1306 | wildcard@^2.0.0:
1307 | version "2.0.0"
1308 | resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
1309 | integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
1310 |
1311 | yallist@^4.0.0:
1312 | version "4.0.0"
1313 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
1314 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
1315 |
--------------------------------------------------------------------------------