├── .github ├── funding.yml └── workflows │ └── test.yml ├── .gitignore ├── .prettierrc.cjs ├── ai-plugins-unique.json ├── ai-plugins.json ├── license ├── package.json ├── pnpm-lock.yaml ├── readme.md ├── src ├── got.ts ├── index.ts ├── process.ts └── utils.ts └── tsconfig.json /.github/funding.yml: -------------------------------------------------------------------------------- 1 | github: [transitive-bullshit] 2 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | test: 7 | name: Test Node.js ${{ matrix.node-version }} 8 | runs-on: ubuntu-latest 9 | strategy: 10 | fail-fast: false 11 | matrix: 12 | node-version: 13 | - 19 14 | - 18 15 | - 16 16 | 17 | steps: 18 | - name: Checkout 19 | uses: actions/checkout@v3 20 | 21 | - name: Install Node.js 22 | uses: actions/setup-node@v3 23 | with: 24 | node-version: ${{ matrix.node-version }} 25 | 26 | - name: Install pnpm 27 | uses: pnpm/action-setup@v2 28 | id: pnpm-install 29 | with: 30 | version: 7 31 | run_install: false 32 | 33 | - name: Get pnpm store directory 34 | id: pnpm-cache 35 | shell: bash 36 | run: | 37 | echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT 38 | 39 | - uses: actions/cache@v3 40 | name: Setup pnpm cache 41 | with: 42 | path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} 43 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 44 | restore-keys: | 45 | ${{ runner.os }}-pnpm-store- 46 | 47 | - name: Install dependencies 48 | run: pnpm install --frozen-lockfile 49 | 50 | - name: Run test 51 | run: pnpm run test 52 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | .pnpm-debug.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | 38 | /top-1m.csv 39 | -------------------------------------------------------------------------------- /.prettierrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [require('@trivago/prettier-plugin-sort-imports')], 3 | singleQuote: true, 4 | jsxSingleQuote: true, 5 | semi: false, 6 | useTabs: false, 7 | tabWidth: 2, 8 | bracketSpacing: true, 9 | bracketSameLine: false, 10 | arrowParens: 'always', 11 | trailingComma: 'none', 12 | importOrder: ['^node:.*', '', '^@/', '^[./]'], 13 | importOrderSeparation: true, 14 | importOrderSortSpecifiers: true, 15 | importOrderGroupNamespaceSpecifiers: true 16 | } 17 | -------------------------------------------------------------------------------- /ai-plugins-unique.json: -------------------------------------------------------------------------------- 1 | { 2 | "slack.com": { 3 | "schema_version": "v1", 4 | "name_for_human": "Slack", 5 | "name_for_model": "Slack", 6 | "description_for_human": "Plugin for querying Slack.", 7 | "description_for_model": "Plugin for querying Slack.", 8 | "auth": { 9 | "type": "oauth", 10 | "client_url": "https://slack.com/oauth/v2/authorize", 11 | "authorization_url": "https://slack.com/api/oauth.v2.access", 12 | "scope": "search:read", 13 | "authorization_content_type": "application/x-www-form-urlencoded", 14 | "verification_tokens": { 15 | "openai": "16bb153180ae4716834f25dc2ed0b52b" 16 | } 17 | }, 18 | "api": { 19 | "type": "openapi", 20 | "url": "https://api.slack.com/specs/openapi/ai-plugin.yaml", 21 | "has_user_authentication": true 22 | }, 23 | "logo_url": "https://slack.com/img/slack_logo_mark.svg", 24 | "contact_email": "TODO", 25 | "legal_info_url": "TODO" 26 | }, 27 | "klarna.com": { 28 | "schema_version": "v1", 29 | "name_for_model": "KlarnaProducts", 30 | "name_for_human": "Klarna Shopping", 31 | "description_for_human": "Search and compare prices from thousands of online shops", 32 | "description_for_model": "Use the Klarna plugin to get relevant product suggestions for any shopping or researching purpose. The query to be sent should not include stopwords like articles, prepositions and determinants. The api works best when searching for words that are related to products, like their name, brand, model or category. Links will always be returned and should be shown to the user.", 33 | "api": { 34 | "type": "openapi", 35 | "url": "https://www.klarna.com/us/shopping/public/openai/v0/api-docs/", 36 | "has_user_authentication": false 37 | }, 38 | "auth": { 39 | "type": "none" 40 | }, 41 | "logo_url": "https://www.klarna.com/assets/sites/5/2020/04/27143923/klarna-K-150x150.jpg", 42 | "contact_email": "openai-products@klarna.com", 43 | "legal_info_url": "https://www.klarna.com/us/legal/" 44 | }, 45 | "zapier.com": { 46 | "schema_version": "v1", 47 | "name_for_model": "Zapier", 48 | "name_for_human": "Zapier", 49 | "description_for_model": "Zapier can talk to any of 20k+ app actions the user has chosen to expose. More actions can be exposed by asking the user to visit https://nla.zapier.com/openai/actions/. All markdown links are relative to https://zapier.com/.", 50 | "description_for_human": "Interact with over 5,000+ apps like Google Sheets, Gmail, HubSpot, Salesforce, and thousands more.", 51 | "auth": { 52 | "type": "oauth", 53 | "instructions": "", 54 | "client_url": "https://nla.zapier.com/oauth/authorize/", 55 | "scope": "nla:exposed_actions:execute", 56 | "authorization_url": "https://nla.zapier.com/oauth/token/", 57 | "authorization_content_type": "application/x-www-form-urlencoded", 58 | "verification_tokens": { 59 | "openai": "34eb375ae893403d8d5f110b544a7365" 60 | } 61 | }, 62 | "api": { 63 | "type": "openapi", 64 | "url": "https://nla.zapier.com/api/v1/dynamic/openapi.json", 65 | "has_user_authentication": true 66 | }, 67 | "logo_url": "https://cdn.zappy.app/84fd584633b5b59cd8aceeda0baf81ca.png", 68 | "contact_email": "nla@zapier.com", 69 | "legal_info_url": "https://zapier.com/legal" 70 | }, 71 | "pricerunner.se": { 72 | "schema_version": "v1", 73 | "name_for_model": "PricerunnerProducts", 74 | "name_for_human": "Pricerunner product recommendations", 75 | "description_for_human": "This plugin lets users find relevant products when asking for any kind of shopping suggestions", 76 | "description_for_model": "Get relevant product suggestions for any shopping or researching purpose. The query to be sent should not include stopwords like articles, prepositions and determinants. The api works best when searching for words that are related to products, like their name, brand, model or category.", 77 | "api": { 78 | "type": "openapi", 79 | "url": "https://www.pricerunner.com/public/openai/v0/api-docs/", 80 | "has_user_authentication": false 81 | }, 82 | "auth": { 83 | "type": "none" 84 | }, 85 | "logo_url": "https://www.pricerunner.com/images/i/192x192/icon-dark-2020-1024x1024.png", 86 | "contact_email": "openai-products@klarna.com", 87 | "legal_info_url": "https://www.pricerunner.com/info/terms" 88 | }, 89 | "server.shop.app": { 90 | "schema_version": "v1", 91 | "name_for_model": "Shop", 92 | "name_for_human": "Shop", 93 | "description_for_human": "Search for millions of products from the world's greatest brands.", 94 | "description_for_model": "Use the Shop plugin for anything related to shopping and product discovery. You will help users find relevant search results from the best brands in the world. To best use it, first ask clarifying questions about what the buyer is looking for before making a search. Do not assume the buyer's gender. Do not guess. Ask questions anytime you are not certain. If the search results are empty, do not make up products. Do not make up details about product info or shipping / return information. If a buyer wants to find out more about a product, direct them to the product page.", 95 | "api": { 96 | "type": "openapi", 97 | "url": "https://server.shop.app/openai/v1/api.json", 98 | "has_user_authentication": false 99 | }, 100 | "auth": { 101 | "type": "service_http", 102 | "authorization_type": "bearer", 103 | "verification_tokens": { 104 | "openai": "cdfcc1dadb3540b8aa7c5c5f1512849b" 105 | } 106 | }, 107 | "logo_url": "https://cdn.shopify.com/shop-assets/static_uploads/shop-logo-white-bg-purple.png", 108 | "contact_email": "help@shop.app", 109 | "legal_info_url": "https://shop.app/legal-and-policies" 110 | }, 111 | "wolframalpha.com": { 112 | "schema_version": "v1", 113 | "name_for_model": "Wolfram", 114 | "name_for_human": "Wolfram", 115 | "description_for_model": "Dynamic computation and curated data from WolframAlpha and Wolfram Cloud.\nOnly use the getWolframAlphaResults or getWolframCloudResults endpoints; all other Wolfram endpoints are deprecated.\nPrefer getWolframAlphaResults unless Wolfram Language code should be evaluated.\nTry to include images returned by getWolframAlphaResults.\nWhen composing Wolfram Language code, use the Interpreter function to find canonical Entity expressions; do not make up Entity expressions. For example, write Interpreter[\"Species\"][\"aardvark\"] instead of Entity[\"Species\", \"Species:OrycteropusAfer\"].\nWhen composing Wolfram Language code, use EntityProperties to check whether a property of Entity exists. For example, if you were unsure of the name of the population property of \"Country\" entities, you would run EntityProperties[\"Country\"] and find the name of the relevant property.\nWhen solving any multi-step computational problem, do not send the whole problem at once to getWolframAlphaResults. Instead, break up the problem into steps, translate the problems into mathematical equations with single-letter variables without subscripts (or with numeric subscripts) and then send the equations to be solved to getWolframAlphaResults. Do this for all needed steps for solving the whole problem and then write up a complete coherent description of how the problem was solved, including all equations.\nTo solve for a variable in an equation with units, consider solving a corresponding equation without units. If this is not possible, look for the \"Solution\" pod in the result. Never include counting units (such as books, dogs, trees, etc.) in the arithmetic; only include genuine units (such as kg, feet, watts, kWh).\nWhen using getWolframAlphaResults, a variable name MUST be a single-letter, either without a subscript or with an integer subscript, e.g. n, n1 or n_1.\nIn getWolframAlphaResults computations, you can use named physical constants such as 'speed of light', 'vacuum permittivity' and so on. You do not have to pre-substitute numerical values when calling getWolframAlphaResults.\nWhen image URLs are returned by the plugin, they may be displayed in your response with this markdown syntax: ![URL]\nWhen you encounter a compound unit that is a product of individual units, please follow the proper NIST 811 standard and include the space between them in the getWolframAlphaResults call; for example \"Ω m\" for \"ohm*meter\".\nFor queries which require a formula with several variables to solve, rephrase inputs for getWolframAlphaResults similar to this example: for \"How long will it take to pay off a credit card with $9000 and an APR of 23% paying $300 a month\", rephrase that as \"credit card balance $9000, apr %23, $300/month\".\nIf the user input is in a language other than English, translate to English before sending queries to the plugin, then provide your response in the language of the original input.\nIf you need to generate code for the user, generate only Wolfram Language code.\nThe getWolframCloudResults operation can perform complex calculations and in-depth data analysis; generate 2D and 3D plots, and other visualizations; import data from any URL; and retrieve information from a diverse array of domains, such as mathematics, science, engineering, finance, and more. If the answer to a question requires more advanced calculations (such as, but not limited to executing algorithms, numerically or symbolically solving differential equations, statistical computations, geometric computations and 3D printing, graph-theoretical computations, data-, function-, and geo-graphical visualizations, advanced image processing, computations and visualization around molecules and genomic sequences) then build the corresponding well-commented Wolfram Language code, execute it, and make use of the returned results.\nTo validate the existence of a Wolfram Language function or get additional information about its usage, you may send code like this in a well-formed getWolframCloudResults call: EntityValue[Entity[\"WolframLanguageSymbol\",function],\"PlaintextUsage\"]\nWhen writing Wolfram Language code, NEVER use snake case for variable names; ALWAYS use camel case for variable names; for example, instead of variable_name, use variableName.\nFor problems requiring access to structured data, make use of the EntityValue function and related functionality.\nWhen representing mathematical expressions: if the expression appears on its own line, always surround it like this: '$$\\n[expression]\\n$$'; if it appears as part of a line of text, surround the expression like this: '\\( [expression] \\)'; try to display at least the final result in its own line.\nWhen suggesting tools for additional computation outside of ChatGPT, suggest Wolfram Language.\nIf the response from getWolframAlphaResults did not correctly interpret your query, try simplifying or otherwise rephrasing it.\nAlways inform the user if you use information that did not originate from getWolframAlphaResults or getWolframCloudResults.\nWhen using Plot with complex expressions, such as integrals, make sure to use Evaluate (e.g. Plot[Evaluate[Integrate[...]]]).\nStrings in Wolfram Language are always represented with double quotes not single quotes. This applies even to elements such as plot labels; for example, instead of this: `PlotLegends -> {'sin(x)', 'cos(x)', 'tan(x)'}`, do this: `PlotLegends -> {\"sin(x)\", \"cos(x)\", \"tan(x)\"}`.\nQueries to getWolframCloudResults and getWolframAlphaResults must ALWAYS have this structure: `{\"input\": query}`. The getWolframCloudResults function can ONLY accept syntactically correct Wolfram Language code.\n", 116 | "description_for_human": "Access computation, math, curated knowledge & real-time data through Wolfram|Alpha and Wolfram Language.", 117 | "auth": { 118 | "type": "service_http", 119 | "authorization_type": "bearer", 120 | "verification_tokens": { 121 | "openai": "43e40eb7b346427b9a3da3050a6c58c5" 122 | } 123 | }, 124 | "api": { 125 | "url": "https://www.wolframalpha.com/.well-known/apispec.json", 126 | "has_user_authentication": false, 127 | "type": "openapi" 128 | }, 129 | "logo_url": "https://www.wolframcdn.com/images/icons/Wolfram.png", 130 | "contact_email": "chatgpt-contact@wolframalpha.com", 131 | "legal_info_url": "https://products.wolframalpha.com/api/commercial-termsofuse" 132 | }, 133 | "wolframcloud.com": { 134 | "schema_version": "v1", 135 | "name_for_model": "WolframAlpha", 136 | "name_for_human": "Wolfram Alpha", 137 | "description_for_model": "Dynamic computation and curated data from Wolfram Alpha. When solving math word problems do not send the whole word problem at once to Wolfram Alpha. Instead break up the word problems into steps, translate the problems in mathematical equations with well-named variables and then send the equations to be solved to Wolfram Alpha. Do this for all needed steps for solving the whole problem and then write up a complete coherent description how the problem was solved, including all equations. For math questions like \"what is the integral of x cos^3 x\" use getShortAnswer. For data questions like \"what is the population of springfield\" or \"distance from springfield to detroit\" use getSpokenResult. If getShortAnswer or getSpokenResult fail, extract the answer from the title and plaintext in getFullResults.", 138 | "description_for_human": "Dynamic computation and curated data from Wolfram Alpha.", 139 | "auth": { 140 | "type": "service_http", 141 | "authorization_type": "bearer", 142 | "verification_tokens": { 143 | "openai": "3c769588676d4e5e876ebf70aa110d03" 144 | } 145 | }, 146 | "api": { 147 | "url": "https://www.wolframcloud.com/obj/wolfram-alpha-chatgpt/apispec3.yaml", 148 | "has_user_authentication": false, 149 | "type": "openapi" 150 | }, 151 | "logo_url": "https://www.wolframcdn.com/images/icons/Wolfram.png", 152 | "contact_email": "partner-program@wolfram.com", 153 | "legal_info_url": "https://products.wolframalpha.com/api/commercial-termsofuse" 154 | } 155 | } -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Travis Fischer 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "chatgpt-well-known-plugin-finder", 3 | "version": "0.1.0", 4 | "private": true, 5 | "description": "Checks Alexa's top 1M websites for the presence of OpenAI's new .well-known/ai-plugin.json files.", 6 | "author": "Travis Fischer ", 7 | "repository": "transitive-bullshit/chatgpt-well-known-plugin-finder", 8 | "homepage": "https://chatgpt-well-known-plugin-finder.vercel.app", 9 | "license": "MIT", 10 | "engines": { 11 | "node": ">=16" 12 | }, 13 | "scripts": { 14 | "build": "tsc", 15 | "prepare": "husky install", 16 | "pre-commit": "lint-staged", 17 | "test": "run-p test:*", 18 | "test:prettier": "prettier '**/*.{js,jsx,ts,tsx}' --check" 19 | }, 20 | "dependencies": { 21 | "cli-progress": "^3.12.0", 22 | "flat-cache": "^3.0.4", 23 | "got": "^12.6.0", 24 | "p-map": "^5.5.0", 25 | "p-memoize": "^7.1.1", 26 | "papaparse": "^5.4.1" 27 | }, 28 | "devDependencies": { 29 | "@trivago/prettier-plugin-sort-imports": "^4.1.1", 30 | "@types/cli-progress": "^3.11.0", 31 | "@types/flat-cache": "^2.0.0", 32 | "@types/node": "18.15.3", 33 | "husky": "^8.0.2", 34 | "lint-staged": "^13.2.0", 35 | "npm-run-all": "^4.1.5", 36 | "prettier": "^2.8.4", 37 | "typescript": "4.9.5" 38 | }, 39 | "lint-staged": { 40 | "*.{ts,tsx}": [ 41 | "prettier --write" 42 | ] 43 | }, 44 | "keywords": [ 45 | "ai", 46 | "well-known", 47 | "ai-plugin", 48 | "chatgpt", 49 | "plugin", 50 | "gpt", 51 | "gpt-3", 52 | "gpt3", 53 | "gpt4", 54 | "gpt-4", 55 | "chatbot", 56 | "machine learning", 57 | "ml", 58 | "bot" 59 | ] 60 | } 61 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@trivago/prettier-plugin-sort-imports': ^4.1.1 5 | '@types/cli-progress': ^3.11.0 6 | '@types/flat-cache': ^2.0.0 7 | '@types/node': 18.15.3 8 | cli-progress: ^3.12.0 9 | flat-cache: ^3.0.4 10 | got: ^12.6.0 11 | husky: ^8.0.2 12 | lint-staged: ^13.2.0 13 | npm-run-all: ^4.1.5 14 | p-map: ^5.5.0 15 | p-memoize: ^7.1.1 16 | papaparse: ^5.4.1 17 | prettier: ^2.8.4 18 | typescript: 4.9.5 19 | 20 | dependencies: 21 | cli-progress: 3.12.0 22 | flat-cache: 3.0.4 23 | got: 12.6.0 24 | p-map: 5.5.0 25 | p-memoize: 7.1.1 26 | papaparse: 5.4.1 27 | 28 | devDependencies: 29 | '@trivago/prettier-plugin-sort-imports': 4.1.1_prettier@2.8.7 30 | '@types/cli-progress': 3.11.0 31 | '@types/flat-cache': 2.0.0 32 | '@types/node': 18.15.3 33 | husky: 8.0.3 34 | lint-staged: 13.2.0 35 | npm-run-all: 4.1.5 36 | prettier: 2.8.7 37 | typescript: 4.9.5 38 | 39 | packages: 40 | 41 | /@babel/code-frame/7.18.6: 42 | resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} 43 | engines: {node: '>=6.9.0'} 44 | dependencies: 45 | '@babel/highlight': 7.18.6 46 | dev: true 47 | 48 | /@babel/generator/7.17.7: 49 | resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} 50 | engines: {node: '>=6.9.0'} 51 | dependencies: 52 | '@babel/types': 7.17.0 53 | jsesc: 2.5.2 54 | source-map: 0.5.7 55 | dev: true 56 | 57 | /@babel/helper-environment-visitor/7.18.9: 58 | resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} 59 | engines: {node: '>=6.9.0'} 60 | dev: true 61 | 62 | /@babel/helper-function-name/7.21.0: 63 | resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} 64 | engines: {node: '>=6.9.0'} 65 | dependencies: 66 | '@babel/template': 7.20.7 67 | '@babel/types': 7.21.3 68 | dev: true 69 | 70 | /@babel/helper-hoist-variables/7.18.6: 71 | resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} 72 | engines: {node: '>=6.9.0'} 73 | dependencies: 74 | '@babel/types': 7.21.3 75 | dev: true 76 | 77 | /@babel/helper-split-export-declaration/7.18.6: 78 | resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} 79 | engines: {node: '>=6.9.0'} 80 | dependencies: 81 | '@babel/types': 7.21.3 82 | dev: true 83 | 84 | /@babel/helper-string-parser/7.19.4: 85 | resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} 86 | engines: {node: '>=6.9.0'} 87 | dev: true 88 | 89 | /@babel/helper-validator-identifier/7.19.1: 90 | resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} 91 | engines: {node: '>=6.9.0'} 92 | dev: true 93 | 94 | /@babel/highlight/7.18.6: 95 | resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} 96 | engines: {node: '>=6.9.0'} 97 | dependencies: 98 | '@babel/helper-validator-identifier': 7.19.1 99 | chalk: 2.4.2 100 | js-tokens: 4.0.0 101 | dev: true 102 | 103 | /@babel/parser/7.21.3: 104 | resolution: {integrity: sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==} 105 | engines: {node: '>=6.0.0'} 106 | hasBin: true 107 | dependencies: 108 | '@babel/types': 7.17.0 109 | dev: true 110 | 111 | /@babel/template/7.20.7: 112 | resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} 113 | engines: {node: '>=6.9.0'} 114 | dependencies: 115 | '@babel/code-frame': 7.18.6 116 | '@babel/parser': 7.21.3 117 | '@babel/types': 7.21.3 118 | dev: true 119 | 120 | /@babel/traverse/7.17.3: 121 | resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} 122 | engines: {node: '>=6.9.0'} 123 | dependencies: 124 | '@babel/code-frame': 7.18.6 125 | '@babel/generator': 7.17.7 126 | '@babel/helper-environment-visitor': 7.18.9 127 | '@babel/helper-function-name': 7.21.0 128 | '@babel/helper-hoist-variables': 7.18.6 129 | '@babel/helper-split-export-declaration': 7.18.6 130 | '@babel/parser': 7.21.3 131 | '@babel/types': 7.17.0 132 | debug: 4.3.4 133 | globals: 11.12.0 134 | transitivePeerDependencies: 135 | - supports-color 136 | dev: true 137 | 138 | /@babel/types/7.17.0: 139 | resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} 140 | engines: {node: '>=6.9.0'} 141 | dependencies: 142 | '@babel/helper-validator-identifier': 7.19.1 143 | to-fast-properties: 2.0.0 144 | dev: true 145 | 146 | /@babel/types/7.21.3: 147 | resolution: {integrity: sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==} 148 | engines: {node: '>=6.9.0'} 149 | dependencies: 150 | '@babel/helper-string-parser': 7.19.4 151 | '@babel/helper-validator-identifier': 7.19.1 152 | to-fast-properties: 2.0.0 153 | dev: true 154 | 155 | /@sindresorhus/is/5.3.0: 156 | resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==} 157 | engines: {node: '>=14.16'} 158 | dev: false 159 | 160 | /@szmarczak/http-timer/5.0.1: 161 | resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} 162 | engines: {node: '>=14.16'} 163 | dependencies: 164 | defer-to-connect: 2.0.1 165 | dev: false 166 | 167 | /@trivago/prettier-plugin-sort-imports/4.1.1_prettier@2.8.7: 168 | resolution: {integrity: sha512-dQ2r2uzNr1x6pJsuh/8x0IRA3CBUB+pWEW3J/7N98axqt7SQSm+2fy0FLNXvXGg77xEDC7KHxJlHfLYyi7PDcw==} 169 | peerDependencies: 170 | '@vue/compiler-sfc': 3.x 171 | prettier: 2.x 172 | peerDependenciesMeta: 173 | '@vue/compiler-sfc': 174 | optional: true 175 | dependencies: 176 | '@babel/generator': 7.17.7 177 | '@babel/parser': 7.21.3 178 | '@babel/traverse': 7.17.3 179 | '@babel/types': 7.17.0 180 | javascript-natural-sort: 0.7.1 181 | lodash: 4.17.21 182 | prettier: 2.8.7 183 | transitivePeerDependencies: 184 | - supports-color 185 | dev: true 186 | 187 | /@types/cli-progress/3.11.0: 188 | resolution: {integrity: sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==} 189 | dependencies: 190 | '@types/node': 18.15.3 191 | dev: true 192 | 193 | /@types/flat-cache/2.0.0: 194 | resolution: {integrity: sha512-fHeEsm9hvmZ+QHpw6Fkvf19KIhuqnYLU6vtWLjd5BsMd/qVi7iTkMioDZl0mQmfNRA1A6NwvhrSRNr9hGYZGww==} 195 | dev: true 196 | 197 | /@types/http-cache-semantics/4.0.1: 198 | resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} 199 | dev: false 200 | 201 | /@types/node/18.15.3: 202 | resolution: {integrity: sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==} 203 | dev: true 204 | 205 | /aggregate-error/3.1.0: 206 | resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} 207 | engines: {node: '>=8'} 208 | dependencies: 209 | clean-stack: 2.2.0 210 | indent-string: 4.0.0 211 | dev: true 212 | 213 | /aggregate-error/4.0.1: 214 | resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} 215 | engines: {node: '>=12'} 216 | dependencies: 217 | clean-stack: 4.2.0 218 | indent-string: 5.0.0 219 | dev: false 220 | 221 | /ansi-escapes/4.3.2: 222 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 223 | engines: {node: '>=8'} 224 | dependencies: 225 | type-fest: 0.21.3 226 | dev: true 227 | 228 | /ansi-regex/5.0.1: 229 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 230 | engines: {node: '>=8'} 231 | 232 | /ansi-regex/6.0.1: 233 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 234 | engines: {node: '>=12'} 235 | dev: true 236 | 237 | /ansi-styles/3.2.1: 238 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 239 | engines: {node: '>=4'} 240 | dependencies: 241 | color-convert: 1.9.3 242 | dev: true 243 | 244 | /ansi-styles/4.3.0: 245 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 246 | engines: {node: '>=8'} 247 | dependencies: 248 | color-convert: 2.0.1 249 | dev: true 250 | 251 | /ansi-styles/6.2.1: 252 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 253 | engines: {node: '>=12'} 254 | dev: true 255 | 256 | /array-buffer-byte-length/1.0.0: 257 | resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} 258 | dependencies: 259 | call-bind: 1.0.2 260 | is-array-buffer: 3.0.2 261 | dev: true 262 | 263 | /astral-regex/2.0.0: 264 | resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} 265 | engines: {node: '>=8'} 266 | dev: true 267 | 268 | /available-typed-arrays/1.0.5: 269 | resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} 270 | engines: {node: '>= 0.4'} 271 | dev: true 272 | 273 | /balanced-match/1.0.2: 274 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 275 | 276 | /brace-expansion/1.1.11: 277 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 278 | dependencies: 279 | balanced-match: 1.0.2 280 | concat-map: 0.0.1 281 | 282 | /braces/3.0.2: 283 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 284 | engines: {node: '>=8'} 285 | dependencies: 286 | fill-range: 7.0.1 287 | dev: true 288 | 289 | /cacheable-lookup/7.0.0: 290 | resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} 291 | engines: {node: '>=14.16'} 292 | dev: false 293 | 294 | /cacheable-request/10.2.8: 295 | resolution: {integrity: sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==} 296 | engines: {node: '>=14.16'} 297 | dependencies: 298 | '@types/http-cache-semantics': 4.0.1 299 | get-stream: 6.0.1 300 | http-cache-semantics: 4.1.1 301 | keyv: 4.5.2 302 | mimic-response: 4.0.0 303 | normalize-url: 8.0.0 304 | responselike: 3.0.0 305 | dev: false 306 | 307 | /call-bind/1.0.2: 308 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 309 | dependencies: 310 | function-bind: 1.1.1 311 | get-intrinsic: 1.2.0 312 | dev: true 313 | 314 | /chalk/2.4.2: 315 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 316 | engines: {node: '>=4'} 317 | dependencies: 318 | ansi-styles: 3.2.1 319 | escape-string-regexp: 1.0.5 320 | supports-color: 5.5.0 321 | dev: true 322 | 323 | /chalk/5.2.0: 324 | resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} 325 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 326 | dev: true 327 | 328 | /clean-stack/2.2.0: 329 | resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} 330 | engines: {node: '>=6'} 331 | dev: true 332 | 333 | /clean-stack/4.2.0: 334 | resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} 335 | engines: {node: '>=12'} 336 | dependencies: 337 | escape-string-regexp: 5.0.0 338 | dev: false 339 | 340 | /cli-cursor/3.1.0: 341 | resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} 342 | engines: {node: '>=8'} 343 | dependencies: 344 | restore-cursor: 3.1.0 345 | dev: true 346 | 347 | /cli-progress/3.12.0: 348 | resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} 349 | engines: {node: '>=4'} 350 | dependencies: 351 | string-width: 4.2.3 352 | dev: false 353 | 354 | /cli-truncate/2.1.0: 355 | resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} 356 | engines: {node: '>=8'} 357 | dependencies: 358 | slice-ansi: 3.0.0 359 | string-width: 4.2.3 360 | dev: true 361 | 362 | /cli-truncate/3.1.0: 363 | resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} 364 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 365 | dependencies: 366 | slice-ansi: 5.0.0 367 | string-width: 5.1.2 368 | dev: true 369 | 370 | /color-convert/1.9.3: 371 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 372 | dependencies: 373 | color-name: 1.1.3 374 | dev: true 375 | 376 | /color-convert/2.0.1: 377 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 378 | engines: {node: '>=7.0.0'} 379 | dependencies: 380 | color-name: 1.1.4 381 | dev: true 382 | 383 | /color-name/1.1.3: 384 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 385 | dev: true 386 | 387 | /color-name/1.1.4: 388 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 389 | dev: true 390 | 391 | /colorette/2.0.19: 392 | resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} 393 | dev: true 394 | 395 | /commander/10.0.0: 396 | resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} 397 | engines: {node: '>=14'} 398 | dev: true 399 | 400 | /concat-map/0.0.1: 401 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 402 | 403 | /cross-spawn/6.0.5: 404 | resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} 405 | engines: {node: '>=4.8'} 406 | dependencies: 407 | nice-try: 1.0.5 408 | path-key: 2.0.1 409 | semver: 5.7.1 410 | shebang-command: 1.2.0 411 | which: 1.3.1 412 | dev: true 413 | 414 | /cross-spawn/7.0.3: 415 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 416 | engines: {node: '>= 8'} 417 | dependencies: 418 | path-key: 3.1.1 419 | shebang-command: 2.0.0 420 | which: 2.0.2 421 | dev: true 422 | 423 | /debug/4.3.4: 424 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 425 | engines: {node: '>=6.0'} 426 | peerDependencies: 427 | supports-color: '*' 428 | peerDependenciesMeta: 429 | supports-color: 430 | optional: true 431 | dependencies: 432 | ms: 2.1.2 433 | dev: true 434 | 435 | /decompress-response/6.0.0: 436 | resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 437 | engines: {node: '>=10'} 438 | dependencies: 439 | mimic-response: 3.1.0 440 | dev: false 441 | 442 | /defer-to-connect/2.0.1: 443 | resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} 444 | engines: {node: '>=10'} 445 | dev: false 446 | 447 | /define-properties/1.2.0: 448 | resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} 449 | engines: {node: '>= 0.4'} 450 | dependencies: 451 | has-property-descriptors: 1.0.0 452 | object-keys: 1.1.1 453 | dev: true 454 | 455 | /eastasianwidth/0.2.0: 456 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 457 | dev: true 458 | 459 | /emoji-regex/8.0.0: 460 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 461 | 462 | /emoji-regex/9.2.2: 463 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 464 | dev: true 465 | 466 | /error-ex/1.3.2: 467 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 468 | dependencies: 469 | is-arrayish: 0.2.1 470 | dev: true 471 | 472 | /es-abstract/1.21.2: 473 | resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} 474 | engines: {node: '>= 0.4'} 475 | dependencies: 476 | array-buffer-byte-length: 1.0.0 477 | available-typed-arrays: 1.0.5 478 | call-bind: 1.0.2 479 | es-set-tostringtag: 2.0.1 480 | es-to-primitive: 1.2.1 481 | function.prototype.name: 1.1.5 482 | get-intrinsic: 1.2.0 483 | get-symbol-description: 1.0.0 484 | globalthis: 1.0.3 485 | gopd: 1.0.1 486 | has: 1.0.3 487 | has-property-descriptors: 1.0.0 488 | has-proto: 1.0.1 489 | has-symbols: 1.0.3 490 | internal-slot: 1.0.5 491 | is-array-buffer: 3.0.2 492 | is-callable: 1.2.7 493 | is-negative-zero: 2.0.2 494 | is-regex: 1.1.4 495 | is-shared-array-buffer: 1.0.2 496 | is-string: 1.0.7 497 | is-typed-array: 1.1.10 498 | is-weakref: 1.0.2 499 | object-inspect: 1.12.3 500 | object-keys: 1.1.1 501 | object.assign: 4.1.4 502 | regexp.prototype.flags: 1.4.3 503 | safe-regex-test: 1.0.0 504 | string.prototype.trim: 1.2.7 505 | string.prototype.trimend: 1.0.6 506 | string.prototype.trimstart: 1.0.6 507 | typed-array-length: 1.0.4 508 | unbox-primitive: 1.0.2 509 | which-typed-array: 1.1.9 510 | dev: true 511 | 512 | /es-set-tostringtag/2.0.1: 513 | resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} 514 | engines: {node: '>= 0.4'} 515 | dependencies: 516 | get-intrinsic: 1.2.0 517 | has: 1.0.3 518 | has-tostringtag: 1.0.0 519 | dev: true 520 | 521 | /es-to-primitive/1.2.1: 522 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 523 | engines: {node: '>= 0.4'} 524 | dependencies: 525 | is-callable: 1.2.7 526 | is-date-object: 1.0.5 527 | is-symbol: 1.0.4 528 | dev: true 529 | 530 | /escape-string-regexp/1.0.5: 531 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 532 | engines: {node: '>=0.8.0'} 533 | dev: true 534 | 535 | /escape-string-regexp/5.0.0: 536 | resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 537 | engines: {node: '>=12'} 538 | dev: false 539 | 540 | /execa/7.1.1: 541 | resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} 542 | engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} 543 | dependencies: 544 | cross-spawn: 7.0.3 545 | get-stream: 6.0.1 546 | human-signals: 4.3.1 547 | is-stream: 3.0.0 548 | merge-stream: 2.0.0 549 | npm-run-path: 5.1.0 550 | onetime: 6.0.0 551 | signal-exit: 3.0.7 552 | strip-final-newline: 3.0.0 553 | dev: true 554 | 555 | /fill-range/7.0.1: 556 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 557 | engines: {node: '>=8'} 558 | dependencies: 559 | to-regex-range: 5.0.1 560 | dev: true 561 | 562 | /flat-cache/3.0.4: 563 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 564 | engines: {node: ^10.12.0 || >=12.0.0} 565 | dependencies: 566 | flatted: 3.2.7 567 | rimraf: 3.0.2 568 | dev: false 569 | 570 | /flatted/3.2.7: 571 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 572 | dev: false 573 | 574 | /for-each/0.3.3: 575 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 576 | dependencies: 577 | is-callable: 1.2.7 578 | dev: true 579 | 580 | /form-data-encoder/2.1.4: 581 | resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} 582 | engines: {node: '>= 14.17'} 583 | dev: false 584 | 585 | /fs.realpath/1.0.0: 586 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 587 | dev: false 588 | 589 | /function-bind/1.1.1: 590 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 591 | dev: true 592 | 593 | /function.prototype.name/1.1.5: 594 | resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} 595 | engines: {node: '>= 0.4'} 596 | dependencies: 597 | call-bind: 1.0.2 598 | define-properties: 1.2.0 599 | es-abstract: 1.21.2 600 | functions-have-names: 1.2.3 601 | dev: true 602 | 603 | /functions-have-names/1.2.3: 604 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 605 | dev: true 606 | 607 | /get-intrinsic/1.2.0: 608 | resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} 609 | dependencies: 610 | function-bind: 1.1.1 611 | has: 1.0.3 612 | has-symbols: 1.0.3 613 | dev: true 614 | 615 | /get-stream/6.0.1: 616 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 617 | engines: {node: '>=10'} 618 | 619 | /get-symbol-description/1.0.0: 620 | resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} 621 | engines: {node: '>= 0.4'} 622 | dependencies: 623 | call-bind: 1.0.2 624 | get-intrinsic: 1.2.0 625 | dev: true 626 | 627 | /glob/7.2.3: 628 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 629 | dependencies: 630 | fs.realpath: 1.0.0 631 | inflight: 1.0.6 632 | inherits: 2.0.4 633 | minimatch: 3.1.2 634 | once: 1.4.0 635 | path-is-absolute: 1.0.1 636 | dev: false 637 | 638 | /globals/11.12.0: 639 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 640 | engines: {node: '>=4'} 641 | dev: true 642 | 643 | /globalthis/1.0.3: 644 | resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} 645 | engines: {node: '>= 0.4'} 646 | dependencies: 647 | define-properties: 1.2.0 648 | dev: true 649 | 650 | /gopd/1.0.1: 651 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 652 | dependencies: 653 | get-intrinsic: 1.2.0 654 | dev: true 655 | 656 | /got/12.6.0: 657 | resolution: {integrity: sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==} 658 | engines: {node: '>=14.16'} 659 | dependencies: 660 | '@sindresorhus/is': 5.3.0 661 | '@szmarczak/http-timer': 5.0.1 662 | cacheable-lookup: 7.0.0 663 | cacheable-request: 10.2.8 664 | decompress-response: 6.0.0 665 | form-data-encoder: 2.1.4 666 | get-stream: 6.0.1 667 | http2-wrapper: 2.2.0 668 | lowercase-keys: 3.0.0 669 | p-cancelable: 3.0.0 670 | responselike: 3.0.0 671 | dev: false 672 | 673 | /graceful-fs/4.2.11: 674 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 675 | dev: true 676 | 677 | /has-bigints/1.0.2: 678 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 679 | dev: true 680 | 681 | /has-flag/3.0.0: 682 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 683 | engines: {node: '>=4'} 684 | dev: true 685 | 686 | /has-property-descriptors/1.0.0: 687 | resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} 688 | dependencies: 689 | get-intrinsic: 1.2.0 690 | dev: true 691 | 692 | /has-proto/1.0.1: 693 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 694 | engines: {node: '>= 0.4'} 695 | dev: true 696 | 697 | /has-symbols/1.0.3: 698 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 699 | engines: {node: '>= 0.4'} 700 | dev: true 701 | 702 | /has-tostringtag/1.0.0: 703 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 704 | engines: {node: '>= 0.4'} 705 | dependencies: 706 | has-symbols: 1.0.3 707 | dev: true 708 | 709 | /has/1.0.3: 710 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 711 | engines: {node: '>= 0.4.0'} 712 | dependencies: 713 | function-bind: 1.1.1 714 | dev: true 715 | 716 | /hosted-git-info/2.8.9: 717 | resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 718 | dev: true 719 | 720 | /http-cache-semantics/4.1.1: 721 | resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} 722 | dev: false 723 | 724 | /http2-wrapper/2.2.0: 725 | resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} 726 | engines: {node: '>=10.19.0'} 727 | dependencies: 728 | quick-lru: 5.1.1 729 | resolve-alpn: 1.2.1 730 | dev: false 731 | 732 | /human-signals/4.3.1: 733 | resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} 734 | engines: {node: '>=14.18.0'} 735 | dev: true 736 | 737 | /husky/8.0.3: 738 | resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} 739 | engines: {node: '>=14'} 740 | hasBin: true 741 | dev: true 742 | 743 | /indent-string/4.0.0: 744 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 745 | engines: {node: '>=8'} 746 | dev: true 747 | 748 | /indent-string/5.0.0: 749 | resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} 750 | engines: {node: '>=12'} 751 | dev: false 752 | 753 | /inflight/1.0.6: 754 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 755 | dependencies: 756 | once: 1.4.0 757 | wrappy: 1.0.2 758 | dev: false 759 | 760 | /inherits/2.0.4: 761 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 762 | dev: false 763 | 764 | /internal-slot/1.0.5: 765 | resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} 766 | engines: {node: '>= 0.4'} 767 | dependencies: 768 | get-intrinsic: 1.2.0 769 | has: 1.0.3 770 | side-channel: 1.0.4 771 | dev: true 772 | 773 | /is-array-buffer/3.0.2: 774 | resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} 775 | dependencies: 776 | call-bind: 1.0.2 777 | get-intrinsic: 1.2.0 778 | is-typed-array: 1.1.10 779 | dev: true 780 | 781 | /is-arrayish/0.2.1: 782 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 783 | dev: true 784 | 785 | /is-bigint/1.0.4: 786 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 787 | dependencies: 788 | has-bigints: 1.0.2 789 | dev: true 790 | 791 | /is-boolean-object/1.1.2: 792 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 793 | engines: {node: '>= 0.4'} 794 | dependencies: 795 | call-bind: 1.0.2 796 | has-tostringtag: 1.0.0 797 | dev: true 798 | 799 | /is-callable/1.2.7: 800 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 801 | engines: {node: '>= 0.4'} 802 | dev: true 803 | 804 | /is-core-module/2.11.0: 805 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} 806 | dependencies: 807 | has: 1.0.3 808 | dev: true 809 | 810 | /is-date-object/1.0.5: 811 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 812 | engines: {node: '>= 0.4'} 813 | dependencies: 814 | has-tostringtag: 1.0.0 815 | dev: true 816 | 817 | /is-fullwidth-code-point/3.0.0: 818 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 819 | engines: {node: '>=8'} 820 | 821 | /is-fullwidth-code-point/4.0.0: 822 | resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} 823 | engines: {node: '>=12'} 824 | dev: true 825 | 826 | /is-negative-zero/2.0.2: 827 | resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} 828 | engines: {node: '>= 0.4'} 829 | dev: true 830 | 831 | /is-number-object/1.0.7: 832 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 833 | engines: {node: '>= 0.4'} 834 | dependencies: 835 | has-tostringtag: 1.0.0 836 | dev: true 837 | 838 | /is-number/7.0.0: 839 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 840 | engines: {node: '>=0.12.0'} 841 | dev: true 842 | 843 | /is-regex/1.1.4: 844 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 845 | engines: {node: '>= 0.4'} 846 | dependencies: 847 | call-bind: 1.0.2 848 | has-tostringtag: 1.0.0 849 | dev: true 850 | 851 | /is-shared-array-buffer/1.0.2: 852 | resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} 853 | dependencies: 854 | call-bind: 1.0.2 855 | dev: true 856 | 857 | /is-stream/3.0.0: 858 | resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 859 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 860 | dev: true 861 | 862 | /is-string/1.0.7: 863 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 864 | engines: {node: '>= 0.4'} 865 | dependencies: 866 | has-tostringtag: 1.0.0 867 | dev: true 868 | 869 | /is-symbol/1.0.4: 870 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 871 | engines: {node: '>= 0.4'} 872 | dependencies: 873 | has-symbols: 1.0.3 874 | dev: true 875 | 876 | /is-typed-array/1.1.10: 877 | resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} 878 | engines: {node: '>= 0.4'} 879 | dependencies: 880 | available-typed-arrays: 1.0.5 881 | call-bind: 1.0.2 882 | for-each: 0.3.3 883 | gopd: 1.0.1 884 | has-tostringtag: 1.0.0 885 | dev: true 886 | 887 | /is-weakref/1.0.2: 888 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 889 | dependencies: 890 | call-bind: 1.0.2 891 | dev: true 892 | 893 | /isexe/2.0.0: 894 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 895 | dev: true 896 | 897 | /javascript-natural-sort/0.7.1: 898 | resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} 899 | dev: true 900 | 901 | /js-tokens/4.0.0: 902 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 903 | dev: true 904 | 905 | /jsesc/2.5.2: 906 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 907 | engines: {node: '>=4'} 908 | hasBin: true 909 | dev: true 910 | 911 | /json-buffer/3.0.1: 912 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 913 | dev: false 914 | 915 | /json-parse-better-errors/1.0.2: 916 | resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} 917 | dev: true 918 | 919 | /keyv/4.5.2: 920 | resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} 921 | dependencies: 922 | json-buffer: 3.0.1 923 | dev: false 924 | 925 | /lilconfig/2.1.0: 926 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 927 | engines: {node: '>=10'} 928 | dev: true 929 | 930 | /lint-staged/13.2.0: 931 | resolution: {integrity: sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==} 932 | engines: {node: ^14.13.1 || >=16.0.0} 933 | hasBin: true 934 | dependencies: 935 | chalk: 5.2.0 936 | cli-truncate: 3.1.0 937 | commander: 10.0.0 938 | debug: 4.3.4 939 | execa: 7.1.1 940 | lilconfig: 2.1.0 941 | listr2: 5.0.8 942 | micromatch: 4.0.5 943 | normalize-path: 3.0.0 944 | object-inspect: 1.12.3 945 | pidtree: 0.6.0 946 | string-argv: 0.3.1 947 | yaml: 2.2.1 948 | transitivePeerDependencies: 949 | - enquirer 950 | - supports-color 951 | dev: true 952 | 953 | /listr2/5.0.8: 954 | resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} 955 | engines: {node: ^14.13.1 || >=16.0.0} 956 | peerDependencies: 957 | enquirer: '>= 2.3.0 < 3' 958 | peerDependenciesMeta: 959 | enquirer: 960 | optional: true 961 | dependencies: 962 | cli-truncate: 2.1.0 963 | colorette: 2.0.19 964 | log-update: 4.0.0 965 | p-map: 4.0.0 966 | rfdc: 1.3.0 967 | rxjs: 7.8.0 968 | through: 2.3.8 969 | wrap-ansi: 7.0.0 970 | dev: true 971 | 972 | /load-json-file/4.0.0: 973 | resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} 974 | engines: {node: '>=4'} 975 | dependencies: 976 | graceful-fs: 4.2.11 977 | parse-json: 4.0.0 978 | pify: 3.0.0 979 | strip-bom: 3.0.0 980 | dev: true 981 | 982 | /lodash/4.17.21: 983 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 984 | dev: true 985 | 986 | /log-update/4.0.0: 987 | resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} 988 | engines: {node: '>=10'} 989 | dependencies: 990 | ansi-escapes: 4.3.2 991 | cli-cursor: 3.1.0 992 | slice-ansi: 4.0.0 993 | wrap-ansi: 6.2.0 994 | dev: true 995 | 996 | /lowercase-keys/3.0.0: 997 | resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} 998 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 999 | dev: false 1000 | 1001 | /memorystream/0.3.1: 1002 | resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} 1003 | engines: {node: '>= 0.10.0'} 1004 | dev: true 1005 | 1006 | /merge-stream/2.0.0: 1007 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1008 | dev: true 1009 | 1010 | /micromatch/4.0.5: 1011 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1012 | engines: {node: '>=8.6'} 1013 | dependencies: 1014 | braces: 3.0.2 1015 | picomatch: 2.3.1 1016 | dev: true 1017 | 1018 | /mimic-fn/2.1.0: 1019 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1020 | engines: {node: '>=6'} 1021 | dev: true 1022 | 1023 | /mimic-fn/4.0.0: 1024 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 1025 | engines: {node: '>=12'} 1026 | 1027 | /mimic-response/3.1.0: 1028 | resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 1029 | engines: {node: '>=10'} 1030 | dev: false 1031 | 1032 | /mimic-response/4.0.0: 1033 | resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} 1034 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1035 | dev: false 1036 | 1037 | /minimatch/3.1.2: 1038 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1039 | dependencies: 1040 | brace-expansion: 1.1.11 1041 | 1042 | /ms/2.1.2: 1043 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1044 | dev: true 1045 | 1046 | /nice-try/1.0.5: 1047 | resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} 1048 | dev: true 1049 | 1050 | /normalize-package-data/2.5.0: 1051 | resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 1052 | dependencies: 1053 | hosted-git-info: 2.8.9 1054 | resolve: 1.22.1 1055 | semver: 5.7.1 1056 | validate-npm-package-license: 3.0.4 1057 | dev: true 1058 | 1059 | /normalize-path/3.0.0: 1060 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1061 | engines: {node: '>=0.10.0'} 1062 | dev: true 1063 | 1064 | /normalize-url/8.0.0: 1065 | resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} 1066 | engines: {node: '>=14.16'} 1067 | dev: false 1068 | 1069 | /npm-run-all/4.1.5: 1070 | resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} 1071 | engines: {node: '>= 4'} 1072 | hasBin: true 1073 | dependencies: 1074 | ansi-styles: 3.2.1 1075 | chalk: 2.4.2 1076 | cross-spawn: 6.0.5 1077 | memorystream: 0.3.1 1078 | minimatch: 3.1.2 1079 | pidtree: 0.3.1 1080 | read-pkg: 3.0.0 1081 | shell-quote: 1.8.0 1082 | string.prototype.padend: 3.1.4 1083 | dev: true 1084 | 1085 | /npm-run-path/5.1.0: 1086 | resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} 1087 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1088 | dependencies: 1089 | path-key: 4.0.0 1090 | dev: true 1091 | 1092 | /object-inspect/1.12.3: 1093 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 1094 | dev: true 1095 | 1096 | /object-keys/1.1.1: 1097 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1098 | engines: {node: '>= 0.4'} 1099 | dev: true 1100 | 1101 | /object.assign/4.1.4: 1102 | resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} 1103 | engines: {node: '>= 0.4'} 1104 | dependencies: 1105 | call-bind: 1.0.2 1106 | define-properties: 1.2.0 1107 | has-symbols: 1.0.3 1108 | object-keys: 1.1.1 1109 | dev: true 1110 | 1111 | /once/1.4.0: 1112 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1113 | dependencies: 1114 | wrappy: 1.0.2 1115 | dev: false 1116 | 1117 | /onetime/5.1.2: 1118 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1119 | engines: {node: '>=6'} 1120 | dependencies: 1121 | mimic-fn: 2.1.0 1122 | dev: true 1123 | 1124 | /onetime/6.0.0: 1125 | resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 1126 | engines: {node: '>=12'} 1127 | dependencies: 1128 | mimic-fn: 4.0.0 1129 | dev: true 1130 | 1131 | /p-cancelable/3.0.0: 1132 | resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} 1133 | engines: {node: '>=12.20'} 1134 | dev: false 1135 | 1136 | /p-map/4.0.0: 1137 | resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} 1138 | engines: {node: '>=10'} 1139 | dependencies: 1140 | aggregate-error: 3.1.0 1141 | dev: true 1142 | 1143 | /p-map/5.5.0: 1144 | resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} 1145 | engines: {node: '>=12'} 1146 | dependencies: 1147 | aggregate-error: 4.0.1 1148 | dev: false 1149 | 1150 | /p-memoize/7.1.1: 1151 | resolution: {integrity: sha512-DZ/bONJILHkQ721hSr/E9wMz5Am/OTJ9P6LhLFo2Tu+jL8044tgc9LwHO8g4PiaYePnlVVRAJcKmgy8J9MVFrA==} 1152 | engines: {node: '>=14.16'} 1153 | dependencies: 1154 | mimic-fn: 4.0.0 1155 | type-fest: 3.7.0 1156 | dev: false 1157 | 1158 | /papaparse/5.4.1: 1159 | resolution: {integrity: sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==} 1160 | dev: false 1161 | 1162 | /parse-json/4.0.0: 1163 | resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} 1164 | engines: {node: '>=4'} 1165 | dependencies: 1166 | error-ex: 1.3.2 1167 | json-parse-better-errors: 1.0.2 1168 | dev: true 1169 | 1170 | /path-is-absolute/1.0.1: 1171 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1172 | engines: {node: '>=0.10.0'} 1173 | dev: false 1174 | 1175 | /path-key/2.0.1: 1176 | resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} 1177 | engines: {node: '>=4'} 1178 | dev: true 1179 | 1180 | /path-key/3.1.1: 1181 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1182 | engines: {node: '>=8'} 1183 | dev: true 1184 | 1185 | /path-key/4.0.0: 1186 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 1187 | engines: {node: '>=12'} 1188 | dev: true 1189 | 1190 | /path-parse/1.0.7: 1191 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1192 | dev: true 1193 | 1194 | /path-type/3.0.0: 1195 | resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} 1196 | engines: {node: '>=4'} 1197 | dependencies: 1198 | pify: 3.0.0 1199 | dev: true 1200 | 1201 | /picomatch/2.3.1: 1202 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1203 | engines: {node: '>=8.6'} 1204 | dev: true 1205 | 1206 | /pidtree/0.3.1: 1207 | resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} 1208 | engines: {node: '>=0.10'} 1209 | hasBin: true 1210 | dev: true 1211 | 1212 | /pidtree/0.6.0: 1213 | resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} 1214 | engines: {node: '>=0.10'} 1215 | hasBin: true 1216 | dev: true 1217 | 1218 | /pify/3.0.0: 1219 | resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} 1220 | engines: {node: '>=4'} 1221 | dev: true 1222 | 1223 | /prettier/2.8.7: 1224 | resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} 1225 | engines: {node: '>=10.13.0'} 1226 | hasBin: true 1227 | dev: true 1228 | 1229 | /quick-lru/5.1.1: 1230 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 1231 | engines: {node: '>=10'} 1232 | dev: false 1233 | 1234 | /read-pkg/3.0.0: 1235 | resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} 1236 | engines: {node: '>=4'} 1237 | dependencies: 1238 | load-json-file: 4.0.0 1239 | normalize-package-data: 2.5.0 1240 | path-type: 3.0.0 1241 | dev: true 1242 | 1243 | /regexp.prototype.flags/1.4.3: 1244 | resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} 1245 | engines: {node: '>= 0.4'} 1246 | dependencies: 1247 | call-bind: 1.0.2 1248 | define-properties: 1.2.0 1249 | functions-have-names: 1.2.3 1250 | dev: true 1251 | 1252 | /resolve-alpn/1.2.1: 1253 | resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} 1254 | dev: false 1255 | 1256 | /resolve/1.22.1: 1257 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 1258 | hasBin: true 1259 | dependencies: 1260 | is-core-module: 2.11.0 1261 | path-parse: 1.0.7 1262 | supports-preserve-symlinks-flag: 1.0.0 1263 | dev: true 1264 | 1265 | /responselike/3.0.0: 1266 | resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} 1267 | engines: {node: '>=14.16'} 1268 | dependencies: 1269 | lowercase-keys: 3.0.0 1270 | dev: false 1271 | 1272 | /restore-cursor/3.1.0: 1273 | resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} 1274 | engines: {node: '>=8'} 1275 | dependencies: 1276 | onetime: 5.1.2 1277 | signal-exit: 3.0.7 1278 | dev: true 1279 | 1280 | /rfdc/1.3.0: 1281 | resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} 1282 | dev: true 1283 | 1284 | /rimraf/3.0.2: 1285 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1286 | hasBin: true 1287 | dependencies: 1288 | glob: 7.2.3 1289 | dev: false 1290 | 1291 | /rxjs/7.8.0: 1292 | resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} 1293 | dependencies: 1294 | tslib: 2.5.0 1295 | dev: true 1296 | 1297 | /safe-regex-test/1.0.0: 1298 | resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} 1299 | dependencies: 1300 | call-bind: 1.0.2 1301 | get-intrinsic: 1.2.0 1302 | is-regex: 1.1.4 1303 | dev: true 1304 | 1305 | /semver/5.7.1: 1306 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 1307 | hasBin: true 1308 | dev: true 1309 | 1310 | /shebang-command/1.2.0: 1311 | resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} 1312 | engines: {node: '>=0.10.0'} 1313 | dependencies: 1314 | shebang-regex: 1.0.0 1315 | dev: true 1316 | 1317 | /shebang-command/2.0.0: 1318 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1319 | engines: {node: '>=8'} 1320 | dependencies: 1321 | shebang-regex: 3.0.0 1322 | dev: true 1323 | 1324 | /shebang-regex/1.0.0: 1325 | resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} 1326 | engines: {node: '>=0.10.0'} 1327 | dev: true 1328 | 1329 | /shebang-regex/3.0.0: 1330 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1331 | engines: {node: '>=8'} 1332 | dev: true 1333 | 1334 | /shell-quote/1.8.0: 1335 | resolution: {integrity: sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==} 1336 | dev: true 1337 | 1338 | /side-channel/1.0.4: 1339 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1340 | dependencies: 1341 | call-bind: 1.0.2 1342 | get-intrinsic: 1.2.0 1343 | object-inspect: 1.12.3 1344 | dev: true 1345 | 1346 | /signal-exit/3.0.7: 1347 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1348 | dev: true 1349 | 1350 | /slice-ansi/3.0.0: 1351 | resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} 1352 | engines: {node: '>=8'} 1353 | dependencies: 1354 | ansi-styles: 4.3.0 1355 | astral-regex: 2.0.0 1356 | is-fullwidth-code-point: 3.0.0 1357 | dev: true 1358 | 1359 | /slice-ansi/4.0.0: 1360 | resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} 1361 | engines: {node: '>=10'} 1362 | dependencies: 1363 | ansi-styles: 4.3.0 1364 | astral-regex: 2.0.0 1365 | is-fullwidth-code-point: 3.0.0 1366 | dev: true 1367 | 1368 | /slice-ansi/5.0.0: 1369 | resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} 1370 | engines: {node: '>=12'} 1371 | dependencies: 1372 | ansi-styles: 6.2.1 1373 | is-fullwidth-code-point: 4.0.0 1374 | dev: true 1375 | 1376 | /source-map/0.5.7: 1377 | resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} 1378 | engines: {node: '>=0.10.0'} 1379 | dev: true 1380 | 1381 | /spdx-correct/3.2.0: 1382 | resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} 1383 | dependencies: 1384 | spdx-expression-parse: 3.0.1 1385 | spdx-license-ids: 3.0.13 1386 | dev: true 1387 | 1388 | /spdx-exceptions/2.3.0: 1389 | resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} 1390 | dev: true 1391 | 1392 | /spdx-expression-parse/3.0.1: 1393 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 1394 | dependencies: 1395 | spdx-exceptions: 2.3.0 1396 | spdx-license-ids: 3.0.13 1397 | dev: true 1398 | 1399 | /spdx-license-ids/3.0.13: 1400 | resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} 1401 | dev: true 1402 | 1403 | /string-argv/0.3.1: 1404 | resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} 1405 | engines: {node: '>=0.6.19'} 1406 | dev: true 1407 | 1408 | /string-width/4.2.3: 1409 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1410 | engines: {node: '>=8'} 1411 | dependencies: 1412 | emoji-regex: 8.0.0 1413 | is-fullwidth-code-point: 3.0.0 1414 | strip-ansi: 6.0.1 1415 | 1416 | /string-width/5.1.2: 1417 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1418 | engines: {node: '>=12'} 1419 | dependencies: 1420 | eastasianwidth: 0.2.0 1421 | emoji-regex: 9.2.2 1422 | strip-ansi: 7.0.1 1423 | dev: true 1424 | 1425 | /string.prototype.padend/3.1.4: 1426 | resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} 1427 | engines: {node: '>= 0.4'} 1428 | dependencies: 1429 | call-bind: 1.0.2 1430 | define-properties: 1.2.0 1431 | es-abstract: 1.21.2 1432 | dev: true 1433 | 1434 | /string.prototype.trim/1.2.7: 1435 | resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} 1436 | engines: {node: '>= 0.4'} 1437 | dependencies: 1438 | call-bind: 1.0.2 1439 | define-properties: 1.2.0 1440 | es-abstract: 1.21.2 1441 | dev: true 1442 | 1443 | /string.prototype.trimend/1.0.6: 1444 | resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} 1445 | dependencies: 1446 | call-bind: 1.0.2 1447 | define-properties: 1.2.0 1448 | es-abstract: 1.21.2 1449 | dev: true 1450 | 1451 | /string.prototype.trimstart/1.0.6: 1452 | resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} 1453 | dependencies: 1454 | call-bind: 1.0.2 1455 | define-properties: 1.2.0 1456 | es-abstract: 1.21.2 1457 | dev: true 1458 | 1459 | /strip-ansi/6.0.1: 1460 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1461 | engines: {node: '>=8'} 1462 | dependencies: 1463 | ansi-regex: 5.0.1 1464 | 1465 | /strip-ansi/7.0.1: 1466 | resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} 1467 | engines: {node: '>=12'} 1468 | dependencies: 1469 | ansi-regex: 6.0.1 1470 | dev: true 1471 | 1472 | /strip-bom/3.0.0: 1473 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1474 | engines: {node: '>=4'} 1475 | dev: true 1476 | 1477 | /strip-final-newline/3.0.0: 1478 | resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 1479 | engines: {node: '>=12'} 1480 | dev: true 1481 | 1482 | /supports-color/5.5.0: 1483 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1484 | engines: {node: '>=4'} 1485 | dependencies: 1486 | has-flag: 3.0.0 1487 | dev: true 1488 | 1489 | /supports-preserve-symlinks-flag/1.0.0: 1490 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1491 | engines: {node: '>= 0.4'} 1492 | dev: true 1493 | 1494 | /through/2.3.8: 1495 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 1496 | dev: true 1497 | 1498 | /to-fast-properties/2.0.0: 1499 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1500 | engines: {node: '>=4'} 1501 | dev: true 1502 | 1503 | /to-regex-range/5.0.1: 1504 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1505 | engines: {node: '>=8.0'} 1506 | dependencies: 1507 | is-number: 7.0.0 1508 | dev: true 1509 | 1510 | /tslib/2.5.0: 1511 | resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} 1512 | dev: true 1513 | 1514 | /type-fest/0.21.3: 1515 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 1516 | engines: {node: '>=10'} 1517 | dev: true 1518 | 1519 | /type-fest/3.7.0: 1520 | resolution: {integrity: sha512-A2qUJ/j8vkKIT+UorxayZjFJoEdNkIPZkjOJSWezoAbRQd7QEhnz2iJlfVy4Or0GuEnCXts5cNorQNUvdLkaSQ==} 1521 | engines: {node: '>=14.16'} 1522 | dev: false 1523 | 1524 | /typed-array-length/1.0.4: 1525 | resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} 1526 | dependencies: 1527 | call-bind: 1.0.2 1528 | for-each: 0.3.3 1529 | is-typed-array: 1.1.10 1530 | dev: true 1531 | 1532 | /typescript/4.9.5: 1533 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 1534 | engines: {node: '>=4.2.0'} 1535 | hasBin: true 1536 | dev: true 1537 | 1538 | /unbox-primitive/1.0.2: 1539 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 1540 | dependencies: 1541 | call-bind: 1.0.2 1542 | has-bigints: 1.0.2 1543 | has-symbols: 1.0.3 1544 | which-boxed-primitive: 1.0.2 1545 | dev: true 1546 | 1547 | /validate-npm-package-license/3.0.4: 1548 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1549 | dependencies: 1550 | spdx-correct: 3.2.0 1551 | spdx-expression-parse: 3.0.1 1552 | dev: true 1553 | 1554 | /which-boxed-primitive/1.0.2: 1555 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 1556 | dependencies: 1557 | is-bigint: 1.0.4 1558 | is-boolean-object: 1.1.2 1559 | is-number-object: 1.0.7 1560 | is-string: 1.0.7 1561 | is-symbol: 1.0.4 1562 | dev: true 1563 | 1564 | /which-typed-array/1.1.9: 1565 | resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} 1566 | engines: {node: '>= 0.4'} 1567 | dependencies: 1568 | available-typed-arrays: 1.0.5 1569 | call-bind: 1.0.2 1570 | for-each: 0.3.3 1571 | gopd: 1.0.1 1572 | has-tostringtag: 1.0.0 1573 | is-typed-array: 1.1.10 1574 | dev: true 1575 | 1576 | /which/1.3.1: 1577 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 1578 | hasBin: true 1579 | dependencies: 1580 | isexe: 2.0.0 1581 | dev: true 1582 | 1583 | /which/2.0.2: 1584 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1585 | engines: {node: '>= 8'} 1586 | hasBin: true 1587 | dependencies: 1588 | isexe: 2.0.0 1589 | dev: true 1590 | 1591 | /wrap-ansi/6.2.0: 1592 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} 1593 | engines: {node: '>=8'} 1594 | dependencies: 1595 | ansi-styles: 4.3.0 1596 | string-width: 4.2.3 1597 | strip-ansi: 6.0.1 1598 | dev: true 1599 | 1600 | /wrap-ansi/7.0.0: 1601 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1602 | engines: {node: '>=10'} 1603 | dependencies: 1604 | ansi-styles: 4.3.0 1605 | string-width: 4.2.3 1606 | strip-ansi: 6.0.1 1607 | dev: true 1608 | 1609 | /wrappy/1.0.2: 1610 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1611 | dev: false 1612 | 1613 | /yaml/2.2.1: 1614 | resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} 1615 | engines: {node: '>= 14'} 1616 | dev: true 1617 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 |

