├── .gitignore ├── README.md ├── index.html ├── logo.jpg ├── manifest.config.ts ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── public ├── icons │ ├── icon128.png │ ├── icon16.png │ ├── icon32.png │ └── icon48.png └── vite.svg ├── scripts └── twitter.js ├── src ├── App.css ├── App.tsx ├── Bookmarks.tsx ├── SearchBar.tsx ├── assets │ └── solid.svg ├── background.ts ├── bookmark-tojson.js ├── content.js ├── index.css ├── index.tsx └── vite-env.d.ts ├── tailwind.config.js ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Twitter Advanced Search Exptension 2 | 3 | - Chrome Webstore link: https://chromewebstore.google.com/detail/twitter-advanced-search/ngglldgjkjekfbmbfpankdmmknabbgmp?hl=en 4 | 5 | ## How to build it from source 6 | 7 | - Clone this repository 8 | - Run `npm install` 9 | - Run `npm run build` 10 | - Go to `chrome://extensions/` 11 | - Enable developer mode 12 | - Click on `Load unpacked extension` 13 | - Select the `dist` folder 14 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + Solid + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonigeez/twitter-adv-search/964132a0c843ebfb41594569f5b1a07dff3f753a/logo.jpg -------------------------------------------------------------------------------- /manifest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineManifest } from "@crxjs/vite-plugin"; 2 | import packageJson from "./package.json"; 3 | const { version } = packageJson; 4 | 5 | // Convert from Semver (example: 0.1.0-beta6) 6 | const [major, minor, patch, label = "0"] = version 7 | // can only contain digits, dots, or dash 8 | .replace(/[^\d.-]+/g, "") 9 | // split into version parts 10 | .split(/[.-]/); 11 | 12 | export default defineManifest(async (env) => ({ 13 | manifest_version: 3, 14 | name: 15 | env.mode === "staging" 16 | ? "[INTERNAL] X(Twitter) Helper" 17 | : "X(Twitter) Addons", 18 | // up to four numbers separated by dots 19 | version: `${major}.${minor}.${patch}.${label}`, 20 | // semver is OK in "version_name" 21 | version_name: version, 22 | action: { 23 | default_popup: "index.html", 24 | }, 25 | permissions: [ 26 | "activeTab", 27 | "storage", 28 | "scripting", 29 | "tabs", 30 | "unlimitedStorage", 31 | ], 32 | background: { 33 | service_worker: "src/background.ts", 34 | type: "module", 35 | }, 36 | 37 | content_scripts: [{ matches: ["https://x.com/*"], js: ["src/content.js"] }], 38 | 39 | //logo 40 | icons: { 41 | 16: "public/icons/icon16.png", 42 | 32: "public/icons/icon32.png", 43 | 48: "public/icons/icon48.png", 44 | 128: "public/icons/icon128.png", 45 | }, 46 | })); 47 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "x-addons", 3 | "private": true, 4 | "version": "1.1.7", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "@types/chrome": "^0.0.259", 13 | "solid-js": "^1.8.7" 14 | }, 15 | "devDependencies": { 16 | "@crxjs/vite-plugin": "2.0.0-beta.21", 17 | "autoprefixer": "^10.4.16", 18 | "postcss": "^8.4.32", 19 | "tailwindcss": "^3.4.0", 20 | "typescript": "^5.2.2", 21 | "vite": "^4.3.9", 22 | "vite-plugin-solid": "^2.7.0" 23 | } 24 | } -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@types/chrome': 9 | specifier: ^0.0.259 10 | version: 0.0.259 11 | solid-js: 12 | specifier: ^1.8.7 13 | version: 1.8.7 14 | 15 | devDependencies: 16 | '@crxjs/vite-plugin': 17 | specifier: 2.0.0-beta.21 18 | version: 2.0.0-beta.21 19 | autoprefixer: 20 | specifier: ^10.4.16 21 | version: 10.4.16(postcss@8.4.32) 22 | postcss: 23 | specifier: ^8.4.32 24 | version: 8.4.32 25 | tailwindcss: 26 | specifier: ^3.4.0 27 | version: 3.4.0 28 | typescript: 29 | specifier: ^5.2.2 30 | version: 5.3.3 31 | vite: 32 | specifier: ^4.3.9 33 | version: 4.5.1 34 | vite-plugin-solid: 35 | specifier: ^2.7.0 36 | version: 2.8.0(solid-js@1.8.7)(vite@4.5.1) 37 | 38 | packages: 39 | 40 | /@alloc/quick-lru@5.2.0: 41 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 42 | engines: {node: '>=10'} 43 | dev: true 44 | 45 | /@ampproject/remapping@2.2.1: 46 | resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} 47 | engines: {node: '>=6.0.0'} 48 | dependencies: 49 | '@jridgewell/gen-mapping': 0.3.3 50 | '@jridgewell/trace-mapping': 0.3.20 51 | dev: true 52 | 53 | /@babel/code-frame@7.23.5: 54 | resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} 55 | engines: {node: '>=6.9.0'} 56 | dependencies: 57 | '@babel/highlight': 7.23.4 58 | chalk: 2.4.2 59 | dev: true 60 | 61 | /@babel/compat-data@7.23.5: 62 | resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} 63 | engines: {node: '>=6.9.0'} 64 | dev: true 65 | 66 | /@babel/core@7.23.7: 67 | resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} 68 | engines: {node: '>=6.9.0'} 69 | dependencies: 70 | '@ampproject/remapping': 2.2.1 71 | '@babel/code-frame': 7.23.5 72 | '@babel/generator': 7.23.6 73 | '@babel/helper-compilation-targets': 7.23.6 74 | '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) 75 | '@babel/helpers': 7.23.7 76 | '@babel/parser': 7.23.6 77 | '@babel/template': 7.22.15 78 | '@babel/traverse': 7.23.7 79 | '@babel/types': 7.23.6 80 | convert-source-map: 2.0.0 81 | debug: 4.3.4 82 | gensync: 1.0.0-beta.2 83 | json5: 2.2.3 84 | semver: 6.3.1 85 | transitivePeerDependencies: 86 | - supports-color 87 | dev: true 88 | 89 | /@babel/generator@7.23.6: 90 | resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} 91 | engines: {node: '>=6.9.0'} 92 | dependencies: 93 | '@babel/types': 7.23.6 94 | '@jridgewell/gen-mapping': 0.3.3 95 | '@jridgewell/trace-mapping': 0.3.20 96 | jsesc: 2.5.2 97 | dev: true 98 | 99 | /@babel/helper-annotate-as-pure@7.22.5: 100 | resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} 101 | engines: {node: '>=6.9.0'} 102 | dependencies: 103 | '@babel/types': 7.23.6 104 | dev: true 105 | 106 | /@babel/helper-compilation-targets@7.23.6: 107 | resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} 108 | engines: {node: '>=6.9.0'} 109 | dependencies: 110 | '@babel/compat-data': 7.23.5 111 | '@babel/helper-validator-option': 7.23.5 112 | browserslist: 4.22.2 113 | lru-cache: 5.1.1 114 | semver: 6.3.1 115 | dev: true 116 | 117 | /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.7): 118 | resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} 119 | engines: {node: '>=6.9.0'} 120 | peerDependencies: 121 | '@babel/core': ^7.0.0 122 | dependencies: 123 | '@babel/core': 7.23.7 124 | '@babel/helper-annotate-as-pure': 7.22.5 125 | '@babel/helper-environment-visitor': 7.22.20 126 | '@babel/helper-function-name': 7.23.0 127 | '@babel/helper-member-expression-to-functions': 7.23.0 128 | '@babel/helper-optimise-call-expression': 7.22.5 129 | '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) 130 | '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 131 | '@babel/helper-split-export-declaration': 7.22.6 132 | semver: 6.3.1 133 | dev: true 134 | 135 | /@babel/helper-environment-visitor@7.22.20: 136 | resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} 137 | engines: {node: '>=6.9.0'} 138 | dev: true 139 | 140 | /@babel/helper-function-name@7.23.0: 141 | resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} 142 | engines: {node: '>=6.9.0'} 143 | dependencies: 144 | '@babel/template': 7.22.15 145 | '@babel/types': 7.23.6 146 | dev: true 147 | 148 | /@babel/helper-hoist-variables@7.22.5: 149 | resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 150 | engines: {node: '>=6.9.0'} 151 | dependencies: 152 | '@babel/types': 7.23.6 153 | dev: true 154 | 155 | /@babel/helper-member-expression-to-functions@7.23.0: 156 | resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} 157 | engines: {node: '>=6.9.0'} 158 | dependencies: 159 | '@babel/types': 7.23.6 160 | dev: true 161 | 162 | /@babel/helper-module-imports@7.18.6: 163 | resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} 164 | engines: {node: '>=6.9.0'} 165 | dependencies: 166 | '@babel/types': 7.23.6 167 | dev: true 168 | 169 | /@babel/helper-module-imports@7.22.15: 170 | resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} 171 | engines: {node: '>=6.9.0'} 172 | dependencies: 173 | '@babel/types': 7.23.6 174 | dev: true 175 | 176 | /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): 177 | resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} 178 | engines: {node: '>=6.9.0'} 179 | peerDependencies: 180 | '@babel/core': ^7.0.0 181 | dependencies: 182 | '@babel/core': 7.23.7 183 | '@babel/helper-environment-visitor': 7.22.20 184 | '@babel/helper-module-imports': 7.22.15 185 | '@babel/helper-simple-access': 7.22.5 186 | '@babel/helper-split-export-declaration': 7.22.6 187 | '@babel/helper-validator-identifier': 7.22.20 188 | dev: true 189 | 190 | /@babel/helper-optimise-call-expression@7.22.5: 191 | resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} 192 | engines: {node: '>=6.9.0'} 193 | dependencies: 194 | '@babel/types': 7.23.6 195 | dev: true 196 | 197 | /@babel/helper-plugin-utils@7.22.5: 198 | resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} 199 | engines: {node: '>=6.9.0'} 200 | dev: true 201 | 202 | /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.7): 203 | resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} 204 | engines: {node: '>=6.9.0'} 205 | peerDependencies: 206 | '@babel/core': ^7.0.0 207 | dependencies: 208 | '@babel/core': 7.23.7 209 | '@babel/helper-environment-visitor': 7.22.20 210 | '@babel/helper-member-expression-to-functions': 7.23.0 211 | '@babel/helper-optimise-call-expression': 7.22.5 212 | dev: true 213 | 214 | /@babel/helper-simple-access@7.22.5: 215 | resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} 216 | engines: {node: '>=6.9.0'} 217 | dependencies: 218 | '@babel/types': 7.23.6 219 | dev: true 220 | 221 | /@babel/helper-skip-transparent-expression-wrappers@7.22.5: 222 | resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} 223 | engines: {node: '>=6.9.0'} 224 | dependencies: 225 | '@babel/types': 7.23.6 226 | dev: true 227 | 228 | /@babel/helper-split-export-declaration@7.22.6: 229 | resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} 230 | engines: {node: '>=6.9.0'} 231 | dependencies: 232 | '@babel/types': 7.23.6 233 | dev: true 234 | 235 | /@babel/helper-string-parser@7.23.4: 236 | resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} 237 | engines: {node: '>=6.9.0'} 238 | dev: true 239 | 240 | /@babel/helper-validator-identifier@7.22.20: 241 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 242 | engines: {node: '>=6.9.0'} 243 | dev: true 244 | 245 | /@babel/helper-validator-option@7.23.5: 246 | resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} 247 | engines: {node: '>=6.9.0'} 248 | dev: true 249 | 250 | /@babel/helpers@7.23.7: 251 | resolution: {integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==} 252 | engines: {node: '>=6.9.0'} 253 | dependencies: 254 | '@babel/template': 7.22.15 255 | '@babel/traverse': 7.23.7 256 | '@babel/types': 7.23.6 257 | transitivePeerDependencies: 258 | - supports-color 259 | dev: true 260 | 261 | /@babel/highlight@7.23.4: 262 | resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} 263 | engines: {node: '>=6.9.0'} 264 | dependencies: 265 | '@babel/helper-validator-identifier': 7.22.20 266 | chalk: 2.4.2 267 | js-tokens: 4.0.0 268 | dev: true 269 | 270 | /@babel/parser@7.23.6: 271 | resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} 272 | engines: {node: '>=6.0.0'} 273 | hasBin: true 274 | dependencies: 275 | '@babel/types': 7.23.6 276 | dev: true 277 | 278 | /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.7): 279 | resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} 280 | engines: {node: '>=6.9.0'} 281 | peerDependencies: 282 | '@babel/core': ^7.0.0-0 283 | dependencies: 284 | '@babel/core': 7.23.7 285 | '@babel/helper-plugin-utils': 7.22.5 286 | dev: true 287 | 288 | /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.7): 289 | resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} 290 | engines: {node: '>=6.9.0'} 291 | peerDependencies: 292 | '@babel/core': ^7.0.0-0 293 | dependencies: 294 | '@babel/core': 7.23.7 295 | '@babel/helper-plugin-utils': 7.22.5 296 | dev: true 297 | 298 | /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.7): 299 | resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} 300 | engines: {node: '>=6.9.0'} 301 | peerDependencies: 302 | '@babel/core': ^7.0.0-0 303 | dependencies: 304 | '@babel/core': 7.23.7 305 | '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) 306 | '@babel/helper-plugin-utils': 7.22.5 307 | '@babel/helper-simple-access': 7.22.5 308 | dev: true 309 | 310 | /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.7): 311 | resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} 312 | engines: {node: '>=6.9.0'} 313 | peerDependencies: 314 | '@babel/core': ^7.0.0-0 315 | dependencies: 316 | '@babel/core': 7.23.7 317 | '@babel/helper-annotate-as-pure': 7.22.5 318 | '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) 319 | '@babel/helper-plugin-utils': 7.22.5 320 | '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) 321 | dev: true 322 | 323 | /@babel/preset-typescript@7.23.3(@babel/core@7.23.7): 324 | resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} 325 | engines: {node: '>=6.9.0'} 326 | peerDependencies: 327 | '@babel/core': ^7.0.0-0 328 | dependencies: 329 | '@babel/core': 7.23.7 330 | '@babel/helper-plugin-utils': 7.22.5 331 | '@babel/helper-validator-option': 7.23.5 332 | '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) 333 | '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.7) 334 | '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.7) 335 | dev: true 336 | 337 | /@babel/template@7.22.15: 338 | resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} 339 | engines: {node: '>=6.9.0'} 340 | dependencies: 341 | '@babel/code-frame': 7.23.5 342 | '@babel/parser': 7.23.6 343 | '@babel/types': 7.23.6 344 | dev: true 345 | 346 | /@babel/traverse@7.23.7: 347 | resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} 348 | engines: {node: '>=6.9.0'} 349 | dependencies: 350 | '@babel/code-frame': 7.23.5 351 | '@babel/generator': 7.23.6 352 | '@babel/helper-environment-visitor': 7.22.20 353 | '@babel/helper-function-name': 7.23.0 354 | '@babel/helper-hoist-variables': 7.22.5 355 | '@babel/helper-split-export-declaration': 7.22.6 356 | '@babel/parser': 7.23.6 357 | '@babel/types': 7.23.6 358 | debug: 4.3.4 359 | globals: 11.12.0 360 | transitivePeerDependencies: 361 | - supports-color 362 | dev: true 363 | 364 | /@babel/types@7.23.6: 365 | resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} 366 | engines: {node: '>=6.9.0'} 367 | dependencies: 368 | '@babel/helper-string-parser': 7.23.4 369 | '@babel/helper-validator-identifier': 7.22.20 370 | to-fast-properties: 2.0.0 371 | dev: true 372 | 373 | /@crxjs/vite-plugin@2.0.0-beta.21: 374 | resolution: {integrity: sha512-kSXgHHqCXASqJ8NmY94+KLGVwdtkJ0E7KsRQ+vbMpRliJ5ze0xnSk0l41p4txlUysmEoqaeo4Xb7rEFdcU2zjQ==} 375 | dependencies: 376 | '@rollup/pluginutils': 4.2.1 377 | '@webcomponents/custom-elements': 1.6.0 378 | acorn-walk: 8.3.1 379 | cheerio: 1.0.0-rc.12 380 | connect-injector: 0.4.4 381 | convert-source-map: 1.9.0 382 | debug: 4.3.4 383 | es-module-lexer: 0.10.5 384 | fast-glob: 3.3.2 385 | fs-extra: 10.1.0 386 | jsesc: 3.0.2 387 | magic-string: 0.26.7 388 | picocolors: 1.0.0 389 | react-refresh: 0.13.0 390 | rollup: 2.78.1 391 | rxjs: 7.5.7 392 | transitivePeerDependencies: 393 | - supports-color 394 | dev: true 395 | 396 | /@esbuild/android-arm64@0.18.20: 397 | resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 398 | engines: {node: '>=12'} 399 | cpu: [arm64] 400 | os: [android] 401 | requiresBuild: true 402 | dev: true 403 | optional: true 404 | 405 | /@esbuild/android-arm@0.18.20: 406 | resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 407 | engines: {node: '>=12'} 408 | cpu: [arm] 409 | os: [android] 410 | requiresBuild: true 411 | dev: true 412 | optional: true 413 | 414 | /@esbuild/android-x64@0.18.20: 415 | resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 416 | engines: {node: '>=12'} 417 | cpu: [x64] 418 | os: [android] 419 | requiresBuild: true 420 | dev: true 421 | optional: true 422 | 423 | /@esbuild/darwin-arm64@0.18.20: 424 | resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 425 | engines: {node: '>=12'} 426 | cpu: [arm64] 427 | os: [darwin] 428 | requiresBuild: true 429 | dev: true 430 | optional: true 431 | 432 | /@esbuild/darwin-x64@0.18.20: 433 | resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 434 | engines: {node: '>=12'} 435 | cpu: [x64] 436 | os: [darwin] 437 | requiresBuild: true 438 | dev: true 439 | optional: true 440 | 441 | /@esbuild/freebsd-arm64@0.18.20: 442 | resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 443 | engines: {node: '>=12'} 444 | cpu: [arm64] 445 | os: [freebsd] 446 | requiresBuild: true 447 | dev: true 448 | optional: true 449 | 450 | /@esbuild/freebsd-x64@0.18.20: 451 | resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 452 | engines: {node: '>=12'} 453 | cpu: [x64] 454 | os: [freebsd] 455 | requiresBuild: true 456 | dev: true 457 | optional: true 458 | 459 | /@esbuild/linux-arm64@0.18.20: 460 | resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 461 | engines: {node: '>=12'} 462 | cpu: [arm64] 463 | os: [linux] 464 | requiresBuild: true 465 | dev: true 466 | optional: true 467 | 468 | /@esbuild/linux-arm@0.18.20: 469 | resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 470 | engines: {node: '>=12'} 471 | cpu: [arm] 472 | os: [linux] 473 | requiresBuild: true 474 | dev: true 475 | optional: true 476 | 477 | /@esbuild/linux-ia32@0.18.20: 478 | resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 479 | engines: {node: '>=12'} 480 | cpu: [ia32] 481 | os: [linux] 482 | requiresBuild: true 483 | dev: true 484 | optional: true 485 | 486 | /@esbuild/linux-loong64@0.18.20: 487 | resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 488 | engines: {node: '>=12'} 489 | cpu: [loong64] 490 | os: [linux] 491 | requiresBuild: true 492 | dev: true 493 | optional: true 494 | 495 | /@esbuild/linux-mips64el@0.18.20: 496 | resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 497 | engines: {node: '>=12'} 498 | cpu: [mips64el] 499 | os: [linux] 500 | requiresBuild: true 501 | dev: true 502 | optional: true 503 | 504 | /@esbuild/linux-ppc64@0.18.20: 505 | resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 506 | engines: {node: '>=12'} 507 | cpu: [ppc64] 508 | os: [linux] 509 | requiresBuild: true 510 | dev: true 511 | optional: true 512 | 513 | /@esbuild/linux-riscv64@0.18.20: 514 | resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 515 | engines: {node: '>=12'} 516 | cpu: [riscv64] 517 | os: [linux] 518 | requiresBuild: true 519 | dev: true 520 | optional: true 521 | 522 | /@esbuild/linux-s390x@0.18.20: 523 | resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 524 | engines: {node: '>=12'} 525 | cpu: [s390x] 526 | os: [linux] 527 | requiresBuild: true 528 | dev: true 529 | optional: true 530 | 531 | /@esbuild/linux-x64@0.18.20: 532 | resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 533 | engines: {node: '>=12'} 534 | cpu: [x64] 535 | os: [linux] 536 | requiresBuild: true 537 | dev: true 538 | optional: true 539 | 540 | /@esbuild/netbsd-x64@0.18.20: 541 | resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 542 | engines: {node: '>=12'} 543 | cpu: [x64] 544 | os: [netbsd] 545 | requiresBuild: true 546 | dev: true 547 | optional: true 548 | 549 | /@esbuild/openbsd-x64@0.18.20: 550 | resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 551 | engines: {node: '>=12'} 552 | cpu: [x64] 553 | os: [openbsd] 554 | requiresBuild: true 555 | dev: true 556 | optional: true 557 | 558 | /@esbuild/sunos-x64@0.18.20: 559 | resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 560 | engines: {node: '>=12'} 561 | cpu: [x64] 562 | os: [sunos] 563 | requiresBuild: true 564 | dev: true 565 | optional: true 566 | 567 | /@esbuild/win32-arm64@0.18.20: 568 | resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 569 | engines: {node: '>=12'} 570 | cpu: [arm64] 571 | os: [win32] 572 | requiresBuild: true 573 | dev: true 574 | optional: true 575 | 576 | /@esbuild/win32-ia32@0.18.20: 577 | resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 578 | engines: {node: '>=12'} 579 | cpu: [ia32] 580 | os: [win32] 581 | requiresBuild: true 582 | dev: true 583 | optional: true 584 | 585 | /@esbuild/win32-x64@0.18.20: 586 | resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 587 | engines: {node: '>=12'} 588 | cpu: [x64] 589 | os: [win32] 590 | requiresBuild: true 591 | dev: true 592 | optional: true 593 | 594 | /@isaacs/cliui@8.0.2: 595 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 596 | engines: {node: '>=12'} 597 | dependencies: 598 | string-width: 5.1.2 599 | string-width-cjs: /string-width@4.2.3 600 | strip-ansi: 7.1.0 601 | strip-ansi-cjs: /strip-ansi@6.0.1 602 | wrap-ansi: 8.1.0 603 | wrap-ansi-cjs: /wrap-ansi@7.0.0 604 | dev: true 605 | 606 | /@jridgewell/gen-mapping@0.3.3: 607 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 608 | engines: {node: '>=6.0.0'} 609 | dependencies: 610 | '@jridgewell/set-array': 1.1.2 611 | '@jridgewell/sourcemap-codec': 1.4.15 612 | '@jridgewell/trace-mapping': 0.3.20 613 | dev: true 614 | 615 | /@jridgewell/resolve-uri@3.1.1: 616 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 617 | engines: {node: '>=6.0.0'} 618 | dev: true 619 | 620 | /@jridgewell/set-array@1.1.2: 621 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 622 | engines: {node: '>=6.0.0'} 623 | dev: true 624 | 625 | /@jridgewell/sourcemap-codec@1.4.15: 626 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 627 | dev: true 628 | 629 | /@jridgewell/trace-mapping@0.3.20: 630 | resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} 631 | dependencies: 632 | '@jridgewell/resolve-uri': 3.1.1 633 | '@jridgewell/sourcemap-codec': 1.4.15 634 | dev: true 635 | 636 | /@nodelib/fs.scandir@2.1.5: 637 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 638 | engines: {node: '>= 8'} 639 | dependencies: 640 | '@nodelib/fs.stat': 2.0.5 641 | run-parallel: 1.2.0 642 | dev: true 643 | 644 | /@nodelib/fs.stat@2.0.5: 645 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 646 | engines: {node: '>= 8'} 647 | dev: true 648 | 649 | /@nodelib/fs.walk@1.2.8: 650 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 651 | engines: {node: '>= 8'} 652 | dependencies: 653 | '@nodelib/fs.scandir': 2.1.5 654 | fastq: 1.16.0 655 | dev: true 656 | 657 | /@pkgjs/parseargs@0.11.0: 658 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 659 | engines: {node: '>=14'} 660 | requiresBuild: true 661 | dev: true 662 | optional: true 663 | 664 | /@rollup/pluginutils@4.2.1: 665 | resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} 666 | engines: {node: '>= 8.0.0'} 667 | dependencies: 668 | estree-walker: 2.0.2 669 | picomatch: 2.3.1 670 | dev: true 671 | 672 | /@types/babel__core@7.20.5: 673 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 674 | dependencies: 675 | '@babel/parser': 7.23.6 676 | '@babel/types': 7.23.6 677 | '@types/babel__generator': 7.6.8 678 | '@types/babel__template': 7.4.4 679 | '@types/babel__traverse': 7.20.5 680 | dev: true 681 | 682 | /@types/babel__generator@7.6.8: 683 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 684 | dependencies: 685 | '@babel/types': 7.23.6 686 | dev: true 687 | 688 | /@types/babel__template@7.4.4: 689 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 690 | dependencies: 691 | '@babel/parser': 7.23.6 692 | '@babel/types': 7.23.6 693 | dev: true 694 | 695 | /@types/babel__traverse@7.20.5: 696 | resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} 697 | dependencies: 698 | '@babel/types': 7.23.6 699 | dev: true 700 | 701 | /@types/chrome@0.0.259: 702 | resolution: {integrity: sha512-WP1HsLqKgoUwR/4dYiTfmOSUG5B05+xrPLbqboO15nuaUC+aBYxwB9ixVyLPYY9D+vocJK9rzH5g1lpqVrJqhg==} 703 | dependencies: 704 | '@types/filesystem': 0.0.35 705 | '@types/har-format': 1.2.15 706 | dev: false 707 | 708 | /@types/filesystem@0.0.35: 709 | resolution: {integrity: sha512-1eKvCaIBdrD2mmMgy5dwh564rVvfEhZTWVQQGRNn0Nt4ZEnJ0C8oSUCzvMKRA4lGde5oEVo+q2MrTTbV/GHDCQ==} 710 | dependencies: 711 | '@types/filewriter': 0.0.32 712 | dev: false 713 | 714 | /@types/filewriter@0.0.32: 715 | resolution: {integrity: sha512-Kpi2GXQyYJdjL8mFclL1eDgihn1SIzorMZjD94kdPZh9E4VxGOeyjPxi5LpsM4Zku7P0reqegZTt2GxhmA9VBg==} 716 | dev: false 717 | 718 | /@types/har-format@1.2.15: 719 | resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} 720 | dev: false 721 | 722 | /@webcomponents/custom-elements@1.6.0: 723 | resolution: {integrity: sha512-CqTpxOlUCPWRNUPZDxT5v2NnHXA4oox612iUGnmTUGQFhZ1Gkj8kirtl/2wcF6MqX7+PqqicZzOCBKKfIn0dww==} 724 | dev: true 725 | 726 | /acorn-walk@8.3.1: 727 | resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} 728 | engines: {node: '>=0.4.0'} 729 | dev: true 730 | 731 | /ansi-regex@5.0.1: 732 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 733 | engines: {node: '>=8'} 734 | dev: true 735 | 736 | /ansi-regex@6.0.1: 737 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 738 | engines: {node: '>=12'} 739 | dev: true 740 | 741 | /ansi-styles@3.2.1: 742 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 743 | engines: {node: '>=4'} 744 | dependencies: 745 | color-convert: 1.9.3 746 | dev: true 747 | 748 | /ansi-styles@4.3.0: 749 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 750 | engines: {node: '>=8'} 751 | dependencies: 752 | color-convert: 2.0.1 753 | dev: true 754 | 755 | /ansi-styles@6.2.1: 756 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 757 | engines: {node: '>=12'} 758 | dev: true 759 | 760 | /any-promise@1.3.0: 761 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 762 | dev: true 763 | 764 | /anymatch@3.1.3: 765 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 766 | engines: {node: '>= 8'} 767 | dependencies: 768 | normalize-path: 3.0.0 769 | picomatch: 2.3.1 770 | dev: true 771 | 772 | /arg@5.0.2: 773 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 774 | dev: true 775 | 776 | /autoprefixer@10.4.16(postcss@8.4.32): 777 | resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} 778 | engines: {node: ^10 || ^12 || >=14} 779 | hasBin: true 780 | peerDependencies: 781 | postcss: ^8.1.0 782 | dependencies: 783 | browserslist: 4.22.2 784 | caniuse-lite: 1.0.30001572 785 | fraction.js: 4.3.7 786 | normalize-range: 0.1.2 787 | picocolors: 1.0.0 788 | postcss: 8.4.32 789 | postcss-value-parser: 4.2.0 790 | dev: true 791 | 792 | /babel-plugin-jsx-dom-expressions@0.37.9(@babel/core@7.23.7): 793 | resolution: {integrity: sha512-6w+zs2i14fVanj4e1hXCU5cp+x0U0LJ5jScknpMZZUteHhwFRGJflHMVJ+xAcW7ku41FYjr7DgtK9mnc2SXlJg==} 794 | peerDependencies: 795 | '@babel/core': ^7.20.12 796 | dependencies: 797 | '@babel/core': 7.23.7 798 | '@babel/helper-module-imports': 7.18.6 799 | '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) 800 | '@babel/types': 7.23.6 801 | html-entities: 2.3.3 802 | validate-html-nesting: 1.2.2 803 | dev: true 804 | 805 | /babel-preset-solid@1.8.6(@babel/core@7.23.7): 806 | resolution: {integrity: sha512-Ened42CHjU4EFkvNeS042/3Pm21yvMWn8p4G4ddzQTlKaMwSGGD1VciA/e7EshBVHJCcBj9vHiUd/r3A4qLPZA==} 807 | peerDependencies: 808 | '@babel/core': ^7.0.0 809 | dependencies: 810 | '@babel/core': 7.23.7 811 | babel-plugin-jsx-dom-expressions: 0.37.9(@babel/core@7.23.7) 812 | dev: true 813 | 814 | /balanced-match@1.0.2: 815 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 816 | dev: true 817 | 818 | /binary-extensions@2.2.0: 819 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 820 | engines: {node: '>=8'} 821 | dev: true 822 | 823 | /boolbase@1.0.0: 824 | resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} 825 | dev: true 826 | 827 | /brace-expansion@2.0.1: 828 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 829 | dependencies: 830 | balanced-match: 1.0.2 831 | dev: true 832 | 833 | /braces@3.0.2: 834 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 835 | engines: {node: '>=8'} 836 | dependencies: 837 | fill-range: 7.0.1 838 | dev: true 839 | 840 | /browserslist@4.22.2: 841 | resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} 842 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 843 | hasBin: true 844 | dependencies: 845 | caniuse-lite: 1.0.30001572 846 | electron-to-chromium: 1.4.617 847 | node-releases: 2.0.14 848 | update-browserslist-db: 1.0.13(browserslist@4.22.2) 849 | dev: true 850 | 851 | /camelcase-css@2.0.1: 852 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 853 | engines: {node: '>= 6'} 854 | dev: true 855 | 856 | /caniuse-lite@1.0.30001572: 857 | resolution: {integrity: sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==} 858 | dev: true 859 | 860 | /chalk@2.4.2: 861 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 862 | engines: {node: '>=4'} 863 | dependencies: 864 | ansi-styles: 3.2.1 865 | escape-string-regexp: 1.0.5 866 | supports-color: 5.5.0 867 | dev: true 868 | 869 | /cheerio-select@2.1.0: 870 | resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} 871 | dependencies: 872 | boolbase: 1.0.0 873 | css-select: 5.1.0 874 | css-what: 6.1.0 875 | domelementtype: 2.3.0 876 | domhandler: 5.0.3 877 | domutils: 3.1.0 878 | dev: true 879 | 880 | /cheerio@1.0.0-rc.12: 881 | resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} 882 | engines: {node: '>= 6'} 883 | dependencies: 884 | cheerio-select: 2.1.0 885 | dom-serializer: 2.0.0 886 | domhandler: 5.0.3 887 | domutils: 3.1.0 888 | htmlparser2: 8.0.2 889 | parse5: 7.1.2 890 | parse5-htmlparser2-tree-adapter: 7.0.0 891 | dev: true 892 | 893 | /chokidar@3.5.3: 894 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 895 | engines: {node: '>= 8.10.0'} 896 | dependencies: 897 | anymatch: 3.1.3 898 | braces: 3.0.2 899 | glob-parent: 5.1.2 900 | is-binary-path: 2.1.0 901 | is-glob: 4.0.3 902 | normalize-path: 3.0.0 903 | readdirp: 3.6.0 904 | optionalDependencies: 905 | fsevents: 2.3.3 906 | dev: true 907 | 908 | /color-convert@1.9.3: 909 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 910 | dependencies: 911 | color-name: 1.1.3 912 | dev: true 913 | 914 | /color-convert@2.0.1: 915 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 916 | engines: {node: '>=7.0.0'} 917 | dependencies: 918 | color-name: 1.1.4 919 | dev: true 920 | 921 | /color-name@1.1.3: 922 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 923 | dev: true 924 | 925 | /color-name@1.1.4: 926 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 927 | dev: true 928 | 929 | /commander@4.1.1: 930 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 931 | engines: {node: '>= 6'} 932 | dev: true 933 | 934 | /connect-injector@0.4.4: 935 | resolution: {integrity: sha512-hdBG8nXop42y2gWCqOV8y1O3uVk4cIU+SoxLCPyCUKRImyPiScoNiSulpHjoktRU1BdI0UzoUdxUa87thrcmHw==} 936 | engines: {node: '>= 0.8.0'} 937 | dependencies: 938 | debug: 2.6.9 939 | q: 1.5.1 940 | stream-buffers: 0.2.6 941 | uberproto: 1.2.0 942 | transitivePeerDependencies: 943 | - supports-color 944 | dev: true 945 | 946 | /convert-source-map@1.9.0: 947 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 948 | dev: true 949 | 950 | /convert-source-map@2.0.0: 951 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 952 | dev: true 953 | 954 | /cross-spawn@7.0.3: 955 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 956 | engines: {node: '>= 8'} 957 | dependencies: 958 | path-key: 3.1.1 959 | shebang-command: 2.0.0 960 | which: 2.0.2 961 | dev: true 962 | 963 | /css-select@5.1.0: 964 | resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} 965 | dependencies: 966 | boolbase: 1.0.0 967 | css-what: 6.1.0 968 | domhandler: 5.0.3 969 | domutils: 3.1.0 970 | nth-check: 2.1.1 971 | dev: true 972 | 973 | /css-what@6.1.0: 974 | resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} 975 | engines: {node: '>= 6'} 976 | dev: true 977 | 978 | /cssesc@3.0.0: 979 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 980 | engines: {node: '>=4'} 981 | hasBin: true 982 | dev: true 983 | 984 | /csstype@3.1.3: 985 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 986 | 987 | /debug@2.6.9: 988 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 989 | peerDependencies: 990 | supports-color: '*' 991 | peerDependenciesMeta: 992 | supports-color: 993 | optional: true 994 | dependencies: 995 | ms: 2.0.0 996 | dev: true 997 | 998 | /debug@4.3.4: 999 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1000 | engines: {node: '>=6.0'} 1001 | peerDependencies: 1002 | supports-color: '*' 1003 | peerDependenciesMeta: 1004 | supports-color: 1005 | optional: true 1006 | dependencies: 1007 | ms: 2.1.2 1008 | dev: true 1009 | 1010 | /didyoumean@1.2.2: 1011 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 1012 | dev: true 1013 | 1014 | /dlv@1.1.3: 1015 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 1016 | dev: true 1017 | 1018 | /dom-serializer@2.0.0: 1019 | resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 1020 | dependencies: 1021 | domelementtype: 2.3.0 1022 | domhandler: 5.0.3 1023 | entities: 4.5.0 1024 | dev: true 1025 | 1026 | /domelementtype@2.3.0: 1027 | resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} 1028 | dev: true 1029 | 1030 | /domhandler@5.0.3: 1031 | resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 1032 | engines: {node: '>= 4'} 1033 | dependencies: 1034 | domelementtype: 2.3.0 1035 | dev: true 1036 | 1037 | /domutils@3.1.0: 1038 | resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} 1039 | dependencies: 1040 | dom-serializer: 2.0.0 1041 | domelementtype: 2.3.0 1042 | domhandler: 5.0.3 1043 | dev: true 1044 | 1045 | /eastasianwidth@0.2.0: 1046 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1047 | dev: true 1048 | 1049 | /electron-to-chromium@1.4.617: 1050 | resolution: {integrity: sha512-sYNE3QxcDS4ANW1k4S/wWYMXjCVcFSOX3Bg8jpuMFaXt/x8JCmp0R1Xe1ZXDX4WXnSRBf+GJ/3eGWicUuQq5cg==} 1051 | dev: true 1052 | 1053 | /emoji-regex@8.0.0: 1054 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1055 | dev: true 1056 | 1057 | /emoji-regex@9.2.2: 1058 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1059 | dev: true 1060 | 1061 | /entities@4.5.0: 1062 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 1063 | engines: {node: '>=0.12'} 1064 | dev: true 1065 | 1066 | /es-module-lexer@0.10.5: 1067 | resolution: {integrity: sha512-+7IwY/kiGAacQfY+YBhKMvEmyAJnw5grTUgjG85Pe7vcUI/6b7pZjZG8nQ7+48YhzEAEqrEgD2dCz/JIK+AYvw==} 1068 | dev: true 1069 | 1070 | /esbuild@0.18.20: 1071 | resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 1072 | engines: {node: '>=12'} 1073 | hasBin: true 1074 | requiresBuild: true 1075 | optionalDependencies: 1076 | '@esbuild/android-arm': 0.18.20 1077 | '@esbuild/android-arm64': 0.18.20 1078 | '@esbuild/android-x64': 0.18.20 1079 | '@esbuild/darwin-arm64': 0.18.20 1080 | '@esbuild/darwin-x64': 0.18.20 1081 | '@esbuild/freebsd-arm64': 0.18.20 1082 | '@esbuild/freebsd-x64': 0.18.20 1083 | '@esbuild/linux-arm': 0.18.20 1084 | '@esbuild/linux-arm64': 0.18.20 1085 | '@esbuild/linux-ia32': 0.18.20 1086 | '@esbuild/linux-loong64': 0.18.20 1087 | '@esbuild/linux-mips64el': 0.18.20 1088 | '@esbuild/linux-ppc64': 0.18.20 1089 | '@esbuild/linux-riscv64': 0.18.20 1090 | '@esbuild/linux-s390x': 0.18.20 1091 | '@esbuild/linux-x64': 0.18.20 1092 | '@esbuild/netbsd-x64': 0.18.20 1093 | '@esbuild/openbsd-x64': 0.18.20 1094 | '@esbuild/sunos-x64': 0.18.20 1095 | '@esbuild/win32-arm64': 0.18.20 1096 | '@esbuild/win32-ia32': 0.18.20 1097 | '@esbuild/win32-x64': 0.18.20 1098 | dev: true 1099 | 1100 | /escalade@3.1.1: 1101 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1102 | engines: {node: '>=6'} 1103 | dev: true 1104 | 1105 | /escape-string-regexp@1.0.5: 1106 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1107 | engines: {node: '>=0.8.0'} 1108 | dev: true 1109 | 1110 | /estree-walker@2.0.2: 1111 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1112 | dev: true 1113 | 1114 | /fast-glob@3.3.2: 1115 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 1116 | engines: {node: '>=8.6.0'} 1117 | dependencies: 1118 | '@nodelib/fs.stat': 2.0.5 1119 | '@nodelib/fs.walk': 1.2.8 1120 | glob-parent: 5.1.2 1121 | merge2: 1.4.1 1122 | micromatch: 4.0.5 1123 | dev: true 1124 | 1125 | /fastq@1.16.0: 1126 | resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} 1127 | dependencies: 1128 | reusify: 1.0.4 1129 | dev: true 1130 | 1131 | /fill-range@7.0.1: 1132 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1133 | engines: {node: '>=8'} 1134 | dependencies: 1135 | to-regex-range: 5.0.1 1136 | dev: true 1137 | 1138 | /foreground-child@3.1.1: 1139 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 1140 | engines: {node: '>=14'} 1141 | dependencies: 1142 | cross-spawn: 7.0.3 1143 | signal-exit: 4.1.0 1144 | dev: true 1145 | 1146 | /fraction.js@4.3.7: 1147 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 1148 | dev: true 1149 | 1150 | /fs-extra@10.1.0: 1151 | resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} 1152 | engines: {node: '>=12'} 1153 | dependencies: 1154 | graceful-fs: 4.2.11 1155 | jsonfile: 6.1.0 1156 | universalify: 2.0.1 1157 | dev: true 1158 | 1159 | /fsevents@2.3.3: 1160 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1161 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1162 | os: [darwin] 1163 | requiresBuild: true 1164 | dev: true 1165 | optional: true 1166 | 1167 | /function-bind@1.1.2: 1168 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1169 | dev: true 1170 | 1171 | /gensync@1.0.0-beta.2: 1172 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1173 | engines: {node: '>=6.9.0'} 1174 | dev: true 1175 | 1176 | /glob-parent@5.1.2: 1177 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1178 | engines: {node: '>= 6'} 1179 | dependencies: 1180 | is-glob: 4.0.3 1181 | dev: true 1182 | 1183 | /glob-parent@6.0.2: 1184 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1185 | engines: {node: '>=10.13.0'} 1186 | dependencies: 1187 | is-glob: 4.0.3 1188 | dev: true 1189 | 1190 | /glob@10.3.10: 1191 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 1192 | engines: {node: '>=16 || 14 >=14.17'} 1193 | hasBin: true 1194 | dependencies: 1195 | foreground-child: 3.1.1 1196 | jackspeak: 2.3.6 1197 | minimatch: 9.0.3 1198 | minipass: 7.0.4 1199 | path-scurry: 1.10.1 1200 | dev: true 1201 | 1202 | /globals@11.12.0: 1203 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1204 | engines: {node: '>=4'} 1205 | dev: true 1206 | 1207 | /graceful-fs@4.2.11: 1208 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1209 | dev: true 1210 | 1211 | /has-flag@3.0.0: 1212 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1213 | engines: {node: '>=4'} 1214 | dev: true 1215 | 1216 | /hasown@2.0.0: 1217 | resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} 1218 | engines: {node: '>= 0.4'} 1219 | dependencies: 1220 | function-bind: 1.1.2 1221 | dev: true 1222 | 1223 | /html-entities@2.3.3: 1224 | resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} 1225 | dev: true 1226 | 1227 | /htmlparser2@8.0.2: 1228 | resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} 1229 | dependencies: 1230 | domelementtype: 2.3.0 1231 | domhandler: 5.0.3 1232 | domutils: 3.1.0 1233 | entities: 4.5.0 1234 | dev: true 1235 | 1236 | /is-binary-path@2.1.0: 1237 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1238 | engines: {node: '>=8'} 1239 | dependencies: 1240 | binary-extensions: 2.2.0 1241 | dev: true 1242 | 1243 | /is-core-module@2.13.1: 1244 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1245 | dependencies: 1246 | hasown: 2.0.0 1247 | dev: true 1248 | 1249 | /is-extglob@2.1.1: 1250 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1251 | engines: {node: '>=0.10.0'} 1252 | dev: true 1253 | 1254 | /is-fullwidth-code-point@3.0.0: 1255 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1256 | engines: {node: '>=8'} 1257 | dev: true 1258 | 1259 | /is-glob@4.0.3: 1260 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1261 | engines: {node: '>=0.10.0'} 1262 | dependencies: 1263 | is-extglob: 2.1.1 1264 | dev: true 1265 | 1266 | /is-number@7.0.0: 1267 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1268 | engines: {node: '>=0.12.0'} 1269 | dev: true 1270 | 1271 | /is-what@4.1.16: 1272 | resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} 1273 | engines: {node: '>=12.13'} 1274 | dev: true 1275 | 1276 | /isexe@2.0.0: 1277 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1278 | dev: true 1279 | 1280 | /jackspeak@2.3.6: 1281 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1282 | engines: {node: '>=14'} 1283 | dependencies: 1284 | '@isaacs/cliui': 8.0.2 1285 | optionalDependencies: 1286 | '@pkgjs/parseargs': 0.11.0 1287 | dev: true 1288 | 1289 | /jiti@1.21.0: 1290 | resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} 1291 | hasBin: true 1292 | dev: true 1293 | 1294 | /js-tokens@4.0.0: 1295 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1296 | dev: true 1297 | 1298 | /jsesc@2.5.2: 1299 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 1300 | engines: {node: '>=4'} 1301 | hasBin: true 1302 | dev: true 1303 | 1304 | /jsesc@3.0.2: 1305 | resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} 1306 | engines: {node: '>=6'} 1307 | hasBin: true 1308 | dev: true 1309 | 1310 | /json5@2.2.3: 1311 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1312 | engines: {node: '>=6'} 1313 | hasBin: true 1314 | dev: true 1315 | 1316 | /jsonfile@6.1.0: 1317 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 1318 | dependencies: 1319 | universalify: 2.0.1 1320 | optionalDependencies: 1321 | graceful-fs: 4.2.11 1322 | dev: true 1323 | 1324 | /lilconfig@2.1.0: 1325 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1326 | engines: {node: '>=10'} 1327 | dev: true 1328 | 1329 | /lilconfig@3.0.0: 1330 | resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} 1331 | engines: {node: '>=14'} 1332 | dev: true 1333 | 1334 | /lines-and-columns@1.2.4: 1335 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1336 | dev: true 1337 | 1338 | /lru-cache@10.1.0: 1339 | resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} 1340 | engines: {node: 14 || >=16.14} 1341 | dev: true 1342 | 1343 | /lru-cache@5.1.1: 1344 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1345 | dependencies: 1346 | yallist: 3.1.1 1347 | dev: true 1348 | 1349 | /magic-string@0.26.7: 1350 | resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} 1351 | engines: {node: '>=12'} 1352 | dependencies: 1353 | sourcemap-codec: 1.4.8 1354 | dev: true 1355 | 1356 | /merge-anything@5.1.7: 1357 | resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} 1358 | engines: {node: '>=12.13'} 1359 | dependencies: 1360 | is-what: 4.1.16 1361 | dev: true 1362 | 1363 | /merge2@1.4.1: 1364 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1365 | engines: {node: '>= 8'} 1366 | dev: true 1367 | 1368 | /micromatch@4.0.5: 1369 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1370 | engines: {node: '>=8.6'} 1371 | dependencies: 1372 | braces: 3.0.2 1373 | picomatch: 2.3.1 1374 | dev: true 1375 | 1376 | /minimatch@9.0.3: 1377 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1378 | engines: {node: '>=16 || 14 >=14.17'} 1379 | dependencies: 1380 | brace-expansion: 2.0.1 1381 | dev: true 1382 | 1383 | /minipass@7.0.4: 1384 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 1385 | engines: {node: '>=16 || 14 >=14.17'} 1386 | dev: true 1387 | 1388 | /ms@2.0.0: 1389 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 1390 | dev: true 1391 | 1392 | /ms@2.1.2: 1393 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1394 | dev: true 1395 | 1396 | /mz@2.7.0: 1397 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1398 | dependencies: 1399 | any-promise: 1.3.0 1400 | object-assign: 4.1.1 1401 | thenify-all: 1.6.0 1402 | dev: true 1403 | 1404 | /nanoid@3.3.7: 1405 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 1406 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1407 | hasBin: true 1408 | dev: true 1409 | 1410 | /node-releases@2.0.14: 1411 | resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} 1412 | dev: true 1413 | 1414 | /normalize-path@3.0.0: 1415 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1416 | engines: {node: '>=0.10.0'} 1417 | dev: true 1418 | 1419 | /normalize-range@0.1.2: 1420 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1421 | engines: {node: '>=0.10.0'} 1422 | dev: true 1423 | 1424 | /nth-check@2.1.1: 1425 | resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 1426 | dependencies: 1427 | boolbase: 1.0.0 1428 | dev: true 1429 | 1430 | /object-assign@4.1.1: 1431 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1432 | engines: {node: '>=0.10.0'} 1433 | dev: true 1434 | 1435 | /object-hash@3.0.0: 1436 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1437 | engines: {node: '>= 6'} 1438 | dev: true 1439 | 1440 | /parse5-htmlparser2-tree-adapter@7.0.0: 1441 | resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} 1442 | dependencies: 1443 | domhandler: 5.0.3 1444 | parse5: 7.1.2 1445 | dev: true 1446 | 1447 | /parse5@7.1.2: 1448 | resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} 1449 | dependencies: 1450 | entities: 4.5.0 1451 | dev: true 1452 | 1453 | /path-key@3.1.1: 1454 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1455 | engines: {node: '>=8'} 1456 | dev: true 1457 | 1458 | /path-parse@1.0.7: 1459 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1460 | dev: true 1461 | 1462 | /path-scurry@1.10.1: 1463 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 1464 | engines: {node: '>=16 || 14 >=14.17'} 1465 | dependencies: 1466 | lru-cache: 10.1.0 1467 | minipass: 7.0.4 1468 | dev: true 1469 | 1470 | /picocolors@1.0.0: 1471 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1472 | dev: true 1473 | 1474 | /picomatch@2.3.1: 1475 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1476 | engines: {node: '>=8.6'} 1477 | dev: true 1478 | 1479 | /pify@2.3.0: 1480 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 1481 | engines: {node: '>=0.10.0'} 1482 | dev: true 1483 | 1484 | /pirates@4.0.6: 1485 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1486 | engines: {node: '>= 6'} 1487 | dev: true 1488 | 1489 | /postcss-import@15.1.0(postcss@8.4.32): 1490 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 1491 | engines: {node: '>=14.0.0'} 1492 | peerDependencies: 1493 | postcss: ^8.0.0 1494 | dependencies: 1495 | postcss: 8.4.32 1496 | postcss-value-parser: 4.2.0 1497 | read-cache: 1.0.0 1498 | resolve: 1.22.8 1499 | dev: true 1500 | 1501 | /postcss-js@4.0.1(postcss@8.4.32): 1502 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 1503 | engines: {node: ^12 || ^14 || >= 16} 1504 | peerDependencies: 1505 | postcss: ^8.4.21 1506 | dependencies: 1507 | camelcase-css: 2.0.1 1508 | postcss: 8.4.32 1509 | dev: true 1510 | 1511 | /postcss-load-config@4.0.2(postcss@8.4.32): 1512 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 1513 | engines: {node: '>= 14'} 1514 | peerDependencies: 1515 | postcss: '>=8.0.9' 1516 | ts-node: '>=9.0.0' 1517 | peerDependenciesMeta: 1518 | postcss: 1519 | optional: true 1520 | ts-node: 1521 | optional: true 1522 | dependencies: 1523 | lilconfig: 3.0.0 1524 | postcss: 8.4.32 1525 | yaml: 2.3.4 1526 | dev: true 1527 | 1528 | /postcss-nested@6.0.1(postcss@8.4.32): 1529 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 1530 | engines: {node: '>=12.0'} 1531 | peerDependencies: 1532 | postcss: ^8.2.14 1533 | dependencies: 1534 | postcss: 8.4.32 1535 | postcss-selector-parser: 6.0.15 1536 | dev: true 1537 | 1538 | /postcss-selector-parser@6.0.15: 1539 | resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} 1540 | engines: {node: '>=4'} 1541 | dependencies: 1542 | cssesc: 3.0.0 1543 | util-deprecate: 1.0.2 1544 | dev: true 1545 | 1546 | /postcss-value-parser@4.2.0: 1547 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1548 | dev: true 1549 | 1550 | /postcss@8.4.32: 1551 | resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} 1552 | engines: {node: ^10 || ^12 || >=14} 1553 | dependencies: 1554 | nanoid: 3.3.7 1555 | picocolors: 1.0.0 1556 | source-map-js: 1.0.2 1557 | dev: true 1558 | 1559 | /q@1.5.1: 1560 | resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} 1561 | engines: {node: '>=0.6.0', teleport: '>=0.2.0'} 1562 | dev: true 1563 | 1564 | /queue-microtask@1.2.3: 1565 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1566 | dev: true 1567 | 1568 | /react-refresh@0.13.0: 1569 | resolution: {integrity: sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==} 1570 | engines: {node: '>=0.10.0'} 1571 | dev: true 1572 | 1573 | /read-cache@1.0.0: 1574 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 1575 | dependencies: 1576 | pify: 2.3.0 1577 | dev: true 1578 | 1579 | /readdirp@3.6.0: 1580 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1581 | engines: {node: '>=8.10.0'} 1582 | dependencies: 1583 | picomatch: 2.3.1 1584 | dev: true 1585 | 1586 | /resolve@1.22.8: 1587 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1588 | hasBin: true 1589 | dependencies: 1590 | is-core-module: 2.13.1 1591 | path-parse: 1.0.7 1592 | supports-preserve-symlinks-flag: 1.0.0 1593 | dev: true 1594 | 1595 | /reusify@1.0.4: 1596 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1597 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1598 | dev: true 1599 | 1600 | /rollup@2.78.1: 1601 | resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==} 1602 | engines: {node: '>=10.0.0'} 1603 | hasBin: true 1604 | optionalDependencies: 1605 | fsevents: 2.3.3 1606 | dev: true 1607 | 1608 | /rollup@3.29.4: 1609 | resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} 1610 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 1611 | hasBin: true 1612 | optionalDependencies: 1613 | fsevents: 2.3.3 1614 | dev: true 1615 | 1616 | /run-parallel@1.2.0: 1617 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1618 | dependencies: 1619 | queue-microtask: 1.2.3 1620 | dev: true 1621 | 1622 | /rxjs@7.5.7: 1623 | resolution: {integrity: sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==} 1624 | dependencies: 1625 | tslib: 2.6.2 1626 | dev: true 1627 | 1628 | /semver@6.3.1: 1629 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1630 | hasBin: true 1631 | dev: true 1632 | 1633 | /seroval@0.15.1: 1634 | resolution: {integrity: sha512-OPVtf0qmeC7RW+ScVX+7aOS+xoIM7pWcZ0jOWg2aTZigCydgRB04adfteBRbecZnnrO1WuGQ+C3tLeBBzX2zSQ==} 1635 | engines: {node: '>=10'} 1636 | 1637 | /shebang-command@2.0.0: 1638 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1639 | engines: {node: '>=8'} 1640 | dependencies: 1641 | shebang-regex: 3.0.0 1642 | dev: true 1643 | 1644 | /shebang-regex@3.0.0: 1645 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1646 | engines: {node: '>=8'} 1647 | dev: true 1648 | 1649 | /signal-exit@4.1.0: 1650 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1651 | engines: {node: '>=14'} 1652 | dev: true 1653 | 1654 | /solid-js@1.8.7: 1655 | resolution: {integrity: sha512-9dzrSVieh2zj3SnJ02II6xZkonR6c+j/91b7XZUNcC6xSaldlqjjGh98F1fk5cRJ8ZTkzqF5fPIWDxEOs6QZXA==} 1656 | dependencies: 1657 | csstype: 3.1.3 1658 | seroval: 0.15.1 1659 | 1660 | /solid-refresh@0.5.3(solid-js@1.8.7): 1661 | resolution: {integrity: sha512-Otg5it5sjOdZbQZJnvo99TEBAr6J7PQ5AubZLNU6szZzg3RQQ5MX04oteBIIGDs0y2Qv8aXKm9e44V8z+UnFdw==} 1662 | peerDependencies: 1663 | solid-js: ^1.3 1664 | dependencies: 1665 | '@babel/generator': 7.23.6 1666 | '@babel/helper-module-imports': 7.22.15 1667 | '@babel/types': 7.23.6 1668 | solid-js: 1.8.7 1669 | dev: true 1670 | 1671 | /source-map-js@1.0.2: 1672 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1673 | engines: {node: '>=0.10.0'} 1674 | dev: true 1675 | 1676 | /sourcemap-codec@1.4.8: 1677 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 1678 | deprecated: Please use @jridgewell/sourcemap-codec instead 1679 | dev: true 1680 | 1681 | /stream-buffers@0.2.6: 1682 | resolution: {integrity: sha512-ZRpmWyuCdg0TtNKk8bEqvm13oQvXMmzXDsfD4cBgcx5LouborvU5pm3JMkdTP3HcszyUI08AM1dHMXA5r2g6Sg==} 1683 | engines: {node: '>= 0.3.0'} 1684 | dev: true 1685 | 1686 | /string-width@4.2.3: 1687 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1688 | engines: {node: '>=8'} 1689 | dependencies: 1690 | emoji-regex: 8.0.0 1691 | is-fullwidth-code-point: 3.0.0 1692 | strip-ansi: 6.0.1 1693 | dev: true 1694 | 1695 | /string-width@5.1.2: 1696 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1697 | engines: {node: '>=12'} 1698 | dependencies: 1699 | eastasianwidth: 0.2.0 1700 | emoji-regex: 9.2.2 1701 | strip-ansi: 7.1.0 1702 | dev: true 1703 | 1704 | /strip-ansi@6.0.1: 1705 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1706 | engines: {node: '>=8'} 1707 | dependencies: 1708 | ansi-regex: 5.0.1 1709 | dev: true 1710 | 1711 | /strip-ansi@7.1.0: 1712 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1713 | engines: {node: '>=12'} 1714 | dependencies: 1715 | ansi-regex: 6.0.1 1716 | dev: true 1717 | 1718 | /sucrase@3.35.0: 1719 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1720 | engines: {node: '>=16 || 14 >=14.17'} 1721 | hasBin: true 1722 | dependencies: 1723 | '@jridgewell/gen-mapping': 0.3.3 1724 | commander: 4.1.1 1725 | glob: 10.3.10 1726 | lines-and-columns: 1.2.4 1727 | mz: 2.7.0 1728 | pirates: 4.0.6 1729 | ts-interface-checker: 0.1.13 1730 | dev: true 1731 | 1732 | /supports-color@5.5.0: 1733 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1734 | engines: {node: '>=4'} 1735 | dependencies: 1736 | has-flag: 3.0.0 1737 | dev: true 1738 | 1739 | /supports-preserve-symlinks-flag@1.0.0: 1740 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1741 | engines: {node: '>= 0.4'} 1742 | dev: true 1743 | 1744 | /tailwindcss@3.4.0: 1745 | resolution: {integrity: sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==} 1746 | engines: {node: '>=14.0.0'} 1747 | hasBin: true 1748 | dependencies: 1749 | '@alloc/quick-lru': 5.2.0 1750 | arg: 5.0.2 1751 | chokidar: 3.5.3 1752 | didyoumean: 1.2.2 1753 | dlv: 1.1.3 1754 | fast-glob: 3.3.2 1755 | glob-parent: 6.0.2 1756 | is-glob: 4.0.3 1757 | jiti: 1.21.0 1758 | lilconfig: 2.1.0 1759 | micromatch: 4.0.5 1760 | normalize-path: 3.0.0 1761 | object-hash: 3.0.0 1762 | picocolors: 1.0.0 1763 | postcss: 8.4.32 1764 | postcss-import: 15.1.0(postcss@8.4.32) 1765 | postcss-js: 4.0.1(postcss@8.4.32) 1766 | postcss-load-config: 4.0.2(postcss@8.4.32) 1767 | postcss-nested: 6.0.1(postcss@8.4.32) 1768 | postcss-selector-parser: 6.0.15 1769 | resolve: 1.22.8 1770 | sucrase: 3.35.0 1771 | transitivePeerDependencies: 1772 | - ts-node 1773 | dev: true 1774 | 1775 | /thenify-all@1.6.0: 1776 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1777 | engines: {node: '>=0.8'} 1778 | dependencies: 1779 | thenify: 3.3.1 1780 | dev: true 1781 | 1782 | /thenify@3.3.1: 1783 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1784 | dependencies: 1785 | any-promise: 1.3.0 1786 | dev: true 1787 | 1788 | /to-fast-properties@2.0.0: 1789 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1790 | engines: {node: '>=4'} 1791 | dev: true 1792 | 1793 | /to-regex-range@5.0.1: 1794 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1795 | engines: {node: '>=8.0'} 1796 | dependencies: 1797 | is-number: 7.0.0 1798 | dev: true 1799 | 1800 | /ts-interface-checker@0.1.13: 1801 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1802 | dev: true 1803 | 1804 | /tslib@2.6.2: 1805 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 1806 | dev: true 1807 | 1808 | /typescript@5.3.3: 1809 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} 1810 | engines: {node: '>=14.17'} 1811 | hasBin: true 1812 | dev: true 1813 | 1814 | /uberproto@1.2.0: 1815 | resolution: {integrity: sha512-pGtPAQmLwh+R9w81WVHzui1FfedpQWQpiaIIfPCwhtsBez4q6DYbJFfyXPVHPUTNFnedAvNEnkoFiLuhXIR94w==} 1816 | dev: true 1817 | 1818 | /universalify@2.0.1: 1819 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 1820 | engines: {node: '>= 10.0.0'} 1821 | dev: true 1822 | 1823 | /update-browserslist-db@1.0.13(browserslist@4.22.2): 1824 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} 1825 | hasBin: true 1826 | peerDependencies: 1827 | browserslist: '>= 4.21.0' 1828 | dependencies: 1829 | browserslist: 4.22.2 1830 | escalade: 3.1.1 1831 | picocolors: 1.0.0 1832 | dev: true 1833 | 1834 | /util-deprecate@1.0.2: 1835 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1836 | dev: true 1837 | 1838 | /validate-html-nesting@1.2.2: 1839 | resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} 1840 | dev: true 1841 | 1842 | /vite-plugin-solid@2.8.0(solid-js@1.8.7)(vite@4.5.1): 1843 | resolution: {integrity: sha512-n5FAm7ZmTl94VWUoiJCgG7bouF2NlC9CA1wY/qbVnkFbYDWk++bFWyNoU48aLJ+lMtzNeYzJypJXOHzFKxL9xA==} 1844 | peerDependencies: 1845 | solid-js: ^1.7.2 1846 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 1847 | dependencies: 1848 | '@babel/core': 7.23.7 1849 | '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) 1850 | '@types/babel__core': 7.20.5 1851 | babel-preset-solid: 1.8.6(@babel/core@7.23.7) 1852 | merge-anything: 5.1.7 1853 | solid-js: 1.8.7 1854 | solid-refresh: 0.5.3(solid-js@1.8.7) 1855 | vite: 4.5.1 1856 | vitefu: 0.2.5(vite@4.5.1) 1857 | transitivePeerDependencies: 1858 | - supports-color 1859 | dev: true 1860 | 1861 | /vite@4.5.1: 1862 | resolution: {integrity: sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==} 1863 | engines: {node: ^14.18.0 || >=16.0.0} 1864 | hasBin: true 1865 | peerDependencies: 1866 | '@types/node': '>= 14' 1867 | less: '*' 1868 | lightningcss: ^1.21.0 1869 | sass: '*' 1870 | stylus: '*' 1871 | sugarss: '*' 1872 | terser: ^5.4.0 1873 | peerDependenciesMeta: 1874 | '@types/node': 1875 | optional: true 1876 | less: 1877 | optional: true 1878 | lightningcss: 1879 | optional: true 1880 | sass: 1881 | optional: true 1882 | stylus: 1883 | optional: true 1884 | sugarss: 1885 | optional: true 1886 | terser: 1887 | optional: true 1888 | dependencies: 1889 | esbuild: 0.18.20 1890 | postcss: 8.4.32 1891 | rollup: 3.29.4 1892 | optionalDependencies: 1893 | fsevents: 2.3.3 1894 | dev: true 1895 | 1896 | /vitefu@0.2.5(vite@4.5.1): 1897 | resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} 1898 | peerDependencies: 1899 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 1900 | peerDependenciesMeta: 1901 | vite: 1902 | optional: true 1903 | dependencies: 1904 | vite: 4.5.1 1905 | dev: true 1906 | 1907 | /which@2.0.2: 1908 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1909 | engines: {node: '>= 8'} 1910 | hasBin: true 1911 | dependencies: 1912 | isexe: 2.0.0 1913 | dev: true 1914 | 1915 | /wrap-ansi@7.0.0: 1916 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1917 | engines: {node: '>=10'} 1918 | dependencies: 1919 | ansi-styles: 4.3.0 1920 | string-width: 4.2.3 1921 | strip-ansi: 6.0.1 1922 | dev: true 1923 | 1924 | /wrap-ansi@8.1.0: 1925 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1926 | engines: {node: '>=12'} 1927 | dependencies: 1928 | ansi-styles: 6.2.1 1929 | string-width: 5.1.2 1930 | strip-ansi: 7.1.0 1931 | dev: true 1932 | 1933 | /yallist@3.1.1: 1934 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1935 | dev: true 1936 | 1937 | /yaml@2.3.4: 1938 | resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} 1939 | engines: {node: '>= 14'} 1940 | dev: true 1941 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/icons/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonigeez/twitter-adv-search/964132a0c843ebfb41594569f5b1a07dff3f753a/public/icons/icon128.png -------------------------------------------------------------------------------- /public/icons/icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonigeez/twitter-adv-search/964132a0c843ebfb41594569f5b1a07dff3f753a/public/icons/icon16.png -------------------------------------------------------------------------------- /public/icons/icon32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonigeez/twitter-adv-search/964132a0c843ebfb41594569f5b1a07dff3f753a/public/icons/icon32.png -------------------------------------------------------------------------------- /public/icons/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonigeez/twitter-adv-search/964132a0c843ebfb41594569f5b1a07dff3f753a/public/icons/icon48.png -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/twitter.js: -------------------------------------------------------------------------------- 1 | //attemt to make discrod like search bar for twitter 2 | 3 | // console.log("Hello, Twitter!"); 4 | 5 | // const xPathSring = "//form[@role='search']"; 6 | 7 | // // //trigger a function evert second 8 | // // setInterval(function() { 9 | 10 | // // }, 2000); 11 | 12 | // //wait for 2 second 13 | // setTimeout(() => { 14 | // const searchForm = document.evaluate( 15 | // xPathSring, 16 | // document, 17 | // null, 18 | // XPathResult.FIRST_ORDERED_NODE_TYPE, 19 | // null 20 | // ).singleNodeValue; 21 | // //get first item in form 22 | // const firstItem = searchForm.firstElementChild; 23 | // //get input element from first item 24 | // const input = firstItem.getElementsByTagName("input")[0]; 25 | // //get second item 26 | 27 | // if (searchForm) { 28 | // //append a button on 2nd position 29 | // const searchHelperContainer = document.createElement("div"); 30 | // searchHelperContainer.className = "search-helper-container"; 31 | // searchHelperContainer.innerHTML = ` 32 | // 33 | // `; 34 | 35 | 36 | // //listen for input event if it's focused then show button else hide 37 | // input.addEventListener("focus", function() { 38 | // console.log("Input is focused"); 39 | // searchForm.insertBefore(searchHelperContainer, searchForm.childNodes[1]); 40 | 41 | // }); 42 | // input.addEventListener("blur", function() { 43 | // console.log("Input is blurred"); 44 | // searchForm.removeChild(searchHelperContainer); 45 | // }); 46 | // } 47 | // }, 2000); 48 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | #root { 2 | max-width: 1280px; 3 | margin: 0 auto; 4 | padding: 2rem; 5 | text-align: center; 6 | } 7 | 8 | .logo { 9 | height: 6em; 10 | padding: 1.5em; 11 | will-change: filter; 12 | transition: filter 300ms; 13 | } 14 | .logo:hover { 15 | filter: drop-shadow(0 0 2em #646cffaa); 16 | } 17 | .logo.solid:hover { 18 | filter: drop-shadow(0 0 2em #61dafbaa); 19 | } 20 | 21 | .card { 22 | padding: 2em; 23 | } 24 | 25 | .read-the-docs { 26 | color: #888; 27 | } 28 | -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import { Match, Switch, createSignal, onMount } from "solid-js"; 2 | import SearchBar from "./SearchBar"; 3 | import Bookmarks from "./Bookmarks"; 4 | 5 | 6 | export default function App() { 7 | 8 | const [activeTab, setActiveTab] = createSignal("Search"); 9 | const [isDarkMode, setIsDarkMode] = createSignal(false); 10 | const [hideHighLikes, setHideHighLikes] = createSignal(false); 11 | const [likeThreshold, setLikeThreshold] = createSignal(10000); 12 | 13 | 14 | 15 | const tabs = [ 16 | { name: "Search", key: "Search", content: }, 17 | { name: "Bookmarks", key: "Bookmarks", content: }, 18 | ]; 19 | 20 | const handleThresholdChange = (event) => { 21 | const newThreshold = parseInt(event.target.value, 10); 22 | setLikeThreshold(newThreshold); 23 | chrome.runtime.sendMessage({ 24 | action: "setLikeThreshold", 25 | threshold: newThreshold 26 | }); 27 | }; 28 | 29 | const handleToggleChange = () => { 30 | console.log("handleToggleChange"); 31 | setHideHighLikes(!hideHighLikes()); 32 | console.log(!hideHighLikes()); 33 | chrome.runtime.sendMessage({ action: "setHideHighLikes", isHideHighLikes: hideHighLikes() }); 34 | }; 35 | 36 | onMount(() => { 37 | const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; 38 | setIsDarkMode(prefersDark); 39 | document.documentElement.classList.toggle("dark", prefersDark); 40 | 41 | chrome.runtime.sendMessage({ action: "isHideHighLikes" }, (response) => { 42 | setHideHighLikes(response.data); 43 | }); 44 | 45 | chrome.runtime.sendMessage({ action: "getLikeThreshold" }, (response) => { 46 | console.log(response.data); 47 | setLikeThreshold(response.data || 10000); 48 | }); 49 | }); 50 | return ( 51 |
55 |
56 |
    57 | {tabs.map((tab) => ( 58 |
  • 59 | 68 |
  • 69 | ))} 70 | 71 |
