├── .eslintignore ├── .codeclimate.yml ├── .gitignore ├── PRIVACY_POLICY.md ├── images ├── main.png ├── main--en.png ├── main--ja.png └── iNEddTyWiMfLSwFD6qGq.png ├── package ├── images │ ├── icon.png │ ├── sort.svg │ ├── open.svg │ ├── remove.svg │ ├── divide.svg │ ├── toc.svg │ ├── silent.svg │ ├── pinned.svg │ ├── allwindow.svg │ ├── reload.svg │ ├── combine.svg │ ├── hash.svg │ ├── query.svg │ └── categorize.svg ├── manifest.json ├── duplicates-list.html ├── styles │ ├── common.css │ ├── duplicates-list.css │ └── popup.css ├── _locales │ ├── ja │ │ └── messages.json │ └── en │ │ └── messages.json └── popup.html ├── .stylelintrc.json ├── .prettierrc ├── tsconfig.json ├── .editorconfig ├── src ├── common.ts ├── global.d.ts ├── content-scripts.ts ├── duplicates-list.ts ├── popup.ts └── worker.ts ├── .eslintrc.json ├── .gitmessage ├── LICENSE ├── package.json ├── README--ja.md ├── README.md └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | *.d.ts 2 | /package 3 | -------------------------------------------------------------------------------- /.codeclimate.yml: -------------------------------------------------------------------------------- 1 | exclude_patterns: 2 | - '**/*.js' 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package/**/*.js 3 | *.zip 4 | -------------------------------------------------------------------------------- /PRIVACY_POLICY.md: -------------------------------------------------------------------------------- 1 | # Privacy policy 2 | 3 | https://gist.github.com/heppokofrontend/0247f1d697df2fd8e798320f403727e8 4 | -------------------------------------------------------------------------------- /images/main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heppokofrontend/chrome-extension-close-duplicate-tabs/HEAD/images/main.png -------------------------------------------------------------------------------- /images/main--en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heppokofrontend/chrome-extension-close-duplicate-tabs/HEAD/images/main--en.png -------------------------------------------------------------------------------- /images/main--ja.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heppokofrontend/chrome-extension-close-duplicate-tabs/HEAD/images/main--ja.png -------------------------------------------------------------------------------- /package/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heppokofrontend/chrome-extension-close-duplicate-tabs/HEAD/package/images/icon.png -------------------------------------------------------------------------------- /images/iNEddTyWiMfLSwFD6qGq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heppokofrontend/chrome-extension-close-duplicate-tabs/HEAD/images/iNEddTyWiMfLSwFD6qGq.png -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["stylelint-config-standard", "stylelint-config-recess-order"], 3 | "rules": { 4 | "no-descending-specificity": null 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "all", 3 | "tabWidth": 2, 4 | "useTabs": false, 5 | "semi": true, 6 | "singleQuote": true, 7 | "jsxSingleQuote": true, 8 | "printWidth": 100 9 | } 10 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "removeComments": true, 5 | "target": "ESNext", 6 | "outDir": "package" 7 | }, 8 | "include": ["src/**/*"] 9 | } 10 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | 5 | charset = utf-8 6 | indent_size = 2 7 | indent_style = space 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | end_of_line = lf 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /src/common.ts: -------------------------------------------------------------------------------- 1 | const getMessage = (key: string) => chrome.i18n.getMessage(key); 2 | const targets = document.querySelectorAll('[data-i18n]'); 3 | 4 | for (const elm of targets) { 5 | const { i18n } = elm.dataset; 6 | 7 | if (!i18n) { 8 | continue; 9 | } 10 | 11 | const textContent = getMessage(i18n); 12 | 13 | elm.textContent = textContent; 14 | } 15 | -------------------------------------------------------------------------------- /src/global.d.ts: -------------------------------------------------------------------------------- 1 | type SaveDataType = { 2 | ignorePathname?: boolean; 3 | ignoreQuery?: boolean; 4 | ignoreHash?: boolean; 5 | includeAllWindow?: boolean; 6 | includePinnedTabs?: boolean; 7 | foucedChangeURLWhenClickedAnchorLink?: boolean; 8 | noConfirm?: boolean; 9 | minCategorizeNumber?: number; 10 | }; 11 | type SortType = 'sortByUrl' | 'sortByTitle' | 'sortByHostAndTitle' | 'false'; 12 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "extends": [ 4 | "plugin:@typescript-eslint/recommended", 5 | "plugin:@typescript-eslint/recommended-requiring-type-checking", 6 | "plugin:@typescript-eslint/strict", 7 | "prettier" 8 | ], 9 | "plugins": ["@typescript-eslint"], 10 | "parser": "@typescript-eslint/parser", 11 | "parserOptions": { 12 | "ecmaVersion": "latest", 13 | "project": "./tsconfig.json" 14 | }, 15 | "rules": { 16 | "@typescript-eslint/no-floating-promises": "off" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /package/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "__MSG_extName__", 4 | "version": "1.2.3", 5 | "description": "__MSG_extDesc__", 6 | "action": { 7 | "default_icon": "images/icon.png", 8 | "default_popup": "popup.html" 9 | }, 10 | "content_scripts": [ 11 | { 12 | "matches": [""], 13 | "js": ["content-scripts.js"] 14 | } 15 | ], 16 | "background": { 17 | "service_worker": "worker.js" 18 | }, 19 | "permissions": ["tabs", "windows", "storage"], 20 | "icons": { 21 | "128": "images/icon.png" 22 | }, 23 | "default_locale": "en" 24 | } 25 | -------------------------------------------------------------------------------- /src/content-scripts.ts: -------------------------------------------------------------------------------- 1 | const onClick = (e: MouseEvent) => { 2 | if (e.currentTarget instanceof HTMLAnchorElement) { 3 | history.pushState(null, '', e.currentTarget.href); 4 | } 5 | }; 6 | const run = () => { 7 | chrome.storage.local.get('saveData', ({ saveData }: { saveData?: SaveDataType }) => { 8 | const anchors = document.querySelectorAll('a[href^="#"]'); 9 | 10 | anchors.forEach((a) => { 11 | a.removeEventListener('click', onClick); 12 | 13 | if (saveData?.foucedChangeURLWhenClickedAnchorLink) { 14 | a.addEventListener('click', onClick); 15 | } 16 | }); 17 | }); 18 | }; 19 | 20 | window.addEventListener('focus', run); 21 | run(); 22 | -------------------------------------------------------------------------------- /package/images/sort.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitmessage: -------------------------------------------------------------------------------- 1 | # ==== Emojis ==== 2 | # ✨ :sparkles: A new feature(新機能) 3 | # 🐛 :bug: Bug fixes(バグ修正) 4 | # 📚 :books: Change document only(ドキュメント更新) 5 | # 🐎 :racehorse: Changes to improve performance(パフォーマンスチューニング) 6 | # 🚿 :shower: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)(コードの処理が変わらない変更) 7 | # ♻️ :recycle: Changes that are not bug fixes or feature additions (リファクタリング) 8 | # 🚨 :rotating_light: Adding missing or correcting existing tests(テストコードまわり) 9 | # 🔧 :wrench: Changes to the build process, package.json, etc.(開発環境、CIなど) 10 | # 🗑 :wastebasket: Committing to repeal, delete, etc.(削除) 11 | # ⚠️ :warning: Important commits for quality and stable(重要なコミット) 12 | # ⚡️ :zap: Other changes(その他の更新) 13 | 14 | # ==== Commit comment example ==== 15 | # :zap: Subject text 16 | # 17 | # Commit comment body... 18 | -------------------------------------------------------------------------------- /package/images/open.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 13 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /package/images/remove.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /package/duplicates-list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

14 |

15 | 19 |

20 |
21 |
22 |

23 |