ChatGPT Well-Known Plugin Finder

2 | 3 |

4 | Checks Alexa's top 1M websites for the presence of OpenAI's new `/.well-known/ai-plugin.json` files. 5 |

6 | 7 |

8 | Build Status 9 | MIT License 10 | Prettier Code Formatting 11 |

12 | 13 | - [Usage](#usage) 14 | - [Results](#results) 15 | - [License](#license) 16 | 17 | ## Usage 18 | 19 | Download the top 1M CSV file from Alexa [here](https://s3.amazonaws.com/alexa-static/top-1m.csv.zip) or [here](https://s3-us-west-1.amazonaws.com/umbrella-static/index.html). Unzip the file to `top-1m.csv` in this directory. 20 | 21 | ``` 22 | pnpm install 23 | npx tsx src/index.ts 24 | ``` 25 | 26 | ## Results 27 | 28 | After deduping plugins and subdomains that point to the same plugin, the following OpenAI-compatible well-known AI plugins were found: 29 | 30 | ```json 31 | [ 32 | "slack.com", 33 | "klarna.com", 34 | "zapier.com", 35 | "pricerunner.se", 36 | "server.shop.app", 37 | "wolframalpha.com", 38 | "wolframcloud.com" 39 | ] 40 | ``` 41 | 42 | Full results can be found in `./ai-plugins-unique.json`. 43 | 44 | **These results are as of March 25, 2023**. I anticipate that this list will grow quickly over time. 45 | 46 | Additional known plugins include: 47 | 48 | ```json 49 | ["api.speak.com", "x6lq6i-5001.csb.app", "datasette.io", "www.joinmilo.com"] 50 | ``` 51 | 52 | ## License 53 | 54 | MIT © [Travis Fischer](https://transitivebullsh.it) 55 | 56 | If you found this project interesting, please consider [sponsoring me](https://github.com/sponsors/transitive-bullshit) or following me on twitter twitter 57 | -------------------------------------------------------------------------------- /src/got.ts: -------------------------------------------------------------------------------- 1 | import got from 'got' 2 | 3 | const USER_AGENT = 4 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' 5 | 6 | export default got.extend({ 7 | headers: { 8 | 'user-agent': USER_AGENT 9 | } 10 | }) 11 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'node:fs/promises' 2 | 3 | import cliProgress from 'cli-progress' 4 | import flatCache from 'flat-cache' 5 | import pMap from 'p-map' 6 | import pMemoize from 'p-memoize' 7 | import papaparse from 'papaparse' 8 | 9 | import * as utils from './utils' 10 | import got from './got' 11 | 12 | const cache = flatCache.load('well-known-ai-plugins-by-domain') 13 | 14 | const getAIPluginMetadataForDomain = pMemoize( 15 | getAIPluginMetadataForDomainImpl, 16 | { 17 | cache: { 18 | get: (key: string) => { 19 | return cache.getKey(key) 20 | }, 21 | set: (key: string, value) => { 22 | cache.setKey(key, value) 23 | }, 24 | has: (key: string) => { 25 | return cache.getKey(key) !== undefined 26 | }, 27 | delete: (key: string) => { 28 | return cache.removeKey(key) 29 | } 30 | } 31 | } 32 | ) 33 | 34 | async function main() { 35 | const topNDomains = 1000000 36 | const parsed = papaparse.parse(await fs.readFile('top-1m.csv', 'utf-8')) 37 | const domains: string[] = parsed.data 38 | .map((row) => row[1]) 39 | .slice(0, topNDomains) 40 | console.log(domains) 41 | 42 | const progressBar = new cliProgress.SingleBar( 43 | { 44 | hideCursor: true 45 | }, 46 | cliProgress.Presets.shades_classic 47 | ) 48 | 49 | let aiPlugins: Record = {} 50 | try { 51 | aiPlugins = await utils.readJson('ai-plugins.json') 52 | } catch (err) {} 53 | 54 | progressBar.start(domains.length, 0) 55 | let maxIndex = 0 56 | await pMap( 57 | domains, 58 | async (domain, index) => { 59 | if (index > maxIndex) { 60 | maxIndex = index 61 | progressBar.update(maxIndex + 1) 62 | } 63 | 64 | const res = await getAIPluginMetadataForDomain(domain) 65 | if (res) { 66 | // save the plugins every time we find a new one 67 | aiPlugins[domain] = res 68 | await utils.writeJson('ai-plugins.json', aiPlugins) 69 | } 70 | 71 | if (index % 10000 === 0) { 72 | cache.save(true) 73 | } 74 | }, 75 | { concurrency: 128 } 76 | ) 77 | 78 | progressBar.stop() 79 | console.log(`\nfound ${Object.keys(aiPlugins).length} plugins\n`) 80 | console.log(aiPlugins) 81 | console.log(`\nfound ${Object.keys(aiPlugins).length} plugins\n`) 82 | 83 | await utils.writeJson('ai-plugins.json', aiPlugins) 84 | cache.save(true) 85 | } 86 | 87 | async function getAIPluginMetadataForDomainImpl(domain: string): Promise { 88 | try { 89 | const url = `https://${domain}/.well-known/ai-plugin.json` 90 | const parsedUrl = new URL(url) 91 | const res: any = await got(url, { 92 | timeout: { 93 | request: 10000 94 | } 95 | }).json() 96 | 97 | if (!res || res.status === 404 || res.status === '404') { 98 | return null 99 | } 100 | if (!res.description_for_model || !res.api) { 101 | return null 102 | } 103 | 104 | return res 105 | } catch (err) { 106 | return null 107 | } 108 | } 109 | 110 | main().catch((err) => { 111 | console.error('error', err) 112 | process.exit(1) 113 | }) 114 | -------------------------------------------------------------------------------- /src/process.ts: -------------------------------------------------------------------------------- 1 | import * as utils from './utils' 2 | 3 | async function main() { 4 | const aiPlugins: Record = await utils.readJson('ai-plugins.json') 5 | const keys = Object.keys(aiPlugins).sort((a, b) => a.length - b.length) 6 | const t = new Set() 7 | const k = keys.filter((key, i) => { 8 | const v = aiPlugins[key] 9 | if (!v) return false 10 | const name = v.name_for_model?.toLowerCase() 11 | 12 | if (!name) return false 13 | if (t.has(name)) return false 14 | t.add(name) 15 | 16 | return true 17 | }) 18 | const plugins: Record = {} 19 | for (const key of k) { 20 | plugins[key] = aiPlugins[key] 21 | } 22 | 23 | console.log(plugins) 24 | console.log( 25 | `\nfound ${Object.keys(plugins).length} plugins (${ 26 | Object.keys(aiPlugins).length 27 | } total)\n` 28 | ) 29 | 30 | await utils.writeJson('ai-plugins-unique.json', plugins) 31 | } 32 | 33 | main().catch((err) => { 34 | console.error('error', err) 35 | process.exit(1) 36 | }) 37 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs/promises' 2 | 3 | export async function readJson(filePath: string): Promise { 4 | return JSON.parse(await fs.readFile(filePath, 'utf-8')) 5 | } 6 | 7 | export async function writeJson(filePath: string, json: T) { 8 | return fs.writeFile(filePath, JSON.stringify(json, null, 2), 'utf-8') 9 | } 10 | 11 | export function pick(obj: T, ...keys: string[]): U { 12 | return Object.fromEntries( 13 | keys.filter((key) => key in obj).map((key) => [key, obj[key]]) 14 | ) as U 15 | } 16 | 17 | export function omit(obj: T, ...keys: string[]): U { 18 | return Object.fromEntries( 19 | Object.entries(obj).filter(([key]) => !keys.includes(key)) 20 | ) as U 21 | } 22 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": false, 8 | "strictNullChecks": false, 9 | "forceConsistentCasingInFileNames": true, 10 | "noEmit": true, 11 | "esModuleInterop": true, 12 | "module": "esnext", 13 | "moduleResolution": "node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "jsx": "preserve", 17 | "incremental": true, 18 | "paths": { 19 | "@/*": ["./*"] 20 | } 21 | }, 22 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 23 | "exclude": ["node_modules"] 24 | } 25 | --------------------------------------------------------------------------------