72 |
73 |
74 | 75 | {tabs.map((tab) => ( 76 | 77 |
{tab.content}
78 |
79 | ))} 80 |
81 |
82 | {/*
83 | 90 | 93 | 94 |
*/} 95 | 96 |
97 | 104 | 114 |
115 | 116 |
117 | ); 118 | } 119 | -------------------------------------------------------------------------------- /src/Bookmarks.tsx: -------------------------------------------------------------------------------- 1 | import { createSignal, onMount } from "solid-js"; 2 | 3 | export default function Bookmarks() { 4 | const [bookmarks, setBookmarks] = createSignal([]); 5 | const [searchQuery, setSearchQuery] = createSignal(""); 6 | 7 | const saveTweets = () => { 8 | console.log("clicked"); 9 | chrome.runtime.sendMessage({ message: "injectScript" }); 10 | } 11 | 12 | onMount(() => { 13 | chrome.runtime.sendMessage({ action: "getLocalStorage" }, (response) => { 14 | console.log(response.data.length); 15 | setBookmarks(response.data) 16 | }); 17 | }); 18 | 19 | const filteredBookmarks = () => { 20 | const query = searchQuery().toLowerCase(); 21 | return bookmarks().filter(tweet => 22 | Object.values(tweet).some(value => 23 | typeof value === "string" && value.toLowerCase().includes(query) 24 | ) 25 | ); 26 | }; 27 | 28 | const highlightText = (text) => { 29 | const query = searchQuery().toLowerCase(); 30 | if (query === "") return text; 31 | 32 | const regex = new RegExp(`(${query})`, "gi"); 33 | return text.split(regex).map((part, _) => 34 | regex.test(part.toLowerCase()) ? ( 35 | {part} 36 | ) : ( 37 | {part} 38 | ) 39 | ); 40 | }; 41 | 42 | return ( 43 |
44 | {bookmarks().length === 0 ? ( 45 |
48 | 52 |
53 | ) : ( 54 |
55 |
56 |
Total Bookmarks: {bookmarks().length}
57 | 58 |
59 |
60 | setSearchQuery(e.target.value)} 66 | /> 67 |
68 | {filteredBookmarks().map((tweet) => ( 69 | 70 |
71 | profile pic 74 |
75 |
76 |
{highlightText(tweet.authorName)}
77 |
{tweet.authorHandle}
78 | {/* date */} 79 |
{new Date(tweet.date).toLocaleDateString('en-GB')}
80 |
81 |
{highlightText(tweet.text)}
82 |
83 |
84 |
85 | ))} 86 |
87 | )} 88 |
89 | ); 90 | } 91 | 92 | //object example 93 | // { 94 | // text: tweetText, 95 | // authorName: authorName, 96 | // authorHandle: authorHandle, 97 | // authorProfilePic: authorProfilePic, 98 | // date: tweetTimeEl.getAttribute("datetime"), 99 | // url: tweetUrl, 100 | // media: { 101 | // images: tweetImgsSrc.length > 0 ? tweetImgsSrc : null, 102 | // videoThumbnails: tweetVideoThumbnails.length > 0 ? tweetVideoThumbnails : null, 103 | // }, 104 | // }; -------------------------------------------------------------------------------- /src/SearchBar.tsx: -------------------------------------------------------------------------------- 1 | import { createSignal, onMount } from "solid-js"; 2 | 3 | //im making a twitter advanced search extension 4 | 5 | export default function SearchBar() { 6 | const [word, setWord] = createSignal(""); 7 | const [account, setAccount] = createSignal(""); 8 | const [minLikes, setMinLikes] = createSignal(0); 9 | const [includeReplies, setIncludeReplies] = createSignal(true); 10 | const [fromDate, setFromDate] = createSignal(""); 11 | const [toDate, setToDate] = createSignal(""); 12 | const [follows, setFollows] = createSignal(false); 13 | let accountHistory: string[] = getAccountLocalStorage(); 14 | const avoidList = ["home", "explore", "notifications", "messages", "i", "settings"]; 15 | 16 | // Check for initial preference 17 | onMount(() => { 18 | chrome.runtime.sendMessage({ query: "getURL" }, (response) => { 19 | if (response.tabURL) { 20 | const url = new URL(response.tabURL); 21 | const pathSegments = url.pathname.split('/').filter(Boolean); 22 | if (pathSegments.length > 0 && url.hostname === "x.com") { 23 | const twitterUsername = pathSegments[0]; 24 | if (avoidList.includes(twitterUsername)) { 25 | return; 26 | } 27 | setAccount(twitterUsername); // Your state update function 28 | } 29 | } 30 | }); 31 | 32 | }); 33 | 34 | //function to store key value pair in local storage 35 | function setLocalStorage(key: string, value: any) { 36 | localStorage.setItem(key, JSON.stringify(value)); 37 | } 38 | 39 | //function to get key value pair from local storage 40 | function getLocalStorage(key: string) { 41 | const value = localStorage.getItem(key); 42 | if (value) { 43 | return JSON.parse(value); 44 | } 45 | } 46 | 47 | //function to store a account in local storage 48 | function setAccountLocalStorage(value: string) { 49 | const accounts = new Set(getAccountLocalStorage()); 50 | accounts.add(value); 51 | setLocalStorage("accounts", Array.from(accounts)); 52 | } 53 | //function to get accounts from local storage 54 | function getAccountLocalStorage() { 55 | const accounts = getLocalStorage("accounts"); 56 | if (accounts) { 57 | return accounts.slice(-5); 58 | } 59 | return []; 60 | } 61 | 62 | const onSubmit = (e: any) => { 63 | e.preventDefault(); 64 | let url = "https://x.com/search?lang=en&q="; 65 | if (word()) { 66 | url += word(); 67 | } 68 | if (account()) { 69 | url += "%20(from%3A" + account() + ")"; 70 | setAccountLocalStorage(account()); 71 | } 72 | if (minLikes()) { 73 | url += "%20min_faves%3A" + minLikes(); 74 | } 75 | if (!includeReplies()) { 76 | url += "%20-filter%3Areplies"; 77 | } 78 | if (follows()) { 79 | url += "%20filter%3Afollows"; 80 | } 81 | if (fromDate()) { 82 | url += "%20since%3A" + fromDate(); 83 | } 84 | if (toDate()) { 85 | url += "%20until%3A" + toDate(); 86 | } 87 | window.open(url, "_blank"); 88 | }; 89 | 90 | 91 | 92 | return ( 93 |
94 | 101 | 127 | 128 | 129 |
133 |
134 | setWord(e.target.value)} 138 | subtext={`Example: twitter`} 139 | /> 140 | 141 | setAccount(e.target.value)} 145 | subtext="Example: that_anokha_boy · sent from that_anokha_boy" 146 | recommended={accountHistory} 147 | /> 148 | 149 | setMinLikes(e.target.value)} 153 | subtext="Example: 69 · contains “69”" 154 | /> 155 | 156 | setIncludeReplies(e.target.checked)} 160 | /> 161 | setFollows(e.target.checked)} 165 | /> 166 | 167 |
168 |
169 |
From
170 | setFromDate(e.target.value)} 175 | class="bg-white border-gray-300 dark:border-gray-800 color-scheme:light dark:[color-scheme:dark] dark:bg-black border accent-slate-600 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full ps-10 p-2.5 dark:bg-black-700 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" 176 | placeholder="Select date start" 177 | /> 178 |
179 |
180 |
Till
181 | setToDate(e.target.value)} 186 | class="bg-white border-gray-300 dark:border-gray-800 color-scheme:light dark:[color-scheme:dark] dark:bg-black border accent-slate-600 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full ps-10 p-2.5 dark:bg-black-700 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" 187 | placeholder="Select date end" 188 | /> 189 |
190 |
191 |
192 | 198 |
199 | 200 |
201 |
202 | ); 203 | } 204 | 205 | interface TextInputComponentProps { 206 | label?: string; 207 | value?: string | number; 208 | subtext?: string; 209 | recommended?: string[]; 210 | onChange: (e: any) => void; 211 | } 212 | function TextInputComponent(props: TextInputComponentProps) { 213 | //avoiding destructuring to avoid lost of reactivity 214 | // function to set value of input tag to selected recommended value 215 | function setRecommendedValue(value: string) { 216 | console.log(value); 217 | props.onChange({ target: { value: value } }); 218 | } 219 | const [list, setList] = createSignal(props.recommended ?? []); 220 | 221 | //filter recommended list based on input value 222 | function filterRecommendedList(value: string) { 223 | if (props.recommended) { 224 | setList( 225 | props.recommended.filter((item) => { 226 | return item.toLowerCase().includes(value.toLowerCase()); 227 | }) 228 | ); 229 | } 230 | } 231 | return ( 232 |
233 | filterRecommendedList(e.target.value)} 238 | value={props.value ? props.value : ""} 239 | /> 240 | 243 | {/* recommended list show when input tag is on focus */} 244 | {list() && ( 245 | 252 | )} 253 | 254 | {/* subtext */} 255 |
256 |