24 |
25 |
26 | 27 | 28 | -------------------------------------------------------------------------------- /package/images/divide.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2021 @heppokofrontend/chrome-extension-close-duplicate-tabs 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /package/images/toc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /package/images/silent.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /package/images/pinned.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /package/images/allwindow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 11 | 12 | 13 | 14 | 15 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /package/images/reload.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /package/images/combine.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /package/images/hash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /package/images/query.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 20 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "chrome-extension-close-duplicate-tabs", 3 | "description": "This is a Google Chrome extension that closes duplicate tabs in the current window.", 4 | "version": "1.0.0", 5 | "author": "heppokofrontend", 6 | "bugs": { 7 | "url": "https://github.com/heppokofrontend/chrome-extension-hand-tool/issues" 8 | }, 9 | "devDependencies": { 10 | "@types/chrome": "^0.0.321", 11 | "@typescript-eslint/eslint-plugin": "^5.58.0", 12 | "@typescript-eslint/parser": "^5.58.0", 13 | "eslint": "^8.38.0", 14 | "eslint-config-google": "^0.14.0", 15 | "eslint-config-prettier": "^8.8.0", 16 | "gh-pages": "^3.2.3", 17 | "http-server": "^14.1.1", 18 | "prettier": "^2.8.7", 19 | "stylelint": "^15.3.0", 20 | "stylelint-config-recess-order": "^4.0.0", 21 | "stylelint-config-standard": "^31.0.0", 22 | "terser": "^5.7.1", 23 | "ts-loader": "^9.2.3", 24 | "typescript": "^5.0.4", 25 | "uglify-js": "^3.17.4" 26 | }, 27 | "homepage": "https://github.com/heppokofrontend/chrome-extension-hand-tool#readme", 28 | "keywords": [], 29 | "license": "MIT", 30 | "main": "index.js", 31 | "repository": { 32 | "type": "git", 33 | "url": "git+https://github.com/heppokofrontend/chrome-extension-hand-tool.git" 34 | }, 35 | "scripts": { 36 | "build": "tsc --build", 37 | "deploy": "gh-pages -d package -b package", 38 | "dev": "tsc --watch", 39 | "eslint": "eslint . --ext .js,.ts --fix", 40 | "minify:common": "uglifyjs ./package/common.js -o ./package/common.js", 41 | "minify:content": "uglifyjs ./package/content-scripts.js -o ./package/content-scripts.js", 42 | "minify:popup": "uglifyjs ./package/popup.js -o ./package/popup.js", 43 | "minify:list": "uglifyjs ./package/duplicates-list.js -o ./package/duplicates-list.js", 44 | "minify:worker": "uglifyjs ./package/worker.js -o ./package/worker.js", 45 | "postbuild": "yarn minify:common && yarn minify:content && yarn minify:popup && yarn minify:list && yarn minify:worker", 46 | "predeploy": "yarn build", 47 | "serve": "http-server ./ -o index.html", 48 | "start": "yarn dev" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /package/images/categorize.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 14 | 19 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /package/styles/common.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --color-outline: #000; 3 | --color-h1-text: #333; 4 | --color-h1-bg: #ddd; 5 | --color-background: #f1f1f1; 6 | --color-background-secondary: #fff; 7 | --color-label-text: #000; 8 | --color-label-bg: #dfdfdf; 9 | --color-checkbox-border: #e1e1e1; 10 | --color-danger-title-text: inherit; 11 | --color-danger-title-font-weight: normal; 12 | --color-danger-title-bg: #ff7c7c; 13 | --color-danger-label-bg: #f1f1f1; 14 | --color-hint: #446ca9; 15 | --color-dialog-text: #333; 16 | --color-dialog-background: #fff; 17 | --border-details: 1px solid #ff7c7c; 18 | --border-top-details-content: 0; 19 | --border-bottom-h1: 0; 20 | } 21 | 22 | @media (prefers-color-scheme: dark) { 23 | :root { 24 | --color-outline: #fff; 25 | --color-h1-text: #898989; 26 | --color-h1-bg: #202124; 27 | --color-background: #292a2d; 28 | --color-background-secondary: #202124; 29 | --color-checkbox-border: #39393b; 30 | --color-label-text: #ddd; 31 | --color-label-bg: #515254; 32 | --color-danger-title-text: #ff7c7c; 33 | --color-danger-title-font-weight: bold; 34 | --color-danger-title-bg: #202124; 35 | --color-danger-label-bg: #414245; 36 | --color-hint: #8ab4f8; 37 | --color-dialog-text: #fff; 38 | --color-dialog-background: #292a2d; 39 | --border-details: 1px solid #703031; 40 | --border-top-details-content: 2px solid #292a2d; 41 | --border-bottom-h1: 1px solid #111; 42 | } 43 | } 44 | 45 | * { 46 | box-sizing: border-box; 47 | padding: 0; 48 | margin: 0; 49 | } 50 | 51 | :focus-visible { 52 | outline: none; 53 | box-shadow: 0 0 0 3px var(--color-outline); 54 | } 55 | 56 | body { 57 | font-size: 75%; 58 | line-height: 1.6; 59 | background: var(--color-background); 60 | } 61 | 62 | h1 { 63 | padding: 10px 16px; 64 | font-family: monospace; 65 | font-size: 12px; 66 | font-weight: normal; 67 | line-height: 1.2; 68 | color: var(--color-h1-text); 69 | text-align: center; 70 | letter-spacing: 2px; 71 | background: var(--color-h1-bg); 72 | border-bottom: var(--border-bottom-h1); 73 | } 74 | 75 | button { 76 | font-size: 11px; 77 | color: #000; 78 | background: #42ccc0; 79 | border: 0; 80 | border-radius: 6px; 81 | } 82 | 83 | button:hover, 84 | button:focus { 85 | opacity: 0.8; 86 | } 87 | 88 | .main { 89 | padding: 14px 14px 20px; 90 | } 91 | -------------------------------------------------------------------------------- /package/styles/duplicates-list.css: -------------------------------------------------------------------------------- 1 | #return { 2 | width: fit-content; 3 | padding: 16px; 4 | margin-left: auto; 5 | } 6 | 7 | #return button { 8 | padding: 8px 16px; 9 | } 10 | 11 | #container:not(:empty) { 12 | width: fit-content; 13 | max-width: 960px; 14 | padding: 0 28px; 15 | margin-block: 2em; 16 | margin-inline: auto; 17 | color: var(--color-label-text); 18 | } 19 | 20 | h2 { 21 | position: sticky; 22 | top: 0; 23 | padding: 12px 10px; 24 | margin-block: 0 12px; 25 | font-size: 1.5em; 26 | line-height: 1.2; 27 | word-break: break-all; 28 | background-color: var(--color-label-bg); 29 | border-radius: 4px; 30 | } 31 | 32 | h2:nth-of-type(1) { 33 | margin-top: 0; 34 | } 35 | 36 | button { 37 | display: grid; 38 | grid-template-columns: auto auto; 39 | gap: 8px; 40 | align-items: center; 41 | padding: 10px; 42 | } 43 | 44 | button img { 45 | width: 1lh; 46 | height: 1lh; 47 | } 48 | 49 | button[aria-disabled='true'] { 50 | text-decoration-line: line-through; 51 | } 52 | 53 | table { 54 | margin-bottom: 6.75rem; 55 | word-break: break-all; 56 | border-collapse: separate; 57 | } 58 | 59 | tbody :where(th, td) { 60 | padding: 12px 0 0; 61 | vertical-align: top; 62 | } 63 | 64 | th:first-child { 65 | word-break: keep-all; 66 | } 67 | 68 | :where(th, td):not(:first-child) { 69 | padding-left: 16px; 70 | } 71 | 72 | .status { 73 | font-weight: bold; 74 | word-break: break-word; 75 | visibility: hidden; 76 | } 77 | 78 | [data-closed='true'] .status { 79 | color: var(--color-danger-title-text); 80 | visibility: visible; 81 | } 82 | 83 | #empty-message { 84 | display: none; 85 | } 86 | 87 | #container:empty + #empty-message { 88 | display: grid; 89 | place-items: center; 90 | font-size: 200%; 91 | color: var(--color-label-text); 92 | text-align: center; 93 | } 94 | 95 | #empty-message p { 96 | display: none; 97 | } 98 | 99 | [data-include-all-window='true'] #return { 100 | display: none; 101 | } 102 | 103 | [data-include-all-window='true'] #empty-message .all { 104 | display: block; 105 | } 106 | 107 | [data-include-all-window='true'] #container:empty + #empty-message { 108 | min-height: calc(100vh - (20px + 0.875rem) * 2); 109 | } 110 | 111 | [data-include-all-window='false'] #empty-message .single { 112 | display: block; 113 | } 114 | 115 | [data-include-all-window='false'] #container:empty + #empty-message { 116 | min-height: calc(100vh - (20px + 0.875rem + 3rem + 1.75rem) * 2); 117 | } 118 | -------------------------------------------------------------------------------- /README--ja.md: -------------------------------------------------------------------------------- 1 | # 重複したタブを閉じるやつ 2 | 3 | [![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE) [![Maintainability](https://api.codeclimate.com/v1/badges/6a4a32f68f2776d2710c/maintainability)](https://codeclimate.com/github/heppokofrontend/chrome-extension-close-duplicate-tabs/maintainability) 4 | 5 | ![](./images/main--ja.png) 6 | 7 | [English version is here.](./README.md) 8 | 9 | 仕事中は GitHub や Redmine、Backlog などからたくさんの通知が来ます。 10 | 11 | そういう時、あとで読もうと思って別タブで開いておくのを何度か繰り返していると、気がついた時にはあなたのブラウザはタブだらけ…。 12 | 13 | このエクステンションはそんな状態で重複しているタブをすべて閉じ、残ったタブもまとめてリロードして最新状態をすぐに確認できます。 14 | 15 | ## Download 16 | 17 | Google Chrome にインストールしてください。 18 | 19 | [![Available in the Chrome Web Store](./images/iNEddTyWiMfLSwFD6qGq.png)](https://chrome.google.com/webstore/detail/close-duplicate-tab/ollnnjepahcgphpjjhcfohpelmpldghj) 20 | 21 | ## 使い方 22 | 23 | 1. このブラウザ拡張のアイコンをクリックします 24 | 2. 必要に応じて設定を変更します(チェックボックス) 25 | 3. 使いたい機能ごとにボタンをクリックします 26 | 27 | ### URL の比較 28 | 29 | 初期値では、URL の比較に Origin (Scheme + FQDN + Port)からクエリまでを利用します。 30 | 31 | なお、比較時に次のようなデフォルトドキュメントは常に省略されます。 32 | 33 | > /index.html 34 | > /index.htm 35 | > /index.xhtml 36 | > /index.php 37 | > /index.cgi 38 | > /index.aspx 39 | 40 | たとえば、次のような URL はすべて同じものとして扱われます。 41 | 42 | ``` 43 | https://www.example.com/index.html 44 | https://www.example.com/ 45 | 46 | → https://www.example.com/ 47 | ``` 48 | 49 | ``` 50 | https://www.example.com/index.php#bar 51 | https://www.example.com/index.htm#bar 52 | https://www.example.com/index.cgi#bar 53 | https://www.example.com/#bar 54 | 55 | → https://www.example.com/#bar 56 | ``` 57 | 58 | ### クエリを無視する 59 | 60 | タブごとの URL の比較をするときに、URL クエリを無視するかどうかを切り替えるものです。 61 | 62 | URL クエリとは、URL のうち次の範囲を指します。 63 | 64 | ``` 65 | https://www.example.com/?a=10&b=20#foo 66 | 67 | -> ?a=10&b=20 68 | ``` 69 | 70 | クエリが無視されている場合、次のような URL はすべて同じものとして扱われます。 71 | 72 | ``` 73 | https://www.example.com/ 74 | https://www.example.com/?a=10 75 | https://www.example.com/?a=10&b=20 76 | https://www.example.com/index.html?a=10&b=20 77 | 78 | → https://www.example.com/ 79 | ``` 80 | 81 | ### ハッシュを無視する 82 | 83 | タブごとの URL の比較をするときに、URL ハッシュを無視するかどうかを切り替えるものです。 84 | 85 | URL ハッシュとは、URL のうち次の範囲を指します。 86 | 87 | ``` 88 | https://www.example.com/?a=10&b=20#foo 89 | 90 | -> #foo 91 | ``` 92 | 93 | ハッシュが無視されている場合、次のような URL はすべて同じものとして扱われます。 94 | 95 | ``` 96 | https://www.example.com/ 97 | https://www.example.com/#foo 98 | https://www.example.com/#bar 99 | https://www.example.com/index.html#baz 100 | 101 | → https://www.example.com/ 102 | ``` 103 | 104 | ### 両方とも無視する 105 | 106 | クエリとハッシュが無視されている場合、次のような URL はすべて同じものとして扱われます。 107 | 108 | ``` 109 | https://www.example.com/ 110 | https://www.example.com/#baz 111 | https://www.example.com/#bar 112 | https://www.example.com/index.html#bar 113 | https://www.example.com/?a=10 114 | https://www.example.com/?a=10&b=20 115 | https://www.example.com/?a=10&b=20#foo 116 | https://www.example.com/?a=10&b=20#baz 117 | 118 | → https://www.example.com/ 119 | ``` 120 | -------------------------------------------------------------------------------- /src/duplicates-list.ts: -------------------------------------------------------------------------------- 1 | type ValidTab = chrome.tabs.Tab & { 2 | id: number; 3 | url: string; 4 | }; 5 | 6 | chrome.storage.local.get('saveData', ({ saveData }: { saveData: SaveDataType }) => { 7 | document.body.dataset.includeAllWindow = String(saveData.includeAllWindow ?? false); 8 | }); 9 | 10 | const render = async () => { 11 | const { lastWindowId } = await chrome.storage.session.get('lastWindowId'); 12 | 13 | const returnButton = document.querySelector('#return button'); 14 | returnButton?.addEventListener('click', () => { 15 | if (typeof lastWindowId === 'number') { 16 | chrome.windows.update(lastWindowId, { focused: true }, () => { 17 | if (chrome.runtime.lastError) { 18 | alert(chrome.i18n.getMessage('duplicates_already_closed')); 19 | return; 20 | } 21 | }); 22 | } 23 | }); 24 | 25 | const { duplicatedEntries } = await chrome.storage.session.get('duplicatedEntries'); 26 | const typedDuplicatedEntries = duplicatedEntries as [string, ValidTab[]][]; 27 | const container = document.querySelector('#container'); 28 | const fragment = document.createDocumentFragment(); 29 | const theadSrc = ` 30 | 31 | 32 | Tab ID 33 | Title 34 | 35 | 36 | `; 37 | const closedMessage = chrome.i18n.getMessage('duplicates_already_closed'); 38 | 39 | for (const [url, tabs] of typedDuplicatedEntries) { 40 | const section = document.createElement('div'); 41 | const heading = document.createElement('h2'); 42 | heading.textContent = url; 43 | 44 | const table = document.createElement('table'); 45 | const tbody = document.createElement('tbody'); 46 | 47 | for (const tab of tabs) { 48 | tbody.insertAdjacentHTML( 49 | 'afterbegin', 50 | ` 51 | 52 | 56 | 57 |
${tab.title}
58 |
${closedMessage}
59 | 60 | 61 | `, 62 | ); 63 | 64 | const button = tbody.querySelector('button'); 65 | const tr = tbody.querySelector('tr'); 66 | button?.addEventListener('click', () => { 67 | const tabId = tab.id; 68 | 69 | chrome.tabs.update(tabId, { active: true }, () => { 70 | if (chrome.runtime.lastError && tr) { 71 | tr.dataset.closed = 'true'; 72 | button.setAttribute('aria-disabled', 'true'); 73 | return; 74 | } 75 | 76 | chrome.windows.update(tab.windowId, { focused: true }, () => { 77 | if (chrome.runtime.lastError) { 78 | console.error(chrome.runtime.lastError.message); 79 | return; 80 | } 81 | }); 82 | }); 83 | }); 84 | } 85 | 86 | table.insertAdjacentHTML('beforeend', theadSrc); 87 | table.appendChild(tbody); 88 | section.appendChild(heading); 89 | section.appendChild(table); 90 | fragment.appendChild(section); 91 | } 92 | 93 | container?.appendChild(fragment); 94 | }; 95 | 96 | render(); 97 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Close duplicate tabs 2 | 3 | [![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE) [![Maintainability](https://api.codeclimate.com/v1/badges/6a4a32f68f2776d2710c/maintainability)](https://codeclimate.com/github/heppokofrontend/chrome-extension-close-duplicate-tabs/maintainability) 4 | 5 | ![](./images/main--en.png) 6 | 7 | [日本語はこちら](./README--ja.md) 8 | 9 | At work, I get a lot of notifications from GitHub, Redmine, Backlog, and so on. 10 | 11 | If you keep opening them in a new tab to read them later, you will have too many tabs in no time. 12 | 13 | This Extension allows you to organize them in an instant and reload the remaining tabs to make them up-to-date! 14 | 15 | ## Download 16 | 17 | Install it on your Google Chrome from here. 18 | 19 | [![Available in the Chrome Web Store](./images/iNEddTyWiMfLSwFD6qGq.png)](https://chrome.google.com/webstore/detail/close-duplicate-tab/ollnnjepahcgphpjjhcfohpelmpldghj) 20 | 21 | ## How to use 22 | 23 | 1. Click the Chrome Extension icon 24 | 2. Choose state of setting switches (checkbox) 25 | 3. Click buttons 26 | 27 | ### URL matching 28 | 29 | By default, it will check for URL matches using from Origin (Scheme + FQDN + Port) to Query. 30 | 31 | And the default document will then be ignored. 32 | 33 | > /index.html 34 | > /index.htm 35 | > /index.xhtml 36 | > /index.php 37 | > /index.cgi 38 | > /index.aspx 39 | 40 | In other words, all these URLs will be treated as identical. 41 | 42 | ``` 43 | https://www.example.com/index.html 44 | https://www.example.com/ 45 | 46 | → https://www.example.com/ 47 | ``` 48 | 49 | ``` 50 | https://www.example.com/index.php#bar 51 | https://www.example.com/index.htm#bar 52 | https://www.example.com/index.cgi#bar 53 | https://www.example.com/#bar 54 | 55 | → https://www.example.com/#bar 56 | ``` 57 | 58 | ### Ignore the query 59 | 60 | This flag determines whether or not to ignore the URL query when comparing the URLs in each tab. 61 | 62 | A URL query is this range in URL. 63 | 64 | ``` 65 | https://www.example.com/?a=10&b=20#foo 66 | 67 | -> ?a=10&b=20 68 | ``` 69 | 70 | If the query is ignored, All these URLs are considered to be the same. 71 | 72 | ``` 73 | https://www.example.com/ 74 | https://www.example.com/?a=10 75 | https://www.example.com/?a=10&b=20 76 | https://www.example.com/index.html?a=10&b=20 77 | 78 | → https://www.example.com/ 79 | ``` 80 | 81 | ### Ignore the hash 82 | 83 | This flag determines whether or not to ignore the URL hash when comparing the URLs in each tab. 84 | 85 | A URL hash is this range in URL. 86 | 87 | ``` 88 | https://www.example.com/?a=10&b=20#foo 89 | 90 | -> #foo 91 | ``` 92 | 93 | If the hash is ignored, All these URLs are considered to be the same. 94 | 95 | ``` 96 | https://www.example.com/ 97 | https://www.example.com/#foo 98 | https://www.example.com/#bar 99 | https://www.example.com/index.html#baz 100 | 101 | → https://www.example.com/ 102 | ``` 103 | 104 | ### Ignore them both 105 | 106 | If query and hash are ignored, , All these URLs are considered to be the same. 107 | 108 | ``` 109 | https://www.example.com/ 110 | https://www.example.com/#baz 111 | https://www.example.com/#bar 112 | https://www.example.com/index.html#bar 113 | https://www.example.com/?a=10 114 | https://www.example.com/?a=10&b=20 115 | https://www.example.com/?a=10&b=20#foo 116 | https://www.example.com/?a=10&b=20#baz 117 | 118 | → https://www.example.com/ 119 | ``` 120 | -------------------------------------------------------------------------------- /package/_locales/ja/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extName": { 3 | "message": "重複したタブを閉じるやつ" 4 | }, 5 | "extDesc": { 6 | "message": "現在のウィンドウでURLが重複しているタブを閉じます。" 7 | }, 8 | "checkbox_hash": { 9 | "message": "ハッシュを無視する" 10 | }, 11 | "checkbox_query": { 12 | "message": "クエリを無視する" 13 | }, 14 | "checkbox_window": { 15 | "message": "すべてのウィンドウを対象にする" 16 | }, 17 | "checkbox_pinned": { 18 | "message": "固定されたタブを対象にする" 19 | }, 20 | "checkbox_pathname": { 21 | "message": "パス名を無視する" 22 | }, 23 | "checkbox_foucedChangeURLWhenClickedAnchorLink": { 24 | "message": "URLハッシュを強制的に変更する" 25 | }, 26 | "checkbox_silent": { 27 | "message": "確認ダイアログを表示しない" 28 | }, 29 | "btn_remove": { 30 | "message": "重複したタブを閉じる" 31 | }, 32 | "btn_reload": { 33 | "message": "タブをすべてリロードする" 34 | }, 35 | "btn_categorize": { 36 | "message": "ホスト名ごとに\n別窓にする" 37 | }, 38 | "btn_divide": { 39 | "message": "すべてのタブを\n別窓にする" 40 | }, 41 | "btn_sort": { 42 | "message": "タブを並び変える" 43 | }, 44 | "btn_combine": { 45 | "message": "全ウィンドウを\n1つにまとめる" 46 | }, 47 | "hint_pathname": { 48 | "message": "推奨:ハッシュとクエリの無視の有効化" 49 | }, 50 | "hint_foucedChangeURLWhenClickedAnchorLink": { 51 | "message": "目次などのページ内リンクをクリックしたとき、強制的にURLを更新します。" 52 | }, 53 | "dialog_comfirm": { 54 | "message": "確認" 55 | }, 56 | "dialog_notice": { 57 | "message": "お知らせ" 58 | }, 59 | "dialog_categorize": { 60 | "message": "ホスト名ごとに別窓にする" 61 | }, 62 | "dialog_command_apply": { 63 | "message": "実行" 64 | }, 65 | "dialog_command_true": { 66 | "message": "はい" 67 | }, 68 | "dialog_command_false": { 69 | "message": "キャンセル" 70 | }, 71 | "dialog_command_show_duplicate": { 72 | "message": "重複を確認" 73 | }, 74 | "dialog_command_categorize_range1": { 75 | "message": "" 76 | }, 77 | "dialog_command_categorize_range2": { 78 | "message": " 枚以下のタブは1つにまとめる" 79 | }, 80 | "dialog_command_sortByUrl": { 81 | "message": "URL優先" 82 | }, 83 | "dialog_command_sortByTitle": { 84 | "message": "ページ名優先" 85 | }, 86 | "dialog_command_sortByHostAndTitle": { 87 | "message": "ホスト名+ページ名" 88 | }, 89 | "dialog_remove": { 90 | "message": "重複したタブを閉じます。\nよろしいですか?" 91 | }, 92 | "dialog_remove_allwin": { 93 | "message": "すべてのウィンドウの重複したタブを閉じます。\nよろしいですか?" 94 | }, 95 | "dialog_reload": { 96 | "message": "すべてのタブをリロードします。\nよろしいですか?" 97 | }, 98 | "dialog_reload_allwin": { 99 | "message": "すべてのウィンドウの\nすべてのタブをリロードします。\nよろしいですか?" 100 | }, 101 | "dialog_combine": { 102 | "message": "全ウィンドウを1つにまとめます。\nよろしいですか?" 103 | }, 104 | "dialog_combine_all": { 105 | "message": "「すべてのウィンドウを対象にする」が\n無効化されています。\n\n本当に実行しますか?" 106 | }, 107 | "dialog_divide": { 108 | "message": "すべてのタブを別窓にします。\nよろしいですか?" 109 | }, 110 | "dialog_divide_all": { 111 | "message": "「すべてのウィンドウを対象にする」が\n有効です。\n\nタブの枚数が多いと処理に時間がかかったり、\nクラッシュする可能性があります。\n\n本当に実行しますか?" 112 | }, 113 | "dialog_ignorePathname": { 114 | "message": "このオプションだけでは\n「ハッシュ」と「クエリ」は無視されないことにご注意ください。" 115 | }, 116 | "dialog_noConfirm": { 117 | "message": "今後、確認ダイアログを表示せずに\nタスクを実行します。" 118 | }, 119 | "dialog_sort": { 120 | "message": "どのルールでタブを並び替えますか?" 121 | }, 122 | "duplicates_title": { 123 | "message": "重複タブ一覧 - 重複したタブを閉じるやつ" 124 | }, 125 | "duplicates_return": { 126 | "message": "元のウィンドウに戻る" 127 | }, 128 | "duplicates_already_closed": { 129 | "message": "すでに閉じられています。" 130 | }, 131 | "duplicates_empty_message": { 132 | "message": "このウィンドウに重複しているタブはありません。" 133 | }, 134 | "duplicates_empty_message_all": { 135 | "message": "すべてのウィンドウで重複しているタブはありません。" 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /package/_locales/en/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extName": { 3 | "message": "Close duplicate tab" 4 | }, 5 | "extDesc": { 6 | "message": "Close duplicate tab on current window." 7 | }, 8 | "checkbox_hash": { 9 | "message": "Ignore hash" 10 | }, 11 | "checkbox_query": { 12 | "message": "Ignore query" 13 | }, 14 | "checkbox_window": { 15 | "message": "Include all windows" 16 | }, 17 | "checkbox_pinned": { 18 | "message": "Include pinned tabs" 19 | }, 20 | "checkbox_pathname": { 21 | "message": "Ignore pathname" 22 | }, 23 | "checkbox_foucedChangeURLWhenClickedAnchorLink": { 24 | "message": "Force URL Hash Change" 25 | }, 26 | "checkbox_silent": { 27 | "message": "Do not show confirmation dialog" 28 | }, 29 | "btn_remove": { 30 | "message": "Close duplicate tabs" 31 | }, 32 | "btn_reload": { 33 | "message": "Reload all tabs" 34 | }, 35 | "btn_categorize": { 36 | "message": "Divide all tabs for each hostname" 37 | }, 38 | "btn_divide": { 39 | "message": "Divide all tabs" 40 | }, 41 | "btn_sort": { 42 | "message": "Sort the tabs" 43 | }, 44 | "btn_combine": { 45 | "message": "Combine all windows \ninto one window" 46 | }, 47 | "hint_pathname": { 48 | "message": "Recommended: enable [ Ignore hash ] and [ Ignore query ]." 49 | }, 50 | "hint_foucedChangeURLWhenClickedAnchorLink": { 51 | "message": "When you click on intra-page links like the table of contents, the URL will be forcibly updated." 52 | }, 53 | "dialog_comfirm": { 54 | "message": "Alert" 55 | }, 56 | "dialog_notice": { 57 | "message": "Notice" 58 | }, 59 | "dialog_categorize": { 60 | "message": "Divide all tabs for each hostname" 61 | }, 62 | "dialog_command_apply": { 63 | "message": "Apply" 64 | }, 65 | "dialog_command_true": { 66 | "message": "YES" 67 | }, 68 | "dialog_command_false": { 69 | "message": "Cancel" 70 | }, 71 | "dialog_command_show_duplicate": { 72 | "message": "Find Duplicates" 73 | }, 74 | "dialog_command_categorize_range1": { 75 | "message": "Less than " 76 | }, 77 | "dialog_command_categorize_range2": { 78 | "message": " are included in one window." 79 | }, 80 | "dialog_command_sortByUrl": { 81 | "message": "By URL" 82 | }, 83 | "dialog_command_sortByTitle": { 84 | "message": "By page title" 85 | }, 86 | "dialog_command_sortByHostAndTitle": { 87 | "message": "By hostname + \npage title" 88 | }, 89 | "dialog_remove": { 90 | "message": "Will close duplicate tabs. \nAre you sure you want to run this?" 91 | }, 92 | "dialog_remove_allwin": { 93 | "message": "Will close duplicate tabs in all windows. \nAre you sure you want to run this?" 94 | }, 95 | "dialog_reload": { 96 | "message": "Will reload all tabs. \nAre you sure you want to run this?" 97 | }, 98 | "dialog_reload_allwin": { 99 | "message": "Will reload all tabs in all windows. \nAre you sure you want to run this?" 100 | }, 101 | "dialog_combine": { 102 | "message": "Will combine all windows into one window.\nAre you sure you want to run it?" 103 | }, 104 | "dialog_combine_all": { 105 | "message": "\"Include all windows\" is disabled.\nAre you sure you want to run it?" 106 | }, 107 | "dialog_divide": { 108 | "message": "Will divide all tabs. \nAre you sure you want to run this?" 109 | }, 110 | "dialog_divide_all": { 111 | "message": "\"Include all windows\" is enabled.\nProcessing may take longer or crash. \n\nAre you sure you want to run this?" 112 | }, 113 | "dialog_ignorePathname": { 114 | "message": "Note that \"hash\" and \"query\" are not ignored by simply enabling this option." 115 | }, 116 | "dialog_noConfirm": { 117 | "message": "From now on, the task will be executed without displaying a confirmation dialog." 118 | }, 119 | "dialog_sort": { 120 | "message": "Which rules would you like to \nsort your tabs?" 121 | }, 122 | "duplicates_title": { 123 | "message": "Duplicate Tabs List - Close duplicate tab" 124 | }, 125 | "duplicates_return": { 126 | "message": "Back to Original Window" 127 | }, 128 | "duplicates_already_closed": { 129 | "message": "The window has already been closed." 130 | }, 131 | "duplicates_empty_message": { 132 | "message": "There are no duplicate tabs in this window." 133 | }, 134 | "duplicates_empty_message_all": { 135 | "message": "There are no duplicate tabs in all windows." 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /package/styles/popup.css: -------------------------------------------------------------------------------- 1 | body { 2 | width: 380px; 3 | } 4 | 5 | /* ----------------------------------------------------------------------------- 6 | * Buttons 7 | * -------------------------------------------------------------------------- */ 8 | 9 | .buttons { 10 | display: grid; 11 | grid-template-columns: repeat(2, 1fr); 12 | } 13 | 14 | .buttons button { 15 | width: 100%; 16 | } 17 | 18 | .buttons button [data-i18n] { 19 | white-space: pre-wrap; 20 | } 21 | 22 | /* ----------------------------------------------------------------------------- 23 | * Options 24 | * -------------------------------------------------------------------------- */ 25 | 26 | label:has([type='checkbox']) { 27 | position: relative; 28 | z-index: 0; 29 | display: flex; 30 | align-items: center; 31 | padding: 12px 10px; 32 | color: var(--color-label-text); 33 | background-color: var(--color-label-bg); 34 | border-radius: 4px; 35 | } 36 | 37 | label:has([type='checkbox']) .img { 38 | display: grid; 39 | place-items: center; 40 | min-width: 24px; 41 | max-width: 24px; 42 | min-height: 24px; 43 | max-height: 24px; 44 | font-weight: bold; 45 | color: #fff; 46 | background: #008080; 47 | border-radius: 4px; 48 | } 49 | 50 | .options { 51 | margin: 20px 0; 52 | } 53 | 54 | .options p:not(:first-child) { 55 | margin-top: 4px; 56 | } 57 | 58 | .label { 59 | display: block; 60 | padding: 0 80px 0 6px; 61 | } 62 | 63 | .label::before, 64 | .label::after { 65 | position: absolute; 66 | top: 0; 67 | right: 10px; 68 | bottom: 0; 69 | display: block; 70 | margin: auto 0; 71 | content: ''; 72 | } 73 | 74 | .label::before { 75 | z-index: 1; 76 | width: 32px; 77 | height: 32px; 78 | background: #f0f3f4; 79 | border-radius: 50%; 80 | box-shadow: 0 0 3px rgb(0 0 0 / 60%); 81 | } 82 | 83 | [data-state='loaded'] .label::before { 84 | transition: 0.2s right ease-out; 85 | } 86 | 87 | .label::after { 88 | width: 72px; 89 | height: 32px; 90 | background: #42ccc0; 91 | border-radius: 20px; 92 | box-shadow: 0 0 3px rgb(0 0 0 / 60%) inset, 0 0 0 4px var(--color-checkbox-border); 93 | } 94 | 95 | [data-state='loaded'] .label::after { 96 | transition: 0.2s background-color ease-out; 97 | } 98 | 99 | label input[type='checkbox'] { 100 | position: absolute; 101 | inset: 0; 102 | opacity: 0; 103 | } 104 | 105 | label input[type='checkbox']:not(:checked) + span::before { 106 | right: 49px; 107 | } 108 | 109 | label input[type='checkbox']:not(:checked) + span::after { 110 | background-color: #cbd7db; 111 | } 112 | 113 | label input[type='checkbox']:focus-visible + span::after { 114 | box-shadow: 0 0 3px rgb(0 0 0 / 60%) inset, 0 0 0 4px #e1e1e1, 0 0 0 6px var(--color-outline); 115 | } 116 | 117 | .hint { 118 | display: flex; 119 | gap: 0.5em; 120 | padding-left: 4px; 121 | font-size: 10px; 122 | color: var(--color-hint); 123 | } 124 | 125 | .hint + .hint { 126 | margin-top: 0; 127 | } 128 | 129 | .hint + p:not(.hint) { 130 | margin-top: 12px; 131 | } 132 | 133 | .hint em { 134 | font-style: normal; 135 | font-weight: bold; 136 | text-decoration: underline; 137 | } 138 | 139 | /* ----------------------------------------------------------------------------- 140 | * Safety Zone 141 | * -------------------------------------------------------------------------- */ 142 | .safety .buttons { 143 | gap: 20px; 144 | } 145 | 146 | .safety .buttons p { 147 | display: grid; 148 | } 149 | 150 | .safety .buttons button { 151 | aspect-ratio: 1 / 1; 152 | } 153 | 154 | .safety .buttons button .img { 155 | display: block; 156 | margin-bottom: 14px; 157 | } 158 | 159 | .safety .buttons button .inner { 160 | display: block; 161 | padding: 10px 3px; 162 | } 163 | 164 | /* ----------------------------------------------------------------------------- 165 | * Danger Zone 166 | * -------------------------------------------------------------------------- */ 167 | 168 | details { 169 | margin-top: 30px; 170 | overflow: hidden; 171 | border: var(--border-details); 172 | border-radius: 4px; 173 | } 174 | 175 | details summary { 176 | padding: 15px 10px; 177 | font-weight: var(--color-danger-title-font-weight); 178 | color: var(--color-danger-title-text); 179 | cursor: default; 180 | background-color: var(--color-danger-title-bg); 181 | } 182 | 183 | details summary:focus-visible { 184 | box-shadow: none; 185 | } 186 | 187 | details summary:focus-visible span { 188 | border-radius: 4px; 189 | box-shadow: 0 0 0 3px var(--color-outline); 190 | } 191 | 192 | details .content { 193 | padding: 10px 14px 24px; 194 | background-color: var(--color-background-secondary); 195 | border-top: var(--border-top-details-content); 196 | border-radius: 0 0 4px 4px; 197 | } 198 | 199 | details .content label { 200 | background-color: var(--color-danger-label-bg); 201 | } 202 | 203 | .danger .buttons { 204 | gap: 8px; 205 | margin: 10px 0 0; 206 | } 207 | 208 | .danger .buttons p { 209 | display: flex; 210 | } 211 | 212 | .danger .buttons button { 213 | padding: 10px 16px 10px 8px; 214 | color: #111; 215 | background-color: #ff7c7c; 216 | } 217 | 218 | .danger .buttons button .img { 219 | padding-top: 2px; 220 | margin-right: 10px; 221 | } 222 | 223 | .danger .buttons button [data-i18n] { 224 | flex-grow: 1; 225 | } 226 | 227 | .danger .buttons button[data-task-name='categorize'] .img { 228 | padding-top: 4px; 229 | margin-right: 12px; 230 | margin-left: 2px; 231 | } 232 | 233 | .danger .buttons .inner { 234 | display: flex; 235 | align-items: center; 236 | justify-content: flex-start; 237 | } 238 | 239 | .danger .options .img { 240 | background-color: #900; 241 | } 242 | 243 | .danger .options label input:checked + .label::after { 244 | background-color: #ff7c7c; 245 | } 246 | 247 | .danger .options:last-child { 248 | padding-bottom: 0; 249 | margin-bottom: 0; 250 | border-bottom: 0; 251 | } 252 | 253 | /* ----------------------------------------------------------------------------- 254 | * Dialog 255 | * -------------------------------------------------------------------------- */ 256 | 257 | dialog { 258 | inset: 0 0 30px; 259 | max-width: 324px; 260 | padding: 32px 28px; 261 | margin: auto; 262 | overflow: hidden; 263 | color: var(--color-dialog-text); 264 | text-align: center; 265 | background: var(--color-dialog-background); 266 | border: 0; 267 | border-radius: 4px; 268 | box-shadow: 0 0 10px 0 rgb(0 0 0 / 80%); 269 | } 270 | 271 | dialog::backdrop { 272 | background: rgb(0 0 0 / 40%); 273 | } 274 | 275 | dialog #confirm-text, 276 | dialog #notice-text { 277 | margin-bottom: 24px; 278 | } 279 | 280 | dialog button { 281 | min-width: 80px; 282 | padding: 10px; 283 | } 284 | 285 | #dialog-buttons { 286 | display: flex; 287 | flex-wrap: wrap; 288 | gap: 10px; 289 | justify-content: center; 290 | } 291 | 292 | #dialog-buttons button { 293 | flex-basis: calc(50% - 5px); 294 | white-space: pre-wrap; 295 | } 296 | 297 | /* for 3 columns buttons */ 298 | #dialog-buttons:has(button:first-child):has(button:last-child:nth-child(3)) { 299 | display: grid; 300 | grid-template-columns: repeat(3, 1fr); 301 | } 302 | 303 | #dialog-buttons button:not(:first-child):last-child { 304 | background: #b3ccca; 305 | } 306 | 307 | .textfield-label-in-dialog { 308 | display: block; 309 | margin: 0 0 1.5em; 310 | text-align: left; 311 | } 312 | 313 | .textfield-label-in-dialog input[type='number'] { 314 | width: 3.5em; 315 | padding: 4px; 316 | font-size: 18px; 317 | text-align: right; 318 | letter-spacing: 8px; 319 | border-radius: 4px; 320 | } 321 | -------------------------------------------------------------------------------- /package/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

14 | 15 |
16 |
17 |
18 |

19 | 27 |

28 | 29 |

30 | 38 |

39 |
40 | 41 |
42 |

43 | 54 |

55 | 56 |

57 | 💡 58 | https://example.com/abc/def?query=hoge&query2=piyo#hash 59 |

60 | 61 |

62 | 73 |

74 | 75 |

76 | 💡 77 | https://example.com/abc/def?query=hoge&query2=piyo#hash 78 |

79 |
80 |
81 | 82 |
83 | Danger Zone 84 | 85 |
86 |
87 |

88 | 96 |

97 | 98 |

99 | 107 |

108 | 109 |

110 | 118 |

119 | 120 |

121 | 129 |

130 |
131 | 132 |
133 |

134 | 141 |

142 | 143 |

144 | 151 |

152 | 153 |

154 | 163 |

164 | 165 |

166 | 💡 167 | https://example.com/abc/def?query=hoge&query2=piyo#hash 168 |

169 |

170 | 💡 171 | 172 |

173 | 174 |

175 | 188 |

189 | 190 | 194 | 195 |

196 | 203 |

204 |
205 |
206 |
207 |
208 |
209 | 210 | 211 |

212 |

213 | 214 |

215 |
216 | 217 | 218 |

219 |

220 |
221 | 222 | 223 | -------------------------------------------------------------------------------- /src/popup.ts: -------------------------------------------------------------------------------- 1 | const defaultSaveData = { 2 | ignorePathname: false, 3 | ignoreQuery: false, 4 | ignoreHash: true, 5 | includeAllWindow: false, 6 | includePinnedTabs: false, 7 | foucedChangeURLWhenClickedAnchorLink: false, 8 | noConfirm: false, 9 | minCategorizeNumber: 1, 10 | }; 11 | 12 | const STATE = { 13 | dangerZoneIsOpen: false, 14 | saveData: defaultSaveData, 15 | }; 16 | 17 | const showNoticeModal = (() => { 18 | const noticeModal = document.getElementById('notice') as HTMLDialogElement; 19 | const noticeModalText = document.getElementById('notice-text') as HTMLParagraphElement; 20 | const okButton = document.getElementById('notice-close') as HTMLButtonElement; 21 | 22 | noticeModal.ariaLabel = getMessage('dialog_notice'); 23 | noticeModal.addEventListener('keydown', (e) => { 24 | if (e.key === 'Escape') { 25 | e.preventDefault(); 26 | noticeModal.close(); 27 | } 28 | }); 29 | 30 | okButton.addEventListener('click', () => { 31 | noticeModal.close(); 32 | }); 33 | 34 | return (taskName: string) => { 35 | const textContent = getMessage(`dialog_${taskName}`); 36 | 37 | noticeModalText.textContent = ''; 38 | noticeModalText.insertAdjacentHTML('afterbegin', textContent.replaceAll('\n', '
')); 39 | noticeModal.showModal(); 40 | noticeModal.focus(); 41 | }; 42 | })(); 43 | 44 | const showConfirmModal = (() => { 45 | type Commands = T[]; 46 | type Options = 47 | | { 48 | type: 'remove'; 49 | comannds: Commands; 50 | } 51 | | { 52 | type: 'multiple'; 53 | comannds: Commands; 54 | } 55 | | { 56 | type: 'range'; 57 | range: number[]; 58 | }; 59 | const confirmModal = document.getElementById('confirm') as HTMLDialogElement; 60 | const confirmModalText = document.getElementById('confirm-text') as HTMLParagraphElement; 61 | const buttonContainer = document.getElementById('dialog-buttons') as HTMLParagraphElement; 62 | const templateButton = document.createElement('button'); 63 | const defaultComannds = ['true', 'false']; 64 | 65 | templateButton.type = 'button'; 66 | confirmModal.ariaLabel = getMessage('dialog_comfirm'); 67 | 68 | return (taskName: string, options?: Options) => { 69 | const textContent = getMessage(`dialog_${taskName}`); 70 | 71 | confirmModalText.textContent = ''; 72 | confirmModalText.insertAdjacentHTML('afterbegin', textContent.replaceAll('\n', '
')); 73 | 74 | confirmModal.showModal(); 75 | confirmModal.focus(); 76 | 77 | return new Promise((resolve) => { 78 | switch (options?.type) { 79 | case 'range': { 80 | // FIXME: Type assertion 81 | const field = document.createElement('label'); 82 | const min = options.range[0]; 83 | const max = options.range[options.range.length - 1]; 84 | // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition 85 | let value = STATE.saveData.minCategorizeNumber ?? min; 86 | 87 | field.className = 'textfield-label-in-dialog'; 88 | field.insertAdjacentHTML( 89 | 'afterbegin', 90 | ` 91 | ${getMessage(`dialog_command_${taskName}_range1`)} 92 | 93 | ${getMessage(`dialog_command_${taskName}_range2`)} 94 | `, 95 | ); 96 | field.querySelector('input')?.addEventListener('change', (e) => { 97 | if (e.target instanceof HTMLInputElement) { 98 | value = e.target.valueAsNumber; 99 | 100 | save({ 101 | ...STATE.saveData, 102 | minCategorizeNumber: value, 103 | }); 104 | } 105 | }); 106 | buttonContainer.appendChild(field); 107 | 108 | const okButton = templateButton.cloneNode(); 109 | 110 | okButton.textContent = getMessage(`dialog_command_apply`); 111 | okButton.addEventListener('click', () => resolve(value as T)); 112 | 113 | buttonContainer.appendChild(okButton); 114 | 115 | const cancelButton = templateButton.cloneNode(); 116 | 117 | cancelButton.textContent = getMessage(`dialog_command_false`); 118 | cancelButton.addEventListener('click', () => resolve('false')); 119 | 120 | buttonContainer.appendChild(cancelButton); 121 | 122 | break; 123 | } 124 | 125 | default: { 126 | (options?.comannds ?? (defaultComannds as Commands)).forEach((command) => { 127 | const button = templateButton.cloneNode(); 128 | 129 | button.textContent = getMessage(`dialog_command_${String(command)}`); 130 | button.addEventListener('click', () => resolve(command)); 131 | 132 | buttonContainer.appendChild(button); 133 | }); 134 | 135 | break; 136 | } 137 | } 138 | }).finally(() => { 139 | buttonContainer.textContent = ''; 140 | confirmModal.close(); 141 | }); 142 | }; 143 | })(); 144 | 145 | const save = (newSaveData: SaveDataType) => { 146 | const value = { 147 | ...STATE.saveData, 148 | ...newSaveData, 149 | }; 150 | 151 | STATE.saveData = value; 152 | 153 | chrome.storage.local.set({ 154 | saveData: value, 155 | }); 156 | }; 157 | 158 | const loadSaveData = async () => { 159 | const getValue = (key: string, callback: (items: Record) => void) => 160 | new Promise((resolve) => { 161 | chrome.storage.local.get(key, (items) => { 162 | callback(items); 163 | resolve(); 164 | }); 165 | }); 166 | 167 | return Promise.all([ 168 | getValue('dangerZoneIsOpen', ({ dangerZoneIsOpen }) => { 169 | STATE.dangerZoneIsOpen = dangerZoneIsOpen ?? false; 170 | }), 171 | getValue('saveData', ({ saveData }) => { 172 | for (const [key, value] of Object.entries(saveData ?? defaultSaveData)) { 173 | const checkbox = document.querySelector(`[data-option-type=${key}]`); 174 | 175 | if (checkbox && typeof value === 'boolean') { 176 | checkbox.checked = value; 177 | } 178 | } 179 | 180 | STATE.saveData = saveData ?? defaultSaveData; 181 | }), 182 | ]); 183 | }; 184 | 185 | const addEvent = () => { 186 | let minCategorizeNumber: number | 'false' = 1; 187 | const buttons = document.querySelectorAll('.buttons button'); 188 | const postMessage = ({ 189 | taskName, 190 | shouldShowDuplicatePage = false, 191 | sortType = 'false', 192 | }: { 193 | taskName: string; 194 | shouldShowDuplicatePage?: boolean; 195 | sortType?: SortType; 196 | }) => { 197 | const port = chrome.runtime.connect(); 198 | 199 | port.postMessage({ 200 | taskName, 201 | options: { 202 | ...STATE.saveData, 203 | shouldShowDuplicatePage, 204 | sort: sortType, 205 | minCategorizeNumber, 206 | }, 207 | }); 208 | }; 209 | const onClickEventHandler = async (e: Event) => { 210 | if (!(e.currentTarget instanceof HTMLButtonElement)) { 211 | return; 212 | } 213 | 214 | const taskName = e.currentTarget.dataset.taskName; 215 | const { noConfirm } = STATE.saveData; 216 | 217 | switch (taskName) { 218 | case 'remove': { 219 | const messageName = STATE.saveData.includeAllWindow ? 'remove_allwin' : taskName; 220 | 221 | if (noConfirm) { 222 | postMessage({ taskName }); 223 | return; 224 | } 225 | 226 | const result = await showConfirmModal<'true' | 'show_duplicate' | 'false'>(messageName, { 227 | type: 'remove', 228 | comannds: ['true', 'show_duplicate', 'false'], 229 | }); 230 | 231 | if (result === 'false') { 232 | return; 233 | } 234 | 235 | postMessage({ taskName, shouldShowDuplicatePage: result === 'show_duplicate' }); 236 | break; 237 | } 238 | 239 | case 'reload': { 240 | const messageName = STATE.saveData.includeAllWindow ? 'reload_allwin' : taskName; 241 | 242 | if (!noConfirm && (await showConfirmModal(messageName)) === 'false') { 243 | return; 244 | } 245 | 246 | postMessage({ taskName }); 247 | break; 248 | } 249 | 250 | // 1つにまとめる 251 | case 'combine': 252 | if (!noConfirm) { 253 | if ( 254 | (!STATE.saveData.includeAllWindow && 255 | (await showConfirmModal(`${taskName}_all`)) === 'false') || 256 | (await showConfirmModal(taskName)) === 'false' 257 | ) { 258 | return; 259 | } 260 | } 261 | 262 | postMessage({ taskName }); 263 | break; 264 | 265 | // 全部別窓にする 266 | case 'divide': 267 | if (!noConfirm) { 268 | if ( 269 | (STATE.saveData.includeAllWindow && 270 | (await showConfirmModal(`${taskName}_all`)) === 'false') || 271 | (await showConfirmModal(taskName)) === 'false' 272 | ) { 273 | return; 274 | } 275 | } 276 | 277 | postMessage({ taskName }); 278 | break; 279 | 280 | case 'sort': { 281 | const sortType = await showConfirmModal(taskName, { 282 | type: 'multiple', 283 | comannds: ['sortByUrl', 'sortByTitle', 'sortByHostAndTitle', 'false'], 284 | }); 285 | 286 | if (sortType === 'false') { 287 | return; 288 | } 289 | 290 | postMessage({ taskName, sortType }); 291 | break; 292 | } 293 | 294 | case 'categorize': { 295 | minCategorizeNumber = await showConfirmModal(taskName, { 296 | type: 'range', 297 | range: [...(new Array(10) as [])].map((_, index) => index), 298 | }); 299 | 300 | if (minCategorizeNumber === 'false') { 301 | return; 302 | } 303 | 304 | postMessage({ taskName }); 305 | break; 306 | } 307 | } 308 | }; 309 | 310 | for (const button of buttons) { 311 | button.addEventListener('click', onClickEventHandler); 312 | } 313 | 314 | const isValidOptionType = (value: unknown): value is keyof SaveDataType => { 315 | if (typeof value !== 'string') { 316 | return false; 317 | } 318 | 319 | return value in defaultSaveData; 320 | }; 321 | 322 | const onchangeListener = (e: Event) => { 323 | if (!(e.target instanceof HTMLInputElement)) { 324 | return; 325 | } 326 | 327 | const { optionType } = e.target.dataset; 328 | 329 | if (isValidOptionType(optionType)) { 330 | if (e.target.checked && !STATE.saveData.noConfirm) { 331 | switch (optionType) { 332 | case 'ignorePathname': 333 | case 'noConfirm': 334 | showNoticeModal(optionType); 335 | } 336 | } 337 | 338 | save({ 339 | [optionType]: e.target.checked, 340 | }); 341 | } 342 | }; 343 | const checkboxes = document.querySelectorAll('[data-option-type]'); 344 | 345 | for (const checkbox of checkboxes) { 346 | checkbox.addEventListener('change', onchangeListener); 347 | } 348 | 349 | const dangerDetails = document.querySelector('#dangerDetails'); 350 | const dangerDetailsSummary = dangerDetails?.querySelector('summary'); 351 | 352 | dangerDetailsSummary?.addEventListener('click', () => { 353 | chrome.storage.local.set({ dangerZoneIsOpen: !dangerDetails?.open }); 354 | }); 355 | 356 | if (dangerDetails) { 357 | dangerDetails.open = STATE.dangerZoneIsOpen; 358 | } 359 | }; 360 | 361 | const init = async () => { 362 | await loadSaveData(); 363 | addEvent(); 364 | }; 365 | 366 | init(); 367 | 368 | // CSS Transitionの有効化 369 | setTimeout(() => { 370 | document.body.dataset.state = 'loaded'; 371 | }, 300); 372 | -------------------------------------------------------------------------------- /src/worker.ts: -------------------------------------------------------------------------------- 1 | // Utils 2 | const parseUrl = (url: URL, options?: SaveDataType) => { 3 | const { origin, hash, search } = url; 4 | const pathname = url.pathname.replace(/\/index\.(x?html?|php|cgi|aspx)$/, '/'); 5 | 6 | return { 7 | origin, 8 | hash: options?.ignoreHash ? '' : hash, 9 | search: options?.ignoreQuery ? '' : search, 10 | pathname: options?.ignorePathname ? '' : pathname, 11 | }; 12 | }; 13 | const getUrl = (url: string | undefined, options?: SaveDataType) => { 14 | if (!url) { 15 | return null; 16 | } 17 | 18 | const { origin, pathname, search, hash } = parseUrl(new URL(url), options); 19 | 20 | return `${origin}${pathname}${search}${hash}`; 21 | }; 22 | 23 | const getCurrentTab = async () => 24 | (await chrome.tabs.query({ active: true, currentWindow: true }))[0]; 25 | 26 | // Tasks 27 | let duplicatedListWindow: chrome.windows.Window | null = null; 28 | const removeDuplicatedTabs = async ( 29 | tabs: chrome.tabs.Tab[], 30 | options: SaveDataType & { shouldShowDuplicatePage?: boolean }, 31 | ) => { 32 | type ValidTab = chrome.tabs.Tab & { 33 | id: number; 34 | url: string; 35 | }; 36 | 37 | const urlBaseTabList: Record = {}; 38 | 39 | for (const tab of tabs) { 40 | const { id } = tab; 41 | const url = getUrl(tab.url, options); 42 | 43 | if (!url || typeof id !== 'number') { 44 | continue; 45 | } 46 | 47 | if (url in urlBaseTabList === false) { 48 | urlBaseTabList[url] = []; 49 | } 50 | 51 | urlBaseTabList[url].push(tab); 52 | } 53 | 54 | const currentTab = await getCurrentTab(); 55 | const duplicatedEntries = Object.entries(urlBaseTabList).filter(([_, { length }]) => { 56 | return 2 <= length; 57 | }); 58 | 59 | if (options.shouldShowDuplicatePage === true) { 60 | chrome.storage.session.set({ lastWindowId: currentTab.windowId, duplicatedEntries }); 61 | chrome.windows.get(duplicatedListWindow?.id ?? 0, async () => { 62 | if (chrome.runtime.lastError) { 63 | duplicatedListWindow = await chrome.windows.create({ 64 | url: 'duplicates-list.html', 65 | type: 'popup', 66 | width: 800, 67 | height: 800, 68 | left: 100, 69 | top: 100, 70 | }); 71 | 72 | return; 73 | } 74 | 75 | chrome.windows.update( 76 | duplicatedListWindow!.id as number, 77 | { focused: true, state: 'normal' }, 78 | () => { 79 | const tab = duplicatedListWindow?.tabs?.[0]; 80 | if (typeof tab?.id === 'number') { 81 | chrome.tabs.reload(tab.id, { bypassCache: false }); 82 | } 83 | }, 84 | ); 85 | }); 86 | 87 | return; 88 | } 89 | 90 | const checkedUrl = new Set(); 91 | const currentUrl = getUrl(currentTab.url, options); 92 | const currentWindowId = currentTab.windowId; 93 | const tabIdList = duplicatedEntries.flatMap(([_, tabItems]) => tabItems); 94 | 95 | if (currentWindowId && options.includeAllWindow) { 96 | tabIdList.sort((a, b) => { 97 | if (a.windowId === currentWindowId && b.windowId !== currentWindowId) { 98 | return -1; 99 | } 100 | 101 | if (a.windowId !== currentWindowId && b.windowId === currentWindowId) { 102 | return 1; 103 | } 104 | 105 | return 0; 106 | }); 107 | } 108 | 109 | if (currentUrl) { 110 | checkedUrl.add(currentUrl); 111 | } 112 | 113 | const targetTabIdList = tabIdList 114 | .filter((tab): tab is ValidTab => { 115 | const { id } = tab; 116 | 117 | if (typeof tab.url === 'undefined' || typeof id === 'undefined' || currentTab.id === id) { 118 | return false; 119 | } 120 | 121 | if (checkedUrl.has(tab.url)) { 122 | return true; 123 | } 124 | 125 | checkedUrl.add(tab.url); 126 | return false; 127 | }) 128 | .map(({ id }) => id); 129 | 130 | for (const id of targetTabIdList) { 131 | chrome.tabs.remove(id); 132 | } 133 | }; 134 | 135 | const categorizeTabs = async ( 136 | tabs: chrome.tabs.Tab[], 137 | minCategorizeNumber: SaveDataType['minCategorizeNumber'], 138 | ) => { 139 | type ValidTab = chrome.tabs.Tab & { 140 | id: number; 141 | url: string; 142 | }; 143 | type CurrentPinnedTab = chrome.tabs.Tab & { 144 | id: number; 145 | url: string; 146 | pinned: true; 147 | }; 148 | 149 | const currentTab = await getCurrentTab(); 150 | const hosts: Record = {}; 151 | const promises: (Promise | Promise)[] = []; 152 | const currentTabIsPinned = currentTab.pinned; 153 | const checkCurrentTabIsPinnedAndItDoesNotIncludesPinned = ( 154 | tab: chrome.tabs.Tab, 155 | ): tab is CurrentPinnedTab => { 156 | return ( 157 | !tabs.includes(tab) && tab.url !== undefined && tab.id !== undefined && currentTabIsPinned 158 | ); 159 | }; 160 | const ifCurrentTabIsPinnedAndItDoesNotIncludesPinned = 161 | checkCurrentTabIsPinnedAndItDoesNotIncludesPinned(currentTab); 162 | 163 | tabs 164 | .filter((tab): tab is ValidTab => { 165 | if (!tab.url || typeof tab.id !== 'number') { 166 | return false; 167 | } 168 | 169 | return true; 170 | }) 171 | .forEach(({ url, id, pinned }) => { 172 | const { hostname } = new URL(url); 173 | 174 | if (!(hostname in hosts)) { 175 | hosts[hostname] = []; 176 | } 177 | 178 | hosts[hostname]?.push({ tabId: id, pinned }); 179 | }); 180 | 181 | if (ifCurrentTabIsPinnedAndItDoesNotIncludesPinned) { 182 | const { hostname } = new URL(currentTab.url); 183 | 184 | hosts[hostname] ??= []; 185 | hosts[hostname]?.unshift({ tabId: currentTab.id, pinned: currentTab.pinned }); 186 | } 187 | 188 | if (typeof minCategorizeNumber === 'number' && minCategorizeNumber !== 0) { 189 | const OTHERS_HOST_NAME = '___OTHRERS___'; 190 | 191 | for (const [hostname, tabDataList] of Object.entries(hosts)) { 192 | if (!tabDataList?.length) { 193 | continue; 194 | } 195 | 196 | if (tabDataList.length <= minCategorizeNumber) { 197 | hosts[OTHERS_HOST_NAME] ??= []; 198 | hosts[OTHERS_HOST_NAME].unshift(...tabDataList); 199 | 200 | if (hosts[hostname]) { 201 | // eslint-disable-next-line @typescript-eslint/no-dynamic-delete 202 | delete hosts[hostname]; 203 | } 204 | } 205 | } 206 | } 207 | 208 | if (Object.keys(hosts).length < 2) { 209 | return; 210 | } 211 | 212 | for (const values of Object.values(hosts)) { 213 | const firstTab = values?.[0]; 214 | 215 | if (!firstTab) { 216 | continue; 217 | } 218 | 219 | const windowPromise = chrome.windows 220 | .create({ tabId: firstTab.tabId }) 221 | .then(async ({ id: windowId }) => { 222 | const idList = values.slice(1); 223 | const promisesForTabMove: Promise[] = []; 224 | 225 | chrome.tabs.update(firstTab.tabId, { pinned: firstTab.pinned }); 226 | 227 | for (const { tabId } of idList) { 228 | promisesForTabMove.push(chrome.tabs.move(tabId, { windowId, index: -1 })); 229 | } 230 | 231 | await Promise.all(promisesForTabMove); 232 | 233 | const promisesForTabUpdate: Promise[] = []; 234 | 235 | for (const { tabId, pinned } of idList) { 236 | promisesForTabUpdate.push(chrome.tabs.update(tabId, { pinned })); 237 | } 238 | 239 | await Promise.all(promisesForTabUpdate); 240 | }); 241 | 242 | promises.push(windowPromise); 243 | } 244 | 245 | await Promise.all(promises); 246 | 247 | if (currentTab.id) { 248 | const newCurrentTab = await chrome.tabs.get(currentTab.id); 249 | 250 | if (newCurrentTab.id) { 251 | await chrome.windows.update(newCurrentTab.windowId, { focused: true }); 252 | await chrome.tabs.update(newCurrentTab.id, { active: true }); 253 | 254 | if (currentTabIsPinned) { 255 | chrome.tabs.update(newCurrentTab.id, { 256 | pinned: true, 257 | }); 258 | } 259 | } 260 | } 261 | }; 262 | 263 | const divideTabs = async (tabs: chrome.tabs.Tab[]) => { 264 | type ValidTab = chrome.tabs.Tab & { id: number }; 265 | 266 | const currentTab = await getCurrentTab(); 267 | const targetTabIdList = tabs 268 | .filter((tab): tab is ValidTab => typeof tab.id === 'number') 269 | .filter(({ id }) => id !== currentTab.id); 270 | const promises: Promise[] = []; 271 | 272 | for (const { id: tabId } of targetTabIdList) { 273 | promises.push(chrome.windows.create({ tabId })); 274 | } 275 | 276 | await Promise.all(promises); 277 | 278 | for (const { id, pinned } of targetTabIdList) { 279 | chrome.tabs.update(id, { pinned }); 280 | } 281 | 282 | if (currentTab.id) { 283 | await chrome.windows.update(currentTab.windowId, { focused: true }); 284 | } 285 | }; 286 | 287 | const combineTabs = async (tabs: chrome.tabs.Tab[]) => { 288 | type ValidTab = chrome.tabs.Tab & { 289 | id: number; 290 | }; 291 | 292 | const { id: currentTabId, windowId } = await getCurrentTab(); 293 | const targetTabIdList = tabs.filter((tab): tab is ValidTab => typeof tab.id === 'number'); 294 | const promises: Promise[] = []; 295 | 296 | for (const { id } of targetTabIdList) { 297 | promises.push( 298 | chrome.tabs.move(id, { 299 | windowId, 300 | index: -1, 301 | }), 302 | ); 303 | } 304 | 305 | await Promise.all(promises); 306 | 307 | for (const { id, pinned } of targetTabIdList) { 308 | chrome.tabs.update(id, { pinned }); 309 | } 310 | 311 | if (currentTabId) { 312 | await chrome.tabs.update(currentTabId, { active: true }); 313 | } 314 | }; 315 | 316 | const sortTabs = async (tabs: chrome.tabs.Tab[], sort: SortType | undefined) => { 317 | interface TabData { 318 | id: number; 319 | hostname: string; 320 | url: string; 321 | title: string; 322 | pinned: boolean; 323 | windowId: number; 324 | } 325 | 326 | const compareByUrl = (a: TabData, b: TabData) => { 327 | if (a.url < b.url) { 328 | return -1; 329 | } 330 | 331 | if (a.url > b.url) { 332 | return 1; 333 | } 334 | 335 | return 0; 336 | }; 337 | const compareByTitle = (a: TabData, b: TabData) => { 338 | if (a.title < b.title) { 339 | return -1; 340 | } 341 | 342 | if (a.title > b.title) { 343 | return 1; 344 | } 345 | 346 | return 0; 347 | }; 348 | const compareByHostAndTitle = (a: TabData, b: TabData) => { 349 | if (a.hostname < b.hostname) { 350 | return -1; 351 | } 352 | 353 | if (a.hostname > b.hostname) { 354 | return 1; 355 | } 356 | 357 | if (a.title < b.title) { 358 | return -1; 359 | } 360 | 361 | if (a.title > b.title) { 362 | return 1; 363 | } 364 | 365 | return 0; 366 | }; 367 | const tabSet: Record = {}; 368 | const sorter = 369 | sort === 'sortByUrl' 370 | ? compareByUrl 371 | : sort === 'sortByTitle' 372 | ? compareByTitle 373 | : compareByHostAndTitle; 374 | 375 | tabs 376 | .map(({ id, pinned, url, title, windowId }) => { 377 | const hostname = url && new URL(url).hostname; 378 | return { 379 | id, 380 | url, 381 | hostname, 382 | title, 383 | pinned, 384 | windowId, 385 | }; 386 | }) 387 | .filter((tab): tab is TabData => { 388 | return ( 389 | typeof tab.url === 'string' && typeof tab.title === 'string' && typeof tab.id === 'number' 390 | ); 391 | }) 392 | .forEach((tabData) => { 393 | const { windowId } = tabData; 394 | tabSet[windowId] ??= []; 395 | tabSet[windowId]?.push(tabData); 396 | }); 397 | 398 | for (const tabList of Object.values(tabSet)) { 399 | tabList?.sort(sorter); 400 | } 401 | 402 | const tabList = Object.values(tabSet).flat(); 403 | let i = 0; 404 | const limit = tabList.length; 405 | 406 | for (i; i < limit; i++) { 407 | const item = tabList[i]; 408 | 409 | if (typeof item === 'undefined') { 410 | continue; 411 | } 412 | 413 | const { id, pinned, windowId } = item; 414 | 415 | await chrome.tabs.move(id, { 416 | windowId, 417 | index: i + (pinned ? 0 : limit), 418 | }); 419 | } 420 | }; 421 | 422 | chrome.runtime.onConnect.addListener((port) => { 423 | interface Request { 424 | taskName?: string; 425 | options?: SaveDataType & { sort: SortType; shouldShowDuplicatePage: boolean }; 426 | } 427 | 428 | const onmessageListener = (request: Request) => { 429 | const callTaskFunctions = async ({ taskName, options }: Request) => { 430 | const currentWindow = 431 | taskName !== 'combine' && !Boolean(options?.includeAllWindow) ? true : undefined; 432 | const pinned = Boolean(options?.includePinnedTabs) ? undefined : false; 433 | const tabs = await chrome.tabs.query({ 434 | windowType: 'normal', 435 | currentWindow, 436 | pinned, 437 | }); 438 | 439 | switch (taskName) { 440 | case 'remove': 441 | await removeDuplicatedTabs(tabs, options ?? {}); 442 | return; 443 | 444 | case 'reload': 445 | for (const { id } of tabs) { 446 | if (typeof id === 'number') { 447 | // NOTE: リロード後に音声を停止させる処理を実装したいが、現状 tabs 経由では不可能な模様 448 | chrome.tabs.reload(id); 449 | } 450 | } 451 | 452 | return; 453 | 454 | case 'categorize': 455 | await categorizeTabs(tabs, options?.minCategorizeNumber); 456 | return; 457 | 458 | case 'divide': 459 | await divideTabs(tabs); 460 | return; 461 | 462 | case 'combine': 463 | await combineTabs(tabs); 464 | return; 465 | 466 | case 'sort': 467 | await sortTabs(tabs, options?.sort); 468 | return; 469 | } 470 | }; 471 | 472 | callTaskFunctions(request); 473 | 474 | return true; 475 | }; 476 | 477 | port.onMessage.addListener(onmessageListener); 478 | }); 479 | -------------------------------------------------------------------------------- /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.0.0": 6 | version "7.27.1" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" 8 | integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== 9 | dependencies: 10 | "@babel/helper-validator-identifier" "^7.27.1" 11 | js-tokens "^4.0.0" 12 | picocolors "^1.1.1" 13 | 14 | "@babel/helper-validator-identifier@^7.27.1": 15 | version "7.27.1" 16 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" 17 | integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== 18 | 19 | "@csstools/css-parser-algorithms@^2.3.1": 20 | version "2.7.1" 21 | resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz#6d93a8f7d8aeb7cd9ed0868f946e46f021b6aa70" 22 | integrity sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw== 23 | 24 | "@csstools/css-tokenizer@^2.2.0": 25 | version "2.4.1" 26 | resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz#1d8b2e200197cf5f35ceb07ca2dade31f3a00ae8" 27 | integrity sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg== 28 | 29 | "@csstools/media-query-list-parser@^2.1.4": 30 | version "2.1.13" 31 | resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz#f00be93f6bede07c14ddf51a168ad2748e4fe9e5" 32 | integrity sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA== 33 | 34 | "@csstools/selector-specificity@^3.0.0": 35 | version "3.1.1" 36 | resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz#63085d2995ca0f0e55aa8b8a07d69bfd48b844fe" 37 | integrity sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA== 38 | 39 | "@eslint-community/eslint-utils@^4.2.0": 40 | version "4.7.0" 41 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" 42 | integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== 43 | dependencies: 44 | eslint-visitor-keys "^3.4.3" 45 | 46 | "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": 47 | version "4.12.1" 48 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" 49 | integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== 50 | 51 | "@eslint/eslintrc@^2.1.4": 52 | version "2.1.4" 53 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" 54 | integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== 55 | dependencies: 56 | ajv "^6.12.4" 57 | debug "^4.3.2" 58 | espree "^9.6.0" 59 | globals "^13.19.0" 60 | ignore "^5.2.0" 61 | import-fresh "^3.2.1" 62 | js-yaml "^4.1.0" 63 | minimatch "^3.1.2" 64 | strip-json-comments "^3.1.1" 65 | 66 | "@eslint/js@8.57.1": 67 | version "8.57.1" 68 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" 69 | integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== 70 | 71 | "@humanwhocodes/config-array@^0.13.0": 72 | version "0.13.0" 73 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" 74 | integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== 75 | dependencies: 76 | "@humanwhocodes/object-schema" "^2.0.3" 77 | debug "^4.3.1" 78 | minimatch "^3.0.5" 79 | 80 | "@humanwhocodes/module-importer@^1.0.1": 81 | version "1.0.1" 82 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 83 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 84 | 85 | "@humanwhocodes/object-schema@^2.0.3": 86 | version "2.0.3" 87 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" 88 | integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== 89 | 90 | "@jridgewell/gen-mapping@^0.3.5": 91 | version "0.3.8" 92 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" 93 | integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== 94 | dependencies: 95 | "@jridgewell/set-array" "^1.2.1" 96 | "@jridgewell/sourcemap-codec" "^1.4.10" 97 | "@jridgewell/trace-mapping" "^0.3.24" 98 | 99 | "@jridgewell/resolve-uri@^3.1.0": 100 | version "3.1.2" 101 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" 102 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 103 | 104 | "@jridgewell/set-array@^1.2.1": 105 | version "1.2.1" 106 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" 107 | integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== 108 | 109 | "@jridgewell/source-map@^0.3.3": 110 | version "0.3.6" 111 | resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" 112 | integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== 113 | dependencies: 114 | "@jridgewell/gen-mapping" "^0.3.5" 115 | "@jridgewell/trace-mapping" "^0.3.25" 116 | 117 | "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": 118 | version "1.5.0" 119 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" 120 | integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== 121 | 122 | "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": 123 | version "0.3.25" 124 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" 125 | integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== 126 | dependencies: 127 | "@jridgewell/resolve-uri" "^3.1.0" 128 | "@jridgewell/sourcemap-codec" "^1.4.14" 129 | 130 | "@nodelib/fs.scandir@2.1.5": 131 | version "2.1.5" 132 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 133 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 134 | dependencies: 135 | "@nodelib/fs.stat" "2.0.5" 136 | run-parallel "^1.1.9" 137 | 138 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 139 | version "2.0.5" 140 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 141 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 142 | 143 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 144 | version "1.2.8" 145 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 146 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 147 | dependencies: 148 | "@nodelib/fs.scandir" "2.1.5" 149 | fastq "^1.6.0" 150 | 151 | "@types/chrome@^0.0.321": 152 | version "0.0.321" 153 | resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.321.tgz#5847601ed12446218631f04a8135376a33e494d9" 154 | integrity sha512-SJhZSr5Xcj0rHXSKm/UTp4iIFtlxMADpa45UVCgWPemz/MdJA7ej0gvqUb+wqAX5COpA1FgPKPEoEw2L8SDVGQ== 155 | dependencies: 156 | "@types/filesystem" "*" 157 | "@types/har-format" "*" 158 | 159 | "@types/filesystem@*": 160 | version "0.0.36" 161 | resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.36.tgz#7227c2d76bfed1b21819db310816c7821d303857" 162 | integrity sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA== 163 | dependencies: 164 | "@types/filewriter" "*" 165 | 166 | "@types/filewriter@*": 167 | version "0.0.33" 168 | resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.33.tgz#d9d611db9d9cd99ae4e458de420eeb64ad604ea8" 169 | integrity sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g== 170 | 171 | "@types/har-format@*": 172 | version "1.2.16" 173 | resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.16.tgz#b71ede8681400cc08b3685f061c31e416cf94944" 174 | integrity sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A== 175 | 176 | "@types/json-schema@^7.0.9": 177 | version "7.0.15" 178 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" 179 | integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== 180 | 181 | "@types/minimist@^1.2.2": 182 | version "1.2.5" 183 | resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" 184 | integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== 185 | 186 | "@types/normalize-package-data@^2.4.0": 187 | version "2.4.4" 188 | resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" 189 | integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== 190 | 191 | "@types/semver@^7.3.12": 192 | version "7.7.0" 193 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.0.tgz#64c441bdae033b378b6eef7d0c3d77c329b9378e" 194 | integrity sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA== 195 | 196 | "@typescript-eslint/eslint-plugin@^5.58.0": 197 | version "5.62.0" 198 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" 199 | integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== 200 | dependencies: 201 | "@eslint-community/regexpp" "^4.4.0" 202 | "@typescript-eslint/scope-manager" "5.62.0" 203 | "@typescript-eslint/type-utils" "5.62.0" 204 | "@typescript-eslint/utils" "5.62.0" 205 | debug "^4.3.4" 206 | graphemer "^1.4.0" 207 | ignore "^5.2.0" 208 | natural-compare-lite "^1.4.0" 209 | semver "^7.3.7" 210 | tsutils "^3.21.0" 211 | 212 | "@typescript-eslint/parser@^5.58.0": 213 | version "5.62.0" 214 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" 215 | integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== 216 | dependencies: 217 | "@typescript-eslint/scope-manager" "5.62.0" 218 | "@typescript-eslint/types" "5.62.0" 219 | "@typescript-eslint/typescript-estree" "5.62.0" 220 | debug "^4.3.4" 221 | 222 | "@typescript-eslint/scope-manager@5.62.0": 223 | version "5.62.0" 224 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" 225 | integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== 226 | dependencies: 227 | "@typescript-eslint/types" "5.62.0" 228 | "@typescript-eslint/visitor-keys" "5.62.0" 229 | 230 | "@typescript-eslint/type-utils@5.62.0": 231 | version "5.62.0" 232 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" 233 | integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== 234 | dependencies: 235 | "@typescript-eslint/typescript-estree" "5.62.0" 236 | "@typescript-eslint/utils" "5.62.0" 237 | debug "^4.3.4" 238 | tsutils "^3.21.0" 239 | 240 | "@typescript-eslint/types@5.62.0": 241 | version "5.62.0" 242 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" 243 | integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== 244 | 245 | "@typescript-eslint/typescript-estree@5.62.0": 246 | version "5.62.0" 247 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" 248 | integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== 249 | dependencies: 250 | "@typescript-eslint/types" "5.62.0" 251 | "@typescript-eslint/visitor-keys" "5.62.0" 252 | debug "^4.3.4" 253 | globby "^11.1.0" 254 | is-glob "^4.0.3" 255 | semver "^7.3.7" 256 | tsutils "^3.21.0" 257 | 258 | "@typescript-eslint/utils@5.62.0": 259 | version "5.62.0" 260 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" 261 | integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== 262 | dependencies: 263 | "@eslint-community/eslint-utils" "^4.2.0" 264 | "@types/json-schema" "^7.0.9" 265 | "@types/semver" "^7.3.12" 266 | "@typescript-eslint/scope-manager" "5.62.0" 267 | "@typescript-eslint/types" "5.62.0" 268 | "@typescript-eslint/typescript-estree" "5.62.0" 269 | eslint-scope "^5.1.1" 270 | semver "^7.3.7" 271 | 272 | "@typescript-eslint/visitor-keys@5.62.0": 273 | version "5.62.0" 274 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" 275 | integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== 276 | dependencies: 277 | "@typescript-eslint/types" "5.62.0" 278 | eslint-visitor-keys "^3.3.0" 279 | 280 | "@ungap/structured-clone@^1.2.0": 281 | version "1.3.0" 282 | resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" 283 | integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== 284 | 285 | acorn-jsx@^5.3.2: 286 | version "5.3.2" 287 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 288 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 289 | 290 | acorn@^8.8.2, acorn@^8.9.0: 291 | version "8.14.1" 292 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" 293 | integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== 294 | 295 | ajv@^6.12.4: 296 | version "6.12.6" 297 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 298 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 299 | dependencies: 300 | fast-deep-equal "^3.1.1" 301 | fast-json-stable-stringify "^2.0.0" 302 | json-schema-traverse "^0.4.1" 303 | uri-js "^4.2.2" 304 | 305 | ajv@^8.0.1: 306 | version "8.17.1" 307 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" 308 | integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== 309 | dependencies: 310 | fast-deep-equal "^3.1.3" 311 | fast-uri "^3.0.1" 312 | json-schema-traverse "^1.0.0" 313 | require-from-string "^2.0.2" 314 | 315 | ansi-regex@^5.0.1: 316 | version "5.0.1" 317 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 318 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 319 | 320 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 321 | version "4.3.0" 322 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 323 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 324 | dependencies: 325 | color-convert "^2.0.1" 326 | 327 | argparse@^2.0.1: 328 | version "2.0.1" 329 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 330 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 331 | 332 | array-union@^1.0.1: 333 | version "1.0.2" 334 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 335 | integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== 336 | dependencies: 337 | array-uniq "^1.0.1" 338 | 339 | array-union@^2.1.0: 340 | version "2.1.0" 341 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 342 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 343 | 344 | array-uniq@^1.0.1: 345 | version "1.0.3" 346 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 347 | integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== 348 | 349 | arrify@^1.0.1: 350 | version "1.0.1" 351 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 352 | integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== 353 | 354 | astral-regex@^2.0.0: 355 | version "2.0.0" 356 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" 357 | integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== 358 | 359 | async@^2.6.1: 360 | version "2.6.4" 361 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" 362 | integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== 363 | dependencies: 364 | lodash "^4.17.14" 365 | 366 | async@^3.2.6: 367 | version "3.2.6" 368 | resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" 369 | integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== 370 | 371 | balanced-match@^1.0.0: 372 | version "1.0.2" 373 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 374 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 375 | 376 | balanced-match@^2.0.0: 377 | version "2.0.0" 378 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" 379 | integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== 380 | 381 | basic-auth@^2.0.1: 382 | version "2.0.1" 383 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" 384 | integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== 385 | dependencies: 386 | safe-buffer "5.1.2" 387 | 388 | brace-expansion@^1.1.7: 389 | version "1.1.11" 390 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 391 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 392 | dependencies: 393 | balanced-match "^1.0.0" 394 | concat-map "0.0.1" 395 | 396 | braces@^3.0.3: 397 | version "3.0.3" 398 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 399 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 400 | dependencies: 401 | fill-range "^7.1.1" 402 | 403 | buffer-from@^1.0.0: 404 | version "1.1.2" 405 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 406 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 407 | 408 | call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: 409 | version "1.0.2" 410 | resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" 411 | integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== 412 | dependencies: 413 | es-errors "^1.3.0" 414 | function-bind "^1.1.2" 415 | 416 | call-bound@^1.0.2: 417 | version "1.0.4" 418 | resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" 419 | integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== 420 | dependencies: 421 | call-bind-apply-helpers "^1.0.2" 422 | get-intrinsic "^1.3.0" 423 | 424 | callsites@^3.0.0: 425 | version "3.1.0" 426 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 427 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 428 | 429 | camelcase-keys@^7.0.0: 430 | version "7.0.2" 431 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-7.0.2.tgz#d048d8c69448745bb0de6fc4c1c52a30dfbe7252" 432 | integrity sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg== 433 | dependencies: 434 | camelcase "^6.3.0" 435 | map-obj "^4.1.0" 436 | quick-lru "^5.1.1" 437 | type-fest "^1.2.1" 438 | 439 | camelcase@^6.3.0: 440 | version "6.3.0" 441 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 442 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 443 | 444 | chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: 445 | version "4.1.2" 446 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 447 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 448 | dependencies: 449 | ansi-styles "^4.1.0" 450 | supports-color "^7.1.0" 451 | 452 | color-convert@^2.0.1: 453 | version "2.0.1" 454 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 455 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 456 | dependencies: 457 | color-name "~1.1.4" 458 | 459 | color-name@~1.1.4: 460 | version "1.1.4" 461 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 462 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 463 | 464 | colord@^2.9.3: 465 | version "2.9.3" 466 | resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" 467 | integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== 468 | 469 | commander@^2.18.0, commander@^2.20.0: 470 | version "2.20.3" 471 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 472 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 473 | 474 | commondir@^1.0.1: 475 | version "1.0.1" 476 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 477 | integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== 478 | 479 | concat-map@0.0.1: 480 | version "0.0.1" 481 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 482 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 483 | 484 | corser@^2.0.1: 485 | version "2.0.1" 486 | resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" 487 | integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== 488 | 489 | cosmiconfig@^8.2.0: 490 | version "8.3.6" 491 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" 492 | integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== 493 | dependencies: 494 | import-fresh "^3.3.0" 495 | js-yaml "^4.1.0" 496 | parse-json "^5.2.0" 497 | path-type "^4.0.0" 498 | 499 | cross-spawn@^7.0.2: 500 | version "7.0.6" 501 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" 502 | integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 503 | dependencies: 504 | path-key "^3.1.0" 505 | shebang-command "^2.0.0" 506 | which "^2.0.1" 507 | 508 | css-functions-list@^3.2.1: 509 | version "3.2.3" 510 | resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.3.tgz#95652b0c24f0f59b291a9fc386041a19d4f40dbe" 511 | integrity sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA== 512 | 513 | css-tree@^2.3.1: 514 | version "2.3.1" 515 | resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" 516 | integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== 517 | dependencies: 518 | mdn-data "2.0.30" 519 | source-map-js "^1.0.1" 520 | 521 | cssesc@^3.0.0: 522 | version "3.0.0" 523 | resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" 524 | integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== 525 | 526 | debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.6: 527 | version "4.4.0" 528 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" 529 | integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== 530 | dependencies: 531 | ms "^2.1.3" 532 | 533 | decamelize-keys@^1.1.0: 534 | version "1.1.1" 535 | resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" 536 | integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== 537 | dependencies: 538 | decamelize "^1.1.0" 539 | map-obj "^1.0.0" 540 | 541 | decamelize@^1.1.0: 542 | version "1.2.0" 543 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 544 | integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== 545 | 546 | decamelize@^5.0.0: 547 | version "5.0.1" 548 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-5.0.1.tgz#db11a92e58c741ef339fb0a2868d8a06a9a7b1e9" 549 | integrity sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA== 550 | 551 | deep-is@^0.1.3: 552 | version "0.1.4" 553 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 554 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 555 | 556 | dir-glob@^3.0.1: 557 | version "3.0.1" 558 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 559 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 560 | dependencies: 561 | path-type "^4.0.0" 562 | 563 | doctrine@^3.0.0: 564 | version "3.0.0" 565 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 566 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 567 | dependencies: 568 | esutils "^2.0.2" 569 | 570 | dunder-proto@^1.0.1: 571 | version "1.0.1" 572 | resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" 573 | integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== 574 | dependencies: 575 | call-bind-apply-helpers "^1.0.1" 576 | es-errors "^1.3.0" 577 | gopd "^1.2.0" 578 | 579 | email-addresses@^3.0.1: 580 | version "3.1.0" 581 | resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-3.1.0.tgz#cabf7e085cbdb63008a70319a74e6136188812fb" 582 | integrity sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg== 583 | 584 | emoji-regex@^8.0.0: 585 | version "8.0.0" 586 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 587 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 588 | 589 | enhanced-resolve@^5.0.0: 590 | version "5.18.1" 591 | resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz#728ab082f8b7b6836de51f1637aab5d3b9568faf" 592 | integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== 593 | dependencies: 594 | graceful-fs "^4.2.4" 595 | tapable "^2.2.0" 596 | 597 | error-ex@^1.3.1: 598 | version "1.3.2" 599 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 600 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 601 | dependencies: 602 | is-arrayish "^0.2.1" 603 | 604 | es-define-property@^1.0.1: 605 | version "1.0.1" 606 | resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" 607 | integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== 608 | 609 | es-errors@^1.3.0: 610 | version "1.3.0" 611 | resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" 612 | integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== 613 | 614 | es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: 615 | version "1.1.1" 616 | resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" 617 | integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== 618 | dependencies: 619 | es-errors "^1.3.0" 620 | 621 | escape-string-regexp@^1.0.2: 622 | version "1.0.5" 623 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 624 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 625 | 626 | escape-string-regexp@^4.0.0: 627 | version "4.0.0" 628 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 629 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 630 | 631 | eslint-config-google@^0.14.0: 632 | version "0.14.0" 633 | resolved "https://registry.yarnpkg.com/eslint-config-google/-/eslint-config-google-0.14.0.tgz#4f5f8759ba6e11b424294a219dbfa18c508bcc1a" 634 | integrity sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw== 635 | 636 | eslint-config-prettier@^8.8.0: 637 | version "8.10.0" 638 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" 639 | integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== 640 | 641 | eslint-scope@^5.1.1: 642 | version "5.1.1" 643 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 644 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 645 | dependencies: 646 | esrecurse "^4.3.0" 647 | estraverse "^4.1.1" 648 | 649 | eslint-scope@^7.2.2: 650 | version "7.2.2" 651 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" 652 | integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== 653 | dependencies: 654 | esrecurse "^4.3.0" 655 | estraverse "^5.2.0" 656 | 657 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: 658 | version "3.4.3" 659 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 660 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 661 | 662 | eslint@^8.38.0: 663 | version "8.57.1" 664 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" 665 | integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== 666 | dependencies: 667 | "@eslint-community/eslint-utils" "^4.2.0" 668 | "@eslint-community/regexpp" "^4.6.1" 669 | "@eslint/eslintrc" "^2.1.4" 670 | "@eslint/js" "8.57.1" 671 | "@humanwhocodes/config-array" "^0.13.0" 672 | "@humanwhocodes/module-importer" "^1.0.1" 673 | "@nodelib/fs.walk" "^1.2.8" 674 | "@ungap/structured-clone" "^1.2.0" 675 | ajv "^6.12.4" 676 | chalk "^4.0.0" 677 | cross-spawn "^7.0.2" 678 | debug "^4.3.2" 679 | doctrine "^3.0.0" 680 | escape-string-regexp "^4.0.0" 681 | eslint-scope "^7.2.2" 682 | eslint-visitor-keys "^3.4.3" 683 | espree "^9.6.1" 684 | esquery "^1.4.2" 685 | esutils "^2.0.2" 686 | fast-deep-equal "^3.1.3" 687 | file-entry-cache "^6.0.1" 688 | find-up "^5.0.0" 689 | glob-parent "^6.0.2" 690 | globals "^13.19.0" 691 | graphemer "^1.4.0" 692 | ignore "^5.2.0" 693 | imurmurhash "^0.1.4" 694 | is-glob "^4.0.0" 695 | is-path-inside "^3.0.3" 696 | js-yaml "^4.1.0" 697 | json-stable-stringify-without-jsonify "^1.0.1" 698 | levn "^0.4.1" 699 | lodash.merge "^4.6.2" 700 | minimatch "^3.1.2" 701 | natural-compare "^1.4.0" 702 | optionator "^0.9.3" 703 | strip-ansi "^6.0.1" 704 | text-table "^0.2.0" 705 | 706 | espree@^9.6.0, espree@^9.6.1: 707 | version "9.6.1" 708 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" 709 | integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== 710 | dependencies: 711 | acorn "^8.9.0" 712 | acorn-jsx "^5.3.2" 713 | eslint-visitor-keys "^3.4.1" 714 | 715 | esquery@^1.4.2: 716 | version "1.6.0" 717 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" 718 | integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== 719 | dependencies: 720 | estraverse "^5.1.0" 721 | 722 | esrecurse@^4.3.0: 723 | version "4.3.0" 724 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 725 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 726 | dependencies: 727 | estraverse "^5.2.0" 728 | 729 | estraverse@^4.1.1: 730 | version "4.3.0" 731 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 732 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 733 | 734 | estraverse@^5.1.0, estraverse@^5.2.0: 735 | version "5.3.0" 736 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 737 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 738 | 739 | esutils@^2.0.2: 740 | version "2.0.3" 741 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 742 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 743 | 744 | eventemitter3@^4.0.0: 745 | version "4.0.7" 746 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" 747 | integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== 748 | 749 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 750 | version "3.1.3" 751 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 752 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 753 | 754 | fast-glob@^3.2.9, fast-glob@^3.3.1: 755 | version "3.3.3" 756 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" 757 | integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== 758 | dependencies: 759 | "@nodelib/fs.stat" "^2.0.2" 760 | "@nodelib/fs.walk" "^1.2.3" 761 | glob-parent "^5.1.2" 762 | merge2 "^1.3.0" 763 | micromatch "^4.0.8" 764 | 765 | fast-json-stable-stringify@^2.0.0: 766 | version "2.1.0" 767 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 768 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 769 | 770 | fast-levenshtein@^2.0.6: 771 | version "2.0.6" 772 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 773 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 774 | 775 | fast-uri@^3.0.1: 776 | version "3.0.6" 777 | resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" 778 | integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== 779 | 780 | fastest-levenshtein@^1.0.16: 781 | version "1.0.16" 782 | resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" 783 | integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== 784 | 785 | fastq@^1.6.0: 786 | version "1.19.1" 787 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" 788 | integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== 789 | dependencies: 790 | reusify "^1.0.4" 791 | 792 | file-entry-cache@^6.0.1: 793 | version "6.0.1" 794 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 795 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 796 | dependencies: 797 | flat-cache "^3.0.4" 798 | 799 | file-entry-cache@^7.0.0: 800 | version "7.0.2" 801 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-7.0.2.tgz#2d61bb70ba89b9548e3035b7c9173fe91deafff0" 802 | integrity sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g== 803 | dependencies: 804 | flat-cache "^3.2.0" 805 | 806 | filename-reserved-regex@^2.0.0: 807 | version "2.0.0" 808 | resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" 809 | integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== 810 | 811 | filenamify@^4.3.0: 812 | version "4.3.0" 813 | resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" 814 | integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== 815 | dependencies: 816 | filename-reserved-regex "^2.0.0" 817 | strip-outer "^1.0.1" 818 | trim-repeated "^1.0.0" 819 | 820 | fill-range@^7.1.1: 821 | version "7.1.1" 822 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 823 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 824 | dependencies: 825 | to-regex-range "^5.0.1" 826 | 827 | find-cache-dir@^3.3.1: 828 | version "3.3.2" 829 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" 830 | integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== 831 | dependencies: 832 | commondir "^1.0.1" 833 | make-dir "^3.0.2" 834 | pkg-dir "^4.1.0" 835 | 836 | find-up@^4.0.0: 837 | version "4.1.0" 838 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 839 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 840 | dependencies: 841 | locate-path "^5.0.0" 842 | path-exists "^4.0.0" 843 | 844 | find-up@^5.0.0: 845 | version "5.0.0" 846 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 847 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 848 | dependencies: 849 | locate-path "^6.0.0" 850 | path-exists "^4.0.0" 851 | 852 | flat-cache@^3.0.4, flat-cache@^3.2.0: 853 | version "3.2.0" 854 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" 855 | integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== 856 | dependencies: 857 | flatted "^3.2.9" 858 | keyv "^4.5.3" 859 | rimraf "^3.0.2" 860 | 861 | flatted@^3.2.9: 862 | version "3.3.3" 863 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" 864 | integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== 865 | 866 | follow-redirects@^1.0.0: 867 | version "1.15.9" 868 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" 869 | integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== 870 | 871 | fs-extra@^8.1.0: 872 | version "8.1.0" 873 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 874 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 875 | dependencies: 876 | graceful-fs "^4.2.0" 877 | jsonfile "^4.0.0" 878 | universalify "^0.1.0" 879 | 880 | fs.realpath@^1.0.0: 881 | version "1.0.0" 882 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 883 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 884 | 885 | function-bind@^1.1.2: 886 | version "1.1.2" 887 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 888 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 889 | 890 | get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: 891 | version "1.3.0" 892 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" 893 | integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== 894 | dependencies: 895 | call-bind-apply-helpers "^1.0.2" 896 | es-define-property "^1.0.1" 897 | es-errors "^1.3.0" 898 | es-object-atoms "^1.1.1" 899 | function-bind "^1.1.2" 900 | get-proto "^1.0.1" 901 | gopd "^1.2.0" 902 | has-symbols "^1.1.0" 903 | hasown "^2.0.2" 904 | math-intrinsics "^1.1.0" 905 | 906 | get-proto@^1.0.1: 907 | version "1.0.1" 908 | resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" 909 | integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== 910 | dependencies: 911 | dunder-proto "^1.0.1" 912 | es-object-atoms "^1.0.0" 913 | 914 | gh-pages@^3.2.3: 915 | version "3.2.3" 916 | resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-3.2.3.tgz#897e5f15e111f42af57d21d430b83e5cdf29472c" 917 | integrity sha512-jA1PbapQ1jqzacECfjUaO9gV8uBgU6XNMV0oXLtfCX3haGLe5Atq8BxlrADhbD6/UdG9j6tZLWAkAybndOXTJg== 918 | dependencies: 919 | async "^2.6.1" 920 | commander "^2.18.0" 921 | email-addresses "^3.0.1" 922 | filenamify "^4.3.0" 923 | find-cache-dir "^3.3.1" 924 | fs-extra "^8.1.0" 925 | globby "^6.1.0" 926 | 927 | glob-parent@^5.1.2: 928 | version "5.1.2" 929 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 930 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 931 | dependencies: 932 | is-glob "^4.0.1" 933 | 934 | glob-parent@^6.0.2: 935 | version "6.0.2" 936 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 937 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 938 | dependencies: 939 | is-glob "^4.0.3" 940 | 941 | glob@^7.0.3, glob@^7.1.3: 942 | version "7.2.3" 943 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 944 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 945 | dependencies: 946 | fs.realpath "^1.0.0" 947 | inflight "^1.0.4" 948 | inherits "2" 949 | minimatch "^3.1.1" 950 | once "^1.3.0" 951 | path-is-absolute "^1.0.0" 952 | 953 | global-modules@^2.0.0: 954 | version "2.0.0" 955 | resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" 956 | integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== 957 | dependencies: 958 | global-prefix "^3.0.0" 959 | 960 | global-prefix@^3.0.0: 961 | version "3.0.0" 962 | resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" 963 | integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== 964 | dependencies: 965 | ini "^1.3.5" 966 | kind-of "^6.0.2" 967 | which "^1.3.1" 968 | 969 | globals@^13.19.0: 970 | version "13.24.0" 971 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" 972 | integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== 973 | dependencies: 974 | type-fest "^0.20.2" 975 | 976 | globby@^11.1.0: 977 | version "11.1.0" 978 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 979 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 980 | dependencies: 981 | array-union "^2.1.0" 982 | dir-glob "^3.0.1" 983 | fast-glob "^3.2.9" 984 | ignore "^5.2.0" 985 | merge2 "^1.4.1" 986 | slash "^3.0.0" 987 | 988 | globby@^6.1.0: 989 | version "6.1.0" 990 | resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" 991 | integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== 992 | dependencies: 993 | array-union "^1.0.1" 994 | glob "^7.0.3" 995 | object-assign "^4.0.1" 996 | pify "^2.0.0" 997 | pinkie-promise "^2.0.0" 998 | 999 | globjoin@^0.1.4: 1000 | version "0.1.4" 1001 | resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" 1002 | integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== 1003 | 1004 | gopd@^1.2.0: 1005 | version "1.2.0" 1006 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" 1007 | integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== 1008 | 1009 | graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: 1010 | version "4.2.11" 1011 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 1012 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 1013 | 1014 | graphemer@^1.4.0: 1015 | version "1.4.0" 1016 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 1017 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 1018 | 1019 | hard-rejection@^2.1.0: 1020 | version "2.1.0" 1021 | resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" 1022 | integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== 1023 | 1024 | has-flag@^4.0.0: 1025 | version "4.0.0" 1026 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1027 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1028 | 1029 | has-symbols@^1.1.0: 1030 | version "1.1.0" 1031 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" 1032 | integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== 1033 | 1034 | hasown@^2.0.2: 1035 | version "2.0.2" 1036 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 1037 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 1038 | dependencies: 1039 | function-bind "^1.1.2" 1040 | 1041 | he@^1.2.0: 1042 | version "1.2.0" 1043 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 1044 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 1045 | 1046 | hosted-git-info@^4.0.1: 1047 | version "4.1.0" 1048 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" 1049 | integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== 1050 | dependencies: 1051 | lru-cache "^6.0.0" 1052 | 1053 | html-encoding-sniffer@^3.0.0: 1054 | version "3.0.0" 1055 | resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" 1056 | integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== 1057 | dependencies: 1058 | whatwg-encoding "^2.0.0" 1059 | 1060 | html-tags@^3.3.1: 1061 | version "3.3.1" 1062 | resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" 1063 | integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== 1064 | 1065 | http-proxy@^1.18.1: 1066 | version "1.18.1" 1067 | resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" 1068 | integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== 1069 | dependencies: 1070 | eventemitter3 "^4.0.0" 1071 | follow-redirects "^1.0.0" 1072 | requires-port "^1.0.0" 1073 | 1074 | http-server@^14.1.1: 1075 | version "14.1.1" 1076 | resolved "https://registry.yarnpkg.com/http-server/-/http-server-14.1.1.tgz#d60fbb37d7c2fdff0f0fbff0d0ee6670bd285e2e" 1077 | integrity sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A== 1078 | dependencies: 1079 | basic-auth "^2.0.1" 1080 | chalk "^4.1.2" 1081 | corser "^2.0.1" 1082 | he "^1.2.0" 1083 | html-encoding-sniffer "^3.0.0" 1084 | http-proxy "^1.18.1" 1085 | mime "^1.6.0" 1086 | minimist "^1.2.6" 1087 | opener "^1.5.1" 1088 | portfinder "^1.0.28" 1089 | secure-compare "3.0.1" 1090 | union "~0.5.0" 1091 | url-join "^4.0.1" 1092 | 1093 | iconv-lite@0.6.3: 1094 | version "0.6.3" 1095 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" 1096 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 1097 | dependencies: 1098 | safer-buffer ">= 2.1.2 < 3.0.0" 1099 | 1100 | ignore@^5.2.0, ignore@^5.2.4: 1101 | version "5.3.2" 1102 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" 1103 | integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== 1104 | 1105 | import-fresh@^3.2.1, import-fresh@^3.3.0: 1106 | version "3.3.1" 1107 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" 1108 | integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== 1109 | dependencies: 1110 | parent-module "^1.0.0" 1111 | resolve-from "^4.0.0" 1112 | 1113 | import-lazy@^4.0.0: 1114 | version "4.0.0" 1115 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" 1116 | integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== 1117 | 1118 | imurmurhash@^0.1.4: 1119 | version "0.1.4" 1120 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1121 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1122 | 1123 | indent-string@^5.0.0: 1124 | version "5.0.0" 1125 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" 1126 | integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== 1127 | 1128 | inflight@^1.0.4: 1129 | version "1.0.6" 1130 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1131 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 1132 | dependencies: 1133 | once "^1.3.0" 1134 | wrappy "1" 1135 | 1136 | inherits@2: 1137 | version "2.0.4" 1138 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1139 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1140 | 1141 | ini@^1.3.5: 1142 | version "1.3.8" 1143 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 1144 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 1145 | 1146 | is-arrayish@^0.2.1: 1147 | version "0.2.1" 1148 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1149 | integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== 1150 | 1151 | is-core-module@^2.5.0: 1152 | version "2.16.1" 1153 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" 1154 | integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== 1155 | dependencies: 1156 | hasown "^2.0.2" 1157 | 1158 | is-extglob@^2.1.1: 1159 | version "2.1.1" 1160 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1161 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1162 | 1163 | is-fullwidth-code-point@^3.0.0: 1164 | version "3.0.0" 1165 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1166 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1167 | 1168 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 1169 | version "4.0.3" 1170 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1171 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1172 | dependencies: 1173 | is-extglob "^2.1.1" 1174 | 1175 | is-number@^7.0.0: 1176 | version "7.0.0" 1177 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1178 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1179 | 1180 | is-path-inside@^3.0.3: 1181 | version "3.0.3" 1182 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 1183 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1184 | 1185 | is-plain-obj@^1.1.0: 1186 | version "1.1.0" 1187 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 1188 | integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== 1189 | 1190 | is-plain-object@^5.0.0: 1191 | version "5.0.0" 1192 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" 1193 | integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== 1194 | 1195 | isexe@^2.0.0: 1196 | version "2.0.0" 1197 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1198 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1199 | 1200 | js-tokens@^4.0.0: 1201 | version "4.0.0" 1202 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1203 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1204 | 1205 | js-yaml@^4.1.0: 1206 | version "4.1.0" 1207 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1208 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1209 | dependencies: 1210 | argparse "^2.0.1" 1211 | 1212 | json-buffer@3.0.1: 1213 | version "3.0.1" 1214 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 1215 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 1216 | 1217 | json-parse-even-better-errors@^2.3.0: 1218 | version "2.3.1" 1219 | resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" 1220 | integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== 1221 | 1222 | json-schema-traverse@^0.4.1: 1223 | version "0.4.1" 1224 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1225 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1226 | 1227 | json-schema-traverse@^1.0.0: 1228 | version "1.0.0" 1229 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 1230 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 1231 | 1232 | json-stable-stringify-without-jsonify@^1.0.1: 1233 | version "1.0.1" 1234 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1235 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1236 | 1237 | jsonfile@^4.0.0: 1238 | version "4.0.0" 1239 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 1240 | integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== 1241 | optionalDependencies: 1242 | graceful-fs "^4.1.6" 1243 | 1244 | keyv@^4.5.3: 1245 | version "4.5.4" 1246 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 1247 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 1248 | dependencies: 1249 | json-buffer "3.0.1" 1250 | 1251 | kind-of@^6.0.2, kind-of@^6.0.3: 1252 | version "6.0.3" 1253 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 1254 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 1255 | 1256 | known-css-properties@^0.29.0: 1257 | version "0.29.0" 1258 | resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.29.0.tgz#e8ba024fb03886f23cb882e806929f32d814158f" 1259 | integrity sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ== 1260 | 1261 | levn@^0.4.1: 1262 | version "0.4.1" 1263 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1264 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1265 | dependencies: 1266 | prelude-ls "^1.2.1" 1267 | type-check "~0.4.0" 1268 | 1269 | lines-and-columns@^1.1.6: 1270 | version "1.2.4" 1271 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" 1272 | integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== 1273 | 1274 | locate-path@^5.0.0: 1275 | version "5.0.0" 1276 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 1277 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 1278 | dependencies: 1279 | p-locate "^4.1.0" 1280 | 1281 | locate-path@^6.0.0: 1282 | version "6.0.0" 1283 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1284 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1285 | dependencies: 1286 | p-locate "^5.0.0" 1287 | 1288 | lodash.merge@^4.6.2: 1289 | version "4.6.2" 1290 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1291 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1292 | 1293 | lodash.truncate@^4.4.2: 1294 | version "4.4.2" 1295 | resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" 1296 | integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== 1297 | 1298 | lodash@^4.17.14: 1299 | version "4.17.21" 1300 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1301 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1302 | 1303 | lru-cache@^6.0.0: 1304 | version "6.0.0" 1305 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1306 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1307 | dependencies: 1308 | yallist "^4.0.0" 1309 | 1310 | make-dir@^3.0.2: 1311 | version "3.1.0" 1312 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 1313 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 1314 | dependencies: 1315 | semver "^6.0.0" 1316 | 1317 | map-obj@^1.0.0: 1318 | version "1.0.1" 1319 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1320 | integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== 1321 | 1322 | map-obj@^4.1.0: 1323 | version "4.3.0" 1324 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" 1325 | integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== 1326 | 1327 | math-intrinsics@^1.1.0: 1328 | version "1.1.0" 1329 | resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" 1330 | integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== 1331 | 1332 | mathml-tag-names@^2.1.3: 1333 | version "2.1.3" 1334 | resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" 1335 | integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== 1336 | 1337 | mdn-data@2.0.30: 1338 | version "2.0.30" 1339 | resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" 1340 | integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== 1341 | 1342 | meow@^10.1.5: 1343 | version "10.1.5" 1344 | resolved "https://registry.yarnpkg.com/meow/-/meow-10.1.5.tgz#be52a1d87b5f5698602b0f32875ee5940904aa7f" 1345 | integrity sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw== 1346 | dependencies: 1347 | "@types/minimist" "^1.2.2" 1348 | camelcase-keys "^7.0.0" 1349 | decamelize "^5.0.0" 1350 | decamelize-keys "^1.1.0" 1351 | hard-rejection "^2.1.0" 1352 | minimist-options "4.1.0" 1353 | normalize-package-data "^3.0.2" 1354 | read-pkg-up "^8.0.0" 1355 | redent "^4.0.0" 1356 | trim-newlines "^4.0.2" 1357 | type-fest "^1.2.2" 1358 | yargs-parser "^20.2.9" 1359 | 1360 | merge2@^1.3.0, merge2@^1.4.1: 1361 | version "1.4.1" 1362 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1363 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1364 | 1365 | micromatch@^4.0.0, micromatch@^4.0.5, micromatch@^4.0.8: 1366 | version "4.0.8" 1367 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" 1368 | integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== 1369 | dependencies: 1370 | braces "^3.0.3" 1371 | picomatch "^2.3.1" 1372 | 1373 | mime@^1.6.0: 1374 | version "1.6.0" 1375 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1376 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1377 | 1378 | min-indent@^1.0.1: 1379 | version "1.0.1" 1380 | resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" 1381 | integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== 1382 | 1383 | minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 1384 | version "3.1.2" 1385 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1386 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1387 | dependencies: 1388 | brace-expansion "^1.1.7" 1389 | 1390 | minimist-options@4.1.0: 1391 | version "4.1.0" 1392 | resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" 1393 | integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== 1394 | dependencies: 1395 | arrify "^1.0.1" 1396 | is-plain-obj "^1.1.0" 1397 | kind-of "^6.0.3" 1398 | 1399 | minimist@^1.2.6: 1400 | version "1.2.8" 1401 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 1402 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 1403 | 1404 | ms@^2.1.3: 1405 | version "2.1.3" 1406 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1407 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1408 | 1409 | nanoid@^3.3.8: 1410 | version "3.3.11" 1411 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" 1412 | integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== 1413 | 1414 | natural-compare-lite@^1.4.0: 1415 | version "1.4.0" 1416 | resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" 1417 | integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== 1418 | 1419 | natural-compare@^1.4.0: 1420 | version "1.4.0" 1421 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1422 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1423 | 1424 | normalize-package-data@^3.0.2: 1425 | version "3.0.3" 1426 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" 1427 | integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== 1428 | dependencies: 1429 | hosted-git-info "^4.0.1" 1430 | is-core-module "^2.5.0" 1431 | semver "^7.3.4" 1432 | validate-npm-package-license "^3.0.1" 1433 | 1434 | normalize-path@^3.0.0: 1435 | version "3.0.0" 1436 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1437 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1438 | 1439 | object-assign@^4.0.1: 1440 | version "4.1.1" 1441 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1442 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 1443 | 1444 | object-inspect@^1.13.3: 1445 | version "1.13.4" 1446 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" 1447 | integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== 1448 | 1449 | once@^1.3.0: 1450 | version "1.4.0" 1451 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1452 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1453 | dependencies: 1454 | wrappy "1" 1455 | 1456 | opener@^1.5.1: 1457 | version "1.5.2" 1458 | resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" 1459 | integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== 1460 | 1461 | optionator@^0.9.3: 1462 | version "0.9.4" 1463 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" 1464 | integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 1465 | dependencies: 1466 | deep-is "^0.1.3" 1467 | fast-levenshtein "^2.0.6" 1468 | levn "^0.4.1" 1469 | prelude-ls "^1.2.1" 1470 | type-check "^0.4.0" 1471 | word-wrap "^1.2.5" 1472 | 1473 | p-limit@^2.2.0: 1474 | version "2.3.0" 1475 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1476 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1477 | dependencies: 1478 | p-try "^2.0.0" 1479 | 1480 | p-limit@^3.0.2: 1481 | version "3.1.0" 1482 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1483 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1484 | dependencies: 1485 | yocto-queue "^0.1.0" 1486 | 1487 | p-locate@^4.1.0: 1488 | version "4.1.0" 1489 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1490 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1491 | dependencies: 1492 | p-limit "^2.2.0" 1493 | 1494 | p-locate@^5.0.0: 1495 | version "5.0.0" 1496 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1497 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1498 | dependencies: 1499 | p-limit "^3.0.2" 1500 | 1501 | p-try@^2.0.0: 1502 | version "2.2.0" 1503 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1504 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1505 | 1506 | parent-module@^1.0.0: 1507 | version "1.0.1" 1508 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1509 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1510 | dependencies: 1511 | callsites "^3.0.0" 1512 | 1513 | parse-json@^5.2.0: 1514 | version "5.2.0" 1515 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" 1516 | integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== 1517 | dependencies: 1518 | "@babel/code-frame" "^7.0.0" 1519 | error-ex "^1.3.1" 1520 | json-parse-even-better-errors "^2.3.0" 1521 | lines-and-columns "^1.1.6" 1522 | 1523 | path-exists@^4.0.0: 1524 | version "4.0.0" 1525 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1526 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1527 | 1528 | path-is-absolute@^1.0.0: 1529 | version "1.0.1" 1530 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1531 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1532 | 1533 | path-key@^3.1.0: 1534 | version "3.1.1" 1535 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1536 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1537 | 1538 | path-type@^4.0.0: 1539 | version "4.0.0" 1540 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1541 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1542 | 1543 | picocolors@^1.0.0, picocolors@^1.1.1: 1544 | version "1.1.1" 1545 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" 1546 | integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== 1547 | 1548 | picomatch@^2.3.1: 1549 | version "2.3.1" 1550 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1551 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1552 | 1553 | pify@^2.0.0: 1554 | version "2.3.0" 1555 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1556 | integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== 1557 | 1558 | pinkie-promise@^2.0.0: 1559 | version "2.0.1" 1560 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1561 | integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== 1562 | dependencies: 1563 | pinkie "^2.0.0" 1564 | 1565 | pinkie@^2.0.0: 1566 | version "2.0.4" 1567 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1568 | integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== 1569 | 1570 | pkg-dir@^4.1.0: 1571 | version "4.2.0" 1572 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1573 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 1574 | dependencies: 1575 | find-up "^4.0.0" 1576 | 1577 | portfinder@^1.0.28: 1578 | version "1.0.37" 1579 | resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.37.tgz#92b754ef89a11801c8efe4b0e5cd845b0064c212" 1580 | integrity sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw== 1581 | dependencies: 1582 | async "^3.2.6" 1583 | debug "^4.3.6" 1584 | 1585 | postcss-resolve-nested-selector@^0.1.1: 1586 | version "0.1.6" 1587 | resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz#3d84dec809f34de020372c41b039956966896686" 1588 | integrity sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw== 1589 | 1590 | postcss-safe-parser@^6.0.0: 1591 | version "6.0.0" 1592 | resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" 1593 | integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== 1594 | 1595 | postcss-selector-parser@^6.0.13: 1596 | version "6.1.2" 1597 | resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" 1598 | integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== 1599 | dependencies: 1600 | cssesc "^3.0.0" 1601 | util-deprecate "^1.0.2" 1602 | 1603 | postcss-sorting@^8.0.2: 1604 | version "8.0.2" 1605 | resolved "https://registry.yarnpkg.com/postcss-sorting/-/postcss-sorting-8.0.2.tgz#6393385ece272baf74bee9820fb1b58098e4eeca" 1606 | integrity sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q== 1607 | 1608 | postcss-value-parser@^4.2.0: 1609 | version "4.2.0" 1610 | resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" 1611 | integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== 1612 | 1613 | postcss@^8.4.28, postcss@^8.4.32: 1614 | version "8.5.3" 1615 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" 1616 | integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== 1617 | dependencies: 1618 | nanoid "^3.3.8" 1619 | picocolors "^1.1.1" 1620 | source-map-js "^1.2.1" 1621 | 1622 | prelude-ls@^1.2.1: 1623 | version "1.2.1" 1624 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1625 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1626 | 1627 | prettier@^2.8.7: 1628 | version "2.8.8" 1629 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" 1630 | integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== 1631 | 1632 | punycode@^2.1.0: 1633 | version "2.3.1" 1634 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 1635 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 1636 | 1637 | qs@^6.4.0: 1638 | version "6.14.0" 1639 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" 1640 | integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== 1641 | dependencies: 1642 | side-channel "^1.1.0" 1643 | 1644 | queue-microtask@^1.2.2: 1645 | version "1.2.3" 1646 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1647 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1648 | 1649 | quick-lru@^5.1.1: 1650 | version "5.1.1" 1651 | resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" 1652 | integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== 1653 | 1654 | read-pkg-up@^8.0.0: 1655 | version "8.0.0" 1656 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-8.0.0.tgz#72f595b65e66110f43b052dd9af4de6b10534670" 1657 | integrity sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ== 1658 | dependencies: 1659 | find-up "^5.0.0" 1660 | read-pkg "^6.0.0" 1661 | type-fest "^1.0.1" 1662 | 1663 | read-pkg@^6.0.0: 1664 | version "6.0.0" 1665 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-6.0.0.tgz#a67a7d6a1c2b0c3cd6aa2ea521f40c458a4a504c" 1666 | integrity sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q== 1667 | dependencies: 1668 | "@types/normalize-package-data" "^2.4.0" 1669 | normalize-package-data "^3.0.2" 1670 | parse-json "^5.2.0" 1671 | type-fest "^1.0.1" 1672 | 1673 | redent@^4.0.0: 1674 | version "4.0.0" 1675 | resolved "https://registry.yarnpkg.com/redent/-/redent-4.0.0.tgz#0c0ba7caabb24257ab3bb7a4fd95dd1d5c5681f9" 1676 | integrity sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag== 1677 | dependencies: 1678 | indent-string "^5.0.0" 1679 | strip-indent "^4.0.0" 1680 | 1681 | require-from-string@^2.0.2: 1682 | version "2.0.2" 1683 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 1684 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 1685 | 1686 | requires-port@^1.0.0: 1687 | version "1.0.0" 1688 | resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" 1689 | integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== 1690 | 1691 | resolve-from@^4.0.0: 1692 | version "4.0.0" 1693 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1694 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1695 | 1696 | resolve-from@^5.0.0: 1697 | version "5.0.0" 1698 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 1699 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 1700 | 1701 | reusify@^1.0.4: 1702 | version "1.1.0" 1703 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" 1704 | integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== 1705 | 1706 | rimraf@^3.0.2: 1707 | version "3.0.2" 1708 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1709 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1710 | dependencies: 1711 | glob "^7.1.3" 1712 | 1713 | run-parallel@^1.1.9: 1714 | version "1.2.0" 1715 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1716 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1717 | dependencies: 1718 | queue-microtask "^1.2.2" 1719 | 1720 | safe-buffer@5.1.2: 1721 | version "5.1.2" 1722 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1723 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1724 | 1725 | "safer-buffer@>= 2.1.2 < 3.0.0": 1726 | version "2.1.2" 1727 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1728 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1729 | 1730 | secure-compare@3.0.1: 1731 | version "3.0.1" 1732 | resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" 1733 | integrity sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw== 1734 | 1735 | semver@^6.0.0: 1736 | version "6.3.1" 1737 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 1738 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 1739 | 1740 | semver@^7.3.4, semver@^7.3.7: 1741 | version "7.7.1" 1742 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" 1743 | integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== 1744 | 1745 | shebang-command@^2.0.0: 1746 | version "2.0.0" 1747 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1748 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1749 | dependencies: 1750 | shebang-regex "^3.0.0" 1751 | 1752 | shebang-regex@^3.0.0: 1753 | version "3.0.0" 1754 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1755 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1756 | 1757 | side-channel-list@^1.0.0: 1758 | version "1.0.0" 1759 | resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" 1760 | integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== 1761 | dependencies: 1762 | es-errors "^1.3.0" 1763 | object-inspect "^1.13.3" 1764 | 1765 | side-channel-map@^1.0.1: 1766 | version "1.0.1" 1767 | resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" 1768 | integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== 1769 | dependencies: 1770 | call-bound "^1.0.2" 1771 | es-errors "^1.3.0" 1772 | get-intrinsic "^1.2.5" 1773 | object-inspect "^1.13.3" 1774 | 1775 | side-channel-weakmap@^1.0.2: 1776 | version "1.0.2" 1777 | resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" 1778 | integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== 1779 | dependencies: 1780 | call-bound "^1.0.2" 1781 | es-errors "^1.3.0" 1782 | get-intrinsic "^1.2.5" 1783 | object-inspect "^1.13.3" 1784 | side-channel-map "^1.0.1" 1785 | 1786 | side-channel@^1.1.0: 1787 | version "1.1.0" 1788 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" 1789 | integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== 1790 | dependencies: 1791 | es-errors "^1.3.0" 1792 | object-inspect "^1.13.3" 1793 | side-channel-list "^1.0.0" 1794 | side-channel-map "^1.0.1" 1795 | side-channel-weakmap "^1.0.2" 1796 | 1797 | signal-exit@^4.0.1: 1798 | version "4.1.0" 1799 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" 1800 | integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== 1801 | 1802 | slash@^3.0.0: 1803 | version "3.0.0" 1804 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1805 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1806 | 1807 | slice-ansi@^4.0.0: 1808 | version "4.0.0" 1809 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" 1810 | integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== 1811 | dependencies: 1812 | ansi-styles "^4.0.0" 1813 | astral-regex "^2.0.0" 1814 | is-fullwidth-code-point "^3.0.0" 1815 | 1816 | source-map-js@^1.0.1, source-map-js@^1.2.1: 1817 | version "1.2.1" 1818 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" 1819 | integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== 1820 | 1821 | source-map-support@~0.5.20: 1822 | version "0.5.21" 1823 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" 1824 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== 1825 | dependencies: 1826 | buffer-from "^1.0.0" 1827 | source-map "^0.6.0" 1828 | 1829 | source-map@^0.6.0: 1830 | version "0.6.1" 1831 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1832 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1833 | 1834 | source-map@^0.7.4: 1835 | version "0.7.4" 1836 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" 1837 | integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== 1838 | 1839 | spdx-correct@^3.0.0: 1840 | version "3.2.0" 1841 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" 1842 | integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== 1843 | dependencies: 1844 | spdx-expression-parse "^3.0.0" 1845 | spdx-license-ids "^3.0.0" 1846 | 1847 | spdx-exceptions@^2.1.0: 1848 | version "2.5.0" 1849 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" 1850 | integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== 1851 | 1852 | spdx-expression-parse@^3.0.0: 1853 | version "3.0.1" 1854 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" 1855 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== 1856 | dependencies: 1857 | spdx-exceptions "^2.1.0" 1858 | spdx-license-ids "^3.0.0" 1859 | 1860 | spdx-license-ids@^3.0.0: 1861 | version "3.0.21" 1862 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz#6d6e980c9df2b6fc905343a3b2d702a6239536c3" 1863 | integrity sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg== 1864 | 1865 | string-width@^4.2.3: 1866 | version "4.2.3" 1867 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1868 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1869 | dependencies: 1870 | emoji-regex "^8.0.0" 1871 | is-fullwidth-code-point "^3.0.0" 1872 | strip-ansi "^6.0.1" 1873 | 1874 | strip-ansi@^6.0.1: 1875 | version "6.0.1" 1876 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1877 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1878 | dependencies: 1879 | ansi-regex "^5.0.1" 1880 | 1881 | strip-indent@^4.0.0: 1882 | version "4.0.0" 1883 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.0.0.tgz#b41379433dd06f5eae805e21d631e07ee670d853" 1884 | integrity sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA== 1885 | dependencies: 1886 | min-indent "^1.0.1" 1887 | 1888 | strip-json-comments@^3.1.1: 1889 | version "3.1.1" 1890 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1891 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1892 | 1893 | strip-outer@^1.0.1: 1894 | version "1.0.1" 1895 | resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" 1896 | integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== 1897 | dependencies: 1898 | escape-string-regexp "^1.0.2" 1899 | 1900 | style-search@^0.1.0: 1901 | version "0.1.0" 1902 | resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" 1903 | integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== 1904 | 1905 | stylelint-config-recess-order@^4.0.0: 1906 | version "4.6.0" 1907 | resolved "https://registry.yarnpkg.com/stylelint-config-recess-order/-/stylelint-config-recess-order-4.6.0.tgz#b4c851c490b4e626b14712686b1eab1e4b17e253" 1908 | integrity sha512-V76fhv3YtcNXh/hyAuAdSzi5FmcrG54Mp2AThJ3D/PTMTSYzUPd7GIhP6z9mTqnRhmkk6YTfcu/JWB8h+Yrcaw== 1909 | dependencies: 1910 | stylelint-order "6.x" 1911 | 1912 | stylelint-config-recommended@^11.0.0: 1913 | version "11.0.0" 1914 | resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-11.0.0.tgz#b1cb7d71bd92f9b8593f93c2ca6df16ed7d61522" 1915 | integrity sha512-SoGIHNI748OCZn6BxFYT83ytWoYETCINVHV3LKScVAWQQauWdvmdDqJC5YXWjpBbxg2E761Tg5aUGKLFOVhEkA== 1916 | 1917 | stylelint-config-standard@^31.0.0: 1918 | version "31.0.0" 1919 | resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-31.0.0.tgz#90d94e1b43df798412e129b4b1cb4c4e56ffe64f" 1920 | integrity sha512-CUGAmtROCvX0YgMY2+6P9tqSkHj5z/75XxrQ8bGxvkCa1xYdGDx4poM0pa7cXc3s74/PZLJH/okxZZouRfOSGw== 1921 | dependencies: 1922 | stylelint-config-recommended "^11.0.0" 1923 | 1924 | stylelint-order@6.x: 1925 | version "6.0.4" 1926 | resolved "https://registry.yarnpkg.com/stylelint-order/-/stylelint-order-6.0.4.tgz#3e80d876c61a98d2640de181433686f24284748b" 1927 | integrity sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA== 1928 | dependencies: 1929 | postcss "^8.4.32" 1930 | postcss-sorting "^8.0.2" 1931 | 1932 | stylelint@^15.3.0: 1933 | version "15.11.0" 1934 | resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-15.11.0.tgz#3ff8466f5f5c47362bc7c8c9d382741c58bc3292" 1935 | integrity sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw== 1936 | dependencies: 1937 | "@csstools/css-parser-algorithms" "^2.3.1" 1938 | "@csstools/css-tokenizer" "^2.2.0" 1939 | "@csstools/media-query-list-parser" "^2.1.4" 1940 | "@csstools/selector-specificity" "^3.0.0" 1941 | balanced-match "^2.0.0" 1942 | colord "^2.9.3" 1943 | cosmiconfig "^8.2.0" 1944 | css-functions-list "^3.2.1" 1945 | css-tree "^2.3.1" 1946 | debug "^4.3.4" 1947 | fast-glob "^3.3.1" 1948 | fastest-levenshtein "^1.0.16" 1949 | file-entry-cache "^7.0.0" 1950 | global-modules "^2.0.0" 1951 | globby "^11.1.0" 1952 | globjoin "^0.1.4" 1953 | html-tags "^3.3.1" 1954 | ignore "^5.2.4" 1955 | import-lazy "^4.0.0" 1956 | imurmurhash "^0.1.4" 1957 | is-plain-object "^5.0.0" 1958 | known-css-properties "^0.29.0" 1959 | mathml-tag-names "^2.1.3" 1960 | meow "^10.1.5" 1961 | micromatch "^4.0.5" 1962 | normalize-path "^3.0.0" 1963 | picocolors "^1.0.0" 1964 | postcss "^8.4.28" 1965 | postcss-resolve-nested-selector "^0.1.1" 1966 | postcss-safe-parser "^6.0.0" 1967 | postcss-selector-parser "^6.0.13" 1968 | postcss-value-parser "^4.2.0" 1969 | resolve-from "^5.0.0" 1970 | string-width "^4.2.3" 1971 | strip-ansi "^6.0.1" 1972 | style-search "^0.1.0" 1973 | supports-hyperlinks "^3.0.0" 1974 | svg-tags "^1.0.0" 1975 | table "^6.8.1" 1976 | write-file-atomic "^5.0.1" 1977 | 1978 | supports-color@^7.0.0, supports-color@^7.1.0: 1979 | version "7.2.0" 1980 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1981 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1982 | dependencies: 1983 | has-flag "^4.0.0" 1984 | 1985 | supports-hyperlinks@^3.0.0: 1986 | version "3.2.0" 1987 | resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz#b8e485b179681dea496a1e7abdf8985bd3145461" 1988 | integrity sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig== 1989 | dependencies: 1990 | has-flag "^4.0.0" 1991 | supports-color "^7.0.0" 1992 | 1993 | svg-tags@^1.0.0: 1994 | version "1.0.0" 1995 | resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" 1996 | integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== 1997 | 1998 | table@^6.8.1: 1999 | version "6.9.0" 2000 | resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5" 2001 | integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A== 2002 | dependencies: 2003 | ajv "^8.0.1" 2004 | lodash.truncate "^4.4.2" 2005 | slice-ansi "^4.0.0" 2006 | string-width "^4.2.3" 2007 | strip-ansi "^6.0.1" 2008 | 2009 | tapable@^2.2.0: 2010 | version "2.2.1" 2011 | resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" 2012 | integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== 2013 | 2014 | terser@^5.7.1: 2015 | version "5.39.0" 2016 | resolved "https://registry.yarnpkg.com/terser/-/terser-5.39.0.tgz#0e82033ed57b3ddf1f96708d123cca717d86ca3a" 2017 | integrity sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw== 2018 | dependencies: 2019 | "@jridgewell/source-map" "^0.3.3" 2020 | acorn "^8.8.2" 2021 | commander "^2.20.0" 2022 | source-map-support "~0.5.20" 2023 | 2024 | text-table@^0.2.0: 2025 | version "0.2.0" 2026 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2027 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 2028 | 2029 | to-regex-range@^5.0.1: 2030 | version "5.0.1" 2031 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2032 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2033 | dependencies: 2034 | is-number "^7.0.0" 2035 | 2036 | trim-newlines@^4.0.2: 2037 | version "4.1.1" 2038 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-4.1.1.tgz#28c88deb50ed10c7ba6dc2474421904a00139125" 2039 | integrity sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ== 2040 | 2041 | trim-repeated@^1.0.0: 2042 | version "1.0.0" 2043 | resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" 2044 | integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== 2045 | dependencies: 2046 | escape-string-regexp "^1.0.2" 2047 | 2048 | ts-loader@^9.2.3: 2049 | version "9.5.2" 2050 | resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.2.tgz#1f3d7f4bb709b487aaa260e8f19b301635d08020" 2051 | integrity sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw== 2052 | dependencies: 2053 | chalk "^4.1.0" 2054 | enhanced-resolve "^5.0.0" 2055 | micromatch "^4.0.0" 2056 | semver "^7.3.4" 2057 | source-map "^0.7.4" 2058 | 2059 | tslib@^1.8.1: 2060 | version "1.14.1" 2061 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 2062 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 2063 | 2064 | tsutils@^3.21.0: 2065 | version "3.21.0" 2066 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" 2067 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 2068 | dependencies: 2069 | tslib "^1.8.1" 2070 | 2071 | type-check@^0.4.0, type-check@~0.4.0: 2072 | version "0.4.0" 2073 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 2074 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 2075 | dependencies: 2076 | prelude-ls "^1.2.1" 2077 | 2078 | type-fest@^0.20.2: 2079 | version "0.20.2" 2080 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 2081 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 2082 | 2083 | type-fest@^1.0.1, type-fest@^1.2.1, type-fest@^1.2.2: 2084 | version "1.4.0" 2085 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" 2086 | integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== 2087 | 2088 | typescript@^5.0.4: 2089 | version "5.8.3" 2090 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" 2091 | integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== 2092 | 2093 | uglify-js@^3.17.4: 2094 | version "3.19.3" 2095 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" 2096 | integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== 2097 | 2098 | union@~0.5.0: 2099 | version "0.5.0" 2100 | resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" 2101 | integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== 2102 | dependencies: 2103 | qs "^6.4.0" 2104 | 2105 | universalify@^0.1.0: 2106 | version "0.1.2" 2107 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 2108 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 2109 | 2110 | uri-js@^4.2.2: 2111 | version "4.4.1" 2112 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 2113 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 2114 | dependencies: 2115 | punycode "^2.1.0" 2116 | 2117 | url-join@^4.0.1: 2118 | version "4.0.1" 2119 | resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" 2120 | integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== 2121 | 2122 | util-deprecate@^1.0.2: 2123 | version "1.0.2" 2124 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2125 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 2126 | 2127 | validate-npm-package-license@^3.0.1: 2128 | version "3.0.4" 2129 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 2130 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 2131 | dependencies: 2132 | spdx-correct "^3.0.0" 2133 | spdx-expression-parse "^3.0.0" 2134 | 2135 | whatwg-encoding@^2.0.0: 2136 | version "2.0.0" 2137 | resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" 2138 | integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== 2139 | dependencies: 2140 | iconv-lite "0.6.3" 2141 | 2142 | which@^1.3.1: 2143 | version "1.3.1" 2144 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2145 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2146 | dependencies: 2147 | isexe "^2.0.0" 2148 | 2149 | which@^2.0.1: 2150 | version "2.0.2" 2151 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2152 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2153 | dependencies: 2154 | isexe "^2.0.0" 2155 | 2156 | word-wrap@^1.2.5: 2157 | version "1.2.5" 2158 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" 2159 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 2160 | 2161 | wrappy@1: 2162 | version "1.0.2" 2163 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2164 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 2165 | 2166 | write-file-atomic@^5.0.1: 2167 | version "5.0.1" 2168 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" 2169 | integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== 2170 | dependencies: 2171 | imurmurhash "^0.1.4" 2172 | signal-exit "^4.0.1" 2173 | 2174 | yallist@^4.0.0: 2175 | version "4.0.0" 2176 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2177 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2178 | 2179 | yargs-parser@^20.2.9: 2180 | version "20.2.9" 2181 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 2182 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 2183 | 2184 | yocto-queue@^0.1.0: 2185 | version "0.1.0" 2186 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 2187 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 2188 | --------------------------------------------------------------------------------