├── .gitignore ├── screenshot.png ├── .env.sample ├── src ├── commands │ ├── retryCmd.ts │ ├── exitCmd.ts │ ├── usageCmd.ts │ ├── settingsCmd.ts │ ├── helpCmd.ts │ ├── modelsCmd.ts │ ├── copyCmd.ts │ └── commands.ts ├── global.d.ts ├── openai │ ├── conversation.ts │ ├── models.ts │ ├── response.ts │ └── openai.ts ├── cli.ts ├── validate.ts ├── utils.ts ├── loop.ts ├── usage.ts └── settings.ts ├── tsconfig.json ├── .eslintrc.json ├── package.json ├── README.md └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | !.env.sample 4 | dist -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jschuur/chatgpt-repl/HEAD/screenshot.png -------------------------------------------------------------------------------- /.env.sample: -------------------------------------------------------------------------------- 1 | CHATGPTREPL_APIKEY= 2 | CHATGPTREPL_MAXTOKENS= 3 | CHATGPTREPL_USD_PRICE_PER_TOKEN= -------------------------------------------------------------------------------- /src/commands/retryCmd.ts: -------------------------------------------------------------------------------- 1 | import { conversation } from '../openai/conversation.js'; 2 | 3 | export default function retryCmd() { 4 | if (conversation.length < 3) console.warn('No previous response to retry.'); 5 | else return conversation[conversation.length - 2]?.content; 6 | } 7 | -------------------------------------------------------------------------------- /src/commands/exitCmd.ts: -------------------------------------------------------------------------------- 1 | import { formatTotalUsage } from '../usage.js'; 2 | import { clearLine } from '../utils.js'; 3 | 4 | export default function exitCmd() { 5 | const totalUsage = formatTotalUsage(); 6 | 7 | clearLine(); 8 | console.log('See you next time! 🤖\n'); 9 | console.log(totalUsage); 10 | 11 | process.exit(0); 12 | } 13 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES6", 4 | "module": "Node16", 5 | "esModuleInterop": true, 6 | "forceConsistentCasingInFileNames": true, 7 | "strict": true, 8 | "skipLibCheck": true, 9 | "rootDir": "./src", 10 | "outDir": "./dist" 11 | }, 12 | "include": ["src/**/*.ts"], 13 | "exclude": ["node_modules"] 14 | } 15 | -------------------------------------------------------------------------------- /src/commands/usageCmd.ts: -------------------------------------------------------------------------------- 1 | import pc from 'picocolors'; 2 | 3 | import { apiKey } from '../openai/openai.js'; 4 | import { formatTotalUsage } from '../usage.js'; 5 | 6 | export default function usageCmd() { 7 | console.log( 8 | `\n${pc.green(`Usage for current API Key (...${pc.dim((apiKey || '').slice(-6))}):`)}\n` 9 | ); 10 | console.log(formatTotalUsage()); 11 | console.log(); 12 | } 13 | -------------------------------------------------------------------------------- /src/commands/settingsCmd.ts: -------------------------------------------------------------------------------- 1 | import pc from 'picocolors'; 2 | 3 | import { indentPadding, settings } from '../settings.js'; 4 | 5 | export default function settingsCmd(str: string) { 6 | console.log(`\n${pc.green(str || 'Current settings:')}\n`); 7 | 8 | for (const [key, value] of Object.entries(settings)) 9 | console.log(` ${key.toLowerCase().padEnd(indentPadding + 1)} ${pc.dim(String(value))}`); 10 | 11 | console.log(); 12 | } 13 | -------------------------------------------------------------------------------- /src/commands/helpCmd.ts: -------------------------------------------------------------------------------- 1 | import pc from 'picocolors'; 2 | 3 | import { indentPadding } from '../settings.js'; 4 | import { COMMAND_PREFIX, commandList } from './commands.js'; 5 | 6 | export default function helpCmd() { 7 | console.log(`\n${pc.green('Available commands')}:\n`); 8 | for (const [command, [description]] of Object.entries(commandList)) { 9 | console.log(` ${COMMAND_PREFIX}${command.padEnd(indentPadding)} ${pc.dim(description)}`); 10 | } 11 | 12 | console.log(); 13 | } 14 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es2021": true, 4 | "node": true 5 | }, 6 | "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], 7 | "parser": "@typescript-eslint/parser", 8 | "plugins": ["@typescript-eslint"], 9 | "root": true, 10 | "parserOptions": { 11 | "ecmaVersion": "latest", 12 | "sourceType": "module" 13 | }, 14 | "rules": { 15 | "@typescript-eslint/no-explicit-any": "off", 16 | "linebreak-style": ["error", "unix"], 17 | "semi": ["error", "always"], 18 | "quotes": ["error", "single"] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/global.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'wordcount'; 2 | declare module 'node-clipboardy'; 3 | declare module 'picocolors'; 4 | declare module 'streamed-chatgpt-api'; 5 | 6 | declare namespace NodeJS { 7 | export interface ProcessEnv { 8 | NODE_ENV: string; 9 | CHATGPTREPL_USD_PRICE_PER_TOKEN: string; 10 | CHATGPTREPL_APIKEY: string; 11 | CHATGPTREPL_MAXTOKENS: string; 12 | CHATGPTREPL_CONVERSATIONLENGTH: string; 13 | CHATGPTREPL_HISTORY: string; 14 | CHATGPTREPL_HISTORYSIZE: string; 15 | CHATGPTREPL_HISTORYFILE: string; 16 | CHATGPTREPL_TEMPERATURE: string; 17 | CHATGPTREPL_MODEL: string; 18 | CHATGPTREPL_SYSTEM: string; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/commands/modelsCmd.ts: -------------------------------------------------------------------------------- 1 | import pc from 'picocolors'; 2 | 3 | import { chatCompletionModels, lastUpdated, updateModelList } from '../openai/models.js'; 4 | import { settings } from '../settings.js'; 5 | 6 | export default async function modelsCmd(subcommand: string) { 7 | if (subcommand === 'update') await updateModelList(); 8 | 9 | console.log('\nSupported ChatGPT models:\n'); 10 | 11 | chatCompletionModels.forEach((model) => 12 | console.log(settings.model === model ? pc.magenta(` ${model} (selected)`) : ` ${model}`) 13 | ); 14 | 15 | console.log( 16 | `\nLocal models list last updated ${pc.magenta( 17 | new Date(lastUpdated).toLocaleString() 18 | )}. Run '.models update' to force an update.\n` 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/commands/copyCmd.ts: -------------------------------------------------------------------------------- 1 | import clipboard from 'node-clipboardy'; 2 | import pc from 'picocolors'; 3 | import pluralize from 'pluralize'; 4 | import wordcount from 'wordcount'; 5 | 6 | import { conversation } from '../openai/conversation.js'; 7 | 8 | export default function copyLastResultCmd() { 9 | const lastMessage = conversation[conversation.length - 1]; 10 | const wordCount = wordcount(lastMessage?.content || ''); 11 | const characterCount = (lastMessage?.content || '').length; 12 | 13 | if (conversation.length < 3) console.warn('No previous response to copy.'); 14 | else if (lastMessage?.role === 'assistant') { 15 | clipboard.writeSync(lastMessage.content); 16 | 17 | console.log( 18 | `Last response (${pluralize('word', wordCount, true)}, ${pluralize( 19 | 'character', 20 | characterCount, 21 | true 22 | )}) copied to clipboard.` 23 | ); 24 | } else { 25 | console.error(`${pc.red('Error')}: Unable to copy last response copied to clipboard.`); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/openai/conversation.ts: -------------------------------------------------------------------------------- 1 | import { settings, updateSetting } from '../settings.js'; 2 | 3 | type ConversationRole = 'system' | 'user' | 'assistant'; 4 | 5 | type Conversation = { 6 | role: ConversationRole; 7 | content: string; 8 | }[]; 9 | 10 | export let conversation: Conversation = [{ role: 'system', content: settings.system }]; 11 | 12 | export function updateConversation({ role, content }: { role: ConversationRole; content: string }) { 13 | const { conversationLength } = settings; 14 | 15 | if (role === 'system') { 16 | updateSetting('system', content); 17 | clearConversation(false); 18 | } else { 19 | conversation.push({ role, content }); 20 | 21 | if (role === 'assistant') 22 | conversation = 23 | conversationLength <= 0 24 | ? [conversation[0]] 25 | : [conversation[0], ...conversation.slice(1).slice(-(2 * conversationLength))]; 26 | } 27 | } 28 | 29 | export function clearConversation(announce = true) { 30 | conversation = [{ role: 'system', content: settings.system }]; 31 | 32 | if (announce) console.log('Current conversation history cleared.'); 33 | } 34 | -------------------------------------------------------------------------------- /src/cli.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import 'dotenv/config'; 4 | import pc from 'picocolors'; 5 | import updateNotifier from 'update-notifier'; 6 | 7 | import { COMMAND_PREFIX } from './commands/commands.js'; 8 | import { chatLoop } from './loop.js'; 9 | import { modelListCheck } from './openai/models.js'; 10 | import { apiKeyCheck } from './openai/openai.js'; 11 | import { packageJson, settings } from './settings.js'; 12 | import { getErrorMessage } from './utils.js'; 13 | 14 | function showHeader() { 15 | console.log( 16 | `ChatGPT REPL v${packageJson.version} (model: ${pc.magenta( 17 | settings.model 18 | )}, max tokens: ${pc.magenta(settings.maxTokens)})` 19 | ); 20 | console.log( 21 | pc.dim(`Ctrl-C or ${COMMAND_PREFIX}exit to exit, ${COMMAND_PREFIX}help for more commands\n`) 22 | ); 23 | } 24 | 25 | (async () => { 26 | try { 27 | updateNotifier({ pkg: packageJson }).notify(); 28 | 29 | await apiKeyCheck(); 30 | await modelListCheck(); 31 | 32 | showHeader(); 33 | chatLoop(); 34 | } catch (error) { 35 | console.error(`${pc.red('Error')}: ${getErrorMessage(error)}`); 36 | 37 | process.exit(1); 38 | } 39 | })(); 40 | -------------------------------------------------------------------------------- /src/validate.ts: -------------------------------------------------------------------------------- 1 | import { boolean, isBooleanable } from 'boolean'; 2 | import pc from 'picocolors'; 3 | import { z } from 'zod'; 4 | import { chatCompletionModels, otherOpenAIModels } from './openai/models.js'; 5 | 6 | // zod helpers to enforce integer, floats and flexible boolean string value 7 | export const zodInt = () => 8 | z.preprocess((v) => parseFloat(z.coerce.string().parse(v)), z.number().int()); 9 | export const zodFloat = () => 10 | z.preprocess((v) => parseFloat(z.coerce.string().parse(v)), z.number()); 11 | 12 | export const zodBoolean = () => 13 | z.preprocess( 14 | (value) => 15 | isBooleanable(value) 16 | ? boolean(value) 17 | : new z.ZodError([ 18 | { 19 | fatal: true, 20 | message: 'Not a boolean', 21 | path: [''], 22 | code: 'invalid_type', 23 | expected: 'boolean', 24 | received: 'string', 25 | }, 26 | ]), 27 | z.boolean() 28 | ); 29 | 30 | export const zodModel = () => 31 | z.string().refine((model) => { 32 | if (otherOpenAIModels.length && otherOpenAIModels.includes(model)) 33 | throw new Error( 34 | `'${model}' is not supported by the OpenAI Chat Completions API. Run '.models' command for the supported list.` 35 | ); 36 | 37 | if (chatCompletionModels.length && !chatCompletionModels.includes(model)) 38 | console.log( 39 | `${pc.yellow( 40 | 'Warning' 41 | )}: '${model}' is not a know model for the OpenAI Chat Completions API. Use at your own risk or run '.models update' to force an update of the supported list.` 42 | ); 43 | 44 | return true; 45 | }); 46 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import os from 'os'; 2 | import readline from 'readline'; 3 | 4 | import pc from 'picocolors'; 5 | import wrapText from 'wrap-text'; 6 | import { z } from 'zod'; 7 | 8 | const homeDir = os.homedir(); 9 | 10 | export function clearLine() { 11 | readline.clearLine(process.stdout, 0); 12 | readline.cursorTo(process.stdout, 0); 13 | } 14 | 15 | export function errorMsg(str: string) { 16 | clearLine(); 17 | console.error(`${pc.red('Error')}: ${str}`); 18 | } 19 | 20 | export const wrap = (text: string, width: number) => 21 | text 22 | .split('\n') 23 | .map((line) => wrapText(line, width)) 24 | .join('\n'); 25 | 26 | export const getErrorMessage = (error: unknown, str?: string) => 27 | error instanceof Error ? error.message : str ? `${str} (${String(error)})` : String(error); 28 | 29 | export const validationError = (error: unknown, setting: string) => { 30 | if (error instanceof z.ZodError) { 31 | if (error.issues[0].code === 'invalid_type') 32 | console.error( 33 | `${pc.red('Error')}: Incorrect type for ${setting}. ${error.issues[0].message}` 34 | ); 35 | else 36 | console.error( 37 | `${pc.red('Error')}: ${pc.cyan(error.issues[0].code)}: ${error.issues[0].message}` 38 | ); 39 | } else 40 | console.error( 41 | `${pc.red('Error')}: ${getErrorMessage(error, `Unknown error updating ${setting}`)}` 42 | ); 43 | }; 44 | 45 | export function lengthWithoutColor(str: string) { 46 | // eslint-disable-next-line no-control-regex 47 | const colorPattern = /\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g; 48 | 49 | return str.replace(colorPattern, '').length; 50 | } 51 | 52 | // via https://github.com/sindresorhus/untildify 53 | export const untildify = (filePath: string) => 54 | homeDir ? filePath.replace(/^~(?=$|\/|\\)/, homeDir) : filePath; 55 | -------------------------------------------------------------------------------- /src/loop.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import readline from 'readline'; 3 | 4 | import pc from 'picocolors'; 5 | import readLastLines from 'read-last-lines'; 6 | 7 | import { COMMAND_PREFIX, completeCommand, runCommand } from './commands/commands.js'; 8 | import exitCmd from './commands/exitCmd.js'; 9 | import { askChatGPT } from './openai/openai.js'; 10 | import { settings } from './settings.js'; 11 | 12 | const promptText: string = pc.green('You: '); 13 | 14 | export let rl: readline.Interface; 15 | 16 | async function initReadline() { 17 | const historyStream = fs.createWriteStream(settings.historyFile, { flags: 'a' }); 18 | 19 | const history: string[] = fs.existsSync(settings.historyFile) 20 | ? ((await readLastLines.read(settings.historyFile, settings.historySize)) as string) 21 | .split('\n') 22 | .reverse() 23 | .filter(Boolean) 24 | .map((line) => line.split(' ', 2)[1]) 25 | : []; 26 | 27 | rl = readline 28 | .createInterface({ 29 | input: process.stdin, 30 | output: process.stdout, 31 | history, 32 | historySize: settings.historySize, 33 | completer: completeCommand, 34 | }) 35 | .on('history', (history: string[]) => { 36 | if (settings.history && !history[0]?.startsWith(' ')) 37 | historyStream.write(`${new Date().toISOString()} ${history[0]}\n`); 38 | }) 39 | .on('close', () => { 40 | historyStream.end(); 41 | exitCmd; 42 | }); 43 | } 44 | 45 | async function inputPrompt(): Promise { 46 | return new Promise((resolve) => { 47 | rl.question(promptText, resolve); 48 | }); 49 | } 50 | 51 | export async function chatLoop() { 52 | await initReadline(); 53 | 54 | // eslint-disable-next-line no-constant-condition 55 | while (true) { 56 | const input = (await inputPrompt())?.trim(); 57 | const prompt = input.startsWith(COMMAND_PREFIX) ? await runCommand(input) : input; 58 | 59 | if (prompt) await askChatGPT(prompt); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/usage.ts: -------------------------------------------------------------------------------- 1 | import { AxiosResponse } from 'axios'; 2 | import md5 from 'md5'; 3 | import { CreateChatCompletionResponse } from 'openai'; 4 | import pc from 'picocolors'; 5 | import pluralize from 'pluralize'; 6 | 7 | import { apiKey } from './openai/openai.js'; 8 | import { conf, openAIPricePerToken } from './settings.js'; 9 | 10 | export let sessionUsageTokens = 0; 11 | export let sessionUsageCost = 0.0; 12 | 13 | const costByTokens = (tokens: number) => tokens * openAIPricePerToken; 14 | 15 | export function addUsage(tokens: number | undefined) { 16 | if (!tokens) return; 17 | 18 | sessionUsageTokens += tokens; 19 | sessionUsageCost += costByTokens(tokens); 20 | 21 | const totalUsages: Record = conf.get('totalUsage') || {}; 22 | const keyHash = md5(apiKey as string); 23 | const keyUsage = totalUsages?.[keyHash] || 0; 24 | 25 | const newTotal = keyUsage + tokens; 26 | totalUsages[keyHash] = newTotal; 27 | 28 | conf.set('totalUsage', totalUsages); 29 | 30 | return sessionUsageTokens; 31 | } 32 | 33 | export function formatUsage(response: AxiosResponse) { 34 | if (!response?.data?.usage) return 'unknown'; 35 | 36 | const { 37 | data: { 38 | usage: { prompt_tokens, completion_tokens, total_tokens }, 39 | }, 40 | } = response; 41 | 42 | return `Cost: ${pc.green( 43 | `$${costByTokens(total_tokens).toPrecision(1)}` 44 | )} total tokens: ${pc.green(total_tokens)}, prompt: ${pc.green( 45 | prompt_tokens 46 | )}, completion: ${pc.green(completion_tokens)}.`; 47 | } 48 | 49 | export function formatTotalUsage() { 50 | const totalUsages: Record = conf.get('totalUsage') || {}; 51 | const keyHash: string = md5(apiKey); 52 | const totalKeyUsage = totalUsages?.[keyHash] || 0; 53 | 54 | return ( 55 | `Session cost: ${pc.green(`$${sessionUsageCost.toPrecision(1)}`)} (${pc.green( 56 | sessionUsageTokens 57 | )} ${pluralize('token', sessionUsageTokens, false)})\n` + 58 | `Total cost: ${pc.green(`$${costByTokens(totalKeyUsage).toPrecision(1)}`)} (${pc.green( 59 | totalKeyUsage 60 | )} ${pluralize('token', sessionUsageTokens, false)})` 61 | ); 62 | } 63 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "chatgpt-repl", 3 | "version": "0.5.0", 4 | "description": "CLI REPL interface to ChatGPT", 5 | "main": "src/cli.js", 6 | "type": "module", 7 | "bin": { 8 | "chatgpt-repl": "dist/cli.js" 9 | }, 10 | "scripts": { 11 | "build": "tsc", 12 | "dev": "tsc -w", 13 | "clean": "rm -rf dist; rm -rf node_modules; pnpm install", 14 | "lint": "tsc --noEmit", 15 | "chatgpt-repl": "tsx src/cli.ts", 16 | "prepublishOnly": "pnpm run lint && pnpm run clean && pnpm run build" 17 | }, 18 | "author": "Joost Schuur ", 19 | "license": "ISC", 20 | "dependencies": { 21 | "@clack/prompts": "^0.6.3", 22 | "axios": "^1.3.5", 23 | "boolean": "^3.2.0", 24 | "commander": "^10.0.0", 25 | "conf": "^11.0.1", 26 | "dotenv": "^16.0.3", 27 | "jsonfile": "^6.1.0", 28 | "md5": "^2.3.0", 29 | "node-clipboardy": "^1.0.3", 30 | "openai": "^3.2.1", 31 | "ora": "^6.3.0", 32 | "picocolors": "^1.0.0", 33 | "pluralize": "^8.0.0", 34 | "pretty-ms": "^8.0.0", 35 | "read-last-lines": "^1.8.0", 36 | "streamed-chatgpt-api": "github:shrft/streamed-chatgpt-api", 37 | "term-size": "^3.0.2", 38 | "update-notifier": "^6.0.2", 39 | "wordcount": "^1.1.1", 40 | "wrap-text": "^1.0.9", 41 | "zod": "^3.21.4" 42 | }, 43 | "publishConfig": { 44 | "access": "public" 45 | }, 46 | "files": [ 47 | "dist", 48 | "package.json", 49 | "screenshot.png" 50 | ], 51 | "keywords": [ 52 | "chatgpt", 53 | "cli", 54 | "repl", 55 | "chatgpt-api", 56 | "openai" 57 | ], 58 | "homepage": "https://github.com/jschuur/chatgpt-repl#readme", 59 | "bugs": { 60 | "url": "https://github.com/jschuur/chatgpt-repl/issues" 61 | }, 62 | "repository": { 63 | "type": "git", 64 | "url": "https://github.com/jschuur/chatgpt-repl.git" 65 | }, 66 | "devDependencies": { 67 | "@types/jsonfile": "^6.1.1", 68 | "@types/md5": "^2.3.2", 69 | "@types/node": "^18.15.3", 70 | "@types/pluralize": "^0.0.29", 71 | "@types/update-notifier": "^6.0.2", 72 | "@types/wrap-text": "^1.0.0", 73 | "@typescript-eslint/eslint-plugin": "^5.55.0", 74 | "@typescript-eslint/parser": "^5.55.0", 75 | "eslint": "^8.35.0", 76 | "tsx": "^3.12.5", 77 | "typescript": "^5.0.2" 78 | }, 79 | "cspell": { 80 | "ignorePaths": [ 81 | "pnpm-lock.yaml" 82 | ] 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/openai/models.ts: -------------------------------------------------------------------------------- 1 | import ora from 'ora'; 2 | import pc from 'picocolors'; 3 | 4 | import { MODEL_CACHE_TIME_MINUTES, conf, settings } from '../settings.js'; 5 | import { openai } from './openai.js'; 6 | 7 | export let chatCompletionModels: string[] = []; 8 | export let otherOpenAIModels: string[] = []; 9 | export let lastUpdated: number; 10 | 11 | export async function updateModelList() { 12 | const cachedModelData = conf.get('models'); 13 | 14 | const spinner = ora({ 15 | discardStdin: false, 16 | spinner: 'point', 17 | }).start('Updating model list from OpenAI API...'); 18 | 19 | const models = (await openai.listModels())?.data?.data; 20 | 21 | if (!models?.length) { 22 | spinner.fail('Model list update failed'); 23 | throw new Error('Unable to retrieve model list from OpenAI API.'); 24 | } 25 | 26 | spinner.succeed('Model list updated'); 27 | 28 | // the model list doesn't really tell us which models are supported by the Chat Completions API, so assume by 'gpt' prefix 29 | chatCompletionModels = models 30 | .filter((model) => model.id.startsWith('gpt')) 31 | .map((model) => model.id); 32 | otherOpenAIModels = models 33 | .filter((model) => !model.id.startsWith('gpt')) 34 | .map((model) => model.id); 35 | lastUpdated = Date.now(); 36 | 37 | const addedModels = chatCompletionModels.filter( 38 | (model) => !cachedModelData?.chatCompletionModels.includes(model) 39 | ); 40 | if (addedModels?.length) 41 | console.info( 42 | `${pc.green('New')}: ChatGPT models added by OpenAI: ${addedModels 43 | .map((m) => pc.magenta(m)) 44 | .join(', ')}` 45 | ); 46 | 47 | const removedModels = cachedModelData?.chatCompletionModels.filter( 48 | (model) => !chatCompletionModels.includes(model) 49 | ); 50 | if (removedModels?.length) 51 | console.warn( 52 | `${pc.yellow('Update')}: ChatGPT models removed by OpenAI: ${removedModels 53 | .map((m) => pc.magenta(m)) 54 | .join(', ')}` 55 | ); 56 | 57 | if (!chatCompletionModels.length) 58 | throw new Error('No OpenAI Chat Completion compatible models found).'); 59 | 60 | conf.set('models', { chatCompletionModels, otherOpenAIModels, lastUpdated }); 61 | } 62 | 63 | export async function modelListCheck() { 64 | const cachedModelData = conf.get('models'); 65 | 66 | if (!cachedModelData || Date.now() - cachedModelData?.lastUpdated > MODEL_CACHE_TIME_MINUTES) 67 | await updateModelList(); 68 | else ({ chatCompletionModels, otherOpenAIModels, lastUpdated } = cachedModelData); 69 | 70 | if (!chatCompletionModels.includes(settings.model)) 71 | console.warn( 72 | `${pc.yellow('Warning')}: The selected model ${pc.magenta( 73 | settings.model 74 | )} is not supported by the OpenAI Chat Completions API.\n` 75 | ); 76 | } 77 | -------------------------------------------------------------------------------- /src/openai/response.ts: -------------------------------------------------------------------------------- 1 | import { isAxiosError } from 'axios'; 2 | import pc from 'picocolors'; 3 | import prettyMilliseconds from 'pretty-ms'; 4 | import terminalSize from 'term-size'; 5 | 6 | import { conf, settings } from '../settings.js'; 7 | import { formatUsage } from '../usage.js'; 8 | import { errorMsg, getErrorMessage, lengthWithoutColor, wrap } from '../utils.js'; 9 | import { conversation } from './conversation.js'; 10 | 11 | type ResponseData = { 12 | // TODO: refactor to remove any 13 | // response: AxiosResponse; 14 | response: any; 15 | startTime: number; 16 | cancelled?: boolean; 17 | }; 18 | 19 | export const chatGPTPrompt = `${pc.cyan('ChatGPT')}: `; 20 | let responseCol = lengthWithoutColor(chatGPTPrompt); 21 | 22 | export const spinnerOptions = { 23 | discardStdin: false, 24 | prefixText: chatGPTPrompt, 25 | text: '(Ctrl-C to cancel)', 26 | spinner: 'point', 27 | } as const; 28 | 29 | export function handleError(error: unknown) { 30 | if (error) { 31 | if (isAxiosError(error)) { 32 | const { response } = error; 33 | 34 | if (response) { 35 | if (response?.status === 401) { 36 | conf.delete('apiKey'); 37 | errorMsg('Invalid API key. Please restart and enter a new one.'); 38 | 39 | process.exit(1); 40 | } else 41 | errorMsg( 42 | `${response?.status}: ${response?.statusText} ${pc.dim( 43 | `(${getErrorMessage(error)})` 44 | )}\n` 45 | ); 46 | } 47 | } 48 | } else errorMsg(`${getErrorMessage(error)}\n`); 49 | } 50 | 51 | export function showFinishReason(finishReason: string | undefined) { 52 | if (!finishReason || finishReason === 'stop') return; 53 | 54 | if (finishReason === 'length') 55 | console.log(pc.dim('Incomplete response due to hitting max_tokens or token limit.\n')); 56 | else if (finishReason === 'content_filter') 57 | console.log(pc.dim('Incomplete response due to content filter\n')); 58 | else console.log(pc.dim(`Unknown finish reason: ${pc.magenta(finishReason)}\n`)); 59 | } 60 | 61 | export function responseHeader({ response, startTime, cancelled }: ResponseData) { 62 | let responseText = cancelled 63 | ? 'Request cancelled after' 64 | : `Response${settings.clipboard ? ' (copied to clipboard)' : ''} in`; 65 | responseText += ` ${pc.green(prettyMilliseconds(Date.now() - startTime))}. `; 66 | 67 | // TODO: estimate streamed response by counting response chunks 68 | if (response) responseText += formatUsage(response); 69 | 70 | return pc.dim(responseText); 71 | } 72 | 73 | export function showLastResponse() { 74 | const { role, content: answer } = conversation[conversation.length - 1] || {}; 75 | 76 | if (role !== 'assistant' || !answer) return errorMsg('No previous response to show.'); 77 | 78 | const { columns } = terminalSize(); 79 | 80 | const answerFormatted = settings.wordWrap 81 | ? wrap(`${pc.cyan('ChatGPT')}: ${answer}`, columns - 5) 82 | : answer; 83 | 84 | console.log(`${answerFormatted}\n`); 85 | } 86 | 87 | // display streamed in response chunks 88 | export function showResponseChunk(chunk: string) { 89 | const { columns } = terminalSize(); 90 | 91 | // skip newlines already present in the response 92 | chunk.split('\n').forEach((piece, index) => { 93 | if (index > 0 || (settings.wordWrap && responseCol + piece.length > columns - 5)) { 94 | console.log(); 95 | responseCol = piece.length; 96 | 97 | // remove the leading space of a word if we've decided to wrap 98 | if (piece.startsWith(' ')) piece = piece.slice(1); 99 | } 100 | 101 | process.stdout.write(piece); 102 | responseCol += piece.length; 103 | }); 104 | } 105 | 106 | export const resetResponseCol = () => (responseCol = 9); 107 | -------------------------------------------------------------------------------- /src/commands/commands.ts: -------------------------------------------------------------------------------- 1 | import { clearConversation, updateConversation } from '../openai/conversation.js'; 2 | import { showLastResponse } from '../openai/response.js'; 3 | import { packageJson, resetSettings, updateSetting } from '../settings.js'; 4 | 5 | import copyCmd from './copyCmd.js'; 6 | import exitCmd from './exitCmd.js'; 7 | import helpCmd from './helpCmd.js'; 8 | import modelsCmd from './modelsCmd.js'; 9 | import retryCmd from './retryCmd.js'; 10 | import settingsCmd from './settingsCmd.js'; 11 | import usageCmd from './usageCmd.js'; 12 | 13 | export const COMMAND_PREFIX = '.'; 14 | 15 | type CommandDefinition = [ 16 | description: string, 17 | commandFunction: (args: string) => string | void | Promise 18 | ]; 19 | interface CommandList { 20 | [key: string]: CommandDefinition; 21 | } 22 | 23 | export async function runCommand(cmd: string): Promise { 24 | const [command, ...args] = cmd.slice(1).split(' '); 25 | 26 | if (!commandList[command]) 27 | console.error( 28 | `Unknown command: ${COMMAND_PREFIX}${command}. List commands with ${COMMAND_PREFIX}help.` 29 | ); 30 | else { 31 | const cmdFunc = commandList[command][1]; 32 | 33 | if (cmdFunc) return await cmdFunc(args.join(' ')); 34 | else console.error(`command: ${COMMAND_PREFIX}${command} is missing a function to execute.`); 35 | } 36 | 37 | return ''; 38 | } 39 | 40 | function completeOptions(partial: string, options: string[]) { 41 | const matches = options.filter((c) => c.startsWith(partial)); 42 | 43 | return [matches.length ? matches.map((m) => `${m} `) : options, partial]; 44 | } 45 | 46 | export function completeCommand(line: string) { 47 | const input = line.trim(); 48 | const cmd = input.split(' ')?.[0]; 49 | const commands = Object.keys(commandList).map((c) => `${COMMAND_PREFIX}${c}`); 50 | 51 | if (!cmd || !input.startsWith(COMMAND_PREFIX) || commands.includes(cmd)) return [[], input]; 52 | 53 | return completeOptions(cmd, commands); 54 | } 55 | 56 | export const commandList: CommandList = { 57 | help: ['Show help', helpCmd], 58 | version: ['Show version', () => console.log(packageJson.version)], 59 | 60 | settings: ['Show current settings', settingsCmd], 61 | usage: ['Show usage for current API key', usageCmd], 62 | model: ['Show/update model', (value: string) => updateSetting('model', value.trim())], 63 | models: ['Show/update supported ChatGPT models list', modelsCmd], 64 | temperature: [ 65 | 'Show/update temperature', 66 | (value: string) => updateSetting('temperature', value.trim()), 67 | ], 68 | maxtokens: [ 69 | 'Show/update max tokens per prompt', 70 | (value: string) => updateSetting('maxTokens', value.trim()), 71 | ], 72 | conversationlength: [ 73 | 'Show/update history length', 74 | (value: string) => updateSetting('conversationLength', value.trim()), 75 | ], 76 | 77 | system: [ 78 | 'Show/update system text', 79 | (value: string) => updateConversation({ role: 'system', content: value.trim() }), 80 | ], 81 | reset: ['Reset one or all settings', (setting: string) => resetSettings(setting.trim())], 82 | retry: ['Send previous prompt again', retryCmd], 83 | clear: ['Clear conversation history', () => clearConversation()], 84 | clipboard: [ 85 | 'Show/update automatic clipboard copying', 86 | (value: string) => updateSetting('clipboard', value.trim()), 87 | ], 88 | copy: ['Copy last result to clipboard', copyCmd], 89 | wordwrap: [ 90 | 'Show/update response word wrapping', 91 | (value: string) => updateSetting('wordWrap', value.trim()), 92 | ], 93 | stream: [ 94 | 'stream responses as they are received', 95 | (value: string) => updateSetting('stream', value.trim()), 96 | ], 97 | history: [ 98 | 'skip writing to history file', 99 | (value: string) => updateSetting('history', value.trim()), 100 | ], 101 | last: ['Show the last response again', showLastResponse], 102 | exit: ['Exit chatgpt-repl', exitCmd], 103 | }; 104 | -------------------------------------------------------------------------------- /src/openai/openai.ts: -------------------------------------------------------------------------------- 1 | import { confirm, intro, isCancel, outro, text } from '@clack/prompts'; 2 | import clipboard from 'node-clipboardy'; 3 | import { Configuration, CreateChatCompletionRequest, OpenAIApi } from 'openai'; 4 | import ora, { Ora } from 'ora'; 5 | import pc from 'picocolors'; 6 | import { fetchStreamedChatContent } from 'streamed-chatgpt-api'; 7 | 8 | import { rl } from '../loop.js'; 9 | import { conf, settings } from '../settings.js'; 10 | import { addUsage } from '../usage.js'; 11 | import { conversation, updateConversation } from './conversation.js'; 12 | import { 13 | chatGPTPrompt, 14 | handleError, 15 | resetResponseCol, 16 | responseHeader, 17 | showLastResponse, 18 | showResponseChunk, 19 | spinnerOptions, 20 | } from './response.js'; 21 | 22 | export let openai: OpenAIApi; 23 | 24 | type ChatGPTResult = { 25 | response?: any; 26 | finishReason?: string; 27 | answer?: string; 28 | error?: any; 29 | cancelled?: boolean; 30 | }; 31 | 32 | export let apiKey = ''; 33 | 34 | function initOpenAI(key: string) { 35 | apiKey = key; 36 | const configuration = new Configuration({ apiKey }); 37 | 38 | openai = new OpenAIApi(configuration); 39 | } 40 | 41 | async function inputApiKey() { 42 | intro('No OpenAI API key found. Create one at https://platform.openai.com/account/api-keys'); 43 | 44 | const key = await text({ 45 | message: 'Enter your API Key', 46 | }); 47 | 48 | if (isCancel(key) || !key || key.trim().length === 0) throw new Error('No API key provided.'); 49 | 50 | const saveApiKey = await confirm({ 51 | message: 'Save API key for future use?', 52 | }); 53 | if (saveApiKey) conf.set('apiKey', key); 54 | 55 | outro('API key saved.'); 56 | 57 | return key; 58 | } 59 | 60 | async function validateApiKey(key: string) { 61 | try { 62 | initOpenAI(key); 63 | 64 | await openai.listModels(); 65 | } catch (error) { 66 | handleError(error); 67 | } 68 | } 69 | 70 | export async function apiKeyCheck() { 71 | let key = conf.get('apiKey', settings.apiKey || ''); 72 | 73 | // validate keys not previously used/saved (options override saved key) 74 | if (!key) { 75 | key = await inputApiKey(); 76 | await validateApiKey(key); 77 | 78 | // don't overwrite a saved key when commander set settings.apiKey via.env() 79 | if (!process.env.CHATGPTREPL_APIKEY) conf.set('apiKey', key); 80 | } 81 | 82 | if (!openai) initOpenAI(key); 83 | } 84 | 85 | async function chatCompletionStreamed(params: any): Promise { 86 | return new Promise((resolve, reject) => { 87 | let answer = ''; 88 | let cancelled = false; 89 | const spinner = ora(spinnerOptions).start(); 90 | 91 | const markCancelled = () => (cancelled = true); 92 | 93 | rl.on('SIGINT', markCancelled); 94 | 95 | fetchStreamedChatContent( 96 | { apiKey, ...params }, 97 | (content: string, reader: ReadableStreamDefaultReader) => { 98 | // onResponse 99 | if (spinner.isSpinning) { 100 | spinner.stop(); 101 | process.stdout.write(chatGPTPrompt); 102 | } 103 | 104 | // TODO: handle cancellation sooner than next chunk 105 | if (cancelled) reader.cancel(); 106 | else { 107 | showResponseChunk(content); 108 | answer += content; 109 | } 110 | }, 111 | () => { 112 | // onFinish 113 | rl.off('SIGINT', markCancelled); 114 | 115 | if (cancelled) 116 | process.stdout.write(pc.yellow(`${answer ? ' ...\n' : ''}Response cancelled\n\n`)); 117 | else process.stdout.write('\n\n'); 118 | 119 | resolve({ answer, cancelled }); 120 | }, 121 | (error: any) => { 122 | // onError 123 | reject({ error }); 124 | } 125 | ); 126 | }); 127 | } 128 | 129 | async function chatCompletionAsync(params: CreateChatCompletionRequest): Promise { 130 | let spinner: Ora | undefined; 131 | const controller = new AbortController(); 132 | let cancelled = false; 133 | 134 | const stopRequest = () => controller.abort(); 135 | 136 | try { 137 | spinner = ora(spinnerOptions).start(); 138 | 139 | rl.on('SIGINT', stopRequest); 140 | 141 | const response = await openai.createChatCompletion(params, { signal: controller.signal }); 142 | spinner.stop(); 143 | 144 | addUsage(response?.data?.usage?.total_tokens); 145 | 146 | // TODO: bring finishReason back 147 | const { message: { content: answer = undefined } = {} } = response?.data?.choices?.[0] || {}; 148 | 149 | rl.off('SIGINT', stopRequest); 150 | 151 | return { answer, response, cancelled }; 152 | } catch (error: any) { 153 | if (spinner) spinner.stop(); 154 | 155 | if (error.constructor.name === 'Cancel') { 156 | process.stdout.write(`${chatGPTPrompt}${pc.yellow('Response cancelled\n\n')}`); 157 | cancelled = true; 158 | } else handleError(error); 159 | 160 | rl.off('SIGINT', stopRequest); 161 | 162 | return { answer: undefined, response: undefined, cancelled }; 163 | } 164 | } 165 | 166 | export async function askChatGPT(question: string) { 167 | const { model, temperature, maxTokens, stream } = settings; 168 | 169 | const startTime = Date.now(); 170 | const params = { 171 | model, 172 | temperature, 173 | } as CreateChatCompletionRequest; 174 | 175 | console.log(); 176 | updateConversation({ role: 'user', content: question }); 177 | 178 | const { answer, response, cancelled } = stream 179 | ? await chatCompletionStreamed({ 180 | ...params, 181 | messageInput: conversation, 182 | maxTokens, 183 | stream: true, 184 | }) 185 | : await chatCompletionAsync({ 186 | ...params, 187 | max_tokens: maxTokens, 188 | messages: conversation, 189 | }); 190 | 191 | if (answer) { 192 | updateConversation({ role: 'assistant', content: answer }); 193 | 194 | if (stream) resetResponseCol(); 195 | else showLastResponse(); 196 | 197 | if (settings.clipboard && !cancelled) clipboard.writeSync(answer); 198 | } 199 | 200 | // showFinishReason(finishReason); 201 | 202 | console.log(responseHeader({ response, startTime, cancelled })); 203 | console.log(); 204 | } 205 | -------------------------------------------------------------------------------- /src/settings.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import url from 'url'; 3 | 4 | import { Command } from 'commander'; 5 | import Conf from 'conf'; 6 | import jsonfile from 'jsonfile'; 7 | import pc from 'picocolors'; 8 | 9 | import { z } from 'zod'; 10 | 11 | import settingsCmd from './commands/settingsCmd.js'; 12 | import { untildify, validationError } from './utils.js'; 13 | import { zodBoolean, zodFloat, zodInt, zodModel } from './validate.js'; 14 | 15 | export const defaultSettings = { 16 | temperature: 1.0, 17 | maxTokens: 1024, 18 | model: 'gpt-3.5-turbo', 19 | system: 'You are a helpful assistant', 20 | conversationLength: 5, 21 | historySize: 100, 22 | wordWrap: true, 23 | clipboard: false, 24 | stream: true, 25 | history: true, 26 | apiKey: process.env['CHATGPTREPL_APIKEY'] || '', 27 | historyFile: '~/.chatgpt-repl.history', 28 | }; 29 | 30 | const settingsSchema = z.object({ 31 | maxTokens: zodInt(), 32 | temperature: zodFloat(), 33 | model: zodModel(), 34 | apiKey: z.string().optional(), 35 | system: z.string(), 36 | conversationLength: zodInt(), 37 | historySize: zodInt(), 38 | wordWrap: zodBoolean(), 39 | clipboard: zodBoolean(), 40 | stream: zodBoolean(), 41 | history: zodBoolean(), 42 | historyFile: z.string(), 43 | }); 44 | 45 | export const settingSchema = settingsSchema.keyof(); 46 | 47 | export type Settings = z.infer; 48 | export type SettingsTypes = Settings[keyof Settings]; 49 | 50 | export type Setting = keyof Settings; 51 | 52 | export const INDENT_PADDING_BUFFER = 2; 53 | export const DEFAULT_TOKEN_PRICE = 0.000002; 54 | export const MODEL_CACHE_TIME_MINUTES = 1000 * 60 * 60 * 24 * 3; // 3 days 55 | 56 | export const openAIPricePerToken: number = 57 | parseFloat(process.env.CHATGPTREPL_USD_PRICE_PER_TOKEN) || DEFAULT_TOKEN_PRICE; 58 | 59 | const resolvePath = (filePath: string) => 60 | path.resolve(url.fileURLToPath(new URL('.', import.meta.url)), filePath); 61 | 62 | export type ConfData = { 63 | apiKey: string; 64 | totalUsage: { [key: string]: number }; 65 | models: { 66 | chatCompletionModels: string[]; 67 | otherOpenAIModels: string[]; 68 | lastUpdated: number; 69 | }; 70 | }; 71 | 72 | export const conf = new Conf({ projectName: 'chatgpt-repl' }); 73 | 74 | export const packageJson = jsonfile.readFileSync(resolvePath('../package.json')); 75 | 76 | export const parseSetting = (setting: Setting, value: string): SettingsTypes => 77 | settingsSchema.shape[setting].parse(value); 78 | 79 | const defaultSetting = (setting: Setting): string | undefined => 80 | process.env[`CHATGPTREPL_${setting.toUpperCase()}`] || defaultSettings[setting]?.toString(); 81 | 82 | const isSetting = (field: string): field is Setting => settingSchema.safeParse(field)?.success; 83 | 84 | function setSetting(setting: Setting, value: SettingsTypes) { 85 | // all this to keep typescript happy. there has to be a better way? 86 | // https://stackoverflow.com/questions/75809343/type-string-number-is-not-assignable-to-type-never-when-dynamically-settin/75809489#75809489 87 | if ( 88 | (setting === 'maxTokens' || setting === 'conversationLength' || setting === 'historySize') && 89 | typeof value === 'number' 90 | ) 91 | settings[setting] = value; 92 | if ( 93 | (setting === 'model' || setting === 'system' || setting === 'apiKey') && 94 | typeof value === 'string' 95 | ) 96 | settings[setting] = value; 97 | if ( 98 | (setting === 'wordWrap' || 99 | setting === 'clipboard' || 100 | setting === 'stream' || 101 | setting === 'history') && 102 | typeof value === 'boolean' 103 | ) 104 | settings[setting] = value; 105 | 106 | console.log(`${pc.cyan(setting.toLowerCase())} set to ${pc.magenta(String(value))}`); 107 | } 108 | 109 | export function updateSetting(setting: Setting, value: string) { 110 | if (!value || value.length === 0) { 111 | // display the current value 112 | console.log(`${setting.padEnd(indentPadding + 3)} ${pc.dim(String(settings[setting]))}`); 113 | } else { 114 | try { 115 | const parsedValue = parseSetting(setting, value); 116 | setSetting(setting, parsedValue); 117 | } catch (error) { 118 | validationError(error, value); 119 | } 120 | } 121 | } 122 | 123 | export function resetSettings(setting: string) { 124 | if (setting) { 125 | if (isSetting(setting)) setSetting(setting, initialSettings[setting]); 126 | else console.log(pc.red(`Unknown setting: ${setting}`)); 127 | } else { 128 | // reset all settings 129 | settings = { ...initialSettings }; 130 | 131 | settingsCmd('Settings reset'); 132 | } 133 | } 134 | 135 | const program = new Command(); 136 | 137 | program 138 | .name('chatgpt-repl') 139 | .version(packageJson.version, '-v, --version', 'Show the current version number') 140 | .helpOption('-h, --help', 'Show help'); 141 | 142 | program 143 | .description('ChatGPT REPL interactive command line tool') 144 | 145 | .option( 146 | '-c, --clipboard ', 147 | 'Enable/disable copying responses to clipboard', 148 | defaultSetting('clipboard') 149 | ) 150 | .option('-k, --apiKey ', 'Set (and save) OpenAI API key') 151 | .option( 152 | '-l, --conversation-length ', 153 | 'Set conversation history length', 154 | defaultSetting('conversationLength') 155 | ) 156 | .option('--history-size ', 'Set history size', defaultSetting('historySize')) 157 | .option('-m, --model ', 'Set OpenAI model', defaultSetting('model')) 158 | .option('-t, --temperature ', 'Set temperature', defaultSetting('temperature')) 159 | .option('-s, --system ', 'Set system prompt', defaultSetting('system')) 160 | .option('-w, --word-wrap ', 'Enable/disable word wrap', defaultSetting('wordWrap')) 161 | .option('-x, --max-tokens ', 'Max tokens per request', defaultSetting('maxTokens')) 162 | .option('-r, --stream ', 'Enable/disabled streamed response', defaultSetting('stream')) 163 | .option( 164 | '-h, --history ', 165 | 'Enable/disabled logging to history file', 166 | defaultSetting('history') 167 | ) 168 | .option( 169 | '--history-file ', 170 | 'History file location', 171 | untildify(defaultSetting('historyFile') || '') 172 | ); 173 | 174 | export let settings: Settings = settingsSchema.parse(program.parse().opts()); 175 | const initialSettings = { ...settings }; 176 | 177 | export const indentPadding = 178 | Math.max(...Object.keys(settings).map((k) => k.length)) + INDENT_PADDING_BUFFER; 179 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ChatGPT REPL 2 | 3 | ChatGPT interactive command line [REPL](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop), using the [OpenAI API](https://platform.openai.com/docs/guides/chat) for per usage billing. 4 | 5 | An experiment inspired by [two](https://twitter.com/sandbags/status/1631933273487048704) [tweets](https://twitter.com/joostschuur/status/1631948339599093763). 6 | 7 | ## Features 8 | 9 | - [Bring](#usage) your own API key 10 | - Shell like REPL with history access and commands 11 | - Stream responses 12 | - Controllable [conversation context](#controlling-conversation-context) 13 | - Clipboard copying 14 | - Local API usage tracking 15 | - Access input history from previous sessions 16 | 17 | See the [current roadmap](https://github.com/users/jschuur/projects/3) for plans and ideas, including issues with a [help wanted](https://github.com/jschuur/chatgpt-repl/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) label. Feel free to [open an issue](https://github.com/jschuur/chatgpt-repl/issues/new) if you encounter any bugs or have suggestions. 18 | 19 | ## Preview 20 | 21 |