257 | {props.subtext} 258 |

259 |
260 |
261 | ); 262 | } 263 | 264 | //checkbox component 265 | interface CheckboxComponentProps { 266 | label?: string; 267 | value?: boolean; 268 | onChange?: (e: any) => void; 269 | } 270 | 271 | function CheckboxComponent({ label, value, onChange }: CheckboxComponentProps) { 272 | const id = Math.random().toString(36).substr(2, 9); 273 | return ( 274 |
275 |
276 | 304 | 310 |
311 |
312 | ); 313 | } 314 | -------------------------------------------------------------------------------- /src/assets/solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/background.ts: -------------------------------------------------------------------------------- 1 | chrome.runtime.onMessage.addListener(function (request, _, sendResponse) { 2 | if (request.query === "getURL") { 3 | chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { 4 | var activeTab = tabs[0]; 5 | sendResponse({ tabURL: activeTab.url }); 6 | }); 7 | return true; 8 | } 9 | 10 | if (request.action === "setLikeThreshold") { 11 | chrome.storage.local.set({ likeThreshold: request.threshold }, function () { 12 | console.log("Like threshold is set to " + request.threshold); 13 | }); 14 | return true; 15 | } 16 | 17 | if (request.action === "getLikeThreshold") { 18 | chrome.storage.local.get(["likeThreshold"], function (result) { 19 | console.log("Value currently is " + result.likeThreshold); 20 | sendResponse({ data: result.likeThreshold || 10000 }); 21 | }); 22 | return true; 23 | } 24 | if (request.action === "saveToLocalStorage") { 25 | chrome.storage.local.set( 26 | { tweetBookmarks: JSON.stringify(request.tweets) }, 27 | function () { 28 | console.log("Value is set to " + request.data); 29 | } 30 | ); 31 | return true; 32 | } 33 | if (request.action === "getLocalStorage") { 34 | chrome.storage.local.get(["tweetBookmarks"], function (result) { 35 | console.log("Value currently is " + result.tweetBookmarks); 36 | sendResponse({ data: JSON.parse(result.tweetBookmarks ?? "[]") }); 37 | }); 38 | return true; 39 | } 40 | if (request.action === "isHideHighLikes") { 41 | // check if isHideHighLikes to true 42 | chrome.storage.local.get(["isHideHighLikes"], function (result) { 43 | console.log("Value currently is " + result.isHideHighLikes); 44 | sendResponse({ data: result.isHideHighLikes }); 45 | }); 46 | return true; 47 | } 48 | if (request.action === "setHideHighLikes") { 49 | console.log("setHideHighLikes"); 50 | console.log(request.isHideHighLikes); 51 | chrome.storage.local.set( 52 | { isHideHighLikes: request.isHideHighLikes }, 53 | function () { 54 | console.log("Value is set to " + request.isHideHighLikes); 55 | } 56 | ); 57 | return true; 58 | } 59 | if (request.message === "injectScript") { 60 | console.log("helloooooooo"); 61 | chrome.tabs.create({ url: "https://x.com/i/bookmarks/all" }).then((tab) => { 62 | console.log(tab.id); 63 | 64 | setTimeout(() => { 65 | console.log("hello"); 66 | chrome.tabs.sendMessage(tab.id!, { action: "triggerFunction" }); 67 | }, 5000); 68 | }); 69 | return true; 70 | } 71 | }); 72 | 73 | // } 74 | -------------------------------------------------------------------------------- /src/bookmark-tojson.js: -------------------------------------------------------------------------------- 1 | export default function getAllBookmarks() { 2 | const TWITTER_BOOKMARKS_URL = "https://x.com/i/bookmarks"; 3 | const SCROLL_INTERVAL = 800; 4 | const SCROLL_STEP = 5000; 5 | const MAX_UNCHANGED_COUNT = 10; 6 | 7 | if (!location.href.startsWith(TWITTER_BOOKMARKS_URL)) { 8 | return; 9 | } 10 | 11 | const tweets = []; 12 | let previousTweetCount = 0; 13 | let unchangedCount = 0; 14 | 15 | const scrollToEnd = () => { 16 | window.scrollBy(0, SCROLL_STEP); 17 | const currentTweetCount = tweets.length; 18 | //update the number 19 | const number = document.getElementById('toast-indicator').getElementsByTagName('span')[0]; 20 | number.innerText = currentTweetCount; 21 | // 22 | 23 | if (currentTweetCount === previousTweetCount) { 24 | unchangedCount++; 25 | if (unchangedCount >= MAX_UNCHANGED_COUNT) { 26 | console.log("Scraping complete"); 27 | console.log("Total tweets scraped: ", tweets.length); 28 | console.log("Downloading tweets as JSON..."); 29 | stopScraping(); 30 | chrome.runtime.sendMessage({ action: 'saveToLocalStorage', tweets: tweets }); 31 | } 32 | } else { 33 | unchangedCount = 0; 34 | } 35 | 36 | previousTweetCount = currentTweetCount; 37 | }; 38 | 39 | const scrollToEndIntervalID = setInterval(scrollToEnd, SCROLL_INTERVAL); 40 | 41 | const extractTweetData = (tweetElement) => { 42 | const tweetText = tweetElement.querySelector('[data-testid="tweetText"]')?.innerText || null; 43 | const userInfo = tweetElement.querySelector('[data-testid="User-Name"]').innerText.split("\n"); 44 | const [authorName, authorHandle] = userInfo.length === 3 ? [userInfo[0], userInfo[0]] : userInfo; 45 | const authorProfilePic = tweetElement.querySelector('img[src^="https://pbs.twimg.com/profile_images"]')?.src; 46 | const tweetTimeEl = tweetElement.querySelector("time"); 47 | const tweetUrl = tweetTimeEl.parentElement.href; 48 | const tweetImgsSrc = Array.from(tweetElement.querySelectorAll('[data-testid="tweetPhoto"] img')).map((img) => img.src); 49 | const tweetVideoThumbnails = Array.from(tweetElement.querySelectorAll('[data-testid="videoPlayer"] video')).map((video) => video.poster); 50 | 51 | return { 52 | text: tweetText, 53 | authorName: authorName, 54 | authorHandle: authorHandle, 55 | authorProfilePic: authorProfilePic, 56 | date: tweetTimeEl.getAttribute("datetime"), 57 | url: tweetUrl, 58 | media: { 59 | images: tweetImgsSrc.length > 0 ? tweetImgsSrc : null, 60 | videoThumbnails: tweetVideoThumbnails.length > 0 ? tweetVideoThumbnails : null, 61 | }, 62 | }; 63 | }; 64 | 65 | const updateTweets = () => { 66 | try { 67 | document.querySelectorAll('article[data-testid="tweet"]').forEach((tweetElement) => { 68 | const tweet = extractTweetData(tweetElement); 69 | const existingTweetIndex = tweets.findIndex((t) => t.url === tweet.url); 70 | 71 | if (existingTweetIndex === -1) { 72 | console.log("total tweets: ", tweets.length); 73 | tweets.push(tweet); 74 | } else { 75 | const existingTweet = tweets[existingTweetIndex]; 76 | existingTweet.authorProfilePic = existingTweet.authorProfilePic || tweet.authorProfilePic; 77 | existingTweet.media.images = tweet.media.images || existingTweet.media.images; 78 | existingTweet.media.videoThumbnails = tweet.media.videoThumbnails || existingTweet.media.videoThumbnails; 79 | } 80 | }); 81 | } catch (error) { 82 | console.error("Error scraping tweet: ", error, " previous tweet: ", tweets.slice(-1)); 83 | } 84 | }; 85 | 86 | const observer = new MutationObserver((mutations) => { 87 | mutations.forEach((mutation) => { 88 | if (mutation.addedNodes.length) { 89 | updateTweets(); 90 | } 91 | }); 92 | }); 93 | 94 | const startScraping = () => { 95 | creatToast(); 96 | updateTweets(); 97 | observer.observe(document.body, { childList: true, subtree: true }); 98 | }; 99 | 100 | const stopScraping = () => { 101 | clearInterval(scrollToEndIntervalID); 102 | removeToast(); 103 | injectSuccessToast() 104 | observer.disconnect(); 105 | }; 106 | 107 | 108 | 109 | startScraping(); 110 | }; 111 | 112 | function removeToast() { 113 | const indicator = document.getElementById('toast-indicator'); 114 | indicator.remove(); 115 | } 116 | 117 | function injectSuccessToast() { 118 | const toast = document.createElement('div'); 119 | toast.classList.add('toast'); 120 | toast.classList.add('toast-success'); 121 | toast.innerHTML = 'Successfully scraped tweets!'; 122 | toast.style.position = 'fixed'; 123 | toast.style.bottom = '20px'; 124 | toast.style.right = '20px'; 125 | toast.style.zIndex = '9999'; 126 | toast.style.padding = '10px'; 127 | toast.style.backgroundColor = '#3498db'; 128 | toast.style.color = 'white'; 129 | toast.style.borderRadius = '5px'; 130 | toast.style.fontSize = '16px'; 131 | toast.style.fontWeight = 'bold'; 132 | toast.style.opacity = '0'; 133 | toast.style.transition = 'opacity 0.5s ease-in-out'; 134 | document.body.appendChild(toast); 135 | setTimeout(() => { 136 | toast.style.opacity = '1'; 137 | }, 1000); 138 | setTimeout(() => { 139 | toast.style.opacity = '0'; 140 | setTimeout(() => { 141 | toast.remove(); 142 | }, 5000); 143 | }, 3000); 144 | 145 | 146 | } 147 | 148 | function creatToast() { 149 | const indicator = document.createElement('div'); 150 | //give it a id 151 | indicator.id = 'toast-indicator'; 152 | indicator.style.position = 'fixed'; 153 | indicator.style.bottom = '20px'; 154 | indicator.style.right = '20px'; 155 | indicator.style.width = '40px'; 156 | indicator.style.height = '40px'; 157 | indicator.style.borderRadius = '50%'; 158 | indicator.style.border = '4px solid #f3f3f3'; 159 | indicator.style.borderTopColor = '#3498db'; 160 | indicator.style.animation = 'spin 2s linear infinite'; 161 | indicator.style.backgroundColor = 'white'; // Add white background 162 | 163 | const number = document.createElement('span'); 164 | number.style.position = 'absolute'; 165 | number.style.top = '50%'; 166 | number.style.left = '50%'; 167 | number.style.transform = 'translate(-50%, -50%)'; 168 | number.style.color = '#3498db'; 169 | number.style.fontWeight = 'bold'; 170 | number.style.fontSize = '16px'; 171 | number.innerText = '0'; // Replace with the desired number 172 | 173 | const style = document.createElement('style'); 174 | style.innerHTML = ` 175 | @keyframes spin { 176 | 0% { transform: rotate(0deg); } 177 | 100% { transform: rotate(360deg); } 178 | } 179 | `; 180 | 181 | document.head.appendChild(style); 182 | indicator.appendChild(number); // Add the number to the indicator 183 | document.body.appendChild(indicator); 184 | } 185 | -------------------------------------------------------------------------------- /src/content.js: -------------------------------------------------------------------------------- 1 | import getAllBookmarks from "./bookmark-tojson"; 2 | 3 | console.log("content.js loaded"); 4 | chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { 5 | if (request.action === "triggerFunction") { 6 | injectScript(); 7 | } 8 | }); 9 | 10 | function injectScript() { 11 | console.log("injecting script"); 12 | setTimeout(() => { 13 | console.log("injecting script"); 14 | getAllBookmarks(); 15 | }, 1500); 16 | } 17 | 18 | // chrome.runtime.sendMessage({ action: "isHideHighLikes" }, (response) => { 19 | // console.log(response.data); 20 | // if (response.data) { 21 | // console.log("hiding tweets"); 22 | 23 | // setTimeout(() => { 24 | // logLikesForTweets(); 25 | // }, 5000); 26 | // const observer = new MutationObserver((mutations) => { 27 | // mutations.forEach((mutation) => { 28 | // if (mutation.type === "childList" && mutation.addedNodes.length > 0) { 29 | // logLikesForTweets(); 30 | // } 31 | // }); 32 | // }); 33 | 34 | // observer.observe(document.body, { childList: true, subtree: true }); 35 | 36 | // return; 37 | // } 38 | // }); 39 | 40 | function logLikesForTweets() { 41 | const tweets = document.querySelectorAll('article[data-testid="tweet"]'); 42 | tweets.forEach((tweet) => { 43 | const likeButton = tweet.querySelector('button[data-testid="like"]'); 44 | if (likeButton && likeButton.getAttribute("aria-label")) { 45 | let likeCount = likeButton.getAttribute("aria-label")?.split(".")[0]; 46 | const tweetText = 47 | tweet.querySelector('div[data-testid="tweetText"]')?.textContent || 48 | "No text"; 49 | likeCount = likeCount.replace(/\D/g, ""); 50 | if (likeCount > 10000) { 51 | tweet.style.display = "none"; 52 | console.log( 53 | `hiding tweet: ${tweetText.substring(0, 50)} link: ${ 54 | tweet.querySelectorAll("a")[0].href 55 | }` 56 | ); 57 | } 58 | } else { 59 | console.log("no like button"); 60 | } 61 | }); 62 | } 63 | 64 | 65 | // content.js 66 | 67 | let hideHighLikes = false; 68 | let likeThreshold = 10000; 69 | 70 | // Function to parse like count from a tweet 71 | function parseLikeCount(likeButton) { 72 | if (!likeButton || !likeButton.getAttribute("aria-label")) return 0; 73 | const likeText = likeButton.getAttribute("aria-label").split(".")[0]; 74 | return parseInt(likeText.replace(/\D/g, ""), 10) || 0; 75 | } 76 | 77 | // Function to hide tweets based on like count 78 | function hideTweetsAboveThreshold() { 79 | const tweets = document.querySelectorAll('article[data-testid="tweet"]'); 80 | tweets.forEach((tweet) => { 81 | const likeButton = tweet.querySelector('button[data-testid="like"]'); 82 | const likeCount = parseLikeCount(likeButton); 83 | 84 | if (likeCount > likeThreshold) { 85 | tweet.style.display = "none"; 86 | console.log(`Hiding tweet with ${likeCount} likes`); 87 | } else if (tweet.style.display === "none") { 88 | tweet.style.display = ""; // Show previously hidden tweets if they're now below the threshold 89 | } 90 | }); 91 | } 92 | 93 | // Set up MutationObserver to handle dynamically loaded tweets 94 | function setupMutationObserver() { 95 | const observer = new MutationObserver((mutations) => { 96 | mutations.forEach((mutation) => { 97 | if (mutation.type === "childList" && mutation.addedNodes.length > 0) { 98 | hideTweetsAboveThreshold(); 99 | } 100 | }); 101 | }); 102 | 103 | observer.observe(document.body, { childList: true, subtree: true }); 104 | } 105 | 106 | // Initialize the content script 107 | function initialize() { 108 | chrome.runtime.sendMessage({ action: "isHideHighLikes" }, (response) => { 109 | if (chrome.runtime.lastError) { 110 | console.error("Error getting hideHighLikes setting:", chrome.runtime.lastError); 111 | return; 112 | } 113 | 114 | hideHighLikes = response.data; 115 | 116 | if (hideHighLikes) { 117 | chrome.runtime.sendMessage({ action: "getLikeThreshold" }, (thresholdResponse) => { 118 | if (chrome.runtime.lastError) { 119 | console.error("Error getting likeThreshold:", chrome.runtime.lastError); 120 | return; 121 | } 122 | 123 | likeThreshold = thresholdResponse.data || 10000; 124 | console.log(`Hiding tweets with more than ${likeThreshold} likes`); 125 | 126 | hideTweetsAboveThreshold(); 127 | setupMutationObserver(); 128 | }); 129 | } 130 | }); 131 | } 132 | 133 | // Listen for messages from the popup 134 | chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { 135 | if (request.action === "updateSettings") { 136 | hideHighLikes = request.hideHighLikes; 137 | likeThreshold = request.likeThreshold; 138 | 139 | if (hideHighLikes) { 140 | hideTweetsAboveThreshold(); 141 | setupMutationObserver(); 142 | } else { 143 | // Show all hidden tweets when the feature is turned off 144 | document.querySelectorAll('article[data-testid="tweet"]').forEach(tweet => { 145 | tweet.style.display = ""; 146 | }); 147 | } 148 | } 149 | }); 150 | 151 | // Initialize the content script when the page loads 152 | if (document.readyState === "loading") { 153 | document.addEventListener("DOMContentLoaded", initialize); 154 | } else { 155 | initialize(); 156 | } 157 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | 6 | 7 | .github-corner:hover .octo-arm { 8 | animation: octocat-wave 560ms ease-in-out; 9 | } 10 | @keyframes octocat-wave { 11 | 0%, 12 | 100% { 13 | transform: rotate(0); 14 | } 15 | 20%, 16 | 60% { 17 | transform: rotate(-15deg); 18 | } 19 | 40%, 20 | 80% { 21 | transform: rotate(5); 22 | } 23 | } 24 | @media (max-width: 500px) { 25 | .github-corner:hover .octo-arm { 26 | animation: none; 27 | } 28 | .github-corner .octo-arm { 29 | animation: octocat-wave 560ms ease-in-out; 30 | } 31 | } -------------------------------------------------------------------------------- /src/index.tsx: -------------------------------------------------------------------------------- 1 | /* @refresh reload */ 2 | import { render } from 'solid-js/web' 3 | 4 | import './index.css' 5 | import App from './App' 6 | 7 | const root = document.getElementById('root') 8 | 9 | render(() => , root!) 10 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | darkMode: 'class', 4 | content: [ 5 | "./index.html", 6 | "./src/**/*.{js,ts,jsx,tsx}", 7 | "./node_modules/flowbite/**/*.js" 8 | ], 9 | theme: { 10 | extend: {}, 11 | }, 12 | plugins: [], 13 | }; 14 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": [ 7 | "ES2020", 8 | "DOM", 9 | "DOM.Iterable" 10 | ], 11 | "skipLibCheck": true, 12 | "types": [ 13 | "chrome" 14 | ], 15 | /* Bundler mode */ 16 | "moduleResolution": "bundler", 17 | "allowImportingTsExtensions": true, 18 | "resolveJsonModule": true, 19 | "isolatedModules": true, 20 | "noEmit": true, 21 | "jsx": "preserve", 22 | "jsxImportSource": "solid-js", 23 | /* Linting */ 24 | "strict": false, 25 | "noUnusedLocals": true, 26 | "noUnusedParameters": true, 27 | "noFallthroughCasesInSwitch": true 28 | }, 29 | "include": [ 30 | "src" 31 | ], 32 | "references": [ 33 | { 34 | "path": "./tsconfig.node.json" 35 | } 36 | ] 37 | } -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts","manifest.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, loadEnv } from "vite"; 2 | import solidPlugin from "vite-plugin-solid"; 3 | import { crx } from "@crxjs/vite-plugin"; 4 | import manifest from "./manifest.config"; 5 | 6 | // import devtools from 'solid-devtools/vite'; 7 | 8 | export default defineConfig({ 9 | plugins: [ 10 | /* 11 | Uncomment the following line to enable solid-devtools. 12 | For more info see https://github.com/thetarnav/solid-devtools/tree/main/packages/extension#readme 13 | */ 14 | // devtools(), 15 | solidPlugin(), 16 | crx({ manifest }), 17 | ], 18 | build: { 19 | target: "esnext", 20 | }, 21 | }); 22 | --------------------------------------------------------------------------------