22 | Screenshot of the chatgpt-repl shell command in action, replying with a reassuring haiku to the prompt 'write a haiku about benevolent AI overlords' 23 |

24 | 25 | ## Install 26 | 27 | Use your favourite package manager to install the `chatgpt-repl` command globally. With npm: 28 | 29 | ```bash 30 | npm install -g chatgpt-repl 31 | ``` 32 | 33 | ## Usage 34 | 35 | Once installed: 36 | 37 | 1. Get an [OpenAI API key](https://platform.openai.com/account/api-keys). 38 | 2. Run `chatgpt-repl`. 39 | 3. Provided API key when asked. 40 | 4. Enter a ChatGPT prompt ('Should Pluto be a planet?') and hit enter. 41 | 5. See available [commands](#commands) with `.help`. 42 | 6. Hit Ctrl-C or enter `.exit` to end the session when sufficiently filled with knowledge. 43 | 7. Use the up/down arrows to access previously entered prompts or commands. 44 | 45 | Responses are streamed in by default. This can be disabled with the `.stream false` command or the `--stream false` CLI option. Streamed responses currently [don't include](https://community.openai.com/t/openai-api-get-usage-tokens-in-response-when-set-stream-true/141866/2) token usage from the API and not included in usage tracking (issue to [estimate usage](https://github.com/jschuur/chatgpt-repl/issues/46)). 46 | 47 | Cancel a request in progress with Ctrl-C at any time, even when streaming. 48 | 49 | REPL input is saved into a history file (`~/.chatgpt-repl-history` or based on`CHATGPTREPL_HISTORYFILE` env). This can be disabled with the `--history false` CLI option. The last 100 (or `CHATGPTREPL_HISTORYSIZE`) history entries are loaded on startup. 50 | 51 | ### Supported models 52 | 53 | Currently, the default model is `gpt-3.5-turbo`. Use the `.models` command to see the list of supported models. 54 | 55 | Supported models are retrieved from the [OpenAI API](https://platform.openai.com/docs/api-reference/models/list) and cached locally for 3 days. Run `.models update` to force an update. 56 | 57 | ### What about GPT-4? 58 | 59 | GPT-4 was [announced](https://openai.com/product/gpt-4) on March 14th, 2023 and API support for it started out with a waitlist. If it's available to you, provide an [alternate model name](https://platform.openai.com/docs/models/gpt-4) via `--model gpt-4` (or the `.model gpt-4` command). 60 | 61 | Note however that GPT-4's pricing appears to be [significantly higher](https://chatgpt4.ai/gpt-4-api-pricing/) than GPT-3's. The current API usage costs shown by this tool is based on GPT-3's pricing (issue for [model specific pricing](https://github.com/jschuur/chatgpt-repl/issues/19)). 62 | 63 | ### Command line options: 64 | 65 | - `-v, --version` Show version number 66 | - `-h, --help` Show help 67 | 68 | - `-c, --clipboard ` Enable/disable copying the latest response to the clipboard as it is shown (default: 'false' or `CHATGPTREPL_CLIPBOARD` env) 69 | - `-k, --api-key ` Set (and save) OpenAI API key (`CHATGPTREPL_APIKEY` env) 70 | - `-l, --conversation-length` Set [conversation history length](#controlling-conversation-context) (default: 3 or `CHATGPTREPL_CONVERSATIONLENGTH` env) 71 | - `--history-size` Set history size (default: 100 or`CHATGPTREPL_HISTORYSIZE` env) 72 | - `--history-file` History file location (default: `~/.chatgpt-repl.history` or`CHATGPTREPL_HISTORYFILE` env) 73 | - `-m, --model` Set the OpenAI [model](https://platform.openai.com/docs/api-reference/chat/create#chat/create-model) (default: gpt-3.5-turbo or `CHATGPTREPL_MODEL` env) 74 | - `-t, --temperature` Set the [temperature](https://platform.openai.com/docs/quickstart/adjust-your-settings) for more 'random' responses (default: 1 or `CHATGPTREPL_TEMPERATURE` env) 75 | - `-s, --system` Set the [system](https://platform.openai.com/docs/guides/chat/introduction) to set the tone of the response (default: 'You are a helpful assistant' or `CHATGPTREPL_SYSTEM` env) 76 | - `-r, --stream` Enable/disable streamed responses (default: 'true' or `CHATGPTREPL_STREAM` env) 77 | - `-w, --word-wrap ` Enable/disable automatic word wrapping in response output (default: 'true' or `CHATGPTREPL_WORDWRAP` env) 78 | - `-x, --max-tokens ` Set the [max tokens](https://platform.openai.com/docs/guides/chat/managing-tokens) to use and control costs (default: 1024 or `CHATGPTREPL_MAXTOKENS` env) 79 | 80 | Defaults can be overridden with environment variables where indicated ('env'). 81 | 82 | ### Open AI API costs 83 | 84 | OpenAI API usage is paid after a free trial, but [extremely cheap](https://openai.com/pricing). 1,000 tokens (currently) cost $0.002 for the `gpt-3.5-turbo` model used by this tool by default. Each word in a question and response uses at least 1 token. 85 | 86 | ### Controlling conversation context 87 | 88 | By default, the last 5 prompts/responses in a session are used in addition to a new prompt, to provide ChatGPT with additional context. This allows for follow-up prompts that reference a previous response, but also increases costs by using more API tokens. 89 | 90 | The `-l ` option (or `CHATGPTREPL_CONVERSATIONLENGTH` environment variable or `.conversationlength` command) can be used to change this conversation length, by indicating how much of an earlier conversation to reuse. So `-l 0` would not send any previous conversation context back and `-l 1` would only use the most recent prompt/response for context. 91 | 92 | Thus with a history length of zero, you couldn't ask 'What is the Sun?' and later 'How far away from the Earth is it?', since it would have no frame of reference for 'it'. 93 | 94 | Enhancements to conversation tracking are [planned](https://github.com/jschuur/chatgpt-repl/issues?q=is%3Aissue+is%3Aopen+label%3Aconversations). 95 | 96 | ### Commands 97 | 98 | Instead of entering a prompt, you can also use a number of commands to modify settings or perform other actions. Use `.help` for the full list: 99 | 100 | - `.settings` shows all the current settings 101 | - `.reset` resets one or all settings to when you launched the current session 102 | - `.model`, `.temperature`, `.maxtokens`, `.conversationlength` or `.system` followed by a value will change a setting, or show it without a value 103 | - `.models [update]` shows/force updates the list of supported models 104 | - `.retry` reruns the last prompt with the latest settings 105 | - `.last` shows the last response again without running it through ChatGPT again (applies new word wrap/clipboard settings) 106 | - `.clear` clears the [conversation history](#controlling-conversation-context) 107 | - `.copy` copies the last response to a prompt to your system clipboard 108 | - `.clipboard` enabled/disabled clipboard copying for every response (off by default) 109 | - `.wordwrap` enables/disables word wrapping for the response output (on by default) 110 | - `.history` enables/disables input logging to history file (on by default) 111 | - `.stream` enables/disables streamed responses (on by default) 112 | - `.usage` shows current and total API usage 113 | - `.exit` ends the current session 114 | 115 | Values to set boolean fields can include `true`, `false`, `1`, `0`, `on`, `off` [etc](https://www.npmjs.com/package/boolean). 116 | 117 | Hitting tab will attempt to complete a command. 118 | 119 | ## Even ChatGPT loves this! 120 | 121 | When asked 'What are the benefits of a ChatGPT command line interface?', it wholeheartedly endorsed this tool: 122 | 123 | > There are several benefits of ChatGPT command line interface, including: 124 | > 125 | > 1. Faster and More Efficient Communication: With command line interface, users can communicate with the ChatGPT model much faster and efficiently than with a graphical interface. 126 | > 127 | > 2. Improved Productivity: With command line interface, users can execute multiple commands in quick succession, which can help increase productivity. 128 | > 129 | > 3. Ease of Use: Command line interface is generally easier to use for users who are familiar with the command line interface. The syntax, while it may look complicated for beginners, is generally quicker than using a graphical interface. 130 | > 131 | > 4. Customizability: By using a command line interface, users can customize their experience with ChatGPT based on their needs and preferences. 132 | > 133 | > 5. Script Automation: ChatGPT command line interface can be used to create scripts that can be used to automate certain tasks, which can help save time and increase productivity. 134 | 135 | ## Stack 136 | 137 | Some of the libraries used: 138 | 139 | - [clack](https://github.com/natemoo-re/clack/): some of the prompt UI 140 | - [commander](https://www.npmjs.com/package/commander): command line options 141 | - [OpenAI Node.js library](https://github.com/openai/openai-node): ChatGPT API responses 142 | - [streamed-chatgpt-api](https://github.com/jddev273/streamed-chatgpt-api): streaming ChatGPT responses (currently using [fork](https://github.com/shrft/streamed-chatgpt-api) to cancel requests) 143 | - [node-clipboardy](https://www.npmjs.com/package/node-clipboardy): copy responses to the system clipboard 144 | - [zod](https://zod.dev/): type safe validation 145 | - [tsx](https://www.npmjs.com/package/tsx): local TypeScript development 146 | 147 | REPL prompt plus history uses the built-in Node [readline](https://nodejs.org/api/readline.html) API. 148 | 149 | \- [Joost Schuur](https://joostschuur.com) ([@joostschuur](https://twitter.com/joostschuur)) 150 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | dependencies: 4 | '@clack/prompts': 5 | specifier: ^0.6.3 6 | version: 0.6.3 7 | axios: 8 | specifier: ^1.3.5 9 | version: 1.3.5 10 | boolean: 11 | specifier: ^3.2.0 12 | version: 3.2.0 13 | commander: 14 | specifier: ^10.0.0 15 | version: 10.0.0 16 | conf: 17 | specifier: ^11.0.1 18 | version: 11.0.1 19 | dotenv: 20 | specifier: ^16.0.3 21 | version: 16.0.3 22 | jsonfile: 23 | specifier: ^6.1.0 24 | version: 6.1.0 25 | md5: 26 | specifier: ^2.3.0 27 | version: 2.3.0 28 | node-clipboardy: 29 | specifier: ^1.0.3 30 | version: 1.0.3 31 | openai: 32 | specifier: ^3.2.1 33 | version: 3.2.1 34 | ora: 35 | specifier: ^6.3.0 36 | version: 6.3.0 37 | picocolors: 38 | specifier: ^1.0.0 39 | version: 1.0.0 40 | pluralize: 41 | specifier: ^8.0.0 42 | version: 8.0.0 43 | pretty-ms: 44 | specifier: ^8.0.0 45 | version: 8.0.0 46 | read-last-lines: 47 | specifier: ^1.8.0 48 | version: 1.8.0 49 | streamed-chatgpt-api: 50 | specifier: github:shrft/streamed-chatgpt-api 51 | version: github.com/shrft/streamed-chatgpt-api/60bbdc16e68163508c4ba42aa809a59b449ab5fe 52 | term-size: 53 | specifier: ^3.0.2 54 | version: 3.0.2 55 | update-notifier: 56 | specifier: ^6.0.2 57 | version: 6.0.2 58 | wordcount: 59 | specifier: ^1.1.1 60 | version: 1.1.1 61 | wrap-text: 62 | specifier: ^1.0.9 63 | version: 1.0.9 64 | zod: 65 | specifier: ^3.21.4 66 | version: 3.21.4 67 | 68 | devDependencies: 69 | '@types/jsonfile': 70 | specifier: ^6.1.1 71 | version: 6.1.1 72 | '@types/md5': 73 | specifier: ^2.3.2 74 | version: 2.3.2 75 | '@types/node': 76 | specifier: ^18.15.3 77 | version: 18.15.3 78 | '@types/pluralize': 79 | specifier: ^0.0.29 80 | version: 0.0.29 81 | '@types/update-notifier': 82 | specifier: ^6.0.2 83 | version: 6.0.2 84 | '@types/wrap-text': 85 | specifier: ^1.0.0 86 | version: 1.0.0 87 | '@typescript-eslint/eslint-plugin': 88 | specifier: ^5.55.0 89 | version: 5.55.0(@typescript-eslint/parser@5.55.0)(eslint@8.35.0)(typescript@5.0.2) 90 | '@typescript-eslint/parser': 91 | specifier: ^5.55.0 92 | version: 5.55.0(eslint@8.35.0)(typescript@5.0.2) 93 | eslint: 94 | specifier: ^8.35.0 95 | version: 8.35.0 96 | tsx: 97 | specifier: ^3.12.5 98 | version: 3.12.5 99 | typescript: 100 | specifier: ^5.0.2 101 | version: 5.0.2 102 | 103 | packages: 104 | 105 | /@clack/core@0.3.2: 106 | resolution: {integrity: sha512-FZnsNynwGDIDktx6PEZK1EuCkFpY4ldEX6VYvfl0dqeoLPb9Jpw1xoUXaVcGR8ExmYNm1w2vdGdJkEUYD/2pqg==} 107 | dependencies: 108 | picocolors: 1.0.0 109 | sisteransi: 1.0.5 110 | dev: false 111 | 112 | /@clack/prompts@0.6.3: 113 | resolution: {integrity: sha512-AM+kFmAHawpUQv2q9+mcB6jLKxXGjgu/r2EQjEwujgpCdzrST6BJqYw00GRn56/L/Izw5U7ImoLmy00X/r80Pw==} 114 | dependencies: 115 | '@clack/core': 0.3.2 116 | picocolors: 1.0.0 117 | sisteransi: 1.0.5 118 | dev: false 119 | bundledDependencies: 120 | - is-unicode-supported 121 | 122 | /@esbuild-kit/cjs-loader@2.4.2: 123 | resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} 124 | dependencies: 125 | '@esbuild-kit/core-utils': 3.1.0 126 | get-tsconfig: 4.5.0 127 | dev: true 128 | 129 | /@esbuild-kit/core-utils@3.1.0: 130 | resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} 131 | dependencies: 132 | esbuild: 0.17.18 133 | source-map-support: 0.5.21 134 | dev: true 135 | 136 | /@esbuild-kit/esm-loader@2.5.5: 137 | resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} 138 | dependencies: 139 | '@esbuild-kit/core-utils': 3.1.0 140 | get-tsconfig: 4.5.0 141 | dev: true 142 | 143 | /@esbuild/android-arm64@0.17.18: 144 | resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} 145 | engines: {node: '>=12'} 146 | cpu: [arm64] 147 | os: [android] 148 | requiresBuild: true 149 | dev: true 150 | optional: true 151 | 152 | /@esbuild/android-arm@0.17.18: 153 | resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} 154 | engines: {node: '>=12'} 155 | cpu: [arm] 156 | os: [android] 157 | requiresBuild: true 158 | dev: true 159 | optional: true 160 | 161 | /@esbuild/android-x64@0.17.18: 162 | resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} 163 | engines: {node: '>=12'} 164 | cpu: [x64] 165 | os: [android] 166 | requiresBuild: true 167 | dev: true 168 | optional: true 169 | 170 | /@esbuild/darwin-arm64@0.17.18: 171 | resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} 172 | engines: {node: '>=12'} 173 | cpu: [arm64] 174 | os: [darwin] 175 | requiresBuild: true 176 | dev: true 177 | optional: true 178 | 179 | /@esbuild/darwin-x64@0.17.18: 180 | resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} 181 | engines: {node: '>=12'} 182 | cpu: [x64] 183 | os: [darwin] 184 | requiresBuild: true 185 | dev: true 186 | optional: true 187 | 188 | /@esbuild/freebsd-arm64@0.17.18: 189 | resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} 190 | engines: {node: '>=12'} 191 | cpu: [arm64] 192 | os: [freebsd] 193 | requiresBuild: true 194 | dev: true 195 | optional: true 196 | 197 | /@esbuild/freebsd-x64@0.17.18: 198 | resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} 199 | engines: {node: '>=12'} 200 | cpu: [x64] 201 | os: [freebsd] 202 | requiresBuild: true 203 | dev: true 204 | optional: true 205 | 206 | /@esbuild/linux-arm64@0.17.18: 207 | resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} 208 | engines: {node: '>=12'} 209 | cpu: [arm64] 210 | os: [linux] 211 | requiresBuild: true 212 | dev: true 213 | optional: true 214 | 215 | /@esbuild/linux-arm@0.17.18: 216 | resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} 217 | engines: {node: '>=12'} 218 | cpu: [arm] 219 | os: [linux] 220 | requiresBuild: true 221 | dev: true 222 | optional: true 223 | 224 | /@esbuild/linux-ia32@0.17.18: 225 | resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} 226 | engines: {node: '>=12'} 227 | cpu: [ia32] 228 | os: [linux] 229 | requiresBuild: true 230 | dev: true 231 | optional: true 232 | 233 | /@esbuild/linux-loong64@0.17.18: 234 | resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} 235 | engines: {node: '>=12'} 236 | cpu: [loong64] 237 | os: [linux] 238 | requiresBuild: true 239 | dev: true 240 | optional: true 241 | 242 | /@esbuild/linux-mips64el@0.17.18: 243 | resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} 244 | engines: {node: '>=12'} 245 | cpu: [mips64el] 246 | os: [linux] 247 | requiresBuild: true 248 | dev: true 249 | optional: true 250 | 251 | /@esbuild/linux-ppc64@0.17.18: 252 | resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} 253 | engines: {node: '>=12'} 254 | cpu: [ppc64] 255 | os: [linux] 256 | requiresBuild: true 257 | dev: true 258 | optional: true 259 | 260 | /@esbuild/linux-riscv64@0.17.18: 261 | resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} 262 | engines: {node: '>=12'} 263 | cpu: [riscv64] 264 | os: [linux] 265 | requiresBuild: true 266 | dev: true 267 | optional: true 268 | 269 | /@esbuild/linux-s390x@0.17.18: 270 | resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} 271 | engines: {node: '>=12'} 272 | cpu: [s390x] 273 | os: [linux] 274 | requiresBuild: true 275 | dev: true 276 | optional: true 277 | 278 | /@esbuild/linux-x64@0.17.18: 279 | resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} 280 | engines: {node: '>=12'} 281 | cpu: [x64] 282 | os: [linux] 283 | requiresBuild: true 284 | dev: true 285 | optional: true 286 | 287 | /@esbuild/netbsd-x64@0.17.18: 288 | resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} 289 | engines: {node: '>=12'} 290 | cpu: [x64] 291 | os: [netbsd] 292 | requiresBuild: true 293 | dev: true 294 | optional: true 295 | 296 | /@esbuild/openbsd-x64@0.17.18: 297 | resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} 298 | engines: {node: '>=12'} 299 | cpu: [x64] 300 | os: [openbsd] 301 | requiresBuild: true 302 | dev: true 303 | optional: true 304 | 305 | /@esbuild/sunos-x64@0.17.18: 306 | resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} 307 | engines: {node: '>=12'} 308 | cpu: [x64] 309 | os: [sunos] 310 | requiresBuild: true 311 | dev: true 312 | optional: true 313 | 314 | /@esbuild/win32-arm64@0.17.18: 315 | resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} 316 | engines: {node: '>=12'} 317 | cpu: [arm64] 318 | os: [win32] 319 | requiresBuild: true 320 | dev: true 321 | optional: true 322 | 323 | /@esbuild/win32-ia32@0.17.18: 324 | resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} 325 | engines: {node: '>=12'} 326 | cpu: [ia32] 327 | os: [win32] 328 | requiresBuild: true 329 | dev: true 330 | optional: true 331 | 332 | /@esbuild/win32-x64@0.17.18: 333 | resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} 334 | engines: {node: '>=12'} 335 | cpu: [x64] 336 | os: [win32] 337 | requiresBuild: true 338 | dev: true 339 | optional: true 340 | 341 | /@eslint-community/eslint-utils@4.4.0(eslint@8.35.0): 342 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 343 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 344 | peerDependencies: 345 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 346 | dependencies: 347 | eslint: 8.35.0 348 | eslint-visitor-keys: 3.4.0 349 | dev: true 350 | 351 | /@eslint-community/regexpp@4.5.0: 352 | resolution: {integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==} 353 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 354 | dev: true 355 | 356 | /@eslint/eslintrc@2.0.2: 357 | resolution: {integrity: sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==} 358 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 359 | dependencies: 360 | ajv: 6.12.6 361 | debug: 4.3.4 362 | espree: 9.5.1 363 | globals: 13.20.0 364 | ignore: 5.2.4 365 | import-fresh: 3.3.0 366 | js-yaml: 4.1.0 367 | minimatch: 3.1.2 368 | strip-json-comments: 3.1.1 369 | transitivePeerDependencies: 370 | - supports-color 371 | dev: true 372 | 373 | /@eslint/js@8.35.0: 374 | resolution: {integrity: sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==} 375 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 376 | dev: true 377 | 378 | /@humanwhocodes/config-array@0.11.8: 379 | resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} 380 | engines: {node: '>=10.10.0'} 381 | dependencies: 382 | '@humanwhocodes/object-schema': 1.2.1 383 | debug: 4.3.4 384 | minimatch: 3.1.2 385 | transitivePeerDependencies: 386 | - supports-color 387 | dev: true 388 | 389 | /@humanwhocodes/module-importer@1.0.1: 390 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 391 | engines: {node: '>=12.22'} 392 | dev: true 393 | 394 | /@humanwhocodes/object-schema@1.2.1: 395 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 396 | dev: true 397 | 398 | /@nodelib/fs.scandir@2.1.5: 399 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 400 | engines: {node: '>= 8'} 401 | dependencies: 402 | '@nodelib/fs.stat': 2.0.5 403 | run-parallel: 1.2.0 404 | dev: true 405 | 406 | /@nodelib/fs.stat@2.0.5: 407 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 408 | engines: {node: '>= 8'} 409 | dev: true 410 | 411 | /@nodelib/fs.walk@1.2.8: 412 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 413 | engines: {node: '>= 8'} 414 | dependencies: 415 | '@nodelib/fs.scandir': 2.1.5 416 | fastq: 1.15.0 417 | dev: true 418 | 419 | /@pnpm/config.env-replace@1.1.0: 420 | resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} 421 | engines: {node: '>=12.22.0'} 422 | dev: false 423 | 424 | /@pnpm/network.ca-file@1.0.2: 425 | resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} 426 | engines: {node: '>=12.22.0'} 427 | dependencies: 428 | graceful-fs: 4.2.10 429 | dev: false 430 | 431 | /@pnpm/npm-conf@2.1.1: 432 | resolution: {integrity: sha512-yfRcuupmxxeDOSxvw4g+wFCrGiPD0L32f5WMzqMXp7Rl93EOCdFiDcaSNnZ10Up9GdNqkj70UTa8hfhPFphaZA==} 433 | engines: {node: '>=12'} 434 | dependencies: 435 | '@pnpm/config.env-replace': 1.1.0 436 | '@pnpm/network.ca-file': 1.0.2 437 | config-chain: 1.1.13 438 | dev: false 439 | 440 | /@sindresorhus/is@5.3.0: 441 | resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==} 442 | engines: {node: '>=14.16'} 443 | dev: false 444 | 445 | /@szmarczak/http-timer@5.0.1: 446 | resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} 447 | engines: {node: '>=14.16'} 448 | dependencies: 449 | defer-to-connect: 2.0.1 450 | dev: false 451 | 452 | /@types/configstore@6.0.0: 453 | resolution: {integrity: sha512-GUvNiia85zTDDIx0iPrtF3pI8dwrQkfuokEqxqPDE55qxH0U5SZz4awVZjiJLWN2ZZRkXCUqgsMUbygXY+kytA==} 454 | dev: true 455 | 456 | /@types/http-cache-semantics@4.0.1: 457 | resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} 458 | dev: false 459 | 460 | /@types/json-schema@7.0.11: 461 | resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} 462 | dev: true 463 | 464 | /@types/jsonfile@6.1.1: 465 | resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} 466 | dependencies: 467 | '@types/node': 18.15.3 468 | dev: true 469 | 470 | /@types/md5@2.3.2: 471 | resolution: {integrity: sha512-v+JFDu96+UYJ3/UWzB0mEglIS//MZXgRaJ4ubUPwOM0gvLc/kcQ3TWNYwENEK7/EcXGQVrW8h/XqednSjBd/Og==} 472 | dev: true 473 | 474 | /@types/node@18.15.3: 475 | resolution: {integrity: sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==} 476 | dev: true 477 | 478 | /@types/pluralize@0.0.29: 479 | resolution: {integrity: sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA==} 480 | dev: true 481 | 482 | /@types/semver@7.3.13: 483 | resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} 484 | dev: true 485 | 486 | /@types/update-notifier@6.0.2: 487 | resolution: {integrity: sha512-/OKZaYpzHqBO9D+IzqAB7VfC/fx+xl/CM1upD6D56QPNyvAsFULAVLfjlBIGCl1ibU1rKqZV45xOj018WqHhlA==} 488 | dependencies: 489 | '@types/configstore': 6.0.0 490 | boxen: 7.0.2 491 | dev: true 492 | 493 | /@types/wrap-text@1.0.0: 494 | resolution: {integrity: sha512-VO2RICJdORdwgrvAXDNKtMZ0Za8dP28T9t1ZKug2KkVYS94zVqmSlcfw++6/VpO8tH45RaooTA2URrJyf/Jgjw==} 495 | dev: true 496 | 497 | /@typescript-eslint/eslint-plugin@5.55.0(@typescript-eslint/parser@5.55.0)(eslint@8.35.0)(typescript@5.0.2): 498 | resolution: {integrity: sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==} 499 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 500 | peerDependencies: 501 | '@typescript-eslint/parser': ^5.0.0 502 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 503 | typescript: '*' 504 | peerDependenciesMeta: 505 | typescript: 506 | optional: true 507 | dependencies: 508 | '@eslint-community/regexpp': 4.5.0 509 | '@typescript-eslint/parser': 5.55.0(eslint@8.35.0)(typescript@5.0.2) 510 | '@typescript-eslint/scope-manager': 5.55.0 511 | '@typescript-eslint/type-utils': 5.55.0(eslint@8.35.0)(typescript@5.0.2) 512 | '@typescript-eslint/utils': 5.55.0(eslint@8.35.0)(typescript@5.0.2) 513 | debug: 4.3.4 514 | eslint: 8.35.0 515 | grapheme-splitter: 1.0.4 516 | ignore: 5.2.4 517 | natural-compare-lite: 1.4.0 518 | semver: 7.5.0 519 | tsutils: 3.21.0(typescript@5.0.2) 520 | typescript: 5.0.2 521 | transitivePeerDependencies: 522 | - supports-color 523 | dev: true 524 | 525 | /@typescript-eslint/parser@5.55.0(eslint@8.35.0)(typescript@5.0.2): 526 | resolution: {integrity: sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==} 527 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 528 | peerDependencies: 529 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 530 | typescript: '*' 531 | peerDependenciesMeta: 532 | typescript: 533 | optional: true 534 | dependencies: 535 | '@typescript-eslint/scope-manager': 5.55.0 536 | '@typescript-eslint/types': 5.55.0 537 | '@typescript-eslint/typescript-estree': 5.55.0(typescript@5.0.2) 538 | debug: 4.3.4 539 | eslint: 8.35.0 540 | typescript: 5.0.2 541 | transitivePeerDependencies: 542 | - supports-color 543 | dev: true 544 | 545 | /@typescript-eslint/scope-manager@5.55.0: 546 | resolution: {integrity: sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==} 547 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 548 | dependencies: 549 | '@typescript-eslint/types': 5.55.0 550 | '@typescript-eslint/visitor-keys': 5.55.0 551 | dev: true 552 | 553 | /@typescript-eslint/type-utils@5.55.0(eslint@8.35.0)(typescript@5.0.2): 554 | resolution: {integrity: sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==} 555 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 556 | peerDependencies: 557 | eslint: '*' 558 | typescript: '*' 559 | peerDependenciesMeta: 560 | typescript: 561 | optional: true 562 | dependencies: 563 | '@typescript-eslint/typescript-estree': 5.55.0(typescript@5.0.2) 564 | '@typescript-eslint/utils': 5.55.0(eslint@8.35.0)(typescript@5.0.2) 565 | debug: 4.3.4 566 | eslint: 8.35.0 567 | tsutils: 3.21.0(typescript@5.0.2) 568 | typescript: 5.0.2 569 | transitivePeerDependencies: 570 | - supports-color 571 | dev: true 572 | 573 | /@typescript-eslint/types@5.55.0: 574 | resolution: {integrity: sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==} 575 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 576 | dev: true 577 | 578 | /@typescript-eslint/typescript-estree@5.55.0(typescript@5.0.2): 579 | resolution: {integrity: sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==} 580 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 581 | peerDependencies: 582 | typescript: '*' 583 | peerDependenciesMeta: 584 | typescript: 585 | optional: true 586 | dependencies: 587 | '@typescript-eslint/types': 5.55.0 588 | '@typescript-eslint/visitor-keys': 5.55.0 589 | debug: 4.3.4 590 | globby: 11.1.0 591 | is-glob: 4.0.3 592 | semver: 7.5.0 593 | tsutils: 3.21.0(typescript@5.0.2) 594 | typescript: 5.0.2 595 | transitivePeerDependencies: 596 | - supports-color 597 | dev: true 598 | 599 | /@typescript-eslint/utils@5.55.0(eslint@8.35.0)(typescript@5.0.2): 600 | resolution: {integrity: sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==} 601 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 602 | peerDependencies: 603 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 604 | dependencies: 605 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.35.0) 606 | '@types/json-schema': 7.0.11 607 | '@types/semver': 7.3.13 608 | '@typescript-eslint/scope-manager': 5.55.0 609 | '@typescript-eslint/types': 5.55.0 610 | '@typescript-eslint/typescript-estree': 5.55.0(typescript@5.0.2) 611 | eslint: 8.35.0 612 | eslint-scope: 5.1.1 613 | semver: 7.5.0 614 | transitivePeerDependencies: 615 | - supports-color 616 | - typescript 617 | dev: true 618 | 619 | /@typescript-eslint/visitor-keys@5.55.0: 620 | resolution: {integrity: sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==} 621 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 622 | dependencies: 623 | '@typescript-eslint/types': 5.55.0 624 | eslint-visitor-keys: 3.4.0 625 | dev: true 626 | 627 | /acorn-jsx@5.3.2(acorn@8.8.2): 628 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 629 | peerDependencies: 630 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 631 | dependencies: 632 | acorn: 8.8.2 633 | dev: true 634 | 635 | /acorn@8.8.2: 636 | resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} 637 | engines: {node: '>=0.4.0'} 638 | hasBin: true 639 | dev: true 640 | 641 | /ajv-formats@2.1.1(ajv@8.12.0): 642 | resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} 643 | peerDependencies: 644 | ajv: ^8.0.0 645 | peerDependenciesMeta: 646 | ajv: 647 | optional: true 648 | dependencies: 649 | ajv: 8.12.0 650 | dev: false 651 | 652 | /ajv@6.12.6: 653 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 654 | dependencies: 655 | fast-deep-equal: 3.1.3 656 | fast-json-stable-stringify: 2.1.0 657 | json-schema-traverse: 0.4.1 658 | uri-js: 4.4.1 659 | dev: true 660 | 661 | /ajv@8.12.0: 662 | resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} 663 | dependencies: 664 | fast-deep-equal: 3.1.3 665 | json-schema-traverse: 1.0.0 666 | require-from-string: 2.0.2 667 | uri-js: 4.4.1 668 | dev: false 669 | 670 | /ansi-align@3.0.1: 671 | resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} 672 | dependencies: 673 | string-width: 4.2.3 674 | 675 | /ansi-regex@5.0.1: 676 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 677 | engines: {node: '>=8'} 678 | 679 | /ansi-regex@6.0.1: 680 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 681 | engines: {node: '>=12'} 682 | 683 | /ansi-styles@4.3.0: 684 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 685 | engines: {node: '>=8'} 686 | dependencies: 687 | color-convert: 2.0.1 688 | dev: true 689 | 690 | /ansi-styles@6.2.1: 691 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 692 | engines: {node: '>=12'} 693 | 694 | /any-promise@1.3.0: 695 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 696 | dev: false 697 | 698 | /arch@2.2.0: 699 | resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} 700 | dev: false 701 | 702 | /argparse@2.0.1: 703 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 704 | dev: true 705 | 706 | /array-union@2.1.0: 707 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 708 | engines: {node: '>=8'} 709 | dev: true 710 | 711 | /asynckit@0.4.0: 712 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 713 | dev: false 714 | 715 | /atomically@2.0.1: 716 | resolution: {integrity: sha512-sxBhVZUFBFhqSAsYMM3X2oaUi2NVDJ8U026FsIusM8gYXls9AYs/eXzgGrufs1Qjpkxi9zunds+75QUFz+m7UQ==} 717 | dependencies: 718 | stubborn-fs: 1.2.4 719 | when-exit: 2.1.0 720 | dev: false 721 | 722 | /axios@0.26.1: 723 | resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} 724 | dependencies: 725 | follow-redirects: 1.15.2 726 | transitivePeerDependencies: 727 | - debug 728 | dev: false 729 | 730 | /axios@1.3.5: 731 | resolution: {integrity: sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw==} 732 | dependencies: 733 | follow-redirects: 1.15.2 734 | form-data: 4.0.0 735 | proxy-from-env: 1.1.0 736 | transitivePeerDependencies: 737 | - debug 738 | dev: false 739 | 740 | /balanced-match@1.0.2: 741 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 742 | dev: true 743 | 744 | /base64-js@1.5.1: 745 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 746 | dev: false 747 | 748 | /bl@5.1.0: 749 | resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} 750 | dependencies: 751 | buffer: 6.0.3 752 | inherits: 2.0.4 753 | readable-stream: 3.6.2 754 | dev: false 755 | 756 | /boolean@3.2.0: 757 | resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} 758 | dev: false 759 | 760 | /boxen@7.0.2: 761 | resolution: {integrity: sha512-1Z4UJabXUP1/R9rLpoU3O2lEMnG3pPLAs/ZD2lF3t2q7qD5lM8rqbtnvtvm4N0wEyNlE+9yZVTVAGmd1V5jabg==} 762 | engines: {node: '>=14.16'} 763 | dependencies: 764 | ansi-align: 3.0.1 765 | camelcase: 7.0.1 766 | chalk: 5.2.0 767 | cli-boxes: 3.0.0 768 | string-width: 5.1.2 769 | type-fest: 2.19.0 770 | widest-line: 4.0.1 771 | wrap-ansi: 8.1.0 772 | 773 | /brace-expansion@1.1.11: 774 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 775 | dependencies: 776 | balanced-match: 1.0.2 777 | concat-map: 0.0.1 778 | dev: true 779 | 780 | /braces@3.0.2: 781 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 782 | engines: {node: '>=8'} 783 | dependencies: 784 | fill-range: 7.0.1 785 | dev: true 786 | 787 | /buffer-from@1.1.2: 788 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 789 | dev: true 790 | 791 | /buffer@6.0.3: 792 | resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 793 | dependencies: 794 | base64-js: 1.5.1 795 | ieee754: 1.2.1 796 | dev: false 797 | 798 | /cacheable-lookup@7.0.0: 799 | resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} 800 | engines: {node: '>=14.16'} 801 | dev: false 802 | 803 | /cacheable-request@10.2.9: 804 | resolution: {integrity: sha512-CaAMr53AS1Tb9evO1BIWFnZjSr8A4pbXofpsNVWPMDZZj3ZQKHwsQG9BrTqQ4x5ZYJXz1T2b8LLtTZODxSpzbg==} 805 | engines: {node: '>=14.16'} 806 | dependencies: 807 | '@types/http-cache-semantics': 4.0.1 808 | get-stream: 6.0.1 809 | http-cache-semantics: 4.1.1 810 | keyv: 4.5.2 811 | mimic-response: 4.0.0 812 | normalize-url: 8.0.0 813 | responselike: 3.0.0 814 | dev: false 815 | 816 | /callsites@3.1.0: 817 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 818 | engines: {node: '>=6'} 819 | dev: true 820 | 821 | /camelcase@7.0.1: 822 | resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} 823 | engines: {node: '>=14.16'} 824 | 825 | /chalk@4.1.2: 826 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 827 | engines: {node: '>=10'} 828 | dependencies: 829 | ansi-styles: 4.3.0 830 | supports-color: 7.2.0 831 | dev: true 832 | 833 | /chalk@5.2.0: 834 | resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} 835 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 836 | 837 | /charenc@0.0.2: 838 | resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} 839 | dev: false 840 | 841 | /ci-info@3.8.0: 842 | resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} 843 | engines: {node: '>=8'} 844 | dev: false 845 | 846 | /cli-boxes@3.0.0: 847 | resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} 848 | engines: {node: '>=10'} 849 | 850 | /cli-cursor@4.0.0: 851 | resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} 852 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 853 | dependencies: 854 | restore-cursor: 4.0.0 855 | dev: false 856 | 857 | /cli-spinners@2.8.0: 858 | resolution: {integrity: sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==} 859 | engines: {node: '>=6'} 860 | dev: false 861 | 862 | /clone@1.0.4: 863 | resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} 864 | engines: {node: '>=0.8'} 865 | dev: false 866 | 867 | /color-convert@2.0.1: 868 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 869 | engines: {node: '>=7.0.0'} 870 | dependencies: 871 | color-name: 1.1.4 872 | dev: true 873 | 874 | /color-name@1.1.4: 875 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 876 | dev: true 877 | 878 | /combined-stream@1.0.8: 879 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 880 | engines: {node: '>= 0.8'} 881 | dependencies: 882 | delayed-stream: 1.0.0 883 | dev: false 884 | 885 | /commander@10.0.0: 886 | resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} 887 | engines: {node: '>=14'} 888 | dev: false 889 | 890 | /concat-map@0.0.1: 891 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 892 | dev: true 893 | 894 | /conf@11.0.1: 895 | resolution: {integrity: sha512-WlLiQboEjKx0bYx2IIRGedBgNjLAxtwPaCSnsjWPST5xR0DB4q8lcsO/bEH9ZRYNcj63Y9vj/JG/5Fg6uWzI0Q==} 896 | engines: {node: '>=14.16'} 897 | dependencies: 898 | ajv: 8.12.0 899 | ajv-formats: 2.1.1(ajv@8.12.0) 900 | atomically: 2.0.1 901 | debounce-fn: 5.1.2 902 | dot-prop: 7.2.0 903 | env-paths: 3.0.0 904 | json-schema-typed: 8.0.1 905 | semver: 7.5.0 906 | dev: false 907 | 908 | /config-chain@1.1.13: 909 | resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} 910 | dependencies: 911 | ini: 1.3.8 912 | proto-list: 1.2.4 913 | dev: false 914 | 915 | /configstore@6.0.0: 916 | resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} 917 | engines: {node: '>=12'} 918 | dependencies: 919 | dot-prop: 6.0.1 920 | graceful-fs: 4.2.11 921 | unique-string: 3.0.0 922 | write-file-atomic: 3.0.3 923 | xdg-basedir: 5.1.0 924 | dev: false 925 | 926 | /cross-spawn@7.0.3: 927 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 928 | engines: {node: '>= 8'} 929 | dependencies: 930 | path-key: 3.1.1 931 | shebang-command: 2.0.0 932 | which: 2.0.2 933 | 934 | /crypt@0.0.2: 935 | resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} 936 | dev: false 937 | 938 | /crypto-random-string@4.0.0: 939 | resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} 940 | engines: {node: '>=12'} 941 | dependencies: 942 | type-fest: 1.4.0 943 | dev: false 944 | 945 | /data-uri-to-buffer@4.0.1: 946 | resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 947 | engines: {node: '>= 12'} 948 | dev: false 949 | optional: true 950 | 951 | /debounce-fn@5.1.2: 952 | resolution: {integrity: sha512-Sr4SdOZ4vw6eQDvPYNxHogvrxmCIld/VenC5JbNrFwMiwd7lY/Z18ZFfo+EWNG4DD9nFlAujWAo/wGuOPHmy5A==} 953 | engines: {node: '>=12'} 954 | dependencies: 955 | mimic-fn: 4.0.0 956 | dev: false 957 | 958 | /debug@4.3.4: 959 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 960 | engines: {node: '>=6.0'} 961 | peerDependencies: 962 | supports-color: '*' 963 | peerDependenciesMeta: 964 | supports-color: 965 | optional: true 966 | dependencies: 967 | ms: 2.1.2 968 | dev: true 969 | 970 | /decompress-response@6.0.0: 971 | resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 972 | engines: {node: '>=10'} 973 | dependencies: 974 | mimic-response: 3.1.0 975 | dev: false 976 | 977 | /deep-extend@0.6.0: 978 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 979 | engines: {node: '>=4.0.0'} 980 | dev: false 981 | 982 | /deep-is@0.1.4: 983 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 984 | dev: true 985 | 986 | /defaults@1.0.4: 987 | resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} 988 | dependencies: 989 | clone: 1.0.4 990 | dev: false 991 | 992 | /defer-to-connect@2.0.1: 993 | resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} 994 | engines: {node: '>=10'} 995 | dev: false 996 | 997 | /delayed-stream@1.0.0: 998 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 999 | engines: {node: '>=0.4.0'} 1000 | dev: false 1001 | 1002 | /dir-glob@3.0.1: 1003 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1004 | engines: {node: '>=8'} 1005 | dependencies: 1006 | path-type: 4.0.0 1007 | dev: true 1008 | 1009 | /doctrine@3.0.0: 1010 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1011 | engines: {node: '>=6.0.0'} 1012 | dependencies: 1013 | esutils: 2.0.3 1014 | dev: true 1015 | 1016 | /dot-prop@6.0.1: 1017 | resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} 1018 | engines: {node: '>=10'} 1019 | dependencies: 1020 | is-obj: 2.0.0 1021 | dev: false 1022 | 1023 | /dot-prop@7.2.0: 1024 | resolution: {integrity: sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==} 1025 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1026 | dependencies: 1027 | type-fest: 2.19.0 1028 | dev: false 1029 | 1030 | /dotenv@16.0.3: 1031 | resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} 1032 | engines: {node: '>=12'} 1033 | dev: false 1034 | 1035 | /eastasianwidth@0.2.0: 1036 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1037 | 1038 | /emoji-regex@8.0.0: 1039 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1040 | 1041 | /emoji-regex@9.2.2: 1042 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1043 | 1044 | /env-paths@3.0.0: 1045 | resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} 1046 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1047 | dev: false 1048 | 1049 | /esbuild@0.17.18: 1050 | resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} 1051 | engines: {node: '>=12'} 1052 | hasBin: true 1053 | requiresBuild: true 1054 | optionalDependencies: 1055 | '@esbuild/android-arm': 0.17.18 1056 | '@esbuild/android-arm64': 0.17.18 1057 | '@esbuild/android-x64': 0.17.18 1058 | '@esbuild/darwin-arm64': 0.17.18 1059 | '@esbuild/darwin-x64': 0.17.18 1060 | '@esbuild/freebsd-arm64': 0.17.18 1061 | '@esbuild/freebsd-x64': 0.17.18 1062 | '@esbuild/linux-arm': 0.17.18 1063 | '@esbuild/linux-arm64': 0.17.18 1064 | '@esbuild/linux-ia32': 0.17.18 1065 | '@esbuild/linux-loong64': 0.17.18 1066 | '@esbuild/linux-mips64el': 0.17.18 1067 | '@esbuild/linux-ppc64': 0.17.18 1068 | '@esbuild/linux-riscv64': 0.17.18 1069 | '@esbuild/linux-s390x': 0.17.18 1070 | '@esbuild/linux-x64': 0.17.18 1071 | '@esbuild/netbsd-x64': 0.17.18 1072 | '@esbuild/openbsd-x64': 0.17.18 1073 | '@esbuild/sunos-x64': 0.17.18 1074 | '@esbuild/win32-arm64': 0.17.18 1075 | '@esbuild/win32-ia32': 0.17.18 1076 | '@esbuild/win32-x64': 0.17.18 1077 | dev: true 1078 | 1079 | /escape-goat@4.0.0: 1080 | resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} 1081 | engines: {node: '>=12'} 1082 | dev: false 1083 | 1084 | /escape-string-regexp@4.0.0: 1085 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1086 | engines: {node: '>=10'} 1087 | dev: true 1088 | 1089 | /eslint-scope@5.1.1: 1090 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 1091 | engines: {node: '>=8.0.0'} 1092 | dependencies: 1093 | esrecurse: 4.3.0 1094 | estraverse: 4.3.0 1095 | dev: true 1096 | 1097 | /eslint-scope@7.2.0: 1098 | resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} 1099 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1100 | dependencies: 1101 | esrecurse: 4.3.0 1102 | estraverse: 5.3.0 1103 | dev: true 1104 | 1105 | /eslint-utils@3.0.0(eslint@8.35.0): 1106 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 1107 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 1108 | peerDependencies: 1109 | eslint: '>=5' 1110 | dependencies: 1111 | eslint: 8.35.0 1112 | eslint-visitor-keys: 2.1.0 1113 | dev: true 1114 | 1115 | /eslint-visitor-keys@2.1.0: 1116 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 1117 | engines: {node: '>=10'} 1118 | dev: true 1119 | 1120 | /eslint-visitor-keys@3.4.0: 1121 | resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} 1122 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1123 | dev: true 1124 | 1125 | /eslint@8.35.0: 1126 | resolution: {integrity: sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==} 1127 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1128 | hasBin: true 1129 | dependencies: 1130 | '@eslint/eslintrc': 2.0.2 1131 | '@eslint/js': 8.35.0 1132 | '@humanwhocodes/config-array': 0.11.8 1133 | '@humanwhocodes/module-importer': 1.0.1 1134 | '@nodelib/fs.walk': 1.2.8 1135 | ajv: 6.12.6 1136 | chalk: 4.1.2 1137 | cross-spawn: 7.0.3 1138 | debug: 4.3.4 1139 | doctrine: 3.0.0 1140 | escape-string-regexp: 4.0.0 1141 | eslint-scope: 7.2.0 1142 | eslint-utils: 3.0.0(eslint@8.35.0) 1143 | eslint-visitor-keys: 3.4.0 1144 | espree: 9.5.1 1145 | esquery: 1.5.0 1146 | esutils: 2.0.3 1147 | fast-deep-equal: 3.1.3 1148 | file-entry-cache: 6.0.1 1149 | find-up: 5.0.0 1150 | glob-parent: 6.0.2 1151 | globals: 13.20.0 1152 | grapheme-splitter: 1.0.4 1153 | ignore: 5.2.4 1154 | import-fresh: 3.3.0 1155 | imurmurhash: 0.1.4 1156 | is-glob: 4.0.3 1157 | is-path-inside: 3.0.3 1158 | js-sdsl: 4.4.0 1159 | js-yaml: 4.1.0 1160 | json-stable-stringify-without-jsonify: 1.0.1 1161 | levn: 0.4.1 1162 | lodash.merge: 4.6.2 1163 | minimatch: 3.1.2 1164 | natural-compare: 1.4.0 1165 | optionator: 0.9.1 1166 | regexpp: 3.2.0 1167 | strip-ansi: 6.0.1 1168 | strip-json-comments: 3.1.1 1169 | text-table: 0.2.0 1170 | transitivePeerDependencies: 1171 | - supports-color 1172 | dev: true 1173 | 1174 | /espree@9.5.1: 1175 | resolution: {integrity: sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==} 1176 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1177 | dependencies: 1178 | acorn: 8.8.2 1179 | acorn-jsx: 5.3.2(acorn@8.8.2) 1180 | eslint-visitor-keys: 3.4.0 1181 | dev: true 1182 | 1183 | /esquery@1.5.0: 1184 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 1185 | engines: {node: '>=0.10'} 1186 | dependencies: 1187 | estraverse: 5.3.0 1188 | dev: true 1189 | 1190 | /esrecurse@4.3.0: 1191 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1192 | engines: {node: '>=4.0'} 1193 | dependencies: 1194 | estraverse: 5.3.0 1195 | dev: true 1196 | 1197 | /estraverse@4.3.0: 1198 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 1199 | engines: {node: '>=4.0'} 1200 | dev: true 1201 | 1202 | /estraverse@5.3.0: 1203 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1204 | engines: {node: '>=4.0'} 1205 | dev: true 1206 | 1207 | /esutils@2.0.3: 1208 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1209 | engines: {node: '>=0.10.0'} 1210 | dev: true 1211 | 1212 | /execa@5.1.1: 1213 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 1214 | engines: {node: '>=10'} 1215 | dependencies: 1216 | cross-spawn: 7.0.3 1217 | get-stream: 6.0.1 1218 | human-signals: 2.1.0 1219 | is-stream: 2.0.1 1220 | merge-stream: 2.0.0 1221 | npm-run-path: 4.0.1 1222 | onetime: 5.1.2 1223 | signal-exit: 3.0.7 1224 | strip-final-newline: 2.0.0 1225 | dev: false 1226 | 1227 | /fast-deep-equal@3.1.3: 1228 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1229 | 1230 | /fast-glob@3.2.12: 1231 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 1232 | engines: {node: '>=8.6.0'} 1233 | dependencies: 1234 | '@nodelib/fs.stat': 2.0.5 1235 | '@nodelib/fs.walk': 1.2.8 1236 | glob-parent: 5.1.2 1237 | merge2: 1.4.1 1238 | micromatch: 4.0.5 1239 | dev: true 1240 | 1241 | /fast-json-stable-stringify@2.1.0: 1242 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1243 | dev: true 1244 | 1245 | /fast-levenshtein@2.0.6: 1246 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1247 | dev: true 1248 | 1249 | /fastq@1.15.0: 1250 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 1251 | dependencies: 1252 | reusify: 1.0.4 1253 | dev: true 1254 | 1255 | /fetch-blob@3.2.0: 1256 | resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} 1257 | engines: {node: ^12.20 || >= 14.13} 1258 | dependencies: 1259 | node-domexception: 1.0.0 1260 | web-streams-polyfill: 3.2.1 1261 | dev: false 1262 | optional: true 1263 | 1264 | /file-entry-cache@6.0.1: 1265 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1266 | engines: {node: ^10.12.0 || >=12.0.0} 1267 | dependencies: 1268 | flat-cache: 3.0.4 1269 | dev: true 1270 | 1271 | /fill-range@7.0.1: 1272 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1273 | engines: {node: '>=8'} 1274 | dependencies: 1275 | to-regex-range: 5.0.1 1276 | dev: true 1277 | 1278 | /find-up@5.0.0: 1279 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1280 | engines: {node: '>=10'} 1281 | dependencies: 1282 | locate-path: 6.0.0 1283 | path-exists: 4.0.0 1284 | dev: true 1285 | 1286 | /flat-cache@3.0.4: 1287 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 1288 | engines: {node: ^10.12.0 || >=12.0.0} 1289 | dependencies: 1290 | flatted: 3.2.7 1291 | rimraf: 3.0.2 1292 | dev: true 1293 | 1294 | /flatted@3.2.7: 1295 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 1296 | dev: true 1297 | 1298 | /follow-redirects@1.15.2: 1299 | resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} 1300 | engines: {node: '>=4.0'} 1301 | peerDependencies: 1302 | debug: '*' 1303 | peerDependenciesMeta: 1304 | debug: 1305 | optional: true 1306 | dev: false 1307 | 1308 | /form-data-encoder@2.1.4: 1309 | resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} 1310 | engines: {node: '>= 14.17'} 1311 | dev: false 1312 | 1313 | /form-data@4.0.0: 1314 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 1315 | engines: {node: '>= 6'} 1316 | dependencies: 1317 | asynckit: 0.4.0 1318 | combined-stream: 1.0.8 1319 | mime-types: 2.1.35 1320 | dev: false 1321 | 1322 | /formdata-polyfill@4.0.10: 1323 | resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} 1324 | engines: {node: '>=12.20.0'} 1325 | dependencies: 1326 | fetch-blob: 3.2.0 1327 | dev: false 1328 | optional: true 1329 | 1330 | /fs.realpath@1.0.0: 1331 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1332 | dev: true 1333 | 1334 | /fsevents@2.3.2: 1335 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1336 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1337 | os: [darwin] 1338 | requiresBuild: true 1339 | dev: true 1340 | optional: true 1341 | 1342 | /get-stream@6.0.1: 1343 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1344 | engines: {node: '>=10'} 1345 | dev: false 1346 | 1347 | /get-tsconfig@4.5.0: 1348 | resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} 1349 | dev: true 1350 | 1351 | /glob-parent@5.1.2: 1352 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1353 | engines: {node: '>= 6'} 1354 | dependencies: 1355 | is-glob: 4.0.3 1356 | dev: true 1357 | 1358 | /glob-parent@6.0.2: 1359 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1360 | engines: {node: '>=10.13.0'} 1361 | dependencies: 1362 | is-glob: 4.0.3 1363 | dev: true 1364 | 1365 | /glob@7.2.3: 1366 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1367 | dependencies: 1368 | fs.realpath: 1.0.0 1369 | inflight: 1.0.6 1370 | inherits: 2.0.4 1371 | minimatch: 3.1.2 1372 | once: 1.4.0 1373 | path-is-absolute: 1.0.1 1374 | dev: true 1375 | 1376 | /global-dirs@3.0.1: 1377 | resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} 1378 | engines: {node: '>=10'} 1379 | dependencies: 1380 | ini: 2.0.0 1381 | dev: false 1382 | 1383 | /globals@13.20.0: 1384 | resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} 1385 | engines: {node: '>=8'} 1386 | dependencies: 1387 | type-fest: 0.20.2 1388 | dev: true 1389 | 1390 | /globby@11.1.0: 1391 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1392 | engines: {node: '>=10'} 1393 | dependencies: 1394 | array-union: 2.1.0 1395 | dir-glob: 3.0.1 1396 | fast-glob: 3.2.12 1397 | ignore: 5.2.4 1398 | merge2: 1.4.1 1399 | slash: 3.0.0 1400 | dev: true 1401 | 1402 | /got@12.6.0: 1403 | resolution: {integrity: sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==} 1404 | engines: {node: '>=14.16'} 1405 | dependencies: 1406 | '@sindresorhus/is': 5.3.0 1407 | '@szmarczak/http-timer': 5.0.1 1408 | cacheable-lookup: 7.0.0 1409 | cacheable-request: 10.2.9 1410 | decompress-response: 6.0.0 1411 | form-data-encoder: 2.1.4 1412 | get-stream: 6.0.1 1413 | http2-wrapper: 2.2.0 1414 | lowercase-keys: 3.0.0 1415 | p-cancelable: 3.0.0 1416 | responselike: 3.0.0 1417 | dev: false 1418 | 1419 | /graceful-fs@4.2.10: 1420 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 1421 | dev: false 1422 | 1423 | /graceful-fs@4.2.11: 1424 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1425 | dev: false 1426 | 1427 | /grapheme-splitter@1.0.4: 1428 | resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} 1429 | dev: true 1430 | 1431 | /has-flag@4.0.0: 1432 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1433 | engines: {node: '>=8'} 1434 | dev: true 1435 | 1436 | /has-yarn@3.0.0: 1437 | resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} 1438 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1439 | dev: false 1440 | 1441 | /http-cache-semantics@4.1.1: 1442 | resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} 1443 | dev: false 1444 | 1445 | /http2-wrapper@2.2.0: 1446 | resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} 1447 | engines: {node: '>=10.19.0'} 1448 | dependencies: 1449 | quick-lru: 5.1.1 1450 | resolve-alpn: 1.2.1 1451 | dev: false 1452 | 1453 | /human-signals@2.1.0: 1454 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 1455 | engines: {node: '>=10.17.0'} 1456 | dev: false 1457 | 1458 | /ieee754@1.2.1: 1459 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1460 | dev: false 1461 | 1462 | /ignore@5.2.4: 1463 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 1464 | engines: {node: '>= 4'} 1465 | dev: true 1466 | 1467 | /import-fresh@3.3.0: 1468 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1469 | engines: {node: '>=6'} 1470 | dependencies: 1471 | parent-module: 1.0.1 1472 | resolve-from: 4.0.0 1473 | dev: true 1474 | 1475 | /import-lazy@4.0.0: 1476 | resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} 1477 | engines: {node: '>=8'} 1478 | dev: false 1479 | 1480 | /imurmurhash@0.1.4: 1481 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1482 | engines: {node: '>=0.8.19'} 1483 | 1484 | /inflight@1.0.6: 1485 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1486 | dependencies: 1487 | once: 1.4.0 1488 | wrappy: 1.0.2 1489 | dev: true 1490 | 1491 | /inherits@2.0.4: 1492 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1493 | 1494 | /ini@1.3.8: 1495 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 1496 | dev: false 1497 | 1498 | /ini@2.0.0: 1499 | resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} 1500 | engines: {node: '>=10'} 1501 | dev: false 1502 | 1503 | /is-buffer@1.1.6: 1504 | resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} 1505 | dev: false 1506 | 1507 | /is-ci@3.0.1: 1508 | resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} 1509 | hasBin: true 1510 | dependencies: 1511 | ci-info: 3.8.0 1512 | dev: false 1513 | 1514 | /is-docker@2.2.1: 1515 | resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} 1516 | engines: {node: '>=8'} 1517 | hasBin: true 1518 | dev: false 1519 | 1520 | /is-extglob@2.1.1: 1521 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1522 | engines: {node: '>=0.10.0'} 1523 | dev: true 1524 | 1525 | /is-fullwidth-code-point@3.0.0: 1526 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1527 | engines: {node: '>=8'} 1528 | 1529 | /is-glob@4.0.3: 1530 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1531 | engines: {node: '>=0.10.0'} 1532 | dependencies: 1533 | is-extglob: 2.1.1 1534 | dev: true 1535 | 1536 | /is-installed-globally@0.4.0: 1537 | resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} 1538 | engines: {node: '>=10'} 1539 | dependencies: 1540 | global-dirs: 3.0.1 1541 | is-path-inside: 3.0.3 1542 | dev: false 1543 | 1544 | /is-interactive@2.0.0: 1545 | resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} 1546 | engines: {node: '>=12'} 1547 | dev: false 1548 | 1549 | /is-npm@6.0.0: 1550 | resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} 1551 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1552 | dev: false 1553 | 1554 | /is-number@7.0.0: 1555 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1556 | engines: {node: '>=0.12.0'} 1557 | dev: true 1558 | 1559 | /is-obj@2.0.0: 1560 | resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} 1561 | engines: {node: '>=8'} 1562 | dev: false 1563 | 1564 | /is-path-inside@3.0.3: 1565 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1566 | engines: {node: '>=8'} 1567 | 1568 | /is-stream@2.0.1: 1569 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1570 | engines: {node: '>=8'} 1571 | dev: false 1572 | 1573 | /is-typedarray@1.0.0: 1574 | resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} 1575 | dev: false 1576 | 1577 | /is-unicode-supported@1.3.0: 1578 | resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} 1579 | engines: {node: '>=12'} 1580 | dev: false 1581 | 1582 | /is-wsl@2.2.0: 1583 | resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} 1584 | engines: {node: '>=8'} 1585 | dependencies: 1586 | is-docker: 2.2.1 1587 | dev: false 1588 | 1589 | /is-yarn-global@0.4.1: 1590 | resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} 1591 | engines: {node: '>=12'} 1592 | dev: false 1593 | 1594 | /isexe@2.0.0: 1595 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1596 | 1597 | /js-sdsl@4.4.0: 1598 | resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} 1599 | dev: true 1600 | 1601 | /js-yaml@4.1.0: 1602 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1603 | hasBin: true 1604 | dependencies: 1605 | argparse: 2.0.1 1606 | dev: true 1607 | 1608 | /json-buffer@3.0.1: 1609 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1610 | dev: false 1611 | 1612 | /json-schema-traverse@0.4.1: 1613 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1614 | dev: true 1615 | 1616 | /json-schema-traverse@1.0.0: 1617 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 1618 | dev: false 1619 | 1620 | /json-schema-typed@8.0.1: 1621 | resolution: {integrity: sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==} 1622 | dev: false 1623 | 1624 | /json-stable-stringify-without-jsonify@1.0.1: 1625 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1626 | dev: true 1627 | 1628 | /jsonfile@6.1.0: 1629 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 1630 | dependencies: 1631 | universalify: 2.0.0 1632 | optionalDependencies: 1633 | graceful-fs: 4.2.11 1634 | dev: false 1635 | 1636 | /keyv@4.5.2: 1637 | resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} 1638 | dependencies: 1639 | json-buffer: 3.0.1 1640 | dev: false 1641 | 1642 | /latest-version@7.0.0: 1643 | resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} 1644 | engines: {node: '>=14.16'} 1645 | dependencies: 1646 | package-json: 8.1.0 1647 | dev: false 1648 | 1649 | /levn@0.4.1: 1650 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1651 | engines: {node: '>= 0.8.0'} 1652 | dependencies: 1653 | prelude-ls: 1.2.1 1654 | type-check: 0.4.0 1655 | dev: true 1656 | 1657 | /locate-path@6.0.0: 1658 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1659 | engines: {node: '>=10'} 1660 | dependencies: 1661 | p-locate: 5.0.0 1662 | dev: true 1663 | 1664 | /lodash.merge@4.6.2: 1665 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1666 | dev: true 1667 | 1668 | /log-symbols@5.1.0: 1669 | resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} 1670 | engines: {node: '>=12'} 1671 | dependencies: 1672 | chalk: 5.2.0 1673 | is-unicode-supported: 1.3.0 1674 | dev: false 1675 | 1676 | /lowercase-keys@3.0.0: 1677 | resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} 1678 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1679 | dev: false 1680 | 1681 | /lru-cache@6.0.0: 1682 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1683 | engines: {node: '>=10'} 1684 | dependencies: 1685 | yallist: 4.0.0 1686 | 1687 | /match-words@0.1.1: 1688 | resolution: {integrity: sha512-cywKmeeoNFi//GGLHZ+Zb/M3ZX0VTwJjotLMWhDZoBRtSbw3kraIuIxw7P/xy+t5NSAMHNVeljM63WRBYQ563w==} 1689 | engines: {node: '>=0.10.0'} 1690 | dependencies: 1691 | word-regex: 0.1.2 1692 | dev: false 1693 | 1694 | /md5@2.3.0: 1695 | resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} 1696 | dependencies: 1697 | charenc: 0.0.2 1698 | crypt: 0.0.2 1699 | is-buffer: 1.1.6 1700 | dev: false 1701 | 1702 | /merge-stream@2.0.0: 1703 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1704 | dev: false 1705 | 1706 | /merge2@1.4.1: 1707 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1708 | engines: {node: '>= 8'} 1709 | dev: true 1710 | 1711 | /micromatch@4.0.5: 1712 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1713 | engines: {node: '>=8.6'} 1714 | dependencies: 1715 | braces: 3.0.2 1716 | picomatch: 2.3.1 1717 | dev: true 1718 | 1719 | /mime-db@1.52.0: 1720 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1721 | engines: {node: '>= 0.6'} 1722 | dev: false 1723 | 1724 | /mime-types@2.1.35: 1725 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1726 | engines: {node: '>= 0.6'} 1727 | dependencies: 1728 | mime-db: 1.52.0 1729 | dev: false 1730 | 1731 | /mimic-fn@2.1.0: 1732 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1733 | engines: {node: '>=6'} 1734 | dev: false 1735 | 1736 | /mimic-fn@4.0.0: 1737 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 1738 | engines: {node: '>=12'} 1739 | dev: false 1740 | 1741 | /mimic-response@3.1.0: 1742 | resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 1743 | engines: {node: '>=10'} 1744 | dev: false 1745 | 1746 | /mimic-response@4.0.0: 1747 | resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} 1748 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1749 | dev: false 1750 | 1751 | /minimatch@3.1.2: 1752 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1753 | dependencies: 1754 | brace-expansion: 1.1.11 1755 | dev: true 1756 | 1757 | /minimist@1.2.8: 1758 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1759 | dev: false 1760 | 1761 | /ms@2.1.2: 1762 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1763 | dev: true 1764 | 1765 | /mz@2.7.0: 1766 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1767 | dependencies: 1768 | any-promise: 1.3.0 1769 | object-assign: 4.1.1 1770 | thenify-all: 1.6.0 1771 | dev: false 1772 | 1773 | /natural-compare-lite@1.4.0: 1774 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} 1775 | dev: true 1776 | 1777 | /natural-compare@1.4.0: 1778 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1779 | dev: true 1780 | 1781 | /node-clipboardy@1.0.3: 1782 | resolution: {integrity: sha512-/ErAFOtWDNhZh38rrwlAo05Soxbht/rgWugLOt2Ds+NDpZ+2sPiGiwOmFWzV+65fUYjwi+EJfHByIJ4waTHbVg==} 1783 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1784 | dependencies: 1785 | arch: 2.2.0 1786 | execa: 5.1.1 1787 | is-wsl: 2.2.0 1788 | dev: false 1789 | 1790 | /node-domexception@1.0.0: 1791 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 1792 | engines: {node: '>=10.5.0'} 1793 | dev: false 1794 | optional: true 1795 | 1796 | /node-fetch@3.3.1: 1797 | resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} 1798 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1799 | requiresBuild: true 1800 | dependencies: 1801 | data-uri-to-buffer: 4.0.1 1802 | fetch-blob: 3.2.0 1803 | formdata-polyfill: 4.0.10 1804 | dev: false 1805 | optional: true 1806 | 1807 | /normalize-url@8.0.0: 1808 | resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} 1809 | engines: {node: '>=14.16'} 1810 | dev: false 1811 | 1812 | /npm-run-path@4.0.1: 1813 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1814 | engines: {node: '>=8'} 1815 | dependencies: 1816 | path-key: 3.1.1 1817 | dev: false 1818 | 1819 | /object-assign@4.1.1: 1820 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1821 | engines: {node: '>=0.10.0'} 1822 | dev: false 1823 | 1824 | /once@1.4.0: 1825 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1826 | dependencies: 1827 | wrappy: 1.0.2 1828 | dev: true 1829 | 1830 | /onetime@5.1.2: 1831 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1832 | engines: {node: '>=6'} 1833 | dependencies: 1834 | mimic-fn: 2.1.0 1835 | dev: false 1836 | 1837 | /openai@3.2.1: 1838 | resolution: {integrity: sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==} 1839 | dependencies: 1840 | axios: 0.26.1 1841 | form-data: 4.0.0 1842 | transitivePeerDependencies: 1843 | - debug 1844 | dev: false 1845 | 1846 | /optionator@0.9.1: 1847 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 1848 | engines: {node: '>= 0.8.0'} 1849 | dependencies: 1850 | deep-is: 0.1.4 1851 | fast-levenshtein: 2.0.6 1852 | levn: 0.4.1 1853 | prelude-ls: 1.2.1 1854 | type-check: 0.4.0 1855 | word-wrap: 1.2.3 1856 | dev: true 1857 | 1858 | /ora@6.3.0: 1859 | resolution: {integrity: sha512-1/D8uRFY0ay2kgBpmAwmSA404w4OoPVhHMqRqtjvrcK/dnzcEZxMJ+V4DUbyICu8IIVRclHcOf5wlD1tMY4GUQ==} 1860 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1861 | dependencies: 1862 | chalk: 5.2.0 1863 | cli-cursor: 4.0.0 1864 | cli-spinners: 2.8.0 1865 | is-interactive: 2.0.0 1866 | is-unicode-supported: 1.3.0 1867 | log-symbols: 5.1.0 1868 | stdin-discarder: 0.1.0 1869 | strip-ansi: 7.0.1 1870 | wcwidth: 1.0.1 1871 | dev: false 1872 | 1873 | /p-cancelable@3.0.0: 1874 | resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} 1875 | engines: {node: '>=12.20'} 1876 | dev: false 1877 | 1878 | /p-limit@3.1.0: 1879 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1880 | engines: {node: '>=10'} 1881 | dependencies: 1882 | yocto-queue: 0.1.0 1883 | dev: true 1884 | 1885 | /p-locate@5.0.0: 1886 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1887 | engines: {node: '>=10'} 1888 | dependencies: 1889 | p-limit: 3.1.0 1890 | dev: true 1891 | 1892 | /package-json@8.1.0: 1893 | resolution: {integrity: sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==} 1894 | engines: {node: '>=14.16'} 1895 | dependencies: 1896 | got: 12.6.0 1897 | registry-auth-token: 5.0.2 1898 | registry-url: 6.0.1 1899 | semver: 7.5.0 1900 | dev: false 1901 | 1902 | /parent-module@1.0.1: 1903 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1904 | engines: {node: '>=6'} 1905 | dependencies: 1906 | callsites: 3.1.0 1907 | dev: true 1908 | 1909 | /parse-ms@3.0.0: 1910 | resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} 1911 | engines: {node: '>=12'} 1912 | dev: false 1913 | 1914 | /path-exists@4.0.0: 1915 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1916 | engines: {node: '>=8'} 1917 | dev: true 1918 | 1919 | /path-is-absolute@1.0.1: 1920 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1921 | engines: {node: '>=0.10.0'} 1922 | dev: true 1923 | 1924 | /path-key@3.1.1: 1925 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1926 | engines: {node: '>=8'} 1927 | 1928 | /path-type@4.0.0: 1929 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1930 | engines: {node: '>=8'} 1931 | dev: true 1932 | 1933 | /picocolors@1.0.0: 1934 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1935 | dev: false 1936 | 1937 | /picomatch@2.3.1: 1938 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1939 | engines: {node: '>=8.6'} 1940 | dev: true 1941 | 1942 | /pluralize@8.0.0: 1943 | resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} 1944 | engines: {node: '>=4'} 1945 | dev: false 1946 | 1947 | /prelude-ls@1.2.1: 1948 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1949 | engines: {node: '>= 0.8.0'} 1950 | dev: true 1951 | 1952 | /pretty-ms@8.0.0: 1953 | resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} 1954 | engines: {node: '>=14.16'} 1955 | dependencies: 1956 | parse-ms: 3.0.0 1957 | dev: false 1958 | 1959 | /proto-list@1.2.4: 1960 | resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} 1961 | dev: false 1962 | 1963 | /proxy-from-env@1.1.0: 1964 | resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} 1965 | dev: false 1966 | 1967 | /punycode@2.3.0: 1968 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 1969 | engines: {node: '>=6'} 1970 | 1971 | /pupa@3.1.0: 1972 | resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} 1973 | engines: {node: '>=12.20'} 1974 | dependencies: 1975 | escape-goat: 4.0.0 1976 | dev: false 1977 | 1978 | /queue-microtask@1.2.3: 1979 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1980 | dev: true 1981 | 1982 | /quick-lru@5.1.1: 1983 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 1984 | engines: {node: '>=10'} 1985 | dev: false 1986 | 1987 | /rc@1.2.8: 1988 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 1989 | hasBin: true 1990 | dependencies: 1991 | deep-extend: 0.6.0 1992 | ini: 1.3.8 1993 | minimist: 1.2.8 1994 | strip-json-comments: 2.0.1 1995 | dev: false 1996 | 1997 | /read-last-lines@1.8.0: 1998 | resolution: {integrity: sha512-oPL0cnZkhsO2xF7DBrdzVhXSNajPP5TzzCim/2IAjeGb17ArLLTRriI/ceV6Rook3L27mvbrOvLlf9xYYnaftQ==} 1999 | dependencies: 2000 | mz: 2.7.0 2001 | dev: false 2002 | 2003 | /readable-stream@3.6.2: 2004 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 2005 | engines: {node: '>= 6'} 2006 | dependencies: 2007 | inherits: 2.0.4 2008 | string_decoder: 1.3.0 2009 | util-deprecate: 1.0.2 2010 | dev: false 2011 | 2012 | /regexpp@3.2.0: 2013 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 2014 | engines: {node: '>=8'} 2015 | dev: true 2016 | 2017 | /registry-auth-token@5.0.2: 2018 | resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} 2019 | engines: {node: '>=14'} 2020 | dependencies: 2021 | '@pnpm/npm-conf': 2.1.1 2022 | dev: false 2023 | 2024 | /registry-url@6.0.1: 2025 | resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} 2026 | engines: {node: '>=12'} 2027 | dependencies: 2028 | rc: 1.2.8 2029 | dev: false 2030 | 2031 | /require-from-string@2.0.2: 2032 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 2033 | engines: {node: '>=0.10.0'} 2034 | dev: false 2035 | 2036 | /resolve-alpn@1.2.1: 2037 | resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} 2038 | dev: false 2039 | 2040 | /resolve-from@4.0.0: 2041 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2042 | engines: {node: '>=4'} 2043 | dev: true 2044 | 2045 | /responselike@3.0.0: 2046 | resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} 2047 | engines: {node: '>=14.16'} 2048 | dependencies: 2049 | lowercase-keys: 3.0.0 2050 | dev: false 2051 | 2052 | /restore-cursor@4.0.0: 2053 | resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} 2054 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2055 | dependencies: 2056 | onetime: 5.1.2 2057 | signal-exit: 3.0.7 2058 | dev: false 2059 | 2060 | /reusify@1.0.4: 2061 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2062 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2063 | dev: true 2064 | 2065 | /rimraf@3.0.2: 2066 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2067 | hasBin: true 2068 | dependencies: 2069 | glob: 7.2.3 2070 | dev: true 2071 | 2072 | /run-parallel@1.2.0: 2073 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2074 | dependencies: 2075 | queue-microtask: 1.2.3 2076 | dev: true 2077 | 2078 | /safe-buffer@5.2.1: 2079 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 2080 | dev: false 2081 | 2082 | /semver-diff@4.0.0: 2083 | resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} 2084 | engines: {node: '>=12'} 2085 | dependencies: 2086 | semver: 7.5.0 2087 | dev: false 2088 | 2089 | /semver@7.5.0: 2090 | resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} 2091 | engines: {node: '>=10'} 2092 | hasBin: true 2093 | dependencies: 2094 | lru-cache: 6.0.0 2095 | 2096 | /shebang-command@2.0.0: 2097 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2098 | engines: {node: '>=8'} 2099 | dependencies: 2100 | shebang-regex: 3.0.0 2101 | 2102 | /shebang-regex@3.0.0: 2103 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2104 | engines: {node: '>=8'} 2105 | 2106 | /signal-exit@3.0.7: 2107 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 2108 | dev: false 2109 | 2110 | /sisteransi@1.0.5: 2111 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 2112 | dev: false 2113 | 2114 | /slash@3.0.0: 2115 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2116 | engines: {node: '>=8'} 2117 | dev: true 2118 | 2119 | /source-map-support@0.5.21: 2120 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 2121 | dependencies: 2122 | buffer-from: 1.1.2 2123 | source-map: 0.6.1 2124 | dev: true 2125 | 2126 | /source-map@0.6.1: 2127 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2128 | engines: {node: '>=0.10.0'} 2129 | dev: true 2130 | 2131 | /stdin-discarder@0.1.0: 2132 | resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} 2133 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2134 | dependencies: 2135 | bl: 5.1.0 2136 | dev: false 2137 | 2138 | /string-width@4.2.3: 2139 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2140 | engines: {node: '>=8'} 2141 | dependencies: 2142 | emoji-regex: 8.0.0 2143 | is-fullwidth-code-point: 3.0.0 2144 | strip-ansi: 6.0.1 2145 | 2146 | /string-width@5.1.2: 2147 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 2148 | engines: {node: '>=12'} 2149 | dependencies: 2150 | eastasianwidth: 0.2.0 2151 | emoji-regex: 9.2.2 2152 | strip-ansi: 7.0.1 2153 | 2154 | /string_decoder@1.3.0: 2155 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 2156 | dependencies: 2157 | safe-buffer: 5.2.1 2158 | dev: false 2159 | 2160 | /strip-ansi@6.0.1: 2161 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2162 | engines: {node: '>=8'} 2163 | dependencies: 2164 | ansi-regex: 5.0.1 2165 | 2166 | /strip-ansi@7.0.1: 2167 | resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} 2168 | engines: {node: '>=12'} 2169 | dependencies: 2170 | ansi-regex: 6.0.1 2171 | 2172 | /strip-final-newline@2.0.0: 2173 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 2174 | engines: {node: '>=6'} 2175 | dev: false 2176 | 2177 | /strip-json-comments@2.0.1: 2178 | resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 2179 | engines: {node: '>=0.10.0'} 2180 | dev: false 2181 | 2182 | /strip-json-comments@3.1.1: 2183 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2184 | engines: {node: '>=8'} 2185 | dev: true 2186 | 2187 | /stubborn-fs@1.2.4: 2188 | resolution: {integrity: sha512-KRa4nIRJ8q6uApQbPwYZVhOof8979fw4xbajBWa5kPJFa4nyY3aFaMWVyIVCDnkNCCG/3HLipUZ4QaNlYsmX1w==} 2189 | dev: false 2190 | 2191 | /supports-color@7.2.0: 2192 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2193 | engines: {node: '>=8'} 2194 | dependencies: 2195 | has-flag: 4.0.0 2196 | dev: true 2197 | 2198 | /term-size@3.0.2: 2199 | resolution: {integrity: sha512-YfE8KwjrumviCxmeOS1r1hAwqUcd/AnhrG/Pol/Gry91EyUCS+jQH0qFUZOUkpGQ5rXsKMK6S6kjne53ytYS/w==} 2200 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2201 | dev: false 2202 | 2203 | /text-table@0.2.0: 2204 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 2205 | dev: true 2206 | 2207 | /thenify-all@1.6.0: 2208 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 2209 | engines: {node: '>=0.8'} 2210 | dependencies: 2211 | thenify: 3.3.1 2212 | dev: false 2213 | 2214 | /thenify@3.3.1: 2215 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 2216 | dependencies: 2217 | any-promise: 1.3.0 2218 | dev: false 2219 | 2220 | /to-regex-range@5.0.1: 2221 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2222 | engines: {node: '>=8.0'} 2223 | dependencies: 2224 | is-number: 7.0.0 2225 | dev: true 2226 | 2227 | /tslib@1.14.1: 2228 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 2229 | dev: true 2230 | 2231 | /tsutils@3.21.0(typescript@5.0.2): 2232 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 2233 | engines: {node: '>= 6'} 2234 | peerDependencies: 2235 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 2236 | dependencies: 2237 | tslib: 1.14.1 2238 | typescript: 5.0.2 2239 | dev: true 2240 | 2241 | /tsx@3.12.5: 2242 | resolution: {integrity: sha512-/TLj30xF1zcN9JkoFCyROtIQUi8cRQG+AFchsg5YkWou3+RXxTZS/ffWB3nCxyZPoBqF2+8ohs07N815dNb1wQ==} 2243 | hasBin: true 2244 | dependencies: 2245 | '@esbuild-kit/cjs-loader': 2.4.2 2246 | '@esbuild-kit/core-utils': 3.1.0 2247 | '@esbuild-kit/esm-loader': 2.5.5 2248 | optionalDependencies: 2249 | fsevents: 2.3.2 2250 | dev: true 2251 | 2252 | /type-check@0.4.0: 2253 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2254 | engines: {node: '>= 0.8.0'} 2255 | dependencies: 2256 | prelude-ls: 1.2.1 2257 | dev: true 2258 | 2259 | /type-fest@0.20.2: 2260 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2261 | engines: {node: '>=10'} 2262 | dev: true 2263 | 2264 | /type-fest@1.4.0: 2265 | resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} 2266 | engines: {node: '>=10'} 2267 | dev: false 2268 | 2269 | /type-fest@2.19.0: 2270 | resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} 2271 | engines: {node: '>=12.20'} 2272 | 2273 | /typedarray-to-buffer@3.1.5: 2274 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} 2275 | dependencies: 2276 | is-typedarray: 1.0.0 2277 | dev: false 2278 | 2279 | /typescript@5.0.2: 2280 | resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} 2281 | engines: {node: '>=12.20'} 2282 | hasBin: true 2283 | dev: true 2284 | 2285 | /unique-string@3.0.0: 2286 | resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} 2287 | engines: {node: '>=12'} 2288 | dependencies: 2289 | crypto-random-string: 4.0.0 2290 | dev: false 2291 | 2292 | /universalify@2.0.0: 2293 | resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} 2294 | engines: {node: '>= 10.0.0'} 2295 | dev: false 2296 | 2297 | /update-notifier@6.0.2: 2298 | resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} 2299 | engines: {node: '>=14.16'} 2300 | dependencies: 2301 | boxen: 7.0.2 2302 | chalk: 5.2.0 2303 | configstore: 6.0.0 2304 | has-yarn: 3.0.0 2305 | import-lazy: 4.0.0 2306 | is-ci: 3.0.1 2307 | is-installed-globally: 0.4.0 2308 | is-npm: 6.0.0 2309 | is-yarn-global: 0.4.1 2310 | latest-version: 7.0.0 2311 | pupa: 3.1.0 2312 | semver: 7.5.0 2313 | semver-diff: 4.0.0 2314 | xdg-basedir: 5.1.0 2315 | dev: false 2316 | 2317 | /uri-js@4.4.1: 2318 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2319 | dependencies: 2320 | punycode: 2.3.0 2321 | 2322 | /util-deprecate@1.0.2: 2323 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2324 | dev: false 2325 | 2326 | /wcwidth@1.0.1: 2327 | resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} 2328 | dependencies: 2329 | defaults: 1.0.4 2330 | dev: false 2331 | 2332 | /web-streams-polyfill@3.2.1: 2333 | resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} 2334 | engines: {node: '>= 8'} 2335 | dev: false 2336 | optional: true 2337 | 2338 | /when-exit@2.1.0: 2339 | resolution: {integrity: sha512-H85ulNwUBU1e6PGxkWUDgxnbohSXD++ah6Xw1VHAN7CtypcbZaC4aYjQ+C2PMVaDkURDuOinNAT+Lnz3utWXxQ==} 2340 | dev: false 2341 | 2342 | /which@2.0.2: 2343 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2344 | engines: {node: '>= 8'} 2345 | hasBin: true 2346 | dependencies: 2347 | isexe: 2.0.0 2348 | 2349 | /widest-line@4.0.1: 2350 | resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} 2351 | engines: {node: '>=12'} 2352 | dependencies: 2353 | string-width: 5.1.2 2354 | 2355 | /word-regex@0.1.2: 2356 | resolution: {integrity: sha512-4jK/OibPeindR9o/sryObhVWNgD2LJCMJFWEME69p48sEYpE9axfyjHK+RqYcOeoEoqcqJEPE9iMdiiFpXHo0Q==} 2357 | engines: {node: '>=0.10.0'} 2358 | dev: false 2359 | 2360 | /word-wrap@1.2.3: 2361 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 2362 | engines: {node: '>=0.10.0'} 2363 | dev: true 2364 | 2365 | /wordcount@1.1.1: 2366 | resolution: {integrity: sha512-3PzTv5i9Zq+DYjYFs9mybWjz3uxd19pzZEhroS0C/424IxrxWeqd+0Qt/R+UjydSWutYjaQSTklO9EBZ6YsiWg==} 2367 | engines: {node: '>=0.10.0'} 2368 | dependencies: 2369 | match-words: 0.1.1 2370 | dev: false 2371 | 2372 | /wrap-ansi@8.1.0: 2373 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2374 | engines: {node: '>=12'} 2375 | dependencies: 2376 | ansi-styles: 6.2.1 2377 | string-width: 5.1.2 2378 | strip-ansi: 7.0.1 2379 | 2380 | /wrap-text@1.0.9: 2381 | resolution: {integrity: sha512-NWfjspSgMDXQIMpKM56AwCQPI01OMFRYYJBh6dGNCfH7AOl+j/VqqbiopgJ4VuQfSluqLc+2ekqaPNpYAGZ/Vg==} 2382 | dev: false 2383 | 2384 | /wrappy@1.0.2: 2385 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2386 | dev: true 2387 | 2388 | /write-file-atomic@3.0.3: 2389 | resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} 2390 | dependencies: 2391 | imurmurhash: 0.1.4 2392 | is-typedarray: 1.0.0 2393 | signal-exit: 3.0.7 2394 | typedarray-to-buffer: 3.1.5 2395 | dev: false 2396 | 2397 | /xdg-basedir@5.1.0: 2398 | resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} 2399 | engines: {node: '>=12'} 2400 | dev: false 2401 | 2402 | /yallist@4.0.0: 2403 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2404 | 2405 | /yocto-queue@0.1.0: 2406 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2407 | engines: {node: '>=10'} 2408 | dev: true 2409 | 2410 | /zod@3.21.4: 2411 | resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} 2412 | dev: false 2413 | 2414 | github.com/shrft/streamed-chatgpt-api/60bbdc16e68163508c4ba42aa809a59b449ab5fe: 2415 | resolution: {tarball: https://codeload.github.com/shrft/streamed-chatgpt-api/tar.gz/60bbdc16e68163508c4ba42aa809a59b449ab5fe} 2416 | name: streamed-chatgpt-api 2417 | version: 1.0.8 2418 | engines: {node: '>=18.0.0'} 2419 | optionalDependencies: 2420 | node-fetch: 3.3.1 2421 | dev: false 2422 | --------------------------------------------------------------------------------